* config/tc-mips.c (macro)[ldd_std]: Fix the relaxation variant
[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               offset_expr.X_add_number -= 4;
7207             }
7208           used_at = 1;
7209           macro_build_lui (&offset_expr, AT);
7210           if (breg != 0)
7211             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7212           /* Itbl support may require additional care here.  */
7213           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7214                        BFD_RELOC_LO16, AT);
7215           /* FIXME: How do we handle overflow here?  */
7216           offset_expr.X_add_number += 4;
7217           /* Itbl support may require additional care here.  */
7218           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7219                        BFD_RELOC_LO16, AT);
7220           if (mips_relax.sequence)
7221             relax_end ();
7222         }
7223       else if (!mips_big_got)
7224         {
7225           /* If this is a reference to an external symbol, we want
7226                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7227                nop
7228                <op>     $treg,0($at)
7229                <op>     $treg+1,4($at)
7230              Otherwise we want
7231                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7232                nop
7233                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7234                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7235              If there is a base register we add it to $at before the
7236              lwc1 instructions.  If there is a constant we include it
7237              in the lwc1 instructions.  */
7238           used_at = 1;
7239           expr1.X_add_number = offset_expr.X_add_number;
7240           if (expr1.X_add_number < -0x8000
7241               || expr1.X_add_number >= 0x8000 - 4)
7242             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7243           load_got_offset (AT, &offset_expr);
7244           load_delay_nop ();
7245           if (breg != 0)
7246             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7247
7248           /* Set mips_optimize to 2 to avoid inserting an undesired
7249              nop.  */
7250           hold_mips_optimize = mips_optimize;
7251           mips_optimize = 2;
7252
7253           /* Itbl support may require additional care here.  */
7254           relax_start (offset_expr.X_add_symbol);
7255           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7256                        BFD_RELOC_LO16, AT);
7257           expr1.X_add_number += 4;
7258           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7259                        BFD_RELOC_LO16, AT);
7260           relax_switch ();
7261           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7262                        BFD_RELOC_LO16, AT);
7263           offset_expr.X_add_number += 4;
7264           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7265                        BFD_RELOC_LO16, AT);
7266           relax_end ();
7267
7268           mips_optimize = hold_mips_optimize;
7269         }
7270       else if (mips_big_got)
7271         {
7272           int gpdelay;
7273
7274           /* If this is a reference to an external symbol, we want
7275                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7276                addu     $at,$at,$gp
7277                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7278                nop
7279                <op>     $treg,0($at)
7280                <op>     $treg+1,4($at)
7281              Otherwise we want
7282                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7283                nop
7284                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7285                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7286              If there is a base register we add it to $at before the
7287              lwc1 instructions.  If there is a constant we include it
7288              in the lwc1 instructions.  */
7289           used_at = 1;
7290           expr1.X_add_number = offset_expr.X_add_number;
7291           offset_expr.X_add_number = 0;
7292           if (expr1.X_add_number < -0x8000
7293               || expr1.X_add_number >= 0x8000 - 4)
7294             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7295           gpdelay = reg_needs_delay (mips_gp_register);
7296           relax_start (offset_expr.X_add_symbol);
7297           macro_build (&offset_expr, "lui", "t,u",
7298                        AT, BFD_RELOC_MIPS_GOT_HI16);
7299           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7300                        AT, AT, mips_gp_register);
7301           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7302                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7303           load_delay_nop ();
7304           if (breg != 0)
7305             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7306           /* Itbl support may require additional care here.  */
7307           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7308                        BFD_RELOC_LO16, AT);
7309           expr1.X_add_number += 4;
7310
7311           /* Set mips_optimize to 2 to avoid inserting an undesired
7312              nop.  */
7313           hold_mips_optimize = mips_optimize;
7314           mips_optimize = 2;
7315           /* Itbl support may require additional care here.  */
7316           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7317                        BFD_RELOC_LO16, AT);
7318           mips_optimize = hold_mips_optimize;
7319           expr1.X_add_number -= 4;
7320
7321           relax_switch ();
7322           offset_expr.X_add_number = expr1.X_add_number;
7323           if (gpdelay)
7324             macro_build (NULL, "nop", "");
7325           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7326                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7327           load_delay_nop ();
7328           if (breg != 0)
7329             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7330           /* Itbl support may require additional care here.  */
7331           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7332                        BFD_RELOC_LO16, AT);
7333           offset_expr.X_add_number += 4;
7334
7335           /* Set mips_optimize to 2 to avoid inserting an undesired
7336              nop.  */
7337           hold_mips_optimize = mips_optimize;
7338           mips_optimize = 2;
7339           /* Itbl support may require additional care here.  */
7340           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7341                        BFD_RELOC_LO16, AT);
7342           mips_optimize = hold_mips_optimize;
7343           relax_end ();
7344         }
7345       else
7346         abort ();
7347
7348       break;
7349
7350     case M_LD_OB:
7351       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7352       goto sd_ob;
7353     case M_SD_OB:
7354       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7355     sd_ob:
7356       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7357       if (!HAVE_64BIT_GPRS)
7358         {
7359           offset_expr.X_add_number += 4;
7360           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7361                        BFD_RELOC_LO16, breg);
7362         }
7363       break;
7364
7365    /* New code added to support COPZ instructions.
7366       This code builds table entries out of the macros in mip_opcodes.
7367       R4000 uses interlocks to handle coproc delays.
7368       Other chips (like the R3000) require nops to be inserted for delays.
7369
7370       FIXME: Currently, we require that the user handle delays.
7371       In order to fill delay slots for non-interlocked chips,
7372       we must have a way to specify delays based on the coprocessor.
7373       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7374       What are the side-effects of the cop instruction?
7375       What cache support might we have and what are its effects?
7376       Both coprocessor & memory require delays. how long???
7377       What registers are read/set/modified?
7378
7379       If an itbl is provided to interpret cop instructions,
7380       this knowledge can be encoded in the itbl spec.  */
7381
7382     case M_COP0:
7383       s = "c0";
7384       goto copz;
7385     case M_COP1:
7386       s = "c1";
7387       goto copz;
7388     case M_COP2:
7389       s = "c2";
7390       goto copz;
7391     case M_COP3:
7392       s = "c3";
7393     copz:
7394       if (NO_ISA_COP (mips_opts.arch)
7395           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7396         {
7397           as_bad (_("opcode not supported on this processor: %s"),
7398                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7399           break;
7400         }
7401
7402       /* For now we just do C (same as Cz).  The parameter will be
7403          stored in insn_opcode by mips_ip.  */
7404       macro_build (NULL, s, "C", ip->insn_opcode);
7405       break;
7406
7407     case M_MOVE:
7408       move_register (dreg, sreg);
7409       break;
7410
7411 #ifdef LOSING_COMPILER
7412     default:
7413       /* Try and see if this is a new itbl instruction.
7414          This code builds table entries out of the macros in mip_opcodes.
7415          FIXME: For now we just assemble the expression and pass it's
7416          value along as a 32-bit immediate.
7417          We may want to have the assembler assemble this value,
7418          so that we gain the assembler's knowledge of delay slots,
7419          symbols, etc.
7420          Would it be more efficient to use mask (id) here? */
7421       if (itbl_have_entries
7422           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7423         {
7424           s = ip->insn_mo->name;
7425           s2 = "cop3";
7426           coproc = ITBL_DECODE_PNUM (immed_expr);;
7427           macro_build (&immed_expr, s, "C");
7428           break;
7429         }
7430       macro2 (ip);
7431       break;
7432     }
7433   if (!mips_opts.at && used_at)
7434     as_bad (_("Macro used $at after \".set noat\""));
7435 }
7436
7437 static void
7438 macro2 (struct mips_cl_insn *ip)
7439 {
7440   unsigned int treg, sreg, dreg, breg;
7441   unsigned int tempreg;
7442   int mask;
7443   int used_at;
7444   expressionS expr1;
7445   const char *s;
7446   const char *s2;
7447   const char *fmt;
7448   int likely = 0;
7449   int dbl = 0;
7450   int coproc = 0;
7451   int lr = 0;
7452   int imm = 0;
7453   int off;
7454   offsetT maxnum;
7455   bfd_reloc_code_real_type r;
7456
7457   treg = (ip->insn_opcode >> 16) & 0x1f;
7458   dreg = (ip->insn_opcode >> 11) & 0x1f;
7459   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7460   mask = ip->insn_mo->mask;
7461
7462   expr1.X_op = O_constant;
7463   expr1.X_op_symbol = NULL;
7464   expr1.X_add_symbol = NULL;
7465   expr1.X_add_number = 1;
7466
7467   switch (mask)
7468     {
7469 #endif /* LOSING_COMPILER */
7470
7471     case M_DMUL:
7472       dbl = 1;
7473     case M_MUL:
7474       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7475       macro_build (NULL, "mflo", "d", dreg);
7476       break;
7477
7478     case M_DMUL_I:
7479       dbl = 1;
7480     case M_MUL_I:
7481       /* The MIPS assembler some times generates shifts and adds.  I'm
7482          not trying to be that fancy. GCC should do this for us
7483          anyway.  */
7484       used_at = 1;
7485       load_register (AT, &imm_expr, dbl);
7486       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7487       macro_build (NULL, "mflo", "d", dreg);
7488       break;
7489
7490     case M_DMULO_I:
7491       dbl = 1;
7492     case M_MULO_I:
7493       imm = 1;
7494       goto do_mulo;
7495
7496     case M_DMULO:
7497       dbl = 1;
7498     case M_MULO:
7499     do_mulo:
7500       start_noreorder ();
7501       used_at = 1;
7502       if (imm)
7503         load_register (AT, &imm_expr, dbl);
7504       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7505       macro_build (NULL, "mflo", "d", dreg);
7506       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7507       macro_build (NULL, "mfhi", "d", AT);
7508       if (mips_trap)
7509         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7510       else
7511         {
7512           expr1.X_add_number = 8;
7513           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7514           macro_build (NULL, "nop", "", 0);
7515           macro_build (NULL, "break", "c", 6);
7516         }
7517       end_noreorder ();
7518       macro_build (NULL, "mflo", "d", dreg);
7519       break;
7520
7521     case M_DMULOU_I:
7522       dbl = 1;
7523     case M_MULOU_I:
7524       imm = 1;
7525       goto do_mulou;
7526
7527     case M_DMULOU:
7528       dbl = 1;
7529     case M_MULOU:
7530     do_mulou:
7531       start_noreorder ();
7532       used_at = 1;
7533       if (imm)
7534         load_register (AT, &imm_expr, dbl);
7535       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7536                    sreg, imm ? AT : treg);
7537       macro_build (NULL, "mfhi", "d", AT);
7538       macro_build (NULL, "mflo", "d", dreg);
7539       if (mips_trap)
7540         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7541       else
7542         {
7543           expr1.X_add_number = 8;
7544           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7545           macro_build (NULL, "nop", "", 0);
7546           macro_build (NULL, "break", "c", 6);
7547         }
7548       end_noreorder ();
7549       break;
7550
7551     case M_DROL:
7552       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7553         {
7554           if (dreg == sreg)
7555             {
7556               tempreg = AT;
7557               used_at = 1;
7558             }
7559           else
7560             {
7561               tempreg = dreg;
7562             }
7563           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7564           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7565           break;
7566         }
7567       used_at = 1;
7568       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7569       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7570       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7571       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7572       break;
7573
7574     case M_ROL:
7575       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7576         {
7577           if (dreg == sreg)
7578             {
7579               tempreg = AT;
7580               used_at = 1;
7581             }
7582           else
7583             {
7584               tempreg = dreg;
7585             }
7586           macro_build (NULL, "negu", "d,w", tempreg, treg);
7587           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7588           break;
7589         }
7590       used_at = 1;
7591       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7592       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7593       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7594       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7595       break;
7596
7597     case M_DROL_I:
7598       {
7599         unsigned int rot;
7600         char *l;
7601         char *rr;
7602
7603         if (imm_expr.X_op != O_constant)
7604           as_bad (_("Improper rotate count"));
7605         rot = imm_expr.X_add_number & 0x3f;
7606         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7607           {
7608             rot = (64 - rot) & 0x3f;
7609             if (rot >= 32)
7610               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7611             else
7612               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7613             break;
7614           }
7615         if (rot == 0)
7616           {
7617             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7618             break;
7619           }
7620         l = (rot < 0x20) ? "dsll" : "dsll32";
7621         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7622         rot &= 0x1f;
7623         used_at = 1;
7624         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7625         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7626         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7627       }
7628       break;
7629
7630     case M_ROL_I:
7631       {
7632         unsigned int rot;
7633
7634         if (imm_expr.X_op != O_constant)
7635           as_bad (_("Improper rotate count"));
7636         rot = imm_expr.X_add_number & 0x1f;
7637         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7638           {
7639             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7640             break;
7641           }
7642         if (rot == 0)
7643           {
7644             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7645             break;
7646           }
7647         used_at = 1;
7648         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7649         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7650         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7651       }
7652       break;
7653
7654     case M_DROR:
7655       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7656         {
7657           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7658           break;
7659         }
7660       used_at = 1;
7661       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7662       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7663       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7664       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7665       break;
7666
7667     case M_ROR:
7668       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7669         {
7670           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7671           break;
7672         }
7673       used_at = 1;
7674       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7675       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7676       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7677       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7678       break;
7679
7680     case M_DROR_I:
7681       {
7682         unsigned int rot;
7683         char *l;
7684         char *rr;
7685
7686         if (imm_expr.X_op != O_constant)
7687           as_bad (_("Improper rotate count"));
7688         rot = imm_expr.X_add_number & 0x3f;
7689         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7690           {
7691             if (rot >= 32)
7692               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7693             else
7694               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7695             break;
7696           }
7697         if (rot == 0)
7698           {
7699             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7700             break;
7701           }
7702         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7703         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7704         rot &= 0x1f;
7705         used_at = 1;
7706         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7707         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7708         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7709       }
7710       break;
7711
7712     case M_ROR_I:
7713       {
7714         unsigned int rot;
7715
7716         if (imm_expr.X_op != O_constant)
7717           as_bad (_("Improper rotate count"));
7718         rot = imm_expr.X_add_number & 0x1f;
7719         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7720           {
7721             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7722             break;
7723           }
7724         if (rot == 0)
7725           {
7726             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7727             break;
7728           }
7729         used_at = 1;
7730         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7731         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7732         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7733       }
7734       break;
7735
7736     case M_S_DOB:
7737       gas_assert (mips_opts.isa == ISA_MIPS1);
7738       /* Even on a big endian machine $fn comes before $fn+1.  We have
7739          to adjust when storing to memory.  */
7740       macro_build (&offset_expr, "swc1", "T,o(b)",
7741                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7742       offset_expr.X_add_number += 4;
7743       macro_build (&offset_expr, "swc1", "T,o(b)",
7744                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7745       break;
7746
7747     case M_SEQ:
7748       if (sreg == 0)
7749         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7750       else if (treg == 0)
7751         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7752       else
7753         {
7754           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7755           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7756         }
7757       break;
7758
7759     case M_SEQ_I:
7760       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7761         {
7762           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7763           break;
7764         }
7765       if (sreg == 0)
7766         {
7767           as_warn (_("Instruction %s: result is always false"),
7768                    ip->insn_mo->name);
7769           move_register (dreg, 0);
7770           break;
7771         }
7772       if (CPU_HAS_SEQ (mips_opts.arch)
7773           && -512 <= imm_expr.X_add_number
7774           && imm_expr.X_add_number < 512)
7775         {
7776           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7777                        (int) imm_expr.X_add_number);
7778           break;
7779         }
7780       if (imm_expr.X_op == O_constant
7781           && imm_expr.X_add_number >= 0
7782           && imm_expr.X_add_number < 0x10000)
7783         {
7784           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7785         }
7786       else if (imm_expr.X_op == O_constant
7787                && imm_expr.X_add_number > -0x8000
7788                && imm_expr.X_add_number < 0)
7789         {
7790           imm_expr.X_add_number = -imm_expr.X_add_number;
7791           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7792                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7793         }
7794       else if (CPU_HAS_SEQ (mips_opts.arch))
7795         {
7796           used_at = 1;
7797           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7798           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7799           break;
7800         }
7801       else
7802         {
7803           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7804           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7805           used_at = 1;
7806         }
7807       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7808       break;
7809
7810     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7811       s = "slt";
7812       goto sge;
7813     case M_SGEU:
7814       s = "sltu";
7815     sge:
7816       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7817       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7818       break;
7819
7820     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7821     case M_SGEU_I:
7822       if (imm_expr.X_op == O_constant
7823           && imm_expr.X_add_number >= -0x8000
7824           && imm_expr.X_add_number < 0x8000)
7825         {
7826           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7827                        dreg, sreg, BFD_RELOC_LO16);
7828         }
7829       else
7830         {
7831           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7832           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7833                        dreg, sreg, AT);
7834           used_at = 1;
7835         }
7836       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7837       break;
7838
7839     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7840       s = "slt";
7841       goto sgt;
7842     case M_SGTU:
7843       s = "sltu";
7844     sgt:
7845       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7846       break;
7847
7848     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7849       s = "slt";
7850       goto sgti;
7851     case M_SGTU_I:
7852       s = "sltu";
7853     sgti:
7854       used_at = 1;
7855       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7856       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7857       break;
7858
7859     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7860       s = "slt";
7861       goto sle;
7862     case M_SLEU:
7863       s = "sltu";
7864     sle:
7865       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7866       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7867       break;
7868
7869     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7870       s = "slt";
7871       goto slei;
7872     case M_SLEU_I:
7873       s = "sltu";
7874     slei:
7875       used_at = 1;
7876       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7877       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7878       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7879       break;
7880
7881     case M_SLT_I:
7882       if (imm_expr.X_op == O_constant
7883           && imm_expr.X_add_number >= -0x8000
7884           && imm_expr.X_add_number < 0x8000)
7885         {
7886           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7887           break;
7888         }
7889       used_at = 1;
7890       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7891       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7892       break;
7893
7894     case M_SLTU_I:
7895       if (imm_expr.X_op == O_constant
7896           && imm_expr.X_add_number >= -0x8000
7897           && imm_expr.X_add_number < 0x8000)
7898         {
7899           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7900                        BFD_RELOC_LO16);
7901           break;
7902         }
7903       used_at = 1;
7904       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7905       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7906       break;
7907
7908     case M_SNE:
7909       if (sreg == 0)
7910         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7911       else if (treg == 0)
7912         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7913       else
7914         {
7915           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7916           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7917         }
7918       break;
7919
7920     case M_SNE_I:
7921       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7922         {
7923           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7924           break;
7925         }
7926       if (sreg == 0)
7927         {
7928           as_warn (_("Instruction %s: result is always true"),
7929                    ip->insn_mo->name);
7930           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7931                        dreg, 0, BFD_RELOC_LO16);
7932           break;
7933         }
7934       if (CPU_HAS_SEQ (mips_opts.arch)
7935           && -512 <= imm_expr.X_add_number
7936           && imm_expr.X_add_number < 512)
7937         {
7938           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7939                        (int) imm_expr.X_add_number);
7940           break;
7941         }
7942       if (imm_expr.X_op == O_constant
7943           && imm_expr.X_add_number >= 0
7944           && imm_expr.X_add_number < 0x10000)
7945         {
7946           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7947         }
7948       else if (imm_expr.X_op == O_constant
7949                && imm_expr.X_add_number > -0x8000
7950                && imm_expr.X_add_number < 0)
7951         {
7952           imm_expr.X_add_number = -imm_expr.X_add_number;
7953           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7954                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7955         }
7956       else if (CPU_HAS_SEQ (mips_opts.arch))
7957         {
7958           used_at = 1;
7959           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7960           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7961           break;
7962         }
7963       else
7964         {
7965           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7966           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7967           used_at = 1;
7968         }
7969       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7970       break;
7971
7972     case M_DSUB_I:
7973       dbl = 1;
7974     case M_SUB_I:
7975       if (imm_expr.X_op == O_constant
7976           && imm_expr.X_add_number > -0x8000
7977           && imm_expr.X_add_number <= 0x8000)
7978         {
7979           imm_expr.X_add_number = -imm_expr.X_add_number;
7980           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7981                        dreg, sreg, BFD_RELOC_LO16);
7982           break;
7983         }
7984       used_at = 1;
7985       load_register (AT, &imm_expr, dbl);
7986       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7987       break;
7988
7989     case M_DSUBU_I:
7990       dbl = 1;
7991     case M_SUBU_I:
7992       if (imm_expr.X_op == O_constant
7993           && imm_expr.X_add_number > -0x8000
7994           && imm_expr.X_add_number <= 0x8000)
7995         {
7996           imm_expr.X_add_number = -imm_expr.X_add_number;
7997           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7998                        dreg, sreg, BFD_RELOC_LO16);
7999           break;
8000         }
8001       used_at = 1;
8002       load_register (AT, &imm_expr, dbl);
8003       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8004       break;
8005
8006     case M_TEQ_I:
8007       s = "teq";
8008       goto trap;
8009     case M_TGE_I:
8010       s = "tge";
8011       goto trap;
8012     case M_TGEU_I:
8013       s = "tgeu";
8014       goto trap;
8015     case M_TLT_I:
8016       s = "tlt";
8017       goto trap;
8018     case M_TLTU_I:
8019       s = "tltu";
8020       goto trap;
8021     case M_TNE_I:
8022       s = "tne";
8023     trap:
8024       used_at = 1;
8025       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8026       macro_build (NULL, s, "s,t", sreg, AT);
8027       break;
8028
8029     case M_TRUNCWS:
8030     case M_TRUNCWD:
8031       gas_assert (mips_opts.isa == ISA_MIPS1);
8032       used_at = 1;
8033       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8034       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8035
8036       /*
8037        * Is the double cfc1 instruction a bug in the mips assembler;
8038        * or is there a reason for it?
8039        */
8040       start_noreorder ();
8041       macro_build (NULL, "cfc1", "t,G", treg, RA);
8042       macro_build (NULL, "cfc1", "t,G", treg, RA);
8043       macro_build (NULL, "nop", "");
8044       expr1.X_add_number = 3;
8045       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8046       expr1.X_add_number = 2;
8047       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8048       macro_build (NULL, "ctc1", "t,G", AT, RA);
8049       macro_build (NULL, "nop", "");
8050       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8051                    dreg, sreg);
8052       macro_build (NULL, "ctc1", "t,G", treg, RA);
8053       macro_build (NULL, "nop", "");
8054       end_noreorder ();
8055       break;
8056
8057     case M_ULH:
8058       s = "lb";
8059       goto ulh;
8060     case M_ULHU:
8061       s = "lbu";
8062     ulh:
8063       used_at = 1;
8064       if (offset_expr.X_add_number >= 0x7fff)
8065         as_bad (_("operand overflow"));
8066       if (! target_big_endian)
8067         ++offset_expr.X_add_number;
8068       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8069       if (! target_big_endian)
8070         --offset_expr.X_add_number;
8071       else
8072         ++offset_expr.X_add_number;
8073       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8074       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8075       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8076       break;
8077
8078     case M_ULD:
8079       s = "ldl";
8080       s2 = "ldr";
8081       off = 7;
8082       goto ulw;
8083     case M_ULW:
8084       s = "lwl";
8085       s2 = "lwr";
8086       off = 3;
8087     ulw:
8088       if (offset_expr.X_add_number >= 0x8000 - off)
8089         as_bad (_("operand overflow"));
8090       if (treg != breg)
8091         tempreg = treg;
8092       else
8093         {
8094           used_at = 1;
8095           tempreg = AT;
8096         }
8097       if (! target_big_endian)
8098         offset_expr.X_add_number += off;
8099       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8100       if (! target_big_endian)
8101         offset_expr.X_add_number -= off;
8102       else
8103         offset_expr.X_add_number += off;
8104       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8105
8106       /* If necessary, move the result in tempreg the final destination.  */
8107       if (treg == tempreg)
8108         break;
8109       /* Protect second load's delay slot.  */
8110       load_delay_nop ();
8111       move_register (treg, tempreg);
8112       break;
8113
8114     case M_ULD_A:
8115       s = "ldl";
8116       s2 = "ldr";
8117       off = 7;
8118       goto ulwa;
8119     case M_ULW_A:
8120       s = "lwl";
8121       s2 = "lwr";
8122       off = 3;
8123     ulwa:
8124       used_at = 1;
8125       load_address (AT, &offset_expr, &used_at);
8126       if (breg != 0)
8127         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8128       if (! target_big_endian)
8129         expr1.X_add_number = off;
8130       else
8131         expr1.X_add_number = 0;
8132       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8133       if (! target_big_endian)
8134         expr1.X_add_number = 0;
8135       else
8136         expr1.X_add_number = off;
8137       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8138       break;
8139
8140     case M_ULH_A:
8141     case M_ULHU_A:
8142       used_at = 1;
8143       load_address (AT, &offset_expr, &used_at);
8144       if (breg != 0)
8145         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8146       if (target_big_endian)
8147         expr1.X_add_number = 0;
8148       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8149                    treg, BFD_RELOC_LO16, AT);
8150       if (target_big_endian)
8151         expr1.X_add_number = 1;
8152       else
8153         expr1.X_add_number = 0;
8154       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8155       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8156       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8157       break;
8158
8159     case M_USH:
8160       used_at = 1;
8161       if (offset_expr.X_add_number >= 0x7fff)
8162         as_bad (_("operand overflow"));
8163       if (target_big_endian)
8164         ++offset_expr.X_add_number;
8165       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8166       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8167       if (target_big_endian)
8168         --offset_expr.X_add_number;
8169       else
8170         ++offset_expr.X_add_number;
8171       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8172       break;
8173
8174     case M_USD:
8175       s = "sdl";
8176       s2 = "sdr";
8177       off = 7;
8178       goto usw;
8179     case M_USW:
8180       s = "swl";
8181       s2 = "swr";
8182       off = 3;
8183     usw:
8184       if (offset_expr.X_add_number >= 0x8000 - off)
8185         as_bad (_("operand overflow"));
8186       if (! target_big_endian)
8187         offset_expr.X_add_number += off;
8188       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8189       if (! target_big_endian)
8190         offset_expr.X_add_number -= off;
8191       else
8192         offset_expr.X_add_number += off;
8193       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8194       break;
8195
8196     case M_USD_A:
8197       s = "sdl";
8198       s2 = "sdr";
8199       off = 7;
8200       goto uswa;
8201     case M_USW_A:
8202       s = "swl";
8203       s2 = "swr";
8204       off = 3;
8205     uswa:
8206       used_at = 1;
8207       load_address (AT, &offset_expr, &used_at);
8208       if (breg != 0)
8209         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8210       if (! target_big_endian)
8211         expr1.X_add_number = off;
8212       else
8213         expr1.X_add_number = 0;
8214       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8215       if (! target_big_endian)
8216         expr1.X_add_number = 0;
8217       else
8218         expr1.X_add_number = off;
8219       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8220       break;
8221
8222     case M_USH_A:
8223       used_at = 1;
8224       load_address (AT, &offset_expr, &used_at);
8225       if (breg != 0)
8226         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8227       if (! target_big_endian)
8228         expr1.X_add_number = 0;
8229       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8230       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8231       if (! target_big_endian)
8232         expr1.X_add_number = 1;
8233       else
8234         expr1.X_add_number = 0;
8235       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8236       if (! target_big_endian)
8237         expr1.X_add_number = 0;
8238       else
8239         expr1.X_add_number = 1;
8240       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8241       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8242       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8243       break;
8244
8245     default:
8246       /* FIXME: Check if this is one of the itbl macros, since they
8247          are added dynamically.  */
8248       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8249       break;
8250     }
8251   if (!mips_opts.at && used_at)
8252     as_bad (_("Macro used $at after \".set noat\""));
8253 }
8254
8255 /* Implement macros in mips16 mode.  */
8256
8257 static void
8258 mips16_macro (struct mips_cl_insn *ip)
8259 {
8260   int mask;
8261   int xreg, yreg, zreg, tmp;
8262   expressionS expr1;
8263   int dbl;
8264   const char *s, *s2, *s3;
8265
8266   mask = ip->insn_mo->mask;
8267
8268   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8269   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8270   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8271
8272   expr1.X_op = O_constant;
8273   expr1.X_op_symbol = NULL;
8274   expr1.X_add_symbol = NULL;
8275   expr1.X_add_number = 1;
8276
8277   dbl = 0;
8278
8279   switch (mask)
8280     {
8281     default:
8282       internalError ();
8283
8284     case M_DDIV_3:
8285       dbl = 1;
8286     case M_DIV_3:
8287       s = "mflo";
8288       goto do_div3;
8289     case M_DREM_3:
8290       dbl = 1;
8291     case M_REM_3:
8292       s = "mfhi";
8293     do_div3:
8294       start_noreorder ();
8295       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8296       expr1.X_add_number = 2;
8297       macro_build (&expr1, "bnez", "x,p", yreg);
8298       macro_build (NULL, "break", "6", 7);
8299
8300       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8301          since that causes an overflow.  We should do that as well,
8302          but I don't see how to do the comparisons without a temporary
8303          register.  */
8304       end_noreorder ();
8305       macro_build (NULL, s, "x", zreg);
8306       break;
8307
8308     case M_DIVU_3:
8309       s = "divu";
8310       s2 = "mflo";
8311       goto do_divu3;
8312     case M_REMU_3:
8313       s = "divu";
8314       s2 = "mfhi";
8315       goto do_divu3;
8316     case M_DDIVU_3:
8317       s = "ddivu";
8318       s2 = "mflo";
8319       goto do_divu3;
8320     case M_DREMU_3:
8321       s = "ddivu";
8322       s2 = "mfhi";
8323     do_divu3:
8324       start_noreorder ();
8325       macro_build (NULL, s, "0,x,y", xreg, yreg);
8326       expr1.X_add_number = 2;
8327       macro_build (&expr1, "bnez", "x,p", yreg);
8328       macro_build (NULL, "break", "6", 7);
8329       end_noreorder ();
8330       macro_build (NULL, s2, "x", zreg);
8331       break;
8332
8333     case M_DMUL:
8334       dbl = 1;
8335     case M_MUL:
8336       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8337       macro_build (NULL, "mflo", "x", zreg);
8338       break;
8339
8340     case M_DSUBU_I:
8341       dbl = 1;
8342       goto do_subu;
8343     case M_SUBU_I:
8344     do_subu:
8345       if (imm_expr.X_op != O_constant)
8346         as_bad (_("Unsupported large constant"));
8347       imm_expr.X_add_number = -imm_expr.X_add_number;
8348       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8349       break;
8350
8351     case M_SUBU_I_2:
8352       if (imm_expr.X_op != O_constant)
8353         as_bad (_("Unsupported large constant"));
8354       imm_expr.X_add_number = -imm_expr.X_add_number;
8355       macro_build (&imm_expr, "addiu", "x,k", xreg);
8356       break;
8357
8358     case M_DSUBU_I_2:
8359       if (imm_expr.X_op != O_constant)
8360         as_bad (_("Unsupported large constant"));
8361       imm_expr.X_add_number = -imm_expr.X_add_number;
8362       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8363       break;
8364
8365     case M_BEQ:
8366       s = "cmp";
8367       s2 = "bteqz";
8368       goto do_branch;
8369     case M_BNE:
8370       s = "cmp";
8371       s2 = "btnez";
8372       goto do_branch;
8373     case M_BLT:
8374       s = "slt";
8375       s2 = "btnez";
8376       goto do_branch;
8377     case M_BLTU:
8378       s = "sltu";
8379       s2 = "btnez";
8380       goto do_branch;
8381     case M_BLE:
8382       s = "slt";
8383       s2 = "bteqz";
8384       goto do_reverse_branch;
8385     case M_BLEU:
8386       s = "sltu";
8387       s2 = "bteqz";
8388       goto do_reverse_branch;
8389     case M_BGE:
8390       s = "slt";
8391       s2 = "bteqz";
8392       goto do_branch;
8393     case M_BGEU:
8394       s = "sltu";
8395       s2 = "bteqz";
8396       goto do_branch;
8397     case M_BGT:
8398       s = "slt";
8399       s2 = "btnez";
8400       goto do_reverse_branch;
8401     case M_BGTU:
8402       s = "sltu";
8403       s2 = "btnez";
8404
8405     do_reverse_branch:
8406       tmp = xreg;
8407       xreg = yreg;
8408       yreg = tmp;
8409
8410     do_branch:
8411       macro_build (NULL, s, "x,y", xreg, yreg);
8412       macro_build (&offset_expr, s2, "p");
8413       break;
8414
8415     case M_BEQ_I:
8416       s = "cmpi";
8417       s2 = "bteqz";
8418       s3 = "x,U";
8419       goto do_branch_i;
8420     case M_BNE_I:
8421       s = "cmpi";
8422       s2 = "btnez";
8423       s3 = "x,U";
8424       goto do_branch_i;
8425     case M_BLT_I:
8426       s = "slti";
8427       s2 = "btnez";
8428       s3 = "x,8";
8429       goto do_branch_i;
8430     case M_BLTU_I:
8431       s = "sltiu";
8432       s2 = "btnez";
8433       s3 = "x,8";
8434       goto do_branch_i;
8435     case M_BLE_I:
8436       s = "slti";
8437       s2 = "btnez";
8438       s3 = "x,8";
8439       goto do_addone_branch_i;
8440     case M_BLEU_I:
8441       s = "sltiu";
8442       s2 = "btnez";
8443       s3 = "x,8";
8444       goto do_addone_branch_i;
8445     case M_BGE_I:
8446       s = "slti";
8447       s2 = "bteqz";
8448       s3 = "x,8";
8449       goto do_branch_i;
8450     case M_BGEU_I:
8451       s = "sltiu";
8452       s2 = "bteqz";
8453       s3 = "x,8";
8454       goto do_branch_i;
8455     case M_BGT_I:
8456       s = "slti";
8457       s2 = "bteqz";
8458       s3 = "x,8";
8459       goto do_addone_branch_i;
8460     case M_BGTU_I:
8461       s = "sltiu";
8462       s2 = "bteqz";
8463       s3 = "x,8";
8464
8465     do_addone_branch_i:
8466       if (imm_expr.X_op != O_constant)
8467         as_bad (_("Unsupported large constant"));
8468       ++imm_expr.X_add_number;
8469
8470     do_branch_i:
8471       macro_build (&imm_expr, s, s3, xreg);
8472       macro_build (&offset_expr, s2, "p");
8473       break;
8474
8475     case M_ABS:
8476       expr1.X_add_number = 0;
8477       macro_build (&expr1, "slti", "x,8", yreg);
8478       if (xreg != yreg)
8479         move_register (xreg, yreg);
8480       expr1.X_add_number = 2;
8481       macro_build (&expr1, "bteqz", "p");
8482       macro_build (NULL, "neg", "x,w", xreg, xreg);
8483     }
8484 }
8485
8486 /* For consistency checking, verify that all bits are specified either
8487    by the match/mask part of the instruction definition, or by the
8488    operand list.  */
8489 static int
8490 validate_mips_insn (const struct mips_opcode *opc)
8491 {
8492   const char *p = opc->args;
8493   char c;
8494   unsigned long used_bits = opc->mask;
8495
8496   if ((used_bits & opc->match) != opc->match)
8497     {
8498       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8499               opc->name, opc->args);
8500       return 0;
8501     }
8502 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8503   while (*p)
8504     switch (c = *p++)
8505       {
8506       case ',': break;
8507       case '(': break;
8508       case ')': break;
8509       case '+':
8510         switch (c = *p++)
8511           {
8512           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8513           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8514           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8515           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8516           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8517           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8518           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8519           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8520                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8521           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8522           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8523           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8524           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8525           case 'I': break;
8526           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8527           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8528                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8529           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8530           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8531           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8532           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8533           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8534           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8535           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8536
8537           default:
8538             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8539                     c, opc->name, opc->args);
8540             return 0;
8541           }
8542         break;
8543       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8544       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8545       case 'A': break;
8546       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8547       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8548       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8549       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8550       case 'F': break;
8551       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8552       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8553       case 'I': break;
8554       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8555       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8556       case 'L': break;
8557       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8558       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8559       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8560       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8561                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8562       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8563       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8564       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8565       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8566       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8567       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8568       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8569       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8570       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8571       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8572       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8573       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8574       case 'f': break;
8575       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8576       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8577       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8578       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8579       case 'l': break;
8580       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8581       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8582       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8583       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8584       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8585       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8586       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8587       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8588       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8589       case 'x': break;
8590       case 'z': break;
8591       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8592       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8593                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8594       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8595       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8596       case '[': break;
8597       case ']': break;
8598       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8599       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8600       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8601       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8602       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8603       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8604       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8605       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8606       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8607       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8608       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8609       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8610       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8611       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8612       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8613       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8614       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8615       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8616       default:
8617         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8618                 c, opc->name, opc->args);
8619         return 0;
8620       }
8621 #undef USE_BITS
8622   if (used_bits != 0xffffffff)
8623     {
8624       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8625               ~used_bits & 0xffffffff, opc->name, opc->args);
8626       return 0;
8627     }
8628   return 1;
8629 }
8630
8631 /* UDI immediates.  */
8632 struct mips_immed {
8633   char          type;
8634   unsigned int  shift;
8635   unsigned long mask;
8636   const char *  desc;
8637 };
8638
8639 static const struct mips_immed mips_immed[] = {
8640   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8641   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8642   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8643   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8644   { 0,0,0,0 }
8645 };
8646
8647 /* Check whether an odd floating-point register is allowed.  */
8648 static int
8649 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8650 {
8651   const char *s = insn->name;
8652
8653   if (insn->pinfo == INSN_MACRO)
8654     /* Let a macro pass, we'll catch it later when it is expanded.  */
8655     return 1;
8656
8657   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8658     {
8659       /* Allow odd registers for single-precision ops.  */
8660       switch (insn->pinfo & (FP_S | FP_D))
8661         {
8662         case FP_S:
8663         case 0:
8664           return 1;     /* both single precision - ok */
8665         case FP_D:
8666           return 0;     /* both double precision - fail */
8667         default:
8668           break;
8669         }
8670
8671       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8672       s = strchr (insn->name, '.');
8673       if (argnum == 2)
8674         s = s != NULL ? strchr (s + 1, '.') : NULL;
8675       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8676     } 
8677
8678   /* Single-precision coprocessor loads and moves are OK too.  */
8679   if ((insn->pinfo & FP_S)
8680       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8681                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8682     return 1;
8683
8684   return 0;
8685 }
8686
8687 /* This routine assembles an instruction into its binary format.  As a
8688    side effect, it sets one of the global variables imm_reloc or
8689    offset_reloc to the type of relocation to do if one of the operands
8690    is an address expression.  */
8691
8692 static void
8693 mips_ip (char *str, struct mips_cl_insn *ip)
8694 {
8695   char *s;
8696   const char *args;
8697   char c = 0;
8698   struct mips_opcode *insn;
8699   char *argsStart;
8700   unsigned int regno;
8701   unsigned int lastregno = 0;
8702   unsigned int lastpos = 0;
8703   unsigned int limlo, limhi;
8704   char *s_reset;
8705   char save_c = 0;
8706   offsetT min_range, max_range;
8707   int argnum;
8708   unsigned int rtype;
8709
8710   insn_error = NULL;
8711
8712   /* If the instruction contains a '.', we first try to match an instruction
8713      including the '.'.  Then we try again without the '.'.  */
8714   insn = NULL;
8715   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8716     continue;
8717
8718   /* If we stopped on whitespace, then replace the whitespace with null for
8719      the call to hash_find.  Save the character we replaced just in case we
8720      have to re-parse the instruction.  */
8721   if (ISSPACE (*s))
8722     {
8723       save_c = *s;
8724       *s++ = '\0';
8725     }
8726
8727   insn = (struct mips_opcode *) hash_find (op_hash, str);
8728
8729   /* If we didn't find the instruction in the opcode table, try again, but
8730      this time with just the instruction up to, but not including the
8731      first '.'.  */
8732   if (insn == NULL)
8733     {
8734       /* Restore the character we overwrite above (if any).  */
8735       if (save_c)
8736         *(--s) = save_c;
8737
8738       /* Scan up to the first '.' or whitespace.  */
8739       for (s = str;
8740            *s != '\0' && *s != '.' && !ISSPACE (*s);
8741            ++s)
8742         continue;
8743
8744       /* If we did not find a '.', then we can quit now.  */
8745       if (*s != '.')
8746         {
8747           insn_error = _("unrecognized opcode");
8748           return;
8749         }
8750
8751       /* Lookup the instruction in the hash table.  */
8752       *s++ = '\0';
8753       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8754         {
8755           insn_error = _("unrecognized opcode");
8756           return;
8757         }
8758     }
8759
8760   argsStart = s;
8761   for (;;)
8762     {
8763       bfd_boolean ok;
8764
8765       gas_assert (strcmp (insn->name, str) == 0);
8766
8767       ok = is_opcode_valid (insn);
8768       if (! ok)
8769         {
8770           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8771               && strcmp (insn->name, insn[1].name) == 0)
8772             {
8773               ++insn;
8774               continue;
8775             }
8776           else
8777             {
8778               if (!insn_error)
8779                 {
8780                   static char buf[100];
8781                   sprintf (buf,
8782                            _("opcode not supported on this processor: %s (%s)"),
8783                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8784                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8785                   insn_error = buf;
8786                 }
8787               if (save_c)
8788                 *(--s) = save_c;
8789               return;
8790             }
8791         }
8792
8793       create_insn (ip, insn);
8794       insn_error = NULL;
8795       argnum = 1;
8796       lastregno = 0xffffffff;
8797       for (args = insn->args;; ++args)
8798         {
8799           int is_mdmx;
8800
8801           s += strspn (s, " \t");
8802           is_mdmx = 0;
8803           switch (*args)
8804             {
8805             case '\0':          /* end of args */
8806               if (*s == '\0')
8807                 return;
8808               break;
8809
8810             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8811               my_getExpression (&imm_expr, s);
8812               check_absolute_expr (ip, &imm_expr);
8813               if ((unsigned long) imm_expr.X_add_number != 1
8814                   && (unsigned long) imm_expr.X_add_number != 3)
8815                 {
8816                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8817                           (unsigned long) imm_expr.X_add_number);
8818                 }
8819               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8820               imm_expr.X_op = O_absent;
8821               s = expr_end;
8822               continue;
8823
8824             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8825               my_getExpression (&imm_expr, s);
8826               check_absolute_expr (ip, &imm_expr);
8827               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8828                 {
8829                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8830                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8831                 }
8832               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8833               imm_expr.X_op = O_absent;
8834               s = expr_end;
8835               continue;
8836
8837             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8838               my_getExpression (&imm_expr, s);
8839               check_absolute_expr (ip, &imm_expr);
8840               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8841                 {
8842                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8843                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8844                 }
8845               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8846               imm_expr.X_op = O_absent;
8847               s = expr_end;
8848               continue;
8849
8850             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8851               my_getExpression (&imm_expr, s);
8852               check_absolute_expr (ip, &imm_expr);
8853               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8854                 {
8855                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8856                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8857                 }
8858               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8859               imm_expr.X_op = O_absent;
8860               s = expr_end;
8861               continue;
8862
8863             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8864               my_getExpression (&imm_expr, s);
8865               check_absolute_expr (ip, &imm_expr);
8866               if (imm_expr.X_add_number & ~OP_MASK_RS)
8867                 {
8868                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8869                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8870                 }
8871               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8872               imm_expr.X_op = O_absent;
8873               s = expr_end;
8874               continue;
8875
8876             case '7': /* four dsp accumulators in bits 11,12 */ 
8877               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8878                   s[3] >= '0' && s[3] <= '3')
8879                 {
8880                   regno = s[3] - '0';
8881                   s += 4;
8882                   INSERT_OPERAND (DSPACC, *ip, regno);
8883                   continue;
8884                 }
8885               else
8886                 as_bad (_("Invalid dsp acc register"));
8887               break;
8888
8889             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8890               my_getExpression (&imm_expr, s);
8891               check_absolute_expr (ip, &imm_expr);
8892               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8893                 {
8894                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8895                           OP_MASK_WRDSP,
8896                           (unsigned long) imm_expr.X_add_number);
8897                 }
8898               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8899               imm_expr.X_op = O_absent;
8900               s = expr_end;
8901               continue;
8902
8903             case '9': /* four dsp accumulators in bits 21,22 */
8904               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8905                   s[3] >= '0' && s[3] <= '3')
8906                 {
8907                   regno = s[3] - '0';
8908                   s += 4;
8909                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8910                   continue;
8911                 }
8912               else
8913                 as_bad (_("Invalid dsp acc register"));
8914               break;
8915
8916             case '0': /* dsp 6-bit signed immediate in bit 20 */
8917               my_getExpression (&imm_expr, s);
8918               check_absolute_expr (ip, &imm_expr);
8919               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8920               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8921               if (imm_expr.X_add_number < min_range ||
8922                   imm_expr.X_add_number > max_range)
8923                 {
8924                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8925                           (long) min_range, (long) max_range,
8926                           (long) imm_expr.X_add_number);
8927                 }
8928               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8929               imm_expr.X_op = O_absent;
8930               s = expr_end;
8931               continue;
8932
8933             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8934               my_getExpression (&imm_expr, s);
8935               check_absolute_expr (ip, &imm_expr);
8936               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8937                 {
8938                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8939                           OP_MASK_RDDSP,
8940                           (unsigned long) imm_expr.X_add_number);
8941                 }
8942               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8943               imm_expr.X_op = O_absent;
8944               s = expr_end;
8945               continue;
8946
8947             case ':': /* dsp 7-bit signed immediate in bit 19 */
8948               my_getExpression (&imm_expr, s);
8949               check_absolute_expr (ip, &imm_expr);
8950               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8951               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8952               if (imm_expr.X_add_number < min_range ||
8953                   imm_expr.X_add_number > max_range)
8954                 {
8955                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8956                           (long) min_range, (long) max_range,
8957                           (long) imm_expr.X_add_number);
8958                 }
8959               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8960               imm_expr.X_op = O_absent;
8961               s = expr_end;
8962               continue;
8963
8964             case '@': /* dsp 10-bit signed immediate in bit 16 */
8965               my_getExpression (&imm_expr, s);
8966               check_absolute_expr (ip, &imm_expr);
8967               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8968               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8969               if (imm_expr.X_add_number < min_range ||
8970                   imm_expr.X_add_number > max_range)
8971                 {
8972                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8973                           (long) min_range, (long) max_range,
8974                           (long) imm_expr.X_add_number);
8975                 }
8976               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8977               imm_expr.X_op = O_absent;
8978               s = expr_end;
8979               continue;
8980
8981             case '!': /* MT usermode flag bit.  */
8982               my_getExpression (&imm_expr, s);
8983               check_absolute_expr (ip, &imm_expr);
8984               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8985                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8986                         (unsigned long) imm_expr.X_add_number);
8987               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8988               imm_expr.X_op = O_absent;
8989               s = expr_end;
8990               continue;
8991
8992             case '$': /* MT load high flag bit.  */
8993               my_getExpression (&imm_expr, s);
8994               check_absolute_expr (ip, &imm_expr);
8995               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8996                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8997                         (unsigned long) imm_expr.X_add_number);
8998               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8999               imm_expr.X_op = O_absent;
9000               s = expr_end;
9001               continue;
9002
9003             case '*': /* four dsp accumulators in bits 18,19 */ 
9004               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9005                   s[3] >= '0' && s[3] <= '3')
9006                 {
9007                   regno = s[3] - '0';
9008                   s += 4;
9009                   INSERT_OPERAND (MTACC_T, *ip, regno);
9010                   continue;
9011                 }
9012               else
9013                 as_bad (_("Invalid dsp/smartmips acc register"));
9014               break;
9015
9016             case '&': /* four dsp accumulators in bits 13,14 */ 
9017               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9018                   s[3] >= '0' && s[3] <= '3')
9019                 {
9020                   regno = s[3] - '0';
9021                   s += 4;
9022                   INSERT_OPERAND (MTACC_D, *ip, regno);
9023                   continue;
9024                 }
9025               else
9026                 as_bad (_("Invalid dsp/smartmips acc register"));
9027               break;
9028
9029             case ',':
9030               ++argnum;
9031               if (*s++ == *args)
9032                 continue;
9033               s--;
9034               switch (*++args)
9035                 {
9036                 case 'r':
9037                 case 'v':
9038                   INSERT_OPERAND (RS, *ip, lastregno);
9039                   continue;
9040
9041                 case 'w':
9042                   INSERT_OPERAND (RT, *ip, lastregno);
9043                   continue;
9044
9045                 case 'W':
9046                   INSERT_OPERAND (FT, *ip, lastregno);
9047                   continue;
9048
9049                 case 'V':
9050                   INSERT_OPERAND (FS, *ip, lastregno);
9051                   continue;
9052                 }
9053               break;
9054
9055             case '(':
9056               /* Handle optional base register.
9057                  Either the base register is omitted or
9058                  we must have a left paren.  */
9059               /* This is dependent on the next operand specifier
9060                  is a base register specification.  */
9061               gas_assert (args[1] == 'b' || args[1] == '5'
9062                       || args[1] == '-' || args[1] == '4');
9063               if (*s == '\0')
9064                 return;
9065
9066             case ')':           /* these must match exactly */
9067             case '[':
9068             case ']':
9069               if (*s++ == *args)
9070                 continue;
9071               break;
9072
9073             case '+':           /* Opcode extension character.  */
9074               switch (*++args)
9075                 {
9076                 case '1':       /* UDI immediates.  */
9077                 case '2':
9078                 case '3':
9079                 case '4':
9080                   {
9081                     const struct mips_immed *imm = mips_immed;
9082
9083                     while (imm->type && imm->type != *args)
9084                       ++imm;
9085                     if (! imm->type)
9086                       internalError ();
9087                     my_getExpression (&imm_expr, s);
9088                     check_absolute_expr (ip, &imm_expr);
9089                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9090                       {
9091                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9092                                  imm->desc ? imm->desc : ip->insn_mo->name,
9093                                  (unsigned long) imm_expr.X_add_number,
9094                                  (unsigned long) imm_expr.X_add_number);
9095                               imm_expr.X_add_number &= imm->mask;
9096                       }
9097                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9098                                         << imm->shift);
9099                     imm_expr.X_op = O_absent;
9100                     s = expr_end;
9101                   }
9102                   continue;
9103                   
9104                 case 'A':               /* ins/ext position, becomes LSB.  */
9105                   limlo = 0;
9106                   limhi = 31;
9107                   goto do_lsb;
9108                 case 'E':
9109                   limlo = 32;
9110                   limhi = 63;
9111                   goto do_lsb;
9112 do_lsb:
9113                   my_getExpression (&imm_expr, s);
9114                   check_absolute_expr (ip, &imm_expr);
9115                   if ((unsigned long) imm_expr.X_add_number < limlo
9116                       || (unsigned long) imm_expr.X_add_number > limhi)
9117                     {
9118                       as_bad (_("Improper position (%lu)"),
9119                               (unsigned long) imm_expr.X_add_number);
9120                       imm_expr.X_add_number = limlo;
9121                     }
9122                   lastpos = imm_expr.X_add_number;
9123                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9124                   imm_expr.X_op = O_absent;
9125                   s = expr_end;
9126                   continue;
9127
9128                 case 'B':               /* ins size, becomes MSB.  */
9129                   limlo = 1;
9130                   limhi = 32;
9131                   goto do_msb;
9132                 case 'F':
9133                   limlo = 33;
9134                   limhi = 64;
9135                   goto do_msb;
9136 do_msb:
9137                   my_getExpression (&imm_expr, s);
9138                   check_absolute_expr (ip, &imm_expr);
9139                   /* Check for negative input so that small negative numbers
9140                      will not succeed incorrectly.  The checks against
9141                      (pos+size) transitively check "size" itself,
9142                      assuming that "pos" is reasonable.  */
9143                   if ((long) imm_expr.X_add_number < 0
9144                       || ((unsigned long) imm_expr.X_add_number
9145                           + lastpos) < limlo
9146                       || ((unsigned long) imm_expr.X_add_number
9147                           + lastpos) > limhi)
9148                     {
9149                       as_bad (_("Improper insert size (%lu, position %lu)"),
9150                               (unsigned long) imm_expr.X_add_number,
9151                               (unsigned long) lastpos);
9152                       imm_expr.X_add_number = limlo - lastpos;
9153                     }
9154                   INSERT_OPERAND (INSMSB, *ip,
9155                                  lastpos + imm_expr.X_add_number - 1);
9156                   imm_expr.X_op = O_absent;
9157                   s = expr_end;
9158                   continue;
9159
9160                 case 'C':               /* ext size, becomes MSBD.  */
9161                   limlo = 1;
9162                   limhi = 32;
9163                   goto do_msbd;
9164                 case 'G':
9165                   limlo = 33;
9166                   limhi = 64;
9167                   goto do_msbd;
9168                 case 'H':
9169                   limlo = 33;
9170                   limhi = 64;
9171                   goto do_msbd;
9172 do_msbd:
9173                   my_getExpression (&imm_expr, s);
9174                   check_absolute_expr (ip, &imm_expr);
9175                   /* Check for negative input so that small negative numbers
9176                      will not succeed incorrectly.  The checks against
9177                      (pos+size) transitively check "size" itself,
9178                      assuming that "pos" is reasonable.  */
9179                   if ((long) imm_expr.X_add_number < 0
9180                       || ((unsigned long) imm_expr.X_add_number
9181                           + lastpos) < limlo
9182                       || ((unsigned long) imm_expr.X_add_number
9183                           + lastpos) > limhi)
9184                     {
9185                       as_bad (_("Improper extract size (%lu, position %lu)"),
9186                               (unsigned long) imm_expr.X_add_number,
9187                               (unsigned long) lastpos);
9188                       imm_expr.X_add_number = limlo - lastpos;
9189                     }
9190                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9191                   imm_expr.X_op = O_absent;
9192                   s = expr_end;
9193                   continue;
9194
9195                 case 'D':
9196                   /* +D is for disassembly only; never match.  */
9197                   break;
9198
9199                 case 'I':
9200                   /* "+I" is like "I", except that imm2_expr is used.  */
9201                   my_getExpression (&imm2_expr, s);
9202                   if (imm2_expr.X_op != O_big
9203                       && imm2_expr.X_op != O_constant)
9204                   insn_error = _("absolute expression required");
9205                   if (HAVE_32BIT_GPRS)
9206                     normalize_constant_expr (&imm2_expr);
9207                   s = expr_end;
9208                   continue;
9209
9210                 case 'T': /* Coprocessor register.  */
9211                   /* +T is for disassembly only; never match.  */
9212                   break;
9213
9214                 case 't': /* Coprocessor register number.  */
9215                   if (s[0] == '$' && ISDIGIT (s[1]))
9216                     {
9217                       ++s;
9218                       regno = 0;
9219                       do
9220                         {
9221                           regno *= 10;
9222                           regno += *s - '0';
9223                           ++s;
9224                         }
9225                       while (ISDIGIT (*s));
9226                       if (regno > 31)
9227                         as_bad (_("Invalid register number (%d)"), regno);
9228                       else
9229                         {
9230                           INSERT_OPERAND (RT, *ip, regno);
9231                           continue;
9232                         }
9233                     }
9234                   else
9235                     as_bad (_("Invalid coprocessor 0 register number"));
9236                   break;
9237
9238                 case 'x':
9239                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9240                      is not in the valid range.  */
9241                   my_getExpression (&imm_expr, s);
9242                   check_absolute_expr (ip, &imm_expr);
9243                   if ((unsigned) imm_expr.X_add_number > 31)
9244                     {
9245                       as_bad (_("Improper bit index (%lu)"),
9246                               (unsigned long) imm_expr.X_add_number);
9247                       imm_expr.X_add_number = 0;
9248                     }
9249                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9250                   imm_expr.X_op = O_absent;
9251                   s = expr_end;
9252                   continue;
9253
9254                 case 'X':
9255                   /* bbit[01] bit index when bbit is used but we generate
9256                      bbit[01]32 because the index is over 32.  Move to the
9257                      next candidate if index is not in the valid range.  */
9258                   my_getExpression (&imm_expr, s);
9259                   check_absolute_expr (ip, &imm_expr);
9260                   if ((unsigned) imm_expr.X_add_number < 32
9261                       || (unsigned) imm_expr.X_add_number > 63)
9262                     break;
9263                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9264                   imm_expr.X_op = O_absent;
9265                   s = expr_end;
9266                   continue;
9267
9268                 case 'p':
9269                   /* cins, cins32, exts and exts32 position field.  Give error
9270                      if it's not in the valid range.  */
9271                   my_getExpression (&imm_expr, s);
9272                   check_absolute_expr (ip, &imm_expr);
9273                   if ((unsigned) imm_expr.X_add_number > 31)
9274                     {
9275                       as_bad (_("Improper position (%lu)"),
9276                               (unsigned long) imm_expr.X_add_number);
9277                       imm_expr.X_add_number = 0;
9278                     }
9279                   /* Make the pos explicit to simplify +S.  */
9280                   lastpos = imm_expr.X_add_number + 32;
9281                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9282                   imm_expr.X_op = O_absent;
9283                   s = expr_end;
9284                   continue;
9285
9286                 case 'P':
9287                   /* cins, cins32, exts and exts32 position field.  Move to
9288                      the next candidate if it's not in the valid range.  */
9289                   my_getExpression (&imm_expr, s);
9290                   check_absolute_expr (ip, &imm_expr);
9291                   if ((unsigned) imm_expr.X_add_number < 32
9292                       || (unsigned) imm_expr.X_add_number > 63)
9293                     break;
9294                   lastpos = imm_expr.X_add_number;
9295                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9296                   imm_expr.X_op = O_absent;
9297                   s = expr_end;
9298                   continue;
9299
9300                 case 's':
9301                   /* cins and exts length-minus-one field.  */
9302                   my_getExpression (&imm_expr, s);
9303                   check_absolute_expr (ip, &imm_expr);
9304                   if ((unsigned long) imm_expr.X_add_number > 31)
9305                     {
9306                       as_bad (_("Improper size (%lu)"),
9307                               (unsigned long) imm_expr.X_add_number);
9308                       imm_expr.X_add_number = 0;
9309                     }
9310                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9311                   imm_expr.X_op = O_absent;
9312                   s = expr_end;
9313                   continue;
9314
9315                 case 'S':
9316                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9317                      length-minus-one field.  */
9318                   my_getExpression (&imm_expr, s);
9319                   check_absolute_expr (ip, &imm_expr);
9320                   if ((long) imm_expr.X_add_number < 0
9321                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9322                     {
9323                       as_bad (_("Improper size (%lu)"),
9324                               (unsigned long) imm_expr.X_add_number);
9325                       imm_expr.X_add_number = 0;
9326                     }
9327                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9328                   imm_expr.X_op = O_absent;
9329                   s = expr_end;
9330                   continue;
9331
9332                 case 'Q':
9333                   /* seqi/snei immediate field.  */
9334                   my_getExpression (&imm_expr, s);
9335                   check_absolute_expr (ip, &imm_expr);
9336                   if ((long) imm_expr.X_add_number < -512
9337                       || (long) imm_expr.X_add_number >= 512)
9338                     {
9339                       as_bad (_("Improper immediate (%ld)"),
9340                                (long) imm_expr.X_add_number);
9341                       imm_expr.X_add_number = 0;
9342                     }
9343                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9344                   imm_expr.X_op = O_absent;
9345                   s = expr_end;
9346                   continue;
9347
9348                 default:
9349                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9350                     *args, insn->name, insn->args);
9351                   /* Further processing is fruitless.  */
9352                   return;
9353                 }
9354               break;
9355
9356             case '<':           /* must be at least one digit */
9357               /*
9358                * According to the manual, if the shift amount is greater
9359                * than 31 or less than 0, then the shift amount should be
9360                * mod 32.  In reality the mips assembler issues an error.
9361                * We issue a warning and mask out all but the low 5 bits.
9362                */
9363               my_getExpression (&imm_expr, s);
9364               check_absolute_expr (ip, &imm_expr);
9365               if ((unsigned long) imm_expr.X_add_number > 31)
9366                 as_warn (_("Improper shift amount (%lu)"),
9367                          (unsigned long) imm_expr.X_add_number);
9368               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9369               imm_expr.X_op = O_absent;
9370               s = expr_end;
9371               continue;
9372
9373             case '>':           /* shift amount minus 32 */
9374               my_getExpression (&imm_expr, s);
9375               check_absolute_expr (ip, &imm_expr);
9376               if ((unsigned long) imm_expr.X_add_number < 32
9377                   || (unsigned long) imm_expr.X_add_number > 63)
9378                 break;
9379               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9380               imm_expr.X_op = O_absent;
9381               s = expr_end;
9382               continue;
9383
9384             case 'k':           /* cache code */
9385             case 'h':           /* prefx code */
9386             case '1':           /* sync type */
9387               my_getExpression (&imm_expr, s);
9388               check_absolute_expr (ip, &imm_expr);
9389               if ((unsigned long) imm_expr.X_add_number > 31)
9390                 as_warn (_("Invalid value for `%s' (%lu)"),
9391                          ip->insn_mo->name,
9392                          (unsigned long) imm_expr.X_add_number);
9393               if (*args == 'k')
9394                 {
9395                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9396                     switch (imm_expr.X_add_number)
9397                       {
9398                       case 5:
9399                       case 25:
9400                       case 26:
9401                       case 27:
9402                       case 28:
9403                       case 29:
9404                       case 30:
9405                       case 31:  /* These are ok.  */
9406                         break;
9407
9408                       default:  /* The rest must be changed to 28.  */
9409                         imm_expr.X_add_number = 28;
9410                         break;
9411                       }
9412                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9413                 }
9414               else if (*args == 'h')
9415                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9416               else
9417                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9418               imm_expr.X_op = O_absent;
9419               s = expr_end;
9420               continue;
9421
9422             case 'c':           /* break code */
9423               my_getExpression (&imm_expr, s);
9424               check_absolute_expr (ip, &imm_expr);
9425               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9426                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9427                          ip->insn_mo->name,
9428                          (unsigned long) imm_expr.X_add_number);
9429               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9430               imm_expr.X_op = O_absent;
9431               s = expr_end;
9432               continue;
9433
9434             case 'q':           /* lower break code */
9435               my_getExpression (&imm_expr, s);
9436               check_absolute_expr (ip, &imm_expr);
9437               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9438                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9439                          ip->insn_mo->name,
9440                          (unsigned long) imm_expr.X_add_number);
9441               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9442               imm_expr.X_op = O_absent;
9443               s = expr_end;
9444               continue;
9445
9446             case 'B':           /* 20-bit syscall/break code.  */
9447               my_getExpression (&imm_expr, s);
9448               check_absolute_expr (ip, &imm_expr);
9449               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9450                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9451                          ip->insn_mo->name,
9452                          (unsigned long) imm_expr.X_add_number);
9453               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9454               imm_expr.X_op = O_absent;
9455               s = expr_end;
9456               continue;
9457
9458             case 'C':           /* Coprocessor code */
9459               my_getExpression (&imm_expr, s);
9460               check_absolute_expr (ip, &imm_expr);
9461               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9462                 {
9463                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9464                            (unsigned long) imm_expr.X_add_number);
9465                   imm_expr.X_add_number &= OP_MASK_COPZ;
9466                 }
9467               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9468               imm_expr.X_op = O_absent;
9469               s = expr_end;
9470               continue;
9471
9472             case 'J':           /* 19-bit wait code.  */
9473               my_getExpression (&imm_expr, s);
9474               check_absolute_expr (ip, &imm_expr);
9475               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9476                 {
9477                   as_warn (_("Illegal 19-bit code (%lu)"),
9478                            (unsigned long) imm_expr.X_add_number);
9479                   imm_expr.X_add_number &= OP_MASK_CODE19;
9480                 }
9481               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9482               imm_expr.X_op = O_absent;
9483               s = expr_end;
9484               continue;
9485
9486             case 'P':           /* Performance register.  */
9487               my_getExpression (&imm_expr, s);
9488               check_absolute_expr (ip, &imm_expr);
9489               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9490                 as_warn (_("Invalid performance register (%lu)"),
9491                          (unsigned long) imm_expr.X_add_number);
9492               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9493               imm_expr.X_op = O_absent;
9494               s = expr_end;
9495               continue;
9496
9497             case 'G':           /* Coprocessor destination register.  */
9498               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9499                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9500               else
9501                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9502               INSERT_OPERAND (RD, *ip, regno);
9503               if (ok) 
9504                 {
9505                   lastregno = regno;
9506                   continue;
9507                 }
9508               else
9509                 break;
9510
9511             case 'b':           /* base register */
9512             case 'd':           /* destination register */
9513             case 's':           /* source register */
9514             case 't':           /* target register */
9515             case 'r':           /* both target and source */
9516             case 'v':           /* both dest and source */
9517             case 'w':           /* both dest and target */
9518             case 'E':           /* coprocessor target register */
9519             case 'K':           /* 'rdhwr' destination register */
9520             case 'x':           /* ignore register name */
9521             case 'z':           /* must be zero register */
9522             case 'U':           /* destination register (clo/clz).  */
9523             case 'g':           /* coprocessor destination register */
9524               s_reset = s;            
9525               if (*args == 'E' || *args == 'K')
9526                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9527               else
9528                 {
9529                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9530                   if (regno == AT && mips_opts.at)
9531                     {
9532                       if (mips_opts.at == ATREG)
9533                         as_warn (_("used $at without \".set noat\""));
9534                       else
9535                         as_warn (_("used $%u with \".set at=$%u\""),
9536                                  regno, mips_opts.at);
9537                     }
9538                 }
9539               if (ok)
9540                 {
9541                   c = *args;
9542                   if (*s == ' ')
9543                     ++s;
9544                   if (args[1] != *s)
9545                     {
9546                       if (c == 'r' || c == 'v' || c == 'w')
9547                         {
9548                           regno = lastregno;
9549                           s = s_reset;
9550                           ++args;
9551                         }
9552                     }
9553                   /* 'z' only matches $0.  */
9554                   if (c == 'z' && regno != 0)
9555                     break;
9556
9557                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9558                     {
9559                       if (regno == lastregno)
9560                         {
9561                           insn_error = _("source and destination must be different");
9562                           continue;
9563                         }
9564                       if (regno == 31 && lastregno == 0xffffffff)
9565                         {
9566                           insn_error = _("a destination register must be supplied");
9567                           continue;
9568                         }
9569                     }
9570         /* Now that we have assembled one operand, we use the args string
9571          * to figure out where it goes in the instruction.  */
9572                   switch (c)
9573                     {
9574                     case 'r':
9575                     case 's':
9576                     case 'v':
9577                     case 'b':
9578                       INSERT_OPERAND (RS, *ip, regno);
9579                       break;
9580                     case 'd':
9581                     case 'G':
9582                     case 'K':
9583                     case 'g':
9584                       INSERT_OPERAND (RD, *ip, regno);
9585                       break;
9586                     case 'U':
9587                       INSERT_OPERAND (RD, *ip, regno);
9588                       INSERT_OPERAND (RT, *ip, regno);
9589                       break;
9590                     case 'w':
9591                     case 't':
9592                     case 'E':
9593                       INSERT_OPERAND (RT, *ip, regno);
9594                       break;
9595                     case 'x':
9596                       /* This case exists because on the r3000 trunc
9597                          expands into a macro which requires a gp
9598                          register.  On the r6000 or r4000 it is
9599                          assembled into a single instruction which
9600                          ignores the register.  Thus the insn version
9601                          is MIPS_ISA2 and uses 'x', and the macro
9602                          version is MIPS_ISA1 and uses 't'.  */
9603                       break;
9604                     case 'z':
9605                       /* This case is for the div instruction, which
9606                          acts differently if the destination argument
9607                          is $0.  This only matches $0, and is checked
9608                          outside the switch.  */
9609                       break;
9610                     case 'D':
9611                       /* Itbl operand; not yet implemented. FIXME ?? */
9612                       break;
9613                       /* What about all other operands like 'i', which
9614                          can be specified in the opcode table? */
9615                     }
9616                   lastregno = regno;
9617                   continue;
9618                 }
9619               switch (*args++)
9620                 {
9621                 case 'r':
9622                 case 'v':
9623                   INSERT_OPERAND (RS, *ip, lastregno);
9624                   continue;
9625                 case 'w':
9626                   INSERT_OPERAND (RT, *ip, lastregno);
9627                   continue;
9628                 }
9629               break;
9630
9631             case 'O':           /* MDMX alignment immediate constant.  */
9632               my_getExpression (&imm_expr, s);
9633               check_absolute_expr (ip, &imm_expr);
9634               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9635                 as_warn (_("Improper align amount (%ld), using low bits"),
9636                          (long) imm_expr.X_add_number);
9637               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9638               imm_expr.X_op = O_absent;
9639               s = expr_end;
9640               continue;
9641
9642             case 'Q':           /* MDMX vector, element sel, or const.  */
9643               if (s[0] != '$')
9644                 {
9645                   /* MDMX Immediate.  */
9646                   my_getExpression (&imm_expr, s);
9647                   check_absolute_expr (ip, &imm_expr);
9648                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9649                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9650                              (long) imm_expr.X_add_number);
9651                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9652                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9653                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9654                   else
9655                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9656                   imm_expr.X_op = O_absent;
9657                   s = expr_end;
9658                   continue;
9659                 }
9660               /* Not MDMX Immediate.  Fall through.  */
9661             case 'X':           /* MDMX destination register.  */
9662             case 'Y':           /* MDMX source register.  */
9663             case 'Z':           /* MDMX target register.  */
9664               is_mdmx = 1;
9665             case 'D':           /* floating point destination register */
9666             case 'S':           /* floating point source register */
9667             case 'T':           /* floating point target register */
9668             case 'R':           /* floating point source register */
9669             case 'V':
9670             case 'W':
9671               rtype = RTYPE_FPU;
9672               if (is_mdmx
9673                   || (mips_opts.ase_mdmx
9674                       && (ip->insn_mo->pinfo & FP_D)
9675                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9676                                                 | INSN_COPROC_MEMORY_DELAY
9677                                                 | INSN_LOAD_COPROC_DELAY
9678                                                 | INSN_LOAD_MEMORY_DELAY
9679                                                 | INSN_STORE_MEMORY))))
9680                 rtype |= RTYPE_VEC;
9681               s_reset = s;
9682               if (reg_lookup (&s, rtype, &regno))
9683                 {
9684                   if ((regno & 1) != 0
9685                       && HAVE_32BIT_FPRS
9686                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9687                     as_warn (_("Float register should be even, was %d"),
9688                              regno);
9689
9690                   c = *args;
9691                   if (*s == ' ')
9692                     ++s;
9693                   if (args[1] != *s)
9694                     {
9695                       if (c == 'V' || c == 'W')
9696                         {
9697                           regno = lastregno;
9698                           s = s_reset;
9699                           ++args;
9700                         }
9701                     }
9702                   switch (c)
9703                     {
9704                     case 'D':
9705                     case 'X':
9706                       INSERT_OPERAND (FD, *ip, regno);
9707                       break;
9708                     case 'V':
9709                     case 'S':
9710                     case 'Y':
9711                       INSERT_OPERAND (FS, *ip, regno);
9712                       break;
9713                     case 'Q':
9714                       /* This is like 'Z', but also needs to fix the MDMX
9715                          vector/scalar select bits.  Note that the
9716                          scalar immediate case is handled above.  */
9717                       if (*s == '[')
9718                         {
9719                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9720                           int max_el = (is_qh ? 3 : 7);
9721                           s++;
9722                           my_getExpression(&imm_expr, s);
9723                           check_absolute_expr (ip, &imm_expr);
9724                           s = expr_end;
9725                           if (imm_expr.X_add_number > max_el)
9726                             as_bad (_("Bad element selector %ld"),
9727                                     (long) imm_expr.X_add_number);
9728                           imm_expr.X_add_number &= max_el;
9729                           ip->insn_opcode |= (imm_expr.X_add_number
9730                                               << (OP_SH_VSEL +
9731                                                   (is_qh ? 2 : 1)));
9732                           imm_expr.X_op = O_absent;
9733                           if (*s != ']')
9734                             as_warn (_("Expecting ']' found '%s'"), s);
9735                           else
9736                             s++;
9737                         }
9738                       else
9739                         {
9740                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9741                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9742                                                 << OP_SH_VSEL);
9743                           else
9744                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9745                                                 OP_SH_VSEL);
9746                         }
9747                       /* Fall through */
9748                     case 'W':
9749                     case 'T':
9750                     case 'Z':
9751                       INSERT_OPERAND (FT, *ip, regno);
9752                       break;
9753                     case 'R':
9754                       INSERT_OPERAND (FR, *ip, regno);
9755                       break;
9756                     }
9757                   lastregno = regno;
9758                   continue;
9759                 }
9760
9761               switch (*args++)
9762                 {
9763                 case 'V':
9764                   INSERT_OPERAND (FS, *ip, lastregno);
9765                   continue;
9766                 case 'W':
9767                   INSERT_OPERAND (FT, *ip, lastregno);
9768                   continue;
9769                 }
9770               break;
9771
9772             case 'I':
9773               my_getExpression (&imm_expr, s);
9774               if (imm_expr.X_op != O_big
9775                   && imm_expr.X_op != O_constant)
9776                 insn_error = _("absolute expression required");
9777               if (HAVE_32BIT_GPRS)
9778                 normalize_constant_expr (&imm_expr);
9779               s = expr_end;
9780               continue;
9781
9782             case 'A':
9783               my_getExpression (&offset_expr, s);
9784               normalize_address_expr (&offset_expr);
9785               *imm_reloc = BFD_RELOC_32;
9786               s = expr_end;
9787               continue;
9788
9789             case 'F':
9790             case 'L':
9791             case 'f':
9792             case 'l':
9793               {
9794                 int f64;
9795                 int using_gprs;
9796                 char *save_in;
9797                 char *err;
9798                 unsigned char temp[8];
9799                 int len;
9800                 unsigned int length;
9801                 segT seg;
9802                 subsegT subseg;
9803                 char *p;
9804
9805                 /* These only appear as the last operand in an
9806                    instruction, and every instruction that accepts
9807                    them in any variant accepts them in all variants.
9808                    This means we don't have to worry about backing out
9809                    any changes if the instruction does not match.
9810
9811                    The difference between them is the size of the
9812                    floating point constant and where it goes.  For 'F'
9813                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9814                    is 32 bits.  Where the constant is placed is based
9815                    on how the MIPS assembler does things:
9816                     F -- .rdata
9817                     L -- .lit8
9818                     f -- immediate value
9819                     l -- .lit4
9820
9821                     The .lit4 and .lit8 sections are only used if
9822                     permitted by the -G argument.
9823
9824                     The code below needs to know whether the target register
9825                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9826                     'F' are used with GPR-based instructions and 'l' and
9827                     'L' are used with FPR-based instructions.  */
9828
9829                 f64 = *args == 'F' || *args == 'L';
9830                 using_gprs = *args == 'F' || *args == 'f';
9831
9832                 save_in = input_line_pointer;
9833                 input_line_pointer = s;
9834                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9835                 length = len;
9836                 s = input_line_pointer;
9837                 input_line_pointer = save_in;
9838                 if (err != NULL && *err != '\0')
9839                   {
9840                     as_bad (_("Bad floating point constant: %s"), err);
9841                     memset (temp, '\0', sizeof temp);
9842                     length = f64 ? 8 : 4;
9843                   }
9844
9845                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9846
9847                 if (*args == 'f'
9848                     || (*args == 'l'
9849                         && (g_switch_value < 4
9850                             || (temp[0] == 0 && temp[1] == 0)
9851                             || (temp[2] == 0 && temp[3] == 0))))
9852                   {
9853                     imm_expr.X_op = O_constant;
9854                     if (! target_big_endian)
9855                       imm_expr.X_add_number = bfd_getl32 (temp);
9856                     else
9857                       imm_expr.X_add_number = bfd_getb32 (temp);
9858                   }
9859                 else if (length > 4
9860                          && ! mips_disable_float_construction
9861                          /* Constants can only be constructed in GPRs and
9862                             copied to FPRs if the GPRs are at least as wide
9863                             as the FPRs.  Force the constant into memory if
9864                             we are using 64-bit FPRs but the GPRs are only
9865                             32 bits wide.  */
9866                          && (using_gprs
9867                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9868                          && ((temp[0] == 0 && temp[1] == 0)
9869                              || (temp[2] == 0 && temp[3] == 0))
9870                          && ((temp[4] == 0 && temp[5] == 0)
9871                              || (temp[6] == 0 && temp[7] == 0)))
9872                   {
9873                     /* The value is simple enough to load with a couple of
9874                        instructions.  If using 32-bit registers, set
9875                        imm_expr to the high order 32 bits and offset_expr to
9876                        the low order 32 bits.  Otherwise, set imm_expr to
9877                        the entire 64 bit constant.  */
9878                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9879                       {
9880                         imm_expr.X_op = O_constant;
9881                         offset_expr.X_op = O_constant;
9882                         if (! target_big_endian)
9883                           {
9884                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9885                             offset_expr.X_add_number = bfd_getl32 (temp);
9886                           }
9887                         else
9888                           {
9889                             imm_expr.X_add_number = bfd_getb32 (temp);
9890                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9891                           }
9892                         if (offset_expr.X_add_number == 0)
9893                           offset_expr.X_op = O_absent;
9894                       }
9895                     else if (sizeof (imm_expr.X_add_number) > 4)
9896                       {
9897                         imm_expr.X_op = O_constant;
9898                         if (! target_big_endian)
9899                           imm_expr.X_add_number = bfd_getl64 (temp);
9900                         else
9901                           imm_expr.X_add_number = bfd_getb64 (temp);
9902                       }
9903                     else
9904                       {
9905                         imm_expr.X_op = O_big;
9906                         imm_expr.X_add_number = 4;
9907                         if (! target_big_endian)
9908                           {
9909                             generic_bignum[0] = bfd_getl16 (temp);
9910                             generic_bignum[1] = bfd_getl16 (temp + 2);
9911                             generic_bignum[2] = bfd_getl16 (temp + 4);
9912                             generic_bignum[3] = bfd_getl16 (temp + 6);
9913                           }
9914                         else
9915                           {
9916                             generic_bignum[0] = bfd_getb16 (temp + 6);
9917                             generic_bignum[1] = bfd_getb16 (temp + 4);
9918                             generic_bignum[2] = bfd_getb16 (temp + 2);
9919                             generic_bignum[3] = bfd_getb16 (temp);
9920                           }
9921                       }
9922                   }
9923                 else
9924                   {
9925                     const char *newname;
9926                     segT new_seg;
9927
9928                     /* Switch to the right section.  */
9929                     seg = now_seg;
9930                     subseg = now_subseg;
9931                     switch (*args)
9932                       {
9933                       default: /* unused default case avoids warnings.  */
9934                       case 'L':
9935                         newname = RDATA_SECTION_NAME;
9936                         if (g_switch_value >= 8)
9937                           newname = ".lit8";
9938                         break;
9939                       case 'F':
9940                         newname = RDATA_SECTION_NAME;
9941                         break;
9942                       case 'l':
9943                         gas_assert (g_switch_value >= 4);
9944                         newname = ".lit4";
9945                         break;
9946                       }
9947                     new_seg = subseg_new (newname, (subsegT) 0);
9948                     if (IS_ELF)
9949                       bfd_set_section_flags (stdoutput, new_seg,
9950                                              (SEC_ALLOC
9951                                               | SEC_LOAD
9952                                               | SEC_READONLY
9953                                               | SEC_DATA));
9954                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9955                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9956                       record_alignment (new_seg, 4);
9957                     else
9958                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9959                     if (seg == now_seg)
9960                       as_bad (_("Can't use floating point insn in this section"));
9961
9962                     /* Set the argument to the current address in the
9963                        section.  */
9964                     offset_expr.X_op = O_symbol;
9965                     offset_expr.X_add_symbol = symbol_temp_new_now ();
9966                     offset_expr.X_add_number = 0;
9967
9968                     /* Put the floating point number into the section.  */
9969                     p = frag_more ((int) length);
9970                     memcpy (p, temp, length);
9971
9972                     /* Switch back to the original section.  */
9973                     subseg_set (seg, subseg);
9974                   }
9975               }
9976               continue;
9977
9978             case 'i':           /* 16 bit unsigned immediate */
9979             case 'j':           /* 16 bit signed immediate */
9980               *imm_reloc = BFD_RELOC_LO16;
9981               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9982                 {
9983                   int more;
9984                   offsetT minval, maxval;
9985
9986                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9987                           && strcmp (insn->name, insn[1].name) == 0);
9988
9989                   /* If the expression was written as an unsigned number,
9990                      only treat it as signed if there are no more
9991                      alternatives.  */
9992                   if (more
9993                       && *args == 'j'
9994                       && sizeof (imm_expr.X_add_number) <= 4
9995                       && imm_expr.X_op == O_constant
9996                       && imm_expr.X_add_number < 0
9997                       && imm_expr.X_unsigned
9998                       && HAVE_64BIT_GPRS)
9999                     break;
10000
10001                   /* For compatibility with older assemblers, we accept
10002                      0x8000-0xffff as signed 16-bit numbers when only
10003                      signed numbers are allowed.  */
10004                   if (*args == 'i')
10005                     minval = 0, maxval = 0xffff;
10006                   else if (more)
10007                     minval = -0x8000, maxval = 0x7fff;
10008                   else
10009                     minval = -0x8000, maxval = 0xffff;
10010
10011                   if (imm_expr.X_op != O_constant
10012                       || imm_expr.X_add_number < minval
10013                       || imm_expr.X_add_number > maxval)
10014                     {
10015                       if (more)
10016                         break;
10017                       if (imm_expr.X_op == O_constant
10018                           || imm_expr.X_op == O_big)
10019                         as_bad (_("expression out of range"));
10020                     }
10021                 }
10022               s = expr_end;
10023               continue;
10024
10025             case 'o':           /* 16 bit offset */
10026               /* Check whether there is only a single bracketed expression
10027                  left.  If so, it must be the base register and the
10028                  constant must be zero.  */
10029               if (*s == '(' && strchr (s + 1, '(') == 0)
10030                 {
10031                   offset_expr.X_op = O_constant;
10032                   offset_expr.X_add_number = 0;
10033                   continue;
10034                 }
10035
10036               /* If this value won't fit into a 16 bit offset, then go
10037                  find a macro that will generate the 32 bit offset
10038                  code pattern.  */
10039               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10040                   && (offset_expr.X_op != O_constant
10041                       || offset_expr.X_add_number >= 0x8000
10042                       || offset_expr.X_add_number < -0x8000))
10043                 break;
10044
10045               s = expr_end;
10046               continue;
10047
10048             case 'p':           /* pc relative offset */
10049               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10050               my_getExpression (&offset_expr, s);
10051               s = expr_end;
10052               continue;
10053
10054             case 'u':           /* upper 16 bits */
10055               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10056                   && imm_expr.X_op == O_constant
10057                   && (imm_expr.X_add_number < 0
10058                       || imm_expr.X_add_number >= 0x10000))
10059                 as_bad (_("lui expression not in range 0..65535"));
10060               s = expr_end;
10061               continue;
10062
10063             case 'a':           /* 26 bit address */
10064               my_getExpression (&offset_expr, s);
10065               s = expr_end;
10066               *offset_reloc = BFD_RELOC_MIPS_JMP;
10067               continue;
10068
10069             case 'N':           /* 3 bit branch condition code */
10070             case 'M':           /* 3 bit compare condition code */
10071               rtype = RTYPE_CCC;
10072               if (ip->insn_mo->pinfo & (FP_D| FP_S))
10073                 rtype |= RTYPE_FCC;
10074               if (!reg_lookup (&s, rtype, &regno))
10075                 break;
10076               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
10077                    || strcmp(str + strlen(str) - 5, "any2f") == 0
10078                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
10079                   && (regno & 1) != 0)
10080                 as_warn (_("Condition code register should be even for %s, was %d"),
10081                          str, regno);
10082               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
10083                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
10084                   && (regno & 3) != 0)
10085                 as_warn (_("Condition code register should be 0 or 4 for %s, was %d"),
10086                          str, regno);
10087               if (*args == 'N')
10088                 INSERT_OPERAND (BCC, *ip, regno);
10089               else
10090                 INSERT_OPERAND (CCC, *ip, regno);
10091               continue;
10092
10093             case 'H':
10094               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10095                 s += 2;
10096               if (ISDIGIT (*s))
10097                 {
10098                   c = 0;
10099                   do
10100                     {
10101                       c *= 10;
10102                       c += *s - '0';
10103                       ++s;
10104                     }
10105                   while (ISDIGIT (*s));
10106                 }
10107               else
10108                 c = 8; /* Invalid sel value.  */
10109
10110               if (c > 7)
10111                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
10112               ip->insn_opcode |= c;
10113               continue;
10114
10115             case 'e':
10116               /* Must be at least one digit.  */
10117               my_getExpression (&imm_expr, s);
10118               check_absolute_expr (ip, &imm_expr);
10119
10120               if ((unsigned long) imm_expr.X_add_number
10121                   > (unsigned long) OP_MASK_VECBYTE)
10122                 {
10123                   as_bad (_("bad byte vector index (%ld)"),
10124                            (long) imm_expr.X_add_number);
10125                   imm_expr.X_add_number = 0;
10126                 }
10127
10128               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10129               imm_expr.X_op = O_absent;
10130               s = expr_end;
10131               continue;
10132
10133             case '%':
10134               my_getExpression (&imm_expr, s);
10135               check_absolute_expr (ip, &imm_expr);
10136
10137               if ((unsigned long) imm_expr.X_add_number
10138                   > (unsigned long) OP_MASK_VECALIGN)
10139                 {
10140                   as_bad (_("bad byte vector index (%ld)"),
10141                            (long) imm_expr.X_add_number);
10142                   imm_expr.X_add_number = 0;
10143                 }
10144
10145               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10146               imm_expr.X_op = O_absent;
10147               s = expr_end;
10148               continue;
10149
10150             default:
10151               as_bad (_("bad char = '%c'\n"), *args);
10152               internalError ();
10153             }
10154           break;
10155         }
10156       /* Args don't match.  */
10157       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10158           !strcmp (insn->name, insn[1].name))
10159         {
10160           ++insn;
10161           s = argsStart;
10162           insn_error = _("illegal operands");
10163           continue;
10164         }
10165       if (save_c)
10166         *(--argsStart) = save_c;
10167       insn_error = _("illegal operands");
10168       return;
10169     }
10170 }
10171
10172 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10173
10174 /* This routine assembles an instruction into its binary format when
10175    assembling for the mips16.  As a side effect, it sets one of the
10176    global variables imm_reloc or offset_reloc to the type of
10177    relocation to do if one of the operands is an address expression.
10178    It also sets mips16_small and mips16_ext if the user explicitly
10179    requested a small or extended instruction.  */
10180
10181 static void
10182 mips16_ip (char *str, struct mips_cl_insn *ip)
10183 {
10184   char *s;
10185   const char *args;
10186   struct mips_opcode *insn;
10187   char *argsstart;
10188   unsigned int regno;
10189   unsigned int lastregno = 0;
10190   char *s_reset;
10191   size_t i;
10192
10193   insn_error = NULL;
10194
10195   mips16_small = FALSE;
10196   mips16_ext = FALSE;
10197
10198   for (s = str; ISLOWER (*s); ++s)
10199     ;
10200   switch (*s)
10201     {
10202     case '\0':
10203       break;
10204
10205     case ' ':
10206       *s++ = '\0';
10207       break;
10208
10209     case '.':
10210       if (s[1] == 't' && s[2] == ' ')
10211         {
10212           *s = '\0';
10213           mips16_small = TRUE;
10214           s += 3;
10215           break;
10216         }
10217       else if (s[1] == 'e' && s[2] == ' ')
10218         {
10219           *s = '\0';
10220           mips16_ext = TRUE;
10221           s += 3;
10222           break;
10223         }
10224       /* Fall through.  */
10225     default:
10226       insn_error = _("unknown opcode");
10227       return;
10228     }
10229
10230   if (mips_opts.noautoextend && ! mips16_ext)
10231     mips16_small = TRUE;
10232
10233   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10234     {
10235       insn_error = _("unrecognized opcode");
10236       return;
10237     }
10238
10239   argsstart = s;
10240   for (;;)
10241     {
10242       bfd_boolean ok;
10243
10244       gas_assert (strcmp (insn->name, str) == 0);
10245
10246       ok = is_opcode_valid_16 (insn);
10247       if (! ok)
10248         {
10249           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10250               && strcmp (insn->name, insn[1].name) == 0)
10251             {
10252               ++insn;
10253               continue;
10254             }
10255           else
10256             {
10257               if (!insn_error)
10258                 {
10259                   static char buf[100];
10260                   sprintf (buf,
10261                            _("opcode not supported on this processor: %s (%s)"),
10262                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10263                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10264                   insn_error = buf;
10265                 }
10266               return;
10267             }
10268         }
10269
10270       create_insn (ip, insn);
10271       imm_expr.X_op = O_absent;
10272       imm_reloc[0] = BFD_RELOC_UNUSED;
10273       imm_reloc[1] = BFD_RELOC_UNUSED;
10274       imm_reloc[2] = BFD_RELOC_UNUSED;
10275       imm2_expr.X_op = O_absent;
10276       offset_expr.X_op = O_absent;
10277       offset_reloc[0] = BFD_RELOC_UNUSED;
10278       offset_reloc[1] = BFD_RELOC_UNUSED;
10279       offset_reloc[2] = BFD_RELOC_UNUSED;
10280       for (args = insn->args; 1; ++args)
10281         {
10282           int c;
10283
10284           if (*s == ' ')
10285             ++s;
10286
10287           /* In this switch statement we call break if we did not find
10288              a match, continue if we did find a match, or return if we
10289              are done.  */
10290
10291           c = *args;
10292           switch (c)
10293             {
10294             case '\0':
10295               if (*s == '\0')
10296                 {
10297                   /* Stuff the immediate value in now, if we can.  */
10298                   if (imm_expr.X_op == O_constant
10299                       && *imm_reloc > BFD_RELOC_UNUSED
10300                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10301                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10302                       && insn->pinfo != INSN_MACRO)
10303                     {
10304                       valueT tmp;
10305
10306                       switch (*offset_reloc)
10307                         {
10308                           case BFD_RELOC_MIPS16_HI16_S:
10309                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10310                             break;
10311
10312                           case BFD_RELOC_MIPS16_HI16:
10313                             tmp = imm_expr.X_add_number >> 16;
10314                             break;
10315
10316                           case BFD_RELOC_MIPS16_LO16:
10317                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10318                                   - 0x8000;
10319                             break;
10320
10321                           case BFD_RELOC_UNUSED:
10322                             tmp = imm_expr.X_add_number;
10323                             break;
10324
10325                           default:
10326                             internalError ();
10327                         }
10328                       *offset_reloc = BFD_RELOC_UNUSED;
10329
10330                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10331                                     tmp, TRUE, mips16_small,
10332                                     mips16_ext, &ip->insn_opcode,
10333                                     &ip->use_extend, &ip->extend);
10334                       imm_expr.X_op = O_absent;
10335                       *imm_reloc = BFD_RELOC_UNUSED;
10336                     }
10337
10338                   return;
10339                 }
10340               break;
10341
10342             case ',':
10343               if (*s++ == c)
10344                 continue;
10345               s--;
10346               switch (*++args)
10347                 {
10348                 case 'v':
10349                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10350                   continue;
10351                 case 'w':
10352                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10353                   continue;
10354                 }
10355               break;
10356
10357             case '(':
10358             case ')':
10359               if (*s++ == c)
10360                 continue;
10361               break;
10362
10363             case 'v':
10364             case 'w':
10365               if (s[0] != '$')
10366                 {
10367                   if (c == 'v')
10368                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10369                   else
10370                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10371                   ++args;
10372                   continue;
10373                 }
10374               /* Fall through.  */
10375             case 'x':
10376             case 'y':
10377             case 'z':
10378             case 'Z':
10379             case '0':
10380             case 'S':
10381             case 'R':
10382             case 'X':
10383             case 'Y':
10384               s_reset = s;
10385               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10386                 {
10387                   if (c == 'v' || c == 'w')
10388                     {
10389                       if (c == 'v')
10390                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10391                       else
10392                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10393                       ++args;
10394                       continue;
10395                     }
10396                   break;
10397                 }
10398
10399               if (*s == ' ')
10400                 ++s;
10401               if (args[1] != *s)
10402                 {
10403                   if (c == 'v' || c == 'w')
10404                     {
10405                       regno = mips16_to_32_reg_map[lastregno];
10406                       s = s_reset;
10407                       ++args;
10408                     }
10409                 }
10410
10411               switch (c)
10412                 {
10413                 case 'x':
10414                 case 'y':
10415                 case 'z':
10416                 case 'v':
10417                 case 'w':
10418                 case 'Z':
10419                   regno = mips32_to_16_reg_map[regno];
10420                   break;
10421
10422                 case '0':
10423                   if (regno != 0)
10424                     regno = ILLEGAL_REG;
10425                   break;
10426
10427                 case 'S':
10428                   if (regno != SP)
10429                     regno = ILLEGAL_REG;
10430                   break;
10431
10432                 case 'R':
10433                   if (regno != RA)
10434                     regno = ILLEGAL_REG;
10435                   break;
10436
10437                 case 'X':
10438                 case 'Y':
10439                   if (regno == AT && mips_opts.at)
10440                     {
10441                       if (mips_opts.at == ATREG)
10442                         as_warn (_("used $at without \".set noat\""));
10443                       else
10444                         as_warn (_("used $%u with \".set at=$%u\""),
10445                                  regno, mips_opts.at);
10446                     }
10447                   break;
10448
10449                 default:
10450                   internalError ();
10451                 }
10452
10453               if (regno == ILLEGAL_REG)
10454                 break;
10455
10456               switch (c)
10457                 {
10458                 case 'x':
10459                 case 'v':
10460                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10461                   break;
10462                 case 'y':
10463                 case 'w':
10464                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10465                   break;
10466                 case 'z':
10467                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10468                   break;
10469                 case 'Z':
10470                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10471                 case '0':
10472                 case 'S':
10473                 case 'R':
10474                   break;
10475                 case 'X':
10476                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10477                   break;
10478                 case 'Y':
10479                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10480                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10481                   break;
10482                 default:
10483                   internalError ();
10484                 }
10485
10486               lastregno = regno;
10487               continue;
10488
10489             case 'P':
10490               if (strncmp (s, "$pc", 3) == 0)
10491                 {
10492                   s += 3;
10493                   continue;
10494                 }
10495               break;
10496
10497             case '5':
10498             case 'H':
10499             case 'W':
10500             case 'D':
10501             case 'j':
10502             case 'V':
10503             case 'C':
10504             case 'U':
10505             case 'k':
10506             case 'K':
10507               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10508               if (i > 0)
10509                 {
10510                   if (imm_expr.X_op != O_constant)
10511                     {
10512                       mips16_ext = TRUE;
10513                       ip->use_extend = TRUE;
10514                       ip->extend = 0;
10515                     }
10516                   else
10517                     {
10518                       /* We need to relax this instruction.  */
10519                       *offset_reloc = *imm_reloc;
10520                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10521                     }
10522                   s = expr_end;
10523                   continue;
10524                 }
10525               *imm_reloc = BFD_RELOC_UNUSED;
10526               /* Fall through.  */
10527             case '<':
10528             case '>':
10529             case '[':
10530             case ']':
10531             case '4':
10532             case '8':
10533               my_getExpression (&imm_expr, s);
10534               if (imm_expr.X_op == O_register)
10535                 {
10536                   /* What we thought was an expression turned out to
10537                      be a register.  */
10538
10539                   if (s[0] == '(' && args[1] == '(')
10540                     {
10541                       /* It looks like the expression was omitted
10542                          before a register indirection, which means
10543                          that the expression is implicitly zero.  We
10544                          still set up imm_expr, so that we handle
10545                          explicit extensions correctly.  */
10546                       imm_expr.X_op = O_constant;
10547                       imm_expr.X_add_number = 0;
10548                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10549                       continue;
10550                     }
10551
10552                   break;
10553                 }
10554
10555               /* We need to relax this instruction.  */
10556               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10557               s = expr_end;
10558               continue;
10559
10560             case 'p':
10561             case 'q':
10562             case 'A':
10563             case 'B':
10564             case 'E':
10565               /* We use offset_reloc rather than imm_reloc for the PC
10566                  relative operands.  This lets macros with both
10567                  immediate and address operands work correctly.  */
10568               my_getExpression (&offset_expr, s);
10569
10570               if (offset_expr.X_op == O_register)
10571                 break;
10572
10573               /* We need to relax this instruction.  */
10574               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10575               s = expr_end;
10576               continue;
10577
10578             case '6':           /* break code */
10579               my_getExpression (&imm_expr, s);
10580               check_absolute_expr (ip, &imm_expr);
10581               if ((unsigned long) imm_expr.X_add_number > 63)
10582                 as_warn (_("Invalid value for `%s' (%lu)"),
10583                          ip->insn_mo->name,
10584                          (unsigned long) imm_expr.X_add_number);
10585               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10586               imm_expr.X_op = O_absent;
10587               s = expr_end;
10588               continue;
10589
10590             case 'a':           /* 26 bit address */
10591               my_getExpression (&offset_expr, s);
10592               s = expr_end;
10593               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10594               ip->insn_opcode <<= 16;
10595               continue;
10596
10597             case 'l':           /* register list for entry macro */
10598             case 'L':           /* register list for exit macro */
10599               {
10600                 int mask;
10601
10602                 if (c == 'l')
10603                   mask = 0;
10604                 else
10605                   mask = 7 << 3;
10606                 while (*s != '\0')
10607                   {
10608                     unsigned int freg, reg1, reg2;
10609
10610                     while (*s == ' ' || *s == ',')
10611                       ++s;
10612                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10613                       freg = 0;
10614                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10615                       freg = 1;
10616                     else
10617                       {
10618                         as_bad (_("can't parse register list"));
10619                         break;
10620                       }
10621                     if (*s == ' ')
10622                       ++s;
10623                     if (*s != '-')
10624                       reg2 = reg1;
10625                     else
10626                       {
10627                         ++s;
10628                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10629                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10630                           {
10631                             as_bad (_("invalid register list"));
10632                             break;
10633                           }
10634                       }
10635                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10636                       {
10637                         mask &= ~ (7 << 3);
10638                         mask |= 5 << 3;
10639                       }
10640                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10641                       {
10642                         mask &= ~ (7 << 3);
10643                         mask |= 6 << 3;
10644                       }
10645                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10646                       mask |= (reg2 - 3) << 3;
10647                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10648                       mask |= (reg2 - 15) << 1;
10649                     else if (reg1 == RA && reg2 == RA)
10650                       mask |= 1;
10651                     else
10652                       {
10653                         as_bad (_("invalid register list"));
10654                         break;
10655                       }
10656                   }
10657                 /* The mask is filled in in the opcode table for the
10658                    benefit of the disassembler.  We remove it before
10659                    applying the actual mask.  */
10660                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10661                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10662               }
10663             continue;
10664
10665             case 'm':           /* Register list for save insn.  */
10666             case 'M':           /* Register list for restore insn.  */
10667               {
10668                 int opcode = 0;
10669                 int framesz = 0, seen_framesz = 0;
10670                 int nargs = 0, statics = 0, sregs = 0;
10671
10672                 while (*s != '\0')
10673                   {
10674                     unsigned int reg1, reg2;
10675
10676                     SKIP_SPACE_TABS (s);
10677                     while (*s == ',')
10678                       ++s;
10679                     SKIP_SPACE_TABS (s);
10680
10681                     my_getExpression (&imm_expr, s);
10682                     if (imm_expr.X_op == O_constant)
10683                       {
10684                         /* Handle the frame size.  */
10685                         if (seen_framesz)
10686                           {
10687                             as_bad (_("more than one frame size in list"));
10688                             break;
10689                           }
10690                         seen_framesz = 1;
10691                         framesz = imm_expr.X_add_number;
10692                         imm_expr.X_op = O_absent;
10693                         s = expr_end;
10694                         continue;
10695                       }
10696
10697                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10698                       {
10699                         as_bad (_("can't parse register list"));
10700                         break;
10701                       }
10702
10703                     while (*s == ' ')
10704                       ++s;
10705
10706                     if (*s != '-')
10707                       reg2 = reg1;
10708                     else
10709                       {
10710                         ++s;
10711                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10712                             || reg2 < reg1)
10713                           {
10714                             as_bad (_("can't parse register list"));
10715                             break;
10716                           }
10717                       }
10718
10719                     while (reg1 <= reg2)
10720                       {
10721                         if (reg1 >= 4 && reg1 <= 7)
10722                           {
10723                             if (!seen_framesz)
10724                                 /* args $a0-$a3 */
10725                                 nargs |= 1 << (reg1 - 4);
10726                             else
10727                                 /* statics $a0-$a3 */
10728                                 statics |= 1 << (reg1 - 4);
10729                           }
10730                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10731                           {
10732                             /* $s0-$s8 */
10733                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10734                           }
10735                         else if (reg1 == 31)
10736                           {
10737                             /* Add $ra to insn.  */
10738                             opcode |= 0x40;
10739                           }
10740                         else
10741                           {
10742                             as_bad (_("unexpected register in list"));
10743                             break;
10744                           }
10745                         if (++reg1 == 24)
10746                           reg1 = 30;
10747                       }
10748                   }
10749
10750                 /* Encode args/statics combination.  */
10751                 if (nargs & statics)
10752                   as_bad (_("arg/static registers overlap"));
10753                 else if (nargs == 0xf)
10754                   /* All $a0-$a3 are args.  */
10755                   opcode |= MIPS16_ALL_ARGS << 16;
10756                 else if (statics == 0xf)
10757                   /* All $a0-$a3 are statics.  */
10758                   opcode |= MIPS16_ALL_STATICS << 16;
10759                 else 
10760                   {
10761                     int narg = 0, nstat = 0;
10762
10763                     /* Count arg registers.  */
10764                     while (nargs & 0x1)
10765                       {
10766                         nargs >>= 1;
10767                         narg++;
10768                       }
10769                     if (nargs != 0)
10770                       as_bad (_("invalid arg register list"));
10771
10772                     /* Count static registers.  */
10773                     while (statics & 0x8)
10774                       {
10775                         statics = (statics << 1) & 0xf;
10776                         nstat++;
10777                       }
10778                     if (statics != 0) 
10779                       as_bad (_("invalid static register list"));
10780
10781                     /* Encode args/statics.  */
10782                     opcode |= ((narg << 2) | nstat) << 16;
10783                   }
10784
10785                 /* Encode $s0/$s1.  */
10786                 if (sregs & (1 << 0))           /* $s0 */
10787                   opcode |= 0x20;
10788                 if (sregs & (1 << 1))           /* $s1 */
10789                   opcode |= 0x10;
10790                 sregs >>= 2;
10791
10792                 if (sregs != 0)
10793                   {
10794                     /* Count regs $s2-$s8.  */
10795                     int nsreg = 0;
10796                     while (sregs & 1)
10797                       {
10798                         sregs >>= 1;
10799                         nsreg++;
10800                       }
10801                     if (sregs != 0)
10802                       as_bad (_("invalid static register list"));
10803                     /* Encode $s2-$s8. */
10804                     opcode |= nsreg << 24;
10805                   }
10806
10807                 /* Encode frame size.  */
10808                 if (!seen_framesz)
10809                   as_bad (_("missing frame size"));
10810                 else if ((framesz & 7) != 0 || framesz < 0
10811                          || framesz > 0xff * 8)
10812                   as_bad (_("invalid frame size"));
10813                 else if (framesz != 128 || (opcode >> 16) != 0)
10814                   {
10815                     framesz /= 8;
10816                     opcode |= (((framesz & 0xf0) << 16)
10817                              | (framesz & 0x0f));
10818                   }
10819
10820                 /* Finally build the instruction.  */
10821                 if ((opcode >> 16) != 0 || framesz == 0)
10822                   {
10823                     ip->use_extend = TRUE;
10824                     ip->extend = opcode >> 16;
10825                   }
10826                 ip->insn_opcode |= opcode & 0x7f;
10827               }
10828             continue;
10829
10830             case 'e':           /* extend code */
10831               my_getExpression (&imm_expr, s);
10832               check_absolute_expr (ip, &imm_expr);
10833               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10834                 {
10835                   as_warn (_("Invalid value for `%s' (%lu)"),
10836                            ip->insn_mo->name,
10837                            (unsigned long) imm_expr.X_add_number);
10838                   imm_expr.X_add_number &= 0x7ff;
10839                 }
10840               ip->insn_opcode |= imm_expr.X_add_number;
10841               imm_expr.X_op = O_absent;
10842               s = expr_end;
10843               continue;
10844
10845             default:
10846               internalError ();
10847             }
10848           break;
10849         }
10850
10851       /* Args don't match.  */
10852       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10853           strcmp (insn->name, insn[1].name) == 0)
10854         {
10855           ++insn;
10856           s = argsstart;
10857           continue;
10858         }
10859
10860       insn_error = _("illegal operands");
10861
10862       return;
10863     }
10864 }
10865
10866 /* This structure holds information we know about a mips16 immediate
10867    argument type.  */
10868
10869 struct mips16_immed_operand
10870 {
10871   /* The type code used in the argument string in the opcode table.  */
10872   int type;
10873   /* The number of bits in the short form of the opcode.  */
10874   int nbits;
10875   /* The number of bits in the extended form of the opcode.  */
10876   int extbits;
10877   /* The amount by which the short form is shifted when it is used;
10878      for example, the sw instruction has a shift count of 2.  */
10879   int shift;
10880   /* The amount by which the short form is shifted when it is stored
10881      into the instruction code.  */
10882   int op_shift;
10883   /* Non-zero if the short form is unsigned.  */
10884   int unsp;
10885   /* Non-zero if the extended form is unsigned.  */
10886   int extu;
10887   /* Non-zero if the value is PC relative.  */
10888   int pcrel;
10889 };
10890
10891 /* The mips16 immediate operand types.  */
10892
10893 static const struct mips16_immed_operand mips16_immed_operands[] =
10894 {
10895   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10896   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10897   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10898   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10899   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10900   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10901   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10902   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10903   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10904   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10905   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10906   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10907   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10908   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10909   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10910   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10911   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10912   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10913   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10914   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10915   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10916 };
10917
10918 #define MIPS16_NUM_IMMED \
10919   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10920
10921 /* Handle a mips16 instruction with an immediate value.  This or's the
10922    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10923    whether an extended value is needed; if one is needed, it sets
10924    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10925    If SMALL is true, an unextended opcode was explicitly requested.
10926    If EXT is true, an extended opcode was explicitly requested.  If
10927    WARN is true, warn if EXT does not match reality.  */
10928
10929 static void
10930 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10931               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10932               unsigned long *insn, bfd_boolean *use_extend,
10933               unsigned short *extend)
10934 {
10935   const struct mips16_immed_operand *op;
10936   int mintiny, maxtiny;
10937   bfd_boolean needext;
10938
10939   op = mips16_immed_operands;
10940   while (op->type != type)
10941     {
10942       ++op;
10943       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10944     }
10945
10946   if (op->unsp)
10947     {
10948       if (type == '<' || type == '>' || type == '[' || type == ']')
10949         {
10950           mintiny = 1;
10951           maxtiny = 1 << op->nbits;
10952         }
10953       else
10954         {
10955           mintiny = 0;
10956           maxtiny = (1 << op->nbits) - 1;
10957         }
10958     }
10959   else
10960     {
10961       mintiny = - (1 << (op->nbits - 1));
10962       maxtiny = (1 << (op->nbits - 1)) - 1;
10963     }
10964
10965   /* Branch offsets have an implicit 0 in the lowest bit.  */
10966   if (type == 'p' || type == 'q')
10967     val /= 2;
10968
10969   if ((val & ((1 << op->shift) - 1)) != 0
10970       || val < (mintiny << op->shift)
10971       || val > (maxtiny << op->shift))
10972     needext = TRUE;
10973   else
10974     needext = FALSE;
10975
10976   if (warn && ext && ! needext)
10977     as_warn_where (file, line,
10978                    _("extended operand requested but not required"));
10979   if (small && needext)
10980     as_bad_where (file, line, _("invalid unextended operand value"));
10981
10982   if (small || (! ext && ! needext))
10983     {
10984       int insnval;
10985
10986       *use_extend = FALSE;
10987       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10988       insnval <<= op->op_shift;
10989       *insn |= insnval;
10990     }
10991   else
10992     {
10993       long minext, maxext;
10994       int extval;
10995
10996       if (op->extu)
10997         {
10998           minext = 0;
10999           maxext = (1 << op->extbits) - 1;
11000         }
11001       else
11002         {
11003           minext = - (1 << (op->extbits - 1));
11004           maxext = (1 << (op->extbits - 1)) - 1;
11005         }
11006       if (val < minext || val > maxext)
11007         as_bad_where (file, line,
11008                       _("operand value out of range for instruction"));
11009
11010       *use_extend = TRUE;
11011       if (op->extbits == 16)
11012         {
11013           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11014           val &= 0x1f;
11015         }
11016       else if (op->extbits == 15)
11017         {
11018           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11019           val &= 0xf;
11020         }
11021       else
11022         {
11023           extval = ((val & 0x1f) << 6) | (val & 0x20);
11024           val = 0;
11025         }
11026
11027       *extend = (unsigned short) extval;
11028       *insn |= val;
11029     }
11030 }
11031 \f
11032 struct percent_op_match
11033 {
11034   const char *str;
11035   bfd_reloc_code_real_type reloc;
11036 };
11037
11038 static const struct percent_op_match mips_percent_op[] =
11039 {
11040   {"%lo", BFD_RELOC_LO16},
11041 #ifdef OBJ_ELF
11042   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11043   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11044   {"%call16", BFD_RELOC_MIPS_CALL16},
11045   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11046   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11047   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11048   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11049   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11050   {"%got", BFD_RELOC_MIPS_GOT16},
11051   {"%gp_rel", BFD_RELOC_GPREL16},
11052   {"%half", BFD_RELOC_16},
11053   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11054   {"%higher", BFD_RELOC_MIPS_HIGHER},
11055   {"%neg", BFD_RELOC_MIPS_SUB},
11056   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11057   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11058   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11059   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11060   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11061   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11062   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11063 #endif
11064   {"%hi", BFD_RELOC_HI16_S}
11065 };
11066
11067 static const struct percent_op_match mips16_percent_op[] =
11068 {
11069   {"%lo", BFD_RELOC_MIPS16_LO16},
11070   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11071   {"%got", BFD_RELOC_MIPS16_GOT16},
11072   {"%call16", BFD_RELOC_MIPS16_CALL16},
11073   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11074 };
11075
11076
11077 /* Return true if *STR points to a relocation operator.  When returning true,
11078    move *STR over the operator and store its relocation code in *RELOC.
11079    Leave both *STR and *RELOC alone when returning false.  */
11080
11081 static bfd_boolean
11082 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11083 {
11084   const struct percent_op_match *percent_op;
11085   size_t limit, i;
11086
11087   if (mips_opts.mips16)
11088     {
11089       percent_op = mips16_percent_op;
11090       limit = ARRAY_SIZE (mips16_percent_op);
11091     }
11092   else
11093     {
11094       percent_op = mips_percent_op;
11095       limit = ARRAY_SIZE (mips_percent_op);
11096     }
11097
11098   for (i = 0; i < limit; i++)
11099     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11100       {
11101         int len = strlen (percent_op[i].str);
11102
11103         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11104           continue;
11105
11106         *str += strlen (percent_op[i].str);
11107         *reloc = percent_op[i].reloc;
11108
11109         /* Check whether the output BFD supports this relocation.
11110            If not, issue an error and fall back on something safe.  */
11111         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11112           {
11113             as_bad (_("relocation %s isn't supported by the current ABI"),
11114                     percent_op[i].str);
11115             *reloc = BFD_RELOC_UNUSED;
11116           }
11117         return TRUE;
11118       }
11119   return FALSE;
11120 }
11121
11122
11123 /* Parse string STR as a 16-bit relocatable operand.  Store the
11124    expression in *EP and the relocations in the array starting
11125    at RELOC.  Return the number of relocation operators used.
11126
11127    On exit, EXPR_END points to the first character after the expression.  */
11128
11129 static size_t
11130 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11131                        char *str)
11132 {
11133   bfd_reloc_code_real_type reversed_reloc[3];
11134   size_t reloc_index, i;
11135   int crux_depth, str_depth;
11136   char *crux;
11137
11138   /* Search for the start of the main expression, recoding relocations
11139      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11140      of the main expression and with CRUX_DEPTH containing the number
11141      of open brackets at that point.  */
11142   reloc_index = -1;
11143   str_depth = 0;
11144   do
11145     {
11146       reloc_index++;
11147       crux = str;
11148       crux_depth = str_depth;
11149
11150       /* Skip over whitespace and brackets, keeping count of the number
11151          of brackets.  */
11152       while (*str == ' ' || *str == '\t' || *str == '(')
11153         if (*str++ == '(')
11154           str_depth++;
11155     }
11156   while (*str == '%'
11157          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11158          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11159
11160   my_getExpression (ep, crux);
11161   str = expr_end;
11162
11163   /* Match every open bracket.  */
11164   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11165     if (*str++ == ')')
11166       crux_depth--;
11167
11168   if (crux_depth > 0)
11169     as_bad (_("unclosed '('"));
11170
11171   expr_end = str;
11172
11173   if (reloc_index != 0)
11174     {
11175       prev_reloc_op_frag = frag_now;
11176       for (i = 0; i < reloc_index; i++)
11177         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11178     }
11179
11180   return reloc_index;
11181 }
11182
11183 static void
11184 my_getExpression (expressionS *ep, char *str)
11185 {
11186   char *save_in;
11187   valueT val;
11188
11189   save_in = input_line_pointer;
11190   input_line_pointer = str;
11191   expression (ep);
11192   expr_end = input_line_pointer;
11193   input_line_pointer = save_in;
11194
11195   /* If we are in mips16 mode, and this is an expression based on `.',
11196      then we bump the value of the symbol by 1 since that is how other
11197      text symbols are handled.  We don't bother to handle complex
11198      expressions, just `.' plus or minus a constant.  */
11199   if (mips_opts.mips16
11200       && ep->X_op == O_symbol
11201       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11202       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11203       && symbol_get_frag (ep->X_add_symbol) == frag_now
11204       && symbol_constant_p (ep->X_add_symbol)
11205       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11206     S_SET_VALUE (ep->X_add_symbol, val + 1);
11207 }
11208
11209 char *
11210 md_atof (int type, char *litP, int *sizeP)
11211 {
11212   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11213 }
11214
11215 void
11216 md_number_to_chars (char *buf, valueT val, int n)
11217 {
11218   if (target_big_endian)
11219     number_to_chars_bigendian (buf, val, n);
11220   else
11221     number_to_chars_littleendian (buf, val, n);
11222 }
11223 \f
11224 #ifdef OBJ_ELF
11225 static int support_64bit_objects(void)
11226 {
11227   const char **list, **l;
11228   int yes;
11229
11230   list = bfd_target_list ();
11231   for (l = list; *l != NULL; l++)
11232 #ifdef TE_TMIPS
11233     /* This is traditional mips */
11234     if (strcmp (*l, "elf64-tradbigmips") == 0
11235         || strcmp (*l, "elf64-tradlittlemips") == 0)
11236 #else
11237     if (strcmp (*l, "elf64-bigmips") == 0
11238         || strcmp (*l, "elf64-littlemips") == 0)
11239 #endif
11240       break;
11241   yes = (*l != NULL);
11242   free (list);
11243   return yes;
11244 }
11245 #endif /* OBJ_ELF */
11246
11247 const char *md_shortopts = "O::g::G:";
11248
11249 enum options
11250   {
11251     OPTION_MARCH = OPTION_MD_BASE,
11252     OPTION_MTUNE,
11253     OPTION_MIPS1,
11254     OPTION_MIPS2,
11255     OPTION_MIPS3,
11256     OPTION_MIPS4,
11257     OPTION_MIPS5,
11258     OPTION_MIPS32,
11259     OPTION_MIPS64,
11260     OPTION_MIPS32R2,
11261     OPTION_MIPS64R2,
11262     OPTION_MIPS16,
11263     OPTION_NO_MIPS16,
11264     OPTION_MIPS3D,
11265     OPTION_NO_MIPS3D,
11266     OPTION_MDMX,
11267     OPTION_NO_MDMX,
11268     OPTION_DSP,
11269     OPTION_NO_DSP,
11270     OPTION_MT,
11271     OPTION_NO_MT,
11272     OPTION_SMARTMIPS,
11273     OPTION_NO_SMARTMIPS,
11274     OPTION_DSPR2,
11275     OPTION_NO_DSPR2,
11276     OPTION_COMPAT_ARCH_BASE,
11277     OPTION_M4650,
11278     OPTION_NO_M4650,
11279     OPTION_M4010,
11280     OPTION_NO_M4010,
11281     OPTION_M4100,
11282     OPTION_NO_M4100,
11283     OPTION_M3900,
11284     OPTION_NO_M3900,
11285     OPTION_M7000_HILO_FIX,
11286     OPTION_MNO_7000_HILO_FIX, 
11287     OPTION_FIX_24K,
11288     OPTION_NO_FIX_24K,
11289     OPTION_FIX_LOONGSON2F_JUMP,
11290     OPTION_NO_FIX_LOONGSON2F_JUMP,
11291     OPTION_FIX_LOONGSON2F_NOP,
11292     OPTION_NO_FIX_LOONGSON2F_NOP,
11293     OPTION_FIX_VR4120,
11294     OPTION_NO_FIX_VR4120,
11295     OPTION_FIX_VR4130,
11296     OPTION_NO_FIX_VR4130,
11297     OPTION_FIX_CN63XXP1,
11298     OPTION_NO_FIX_CN63XXP1,
11299     OPTION_TRAP,
11300     OPTION_BREAK,
11301     OPTION_EB,
11302     OPTION_EL,
11303     OPTION_FP32,
11304     OPTION_GP32,
11305     OPTION_CONSTRUCT_FLOATS,
11306     OPTION_NO_CONSTRUCT_FLOATS,
11307     OPTION_FP64,
11308     OPTION_GP64,
11309     OPTION_RELAX_BRANCH,
11310     OPTION_NO_RELAX_BRANCH,
11311     OPTION_MSHARED,
11312     OPTION_MNO_SHARED,
11313     OPTION_MSYM32,
11314     OPTION_MNO_SYM32,
11315     OPTION_SOFT_FLOAT,
11316     OPTION_HARD_FLOAT,
11317     OPTION_SINGLE_FLOAT,
11318     OPTION_DOUBLE_FLOAT,
11319     OPTION_32,
11320 #ifdef OBJ_ELF
11321     OPTION_CALL_SHARED,
11322     OPTION_CALL_NONPIC,
11323     OPTION_NON_SHARED,
11324     OPTION_XGOT,
11325     OPTION_MABI,
11326     OPTION_N32,
11327     OPTION_64,
11328     OPTION_MDEBUG,
11329     OPTION_NO_MDEBUG,
11330     OPTION_PDR,
11331     OPTION_NO_PDR,
11332     OPTION_MVXWORKS_PIC,
11333 #endif /* OBJ_ELF */
11334     OPTION_END_OF_ENUM    
11335   };
11336   
11337 struct option md_longopts[] =
11338 {
11339   /* Options which specify architecture.  */
11340   {"march", required_argument, NULL, OPTION_MARCH},
11341   {"mtune", required_argument, NULL, OPTION_MTUNE},
11342   {"mips0", no_argument, NULL, OPTION_MIPS1},
11343   {"mips1", no_argument, NULL, OPTION_MIPS1},
11344   {"mips2", no_argument, NULL, OPTION_MIPS2},
11345   {"mips3", no_argument, NULL, OPTION_MIPS3},
11346   {"mips4", no_argument, NULL, OPTION_MIPS4},
11347   {"mips5", no_argument, NULL, OPTION_MIPS5},
11348   {"mips32", no_argument, NULL, OPTION_MIPS32},
11349   {"mips64", no_argument, NULL, OPTION_MIPS64},
11350   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11351   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11352
11353   /* Options which specify Application Specific Extensions (ASEs).  */
11354   {"mips16", no_argument, NULL, OPTION_MIPS16},
11355   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11356   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11357   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11358   {"mdmx", no_argument, NULL, OPTION_MDMX},
11359   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11360   {"mdsp", no_argument, NULL, OPTION_DSP},
11361   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11362   {"mmt", no_argument, NULL, OPTION_MT},
11363   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11364   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11365   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11366   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11367   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11368
11369   /* Old-style architecture options.  Don't add more of these.  */
11370   {"m4650", no_argument, NULL, OPTION_M4650},
11371   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11372   {"m4010", no_argument, NULL, OPTION_M4010},
11373   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11374   {"m4100", no_argument, NULL, OPTION_M4100},
11375   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11376   {"m3900", no_argument, NULL, OPTION_M3900},
11377   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11378
11379   /* Options which enable bug fixes.  */
11380   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11381   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11382   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11383   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11384   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11385   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11386   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11387   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11388   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11389   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11390   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11391   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11392   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11393   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11394   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11395
11396   /* Miscellaneous options.  */
11397   {"trap", no_argument, NULL, OPTION_TRAP},
11398   {"no-break", no_argument, NULL, OPTION_TRAP},
11399   {"break", no_argument, NULL, OPTION_BREAK},
11400   {"no-trap", no_argument, NULL, OPTION_BREAK},
11401   {"EB", no_argument, NULL, OPTION_EB},
11402   {"EL", no_argument, NULL, OPTION_EL},
11403   {"mfp32", no_argument, NULL, OPTION_FP32},
11404   {"mgp32", no_argument, NULL, OPTION_GP32},
11405   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11406   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11407   {"mfp64", no_argument, NULL, OPTION_FP64},
11408   {"mgp64", no_argument, NULL, OPTION_GP64},
11409   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11410   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11411   {"mshared", no_argument, NULL, OPTION_MSHARED},
11412   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11413   {"msym32", no_argument, NULL, OPTION_MSYM32},
11414   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11415   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11416   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11417   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11418   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11419
11420   /* Strictly speaking this next option is ELF specific,
11421      but we allow it for other ports as well in order to
11422      make testing easier.  */
11423   {"32",          no_argument, NULL, OPTION_32},
11424   
11425   /* ELF-specific options.  */
11426 #ifdef OBJ_ELF
11427   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11428   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11429   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11430   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11431   {"xgot",        no_argument, NULL, OPTION_XGOT},
11432   {"mabi", required_argument, NULL, OPTION_MABI},
11433   {"n32",         no_argument, NULL, OPTION_N32},
11434   {"64",          no_argument, NULL, OPTION_64},
11435   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11436   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11437   {"mpdr", no_argument, NULL, OPTION_PDR},
11438   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11439   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11440 #endif /* OBJ_ELF */
11441
11442   {NULL, no_argument, NULL, 0}
11443 };
11444 size_t md_longopts_size = sizeof (md_longopts);
11445
11446 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11447    NEW_VALUE.  Warn if another value was already specified.  Note:
11448    we have to defer parsing the -march and -mtune arguments in order
11449    to handle 'from-abi' correctly, since the ABI might be specified
11450    in a later argument.  */
11451
11452 static void
11453 mips_set_option_string (const char **string_ptr, const char *new_value)
11454 {
11455   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11456     as_warn (_("A different %s was already specified, is now %s"),
11457              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11458              new_value);
11459
11460   *string_ptr = new_value;
11461 }
11462
11463 int
11464 md_parse_option (int c, char *arg)
11465 {
11466   switch (c)
11467     {
11468     case OPTION_CONSTRUCT_FLOATS:
11469       mips_disable_float_construction = 0;
11470       break;
11471
11472     case OPTION_NO_CONSTRUCT_FLOATS:
11473       mips_disable_float_construction = 1;
11474       break;
11475
11476     case OPTION_TRAP:
11477       mips_trap = 1;
11478       break;
11479
11480     case OPTION_BREAK:
11481       mips_trap = 0;
11482       break;
11483
11484     case OPTION_EB:
11485       target_big_endian = 1;
11486       break;
11487
11488     case OPTION_EL:
11489       target_big_endian = 0;
11490       break;
11491
11492     case 'O':
11493       if (arg == NULL)
11494         mips_optimize = 1;
11495       else if (arg[0] == '0')
11496         mips_optimize = 0;
11497       else if (arg[0] == '1')
11498         mips_optimize = 1;
11499       else
11500         mips_optimize = 2;
11501       break;
11502
11503     case 'g':
11504       if (arg == NULL)
11505         mips_debug = 2;
11506       else
11507         mips_debug = atoi (arg);
11508       break;
11509
11510     case OPTION_MIPS1:
11511       file_mips_isa = ISA_MIPS1;
11512       break;
11513
11514     case OPTION_MIPS2:
11515       file_mips_isa = ISA_MIPS2;
11516       break;
11517
11518     case OPTION_MIPS3:
11519       file_mips_isa = ISA_MIPS3;
11520       break;
11521
11522     case OPTION_MIPS4:
11523       file_mips_isa = ISA_MIPS4;
11524       break;
11525
11526     case OPTION_MIPS5:
11527       file_mips_isa = ISA_MIPS5;
11528       break;
11529
11530     case OPTION_MIPS32:
11531       file_mips_isa = ISA_MIPS32;
11532       break;
11533
11534     case OPTION_MIPS32R2:
11535       file_mips_isa = ISA_MIPS32R2;
11536       break;
11537
11538     case OPTION_MIPS64R2:
11539       file_mips_isa = ISA_MIPS64R2;
11540       break;
11541
11542     case OPTION_MIPS64:
11543       file_mips_isa = ISA_MIPS64;
11544       break;
11545
11546     case OPTION_MTUNE:
11547       mips_set_option_string (&mips_tune_string, arg);
11548       break;
11549
11550     case OPTION_MARCH:
11551       mips_set_option_string (&mips_arch_string, arg);
11552       break;
11553
11554     case OPTION_M4650:
11555       mips_set_option_string (&mips_arch_string, "4650");
11556       mips_set_option_string (&mips_tune_string, "4650");
11557       break;
11558
11559     case OPTION_NO_M4650:
11560       break;
11561
11562     case OPTION_M4010:
11563       mips_set_option_string (&mips_arch_string, "4010");
11564       mips_set_option_string (&mips_tune_string, "4010");
11565       break;
11566
11567     case OPTION_NO_M4010:
11568       break;
11569
11570     case OPTION_M4100:
11571       mips_set_option_string (&mips_arch_string, "4100");
11572       mips_set_option_string (&mips_tune_string, "4100");
11573       break;
11574
11575     case OPTION_NO_M4100:
11576       break;
11577
11578     case OPTION_M3900:
11579       mips_set_option_string (&mips_arch_string, "3900");
11580       mips_set_option_string (&mips_tune_string, "3900");
11581       break;
11582
11583     case OPTION_NO_M3900:
11584       break;
11585
11586     case OPTION_MDMX:
11587       mips_opts.ase_mdmx = 1;
11588       break;
11589
11590     case OPTION_NO_MDMX:
11591       mips_opts.ase_mdmx = 0;
11592       break;
11593
11594     case OPTION_DSP:
11595       mips_opts.ase_dsp = 1;
11596       mips_opts.ase_dspr2 = 0;
11597       break;
11598
11599     case OPTION_NO_DSP:
11600       mips_opts.ase_dsp = 0;
11601       mips_opts.ase_dspr2 = 0;
11602       break;
11603
11604     case OPTION_DSPR2:
11605       mips_opts.ase_dspr2 = 1;
11606       mips_opts.ase_dsp = 1;
11607       break;
11608
11609     case OPTION_NO_DSPR2:
11610       mips_opts.ase_dspr2 = 0;
11611       mips_opts.ase_dsp = 0;
11612       break;
11613
11614     case OPTION_MT:
11615       mips_opts.ase_mt = 1;
11616       break;
11617
11618     case OPTION_NO_MT:
11619       mips_opts.ase_mt = 0;
11620       break;
11621
11622     case OPTION_MIPS16:
11623       mips_opts.mips16 = 1;
11624       mips_no_prev_insn ();
11625       break;
11626
11627     case OPTION_NO_MIPS16:
11628       mips_opts.mips16 = 0;
11629       mips_no_prev_insn ();
11630       break;
11631
11632     case OPTION_MIPS3D:
11633       mips_opts.ase_mips3d = 1;
11634       break;
11635
11636     case OPTION_NO_MIPS3D:
11637       mips_opts.ase_mips3d = 0;
11638       break;
11639
11640     case OPTION_SMARTMIPS:
11641       mips_opts.ase_smartmips = 1;
11642       break;
11643
11644     case OPTION_NO_SMARTMIPS:
11645       mips_opts.ase_smartmips = 0;
11646       break;
11647
11648     case OPTION_FIX_24K:
11649       mips_fix_24k = 1;
11650       break;
11651
11652     case OPTION_NO_FIX_24K:
11653       mips_fix_24k = 0;
11654       break;
11655
11656     case OPTION_FIX_LOONGSON2F_JUMP:
11657       mips_fix_loongson2f_jump = TRUE;
11658       break;
11659
11660     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11661       mips_fix_loongson2f_jump = FALSE;
11662       break;
11663
11664     case OPTION_FIX_LOONGSON2F_NOP:
11665       mips_fix_loongson2f_nop = TRUE;
11666       break;
11667
11668     case OPTION_NO_FIX_LOONGSON2F_NOP:
11669       mips_fix_loongson2f_nop = FALSE;
11670       break;
11671
11672     case OPTION_FIX_VR4120:
11673       mips_fix_vr4120 = 1;
11674       break;
11675
11676     case OPTION_NO_FIX_VR4120:
11677       mips_fix_vr4120 = 0;
11678       break;
11679
11680     case OPTION_FIX_VR4130:
11681       mips_fix_vr4130 = 1;
11682       break;
11683
11684     case OPTION_NO_FIX_VR4130:
11685       mips_fix_vr4130 = 0;
11686       break;
11687
11688     case OPTION_FIX_CN63XXP1:
11689       mips_fix_cn63xxp1 = TRUE;
11690       break;
11691
11692     case OPTION_NO_FIX_CN63XXP1:
11693       mips_fix_cn63xxp1 = FALSE;
11694       break;
11695
11696     case OPTION_RELAX_BRANCH:
11697       mips_relax_branch = 1;
11698       break;
11699
11700     case OPTION_NO_RELAX_BRANCH:
11701       mips_relax_branch = 0;
11702       break;
11703
11704     case OPTION_MSHARED:
11705       mips_in_shared = TRUE;
11706       break;
11707
11708     case OPTION_MNO_SHARED:
11709       mips_in_shared = FALSE;
11710       break;
11711
11712     case OPTION_MSYM32:
11713       mips_opts.sym32 = TRUE;
11714       break;
11715
11716     case OPTION_MNO_SYM32:
11717       mips_opts.sym32 = FALSE;
11718       break;
11719
11720 #ifdef OBJ_ELF
11721       /* When generating ELF code, we permit -KPIC and -call_shared to
11722          select SVR4_PIC, and -non_shared to select no PIC.  This is
11723          intended to be compatible with Irix 5.  */
11724     case OPTION_CALL_SHARED:
11725       if (!IS_ELF)
11726         {
11727           as_bad (_("-call_shared is supported only for ELF format"));
11728           return 0;
11729         }
11730       mips_pic = SVR4_PIC;
11731       mips_abicalls = TRUE;
11732       break;
11733
11734     case OPTION_CALL_NONPIC:
11735       if (!IS_ELF)
11736         {
11737           as_bad (_("-call_nonpic is supported only for ELF format"));
11738           return 0;
11739         }
11740       mips_pic = NO_PIC;
11741       mips_abicalls = TRUE;
11742       break;
11743
11744     case OPTION_NON_SHARED:
11745       if (!IS_ELF)
11746         {
11747           as_bad (_("-non_shared is supported only for ELF format"));
11748           return 0;
11749         }
11750       mips_pic = NO_PIC;
11751       mips_abicalls = FALSE;
11752       break;
11753
11754       /* The -xgot option tells the assembler to use 32 bit offsets
11755          when accessing the got in SVR4_PIC mode.  It is for Irix
11756          compatibility.  */
11757     case OPTION_XGOT:
11758       mips_big_got = 1;
11759       break;
11760 #endif /* OBJ_ELF */
11761
11762     case 'G':
11763       g_switch_value = atoi (arg);
11764       g_switch_seen = 1;
11765       break;
11766
11767       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11768          and -mabi=64.  */
11769     case OPTION_32:
11770       if (IS_ELF)
11771         mips_abi = O32_ABI;
11772       /* We silently ignore -32 for non-ELF targets.  This greatly
11773          simplifies the construction of the MIPS GAS test cases.  */
11774       break;
11775
11776 #ifdef OBJ_ELF
11777     case OPTION_N32:
11778       if (!IS_ELF)
11779         {
11780           as_bad (_("-n32 is supported for ELF format only"));
11781           return 0;
11782         }
11783       mips_abi = N32_ABI;
11784       break;
11785
11786     case OPTION_64:
11787       if (!IS_ELF)
11788         {
11789           as_bad (_("-64 is supported for ELF format only"));
11790           return 0;
11791         }
11792       mips_abi = N64_ABI;
11793       if (!support_64bit_objects())
11794         as_fatal (_("No compiled in support for 64 bit object file format"));
11795       break;
11796 #endif /* OBJ_ELF */
11797
11798     case OPTION_GP32:
11799       file_mips_gp32 = 1;
11800       break;
11801
11802     case OPTION_GP64:
11803       file_mips_gp32 = 0;
11804       break;
11805
11806     case OPTION_FP32:
11807       file_mips_fp32 = 1;
11808       break;
11809
11810     case OPTION_FP64:
11811       file_mips_fp32 = 0;
11812       break;
11813
11814     case OPTION_SINGLE_FLOAT:
11815       file_mips_single_float = 1;
11816       break;
11817
11818     case OPTION_DOUBLE_FLOAT:
11819       file_mips_single_float = 0;
11820       break;
11821
11822     case OPTION_SOFT_FLOAT:
11823       file_mips_soft_float = 1;
11824       break;
11825
11826     case OPTION_HARD_FLOAT:
11827       file_mips_soft_float = 0;
11828       break;
11829
11830 #ifdef OBJ_ELF
11831     case OPTION_MABI:
11832       if (!IS_ELF)
11833         {
11834           as_bad (_("-mabi is supported for ELF format only"));
11835           return 0;
11836         }
11837       if (strcmp (arg, "32") == 0)
11838         mips_abi = O32_ABI;
11839       else if (strcmp (arg, "o64") == 0)
11840         mips_abi = O64_ABI;
11841       else if (strcmp (arg, "n32") == 0)
11842         mips_abi = N32_ABI;
11843       else if (strcmp (arg, "64") == 0)
11844         {
11845           mips_abi = N64_ABI;
11846           if (! support_64bit_objects())
11847             as_fatal (_("No compiled in support for 64 bit object file "
11848                         "format"));
11849         }
11850       else if (strcmp (arg, "eabi") == 0)
11851         mips_abi = EABI_ABI;
11852       else
11853         {
11854           as_fatal (_("invalid abi -mabi=%s"), arg);
11855           return 0;
11856         }
11857       break;
11858 #endif /* OBJ_ELF */
11859
11860     case OPTION_M7000_HILO_FIX:
11861       mips_7000_hilo_fix = TRUE;
11862       break;
11863
11864     case OPTION_MNO_7000_HILO_FIX:
11865       mips_7000_hilo_fix = FALSE;
11866       break;
11867
11868 #ifdef OBJ_ELF
11869     case OPTION_MDEBUG:
11870       mips_flag_mdebug = TRUE;
11871       break;
11872
11873     case OPTION_NO_MDEBUG:
11874       mips_flag_mdebug = FALSE;
11875       break;
11876
11877     case OPTION_PDR:
11878       mips_flag_pdr = TRUE;
11879       break;
11880
11881     case OPTION_NO_PDR:
11882       mips_flag_pdr = FALSE;
11883       break;
11884
11885     case OPTION_MVXWORKS_PIC:
11886       mips_pic = VXWORKS_PIC;
11887       break;
11888 #endif /* OBJ_ELF */
11889
11890     default:
11891       return 0;
11892     }
11893
11894     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11895
11896   return 1;
11897 }
11898 \f
11899 /* Set up globals to generate code for the ISA or processor
11900    described by INFO.  */
11901
11902 static void
11903 mips_set_architecture (const struct mips_cpu_info *info)
11904 {
11905   if (info != 0)
11906     {
11907       file_mips_arch = info->cpu;
11908       mips_opts.arch = info->cpu;
11909       mips_opts.isa = info->isa;
11910     }
11911 }
11912
11913
11914 /* Likewise for tuning.  */
11915
11916 static void
11917 mips_set_tune (const struct mips_cpu_info *info)
11918 {
11919   if (info != 0)
11920     mips_tune = info->cpu;
11921 }
11922
11923
11924 void
11925 mips_after_parse_args (void)
11926 {
11927   const struct mips_cpu_info *arch_info = 0;
11928   const struct mips_cpu_info *tune_info = 0;
11929
11930   /* GP relative stuff not working for PE */
11931   if (strncmp (TARGET_OS, "pe", 2) == 0)
11932     {
11933       if (g_switch_seen && g_switch_value != 0)
11934         as_bad (_("-G not supported in this configuration."));
11935       g_switch_value = 0;
11936     }
11937
11938   if (mips_abi == NO_ABI)
11939     mips_abi = MIPS_DEFAULT_ABI;
11940
11941   /* The following code determines the architecture and register size.
11942      Similar code was added to GCC 3.3 (see override_options() in
11943      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11944      as much as possible.  */
11945
11946   if (mips_arch_string != 0)
11947     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11948
11949   if (file_mips_isa != ISA_UNKNOWN)
11950     {
11951       /* Handle -mipsN.  At this point, file_mips_isa contains the
11952          ISA level specified by -mipsN, while arch_info->isa contains
11953          the -march selection (if any).  */
11954       if (arch_info != 0)
11955         {
11956           /* -march takes precedence over -mipsN, since it is more descriptive.
11957              There's no harm in specifying both as long as the ISA levels
11958              are the same.  */
11959           if (file_mips_isa != arch_info->isa)
11960             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11961                     mips_cpu_info_from_isa (file_mips_isa)->name,
11962                     mips_cpu_info_from_isa (arch_info->isa)->name);
11963         }
11964       else
11965         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11966     }
11967
11968   if (arch_info == 0)
11969     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11970
11971   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11972     as_bad (_("-march=%s is not compatible with the selected ABI"),
11973             arch_info->name);
11974
11975   mips_set_architecture (arch_info);
11976
11977   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11978   if (mips_tune_string != 0)
11979     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11980
11981   if (tune_info == 0)
11982     mips_set_tune (arch_info);
11983   else
11984     mips_set_tune (tune_info);
11985
11986   if (file_mips_gp32 >= 0)
11987     {
11988       /* The user specified the size of the integer registers.  Make sure
11989          it agrees with the ABI and ISA.  */
11990       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11991         as_bad (_("-mgp64 used with a 32-bit processor"));
11992       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11993         as_bad (_("-mgp32 used with a 64-bit ABI"));
11994       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11995         as_bad (_("-mgp64 used with a 32-bit ABI"));
11996     }
11997   else
11998     {
11999       /* Infer the integer register size from the ABI and processor.
12000          Restrict ourselves to 32-bit registers if that's all the
12001          processor has, or if the ABI cannot handle 64-bit registers.  */
12002       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12003                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12004     }
12005
12006   switch (file_mips_fp32)
12007     {
12008     default:
12009     case -1:
12010       /* No user specified float register size.
12011          ??? GAS treats single-float processors as though they had 64-bit
12012          float registers (although it complains when double-precision
12013          instructions are used).  As things stand, saying they have 32-bit
12014          registers would lead to spurious "register must be even" messages.
12015          So here we assume float registers are never smaller than the
12016          integer ones.  */
12017       if (file_mips_gp32 == 0)
12018         /* 64-bit integer registers implies 64-bit float registers.  */
12019         file_mips_fp32 = 0;
12020       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12021                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12022         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12023         file_mips_fp32 = 0;
12024       else
12025         /* 32-bit float registers.  */
12026         file_mips_fp32 = 1;
12027       break;
12028
12029     /* The user specified the size of the float registers.  Check if it
12030        agrees with the ABI and ISA.  */
12031     case 0:
12032       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12033         as_bad (_("-mfp64 used with a 32-bit fpu"));
12034       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12035                && !ISA_HAS_MXHC1 (mips_opts.isa))
12036         as_warn (_("-mfp64 used with a 32-bit ABI"));
12037       break;
12038     case 1:
12039       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12040         as_warn (_("-mfp32 used with a 64-bit ABI"));
12041       break;
12042     }
12043
12044   /* End of GCC-shared inference code.  */
12045
12046   /* This flag is set when we have a 64-bit capable CPU but use only
12047      32-bit wide registers.  Note that EABI does not use it.  */
12048   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12049       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12050           || mips_abi == O32_ABI))
12051     mips_32bitmode = 1;
12052
12053   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12054     as_bad (_("trap exception not supported at ISA 1"));
12055
12056   /* If the selected architecture includes support for ASEs, enable
12057      generation of code for them.  */
12058   if (mips_opts.mips16 == -1)
12059     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12060   if (mips_opts.ase_mips3d == -1)
12061     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12062                             && file_mips_fp32 == 0) ? 1 : 0;
12063   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12064     as_bad (_("-mfp32 used with -mips3d"));
12065
12066   if (mips_opts.ase_mdmx == -1)
12067     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12068                           && file_mips_fp32 == 0) ? 1 : 0;
12069   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12070     as_bad (_("-mfp32 used with -mdmx"));
12071
12072   if (mips_opts.ase_smartmips == -1)
12073     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12074   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12075     as_warn (_("%s ISA does not support SmartMIPS"), 
12076              mips_cpu_info_from_isa (mips_opts.isa)->name);
12077
12078   if (mips_opts.ase_dsp == -1)
12079     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12080   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12081     as_warn (_("%s ISA does not support DSP ASE"), 
12082              mips_cpu_info_from_isa (mips_opts.isa)->name);
12083
12084   if (mips_opts.ase_dspr2 == -1)
12085     {
12086       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12087       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12088     }
12089   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12090     as_warn (_("%s ISA does not support DSP R2 ASE"),
12091              mips_cpu_info_from_isa (mips_opts.isa)->name);
12092
12093   if (mips_opts.ase_mt == -1)
12094     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12095   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12096     as_warn (_("%s ISA does not support MT ASE"),
12097              mips_cpu_info_from_isa (mips_opts.isa)->name);
12098
12099   file_mips_isa = mips_opts.isa;
12100   file_ase_mips16 = mips_opts.mips16;
12101   file_ase_mips3d = mips_opts.ase_mips3d;
12102   file_ase_mdmx = mips_opts.ase_mdmx;
12103   file_ase_smartmips = mips_opts.ase_smartmips;
12104   file_ase_dsp = mips_opts.ase_dsp;
12105   file_ase_dspr2 = mips_opts.ase_dspr2;
12106   file_ase_mt = mips_opts.ase_mt;
12107   mips_opts.gp32 = file_mips_gp32;
12108   mips_opts.fp32 = file_mips_fp32;
12109   mips_opts.soft_float = file_mips_soft_float;
12110   mips_opts.single_float = file_mips_single_float;
12111
12112   if (mips_flag_mdebug < 0)
12113     {
12114 #ifdef OBJ_MAYBE_ECOFF
12115       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12116         mips_flag_mdebug = 1;
12117       else
12118 #endif /* OBJ_MAYBE_ECOFF */
12119         mips_flag_mdebug = 0;
12120     }
12121 }
12122 \f
12123 void
12124 mips_init_after_args (void)
12125 {
12126   /* initialize opcodes */
12127   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12128   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12129 }
12130
12131 long
12132 md_pcrel_from (fixS *fixP)
12133 {
12134   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12135   switch (fixP->fx_r_type)
12136     {
12137     case BFD_RELOC_16_PCREL_S2:
12138     case BFD_RELOC_MIPS_JMP:
12139       /* Return the address of the delay slot.  */
12140       return addr + 4;
12141     default:
12142       /* We have no relocation type for PC relative MIPS16 instructions.  */
12143       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12144         as_bad_where (fixP->fx_file, fixP->fx_line,
12145                       _("PC relative MIPS16 instruction references a different section"));
12146       return addr;
12147     }
12148 }
12149
12150 /* This is called before the symbol table is processed.  In order to
12151    work with gcc when using mips-tfile, we must keep all local labels.
12152    However, in other cases, we want to discard them.  If we were
12153    called with -g, but we didn't see any debugging information, it may
12154    mean that gcc is smuggling debugging information through to
12155    mips-tfile, in which case we must generate all local labels.  */
12156
12157 void
12158 mips_frob_file_before_adjust (void)
12159 {
12160 #ifndef NO_ECOFF_DEBUGGING
12161   if (ECOFF_DEBUGGING
12162       && mips_debug != 0
12163       && ! ecoff_debugging_seen)
12164     flag_keep_locals = 1;
12165 #endif
12166 }
12167
12168 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12169    the corresponding LO16 reloc.  This is called before md_apply_fix and
12170    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12171    relocation operators.
12172
12173    For our purposes, a %lo() expression matches a %got() or %hi()
12174    expression if:
12175
12176       (a) it refers to the same symbol; and
12177       (b) the offset applied in the %lo() expression is no lower than
12178           the offset applied in the %got() or %hi().
12179
12180    (b) allows us to cope with code like:
12181
12182         lui     $4,%hi(foo)
12183         lh      $4,%lo(foo+2)($4)
12184
12185    ...which is legal on RELA targets, and has a well-defined behaviour
12186    if the user knows that adding 2 to "foo" will not induce a carry to
12187    the high 16 bits.
12188
12189    When several %lo()s match a particular %got() or %hi(), we use the
12190    following rules to distinguish them:
12191
12192      (1) %lo()s with smaller offsets are a better match than %lo()s with
12193          higher offsets.
12194
12195      (2) %lo()s with no matching %got() or %hi() are better than those
12196          that already have a matching %got() or %hi().
12197
12198      (3) later %lo()s are better than earlier %lo()s.
12199
12200    These rules are applied in order.
12201
12202    (1) means, among other things, that %lo()s with identical offsets are
12203    chosen if they exist.
12204
12205    (2) means that we won't associate several high-part relocations with
12206    the same low-part relocation unless there's no alternative.  Having
12207    several high parts for the same low part is a GNU extension; this rule
12208    allows careful users to avoid it.
12209
12210    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12211    with the last high-part relocation being at the front of the list.
12212    It therefore makes sense to choose the last matching low-part
12213    relocation, all other things being equal.  It's also easier
12214    to code that way.  */
12215
12216 void
12217 mips_frob_file (void)
12218 {
12219   struct mips_hi_fixup *l;
12220   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12221
12222   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12223     {
12224       segment_info_type *seginfo;
12225       bfd_boolean matched_lo_p;
12226       fixS **hi_pos, **lo_pos, **pos;
12227
12228       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12229
12230       /* If a GOT16 relocation turns out to be against a global symbol,
12231          there isn't supposed to be a matching LO.  */
12232       if (got16_reloc_p (l->fixp->fx_r_type)
12233           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12234         continue;
12235
12236       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12237       if (fixup_has_matching_lo_p (l->fixp))
12238         continue;
12239
12240       seginfo = seg_info (l->seg);
12241
12242       /* Set HI_POS to the position of this relocation in the chain.
12243          Set LO_POS to the position of the chosen low-part relocation.
12244          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12245          relocation that matches an immediately-preceding high-part
12246          relocation.  */
12247       hi_pos = NULL;
12248       lo_pos = NULL;
12249       matched_lo_p = FALSE;
12250       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12251
12252       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12253         {
12254           if (*pos == l->fixp)
12255             hi_pos = pos;
12256
12257           if ((*pos)->fx_r_type == looking_for_rtype
12258               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12259               && (*pos)->fx_offset >= l->fixp->fx_offset
12260               && (lo_pos == NULL
12261                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12262                   || (!matched_lo_p
12263                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12264             lo_pos = pos;
12265
12266           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12267                           && fixup_has_matching_lo_p (*pos));
12268         }
12269
12270       /* If we found a match, remove the high-part relocation from its
12271          current position and insert it before the low-part relocation.
12272          Make the offsets match so that fixup_has_matching_lo_p()
12273          will return true.
12274
12275          We don't warn about unmatched high-part relocations since some
12276          versions of gcc have been known to emit dead "lui ...%hi(...)"
12277          instructions.  */
12278       if (lo_pos != NULL)
12279         {
12280           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12281           if (l->fixp->fx_next != *lo_pos)
12282             {
12283               *hi_pos = l->fixp->fx_next;
12284               l->fixp->fx_next = *lo_pos;
12285               *lo_pos = l->fixp;
12286             }
12287         }
12288     }
12289 }
12290
12291 /* We may have combined relocations without symbols in the N32/N64 ABI.
12292    We have to prevent gas from dropping them.  */
12293
12294 int
12295 mips_force_relocation (fixS *fixp)
12296 {
12297   if (generic_force_reloc (fixp))
12298     return 1;
12299
12300   if (HAVE_NEWABI
12301       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12302       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12303           || hi16_reloc_p (fixp->fx_r_type)
12304           || lo16_reloc_p (fixp->fx_r_type)))
12305     return 1;
12306
12307   return 0;
12308 }
12309
12310 /* Apply a fixup to the object file.  */
12311
12312 void
12313 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12314 {
12315   bfd_byte *buf;
12316   long insn;
12317   reloc_howto_type *howto;
12318
12319   /* We ignore generic BFD relocations we don't know about.  */
12320   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12321   if (! howto)
12322     return;
12323
12324   gas_assert (fixP->fx_size == 4
12325           || fixP->fx_r_type == BFD_RELOC_16
12326           || fixP->fx_r_type == BFD_RELOC_64
12327           || fixP->fx_r_type == BFD_RELOC_CTOR
12328           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12329           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12330           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12331           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12332
12333   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12334
12335   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12336
12337   /* Don't treat parts of a composite relocation as done.  There are two
12338      reasons for this:
12339
12340      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12341          should nevertheless be emitted if the first part is.
12342
12343      (2) In normal usage, composite relocations are never assembly-time
12344          constants.  The easiest way of dealing with the pathological
12345          exceptions is to generate a relocation against STN_UNDEF and
12346          leave everything up to the linker.  */
12347   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12348     fixP->fx_done = 1;
12349
12350   switch (fixP->fx_r_type)
12351     {
12352     case BFD_RELOC_MIPS_TLS_GD:
12353     case BFD_RELOC_MIPS_TLS_LDM:
12354     case BFD_RELOC_MIPS_TLS_DTPREL32:
12355     case BFD_RELOC_MIPS_TLS_DTPREL64:
12356     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12357     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12358     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12359     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12360     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12361       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12362       /* fall through */
12363
12364     case BFD_RELOC_MIPS_JMP:
12365     case BFD_RELOC_MIPS_SHIFT5:
12366     case BFD_RELOC_MIPS_SHIFT6:
12367     case BFD_RELOC_MIPS_GOT_DISP:
12368     case BFD_RELOC_MIPS_GOT_PAGE:
12369     case BFD_RELOC_MIPS_GOT_OFST:
12370     case BFD_RELOC_MIPS_SUB:
12371     case BFD_RELOC_MIPS_INSERT_A:
12372     case BFD_RELOC_MIPS_INSERT_B:
12373     case BFD_RELOC_MIPS_DELETE:
12374     case BFD_RELOC_MIPS_HIGHEST:
12375     case BFD_RELOC_MIPS_HIGHER:
12376     case BFD_RELOC_MIPS_SCN_DISP:
12377     case BFD_RELOC_MIPS_REL16:
12378     case BFD_RELOC_MIPS_RELGOT:
12379     case BFD_RELOC_MIPS_JALR:
12380     case BFD_RELOC_HI16:
12381     case BFD_RELOC_HI16_S:
12382     case BFD_RELOC_GPREL16:
12383     case BFD_RELOC_MIPS_LITERAL:
12384     case BFD_RELOC_MIPS_CALL16:
12385     case BFD_RELOC_MIPS_GOT16:
12386     case BFD_RELOC_GPREL32:
12387     case BFD_RELOC_MIPS_GOT_HI16:
12388     case BFD_RELOC_MIPS_GOT_LO16:
12389     case BFD_RELOC_MIPS_CALL_HI16:
12390     case BFD_RELOC_MIPS_CALL_LO16:
12391     case BFD_RELOC_MIPS16_GPREL:
12392     case BFD_RELOC_MIPS16_GOT16:
12393     case BFD_RELOC_MIPS16_CALL16:
12394     case BFD_RELOC_MIPS16_HI16:
12395     case BFD_RELOC_MIPS16_HI16_S:
12396     case BFD_RELOC_MIPS16_JMP:
12397       /* Nothing needed to do.  The value comes from the reloc entry.  */
12398       break;
12399
12400     case BFD_RELOC_64:
12401       /* This is handled like BFD_RELOC_32, but we output a sign
12402          extended value if we are only 32 bits.  */
12403       if (fixP->fx_done)
12404         {
12405           if (8 <= sizeof (valueT))
12406             md_number_to_chars ((char *) buf, *valP, 8);
12407           else
12408             {
12409               valueT hiv;
12410
12411               if ((*valP & 0x80000000) != 0)
12412                 hiv = 0xffffffff;
12413               else
12414                 hiv = 0;
12415               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12416                                   *valP, 4);
12417               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12418                                   hiv, 4);
12419             }
12420         }
12421       break;
12422
12423     case BFD_RELOC_RVA:
12424     case BFD_RELOC_32:
12425     case BFD_RELOC_16:
12426       /* If we are deleting this reloc entry, we must fill in the
12427          value now.  This can happen if we have a .word which is not
12428          resolved when it appears but is later defined.  */
12429       if (fixP->fx_done)
12430         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12431       break;
12432
12433     case BFD_RELOC_LO16:
12434     case BFD_RELOC_MIPS16_LO16:
12435       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12436          may be safe to remove, but if so it's not obvious.  */
12437       /* When handling an embedded PIC switch statement, we can wind
12438          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12439       if (fixP->fx_done)
12440         {
12441           if (*valP + 0x8000 > 0xffff)
12442             as_bad_where (fixP->fx_file, fixP->fx_line,
12443                           _("relocation overflow"));
12444           if (target_big_endian)
12445             buf += 2;
12446           md_number_to_chars ((char *) buf, *valP, 2);
12447         }
12448       break;
12449
12450     case BFD_RELOC_16_PCREL_S2:
12451       if ((*valP & 0x3) != 0)
12452         as_bad_where (fixP->fx_file, fixP->fx_line,
12453                       _("Branch to misaligned address (%lx)"), (long) *valP);
12454
12455       /* We need to save the bits in the instruction since fixup_segment()
12456          might be deleting the relocation entry (i.e., a branch within
12457          the current segment).  */
12458       if (! fixP->fx_done)
12459         break;
12460
12461       /* Update old instruction data.  */
12462       if (target_big_endian)
12463         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12464       else
12465         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12466
12467       if (*valP + 0x20000 <= 0x3ffff)
12468         {
12469           insn |= (*valP >> 2) & 0xffff;
12470           md_number_to_chars ((char *) buf, insn, 4);
12471         }
12472       else if (mips_pic == NO_PIC
12473                && fixP->fx_done
12474                && fixP->fx_frag->fr_address >= text_section->vma
12475                && (fixP->fx_frag->fr_address
12476                    < text_section->vma + bfd_get_section_size (text_section))
12477                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12478                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12479                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12480         {
12481           /* The branch offset is too large.  If this is an
12482              unconditional branch, and we are not generating PIC code,
12483              we can convert it to an absolute jump instruction.  */
12484           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12485             insn = 0x0c000000;  /* jal */
12486           else
12487             insn = 0x08000000;  /* j */
12488           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12489           fixP->fx_done = 0;
12490           fixP->fx_addsy = section_symbol (text_section);
12491           *valP += md_pcrel_from (fixP);
12492           md_number_to_chars ((char *) buf, insn, 4);
12493         }
12494       else
12495         {
12496           /* If we got here, we have branch-relaxation disabled,
12497              and there's nothing we can do to fix this instruction
12498              without turning it into a longer sequence.  */
12499           as_bad_where (fixP->fx_file, fixP->fx_line,
12500                         _("Branch out of range"));
12501         }
12502       break;
12503
12504     case BFD_RELOC_VTABLE_INHERIT:
12505       fixP->fx_done = 0;
12506       if (fixP->fx_addsy
12507           && !S_IS_DEFINED (fixP->fx_addsy)
12508           && !S_IS_WEAK (fixP->fx_addsy))
12509         S_SET_WEAK (fixP->fx_addsy);
12510       break;
12511
12512     case BFD_RELOC_VTABLE_ENTRY:
12513       fixP->fx_done = 0;
12514       break;
12515
12516     default:
12517       internalError ();
12518     }
12519
12520   /* Remember value for tc_gen_reloc.  */
12521   fixP->fx_addnumber = *valP;
12522 }
12523
12524 static symbolS *
12525 get_symbol (void)
12526 {
12527   int c;
12528   char *name;
12529   symbolS *p;
12530
12531   name = input_line_pointer;
12532   c = get_symbol_end ();
12533   p = (symbolS *) symbol_find_or_make (name);
12534   *input_line_pointer = c;
12535   return p;
12536 }
12537
12538 /* Align the current frag to a given power of two.  If a particular
12539    fill byte should be used, FILL points to an integer that contains
12540    that byte, otherwise FILL is null.
12541
12542    The MIPS assembler also automatically adjusts any preceding
12543    label.  */
12544
12545 static void
12546 mips_align (int to, int *fill, symbolS *label)
12547 {
12548   mips_emit_delays ();
12549   mips_record_mips16_mode ();
12550   if (fill == NULL && subseg_text_p (now_seg))
12551     frag_align_code (to, 0);
12552   else
12553     frag_align (to, fill ? *fill : 0, 0);
12554   record_alignment (now_seg, to);
12555   if (label != NULL)
12556     {
12557       gas_assert (S_GET_SEGMENT (label) == now_seg);
12558       symbol_set_frag (label, frag_now);
12559       S_SET_VALUE (label, (valueT) frag_now_fix ());
12560     }
12561 }
12562
12563 /* Align to a given power of two.  .align 0 turns off the automatic
12564    alignment used by the data creating pseudo-ops.  */
12565
12566 static void
12567 s_align (int x ATTRIBUTE_UNUSED)
12568 {
12569   int temp, fill_value, *fill_ptr;
12570   long max_alignment = 28;
12571
12572   /* o Note that the assembler pulls down any immediately preceding label
12573        to the aligned address.
12574      o It's not documented but auto alignment is reinstated by
12575        a .align pseudo instruction.
12576      o Note also that after auto alignment is turned off the mips assembler
12577        issues an error on attempt to assemble an improperly aligned data item.
12578        We don't.  */
12579
12580   temp = get_absolute_expression ();
12581   if (temp > max_alignment)
12582     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12583   else if (temp < 0)
12584     {
12585       as_warn (_("Alignment negative: 0 assumed."));
12586       temp = 0;
12587     }
12588   if (*input_line_pointer == ',')
12589     {
12590       ++input_line_pointer;
12591       fill_value = get_absolute_expression ();
12592       fill_ptr = &fill_value;
12593     }
12594   else
12595     fill_ptr = 0;
12596   if (temp)
12597     {
12598       segment_info_type *si = seg_info (now_seg);
12599       struct insn_label_list *l = si->label_list;
12600       /* Auto alignment should be switched on by next section change.  */
12601       auto_align = 1;
12602       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12603     }
12604   else
12605     {
12606       auto_align = 0;
12607     }
12608
12609   demand_empty_rest_of_line ();
12610 }
12611
12612 static void
12613 s_change_sec (int sec)
12614 {
12615   segT seg;
12616
12617 #ifdef OBJ_ELF
12618   /* The ELF backend needs to know that we are changing sections, so
12619      that .previous works correctly.  We could do something like check
12620      for an obj_section_change_hook macro, but that might be confusing
12621      as it would not be appropriate to use it in the section changing
12622      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12623      This should be cleaner, somehow.  */
12624   if (IS_ELF)
12625     obj_elf_section_change_hook ();
12626 #endif
12627
12628   mips_emit_delays ();
12629
12630   switch (sec)
12631     {
12632     case 't':
12633       s_text (0);
12634       break;
12635     case 'd':
12636       s_data (0);
12637       break;
12638     case 'b':
12639       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12640       demand_empty_rest_of_line ();
12641       break;
12642
12643     case 'r':
12644       seg = subseg_new (RDATA_SECTION_NAME,
12645                         (subsegT) get_absolute_expression ());
12646       if (IS_ELF)
12647         {
12648           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12649                                                   | SEC_READONLY | SEC_RELOC
12650                                                   | SEC_DATA));
12651           if (strncmp (TARGET_OS, "elf", 3) != 0)
12652             record_alignment (seg, 4);
12653         }
12654       demand_empty_rest_of_line ();
12655       break;
12656
12657     case 's':
12658       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12659       if (IS_ELF)
12660         {
12661           bfd_set_section_flags (stdoutput, seg,
12662                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12663           if (strncmp (TARGET_OS, "elf", 3) != 0)
12664             record_alignment (seg, 4);
12665         }
12666       demand_empty_rest_of_line ();
12667       break;
12668
12669     case 'B':
12670       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12671       if (IS_ELF)
12672         {
12673           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12674           if (strncmp (TARGET_OS, "elf", 3) != 0)
12675             record_alignment (seg, 4);
12676         }
12677       demand_empty_rest_of_line ();
12678       break;
12679     }
12680
12681   auto_align = 1;
12682 }
12683
12684 void
12685 s_change_section (int ignore ATTRIBUTE_UNUSED)
12686 {
12687 #ifdef OBJ_ELF
12688   char *section_name;
12689   char c;
12690   char next_c = 0;
12691   int section_type;
12692   int section_flag;
12693   int section_entry_size;
12694   int section_alignment;
12695
12696   if (!IS_ELF)
12697     return;
12698
12699   section_name = input_line_pointer;
12700   c = get_symbol_end ();
12701   if (c)
12702     next_c = *(input_line_pointer + 1);
12703
12704   /* Do we have .section Name<,"flags">?  */
12705   if (c != ',' || (c == ',' && next_c == '"'))
12706     {
12707       /* just after name is now '\0'.  */
12708       *input_line_pointer = c;
12709       input_line_pointer = section_name;
12710       obj_elf_section (ignore);
12711       return;
12712     }
12713   input_line_pointer++;
12714
12715   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12716   if (c == ',')
12717     section_type = get_absolute_expression ();
12718   else
12719     section_type = 0;
12720   if (*input_line_pointer++ == ',')
12721     section_flag = get_absolute_expression ();
12722   else
12723     section_flag = 0;
12724   if (*input_line_pointer++ == ',')
12725     section_entry_size = get_absolute_expression ();
12726   else
12727     section_entry_size = 0;
12728   if (*input_line_pointer++ == ',')
12729     section_alignment = get_absolute_expression ();
12730   else
12731     section_alignment = 0;
12732   /* FIXME: really ignore?  */
12733   (void) section_alignment;
12734
12735   section_name = xstrdup (section_name);
12736
12737   /* When using the generic form of .section (as implemented by obj-elf.c),
12738      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12739      traditionally had to fall back on the more common @progbits instead.
12740
12741      There's nothing really harmful in this, since bfd will correct
12742      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12743      means that, for backwards compatibility, the special_section entries
12744      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12745
12746      Even so, we shouldn't force users of the MIPS .section syntax to
12747      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12748      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12749      generic type-checking code.  */
12750   if (section_type == SHT_MIPS_DWARF)
12751     section_type = SHT_PROGBITS;
12752
12753   obj_elf_change_section (section_name, section_type, section_flag,
12754                           section_entry_size, 0, 0, 0);
12755
12756   if (now_seg->name != section_name)
12757     free (section_name);
12758 #endif /* OBJ_ELF */
12759 }
12760
12761 void
12762 mips_enable_auto_align (void)
12763 {
12764   auto_align = 1;
12765 }
12766
12767 static void
12768 s_cons (int log_size)
12769 {
12770   segment_info_type *si = seg_info (now_seg);
12771   struct insn_label_list *l = si->label_list;
12772   symbolS *label;
12773
12774   label = l != NULL ? l->label : NULL;
12775   mips_emit_delays ();
12776   if (log_size > 0 && auto_align)
12777     mips_align (log_size, 0, label);
12778   mips_clear_insn_labels ();
12779   cons (1 << log_size);
12780 }
12781
12782 static void
12783 s_float_cons (int type)
12784 {
12785   segment_info_type *si = seg_info (now_seg);
12786   struct insn_label_list *l = si->label_list;
12787   symbolS *label;
12788
12789   label = l != NULL ? l->label : NULL;
12790
12791   mips_emit_delays ();
12792
12793   if (auto_align)
12794     {
12795       if (type == 'd')
12796         mips_align (3, 0, label);
12797       else
12798         mips_align (2, 0, label);
12799     }
12800
12801   mips_clear_insn_labels ();
12802
12803   float_cons (type);
12804 }
12805
12806 /* Handle .globl.  We need to override it because on Irix 5 you are
12807    permitted to say
12808        .globl foo .text
12809    where foo is an undefined symbol, to mean that foo should be
12810    considered to be the address of a function.  */
12811
12812 static void
12813 s_mips_globl (int x ATTRIBUTE_UNUSED)
12814 {
12815   char *name;
12816   int c;
12817   symbolS *symbolP;
12818   flagword flag;
12819
12820   do
12821     {
12822       name = input_line_pointer;
12823       c = get_symbol_end ();
12824       symbolP = symbol_find_or_make (name);
12825       S_SET_EXTERNAL (symbolP);
12826
12827       *input_line_pointer = c;
12828       SKIP_WHITESPACE ();
12829
12830       /* On Irix 5, every global symbol that is not explicitly labelled as
12831          being a function is apparently labelled as being an object.  */
12832       flag = BSF_OBJECT;
12833
12834       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12835           && (*input_line_pointer != ','))
12836         {
12837           char *secname;
12838           asection *sec;
12839
12840           secname = input_line_pointer;
12841           c = get_symbol_end ();
12842           sec = bfd_get_section_by_name (stdoutput, secname);
12843           if (sec == NULL)
12844             as_bad (_("%s: no such section"), secname);
12845           *input_line_pointer = c;
12846
12847           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12848             flag = BSF_FUNCTION;
12849         }
12850
12851       symbol_get_bfdsym (symbolP)->flags |= flag;
12852
12853       c = *input_line_pointer;
12854       if (c == ',')
12855         {
12856           input_line_pointer++;
12857           SKIP_WHITESPACE ();
12858           if (is_end_of_line[(unsigned char) *input_line_pointer])
12859             c = '\n';
12860         }
12861     }
12862   while (c == ',');
12863
12864   demand_empty_rest_of_line ();
12865 }
12866
12867 static void
12868 s_option (int x ATTRIBUTE_UNUSED)
12869 {
12870   char *opt;
12871   char c;
12872
12873   opt = input_line_pointer;
12874   c = get_symbol_end ();
12875
12876   if (*opt == 'O')
12877     {
12878       /* FIXME: What does this mean?  */
12879     }
12880   else if (strncmp (opt, "pic", 3) == 0)
12881     {
12882       int i;
12883
12884       i = atoi (opt + 3);
12885       if (i == 0)
12886         mips_pic = NO_PIC;
12887       else if (i == 2)
12888         {
12889         mips_pic = SVR4_PIC;
12890           mips_abicalls = TRUE;
12891         }
12892       else
12893         as_bad (_(".option pic%d not supported"), i);
12894
12895       if (mips_pic == SVR4_PIC)
12896         {
12897           if (g_switch_seen && g_switch_value != 0)
12898             as_warn (_("-G may not be used with SVR4 PIC code"));
12899           g_switch_value = 0;
12900           bfd_set_gp_size (stdoutput, 0);
12901         }
12902     }
12903   else
12904     as_warn (_("Unrecognized option \"%s\""), opt);
12905
12906   *input_line_pointer = c;
12907   demand_empty_rest_of_line ();
12908 }
12909
12910 /* This structure is used to hold a stack of .set values.  */
12911
12912 struct mips_option_stack
12913 {
12914   struct mips_option_stack *next;
12915   struct mips_set_options options;
12916 };
12917
12918 static struct mips_option_stack *mips_opts_stack;
12919
12920 /* Handle the .set pseudo-op.  */
12921
12922 static void
12923 s_mipsset (int x ATTRIBUTE_UNUSED)
12924 {
12925   char *name = input_line_pointer, ch;
12926
12927   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12928     ++input_line_pointer;
12929   ch = *input_line_pointer;
12930   *input_line_pointer = '\0';
12931
12932   if (strcmp (name, "reorder") == 0)
12933     {
12934       if (mips_opts.noreorder)
12935         end_noreorder ();
12936     }
12937   else if (strcmp (name, "noreorder") == 0)
12938     {
12939       if (!mips_opts.noreorder)
12940         start_noreorder ();
12941     }
12942   else if (strncmp (name, "at=", 3) == 0)
12943     {
12944       char *s = name + 3;
12945
12946       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12947         as_bad (_("Unrecognized register name `%s'"), s);
12948     }
12949   else if (strcmp (name, "at") == 0)
12950     {
12951       mips_opts.at = ATREG;
12952     }
12953   else if (strcmp (name, "noat") == 0)
12954     {
12955       mips_opts.at = ZERO;
12956     }
12957   else if (strcmp (name, "macro") == 0)
12958     {
12959       mips_opts.warn_about_macros = 0;
12960     }
12961   else if (strcmp (name, "nomacro") == 0)
12962     {
12963       if (mips_opts.noreorder == 0)
12964         as_bad (_("`noreorder' must be set before `nomacro'"));
12965       mips_opts.warn_about_macros = 1;
12966     }
12967   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12968     {
12969       mips_opts.nomove = 0;
12970     }
12971   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12972     {
12973       mips_opts.nomove = 1;
12974     }
12975   else if (strcmp (name, "bopt") == 0)
12976     {
12977       mips_opts.nobopt = 0;
12978     }
12979   else if (strcmp (name, "nobopt") == 0)
12980     {
12981       mips_opts.nobopt = 1;
12982     }
12983   else if (strcmp (name, "gp=default") == 0)
12984     mips_opts.gp32 = file_mips_gp32;
12985   else if (strcmp (name, "gp=32") == 0)
12986     mips_opts.gp32 = 1;
12987   else if (strcmp (name, "gp=64") == 0)
12988     {
12989       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12990         as_warn (_("%s isa does not support 64-bit registers"),
12991                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12992       mips_opts.gp32 = 0;
12993     }
12994   else if (strcmp (name, "fp=default") == 0)
12995     mips_opts.fp32 = file_mips_fp32;
12996   else if (strcmp (name, "fp=32") == 0)
12997     mips_opts.fp32 = 1;
12998   else if (strcmp (name, "fp=64") == 0)
12999     {
13000       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13001         as_warn (_("%s isa does not support 64-bit floating point registers"),
13002                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13003       mips_opts.fp32 = 0;
13004     }
13005   else if (strcmp (name, "softfloat") == 0)
13006     mips_opts.soft_float = 1;
13007   else if (strcmp (name, "hardfloat") == 0)
13008     mips_opts.soft_float = 0;
13009   else if (strcmp (name, "singlefloat") == 0)
13010     mips_opts.single_float = 1;
13011   else if (strcmp (name, "doublefloat") == 0)
13012     mips_opts.single_float = 0;
13013   else if (strcmp (name, "mips16") == 0
13014            || strcmp (name, "MIPS-16") == 0)
13015     mips_opts.mips16 = 1;
13016   else if (strcmp (name, "nomips16") == 0
13017            || strcmp (name, "noMIPS-16") == 0)
13018     mips_opts.mips16 = 0;
13019   else if (strcmp (name, "smartmips") == 0)
13020     {
13021       if (!ISA_SUPPORTS_SMARTMIPS)
13022         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13023                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13024       mips_opts.ase_smartmips = 1;
13025     }
13026   else if (strcmp (name, "nosmartmips") == 0)
13027     mips_opts.ase_smartmips = 0;
13028   else if (strcmp (name, "mips3d") == 0)
13029     mips_opts.ase_mips3d = 1;
13030   else if (strcmp (name, "nomips3d") == 0)
13031     mips_opts.ase_mips3d = 0;
13032   else if (strcmp (name, "mdmx") == 0)
13033     mips_opts.ase_mdmx = 1;
13034   else if (strcmp (name, "nomdmx") == 0)
13035     mips_opts.ase_mdmx = 0;
13036   else if (strcmp (name, "dsp") == 0)
13037     {
13038       if (!ISA_SUPPORTS_DSP_ASE)
13039         as_warn (_("%s ISA does not support DSP ASE"), 
13040                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13041       mips_opts.ase_dsp = 1;
13042       mips_opts.ase_dspr2 = 0;
13043     }
13044   else if (strcmp (name, "nodsp") == 0)
13045     {
13046       mips_opts.ase_dsp = 0;
13047       mips_opts.ase_dspr2 = 0;
13048     }
13049   else if (strcmp (name, "dspr2") == 0)
13050     {
13051       if (!ISA_SUPPORTS_DSPR2_ASE)
13052         as_warn (_("%s ISA does not support DSP R2 ASE"),
13053                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13054       mips_opts.ase_dspr2 = 1;
13055       mips_opts.ase_dsp = 1;
13056     }
13057   else if (strcmp (name, "nodspr2") == 0)
13058     {
13059       mips_opts.ase_dspr2 = 0;
13060       mips_opts.ase_dsp = 0;
13061     }
13062   else if (strcmp (name, "mt") == 0)
13063     {
13064       if (!ISA_SUPPORTS_MT_ASE)
13065         as_warn (_("%s ISA does not support MT ASE"), 
13066                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13067       mips_opts.ase_mt = 1;
13068     }
13069   else if (strcmp (name, "nomt") == 0)
13070     mips_opts.ase_mt = 0;
13071   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13072     {
13073       int reset = 0;
13074
13075       /* Permit the user to change the ISA and architecture on the fly.
13076          Needless to say, misuse can cause serious problems.  */
13077       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13078         {
13079           reset = 1;
13080           mips_opts.isa = file_mips_isa;
13081           mips_opts.arch = file_mips_arch;
13082         }
13083       else if (strncmp (name, "arch=", 5) == 0)
13084         {
13085           const struct mips_cpu_info *p;
13086
13087           p = mips_parse_cpu("internal use", name + 5);
13088           if (!p)
13089             as_bad (_("unknown architecture %s"), name + 5);
13090           else
13091             {
13092               mips_opts.arch = p->cpu;
13093               mips_opts.isa = p->isa;
13094             }
13095         }
13096       else if (strncmp (name, "mips", 4) == 0)
13097         {
13098           const struct mips_cpu_info *p;
13099
13100           p = mips_parse_cpu("internal use", name);
13101           if (!p)
13102             as_bad (_("unknown ISA level %s"), name + 4);
13103           else
13104             {
13105               mips_opts.arch = p->cpu;
13106               mips_opts.isa = p->isa;
13107             }
13108         }
13109       else
13110         as_bad (_("unknown ISA or architecture %s"), name);
13111
13112       switch (mips_opts.isa)
13113         {
13114         case  0:
13115           break;
13116         case ISA_MIPS1:
13117         case ISA_MIPS2:
13118         case ISA_MIPS32:
13119         case ISA_MIPS32R2:
13120           mips_opts.gp32 = 1;
13121           mips_opts.fp32 = 1;
13122           break;
13123         case ISA_MIPS3:
13124         case ISA_MIPS4:
13125         case ISA_MIPS5:
13126         case ISA_MIPS64:
13127         case ISA_MIPS64R2:
13128           mips_opts.gp32 = 0;
13129           mips_opts.fp32 = 0;
13130           break;
13131         default:
13132           as_bad (_("unknown ISA level %s"), name + 4);
13133           break;
13134         }
13135       if (reset)
13136         {
13137           mips_opts.gp32 = file_mips_gp32;
13138           mips_opts.fp32 = file_mips_fp32;
13139         }
13140     }
13141   else if (strcmp (name, "autoextend") == 0)
13142     mips_opts.noautoextend = 0;
13143   else if (strcmp (name, "noautoextend") == 0)
13144     mips_opts.noautoextend = 1;
13145   else if (strcmp (name, "push") == 0)
13146     {
13147       struct mips_option_stack *s;
13148
13149       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13150       s->next = mips_opts_stack;
13151       s->options = mips_opts;
13152       mips_opts_stack = s;
13153     }
13154   else if (strcmp (name, "pop") == 0)
13155     {
13156       struct mips_option_stack *s;
13157
13158       s = mips_opts_stack;
13159       if (s == NULL)
13160         as_bad (_(".set pop with no .set push"));
13161       else
13162         {
13163           /* If we're changing the reorder mode we need to handle
13164              delay slots correctly.  */
13165           if (s->options.noreorder && ! mips_opts.noreorder)
13166             start_noreorder ();
13167           else if (! s->options.noreorder && mips_opts.noreorder)
13168             end_noreorder ();
13169
13170           mips_opts = s->options;
13171           mips_opts_stack = s->next;
13172           free (s);
13173         }
13174     }
13175   else if (strcmp (name, "sym32") == 0)
13176     mips_opts.sym32 = TRUE;
13177   else if (strcmp (name, "nosym32") == 0)
13178     mips_opts.sym32 = FALSE;
13179   else if (strchr (name, ','))
13180     {
13181       /* Generic ".set" directive; use the generic handler.  */
13182       *input_line_pointer = ch;
13183       input_line_pointer = name;
13184       s_set (0);
13185       return;
13186     }
13187   else
13188     {
13189       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13190     }
13191   *input_line_pointer = ch;
13192   demand_empty_rest_of_line ();
13193 }
13194
13195 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13196    .option pic2.  It means to generate SVR4 PIC calls.  */
13197
13198 static void
13199 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13200 {
13201   mips_pic = SVR4_PIC;
13202   mips_abicalls = TRUE;
13203
13204   if (g_switch_seen && g_switch_value != 0)
13205     as_warn (_("-G may not be used with SVR4 PIC code"));
13206   g_switch_value = 0;
13207
13208   bfd_set_gp_size (stdoutput, 0);
13209   demand_empty_rest_of_line ();
13210 }
13211
13212 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13213    PIC code.  It sets the $gp register for the function based on the
13214    function address, which is in the register named in the argument.
13215    This uses a relocation against _gp_disp, which is handled specially
13216    by the linker.  The result is:
13217         lui     $gp,%hi(_gp_disp)
13218         addiu   $gp,$gp,%lo(_gp_disp)
13219         addu    $gp,$gp,.cpload argument
13220    The .cpload argument is normally $25 == $t9.
13221
13222    The -mno-shared option changes this to:
13223         lui     $gp,%hi(__gnu_local_gp)
13224         addiu   $gp,$gp,%lo(__gnu_local_gp)
13225    and the argument is ignored.  This saves an instruction, but the
13226    resulting code is not position independent; it uses an absolute
13227    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13228    can go into an ordinary executable, but not into a shared library.  */
13229
13230 static void
13231 s_cpload (int ignore ATTRIBUTE_UNUSED)
13232 {
13233   expressionS ex;
13234   int reg;
13235   int in_shared;
13236
13237   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13238      .cpload is ignored.  */
13239   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13240     {
13241       s_ignore (0);
13242       return;
13243     }
13244
13245   /* .cpload should be in a .set noreorder section.  */
13246   if (mips_opts.noreorder == 0)
13247     as_warn (_(".cpload not in noreorder section"));
13248
13249   reg = tc_get_register (0);
13250
13251   /* If we need to produce a 64-bit address, we are better off using
13252      the default instruction sequence.  */
13253   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13254
13255   ex.X_op = O_symbol;
13256   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13257                                          "__gnu_local_gp");
13258   ex.X_op_symbol = NULL;
13259   ex.X_add_number = 0;
13260
13261   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13262   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13263
13264   macro_start ();
13265   macro_build_lui (&ex, mips_gp_register);
13266   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13267                mips_gp_register, BFD_RELOC_LO16);
13268   if (in_shared)
13269     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13270                  mips_gp_register, reg);
13271   macro_end ();
13272
13273   demand_empty_rest_of_line ();
13274 }
13275
13276 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13277      .cpsetup $reg1, offset|$reg2, label
13278
13279    If offset is given, this results in:
13280      sd         $gp, offset($sp)
13281      lui        $gp, %hi(%neg(%gp_rel(label)))
13282      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13283      daddu      $gp, $gp, $reg1
13284
13285    If $reg2 is given, this results in:
13286      daddu      $reg2, $gp, $0
13287      lui        $gp, %hi(%neg(%gp_rel(label)))
13288      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13289      daddu      $gp, $gp, $reg1
13290    $reg1 is normally $25 == $t9.
13291
13292    The -mno-shared option replaces the last three instructions with
13293         lui     $gp,%hi(_gp)
13294         addiu   $gp,$gp,%lo(_gp)  */
13295
13296 static void
13297 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13298 {
13299   expressionS ex_off;
13300   expressionS ex_sym;
13301   int reg1;
13302
13303   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13304      We also need NewABI support.  */
13305   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13306     {
13307       s_ignore (0);
13308       return;
13309     }
13310
13311   reg1 = tc_get_register (0);
13312   SKIP_WHITESPACE ();
13313   if (*input_line_pointer != ',')
13314     {
13315       as_bad (_("missing argument separator ',' for .cpsetup"));
13316       return;
13317     }
13318   else
13319     ++input_line_pointer;
13320   SKIP_WHITESPACE ();
13321   if (*input_line_pointer == '$')
13322     {
13323       mips_cpreturn_register = tc_get_register (0);
13324       mips_cpreturn_offset = -1;
13325     }
13326   else
13327     {
13328       mips_cpreturn_offset = get_absolute_expression ();
13329       mips_cpreturn_register = -1;
13330     }
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   expression (&ex_sym);
13341
13342   macro_start ();
13343   if (mips_cpreturn_register == -1)
13344     {
13345       ex_off.X_op = O_constant;
13346       ex_off.X_add_symbol = NULL;
13347       ex_off.X_op_symbol = NULL;
13348       ex_off.X_add_number = mips_cpreturn_offset;
13349
13350       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13351                    BFD_RELOC_LO16, SP);
13352     }
13353   else
13354     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13355                  mips_gp_register, 0);
13356
13357   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13358     {
13359       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13360                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13361                    BFD_RELOC_HI16_S);
13362
13363       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13364                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13365                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13366
13367       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13368                    mips_gp_register, reg1);
13369     }
13370   else
13371     {
13372       expressionS ex;
13373
13374       ex.X_op = O_symbol;
13375       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13376       ex.X_op_symbol = NULL;
13377       ex.X_add_number = 0;
13378
13379       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13380       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13381
13382       macro_build_lui (&ex, mips_gp_register);
13383       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13384                    mips_gp_register, BFD_RELOC_LO16);
13385     }
13386
13387   macro_end ();
13388
13389   demand_empty_rest_of_line ();
13390 }
13391
13392 static void
13393 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13394 {
13395   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13396      .cplocal is ignored.  */
13397   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13398     {
13399       s_ignore (0);
13400       return;
13401     }
13402
13403   mips_gp_register = tc_get_register (0);
13404   demand_empty_rest_of_line ();
13405 }
13406
13407 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13408    offset from $sp.  The offset is remembered, and after making a PIC
13409    call $gp is restored from that location.  */
13410
13411 static void
13412 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13413 {
13414   expressionS ex;
13415
13416   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13417      .cprestore is ignored.  */
13418   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13419     {
13420       s_ignore (0);
13421       return;
13422     }
13423
13424   mips_cprestore_offset = get_absolute_expression ();
13425   mips_cprestore_valid = 1;
13426
13427   ex.X_op = O_constant;
13428   ex.X_add_symbol = NULL;
13429   ex.X_op_symbol = NULL;
13430   ex.X_add_number = mips_cprestore_offset;
13431
13432   macro_start ();
13433   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13434                                 SP, HAVE_64BIT_ADDRESSES);
13435   macro_end ();
13436
13437   demand_empty_rest_of_line ();
13438 }
13439
13440 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13441    was given in the preceding .cpsetup, it results in:
13442      ld         $gp, offset($sp)
13443
13444    If a register $reg2 was given there, it results in:
13445      daddu      $gp, $reg2, $0  */
13446
13447 static void
13448 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13449 {
13450   expressionS ex;
13451
13452   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13453      We also need NewABI support.  */
13454   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13455     {
13456       s_ignore (0);
13457       return;
13458     }
13459
13460   macro_start ();
13461   if (mips_cpreturn_register == -1)
13462     {
13463       ex.X_op = O_constant;
13464       ex.X_add_symbol = NULL;
13465       ex.X_op_symbol = NULL;
13466       ex.X_add_number = mips_cpreturn_offset;
13467
13468       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13469     }
13470   else
13471     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13472                  mips_cpreturn_register, 0);
13473   macro_end ();
13474
13475   demand_empty_rest_of_line ();
13476 }
13477
13478 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13479    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13480    use in DWARF debug information.  */
13481
13482 static void
13483 s_dtprel_internal (size_t bytes)
13484 {
13485   expressionS ex;
13486   char *p;
13487
13488   expression (&ex);
13489
13490   if (ex.X_op != O_symbol)
13491     {
13492       as_bad (_("Unsupported use of %s"), (bytes == 8
13493                                            ? ".dtpreldword"
13494                                            : ".dtprelword"));
13495       ignore_rest_of_line ();
13496     }
13497
13498   p = frag_more (bytes);
13499   md_number_to_chars (p, 0, bytes);
13500   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13501                (bytes == 8
13502                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13503                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13504
13505   demand_empty_rest_of_line ();
13506 }
13507
13508 /* Handle .dtprelword.  */
13509
13510 static void
13511 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13512 {
13513   s_dtprel_internal (4);
13514 }
13515
13516 /* Handle .dtpreldword.  */
13517
13518 static void
13519 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13520 {
13521   s_dtprel_internal (8);
13522 }
13523
13524 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13525    code.  It sets the offset to use in gp_rel relocations.  */
13526
13527 static void
13528 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13529 {
13530   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13531      We also need NewABI support.  */
13532   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13533     {
13534       s_ignore (0);
13535       return;
13536     }
13537
13538   mips_gprel_offset = get_absolute_expression ();
13539
13540   demand_empty_rest_of_line ();
13541 }
13542
13543 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13544    code.  It generates a 32 bit GP relative reloc.  */
13545
13546 static void
13547 s_gpword (int ignore ATTRIBUTE_UNUSED)
13548 {
13549   segment_info_type *si;
13550   struct insn_label_list *l;
13551   symbolS *label;
13552   expressionS ex;
13553   char *p;
13554
13555   /* When not generating PIC code, this is treated as .word.  */
13556   if (mips_pic != SVR4_PIC)
13557     {
13558       s_cons (2);
13559       return;
13560     }
13561
13562   si = seg_info (now_seg);
13563   l = si->label_list;
13564   label = l != NULL ? l->label : NULL;
13565   mips_emit_delays ();
13566   if (auto_align)
13567     mips_align (2, 0, label);
13568   mips_clear_insn_labels ();
13569
13570   expression (&ex);
13571
13572   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13573     {
13574       as_bad (_("Unsupported use of .gpword"));
13575       ignore_rest_of_line ();
13576     }
13577
13578   p = frag_more (4);
13579   md_number_to_chars (p, 0, 4);
13580   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13581                BFD_RELOC_GPREL32);
13582
13583   demand_empty_rest_of_line ();
13584 }
13585
13586 static void
13587 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13588 {
13589   segment_info_type *si;
13590   struct insn_label_list *l;
13591   symbolS *label;
13592   expressionS ex;
13593   char *p;
13594
13595   /* When not generating PIC code, this is treated as .dword.  */
13596   if (mips_pic != SVR4_PIC)
13597     {
13598       s_cons (3);
13599       return;
13600     }
13601
13602   si = seg_info (now_seg);
13603   l = si->label_list;
13604   label = l != NULL ? l->label : NULL;
13605   mips_emit_delays ();
13606   if (auto_align)
13607     mips_align (3, 0, label);
13608   mips_clear_insn_labels ();
13609
13610   expression (&ex);
13611
13612   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13613     {
13614       as_bad (_("Unsupported use of .gpdword"));
13615       ignore_rest_of_line ();
13616     }
13617
13618   p = frag_more (8);
13619   md_number_to_chars (p, 0, 8);
13620   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13621                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13622
13623   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13624   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13625            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13626
13627   demand_empty_rest_of_line ();
13628 }
13629
13630 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13631    tables in SVR4 PIC code.  */
13632
13633 static void
13634 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13635 {
13636   int reg;
13637
13638   /* This is ignored when not generating SVR4 PIC code.  */
13639   if (mips_pic != SVR4_PIC)
13640     {
13641       s_ignore (0);
13642       return;
13643     }
13644
13645   /* Add $gp to the register named as an argument.  */
13646   macro_start ();
13647   reg = tc_get_register (0);
13648   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13649   macro_end ();
13650
13651   demand_empty_rest_of_line ();
13652 }
13653
13654 /* Handle the .insn pseudo-op.  This marks instruction labels in
13655    mips16 mode.  This permits the linker to handle them specially,
13656    such as generating jalx instructions when needed.  We also make
13657    them odd for the duration of the assembly, in order to generate the
13658    right sort of code.  We will make them even in the adjust_symtab
13659    routine, while leaving them marked.  This is convenient for the
13660    debugger and the disassembler.  The linker knows to make them odd
13661    again.  */
13662
13663 static void
13664 s_insn (int ignore ATTRIBUTE_UNUSED)
13665 {
13666   mips16_mark_labels ();
13667
13668   demand_empty_rest_of_line ();
13669 }
13670
13671 /* Handle a .stabn directive.  We need these in order to mark a label
13672    as being a mips16 text label correctly.  Sometimes the compiler
13673    will emit a label, followed by a .stabn, and then switch sections.
13674    If the label and .stabn are in mips16 mode, then the label is
13675    really a mips16 text label.  */
13676
13677 static void
13678 s_mips_stab (int type)
13679 {
13680   if (type == 'n')
13681     mips16_mark_labels ();
13682
13683   s_stab (type);
13684 }
13685
13686 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13687
13688 static void
13689 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13690 {
13691   char *name;
13692   int c;
13693   symbolS *symbolP;
13694   expressionS exp;
13695
13696   name = input_line_pointer;
13697   c = get_symbol_end ();
13698   symbolP = symbol_find_or_make (name);
13699   S_SET_WEAK (symbolP);
13700   *input_line_pointer = c;
13701
13702   SKIP_WHITESPACE ();
13703
13704   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13705     {
13706       if (S_IS_DEFINED (symbolP))
13707         {
13708           as_bad (_("ignoring attempt to redefine symbol %s"),
13709                   S_GET_NAME (symbolP));
13710           ignore_rest_of_line ();
13711           return;
13712         }
13713
13714       if (*input_line_pointer == ',')
13715         {
13716           ++input_line_pointer;
13717           SKIP_WHITESPACE ();
13718         }
13719
13720       expression (&exp);
13721       if (exp.X_op != O_symbol)
13722         {
13723           as_bad (_("bad .weakext directive"));
13724           ignore_rest_of_line ();
13725           return;
13726         }
13727       symbol_set_value_expression (symbolP, &exp);
13728     }
13729
13730   demand_empty_rest_of_line ();
13731 }
13732
13733 /* Parse a register string into a number.  Called from the ECOFF code
13734    to parse .frame.  The argument is non-zero if this is the frame
13735    register, so that we can record it in mips_frame_reg.  */
13736
13737 int
13738 tc_get_register (int frame)
13739 {
13740   unsigned int reg;
13741
13742   SKIP_WHITESPACE ();
13743   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13744     reg = 0;
13745   if (frame)
13746     {
13747       mips_frame_reg = reg != 0 ? reg : SP;
13748       mips_frame_reg_valid = 1;
13749       mips_cprestore_valid = 0;
13750     }
13751   return reg;
13752 }
13753
13754 valueT
13755 md_section_align (asection *seg, valueT addr)
13756 {
13757   int align = bfd_get_section_alignment (stdoutput, seg);
13758
13759   if (IS_ELF)
13760     {
13761       /* We don't need to align ELF sections to the full alignment.
13762          However, Irix 5 may prefer that we align them at least to a 16
13763          byte boundary.  We don't bother to align the sections if we
13764          are targeted for an embedded system.  */
13765       if (strncmp (TARGET_OS, "elf", 3) == 0)
13766         return addr;
13767       if (align > 4)
13768         align = 4;
13769     }
13770
13771   return ((addr + (1 << align) - 1) & (-1 << align));
13772 }
13773
13774 /* Utility routine, called from above as well.  If called while the
13775    input file is still being read, it's only an approximation.  (For
13776    example, a symbol may later become defined which appeared to be
13777    undefined earlier.)  */
13778
13779 static int
13780 nopic_need_relax (symbolS *sym, int before_relaxing)
13781 {
13782   if (sym == 0)
13783     return 0;
13784
13785   if (g_switch_value > 0)
13786     {
13787       const char *symname;
13788       int change;
13789
13790       /* Find out whether this symbol can be referenced off the $gp
13791          register.  It can be if it is smaller than the -G size or if
13792          it is in the .sdata or .sbss section.  Certain symbols can
13793          not be referenced off the $gp, although it appears as though
13794          they can.  */
13795       symname = S_GET_NAME (sym);
13796       if (symname != (const char *) NULL
13797           && (strcmp (symname, "eprol") == 0
13798               || strcmp (symname, "etext") == 0
13799               || strcmp (symname, "_gp") == 0
13800               || strcmp (symname, "edata") == 0
13801               || strcmp (symname, "_fbss") == 0
13802               || strcmp (symname, "_fdata") == 0
13803               || strcmp (symname, "_ftext") == 0
13804               || strcmp (symname, "end") == 0
13805               || strcmp (symname, "_gp_disp") == 0))
13806         change = 1;
13807       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13808                && (0
13809 #ifndef NO_ECOFF_DEBUGGING
13810                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13811                        && (symbol_get_obj (sym)->ecoff_extern_size
13812                            <= g_switch_value))
13813 #endif
13814                    /* We must defer this decision until after the whole
13815                       file has been read, since there might be a .extern
13816                       after the first use of this symbol.  */
13817                    || (before_relaxing
13818 #ifndef NO_ECOFF_DEBUGGING
13819                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13820 #endif
13821                        && S_GET_VALUE (sym) == 0)
13822                    || (S_GET_VALUE (sym) != 0
13823                        && S_GET_VALUE (sym) <= g_switch_value)))
13824         change = 0;
13825       else
13826         {
13827           const char *segname;
13828
13829           segname = segment_name (S_GET_SEGMENT (sym));
13830           gas_assert (strcmp (segname, ".lit8") != 0
13831                   && strcmp (segname, ".lit4") != 0);
13832           change = (strcmp (segname, ".sdata") != 0
13833                     && strcmp (segname, ".sbss") != 0
13834                     && strncmp (segname, ".sdata.", 7) != 0
13835                     && strncmp (segname, ".sbss.", 6) != 0
13836                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13837                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13838         }
13839       return change;
13840     }
13841   else
13842     /* We are not optimizing for the $gp register.  */
13843     return 1;
13844 }
13845
13846
13847 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13848
13849 static bfd_boolean
13850 pic_need_relax (symbolS *sym, asection *segtype)
13851 {
13852   asection *symsec;
13853
13854   /* Handle the case of a symbol equated to another symbol.  */
13855   while (symbol_equated_reloc_p (sym))
13856     {
13857       symbolS *n;
13858
13859       /* It's possible to get a loop here in a badly written program.  */
13860       n = symbol_get_value_expression (sym)->X_add_symbol;
13861       if (n == sym)
13862         break;
13863       sym = n;
13864     }
13865
13866   if (symbol_section_p (sym))
13867     return TRUE;
13868
13869   symsec = S_GET_SEGMENT (sym);
13870
13871   /* This must duplicate the test in adjust_reloc_syms.  */
13872   return (symsec != &bfd_und_section
13873           && symsec != &bfd_abs_section
13874           && !bfd_is_com_section (symsec)
13875           && !s_is_linkonce (sym, segtype)
13876 #ifdef OBJ_ELF
13877           /* A global or weak symbol is treated as external.  */
13878           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13879 #endif
13880           );
13881 }
13882
13883
13884 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13885    extended opcode.  SEC is the section the frag is in.  */
13886
13887 static int
13888 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13889 {
13890   int type;
13891   const struct mips16_immed_operand *op;
13892   offsetT val;
13893   int mintiny, maxtiny;
13894   segT symsec;
13895   fragS *sym_frag;
13896
13897   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13898     return 0;
13899   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13900     return 1;
13901
13902   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13903   op = mips16_immed_operands;
13904   while (op->type != type)
13905     {
13906       ++op;
13907       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13908     }
13909
13910   if (op->unsp)
13911     {
13912       if (type == '<' || type == '>' || type == '[' || type == ']')
13913         {
13914           mintiny = 1;
13915           maxtiny = 1 << op->nbits;
13916         }
13917       else
13918         {
13919           mintiny = 0;
13920           maxtiny = (1 << op->nbits) - 1;
13921         }
13922     }
13923   else
13924     {
13925       mintiny = - (1 << (op->nbits - 1));
13926       maxtiny = (1 << (op->nbits - 1)) - 1;
13927     }
13928
13929   sym_frag = symbol_get_frag (fragp->fr_symbol);
13930   val = S_GET_VALUE (fragp->fr_symbol);
13931   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13932
13933   if (op->pcrel)
13934     {
13935       addressT addr;
13936
13937       /* We won't have the section when we are called from
13938          mips_relax_frag.  However, we will always have been called
13939          from md_estimate_size_before_relax first.  If this is a
13940          branch to a different section, we mark it as such.  If SEC is
13941          NULL, and the frag is not marked, then it must be a branch to
13942          the same section.  */
13943       if (sec == NULL)
13944         {
13945           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13946             return 1;
13947         }
13948       else
13949         {
13950           /* Must have been called from md_estimate_size_before_relax.  */
13951           if (symsec != sec)
13952             {
13953               fragp->fr_subtype =
13954                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13955
13956               /* FIXME: We should support this, and let the linker
13957                  catch branches and loads that are out of range.  */
13958               as_bad_where (fragp->fr_file, fragp->fr_line,
13959                             _("unsupported PC relative reference to different section"));
13960
13961               return 1;
13962             }
13963           if (fragp != sym_frag && sym_frag->fr_address == 0)
13964             /* Assume non-extended on the first relaxation pass.
13965                The address we have calculated will be bogus if this is
13966                a forward branch to another frag, as the forward frag
13967                will have fr_address == 0.  */
13968             return 0;
13969         }
13970
13971       /* In this case, we know for sure that the symbol fragment is in
13972          the same section.  If the relax_marker of the symbol fragment
13973          differs from the relax_marker of this fragment, we have not
13974          yet adjusted the symbol fragment fr_address.  We want to add
13975          in STRETCH in order to get a better estimate of the address.
13976          This particularly matters because of the shift bits.  */
13977       if (stretch != 0
13978           && sym_frag->relax_marker != fragp->relax_marker)
13979         {
13980           fragS *f;
13981
13982           /* Adjust stretch for any alignment frag.  Note that if have
13983              been expanding the earlier code, the symbol may be
13984              defined in what appears to be an earlier frag.  FIXME:
13985              This doesn't handle the fr_subtype field, which specifies
13986              a maximum number of bytes to skip when doing an
13987              alignment.  */
13988           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13989             {
13990               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13991                 {
13992                   if (stretch < 0)
13993                     stretch = - ((- stretch)
13994                                  & ~ ((1 << (int) f->fr_offset) - 1));
13995                   else
13996                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13997                   if (stretch == 0)
13998                     break;
13999                 }
14000             }
14001           if (f != NULL)
14002             val += stretch;
14003         }
14004
14005       addr = fragp->fr_address + fragp->fr_fix;
14006
14007       /* The base address rules are complicated.  The base address of
14008          a branch is the following instruction.  The base address of a
14009          PC relative load or add is the instruction itself, but if it
14010          is in a delay slot (in which case it can not be extended) use
14011          the address of the instruction whose delay slot it is in.  */
14012       if (type == 'p' || type == 'q')
14013         {
14014           addr += 2;
14015
14016           /* If we are currently assuming that this frag should be
14017              extended, then, the current address is two bytes
14018              higher.  */
14019           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14020             addr += 2;
14021
14022           /* Ignore the low bit in the target, since it will be set
14023              for a text label.  */
14024           if ((val & 1) != 0)
14025             --val;
14026         }
14027       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14028         addr -= 4;
14029       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14030         addr -= 2;
14031
14032       val -= addr & ~ ((1 << op->shift) - 1);
14033
14034       /* Branch offsets have an implicit 0 in the lowest bit.  */
14035       if (type == 'p' || type == 'q')
14036         val /= 2;
14037
14038       /* If any of the shifted bits are set, we must use an extended
14039          opcode.  If the address depends on the size of this
14040          instruction, this can lead to a loop, so we arrange to always
14041          use an extended opcode.  We only check this when we are in
14042          the main relaxation loop, when SEC is NULL.  */
14043       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14044         {
14045           fragp->fr_subtype =
14046             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14047           return 1;
14048         }
14049
14050       /* If we are about to mark a frag as extended because the value
14051          is precisely maxtiny + 1, then there is a chance of an
14052          infinite loop as in the following code:
14053              la $4,foo
14054              .skip      1020
14055              .align     2
14056            foo:
14057          In this case when the la is extended, foo is 0x3fc bytes
14058          away, so the la can be shrunk, but then foo is 0x400 away, so
14059          the la must be extended.  To avoid this loop, we mark the
14060          frag as extended if it was small, and is about to become
14061          extended with a value of maxtiny + 1.  */
14062       if (val == ((maxtiny + 1) << op->shift)
14063           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14064           && sec == NULL)
14065         {
14066           fragp->fr_subtype =
14067             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14068           return 1;
14069         }
14070     }
14071   else if (symsec != absolute_section && sec != NULL)
14072     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14073
14074   if ((val & ((1 << op->shift) - 1)) != 0
14075       || val < (mintiny << op->shift)
14076       || val > (maxtiny << op->shift))
14077     return 1;
14078   else
14079     return 0;
14080 }
14081
14082 /* Compute the length of a branch sequence, and adjust the
14083    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14084    worst-case length is computed, with UPDATE being used to indicate
14085    whether an unconditional (-1), branch-likely (+1) or regular (0)
14086    branch is to be computed.  */
14087 static int
14088 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14089 {
14090   bfd_boolean toofar;
14091   int length;
14092
14093   if (fragp
14094       && S_IS_DEFINED (fragp->fr_symbol)
14095       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14096     {
14097       addressT addr;
14098       offsetT val;
14099
14100       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14101
14102       addr = fragp->fr_address + fragp->fr_fix + 4;
14103
14104       val -= addr;
14105
14106       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14107     }
14108   else if (fragp)
14109     /* If the symbol is not defined or it's in a different segment,
14110        assume the user knows what's going on and emit a short
14111        branch.  */
14112     toofar = FALSE;
14113   else
14114     toofar = TRUE;
14115
14116   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14117     fragp->fr_subtype
14118       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14119                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14120                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14121                              toofar);
14122
14123   length = 4;
14124   if (toofar)
14125     {
14126       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14127         length += 8;
14128
14129       if (mips_pic != NO_PIC)
14130         {
14131           /* Additional space for PIC loading of target address.  */
14132           length += 8;
14133           if (mips_opts.isa == ISA_MIPS1)
14134             /* Additional space for $at-stabilizing nop.  */
14135             length += 4;
14136         }
14137
14138       /* If branch is conditional.  */
14139       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14140         length += 8;
14141     }
14142
14143   return length;
14144 }
14145
14146 /* Estimate the size of a frag before relaxing.  Unless this is the
14147    mips16, we are not really relaxing here, and the final size is
14148    encoded in the subtype information.  For the mips16, we have to
14149    decide whether we are using an extended opcode or not.  */
14150
14151 int
14152 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14153 {
14154   int change;
14155
14156   if (RELAX_BRANCH_P (fragp->fr_subtype))
14157     {
14158
14159       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14160
14161       return fragp->fr_var;
14162     }
14163
14164   if (RELAX_MIPS16_P (fragp->fr_subtype))
14165     /* We don't want to modify the EXTENDED bit here; it might get us
14166        into infinite loops.  We change it only in mips_relax_frag().  */
14167     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14168
14169   if (mips_pic == NO_PIC)
14170     change = nopic_need_relax (fragp->fr_symbol, 0);
14171   else if (mips_pic == SVR4_PIC)
14172     change = pic_need_relax (fragp->fr_symbol, segtype);
14173   else if (mips_pic == VXWORKS_PIC)
14174     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14175     change = 0;
14176   else
14177     abort ();
14178
14179   if (change)
14180     {
14181       fragp->fr_subtype |= RELAX_USE_SECOND;
14182       return -RELAX_FIRST (fragp->fr_subtype);
14183     }
14184   else
14185     return -RELAX_SECOND (fragp->fr_subtype);
14186 }
14187
14188 /* This is called to see whether a reloc against a defined symbol
14189    should be converted into a reloc against a section.  */
14190
14191 int
14192 mips_fix_adjustable (fixS *fixp)
14193 {
14194   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14195       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14196     return 0;
14197
14198   if (fixp->fx_addsy == NULL)
14199     return 1;
14200
14201   /* If symbol SYM is in a mergeable section, relocations of the form
14202      SYM + 0 can usually be made section-relative.  The mergeable data
14203      is then identified by the section offset rather than by the symbol.
14204
14205      However, if we're generating REL LO16 relocations, the offset is split
14206      between the LO16 and parterning high part relocation.  The linker will
14207      need to recalculate the complete offset in order to correctly identify
14208      the merge data.
14209
14210      The linker has traditionally not looked for the parterning high part
14211      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14212      placed anywhere.  Rather than break backwards compatibility by changing
14213      this, it seems better not to force the issue, and instead keep the
14214      original symbol.  This will work with either linker behavior.  */
14215   if ((lo16_reloc_p (fixp->fx_r_type)
14216        || reloc_needs_lo_p (fixp->fx_r_type))
14217       && HAVE_IN_PLACE_ADDENDS
14218       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14219     return 0;
14220
14221   /* There is no place to store an in-place offset for JALR relocations.  */
14222   if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14223     return 0;
14224
14225 #ifdef OBJ_ELF
14226   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14227      to a floating-point stub.  The same is true for non-R_MIPS16_26
14228      relocations against MIPS16 functions; in this case, the stub becomes
14229      the function's canonical address.
14230
14231      Floating-point stubs are stored in unique .mips16.call.* or
14232      .mips16.fn.* sections.  If a stub T for function F is in section S,
14233      the first relocation in section S must be against F; this is how the
14234      linker determines the target function.  All relocations that might
14235      resolve to T must also be against F.  We therefore have the following
14236      restrictions, which are given in an intentionally-redundant way:
14237
14238        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14239           symbols.
14240
14241        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14242           if that stub might be used.
14243
14244        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14245           symbols.
14246
14247        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14248           that stub might be used.
14249
14250      There is a further restriction:
14251
14252        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14253           on targets with in-place addends; the relocation field cannot
14254           encode the low bit.
14255
14256      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14257      against a MIPS16 symbol.
14258
14259      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14260      relocation against some symbol R, no relocation against R may be
14261      reduced.  (Note that this deals with (2) as well as (1) because
14262      relocations against global symbols will never be reduced on ELF
14263      targets.)  This approach is a little simpler than trying to detect
14264      stub sections, and gives the "all or nothing" per-symbol consistency
14265      that we have for MIPS16 symbols.  */
14266   if (IS_ELF
14267       && fixp->fx_subsy == NULL
14268       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14269           || *symbol_get_tc (fixp->fx_addsy)))
14270     return 0;
14271 #endif
14272
14273   return 1;
14274 }
14275
14276 /* Translate internal representation of relocation info to BFD target
14277    format.  */
14278
14279 arelent **
14280 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14281 {
14282   static arelent *retval[4];
14283   arelent *reloc;
14284   bfd_reloc_code_real_type code;
14285
14286   memset (retval, 0, sizeof(retval));
14287   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14288   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14289   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14290   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14291
14292   if (fixp->fx_pcrel)
14293     {
14294       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14295
14296       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14297          Relocations want only the symbol offset.  */
14298       reloc->addend = fixp->fx_addnumber + reloc->address;
14299       if (!IS_ELF)
14300         {
14301           /* A gruesome hack which is a result of the gruesome gas
14302              reloc handling.  What's worse, for COFF (as opposed to
14303              ECOFF), we might need yet another copy of reloc->address.
14304              See bfd_install_relocation.  */
14305           reloc->addend += reloc->address;
14306         }
14307     }
14308   else
14309     reloc->addend = fixp->fx_addnumber;
14310
14311   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14312      entry to be used in the relocation's section offset.  */
14313   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14314     {
14315       reloc->address = reloc->addend;
14316       reloc->addend = 0;
14317     }
14318
14319   code = fixp->fx_r_type;
14320
14321   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14322   if (reloc->howto == NULL)
14323     {
14324       as_bad_where (fixp->fx_file, fixp->fx_line,
14325                     _("Can not represent %s relocation in this object file format"),
14326                     bfd_get_reloc_code_name (code));
14327       retval[0] = NULL;
14328     }
14329
14330   return retval;
14331 }
14332
14333 /* Relax a machine dependent frag.  This returns the amount by which
14334    the current size of the frag should change.  */
14335
14336 int
14337 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14338 {
14339   if (RELAX_BRANCH_P (fragp->fr_subtype))
14340     {
14341       offsetT old_var = fragp->fr_var;
14342
14343       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14344
14345       return fragp->fr_var - old_var;
14346     }
14347
14348   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14349     return 0;
14350
14351   if (mips16_extended_frag (fragp, NULL, stretch))
14352     {
14353       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14354         return 0;
14355       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14356       return 2;
14357     }
14358   else
14359     {
14360       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14361         return 0;
14362       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14363       return -2;
14364     }
14365
14366   return 0;
14367 }
14368
14369 /* Convert a machine dependent frag.  */
14370
14371 void
14372 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14373 {
14374   if (RELAX_BRANCH_P (fragp->fr_subtype))
14375     {
14376       bfd_byte *buf;
14377       unsigned long insn;
14378       expressionS exp;
14379       fixS *fixp;
14380
14381       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14382
14383       if (target_big_endian)
14384         insn = bfd_getb32 (buf);
14385       else
14386         insn = bfd_getl32 (buf);
14387
14388       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14389         {
14390           /* We generate a fixup instead of applying it right now
14391              because, if there are linker relaxations, we're going to
14392              need the relocations.  */
14393           exp.X_op = O_symbol;
14394           exp.X_add_symbol = fragp->fr_symbol;
14395           exp.X_add_number = fragp->fr_offset;
14396
14397           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14398                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14399           fixp->fx_file = fragp->fr_file;
14400           fixp->fx_line = fragp->fr_line;
14401
14402           md_number_to_chars ((char *) buf, insn, 4);
14403           buf += 4;
14404         }
14405       else
14406         {
14407           int i;
14408
14409           as_warn_where (fragp->fr_file, fragp->fr_line,
14410                          _("relaxed out-of-range branch into a jump"));
14411
14412           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14413             goto uncond;
14414
14415           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14416             {
14417               /* Reverse the branch.  */
14418               switch ((insn >> 28) & 0xf)
14419                 {
14420                 case 4:
14421                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14422                      have the condition reversed by tweaking a single
14423                      bit, and their opcodes all have 0x4???????.  */
14424                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14425                   insn ^= 0x00010000;
14426                   break;
14427
14428                 case 0:
14429                   /* bltz       0x04000000      bgez    0x04010000
14430                      bltzal     0x04100000      bgezal  0x04110000  */
14431                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14432                   insn ^= 0x00010000;
14433                   break;
14434
14435                 case 1:
14436                   /* beq        0x10000000      bne     0x14000000
14437                      blez       0x18000000      bgtz    0x1c000000  */
14438                   insn ^= 0x04000000;
14439                   break;
14440
14441                 default:
14442                   abort ();
14443                 }
14444             }
14445
14446           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14447             {
14448               /* Clear the and-link bit.  */
14449               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14450
14451               /* bltzal         0x04100000      bgezal  0x04110000
14452                  bltzall        0x04120000      bgezall 0x04130000  */
14453               insn &= ~0x00100000;
14454             }
14455
14456           /* Branch over the branch (if the branch was likely) or the
14457              full jump (not likely case).  Compute the offset from the
14458              current instruction to branch to.  */
14459           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14460             i = 16;
14461           else
14462             {
14463               /* How many bytes in instructions we've already emitted?  */
14464               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14465               /* How many bytes in instructions from here to the end?  */
14466               i = fragp->fr_var - i;
14467             }
14468           /* Convert to instruction count.  */
14469           i >>= 2;
14470           /* Branch counts from the next instruction.  */
14471           i--;
14472           insn |= i;
14473           /* Branch over the jump.  */
14474           md_number_to_chars ((char *) buf, insn, 4);
14475           buf += 4;
14476
14477           /* nop */
14478           md_number_to_chars ((char *) buf, 0, 4);
14479           buf += 4;
14480
14481           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14482             {
14483               /* beql $0, $0, 2f */
14484               insn = 0x50000000;
14485               /* Compute the PC offset from the current instruction to
14486                  the end of the variable frag.  */
14487               /* How many bytes in instructions we've already emitted?  */
14488               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14489               /* How many bytes in instructions from here to the end?  */
14490               i = fragp->fr_var - i;
14491               /* Convert to instruction count.  */
14492               i >>= 2;
14493               /* Don't decrement i, because we want to branch over the
14494                  delay slot.  */
14495
14496               insn |= i;
14497               md_number_to_chars ((char *) buf, insn, 4);
14498               buf += 4;
14499
14500               md_number_to_chars ((char *) buf, 0, 4);
14501               buf += 4;
14502             }
14503
14504         uncond:
14505           if (mips_pic == NO_PIC)
14506             {
14507               /* j or jal.  */
14508               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14509                       ? 0x0c000000 : 0x08000000);
14510               exp.X_op = O_symbol;
14511               exp.X_add_symbol = fragp->fr_symbol;
14512               exp.X_add_number = fragp->fr_offset;
14513
14514               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14515                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14516               fixp->fx_file = fragp->fr_file;
14517               fixp->fx_line = fragp->fr_line;
14518
14519               md_number_to_chars ((char *) buf, insn, 4);
14520               buf += 4;
14521             }
14522           else
14523             {
14524               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14525               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14526               exp.X_op = O_symbol;
14527               exp.X_add_symbol = fragp->fr_symbol;
14528               exp.X_add_number = fragp->fr_offset;
14529
14530               if (fragp->fr_offset)
14531                 {
14532                   exp.X_add_symbol = make_expr_symbol (&exp);
14533                   exp.X_add_number = 0;
14534                 }
14535
14536               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14537                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14538               fixp->fx_file = fragp->fr_file;
14539               fixp->fx_line = fragp->fr_line;
14540
14541               md_number_to_chars ((char *) buf, insn, 4);
14542               buf += 4;
14543
14544               if (mips_opts.isa == ISA_MIPS1)
14545                 {
14546                   /* nop */
14547                   md_number_to_chars ((char *) buf, 0, 4);
14548                   buf += 4;
14549                 }
14550
14551               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14552               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14553
14554               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14555                                   4, &exp, FALSE, BFD_RELOC_LO16);
14556               fixp->fx_file = fragp->fr_file;
14557               fixp->fx_line = fragp->fr_line;
14558
14559               md_number_to_chars ((char *) buf, insn, 4);
14560               buf += 4;
14561
14562               /* j(al)r $at.  */
14563               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14564                 insn = 0x0020f809;
14565               else
14566                 insn = 0x00200008;
14567
14568               md_number_to_chars ((char *) buf, insn, 4);
14569               buf += 4;
14570             }
14571         }
14572
14573       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14574               + fragp->fr_fix + fragp->fr_var);
14575
14576       fragp->fr_fix += fragp->fr_var;
14577
14578       return;
14579     }
14580
14581   if (RELAX_MIPS16_P (fragp->fr_subtype))
14582     {
14583       int type;
14584       const struct mips16_immed_operand *op;
14585       bfd_boolean small, ext;
14586       offsetT val;
14587       bfd_byte *buf;
14588       unsigned long insn;
14589       bfd_boolean use_extend;
14590       unsigned short extend;
14591
14592       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14593       op = mips16_immed_operands;
14594       while (op->type != type)
14595         ++op;
14596
14597       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14598         {
14599           small = FALSE;
14600           ext = TRUE;
14601         }
14602       else
14603         {
14604           small = TRUE;
14605           ext = FALSE;
14606         }
14607
14608       resolve_symbol_value (fragp->fr_symbol);
14609       val = S_GET_VALUE (fragp->fr_symbol);
14610       if (op->pcrel)
14611         {
14612           addressT addr;
14613
14614           addr = fragp->fr_address + fragp->fr_fix;
14615
14616           /* The rules for the base address of a PC relative reloc are
14617              complicated; see mips16_extended_frag.  */
14618           if (type == 'p' || type == 'q')
14619             {
14620               addr += 2;
14621               if (ext)
14622                 addr += 2;
14623               /* Ignore the low bit in the target, since it will be
14624                  set for a text label.  */
14625               if ((val & 1) != 0)
14626                 --val;
14627             }
14628           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14629             addr -= 4;
14630           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14631             addr -= 2;
14632
14633           addr &= ~ (addressT) ((1 << op->shift) - 1);
14634           val -= addr;
14635
14636           /* Make sure the section winds up with the alignment we have
14637              assumed.  */
14638           if (op->shift > 0)
14639             record_alignment (asec, op->shift);
14640         }
14641
14642       if (ext
14643           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14644               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14645         as_warn_where (fragp->fr_file, fragp->fr_line,
14646                        _("extended instruction in delay slot"));
14647
14648       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14649
14650       if (target_big_endian)
14651         insn = bfd_getb16 (buf);
14652       else
14653         insn = bfd_getl16 (buf);
14654
14655       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14656                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14657                     small, ext, &insn, &use_extend, &extend);
14658
14659       if (use_extend)
14660         {
14661           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14662           fragp->fr_fix += 2;
14663           buf += 2;
14664         }
14665
14666       md_number_to_chars ((char *) buf, insn, 2);
14667       fragp->fr_fix += 2;
14668       buf += 2;
14669     }
14670   else
14671     {
14672       int first, second;
14673       fixS *fixp;
14674
14675       first = RELAX_FIRST (fragp->fr_subtype);
14676       second = RELAX_SECOND (fragp->fr_subtype);
14677       fixp = (fixS *) fragp->fr_opcode;
14678
14679       /* Possibly emit a warning if we've chosen the longer option.  */
14680       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14681           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14682         {
14683           const char *msg = macro_warning (fragp->fr_subtype);
14684           if (msg != 0)
14685             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14686         }
14687
14688       /* Go through all the fixups for the first sequence.  Disable them
14689          (by marking them as done) if we're going to use the second
14690          sequence instead.  */
14691       while (fixp
14692              && fixp->fx_frag == fragp
14693              && fixp->fx_where < fragp->fr_fix - second)
14694         {
14695           if (fragp->fr_subtype & RELAX_USE_SECOND)
14696             fixp->fx_done = 1;
14697           fixp = fixp->fx_next;
14698         }
14699
14700       /* Go through the fixups for the second sequence.  Disable them if
14701          we're going to use the first sequence, otherwise adjust their
14702          addresses to account for the relaxation.  */
14703       while (fixp && fixp->fx_frag == fragp)
14704         {
14705           if (fragp->fr_subtype & RELAX_USE_SECOND)
14706             fixp->fx_where -= first;
14707           else
14708             fixp->fx_done = 1;
14709           fixp = fixp->fx_next;
14710         }
14711
14712       /* Now modify the frag contents.  */
14713       if (fragp->fr_subtype & RELAX_USE_SECOND)
14714         {
14715           char *start;
14716
14717           start = fragp->fr_literal + fragp->fr_fix - first - second;
14718           memmove (start, start + first, second);
14719           fragp->fr_fix -= first;
14720         }
14721       else
14722         fragp->fr_fix -= second;
14723     }
14724 }
14725
14726 #ifdef OBJ_ELF
14727
14728 /* This function is called after the relocs have been generated.
14729    We've been storing mips16 text labels as odd.  Here we convert them
14730    back to even for the convenience of the debugger.  */
14731
14732 void
14733 mips_frob_file_after_relocs (void)
14734 {
14735   asymbol **syms;
14736   unsigned int count, i;
14737
14738   if (!IS_ELF)
14739     return;
14740
14741   syms = bfd_get_outsymbols (stdoutput);
14742   count = bfd_get_symcount (stdoutput);
14743   for (i = 0; i < count; i++, syms++)
14744     {
14745       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14746           && ((*syms)->value & 1) != 0)
14747         {
14748           (*syms)->value &= ~1;
14749           /* If the symbol has an odd size, it was probably computed
14750              incorrectly, so adjust that as well.  */
14751           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14752             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14753         }
14754     }
14755 }
14756
14757 #endif
14758
14759 /* This function is called whenever a label is defined.  It is used
14760    when handling branch delays; if a branch has a label, we assume we
14761    can not move it.  */
14762
14763 void
14764 mips_define_label (symbolS *sym)
14765 {
14766   segment_info_type *si = seg_info (now_seg);
14767   struct insn_label_list *l;
14768
14769   if (free_insn_labels == NULL)
14770     l = (struct insn_label_list *) xmalloc (sizeof *l);
14771   else
14772     {
14773       l = free_insn_labels;
14774       free_insn_labels = l->next;
14775     }
14776
14777   l->label = sym;
14778   l->next = si->label_list;
14779   si->label_list = l;
14780
14781 #ifdef OBJ_ELF
14782   dwarf2_emit_label (sym);
14783 #endif
14784 }
14785 \f
14786 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14787
14788 /* Some special processing for a MIPS ELF file.  */
14789
14790 void
14791 mips_elf_final_processing (void)
14792 {
14793   /* Write out the register information.  */
14794   if (mips_abi != N64_ABI)
14795     {
14796       Elf32_RegInfo s;
14797
14798       s.ri_gprmask = mips_gprmask;
14799       s.ri_cprmask[0] = mips_cprmask[0];
14800       s.ri_cprmask[1] = mips_cprmask[1];
14801       s.ri_cprmask[2] = mips_cprmask[2];
14802       s.ri_cprmask[3] = mips_cprmask[3];
14803       /* The gp_value field is set by the MIPS ELF backend.  */
14804
14805       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14806                                        ((Elf32_External_RegInfo *)
14807                                         mips_regmask_frag));
14808     }
14809   else
14810     {
14811       Elf64_Internal_RegInfo s;
14812
14813       s.ri_gprmask = mips_gprmask;
14814       s.ri_pad = 0;
14815       s.ri_cprmask[0] = mips_cprmask[0];
14816       s.ri_cprmask[1] = mips_cprmask[1];
14817       s.ri_cprmask[2] = mips_cprmask[2];
14818       s.ri_cprmask[3] = mips_cprmask[3];
14819       /* The gp_value field is set by the MIPS ELF backend.  */
14820
14821       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14822                                        ((Elf64_External_RegInfo *)
14823                                         mips_regmask_frag));
14824     }
14825
14826   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14827      sort of BFD interface for this.  */
14828   if (mips_any_noreorder)
14829     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14830   if (mips_pic != NO_PIC)
14831     {
14832     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14833       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14834     }
14835   if (mips_abicalls)
14836     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14837
14838   /* Set MIPS ELF flags for ASEs.  */
14839   /* We may need to define a new flag for DSP ASE, and set this flag when
14840      file_ase_dsp is true.  */
14841   /* Same for DSP R2.  */
14842   /* We may need to define a new flag for MT ASE, and set this flag when
14843      file_ase_mt is true.  */
14844   if (file_ase_mips16)
14845     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14846 #if 0 /* XXX FIXME */
14847   if (file_ase_mips3d)
14848     elf_elfheader (stdoutput)->e_flags |= ???;
14849 #endif
14850   if (file_ase_mdmx)
14851     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14852
14853   /* Set the MIPS ELF ABI flags.  */
14854   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14855     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14856   else if (mips_abi == O64_ABI)
14857     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14858   else if (mips_abi == EABI_ABI)
14859     {
14860       if (!file_mips_gp32)
14861         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14862       else
14863         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14864     }
14865   else if (mips_abi == N32_ABI)
14866     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14867
14868   /* Nothing to do for N64_ABI.  */
14869
14870   if (mips_32bitmode)
14871     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14872
14873 #if 0 /* XXX FIXME */
14874   /* 32 bit code with 64 bit FP registers.  */
14875   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14876     elf_elfheader (stdoutput)->e_flags |= ???;
14877 #endif
14878 }
14879
14880 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14881 \f
14882 typedef struct proc {
14883   symbolS *func_sym;
14884   symbolS *func_end_sym;
14885   unsigned long reg_mask;
14886   unsigned long reg_offset;
14887   unsigned long fpreg_mask;
14888   unsigned long fpreg_offset;
14889   unsigned long frame_offset;
14890   unsigned long frame_reg;
14891   unsigned long pc_reg;
14892 } procS;
14893
14894 static procS cur_proc;
14895 static procS *cur_proc_ptr;
14896 static int numprocs;
14897
14898 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14899    nop as "0".  */
14900
14901 char
14902 mips_nop_opcode (void)
14903 {
14904   return seg_info (now_seg)->tc_segment_info_data.mips16;
14905 }
14906
14907 /* Fill in an rs_align_code fragment.  This only needs to do something
14908    for MIPS16 code, where 0 is not a nop.  */
14909
14910 void
14911 mips_handle_align (fragS *fragp)
14912 {
14913   char *p;
14914   int bytes, size, excess;
14915   valueT opcode;
14916
14917   if (fragp->fr_type != rs_align_code)
14918     return;
14919
14920   p = fragp->fr_literal + fragp->fr_fix;
14921   if (*p)
14922     {
14923       opcode = mips16_nop_insn.insn_opcode;
14924       size = 2;
14925     }
14926   else
14927     {
14928       opcode = nop_insn.insn_opcode;
14929       size = 4;
14930     }
14931
14932   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14933   excess = bytes % size;
14934   if (excess != 0)
14935     {
14936       /* If we're not inserting a whole number of instructions,
14937          pad the end of the fixed part of the frag with zeros.  */
14938       memset (p, 0, excess);
14939       p += excess;
14940       fragp->fr_fix += excess;
14941     }
14942
14943   md_number_to_chars (p, opcode, size);
14944   fragp->fr_var = size;
14945 }
14946
14947 static void
14948 md_obj_begin (void)
14949 {
14950 }
14951
14952 static void
14953 md_obj_end (void)
14954 {
14955   /* Check for premature end, nesting errors, etc.  */
14956   if (cur_proc_ptr)
14957     as_warn (_("missing .end at end of assembly"));
14958 }
14959
14960 static long
14961 get_number (void)
14962 {
14963   int negative = 0;
14964   long val = 0;
14965
14966   if (*input_line_pointer == '-')
14967     {
14968       ++input_line_pointer;
14969       negative = 1;
14970     }
14971   if (!ISDIGIT (*input_line_pointer))
14972     as_bad (_("expected simple number"));
14973   if (input_line_pointer[0] == '0')
14974     {
14975       if (input_line_pointer[1] == 'x')
14976         {
14977           input_line_pointer += 2;
14978           while (ISXDIGIT (*input_line_pointer))
14979             {
14980               val <<= 4;
14981               val |= hex_value (*input_line_pointer++);
14982             }
14983           return negative ? -val : val;
14984         }
14985       else
14986         {
14987           ++input_line_pointer;
14988           while (ISDIGIT (*input_line_pointer))
14989             {
14990               val <<= 3;
14991               val |= *input_line_pointer++ - '0';
14992             }
14993           return negative ? -val : val;
14994         }
14995     }
14996   if (!ISDIGIT (*input_line_pointer))
14997     {
14998       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14999               *input_line_pointer, *input_line_pointer);
15000       as_warn (_("invalid number"));
15001       return -1;
15002     }
15003   while (ISDIGIT (*input_line_pointer))
15004     {
15005       val *= 10;
15006       val += *input_line_pointer++ - '0';
15007     }
15008   return negative ? -val : val;
15009 }
15010
15011 /* The .file directive; just like the usual .file directive, but there
15012    is an initial number which is the ECOFF file index.  In the non-ECOFF
15013    case .file implies DWARF-2.  */
15014
15015 static void
15016 s_mips_file (int x ATTRIBUTE_UNUSED)
15017 {
15018   static int first_file_directive = 0;
15019
15020   if (ECOFF_DEBUGGING)
15021     {
15022       get_number ();
15023       s_app_file (0);
15024     }
15025   else
15026     {
15027       char *filename;
15028
15029       filename = dwarf2_directive_file (0);
15030
15031       /* Versions of GCC up to 3.1 start files with a ".file"
15032          directive even for stabs output.  Make sure that this
15033          ".file" is handled.  Note that you need a version of GCC
15034          after 3.1 in order to support DWARF-2 on MIPS.  */
15035       if (filename != NULL && ! first_file_directive)
15036         {
15037           (void) new_logical_line (filename, -1);
15038           s_app_file_string (filename, 0);
15039         }
15040       first_file_directive = 1;
15041     }
15042 }
15043
15044 /* The .loc directive, implying DWARF-2.  */
15045
15046 static void
15047 s_mips_loc (int x ATTRIBUTE_UNUSED)
15048 {
15049   if (!ECOFF_DEBUGGING)
15050     dwarf2_directive_loc (0);
15051 }
15052
15053 /* The .end directive.  */
15054
15055 static void
15056 s_mips_end (int x ATTRIBUTE_UNUSED)
15057 {
15058   symbolS *p;
15059
15060   /* Following functions need their own .frame and .cprestore directives.  */
15061   mips_frame_reg_valid = 0;
15062   mips_cprestore_valid = 0;
15063
15064   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15065     {
15066       p = get_symbol ();
15067       demand_empty_rest_of_line ();
15068     }
15069   else
15070     p = NULL;
15071
15072   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15073     as_warn (_(".end not in text section"));
15074
15075   if (!cur_proc_ptr)
15076     {
15077       as_warn (_(".end directive without a preceding .ent directive."));
15078       demand_empty_rest_of_line ();
15079       return;
15080     }
15081
15082   if (p != NULL)
15083     {
15084       gas_assert (S_GET_NAME (p));
15085       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15086         as_warn (_(".end symbol does not match .ent symbol."));
15087
15088       if (debug_type == DEBUG_STABS)
15089         stabs_generate_asm_endfunc (S_GET_NAME (p),
15090                                     S_GET_NAME (p));
15091     }
15092   else
15093     as_warn (_(".end directive missing or unknown symbol"));
15094
15095 #ifdef OBJ_ELF
15096   /* Create an expression to calculate the size of the function.  */
15097   if (p && cur_proc_ptr)
15098     {
15099       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15100       expressionS *exp = xmalloc (sizeof (expressionS));
15101
15102       obj->size = exp;
15103       exp->X_op = O_subtract;
15104       exp->X_add_symbol = symbol_temp_new_now ();
15105       exp->X_op_symbol = p;
15106       exp->X_add_number = 0;
15107
15108       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15109     }
15110
15111   /* Generate a .pdr section.  */
15112   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15113     {
15114       segT saved_seg = now_seg;
15115       subsegT saved_subseg = now_subseg;
15116       expressionS exp;
15117       char *fragp;
15118
15119 #ifdef md_flush_pending_output
15120       md_flush_pending_output ();
15121 #endif
15122
15123       gas_assert (pdr_seg);
15124       subseg_set (pdr_seg, 0);
15125
15126       /* Write the symbol.  */
15127       exp.X_op = O_symbol;
15128       exp.X_add_symbol = p;
15129       exp.X_add_number = 0;
15130       emit_expr (&exp, 4);
15131
15132       fragp = frag_more (7 * 4);
15133
15134       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15135       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15136       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15137       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15138       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15139       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15140       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15141
15142       subseg_set (saved_seg, saved_subseg);
15143     }
15144 #endif /* OBJ_ELF */
15145
15146   cur_proc_ptr = NULL;
15147 }
15148
15149 /* The .aent and .ent directives.  */
15150
15151 static void
15152 s_mips_ent (int aent)
15153 {
15154   symbolS *symbolP;
15155
15156   symbolP = get_symbol ();
15157   if (*input_line_pointer == ',')
15158     ++input_line_pointer;
15159   SKIP_WHITESPACE ();
15160   if (ISDIGIT (*input_line_pointer)
15161       || *input_line_pointer == '-')
15162     get_number ();
15163
15164   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15165     as_warn (_(".ent or .aent not in text section."));
15166
15167   if (!aent && cur_proc_ptr)
15168     as_warn (_("missing .end"));
15169
15170   if (!aent)
15171     {
15172       /* This function needs its own .frame and .cprestore directives.  */
15173       mips_frame_reg_valid = 0;
15174       mips_cprestore_valid = 0;
15175
15176       cur_proc_ptr = &cur_proc;
15177       memset (cur_proc_ptr, '\0', sizeof (procS));
15178
15179       cur_proc_ptr->func_sym = symbolP;
15180
15181       ++numprocs;
15182
15183       if (debug_type == DEBUG_STABS)
15184         stabs_generate_asm_func (S_GET_NAME (symbolP),
15185                                  S_GET_NAME (symbolP));
15186     }
15187
15188   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15189
15190   demand_empty_rest_of_line ();
15191 }
15192
15193 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15194    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15195    s_mips_frame is used so that we can set the PDR information correctly.
15196    We can't use the ecoff routines because they make reference to the ecoff
15197    symbol table (in the mdebug section).  */
15198
15199 static void
15200 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15201 {
15202 #ifdef OBJ_ELF
15203   if (IS_ELF && !ECOFF_DEBUGGING)
15204     {
15205       long val;
15206
15207       if (cur_proc_ptr == (procS *) NULL)
15208         {
15209           as_warn (_(".frame outside of .ent"));
15210           demand_empty_rest_of_line ();
15211           return;
15212         }
15213
15214       cur_proc_ptr->frame_reg = tc_get_register (1);
15215
15216       SKIP_WHITESPACE ();
15217       if (*input_line_pointer++ != ','
15218           || get_absolute_expression_and_terminator (&val) != ',')
15219         {
15220           as_warn (_("Bad .frame directive"));
15221           --input_line_pointer;
15222           demand_empty_rest_of_line ();
15223           return;
15224         }
15225
15226       cur_proc_ptr->frame_offset = val;
15227       cur_proc_ptr->pc_reg = tc_get_register (0);
15228
15229       demand_empty_rest_of_line ();
15230     }
15231   else
15232 #endif /* OBJ_ELF */
15233     s_ignore (ignore);
15234 }
15235
15236 /* The .fmask and .mask directives. If the mdebug section is present
15237    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15238    embedded targets, s_mips_mask is used so that we can set the PDR
15239    information correctly. We can't use the ecoff routines because they
15240    make reference to the ecoff symbol table (in the mdebug section).  */
15241
15242 static void
15243 s_mips_mask (int reg_type)
15244 {
15245 #ifdef OBJ_ELF
15246   if (IS_ELF && !ECOFF_DEBUGGING)
15247     {
15248       long mask, off;
15249
15250       if (cur_proc_ptr == (procS *) NULL)
15251         {
15252           as_warn (_(".mask/.fmask outside of .ent"));
15253           demand_empty_rest_of_line ();
15254           return;
15255         }
15256
15257       if (get_absolute_expression_and_terminator (&mask) != ',')
15258         {
15259           as_warn (_("Bad .mask/.fmask directive"));
15260           --input_line_pointer;
15261           demand_empty_rest_of_line ();
15262           return;
15263         }
15264
15265       off = get_absolute_expression ();
15266
15267       if (reg_type == 'F')
15268         {
15269           cur_proc_ptr->fpreg_mask = mask;
15270           cur_proc_ptr->fpreg_offset = off;
15271         }
15272       else
15273         {
15274           cur_proc_ptr->reg_mask = mask;
15275           cur_proc_ptr->reg_offset = off;
15276         }
15277
15278       demand_empty_rest_of_line ();
15279     }
15280   else
15281 #endif /* OBJ_ELF */
15282     s_ignore (reg_type);
15283 }
15284
15285 /* A table describing all the processors gas knows about.  Names are
15286    matched in the order listed.
15287
15288    To ease comparison, please keep this table in the same order as
15289    gcc's mips_cpu_info_table[].  */
15290 static const struct mips_cpu_info mips_cpu_info_table[] =
15291 {
15292   /* Entries for generic ISAs */
15293   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15294   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15295   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15296   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15297   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15298   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15299   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15300   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15301   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15302
15303   /* MIPS I */
15304   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15305   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15306   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15307
15308   /* MIPS II */
15309   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15310
15311   /* MIPS III */
15312   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15313   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15314   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15315   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15316   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15317   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15318   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15319   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15320   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15321   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15322   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15323   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15324   /* ST Microelectronics Loongson 2E and 2F cores */
15325   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15326   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15327
15328   /* MIPS IV */
15329   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15330   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15331   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15332   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15333   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15334   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15335   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15336   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15337   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15338   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15339   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15340   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15341   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15342   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15343   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15344
15345   /* MIPS 32 */
15346   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15347   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15348   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15349   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15350
15351   /* MIPS 32 Release 2 */
15352   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15353   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15354   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15355   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15356   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15357   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15358   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15359   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15360   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15361   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15362   /* Deprecated forms of the above.  */
15363   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15364   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15365   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15366   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15367   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15368   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15369   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15370   /* Deprecated forms of the above.  */
15371   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15372   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15373   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15374   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15375                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15376   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15377                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15378   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15379                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15380   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15381                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15382   /* Deprecated forms of the above.  */
15383   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15384                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15385   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15386                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15387   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15388   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15389                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15390   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15391                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15392   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15393                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15394   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15395                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15396   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15397                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15398   /* Deprecated forms of the above.  */
15399   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15400                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15401   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15402                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15403   /* 1004K cores are multiprocessor versions of the 34K.  */
15404   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15405                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15406   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15407                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15408   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15409                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15410   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15411                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15412
15413   /* MIPS 64 */
15414   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15415   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15416   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15417   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15418
15419   /* Broadcom SB-1 CPU core */
15420   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15421                                                 ISA_MIPS64,     CPU_SB1 },
15422   /* Broadcom SB-1A CPU core */
15423   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15424                                                 ISA_MIPS64,     CPU_SB1 },
15425
15426   /* MIPS 64 Release 2 */
15427
15428   /* Cavium Networks Octeon CPU core */
15429   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15430
15431   /* RMI Xlr */
15432   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15433
15434   /* End marker */
15435   { NULL, 0, 0, 0 }
15436 };
15437
15438
15439 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15440    with a final "000" replaced by "k".  Ignore case.
15441
15442    Note: this function is shared between GCC and GAS.  */
15443
15444 static bfd_boolean
15445 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15446 {
15447   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15448     given++, canonical++;
15449
15450   return ((*given == 0 && *canonical == 0)
15451           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15452 }
15453
15454
15455 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15456    CPU name.  We've traditionally allowed a lot of variation here.
15457
15458    Note: this function is shared between GCC and GAS.  */
15459
15460 static bfd_boolean
15461 mips_matching_cpu_name_p (const char *canonical, const char *given)
15462 {
15463   /* First see if the name matches exactly, or with a final "000"
15464      turned into "k".  */
15465   if (mips_strict_matching_cpu_name_p (canonical, given))
15466     return TRUE;
15467
15468   /* If not, try comparing based on numerical designation alone.
15469      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15470   if (TOLOWER (*given) == 'r')
15471     given++;
15472   if (!ISDIGIT (*given))
15473     return FALSE;
15474
15475   /* Skip over some well-known prefixes in the canonical name,
15476      hoping to find a number there too.  */
15477   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15478     canonical += 2;
15479   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15480     canonical += 2;
15481   else if (TOLOWER (canonical[0]) == 'r')
15482     canonical += 1;
15483
15484   return mips_strict_matching_cpu_name_p (canonical, given);
15485 }
15486
15487
15488 /* Parse an option that takes the name of a processor as its argument.
15489    OPTION is the name of the option and CPU_STRING is the argument.
15490    Return the corresponding processor enumeration if the CPU_STRING is
15491    recognized, otherwise report an error and return null.
15492
15493    A similar function exists in GCC.  */
15494
15495 static const struct mips_cpu_info *
15496 mips_parse_cpu (const char *option, const char *cpu_string)
15497 {
15498   const struct mips_cpu_info *p;
15499
15500   /* 'from-abi' selects the most compatible architecture for the given
15501      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15502      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15503      version.  Look first at the -mgp options, if given, otherwise base
15504      the choice on MIPS_DEFAULT_64BIT.
15505
15506      Treat NO_ABI like the EABIs.  One reason to do this is that the
15507      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15508      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15509      'mips64', just as we did in the days before 'from-abi'.  */
15510   if (strcasecmp (cpu_string, "from-abi") == 0)
15511     {
15512       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15513         return mips_cpu_info_from_isa (ISA_MIPS1);
15514
15515       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15516         return mips_cpu_info_from_isa (ISA_MIPS3);
15517
15518       if (file_mips_gp32 >= 0)
15519         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15520
15521       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15522                                      ? ISA_MIPS3
15523                                      : ISA_MIPS1);
15524     }
15525
15526   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15527   if (strcasecmp (cpu_string, "default") == 0)
15528     return 0;
15529
15530   for (p = mips_cpu_info_table; p->name != 0; p++)
15531     if (mips_matching_cpu_name_p (p->name, cpu_string))
15532       return p;
15533
15534   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15535   return 0;
15536 }
15537
15538 /* Return the canonical processor information for ISA (a member of the
15539    ISA_MIPS* enumeration).  */
15540
15541 static const struct mips_cpu_info *
15542 mips_cpu_info_from_isa (int isa)
15543 {
15544   int i;
15545
15546   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15547     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15548         && isa == mips_cpu_info_table[i].isa)
15549       return (&mips_cpu_info_table[i]);
15550
15551   return NULL;
15552 }
15553
15554 static const struct mips_cpu_info *
15555 mips_cpu_info_from_arch (int arch)
15556 {
15557   int i;
15558
15559   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15560     if (arch == mips_cpu_info_table[i].cpu)
15561       return (&mips_cpu_info_table[i]);
15562
15563   return NULL;
15564 }
15565 \f
15566 static void
15567 show (FILE *stream, const char *string, int *col_p, int *first_p)
15568 {
15569   if (*first_p)
15570     {
15571       fprintf (stream, "%24s", "");
15572       *col_p = 24;
15573     }
15574   else
15575     {
15576       fprintf (stream, ", ");
15577       *col_p += 2;
15578     }
15579
15580   if (*col_p + strlen (string) > 72)
15581     {
15582       fprintf (stream, "\n%24s", "");
15583       *col_p = 24;
15584     }
15585
15586   fprintf (stream, "%s", string);
15587   *col_p += strlen (string);
15588
15589   *first_p = 0;
15590 }
15591
15592 void
15593 md_show_usage (FILE *stream)
15594 {
15595   int column, first;
15596   size_t i;
15597
15598   fprintf (stream, _("\
15599 MIPS options:\n\
15600 -EB                     generate big endian output\n\
15601 -EL                     generate little endian output\n\
15602 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15603 -G NUM                  allow referencing objects up to NUM bytes\n\
15604                         implicitly with the gp register [default 8]\n"));
15605   fprintf (stream, _("\
15606 -mips1                  generate MIPS ISA I instructions\n\
15607 -mips2                  generate MIPS ISA II instructions\n\
15608 -mips3                  generate MIPS ISA III instructions\n\
15609 -mips4                  generate MIPS ISA IV instructions\n\
15610 -mips5                  generate MIPS ISA V instructions\n\
15611 -mips32                 generate MIPS32 ISA instructions\n\
15612 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15613 -mips64                 generate MIPS64 ISA instructions\n\
15614 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15615 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15616
15617   first = 1;
15618
15619   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15620     show (stream, mips_cpu_info_table[i].name, &column, &first);
15621   show (stream, "from-abi", &column, &first);
15622   fputc ('\n', stream);
15623
15624   fprintf (stream, _("\
15625 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15626 -no-mCPU                don't generate code specific to CPU.\n\
15627                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15628
15629   first = 1;
15630
15631   show (stream, "3900", &column, &first);
15632   show (stream, "4010", &column, &first);
15633   show (stream, "4100", &column, &first);
15634   show (stream, "4650", &column, &first);
15635   fputc ('\n', stream);
15636
15637   fprintf (stream, _("\
15638 -mips16                 generate mips16 instructions\n\
15639 -no-mips16              do not generate mips16 instructions\n"));
15640   fprintf (stream, _("\
15641 -msmartmips             generate smartmips instructions\n\
15642 -mno-smartmips          do not generate smartmips instructions\n"));  
15643   fprintf (stream, _("\
15644 -mdsp                   generate DSP instructions\n\
15645 -mno-dsp                do not generate DSP instructions\n"));
15646   fprintf (stream, _("\
15647 -mdspr2                 generate DSP R2 instructions\n\
15648 -mno-dspr2              do not generate DSP R2 instructions\n"));
15649   fprintf (stream, _("\
15650 -mmt                    generate MT instructions\n\
15651 -mno-mt                 do not generate MT instructions\n"));
15652   fprintf (stream, _("\
15653 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15654 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15655 -mfix-vr4120            work around certain VR4120 errata\n\
15656 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15657 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15658 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15659 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15660 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15661 -msym32                 assume all symbols have 32-bit values\n\
15662 -O0                     remove unneeded NOPs, do not swap branches\n\
15663 -O                      remove unneeded NOPs and swap branches\n\
15664 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15665 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15666   fprintf (stream, _("\
15667 -mhard-float            allow floating-point instructions\n\
15668 -msoft-float            do not allow floating-point instructions\n\
15669 -msingle-float          only allow 32-bit floating-point operations\n\
15670 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15671 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15672                      ));
15673 #ifdef OBJ_ELF
15674   fprintf (stream, _("\
15675 -KPIC, -call_shared     generate SVR4 position independent code\n\
15676 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15677 -mvxworks-pic           generate VxWorks position independent code\n\
15678 -non_shared             do not generate code that can operate with DSOs\n\
15679 -xgot                   assume a 32 bit GOT\n\
15680 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15681 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15682                         position dependent (non shared) code\n\
15683 -mabi=ABI               create ABI conformant object file for:\n"));
15684
15685   first = 1;
15686
15687   show (stream, "32", &column, &first);
15688   show (stream, "o64", &column, &first);
15689   show (stream, "n32", &column, &first);
15690   show (stream, "64", &column, &first);
15691   show (stream, "eabi", &column, &first);
15692
15693   fputc ('\n', stream);
15694
15695   fprintf (stream, _("\
15696 -32                     create o32 ABI object file (default)\n\
15697 -n32                    create n32 ABI object file\n\
15698 -64                     create 64 ABI object file\n"));
15699 #endif
15700 }
15701
15702 #ifdef TE_IRIX
15703 enum dwarf2_format
15704 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15705 {
15706   if (HAVE_64BIT_SYMBOLS)
15707     return dwarf2_format_64bit_irix;
15708   else
15709     return dwarf2_format_32bit;
15710 }
15711 #endif
15712
15713 int
15714 mips_dwarf2_addr_size (void)
15715 {
15716   if (HAVE_64BIT_OBJECTS)
15717     return 8;
15718   else
15719     return 4;
15720 }
15721
15722 /* Standard calling conventions leave the CFA at SP on entry.  */
15723 void
15724 mips_cfi_frame_initial_instructions (void)
15725 {
15726   cfi_add_CFA_def_cfa_register (SP);
15727 }
15728
15729 int
15730 tc_mips_regname_to_dw2regnum (char *regname)
15731 {
15732   unsigned int regnum = -1;
15733   unsigned int reg;
15734
15735   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15736     regnum = reg;
15737
15738   return regnum;
15739 }