bfd/
[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 any MIPS16 code was produced.  */
286 static int file_ase_mips16;
287
288 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
289                               || mips_opts.isa == ISA_MIPS32R2          \
290                               || mips_opts.isa == ISA_MIPS64            \
291                               || mips_opts.isa == ISA_MIPS64R2)
292
293 /* True if we want to create R_MIPS_JALR for jalr $25.  */
294 #ifdef TE_IRIX
295 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
296 #else
297 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
298    because there's no place for any addend, the only acceptable
299    expression is a bare symbol.  */
300 #define MIPS_JALR_HINT_P(EXPR) \
301   (!HAVE_IN_PLACE_ADDENDS \
302    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
303 #endif
304
305 /* True if -mips3d was passed or implied by arguments passed on the
306    command line (e.g., by -march).  */
307 static int file_ase_mips3d;
308
309 /* True if -mdmx was passed or implied by arguments passed on the
310    command line (e.g., by -march).  */
311 static int file_ase_mdmx;
312
313 /* True if -msmartmips was passed or implied by arguments passed on the
314    command line (e.g., by -march).  */
315 static int file_ase_smartmips;
316
317 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
318                                 || mips_opts.isa == ISA_MIPS32R2)
319
320 /* True if -mdsp was passed or implied by arguments passed on the
321    command line (e.g., by -march).  */
322 static int file_ase_dsp;
323
324 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
325                               || mips_opts.isa == ISA_MIPS64R2)
326
327 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
328
329 /* True if -mdspr2 was passed or implied by arguments passed on the
330    command line (e.g., by -march).  */
331 static int file_ase_dspr2;
332
333 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
334                                 || mips_opts.isa == ISA_MIPS64R2)
335
336 /* True if -mmt was passed or implied by arguments passed on the
337    command line (e.g., by -march).  */
338 static int file_ase_mt;
339
340 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
341                              || mips_opts.isa == ISA_MIPS64R2)
342
343 /* The argument of the -march= flag.  The architecture we are assembling.  */
344 static int file_mips_arch = CPU_UNKNOWN;
345 static const char *mips_arch_string;
346
347 /* The argument of the -mtune= flag.  The architecture for which we
348    are optimizing.  */
349 static int mips_tune = CPU_UNKNOWN;
350 static const char *mips_tune_string;
351
352 /* True when generating 32-bit code for a 64-bit processor.  */
353 static int mips_32bitmode = 0;
354
355 /* True if the given ABI requires 32-bit registers.  */
356 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
357
358 /* Likewise 64-bit registers.  */
359 #define ABI_NEEDS_64BIT_REGS(ABI)       \
360   ((ABI) == N32_ABI                     \
361    || (ABI) == N64_ABI                  \
362    || (ABI) == O64_ABI)
363
364 /*  Return true if ISA supports 64 bit wide gp registers.  */
365 #define ISA_HAS_64BIT_REGS(ISA)         \
366   ((ISA) == ISA_MIPS3                   \
367    || (ISA) == ISA_MIPS4                \
368    || (ISA) == ISA_MIPS5                \
369    || (ISA) == ISA_MIPS64               \
370    || (ISA) == ISA_MIPS64R2)
371
372 /*  Return true if ISA supports 64 bit wide float registers.  */
373 #define ISA_HAS_64BIT_FPRS(ISA)         \
374   ((ISA) == ISA_MIPS3                   \
375    || (ISA) == ISA_MIPS4                \
376    || (ISA) == ISA_MIPS5                \
377    || (ISA) == ISA_MIPS32R2             \
378    || (ISA) == ISA_MIPS64               \
379    || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports 64-bit right rotate (dror et al.)
382    instructions.  */
383 #define ISA_HAS_DROR(ISA)               \
384   ((ISA) == ISA_MIPS64R2)
385
386 /* Return true if ISA supports 32-bit right rotate (ror et al.)
387    instructions.  */
388 #define ISA_HAS_ROR(ISA)                \
389   ((ISA) == ISA_MIPS32R2                \
390    || (ISA) == ISA_MIPS64R2             \
391    || mips_opts.ase_smartmips)
392
393 /* Return true if ISA supports single-precision floats in odd registers.  */
394 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
395   ((ISA) == ISA_MIPS32                  \
396    || (ISA) == ISA_MIPS32R2             \
397    || (ISA) == ISA_MIPS64               \
398    || (ISA) == ISA_MIPS64R2)
399
400 /* Return true if ISA supports move to/from high part of a 64-bit
401    floating-point register. */
402 #define ISA_HAS_MXHC1(ISA)              \
403   ((ISA) == ISA_MIPS32R2                \
404    || (ISA) == ISA_MIPS64R2)
405
406 #define HAVE_32BIT_GPRS                            \
407     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
408
409 #define HAVE_32BIT_FPRS                            \
410     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
411
412 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
413 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
414
415 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
416
417 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
418
419 /* True if relocations are stored in-place.  */
420 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
421
422 /* The ABI-derived address size.  */
423 #define HAVE_64BIT_ADDRESSES \
424   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
425 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
426
427 /* The size of symbolic constants (i.e., expressions of the form
428    "SYMBOL" or "SYMBOL + OFFSET").  */
429 #define HAVE_32BIT_SYMBOLS \
430   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
431 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
432
433 /* Addresses are loaded in different ways, depending on the address size
434    in use.  The n32 ABI Documentation also mandates the use of additions
435    with overflow checking, but existing implementations don't follow it.  */
436 #define ADDRESS_ADD_INSN                                                \
437    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
438
439 #define ADDRESS_ADDI_INSN                                               \
440    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
441
442 #define ADDRESS_LOAD_INSN                                               \
443    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
444
445 #define ADDRESS_STORE_INSN                                              \
446    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
447
448 /* Return true if the given CPU supports the MIPS16 ASE.  */
449 #define CPU_HAS_MIPS16(cpu)                                             \
450    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
451     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
452
453 /* True if CPU has a dror instruction.  */
454 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
455
456 /* True if CPU has a ror instruction.  */
457 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
458
459 /* True if CPU has seq/sne and seqi/snei instructions.  */
460 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
461
462 /* True if CPU does not implement the all the coprocessor insns.  For these
463    CPUs only those COP insns are accepted that are explicitly marked to be
464    available on the CPU.  ISA membership for COP insns is ignored.  */
465 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
466
467 /* True if mflo and mfhi can be immediately followed by instructions
468    which write to the HI and LO registers.
469
470    According to MIPS specifications, MIPS ISAs I, II, and III need
471    (at least) two instructions between the reads of HI/LO and
472    instructions which write them, and later ISAs do not.  Contradicting
473    the MIPS specifications, some MIPS IV processor user manuals (e.g.
474    the UM for the NEC Vr5000) document needing the instructions between
475    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
476    MIPS64 and later ISAs to have the interlocks, plus any specific
477    earlier-ISA CPUs for which CPU documentation declares that the
478    instructions are really interlocked.  */
479 #define hilo_interlocks \
480   (mips_opts.isa == ISA_MIPS32                        \
481    || mips_opts.isa == ISA_MIPS32R2                   \
482    || mips_opts.isa == ISA_MIPS64                     \
483    || mips_opts.isa == ISA_MIPS64R2                   \
484    || mips_opts.arch == CPU_R4010                     \
485    || mips_opts.arch == CPU_R10000                    \
486    || mips_opts.arch == CPU_R12000                    \
487    || mips_opts.arch == CPU_R14000                    \
488    || mips_opts.arch == CPU_R16000                    \
489    || mips_opts.arch == CPU_RM7000                    \
490    || mips_opts.arch == CPU_VR5500                    \
491    )
492
493 /* Whether the processor uses hardware interlocks to protect reads
494    from the GPRs after they are loaded from memory, and thus does not
495    require nops to be inserted.  This applies to instructions marked
496    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
497    level I.  */
498 #define gpr_interlocks \
499   (mips_opts.isa != ISA_MIPS1  \
500    || mips_opts.arch == CPU_R3900)
501
502 /* Whether the processor uses hardware interlocks to avoid delays
503    required by coprocessor instructions, and thus does not require
504    nops to be inserted.  This applies to instructions marked
505    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
506    between instructions marked INSN_WRITE_COND_CODE and ones marked
507    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
508    levels I, II, and III.  */
509 /* Itbl support may require additional care here.  */
510 #define cop_interlocks                                \
511   ((mips_opts.isa != ISA_MIPS1                        \
512     && mips_opts.isa != ISA_MIPS2                     \
513     && mips_opts.isa != ISA_MIPS3)                    \
514    || mips_opts.arch == CPU_R4300                     \
515    )
516
517 /* Whether the processor uses hardware interlocks to protect reads
518    from coprocessor registers after they are loaded from memory, and
519    thus does not require nops to be inserted.  This applies to
520    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
521    requires at MIPS ISA level I.  */
522 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
523
524 /* Is this a mfhi or mflo instruction?  */
525 #define MF_HILO_INSN(PINFO) \
526   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
527
528 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
529    or writing the condition code is only possible on the coprocessors and
530    these insns are not marked with INSN_COP.  Thus for these insns use the
531    condition-code flags.  */
532 #define COP_INSN(PINFO)                                                 \
533   (PINFO != INSN_MACRO                                                  \
534    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
535    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
536
537 /* MIPS PIC level.  */
538
539 enum mips_pic_level mips_pic;
540
541 /* 1 if we should generate 32 bit offsets from the $gp register in
542    SVR4_PIC mode.  Currently has no meaning in other modes.  */
543 static int mips_big_got = 0;
544
545 /* 1 if trap instructions should used for overflow rather than break
546    instructions.  */
547 static int mips_trap = 0;
548
549 /* 1 if double width floating point constants should not be constructed
550    by assembling two single width halves into two single width floating
551    point registers which just happen to alias the double width destination
552    register.  On some architectures this aliasing can be disabled by a bit
553    in the status register, and the setting of this bit cannot be determined
554    automatically at assemble time.  */
555 static int mips_disable_float_construction;
556
557 /* Non-zero if any .set noreorder directives were used.  */
558
559 static int mips_any_noreorder;
560
561 /* Non-zero if nops should be inserted when the register referenced in
562    an mfhi/mflo instruction is read in the next two instructions.  */
563 static int mips_7000_hilo_fix;
564
565 /* The size of objects in the small data section.  */
566 static unsigned int g_switch_value = 8;
567 /* Whether the -G option was used.  */
568 static int g_switch_seen = 0;
569
570 #define N_RMASK 0xc4
571 #define N_VFP   0xd4
572
573 /* If we can determine in advance that GP optimization won't be
574    possible, we can skip the relaxation stuff that tries to produce
575    GP-relative references.  This makes delay slot optimization work
576    better.
577
578    This function can only provide a guess, but it seems to work for
579    gcc output.  It needs to guess right for gcc, otherwise gcc
580    will put what it thinks is a GP-relative instruction in a branch
581    delay slot.
582
583    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
584    fixed it for the non-PIC mode.  KR 95/04/07  */
585 static int nopic_need_relax (symbolS *, int);
586
587 /* handle of the OPCODE hash table */
588 static struct hash_control *op_hash = NULL;
589
590 /* The opcode hash table we use for the mips16.  */
591 static struct hash_control *mips16_op_hash = NULL;
592
593 /* This array holds the chars that always start a comment.  If the
594     pre-processor is disabled, these aren't very useful */
595 const char comment_chars[] = "#";
596
597 /* This array holds the chars that only start a comment at the beginning of
598    a line.  If the line seems to have the form '# 123 filename'
599    .line and .file directives will appear in the pre-processed output */
600 /* Note that input_file.c hand checks for '#' at the beginning of the
601    first line of the input file.  This is because the compiler outputs
602    #NO_APP at the beginning of its output.  */
603 /* Also note that C style comments are always supported.  */
604 const char line_comment_chars[] = "#";
605
606 /* This array holds machine specific line separator characters.  */
607 const char line_separator_chars[] = ";";
608
609 /* Chars that can be used to separate mant from exp in floating point nums */
610 const char EXP_CHARS[] = "eE";
611
612 /* Chars that mean this number is a floating point constant */
613 /* As in 0f12.456 */
614 /* or    0d1.2345e12 */
615 const char FLT_CHARS[] = "rRsSfFdDxXpP";
616
617 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
618    changed in read.c .  Ideally it shouldn't have to know about it at all,
619    but nothing is ideal around here.
620  */
621
622 static char *insn_error;
623
624 static int auto_align = 1;
625
626 /* When outputting SVR4 PIC code, the assembler needs to know the
627    offset in the stack frame from which to restore the $gp register.
628    This is set by the .cprestore pseudo-op, and saved in this
629    variable.  */
630 static offsetT mips_cprestore_offset = -1;
631
632 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
633    more optimizations, it can use a register value instead of a memory-saved
634    offset and even an other register than $gp as global pointer.  */
635 static offsetT mips_cpreturn_offset = -1;
636 static int mips_cpreturn_register = -1;
637 static int mips_gp_register = GP;
638 static int mips_gprel_offset = 0;
639
640 /* Whether mips_cprestore_offset has been set in the current function
641    (or whether it has already been warned about, if not).  */
642 static int mips_cprestore_valid = 0;
643
644 /* This is the register which holds the stack frame, as set by the
645    .frame pseudo-op.  This is needed to implement .cprestore.  */
646 static int mips_frame_reg = SP;
647
648 /* Whether mips_frame_reg has been set in the current function
649    (or whether it has already been warned about, if not).  */
650 static int mips_frame_reg_valid = 0;
651
652 /* To output NOP instructions correctly, we need to keep information
653    about the previous two instructions.  */
654
655 /* Whether we are optimizing.  The default value of 2 means to remove
656    unneeded NOPs and swap branch instructions when possible.  A value
657    of 1 means to not swap branches.  A value of 0 means to always
658    insert NOPs.  */
659 static int mips_optimize = 2;
660
661 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
662    equivalent to seeing no -g option at all.  */
663 static int mips_debug = 0;
664
665 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
666 #define MAX_VR4130_NOPS 4
667
668 /* The maximum number of NOPs needed to fill delay slots.  */
669 #define MAX_DELAY_NOPS 2
670
671 /* The maximum number of NOPs needed for any purpose.  */
672 #define MAX_NOPS 4
673
674 /* A list of previous instructions, with index 0 being the most recent.
675    We need to look back MAX_NOPS instructions when filling delay slots
676    or working around processor errata.  We need to look back one
677    instruction further if we're thinking about using history[0] to
678    fill a branch delay slot.  */
679 static struct mips_cl_insn history[1 + MAX_NOPS];
680
681 /* Nop instructions used by emit_nop.  */
682 static struct mips_cl_insn nop_insn, mips16_nop_insn;
683
684 /* The appropriate nop for the current mode.  */
685 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
686
687 /* If this is set, it points to a frag holding nop instructions which
688    were inserted before the start of a noreorder section.  If those
689    nops turn out to be unnecessary, the size of the frag can be
690    decreased.  */
691 static fragS *prev_nop_frag;
692
693 /* The number of nop instructions we created in prev_nop_frag.  */
694 static int prev_nop_frag_holds;
695
696 /* The number of nop instructions that we know we need in
697    prev_nop_frag.  */
698 static int prev_nop_frag_required;
699
700 /* The number of instructions we've seen since prev_nop_frag.  */
701 static int prev_nop_frag_since;
702
703 /* For ECOFF and ELF, relocations against symbols are done in two
704    parts, with a HI relocation and a LO relocation.  Each relocation
705    has only 16 bits of space to store an addend.  This means that in
706    order for the linker to handle carries correctly, it must be able
707    to locate both the HI and the LO relocation.  This means that the
708    relocations must appear in order in the relocation table.
709
710    In order to implement this, we keep track of each unmatched HI
711    relocation.  We then sort them so that they immediately precede the
712    corresponding LO relocation.  */
713
714 struct mips_hi_fixup
715 {
716   /* Next HI fixup.  */
717   struct mips_hi_fixup *next;
718   /* This fixup.  */
719   fixS *fixp;
720   /* The section this fixup is in.  */
721   segT seg;
722 };
723
724 /* The list of unmatched HI relocs.  */
725
726 static struct mips_hi_fixup *mips_hi_fixup_list;
727
728 /* The frag containing the last explicit relocation operator.
729    Null if explicit relocations have not been used.  */
730
731 static fragS *prev_reloc_op_frag;
732
733 /* Map normal MIPS register numbers to mips16 register numbers.  */
734
735 #define X ILLEGAL_REG
736 static const int mips32_to_16_reg_map[] =
737 {
738   X, X, 2, 3, 4, 5, 6, 7,
739   X, X, X, X, X, X, X, X,
740   0, 1, X, X, X, X, X, X,
741   X, X, X, X, X, X, X, X
742 };
743 #undef X
744
745 /* Map mips16 register numbers to normal MIPS register numbers.  */
746
747 static const unsigned int mips16_to_32_reg_map[] =
748 {
749   16, 17, 2, 3, 4, 5, 6, 7
750 };
751
752 /* Classifies the kind of instructions we're interested in when
753    implementing -mfix-vr4120.  */
754 enum fix_vr4120_class
755 {
756   FIX_VR4120_MACC,
757   FIX_VR4120_DMACC,
758   FIX_VR4120_MULT,
759   FIX_VR4120_DMULT,
760   FIX_VR4120_DIV,
761   FIX_VR4120_MTHILO,
762   NUM_FIX_VR4120_CLASSES
763 };
764
765 /* ...likewise -mfix-loongson2f-jump.  */
766 static bfd_boolean mips_fix_loongson2f_jump;
767
768 /* ...likewise -mfix-loongson2f-nop.  */
769 static bfd_boolean mips_fix_loongson2f_nop;
770
771 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
772 static bfd_boolean mips_fix_loongson2f;
773
774 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
775    there must be at least one other instruction between an instruction
776    of type X and an instruction of type Y.  */
777 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
778
779 /* True if -mfix-vr4120 is in force.  */
780 static int mips_fix_vr4120;
781
782 /* ...likewise -mfix-vr4130.  */
783 static int mips_fix_vr4130;
784
785 /* ...likewise -mfix-24k.  */
786 static int mips_fix_24k;
787
788 /* ...likewise -mfix-cn63xxp1 */
789 static bfd_boolean mips_fix_cn63xxp1;
790
791 /* We don't relax branches by default, since this causes us to expand
792    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
793    fail to compute the offset before expanding the macro to the most
794    efficient expansion.  */
795
796 static int mips_relax_branch;
797 \f
798 /* The expansion of many macros depends on the type of symbol that
799    they refer to.  For example, when generating position-dependent code,
800    a macro that refers to a symbol may have two different expansions,
801    one which uses GP-relative addresses and one which uses absolute
802    addresses.  When generating SVR4-style PIC, a macro may have
803    different expansions for local and global symbols.
804
805    We handle these situations by generating both sequences and putting
806    them in variant frags.  In position-dependent code, the first sequence
807    will be the GP-relative one and the second sequence will be the
808    absolute one.  In SVR4 PIC, the first sequence will be for global
809    symbols and the second will be for local symbols.
810
811    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
812    SECOND are the lengths of the two sequences in bytes.  These fields
813    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
814    the subtype has the following flags:
815
816    RELAX_USE_SECOND
817         Set if it has been decided that we should use the second
818         sequence instead of the first.
819
820    RELAX_SECOND_LONGER
821         Set in the first variant frag if the macro's second implementation
822         is longer than its first.  This refers to the macro as a whole,
823         not an individual relaxation.
824
825    RELAX_NOMACRO
826         Set in the first variant frag if the macro appeared in a .set nomacro
827         block and if one alternative requires a warning but the other does not.
828
829    RELAX_DELAY_SLOT
830         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
831         delay slot.
832
833    The frag's "opcode" points to the first fixup for relaxable code.
834
835    Relaxable macros are generated using a sequence such as:
836
837       relax_start (SYMBOL);
838       ... generate first expansion ...
839       relax_switch ();
840       ... generate second expansion ...
841       relax_end ();
842
843    The code and fixups for the unwanted alternative are discarded
844    by md_convert_frag.  */
845 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
846
847 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
848 #define RELAX_SECOND(X) ((X) & 0xff)
849 #define RELAX_USE_SECOND 0x10000
850 #define RELAX_SECOND_LONGER 0x20000
851 #define RELAX_NOMACRO 0x40000
852 #define RELAX_DELAY_SLOT 0x80000
853
854 /* Branch without likely bit.  If label is out of range, we turn:
855
856         beq reg1, reg2, label
857         delay slot
858
859    into
860
861         bne reg1, reg2, 0f
862         nop
863         j label
864      0: delay slot
865
866    with the following opcode replacements:
867
868         beq <-> bne
869         blez <-> bgtz
870         bltz <-> bgez
871         bc1f <-> bc1t
872
873         bltzal <-> bgezal  (with jal label instead of j label)
874
875    Even though keeping the delay slot instruction in the delay slot of
876    the branch would be more efficient, it would be very tricky to do
877    correctly, because we'd have to introduce a variable frag *after*
878    the delay slot instruction, and expand that instead.  Let's do it
879    the easy way for now, even if the branch-not-taken case now costs
880    one additional instruction.  Out-of-range branches are not supposed
881    to be common, anyway.
882
883    Branch likely.  If label is out of range, we turn:
884
885         beql reg1, reg2, label
886         delay slot (annulled if branch not taken)
887
888    into
889
890         beql reg1, reg2, 1f
891         nop
892         beql $0, $0, 2f
893         nop
894      1: j[al] label
895         delay slot (executed only if branch taken)
896      2:
897
898    It would be possible to generate a shorter sequence by losing the
899    likely bit, generating something like:
900
901         bne reg1, reg2, 0f
902         nop
903         j[al] label
904         delay slot (executed only if branch taken)
905      0:
906
907         beql -> bne
908         bnel -> beq
909         blezl -> bgtz
910         bgtzl -> blez
911         bltzl -> bgez
912         bgezl -> bltz
913         bc1fl -> bc1t
914         bc1tl -> bc1f
915
916         bltzall -> bgezal  (with jal label instead of j label)
917         bgezall -> bltzal  (ditto)
918
919
920    but it's not clear that it would actually improve performance.  */
921 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
922   ((relax_substateT) \
923    (0xc0000000 \
924     | ((toofar) ? 1 : 0) \
925     | ((link) ? 2 : 0) \
926     | ((likely) ? 4 : 0) \
927     | ((uncond) ? 8 : 0)))
928 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
929 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
930 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
931 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
932 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
933
934 /* For mips16 code, we use an entirely different form of relaxation.
935    mips16 supports two versions of most instructions which take
936    immediate values: a small one which takes some small value, and a
937    larger one which takes a 16 bit value.  Since branches also follow
938    this pattern, relaxing these values is required.
939
940    We can assemble both mips16 and normal MIPS code in a single
941    object.  Therefore, we need to support this type of relaxation at
942    the same time that we support the relaxation described above.  We
943    use the high bit of the subtype field to distinguish these cases.
944
945    The information we store for this type of relaxation is the
946    argument code found in the opcode file for this relocation, whether
947    the user explicitly requested a small or extended form, and whether
948    the relocation is in a jump or jal delay slot.  That tells us the
949    size of the value, and how it should be stored.  We also store
950    whether the fragment is considered to be extended or not.  We also
951    store whether this is known to be a branch to a different section,
952    whether we have tried to relax this frag yet, and whether we have
953    ever extended a PC relative fragment because of a shift count.  */
954 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
955   (0x80000000                                                   \
956    | ((type) & 0xff)                                            \
957    | ((small) ? 0x100 : 0)                                      \
958    | ((ext) ? 0x200 : 0)                                        \
959    | ((dslot) ? 0x400 : 0)                                      \
960    | ((jal_dslot) ? 0x800 : 0))
961 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
962 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
963 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
964 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
965 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
966 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
967 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
968 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
969 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
970 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
971 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
972 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
973
974 /* Is the given value a sign-extended 32-bit value?  */
975 #define IS_SEXT_32BIT_NUM(x)                                            \
976   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
977    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
978
979 /* Is the given value a sign-extended 16-bit value?  */
980 #define IS_SEXT_16BIT_NUM(x)                                            \
981   (((x) &~ (offsetT) 0x7fff) == 0                                       \
982    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
983
984 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
985 #define IS_ZEXT_32BIT_NUM(x)                                            \
986   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
987    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
988
989 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
990    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
991 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
992   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
993               | (((VALUE) & (MASK)) << (SHIFT)))
994
995 /* Extract bits MASK << SHIFT from STRUCT and shift them right
996    SHIFT places.  */
997 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
998   (((STRUCT) >> (SHIFT)) & (MASK))
999
1000 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1001    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1002
1003    include/opcode/mips.h specifies operand fields using the macros
1004    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1005    with "MIPS16OP" instead of "OP".  */
1006 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1007   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1008 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1009   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1010                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1011
1012 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1013 #define EXTRACT_OPERAND(FIELD, INSN) \
1014   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1015 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1016   EXTRACT_BITS ((INSN).insn_opcode, \
1017                 MIPS16OP_MASK_##FIELD, \
1018                 MIPS16OP_SH_##FIELD)
1019 \f
1020 /* Global variables used when generating relaxable macros.  See the
1021    comment above RELAX_ENCODE for more details about how relaxation
1022    is used.  */
1023 static struct {
1024   /* 0 if we're not emitting a relaxable macro.
1025      1 if we're emitting the first of the two relaxation alternatives.
1026      2 if we're emitting the second alternative.  */
1027   int sequence;
1028
1029   /* The first relaxable fixup in the current frag.  (In other words,
1030      the first fixup that refers to relaxable code.)  */
1031   fixS *first_fixup;
1032
1033   /* sizes[0] says how many bytes of the first alternative are stored in
1034      the current frag.  Likewise sizes[1] for the second alternative.  */
1035   unsigned int sizes[2];
1036
1037   /* The symbol on which the choice of sequence depends.  */
1038   symbolS *symbol;
1039 } mips_relax;
1040 \f
1041 /* Global variables used to decide whether a macro needs a warning.  */
1042 static struct {
1043   /* True if the macro is in a branch delay slot.  */
1044   bfd_boolean delay_slot_p;
1045
1046   /* For relaxable macros, sizes[0] is the length of the first alternative
1047      in bytes and sizes[1] is the length of the second alternative.
1048      For non-relaxable macros, both elements give the length of the
1049      macro in bytes.  */
1050   unsigned int sizes[2];
1051
1052   /* The first variant frag for this macro.  */
1053   fragS *first_frag;
1054 } mips_macro_warning;
1055 \f
1056 /* Prototypes for static functions.  */
1057
1058 #define internalError()                                                 \
1059     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1060
1061 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1062
1063 static void append_insn
1064   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1065 static void mips_no_prev_insn (void);
1066 static void macro_build (expressionS *, const char *, const char *, ...);
1067 static void mips16_macro_build
1068   (expressionS *, const char *, const char *, va_list *);
1069 static void load_register (int, expressionS *, int);
1070 static void macro_start (void);
1071 static void macro_end (void);
1072 static void macro (struct mips_cl_insn * ip);
1073 static void mips16_macro (struct mips_cl_insn * ip);
1074 static void mips_ip (char *str, struct mips_cl_insn * ip);
1075 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1076 static void mips16_immed
1077   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1078    unsigned long *, bfd_boolean *, unsigned short *);
1079 static size_t my_getSmallExpression
1080   (expressionS *, bfd_reloc_code_real_type *, char *);
1081 static void my_getExpression (expressionS *, char *);
1082 static void s_align (int);
1083 static void s_change_sec (int);
1084 static void s_change_section (int);
1085 static void s_cons (int);
1086 static void s_float_cons (int);
1087 static void s_mips_globl (int);
1088 static void s_option (int);
1089 static void s_mipsset (int);
1090 static void s_abicalls (int);
1091 static void s_cpload (int);
1092 static void s_cpsetup (int);
1093 static void s_cplocal (int);
1094 static void s_cprestore (int);
1095 static void s_cpreturn (int);
1096 static void s_dtprelword (int);
1097 static void s_dtpreldword (int);
1098 static void s_gpvalue (int);
1099 static void s_gpword (int);
1100 static void s_gpdword (int);
1101 static void s_cpadd (int);
1102 static void s_insn (int);
1103 static void md_obj_begin (void);
1104 static void md_obj_end (void);
1105 static void s_mips_ent (int);
1106 static void s_mips_end (int);
1107 static void s_mips_frame (int);
1108 static void s_mips_mask (int reg_type);
1109 static void s_mips_stab (int);
1110 static void s_mips_weakext (int);
1111 static void s_mips_file (int);
1112 static void s_mips_loc (int);
1113 static bfd_boolean pic_need_relax (symbolS *, asection *);
1114 static int relaxed_branch_length (fragS *, asection *, int);
1115 static int validate_mips_insn (const struct mips_opcode *);
1116
1117 /* Table and functions used to map between CPU/ISA names, and
1118    ISA levels, and CPU numbers.  */
1119
1120 struct mips_cpu_info
1121 {
1122   const char *name;           /* CPU or ISA name.  */
1123   int flags;                  /* ASEs available, or ISA flag.  */
1124   int isa;                    /* ISA level.  */
1125   int cpu;                    /* CPU number (default CPU if ISA).  */
1126 };
1127
1128 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1129 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1130 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1131 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1132 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1133 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1134 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1135
1136 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1137 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1138 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1139 \f
1140 /* Pseudo-op table.
1141
1142    The following pseudo-ops from the Kane and Heinrich MIPS book
1143    should be defined here, but are currently unsupported: .alias,
1144    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1145
1146    The following pseudo-ops from the Kane and Heinrich MIPS book are
1147    specific to the type of debugging information being generated, and
1148    should be defined by the object format: .aent, .begin, .bend,
1149    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1150    .vreg.
1151
1152    The following pseudo-ops from the Kane and Heinrich MIPS book are
1153    not MIPS CPU specific, but are also not specific to the object file
1154    format.  This file is probably the best place to define them, but
1155    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1156
1157 static const pseudo_typeS mips_pseudo_table[] =
1158 {
1159   /* MIPS specific pseudo-ops.  */
1160   {"option", s_option, 0},
1161   {"set", s_mipsset, 0},
1162   {"rdata", s_change_sec, 'r'},
1163   {"sdata", s_change_sec, 's'},
1164   {"livereg", s_ignore, 0},
1165   {"abicalls", s_abicalls, 0},
1166   {"cpload", s_cpload, 0},
1167   {"cpsetup", s_cpsetup, 0},
1168   {"cplocal", s_cplocal, 0},
1169   {"cprestore", s_cprestore, 0},
1170   {"cpreturn", s_cpreturn, 0},
1171   {"dtprelword", s_dtprelword, 0},
1172   {"dtpreldword", s_dtpreldword, 0},
1173   {"gpvalue", s_gpvalue, 0},
1174   {"gpword", s_gpword, 0},
1175   {"gpdword", s_gpdword, 0},
1176   {"cpadd", s_cpadd, 0},
1177   {"insn", s_insn, 0},
1178
1179   /* Relatively generic pseudo-ops that happen to be used on MIPS
1180      chips.  */
1181   {"asciiz", stringer, 8 + 1},
1182   {"bss", s_change_sec, 'b'},
1183   {"err", s_err, 0},
1184   {"half", s_cons, 1},
1185   {"dword", s_cons, 3},
1186   {"weakext", s_mips_weakext, 0},
1187   {"origin", s_org, 0},
1188   {"repeat", s_rept, 0},
1189
1190   /* For MIPS this is non-standard, but we define it for consistency.  */
1191   {"sbss", s_change_sec, 'B'},
1192
1193   /* These pseudo-ops are defined in read.c, but must be overridden
1194      here for one reason or another.  */
1195   {"align", s_align, 0},
1196   {"byte", s_cons, 0},
1197   {"data", s_change_sec, 'd'},
1198   {"double", s_float_cons, 'd'},
1199   {"float", s_float_cons, 'f'},
1200   {"globl", s_mips_globl, 0},
1201   {"global", s_mips_globl, 0},
1202   {"hword", s_cons, 1},
1203   {"int", s_cons, 2},
1204   {"long", s_cons, 2},
1205   {"octa", s_cons, 4},
1206   {"quad", s_cons, 3},
1207   {"section", s_change_section, 0},
1208   {"short", s_cons, 1},
1209   {"single", s_float_cons, 'f'},
1210   {"stabn", s_mips_stab, 'n'},
1211   {"text", s_change_sec, 't'},
1212   {"word", s_cons, 2},
1213
1214   { "extern", ecoff_directive_extern, 0},
1215
1216   { NULL, NULL, 0 },
1217 };
1218
1219 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1220 {
1221   /* These pseudo-ops should be defined by the object file format.
1222      However, a.out doesn't support them, so we have versions here.  */
1223   {"aent", s_mips_ent, 1},
1224   {"bgnb", s_ignore, 0},
1225   {"end", s_mips_end, 0},
1226   {"endb", s_ignore, 0},
1227   {"ent", s_mips_ent, 0},
1228   {"file", s_mips_file, 0},
1229   {"fmask", s_mips_mask, 'F'},
1230   {"frame", s_mips_frame, 0},
1231   {"loc", s_mips_loc, 0},
1232   {"mask", s_mips_mask, 'R'},
1233   {"verstamp", s_ignore, 0},
1234   { NULL, NULL, 0 },
1235 };
1236
1237 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1238    purpose of the `.dc.a' internal pseudo-op.  */
1239
1240 int
1241 mips_address_bytes (void)
1242 {
1243   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1244 }
1245
1246 extern void pop_insert (const pseudo_typeS *);
1247
1248 void
1249 mips_pop_insert (void)
1250 {
1251   pop_insert (mips_pseudo_table);
1252   if (! ECOFF_DEBUGGING)
1253     pop_insert (mips_nonecoff_pseudo_table);
1254 }
1255 \f
1256 /* Symbols labelling the current insn.  */
1257
1258 struct insn_label_list
1259 {
1260   struct insn_label_list *next;
1261   symbolS *label;
1262 };
1263
1264 static struct insn_label_list *free_insn_labels;
1265 #define label_list tc_segment_info_data.labels
1266
1267 static void mips_clear_insn_labels (void);
1268
1269 static inline void
1270 mips_clear_insn_labels (void)
1271 {
1272   register struct insn_label_list **pl;
1273   segment_info_type *si;
1274
1275   if (now_seg)
1276     {
1277       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1278         ;
1279       
1280       si = seg_info (now_seg);
1281       *pl = si->label_list;
1282       si->label_list = NULL;
1283     }
1284 }
1285
1286 \f
1287 static char *expr_end;
1288
1289 /* Expressions which appear in instructions.  These are set by
1290    mips_ip.  */
1291
1292 static expressionS imm_expr;
1293 static expressionS imm2_expr;
1294 static expressionS offset_expr;
1295
1296 /* Relocs associated with imm_expr and offset_expr.  */
1297
1298 static bfd_reloc_code_real_type imm_reloc[3]
1299   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1300 static bfd_reloc_code_real_type offset_reloc[3]
1301   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1302
1303 /* These are set by mips16_ip if an explicit extension is used.  */
1304
1305 static bfd_boolean mips16_small, mips16_ext;
1306
1307 #ifdef OBJ_ELF
1308 /* The pdr segment for per procedure frame/regmask info.  Not used for
1309    ECOFF debugging.  */
1310
1311 static segT pdr_seg;
1312 #endif
1313
1314 /* The default target format to use.  */
1315
1316 #if defined (TE_FreeBSD)
1317 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1318 #elif defined (TE_TMIPS)
1319 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1320 #else
1321 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1322 #endif
1323
1324 const char *
1325 mips_target_format (void)
1326 {
1327   switch (OUTPUT_FLAVOR)
1328     {
1329     case bfd_target_ecoff_flavour:
1330       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1331     case bfd_target_coff_flavour:
1332       return "pe-mips";
1333     case bfd_target_elf_flavour:
1334 #ifdef TE_VXWORKS
1335       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1336         return (target_big_endian
1337                 ? "elf32-bigmips-vxworks"
1338                 : "elf32-littlemips-vxworks");
1339 #endif
1340       return (target_big_endian
1341               ? (HAVE_64BIT_OBJECTS
1342                  ? ELF_TARGET ("elf64-", "big")
1343                  : (HAVE_NEWABI
1344                     ? ELF_TARGET ("elf32-n", "big")
1345                     : ELF_TARGET ("elf32-", "big")))
1346               : (HAVE_64BIT_OBJECTS
1347                  ? ELF_TARGET ("elf64-", "little")
1348                  : (HAVE_NEWABI
1349                     ? ELF_TARGET ("elf32-n", "little")
1350                     : ELF_TARGET ("elf32-", "little"))));
1351     default:
1352       abort ();
1353       return NULL;
1354     }
1355 }
1356
1357 /* Return the length of instruction INSN.  */
1358
1359 static inline unsigned int
1360 insn_length (const struct mips_cl_insn *insn)
1361 {
1362   if (!mips_opts.mips16)
1363     return 4;
1364   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1365 }
1366
1367 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1368
1369 static void
1370 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1371 {
1372   size_t i;
1373
1374   insn->insn_mo = mo;
1375   insn->use_extend = FALSE;
1376   insn->extend = 0;
1377   insn->insn_opcode = mo->match;
1378   insn->frag = NULL;
1379   insn->where = 0;
1380   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1381     insn->fixp[i] = NULL;
1382   insn->fixed_p = (mips_opts.noreorder > 0);
1383   insn->noreorder_p = (mips_opts.noreorder > 0);
1384   insn->mips16_absolute_jump_p = 0;
1385 }
1386
1387 /* Record the current MIPS16 mode in now_seg.  */
1388
1389 static void
1390 mips_record_mips16_mode (void)
1391 {
1392   segment_info_type *si;
1393
1394   si = seg_info (now_seg);
1395   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1396     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1397 }
1398
1399 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1400
1401 static void
1402 install_insn (const struct mips_cl_insn *insn)
1403 {
1404   char *f = insn->frag->fr_literal + insn->where;
1405   if (!mips_opts.mips16)
1406     md_number_to_chars (f, insn->insn_opcode, 4);
1407   else if (insn->mips16_absolute_jump_p)
1408     {
1409       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1410       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1411     }
1412   else
1413     {
1414       if (insn->use_extend)
1415         {
1416           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1417           f += 2;
1418         }
1419       md_number_to_chars (f, insn->insn_opcode, 2);
1420     }
1421   mips_record_mips16_mode ();
1422 }
1423
1424 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1425    and install the opcode in the new location.  */
1426
1427 static void
1428 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1429 {
1430   size_t i;
1431
1432   insn->frag = frag;
1433   insn->where = where;
1434   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1435     if (insn->fixp[i] != NULL)
1436       {
1437         insn->fixp[i]->fx_frag = frag;
1438         insn->fixp[i]->fx_where = where;
1439       }
1440   install_insn (insn);
1441 }
1442
1443 /* Add INSN to the end of the output.  */
1444
1445 static void
1446 add_fixed_insn (struct mips_cl_insn *insn)
1447 {
1448   char *f = frag_more (insn_length (insn));
1449   move_insn (insn, frag_now, f - frag_now->fr_literal);
1450 }
1451
1452 /* Start a variant frag and move INSN to the start of the variant part,
1453    marking it as fixed.  The other arguments are as for frag_var.  */
1454
1455 static void
1456 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1457                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1458 {
1459   frag_grow (max_chars);
1460   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1461   insn->fixed_p = 1;
1462   frag_var (rs_machine_dependent, max_chars, var,
1463             subtype, symbol, offset, NULL);
1464 }
1465
1466 /* Insert N copies of INSN into the history buffer, starting at
1467    position FIRST.  Neither FIRST nor N need to be clipped.  */
1468
1469 static void
1470 insert_into_history (unsigned int first, unsigned int n,
1471                      const struct mips_cl_insn *insn)
1472 {
1473   if (mips_relax.sequence != 2)
1474     {
1475       unsigned int i;
1476
1477       for (i = ARRAY_SIZE (history); i-- > first;)
1478         if (i >= first + n)
1479           history[i] = history[i - n];
1480         else
1481           history[i] = *insn;
1482     }
1483 }
1484
1485 /* Emit a nop instruction, recording it in the history buffer.  */
1486
1487 static void
1488 emit_nop (void)
1489 {
1490   add_fixed_insn (NOP_INSN);
1491   insert_into_history (0, 1, NOP_INSN);
1492 }
1493
1494 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1495    the idea is to make it obvious at a glance that each errata is
1496    included.  */
1497
1498 static void
1499 init_vr4120_conflicts (void)
1500 {
1501 #define CONFLICT(FIRST, SECOND) \
1502     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1503
1504   /* Errata 21 - [D]DIV[U] after [D]MACC */
1505   CONFLICT (MACC, DIV);
1506   CONFLICT (DMACC, DIV);
1507
1508   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1509   CONFLICT (DMULT, DMULT);
1510   CONFLICT (DMULT, DMACC);
1511   CONFLICT (DMACC, DMULT);
1512   CONFLICT (DMACC, DMACC);
1513
1514   /* Errata 24 - MT{LO,HI} after [D]MACC */
1515   CONFLICT (MACC, MTHILO);
1516   CONFLICT (DMACC, MTHILO);
1517
1518   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1519      instruction is executed immediately after a MACC or DMACC
1520      instruction, the result of [either instruction] is incorrect."  */
1521   CONFLICT (MACC, MULT);
1522   CONFLICT (MACC, DMULT);
1523   CONFLICT (DMACC, MULT);
1524   CONFLICT (DMACC, DMULT);
1525
1526   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1527      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1528      DDIV or DDIVU instruction, the result of the MACC or
1529      DMACC instruction is incorrect.".  */
1530   CONFLICT (DMULT, MACC);
1531   CONFLICT (DMULT, DMACC);
1532   CONFLICT (DIV, MACC);
1533   CONFLICT (DIV, DMACC);
1534
1535 #undef CONFLICT
1536 }
1537
1538 struct regname {
1539   const char *name;
1540   unsigned int num;
1541 };
1542
1543 #define RTYPE_MASK      0x1ff00
1544 #define RTYPE_NUM       0x00100
1545 #define RTYPE_FPU       0x00200
1546 #define RTYPE_FCC       0x00400
1547 #define RTYPE_VEC       0x00800
1548 #define RTYPE_GP        0x01000
1549 #define RTYPE_CP0       0x02000
1550 #define RTYPE_PC        0x04000
1551 #define RTYPE_ACC       0x08000
1552 #define RTYPE_CCC       0x10000
1553 #define RNUM_MASK       0x000ff
1554 #define RWARN           0x80000
1555
1556 #define GENERIC_REGISTER_NUMBERS \
1557     {"$0",      RTYPE_NUM | 0},  \
1558     {"$1",      RTYPE_NUM | 1},  \
1559     {"$2",      RTYPE_NUM | 2},  \
1560     {"$3",      RTYPE_NUM | 3},  \
1561     {"$4",      RTYPE_NUM | 4},  \
1562     {"$5",      RTYPE_NUM | 5},  \
1563     {"$6",      RTYPE_NUM | 6},  \
1564     {"$7",      RTYPE_NUM | 7},  \
1565     {"$8",      RTYPE_NUM | 8},  \
1566     {"$9",      RTYPE_NUM | 9},  \
1567     {"$10",     RTYPE_NUM | 10}, \
1568     {"$11",     RTYPE_NUM | 11}, \
1569     {"$12",     RTYPE_NUM | 12}, \
1570     {"$13",     RTYPE_NUM | 13}, \
1571     {"$14",     RTYPE_NUM | 14}, \
1572     {"$15",     RTYPE_NUM | 15}, \
1573     {"$16",     RTYPE_NUM | 16}, \
1574     {"$17",     RTYPE_NUM | 17}, \
1575     {"$18",     RTYPE_NUM | 18}, \
1576     {"$19",     RTYPE_NUM | 19}, \
1577     {"$20",     RTYPE_NUM | 20}, \
1578     {"$21",     RTYPE_NUM | 21}, \
1579     {"$22",     RTYPE_NUM | 22}, \
1580     {"$23",     RTYPE_NUM | 23}, \
1581     {"$24",     RTYPE_NUM | 24}, \
1582     {"$25",     RTYPE_NUM | 25}, \
1583     {"$26",     RTYPE_NUM | 26}, \
1584     {"$27",     RTYPE_NUM | 27}, \
1585     {"$28",     RTYPE_NUM | 28}, \
1586     {"$29",     RTYPE_NUM | 29}, \
1587     {"$30",     RTYPE_NUM | 30}, \
1588     {"$31",     RTYPE_NUM | 31} 
1589
1590 #define FPU_REGISTER_NAMES       \
1591     {"$f0",     RTYPE_FPU | 0},  \
1592     {"$f1",     RTYPE_FPU | 1},  \
1593     {"$f2",     RTYPE_FPU | 2},  \
1594     {"$f3",     RTYPE_FPU | 3},  \
1595     {"$f4",     RTYPE_FPU | 4},  \
1596     {"$f5",     RTYPE_FPU | 5},  \
1597     {"$f6",     RTYPE_FPU | 6},  \
1598     {"$f7",     RTYPE_FPU | 7},  \
1599     {"$f8",     RTYPE_FPU | 8},  \
1600     {"$f9",     RTYPE_FPU | 9},  \
1601     {"$f10",    RTYPE_FPU | 10}, \
1602     {"$f11",    RTYPE_FPU | 11}, \
1603     {"$f12",    RTYPE_FPU | 12}, \
1604     {"$f13",    RTYPE_FPU | 13}, \
1605     {"$f14",    RTYPE_FPU | 14}, \
1606     {"$f15",    RTYPE_FPU | 15}, \
1607     {"$f16",    RTYPE_FPU | 16}, \
1608     {"$f17",    RTYPE_FPU | 17}, \
1609     {"$f18",    RTYPE_FPU | 18}, \
1610     {"$f19",    RTYPE_FPU | 19}, \
1611     {"$f20",    RTYPE_FPU | 20}, \
1612     {"$f21",    RTYPE_FPU | 21}, \
1613     {"$f22",    RTYPE_FPU | 22}, \
1614     {"$f23",    RTYPE_FPU | 23}, \
1615     {"$f24",    RTYPE_FPU | 24}, \
1616     {"$f25",    RTYPE_FPU | 25}, \
1617     {"$f26",    RTYPE_FPU | 26}, \
1618     {"$f27",    RTYPE_FPU | 27}, \
1619     {"$f28",    RTYPE_FPU | 28}, \
1620     {"$f29",    RTYPE_FPU | 29}, \
1621     {"$f30",    RTYPE_FPU | 30}, \
1622     {"$f31",    RTYPE_FPU | 31}
1623
1624 #define FPU_CONDITION_CODE_NAMES \
1625     {"$fcc0",   RTYPE_FCC | 0},  \
1626     {"$fcc1",   RTYPE_FCC | 1},  \
1627     {"$fcc2",   RTYPE_FCC | 2},  \
1628     {"$fcc3",   RTYPE_FCC | 3},  \
1629     {"$fcc4",   RTYPE_FCC | 4},  \
1630     {"$fcc5",   RTYPE_FCC | 5},  \
1631     {"$fcc6",   RTYPE_FCC | 6},  \
1632     {"$fcc7",   RTYPE_FCC | 7}
1633
1634 #define COPROC_CONDITION_CODE_NAMES         \
1635     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1636     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1637     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1638     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1639     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1640     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1641     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1642     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1643
1644 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1645     {"$a4",     RTYPE_GP | 8},  \
1646     {"$a5",     RTYPE_GP | 9},  \
1647     {"$a6",     RTYPE_GP | 10}, \
1648     {"$a7",     RTYPE_GP | 11}, \
1649     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1650     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1651     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1652     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1653     {"$t0",     RTYPE_GP | 12}, \
1654     {"$t1",     RTYPE_GP | 13}, \
1655     {"$t2",     RTYPE_GP | 14}, \
1656     {"$t3",     RTYPE_GP | 15}
1657
1658 #define O32_SYMBOLIC_REGISTER_NAMES \
1659     {"$t0",     RTYPE_GP | 8},  \
1660     {"$t1",     RTYPE_GP | 9},  \
1661     {"$t2",     RTYPE_GP | 10}, \
1662     {"$t3",     RTYPE_GP | 11}, \
1663     {"$t4",     RTYPE_GP | 12}, \
1664     {"$t5",     RTYPE_GP | 13}, \
1665     {"$t6",     RTYPE_GP | 14}, \
1666     {"$t7",     RTYPE_GP | 15}, \
1667     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1668     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1669     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1670     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1671
1672 /* Remaining symbolic register names */
1673 #define SYMBOLIC_REGISTER_NAMES \
1674     {"$zero",   RTYPE_GP | 0},  \
1675     {"$at",     RTYPE_GP | 1},  \
1676     {"$AT",     RTYPE_GP | 1},  \
1677     {"$v0",     RTYPE_GP | 2},  \
1678     {"$v1",     RTYPE_GP | 3},  \
1679     {"$a0",     RTYPE_GP | 4},  \
1680     {"$a1",     RTYPE_GP | 5},  \
1681     {"$a2",     RTYPE_GP | 6},  \
1682     {"$a3",     RTYPE_GP | 7},  \
1683     {"$s0",     RTYPE_GP | 16}, \
1684     {"$s1",     RTYPE_GP | 17}, \
1685     {"$s2",     RTYPE_GP | 18}, \
1686     {"$s3",     RTYPE_GP | 19}, \
1687     {"$s4",     RTYPE_GP | 20}, \
1688     {"$s5",     RTYPE_GP | 21}, \
1689     {"$s6",     RTYPE_GP | 22}, \
1690     {"$s7",     RTYPE_GP | 23}, \
1691     {"$t8",     RTYPE_GP | 24}, \
1692     {"$t9",     RTYPE_GP | 25}, \
1693     {"$k0",     RTYPE_GP | 26}, \
1694     {"$kt0",    RTYPE_GP | 26}, \
1695     {"$k1",     RTYPE_GP | 27}, \
1696     {"$kt1",    RTYPE_GP | 27}, \
1697     {"$gp",     RTYPE_GP | 28}, \
1698     {"$sp",     RTYPE_GP | 29}, \
1699     {"$s8",     RTYPE_GP | 30}, \
1700     {"$fp",     RTYPE_GP | 30}, \
1701     {"$ra",     RTYPE_GP | 31}
1702
1703 #define MIPS16_SPECIAL_REGISTER_NAMES \
1704     {"$pc",     RTYPE_PC | 0}
1705
1706 #define MDMX_VECTOR_REGISTER_NAMES \
1707     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1708     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1709     {"$v2",     RTYPE_VEC | 2},  \
1710     {"$v3",     RTYPE_VEC | 3},  \
1711     {"$v4",     RTYPE_VEC | 4},  \
1712     {"$v5",     RTYPE_VEC | 5},  \
1713     {"$v6",     RTYPE_VEC | 6},  \
1714     {"$v7",     RTYPE_VEC | 7},  \
1715     {"$v8",     RTYPE_VEC | 8},  \
1716     {"$v9",     RTYPE_VEC | 9},  \
1717     {"$v10",    RTYPE_VEC | 10}, \
1718     {"$v11",    RTYPE_VEC | 11}, \
1719     {"$v12",    RTYPE_VEC | 12}, \
1720     {"$v13",    RTYPE_VEC | 13}, \
1721     {"$v14",    RTYPE_VEC | 14}, \
1722     {"$v15",    RTYPE_VEC | 15}, \
1723     {"$v16",    RTYPE_VEC | 16}, \
1724     {"$v17",    RTYPE_VEC | 17}, \
1725     {"$v18",    RTYPE_VEC | 18}, \
1726     {"$v19",    RTYPE_VEC | 19}, \
1727     {"$v20",    RTYPE_VEC | 20}, \
1728     {"$v21",    RTYPE_VEC | 21}, \
1729     {"$v22",    RTYPE_VEC | 22}, \
1730     {"$v23",    RTYPE_VEC | 23}, \
1731     {"$v24",    RTYPE_VEC | 24}, \
1732     {"$v25",    RTYPE_VEC | 25}, \
1733     {"$v26",    RTYPE_VEC | 26}, \
1734     {"$v27",    RTYPE_VEC | 27}, \
1735     {"$v28",    RTYPE_VEC | 28}, \
1736     {"$v29",    RTYPE_VEC | 29}, \
1737     {"$v30",    RTYPE_VEC | 30}, \
1738     {"$v31",    RTYPE_VEC | 31}
1739
1740 #define MIPS_DSP_ACCUMULATOR_NAMES \
1741     {"$ac0",    RTYPE_ACC | 0}, \
1742     {"$ac1",    RTYPE_ACC | 1}, \
1743     {"$ac2",    RTYPE_ACC | 2}, \
1744     {"$ac3",    RTYPE_ACC | 3}
1745
1746 static const struct regname reg_names[] = {
1747   GENERIC_REGISTER_NUMBERS,
1748   FPU_REGISTER_NAMES,
1749   FPU_CONDITION_CODE_NAMES,
1750   COPROC_CONDITION_CODE_NAMES,
1751
1752   /* The $txx registers depends on the abi,
1753      these will be added later into the symbol table from
1754      one of the tables below once mips_abi is set after 
1755      parsing of arguments from the command line. */
1756   SYMBOLIC_REGISTER_NAMES,
1757
1758   MIPS16_SPECIAL_REGISTER_NAMES,
1759   MDMX_VECTOR_REGISTER_NAMES,
1760   MIPS_DSP_ACCUMULATOR_NAMES,
1761   {0, 0}
1762 };
1763
1764 static const struct regname reg_names_o32[] = {
1765   O32_SYMBOLIC_REGISTER_NAMES,
1766   {0, 0}
1767 };
1768
1769 static const struct regname reg_names_n32n64[] = {
1770   N32N64_SYMBOLIC_REGISTER_NAMES,
1771   {0, 0}
1772 };
1773
1774 static int
1775 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1776 {
1777   symbolS *symbolP;
1778   char *e;
1779   char save_c;
1780   int reg = -1;
1781
1782   /* Find end of name.  */
1783   e = *s;
1784   if (is_name_beginner (*e))
1785     ++e;
1786   while (is_part_of_name (*e))
1787     ++e;
1788
1789   /* Terminate name.  */
1790   save_c = *e;
1791   *e = '\0';
1792
1793   /* Look for a register symbol.  */
1794   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1795     {
1796       int r = S_GET_VALUE (symbolP);
1797       if (r & types)
1798         reg = r & RNUM_MASK;
1799       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1800         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1801         reg = (r & RNUM_MASK) - 2;
1802     }
1803   /* Else see if this is a register defined in an itbl entry.  */
1804   else if ((types & RTYPE_GP) && itbl_have_entries)
1805     {
1806       char *n = *s;
1807       unsigned long r;
1808
1809       if (*n == '$')
1810         ++n;
1811       if (itbl_get_reg_val (n, &r))
1812         reg = r & RNUM_MASK;
1813     }
1814
1815   /* Advance to next token if a register was recognised.  */
1816   if (reg >= 0)
1817     *s = e;
1818   else if (types & RWARN)
1819     as_warn (_("Unrecognized register name `%s'"), *s);
1820
1821   *e = save_c;
1822   if (regnop)
1823     *regnop = reg;
1824   return reg >= 0;
1825 }
1826
1827 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1828    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1829
1830 static bfd_boolean
1831 is_opcode_valid (const struct mips_opcode *mo)
1832 {
1833   int isa = mips_opts.isa;
1834   int fp_s, fp_d;
1835
1836   if (mips_opts.ase_mdmx)
1837     isa |= INSN_MDMX;
1838   if (mips_opts.ase_dsp)
1839     isa |= INSN_DSP;
1840   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1841     isa |= INSN_DSP64;
1842   if (mips_opts.ase_dspr2)
1843     isa |= INSN_DSPR2;
1844   if (mips_opts.ase_mt)
1845     isa |= INSN_MT;
1846   if (mips_opts.ase_mips3d)
1847     isa |= INSN_MIPS3D;
1848   if (mips_opts.ase_smartmips)
1849     isa |= INSN_SMARTMIPS;
1850
1851   /* Don't accept instructions based on the ISA if the CPU does not implement
1852      all the coprocessor insns. */
1853   if (NO_ISA_COP (mips_opts.arch)
1854       && COP_INSN (mo->pinfo))
1855     isa = 0;
1856
1857   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1858     return FALSE;
1859
1860   /* Check whether the instruction or macro requires single-precision or
1861      double-precision floating-point support.  Note that this information is
1862      stored differently in the opcode table for insns and macros.  */
1863   if (mo->pinfo == INSN_MACRO)
1864     {
1865       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1866       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1867     }
1868   else
1869     {
1870       fp_s = mo->pinfo & FP_S;
1871       fp_d = mo->pinfo & FP_D;
1872     }
1873
1874   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1875     return FALSE;
1876
1877   if (fp_s && mips_opts.soft_float)
1878     return FALSE;
1879
1880   return TRUE;
1881 }
1882
1883 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1884    selected ISA and architecture.  */
1885
1886 static bfd_boolean
1887 is_opcode_valid_16 (const struct mips_opcode *mo)
1888 {
1889   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1890 }
1891
1892 /* This function is called once, at assembler startup time.  It should set up
1893    all the tables, etc. that the MD part of the assembler will need.  */
1894
1895 void
1896 md_begin (void)
1897 {
1898   const char *retval = NULL;
1899   int i = 0;
1900   int broken = 0;
1901
1902   if (mips_pic != NO_PIC)
1903     {
1904       if (g_switch_seen && g_switch_value != 0)
1905         as_bad (_("-G may not be used in position-independent code"));
1906       g_switch_value = 0;
1907     }
1908
1909   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1910     as_warn (_("Could not set architecture and machine"));
1911
1912   op_hash = hash_new ();
1913
1914   for (i = 0; i < NUMOPCODES;)
1915     {
1916       const char *name = mips_opcodes[i].name;
1917
1918       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1919       if (retval != NULL)
1920         {
1921           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1922                    mips_opcodes[i].name, retval);
1923           /* Probably a memory allocation problem?  Give up now.  */
1924           as_fatal (_("Broken assembler.  No assembly attempted."));
1925         }
1926       do
1927         {
1928           if (mips_opcodes[i].pinfo != INSN_MACRO)
1929             {
1930               if (!validate_mips_insn (&mips_opcodes[i]))
1931                 broken = 1;
1932               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1933                 {
1934                   create_insn (&nop_insn, mips_opcodes + i);
1935                   if (mips_fix_loongson2f_nop)
1936                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1937                   nop_insn.fixed_p = 1;
1938                 }
1939             }
1940           ++i;
1941         }
1942       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1943     }
1944
1945   mips16_op_hash = hash_new ();
1946
1947   i = 0;
1948   while (i < bfd_mips16_num_opcodes)
1949     {
1950       const char *name = mips16_opcodes[i].name;
1951
1952       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1953       if (retval != NULL)
1954         as_fatal (_("internal: can't hash `%s': %s"),
1955                   mips16_opcodes[i].name, retval);
1956       do
1957         {
1958           if (mips16_opcodes[i].pinfo != INSN_MACRO
1959               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1960                   != mips16_opcodes[i].match))
1961             {
1962               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1963                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1964               broken = 1;
1965             }
1966           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1967             {
1968               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1969               mips16_nop_insn.fixed_p = 1;
1970             }
1971           ++i;
1972         }
1973       while (i < bfd_mips16_num_opcodes
1974              && strcmp (mips16_opcodes[i].name, name) == 0);
1975     }
1976
1977   if (broken)
1978     as_fatal (_("Broken assembler.  No assembly attempted."));
1979
1980   /* We add all the general register names to the symbol table.  This
1981      helps us detect invalid uses of them.  */
1982   for (i = 0; reg_names[i].name; i++) 
1983     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1984                                      reg_names[i].num, /* & RNUM_MASK, */
1985                                      &zero_address_frag));
1986   if (HAVE_NEWABI)
1987     for (i = 0; reg_names_n32n64[i].name; i++) 
1988       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1989                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1990                                        &zero_address_frag));
1991   else
1992     for (i = 0; reg_names_o32[i].name; i++) 
1993       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1994                                        reg_names_o32[i].num, /* & RNUM_MASK, */
1995                                        &zero_address_frag));
1996
1997   mips_no_prev_insn ();
1998
1999   mips_gprmask = 0;
2000   mips_cprmask[0] = 0;
2001   mips_cprmask[1] = 0;
2002   mips_cprmask[2] = 0;
2003   mips_cprmask[3] = 0;
2004
2005   /* set the default alignment for the text section (2**2) */
2006   record_alignment (text_section, 2);
2007
2008   bfd_set_gp_size (stdoutput, g_switch_value);
2009
2010 #ifdef OBJ_ELF
2011   if (IS_ELF)
2012     {
2013       /* On a native system other than VxWorks, sections must be aligned
2014          to 16 byte boundaries.  When configured for an embedded ELF
2015          target, we don't bother.  */
2016       if (strncmp (TARGET_OS, "elf", 3) != 0
2017           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2018         {
2019           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2020           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2021           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2022         }
2023
2024       /* Create a .reginfo section for register masks and a .mdebug
2025          section for debugging information.  */
2026       {
2027         segT seg;
2028         subsegT subseg;
2029         flagword flags;
2030         segT sec;
2031
2032         seg = now_seg;
2033         subseg = now_subseg;
2034
2035         /* The ABI says this section should be loaded so that the
2036            running program can access it.  However, we don't load it
2037            if we are configured for an embedded target */
2038         flags = SEC_READONLY | SEC_DATA;
2039         if (strncmp (TARGET_OS, "elf", 3) != 0)
2040           flags |= SEC_ALLOC | SEC_LOAD;
2041
2042         if (mips_abi != N64_ABI)
2043           {
2044             sec = subseg_new (".reginfo", (subsegT) 0);
2045
2046             bfd_set_section_flags (stdoutput, sec, flags);
2047             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2048
2049             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2050           }
2051         else
2052           {
2053             /* The 64-bit ABI uses a .MIPS.options section rather than
2054                .reginfo section.  */
2055             sec = subseg_new (".MIPS.options", (subsegT) 0);
2056             bfd_set_section_flags (stdoutput, sec, flags);
2057             bfd_set_section_alignment (stdoutput, sec, 3);
2058
2059             /* Set up the option header.  */
2060             {
2061               Elf_Internal_Options opthdr;
2062               char *f;
2063
2064               opthdr.kind = ODK_REGINFO;
2065               opthdr.size = (sizeof (Elf_External_Options)
2066                              + sizeof (Elf64_External_RegInfo));
2067               opthdr.section = 0;
2068               opthdr.info = 0;
2069               f = frag_more (sizeof (Elf_External_Options));
2070               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2071                                              (Elf_External_Options *) f);
2072
2073               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2074             }
2075           }
2076
2077         if (ECOFF_DEBUGGING)
2078           {
2079             sec = subseg_new (".mdebug", (subsegT) 0);
2080             (void) bfd_set_section_flags (stdoutput, sec,
2081                                           SEC_HAS_CONTENTS | SEC_READONLY);
2082             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2083           }
2084         else if (mips_flag_pdr)
2085           {
2086             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2087             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2088                                           SEC_READONLY | SEC_RELOC
2089                                           | SEC_DEBUGGING);
2090             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2091           }
2092
2093         subseg_set (seg, subseg);
2094       }
2095     }
2096 #endif /* OBJ_ELF */
2097
2098   if (! ECOFF_DEBUGGING)
2099     md_obj_begin ();
2100
2101   if (mips_fix_vr4120)
2102     init_vr4120_conflicts ();
2103 }
2104
2105 void
2106 md_mips_end (void)
2107 {
2108   if (! ECOFF_DEBUGGING)
2109     md_obj_end ();
2110 }
2111
2112 void
2113 md_assemble (char *str)
2114 {
2115   struct mips_cl_insn insn;
2116   bfd_reloc_code_real_type unused_reloc[3]
2117     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2118
2119   imm_expr.X_op = O_absent;
2120   imm2_expr.X_op = O_absent;
2121   offset_expr.X_op = O_absent;
2122   imm_reloc[0] = BFD_RELOC_UNUSED;
2123   imm_reloc[1] = BFD_RELOC_UNUSED;
2124   imm_reloc[2] = BFD_RELOC_UNUSED;
2125   offset_reloc[0] = BFD_RELOC_UNUSED;
2126   offset_reloc[1] = BFD_RELOC_UNUSED;
2127   offset_reloc[2] = BFD_RELOC_UNUSED;
2128
2129   if (mips_opts.mips16)
2130     mips16_ip (str, &insn);
2131   else
2132     {
2133       mips_ip (str, &insn);
2134       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2135             str, insn.insn_opcode));
2136     }
2137
2138   if (insn_error)
2139     {
2140       as_bad ("%s `%s'", insn_error, str);
2141       return;
2142     }
2143
2144   if (insn.insn_mo->pinfo == INSN_MACRO)
2145     {
2146       macro_start ();
2147       if (mips_opts.mips16)
2148         mips16_macro (&insn);
2149       else
2150         macro (&insn);
2151       macro_end ();
2152     }
2153   else
2154     {
2155       if (imm_expr.X_op != O_absent)
2156         append_insn (&insn, &imm_expr, imm_reloc);
2157       else if (offset_expr.X_op != O_absent)
2158         append_insn (&insn, &offset_expr, offset_reloc);
2159       else
2160         append_insn (&insn, NULL, unused_reloc);
2161     }
2162 }
2163
2164 /* Convenience functions for abstracting away the differences between
2165    MIPS16 and non-MIPS16 relocations.  */
2166
2167 static inline bfd_boolean
2168 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2169 {
2170   switch (reloc)
2171     {
2172     case BFD_RELOC_MIPS16_JMP:
2173     case BFD_RELOC_MIPS16_GPREL:
2174     case BFD_RELOC_MIPS16_GOT16:
2175     case BFD_RELOC_MIPS16_CALL16:
2176     case BFD_RELOC_MIPS16_HI16_S:
2177     case BFD_RELOC_MIPS16_HI16:
2178     case BFD_RELOC_MIPS16_LO16:
2179       return TRUE;
2180
2181     default:
2182       return FALSE;
2183     }
2184 }
2185
2186 static inline bfd_boolean
2187 got16_reloc_p (bfd_reloc_code_real_type reloc)
2188 {
2189   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2190 }
2191
2192 static inline bfd_boolean
2193 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2194 {
2195   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2196 }
2197
2198 static inline bfd_boolean
2199 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2200 {
2201   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2202 }
2203
2204 /* Return true if the given relocation might need a matching %lo().
2205    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2206    need a matching %lo() when applied to local symbols.  */
2207
2208 static inline bfd_boolean
2209 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2210 {
2211   return (HAVE_IN_PLACE_ADDENDS
2212           && (hi16_reloc_p (reloc)
2213               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2214                  all GOT16 relocations evaluate to "G".  */
2215               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2216 }
2217
2218 /* Return the type of %lo() reloc needed by RELOC, given that
2219    reloc_needs_lo_p.  */
2220
2221 static inline bfd_reloc_code_real_type
2222 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2223 {
2224   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2225 }
2226
2227 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2228    relocation.  */
2229
2230 static inline bfd_boolean
2231 fixup_has_matching_lo_p (fixS *fixp)
2232 {
2233   return (fixp->fx_next != NULL
2234           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2235           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2236           && fixp->fx_offset == fixp->fx_next->fx_offset);
2237 }
2238
2239 /* See whether instruction IP reads register REG.  CLASS is the type
2240    of register.  */
2241
2242 static int
2243 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2244                enum mips_regclass regclass)
2245 {
2246   if (regclass == MIPS16_REG)
2247     {
2248       gas_assert (mips_opts.mips16);
2249       reg = mips16_to_32_reg_map[reg];
2250       regclass = MIPS_GR_REG;
2251     }
2252
2253   /* Don't report on general register ZERO, since it never changes.  */
2254   if (regclass == MIPS_GR_REG && reg == ZERO)
2255     return 0;
2256
2257   if (regclass == MIPS_FP_REG)
2258     {
2259       gas_assert (! mips_opts.mips16);
2260       /* If we are called with either $f0 or $f1, we must check $f0.
2261          This is not optimal, because it will introduce an unnecessary
2262          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2263          need to distinguish reading both $f0 and $f1 or just one of
2264          them.  Note that we don't have to check the other way,
2265          because there is no instruction that sets both $f0 and $f1
2266          and requires a delay.  */
2267       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2268           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2269               == (reg &~ (unsigned) 1)))
2270         return 1;
2271       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2272           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2273               == (reg &~ (unsigned) 1)))
2274         return 1;
2275       if ((ip->insn_mo->pinfo2 & INSN2_READ_FPR_Z)
2276           && ((EXTRACT_OPERAND (FZ, *ip) & ~(unsigned) 1)
2277               == (reg &~ (unsigned) 1)))
2278         return 1;
2279     }
2280   else if (! mips_opts.mips16)
2281     {
2282       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2283           && EXTRACT_OPERAND (RS, *ip) == reg)
2284         return 1;
2285       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2286           && EXTRACT_OPERAND (RT, *ip) == reg)
2287         return 1;
2288       if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_D)
2289           && EXTRACT_OPERAND (RD, *ip) == reg)
2290         return 1;
2291       if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_Z)
2292           && EXTRACT_OPERAND (RZ, *ip) == reg)
2293         return 1;
2294     }
2295   else
2296     {
2297       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2298           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2299         return 1;
2300       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2301           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2302         return 1;
2303       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2304           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2305               == reg))
2306         return 1;
2307       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2308         return 1;
2309       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2310         return 1;
2311       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2312         return 1;
2313       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2314           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2315         return 1;
2316     }
2317
2318   return 0;
2319 }
2320
2321 /* This function returns true if modifying a register requires a
2322    delay.  */
2323
2324 static int
2325 reg_needs_delay (unsigned int reg)
2326 {
2327   unsigned long prev_pinfo;
2328
2329   prev_pinfo = history[0].insn_mo->pinfo;
2330   if (! mips_opts.noreorder
2331       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2332            && ! gpr_interlocks)
2333           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2334               && ! cop_interlocks)))
2335     {
2336       /* A load from a coprocessor or from memory.  All load delays
2337          delay the use of general register rt for one instruction.  */
2338       /* Itbl support may require additional care here.  */
2339       know (prev_pinfo & INSN_WRITE_GPR_T);
2340       if (reg == EXTRACT_OPERAND (RT, history[0]))
2341         return 1;
2342     }
2343
2344   return 0;
2345 }
2346
2347 /* Move all labels in insn_labels to the current insertion point.  */
2348
2349 static void
2350 mips_move_labels (void)
2351 {
2352   segment_info_type *si = seg_info (now_seg);
2353   struct insn_label_list *l;
2354   valueT val;
2355
2356   for (l = si->label_list; l != NULL; l = l->next)
2357     {
2358       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2359       symbol_set_frag (l->label, frag_now);
2360       val = (valueT) frag_now_fix ();
2361       /* mips16 text labels are stored as odd.  */
2362       if (mips_opts.mips16)
2363         ++val;
2364       S_SET_VALUE (l->label, val);
2365     }
2366 }
2367
2368 static bfd_boolean
2369 s_is_linkonce (symbolS *sym, segT from_seg)
2370 {
2371   bfd_boolean linkonce = FALSE;
2372   segT symseg = S_GET_SEGMENT (sym);
2373
2374   if (symseg != from_seg && !S_IS_LOCAL (sym))
2375     {
2376       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2377         linkonce = TRUE;
2378 #ifdef OBJ_ELF
2379       /* The GNU toolchain uses an extension for ELF: a section
2380          beginning with the magic string .gnu.linkonce is a
2381          linkonce section.  */
2382       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2383                    sizeof ".gnu.linkonce" - 1) == 0)
2384         linkonce = TRUE;
2385 #endif
2386     }
2387   return linkonce;
2388 }
2389
2390 /* Mark instruction labels in mips16 mode.  This permits the linker to
2391    handle them specially, such as generating jalx instructions when
2392    needed.  We also make them odd for the duration of the assembly, in
2393    order to generate the right sort of code.  We will make them even
2394    in the adjust_symtab routine, while leaving them marked.  This is
2395    convenient for the debugger and the disassembler.  The linker knows
2396    to make them odd again.  */
2397
2398 static void
2399 mips16_mark_labels (void)
2400 {
2401   segment_info_type *si = seg_info (now_seg);
2402   struct insn_label_list *l;
2403
2404   if (!mips_opts.mips16)
2405     return;
2406
2407   for (l = si->label_list; l != NULL; l = l->next)
2408    {
2409       symbolS *label = l->label;
2410
2411 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2412       if (IS_ELF)
2413         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2414 #endif
2415       if ((S_GET_VALUE (label) & 1) == 0
2416         /* Don't adjust the address if the label is global or weak, or
2417            in a link-once section, since we'll be emitting symbol reloc
2418            references to it which will be patched up by the linker, and
2419            the final value of the symbol may or may not be MIPS16.  */
2420           && ! S_IS_WEAK (label)
2421           && ! S_IS_EXTERNAL (label)
2422           && ! s_is_linkonce (label, now_seg))
2423         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2424     }
2425 }
2426
2427 /* End the current frag.  Make it a variant frag and record the
2428    relaxation info.  */
2429
2430 static void
2431 relax_close_frag (void)
2432 {
2433   mips_macro_warning.first_frag = frag_now;
2434   frag_var (rs_machine_dependent, 0, 0,
2435             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2436             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2437
2438   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2439   mips_relax.first_fixup = 0;
2440 }
2441
2442 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2443    See the comment above RELAX_ENCODE for more details.  */
2444
2445 static void
2446 relax_start (symbolS *symbol)
2447 {
2448   gas_assert (mips_relax.sequence == 0);
2449   mips_relax.sequence = 1;
2450   mips_relax.symbol = symbol;
2451 }
2452
2453 /* Start generating the second version of a relaxable sequence.
2454    See the comment above RELAX_ENCODE for more details.  */
2455
2456 static void
2457 relax_switch (void)
2458 {
2459   gas_assert (mips_relax.sequence == 1);
2460   mips_relax.sequence = 2;
2461 }
2462
2463 /* End the current relaxable sequence.  */
2464
2465 static void
2466 relax_end (void)
2467 {
2468   gas_assert (mips_relax.sequence == 2);
2469   relax_close_frag ();
2470   mips_relax.sequence = 0;
2471 }
2472
2473 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2474    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2475    by VR4120 errata.  */
2476
2477 static unsigned int
2478 classify_vr4120_insn (const char *name)
2479 {
2480   if (strncmp (name, "macc", 4) == 0)
2481     return FIX_VR4120_MACC;
2482   if (strncmp (name, "dmacc", 5) == 0)
2483     return FIX_VR4120_DMACC;
2484   if (strncmp (name, "mult", 4) == 0)
2485     return FIX_VR4120_MULT;
2486   if (strncmp (name, "dmult", 5) == 0)
2487     return FIX_VR4120_DMULT;
2488   if (strstr (name, "div"))
2489     return FIX_VR4120_DIV;
2490   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2491     return FIX_VR4120_MTHILO;
2492   return NUM_FIX_VR4120_CLASSES;
2493 }
2494
2495 #define INSN_ERET  0x42000018
2496 #define INSN_DERET 0x4200001f
2497
2498 /* Return the number of instructions that must separate INSN1 and INSN2,
2499    where INSN1 is the earlier instruction.  Return the worst-case value
2500    for any INSN2 if INSN2 is null.  */
2501
2502 static unsigned int
2503 insns_between (const struct mips_cl_insn *insn1,
2504                const struct mips_cl_insn *insn2)
2505 {
2506   unsigned long pinfo1, pinfo2;
2507
2508   /* This function needs to know which pinfo flags are set for INSN2
2509      and which registers INSN2 uses.  The former is stored in PINFO2 and
2510      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2511      will have every flag set and INSN2_USES_REG will always return true.  */
2512   pinfo1 = insn1->insn_mo->pinfo;
2513   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2514
2515 #define INSN2_USES_REG(REG, CLASS) \
2516    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2517
2518   /* For most targets, write-after-read dependencies on the HI and LO
2519      registers must be separated by at least two instructions.  */
2520   if (!hilo_interlocks)
2521     {
2522       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2523         return 2;
2524       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2525         return 2;
2526     }
2527
2528   /* If we're working around r7000 errata, there must be two instructions
2529      between an mfhi or mflo and any instruction that uses the result.  */
2530   if (mips_7000_hilo_fix
2531       && MF_HILO_INSN (pinfo1)
2532       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2533     return 2;
2534
2535   /* If we're working around 24K errata, one instruction is required
2536      if an ERET or DERET is followed by a branch instruction.  */
2537   if (mips_fix_24k)
2538     {
2539       if (insn1->insn_opcode == INSN_ERET
2540           || insn1->insn_opcode == INSN_DERET)
2541         {
2542           if (insn2 == NULL
2543               || insn2->insn_opcode == INSN_ERET
2544               || insn2->insn_opcode == INSN_DERET
2545               || (insn2->insn_mo->pinfo
2546                   & (INSN_UNCOND_BRANCH_DELAY
2547                      | INSN_COND_BRANCH_DELAY
2548                      | INSN_COND_BRANCH_LIKELY)) != 0)
2549             return 1;
2550         }
2551     }
2552
2553   /* If working around VR4120 errata, check for combinations that need
2554      a single intervening instruction.  */
2555   if (mips_fix_vr4120)
2556     {
2557       unsigned int class1, class2;
2558
2559       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2560       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2561         {
2562           if (insn2 == NULL)
2563             return 1;
2564           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2565           if (vr4120_conflicts[class1] & (1 << class2))
2566             return 1;
2567         }
2568     }
2569
2570   if (!mips_opts.mips16)
2571     {
2572       /* Check for GPR or coprocessor load delays.  All such delays
2573          are on the RT register.  */
2574       /* Itbl support may require additional care here.  */
2575       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2576           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2577         {
2578           know (pinfo1 & INSN_WRITE_GPR_T);
2579           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2580             return 1;
2581         }
2582
2583       /* Check for generic coprocessor hazards.
2584
2585          This case is not handled very well.  There is no special
2586          knowledge of CP0 handling, and the coprocessors other than
2587          the floating point unit are not distinguished at all.  */
2588       /* Itbl support may require additional care here. FIXME!
2589          Need to modify this to include knowledge about
2590          user specified delays!  */
2591       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2592                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2593         {
2594           /* Handle cases where INSN1 writes to a known general coprocessor
2595              register.  There must be a one instruction delay before INSN2
2596              if INSN2 reads that register, otherwise no delay is needed.  */
2597           if (pinfo1 & INSN_WRITE_FPR_T)
2598             {
2599               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2600                 return 1;
2601             }
2602           else if (pinfo1 & INSN_WRITE_FPR_S)
2603             {
2604               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2605                 return 1;
2606             }
2607           else
2608             {
2609               /* Read-after-write dependencies on the control registers
2610                  require a two-instruction gap.  */
2611               if ((pinfo1 & INSN_WRITE_COND_CODE)
2612                   && (pinfo2 & INSN_READ_COND_CODE))
2613                 return 2;
2614
2615               /* We don't know exactly what INSN1 does.  If INSN2 is
2616                  also a coprocessor instruction, assume there must be
2617                  a one instruction gap.  */
2618               if (pinfo2 & INSN_COP)
2619                 return 1;
2620             }
2621         }
2622
2623       /* Check for read-after-write dependencies on the coprocessor
2624          control registers in cases where INSN1 does not need a general
2625          coprocessor delay.  This means that INSN1 is a floating point
2626          comparison instruction.  */
2627       /* Itbl support may require additional care here.  */
2628       else if (!cop_interlocks
2629                && (pinfo1 & INSN_WRITE_COND_CODE)
2630                && (pinfo2 & INSN_READ_COND_CODE))
2631         return 1;
2632     }
2633
2634 #undef INSN2_USES_REG
2635
2636   return 0;
2637 }
2638
2639 /* Return the number of nops that would be needed to work around the
2640    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2641    the MAX_VR4130_NOPS instructions described by HIST.  */
2642
2643 static int
2644 nops_for_vr4130 (const struct mips_cl_insn *hist,
2645                  const struct mips_cl_insn *insn)
2646 {
2647   int i, j, reg;
2648
2649   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2650      are not affected by the errata.  */
2651   if (insn != 0
2652       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2653           || strcmp (insn->insn_mo->name, "mtlo") == 0
2654           || strcmp (insn->insn_mo->name, "mthi") == 0))
2655     return 0;
2656
2657   /* Search for the first MFLO or MFHI.  */
2658   for (i = 0; i < MAX_VR4130_NOPS; i++)
2659     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2660       {
2661         /* Extract the destination register.  */
2662         if (mips_opts.mips16)
2663           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2664         else
2665           reg = EXTRACT_OPERAND (RD, hist[i]);
2666
2667         /* No nops are needed if INSN reads that register.  */
2668         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2669           return 0;
2670
2671         /* ...or if any of the intervening instructions do.  */
2672         for (j = 0; j < i; j++)
2673           if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2674             return 0;
2675
2676         return MAX_VR4130_NOPS - i;
2677       }
2678   return 0;
2679 }
2680
2681 /* Return the number of nops that would be needed if instruction INSN
2682    immediately followed the MAX_NOPS instructions given by HIST,
2683    where HIST[0] is the most recent instruction.  If INSN is null,
2684    return the worse-case number of nops for any instruction.  */
2685
2686 static int
2687 nops_for_insn (const struct mips_cl_insn *hist,
2688                const struct mips_cl_insn *insn)
2689 {
2690   int i, nops, tmp_nops;
2691
2692   nops = 0;
2693   for (i = 0; i < MAX_DELAY_NOPS; i++)
2694     {
2695       tmp_nops = insns_between (hist + i, insn) - i;
2696       if (tmp_nops > nops)
2697         nops = tmp_nops;
2698     }
2699
2700   if (mips_fix_vr4130)
2701     {
2702       tmp_nops = nops_for_vr4130 (hist, insn);
2703       if (tmp_nops > nops)
2704         nops = tmp_nops;
2705     }
2706
2707   return nops;
2708 }
2709
2710 /* The variable arguments provide NUM_INSNS extra instructions that
2711    might be added to HIST.  Return the largest number of nops that
2712    would be needed after the extended sequence.  */
2713
2714 static int
2715 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2716 {
2717   va_list args;
2718   struct mips_cl_insn buffer[MAX_NOPS];
2719   struct mips_cl_insn *cursor;
2720   int nops;
2721
2722   va_start (args, hist);
2723   cursor = buffer + num_insns;
2724   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2725   while (cursor > buffer)
2726     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2727
2728   nops = nops_for_insn (buffer, NULL);
2729   va_end (args);
2730   return nops;
2731 }
2732
2733 /* Like nops_for_insn, but if INSN is a branch, take into account the
2734    worst-case delay for the branch target.  */
2735
2736 static int
2737 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2738                          const struct mips_cl_insn *insn)
2739 {
2740   int nops, tmp_nops;
2741
2742   nops = nops_for_insn (hist, insn);
2743   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2744                               | INSN_COND_BRANCH_DELAY
2745                               | INSN_COND_BRANCH_LIKELY))
2746     {
2747       tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2748       if (tmp_nops > nops)
2749         nops = tmp_nops;
2750     }
2751   else if (mips_opts.mips16
2752            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2753                                        | MIPS16_INSN_COND_BRANCH)))
2754     {
2755       tmp_nops = nops_for_sequence (1, hist, insn);
2756       if (tmp_nops > nops)
2757         nops = tmp_nops;
2758     }
2759   return nops;
2760 }
2761
2762 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
2763
2764 static void
2765 fix_loongson2f_nop (struct mips_cl_insn * ip)
2766 {
2767   if (strcmp (ip->insn_mo->name, "nop") == 0)
2768     ip->insn_opcode = LOONGSON2F_NOP_INSN;
2769 }
2770
2771 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2772                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
2773
2774 static void
2775 fix_loongson2f_jump (struct mips_cl_insn * ip)
2776 {
2777   if (strcmp (ip->insn_mo->name, "j") == 0
2778       || strcmp (ip->insn_mo->name, "jr") == 0
2779       || strcmp (ip->insn_mo->name, "jalr") == 0)
2780     {
2781       int sreg;
2782       expressionS ep;
2783
2784       if (! mips_opts.at)
2785         return;
2786
2787       sreg = EXTRACT_OPERAND (RS, *ip);
2788       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2789         return;
2790
2791       ep.X_op = O_constant;
2792       ep.X_add_number = 0xcfff0000;
2793       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2794       ep.X_add_number = 0xffff;
2795       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2796       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2797     }
2798 }
2799
2800 static void
2801 fix_loongson2f (struct mips_cl_insn * ip)
2802 {
2803   if (mips_fix_loongson2f_nop)
2804     fix_loongson2f_nop (ip);
2805
2806   if (mips_fix_loongson2f_jump)
2807     fix_loongson2f_jump (ip);
2808 }
2809
2810 /* Output an instruction.  IP is the instruction information.
2811    ADDRESS_EXPR is an operand of the instruction to be used with
2812    RELOC_TYPE.  */
2813
2814 static void
2815 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2816              bfd_reloc_code_real_type *reloc_type)
2817 {
2818   unsigned long prev_pinfo, pinfo;
2819   unsigned long prev_pinfo2, pinfo2;
2820   relax_stateT prev_insn_frag_type = 0;
2821   bfd_boolean relaxed_branch = FALSE;
2822   segment_info_type *si = seg_info (now_seg);
2823
2824   if (mips_fix_loongson2f)
2825     fix_loongson2f (ip);
2826
2827   /* Mark instruction labels in mips16 mode.  */
2828   mips16_mark_labels ();
2829
2830   file_ase_mips16 |= mips_opts.mips16;
2831
2832   prev_pinfo = history[0].insn_mo->pinfo;
2833   prev_pinfo2 = history[0].insn_mo->pinfo2;
2834   pinfo = ip->insn_mo->pinfo;
2835   pinfo2 = ip->insn_mo->pinfo2;
2836
2837   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2838     {
2839       /* There are a lot of optimizations we could do that we don't.
2840          In particular, we do not, in general, reorder instructions.
2841          If you use gcc with optimization, it will reorder
2842          instructions and generally do much more optimization then we
2843          do here; repeating all that work in the assembler would only
2844          benefit hand written assembly code, and does not seem worth
2845          it.  */
2846       int nops = (mips_optimize == 0
2847                   ? nops_for_insn (history, NULL)
2848                   : nops_for_insn_or_target (history, ip));
2849       if (nops > 0)
2850         {
2851           fragS *old_frag;
2852           unsigned long old_frag_offset;
2853           int i;
2854
2855           old_frag = frag_now;
2856           old_frag_offset = frag_now_fix ();
2857
2858           for (i = 0; i < nops; i++)
2859             emit_nop ();
2860
2861           if (listing)
2862             {
2863               listing_prev_line ();
2864               /* We may be at the start of a variant frag.  In case we
2865                  are, make sure there is enough space for the frag
2866                  after the frags created by listing_prev_line.  The
2867                  argument to frag_grow here must be at least as large
2868                  as the argument to all other calls to frag_grow in
2869                  this file.  We don't have to worry about being in the
2870                  middle of a variant frag, because the variants insert
2871                  all needed nop instructions themselves.  */
2872               frag_grow (40);
2873             }
2874
2875           mips_move_labels ();
2876
2877 #ifndef NO_ECOFF_DEBUGGING
2878           if (ECOFF_DEBUGGING)
2879             ecoff_fix_loc (old_frag, old_frag_offset);
2880 #endif
2881         }
2882     }
2883   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2884     {
2885       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2886       int nops = nops_for_insn_or_target (history, ip);
2887       gas_assert (nops <= prev_nop_frag_holds);
2888
2889       /* Enforce NOPS as a minimum.  */
2890       if (nops > prev_nop_frag_required)
2891         prev_nop_frag_required = nops;
2892
2893       if (prev_nop_frag_holds == prev_nop_frag_required)
2894         {
2895           /* Settle for the current number of nops.  Update the history
2896              accordingly (for the benefit of any future .set reorder code).  */
2897           prev_nop_frag = NULL;
2898           insert_into_history (prev_nop_frag_since,
2899                                prev_nop_frag_holds, NOP_INSN);
2900         }
2901       else
2902         {
2903           /* Allow this instruction to replace one of the nops that was
2904              tentatively added to prev_nop_frag.  */
2905           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2906           prev_nop_frag_holds--;
2907           prev_nop_frag_since++;
2908         }
2909     }
2910
2911 #ifdef OBJ_ELF
2912   /* The value passed to dwarf2_emit_insn is the distance between
2913      the beginning of the current instruction and the address that
2914      should be recorded in the debug tables.  For MIPS16 debug info
2915      we want to use ISA-encoded addresses, so we pass -1 for an
2916      address higher by one than the current.  */
2917   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2918 #endif
2919
2920   /* Record the frag type before frag_var.  */
2921   if (history[0].frag)
2922     prev_insn_frag_type = history[0].frag->fr_type;
2923
2924   if (address_expr
2925       && *reloc_type == BFD_RELOC_16_PCREL_S2
2926       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2927           || pinfo & INSN_COND_BRANCH_LIKELY)
2928       && mips_relax_branch
2929       /* Don't try branch relaxation within .set nomacro, or within
2930          .set noat if we use $at for PIC computations.  If it turns
2931          out that the branch was out-of-range, we'll get an error.  */
2932       && !mips_opts.warn_about_macros
2933       && (mips_opts.at || mips_pic == NO_PIC)
2934       && !mips_opts.mips16)
2935     {
2936       relaxed_branch = TRUE;
2937       add_relaxed_insn (ip, (relaxed_branch_length
2938                              (NULL, NULL,
2939                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2940                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2941                               : 0)), 4,
2942                         RELAX_BRANCH_ENCODE
2943                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2944                          pinfo & INSN_COND_BRANCH_LIKELY,
2945                          pinfo & INSN_WRITE_GPR_31,
2946                          0),
2947                         address_expr->X_add_symbol,
2948                         address_expr->X_add_number);
2949       *reloc_type = BFD_RELOC_UNUSED;
2950     }
2951   else if (*reloc_type > BFD_RELOC_UNUSED)
2952     {
2953       /* We need to set up a variant frag.  */
2954       gas_assert (mips_opts.mips16 && address_expr != NULL);
2955       add_relaxed_insn (ip, 4, 0,
2956                         RELAX_MIPS16_ENCODE
2957                         (*reloc_type - BFD_RELOC_UNUSED,
2958                          mips16_small, mips16_ext,
2959                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2960                          history[0].mips16_absolute_jump_p),
2961                         make_expr_symbol (address_expr), 0);
2962     }
2963   else if (mips_opts.mips16
2964            && ! ip->use_extend
2965            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2966     {
2967       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2968         /* Make sure there is enough room to swap this instruction with
2969            a following jump instruction.  */
2970         frag_grow (6);
2971       add_fixed_insn (ip);
2972     }
2973   else
2974     {
2975       if (mips_opts.mips16
2976           && mips_opts.noreorder
2977           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2978         as_warn (_("extended instruction in delay slot"));
2979
2980       if (mips_relax.sequence)
2981         {
2982           /* If we've reached the end of this frag, turn it into a variant
2983              frag and record the information for the instructions we've
2984              written so far.  */
2985           if (frag_room () < 4)
2986             relax_close_frag ();
2987           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2988         }
2989
2990       if (mips_relax.sequence != 2)
2991         mips_macro_warning.sizes[0] += 4;
2992       if (mips_relax.sequence != 1)
2993         mips_macro_warning.sizes[1] += 4;
2994
2995       if (mips_opts.mips16)
2996         {
2997           ip->fixed_p = 1;
2998           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2999         }
3000       add_fixed_insn (ip);
3001     }
3002
3003   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
3004     {
3005       if (address_expr->X_op == O_constant)
3006         {
3007           unsigned int tmp;
3008
3009           switch (*reloc_type)
3010             {
3011             case BFD_RELOC_32:
3012               ip->insn_opcode |= address_expr->X_add_number;
3013               break;
3014
3015             case BFD_RELOC_MIPS_HIGHEST:
3016               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3017               ip->insn_opcode |= tmp & 0xffff;
3018               break;
3019
3020             case BFD_RELOC_MIPS_HIGHER:
3021               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3022               ip->insn_opcode |= tmp & 0xffff;
3023               break;
3024
3025             case BFD_RELOC_HI16_S:
3026               tmp = (address_expr->X_add_number + 0x8000) >> 16;
3027               ip->insn_opcode |= tmp & 0xffff;
3028               break;
3029
3030             case BFD_RELOC_HI16:
3031               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3032               break;
3033
3034             case BFD_RELOC_UNUSED:
3035             case BFD_RELOC_LO16:
3036             case BFD_RELOC_MIPS_GOT_DISP:
3037               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3038               break;
3039
3040             case BFD_RELOC_MIPS_JMP:
3041               if ((address_expr->X_add_number & 3) != 0)
3042                 as_bad (_("jump to misaligned address (0x%lx)"),
3043                         (unsigned long) address_expr->X_add_number);
3044               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3045               break;
3046
3047             case BFD_RELOC_MIPS16_JMP:
3048               if ((address_expr->X_add_number & 3) != 0)
3049                 as_bad (_("jump to misaligned address (0x%lx)"),
3050                         (unsigned long) address_expr->X_add_number);
3051               ip->insn_opcode |=
3052                 (((address_expr->X_add_number & 0x7c0000) << 3)
3053                  | ((address_expr->X_add_number & 0xf800000) >> 7)
3054                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
3055               break;
3056
3057             case BFD_RELOC_16_PCREL_S2:
3058               if ((address_expr->X_add_number & 3) != 0)
3059                 as_bad (_("branch to misaligned address (0x%lx)"),
3060                         (unsigned long) address_expr->X_add_number);
3061               if (mips_relax_branch)
3062                 goto need_reloc;
3063               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3064                 as_bad (_("branch address range overflow (0x%lx)"),
3065                         (unsigned long) address_expr->X_add_number);
3066               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3067               break;
3068
3069             default:
3070               internalError ();
3071             }
3072         }
3073       else if (*reloc_type < BFD_RELOC_UNUSED)
3074         need_reloc:
3075         {
3076           reloc_howto_type *howto;
3077           int i;
3078
3079           /* In a compound relocation, it is the final (outermost)
3080              operator that determines the relocated field.  */
3081           for (i = 1; i < 3; i++)
3082             if (reloc_type[i] == BFD_RELOC_UNUSED)
3083               break;
3084
3085           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3086           if (howto == NULL)
3087             {
3088               /* To reproduce this failure try assembling gas/testsuites/
3089                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3090                  assembler.  */
3091               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3092               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3093             }
3094           
3095           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3096                                      bfd_get_reloc_size (howto),
3097                                      address_expr,
3098                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3099                                      reloc_type[0]);
3100
3101           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3102           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3103               && ip->fixp[0]->fx_addsy)
3104             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3105
3106           /* These relocations can have an addend that won't fit in
3107              4 octets for 64bit assembly.  */
3108           if (HAVE_64BIT_GPRS
3109               && ! howto->partial_inplace
3110               && (reloc_type[0] == BFD_RELOC_16
3111                   || reloc_type[0] == BFD_RELOC_32
3112                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3113                   || reloc_type[0] == BFD_RELOC_GPREL16
3114                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3115                   || reloc_type[0] == BFD_RELOC_GPREL32
3116                   || reloc_type[0] == BFD_RELOC_64
3117                   || reloc_type[0] == BFD_RELOC_CTOR
3118                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3119                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3120                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3121                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3122                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3123                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3124                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3125                   || hi16_reloc_p (reloc_type[0])
3126                   || lo16_reloc_p (reloc_type[0])))
3127             ip->fixp[0]->fx_no_overflow = 1;
3128
3129           if (mips_relax.sequence)
3130             {
3131               if (mips_relax.first_fixup == 0)
3132                 mips_relax.first_fixup = ip->fixp[0];
3133             }
3134           else if (reloc_needs_lo_p (*reloc_type))
3135             {
3136               struct mips_hi_fixup *hi_fixup;
3137
3138               /* Reuse the last entry if it already has a matching %lo.  */
3139               hi_fixup = mips_hi_fixup_list;
3140               if (hi_fixup == 0
3141                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3142                 {
3143                   hi_fixup = ((struct mips_hi_fixup *)
3144                               xmalloc (sizeof (struct mips_hi_fixup)));
3145                   hi_fixup->next = mips_hi_fixup_list;
3146                   mips_hi_fixup_list = hi_fixup;
3147                 }
3148               hi_fixup->fixp = ip->fixp[0];
3149               hi_fixup->seg = now_seg;
3150             }
3151
3152           /* Add fixups for the second and third relocations, if given.
3153              Note that the ABI allows the second relocation to be
3154              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3155              moment we only use RSS_UNDEF, but we could add support
3156              for the others if it ever becomes necessary.  */
3157           for (i = 1; i < 3; i++)
3158             if (reloc_type[i] != BFD_RELOC_UNUSED)
3159               {
3160                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3161                                        ip->fixp[0]->fx_size, NULL, 0,
3162                                        FALSE, reloc_type[i]);
3163
3164                 /* Use fx_tcbit to mark compound relocs.  */
3165                 ip->fixp[0]->fx_tcbit = 1;
3166                 ip->fixp[i]->fx_tcbit = 1;
3167               }
3168         }
3169     }
3170   install_insn (ip);
3171
3172   /* Update the register mask information.  */
3173   if (! mips_opts.mips16)
3174     {
3175       if ((pinfo & INSN_WRITE_GPR_D) || (pinfo2 & INSN2_READ_GPR_D))
3176         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3177       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3178         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3179       if (pinfo & INSN_READ_GPR_S)
3180         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3181       if (pinfo & INSN_WRITE_GPR_31)
3182         mips_gprmask |= 1 << RA;
3183       if (pinfo2 & (INSN2_WRITE_GPR_Z | INSN2_READ_GPR_Z))
3184         mips_gprmask |= 1 << EXTRACT_OPERAND (RZ, *ip);
3185       if (pinfo & INSN_WRITE_FPR_D)
3186         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3187       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3188         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3189       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3190         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3191       if ((pinfo & INSN_READ_FPR_R) != 0)
3192         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3193       if (pinfo2 & (INSN2_WRITE_FPR_Z | INSN2_READ_FPR_Z))
3194         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FZ, *ip);
3195       if (pinfo & INSN_COP)
3196         {
3197           /* We don't keep enough information to sort these cases out.
3198              The itbl support does keep this information however, although
3199              we currently don't support itbl fprmats as part of the cop
3200              instruction.  May want to add this support in the future.  */
3201         }
3202       /* Never set the bit for $0, which is always zero.  */
3203       mips_gprmask &= ~1 << 0;
3204     }
3205   else
3206     {
3207       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3208         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3209       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3210         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3211       if (pinfo & MIPS16_INSN_WRITE_Z)
3212         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3213       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3214         mips_gprmask |= 1 << TREG;
3215       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3216         mips_gprmask |= 1 << SP;
3217       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3218         mips_gprmask |= 1 << RA;
3219       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3220         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3221       if (pinfo & MIPS16_INSN_READ_Z)
3222         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3223       if (pinfo & MIPS16_INSN_READ_GPR_X)
3224         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3225     }
3226
3227   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3228     {
3229       /* Filling the branch delay slot is more complex.  We try to
3230          switch the branch with the previous instruction, which we can
3231          do if the previous instruction does not set up a condition
3232          that the branch tests and if the branch is not itself the
3233          target of any branch.  */
3234       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3235           || (pinfo & INSN_COND_BRANCH_DELAY))
3236         {
3237           if (mips_optimize < 2
3238               /* If we have seen .set volatile or .set nomove, don't
3239                  optimize.  */
3240               || mips_opts.nomove != 0
3241               /* We can't swap if the previous instruction's position
3242                  is fixed.  */
3243               || history[0].fixed_p
3244               /* If the previous previous insn was in a .set
3245                  noreorder, we can't swap.  Actually, the MIPS
3246                  assembler will swap in this situation.  However, gcc
3247                  configured -with-gnu-as will generate code like
3248                    .set noreorder
3249                    lw   $4,XXX
3250                    .set reorder
3251                    INSN
3252                    bne  $4,$0,foo
3253                  in which we can not swap the bne and INSN.  If gcc is
3254                  not configured -with-gnu-as, it does not output the
3255                  .set pseudo-ops.  */
3256               || history[1].noreorder_p
3257               /* If the branch is itself the target of a branch, we
3258                  can not swap.  We cheat on this; all we check for is
3259                  whether there is a label on this instruction.  If
3260                  there are any branches to anything other than a
3261                  label, users must use .set noreorder.  */
3262               || si->label_list != NULL
3263               /* If the previous instruction is in a variant frag
3264                  other than this branch's one, we cannot do the swap.
3265                  This does not apply to the mips16, which uses variant
3266                  frags for different purposes.  */
3267               || (! mips_opts.mips16
3268                   && prev_insn_frag_type == rs_machine_dependent)
3269               /* Check for conflicts between the branch and the instructions
3270                  before the candidate delay slot.  */
3271               || nops_for_insn (history + 1, ip) > 0
3272               /* Check for conflicts between the swapped sequence and the
3273                  target of the branch.  */
3274               || nops_for_sequence (2, history + 1, ip, history) > 0
3275               /* We do not swap with a trap instruction, since it
3276                  complicates trap handlers to have the trap
3277                  instruction be in a delay slot.  */
3278               || (prev_pinfo & INSN_TRAP)
3279               /* If the branch reads a register that the previous
3280                  instruction sets, we can not swap.  */
3281               || (! mips_opts.mips16
3282                   && (prev_pinfo & INSN_WRITE_GPR_T)
3283                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3284                                     MIPS_GR_REG))
3285               || (! mips_opts.mips16
3286                   && (prev_pinfo & INSN_WRITE_GPR_D)
3287                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3288                                     MIPS_GR_REG))
3289               || (! mips_opts.mips16
3290                   && (prev_pinfo2 & INSN2_WRITE_GPR_Z)
3291                   && insn_uses_reg (ip, EXTRACT_OPERAND (RZ, history[0]),
3292                                     MIPS_GR_REG))
3293               || (mips_opts.mips16
3294                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3295                        && (insn_uses_reg
3296                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3297                             MIPS16_REG)))
3298                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3299                           && (insn_uses_reg
3300                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3301                                MIPS16_REG)))
3302                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3303                           && (insn_uses_reg
3304                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3305                                MIPS16_REG)))
3306                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3307                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3308                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3309                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3310                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3311                           && insn_uses_reg (ip,
3312                                             MIPS16OP_EXTRACT_REG32R
3313                                               (history[0].insn_opcode),
3314                                             MIPS_GR_REG))))
3315               /* If the branch writes a register that the previous
3316                  instruction sets, we can not swap (we know that
3317                  branches write only to RD or to $31).  */
3318               || (! mips_opts.mips16
3319                   && (prev_pinfo & INSN_WRITE_GPR_T)
3320                   && (((pinfo & INSN_WRITE_GPR_D)
3321                        && (EXTRACT_OPERAND (RT, history[0])
3322                            == EXTRACT_OPERAND (RD, *ip)))
3323                       || ((pinfo & INSN_WRITE_GPR_31)
3324                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3325               || (! mips_opts.mips16
3326                   && (prev_pinfo & INSN_WRITE_GPR_D)
3327                   && (((pinfo & INSN_WRITE_GPR_D)
3328                        && (EXTRACT_OPERAND (RD, history[0])
3329                            == EXTRACT_OPERAND (RD, *ip)))
3330                       || ((pinfo & INSN_WRITE_GPR_31)
3331                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3332               || (mips_opts.mips16
3333                   && (pinfo & MIPS16_INSN_WRITE_31)
3334                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3335                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3336                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3337                               == RA))))
3338               /* If the branch writes a register that the previous
3339                  instruction reads, we can not swap (we know that
3340                  branches only write to RD or to $31).  */
3341               || (! mips_opts.mips16
3342                   && (pinfo & INSN_WRITE_GPR_D)
3343                   && insn_uses_reg (&history[0],
3344                                     EXTRACT_OPERAND (RD, *ip),
3345                                     MIPS_GR_REG))
3346               || (! mips_opts.mips16
3347                   && (pinfo & INSN_WRITE_GPR_31)
3348                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3349               || (mips_opts.mips16
3350                   && (pinfo & MIPS16_INSN_WRITE_31)
3351                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3352               /* If one instruction sets a condition code and the
3353                  other one uses a condition code, we can not swap.  */
3354               || ((pinfo & INSN_READ_COND_CODE)
3355                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3356               || ((pinfo & INSN_WRITE_COND_CODE)
3357                   && (prev_pinfo & INSN_READ_COND_CODE))
3358               /* If the previous instruction uses the PC, we can not
3359                  swap.  */
3360               || (mips_opts.mips16
3361                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3362               /* If the previous instruction had a fixup in mips16
3363                  mode, we can not swap.  This normally means that the
3364                  previous instruction was a 4 byte branch anyhow.  */
3365               || (mips_opts.mips16 && history[0].fixp[0])
3366               /* If the previous instruction is a sync, sync.l, or
3367                  sync.p, we can not swap.  */
3368               || (prev_pinfo & INSN_SYNC)
3369               /* If the previous instruction is an ERET or
3370                  DERET, avoid the swap.  */
3371               || (history[0].insn_opcode == INSN_ERET)
3372               || (history[0].insn_opcode == INSN_DERET))
3373             {
3374               if (mips_opts.mips16
3375                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3376                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3377                   && ISA_SUPPORTS_MIPS16E)
3378                 {
3379                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3380                   ip->insn_opcode |= 0x0080;
3381                   install_insn (ip);
3382                   insert_into_history (0, 1, ip);
3383                 } 
3384               else
3385                 {
3386                   /* We could do even better for unconditional branches to
3387                      portions of this object file; we could pick up the
3388                      instruction at the destination, put it in the delay
3389                      slot, and bump the destination address.  */
3390                   insert_into_history (0, 1, ip);
3391                   emit_nop ();
3392                 }
3393                 
3394               if (mips_relax.sequence)
3395                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3396             }
3397           else
3398             {
3399               /* It looks like we can actually do the swap.  */
3400               struct mips_cl_insn delay = history[0];
3401               if (mips_opts.mips16)
3402                 {
3403                   know (delay.frag == ip->frag);
3404                   move_insn (ip, delay.frag, delay.where);
3405                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3406                 }
3407               else if (relaxed_branch)
3408                 {
3409                   /* Add the delay slot instruction to the end of the
3410                      current frag and shrink the fixed part of the
3411                      original frag.  If the branch occupies the tail of
3412                      the latter, move it backwards to cover the gap.  */
3413                   delay.frag->fr_fix -= 4;
3414                   if (delay.frag == ip->frag)
3415                     move_insn (ip, ip->frag, ip->where - 4);
3416                   add_fixed_insn (&delay);
3417                 }
3418               else
3419                 {
3420                   move_insn (&delay, ip->frag, ip->where);
3421                   move_insn (ip, history[0].frag, history[0].where);
3422                 }
3423               history[0] = *ip;
3424               delay.fixed_p = 1;
3425               insert_into_history (0, 1, &delay);
3426             }
3427
3428           /* If that was an unconditional branch, forget the previous
3429              insn information.  */
3430           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3431             {
3432               mips_no_prev_insn ();
3433             }
3434         }
3435       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3436         {
3437           /* We don't yet optimize a branch likely.  What we should do
3438              is look at the target, copy the instruction found there
3439              into the delay slot, and increment the branch to jump to
3440              the next instruction.  */
3441           insert_into_history (0, 1, ip);
3442           emit_nop ();
3443         }
3444       else
3445         insert_into_history (0, 1, ip);
3446     }
3447   else
3448     insert_into_history (0, 1, ip);
3449
3450   /* We just output an insn, so the next one doesn't have a label.  */
3451   mips_clear_insn_labels ();
3452 }
3453
3454 /* Forget that there was any previous instruction or label.  */
3455
3456 static void
3457 mips_no_prev_insn (void)
3458 {
3459   prev_nop_frag = NULL;
3460   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3461   mips_clear_insn_labels ();
3462 }
3463
3464 /* This function must be called before we emit something other than
3465    instructions.  It is like mips_no_prev_insn except that it inserts
3466    any NOPS that might be needed by previous instructions.  */
3467
3468 void
3469 mips_emit_delays (void)
3470 {
3471   if (! mips_opts.noreorder)
3472     {
3473       int nops = nops_for_insn (history, NULL);
3474       if (nops > 0)
3475         {
3476           while (nops-- > 0)
3477             add_fixed_insn (NOP_INSN);
3478           mips_move_labels ();
3479         }
3480     }
3481   mips_no_prev_insn ();
3482 }
3483
3484 /* Start a (possibly nested) noreorder block.  */
3485
3486 static void
3487 start_noreorder (void)
3488 {
3489   if (mips_opts.noreorder == 0)
3490     {
3491       unsigned int i;
3492       int nops;
3493
3494       /* None of the instructions before the .set noreorder can be moved.  */
3495       for (i = 0; i < ARRAY_SIZE (history); i++)
3496         history[i].fixed_p = 1;
3497
3498       /* Insert any nops that might be needed between the .set noreorder
3499          block and the previous instructions.  We will later remove any
3500          nops that turn out not to be needed.  */
3501       nops = nops_for_insn (history, NULL);
3502       if (nops > 0)
3503         {
3504           if (mips_optimize != 0)
3505             {
3506               /* Record the frag which holds the nop instructions, so
3507                  that we can remove them if we don't need them.  */
3508               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3509               prev_nop_frag = frag_now;
3510               prev_nop_frag_holds = nops;
3511               prev_nop_frag_required = 0;
3512               prev_nop_frag_since = 0;
3513             }
3514
3515           for (; nops > 0; --nops)
3516             add_fixed_insn (NOP_INSN);
3517
3518           /* Move on to a new frag, so that it is safe to simply
3519              decrease the size of prev_nop_frag.  */
3520           frag_wane (frag_now);
3521           frag_new (0);
3522           mips_move_labels ();
3523         }
3524       mips16_mark_labels ();
3525       mips_clear_insn_labels ();
3526     }
3527   mips_opts.noreorder++;
3528   mips_any_noreorder = 1;
3529 }
3530
3531 /* End a nested noreorder block.  */
3532
3533 static void
3534 end_noreorder (void)
3535 {
3536
3537   mips_opts.noreorder--;
3538   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3539     {
3540       /* Commit to inserting prev_nop_frag_required nops and go back to
3541          handling nop insertion the .set reorder way.  */
3542       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3543                                 * (mips_opts.mips16 ? 2 : 4));
3544       insert_into_history (prev_nop_frag_since,
3545                            prev_nop_frag_required, NOP_INSN);
3546       prev_nop_frag = NULL;
3547     }
3548 }
3549
3550 /* Set up global variables for the start of a new macro.  */
3551
3552 static void
3553 macro_start (void)
3554 {
3555   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3556   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3557                                      && (history[0].insn_mo->pinfo
3558                                          & (INSN_UNCOND_BRANCH_DELAY
3559                                             | INSN_COND_BRANCH_DELAY
3560                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3561 }
3562
3563 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3564    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3565    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3566
3567 static const char *
3568 macro_warning (relax_substateT subtype)
3569 {
3570   if (subtype & RELAX_DELAY_SLOT)
3571     return _("Macro instruction expanded into multiple instructions"
3572              " in a branch delay slot");
3573   else if (subtype & RELAX_NOMACRO)
3574     return _("Macro instruction expanded into multiple instructions");
3575   else
3576     return 0;
3577 }
3578
3579 /* Finish up a macro.  Emit warnings as appropriate.  */
3580
3581 static void
3582 macro_end (void)
3583 {
3584   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3585     {
3586       relax_substateT subtype;
3587
3588       /* Set up the relaxation warning flags.  */
3589       subtype = 0;
3590       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3591         subtype |= RELAX_SECOND_LONGER;
3592       if (mips_opts.warn_about_macros)
3593         subtype |= RELAX_NOMACRO;
3594       if (mips_macro_warning.delay_slot_p)
3595         subtype |= RELAX_DELAY_SLOT;
3596
3597       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3598         {
3599           /* Either the macro has a single implementation or both
3600              implementations are longer than 4 bytes.  Emit the
3601              warning now.  */
3602           const char *msg = macro_warning (subtype);
3603           if (msg != 0)
3604             as_warn ("%s", msg);
3605         }
3606       else
3607         {
3608           /* One implementation might need a warning but the other
3609              definitely doesn't.  */
3610           mips_macro_warning.first_frag->fr_subtype |= subtype;
3611         }
3612     }
3613 }
3614
3615 /* Read a macro's relocation codes from *ARGS and store them in *R.
3616    The first argument in *ARGS will be either the code for a single
3617    relocation or -1 followed by the three codes that make up a
3618    composite relocation.  */
3619
3620 static void
3621 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3622 {
3623   int i, next;
3624
3625   next = va_arg (*args, int);
3626   if (next >= 0)
3627     r[0] = (bfd_reloc_code_real_type) next;
3628   else
3629     for (i = 0; i < 3; i++)
3630       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3631 }
3632
3633 /* Build an instruction created by a macro expansion.  This is passed
3634    a pointer to the count of instructions created so far, an
3635    expression, the name of the instruction to build, an operand format
3636    string, and corresponding arguments.  */
3637
3638 static void
3639 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3640 {
3641   const struct mips_opcode *mo;
3642   struct mips_cl_insn insn;
3643   bfd_reloc_code_real_type r[3];
3644   va_list args;
3645
3646   va_start (args, fmt);
3647
3648   if (mips_opts.mips16)
3649     {
3650       mips16_macro_build (ep, name, fmt, &args);
3651       va_end (args);
3652       return;
3653     }
3654
3655   r[0] = BFD_RELOC_UNUSED;
3656   r[1] = BFD_RELOC_UNUSED;
3657   r[2] = BFD_RELOC_UNUSED;
3658   mo = (struct mips_opcode *) hash_find (op_hash, name);
3659   gas_assert (mo);
3660   gas_assert (strcmp (name, mo->name) == 0);
3661
3662   while (1)
3663     {
3664       /* Search until we get a match for NAME.  It is assumed here that
3665          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3666       if (strcmp (fmt, mo->args) == 0
3667           && mo->pinfo != INSN_MACRO
3668           && is_opcode_valid (mo))
3669         break;
3670
3671       ++mo;
3672       gas_assert (mo->name);
3673       gas_assert (strcmp (name, mo->name) == 0);
3674     }
3675
3676   create_insn (&insn, mo);
3677   for (;;)
3678     {
3679       switch (*fmt++)
3680         {
3681         case '\0':
3682           break;
3683
3684         case ',':
3685         case '(':
3686         case ')':
3687           continue;
3688
3689         case '+':
3690           switch (*fmt++)
3691             {
3692             case 'A':
3693             case 'E':
3694               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3695               continue;
3696
3697             case 'B':
3698             case 'F':
3699               /* Note that in the macro case, these arguments are already
3700                  in MSB form.  (When handling the instruction in the
3701                  non-macro case, these arguments are sizes from which
3702                  MSB values must be calculated.)  */
3703               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3704               continue;
3705
3706             case 'C':
3707             case 'G':
3708             case 'H':
3709               /* Note that in the macro case, these arguments are already
3710                  in MSBD form.  (When handling the instruction in the
3711                  non-macro case, these arguments are sizes from which
3712                  MSBD values must be calculated.)  */
3713               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3714               continue;
3715
3716             case 'Q':
3717               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3718               continue;
3719
3720             default:
3721               internalError ();
3722             }
3723           continue;
3724
3725         case '2':
3726           INSERT_OPERAND (BP, insn, va_arg (args, int));
3727           continue;
3728
3729         case 't':
3730         case 'w':
3731         case 'E':
3732           INSERT_OPERAND (RT, insn, va_arg (args, int));
3733           continue;
3734
3735         case 'c':
3736           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3737           continue;
3738
3739         case 'T':
3740         case 'W':
3741           INSERT_OPERAND (FT, insn, va_arg (args, int));
3742           continue;
3743
3744         case 'd':
3745         case 'G':
3746         case 'K':
3747           INSERT_OPERAND (RD, insn, va_arg (args, int));
3748           continue;
3749
3750         case 'U':
3751           {
3752             int tmp = va_arg (args, int);
3753
3754             INSERT_OPERAND (RT, insn, tmp);
3755             INSERT_OPERAND (RD, insn, tmp);
3756             continue;
3757           }
3758
3759         case 'V':
3760         case 'S':
3761           INSERT_OPERAND (FS, insn, va_arg (args, int));
3762           continue;
3763
3764         case 'z':
3765           continue;
3766
3767         case '<':
3768           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3769           continue;
3770
3771         case 'D':
3772           INSERT_OPERAND (FD, insn, va_arg (args, int));
3773           continue;
3774
3775         case 'B':
3776           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3777           continue;
3778
3779         case 'J':
3780           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3781           continue;
3782
3783         case 'q':
3784           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3785           continue;
3786
3787         case 'b':
3788         case 's':
3789         case 'r':
3790         case 'v':
3791           INSERT_OPERAND (RS, insn, va_arg (args, int));
3792           continue;
3793
3794         case 'i':
3795         case 'j':
3796           macro_read_relocs (&args, r);
3797           gas_assert (*r == BFD_RELOC_GPREL16
3798                       || *r == BFD_RELOC_MIPS_HIGHER
3799                       || *r == BFD_RELOC_HI16_S
3800                       || *r == BFD_RELOC_LO16
3801                       || *r == BFD_RELOC_MIPS_GOT_OFST);
3802           continue;
3803
3804         case 'o':
3805           macro_read_relocs (&args, r);
3806           continue;
3807
3808         case 'u':
3809           macro_read_relocs (&args, r);
3810           gas_assert (ep != NULL
3811                       && (ep->X_op == O_constant
3812                           || (ep->X_op == O_symbol
3813                               && (*r == BFD_RELOC_MIPS_HIGHEST
3814                                   || *r == BFD_RELOC_HI16_S
3815                                   || *r == BFD_RELOC_HI16
3816                                   || *r == BFD_RELOC_GPREL16
3817                                   || *r == BFD_RELOC_MIPS_GOT_HI16
3818                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
3819           continue;
3820
3821         case 'p':
3822           gas_assert (ep != NULL);
3823
3824           /*
3825            * This allows macro() to pass an immediate expression for
3826            * creating short branches without creating a symbol.
3827            *
3828            * We don't allow branch relaxation for these branches, as
3829            * they should only appear in ".set nomacro" anyway.
3830            */
3831           if (ep->X_op == O_constant)
3832             {
3833               if ((ep->X_add_number & 3) != 0)
3834                 as_bad (_("branch to misaligned address (0x%lx)"),
3835                         (unsigned long) ep->X_add_number);
3836               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3837                 as_bad (_("branch address range overflow (0x%lx)"),
3838                         (unsigned long) ep->X_add_number);
3839               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3840               ep = NULL;
3841             }
3842           else
3843             *r = BFD_RELOC_16_PCREL_S2;
3844           continue;
3845
3846         case 'a':
3847           gas_assert (ep != NULL);
3848           *r = BFD_RELOC_MIPS_JMP;
3849           continue;
3850
3851         case 'C':
3852           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3853           continue;
3854
3855         case 'k':
3856           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3857           continue;
3858
3859         default:
3860           internalError ();
3861         }
3862       break;
3863     }
3864   va_end (args);
3865   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3866
3867   append_insn (&insn, ep, r);
3868 }
3869
3870 static void
3871 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3872                     va_list *args)
3873 {
3874   struct mips_opcode *mo;
3875   struct mips_cl_insn insn;
3876   bfd_reloc_code_real_type r[3]
3877     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3878
3879   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3880   gas_assert (mo);
3881   gas_assert (strcmp (name, mo->name) == 0);
3882
3883   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3884     {
3885       ++mo;
3886       gas_assert (mo->name);
3887       gas_assert (strcmp (name, mo->name) == 0);
3888     }
3889
3890   create_insn (&insn, mo);
3891   for (;;)
3892     {
3893       int c;
3894
3895       c = *fmt++;
3896       switch (c)
3897         {
3898         case '\0':
3899           break;
3900
3901         case ',':
3902         case '(':
3903         case ')':
3904           continue;
3905
3906         case 'y':
3907         case 'w':
3908           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
3909           continue;
3910
3911         case 'x':
3912         case 'v':
3913           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
3914           continue;
3915
3916         case 'z':
3917           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
3918           continue;
3919
3920         case 'Z':
3921           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
3922           continue;
3923
3924         case '0':
3925         case 'S':
3926         case 'P':
3927         case 'R':
3928           continue;
3929
3930         case 'X':
3931           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
3932           continue;
3933
3934         case 'Y':
3935           {
3936             int regno;
3937
3938             regno = va_arg (*args, int);
3939             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3940             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3941           }
3942           continue;
3943
3944         case '<':
3945         case '>':
3946         case '4':
3947         case '5':
3948         case 'H':
3949         case 'W':
3950         case 'D':
3951         case 'j':
3952         case '8':
3953         case 'V':
3954         case 'C':
3955         case 'U':
3956         case 'k':
3957         case 'K':
3958         case 'p':
3959         case 'q':
3960           {
3961             gas_assert (ep != NULL);
3962
3963             if (ep->X_op != O_constant)
3964               *r = (int) BFD_RELOC_UNUSED + c;
3965             else
3966               {
3967                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3968                               FALSE, &insn.insn_opcode, &insn.use_extend,
3969                               &insn.extend);
3970                 ep = NULL;
3971                 *r = BFD_RELOC_UNUSED;
3972               }
3973           }
3974           continue;
3975
3976         case '6':
3977           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
3978           continue;
3979         }
3980
3981       break;
3982     }
3983
3984   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3985
3986   append_insn (&insn, ep, r);
3987 }
3988
3989 /*
3990  * Sign-extend 32-bit mode constants that have bit 31 set and all
3991  * higher bits unset.
3992  */
3993 static void
3994 normalize_constant_expr (expressionS *ex)
3995 {
3996   if (ex->X_op == O_constant
3997       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3998     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3999                         - 0x80000000);
4000 }
4001
4002 /*
4003  * Sign-extend 32-bit mode address offsets that have bit 31 set and
4004  * all higher bits unset.
4005  */
4006 static void
4007 normalize_address_expr (expressionS *ex)
4008 {
4009   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4010         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4011       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4012     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4013                         - 0x80000000);
4014 }
4015
4016 /*
4017  * Generate a "jalr" instruction with a relocation hint to the called
4018  * function.  This occurs in NewABI PIC code.
4019  */
4020 static void
4021 macro_build_jalr (expressionS *ep)
4022 {
4023   char *f = NULL;
4024
4025   if (MIPS_JALR_HINT_P (ep))
4026     {
4027       frag_grow (8);
4028       f = frag_more (0);
4029     }
4030   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4031   if (MIPS_JALR_HINT_P (ep))
4032     fix_new_exp (frag_now, f - frag_now->fr_literal,
4033                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4034 }
4035
4036 /*
4037  * Generate a "lui" instruction.
4038  */
4039 static void
4040 macro_build_lui (expressionS *ep, int regnum)
4041 {
4042   expressionS high_expr;
4043   const struct mips_opcode *mo;
4044   struct mips_cl_insn insn;
4045   bfd_reloc_code_real_type r[3]
4046     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4047   const char *name = "lui";
4048   const char *fmt = "t,u";
4049
4050   gas_assert (! mips_opts.mips16);
4051
4052   high_expr = *ep;
4053
4054   if (high_expr.X_op == O_constant)
4055     {
4056       /* We can compute the instruction now without a relocation entry.  */
4057       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4058                                 >> 16) & 0xffff;
4059       *r = BFD_RELOC_UNUSED;
4060     }
4061   else
4062     {
4063       gas_assert (ep->X_op == O_symbol);
4064       /* _gp_disp is a special case, used from s_cpload.
4065          __gnu_local_gp is used if mips_no_shared.  */
4066       gas_assert (mips_pic == NO_PIC
4067               || (! HAVE_NEWABI
4068                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4069               || (! mips_in_shared
4070                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4071                              "__gnu_local_gp") == 0));
4072       *r = BFD_RELOC_HI16_S;
4073     }
4074
4075   mo = hash_find (op_hash, name);
4076   gas_assert (strcmp (name, mo->name) == 0);
4077   gas_assert (strcmp (fmt, mo->args) == 0);
4078   create_insn (&insn, mo);
4079
4080   insn.insn_opcode = insn.insn_mo->match;
4081   INSERT_OPERAND (RT, insn, regnum);
4082   if (*r == BFD_RELOC_UNUSED)
4083     {
4084       insn.insn_opcode |= high_expr.X_add_number;
4085       append_insn (&insn, NULL, r);
4086     }
4087   else
4088     append_insn (&insn, &high_expr, r);
4089 }
4090
4091 /* Generate a sequence of instructions to do a load or store from a constant
4092    offset off of a base register (breg) into/from a target register (treg),
4093    using AT if necessary.  */
4094 static void
4095 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4096                               int treg, int breg, int dbl)
4097 {
4098   gas_assert (ep->X_op == O_constant);
4099
4100   /* Sign-extending 32-bit constants makes their handling easier.  */
4101   if (!dbl)
4102     normalize_constant_expr (ep);
4103
4104   /* Right now, this routine can only handle signed 32-bit constants.  */
4105   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4106     as_warn (_("operand overflow"));
4107
4108   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4109     {
4110       /* Signed 16-bit offset will fit in the op.  Easy!  */
4111       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4112     }
4113   else
4114     {
4115       /* 32-bit offset, need multiple instructions and AT, like:
4116            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4117            addu     $tempreg,$tempreg,$breg
4118            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4119          to handle the complete offset.  */
4120       macro_build_lui (ep, AT);
4121       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4122       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4123
4124       if (!mips_opts.at)
4125         as_bad (_("Macro used $at after \".set noat\""));
4126     }
4127 }
4128
4129 /*                      set_at()
4130  * Generates code to set the $at register to true (one)
4131  * if reg is less than the immediate expression.
4132  */
4133 static void
4134 set_at (int reg, int unsignedp)
4135 {
4136   if (imm_expr.X_op == O_constant
4137       && imm_expr.X_add_number >= -0x8000
4138       && imm_expr.X_add_number < 0x8000)
4139     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4140                  AT, reg, BFD_RELOC_LO16);
4141   else
4142     {
4143       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4144       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4145     }
4146 }
4147
4148 /* Warn if an expression is not a constant.  */
4149
4150 static void
4151 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4152 {
4153   if (ex->X_op == O_big)
4154     as_bad (_("unsupported large constant"));
4155   else if (ex->X_op != O_constant)
4156     as_bad (_("Instruction %s requires absolute expression"),
4157             ip->insn_mo->name);
4158
4159   if (HAVE_32BIT_GPRS)
4160     normalize_constant_expr (ex);
4161 }
4162
4163 /* Count the leading zeroes by performing a binary chop. This is a
4164    bulky bit of source, but performance is a LOT better for the
4165    majority of values than a simple loop to count the bits:
4166        for (lcnt = 0; (lcnt < 32); lcnt++)
4167          if ((v) & (1 << (31 - lcnt)))
4168            break;
4169   However it is not code size friendly, and the gain will drop a bit
4170   on certain cached systems.
4171 */
4172 #define COUNT_TOP_ZEROES(v)             \
4173   (((v) & ~0xffff) == 0                 \
4174    ? ((v) & ~0xff) == 0                 \
4175      ? ((v) & ~0xf) == 0                \
4176        ? ((v) & ~0x3) == 0              \
4177          ? ((v) & ~0x1) == 0            \
4178            ? !(v)                       \
4179              ? 32                       \
4180              : 31                       \
4181            : 30                         \
4182          : ((v) & ~0x7) == 0            \
4183            ? 29                         \
4184            : 28                         \
4185        : ((v) & ~0x3f) == 0             \
4186          ? ((v) & ~0x1f) == 0           \
4187            ? 27                         \
4188            : 26                         \
4189          : ((v) & ~0x7f) == 0           \
4190            ? 25                         \
4191            : 24                         \
4192      : ((v) & ~0xfff) == 0              \
4193        ? ((v) & ~0x3ff) == 0            \
4194          ? ((v) & ~0x1ff) == 0          \
4195            ? 23                         \
4196            : 22                         \
4197          : ((v) & ~0x7ff) == 0          \
4198            ? 21                         \
4199            : 20                         \
4200        : ((v) & ~0x3fff) == 0           \
4201          ? ((v) & ~0x1fff) == 0         \
4202            ? 19                         \
4203            : 18                         \
4204          : ((v) & ~0x7fff) == 0         \
4205            ? 17                         \
4206            : 16                         \
4207    : ((v) & ~0xffffff) == 0             \
4208      ? ((v) & ~0xfffff) == 0            \
4209        ? ((v) & ~0x3ffff) == 0          \
4210          ? ((v) & ~0x1ffff) == 0        \
4211            ? 15                         \
4212            : 14                         \
4213          : ((v) & ~0x7ffff) == 0        \
4214            ? 13                         \
4215            : 12                         \
4216        : ((v) & ~0x3fffff) == 0         \
4217          ? ((v) & ~0x1fffff) == 0       \
4218            ? 11                         \
4219            : 10                         \
4220          : ((v) & ~0x7fffff) == 0       \
4221            ? 9                          \
4222            : 8                          \
4223      : ((v) & ~0xfffffff) == 0          \
4224        ? ((v) & ~0x3ffffff) == 0        \
4225          ? ((v) & ~0x1ffffff) == 0      \
4226            ? 7                          \
4227            : 6                          \
4228          : ((v) & ~0x7ffffff) == 0      \
4229            ? 5                          \
4230            : 4                          \
4231        : ((v) & ~0x3fffffff) == 0       \
4232          ? ((v) & ~0x1fffffff) == 0     \
4233            ? 3                          \
4234            : 2                          \
4235          : ((v) & ~0x7fffffff) == 0     \
4236            ? 1                          \
4237            : 0)
4238
4239 /*                      load_register()
4240  *  This routine generates the least number of instructions necessary to load
4241  *  an absolute expression value into a register.
4242  */
4243 static void
4244 load_register (int reg, expressionS *ep, int dbl)
4245 {
4246   int freg;
4247   expressionS hi32, lo32;
4248
4249   if (ep->X_op != O_big)
4250     {
4251       gas_assert (ep->X_op == O_constant);
4252
4253       /* Sign-extending 32-bit constants makes their handling easier.  */
4254       if (!dbl)
4255         normalize_constant_expr (ep);
4256
4257       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4258         {
4259           /* We can handle 16 bit signed values with an addiu to
4260              $zero.  No need to ever use daddiu here, since $zero and
4261              the result are always correct in 32 bit mode.  */
4262           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4263           return;
4264         }
4265       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4266         {
4267           /* We can handle 16 bit unsigned values with an ori to
4268              $zero.  */
4269           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4270           return;
4271         }
4272       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4273         {
4274           /* 32 bit values require an lui.  */
4275           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4276           if ((ep->X_add_number & 0xffff) != 0)
4277             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4278           return;
4279         }
4280     }
4281
4282   /* The value is larger than 32 bits.  */
4283
4284   if (!dbl || HAVE_32BIT_GPRS)
4285     {
4286       char value[32];
4287
4288       sprintf_vma (value, ep->X_add_number);
4289       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4290       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4291       return;
4292     }
4293
4294   if (ep->X_op != O_big)
4295     {
4296       hi32 = *ep;
4297       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4298       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4299       hi32.X_add_number &= 0xffffffff;
4300       lo32 = *ep;
4301       lo32.X_add_number &= 0xffffffff;
4302     }
4303   else
4304     {
4305       gas_assert (ep->X_add_number > 2);
4306       if (ep->X_add_number == 3)
4307         generic_bignum[3] = 0;
4308       else if (ep->X_add_number > 4)
4309         as_bad (_("Number larger than 64 bits"));
4310       lo32.X_op = O_constant;
4311       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4312       hi32.X_op = O_constant;
4313       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4314     }
4315
4316   if (hi32.X_add_number == 0)
4317     freg = 0;
4318   else
4319     {
4320       int shift, bit;
4321       unsigned long hi, lo;
4322
4323       if (hi32.X_add_number == (offsetT) 0xffffffff)
4324         {
4325           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4326             {
4327               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4328               return;
4329             }
4330           if (lo32.X_add_number & 0x80000000)
4331             {
4332               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4333               if (lo32.X_add_number & 0xffff)
4334                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4335               return;
4336             }
4337         }
4338
4339       /* Check for 16bit shifted constant.  We know that hi32 is
4340          non-zero, so start the mask on the first bit of the hi32
4341          value.  */
4342       shift = 17;
4343       do
4344         {
4345           unsigned long himask, lomask;
4346
4347           if (shift < 32)
4348             {
4349               himask = 0xffff >> (32 - shift);
4350               lomask = (0xffff << shift) & 0xffffffff;
4351             }
4352           else
4353             {
4354               himask = 0xffff << (shift - 32);
4355               lomask = 0;
4356             }
4357           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4358               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4359             {
4360               expressionS tmp;
4361
4362               tmp.X_op = O_constant;
4363               if (shift < 32)
4364                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4365                                     | (lo32.X_add_number >> shift));
4366               else
4367                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4368               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4369               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4370                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4371               return;
4372             }
4373           ++shift;
4374         }
4375       while (shift <= (64 - 16));
4376
4377       /* Find the bit number of the lowest one bit, and store the
4378          shifted value in hi/lo.  */
4379       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4380       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4381       if (lo != 0)
4382         {
4383           bit = 0;
4384           while ((lo & 1) == 0)
4385             {
4386               lo >>= 1;
4387               ++bit;
4388             }
4389           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4390           hi >>= bit;
4391         }
4392       else
4393         {
4394           bit = 32;
4395           while ((hi & 1) == 0)
4396             {
4397               hi >>= 1;
4398               ++bit;
4399             }
4400           lo = hi;
4401           hi = 0;
4402         }
4403
4404       /* Optimize if the shifted value is a (power of 2) - 1.  */
4405       if ((hi == 0 && ((lo + 1) & lo) == 0)
4406           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4407         {
4408           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4409           if (shift != 0)
4410             {
4411               expressionS tmp;
4412
4413               /* This instruction will set the register to be all
4414                  ones.  */
4415               tmp.X_op = O_constant;
4416               tmp.X_add_number = (offsetT) -1;
4417               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4418               if (bit != 0)
4419                 {
4420                   bit += shift;
4421                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4422                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4423                 }
4424               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4425                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4426               return;
4427             }
4428         }
4429
4430       /* Sign extend hi32 before calling load_register, because we can
4431          generally get better code when we load a sign extended value.  */
4432       if ((hi32.X_add_number & 0x80000000) != 0)
4433         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4434       load_register (reg, &hi32, 0);
4435       freg = reg;
4436     }
4437   if ((lo32.X_add_number & 0xffff0000) == 0)
4438     {
4439       if (freg != 0)
4440         {
4441           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4442           freg = reg;
4443         }
4444     }
4445   else
4446     {
4447       expressionS mid16;
4448
4449       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4450         {
4451           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4452           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4453           return;
4454         }
4455
4456       if (freg != 0)
4457         {
4458           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4459           freg = reg;
4460         }
4461       mid16 = lo32;
4462       mid16.X_add_number >>= 16;
4463       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4464       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4465       freg = reg;
4466     }
4467   if ((lo32.X_add_number & 0xffff) != 0)
4468     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4469 }
4470
4471 static inline void
4472 load_delay_nop (void)
4473 {
4474   if (!gpr_interlocks)
4475     macro_build (NULL, "nop", "");
4476 }
4477
4478 /* Load an address into a register.  */
4479
4480 static void
4481 load_address (int reg, expressionS *ep, int *used_at)
4482 {
4483   if (ep->X_op != O_constant
4484       && ep->X_op != O_symbol)
4485     {
4486       as_bad (_("expression too complex"));
4487       ep->X_op = O_constant;
4488     }
4489
4490   if (ep->X_op == O_constant)
4491     {
4492       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4493       return;
4494     }
4495
4496   if (mips_pic == NO_PIC)
4497     {
4498       /* If this is a reference to a GP relative symbol, we want
4499            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4500          Otherwise we want
4501            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4502            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4503          If we have an addend, we always use the latter form.
4504
4505          With 64bit address space and a usable $at we want
4506            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4507            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4508            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4509            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4510            dsll32       $reg,0
4511            daddu        $reg,$reg,$at
4512
4513          If $at is already in use, we use a path which is suboptimal
4514          on superscalar processors.
4515            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4516            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4517            dsll         $reg,16
4518            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4519            dsll         $reg,16
4520            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4521
4522          For GP relative symbols in 64bit address space we can use
4523          the same sequence as in 32bit address space.  */
4524       if (HAVE_64BIT_SYMBOLS)
4525         {
4526           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4527               && !nopic_need_relax (ep->X_add_symbol, 1))
4528             {
4529               relax_start (ep->X_add_symbol);
4530               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4531                            mips_gp_register, BFD_RELOC_GPREL16);
4532               relax_switch ();
4533             }
4534
4535           if (*used_at == 0 && mips_opts.at)
4536             {
4537               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4538               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4539               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4540                            BFD_RELOC_MIPS_HIGHER);
4541               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4542               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4543               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4544               *used_at = 1;
4545             }
4546           else
4547             {
4548               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4549               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4550                            BFD_RELOC_MIPS_HIGHER);
4551               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4552               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4553               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4554               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4555             }
4556
4557           if (mips_relax.sequence)
4558             relax_end ();
4559         }
4560       else
4561         {
4562           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4563               && !nopic_need_relax (ep->X_add_symbol, 1))
4564             {
4565               relax_start (ep->X_add_symbol);
4566               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4567                            mips_gp_register, BFD_RELOC_GPREL16);
4568               relax_switch ();
4569             }
4570           macro_build_lui (ep, reg);
4571           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4572                        reg, reg, BFD_RELOC_LO16);
4573           if (mips_relax.sequence)
4574             relax_end ();
4575         }
4576     }
4577   else if (!mips_big_got)
4578     {
4579       expressionS ex;
4580
4581       /* If this is a reference to an external symbol, we want
4582            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4583          Otherwise we want
4584            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4585            nop
4586            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4587          If there is a constant, it must be added in after.
4588
4589          If we have NewABI, we want
4590            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4591          unless we're referencing a global symbol with a non-zero
4592          offset, in which case cst must be added separately.  */
4593       if (HAVE_NEWABI)
4594         {
4595           if (ep->X_add_number)
4596             {
4597               ex.X_add_number = ep->X_add_number;
4598               ep->X_add_number = 0;
4599               relax_start (ep->X_add_symbol);
4600               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4601                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4602               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4603                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4604               ex.X_op = O_constant;
4605               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4606                            reg, reg, BFD_RELOC_LO16);
4607               ep->X_add_number = ex.X_add_number;
4608               relax_switch ();
4609             }
4610           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4611                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4612           if (mips_relax.sequence)
4613             relax_end ();
4614         }
4615       else
4616         {
4617           ex.X_add_number = ep->X_add_number;
4618           ep->X_add_number = 0;
4619           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4620                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4621           load_delay_nop ();
4622           relax_start (ep->X_add_symbol);
4623           relax_switch ();
4624           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4625                        BFD_RELOC_LO16);
4626           relax_end ();
4627
4628           if (ex.X_add_number != 0)
4629             {
4630               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4631                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4632               ex.X_op = O_constant;
4633               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4634                            reg, reg, BFD_RELOC_LO16);
4635             }
4636         }
4637     }
4638   else if (mips_big_got)
4639     {
4640       expressionS ex;
4641
4642       /* This is the large GOT case.  If this is a reference to an
4643          external symbol, we want
4644            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4645            addu         $reg,$reg,$gp
4646            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4647
4648          Otherwise, for a reference to a local symbol in old ABI, we want
4649            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4650            nop
4651            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4652          If there is a constant, it must be added in after.
4653
4654          In the NewABI, for local symbols, with or without offsets, we want:
4655            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4656            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4657       */
4658       if (HAVE_NEWABI)
4659         {
4660           ex.X_add_number = ep->X_add_number;
4661           ep->X_add_number = 0;
4662           relax_start (ep->X_add_symbol);
4663           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4664           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4665                        reg, reg, mips_gp_register);
4666           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4667                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4668           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4669             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4670           else if (ex.X_add_number)
4671             {
4672               ex.X_op = O_constant;
4673               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4674                            BFD_RELOC_LO16);
4675             }
4676
4677           ep->X_add_number = ex.X_add_number;
4678           relax_switch ();
4679           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4680                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4681           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4682                        BFD_RELOC_MIPS_GOT_OFST);
4683           relax_end ();
4684         }
4685       else
4686         {
4687           ex.X_add_number = ep->X_add_number;
4688           ep->X_add_number = 0;
4689           relax_start (ep->X_add_symbol);
4690           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4691           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4692                        reg, reg, mips_gp_register);
4693           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4694                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4695           relax_switch ();
4696           if (reg_needs_delay (mips_gp_register))
4697             {
4698               /* We need a nop before loading from $gp.  This special
4699                  check is required because the lui which starts the main
4700                  instruction stream does not refer to $gp, and so will not
4701                  insert the nop which may be required.  */
4702               macro_build (NULL, "nop", "");
4703             }
4704           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4705                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4706           load_delay_nop ();
4707           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4708                        BFD_RELOC_LO16);
4709           relax_end ();
4710
4711           if (ex.X_add_number != 0)
4712             {
4713               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4714                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4715               ex.X_op = O_constant;
4716               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4717                            BFD_RELOC_LO16);
4718             }
4719         }
4720     }
4721   else
4722     abort ();
4723
4724   if (!mips_opts.at && *used_at == 1)
4725     as_bad (_("Macro used $at after \".set noat\""));
4726 }
4727
4728 /* Move the contents of register SOURCE into register DEST.  */
4729
4730 static void
4731 move_register (int dest, int source)
4732 {
4733   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4734                dest, source, 0);
4735 }
4736
4737 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4738    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4739    The two alternatives are:
4740
4741    Global symbol                Local sybmol
4742    -------------                ------------
4743    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4744    ...                          ...
4745    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4746
4747    load_got_offset emits the first instruction and add_got_offset
4748    emits the second for a 16-bit offset or add_got_offset_hilo emits
4749    a sequence to add a 32-bit offset using a scratch register.  */
4750
4751 static void
4752 load_got_offset (int dest, expressionS *local)
4753 {
4754   expressionS global;
4755
4756   global = *local;
4757   global.X_add_number = 0;
4758
4759   relax_start (local->X_add_symbol);
4760   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4761                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4762   relax_switch ();
4763   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4764                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4765   relax_end ();
4766 }
4767
4768 static void
4769 add_got_offset (int dest, expressionS *local)
4770 {
4771   expressionS global;
4772
4773   global.X_op = O_constant;
4774   global.X_op_symbol = NULL;
4775   global.X_add_symbol = NULL;
4776   global.X_add_number = local->X_add_number;
4777
4778   relax_start (local->X_add_symbol);
4779   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4780                dest, dest, BFD_RELOC_LO16);
4781   relax_switch ();
4782   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4783   relax_end ();
4784 }
4785
4786 static void
4787 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4788 {
4789   expressionS global;
4790   int hold_mips_optimize;
4791
4792   global.X_op = O_constant;
4793   global.X_op_symbol = NULL;
4794   global.X_add_symbol = NULL;
4795   global.X_add_number = local->X_add_number;
4796
4797   relax_start (local->X_add_symbol);
4798   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4799   relax_switch ();
4800   /* Set mips_optimize around the lui instruction to avoid
4801      inserting an unnecessary nop after the lw.  */
4802   hold_mips_optimize = mips_optimize;
4803   mips_optimize = 2;
4804   macro_build_lui (&global, tmp);
4805   mips_optimize = hold_mips_optimize;
4806   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4807   relax_end ();
4808
4809   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4810 }
4811
4812 /*
4813  *                      Build macros
4814  *   This routine implements the seemingly endless macro or synthesized
4815  * instructions and addressing modes in the mips assembly language. Many
4816  * of these macros are simple and are similar to each other. These could
4817  * probably be handled by some kind of table or grammar approach instead of
4818  * this verbose method. Others are not simple macros but are more like
4819  * optimizing code generation.
4820  *   One interesting optimization is when several store macros appear
4821  * consecutively that would load AT with the upper half of the same address.
4822  * The ensuing load upper instructions are ommited. This implies some kind
4823  * of global optimization. We currently only optimize within a single macro.
4824  *   For many of the load and store macros if the address is specified as a
4825  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4826  * first load register 'at' with zero and use it as the base register. The
4827  * mips assembler simply uses register $zero. Just one tiny optimization
4828  * we're missing.
4829  */
4830 static void
4831 macro (struct mips_cl_insn *ip)
4832 {
4833   unsigned int treg, sreg, dreg, breg;
4834   unsigned int tempreg;
4835   int mask;
4836   int used_at = 0;
4837   expressionS expr1;
4838   const char *s;
4839   const char *s2;
4840   const char *fmt;
4841   int likely = 0;
4842   int dbl = 0;
4843   int coproc = 0;
4844   int lr = 0;
4845   int imm = 0;
4846   int call = 0;
4847   int off;
4848   offsetT maxnum;
4849   bfd_reloc_code_real_type r;
4850   int hold_mips_optimize;
4851
4852   gas_assert (! mips_opts.mips16);
4853
4854   treg = EXTRACT_OPERAND (RT, *ip);
4855   dreg = EXTRACT_OPERAND (RD, *ip);
4856   sreg = breg = EXTRACT_OPERAND (RS, *ip);
4857   mask = ip->insn_mo->mask;
4858
4859   expr1.X_op = O_constant;
4860   expr1.X_op_symbol = NULL;
4861   expr1.X_add_symbol = NULL;
4862   expr1.X_add_number = 1;
4863
4864   switch (mask)
4865     {
4866     case M_DABS:
4867       dbl = 1;
4868     case M_ABS:
4869       /* bgez $a0,.+12
4870          move v0,$a0
4871          sub v0,$zero,$a0
4872          */
4873
4874       start_noreorder ();
4875
4876       expr1.X_add_number = 8;
4877       macro_build (&expr1, "bgez", "s,p", sreg);
4878       if (dreg == sreg)
4879         macro_build (NULL, "nop", "");
4880       else
4881         move_register (dreg, sreg);
4882       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4883
4884       end_noreorder ();
4885       break;
4886
4887     case M_ADD_I:
4888       s = "addi";
4889       s2 = "add";
4890       goto do_addi;
4891     case M_ADDU_I:
4892       s = "addiu";
4893       s2 = "addu";
4894       goto do_addi;
4895     case M_DADD_I:
4896       dbl = 1;
4897       s = "daddi";
4898       s2 = "dadd";
4899       goto do_addi;
4900     case M_DADDU_I:
4901       dbl = 1;
4902       s = "daddiu";
4903       s2 = "daddu";
4904     do_addi:
4905       if (imm_expr.X_op == O_constant
4906           && imm_expr.X_add_number >= -0x8000
4907           && imm_expr.X_add_number < 0x8000)
4908         {
4909           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4910           break;
4911         }
4912       used_at = 1;
4913       load_register (AT, &imm_expr, dbl);
4914       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4915       break;
4916
4917     case M_AND_I:
4918       s = "andi";
4919       s2 = "and";
4920       goto do_bit;
4921     case M_OR_I:
4922       s = "ori";
4923       s2 = "or";
4924       goto do_bit;
4925     case M_NOR_I:
4926       s = "";
4927       s2 = "nor";
4928       goto do_bit;
4929     case M_XOR_I:
4930       s = "xori";
4931       s2 = "xor";
4932     do_bit:
4933       if (imm_expr.X_op == O_constant
4934           && imm_expr.X_add_number >= 0
4935           && imm_expr.X_add_number < 0x10000)
4936         {
4937           if (mask != M_NOR_I)
4938             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4939           else
4940             {
4941               macro_build (&imm_expr, "ori", "t,r,i",
4942                            treg, sreg, BFD_RELOC_LO16);
4943               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4944             }
4945           break;
4946         }
4947
4948       used_at = 1;
4949       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4950       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4951       break;
4952
4953     case M_BALIGN:
4954       switch (imm_expr.X_add_number)
4955         {
4956         case 0:
4957           macro_build (NULL, "nop", "");
4958           break;
4959         case 2:
4960           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4961           break;
4962         default:
4963           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4964                        (int) imm_expr.X_add_number);
4965           break;
4966         }
4967       break;
4968
4969     case M_BEQ_I:
4970       s = "beq";
4971       goto beq_i;
4972     case M_BEQL_I:
4973       s = "beql";
4974       likely = 1;
4975       goto beq_i;
4976     case M_BNE_I:
4977       s = "bne";
4978       goto beq_i;
4979     case M_BNEL_I:
4980       s = "bnel";
4981       likely = 1;
4982     beq_i:
4983       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4984         {
4985           macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
4986           break;
4987         }
4988       used_at = 1;
4989       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4990       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4991       break;
4992
4993     case M_BGEL:
4994       likely = 1;
4995     case M_BGE:
4996       if (treg == 0)
4997         {
4998           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4999           break;
5000         }
5001       if (sreg == 0)
5002         {
5003           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
5004           break;
5005         }
5006       used_at = 1;
5007       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5008       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5009       break;
5010
5011     case M_BGTL_I:
5012       likely = 1;
5013     case M_BGT_I:
5014       /* Check for > max integer.  */
5015       maxnum = 0x7fffffff;
5016       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5017         {
5018           maxnum <<= 16;
5019           maxnum |= 0xffff;
5020           maxnum <<= 16;
5021           maxnum |= 0xffff;
5022         }
5023       if (imm_expr.X_op == O_constant
5024           && imm_expr.X_add_number >= maxnum
5025           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5026         {
5027         do_false:
5028           /* Result is always false.  */
5029           if (! likely)
5030             macro_build (NULL, "nop", "");
5031           else
5032             macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5033           break;
5034         }
5035       if (imm_expr.X_op != O_constant)
5036         as_bad (_("Unsupported large constant"));
5037       ++imm_expr.X_add_number;
5038       /* FALLTHROUGH */
5039     case M_BGE_I:
5040     case M_BGEL_I:
5041       if (mask == M_BGEL_I)
5042         likely = 1;
5043       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5044         {
5045           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5046           break;
5047         }
5048       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5049         {
5050           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5051           break;
5052         }
5053       maxnum = 0x7fffffff;
5054       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5055         {
5056           maxnum <<= 16;
5057           maxnum |= 0xffff;
5058           maxnum <<= 16;
5059           maxnum |= 0xffff;
5060         }
5061       maxnum = - maxnum - 1;
5062       if (imm_expr.X_op == O_constant
5063           && imm_expr.X_add_number <= maxnum
5064           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5065         {
5066         do_true:
5067           /* result is always true */
5068           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5069           macro_build (&offset_expr, "b", "p");
5070           break;
5071         }
5072       used_at = 1;
5073       set_at (sreg, 0);
5074       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5075       break;
5076
5077     case M_BGEUL:
5078       likely = 1;
5079     case M_BGEU:
5080       if (treg == 0)
5081         goto do_true;
5082       if (sreg == 0)
5083         {
5084           macro_build (&offset_expr, likely ? "beql" : "beq",
5085                        "s,t,p", ZERO, treg);
5086           break;
5087         }
5088       used_at = 1;
5089       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5090       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5091       break;
5092
5093     case M_BGTUL_I:
5094       likely = 1;
5095     case M_BGTU_I:
5096       if (sreg == 0
5097           || (HAVE_32BIT_GPRS
5098               && imm_expr.X_op == O_constant
5099               && imm_expr.X_add_number == -1))
5100         goto do_false;
5101       if (imm_expr.X_op != O_constant)
5102         as_bad (_("Unsupported large constant"));
5103       ++imm_expr.X_add_number;
5104       /* FALLTHROUGH */
5105     case M_BGEU_I:
5106     case M_BGEUL_I:
5107       if (mask == M_BGEUL_I)
5108         likely = 1;
5109       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5110         goto do_true;
5111       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5112         {
5113           macro_build (&offset_expr, likely ? "bnel" : "bne",
5114                        "s,t,p", sreg, ZERO);
5115           break;
5116         }
5117       used_at = 1;
5118       set_at (sreg, 1);
5119       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5120       break;
5121
5122     case M_BGTL:
5123       likely = 1;
5124     case M_BGT:
5125       if (treg == 0)
5126         {
5127           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5128           break;
5129         }
5130       if (sreg == 0)
5131         {
5132           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5133           break;
5134         }
5135       used_at = 1;
5136       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5137       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5138       break;
5139
5140     case M_BGTUL:
5141       likely = 1;
5142     case M_BGTU:
5143       if (treg == 0)
5144         {
5145           macro_build (&offset_expr, likely ? "bnel" : "bne",
5146                        "s,t,p", sreg, ZERO);
5147           break;
5148         }
5149       if (sreg == 0)
5150         goto do_false;
5151       used_at = 1;
5152       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5153       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5154       break;
5155
5156     case M_BLEL:
5157       likely = 1;
5158     case M_BLE:
5159       if (treg == 0)
5160         {
5161           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5162           break;
5163         }
5164       if (sreg == 0)
5165         {
5166           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5167           break;
5168         }
5169       used_at = 1;
5170       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5171       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5172       break;
5173
5174     case M_BLEL_I:
5175       likely = 1;
5176     case M_BLE_I:
5177       maxnum = 0x7fffffff;
5178       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5179         {
5180           maxnum <<= 16;
5181           maxnum |= 0xffff;
5182           maxnum <<= 16;
5183           maxnum |= 0xffff;
5184         }
5185       if (imm_expr.X_op == O_constant
5186           && imm_expr.X_add_number >= maxnum
5187           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5188         goto do_true;
5189       if (imm_expr.X_op != O_constant)
5190         as_bad (_("Unsupported large constant"));
5191       ++imm_expr.X_add_number;
5192       /* FALLTHROUGH */
5193     case M_BLT_I:
5194     case M_BLTL_I:
5195       if (mask == M_BLTL_I)
5196         likely = 1;
5197       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5198         {
5199           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5200           break;
5201         }
5202       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5203         {
5204           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5205           break;
5206         }
5207       used_at = 1;
5208       set_at (sreg, 0);
5209       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5210       break;
5211
5212     case M_BLEUL:
5213       likely = 1;
5214     case M_BLEU:
5215       if (treg == 0)
5216         {
5217           macro_build (&offset_expr, likely ? "beql" : "beq",
5218                        "s,t,p", sreg, ZERO);
5219           break;
5220         }
5221       if (sreg == 0)
5222         goto do_true;
5223       used_at = 1;
5224       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5225       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5226       break;
5227
5228     case M_BLEUL_I:
5229       likely = 1;
5230     case M_BLEU_I:
5231       if (sreg == 0
5232           || (HAVE_32BIT_GPRS
5233               && imm_expr.X_op == O_constant
5234               && imm_expr.X_add_number == -1))
5235         goto do_true;
5236       if (imm_expr.X_op != O_constant)
5237         as_bad (_("Unsupported large constant"));
5238       ++imm_expr.X_add_number;
5239       /* FALLTHROUGH */
5240     case M_BLTU_I:
5241     case M_BLTUL_I:
5242       if (mask == M_BLTUL_I)
5243         likely = 1;
5244       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5245         goto do_false;
5246       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5247         {
5248           macro_build (&offset_expr, likely ? "beql" : "beq",
5249                        "s,t,p", sreg, ZERO);
5250           break;
5251         }
5252       used_at = 1;
5253       set_at (sreg, 1);
5254       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5255       break;
5256
5257     case M_BLTL:
5258       likely = 1;
5259     case M_BLT:
5260       if (treg == 0)
5261         {
5262           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5263           break;
5264         }
5265       if (sreg == 0)
5266         {
5267           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5268           break;
5269         }
5270       used_at = 1;
5271       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5272       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5273       break;
5274
5275     case M_BLTUL:
5276       likely = 1;
5277     case M_BLTU:
5278       if (treg == 0)
5279         goto do_false;
5280       if (sreg == 0)
5281         {
5282           macro_build (&offset_expr, likely ? "bnel" : "bne",
5283                        "s,t,p", ZERO, treg);
5284           break;
5285         }
5286       used_at = 1;
5287       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5288       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5289       break;
5290
5291     case M_DEXT:
5292       {
5293         /* Use unsigned arithmetic.  */
5294         addressT pos;
5295         addressT size;
5296
5297         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5298           {
5299             as_bad (_("Unsupported large constant"));
5300             pos = size = 1;
5301           }
5302         else
5303           {
5304             pos = imm_expr.X_add_number;
5305             size = imm2_expr.X_add_number;
5306           }
5307
5308         if (pos > 63)
5309           {
5310             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5311             pos = 1;
5312           }
5313         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5314           {
5315             as_bad (_("Improper extract size (%lu, position %lu)"),
5316                     (unsigned long) size, (unsigned long) pos);
5317             size = 1;
5318           }
5319
5320         if (size <= 32 && pos < 32)
5321           {
5322             s = "dext";
5323             fmt = "t,r,+A,+C";
5324           }
5325         else if (size <= 32)
5326           {
5327             s = "dextu";
5328             fmt = "t,r,+E,+H";
5329           }
5330         else
5331           {
5332             s = "dextm";
5333             fmt = "t,r,+A,+G";
5334           }
5335         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5336                      (int) (size - 1));
5337       }
5338       break;
5339
5340     case M_DINS:
5341       {
5342         /* Use unsigned arithmetic.  */
5343         addressT pos;
5344         addressT size;
5345
5346         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5347           {
5348             as_bad (_("Unsupported large constant"));
5349             pos = size = 1;
5350           }
5351         else
5352           {
5353             pos = imm_expr.X_add_number;
5354             size = imm2_expr.X_add_number;
5355           }
5356
5357         if (pos > 63)
5358           {
5359             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5360             pos = 1;
5361           }
5362         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5363           {
5364             as_bad (_("Improper insert size (%lu, position %lu)"),
5365                     (unsigned long) size, (unsigned long) pos);
5366             size = 1;
5367           }
5368
5369         if (pos < 32 && (pos + size - 1) < 32)
5370           {
5371             s = "dins";
5372             fmt = "t,r,+A,+B";
5373           }
5374         else if (pos >= 32)
5375           {
5376             s = "dinsu";
5377             fmt = "t,r,+E,+F";
5378           }
5379         else
5380           {
5381             s = "dinsm";
5382             fmt = "t,r,+A,+F";
5383           }
5384         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5385                      (int) (pos + size - 1));
5386       }
5387       break;
5388
5389     case M_DDIV_3:
5390       dbl = 1;
5391     case M_DIV_3:
5392       s = "mflo";
5393       goto do_div3;
5394     case M_DREM_3:
5395       dbl = 1;
5396     case M_REM_3:
5397       s = "mfhi";
5398     do_div3:
5399       if (treg == 0)
5400         {
5401           as_warn (_("Divide by zero."));
5402           if (mips_trap)
5403             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5404           else
5405             macro_build (NULL, "break", "c", 7);
5406           break;
5407         }
5408
5409       start_noreorder ();
5410       if (mips_trap)
5411         {
5412           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5413           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5414         }
5415       else
5416         {
5417           expr1.X_add_number = 8;
5418           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5419           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5420           macro_build (NULL, "break", "c", 7);
5421         }
5422       expr1.X_add_number = -1;
5423       used_at = 1;
5424       load_register (AT, &expr1, dbl);
5425       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5426       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5427       if (dbl)
5428         {
5429           expr1.X_add_number = 1;
5430           load_register (AT, &expr1, dbl);
5431           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5432         }
5433       else
5434         {
5435           expr1.X_add_number = 0x80000000;
5436           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5437         }
5438       if (mips_trap)
5439         {
5440           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5441           /* We want to close the noreorder block as soon as possible, so
5442              that later insns are available for delay slot filling.  */
5443           end_noreorder ();
5444         }
5445       else
5446         {
5447           expr1.X_add_number = 8;
5448           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5449           macro_build (NULL, "nop", "");
5450
5451           /* We want to close the noreorder block as soon as possible, so
5452              that later insns are available for delay slot filling.  */
5453           end_noreorder ();
5454
5455           macro_build (NULL, "break", "c", 6);
5456         }
5457       macro_build (NULL, s, "d", dreg);
5458       break;
5459
5460     case M_DIV_3I:
5461       s = "div";
5462       s2 = "mflo";
5463       goto do_divi;
5464     case M_DIVU_3I:
5465       s = "divu";
5466       s2 = "mflo";
5467       goto do_divi;
5468     case M_REM_3I:
5469       s = "div";
5470       s2 = "mfhi";
5471       goto do_divi;
5472     case M_REMU_3I:
5473       s = "divu";
5474       s2 = "mfhi";
5475       goto do_divi;
5476     case M_DDIV_3I:
5477       dbl = 1;
5478       s = "ddiv";
5479       s2 = "mflo";
5480       goto do_divi;
5481     case M_DDIVU_3I:
5482       dbl = 1;
5483       s = "ddivu";
5484       s2 = "mflo";
5485       goto do_divi;
5486     case M_DREM_3I:
5487       dbl = 1;
5488       s = "ddiv";
5489       s2 = "mfhi";
5490       goto do_divi;
5491     case M_DREMU_3I:
5492       dbl = 1;
5493       s = "ddivu";
5494       s2 = "mfhi";
5495     do_divi:
5496       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5497         {
5498           as_warn (_("Divide by zero."));
5499           if (mips_trap)
5500             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5501           else
5502             macro_build (NULL, "break", "c", 7);
5503           break;
5504         }
5505       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5506         {
5507           if (strcmp (s2, "mflo") == 0)
5508             move_register (dreg, sreg);
5509           else
5510             move_register (dreg, ZERO);
5511           break;
5512         }
5513       if (imm_expr.X_op == O_constant
5514           && imm_expr.X_add_number == -1
5515           && s[strlen (s) - 1] != 'u')
5516         {
5517           if (strcmp (s2, "mflo") == 0)
5518             {
5519               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5520             }
5521           else
5522             move_register (dreg, ZERO);
5523           break;
5524         }
5525
5526       used_at = 1;
5527       load_register (AT, &imm_expr, dbl);
5528       macro_build (NULL, s, "z,s,t", sreg, AT);
5529       macro_build (NULL, s2, "d", dreg);
5530       break;
5531
5532     case M_DIVU_3:
5533       s = "divu";
5534       s2 = "mflo";
5535       goto do_divu3;
5536     case M_REMU_3:
5537       s = "divu";
5538       s2 = "mfhi";
5539       goto do_divu3;
5540     case M_DDIVU_3:
5541       s = "ddivu";
5542       s2 = "mflo";
5543       goto do_divu3;
5544     case M_DREMU_3:
5545       s = "ddivu";
5546       s2 = "mfhi";
5547     do_divu3:
5548       start_noreorder ();
5549       if (mips_trap)
5550         {
5551           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5552           macro_build (NULL, s, "z,s,t", sreg, treg);
5553           /* We want to close the noreorder block as soon as possible, so
5554              that later insns are available for delay slot filling.  */
5555           end_noreorder ();
5556         }
5557       else
5558         {
5559           expr1.X_add_number = 8;
5560           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5561           macro_build (NULL, s, "z,s,t", sreg, treg);
5562
5563           /* We want to close the noreorder block as soon as possible, so
5564              that later insns are available for delay slot filling.  */
5565           end_noreorder ();
5566           macro_build (NULL, "break", "c", 7);
5567         }
5568       macro_build (NULL, s2, "d", dreg);
5569       break;
5570
5571     case M_DLCA_AB:
5572       dbl = 1;
5573     case M_LCA_AB:
5574       call = 1;
5575       goto do_la;
5576     case M_DLA_AB:
5577       dbl = 1;
5578     case M_LA_AB:
5579     do_la:
5580       /* Load the address of a symbol into a register.  If breg is not
5581          zero, we then add a base register to it.  */
5582
5583       if (dbl && HAVE_32BIT_GPRS)
5584         as_warn (_("dla used to load 32-bit register"));
5585
5586       if (!dbl && HAVE_64BIT_OBJECTS)
5587         as_warn (_("la used to load 64-bit address"));
5588
5589       if (offset_expr.X_op == O_constant
5590           && offset_expr.X_add_number >= -0x8000
5591           && offset_expr.X_add_number < 0x8000)
5592         {
5593           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5594                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5595           break;
5596         }
5597
5598       if (mips_opts.at && (treg == breg))
5599         {
5600           tempreg = AT;
5601           used_at = 1;
5602         }
5603       else
5604         {
5605           tempreg = treg;
5606         }
5607
5608       if (offset_expr.X_op != O_symbol
5609           && offset_expr.X_op != O_constant)
5610         {
5611           as_bad (_("Expression too complex"));
5612           offset_expr.X_op = O_constant;
5613         }
5614
5615       if (offset_expr.X_op == O_constant)
5616         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5617       else if (mips_pic == NO_PIC)
5618         {
5619           /* If this is a reference to a GP relative symbol, we want
5620                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5621              Otherwise we want
5622                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5623                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5624              If we have a constant, we need two instructions anyhow,
5625              so we may as well always use the latter form.
5626
5627              With 64bit address space and a usable $at we want
5628                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5629                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5630                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5631                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5632                dsll32   $tempreg,0
5633                daddu    $tempreg,$tempreg,$at
5634
5635              If $at is already in use, we use a path which is suboptimal
5636              on superscalar processors.
5637                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5638                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5639                dsll     $tempreg,16
5640                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5641                dsll     $tempreg,16
5642                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5643
5644              For GP relative symbols in 64bit address space we can use
5645              the same sequence as in 32bit address space.  */
5646           if (HAVE_64BIT_SYMBOLS)
5647             {
5648               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5649                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5650                 {
5651                   relax_start (offset_expr.X_add_symbol);
5652                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5653                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5654                   relax_switch ();
5655                 }
5656
5657               if (used_at == 0 && mips_opts.at)
5658                 {
5659                   macro_build (&offset_expr, "lui", "t,u",
5660                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5661                   macro_build (&offset_expr, "lui", "t,u",
5662                                AT, BFD_RELOC_HI16_S);
5663                   macro_build (&offset_expr, "daddiu", "t,r,j",
5664                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5665                   macro_build (&offset_expr, "daddiu", "t,r,j",
5666                                AT, AT, BFD_RELOC_LO16);
5667                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5668                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5669                   used_at = 1;
5670                 }
5671               else
5672                 {
5673                   macro_build (&offset_expr, "lui", "t,u",
5674                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5675                   macro_build (&offset_expr, "daddiu", "t,r,j",
5676                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5677                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5678                   macro_build (&offset_expr, "daddiu", "t,r,j",
5679                                tempreg, tempreg, BFD_RELOC_HI16_S);
5680                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5681                   macro_build (&offset_expr, "daddiu", "t,r,j",
5682                                tempreg, tempreg, BFD_RELOC_LO16);
5683                 }
5684
5685               if (mips_relax.sequence)
5686                 relax_end ();
5687             }
5688           else
5689             {
5690               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5691                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5692                 {
5693                   relax_start (offset_expr.X_add_symbol);
5694                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5695                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5696                   relax_switch ();
5697                 }
5698               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5699                 as_bad (_("Offset too large"));
5700               macro_build_lui (&offset_expr, tempreg);
5701               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5702                            tempreg, tempreg, BFD_RELOC_LO16);
5703               if (mips_relax.sequence)
5704                 relax_end ();
5705             }
5706         }
5707       else if (!mips_big_got && !HAVE_NEWABI)
5708         {
5709           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5710
5711           /* If this is a reference to an external symbol, and there
5712              is no constant, we want
5713                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5714              or for lca or if tempreg is PIC_CALL_REG
5715                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5716              For a local symbol, we want
5717                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5718                nop
5719                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5720
5721              If we have a small constant, and this is a reference to
5722              an external symbol, we want
5723                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5724                nop
5725                addiu    $tempreg,$tempreg,<constant>
5726              For a local symbol, we want the same instruction
5727              sequence, but we output a BFD_RELOC_LO16 reloc on the
5728              addiu instruction.
5729
5730              If we have a large constant, and this is a reference to
5731              an external symbol, we want
5732                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5733                lui      $at,<hiconstant>
5734                addiu    $at,$at,<loconstant>
5735                addu     $tempreg,$tempreg,$at
5736              For a local symbol, we want the same instruction
5737              sequence, but we output a BFD_RELOC_LO16 reloc on the
5738              addiu instruction.
5739            */
5740
5741           if (offset_expr.X_add_number == 0)
5742             {
5743               if (mips_pic == SVR4_PIC
5744                   && breg == 0
5745                   && (call || tempreg == PIC_CALL_REG))
5746                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5747
5748               relax_start (offset_expr.X_add_symbol);
5749               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5750                            lw_reloc_type, mips_gp_register);
5751               if (breg != 0)
5752                 {
5753                   /* We're going to put in an addu instruction using
5754                      tempreg, so we may as well insert the nop right
5755                      now.  */
5756                   load_delay_nop ();
5757                 }
5758               relax_switch ();
5759               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5760                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5761               load_delay_nop ();
5762               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5763                            tempreg, tempreg, BFD_RELOC_LO16);
5764               relax_end ();
5765               /* FIXME: If breg == 0, and the next instruction uses
5766                  $tempreg, then if this variant case is used an extra
5767                  nop will be generated.  */
5768             }
5769           else if (offset_expr.X_add_number >= -0x8000
5770                    && offset_expr.X_add_number < 0x8000)
5771             {
5772               load_got_offset (tempreg, &offset_expr);
5773               load_delay_nop ();
5774               add_got_offset (tempreg, &offset_expr);
5775             }
5776           else
5777             {
5778               expr1.X_add_number = offset_expr.X_add_number;
5779               offset_expr.X_add_number =
5780                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5781               load_got_offset (tempreg, &offset_expr);
5782               offset_expr.X_add_number = expr1.X_add_number;
5783               /* If we are going to add in a base register, and the
5784                  target register and the base register are the same,
5785                  then we are using AT as a temporary register.  Since
5786                  we want to load the constant into AT, we add our
5787                  current AT (from the global offset table) and the
5788                  register into the register now, and pretend we were
5789                  not using a base register.  */
5790               if (breg == treg)
5791                 {
5792                   load_delay_nop ();
5793                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5794                                treg, AT, breg);
5795                   breg = 0;
5796                   tempreg = treg;
5797                 }
5798               add_got_offset_hilo (tempreg, &offset_expr, AT);
5799               used_at = 1;
5800             }
5801         }
5802       else if (!mips_big_got && HAVE_NEWABI)
5803         {
5804           int add_breg_early = 0;
5805
5806           /* If this is a reference to an external, and there is no
5807              constant, or local symbol (*), with or without a
5808              constant, we want
5809                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5810              or for lca or if tempreg is PIC_CALL_REG
5811                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5812
5813              If we have a small constant, and this is a reference to
5814              an external symbol, we want
5815                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5816                addiu    $tempreg,$tempreg,<constant>
5817
5818              If we have a large constant, and this is a reference to
5819              an external symbol, we want
5820                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5821                lui      $at,<hiconstant>
5822                addiu    $at,$at,<loconstant>
5823                addu     $tempreg,$tempreg,$at
5824
5825              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5826              local symbols, even though it introduces an additional
5827              instruction.  */
5828
5829           if (offset_expr.X_add_number)
5830             {
5831               expr1.X_add_number = offset_expr.X_add_number;
5832               offset_expr.X_add_number = 0;
5833
5834               relax_start (offset_expr.X_add_symbol);
5835               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5836                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5837
5838               if (expr1.X_add_number >= -0x8000
5839                   && expr1.X_add_number < 0x8000)
5840                 {
5841                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5842                                tempreg, tempreg, BFD_RELOC_LO16);
5843                 }
5844               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5845                 {
5846                   /* If we are going to add in a base register, and the
5847                      target register and the base register are the same,
5848                      then we are using AT as a temporary register.  Since
5849                      we want to load the constant into AT, we add our
5850                      current AT (from the global offset table) and the
5851                      register into the register now, and pretend we were
5852                      not using a base register.  */
5853                   if (breg != treg)
5854                     dreg = tempreg;
5855                   else
5856                     {
5857                       gas_assert (tempreg == AT);
5858                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5859                                    treg, AT, breg);
5860                       dreg = treg;
5861                       add_breg_early = 1;
5862                     }
5863
5864                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5865                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5866                                dreg, dreg, AT);
5867
5868                   used_at = 1;
5869                 }
5870               else
5871                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5872
5873               relax_switch ();
5874               offset_expr.X_add_number = expr1.X_add_number;
5875
5876               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5877                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5878               if (add_breg_early)
5879                 {
5880                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5881                                treg, tempreg, breg);
5882                   breg = 0;
5883                   tempreg = treg;
5884                 }
5885               relax_end ();
5886             }
5887           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5888             {
5889               relax_start (offset_expr.X_add_symbol);
5890               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5891                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5892               relax_switch ();
5893               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5894                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5895               relax_end ();
5896             }
5897           else
5898             {
5899               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5900                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5901             }
5902         }
5903       else if (mips_big_got && !HAVE_NEWABI)
5904         {
5905           int gpdelay;
5906           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5907           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5908           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5909
5910           /* This is the large GOT case.  If this is a reference to an
5911              external symbol, and there is no constant, we want
5912                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5913                addu     $tempreg,$tempreg,$gp
5914                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5915              or for lca or if tempreg is PIC_CALL_REG
5916                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5917                addu     $tempreg,$tempreg,$gp
5918                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5919              For a local symbol, we want
5920                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5921                nop
5922                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5923
5924              If we have a small constant, and this is a reference to
5925              an external symbol, we want
5926                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5927                addu     $tempreg,$tempreg,$gp
5928                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5929                nop
5930                addiu    $tempreg,$tempreg,<constant>
5931              For a local symbol, we want
5932                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5933                nop
5934                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5935
5936              If we have a large constant, and this is a reference to
5937              an external symbol, we want
5938                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5939                addu     $tempreg,$tempreg,$gp
5940                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5941                lui      $at,<hiconstant>
5942                addiu    $at,$at,<loconstant>
5943                addu     $tempreg,$tempreg,$at
5944              For a local symbol, we want
5945                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5946                lui      $at,<hiconstant>
5947                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5948                addu     $tempreg,$tempreg,$at
5949           */
5950
5951           expr1.X_add_number = offset_expr.X_add_number;
5952           offset_expr.X_add_number = 0;
5953           relax_start (offset_expr.X_add_symbol);
5954           gpdelay = reg_needs_delay (mips_gp_register);
5955           if (expr1.X_add_number == 0 && breg == 0
5956               && (call || tempreg == PIC_CALL_REG))
5957             {
5958               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5959               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5960             }
5961           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5962           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5963                        tempreg, tempreg, mips_gp_register);
5964           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5965                        tempreg, lw_reloc_type, tempreg);
5966           if (expr1.X_add_number == 0)
5967             {
5968               if (breg != 0)
5969                 {
5970                   /* We're going to put in an addu instruction using
5971                      tempreg, so we may as well insert the nop right
5972                      now.  */
5973                   load_delay_nop ();
5974                 }
5975             }
5976           else if (expr1.X_add_number >= -0x8000
5977                    && expr1.X_add_number < 0x8000)
5978             {
5979               load_delay_nop ();
5980               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5981                            tempreg, tempreg, BFD_RELOC_LO16);
5982             }
5983           else
5984             {
5985               /* If we are going to add in a base register, and the
5986                  target register and the base register are the same,
5987                  then we are using AT as a temporary register.  Since
5988                  we want to load the constant into AT, we add our
5989                  current AT (from the global offset table) and the
5990                  register into the register now, and pretend we were
5991                  not using a base register.  */
5992               if (breg != treg)
5993                 dreg = tempreg;
5994               else
5995                 {
5996                   gas_assert (tempreg == AT);
5997                   load_delay_nop ();
5998                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5999                                treg, AT, breg);
6000                   dreg = treg;
6001                 }
6002
6003               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6004               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6005
6006               used_at = 1;
6007             }
6008           offset_expr.X_add_number =
6009             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6010           relax_switch ();
6011
6012           if (gpdelay)
6013             {
6014               /* This is needed because this instruction uses $gp, but
6015                  the first instruction on the main stream does not.  */
6016               macro_build (NULL, "nop", "");
6017             }
6018
6019           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6020                        local_reloc_type, mips_gp_register);
6021           if (expr1.X_add_number >= -0x8000
6022               && expr1.X_add_number < 0x8000)
6023             {
6024               load_delay_nop ();
6025               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6026                            tempreg, tempreg, BFD_RELOC_LO16);
6027               /* FIXME: If add_number is 0, and there was no base
6028                  register, the external symbol case ended with a load,
6029                  so if the symbol turns out to not be external, and
6030                  the next instruction uses tempreg, an unnecessary nop
6031                  will be inserted.  */
6032             }
6033           else
6034             {
6035               if (breg == treg)
6036                 {
6037                   /* We must add in the base register now, as in the
6038                      external symbol case.  */
6039                   gas_assert (tempreg == AT);
6040                   load_delay_nop ();
6041                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6042                                treg, AT, breg);
6043                   tempreg = treg;
6044                   /* We set breg to 0 because we have arranged to add
6045                      it in in both cases.  */
6046                   breg = 0;
6047                 }
6048
6049               macro_build_lui (&expr1, AT);
6050               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6051                            AT, AT, BFD_RELOC_LO16);
6052               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6053                            tempreg, tempreg, AT);
6054               used_at = 1;
6055             }
6056           relax_end ();
6057         }
6058       else if (mips_big_got && HAVE_NEWABI)
6059         {
6060           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6061           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6062           int add_breg_early = 0;
6063
6064           /* This is the large GOT case.  If this is a reference to an
6065              external symbol, and there is no constant, we want
6066                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6067                add      $tempreg,$tempreg,$gp
6068                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6069              or for lca or if tempreg is PIC_CALL_REG
6070                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6071                add      $tempreg,$tempreg,$gp
6072                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6073
6074              If we have a small constant, and this is a reference to
6075              an external symbol, we want
6076                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6077                add      $tempreg,$tempreg,$gp
6078                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6079                addi     $tempreg,$tempreg,<constant>
6080
6081              If we have a large constant, and this is a reference to
6082              an external symbol, we want
6083                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6084                addu     $tempreg,$tempreg,$gp
6085                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6086                lui      $at,<hiconstant>
6087                addi     $at,$at,<loconstant>
6088                add      $tempreg,$tempreg,$at
6089
6090              If we have NewABI, and we know it's a local symbol, we want
6091                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6092                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6093              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6094
6095           relax_start (offset_expr.X_add_symbol);
6096
6097           expr1.X_add_number = offset_expr.X_add_number;
6098           offset_expr.X_add_number = 0;
6099
6100           if (expr1.X_add_number == 0 && breg == 0
6101               && (call || tempreg == PIC_CALL_REG))
6102             {
6103               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6104               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6105             }
6106           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6107           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6108                        tempreg, tempreg, mips_gp_register);
6109           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6110                        tempreg, lw_reloc_type, tempreg);
6111
6112           if (expr1.X_add_number == 0)
6113             ;
6114           else if (expr1.X_add_number >= -0x8000
6115                    && expr1.X_add_number < 0x8000)
6116             {
6117               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6118                            tempreg, tempreg, BFD_RELOC_LO16);
6119             }
6120           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6121             {
6122               /* If we are going to add in a base register, and the
6123                  target register and the base register are the same,
6124                  then we are using AT as a temporary register.  Since
6125                  we want to load the constant into AT, we add our
6126                  current AT (from the global offset table) and the
6127                  register into the register now, and pretend we were
6128                  not using a base register.  */
6129               if (breg != treg)
6130                 dreg = tempreg;
6131               else
6132                 {
6133                   gas_assert (tempreg == AT);
6134                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6135                                treg, AT, breg);
6136                   dreg = treg;
6137                   add_breg_early = 1;
6138                 }
6139
6140               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6141               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6142
6143               used_at = 1;
6144             }
6145           else
6146             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6147
6148           relax_switch ();
6149           offset_expr.X_add_number = expr1.X_add_number;
6150           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6151                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6152           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6153                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6154           if (add_breg_early)
6155             {
6156               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6157                            treg, tempreg, breg);
6158               breg = 0;
6159               tempreg = treg;
6160             }
6161           relax_end ();
6162         }
6163       else
6164         abort ();
6165
6166       if (breg != 0)
6167         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6168       break;
6169
6170     case M_MSGSND:
6171       {
6172         unsigned long temp = (treg << 16) | (0x01);
6173         macro_build (NULL, "c2", "C", temp);
6174       }
6175       break;
6176
6177     case M_MSGLD:
6178       {
6179         unsigned long temp = (0x02);
6180         macro_build (NULL, "c2", "C", temp);
6181       }
6182       break;
6183
6184     case M_MSGLD_T:
6185       {
6186         unsigned long temp = (treg << 16) | (0x02);
6187         macro_build (NULL, "c2", "C", temp);
6188       }
6189       break;
6190
6191     case M_MSGWAIT:
6192       macro_build (NULL, "c2", "C", 3);
6193       break;
6194
6195     case M_MSGWAIT_T:
6196       {
6197         unsigned long temp = (treg << 16) | 0x03;
6198         macro_build (NULL, "c2", "C", temp);
6199       }
6200       break;
6201
6202     case M_J_A:
6203       /* The j instruction may not be used in PIC code, since it
6204          requires an absolute address.  We convert it to a b
6205          instruction.  */
6206       if (mips_pic == NO_PIC)
6207         macro_build (&offset_expr, "j", "a");
6208       else
6209         macro_build (&offset_expr, "b", "p");
6210       break;
6211
6212       /* The jal instructions must be handled as macros because when
6213          generating PIC code they expand to multi-instruction
6214          sequences.  Normally they are simple instructions.  */
6215     case M_JAL_1:
6216       dreg = RA;
6217       /* Fall through.  */
6218     case M_JAL_2:
6219       if (mips_pic == NO_PIC)
6220         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6221       else
6222         {
6223           if (sreg != PIC_CALL_REG)
6224             as_warn (_("MIPS PIC call to register other than $25"));
6225
6226           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6227           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6228             {
6229               if (mips_cprestore_offset < 0)
6230                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6231               else
6232                 {
6233                   if (!mips_frame_reg_valid)
6234                     {
6235                       as_warn (_("No .frame pseudo-op used in PIC code"));
6236                       /* Quiet this warning.  */
6237                       mips_frame_reg_valid = 1;
6238                     }
6239                   if (!mips_cprestore_valid)
6240                     {
6241                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6242                       /* Quiet this warning.  */
6243                       mips_cprestore_valid = 1;
6244                     }
6245                   if (mips_opts.noreorder)
6246                     macro_build (NULL, "nop", "");
6247                   expr1.X_add_number = mips_cprestore_offset;
6248                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6249                                                 mips_gp_register,
6250                                                 mips_frame_reg,
6251                                                 HAVE_64BIT_ADDRESSES);
6252                 }
6253             }
6254         }
6255
6256       break;
6257
6258     case M_JAL_A:
6259       if (mips_pic == NO_PIC)
6260         macro_build (&offset_expr, "jal", "a");
6261       else if (mips_pic == SVR4_PIC)
6262         {
6263           /* If this is a reference to an external symbol, and we are
6264              using a small GOT, we want
6265                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6266                nop
6267                jalr     $ra,$25
6268                nop
6269                lw       $gp,cprestore($sp)
6270              The cprestore value is set using the .cprestore
6271              pseudo-op.  If we are using a big GOT, we want
6272                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6273                addu     $25,$25,$gp
6274                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6275                nop
6276                jalr     $ra,$25
6277                nop
6278                lw       $gp,cprestore($sp)
6279              If the symbol is not external, we want
6280                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6281                nop
6282                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6283                jalr     $ra,$25
6284                nop
6285                lw $gp,cprestore($sp)
6286
6287              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6288              sequences above, minus nops, unless the symbol is local,
6289              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6290              GOT_DISP.  */
6291           if (HAVE_NEWABI)
6292             {
6293               if (!mips_big_got)
6294                 {
6295                   relax_start (offset_expr.X_add_symbol);
6296                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6297                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6298                                mips_gp_register);
6299                   relax_switch ();
6300                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6301                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6302                                mips_gp_register);
6303                   relax_end ();
6304                 }
6305               else
6306                 {
6307                   relax_start (offset_expr.X_add_symbol);
6308                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6309                                BFD_RELOC_MIPS_CALL_HI16);
6310                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6311                                PIC_CALL_REG, mips_gp_register);
6312                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6313                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6314                                PIC_CALL_REG);
6315                   relax_switch ();
6316                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6317                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6318                                mips_gp_register);
6319                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6320                                PIC_CALL_REG, PIC_CALL_REG,
6321                                BFD_RELOC_MIPS_GOT_OFST);
6322                   relax_end ();
6323                 }
6324
6325               macro_build_jalr (&offset_expr);
6326             }
6327           else
6328             {
6329               relax_start (offset_expr.X_add_symbol);
6330               if (!mips_big_got)
6331                 {
6332                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6333                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6334                                mips_gp_register);
6335                   load_delay_nop ();
6336                   relax_switch ();
6337                 }
6338               else
6339                 {
6340                   int gpdelay;
6341
6342                   gpdelay = reg_needs_delay (mips_gp_register);
6343                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6344                                BFD_RELOC_MIPS_CALL_HI16);
6345                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6346                                PIC_CALL_REG, mips_gp_register);
6347                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6348                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6349                                PIC_CALL_REG);
6350                   load_delay_nop ();
6351                   relax_switch ();
6352                   if (gpdelay)
6353                     macro_build (NULL, "nop", "");
6354                 }
6355               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6356                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6357                            mips_gp_register);
6358               load_delay_nop ();
6359               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6360                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6361               relax_end ();
6362               macro_build_jalr (&offset_expr);
6363
6364               if (mips_cprestore_offset < 0)
6365                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6366               else
6367                 {
6368                   if (!mips_frame_reg_valid)
6369                     {
6370                       as_warn (_("No .frame pseudo-op used in PIC code"));
6371                       /* Quiet this warning.  */
6372                       mips_frame_reg_valid = 1;
6373                     }
6374                   if (!mips_cprestore_valid)
6375                     {
6376                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6377                       /* Quiet this warning.  */
6378                       mips_cprestore_valid = 1;
6379                     }
6380                   if (mips_opts.noreorder)
6381                     macro_build (NULL, "nop", "");
6382                   expr1.X_add_number = mips_cprestore_offset;
6383                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6384                                                 mips_gp_register,
6385                                                 mips_frame_reg,
6386                                                 HAVE_64BIT_ADDRESSES);
6387                 }
6388             }
6389         }
6390       else if (mips_pic == VXWORKS_PIC)
6391         as_bad (_("Non-PIC jump used in PIC library"));
6392       else
6393         abort ();
6394
6395       break;
6396
6397     case M_LB_AB:
6398       s = "lb";
6399       goto ld;
6400     case M_LBU_AB:
6401       s = "lbu";
6402       goto ld;
6403     case M_LH_AB:
6404       s = "lh";
6405       goto ld;
6406     case M_LHU_AB:
6407       s = "lhu";
6408       goto ld;
6409     case M_LW_AB:
6410       s = "lw";
6411       goto ld;
6412     case M_LWC0_AB:
6413       s = "lwc0";
6414       /* Itbl support may require additional care here.  */
6415       coproc = 1;
6416       goto ld;
6417     case M_LWC1_AB:
6418       s = "lwc1";
6419       /* Itbl support may require additional care here.  */
6420       coproc = 1;
6421       goto ld;
6422     case M_LWC2_AB:
6423       s = "lwc2";
6424       /* Itbl support may require additional care here.  */
6425       coproc = 1;
6426       goto ld;
6427     case M_LWC3_AB:
6428       s = "lwc3";
6429       /* Itbl support may require additional care here.  */
6430       coproc = 1;
6431       goto ld;
6432     case M_LWL_AB:
6433       s = "lwl";
6434       lr = 1;
6435       goto ld;
6436     case M_LWR_AB:
6437       s = "lwr";
6438       lr = 1;
6439       goto ld;
6440     case M_LDC1_AB:
6441       s = "ldc1";
6442       /* Itbl support may require additional care here.  */
6443       coproc = 1;
6444       goto ld;
6445     case M_LDC2_AB:
6446       s = "ldc2";
6447       /* Itbl support may require additional care here.  */
6448       coproc = 1;
6449       goto ld;
6450     case M_LDC3_AB:
6451       s = "ldc3";
6452       /* Itbl support may require additional care here.  */
6453       coproc = 1;
6454       goto ld;
6455     case M_LDL_AB:
6456       s = "ldl";
6457       lr = 1;
6458       goto ld;
6459     case M_LDR_AB:
6460       s = "ldr";
6461       lr = 1;
6462       goto ld;
6463     case M_LL_AB:
6464       s = "ll";
6465       goto ld;
6466     case M_LLD_AB:
6467       s = "lld";
6468       goto ld;
6469     case M_LWU_AB:
6470       s = "lwu";
6471     ld:
6472       if (breg == treg || coproc || lr)
6473         {
6474           tempreg = AT;
6475           used_at = 1;
6476         }
6477       else
6478         {
6479           tempreg = treg;
6480         }
6481       goto ld_st;
6482     case M_SB_AB:
6483       s = "sb";
6484       goto st;
6485     case M_SH_AB:
6486       s = "sh";
6487       goto st;
6488     case M_SW_AB:
6489       s = "sw";
6490       goto st;
6491     case M_SWC0_AB:
6492       s = "swc0";
6493       /* Itbl support may require additional care here.  */
6494       coproc = 1;
6495       goto st;
6496     case M_SWC1_AB:
6497       s = "swc1";
6498       /* Itbl support may require additional care here.  */
6499       coproc = 1;
6500       goto st;
6501     case M_SWC2_AB:
6502       s = "swc2";
6503       /* Itbl support may require additional care here.  */
6504       coproc = 1;
6505       goto st;
6506     case M_SWC3_AB:
6507       s = "swc3";
6508       /* Itbl support may require additional care here.  */
6509       coproc = 1;
6510       goto st;
6511     case M_SWL_AB:
6512       s = "swl";
6513       goto st;
6514     case M_SWR_AB:
6515       s = "swr";
6516       goto st;
6517     case M_SC_AB:
6518       s = "sc";
6519       goto st;
6520     case M_SCD_AB:
6521       s = "scd";
6522       goto st;
6523     case M_CACHE_AB:
6524       s = "cache";
6525       goto st;
6526     case M_SDC1_AB:
6527       s = "sdc1";
6528       coproc = 1;
6529       /* Itbl support may require additional care here.  */
6530       goto st;
6531     case M_SDC2_AB:
6532       s = "sdc2";
6533       /* Itbl support may require additional care here.  */
6534       coproc = 1;
6535       goto st;
6536     case M_SDC3_AB:
6537       s = "sdc3";
6538       /* Itbl support may require additional care here.  */
6539       coproc = 1;
6540       goto st;
6541     case M_SDL_AB:
6542       s = "sdl";
6543       goto st;
6544     case M_SDR_AB:
6545       s = "sdr";
6546     st:
6547       tempreg = AT;
6548       used_at = 1;
6549     ld_st:
6550       if (coproc
6551           && NO_ISA_COP (mips_opts.arch)
6552           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6553         {
6554           as_bad (_("Opcode not supported on this processor: %s"),
6555                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6556           break;
6557         }
6558
6559       /* Itbl support may require additional care here.  */
6560       if (mask == M_LWC1_AB
6561           || mask == M_SWC1_AB
6562           || mask == M_LDC1_AB
6563           || mask == M_SDC1_AB
6564           || mask == M_L_DAB
6565           || mask == M_S_DAB)
6566         fmt = "T,o(b)";
6567       else if (mask == M_CACHE_AB)
6568         fmt = "k,o(b)";
6569       else if (coproc)
6570         fmt = "E,o(b)";
6571       else
6572         fmt = "t,o(b)";
6573
6574       if (offset_expr.X_op != O_constant
6575           && offset_expr.X_op != O_symbol)
6576         {
6577           as_bad (_("Expression too complex"));
6578           offset_expr.X_op = O_constant;
6579         }
6580
6581       if (HAVE_32BIT_ADDRESSES
6582           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6583         {
6584           char value [32];
6585
6586           sprintf_vma (value, offset_expr.X_add_number);
6587           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6588         }
6589
6590       /* A constant expression in PIC code can be handled just as it
6591          is in non PIC code.  */
6592       if (offset_expr.X_op == O_constant)
6593         {
6594           expr1.X_add_number = offset_expr.X_add_number;
6595           normalize_address_expr (&expr1);
6596           if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6597             {
6598               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6599                                     & ~(bfd_vma) 0xffff);
6600               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6601               if (breg != 0)
6602                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6603                              tempreg, tempreg, breg);
6604               breg = tempreg;
6605             }
6606           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6607         }
6608       else if (mips_pic == NO_PIC)
6609         {
6610           /* If this is a reference to a GP relative symbol, and there
6611              is no base register, we want
6612                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6613              Otherwise, if there is no base register, we want
6614                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6615                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6616              If we have a constant, we need two instructions anyhow,
6617              so we always use the latter form.
6618
6619              If we have a base register, and this is a reference to a
6620              GP relative symbol, we want
6621                addu     $tempreg,$breg,$gp
6622                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6623              Otherwise we want
6624                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6625                addu     $tempreg,$tempreg,$breg
6626                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6627              With a constant we always use the latter case.
6628
6629              With 64bit address space and no base register and $at usable,
6630              we want
6631                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6632                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6633                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6634                dsll32   $tempreg,0
6635                daddu    $tempreg,$at
6636                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6637              If we have a base register, we want
6638                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6639                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6640                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6641                daddu    $at,$breg
6642                dsll32   $tempreg,0
6643                daddu    $tempreg,$at
6644                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6645
6646              Without $at we can't generate the optimal path for superscalar
6647              processors here since this would require two temporary registers.
6648                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6649                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6650                dsll     $tempreg,16
6651                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6652                dsll     $tempreg,16
6653                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6654              If we have a base register, we want
6655                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6656                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6657                dsll     $tempreg,16
6658                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6659                dsll     $tempreg,16
6660                daddu    $tempreg,$tempreg,$breg
6661                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6662
6663              For GP relative symbols in 64bit address space we can use
6664              the same sequence as in 32bit address space.  */
6665           if (HAVE_64BIT_SYMBOLS)
6666             {
6667               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6668                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6669                 {
6670                   relax_start (offset_expr.X_add_symbol);
6671                   if (breg == 0)
6672                     {
6673                       macro_build (&offset_expr, s, fmt, treg,
6674                                    BFD_RELOC_GPREL16, mips_gp_register);
6675                     }
6676                   else
6677                     {
6678                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6679                                    tempreg, breg, mips_gp_register);
6680                       macro_build (&offset_expr, s, fmt, treg,
6681                                    BFD_RELOC_GPREL16, tempreg);
6682                     }
6683                   relax_switch ();
6684                 }
6685
6686               if (used_at == 0 && mips_opts.at)
6687                 {
6688                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6689                                BFD_RELOC_MIPS_HIGHEST);
6690                   macro_build (&offset_expr, "lui", "t,u", AT,
6691                                BFD_RELOC_HI16_S);
6692                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6693                                tempreg, BFD_RELOC_MIPS_HIGHER);
6694                   if (breg != 0)
6695                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6696                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6697                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6698                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6699                                tempreg);
6700                   used_at = 1;
6701                 }
6702               else
6703                 {
6704                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6705                                BFD_RELOC_MIPS_HIGHEST);
6706                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6707                                tempreg, BFD_RELOC_MIPS_HIGHER);
6708                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6709                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6710                                tempreg, BFD_RELOC_HI16_S);
6711                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6712                   if (breg != 0)
6713                     macro_build (NULL, "daddu", "d,v,t",
6714                                  tempreg, tempreg, breg);
6715                   macro_build (&offset_expr, s, fmt, treg,
6716                                BFD_RELOC_LO16, tempreg);
6717                 }
6718
6719               if (mips_relax.sequence)
6720                 relax_end ();
6721               break;
6722             }
6723
6724           if (breg == 0)
6725             {
6726               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6727                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6728                 {
6729                   relax_start (offset_expr.X_add_symbol);
6730                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6731                                mips_gp_register);
6732                   relax_switch ();
6733                 }
6734               macro_build_lui (&offset_expr, tempreg);
6735               macro_build (&offset_expr, s, fmt, treg,
6736                            BFD_RELOC_LO16, tempreg);
6737               if (mips_relax.sequence)
6738                 relax_end ();
6739             }
6740           else
6741             {
6742               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6743                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6744                 {
6745                   relax_start (offset_expr.X_add_symbol);
6746                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6747                                tempreg, breg, mips_gp_register);
6748                   macro_build (&offset_expr, s, fmt, treg,
6749                                BFD_RELOC_GPREL16, tempreg);
6750                   relax_switch ();
6751                 }
6752               macro_build_lui (&offset_expr, tempreg);
6753               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6754                            tempreg, tempreg, breg);
6755               macro_build (&offset_expr, s, fmt, treg,
6756                            BFD_RELOC_LO16, tempreg);
6757               if (mips_relax.sequence)
6758                 relax_end ();
6759             }
6760         }
6761       else if (!mips_big_got)
6762         {
6763           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6764
6765           /* If this is a reference to an external symbol, we want
6766                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6767                nop
6768                <op>     $treg,0($tempreg)
6769              Otherwise we want
6770                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6771                nop
6772                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6773                <op>     $treg,0($tempreg)
6774
6775              For NewABI, we want
6776                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6777                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6778
6779              If there is a base register, we add it to $tempreg before
6780              the <op>.  If there is a constant, we stick it in the
6781              <op> instruction.  We don't handle constants larger than
6782              16 bits, because we have no way to load the upper 16 bits
6783              (actually, we could handle them for the subset of cases
6784              in which we are not using $at).  */
6785           gas_assert (offset_expr.X_op == O_symbol);
6786           if (HAVE_NEWABI)
6787             {
6788               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6789                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6790               if (breg != 0)
6791                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6792                              tempreg, tempreg, breg);
6793               macro_build (&offset_expr, s, fmt, treg,
6794                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6795               break;
6796             }
6797           expr1.X_add_number = offset_expr.X_add_number;
6798           offset_expr.X_add_number = 0;
6799           if (expr1.X_add_number < -0x8000
6800               || expr1.X_add_number >= 0x8000)
6801             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6802           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6803                        lw_reloc_type, mips_gp_register);
6804           load_delay_nop ();
6805           relax_start (offset_expr.X_add_symbol);
6806           relax_switch ();
6807           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6808                        tempreg, BFD_RELOC_LO16);
6809           relax_end ();
6810           if (breg != 0)
6811             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6812                          tempreg, tempreg, breg);
6813           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6814         }
6815       else if (mips_big_got && !HAVE_NEWABI)
6816         {
6817           int gpdelay;
6818
6819           /* If this is a reference to an external symbol, we want
6820                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6821                addu     $tempreg,$tempreg,$gp
6822                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6823                <op>     $treg,0($tempreg)
6824              Otherwise we want
6825                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6826                nop
6827                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6828                <op>     $treg,0($tempreg)
6829              If there is a base register, we add it to $tempreg before
6830              the <op>.  If there is a constant, we stick it in the
6831              <op> instruction.  We don't handle constants larger than
6832              16 bits, because we have no way to load the upper 16 bits
6833              (actually, we could handle them for the subset of cases
6834              in which we are not using $at).  */
6835           gas_assert (offset_expr.X_op == O_symbol);
6836           expr1.X_add_number = offset_expr.X_add_number;
6837           offset_expr.X_add_number = 0;
6838           if (expr1.X_add_number < -0x8000
6839               || expr1.X_add_number >= 0x8000)
6840             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6841           gpdelay = reg_needs_delay (mips_gp_register);
6842           relax_start (offset_expr.X_add_symbol);
6843           macro_build (&offset_expr, "lui", "t,u", tempreg,
6844                        BFD_RELOC_MIPS_GOT_HI16);
6845           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6846                        mips_gp_register);
6847           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6848                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6849           relax_switch ();
6850           if (gpdelay)
6851             macro_build (NULL, "nop", "");
6852           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6853                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6854           load_delay_nop ();
6855           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6856                        tempreg, BFD_RELOC_LO16);
6857           relax_end ();
6858
6859           if (breg != 0)
6860             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6861                          tempreg, tempreg, breg);
6862           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6863         }
6864       else if (mips_big_got && HAVE_NEWABI)
6865         {
6866           /* If this is a reference to an external symbol, we want
6867                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6868                add      $tempreg,$tempreg,$gp
6869                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6870                <op>     $treg,<ofst>($tempreg)
6871              Otherwise, for local symbols, we want:
6872                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6873                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6874           gas_assert (offset_expr.X_op == O_symbol);
6875           expr1.X_add_number = offset_expr.X_add_number;
6876           offset_expr.X_add_number = 0;
6877           if (expr1.X_add_number < -0x8000
6878               || expr1.X_add_number >= 0x8000)
6879             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6880           relax_start (offset_expr.X_add_symbol);
6881           macro_build (&offset_expr, "lui", "t,u", tempreg,
6882                        BFD_RELOC_MIPS_GOT_HI16);
6883           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6884                        mips_gp_register);
6885           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6886                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6887           if (breg != 0)
6888             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6889                          tempreg, tempreg, breg);
6890           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6891
6892           relax_switch ();
6893           offset_expr.X_add_number = expr1.X_add_number;
6894           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6895                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6896           if (breg != 0)
6897             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6898                          tempreg, tempreg, breg);
6899           macro_build (&offset_expr, s, fmt, treg,
6900                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6901           relax_end ();
6902         }
6903       else
6904         abort ();
6905
6906       break;
6907
6908     case M_LI:
6909     case M_LI_S:
6910       load_register (treg, &imm_expr, 0);
6911       break;
6912
6913     case M_DLI:
6914       load_register (treg, &imm_expr, 1);
6915       break;
6916
6917     case M_LI_SS:
6918       if (imm_expr.X_op == O_constant)
6919         {
6920           used_at = 1;
6921           load_register (AT, &imm_expr, 0);
6922           macro_build (NULL, "mtc1", "t,G", AT, treg);
6923           break;
6924         }
6925       else
6926         {
6927           gas_assert (offset_expr.X_op == O_symbol
6928                       && strcmp (segment_name (S_GET_SEGMENT
6929                                                (offset_expr.X_add_symbol)),
6930                                  ".lit4") == 0
6931                       && offset_expr.X_add_number == 0);
6932           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6933                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6934           break;
6935         }
6936
6937     case M_LI_D:
6938       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6939          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6940          order 32 bits of the value and the low order 32 bits are either
6941          zero or in OFFSET_EXPR.  */
6942       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6943         {
6944           if (HAVE_64BIT_GPRS)
6945             load_register (treg, &imm_expr, 1);
6946           else
6947             {
6948               int hreg, lreg;
6949
6950               if (target_big_endian)
6951                 {
6952                   hreg = treg;
6953                   lreg = treg + 1;
6954                 }
6955               else
6956                 {
6957                   hreg = treg + 1;
6958                   lreg = treg;
6959                 }
6960
6961               if (hreg <= 31)
6962                 load_register (hreg, &imm_expr, 0);
6963               if (lreg <= 31)
6964                 {
6965                   if (offset_expr.X_op == O_absent)
6966                     move_register (lreg, 0);
6967                   else
6968                     {
6969                       gas_assert (offset_expr.X_op == O_constant);
6970                       load_register (lreg, &offset_expr, 0);
6971                     }
6972                 }
6973             }
6974           break;
6975         }
6976
6977       /* We know that sym is in the .rdata section.  First we get the
6978          upper 16 bits of the address.  */
6979       if (mips_pic == NO_PIC)
6980         {
6981           macro_build_lui (&offset_expr, AT);
6982           used_at = 1;
6983         }
6984       else
6985         {
6986           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6987                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6988           used_at = 1;
6989         }
6990
6991       /* Now we load the register(s).  */
6992       if (HAVE_64BIT_GPRS)
6993         {
6994           used_at = 1;
6995           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6996         }
6997       else
6998         {
6999           used_at = 1;
7000           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7001           if (treg != RA)
7002             {
7003               /* FIXME: How in the world do we deal with the possible
7004                  overflow here?  */
7005               offset_expr.X_add_number += 4;
7006               macro_build (&offset_expr, "lw", "t,o(b)",
7007                            treg + 1, BFD_RELOC_LO16, AT);
7008             }
7009         }
7010       break;
7011
7012     case M_LI_DD:
7013       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
7014          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7015          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
7016          the value and the low order 32 bits are either zero or in
7017          OFFSET_EXPR.  */
7018       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7019         {
7020           used_at = 1;
7021           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7022           if (HAVE_64BIT_FPRS)
7023             {
7024               gas_assert (HAVE_64BIT_GPRS);
7025               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7026             }
7027           else
7028             {
7029               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7030               if (offset_expr.X_op == O_absent)
7031                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7032               else
7033                 {
7034                   gas_assert (offset_expr.X_op == O_constant);
7035                   load_register (AT, &offset_expr, 0);
7036                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7037                 }
7038             }
7039           break;
7040         }
7041
7042       gas_assert (offset_expr.X_op == O_symbol
7043                   && offset_expr.X_add_number == 0);
7044       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7045       if (strcmp (s, ".lit8") == 0)
7046         {
7047           if (mips_opts.isa != ISA_MIPS1)
7048             {
7049               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7050                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7051               break;
7052             }
7053           breg = mips_gp_register;
7054           r = BFD_RELOC_MIPS_LITERAL;
7055           goto dob;
7056         }
7057       else
7058         {
7059           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7060           used_at = 1;
7061           if (mips_pic != NO_PIC)
7062             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7063                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7064           else
7065             {
7066               /* FIXME: This won't work for a 64 bit address.  */
7067               macro_build_lui (&offset_expr, AT);
7068             }
7069
7070           if (mips_opts.isa != ISA_MIPS1)
7071             {
7072               macro_build (&offset_expr, "ldc1", "T,o(b)",
7073                            treg, BFD_RELOC_LO16, AT);
7074               break;
7075             }
7076           breg = AT;
7077           r = BFD_RELOC_LO16;
7078           goto dob;
7079         }
7080
7081     case M_L_DOB:
7082       /* Even on a big endian machine $fn comes before $fn+1.  We have
7083          to adjust when loading from memory.  */
7084       r = BFD_RELOC_LO16;
7085     dob:
7086       gas_assert (mips_opts.isa == ISA_MIPS1);
7087       macro_build (&offset_expr, "lwc1", "T,o(b)",
7088                    target_big_endian ? treg + 1 : treg, r, breg);
7089       /* FIXME: A possible overflow which I don't know how to deal
7090          with.  */
7091       offset_expr.X_add_number += 4;
7092       macro_build (&offset_expr, "lwc1", "T,o(b)",
7093                    target_big_endian ? treg : treg + 1, r, breg);
7094       break;
7095
7096     case M_S_DOB:
7097       gas_assert (mips_opts.isa == ISA_MIPS1);
7098       /* Even on a big endian machine $fn comes before $fn+1.  We have
7099          to adjust when storing to memory.  */
7100       macro_build (&offset_expr, "swc1", "T,o(b)",
7101                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7102       offset_expr.X_add_number += 4;
7103       macro_build (&offset_expr, "swc1", "T,o(b)",
7104                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7105       break;
7106
7107     case M_L_DAB:
7108       /*
7109        * The MIPS assembler seems to check for X_add_number not
7110        * being double aligned and generating:
7111        *        lui     at,%hi(foo+1)
7112        *        addu    at,at,v1
7113        *        addiu   at,at,%lo(foo+1)
7114        *        lwc1    f2,0(at)
7115        *        lwc1    f3,4(at)
7116        * But, the resulting address is the same after relocation so why
7117        * generate the extra instruction?
7118        */
7119       /* Itbl support may require additional care here.  */
7120       coproc = 1;
7121       if (mips_opts.isa != ISA_MIPS1)
7122         {
7123           s = "ldc1";
7124           goto ld;
7125         }
7126
7127       s = "lwc1";
7128       fmt = "T,o(b)";
7129       goto ldd_std;
7130
7131     case M_S_DAB:
7132       if (mips_opts.isa != ISA_MIPS1)
7133         {
7134           s = "sdc1";
7135           goto st;
7136         }
7137
7138       s = "swc1";
7139       fmt = "T,o(b)";
7140       /* Itbl support may require additional care here.  */
7141       coproc = 1;
7142       goto ldd_std;
7143
7144     case M_LD_AB:
7145       if (HAVE_64BIT_GPRS)
7146         {
7147           s = "ld";
7148           goto ld;
7149         }
7150
7151       s = "lw";
7152       fmt = "t,o(b)";
7153       goto ldd_std;
7154
7155     case M_SD_AB:
7156       if (HAVE_64BIT_GPRS)
7157         {
7158           s = "sd";
7159           goto st;
7160         }
7161
7162       s = "sw";
7163       fmt = "t,o(b)";
7164
7165     ldd_std:
7166       if (offset_expr.X_op != O_symbol
7167           && offset_expr.X_op != O_constant)
7168         {
7169           as_bad (_("Expression too complex"));
7170           offset_expr.X_op = O_constant;
7171         }
7172
7173       if (HAVE_32BIT_ADDRESSES
7174           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7175         {
7176           char value [32];
7177
7178           sprintf_vma (value, offset_expr.X_add_number);
7179           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7180         }
7181
7182       /* Even on a big endian machine $fn comes before $fn+1.  We have
7183          to adjust when loading from memory.  We set coproc if we must
7184          load $fn+1 first.  */
7185       /* Itbl support may require additional care here.  */
7186       if (!target_big_endian)
7187         coproc = 0;
7188
7189       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7190         {
7191           /* If this is a reference to a GP relative symbol, we want
7192                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7193                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7194              If we have a base register, we use this
7195                addu     $at,$breg,$gp
7196                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7197                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7198              If this is not a GP relative symbol, we want
7199                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7200                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7201                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7202              If there is a base register, we add it to $at after the
7203              lui instruction.  If there is a constant, we always use
7204              the last case.  */
7205           if (offset_expr.X_op == O_symbol
7206               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7207               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7208             {
7209               relax_start (offset_expr.X_add_symbol);
7210               if (breg == 0)
7211                 {
7212                   tempreg = mips_gp_register;
7213                 }
7214               else
7215                 {
7216                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7217                                AT, breg, mips_gp_register);
7218                   tempreg = AT;
7219                   used_at = 1;
7220                 }
7221
7222               /* Itbl support may require additional care here.  */
7223               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7224                            BFD_RELOC_GPREL16, tempreg);
7225               offset_expr.X_add_number += 4;
7226
7227               /* Set mips_optimize to 2 to avoid inserting an
7228                  undesired nop.  */
7229               hold_mips_optimize = mips_optimize;
7230               mips_optimize = 2;
7231               /* Itbl support may require additional care here.  */
7232               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7233                            BFD_RELOC_GPREL16, tempreg);
7234               mips_optimize = hold_mips_optimize;
7235
7236               relax_switch ();
7237
7238               offset_expr.X_add_number -= 4;
7239             }
7240           used_at = 1;
7241           macro_build_lui (&offset_expr, AT);
7242           if (breg != 0)
7243             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7244           /* Itbl support may require additional care here.  */
7245           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7246                        BFD_RELOC_LO16, AT);
7247           /* FIXME: How do we handle overflow here?  */
7248           offset_expr.X_add_number += 4;
7249           /* Itbl support may require additional care here.  */
7250           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7251                        BFD_RELOC_LO16, AT);
7252           if (mips_relax.sequence)
7253             relax_end ();
7254         }
7255       else if (!mips_big_got)
7256         {
7257           /* If this is a reference to an external symbol, we want
7258                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7259                nop
7260                <op>     $treg,0($at)
7261                <op>     $treg+1,4($at)
7262              Otherwise we want
7263                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7264                nop
7265                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7266                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7267              If there is a base register we add it to $at before the
7268              lwc1 instructions.  If there is a constant we include it
7269              in the lwc1 instructions.  */
7270           used_at = 1;
7271           expr1.X_add_number = offset_expr.X_add_number;
7272           if (expr1.X_add_number < -0x8000
7273               || expr1.X_add_number >= 0x8000 - 4)
7274             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7275           load_got_offset (AT, &offset_expr);
7276           load_delay_nop ();
7277           if (breg != 0)
7278             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7279
7280           /* Set mips_optimize to 2 to avoid inserting an undesired
7281              nop.  */
7282           hold_mips_optimize = mips_optimize;
7283           mips_optimize = 2;
7284
7285           /* Itbl support may require additional care here.  */
7286           relax_start (offset_expr.X_add_symbol);
7287           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7288                        BFD_RELOC_LO16, AT);
7289           expr1.X_add_number += 4;
7290           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7291                        BFD_RELOC_LO16, AT);
7292           relax_switch ();
7293           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7294                        BFD_RELOC_LO16, AT);
7295           offset_expr.X_add_number += 4;
7296           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7297                        BFD_RELOC_LO16, AT);
7298           relax_end ();
7299
7300           mips_optimize = hold_mips_optimize;
7301         }
7302       else if (mips_big_got)
7303         {
7304           int gpdelay;
7305
7306           /* If this is a reference to an external symbol, we want
7307                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7308                addu     $at,$at,$gp
7309                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7310                nop
7311                <op>     $treg,0($at)
7312                <op>     $treg+1,4($at)
7313              Otherwise we want
7314                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7315                nop
7316                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7317                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7318              If there is a base register we add it to $at before the
7319              lwc1 instructions.  If there is a constant we include it
7320              in the lwc1 instructions.  */
7321           used_at = 1;
7322           expr1.X_add_number = offset_expr.X_add_number;
7323           offset_expr.X_add_number = 0;
7324           if (expr1.X_add_number < -0x8000
7325               || expr1.X_add_number >= 0x8000 - 4)
7326             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7327           gpdelay = reg_needs_delay (mips_gp_register);
7328           relax_start (offset_expr.X_add_symbol);
7329           macro_build (&offset_expr, "lui", "t,u",
7330                        AT, BFD_RELOC_MIPS_GOT_HI16);
7331           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7332                        AT, AT, mips_gp_register);
7333           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7334                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7335           load_delay_nop ();
7336           if (breg != 0)
7337             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7338           /* Itbl support may require additional care here.  */
7339           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7340                        BFD_RELOC_LO16, AT);
7341           expr1.X_add_number += 4;
7342
7343           /* Set mips_optimize to 2 to avoid inserting an undesired
7344              nop.  */
7345           hold_mips_optimize = mips_optimize;
7346           mips_optimize = 2;
7347           /* Itbl support may require additional care here.  */
7348           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7349                        BFD_RELOC_LO16, AT);
7350           mips_optimize = hold_mips_optimize;
7351           expr1.X_add_number -= 4;
7352
7353           relax_switch ();
7354           offset_expr.X_add_number = expr1.X_add_number;
7355           if (gpdelay)
7356             macro_build (NULL, "nop", "");
7357           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7358                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7359           load_delay_nop ();
7360           if (breg != 0)
7361             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7362           /* Itbl support may require additional care here.  */
7363           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7364                        BFD_RELOC_LO16, AT);
7365           offset_expr.X_add_number += 4;
7366
7367           /* Set mips_optimize to 2 to avoid inserting an undesired
7368              nop.  */
7369           hold_mips_optimize = mips_optimize;
7370           mips_optimize = 2;
7371           /* Itbl support may require additional care here.  */
7372           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7373                        BFD_RELOC_LO16, AT);
7374           mips_optimize = hold_mips_optimize;
7375           relax_end ();
7376         }
7377       else
7378         abort ();
7379
7380       break;
7381
7382     case M_LD_OB:
7383       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7384       goto sd_ob;
7385     case M_SD_OB:
7386       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7387     sd_ob:
7388       macro_build (&offset_expr, s, "t,o(b)", treg,
7389                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7390                    breg);
7391       if (!HAVE_64BIT_GPRS)
7392         {
7393           offset_expr.X_add_number += 4;
7394           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7395                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7396                        breg);
7397         }
7398       break;
7399
7400    /* New code added to support COPZ instructions.
7401       This code builds table entries out of the macros in mip_opcodes.
7402       R4000 uses interlocks to handle coproc delays.
7403       Other chips (like the R3000) require nops to be inserted for delays.
7404
7405       FIXME: Currently, we require that the user handle delays.
7406       In order to fill delay slots for non-interlocked chips,
7407       we must have a way to specify delays based on the coprocessor.
7408       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7409       What are the side-effects of the cop instruction?
7410       What cache support might we have and what are its effects?
7411       Both coprocessor & memory require delays. how long???
7412       What registers are read/set/modified?
7413
7414       If an itbl is provided to interpret cop instructions,
7415       this knowledge can be encoded in the itbl spec.  */
7416
7417     case M_COP0:
7418       s = "c0";
7419       goto copz;
7420     case M_COP1:
7421       s = "c1";
7422       goto copz;
7423     case M_COP2:
7424       s = "c2";
7425       goto copz;
7426     case M_COP3:
7427       s = "c3";
7428     copz:
7429       if (NO_ISA_COP (mips_opts.arch)
7430           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7431         {
7432           as_bad (_("opcode not supported on this processor: %s"),
7433                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7434           break;
7435         }
7436
7437       /* For now we just do C (same as Cz).  The parameter will be
7438          stored in insn_opcode by mips_ip.  */
7439       macro_build (NULL, s, "C", ip->insn_opcode);
7440       break;
7441
7442     case M_MOVE:
7443       move_register (dreg, sreg);
7444       break;
7445
7446     case M_DMUL:
7447       dbl = 1;
7448     case M_MUL:
7449       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7450       macro_build (NULL, "mflo", "d", dreg);
7451       break;
7452
7453     case M_DMUL_I:
7454       dbl = 1;
7455     case M_MUL_I:
7456       /* The MIPS assembler some times generates shifts and adds.  I'm
7457          not trying to be that fancy. GCC should do this for us
7458          anyway.  */
7459       used_at = 1;
7460       load_register (AT, &imm_expr, dbl);
7461       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7462       macro_build (NULL, "mflo", "d", dreg);
7463       break;
7464
7465     case M_DMULO_I:
7466       dbl = 1;
7467     case M_MULO_I:
7468       imm = 1;
7469       goto do_mulo;
7470
7471     case M_DMULO:
7472       dbl = 1;
7473     case M_MULO:
7474     do_mulo:
7475       start_noreorder ();
7476       used_at = 1;
7477       if (imm)
7478         load_register (AT, &imm_expr, dbl);
7479       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7480       macro_build (NULL, "mflo", "d", dreg);
7481       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7482       macro_build (NULL, "mfhi", "d", AT);
7483       if (mips_trap)
7484         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7485       else
7486         {
7487           expr1.X_add_number = 8;
7488           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7489           macro_build (NULL, "nop", "");
7490           macro_build (NULL, "break", "c", 6);
7491         }
7492       end_noreorder ();
7493       macro_build (NULL, "mflo", "d", dreg);
7494       break;
7495
7496     case M_DMULOU_I:
7497       dbl = 1;
7498     case M_MULOU_I:
7499       imm = 1;
7500       goto do_mulou;
7501
7502     case M_DMULOU:
7503       dbl = 1;
7504     case M_MULOU:
7505     do_mulou:
7506       start_noreorder ();
7507       used_at = 1;
7508       if (imm)
7509         load_register (AT, &imm_expr, dbl);
7510       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7511                    sreg, imm ? AT : treg);
7512       macro_build (NULL, "mfhi", "d", AT);
7513       macro_build (NULL, "mflo", "d", dreg);
7514       if (mips_trap)
7515         macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7516       else
7517         {
7518           expr1.X_add_number = 8;
7519           macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7520           macro_build (NULL, "nop", "");
7521           macro_build (NULL, "break", "c", 6);
7522         }
7523       end_noreorder ();
7524       break;
7525
7526     case M_DROL:
7527       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7528         {
7529           if (dreg == sreg)
7530             {
7531               tempreg = AT;
7532               used_at = 1;
7533             }
7534           else
7535             {
7536               tempreg = dreg;
7537             }
7538           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7539           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7540           break;
7541         }
7542       used_at = 1;
7543       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7544       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7545       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7546       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7547       break;
7548
7549     case M_ROL:
7550       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7551         {
7552           if (dreg == sreg)
7553             {
7554               tempreg = AT;
7555               used_at = 1;
7556             }
7557           else
7558             {
7559               tempreg = dreg;
7560             }
7561           macro_build (NULL, "negu", "d,w", tempreg, treg);
7562           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7563           break;
7564         }
7565       used_at = 1;
7566       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7567       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7568       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7569       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7570       break;
7571
7572     case M_DROL_I:
7573       {
7574         unsigned int rot;
7575         char *l;
7576         char *rr;
7577
7578         if (imm_expr.X_op != O_constant)
7579           as_bad (_("Improper rotate count"));
7580         rot = imm_expr.X_add_number & 0x3f;
7581         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7582           {
7583             rot = (64 - rot) & 0x3f;
7584             if (rot >= 32)
7585               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7586             else
7587               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7588             break;
7589           }
7590         if (rot == 0)
7591           {
7592             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7593             break;
7594           }
7595         l = (rot < 0x20) ? "dsll" : "dsll32";
7596         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7597         rot &= 0x1f;
7598         used_at = 1;
7599         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7600         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7601         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7602       }
7603       break;
7604
7605     case M_ROL_I:
7606       {
7607         unsigned int rot;
7608
7609         if (imm_expr.X_op != O_constant)
7610           as_bad (_("Improper rotate count"));
7611         rot = imm_expr.X_add_number & 0x1f;
7612         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7613           {
7614             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7615             break;
7616           }
7617         if (rot == 0)
7618           {
7619             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7620             break;
7621           }
7622         used_at = 1;
7623         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7624         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7625         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7626       }
7627       break;
7628
7629     case M_DROR:
7630       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7631         {
7632           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7633           break;
7634         }
7635       used_at = 1;
7636       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7637       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7638       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7639       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7640       break;
7641
7642     case M_ROR:
7643       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7644         {
7645           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7646           break;
7647         }
7648       used_at = 1;
7649       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7650       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7651       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7652       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7653       break;
7654
7655     case M_DROR_I:
7656       {
7657         unsigned int rot;
7658         char *l;
7659         char *rr;
7660
7661         if (imm_expr.X_op != O_constant)
7662           as_bad (_("Improper rotate count"));
7663         rot = imm_expr.X_add_number & 0x3f;
7664         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7665           {
7666             if (rot >= 32)
7667               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7668             else
7669               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7670             break;
7671           }
7672         if (rot == 0)
7673           {
7674             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7675             break;
7676           }
7677         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7678         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7679         rot &= 0x1f;
7680         used_at = 1;
7681         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7682         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7683         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7684       }
7685       break;
7686
7687     case M_ROR_I:
7688       {
7689         unsigned int rot;
7690
7691         if (imm_expr.X_op != O_constant)
7692           as_bad (_("Improper rotate count"));
7693         rot = imm_expr.X_add_number & 0x1f;
7694         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7695           {
7696             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7697             break;
7698           }
7699         if (rot == 0)
7700           {
7701             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7702             break;
7703           }
7704         used_at = 1;
7705         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7706         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7707         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7708       }
7709       break;
7710
7711     case M_SEQ:
7712       if (sreg == 0)
7713         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7714       else if (treg == 0)
7715         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7716       else
7717         {
7718           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7719           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7720         }
7721       break;
7722
7723     case M_SEQ_I:
7724       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7725         {
7726           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7727           break;
7728         }
7729       if (sreg == 0)
7730         {
7731           as_warn (_("Instruction %s: result is always false"),
7732                    ip->insn_mo->name);
7733           move_register (dreg, 0);
7734           break;
7735         }
7736       if (CPU_HAS_SEQ (mips_opts.arch)
7737           && -512 <= imm_expr.X_add_number
7738           && imm_expr.X_add_number < 512)
7739         {
7740           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7741                        (int) imm_expr.X_add_number);
7742           break;
7743         }
7744       if (imm_expr.X_op == O_constant
7745           && imm_expr.X_add_number >= 0
7746           && imm_expr.X_add_number < 0x10000)
7747         {
7748           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7749         }
7750       else if (imm_expr.X_op == O_constant
7751                && imm_expr.X_add_number > -0x8000
7752                && imm_expr.X_add_number < 0)
7753         {
7754           imm_expr.X_add_number = -imm_expr.X_add_number;
7755           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7756                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7757         }
7758       else if (CPU_HAS_SEQ (mips_opts.arch))
7759         {
7760           used_at = 1;
7761           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7762           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7763           break;
7764         }
7765       else
7766         {
7767           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7768           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7769           used_at = 1;
7770         }
7771       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7772       break;
7773
7774     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7775       s = "slt";
7776       goto sge;
7777     case M_SGEU:
7778       s = "sltu";
7779     sge:
7780       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7781       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7782       break;
7783
7784     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7785     case M_SGEU_I:
7786       if (imm_expr.X_op == O_constant
7787           && imm_expr.X_add_number >= -0x8000
7788           && imm_expr.X_add_number < 0x8000)
7789         {
7790           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7791                        dreg, sreg, BFD_RELOC_LO16);
7792         }
7793       else
7794         {
7795           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7796           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7797                        dreg, sreg, AT);
7798           used_at = 1;
7799         }
7800       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7801       break;
7802
7803     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7804       s = "slt";
7805       goto sgt;
7806     case M_SGTU:
7807       s = "sltu";
7808     sgt:
7809       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7810       break;
7811
7812     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7813       s = "slt";
7814       goto sgti;
7815     case M_SGTU_I:
7816       s = "sltu";
7817     sgti:
7818       used_at = 1;
7819       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7820       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7821       break;
7822
7823     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7824       s = "slt";
7825       goto sle;
7826     case M_SLEU:
7827       s = "sltu";
7828     sle:
7829       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7830       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7831       break;
7832
7833     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7834       s = "slt";
7835       goto slei;
7836     case M_SLEU_I:
7837       s = "sltu";
7838     slei:
7839       used_at = 1;
7840       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7841       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7842       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7843       break;
7844
7845     case M_SLT_I:
7846       if (imm_expr.X_op == O_constant
7847           && imm_expr.X_add_number >= -0x8000
7848           && imm_expr.X_add_number < 0x8000)
7849         {
7850           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7851           break;
7852         }
7853       used_at = 1;
7854       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7855       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7856       break;
7857
7858     case M_SLTU_I:
7859       if (imm_expr.X_op == O_constant
7860           && imm_expr.X_add_number >= -0x8000
7861           && imm_expr.X_add_number < 0x8000)
7862         {
7863           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7864                        BFD_RELOC_LO16);
7865           break;
7866         }
7867       used_at = 1;
7868       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7869       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7870       break;
7871
7872     case M_SNE:
7873       if (sreg == 0)
7874         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7875       else if (treg == 0)
7876         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7877       else
7878         {
7879           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7880           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7881         }
7882       break;
7883
7884     case M_SNE_I:
7885       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7886         {
7887           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7888           break;
7889         }
7890       if (sreg == 0)
7891         {
7892           as_warn (_("Instruction %s: result is always true"),
7893                    ip->insn_mo->name);
7894           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7895                        dreg, 0, BFD_RELOC_LO16);
7896           break;
7897         }
7898       if (CPU_HAS_SEQ (mips_opts.arch)
7899           && -512 <= imm_expr.X_add_number
7900           && imm_expr.X_add_number < 512)
7901         {
7902           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7903                        (int) imm_expr.X_add_number);
7904           break;
7905         }
7906       if (imm_expr.X_op == O_constant
7907           && imm_expr.X_add_number >= 0
7908           && imm_expr.X_add_number < 0x10000)
7909         {
7910           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7911         }
7912       else if (imm_expr.X_op == O_constant
7913                && imm_expr.X_add_number > -0x8000
7914                && imm_expr.X_add_number < 0)
7915         {
7916           imm_expr.X_add_number = -imm_expr.X_add_number;
7917           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7918                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7919         }
7920       else if (CPU_HAS_SEQ (mips_opts.arch))
7921         {
7922           used_at = 1;
7923           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7924           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7925           break;
7926         }
7927       else
7928         {
7929           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7930           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7931           used_at = 1;
7932         }
7933       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7934       break;
7935
7936     case M_DSUB_I:
7937       dbl = 1;
7938     case M_SUB_I:
7939       if (imm_expr.X_op == O_constant
7940           && imm_expr.X_add_number > -0x8000
7941           && imm_expr.X_add_number <= 0x8000)
7942         {
7943           imm_expr.X_add_number = -imm_expr.X_add_number;
7944           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7945                        dreg, sreg, BFD_RELOC_LO16);
7946           break;
7947         }
7948       used_at = 1;
7949       load_register (AT, &imm_expr, dbl);
7950       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7951       break;
7952
7953     case M_DSUBU_I:
7954       dbl = 1;
7955     case M_SUBU_I:
7956       if (imm_expr.X_op == O_constant
7957           && imm_expr.X_add_number > -0x8000
7958           && imm_expr.X_add_number <= 0x8000)
7959         {
7960           imm_expr.X_add_number = -imm_expr.X_add_number;
7961           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7962                        dreg, sreg, BFD_RELOC_LO16);
7963           break;
7964         }
7965       used_at = 1;
7966       load_register (AT, &imm_expr, dbl);
7967       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7968       break;
7969
7970     case M_TEQ_I:
7971       s = "teq";
7972       goto trap;
7973     case M_TGE_I:
7974       s = "tge";
7975       goto trap;
7976     case M_TGEU_I:
7977       s = "tgeu";
7978       goto trap;
7979     case M_TLT_I:
7980       s = "tlt";
7981       goto trap;
7982     case M_TLTU_I:
7983       s = "tltu";
7984       goto trap;
7985     case M_TNE_I:
7986       s = "tne";
7987     trap:
7988       used_at = 1;
7989       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7990       macro_build (NULL, s, "s,t", sreg, AT);
7991       break;
7992
7993     case M_TRUNCWS:
7994     case M_TRUNCWD:
7995       gas_assert (mips_opts.isa == ISA_MIPS1);
7996       used_at = 1;
7997       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7998       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7999
8000       /*
8001        * Is the double cfc1 instruction a bug in the mips assembler;
8002        * or is there a reason for it?
8003        */
8004       start_noreorder ();
8005       macro_build (NULL, "cfc1", "t,G", treg, RA);
8006       macro_build (NULL, "cfc1", "t,G", treg, RA);
8007       macro_build (NULL, "nop", "");
8008       expr1.X_add_number = 3;
8009       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8010       expr1.X_add_number = 2;
8011       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8012       macro_build (NULL, "ctc1", "t,G", AT, RA);
8013       macro_build (NULL, "nop", "");
8014       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8015                    dreg, sreg);
8016       macro_build (NULL, "ctc1", "t,G", treg, RA);
8017       macro_build (NULL, "nop", "");
8018       end_noreorder ();
8019       break;
8020
8021     case M_ULH:
8022       s = "lb";
8023       goto ulh;
8024     case M_ULHU:
8025       s = "lbu";
8026     ulh:
8027       used_at = 1;
8028       if (offset_expr.X_add_number >= 0x7fff)
8029         as_bad (_("Operand overflow"));
8030       if (!target_big_endian)
8031         ++offset_expr.X_add_number;
8032       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8033       if (!target_big_endian)
8034         --offset_expr.X_add_number;
8035       else
8036         ++offset_expr.X_add_number;
8037       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8038       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8039       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8040       break;
8041
8042     case M_ULD:
8043       s = "ldl";
8044       s2 = "ldr";
8045       off = 7;
8046       goto ulw;
8047     case M_ULW:
8048       s = "lwl";
8049       s2 = "lwr";
8050       off = 3;
8051     ulw:
8052       if (offset_expr.X_add_number >= 0x8000 - off)
8053         as_bad (_("Operand overflow"));
8054       if (treg != breg)
8055         tempreg = treg;
8056       else
8057         {
8058           used_at = 1;
8059           tempreg = AT;
8060         }
8061       if (!target_big_endian)
8062         offset_expr.X_add_number += off;
8063       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8064       if (!target_big_endian)
8065         offset_expr.X_add_number -= off;
8066       else
8067         offset_expr.X_add_number += off;
8068       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8069
8070       /* If necessary, move the result in tempreg to the final destination.  */
8071       if (treg == tempreg)
8072         break;
8073       /* Protect second load's delay slot.  */
8074       load_delay_nop ();
8075       move_register (treg, tempreg);
8076       break;
8077
8078     case M_ULD_A:
8079       s = "ldl";
8080       s2 = "ldr";
8081       off = 7;
8082       goto ulwa;
8083     case M_ULW_A:
8084       s = "lwl";
8085       s2 = "lwr";
8086       off = 3;
8087     ulwa:
8088       used_at = 1;
8089       load_address (AT, &offset_expr, &used_at);
8090       if (breg != 0)
8091         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8092       if (!target_big_endian)
8093         expr1.X_add_number = off;
8094       else
8095         expr1.X_add_number = 0;
8096       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8097       if (!target_big_endian)
8098         expr1.X_add_number = 0;
8099       else
8100         expr1.X_add_number = off;
8101       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8102       break;
8103
8104     case M_ULH_A:
8105     case M_ULHU_A:
8106       used_at = 1;
8107       load_address (AT, &offset_expr, &used_at);
8108       if (breg != 0)
8109         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8110       if (target_big_endian)
8111         expr1.X_add_number = 0;
8112       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8113                    treg, BFD_RELOC_LO16, AT);
8114       if (target_big_endian)
8115         expr1.X_add_number = 1;
8116       else
8117         expr1.X_add_number = 0;
8118       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8119       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8120       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8121       break;
8122
8123     case M_USH:
8124       used_at = 1;
8125       if (offset_expr.X_add_number >= 0x7fff)
8126         as_bad (_("Operand overflow"));
8127       if (target_big_endian)
8128         ++offset_expr.X_add_number;
8129       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8130       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8131       if (target_big_endian)
8132         --offset_expr.X_add_number;
8133       else
8134         ++offset_expr.X_add_number;
8135       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8136       break;
8137
8138     case M_USD:
8139       s = "sdl";
8140       s2 = "sdr";
8141       off = 7;
8142       goto usw;
8143     case M_USW:
8144       s = "swl";
8145       s2 = "swr";
8146       off = 3;
8147     usw:
8148       if (offset_expr.X_add_number >= 0x8000 - off)
8149         as_bad (_("Operand overflow"));
8150       if (!target_big_endian)
8151         offset_expr.X_add_number += off;
8152       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8153       if (!target_big_endian)
8154         offset_expr.X_add_number -= off;
8155       else
8156         offset_expr.X_add_number += off;
8157       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8158       break;
8159
8160     case M_USD_A:
8161       s = "sdl";
8162       s2 = "sdr";
8163       off = 7;
8164       goto uswa;
8165     case M_USW_A:
8166       s = "swl";
8167       s2 = "swr";
8168       off = 3;
8169     uswa:
8170       used_at = 1;
8171       load_address (AT, &offset_expr, &used_at);
8172       if (breg != 0)
8173         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8174       if (!target_big_endian)
8175         expr1.X_add_number = off;
8176       else
8177         expr1.X_add_number = 0;
8178       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8179       if (!target_big_endian)
8180         expr1.X_add_number = 0;
8181       else
8182         expr1.X_add_number = off;
8183       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8184       break;
8185
8186     case M_USH_A:
8187       used_at = 1;
8188       load_address (AT, &offset_expr, &used_at);
8189       if (breg != 0)
8190         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8191       if (!target_big_endian)
8192         expr1.X_add_number = 0;
8193       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8194       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8195       if (!target_big_endian)
8196         expr1.X_add_number = 1;
8197       else
8198         expr1.X_add_number = 0;
8199       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8200       if (!target_big_endian)
8201         expr1.X_add_number = 0;
8202       else
8203         expr1.X_add_number = 1;
8204       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8205       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8206       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8207       break;
8208
8209     default:
8210       /* FIXME: Check if this is one of the itbl macros, since they
8211          are added dynamically.  */
8212       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8213       break;
8214     }
8215   if (!mips_opts.at && used_at)
8216     as_bad (_("Macro used $at after \".set noat\""));
8217 }
8218
8219 /* Implement macros in mips16 mode.  */
8220
8221 static void
8222 mips16_macro (struct mips_cl_insn *ip)
8223 {
8224   int mask;
8225   int xreg, yreg, zreg, tmp;
8226   expressionS expr1;
8227   int dbl;
8228   const char *s, *s2, *s3;
8229
8230   mask = ip->insn_mo->mask;
8231
8232   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8233   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8234   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8235
8236   expr1.X_op = O_constant;
8237   expr1.X_op_symbol = NULL;
8238   expr1.X_add_symbol = NULL;
8239   expr1.X_add_number = 1;
8240
8241   dbl = 0;
8242
8243   switch (mask)
8244     {
8245     default:
8246       internalError ();
8247
8248     case M_DDIV_3:
8249       dbl = 1;
8250     case M_DIV_3:
8251       s = "mflo";
8252       goto do_div3;
8253     case M_DREM_3:
8254       dbl = 1;
8255     case M_REM_3:
8256       s = "mfhi";
8257     do_div3:
8258       start_noreorder ();
8259       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8260       expr1.X_add_number = 2;
8261       macro_build (&expr1, "bnez", "x,p", yreg);
8262       macro_build (NULL, "break", "6", 7);
8263
8264       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8265          since that causes an overflow.  We should do that as well,
8266          but I don't see how to do the comparisons without a temporary
8267          register.  */
8268       end_noreorder ();
8269       macro_build (NULL, s, "x", zreg);
8270       break;
8271
8272     case M_DIVU_3:
8273       s = "divu";
8274       s2 = "mflo";
8275       goto do_divu3;
8276     case M_REMU_3:
8277       s = "divu";
8278       s2 = "mfhi";
8279       goto do_divu3;
8280     case M_DDIVU_3:
8281       s = "ddivu";
8282       s2 = "mflo";
8283       goto do_divu3;
8284     case M_DREMU_3:
8285       s = "ddivu";
8286       s2 = "mfhi";
8287     do_divu3:
8288       start_noreorder ();
8289       macro_build (NULL, s, "0,x,y", xreg, yreg);
8290       expr1.X_add_number = 2;
8291       macro_build (&expr1, "bnez", "x,p", yreg);
8292       macro_build (NULL, "break", "6", 7);
8293       end_noreorder ();
8294       macro_build (NULL, s2, "x", zreg);
8295       break;
8296
8297     case M_DMUL:
8298       dbl = 1;
8299     case M_MUL:
8300       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8301       macro_build (NULL, "mflo", "x", zreg);
8302       break;
8303
8304     case M_DSUBU_I:
8305       dbl = 1;
8306       goto do_subu;
8307     case M_SUBU_I:
8308     do_subu:
8309       if (imm_expr.X_op != O_constant)
8310         as_bad (_("Unsupported large constant"));
8311       imm_expr.X_add_number = -imm_expr.X_add_number;
8312       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8313       break;
8314
8315     case M_SUBU_I_2:
8316       if (imm_expr.X_op != O_constant)
8317         as_bad (_("Unsupported large constant"));
8318       imm_expr.X_add_number = -imm_expr.X_add_number;
8319       macro_build (&imm_expr, "addiu", "x,k", xreg);
8320       break;
8321
8322     case M_DSUBU_I_2:
8323       if (imm_expr.X_op != O_constant)
8324         as_bad (_("Unsupported large constant"));
8325       imm_expr.X_add_number = -imm_expr.X_add_number;
8326       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8327       break;
8328
8329     case M_BEQ:
8330       s = "cmp";
8331       s2 = "bteqz";
8332       goto do_branch;
8333     case M_BNE:
8334       s = "cmp";
8335       s2 = "btnez";
8336       goto do_branch;
8337     case M_BLT:
8338       s = "slt";
8339       s2 = "btnez";
8340       goto do_branch;
8341     case M_BLTU:
8342       s = "sltu";
8343       s2 = "btnez";
8344       goto do_branch;
8345     case M_BLE:
8346       s = "slt";
8347       s2 = "bteqz";
8348       goto do_reverse_branch;
8349     case M_BLEU:
8350       s = "sltu";
8351       s2 = "bteqz";
8352       goto do_reverse_branch;
8353     case M_BGE:
8354       s = "slt";
8355       s2 = "bteqz";
8356       goto do_branch;
8357     case M_BGEU:
8358       s = "sltu";
8359       s2 = "bteqz";
8360       goto do_branch;
8361     case M_BGT:
8362       s = "slt";
8363       s2 = "btnez";
8364       goto do_reverse_branch;
8365     case M_BGTU:
8366       s = "sltu";
8367       s2 = "btnez";
8368
8369     do_reverse_branch:
8370       tmp = xreg;
8371       xreg = yreg;
8372       yreg = tmp;
8373
8374     do_branch:
8375       macro_build (NULL, s, "x,y", xreg, yreg);
8376       macro_build (&offset_expr, s2, "p");
8377       break;
8378
8379     case M_BEQ_I:
8380       s = "cmpi";
8381       s2 = "bteqz";
8382       s3 = "x,U";
8383       goto do_branch_i;
8384     case M_BNE_I:
8385       s = "cmpi";
8386       s2 = "btnez";
8387       s3 = "x,U";
8388       goto do_branch_i;
8389     case M_BLT_I:
8390       s = "slti";
8391       s2 = "btnez";
8392       s3 = "x,8";
8393       goto do_branch_i;
8394     case M_BLTU_I:
8395       s = "sltiu";
8396       s2 = "btnez";
8397       s3 = "x,8";
8398       goto do_branch_i;
8399     case M_BLE_I:
8400       s = "slti";
8401       s2 = "btnez";
8402       s3 = "x,8";
8403       goto do_addone_branch_i;
8404     case M_BLEU_I:
8405       s = "sltiu";
8406       s2 = "btnez";
8407       s3 = "x,8";
8408       goto do_addone_branch_i;
8409     case M_BGE_I:
8410       s = "slti";
8411       s2 = "bteqz";
8412       s3 = "x,8";
8413       goto do_branch_i;
8414     case M_BGEU_I:
8415       s = "sltiu";
8416       s2 = "bteqz";
8417       s3 = "x,8";
8418       goto do_branch_i;
8419     case M_BGT_I:
8420       s = "slti";
8421       s2 = "bteqz";
8422       s3 = "x,8";
8423       goto do_addone_branch_i;
8424     case M_BGTU_I:
8425       s = "sltiu";
8426       s2 = "bteqz";
8427       s3 = "x,8";
8428
8429     do_addone_branch_i:
8430       if (imm_expr.X_op != O_constant)
8431         as_bad (_("Unsupported large constant"));
8432       ++imm_expr.X_add_number;
8433
8434     do_branch_i:
8435       macro_build (&imm_expr, s, s3, xreg);
8436       macro_build (&offset_expr, s2, "p");
8437       break;
8438
8439     case M_ABS:
8440       expr1.X_add_number = 0;
8441       macro_build (&expr1, "slti", "x,8", yreg);
8442       if (xreg != yreg)
8443         move_register (xreg, yreg);
8444       expr1.X_add_number = 2;
8445       macro_build (&expr1, "bteqz", "p");
8446       macro_build (NULL, "neg", "x,w", xreg, xreg);
8447     }
8448 }
8449
8450 /* For consistency checking, verify that all bits are specified either
8451    by the match/mask part of the instruction definition, or by the
8452    operand list.  */
8453 static int
8454 validate_mips_insn (const struct mips_opcode *opc)
8455 {
8456   const char *p = opc->args;
8457   char c;
8458   unsigned long used_bits = opc->mask;
8459
8460   if ((used_bits & opc->match) != opc->match)
8461     {
8462       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8463               opc->name, opc->args);
8464       return 0;
8465     }
8466 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8467   while (*p)
8468     switch (c = *p++)
8469       {
8470       case ',': break;
8471       case '(': break;
8472       case ')': break;
8473       case '+':
8474         switch (c = *p++)
8475           {
8476           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8477           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8478           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8479           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8480           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8481           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8482           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8483           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8484                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8485           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8486           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8487           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8488           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8489           case 'I': break;
8490           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8491           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8492                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8493           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8494           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8495           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8496           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8497           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8498           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8499           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8500           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
8501           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
8502           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8503           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8504           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
8505
8506           default:
8507             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8508                     c, opc->name, opc->args);
8509             return 0;
8510           }
8511         break;
8512       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8513       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8514       case 'A': break;
8515       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8516       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8517       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8518       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8519       case 'F': break;
8520       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8521       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8522       case 'I': break;
8523       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8524       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8525       case 'L': break;
8526       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8527       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8528       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8529       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8530                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8531       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8532       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8533       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8534       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8535       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8536       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8537       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8538       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8539       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8540       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8541       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8542       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8543       case 'f': break;
8544       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8545       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8546       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8547       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8548       case 'l': break;
8549       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8550       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8551       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8552       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8553       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8554       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8555       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8556       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8557       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8558       case 'x': break;
8559       case 'z': break;
8560       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8561       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8562                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8563       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8564       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8565       case '[': break;
8566       case ']': break;
8567       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8568       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8569       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8570       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8571       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8572       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8573       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8574       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8575       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8576       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8577       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8578       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8579       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8580       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8581       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8582       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8583       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8584       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8585       default:
8586         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8587                 c, opc->name, opc->args);
8588         return 0;
8589       }
8590 #undef USE_BITS
8591   if (used_bits != 0xffffffff)
8592     {
8593       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8594               ~used_bits & 0xffffffff, opc->name, opc->args);
8595       return 0;
8596     }
8597   return 1;
8598 }
8599
8600 /* UDI immediates.  */
8601 struct mips_immed {
8602   char          type;
8603   unsigned int  shift;
8604   unsigned long mask;
8605   const char *  desc;
8606 };
8607
8608 static const struct mips_immed mips_immed[] = {
8609   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8610   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8611   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8612   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8613   { 0,0,0,0 }
8614 };
8615
8616 /* Check whether an odd floating-point register is allowed.  */
8617 static int
8618 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8619 {
8620   const char *s = insn->name;
8621
8622   if (insn->pinfo == INSN_MACRO)
8623     /* Let a macro pass, we'll catch it later when it is expanded.  */
8624     return 1;
8625
8626   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8627     {
8628       /* Allow odd registers for single-precision ops.  */
8629       switch (insn->pinfo & (FP_S | FP_D))
8630         {
8631         case FP_S:
8632         case 0:
8633           return 1;     /* both single precision - ok */
8634         case FP_D:
8635           return 0;     /* both double precision - fail */
8636         default:
8637           break;
8638         }
8639
8640       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8641       s = strchr (insn->name, '.');
8642       if (argnum == 2)
8643         s = s != NULL ? strchr (s + 1, '.') : NULL;
8644       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8645     } 
8646
8647   /* Single-precision coprocessor loads and moves are OK too.  */
8648   if ((insn->pinfo & FP_S)
8649       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8650                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8651     return 1;
8652
8653   return 0;
8654 }
8655
8656 /* This routine assembles an instruction into its binary format.  As a
8657    side effect, it sets one of the global variables imm_reloc or
8658    offset_reloc to the type of relocation to do if one of the operands
8659    is an address expression.  */
8660
8661 static void
8662 mips_ip (char *str, struct mips_cl_insn *ip)
8663 {
8664   char *s;
8665   const char *args;
8666   char c = 0;
8667   struct mips_opcode *insn;
8668   char *argsStart;
8669   unsigned int regno;
8670   unsigned int lastregno;
8671   unsigned int lastpos = 0;
8672   unsigned int limlo, limhi;
8673   char *s_reset;
8674   char save_c = 0;
8675   offsetT min_range, max_range;
8676   int argnum;
8677   unsigned int rtype;
8678
8679   insn_error = NULL;
8680
8681   /* If the instruction contains a '.', we first try to match an instruction
8682      including the '.'.  Then we try again without the '.'.  */
8683   insn = NULL;
8684   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8685     continue;
8686
8687   /* If we stopped on whitespace, then replace the whitespace with null for
8688      the call to hash_find.  Save the character we replaced just in case we
8689      have to re-parse the instruction.  */
8690   if (ISSPACE (*s))
8691     {
8692       save_c = *s;
8693       *s++ = '\0';
8694     }
8695
8696   insn = (struct mips_opcode *) hash_find (op_hash, str);
8697
8698   /* If we didn't find the instruction in the opcode table, try again, but
8699      this time with just the instruction up to, but not including the
8700      first '.'.  */
8701   if (insn == NULL)
8702     {
8703       /* Restore the character we overwrite above (if any).  */
8704       if (save_c)
8705         *(--s) = save_c;
8706
8707       /* Scan up to the first '.' or whitespace.  */
8708       for (s = str;
8709            *s != '\0' && *s != '.' && !ISSPACE (*s);
8710            ++s)
8711         continue;
8712
8713       /* If we did not find a '.', then we can quit now.  */
8714       if (*s != '.')
8715         {
8716           insn_error = _("Unrecognized opcode");
8717           return;
8718         }
8719
8720       /* Lookup the instruction in the hash table.  */
8721       *s++ = '\0';
8722       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8723         {
8724           insn_error = _("Unrecognized opcode");
8725           return;
8726         }
8727     }
8728
8729   argsStart = s;
8730   for (;;)
8731     {
8732       bfd_boolean ok;
8733
8734       gas_assert (strcmp (insn->name, str) == 0);
8735
8736       ok = is_opcode_valid (insn);
8737       if (! ok)
8738         {
8739           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8740               && strcmp (insn->name, insn[1].name) == 0)
8741             {
8742               ++insn;
8743               continue;
8744             }
8745           else
8746             {
8747               if (!insn_error)
8748                 {
8749                   static char buf[100];
8750                   sprintf (buf,
8751                            _("opcode not supported on this processor: %s (%s)"),
8752                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8753                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8754                   insn_error = buf;
8755                 }
8756               if (save_c)
8757                 *(--s) = save_c;
8758               return;
8759             }
8760         }
8761
8762       create_insn (ip, insn);
8763       insn_error = NULL;
8764       argnum = 1;
8765       lastregno = 0xffffffff;
8766       for (args = insn->args;; ++args)
8767         {
8768           int is_mdmx;
8769
8770           s += strspn (s, " \t");
8771           is_mdmx = 0;
8772           switch (*args)
8773             {
8774             case '\0':          /* end of args */
8775               if (*s == '\0')
8776                 return;
8777               break;
8778
8779             case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
8780               my_getExpression (&imm_expr, s);
8781               check_absolute_expr (ip, &imm_expr);
8782               if ((unsigned long) imm_expr.X_add_number != 1
8783                   && (unsigned long) imm_expr.X_add_number != 3)
8784                 {
8785                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8786                           (unsigned long) imm_expr.X_add_number);
8787                 }
8788               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8789               imm_expr.X_op = O_absent;
8790               s = expr_end;
8791               continue;
8792
8793             case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
8794               my_getExpression (&imm_expr, s);
8795               check_absolute_expr (ip, &imm_expr);
8796               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8797                 {
8798                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8799                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8800                 }
8801               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8802               imm_expr.X_op = O_absent;
8803               s = expr_end;
8804               continue;
8805
8806             case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
8807               my_getExpression (&imm_expr, s);
8808               check_absolute_expr (ip, &imm_expr);
8809               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8810                 {
8811                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8812                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8813                 }
8814               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8815               imm_expr.X_op = O_absent;
8816               s = expr_end;
8817               continue;
8818
8819             case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
8820               my_getExpression (&imm_expr, s);
8821               check_absolute_expr (ip, &imm_expr);
8822               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8823                 {
8824                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8825                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8826                 }
8827               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8828               imm_expr.X_op = O_absent;
8829               s = expr_end;
8830               continue;
8831
8832             case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
8833               my_getExpression (&imm_expr, s);
8834               check_absolute_expr (ip, &imm_expr);
8835               if (imm_expr.X_add_number & ~OP_MASK_RS)
8836                 {
8837                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8838                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8839                 }
8840               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8841               imm_expr.X_op = O_absent;
8842               s = expr_end;
8843               continue;
8844
8845             case '7': /* Four DSP accumulators in bits 11,12.  */
8846               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8847                   s[3] >= '0' && s[3] <= '3')
8848                 {
8849                   regno = s[3] - '0';
8850                   s += 4;
8851                   INSERT_OPERAND (DSPACC, *ip, regno);
8852                   continue;
8853                 }
8854               else
8855                 as_bad (_("Invalid dsp acc register"));
8856               break;
8857
8858             case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
8859               my_getExpression (&imm_expr, s);
8860               check_absolute_expr (ip, &imm_expr);
8861               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8862                 {
8863                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8864                           OP_MASK_WRDSP,
8865                           (unsigned long) imm_expr.X_add_number);
8866                 }
8867               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8868               imm_expr.X_op = O_absent;
8869               s = expr_end;
8870               continue;
8871
8872             case '9': /* Four DSP accumulators in bits 21,22.  */
8873               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8874                   s[3] >= '0' && s[3] <= '3')
8875                 {
8876                   regno = s[3] - '0';
8877                   s += 4;
8878                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8879                   continue;
8880                 }
8881               else
8882                 as_bad (_("Invalid dsp acc register"));
8883               break;
8884
8885             case '0': /* DSP 6-bit signed immediate in bit 20.  */
8886               my_getExpression (&imm_expr, s);
8887               check_absolute_expr (ip, &imm_expr);
8888               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8889               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8890               if (imm_expr.X_add_number < min_range ||
8891                   imm_expr.X_add_number > max_range)
8892                 {
8893                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8894                           (long) min_range, (long) max_range,
8895                           (long) imm_expr.X_add_number);
8896                 }
8897               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8898               imm_expr.X_op = O_absent;
8899               s = expr_end;
8900               continue;
8901
8902             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
8903               my_getExpression (&imm_expr, s);
8904               check_absolute_expr (ip, &imm_expr);
8905               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8906                 {
8907                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8908                           OP_MASK_RDDSP,
8909                           (unsigned long) imm_expr.X_add_number);
8910                 }
8911               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8912               imm_expr.X_op = O_absent;
8913               s = expr_end;
8914               continue;
8915
8916             case ':': /* DSP 7-bit signed immediate in bit 19.  */
8917               my_getExpression (&imm_expr, s);
8918               check_absolute_expr (ip, &imm_expr);
8919               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8920               max_range = ((OP_MASK_DSPSFT_7 + 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_7, *ip, imm_expr.X_add_number);
8929               imm_expr.X_op = O_absent;
8930               s = expr_end;
8931               continue;
8932
8933             case '@': /* DSP 10-bit signed immediate in bit 16.  */
8934               my_getExpression (&imm_expr, s);
8935               check_absolute_expr (ip, &imm_expr);
8936               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8937               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8938               if (imm_expr.X_add_number < min_range ||
8939                   imm_expr.X_add_number > max_range)
8940                 {
8941                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8942                           (long) min_range, (long) max_range,
8943                           (long) imm_expr.X_add_number);
8944                 }
8945               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8946               imm_expr.X_op = O_absent;
8947               s = expr_end;
8948               continue;
8949
8950             case '!': /* MT usermode flag bit.  */
8951               my_getExpression (&imm_expr, s);
8952               check_absolute_expr (ip, &imm_expr);
8953               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8954                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8955                         (unsigned long) imm_expr.X_add_number);
8956               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8957               imm_expr.X_op = O_absent;
8958               s = expr_end;
8959               continue;
8960
8961             case '$': /* MT load high flag bit.  */
8962               my_getExpression (&imm_expr, s);
8963               check_absolute_expr (ip, &imm_expr);
8964               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8965                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8966                         (unsigned long) imm_expr.X_add_number);
8967               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8968               imm_expr.X_op = O_absent;
8969               s = expr_end;
8970               continue;
8971
8972             case '*': /* Four DSP accumulators in bits 18,19.  */
8973               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8974                   s[3] >= '0' && s[3] <= '3')
8975                 {
8976                   regno = s[3] - '0';
8977                   s += 4;
8978                   INSERT_OPERAND (MTACC_T, *ip, regno);
8979                   continue;
8980                 }
8981               else
8982                 as_bad (_("Invalid dsp/smartmips acc register"));
8983               break;
8984
8985             case '&': /* Four DSP accumulators in bits 13,14.  */
8986               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8987                   s[3] >= '0' && s[3] <= '3')
8988                 {
8989                   regno = s[3] - '0';
8990                   s += 4;
8991                   INSERT_OPERAND (MTACC_D, *ip, regno);
8992                   continue;
8993                 }
8994               else
8995                 as_bad (_("Invalid dsp/smartmips acc register"));
8996               break;
8997
8998             case ',':
8999               ++argnum;
9000               if (*s++ == *args)
9001                 continue;
9002               s--;
9003               switch (*++args)
9004                 {
9005                 case 'r':
9006                 case 'v':
9007                   INSERT_OPERAND (RS, *ip, lastregno);
9008                   continue;
9009
9010                 case 'w':
9011                   INSERT_OPERAND (RT, *ip, lastregno);
9012                   continue;
9013
9014                 case 'W':
9015                   INSERT_OPERAND (FT, *ip, lastregno);
9016                   continue;
9017
9018                 case 'V':
9019                   INSERT_OPERAND (FS, *ip, lastregno);
9020                   continue;
9021                 }
9022               break;
9023
9024             case '(':
9025               /* Handle optional base register.
9026                  Either the base register is omitted or
9027                  we must have a left paren.  */
9028               /* This is dependent on the next operand specifier
9029                  is a base register specification.  */
9030               gas_assert (args[1] == 'b');
9031               if (*s == '\0')
9032                 return;
9033
9034             case ')':           /* These must match exactly.  */
9035             case '[':
9036             case ']':
9037               if (*s++ == *args)
9038                 continue;
9039               break;
9040
9041             case '+':           /* Opcode extension character.  */
9042               switch (*++args)
9043                 {
9044                 case '1':       /* UDI immediates.  */
9045                 case '2':
9046                 case '3':
9047                 case '4':
9048                   {
9049                     const struct mips_immed *imm = mips_immed;
9050
9051                     while (imm->type && imm->type != *args)
9052                       ++imm;
9053                     if (! imm->type)
9054                       internalError ();
9055                     my_getExpression (&imm_expr, s);
9056                     check_absolute_expr (ip, &imm_expr);
9057                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9058                       {
9059                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9060                                  imm->desc ? imm->desc : ip->insn_mo->name,
9061                                  (unsigned long) imm_expr.X_add_number,
9062                                  (unsigned long) imm_expr.X_add_number);
9063                         imm_expr.X_add_number &= imm->mask;
9064                       }
9065                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9066                                         << imm->shift);
9067                     imm_expr.X_op = O_absent;
9068                     s = expr_end;
9069                   }
9070                   continue;
9071
9072                 case 'A':               /* ins/ext position, becomes LSB.  */
9073                   limlo = 0;
9074                   limhi = 31;
9075                   goto do_lsb;
9076                 case 'E':
9077                   limlo = 32;
9078                   limhi = 63;
9079                   goto do_lsb;
9080                 do_lsb:
9081                   my_getExpression (&imm_expr, s);
9082                   check_absolute_expr (ip, &imm_expr);
9083                   if ((unsigned long) imm_expr.X_add_number < limlo
9084                       || (unsigned long) imm_expr.X_add_number > limhi)
9085                     {
9086                       as_bad (_("Improper position (%lu)"),
9087                               (unsigned long) imm_expr.X_add_number);
9088                       imm_expr.X_add_number = limlo;
9089                     }
9090                   lastpos = imm_expr.X_add_number;
9091                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9092                   imm_expr.X_op = O_absent;
9093                   s = expr_end;
9094                   continue;
9095
9096                 case 'B':               /* ins size, becomes MSB.  */
9097                   limlo = 1;
9098                   limhi = 32;
9099                   goto do_msb;
9100                 case 'F':
9101                   limlo = 33;
9102                   limhi = 64;
9103                   goto do_msb;
9104                 do_msb:
9105                   my_getExpression (&imm_expr, s);
9106                   check_absolute_expr (ip, &imm_expr);
9107                   /* Check for negative input so that small negative numbers
9108                      will not succeed incorrectly.  The checks against
9109                      (pos+size) transitively check "size" itself,
9110                      assuming that "pos" is reasonable.  */
9111                   if ((long) imm_expr.X_add_number < 0
9112                       || ((unsigned long) imm_expr.X_add_number
9113                           + lastpos) < limlo
9114                       || ((unsigned long) imm_expr.X_add_number
9115                           + lastpos) > limhi)
9116                     {
9117                       as_bad (_("Improper insert size (%lu, position %lu)"),
9118                               (unsigned long) imm_expr.X_add_number,
9119                               (unsigned long) lastpos);
9120                       imm_expr.X_add_number = limlo - lastpos;
9121                     }
9122                   INSERT_OPERAND (INSMSB, *ip,
9123                                  lastpos + imm_expr.X_add_number - 1);
9124                   imm_expr.X_op = O_absent;
9125                   s = expr_end;
9126                   continue;
9127
9128                 case 'C':               /* ext size, becomes MSBD.  */
9129                   limlo = 1;
9130                   limhi = 32;
9131                   goto do_msbd;
9132                 case 'G':
9133                   limlo = 33;
9134                   limhi = 64;
9135                   goto do_msbd;
9136                 case 'H':
9137                   limlo = 33;
9138                   limhi = 64;
9139                   goto do_msbd;
9140                 do_msbd:
9141                   my_getExpression (&imm_expr, s);
9142                   check_absolute_expr (ip, &imm_expr);
9143                   /* Check for negative input so that small negative numbers
9144                      will not succeed incorrectly.  The checks against
9145                      (pos+size) transitively check "size" itself,
9146                      assuming that "pos" is reasonable.  */
9147                   if ((long) imm_expr.X_add_number < 0
9148                       || ((unsigned long) imm_expr.X_add_number
9149                           + lastpos) < limlo
9150                       || ((unsigned long) imm_expr.X_add_number
9151                           + lastpos) > limhi)
9152                     {
9153                       as_bad (_("Improper extract size (%lu, position %lu)"),
9154                               (unsigned long) imm_expr.X_add_number,
9155                               (unsigned long) lastpos);
9156                       imm_expr.X_add_number = limlo - lastpos;
9157                     }
9158                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9159                   imm_expr.X_op = O_absent;
9160                   s = expr_end;
9161                   continue;
9162
9163                 case 'D':
9164                   /* +D is for disassembly only; never match.  */
9165                   break;
9166
9167                 case 'I':
9168                   /* "+I" is like "I", except that imm2_expr is used.  */
9169                   my_getExpression (&imm2_expr, s);
9170                   if (imm2_expr.X_op != O_big
9171                       && imm2_expr.X_op != O_constant)
9172                   insn_error = _("absolute expression required");
9173                   if (HAVE_32BIT_GPRS)
9174                     normalize_constant_expr (&imm2_expr);
9175                   s = expr_end;
9176                   continue;
9177
9178                 case 'T': /* Coprocessor register.  */
9179                   /* +T is for disassembly only; never match.  */
9180                   break;
9181
9182                 case 't': /* Coprocessor register number.  */
9183                   if (s[0] == '$' && ISDIGIT (s[1]))
9184                     {
9185                       ++s;
9186                       regno = 0;
9187                       do
9188                         {
9189                           regno *= 10;
9190                           regno += *s - '0';
9191                           ++s;
9192                         }
9193                       while (ISDIGIT (*s));
9194                       if (regno > 31)
9195                         as_bad (_("Invalid register number (%d)"), regno);
9196                       else
9197                         {
9198                           INSERT_OPERAND (RT, *ip, regno);
9199                           continue;
9200                         }
9201                     }
9202                   else
9203                     as_bad (_("Invalid coprocessor 0 register number"));
9204                   break;
9205
9206                 case 'x':
9207                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9208                      is not in the valid range.  */
9209                   my_getExpression (&imm_expr, s);
9210                   check_absolute_expr (ip, &imm_expr);
9211                   if ((unsigned) imm_expr.X_add_number > 31)
9212                     {
9213                       as_bad (_("Improper bit index (%lu)"),
9214                               (unsigned long) imm_expr.X_add_number);
9215                       imm_expr.X_add_number = 0;
9216                     }
9217                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9218                   imm_expr.X_op = O_absent;
9219                   s = expr_end;
9220                   continue;
9221
9222                 case 'X':
9223                   /* bbit[01] bit index when bbit is used but we generate
9224                      bbit[01]32 because the index is over 32.  Move to the
9225                      next candidate if index is not in the valid range.  */
9226                   my_getExpression (&imm_expr, s);
9227                   check_absolute_expr (ip, &imm_expr);
9228                   if ((unsigned) imm_expr.X_add_number < 32
9229                       || (unsigned) imm_expr.X_add_number > 63)
9230                     break;
9231                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9232                   imm_expr.X_op = O_absent;
9233                   s = expr_end;
9234                   continue;
9235
9236                 case 'p':
9237                   /* cins, cins32, exts and exts32 position field.  Give error
9238                      if it's not in the valid range.  */
9239                   my_getExpression (&imm_expr, s);
9240                   check_absolute_expr (ip, &imm_expr);
9241                   if ((unsigned) imm_expr.X_add_number > 31)
9242                     {
9243                       as_bad (_("Improper position (%lu)"),
9244                               (unsigned long) imm_expr.X_add_number);
9245                       imm_expr.X_add_number = 0;
9246                     }
9247                   /* Make the pos explicit to simplify +S.  */
9248                   lastpos = imm_expr.X_add_number + 32;
9249                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9250                   imm_expr.X_op = O_absent;
9251                   s = expr_end;
9252                   continue;
9253
9254                 case 'P':
9255                   /* cins, cins32, exts and exts32 position field.  Move to
9256                      the next candidate if it's not in the valid range.  */
9257                   my_getExpression (&imm_expr, s);
9258                   check_absolute_expr (ip, &imm_expr);
9259                   if ((unsigned) imm_expr.X_add_number < 32
9260                       || (unsigned) imm_expr.X_add_number > 63)
9261                     break;
9262                   lastpos = imm_expr.X_add_number;
9263                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9264                   imm_expr.X_op = O_absent;
9265                   s = expr_end;
9266                   continue;
9267
9268                 case 's':
9269                   /* cins and exts length-minus-one field.  */
9270                   my_getExpression (&imm_expr, s);
9271                   check_absolute_expr (ip, &imm_expr);
9272                   if ((unsigned long) imm_expr.X_add_number > 31)
9273                     {
9274                       as_bad (_("Improper size (%lu)"),
9275                               (unsigned long) imm_expr.X_add_number);
9276                       imm_expr.X_add_number = 0;
9277                     }
9278                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9279                   imm_expr.X_op = O_absent;
9280                   s = expr_end;
9281                   continue;
9282
9283                 case 'S':
9284                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9285                      length-minus-one field.  */
9286                   my_getExpression (&imm_expr, s);
9287                   check_absolute_expr (ip, &imm_expr);
9288                   if ((long) imm_expr.X_add_number < 0
9289                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9290                     {
9291                       as_bad (_("Improper size (%lu)"),
9292                               (unsigned long) imm_expr.X_add_number);
9293                       imm_expr.X_add_number = 0;
9294                     }
9295                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9296                   imm_expr.X_op = O_absent;
9297                   s = expr_end;
9298                   continue;
9299
9300                 case 'Q':
9301                   /* seqi/snei immediate field.  */
9302                   my_getExpression (&imm_expr, s);
9303                   check_absolute_expr (ip, &imm_expr);
9304                   if ((long) imm_expr.X_add_number < -512
9305                       || (long) imm_expr.X_add_number >= 512)
9306                     {
9307                       as_bad (_("Improper immediate (%ld)"),
9308                                (long) imm_expr.X_add_number);
9309                       imm_expr.X_add_number = 0;
9310                     }
9311                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9312                   imm_expr.X_op = O_absent;
9313                   s = expr_end;
9314                   continue;
9315
9316                 case 'a': /* 8-bit signed offset in bit 6 */
9317                   my_getExpression (&imm_expr, s);
9318                   check_absolute_expr (ip, &imm_expr);
9319                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9320                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9321                   if (imm_expr.X_add_number < min_range
9322                       || imm_expr.X_add_number > max_range)
9323                     {
9324                       as_bad (_("immediate not in range %ld..%ld (%ld)"),
9325                               (long) min_range, (long) max_range,
9326                               (long) imm_expr.X_add_number);
9327                     }
9328                   INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9329                   imm_expr.X_op = O_absent;
9330                   s = expr_end;
9331                   continue;
9332
9333                 case 'b': /* 8-bit signed offset in bit 3 */
9334                   my_getExpression (&imm_expr, s);
9335                   check_absolute_expr (ip, &imm_expr);
9336                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9337                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9338                   if (imm_expr.X_add_number < min_range
9339                       || imm_expr.X_add_number > max_range)
9340                     {
9341                       as_bad (_("immediate not in range %ld..%ld (%ld)"),
9342                               (long) min_range, (long) max_range,
9343                               (long) imm_expr.X_add_number);
9344                     }
9345                   INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9346                   imm_expr.X_op = O_absent;
9347                   s = expr_end;
9348                   continue;
9349
9350                 case 'c': /* 9-bit signed offset in bit 6 */
9351                   my_getExpression (&imm_expr, s);
9352                   check_absolute_expr (ip, &imm_expr);
9353                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9354                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
9355                   if (imm_expr.X_add_number < min_range
9356                       || imm_expr.X_add_number > max_range)
9357                     {
9358                       as_bad (_("immediate not in range %ld..%ld (%ld)"),
9359                               (long) min_range, (long) max_range,
9360                               (long) imm_expr.X_add_number);
9361                     }
9362                   INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number);
9363                   imm_expr.X_op = O_absent;
9364                   s = expr_end;
9365                   continue;
9366
9367                 case 'z':
9368                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9369                     break;
9370                   if (regno == AT && mips_opts.at)
9371                     {
9372                       if (mips_opts.at == ATREG)
9373                         as_warn (_("used $at without \".set noat\""));
9374                       else
9375                         as_warn (_("used $%u with \".set at=$%u\""),
9376                                  regno, mips_opts.at);
9377                     }
9378                   INSERT_OPERAND (RZ, *ip, regno);
9379                   continue;
9380
9381                 case 'Z':
9382                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
9383                     break;
9384                   INSERT_OPERAND (FZ, *ip, regno);
9385                   continue;
9386
9387                 default:
9388                   as_bad (_("Internal error: bad mips opcode "
9389                             "(unknown extension operand type `+%c'): %s %s"),
9390                           *args, insn->name, insn->args);
9391                   /* Further processing is fruitless.  */
9392                   return;
9393                 }
9394               break;
9395
9396             case '<':           /* must be at least one digit */
9397               /*
9398                * According to the manual, if the shift amount is greater
9399                * than 31 or less than 0, then the shift amount should be
9400                * mod 32.  In reality the mips assembler issues an error.
9401                * We issue a warning and mask out all but the low 5 bits.
9402                */
9403               my_getExpression (&imm_expr, s);
9404               check_absolute_expr (ip, &imm_expr);
9405               if ((unsigned long) imm_expr.X_add_number > 31)
9406                 as_warn (_("Improper shift amount (%lu)"),
9407                          (unsigned long) imm_expr.X_add_number);
9408               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9409               imm_expr.X_op = O_absent;
9410               s = expr_end;
9411               continue;
9412
9413             case '>':           /* shift amount minus 32 */
9414               my_getExpression (&imm_expr, s);
9415               check_absolute_expr (ip, &imm_expr);
9416               if ((unsigned long) imm_expr.X_add_number < 32
9417                   || (unsigned long) imm_expr.X_add_number > 63)
9418                 break;
9419               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9420               imm_expr.X_op = O_absent;
9421               s = expr_end;
9422               continue;
9423
9424             case 'k':           /* CACHE code.  */
9425             case 'h':           /* PREFX code.  */
9426             case '1':           /* SYNC type.  */
9427               my_getExpression (&imm_expr, s);
9428               check_absolute_expr (ip, &imm_expr);
9429               if ((unsigned long) imm_expr.X_add_number > 31)
9430                 as_warn (_("Invalid value for `%s' (%lu)"),
9431                          ip->insn_mo->name,
9432                          (unsigned long) imm_expr.X_add_number);
9433               if (*args == 'k')
9434                 {
9435                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9436                     switch (imm_expr.X_add_number)
9437                       {
9438                       case 5:
9439                       case 25:
9440                       case 26:
9441                       case 27:
9442                       case 28:
9443                       case 29:
9444                       case 30:
9445                       case 31:  /* These are ok.  */
9446                         break;
9447
9448                       default:  /* The rest must be changed to 28.  */
9449                         imm_expr.X_add_number = 28;
9450                         break;
9451                       }
9452                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9453                 }
9454               else if (*args == 'h')
9455                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9456               else
9457                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9458               imm_expr.X_op = O_absent;
9459               s = expr_end;
9460               continue;
9461
9462             case 'c':           /* BREAK code.  */
9463               my_getExpression (&imm_expr, s);
9464               check_absolute_expr (ip, &imm_expr);
9465               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9466                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9467                          ip->insn_mo->name,
9468                          (unsigned long) imm_expr.X_add_number);
9469               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9470               imm_expr.X_op = O_absent;
9471               s = expr_end;
9472               continue;
9473
9474             case 'q':           /* Lower BREAK code.  */
9475               my_getExpression (&imm_expr, s);
9476               check_absolute_expr (ip, &imm_expr);
9477               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9478                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9479                          ip->insn_mo->name,
9480                          (unsigned long) imm_expr.X_add_number);
9481               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9482               imm_expr.X_op = O_absent;
9483               s = expr_end;
9484               continue;
9485
9486             case 'B':           /* 20-bit SYSCALL/BREAK code.  */
9487               my_getExpression (&imm_expr, s);
9488               check_absolute_expr (ip, &imm_expr);
9489               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9490                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9491                          ip->insn_mo->name,
9492                          (unsigned long) imm_expr.X_add_number);
9493               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9494               imm_expr.X_op = O_absent;
9495               s = expr_end;
9496               continue;
9497
9498             case 'C':           /* Coprocessor code.  */
9499               my_getExpression (&imm_expr, s);
9500               check_absolute_expr (ip, &imm_expr);
9501               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9502                 {
9503                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9504                            (unsigned long) imm_expr.X_add_number);
9505                   imm_expr.X_add_number &= OP_MASK_COPZ;
9506                 }
9507               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9508               imm_expr.X_op = O_absent;
9509               s = expr_end;
9510               continue;
9511
9512             case 'J':           /* 19-bit WAIT code.  */
9513               my_getExpression (&imm_expr, s);
9514               check_absolute_expr (ip, &imm_expr);
9515               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9516                 {
9517                   as_warn (_("Illegal 19-bit code (%lu)"),
9518                            (unsigned long) imm_expr.X_add_number);
9519                   imm_expr.X_add_number &= OP_MASK_CODE19;
9520                 }
9521               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9522               imm_expr.X_op = O_absent;
9523               s = expr_end;
9524               continue;
9525
9526             case 'P':           /* Performance register.  */
9527               my_getExpression (&imm_expr, s);
9528               check_absolute_expr (ip, &imm_expr);
9529               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9530                 as_warn (_("Invalid performance register (%lu)"),
9531                          (unsigned long) imm_expr.X_add_number);
9532               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9533               imm_expr.X_op = O_absent;
9534               s = expr_end;
9535               continue;
9536
9537             case 'G':           /* Coprocessor destination register.  */
9538               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9539                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9540               else
9541                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9542               INSERT_OPERAND (RD, *ip, regno);
9543               if (ok) 
9544                 {
9545                   lastregno = regno;
9546                   continue;
9547                 }
9548               else
9549                 break;
9550
9551             case 'b':           /* Base register.  */
9552             case 'd':           /* Destination register.  */
9553             case 's':           /* Source register.  */
9554             case 't':           /* Target register.  */
9555             case 'r':           /* Both target and source.  */
9556             case 'v':           /* Both dest and source.  */
9557             case 'w':           /* Both dest and target.  */
9558             case 'E':           /* Coprocessor target register.  */
9559             case 'K':           /* RDHWR destination register.  */
9560             case 'x':           /* Ignore register name.  */
9561             case 'z':           /* Must be zero register.  */
9562             case 'U':           /* Destination register (CLO/CLZ).  */
9563             case 'g':           /* Coprocessor destination register.  */
9564               s_reset = s;
9565               if (*args == 'E' || *args == 'K')
9566                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9567               else
9568                 {
9569                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9570                   if (regno == AT && mips_opts.at)
9571                     {
9572                       if (mips_opts.at == ATREG)
9573                         as_warn (_("Used $at without \".set noat\""));
9574                       else
9575                         as_warn (_("Used $%u with \".set at=$%u\""),
9576                                  regno, mips_opts.at);
9577                     }
9578                 }
9579               if (ok)
9580                 {
9581                   c = *args;
9582                   if (*s == ' ')
9583                     ++s;
9584                   if (args[1] != *s)
9585                     {
9586                       if (c == 'r' || c == 'v' || c == 'w')
9587                         {
9588                           regno = lastregno;
9589                           s = s_reset;
9590                           ++args;
9591                         }
9592                     }
9593                   /* 'z' only matches $0.  */
9594                   if (c == 'z' && regno != 0)
9595                     break;
9596
9597                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9598                     {
9599                       if (regno == lastregno)
9600                         {
9601                           insn_error
9602                             = _("Source and destination must be different");
9603                           continue;
9604                         }
9605                       if (regno == 31 && lastregno == 0xffffffff)
9606                         {
9607                           insn_error
9608                             = _("A destination register must be supplied");
9609                           continue;
9610                         }
9611                     }
9612                   /* Now that we have assembled one operand, we use the args
9613                      string to figure out where it goes in the instruction.  */
9614                   switch (c)
9615                     {
9616                     case 'r':
9617                     case 's':
9618                     case 'v':
9619                     case 'b':
9620                       INSERT_OPERAND (RS, *ip, regno);
9621                       break;
9622                     case 'd':
9623                     case 'K':
9624                     case 'g':
9625                       INSERT_OPERAND (RD, *ip, regno);
9626                       break;
9627                     case 'U':
9628                       INSERT_OPERAND (RD, *ip, regno);
9629                       INSERT_OPERAND (RT, *ip, regno);
9630                       break;
9631                     case 'w':
9632                     case 't':
9633                     case 'E':
9634                       INSERT_OPERAND (RT, *ip, regno);
9635                       break;
9636                     case 'x':
9637                       /* This case exists because on the r3000 trunc
9638                          expands into a macro which requires a gp
9639                          register.  On the r6000 or r4000 it is
9640                          assembled into a single instruction which
9641                          ignores the register.  Thus the insn version
9642                          is MIPS_ISA2 and uses 'x', and the macro
9643                          version is MIPS_ISA1 and uses 't'.  */
9644                       break;
9645                     case 'z':
9646                       /* This case is for the div instruction, which
9647                          acts differently if the destination argument
9648                          is $0.  This only matches $0, and is checked
9649                          outside the switch.  */
9650                       break;
9651                     }
9652                   lastregno = regno;
9653                   continue;
9654                 }
9655               switch (*args++)
9656                 {
9657                 case 'r':
9658                 case 'v':
9659                   INSERT_OPERAND (RS, *ip, lastregno);
9660                   continue;
9661                 case 'w':
9662                   INSERT_OPERAND (RT, *ip, lastregno);
9663                   continue;
9664                 }
9665               break;
9666
9667             case 'O':           /* MDMX alignment immediate constant.  */
9668               my_getExpression (&imm_expr, s);
9669               check_absolute_expr (ip, &imm_expr);
9670               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9671                 as_warn (_("Improper align amount (%ld), using low bits"),
9672                          (long) imm_expr.X_add_number);
9673               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9674               imm_expr.X_op = O_absent;
9675               s = expr_end;
9676               continue;
9677
9678             case 'Q':           /* MDMX vector, element sel, or const.  */
9679               if (s[0] != '$')
9680                 {
9681                   /* MDMX Immediate.  */
9682                   my_getExpression (&imm_expr, s);
9683                   check_absolute_expr (ip, &imm_expr);
9684                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9685                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9686                              (long) imm_expr.X_add_number);
9687                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9688                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9689                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9690                   else
9691                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9692                   imm_expr.X_op = O_absent;
9693                   s = expr_end;
9694                   continue;
9695                 }
9696               /* Not MDMX Immediate.  Fall through.  */
9697             case 'X':           /* MDMX destination register.  */
9698             case 'Y':           /* MDMX source register.  */
9699             case 'Z':           /* MDMX target register.  */
9700               is_mdmx = 1;
9701             case 'D':           /* Floating point destination register.  */
9702             case 'S':           /* Floating point source register.  */
9703             case 'T':           /* Floating point target register.  */
9704             case 'R':           /* Floating point source register.  */
9705             case 'V':
9706             case 'W':
9707               rtype = RTYPE_FPU;
9708               if (is_mdmx
9709                   || (mips_opts.ase_mdmx
9710                       && (ip->insn_mo->pinfo & FP_D)
9711                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9712                                                 | INSN_COPROC_MEMORY_DELAY
9713                                                 | INSN_LOAD_COPROC_DELAY
9714                                                 | INSN_LOAD_MEMORY_DELAY
9715                                                 | INSN_STORE_MEMORY))))
9716                 rtype |= RTYPE_VEC;
9717               s_reset = s;
9718               if (reg_lookup (&s, rtype, &regno))
9719                 {
9720                   if ((regno & 1) != 0
9721                       && HAVE_32BIT_FPRS
9722                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9723                     as_warn (_("Float register should be even, was %d"),
9724                              regno);
9725
9726                   c = *args;
9727                   if (*s == ' ')
9728                     ++s;
9729                   if (args[1] != *s)
9730                     {
9731                       if (c == 'V' || c == 'W')
9732                         {
9733                           regno = lastregno;
9734                           s = s_reset;
9735                           ++args;
9736                         }
9737                     }
9738                   switch (c)
9739                     {
9740                     case 'D':
9741                     case 'X':
9742                       INSERT_OPERAND (FD, *ip, regno);
9743                       break;
9744                     case 'V':
9745                     case 'S':
9746                     case 'Y':
9747                       INSERT_OPERAND (FS, *ip, regno);
9748                       break;
9749                     case 'Q':
9750                       /* This is like 'Z', but also needs to fix the MDMX
9751                          vector/scalar select bits.  Note that the
9752                          scalar immediate case is handled above.  */
9753                       if (*s == '[')
9754                         {
9755                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9756                           int max_el = (is_qh ? 3 : 7);
9757                           s++;
9758                           my_getExpression(&imm_expr, s);
9759                           check_absolute_expr (ip, &imm_expr);
9760                           s = expr_end;
9761                           if (imm_expr.X_add_number > max_el)
9762                             as_bad (_("Bad element selector %ld"),
9763                                     (long) imm_expr.X_add_number);
9764                           imm_expr.X_add_number &= max_el;
9765                           ip->insn_opcode |= (imm_expr.X_add_number
9766                                               << (OP_SH_VSEL +
9767                                                   (is_qh ? 2 : 1)));
9768                           imm_expr.X_op = O_absent;
9769                           if (*s != ']')
9770                             as_warn (_("Expecting ']' found '%s'"), s);
9771                           else
9772                             s++;
9773                         }
9774                       else
9775                         {
9776                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9777                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9778                                                 << OP_SH_VSEL);
9779                           else
9780                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9781                                                 OP_SH_VSEL);
9782                         }
9783                       /* Fall through.  */
9784                     case 'W':
9785                     case 'T':
9786                     case 'Z':
9787                       INSERT_OPERAND (FT, *ip, regno);
9788                       break;
9789                     case 'R':
9790                       INSERT_OPERAND (FR, *ip, regno);
9791                       break;
9792                     }
9793                   lastregno = regno;
9794                   continue;
9795                 }
9796
9797               switch (*args++)
9798                 {
9799                 case 'V':
9800                   INSERT_OPERAND (FS, *ip, lastregno);
9801                   continue;
9802                 case 'W':
9803                   INSERT_OPERAND (FT, *ip, lastregno);
9804                   continue;
9805                 }
9806               break;
9807
9808             case 'I':
9809               my_getExpression (&imm_expr, s);
9810               if (imm_expr.X_op != O_big
9811                   && imm_expr.X_op != O_constant)
9812                 insn_error = _("absolute expression required");
9813               if (HAVE_32BIT_GPRS)
9814                 normalize_constant_expr (&imm_expr);
9815               s = expr_end;
9816               continue;
9817
9818             case 'A':
9819               my_getExpression (&offset_expr, s);
9820               normalize_address_expr (&offset_expr);
9821               *imm_reloc = BFD_RELOC_32;
9822               s = expr_end;
9823               continue;
9824
9825             case 'F':
9826             case 'L':
9827             case 'f':
9828             case 'l':
9829               {
9830                 int f64;
9831                 int using_gprs;
9832                 char *save_in;
9833                 char *err;
9834                 unsigned char temp[8];
9835                 int len;
9836                 unsigned int length;
9837                 segT seg;
9838                 subsegT subseg;
9839                 char *p;
9840
9841                 /* These only appear as the last operand in an
9842                    instruction, and every instruction that accepts
9843                    them in any variant accepts them in all variants.
9844                    This means we don't have to worry about backing out
9845                    any changes if the instruction does not match.
9846
9847                    The difference between them is the size of the
9848                    floating point constant and where it goes.  For 'F'
9849                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9850                    is 32 bits.  Where the constant is placed is based
9851                    on how the MIPS assembler does things:
9852                     F -- .rdata
9853                     L -- .lit8
9854                     f -- immediate value
9855                     l -- .lit4
9856
9857                     The .lit4 and .lit8 sections are only used if
9858                     permitted by the -G argument.
9859
9860                     The code below needs to know whether the target register
9861                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9862                     'F' are used with GPR-based instructions and 'l' and
9863                     'L' are used with FPR-based instructions.  */
9864
9865                 f64 = *args == 'F' || *args == 'L';
9866                 using_gprs = *args == 'F' || *args == 'f';
9867
9868                 save_in = input_line_pointer;
9869                 input_line_pointer = s;
9870                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9871                 length = len;
9872                 s = input_line_pointer;
9873                 input_line_pointer = save_in;
9874                 if (err != NULL && *err != '\0')
9875                   {
9876                     as_bad (_("Bad floating point constant: %s"), err);
9877                     memset (temp, '\0', sizeof temp);
9878                     length = f64 ? 8 : 4;
9879                   }
9880
9881                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9882
9883                 if (*args == 'f'
9884                     || (*args == 'l'
9885                         && (g_switch_value < 4
9886                             || (temp[0] == 0 && temp[1] == 0)
9887                             || (temp[2] == 0 && temp[3] == 0))))
9888                   {
9889                     imm_expr.X_op = O_constant;
9890                     if (!target_big_endian)
9891                       imm_expr.X_add_number = bfd_getl32 (temp);
9892                     else
9893                       imm_expr.X_add_number = bfd_getb32 (temp);
9894                   }
9895                 else if (length > 4
9896                          && !mips_disable_float_construction
9897                          /* Constants can only be constructed in GPRs and
9898                             copied to FPRs if the GPRs are at least as wide
9899                             as the FPRs.  Force the constant into memory if
9900                             we are using 64-bit FPRs but the GPRs are only
9901                             32 bits wide.  */
9902                          && (using_gprs
9903                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9904                          && ((temp[0] == 0 && temp[1] == 0)
9905                              || (temp[2] == 0 && temp[3] == 0))
9906                          && ((temp[4] == 0 && temp[5] == 0)
9907                              || (temp[6] == 0 && temp[7] == 0)))
9908                   {
9909                     /* The value is simple enough to load with a couple of
9910                        instructions.  If using 32-bit registers, set
9911                        imm_expr to the high order 32 bits and offset_expr to
9912                        the low order 32 bits.  Otherwise, set imm_expr to
9913                        the entire 64 bit constant.  */
9914                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9915                       {
9916                         imm_expr.X_op = O_constant;
9917                         offset_expr.X_op = O_constant;
9918                         if (!target_big_endian)
9919                           {
9920                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9921                             offset_expr.X_add_number = bfd_getl32 (temp);
9922                           }
9923                         else
9924                           {
9925                             imm_expr.X_add_number = bfd_getb32 (temp);
9926                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9927                           }
9928                         if (offset_expr.X_add_number == 0)
9929                           offset_expr.X_op = O_absent;
9930                       }
9931                     else if (sizeof (imm_expr.X_add_number) > 4)
9932                       {
9933                         imm_expr.X_op = O_constant;
9934                         if (!target_big_endian)
9935                           imm_expr.X_add_number = bfd_getl64 (temp);
9936                         else
9937                           imm_expr.X_add_number = bfd_getb64 (temp);
9938                       }
9939                     else
9940                       {
9941                         imm_expr.X_op = O_big;
9942                         imm_expr.X_add_number = 4;
9943                         if (!target_big_endian)
9944                           {
9945                             generic_bignum[0] = bfd_getl16 (temp);
9946                             generic_bignum[1] = bfd_getl16 (temp + 2);
9947                             generic_bignum[2] = bfd_getl16 (temp + 4);
9948                             generic_bignum[3] = bfd_getl16 (temp + 6);
9949                           }
9950                         else
9951                           {
9952                             generic_bignum[0] = bfd_getb16 (temp + 6);
9953                             generic_bignum[1] = bfd_getb16 (temp + 4);
9954                             generic_bignum[2] = bfd_getb16 (temp + 2);
9955                             generic_bignum[3] = bfd_getb16 (temp);
9956                           }
9957                       }
9958                   }
9959                 else
9960                   {
9961                     const char *newname;
9962                     segT new_seg;
9963
9964                     /* Switch to the right section.  */
9965                     seg = now_seg;
9966                     subseg = now_subseg;
9967                     switch (*args)
9968                       {
9969                       default: /* unused default case avoids warnings.  */
9970                       case 'L':
9971                         newname = RDATA_SECTION_NAME;
9972                         if (g_switch_value >= 8)
9973                           newname = ".lit8";
9974                         break;
9975                       case 'F':
9976                         newname = RDATA_SECTION_NAME;
9977                         break;
9978                       case 'l':
9979                         gas_assert (g_switch_value >= 4);
9980                         newname = ".lit4";
9981                         break;
9982                       }
9983                     new_seg = subseg_new (newname, (subsegT) 0);
9984                     if (IS_ELF)
9985                       bfd_set_section_flags (stdoutput, new_seg,
9986                                              (SEC_ALLOC
9987                                               | SEC_LOAD
9988                                               | SEC_READONLY
9989                                               | SEC_DATA));
9990                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9991                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9992                       record_alignment (new_seg, 4);
9993                     else
9994                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9995                     if (seg == now_seg)
9996                       as_bad (_("Can't use floating point insn in this section"));
9997
9998                     /* Set the argument to the current address in the
9999                        section.  */
10000                     offset_expr.X_op = O_symbol;
10001                     offset_expr.X_add_symbol = symbol_temp_new_now ();
10002                     offset_expr.X_add_number = 0;
10003
10004                     /* Put the floating point number into the section.  */
10005                     p = frag_more ((int) length);
10006                     memcpy (p, temp, length);
10007
10008                     /* Switch back to the original section.  */
10009                     subseg_set (seg, subseg);
10010                   }
10011               }
10012               continue;
10013
10014             case 'i':           /* 16-bit unsigned immediate.  */
10015             case 'j':           /* 16-bit signed immediate.  */
10016               *imm_reloc = BFD_RELOC_LO16;
10017               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10018                 {
10019                   int more;
10020                   offsetT minval, maxval;
10021
10022                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10023                           && strcmp (insn->name, insn[1].name) == 0);
10024
10025                   /* If the expression was written as an unsigned number,
10026                      only treat it as signed if there are no more
10027                      alternatives.  */
10028                   if (more
10029                       && *args == 'j'
10030                       && sizeof (imm_expr.X_add_number) <= 4
10031                       && imm_expr.X_op == O_constant
10032                       && imm_expr.X_add_number < 0
10033                       && imm_expr.X_unsigned
10034                       && HAVE_64BIT_GPRS)
10035                     break;
10036
10037                   /* For compatibility with older assemblers, we accept
10038                      0x8000-0xffff as signed 16-bit numbers when only
10039                      signed numbers are allowed.  */
10040                   if (*args == 'i')
10041                     minval = 0, maxval = 0xffff;
10042                   else if (more)
10043                     minval = -0x8000, maxval = 0x7fff;
10044                   else
10045                     minval = -0x8000, maxval = 0xffff;
10046
10047                   if (imm_expr.X_op != O_constant
10048                       || imm_expr.X_add_number < minval
10049                       || imm_expr.X_add_number > maxval)
10050                     {
10051                       if (more)
10052                         break;
10053                       if (imm_expr.X_op == O_constant
10054                           || imm_expr.X_op == O_big)
10055                         as_bad (_("Expression out of range"));
10056                     }
10057                 }
10058               s = expr_end;
10059               continue;
10060
10061             case 'o':           /* 16-bit offset.  */
10062               offset_reloc[0] = BFD_RELOC_LO16;
10063               offset_reloc[1] = BFD_RELOC_UNUSED;
10064               offset_reloc[2] = BFD_RELOC_UNUSED;
10065
10066               /* Check whether there is only a single bracketed expression
10067                  left.  If so, it must be the base register and the
10068                  constant must be zero.  */
10069               offset_reloc[0] = BFD_RELOC_LO16;
10070               offset_reloc[1] = BFD_RELOC_UNUSED;
10071               offset_reloc[2] = BFD_RELOC_UNUSED;
10072               if (*s == '(' && strchr (s + 1, '(') == 0)
10073                 {
10074                   offset_expr.X_op = O_constant;
10075                   offset_expr.X_add_number = 0;
10076                   continue;
10077                 }
10078
10079               /* If this value won't fit into a 16 bit offset, then go
10080                  find a macro that will generate the 32 bit offset
10081                  code pattern.  */
10082               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10083                   && (offset_expr.X_op != O_constant
10084                       || offset_expr.X_add_number >= 0x8000
10085                       || offset_expr.X_add_number < -0x8000))
10086                 break;
10087
10088               s = expr_end;
10089               continue;
10090
10091             case 'p':           /* PC-relative offset.  */
10092               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10093               my_getExpression (&offset_expr, s);
10094               s = expr_end;
10095               continue;
10096
10097             case 'u':           /* Upper 16 bits.  */
10098               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10099                   && imm_expr.X_op == O_constant
10100                   && (imm_expr.X_add_number < 0
10101                       || imm_expr.X_add_number >= 0x10000))
10102                 as_bad (_("lui expression (%lu) not in range 0..65535"),
10103                         (unsigned long) imm_expr.X_add_number);
10104               s = expr_end;
10105               continue;
10106
10107             case 'a':           /* 26-bit address.  */
10108               my_getExpression (&offset_expr, s);
10109               s = expr_end;
10110               *offset_reloc = BFD_RELOC_MIPS_JMP;
10111               continue;
10112
10113             case 'N':           /* 3-bit branch condition code.  */
10114             case 'M':           /* 3-bit compare condition code.  */
10115               rtype = RTYPE_CCC;
10116               if (ip->insn_mo->pinfo & (FP_D | FP_S))
10117                 rtype |= RTYPE_FCC;
10118               if (!reg_lookup (&s, rtype, &regno))
10119                 break;
10120               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10121                    || strcmp (str + strlen (str) - 5, "any2f") == 0
10122                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
10123                   && (regno & 1) != 0)
10124                 as_warn (_("Condition code register should be even for %s, "
10125                            "was %d"),
10126                          str, regno);
10127               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10128                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
10129                   && (regno & 3) != 0)
10130                 as_warn (_("Condition code register should be 0 or 4 for %s, "
10131                            "was %d"),
10132                          str, regno);
10133               if (*args == 'N')
10134                 INSERT_OPERAND (BCC, *ip, regno);
10135               else
10136                 INSERT_OPERAND (CCC, *ip, regno);
10137               continue;
10138
10139             case 'H':
10140               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10141                 s += 2;
10142               if (ISDIGIT (*s))
10143                 {
10144                   c = 0;
10145                   do
10146                     {
10147                       c *= 10;
10148                       c += *s - '0';
10149                       ++s;
10150                     }
10151                   while (ISDIGIT (*s));
10152                 }
10153               else
10154                 c = 8; /* Invalid sel value.  */
10155
10156               if (c > 7)
10157                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10158               ip->insn_opcode |= c;
10159               continue;
10160
10161             case 'e':
10162               /* Must be at least one digit.  */
10163               my_getExpression (&imm_expr, s);
10164               check_absolute_expr (ip, &imm_expr);
10165
10166               if ((unsigned long) imm_expr.X_add_number
10167                   > (unsigned long) OP_MASK_VECBYTE)
10168                 {
10169                   as_bad (_("bad byte vector index (%ld)"),
10170                            (long) imm_expr.X_add_number);
10171                   imm_expr.X_add_number = 0;
10172                 }
10173
10174               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10175               imm_expr.X_op = O_absent;
10176               s = expr_end;
10177               continue;
10178
10179             case '%':
10180               my_getExpression (&imm_expr, s);
10181               check_absolute_expr (ip, &imm_expr);
10182
10183               if ((unsigned long) imm_expr.X_add_number
10184                   > (unsigned long) OP_MASK_VECALIGN)
10185                 {
10186                   as_bad (_("bad byte vector index (%ld)"),
10187                            (long) imm_expr.X_add_number);
10188                   imm_expr.X_add_number = 0;
10189                 }
10190
10191               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10192               imm_expr.X_op = O_absent;
10193               s = expr_end;
10194               continue;
10195
10196             default:
10197               as_bad (_("Bad char = '%c'\n"), *args);
10198               internalError ();
10199             }
10200           break;
10201         }
10202       /* Args don't match.  */
10203       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10204           !strcmp (insn->name, insn[1].name))
10205         {
10206           ++insn;
10207           s = argsStart;
10208           insn_error = _("Illegal operands");
10209           continue;
10210         }
10211       if (save_c)
10212         *(--argsStart) = save_c;
10213       insn_error = _("Illegal operands");
10214       return;
10215     }
10216 }
10217
10218 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10219
10220 /* This routine assembles an instruction into its binary format when
10221    assembling for the mips16.  As a side effect, it sets one of the
10222    global variables imm_reloc or offset_reloc to the type of
10223    relocation to do if one of the operands is an address expression.
10224    It also sets mips16_small and mips16_ext if the user explicitly
10225    requested a small or extended instruction.  */
10226
10227 static void
10228 mips16_ip (char *str, struct mips_cl_insn *ip)
10229 {
10230   char *s;
10231   const char *args;
10232   struct mips_opcode *insn;
10233   char *argsstart;
10234   unsigned int regno;
10235   unsigned int lastregno = 0;
10236   char *s_reset;
10237   size_t i;
10238
10239   insn_error = NULL;
10240
10241   mips16_small = FALSE;
10242   mips16_ext = FALSE;
10243
10244   for (s = str; ISLOWER (*s); ++s)
10245     ;
10246   switch (*s)
10247     {
10248     case '\0':
10249       break;
10250
10251     case ' ':
10252       *s++ = '\0';
10253       break;
10254
10255     case '.':
10256       if (s[1] == 't' && s[2] == ' ')
10257         {
10258           *s = '\0';
10259           mips16_small = TRUE;
10260           s += 3;
10261           break;
10262         }
10263       else if (s[1] == 'e' && s[2] == ' ')
10264         {
10265           *s = '\0';
10266           mips16_ext = TRUE;
10267           s += 3;
10268           break;
10269         }
10270       /* Fall through.  */
10271     default:
10272       insn_error = _("unknown opcode");
10273       return;
10274     }
10275
10276   if (mips_opts.noautoextend && ! mips16_ext)
10277     mips16_small = TRUE;
10278
10279   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10280     {
10281       insn_error = _("unrecognized opcode");
10282       return;
10283     }
10284
10285   argsstart = s;
10286   for (;;)
10287     {
10288       bfd_boolean ok;
10289
10290       gas_assert (strcmp (insn->name, str) == 0);
10291
10292       ok = is_opcode_valid_16 (insn);
10293       if (! ok)
10294         {
10295           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10296               && strcmp (insn->name, insn[1].name) == 0)
10297             {
10298               ++insn;
10299               continue;
10300             }
10301           else
10302             {
10303               if (!insn_error)
10304                 {
10305                   static char buf[100];
10306                   sprintf (buf,
10307                            _("opcode not supported on this processor: %s (%s)"),
10308                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10309                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10310                   insn_error = buf;
10311                 }
10312               return;
10313             }
10314         }
10315
10316       create_insn (ip, insn);
10317       imm_expr.X_op = O_absent;
10318       imm_reloc[0] = BFD_RELOC_UNUSED;
10319       imm_reloc[1] = BFD_RELOC_UNUSED;
10320       imm_reloc[2] = BFD_RELOC_UNUSED;
10321       imm2_expr.X_op = O_absent;
10322       offset_expr.X_op = O_absent;
10323       offset_reloc[0] = BFD_RELOC_UNUSED;
10324       offset_reloc[1] = BFD_RELOC_UNUSED;
10325       offset_reloc[2] = BFD_RELOC_UNUSED;
10326       for (args = insn->args; 1; ++args)
10327         {
10328           int c;
10329
10330           if (*s == ' ')
10331             ++s;
10332
10333           /* In this switch statement we call break if we did not find
10334              a match, continue if we did find a match, or return if we
10335              are done.  */
10336
10337           c = *args;
10338           switch (c)
10339             {
10340             case '\0':
10341               if (*s == '\0')
10342                 {
10343                   /* Stuff the immediate value in now, if we can.  */
10344                   if (imm_expr.X_op == O_constant
10345                       && *imm_reloc > BFD_RELOC_UNUSED
10346                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10347                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10348                       && insn->pinfo != INSN_MACRO)
10349                     {
10350                       valueT tmp;
10351
10352                       switch (*offset_reloc)
10353                         {
10354                           case BFD_RELOC_MIPS16_HI16_S:
10355                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10356                             break;
10357
10358                           case BFD_RELOC_MIPS16_HI16:
10359                             tmp = imm_expr.X_add_number >> 16;
10360                             break;
10361
10362                           case BFD_RELOC_MIPS16_LO16:
10363                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10364                                   - 0x8000;
10365                             break;
10366
10367                           case BFD_RELOC_UNUSED:
10368                             tmp = imm_expr.X_add_number;
10369                             break;
10370
10371                           default:
10372                             internalError ();
10373                         }
10374                       *offset_reloc = BFD_RELOC_UNUSED;
10375
10376                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10377                                     tmp, TRUE, mips16_small,
10378                                     mips16_ext, &ip->insn_opcode,
10379                                     &ip->use_extend, &ip->extend);
10380                       imm_expr.X_op = O_absent;
10381                       *imm_reloc = BFD_RELOC_UNUSED;
10382                     }
10383
10384                   return;
10385                 }
10386               break;
10387
10388             case ',':
10389               if (*s++ == c)
10390                 continue;
10391               s--;
10392               switch (*++args)
10393                 {
10394                 case 'v':
10395                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10396                   continue;
10397                 case 'w':
10398                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10399                   continue;
10400                 }
10401               break;
10402
10403             case '(':
10404             case ')':
10405               if (*s++ == c)
10406                 continue;
10407               break;
10408
10409             case 'v':
10410             case 'w':
10411               if (s[0] != '$')
10412                 {
10413                   if (c == 'v')
10414                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10415                   else
10416                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10417                   ++args;
10418                   continue;
10419                 }
10420               /* Fall through.  */
10421             case 'x':
10422             case 'y':
10423             case 'z':
10424             case 'Z':
10425             case '0':
10426             case 'S':
10427             case 'R':
10428             case 'X':
10429             case 'Y':
10430               s_reset = s;
10431               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10432                 {
10433                   if (c == 'v' || c == 'w')
10434                     {
10435                       if (c == 'v')
10436                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10437                       else
10438                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10439                       ++args;
10440                       continue;
10441                     }
10442                   break;
10443                 }
10444
10445               if (*s == ' ')
10446                 ++s;
10447               if (args[1] != *s)
10448                 {
10449                   if (c == 'v' || c == 'w')
10450                     {
10451                       regno = mips16_to_32_reg_map[lastregno];
10452                       s = s_reset;
10453                       ++args;
10454                     }
10455                 }
10456
10457               switch (c)
10458                 {
10459                 case 'x':
10460                 case 'y':
10461                 case 'z':
10462                 case 'v':
10463                 case 'w':
10464                 case 'Z':
10465                   regno = mips32_to_16_reg_map[regno];
10466                   break;
10467
10468                 case '0':
10469                   if (regno != 0)
10470                     regno = ILLEGAL_REG;
10471                   break;
10472
10473                 case 'S':
10474                   if (regno != SP)
10475                     regno = ILLEGAL_REG;
10476                   break;
10477
10478                 case 'R':
10479                   if (regno != RA)
10480                     regno = ILLEGAL_REG;
10481                   break;
10482
10483                 case 'X':
10484                 case 'Y':
10485                   if (regno == AT && mips_opts.at)
10486                     {
10487                       if (mips_opts.at == ATREG)
10488                         as_warn (_("used $at without \".set noat\""));
10489                       else
10490                         as_warn (_("used $%u with \".set at=$%u\""),
10491                                  regno, mips_opts.at);
10492                     }
10493                   break;
10494
10495                 default:
10496                   internalError ();
10497                 }
10498
10499               if (regno == ILLEGAL_REG)
10500                 break;
10501
10502               switch (c)
10503                 {
10504                 case 'x':
10505                 case 'v':
10506                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10507                   break;
10508                 case 'y':
10509                 case 'w':
10510                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10511                   break;
10512                 case 'z':
10513                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10514                   break;
10515                 case 'Z':
10516                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10517                 case '0':
10518                 case 'S':
10519                 case 'R':
10520                   break;
10521                 case 'X':
10522                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10523                   break;
10524                 case 'Y':
10525                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10526                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10527                   break;
10528                 default:
10529                   internalError ();
10530                 }
10531
10532               lastregno = regno;
10533               continue;
10534
10535             case 'P':
10536               if (strncmp (s, "$pc", 3) == 0)
10537                 {
10538                   s += 3;
10539                   continue;
10540                 }
10541               break;
10542
10543             case '5':
10544             case 'H':
10545             case 'W':
10546             case 'D':
10547             case 'j':
10548             case 'V':
10549             case 'C':
10550             case 'U':
10551             case 'k':
10552             case 'K':
10553               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10554               if (i > 0)
10555                 {
10556                   if (imm_expr.X_op != O_constant)
10557                     {
10558                       mips16_ext = TRUE;
10559                       ip->use_extend = TRUE;
10560                       ip->extend = 0;
10561                     }
10562                   else
10563                     {
10564                       /* We need to relax this instruction.  */
10565                       *offset_reloc = *imm_reloc;
10566                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10567                     }
10568                   s = expr_end;
10569                   continue;
10570                 }
10571               *imm_reloc = BFD_RELOC_UNUSED;
10572               /* Fall through.  */
10573             case '<':
10574             case '>':
10575             case '[':
10576             case ']':
10577             case '4':
10578             case '8':
10579               my_getExpression (&imm_expr, s);
10580               if (imm_expr.X_op == O_register)
10581                 {
10582                   /* What we thought was an expression turned out to
10583                      be a register.  */
10584
10585                   if (s[0] == '(' && args[1] == '(')
10586                     {
10587                       /* It looks like the expression was omitted
10588                          before a register indirection, which means
10589                          that the expression is implicitly zero.  We
10590                          still set up imm_expr, so that we handle
10591                          explicit extensions correctly.  */
10592                       imm_expr.X_op = O_constant;
10593                       imm_expr.X_add_number = 0;
10594                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10595                       continue;
10596                     }
10597
10598                   break;
10599                 }
10600
10601               /* We need to relax this instruction.  */
10602               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10603               s = expr_end;
10604               continue;
10605
10606             case 'p':
10607             case 'q':
10608             case 'A':
10609             case 'B':
10610             case 'E':
10611               /* We use offset_reloc rather than imm_reloc for the PC
10612                  relative operands.  This lets macros with both
10613                  immediate and address operands work correctly.  */
10614               my_getExpression (&offset_expr, s);
10615
10616               if (offset_expr.X_op == O_register)
10617                 break;
10618
10619               /* We need to relax this instruction.  */
10620               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10621               s = expr_end;
10622               continue;
10623
10624             case '6':           /* break code */
10625               my_getExpression (&imm_expr, s);
10626               check_absolute_expr (ip, &imm_expr);
10627               if ((unsigned long) imm_expr.X_add_number > 63)
10628                 as_warn (_("Invalid value for `%s' (%lu)"),
10629                          ip->insn_mo->name,
10630                          (unsigned long) imm_expr.X_add_number);
10631               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10632               imm_expr.X_op = O_absent;
10633               s = expr_end;
10634               continue;
10635
10636             case 'a':           /* 26 bit address */
10637               my_getExpression (&offset_expr, s);
10638               s = expr_end;
10639               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10640               ip->insn_opcode <<= 16;
10641               continue;
10642
10643             case 'l':           /* register list for entry macro */
10644             case 'L':           /* register list for exit macro */
10645               {
10646                 int mask;
10647
10648                 if (c == 'l')
10649                   mask = 0;
10650                 else
10651                   mask = 7 << 3;
10652                 while (*s != '\0')
10653                   {
10654                     unsigned int freg, reg1, reg2;
10655
10656                     while (*s == ' ' || *s == ',')
10657                       ++s;
10658                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10659                       freg = 0;
10660                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10661                       freg = 1;
10662                     else
10663                       {
10664                         as_bad (_("can't parse register list"));
10665                         break;
10666                       }
10667                     if (*s == ' ')
10668                       ++s;
10669                     if (*s != '-')
10670                       reg2 = reg1;
10671                     else
10672                       {
10673                         ++s;
10674                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10675                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10676                           {
10677                             as_bad (_("invalid register list"));
10678                             break;
10679                           }
10680                       }
10681                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10682                       {
10683                         mask &= ~ (7 << 3);
10684                         mask |= 5 << 3;
10685                       }
10686                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10687                       {
10688                         mask &= ~ (7 << 3);
10689                         mask |= 6 << 3;
10690                       }
10691                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10692                       mask |= (reg2 - 3) << 3;
10693                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10694                       mask |= (reg2 - 15) << 1;
10695                     else if (reg1 == RA && reg2 == RA)
10696                       mask |= 1;
10697                     else
10698                       {
10699                         as_bad (_("invalid register list"));
10700                         break;
10701                       }
10702                   }
10703                 /* The mask is filled in in the opcode table for the
10704                    benefit of the disassembler.  We remove it before
10705                    applying the actual mask.  */
10706                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10707                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10708               }
10709             continue;
10710
10711             case 'm':           /* Register list for save insn.  */
10712             case 'M':           /* Register list for restore insn.  */
10713               {
10714                 int opcode = 0;
10715                 int framesz = 0, seen_framesz = 0;
10716                 int nargs = 0, statics = 0, sregs = 0;
10717
10718                 while (*s != '\0')
10719                   {
10720                     unsigned int reg1, reg2;
10721
10722                     SKIP_SPACE_TABS (s);
10723                     while (*s == ',')
10724                       ++s;
10725                     SKIP_SPACE_TABS (s);
10726
10727                     my_getExpression (&imm_expr, s);
10728                     if (imm_expr.X_op == O_constant)
10729                       {
10730                         /* Handle the frame size.  */
10731                         if (seen_framesz)
10732                           {
10733                             as_bad (_("more than one frame size in list"));
10734                             break;
10735                           }
10736                         seen_framesz = 1;
10737                         framesz = imm_expr.X_add_number;
10738                         imm_expr.X_op = O_absent;
10739                         s = expr_end;
10740                         continue;
10741                       }
10742
10743                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10744                       {
10745                         as_bad (_("can't parse register list"));
10746                         break;
10747                       }
10748
10749                     while (*s == ' ')
10750                       ++s;
10751
10752                     if (*s != '-')
10753                       reg2 = reg1;
10754                     else
10755                       {
10756                         ++s;
10757                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10758                             || reg2 < reg1)
10759                           {
10760                             as_bad (_("can't parse register list"));
10761                             break;
10762                           }
10763                       }
10764
10765                     while (reg1 <= reg2)
10766                       {
10767                         if (reg1 >= 4 && reg1 <= 7)
10768                           {
10769                             if (!seen_framesz)
10770                                 /* args $a0-$a3 */
10771                                 nargs |= 1 << (reg1 - 4);
10772                             else
10773                                 /* statics $a0-$a3 */
10774                                 statics |= 1 << (reg1 - 4);
10775                           }
10776                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10777                           {
10778                             /* $s0-$s8 */
10779                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10780                           }
10781                         else if (reg1 == 31)
10782                           {
10783                             /* Add $ra to insn.  */
10784                             opcode |= 0x40;
10785                           }
10786                         else
10787                           {
10788                             as_bad (_("unexpected register in list"));
10789                             break;
10790                           }
10791                         if (++reg1 == 24)
10792                           reg1 = 30;
10793                       }
10794                   }
10795
10796                 /* Encode args/statics combination.  */
10797                 if (nargs & statics)
10798                   as_bad (_("arg/static registers overlap"));
10799                 else if (nargs == 0xf)
10800                   /* All $a0-$a3 are args.  */
10801                   opcode |= MIPS16_ALL_ARGS << 16;
10802                 else if (statics == 0xf)
10803                   /* All $a0-$a3 are statics.  */
10804                   opcode |= MIPS16_ALL_STATICS << 16;
10805                 else 
10806                   {
10807                     int narg = 0, nstat = 0;
10808
10809                     /* Count arg registers.  */
10810                     while (nargs & 0x1)
10811                       {
10812                         nargs >>= 1;
10813                         narg++;
10814                       }
10815                     if (nargs != 0)
10816                       as_bad (_("invalid arg register list"));
10817
10818                     /* Count static registers.  */
10819                     while (statics & 0x8)
10820                       {
10821                         statics = (statics << 1) & 0xf;
10822                         nstat++;
10823                       }
10824                     if (statics != 0) 
10825                       as_bad (_("invalid static register list"));
10826
10827                     /* Encode args/statics.  */
10828                     opcode |= ((narg << 2) | nstat) << 16;
10829                   }
10830
10831                 /* Encode $s0/$s1.  */
10832                 if (sregs & (1 << 0))           /* $s0 */
10833                   opcode |= 0x20;
10834                 if (sregs & (1 << 1))           /* $s1 */
10835                   opcode |= 0x10;
10836                 sregs >>= 2;
10837
10838                 if (sregs != 0)
10839                   {
10840                     /* Count regs $s2-$s8.  */
10841                     int nsreg = 0;
10842                     while (sregs & 1)
10843                       {
10844                         sregs >>= 1;
10845                         nsreg++;
10846                       }
10847                     if (sregs != 0)
10848                       as_bad (_("invalid static register list"));
10849                     /* Encode $s2-$s8. */
10850                     opcode |= nsreg << 24;
10851                   }
10852
10853                 /* Encode frame size.  */
10854                 if (!seen_framesz)
10855                   as_bad (_("missing frame size"));
10856                 else if ((framesz & 7) != 0 || framesz < 0
10857                          || framesz > 0xff * 8)
10858                   as_bad (_("invalid frame size"));
10859                 else if (framesz != 128 || (opcode >> 16) != 0)
10860                   {
10861                     framesz /= 8;
10862                     opcode |= (((framesz & 0xf0) << 16)
10863                              | (framesz & 0x0f));
10864                   }
10865
10866                 /* Finally build the instruction.  */
10867                 if ((opcode >> 16) != 0 || framesz == 0)
10868                   {
10869                     ip->use_extend = TRUE;
10870                     ip->extend = opcode >> 16;
10871                   }
10872                 ip->insn_opcode |= opcode & 0x7f;
10873               }
10874             continue;
10875
10876             case 'e':           /* extend code */
10877               my_getExpression (&imm_expr, s);
10878               check_absolute_expr (ip, &imm_expr);
10879               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10880                 {
10881                   as_warn (_("Invalid value for `%s' (%lu)"),
10882                            ip->insn_mo->name,
10883                            (unsigned long) imm_expr.X_add_number);
10884                   imm_expr.X_add_number &= 0x7ff;
10885                 }
10886               ip->insn_opcode |= imm_expr.X_add_number;
10887               imm_expr.X_op = O_absent;
10888               s = expr_end;
10889               continue;
10890
10891             default:
10892               internalError ();
10893             }
10894           break;
10895         }
10896
10897       /* Args don't match.  */
10898       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10899           strcmp (insn->name, insn[1].name) == 0)
10900         {
10901           ++insn;
10902           s = argsstart;
10903           continue;
10904         }
10905
10906       insn_error = _("illegal operands");
10907
10908       return;
10909     }
10910 }
10911
10912 /* This structure holds information we know about a mips16 immediate
10913    argument type.  */
10914
10915 struct mips16_immed_operand
10916 {
10917   /* The type code used in the argument string in the opcode table.  */
10918   int type;
10919   /* The number of bits in the short form of the opcode.  */
10920   int nbits;
10921   /* The number of bits in the extended form of the opcode.  */
10922   int extbits;
10923   /* The amount by which the short form is shifted when it is used;
10924      for example, the sw instruction has a shift count of 2.  */
10925   int shift;
10926   /* The amount by which the short form is shifted when it is stored
10927      into the instruction code.  */
10928   int op_shift;
10929   /* Non-zero if the short form is unsigned.  */
10930   int unsp;
10931   /* Non-zero if the extended form is unsigned.  */
10932   int extu;
10933   /* Non-zero if the value is PC relative.  */
10934   int pcrel;
10935 };
10936
10937 /* The mips16 immediate operand types.  */
10938
10939 static const struct mips16_immed_operand mips16_immed_operands[] =
10940 {
10941   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10942   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10943   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10944   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10945   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10946   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10947   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10948   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10949   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10950   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10951   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10952   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10953   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10954   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10955   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10956   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10957   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10958   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10959   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10960   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10961   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10962 };
10963
10964 #define MIPS16_NUM_IMMED \
10965   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10966
10967 /* Handle a mips16 instruction with an immediate value.  This or's the
10968    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10969    whether an extended value is needed; if one is needed, it sets
10970    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10971    If SMALL is true, an unextended opcode was explicitly requested.
10972    If EXT is true, an extended opcode was explicitly requested.  If
10973    WARN is true, warn if EXT does not match reality.  */
10974
10975 static void
10976 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10977               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10978               unsigned long *insn, bfd_boolean *use_extend,
10979               unsigned short *extend)
10980 {
10981   const struct mips16_immed_operand *op;
10982   int mintiny, maxtiny;
10983   bfd_boolean needext;
10984
10985   op = mips16_immed_operands;
10986   while (op->type != type)
10987     {
10988       ++op;
10989       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10990     }
10991
10992   if (op->unsp)
10993     {
10994       if (type == '<' || type == '>' || type == '[' || type == ']')
10995         {
10996           mintiny = 1;
10997           maxtiny = 1 << op->nbits;
10998         }
10999       else
11000         {
11001           mintiny = 0;
11002           maxtiny = (1 << op->nbits) - 1;
11003         }
11004     }
11005   else
11006     {
11007       mintiny = - (1 << (op->nbits - 1));
11008       maxtiny = (1 << (op->nbits - 1)) - 1;
11009     }
11010
11011   /* Branch offsets have an implicit 0 in the lowest bit.  */
11012   if (type == 'p' || type == 'q')
11013     val /= 2;
11014
11015   if ((val & ((1 << op->shift) - 1)) != 0
11016       || val < (mintiny << op->shift)
11017       || val > (maxtiny << op->shift))
11018     needext = TRUE;
11019   else
11020     needext = FALSE;
11021
11022   if (warn && ext && ! needext)
11023     as_warn_where (file, line,
11024                    _("extended operand requested but not required"));
11025   if (small && needext)
11026     as_bad_where (file, line, _("invalid unextended operand value"));
11027
11028   if (small || (! ext && ! needext))
11029     {
11030       int insnval;
11031
11032       *use_extend = FALSE;
11033       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11034       insnval <<= op->op_shift;
11035       *insn |= insnval;
11036     }
11037   else
11038     {
11039       long minext, maxext;
11040       int extval;
11041
11042       if (op->extu)
11043         {
11044           minext = 0;
11045           maxext = (1 << op->extbits) - 1;
11046         }
11047       else
11048         {
11049           minext = - (1 << (op->extbits - 1));
11050           maxext = (1 << (op->extbits - 1)) - 1;
11051         }
11052       if (val < minext || val > maxext)
11053         as_bad_where (file, line,
11054                       _("operand value out of range for instruction"));
11055
11056       *use_extend = TRUE;
11057       if (op->extbits == 16)
11058         {
11059           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11060           val &= 0x1f;
11061         }
11062       else if (op->extbits == 15)
11063         {
11064           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11065           val &= 0xf;
11066         }
11067       else
11068         {
11069           extval = ((val & 0x1f) << 6) | (val & 0x20);
11070           val = 0;
11071         }
11072
11073       *extend = (unsigned short) extval;
11074       *insn |= val;
11075     }
11076 }
11077 \f
11078 struct percent_op_match
11079 {
11080   const char *str;
11081   bfd_reloc_code_real_type reloc;
11082 };
11083
11084 static const struct percent_op_match mips_percent_op[] =
11085 {
11086   {"%lo", BFD_RELOC_LO16},
11087 #ifdef OBJ_ELF
11088   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11089   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11090   {"%call16", BFD_RELOC_MIPS_CALL16},
11091   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11092   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11093   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11094   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11095   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11096   {"%got", BFD_RELOC_MIPS_GOT16},
11097   {"%gp_rel", BFD_RELOC_GPREL16},
11098   {"%half", BFD_RELOC_16},
11099   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11100   {"%higher", BFD_RELOC_MIPS_HIGHER},
11101   {"%neg", BFD_RELOC_MIPS_SUB},
11102   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11103   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11104   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11105   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11106   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11107   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11108   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11109 #endif
11110   {"%hi", BFD_RELOC_HI16_S}
11111 };
11112
11113 static const struct percent_op_match mips16_percent_op[] =
11114 {
11115   {"%lo", BFD_RELOC_MIPS16_LO16},
11116   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11117   {"%got", BFD_RELOC_MIPS16_GOT16},
11118   {"%call16", BFD_RELOC_MIPS16_CALL16},
11119   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11120 };
11121
11122
11123 /* Return true if *STR points to a relocation operator.  When returning true,
11124    move *STR over the operator and store its relocation code in *RELOC.
11125    Leave both *STR and *RELOC alone when returning false.  */
11126
11127 static bfd_boolean
11128 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11129 {
11130   const struct percent_op_match *percent_op;
11131   size_t limit, i;
11132
11133   if (mips_opts.mips16)
11134     {
11135       percent_op = mips16_percent_op;
11136       limit = ARRAY_SIZE (mips16_percent_op);
11137     }
11138   else
11139     {
11140       percent_op = mips_percent_op;
11141       limit = ARRAY_SIZE (mips_percent_op);
11142     }
11143
11144   for (i = 0; i < limit; i++)
11145     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11146       {
11147         int len = strlen (percent_op[i].str);
11148
11149         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11150           continue;
11151
11152         *str += strlen (percent_op[i].str);
11153         *reloc = percent_op[i].reloc;
11154
11155         /* Check whether the output BFD supports this relocation.
11156            If not, issue an error and fall back on something safe.  */
11157         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11158           {
11159             as_bad (_("relocation %s isn't supported by the current ABI"),
11160                     percent_op[i].str);
11161             *reloc = BFD_RELOC_UNUSED;
11162           }
11163         return TRUE;
11164       }
11165   return FALSE;
11166 }
11167
11168
11169 /* Parse string STR as a 16-bit relocatable operand.  Store the
11170    expression in *EP and the relocations in the array starting
11171    at RELOC.  Return the number of relocation operators used.
11172
11173    On exit, EXPR_END points to the first character after the expression.  */
11174
11175 static size_t
11176 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11177                        char *str)
11178 {
11179   bfd_reloc_code_real_type reversed_reloc[3];
11180   size_t reloc_index, i;
11181   int crux_depth, str_depth;
11182   char *crux;
11183
11184   /* Search for the start of the main expression, recoding relocations
11185      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11186      of the main expression and with CRUX_DEPTH containing the number
11187      of open brackets at that point.  */
11188   reloc_index = -1;
11189   str_depth = 0;
11190   do
11191     {
11192       reloc_index++;
11193       crux = str;
11194       crux_depth = str_depth;
11195
11196       /* Skip over whitespace and brackets, keeping count of the number
11197          of brackets.  */
11198       while (*str == ' ' || *str == '\t' || *str == '(')
11199         if (*str++ == '(')
11200           str_depth++;
11201     }
11202   while (*str == '%'
11203          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11204          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11205
11206   my_getExpression (ep, crux);
11207   str = expr_end;
11208
11209   /* Match every open bracket.  */
11210   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11211     if (*str++ == ')')
11212       crux_depth--;
11213
11214   if (crux_depth > 0)
11215     as_bad (_("unclosed '('"));
11216
11217   expr_end = str;
11218
11219   if (reloc_index != 0)
11220     {
11221       prev_reloc_op_frag = frag_now;
11222       for (i = 0; i < reloc_index; i++)
11223         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11224     }
11225
11226   return reloc_index;
11227 }
11228
11229 static void
11230 my_getExpression (expressionS *ep, char *str)
11231 {
11232   char *save_in;
11233
11234   save_in = input_line_pointer;
11235   input_line_pointer = str;
11236   expression (ep);
11237   expr_end = input_line_pointer;
11238   input_line_pointer = save_in;
11239 }
11240
11241 char *
11242 md_atof (int type, char *litP, int *sizeP)
11243 {
11244   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11245 }
11246
11247 void
11248 md_number_to_chars (char *buf, valueT val, int n)
11249 {
11250   if (target_big_endian)
11251     number_to_chars_bigendian (buf, val, n);
11252   else
11253     number_to_chars_littleendian (buf, val, n);
11254 }
11255 \f
11256 #ifdef OBJ_ELF
11257 static int support_64bit_objects(void)
11258 {
11259   const char **list, **l;
11260   int yes;
11261
11262   list = bfd_target_list ();
11263   for (l = list; *l != NULL; l++)
11264     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11265         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
11266       break;
11267   yes = (*l != NULL);
11268   free (list);
11269   return yes;
11270 }
11271 #endif /* OBJ_ELF */
11272
11273 const char *md_shortopts = "O::g::G:";
11274
11275 enum options
11276   {
11277     OPTION_MARCH = OPTION_MD_BASE,
11278     OPTION_MTUNE,
11279     OPTION_MIPS1,
11280     OPTION_MIPS2,
11281     OPTION_MIPS3,
11282     OPTION_MIPS4,
11283     OPTION_MIPS5,
11284     OPTION_MIPS32,
11285     OPTION_MIPS64,
11286     OPTION_MIPS32R2,
11287     OPTION_MIPS64R2,
11288     OPTION_MIPS16,
11289     OPTION_NO_MIPS16,
11290     OPTION_MIPS3D,
11291     OPTION_NO_MIPS3D,
11292     OPTION_MDMX,
11293     OPTION_NO_MDMX,
11294     OPTION_DSP,
11295     OPTION_NO_DSP,
11296     OPTION_MT,
11297     OPTION_NO_MT,
11298     OPTION_SMARTMIPS,
11299     OPTION_NO_SMARTMIPS,
11300     OPTION_DSPR2,
11301     OPTION_NO_DSPR2,
11302     OPTION_COMPAT_ARCH_BASE,
11303     OPTION_M4650,
11304     OPTION_NO_M4650,
11305     OPTION_M4010,
11306     OPTION_NO_M4010,
11307     OPTION_M4100,
11308     OPTION_NO_M4100,
11309     OPTION_M3900,
11310     OPTION_NO_M3900,
11311     OPTION_M7000_HILO_FIX,
11312     OPTION_MNO_7000_HILO_FIX, 
11313     OPTION_FIX_24K,
11314     OPTION_NO_FIX_24K,
11315     OPTION_FIX_LOONGSON2F_JUMP,
11316     OPTION_NO_FIX_LOONGSON2F_JUMP,
11317     OPTION_FIX_LOONGSON2F_NOP,
11318     OPTION_NO_FIX_LOONGSON2F_NOP,
11319     OPTION_FIX_VR4120,
11320     OPTION_NO_FIX_VR4120,
11321     OPTION_FIX_VR4130,
11322     OPTION_NO_FIX_VR4130,
11323     OPTION_FIX_CN63XXP1,
11324     OPTION_NO_FIX_CN63XXP1,
11325     OPTION_TRAP,
11326     OPTION_BREAK,
11327     OPTION_EB,
11328     OPTION_EL,
11329     OPTION_FP32,
11330     OPTION_GP32,
11331     OPTION_CONSTRUCT_FLOATS,
11332     OPTION_NO_CONSTRUCT_FLOATS,
11333     OPTION_FP64,
11334     OPTION_GP64,
11335     OPTION_RELAX_BRANCH,
11336     OPTION_NO_RELAX_BRANCH,
11337     OPTION_MSHARED,
11338     OPTION_MNO_SHARED,
11339     OPTION_MSYM32,
11340     OPTION_MNO_SYM32,
11341     OPTION_SOFT_FLOAT,
11342     OPTION_HARD_FLOAT,
11343     OPTION_SINGLE_FLOAT,
11344     OPTION_DOUBLE_FLOAT,
11345     OPTION_32,
11346 #ifdef OBJ_ELF
11347     OPTION_CALL_SHARED,
11348     OPTION_CALL_NONPIC,
11349     OPTION_NON_SHARED,
11350     OPTION_XGOT,
11351     OPTION_MABI,
11352     OPTION_N32,
11353     OPTION_64,
11354     OPTION_MDEBUG,
11355     OPTION_NO_MDEBUG,
11356     OPTION_PDR,
11357     OPTION_NO_PDR,
11358     OPTION_MVXWORKS_PIC,
11359 #endif /* OBJ_ELF */
11360     OPTION_END_OF_ENUM    
11361   };
11362   
11363 struct option md_longopts[] =
11364 {
11365   /* Options which specify architecture.  */
11366   {"march", required_argument, NULL, OPTION_MARCH},
11367   {"mtune", required_argument, NULL, OPTION_MTUNE},
11368   {"mips0", no_argument, NULL, OPTION_MIPS1},
11369   {"mips1", no_argument, NULL, OPTION_MIPS1},
11370   {"mips2", no_argument, NULL, OPTION_MIPS2},
11371   {"mips3", no_argument, NULL, OPTION_MIPS3},
11372   {"mips4", no_argument, NULL, OPTION_MIPS4},
11373   {"mips5", no_argument, NULL, OPTION_MIPS5},
11374   {"mips32", no_argument, NULL, OPTION_MIPS32},
11375   {"mips64", no_argument, NULL, OPTION_MIPS64},
11376   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11377   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11378
11379   /* Options which specify Application Specific Extensions (ASEs).  */
11380   {"mips16", no_argument, NULL, OPTION_MIPS16},
11381   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11382   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11383   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11384   {"mdmx", no_argument, NULL, OPTION_MDMX},
11385   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11386   {"mdsp", no_argument, NULL, OPTION_DSP},
11387   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11388   {"mmt", no_argument, NULL, OPTION_MT},
11389   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11390   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11391   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11392   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11393   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11394
11395   /* Old-style architecture options.  Don't add more of these.  */
11396   {"m4650", no_argument, NULL, OPTION_M4650},
11397   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11398   {"m4010", no_argument, NULL, OPTION_M4010},
11399   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11400   {"m4100", no_argument, NULL, OPTION_M4100},
11401   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11402   {"m3900", no_argument, NULL, OPTION_M3900},
11403   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11404
11405   /* Options which enable bug fixes.  */
11406   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11407   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11408   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11409   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11410   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11411   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11412   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11413   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11414   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11415   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11416   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11417   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11418   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11419   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11420   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11421
11422   /* Miscellaneous options.  */
11423   {"trap", no_argument, NULL, OPTION_TRAP},
11424   {"no-break", no_argument, NULL, OPTION_TRAP},
11425   {"break", no_argument, NULL, OPTION_BREAK},
11426   {"no-trap", no_argument, NULL, OPTION_BREAK},
11427   {"EB", no_argument, NULL, OPTION_EB},
11428   {"EL", no_argument, NULL, OPTION_EL},
11429   {"mfp32", no_argument, NULL, OPTION_FP32},
11430   {"mgp32", no_argument, NULL, OPTION_GP32},
11431   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11432   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11433   {"mfp64", no_argument, NULL, OPTION_FP64},
11434   {"mgp64", no_argument, NULL, OPTION_GP64},
11435   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11436   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11437   {"mshared", no_argument, NULL, OPTION_MSHARED},
11438   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11439   {"msym32", no_argument, NULL, OPTION_MSYM32},
11440   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11441   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11442   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11443   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11444   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11445
11446   /* Strictly speaking this next option is ELF specific,
11447      but we allow it for other ports as well in order to
11448      make testing easier.  */
11449   {"32",          no_argument, NULL, OPTION_32},
11450   
11451   /* ELF-specific options.  */
11452 #ifdef OBJ_ELF
11453   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11454   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11455   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11456   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11457   {"xgot",        no_argument, NULL, OPTION_XGOT},
11458   {"mabi", required_argument, NULL, OPTION_MABI},
11459   {"n32",         no_argument, NULL, OPTION_N32},
11460   {"64",          no_argument, NULL, OPTION_64},
11461   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11462   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11463   {"mpdr", no_argument, NULL, OPTION_PDR},
11464   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11465   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11466 #endif /* OBJ_ELF */
11467
11468   {NULL, no_argument, NULL, 0}
11469 };
11470 size_t md_longopts_size = sizeof (md_longopts);
11471
11472 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11473    NEW_VALUE.  Warn if another value was already specified.  Note:
11474    we have to defer parsing the -march and -mtune arguments in order
11475    to handle 'from-abi' correctly, since the ABI might be specified
11476    in a later argument.  */
11477
11478 static void
11479 mips_set_option_string (const char **string_ptr, const char *new_value)
11480 {
11481   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11482     as_warn (_("A different %s was already specified, is now %s"),
11483              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11484              new_value);
11485
11486   *string_ptr = new_value;
11487 }
11488
11489 int
11490 md_parse_option (int c, char *arg)
11491 {
11492   switch (c)
11493     {
11494     case OPTION_CONSTRUCT_FLOATS:
11495       mips_disable_float_construction = 0;
11496       break;
11497
11498     case OPTION_NO_CONSTRUCT_FLOATS:
11499       mips_disable_float_construction = 1;
11500       break;
11501
11502     case OPTION_TRAP:
11503       mips_trap = 1;
11504       break;
11505
11506     case OPTION_BREAK:
11507       mips_trap = 0;
11508       break;
11509
11510     case OPTION_EB:
11511       target_big_endian = 1;
11512       break;
11513
11514     case OPTION_EL:
11515       target_big_endian = 0;
11516       break;
11517
11518     case 'O':
11519       if (arg == NULL)
11520         mips_optimize = 1;
11521       else if (arg[0] == '0')
11522         mips_optimize = 0;
11523       else if (arg[0] == '1')
11524         mips_optimize = 1;
11525       else
11526         mips_optimize = 2;
11527       break;
11528
11529     case 'g':
11530       if (arg == NULL)
11531         mips_debug = 2;
11532       else
11533         mips_debug = atoi (arg);
11534       break;
11535
11536     case OPTION_MIPS1:
11537       file_mips_isa = ISA_MIPS1;
11538       break;
11539
11540     case OPTION_MIPS2:
11541       file_mips_isa = ISA_MIPS2;
11542       break;
11543
11544     case OPTION_MIPS3:
11545       file_mips_isa = ISA_MIPS3;
11546       break;
11547
11548     case OPTION_MIPS4:
11549       file_mips_isa = ISA_MIPS4;
11550       break;
11551
11552     case OPTION_MIPS5:
11553       file_mips_isa = ISA_MIPS5;
11554       break;
11555
11556     case OPTION_MIPS32:
11557       file_mips_isa = ISA_MIPS32;
11558       break;
11559
11560     case OPTION_MIPS32R2:
11561       file_mips_isa = ISA_MIPS32R2;
11562       break;
11563
11564     case OPTION_MIPS64R2:
11565       file_mips_isa = ISA_MIPS64R2;
11566       break;
11567
11568     case OPTION_MIPS64:
11569       file_mips_isa = ISA_MIPS64;
11570       break;
11571
11572     case OPTION_MTUNE:
11573       mips_set_option_string (&mips_tune_string, arg);
11574       break;
11575
11576     case OPTION_MARCH:
11577       mips_set_option_string (&mips_arch_string, arg);
11578       break;
11579
11580     case OPTION_M4650:
11581       mips_set_option_string (&mips_arch_string, "4650");
11582       mips_set_option_string (&mips_tune_string, "4650");
11583       break;
11584
11585     case OPTION_NO_M4650:
11586       break;
11587
11588     case OPTION_M4010:
11589       mips_set_option_string (&mips_arch_string, "4010");
11590       mips_set_option_string (&mips_tune_string, "4010");
11591       break;
11592
11593     case OPTION_NO_M4010:
11594       break;
11595
11596     case OPTION_M4100:
11597       mips_set_option_string (&mips_arch_string, "4100");
11598       mips_set_option_string (&mips_tune_string, "4100");
11599       break;
11600
11601     case OPTION_NO_M4100:
11602       break;
11603
11604     case OPTION_M3900:
11605       mips_set_option_string (&mips_arch_string, "3900");
11606       mips_set_option_string (&mips_tune_string, "3900");
11607       break;
11608
11609     case OPTION_NO_M3900:
11610       break;
11611
11612     case OPTION_MDMX:
11613       mips_opts.ase_mdmx = 1;
11614       break;
11615
11616     case OPTION_NO_MDMX:
11617       mips_opts.ase_mdmx = 0;
11618       break;
11619
11620     case OPTION_DSP:
11621       mips_opts.ase_dsp = 1;
11622       mips_opts.ase_dspr2 = 0;
11623       break;
11624
11625     case OPTION_NO_DSP:
11626       mips_opts.ase_dsp = 0;
11627       mips_opts.ase_dspr2 = 0;
11628       break;
11629
11630     case OPTION_DSPR2:
11631       mips_opts.ase_dspr2 = 1;
11632       mips_opts.ase_dsp = 1;
11633       break;
11634
11635     case OPTION_NO_DSPR2:
11636       mips_opts.ase_dspr2 = 0;
11637       mips_opts.ase_dsp = 0;
11638       break;
11639
11640     case OPTION_MT:
11641       mips_opts.ase_mt = 1;
11642       break;
11643
11644     case OPTION_NO_MT:
11645       mips_opts.ase_mt = 0;
11646       break;
11647
11648     case OPTION_MIPS16:
11649       mips_opts.mips16 = 1;
11650       mips_no_prev_insn ();
11651       break;
11652
11653     case OPTION_NO_MIPS16:
11654       mips_opts.mips16 = 0;
11655       mips_no_prev_insn ();
11656       break;
11657
11658     case OPTION_MIPS3D:
11659       mips_opts.ase_mips3d = 1;
11660       break;
11661
11662     case OPTION_NO_MIPS3D:
11663       mips_opts.ase_mips3d = 0;
11664       break;
11665
11666     case OPTION_SMARTMIPS:
11667       mips_opts.ase_smartmips = 1;
11668       break;
11669
11670     case OPTION_NO_SMARTMIPS:
11671       mips_opts.ase_smartmips = 0;
11672       break;
11673
11674     case OPTION_FIX_24K:
11675       mips_fix_24k = 1;
11676       break;
11677
11678     case OPTION_NO_FIX_24K:
11679       mips_fix_24k = 0;
11680       break;
11681
11682     case OPTION_FIX_LOONGSON2F_JUMP:
11683       mips_fix_loongson2f_jump = TRUE;
11684       break;
11685
11686     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11687       mips_fix_loongson2f_jump = FALSE;
11688       break;
11689
11690     case OPTION_FIX_LOONGSON2F_NOP:
11691       mips_fix_loongson2f_nop = TRUE;
11692       break;
11693
11694     case OPTION_NO_FIX_LOONGSON2F_NOP:
11695       mips_fix_loongson2f_nop = FALSE;
11696       break;
11697
11698     case OPTION_FIX_VR4120:
11699       mips_fix_vr4120 = 1;
11700       break;
11701
11702     case OPTION_NO_FIX_VR4120:
11703       mips_fix_vr4120 = 0;
11704       break;
11705
11706     case OPTION_FIX_VR4130:
11707       mips_fix_vr4130 = 1;
11708       break;
11709
11710     case OPTION_NO_FIX_VR4130:
11711       mips_fix_vr4130 = 0;
11712       break;
11713
11714     case OPTION_FIX_CN63XXP1:
11715       mips_fix_cn63xxp1 = TRUE;
11716       break;
11717
11718     case OPTION_NO_FIX_CN63XXP1:
11719       mips_fix_cn63xxp1 = FALSE;
11720       break;
11721
11722     case OPTION_RELAX_BRANCH:
11723       mips_relax_branch = 1;
11724       break;
11725
11726     case OPTION_NO_RELAX_BRANCH:
11727       mips_relax_branch = 0;
11728       break;
11729
11730     case OPTION_MSHARED:
11731       mips_in_shared = TRUE;
11732       break;
11733
11734     case OPTION_MNO_SHARED:
11735       mips_in_shared = FALSE;
11736       break;
11737
11738     case OPTION_MSYM32:
11739       mips_opts.sym32 = TRUE;
11740       break;
11741
11742     case OPTION_MNO_SYM32:
11743       mips_opts.sym32 = FALSE;
11744       break;
11745
11746 #ifdef OBJ_ELF
11747       /* When generating ELF code, we permit -KPIC and -call_shared to
11748          select SVR4_PIC, and -non_shared to select no PIC.  This is
11749          intended to be compatible with Irix 5.  */
11750     case OPTION_CALL_SHARED:
11751       if (!IS_ELF)
11752         {
11753           as_bad (_("-call_shared is supported only for ELF format"));
11754           return 0;
11755         }
11756       mips_pic = SVR4_PIC;
11757       mips_abicalls = TRUE;
11758       break;
11759
11760     case OPTION_CALL_NONPIC:
11761       if (!IS_ELF)
11762         {
11763           as_bad (_("-call_nonpic is supported only for ELF format"));
11764           return 0;
11765         }
11766       mips_pic = NO_PIC;
11767       mips_abicalls = TRUE;
11768       break;
11769
11770     case OPTION_NON_SHARED:
11771       if (!IS_ELF)
11772         {
11773           as_bad (_("-non_shared is supported only for ELF format"));
11774           return 0;
11775         }
11776       mips_pic = NO_PIC;
11777       mips_abicalls = FALSE;
11778       break;
11779
11780       /* The -xgot option tells the assembler to use 32 bit offsets
11781          when accessing the got in SVR4_PIC mode.  It is for Irix
11782          compatibility.  */
11783     case OPTION_XGOT:
11784       mips_big_got = 1;
11785       break;
11786 #endif /* OBJ_ELF */
11787
11788     case 'G':
11789       g_switch_value = atoi (arg);
11790       g_switch_seen = 1;
11791       break;
11792
11793       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11794          and -mabi=64.  */
11795     case OPTION_32:
11796       if (IS_ELF)
11797         mips_abi = O32_ABI;
11798       /* We silently ignore -32 for non-ELF targets.  This greatly
11799          simplifies the construction of the MIPS GAS test cases.  */
11800       break;
11801
11802 #ifdef OBJ_ELF
11803     case OPTION_N32:
11804       if (!IS_ELF)
11805         {
11806           as_bad (_("-n32 is supported for ELF format only"));
11807           return 0;
11808         }
11809       mips_abi = N32_ABI;
11810       break;
11811
11812     case OPTION_64:
11813       if (!IS_ELF)
11814         {
11815           as_bad (_("-64 is supported for ELF format only"));
11816           return 0;
11817         }
11818       mips_abi = N64_ABI;
11819       if (!support_64bit_objects())
11820         as_fatal (_("No compiled in support for 64 bit object file format"));
11821       break;
11822 #endif /* OBJ_ELF */
11823
11824     case OPTION_GP32:
11825       file_mips_gp32 = 1;
11826       break;
11827
11828     case OPTION_GP64:
11829       file_mips_gp32 = 0;
11830       break;
11831
11832     case OPTION_FP32:
11833       file_mips_fp32 = 1;
11834       break;
11835
11836     case OPTION_FP64:
11837       file_mips_fp32 = 0;
11838       break;
11839
11840     case OPTION_SINGLE_FLOAT:
11841       file_mips_single_float = 1;
11842       break;
11843
11844     case OPTION_DOUBLE_FLOAT:
11845       file_mips_single_float = 0;
11846       break;
11847
11848     case OPTION_SOFT_FLOAT:
11849       file_mips_soft_float = 1;
11850       break;
11851
11852     case OPTION_HARD_FLOAT:
11853       file_mips_soft_float = 0;
11854       break;
11855
11856 #ifdef OBJ_ELF
11857     case OPTION_MABI:
11858       if (!IS_ELF)
11859         {
11860           as_bad (_("-mabi is supported for ELF format only"));
11861           return 0;
11862         }
11863       if (strcmp (arg, "32") == 0)
11864         mips_abi = O32_ABI;
11865       else if (strcmp (arg, "o64") == 0)
11866         mips_abi = O64_ABI;
11867       else if (strcmp (arg, "n32") == 0)
11868         mips_abi = N32_ABI;
11869       else if (strcmp (arg, "64") == 0)
11870         {
11871           mips_abi = N64_ABI;
11872           if (! support_64bit_objects())
11873             as_fatal (_("No compiled in support for 64 bit object file "
11874                         "format"));
11875         }
11876       else if (strcmp (arg, "eabi") == 0)
11877         mips_abi = EABI_ABI;
11878       else
11879         {
11880           as_fatal (_("invalid abi -mabi=%s"), arg);
11881           return 0;
11882         }
11883       break;
11884 #endif /* OBJ_ELF */
11885
11886     case OPTION_M7000_HILO_FIX:
11887       mips_7000_hilo_fix = TRUE;
11888       break;
11889
11890     case OPTION_MNO_7000_HILO_FIX:
11891       mips_7000_hilo_fix = FALSE;
11892       break;
11893
11894 #ifdef OBJ_ELF
11895     case OPTION_MDEBUG:
11896       mips_flag_mdebug = TRUE;
11897       break;
11898
11899     case OPTION_NO_MDEBUG:
11900       mips_flag_mdebug = FALSE;
11901       break;
11902
11903     case OPTION_PDR:
11904       mips_flag_pdr = TRUE;
11905       break;
11906
11907     case OPTION_NO_PDR:
11908       mips_flag_pdr = FALSE;
11909       break;
11910
11911     case OPTION_MVXWORKS_PIC:
11912       mips_pic = VXWORKS_PIC;
11913       break;
11914 #endif /* OBJ_ELF */
11915
11916     default:
11917       return 0;
11918     }
11919
11920     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11921
11922   return 1;
11923 }
11924 \f
11925 /* Set up globals to generate code for the ISA or processor
11926    described by INFO.  */
11927
11928 static void
11929 mips_set_architecture (const struct mips_cpu_info *info)
11930 {
11931   if (info != 0)
11932     {
11933       file_mips_arch = info->cpu;
11934       mips_opts.arch = info->cpu;
11935       mips_opts.isa = info->isa;
11936     }
11937 }
11938
11939
11940 /* Likewise for tuning.  */
11941
11942 static void
11943 mips_set_tune (const struct mips_cpu_info *info)
11944 {
11945   if (info != 0)
11946     mips_tune = info->cpu;
11947 }
11948
11949
11950 void
11951 mips_after_parse_args (void)
11952 {
11953   const struct mips_cpu_info *arch_info = 0;
11954   const struct mips_cpu_info *tune_info = 0;
11955
11956   /* GP relative stuff not working for PE */
11957   if (strncmp (TARGET_OS, "pe", 2) == 0)
11958     {
11959       if (g_switch_seen && g_switch_value != 0)
11960         as_bad (_("-G not supported in this configuration."));
11961       g_switch_value = 0;
11962     }
11963
11964   if (mips_abi == NO_ABI)
11965     mips_abi = MIPS_DEFAULT_ABI;
11966
11967   /* The following code determines the architecture and register size.
11968      Similar code was added to GCC 3.3 (see override_options() in
11969      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11970      as much as possible.  */
11971
11972   if (mips_arch_string != 0)
11973     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11974
11975   if (file_mips_isa != ISA_UNKNOWN)
11976     {
11977       /* Handle -mipsN.  At this point, file_mips_isa contains the
11978          ISA level specified by -mipsN, while arch_info->isa contains
11979          the -march selection (if any).  */
11980       if (arch_info != 0)
11981         {
11982           /* -march takes precedence over -mipsN, since it is more descriptive.
11983              There's no harm in specifying both as long as the ISA levels
11984              are the same.  */
11985           if (file_mips_isa != arch_info->isa)
11986             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11987                     mips_cpu_info_from_isa (file_mips_isa)->name,
11988                     mips_cpu_info_from_isa (arch_info->isa)->name);
11989         }
11990       else
11991         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11992     }
11993
11994   if (arch_info == 0)
11995     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11996
11997   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11998     as_bad (_("-march=%s is not compatible with the selected ABI"),
11999             arch_info->name);
12000
12001   mips_set_architecture (arch_info);
12002
12003   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
12004   if (mips_tune_string != 0)
12005     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
12006
12007   if (tune_info == 0)
12008     mips_set_tune (arch_info);
12009   else
12010     mips_set_tune (tune_info);
12011
12012   if (file_mips_gp32 >= 0)
12013     {
12014       /* The user specified the size of the integer registers.  Make sure
12015          it agrees with the ABI and ISA.  */
12016       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12017         as_bad (_("-mgp64 used with a 32-bit processor"));
12018       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12019         as_bad (_("-mgp32 used with a 64-bit ABI"));
12020       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12021         as_bad (_("-mgp64 used with a 32-bit ABI"));
12022     }
12023   else
12024     {
12025       /* Infer the integer register size from the ABI and processor.
12026          Restrict ourselves to 32-bit registers if that's all the
12027          processor has, or if the ABI cannot handle 64-bit registers.  */
12028       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12029                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12030     }
12031
12032   switch (file_mips_fp32)
12033     {
12034     default:
12035     case -1:
12036       /* No user specified float register size.
12037          ??? GAS treats single-float processors as though they had 64-bit
12038          float registers (although it complains when double-precision
12039          instructions are used).  As things stand, saying they have 32-bit
12040          registers would lead to spurious "register must be even" messages.
12041          So here we assume float registers are never smaller than the
12042          integer ones.  */
12043       if (file_mips_gp32 == 0)
12044         /* 64-bit integer registers implies 64-bit float registers.  */
12045         file_mips_fp32 = 0;
12046       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12047                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12048         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12049         file_mips_fp32 = 0;
12050       else
12051         /* 32-bit float registers.  */
12052         file_mips_fp32 = 1;
12053       break;
12054
12055     /* The user specified the size of the float registers.  Check if it
12056        agrees with the ABI and ISA.  */
12057     case 0:
12058       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12059         as_bad (_("-mfp64 used with a 32-bit fpu"));
12060       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12061                && !ISA_HAS_MXHC1 (mips_opts.isa))
12062         as_warn (_("-mfp64 used with a 32-bit ABI"));
12063       break;
12064     case 1:
12065       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12066         as_warn (_("-mfp32 used with a 64-bit ABI"));
12067       break;
12068     }
12069
12070   /* End of GCC-shared inference code.  */
12071
12072   /* This flag is set when we have a 64-bit capable CPU but use only
12073      32-bit wide registers.  Note that EABI does not use it.  */
12074   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12075       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12076           || mips_abi == O32_ABI))
12077     mips_32bitmode = 1;
12078
12079   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12080     as_bad (_("trap exception not supported at ISA 1"));
12081
12082   /* If the selected architecture includes support for ASEs, enable
12083      generation of code for them.  */
12084   if (mips_opts.mips16 == -1)
12085     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12086   if (mips_opts.ase_mips3d == -1)
12087     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12088                             && file_mips_fp32 == 0) ? 1 : 0;
12089   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12090     as_bad (_("-mfp32 used with -mips3d"));
12091
12092   if (mips_opts.ase_mdmx == -1)
12093     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12094                           && file_mips_fp32 == 0) ? 1 : 0;
12095   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12096     as_bad (_("-mfp32 used with -mdmx"));
12097
12098   if (mips_opts.ase_smartmips == -1)
12099     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12100   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12101     as_warn (_("%s ISA does not support SmartMIPS"), 
12102              mips_cpu_info_from_isa (mips_opts.isa)->name);
12103
12104   if (mips_opts.ase_dsp == -1)
12105     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12106   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12107     as_warn (_("%s ISA does not support DSP ASE"), 
12108              mips_cpu_info_from_isa (mips_opts.isa)->name);
12109
12110   if (mips_opts.ase_dspr2 == -1)
12111     {
12112       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12113       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12114     }
12115   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12116     as_warn (_("%s ISA does not support DSP R2 ASE"),
12117              mips_cpu_info_from_isa (mips_opts.isa)->name);
12118
12119   if (mips_opts.ase_mt == -1)
12120     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12121   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12122     as_warn (_("%s ISA does not support MT ASE"),
12123              mips_cpu_info_from_isa (mips_opts.isa)->name);
12124
12125   file_mips_isa = mips_opts.isa;
12126   file_ase_mips3d = mips_opts.ase_mips3d;
12127   file_ase_mdmx = mips_opts.ase_mdmx;
12128   file_ase_smartmips = mips_opts.ase_smartmips;
12129   file_ase_dsp = mips_opts.ase_dsp;
12130   file_ase_dspr2 = mips_opts.ase_dspr2;
12131   file_ase_mt = mips_opts.ase_mt;
12132   mips_opts.gp32 = file_mips_gp32;
12133   mips_opts.fp32 = file_mips_fp32;
12134   mips_opts.soft_float = file_mips_soft_float;
12135   mips_opts.single_float = file_mips_single_float;
12136
12137   if (mips_flag_mdebug < 0)
12138     {
12139 #ifdef OBJ_MAYBE_ECOFF
12140       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12141         mips_flag_mdebug = 1;
12142       else
12143 #endif /* OBJ_MAYBE_ECOFF */
12144         mips_flag_mdebug = 0;
12145     }
12146 }
12147 \f
12148 void
12149 mips_init_after_args (void)
12150 {
12151   /* initialize opcodes */
12152   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12153   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12154 }
12155
12156 long
12157 md_pcrel_from (fixS *fixP)
12158 {
12159   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12160   switch (fixP->fx_r_type)
12161     {
12162     case BFD_RELOC_16_PCREL_S2:
12163     case BFD_RELOC_MIPS_JMP:
12164       /* Return the address of the delay slot.  */
12165       return addr + 4;
12166     default:
12167       /* We have no relocation type for PC relative MIPS16 instructions.  */
12168       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12169         as_bad_where (fixP->fx_file, fixP->fx_line,
12170                       _("PC relative MIPS16 instruction references a different section"));
12171       return addr;
12172     }
12173 }
12174
12175 /* This is called before the symbol table is processed.  In order to
12176    work with gcc when using mips-tfile, we must keep all local labels.
12177    However, in other cases, we want to discard them.  If we were
12178    called with -g, but we didn't see any debugging information, it may
12179    mean that gcc is smuggling debugging information through to
12180    mips-tfile, in which case we must generate all local labels.  */
12181
12182 void
12183 mips_frob_file_before_adjust (void)
12184 {
12185 #ifndef NO_ECOFF_DEBUGGING
12186   if (ECOFF_DEBUGGING
12187       && mips_debug != 0
12188       && ! ecoff_debugging_seen)
12189     flag_keep_locals = 1;
12190 #endif
12191 }
12192
12193 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12194    the corresponding LO16 reloc.  This is called before md_apply_fix and
12195    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12196    relocation operators.
12197
12198    For our purposes, a %lo() expression matches a %got() or %hi()
12199    expression if:
12200
12201       (a) it refers to the same symbol; and
12202       (b) the offset applied in the %lo() expression is no lower than
12203           the offset applied in the %got() or %hi().
12204
12205    (b) allows us to cope with code like:
12206
12207         lui     $4,%hi(foo)
12208         lh      $4,%lo(foo+2)($4)
12209
12210    ...which is legal on RELA targets, and has a well-defined behaviour
12211    if the user knows that adding 2 to "foo" will not induce a carry to
12212    the high 16 bits.
12213
12214    When several %lo()s match a particular %got() or %hi(), we use the
12215    following rules to distinguish them:
12216
12217      (1) %lo()s with smaller offsets are a better match than %lo()s with
12218          higher offsets.
12219
12220      (2) %lo()s with no matching %got() or %hi() are better than those
12221          that already have a matching %got() or %hi().
12222
12223      (3) later %lo()s are better than earlier %lo()s.
12224
12225    These rules are applied in order.
12226
12227    (1) means, among other things, that %lo()s with identical offsets are
12228    chosen if they exist.
12229
12230    (2) means that we won't associate several high-part relocations with
12231    the same low-part relocation unless there's no alternative.  Having
12232    several high parts for the same low part is a GNU extension; this rule
12233    allows careful users to avoid it.
12234
12235    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12236    with the last high-part relocation being at the front of the list.
12237    It therefore makes sense to choose the last matching low-part
12238    relocation, all other things being equal.  It's also easier
12239    to code that way.  */
12240
12241 void
12242 mips_frob_file (void)
12243 {
12244   struct mips_hi_fixup *l;
12245   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12246
12247   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12248     {
12249       segment_info_type *seginfo;
12250       bfd_boolean matched_lo_p;
12251       fixS **hi_pos, **lo_pos, **pos;
12252
12253       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12254
12255       /* If a GOT16 relocation turns out to be against a global symbol,
12256          there isn't supposed to be a matching LO.  */
12257       if (got16_reloc_p (l->fixp->fx_r_type)
12258           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12259         continue;
12260
12261       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12262       if (fixup_has_matching_lo_p (l->fixp))
12263         continue;
12264
12265       seginfo = seg_info (l->seg);
12266
12267       /* Set HI_POS to the position of this relocation in the chain.
12268          Set LO_POS to the position of the chosen low-part relocation.
12269          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12270          relocation that matches an immediately-preceding high-part
12271          relocation.  */
12272       hi_pos = NULL;
12273       lo_pos = NULL;
12274       matched_lo_p = FALSE;
12275       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12276
12277       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12278         {
12279           if (*pos == l->fixp)
12280             hi_pos = pos;
12281
12282           if ((*pos)->fx_r_type == looking_for_rtype
12283               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12284               && (*pos)->fx_offset >= l->fixp->fx_offset
12285               && (lo_pos == NULL
12286                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12287                   || (!matched_lo_p
12288                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12289             lo_pos = pos;
12290
12291           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12292                           && fixup_has_matching_lo_p (*pos));
12293         }
12294
12295       /* If we found a match, remove the high-part relocation from its
12296          current position and insert it before the low-part relocation.
12297          Make the offsets match so that fixup_has_matching_lo_p()
12298          will return true.
12299
12300          We don't warn about unmatched high-part relocations since some
12301          versions of gcc have been known to emit dead "lui ...%hi(...)"
12302          instructions.  */
12303       if (lo_pos != NULL)
12304         {
12305           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12306           if (l->fixp->fx_next != *lo_pos)
12307             {
12308               *hi_pos = l->fixp->fx_next;
12309               l->fixp->fx_next = *lo_pos;
12310               *lo_pos = l->fixp;
12311             }
12312         }
12313     }
12314 }
12315
12316 /* We may have combined relocations without symbols in the N32/N64 ABI.
12317    We have to prevent gas from dropping them.  */
12318
12319 int
12320 mips_force_relocation (fixS *fixp)
12321 {
12322   if (generic_force_reloc (fixp))
12323     return 1;
12324
12325   if (HAVE_NEWABI
12326       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12327       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12328           || hi16_reloc_p (fixp->fx_r_type)
12329           || lo16_reloc_p (fixp->fx_r_type)))
12330     return 1;
12331
12332   return 0;
12333 }
12334
12335 /* Apply a fixup to the object file.  */
12336
12337 void
12338 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12339 {
12340   bfd_byte *buf;
12341   long insn;
12342   reloc_howto_type *howto;
12343
12344   /* We ignore generic BFD relocations we don't know about.  */
12345   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12346   if (! howto)
12347     return;
12348
12349   gas_assert (fixP->fx_size == 4
12350               || fixP->fx_r_type == BFD_RELOC_16
12351               || fixP->fx_r_type == BFD_RELOC_64
12352               || fixP->fx_r_type == BFD_RELOC_CTOR
12353               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12354               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12355               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12356               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12357
12358   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12359
12360   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12361
12362   /* Don't treat parts of a composite relocation as done.  There are two
12363      reasons for this:
12364
12365      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12366          should nevertheless be emitted if the first part is.
12367
12368      (2) In normal usage, composite relocations are never assembly-time
12369          constants.  The easiest way of dealing with the pathological
12370          exceptions is to generate a relocation against STN_UNDEF and
12371          leave everything up to the linker.  */
12372   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12373     fixP->fx_done = 1;
12374
12375   switch (fixP->fx_r_type)
12376     {
12377     case BFD_RELOC_MIPS_TLS_GD:
12378     case BFD_RELOC_MIPS_TLS_LDM:
12379     case BFD_RELOC_MIPS_TLS_DTPREL32:
12380     case BFD_RELOC_MIPS_TLS_DTPREL64:
12381     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12382     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12383     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12384     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12385     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12386       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12387       /* fall through */
12388
12389     case BFD_RELOC_MIPS_JMP:
12390     case BFD_RELOC_MIPS_SHIFT5:
12391     case BFD_RELOC_MIPS_SHIFT6:
12392     case BFD_RELOC_MIPS_GOT_DISP:
12393     case BFD_RELOC_MIPS_GOT_PAGE:
12394     case BFD_RELOC_MIPS_GOT_OFST:
12395     case BFD_RELOC_MIPS_SUB:
12396     case BFD_RELOC_MIPS_INSERT_A:
12397     case BFD_RELOC_MIPS_INSERT_B:
12398     case BFD_RELOC_MIPS_DELETE:
12399     case BFD_RELOC_MIPS_HIGHEST:
12400     case BFD_RELOC_MIPS_HIGHER:
12401     case BFD_RELOC_MIPS_SCN_DISP:
12402     case BFD_RELOC_MIPS_REL16:
12403     case BFD_RELOC_MIPS_RELGOT:
12404     case BFD_RELOC_MIPS_JALR:
12405     case BFD_RELOC_HI16:
12406     case BFD_RELOC_HI16_S:
12407     case BFD_RELOC_GPREL16:
12408     case BFD_RELOC_MIPS_LITERAL:
12409     case BFD_RELOC_MIPS_CALL16:
12410     case BFD_RELOC_MIPS_GOT16:
12411     case BFD_RELOC_GPREL32:
12412     case BFD_RELOC_MIPS_GOT_HI16:
12413     case BFD_RELOC_MIPS_GOT_LO16:
12414     case BFD_RELOC_MIPS_CALL_HI16:
12415     case BFD_RELOC_MIPS_CALL_LO16:
12416     case BFD_RELOC_MIPS16_GPREL:
12417     case BFD_RELOC_MIPS16_GOT16:
12418     case BFD_RELOC_MIPS16_CALL16:
12419     case BFD_RELOC_MIPS16_HI16:
12420     case BFD_RELOC_MIPS16_HI16_S:
12421     case BFD_RELOC_MIPS16_JMP:
12422       /* Nothing needed to do.  The value comes from the reloc entry.  */
12423       break;
12424
12425     case BFD_RELOC_64:
12426       /* This is handled like BFD_RELOC_32, but we output a sign
12427          extended value if we are only 32 bits.  */
12428       if (fixP->fx_done)
12429         {
12430           if (8 <= sizeof (valueT))
12431             md_number_to_chars ((char *) buf, *valP, 8);
12432           else
12433             {
12434               valueT hiv;
12435
12436               if ((*valP & 0x80000000) != 0)
12437                 hiv = 0xffffffff;
12438               else
12439                 hiv = 0;
12440               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12441                                   *valP, 4);
12442               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12443                                   hiv, 4);
12444             }
12445         }
12446       break;
12447
12448     case BFD_RELOC_RVA:
12449     case BFD_RELOC_32:
12450     case BFD_RELOC_16:
12451       /* If we are deleting this reloc entry, we must fill in the
12452          value now.  This can happen if we have a .word which is not
12453          resolved when it appears but is later defined.  */
12454       if (fixP->fx_done)
12455         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12456       break;
12457
12458     case BFD_RELOC_LO16:
12459     case BFD_RELOC_MIPS16_LO16:
12460       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12461          may be safe to remove, but if so it's not obvious.  */
12462       /* When handling an embedded PIC switch statement, we can wind
12463          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12464       if (fixP->fx_done)
12465         {
12466           if (*valP + 0x8000 > 0xffff)
12467             as_bad_where (fixP->fx_file, fixP->fx_line,
12468                           _("relocation overflow"));
12469           if (target_big_endian)
12470             buf += 2;
12471           md_number_to_chars ((char *) buf, *valP, 2);
12472         }
12473       break;
12474
12475     case BFD_RELOC_16_PCREL_S2:
12476       if ((*valP & 0x3) != 0)
12477         as_bad_where (fixP->fx_file, fixP->fx_line,
12478                       _("Branch to misaligned address (%lx)"), (long) *valP);
12479
12480       /* We need to save the bits in the instruction since fixup_segment()
12481          might be deleting the relocation entry (i.e., a branch within
12482          the current segment).  */
12483       if (! fixP->fx_done)
12484         break;
12485
12486       /* Update old instruction data.  */
12487       if (target_big_endian)
12488         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12489       else
12490         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12491
12492       if (*valP + 0x20000 <= 0x3ffff)
12493         {
12494           insn |= (*valP >> 2) & 0xffff;
12495           md_number_to_chars ((char *) buf, insn, 4);
12496         }
12497       else if (mips_pic == NO_PIC
12498                && fixP->fx_done
12499                && fixP->fx_frag->fr_address >= text_section->vma
12500                && (fixP->fx_frag->fr_address
12501                    < text_section->vma + bfd_get_section_size (text_section))
12502                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12503                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12504                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12505         {
12506           /* The branch offset is too large.  If this is an
12507              unconditional branch, and we are not generating PIC code,
12508              we can convert it to an absolute jump instruction.  */
12509           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12510             insn = 0x0c000000;  /* jal */
12511           else
12512             insn = 0x08000000;  /* j */
12513           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12514           fixP->fx_done = 0;
12515           fixP->fx_addsy = section_symbol (text_section);
12516           *valP += md_pcrel_from (fixP);
12517           md_number_to_chars ((char *) buf, insn, 4);
12518         }
12519       else
12520         {
12521           /* If we got here, we have branch-relaxation disabled,
12522              and there's nothing we can do to fix this instruction
12523              without turning it into a longer sequence.  */
12524           as_bad_where (fixP->fx_file, fixP->fx_line,
12525                         _("Branch out of range"));
12526         }
12527       break;
12528
12529     case BFD_RELOC_VTABLE_INHERIT:
12530       fixP->fx_done = 0;
12531       if (fixP->fx_addsy
12532           && !S_IS_DEFINED (fixP->fx_addsy)
12533           && !S_IS_WEAK (fixP->fx_addsy))
12534         S_SET_WEAK (fixP->fx_addsy);
12535       break;
12536
12537     case BFD_RELOC_VTABLE_ENTRY:
12538       fixP->fx_done = 0;
12539       break;
12540
12541     default:
12542       internalError ();
12543     }
12544
12545   /* Remember value for tc_gen_reloc.  */
12546   fixP->fx_addnumber = *valP;
12547 }
12548
12549 static symbolS *
12550 get_symbol (void)
12551 {
12552   int c;
12553   char *name;
12554   symbolS *p;
12555
12556   name = input_line_pointer;
12557   c = get_symbol_end ();
12558   p = (symbolS *) symbol_find_or_make (name);
12559   *input_line_pointer = c;
12560   return p;
12561 }
12562
12563 /* Align the current frag to a given power of two.  If a particular
12564    fill byte should be used, FILL points to an integer that contains
12565    that byte, otherwise FILL is null.
12566
12567    The MIPS assembler also automatically adjusts any preceding
12568    label.  */
12569
12570 static void
12571 mips_align (int to, int *fill, symbolS *label)
12572 {
12573   mips_emit_delays ();
12574   mips_record_mips16_mode ();
12575   if (fill == NULL && subseg_text_p (now_seg))
12576     frag_align_code (to, 0);
12577   else
12578     frag_align (to, fill ? *fill : 0, 0);
12579   record_alignment (now_seg, to);
12580   if (label != NULL)
12581     {
12582       gas_assert (S_GET_SEGMENT (label) == now_seg);
12583       symbol_set_frag (label, frag_now);
12584       S_SET_VALUE (label, (valueT) frag_now_fix ());
12585     }
12586 }
12587
12588 /* Align to a given power of two.  .align 0 turns off the automatic
12589    alignment used by the data creating pseudo-ops.  */
12590
12591 static void
12592 s_align (int x ATTRIBUTE_UNUSED)
12593 {
12594   int temp, fill_value, *fill_ptr;
12595   long max_alignment = 28;
12596
12597   /* o Note that the assembler pulls down any immediately preceding label
12598        to the aligned address.
12599      o It's not documented but auto alignment is reinstated by
12600        a .align pseudo instruction.
12601      o Note also that after auto alignment is turned off the mips assembler
12602        issues an error on attempt to assemble an improperly aligned data item.
12603        We don't.  */
12604
12605   temp = get_absolute_expression ();
12606   if (temp > max_alignment)
12607     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12608   else if (temp < 0)
12609     {
12610       as_warn (_("Alignment negative: 0 assumed."));
12611       temp = 0;
12612     }
12613   if (*input_line_pointer == ',')
12614     {
12615       ++input_line_pointer;
12616       fill_value = get_absolute_expression ();
12617       fill_ptr = &fill_value;
12618     }
12619   else
12620     fill_ptr = 0;
12621   if (temp)
12622     {
12623       segment_info_type *si = seg_info (now_seg);
12624       struct insn_label_list *l = si->label_list;
12625       /* Auto alignment should be switched on by next section change.  */
12626       auto_align = 1;
12627       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12628     }
12629   else
12630     {
12631       auto_align = 0;
12632     }
12633
12634   demand_empty_rest_of_line ();
12635 }
12636
12637 static void
12638 s_change_sec (int sec)
12639 {
12640   segT seg;
12641
12642 #ifdef OBJ_ELF
12643   /* The ELF backend needs to know that we are changing sections, so
12644      that .previous works correctly.  We could do something like check
12645      for an obj_section_change_hook macro, but that might be confusing
12646      as it would not be appropriate to use it in the section changing
12647      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12648      This should be cleaner, somehow.  */
12649   if (IS_ELF)
12650     obj_elf_section_change_hook ();
12651 #endif
12652
12653   mips_emit_delays ();
12654
12655   switch (sec)
12656     {
12657     case 't':
12658       s_text (0);
12659       break;
12660     case 'd':
12661       s_data (0);
12662       break;
12663     case 'b':
12664       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12665       demand_empty_rest_of_line ();
12666       break;
12667
12668     case 'r':
12669       seg = subseg_new (RDATA_SECTION_NAME,
12670                         (subsegT) get_absolute_expression ());
12671       if (IS_ELF)
12672         {
12673           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12674                                                   | SEC_READONLY | SEC_RELOC
12675                                                   | SEC_DATA));
12676           if (strncmp (TARGET_OS, "elf", 3) != 0)
12677             record_alignment (seg, 4);
12678         }
12679       demand_empty_rest_of_line ();
12680       break;
12681
12682     case 's':
12683       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12684       if (IS_ELF)
12685         {
12686           bfd_set_section_flags (stdoutput, seg,
12687                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12688           if (strncmp (TARGET_OS, "elf", 3) != 0)
12689             record_alignment (seg, 4);
12690         }
12691       demand_empty_rest_of_line ();
12692       break;
12693
12694     case 'B':
12695       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12696       if (IS_ELF)
12697         {
12698           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12699           if (strncmp (TARGET_OS, "elf", 3) != 0)
12700             record_alignment (seg, 4);
12701         }
12702       demand_empty_rest_of_line ();
12703       break;
12704     }
12705
12706   auto_align = 1;
12707 }
12708
12709 void
12710 s_change_section (int ignore ATTRIBUTE_UNUSED)
12711 {
12712 #ifdef OBJ_ELF
12713   char *section_name;
12714   char c;
12715   char next_c = 0;
12716   int section_type;
12717   int section_flag;
12718   int section_entry_size;
12719   int section_alignment;
12720
12721   if (!IS_ELF)
12722     return;
12723
12724   section_name = input_line_pointer;
12725   c = get_symbol_end ();
12726   if (c)
12727     next_c = *(input_line_pointer + 1);
12728
12729   /* Do we have .section Name<,"flags">?  */
12730   if (c != ',' || (c == ',' && next_c == '"'))
12731     {
12732       /* just after name is now '\0'.  */
12733       *input_line_pointer = c;
12734       input_line_pointer = section_name;
12735       obj_elf_section (ignore);
12736       return;
12737     }
12738   input_line_pointer++;
12739
12740   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12741   if (c == ',')
12742     section_type = get_absolute_expression ();
12743   else
12744     section_type = 0;
12745   if (*input_line_pointer++ == ',')
12746     section_flag = get_absolute_expression ();
12747   else
12748     section_flag = 0;
12749   if (*input_line_pointer++ == ',')
12750     section_entry_size = get_absolute_expression ();
12751   else
12752     section_entry_size = 0;
12753   if (*input_line_pointer++ == ',')
12754     section_alignment = get_absolute_expression ();
12755   else
12756     section_alignment = 0;
12757   /* FIXME: really ignore?  */
12758   (void) section_alignment;
12759
12760   section_name = xstrdup (section_name);
12761
12762   /* When using the generic form of .section (as implemented by obj-elf.c),
12763      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12764      traditionally had to fall back on the more common @progbits instead.
12765
12766      There's nothing really harmful in this, since bfd will correct
12767      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12768      means that, for backwards compatibility, the special_section entries
12769      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12770
12771      Even so, we shouldn't force users of the MIPS .section syntax to
12772      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12773      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12774      generic type-checking code.  */
12775   if (section_type == SHT_MIPS_DWARF)
12776     section_type = SHT_PROGBITS;
12777
12778   obj_elf_change_section (section_name, section_type, section_flag,
12779                           section_entry_size, 0, 0, 0);
12780
12781   if (now_seg->name != section_name)
12782     free (section_name);
12783 #endif /* OBJ_ELF */
12784 }
12785
12786 void
12787 mips_enable_auto_align (void)
12788 {
12789   auto_align = 1;
12790 }
12791
12792 static void
12793 s_cons (int log_size)
12794 {
12795   segment_info_type *si = seg_info (now_seg);
12796   struct insn_label_list *l = si->label_list;
12797   symbolS *label;
12798
12799   label = l != NULL ? l->label : NULL;
12800   mips_emit_delays ();
12801   if (log_size > 0 && auto_align)
12802     mips_align (log_size, 0, label);
12803   cons (1 << log_size);
12804   mips_clear_insn_labels ();
12805 }
12806
12807 static void
12808 s_float_cons (int type)
12809 {
12810   segment_info_type *si = seg_info (now_seg);
12811   struct insn_label_list *l = si->label_list;
12812   symbolS *label;
12813
12814   label = l != NULL ? l->label : NULL;
12815
12816   mips_emit_delays ();
12817
12818   if (auto_align)
12819     {
12820       if (type == 'd')
12821         mips_align (3, 0, label);
12822       else
12823         mips_align (2, 0, label);
12824     }
12825
12826   float_cons (type);
12827   mips_clear_insn_labels ();
12828 }
12829
12830 /* Handle .globl.  We need to override it because on Irix 5 you are
12831    permitted to say
12832        .globl foo .text
12833    where foo is an undefined symbol, to mean that foo should be
12834    considered to be the address of a function.  */
12835
12836 static void
12837 s_mips_globl (int x ATTRIBUTE_UNUSED)
12838 {
12839   char *name;
12840   int c;
12841   symbolS *symbolP;
12842   flagword flag;
12843
12844   do
12845     {
12846       name = input_line_pointer;
12847       c = get_symbol_end ();
12848       symbolP = symbol_find_or_make (name);
12849       S_SET_EXTERNAL (symbolP);
12850
12851       *input_line_pointer = c;
12852       SKIP_WHITESPACE ();
12853
12854       /* On Irix 5, every global symbol that is not explicitly labelled as
12855          being a function is apparently labelled as being an object.  */
12856       flag = BSF_OBJECT;
12857
12858       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12859           && (*input_line_pointer != ','))
12860         {
12861           char *secname;
12862           asection *sec;
12863
12864           secname = input_line_pointer;
12865           c = get_symbol_end ();
12866           sec = bfd_get_section_by_name (stdoutput, secname);
12867           if (sec == NULL)
12868             as_bad (_("%s: no such section"), secname);
12869           *input_line_pointer = c;
12870
12871           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12872             flag = BSF_FUNCTION;
12873         }
12874
12875       symbol_get_bfdsym (symbolP)->flags |= flag;
12876
12877       c = *input_line_pointer;
12878       if (c == ',')
12879         {
12880           input_line_pointer++;
12881           SKIP_WHITESPACE ();
12882           if (is_end_of_line[(unsigned char) *input_line_pointer])
12883             c = '\n';
12884         }
12885     }
12886   while (c == ',');
12887
12888   demand_empty_rest_of_line ();
12889 }
12890
12891 static void
12892 s_option (int x ATTRIBUTE_UNUSED)
12893 {
12894   char *opt;
12895   char c;
12896
12897   opt = input_line_pointer;
12898   c = get_symbol_end ();
12899
12900   if (*opt == 'O')
12901     {
12902       /* FIXME: What does this mean?  */
12903     }
12904   else if (strncmp (opt, "pic", 3) == 0)
12905     {
12906       int i;
12907
12908       i = atoi (opt + 3);
12909       if (i == 0)
12910         mips_pic = NO_PIC;
12911       else if (i == 2)
12912         {
12913         mips_pic = SVR4_PIC;
12914           mips_abicalls = TRUE;
12915         }
12916       else
12917         as_bad (_(".option pic%d not supported"), i);
12918
12919       if (mips_pic == SVR4_PIC)
12920         {
12921           if (g_switch_seen && g_switch_value != 0)
12922             as_warn (_("-G may not be used with SVR4 PIC code"));
12923           g_switch_value = 0;
12924           bfd_set_gp_size (stdoutput, 0);
12925         }
12926     }
12927   else
12928     as_warn (_("Unrecognized option \"%s\""), opt);
12929
12930   *input_line_pointer = c;
12931   demand_empty_rest_of_line ();
12932 }
12933
12934 /* This structure is used to hold a stack of .set values.  */
12935
12936 struct mips_option_stack
12937 {
12938   struct mips_option_stack *next;
12939   struct mips_set_options options;
12940 };
12941
12942 static struct mips_option_stack *mips_opts_stack;
12943
12944 /* Handle the .set pseudo-op.  */
12945
12946 static void
12947 s_mipsset (int x ATTRIBUTE_UNUSED)
12948 {
12949   char *name = input_line_pointer, ch;
12950
12951   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12952     ++input_line_pointer;
12953   ch = *input_line_pointer;
12954   *input_line_pointer = '\0';
12955
12956   if (strcmp (name, "reorder") == 0)
12957     {
12958       if (mips_opts.noreorder)
12959         end_noreorder ();
12960     }
12961   else if (strcmp (name, "noreorder") == 0)
12962     {
12963       if (!mips_opts.noreorder)
12964         start_noreorder ();
12965     }
12966   else if (strncmp (name, "at=", 3) == 0)
12967     {
12968       char *s = name + 3;
12969
12970       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12971         as_bad (_("Unrecognized register name `%s'"), s);
12972     }
12973   else if (strcmp (name, "at") == 0)
12974     {
12975       mips_opts.at = ATREG;
12976     }
12977   else if (strcmp (name, "noat") == 0)
12978     {
12979       mips_opts.at = ZERO;
12980     }
12981   else if (strcmp (name, "macro") == 0)
12982     {
12983       mips_opts.warn_about_macros = 0;
12984     }
12985   else if (strcmp (name, "nomacro") == 0)
12986     {
12987       if (mips_opts.noreorder == 0)
12988         as_bad (_("`noreorder' must be set before `nomacro'"));
12989       mips_opts.warn_about_macros = 1;
12990     }
12991   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12992     {
12993       mips_opts.nomove = 0;
12994     }
12995   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12996     {
12997       mips_opts.nomove = 1;
12998     }
12999   else if (strcmp (name, "bopt") == 0)
13000     {
13001       mips_opts.nobopt = 0;
13002     }
13003   else if (strcmp (name, "nobopt") == 0)
13004     {
13005       mips_opts.nobopt = 1;
13006     }
13007   else if (strcmp (name, "gp=default") == 0)
13008     mips_opts.gp32 = file_mips_gp32;
13009   else if (strcmp (name, "gp=32") == 0)
13010     mips_opts.gp32 = 1;
13011   else if (strcmp (name, "gp=64") == 0)
13012     {
13013       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13014         as_warn (_("%s isa does not support 64-bit registers"),
13015                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13016       mips_opts.gp32 = 0;
13017     }
13018   else if (strcmp (name, "fp=default") == 0)
13019     mips_opts.fp32 = file_mips_fp32;
13020   else if (strcmp (name, "fp=32") == 0)
13021     mips_opts.fp32 = 1;
13022   else if (strcmp (name, "fp=64") == 0)
13023     {
13024       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13025         as_warn (_("%s isa does not support 64-bit floating point registers"),
13026                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13027       mips_opts.fp32 = 0;
13028     }
13029   else if (strcmp (name, "softfloat") == 0)
13030     mips_opts.soft_float = 1;
13031   else if (strcmp (name, "hardfloat") == 0)
13032     mips_opts.soft_float = 0;
13033   else if (strcmp (name, "singlefloat") == 0)
13034     mips_opts.single_float = 1;
13035   else if (strcmp (name, "doublefloat") == 0)
13036     mips_opts.single_float = 0;
13037   else if (strcmp (name, "mips16") == 0
13038            || strcmp (name, "MIPS-16") == 0)
13039     mips_opts.mips16 = 1;
13040   else if (strcmp (name, "nomips16") == 0
13041            || strcmp (name, "noMIPS-16") == 0)
13042     mips_opts.mips16 = 0;
13043   else if (strcmp (name, "smartmips") == 0)
13044     {
13045       if (!ISA_SUPPORTS_SMARTMIPS)
13046         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13047                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13048       mips_opts.ase_smartmips = 1;
13049     }
13050   else if (strcmp (name, "nosmartmips") == 0)
13051     mips_opts.ase_smartmips = 0;
13052   else if (strcmp (name, "mips3d") == 0)
13053     mips_opts.ase_mips3d = 1;
13054   else if (strcmp (name, "nomips3d") == 0)
13055     mips_opts.ase_mips3d = 0;
13056   else if (strcmp (name, "mdmx") == 0)
13057     mips_opts.ase_mdmx = 1;
13058   else if (strcmp (name, "nomdmx") == 0)
13059     mips_opts.ase_mdmx = 0;
13060   else if (strcmp (name, "dsp") == 0)
13061     {
13062       if (!ISA_SUPPORTS_DSP_ASE)
13063         as_warn (_("%s ISA does not support DSP ASE"), 
13064                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13065       mips_opts.ase_dsp = 1;
13066       mips_opts.ase_dspr2 = 0;
13067     }
13068   else if (strcmp (name, "nodsp") == 0)
13069     {
13070       mips_opts.ase_dsp = 0;
13071       mips_opts.ase_dspr2 = 0;
13072     }
13073   else if (strcmp (name, "dspr2") == 0)
13074     {
13075       if (!ISA_SUPPORTS_DSPR2_ASE)
13076         as_warn (_("%s ISA does not support DSP R2 ASE"),
13077                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13078       mips_opts.ase_dspr2 = 1;
13079       mips_opts.ase_dsp = 1;
13080     }
13081   else if (strcmp (name, "nodspr2") == 0)
13082     {
13083       mips_opts.ase_dspr2 = 0;
13084       mips_opts.ase_dsp = 0;
13085     }
13086   else if (strcmp (name, "mt") == 0)
13087     {
13088       if (!ISA_SUPPORTS_MT_ASE)
13089         as_warn (_("%s ISA does not support MT ASE"), 
13090                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13091       mips_opts.ase_mt = 1;
13092     }
13093   else if (strcmp (name, "nomt") == 0)
13094     mips_opts.ase_mt = 0;
13095   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13096     {
13097       int reset = 0;
13098
13099       /* Permit the user to change the ISA and architecture on the fly.
13100          Needless to say, misuse can cause serious problems.  */
13101       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13102         {
13103           reset = 1;
13104           mips_opts.isa = file_mips_isa;
13105           mips_opts.arch = file_mips_arch;
13106         }
13107       else if (strncmp (name, "arch=", 5) == 0)
13108         {
13109           const struct mips_cpu_info *p;
13110
13111           p = mips_parse_cpu("internal use", name + 5);
13112           if (!p)
13113             as_bad (_("unknown architecture %s"), name + 5);
13114           else
13115             {
13116               mips_opts.arch = p->cpu;
13117               mips_opts.isa = p->isa;
13118             }
13119         }
13120       else if (strncmp (name, "mips", 4) == 0)
13121         {
13122           const struct mips_cpu_info *p;
13123
13124           p = mips_parse_cpu("internal use", name);
13125           if (!p)
13126             as_bad (_("unknown ISA level %s"), name + 4);
13127           else
13128             {
13129               mips_opts.arch = p->cpu;
13130               mips_opts.isa = p->isa;
13131             }
13132         }
13133       else
13134         as_bad (_("unknown ISA or architecture %s"), name);
13135
13136       switch (mips_opts.isa)
13137         {
13138         case  0:
13139           break;
13140         case ISA_MIPS1:
13141         case ISA_MIPS2:
13142         case ISA_MIPS32:
13143         case ISA_MIPS32R2:
13144           mips_opts.gp32 = 1;
13145           mips_opts.fp32 = 1;
13146           break;
13147         case ISA_MIPS3:
13148         case ISA_MIPS4:
13149         case ISA_MIPS5:
13150         case ISA_MIPS64:
13151         case ISA_MIPS64R2:
13152           mips_opts.gp32 = 0;
13153           mips_opts.fp32 = 0;
13154           break;
13155         default:
13156           as_bad (_("unknown ISA level %s"), name + 4);
13157           break;
13158         }
13159       if (reset)
13160         {
13161           mips_opts.gp32 = file_mips_gp32;
13162           mips_opts.fp32 = file_mips_fp32;
13163         }
13164     }
13165   else if (strcmp (name, "autoextend") == 0)
13166     mips_opts.noautoextend = 0;
13167   else if (strcmp (name, "noautoextend") == 0)
13168     mips_opts.noautoextend = 1;
13169   else if (strcmp (name, "push") == 0)
13170     {
13171       struct mips_option_stack *s;
13172
13173       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13174       s->next = mips_opts_stack;
13175       s->options = mips_opts;
13176       mips_opts_stack = s;
13177     }
13178   else if (strcmp (name, "pop") == 0)
13179     {
13180       struct mips_option_stack *s;
13181
13182       s = mips_opts_stack;
13183       if (s == NULL)
13184         as_bad (_(".set pop with no .set push"));
13185       else
13186         {
13187           /* If we're changing the reorder mode we need to handle
13188              delay slots correctly.  */
13189           if (s->options.noreorder && ! mips_opts.noreorder)
13190             start_noreorder ();
13191           else if (! s->options.noreorder && mips_opts.noreorder)
13192             end_noreorder ();
13193
13194           mips_opts = s->options;
13195           mips_opts_stack = s->next;
13196           free (s);
13197         }
13198     }
13199   else if (strcmp (name, "sym32") == 0)
13200     mips_opts.sym32 = TRUE;
13201   else if (strcmp (name, "nosym32") == 0)
13202     mips_opts.sym32 = FALSE;
13203   else if (strchr (name, ','))
13204     {
13205       /* Generic ".set" directive; use the generic handler.  */
13206       *input_line_pointer = ch;
13207       input_line_pointer = name;
13208       s_set (0);
13209       return;
13210     }
13211   else
13212     {
13213       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13214     }
13215   *input_line_pointer = ch;
13216   demand_empty_rest_of_line ();
13217 }
13218
13219 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13220    .option pic2.  It means to generate SVR4 PIC calls.  */
13221
13222 static void
13223 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13224 {
13225   mips_pic = SVR4_PIC;
13226   mips_abicalls = TRUE;
13227
13228   if (g_switch_seen && g_switch_value != 0)
13229     as_warn (_("-G may not be used with SVR4 PIC code"));
13230   g_switch_value = 0;
13231
13232   bfd_set_gp_size (stdoutput, 0);
13233   demand_empty_rest_of_line ();
13234 }
13235
13236 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13237    PIC code.  It sets the $gp register for the function based on the
13238    function address, which is in the register named in the argument.
13239    This uses a relocation against _gp_disp, which is handled specially
13240    by the linker.  The result is:
13241         lui     $gp,%hi(_gp_disp)
13242         addiu   $gp,$gp,%lo(_gp_disp)
13243         addu    $gp,$gp,.cpload argument
13244    The .cpload argument is normally $25 == $t9.
13245
13246    The -mno-shared option changes this to:
13247         lui     $gp,%hi(__gnu_local_gp)
13248         addiu   $gp,$gp,%lo(__gnu_local_gp)
13249    and the argument is ignored.  This saves an instruction, but the
13250    resulting code is not position independent; it uses an absolute
13251    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13252    can go into an ordinary executable, but not into a shared library.  */
13253
13254 static void
13255 s_cpload (int ignore ATTRIBUTE_UNUSED)
13256 {
13257   expressionS ex;
13258   int reg;
13259   int in_shared;
13260
13261   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13262      .cpload is ignored.  */
13263   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13264     {
13265       s_ignore (0);
13266       return;
13267     }
13268
13269   /* .cpload should be in a .set noreorder section.  */
13270   if (mips_opts.noreorder == 0)
13271     as_warn (_(".cpload not in noreorder section"));
13272
13273   reg = tc_get_register (0);
13274
13275   /* If we need to produce a 64-bit address, we are better off using
13276      the default instruction sequence.  */
13277   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13278
13279   ex.X_op = O_symbol;
13280   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13281                                          "__gnu_local_gp");
13282   ex.X_op_symbol = NULL;
13283   ex.X_add_number = 0;
13284
13285   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13286   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13287
13288   macro_start ();
13289   macro_build_lui (&ex, mips_gp_register);
13290   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13291                mips_gp_register, BFD_RELOC_LO16);
13292   if (in_shared)
13293     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13294                  mips_gp_register, reg);
13295   macro_end ();
13296
13297   demand_empty_rest_of_line ();
13298 }
13299
13300 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13301      .cpsetup $reg1, offset|$reg2, label
13302
13303    If offset is given, this results in:
13304      sd         $gp, offset($sp)
13305      lui        $gp, %hi(%neg(%gp_rel(label)))
13306      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13307      daddu      $gp, $gp, $reg1
13308
13309    If $reg2 is given, this results in:
13310      daddu      $reg2, $gp, $0
13311      lui        $gp, %hi(%neg(%gp_rel(label)))
13312      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13313      daddu      $gp, $gp, $reg1
13314    $reg1 is normally $25 == $t9.
13315
13316    The -mno-shared option replaces the last three instructions with
13317         lui     $gp,%hi(_gp)
13318         addiu   $gp,$gp,%lo(_gp)  */
13319
13320 static void
13321 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13322 {
13323   expressionS ex_off;
13324   expressionS ex_sym;
13325   int reg1;
13326
13327   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13328      We also need NewABI support.  */
13329   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13330     {
13331       s_ignore (0);
13332       return;
13333     }
13334
13335   reg1 = tc_get_register (0);
13336   SKIP_WHITESPACE ();
13337   if (*input_line_pointer != ',')
13338     {
13339       as_bad (_("missing argument separator ',' for .cpsetup"));
13340       return;
13341     }
13342   else
13343     ++input_line_pointer;
13344   SKIP_WHITESPACE ();
13345   if (*input_line_pointer == '$')
13346     {
13347       mips_cpreturn_register = tc_get_register (0);
13348       mips_cpreturn_offset = -1;
13349     }
13350   else
13351     {
13352       mips_cpreturn_offset = get_absolute_expression ();
13353       mips_cpreturn_register = -1;
13354     }
13355   SKIP_WHITESPACE ();
13356   if (*input_line_pointer != ',')
13357     {
13358       as_bad (_("missing argument separator ',' for .cpsetup"));
13359       return;
13360     }
13361   else
13362     ++input_line_pointer;
13363   SKIP_WHITESPACE ();
13364   expression (&ex_sym);
13365
13366   macro_start ();
13367   if (mips_cpreturn_register == -1)
13368     {
13369       ex_off.X_op = O_constant;
13370       ex_off.X_add_symbol = NULL;
13371       ex_off.X_op_symbol = NULL;
13372       ex_off.X_add_number = mips_cpreturn_offset;
13373
13374       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13375                    BFD_RELOC_LO16, SP);
13376     }
13377   else
13378     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13379                  mips_gp_register, 0);
13380
13381   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13382     {
13383       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13384                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13385                    BFD_RELOC_HI16_S);
13386
13387       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13388                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13389                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13390
13391       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13392                    mips_gp_register, reg1);
13393     }
13394   else
13395     {
13396       expressionS ex;
13397
13398       ex.X_op = O_symbol;
13399       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13400       ex.X_op_symbol = NULL;
13401       ex.X_add_number = 0;
13402
13403       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13404       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13405
13406       macro_build_lui (&ex, mips_gp_register);
13407       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13408                    mips_gp_register, BFD_RELOC_LO16);
13409     }
13410
13411   macro_end ();
13412
13413   demand_empty_rest_of_line ();
13414 }
13415
13416 static void
13417 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13418 {
13419   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13420      .cplocal is ignored.  */
13421   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13422     {
13423       s_ignore (0);
13424       return;
13425     }
13426
13427   mips_gp_register = tc_get_register (0);
13428   demand_empty_rest_of_line ();
13429 }
13430
13431 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13432    offset from $sp.  The offset is remembered, and after making a PIC
13433    call $gp is restored from that location.  */
13434
13435 static void
13436 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13437 {
13438   expressionS ex;
13439
13440   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13441      .cprestore is ignored.  */
13442   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13443     {
13444       s_ignore (0);
13445       return;
13446     }
13447
13448   mips_cprestore_offset = get_absolute_expression ();
13449   mips_cprestore_valid = 1;
13450
13451   ex.X_op = O_constant;
13452   ex.X_add_symbol = NULL;
13453   ex.X_op_symbol = NULL;
13454   ex.X_add_number = mips_cprestore_offset;
13455
13456   macro_start ();
13457   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13458                                 SP, HAVE_64BIT_ADDRESSES);
13459   macro_end ();
13460
13461   demand_empty_rest_of_line ();
13462 }
13463
13464 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13465    was given in the preceding .cpsetup, it results in:
13466      ld         $gp, offset($sp)
13467
13468    If a register $reg2 was given there, it results in:
13469      daddu      $gp, $reg2, $0  */
13470
13471 static void
13472 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13473 {
13474   expressionS ex;
13475
13476   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13477      We also need NewABI support.  */
13478   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13479     {
13480       s_ignore (0);
13481       return;
13482     }
13483
13484   macro_start ();
13485   if (mips_cpreturn_register == -1)
13486     {
13487       ex.X_op = O_constant;
13488       ex.X_add_symbol = NULL;
13489       ex.X_op_symbol = NULL;
13490       ex.X_add_number = mips_cpreturn_offset;
13491
13492       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13493     }
13494   else
13495     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13496                  mips_cpreturn_register, 0);
13497   macro_end ();
13498
13499   demand_empty_rest_of_line ();
13500 }
13501
13502 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13503    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13504    use in DWARF debug information.  */
13505
13506 static void
13507 s_dtprel_internal (size_t bytes)
13508 {
13509   expressionS ex;
13510   char *p;
13511
13512   expression (&ex);
13513
13514   if (ex.X_op != O_symbol)
13515     {
13516       as_bad (_("Unsupported use of %s"), (bytes == 8
13517                                            ? ".dtpreldword"
13518                                            : ".dtprelword"));
13519       ignore_rest_of_line ();
13520     }
13521
13522   p = frag_more (bytes);
13523   md_number_to_chars (p, 0, bytes);
13524   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13525                (bytes == 8
13526                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13527                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13528
13529   demand_empty_rest_of_line ();
13530 }
13531
13532 /* Handle .dtprelword.  */
13533
13534 static void
13535 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13536 {
13537   s_dtprel_internal (4);
13538 }
13539
13540 /* Handle .dtpreldword.  */
13541
13542 static void
13543 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13544 {
13545   s_dtprel_internal (8);
13546 }
13547
13548 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13549    code.  It sets the offset to use in gp_rel relocations.  */
13550
13551 static void
13552 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13553 {
13554   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13555      We also need NewABI support.  */
13556   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13557     {
13558       s_ignore (0);
13559       return;
13560     }
13561
13562   mips_gprel_offset = get_absolute_expression ();
13563
13564   demand_empty_rest_of_line ();
13565 }
13566
13567 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13568    code.  It generates a 32 bit GP relative reloc.  */
13569
13570 static void
13571 s_gpword (int ignore ATTRIBUTE_UNUSED)
13572 {
13573   segment_info_type *si;
13574   struct insn_label_list *l;
13575   symbolS *label;
13576   expressionS ex;
13577   char *p;
13578
13579   /* When not generating PIC code, this is treated as .word.  */
13580   if (mips_pic != SVR4_PIC)
13581     {
13582       s_cons (2);
13583       return;
13584     }
13585
13586   si = seg_info (now_seg);
13587   l = si->label_list;
13588   label = l != NULL ? l->label : NULL;
13589   mips_emit_delays ();
13590   if (auto_align)
13591     mips_align (2, 0, label);
13592
13593   expression (&ex);
13594   mips_clear_insn_labels ();
13595
13596   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13597     {
13598       as_bad (_("Unsupported use of .gpword"));
13599       ignore_rest_of_line ();
13600     }
13601
13602   p = frag_more (4);
13603   md_number_to_chars (p, 0, 4);
13604   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13605                BFD_RELOC_GPREL32);
13606
13607   demand_empty_rest_of_line ();
13608 }
13609
13610 static void
13611 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13612 {
13613   segment_info_type *si;
13614   struct insn_label_list *l;
13615   symbolS *label;
13616   expressionS ex;
13617   char *p;
13618
13619   /* When not generating PIC code, this is treated as .dword.  */
13620   if (mips_pic != SVR4_PIC)
13621     {
13622       s_cons (3);
13623       return;
13624     }
13625
13626   si = seg_info (now_seg);
13627   l = si->label_list;
13628   label = l != NULL ? l->label : NULL;
13629   mips_emit_delays ();
13630   if (auto_align)
13631     mips_align (3, 0, label);
13632
13633   expression (&ex);
13634   mips_clear_insn_labels ();
13635
13636   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13637     {
13638       as_bad (_("Unsupported use of .gpdword"));
13639       ignore_rest_of_line ();
13640     }
13641
13642   p = frag_more (8);
13643   md_number_to_chars (p, 0, 8);
13644   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13645                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13646
13647   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13648   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13649            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13650
13651   demand_empty_rest_of_line ();
13652 }
13653
13654 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13655    tables in SVR4 PIC code.  */
13656
13657 static void
13658 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13659 {
13660   int reg;
13661
13662   /* This is ignored when not generating SVR4 PIC code.  */
13663   if (mips_pic != SVR4_PIC)
13664     {
13665       s_ignore (0);
13666       return;
13667     }
13668
13669   /* Add $gp to the register named as an argument.  */
13670   macro_start ();
13671   reg = tc_get_register (0);
13672   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13673   macro_end ();
13674
13675   demand_empty_rest_of_line ();
13676 }
13677
13678 /* Handle the .insn pseudo-op.  This marks instruction labels in
13679    mips16 mode.  This permits the linker to handle them specially,
13680    such as generating jalx instructions when needed.  We also make
13681    them odd for the duration of the assembly, in order to generate the
13682    right sort of code.  We will make them even in the adjust_symtab
13683    routine, while leaving them marked.  This is convenient for the
13684    debugger and the disassembler.  The linker knows to make them odd
13685    again.  */
13686
13687 static void
13688 s_insn (int ignore ATTRIBUTE_UNUSED)
13689 {
13690   mips16_mark_labels ();
13691
13692   demand_empty_rest_of_line ();
13693 }
13694
13695 /* Handle a .stabn directive.  We need these in order to mark a label
13696    as being a mips16 text label correctly.  Sometimes the compiler
13697    will emit a label, followed by a .stabn, and then switch sections.
13698    If the label and .stabn are in mips16 mode, then the label is
13699    really a mips16 text label.  */
13700
13701 static void
13702 s_mips_stab (int type)
13703 {
13704   if (type == 'n')
13705     mips16_mark_labels ();
13706
13707   s_stab (type);
13708 }
13709
13710 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13711
13712 static void
13713 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13714 {
13715   char *name;
13716   int c;
13717   symbolS *symbolP;
13718   expressionS exp;
13719
13720   name = input_line_pointer;
13721   c = get_symbol_end ();
13722   symbolP = symbol_find_or_make (name);
13723   S_SET_WEAK (symbolP);
13724   *input_line_pointer = c;
13725
13726   SKIP_WHITESPACE ();
13727
13728   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13729     {
13730       if (S_IS_DEFINED (symbolP))
13731         {
13732           as_bad (_("ignoring attempt to redefine symbol %s"),
13733                   S_GET_NAME (symbolP));
13734           ignore_rest_of_line ();
13735           return;
13736         }
13737
13738       if (*input_line_pointer == ',')
13739         {
13740           ++input_line_pointer;
13741           SKIP_WHITESPACE ();
13742         }
13743
13744       expression (&exp);
13745       if (exp.X_op != O_symbol)
13746         {
13747           as_bad (_("bad .weakext directive"));
13748           ignore_rest_of_line ();
13749           return;
13750         }
13751       symbol_set_value_expression (symbolP, &exp);
13752     }
13753
13754   demand_empty_rest_of_line ();
13755 }
13756
13757 /* Parse a register string into a number.  Called from the ECOFF code
13758    to parse .frame.  The argument is non-zero if this is the frame
13759    register, so that we can record it in mips_frame_reg.  */
13760
13761 int
13762 tc_get_register (int frame)
13763 {
13764   unsigned int reg;
13765
13766   SKIP_WHITESPACE ();
13767   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13768     reg = 0;
13769   if (frame)
13770     {
13771       mips_frame_reg = reg != 0 ? reg : SP;
13772       mips_frame_reg_valid = 1;
13773       mips_cprestore_valid = 0;
13774     }
13775   return reg;
13776 }
13777
13778 valueT
13779 md_section_align (asection *seg, valueT addr)
13780 {
13781   int align = bfd_get_section_alignment (stdoutput, seg);
13782
13783   if (IS_ELF)
13784     {
13785       /* We don't need to align ELF sections to the full alignment.
13786          However, Irix 5 may prefer that we align them at least to a 16
13787          byte boundary.  We don't bother to align the sections if we
13788          are targeted for an embedded system.  */
13789       if (strncmp (TARGET_OS, "elf", 3) == 0)
13790         return addr;
13791       if (align > 4)
13792         align = 4;
13793     }
13794
13795   return ((addr + (1 << align) - 1) & (-1 << align));
13796 }
13797
13798 /* Utility routine, called from above as well.  If called while the
13799    input file is still being read, it's only an approximation.  (For
13800    example, a symbol may later become defined which appeared to be
13801    undefined earlier.)  */
13802
13803 static int
13804 nopic_need_relax (symbolS *sym, int before_relaxing)
13805 {
13806   if (sym == 0)
13807     return 0;
13808
13809   if (g_switch_value > 0)
13810     {
13811       const char *symname;
13812       int change;
13813
13814       /* Find out whether this symbol can be referenced off the $gp
13815          register.  It can be if it is smaller than the -G size or if
13816          it is in the .sdata or .sbss section.  Certain symbols can
13817          not be referenced off the $gp, although it appears as though
13818          they can.  */
13819       symname = S_GET_NAME (sym);
13820       if (symname != (const char *) NULL
13821           && (strcmp (symname, "eprol") == 0
13822               || strcmp (symname, "etext") == 0
13823               || strcmp (symname, "_gp") == 0
13824               || strcmp (symname, "edata") == 0
13825               || strcmp (symname, "_fbss") == 0
13826               || strcmp (symname, "_fdata") == 0
13827               || strcmp (symname, "_ftext") == 0
13828               || strcmp (symname, "end") == 0
13829               || strcmp (symname, "_gp_disp") == 0))
13830         change = 1;
13831       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13832                && (0
13833 #ifndef NO_ECOFF_DEBUGGING
13834                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13835                        && (symbol_get_obj (sym)->ecoff_extern_size
13836                            <= g_switch_value))
13837 #endif
13838                    /* We must defer this decision until after the whole
13839                       file has been read, since there might be a .extern
13840                       after the first use of this symbol.  */
13841                    || (before_relaxing
13842 #ifndef NO_ECOFF_DEBUGGING
13843                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13844 #endif
13845                        && S_GET_VALUE (sym) == 0)
13846                    || (S_GET_VALUE (sym) != 0
13847                        && S_GET_VALUE (sym) <= g_switch_value)))
13848         change = 0;
13849       else
13850         {
13851           const char *segname;
13852
13853           segname = segment_name (S_GET_SEGMENT (sym));
13854           gas_assert (strcmp (segname, ".lit8") != 0
13855                   && strcmp (segname, ".lit4") != 0);
13856           change = (strcmp (segname, ".sdata") != 0
13857                     && strcmp (segname, ".sbss") != 0
13858                     && strncmp (segname, ".sdata.", 7) != 0
13859                     && strncmp (segname, ".sbss.", 6) != 0
13860                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13861                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13862         }
13863       return change;
13864     }
13865   else
13866     /* We are not optimizing for the $gp register.  */
13867     return 1;
13868 }
13869
13870
13871 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13872
13873 static bfd_boolean
13874 pic_need_relax (symbolS *sym, asection *segtype)
13875 {
13876   asection *symsec;
13877
13878   /* Handle the case of a symbol equated to another symbol.  */
13879   while (symbol_equated_reloc_p (sym))
13880     {
13881       symbolS *n;
13882
13883       /* It's possible to get a loop here in a badly written program.  */
13884       n = symbol_get_value_expression (sym)->X_add_symbol;
13885       if (n == sym)
13886         break;
13887       sym = n;
13888     }
13889
13890   if (symbol_section_p (sym))
13891     return TRUE;
13892
13893   symsec = S_GET_SEGMENT (sym);
13894
13895   /* This must duplicate the test in adjust_reloc_syms.  */
13896   return (symsec != &bfd_und_section
13897           && symsec != &bfd_abs_section
13898           && !bfd_is_com_section (symsec)
13899           && !s_is_linkonce (sym, segtype)
13900 #ifdef OBJ_ELF
13901           /* A global or weak symbol is treated as external.  */
13902           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13903 #endif
13904           );
13905 }
13906
13907
13908 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13909    extended opcode.  SEC is the section the frag is in.  */
13910
13911 static int
13912 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13913 {
13914   int type;
13915   const struct mips16_immed_operand *op;
13916   offsetT val;
13917   int mintiny, maxtiny;
13918   segT symsec;
13919   fragS *sym_frag;
13920
13921   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13922     return 0;
13923   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13924     return 1;
13925
13926   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13927   op = mips16_immed_operands;
13928   while (op->type != type)
13929     {
13930       ++op;
13931       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13932     }
13933
13934   if (op->unsp)
13935     {
13936       if (type == '<' || type == '>' || type == '[' || type == ']')
13937         {
13938           mintiny = 1;
13939           maxtiny = 1 << op->nbits;
13940         }
13941       else
13942         {
13943           mintiny = 0;
13944           maxtiny = (1 << op->nbits) - 1;
13945         }
13946     }
13947   else
13948     {
13949       mintiny = - (1 << (op->nbits - 1));
13950       maxtiny = (1 << (op->nbits - 1)) - 1;
13951     }
13952
13953   sym_frag = symbol_get_frag (fragp->fr_symbol);
13954   val = S_GET_VALUE (fragp->fr_symbol);
13955   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13956
13957   if (op->pcrel)
13958     {
13959       addressT addr;
13960
13961       /* We won't have the section when we are called from
13962          mips_relax_frag.  However, we will always have been called
13963          from md_estimate_size_before_relax first.  If this is a
13964          branch to a different section, we mark it as such.  If SEC is
13965          NULL, and the frag is not marked, then it must be a branch to
13966          the same section.  */
13967       if (sec == NULL)
13968         {
13969           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13970             return 1;
13971         }
13972       else
13973         {
13974           /* Must have been called from md_estimate_size_before_relax.  */
13975           if (symsec != sec)
13976             {
13977               fragp->fr_subtype =
13978                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13979
13980               /* FIXME: We should support this, and let the linker
13981                  catch branches and loads that are out of range.  */
13982               as_bad_where (fragp->fr_file, fragp->fr_line,
13983                             _("unsupported PC relative reference to different section"));
13984
13985               return 1;
13986             }
13987           if (fragp != sym_frag && sym_frag->fr_address == 0)
13988             /* Assume non-extended on the first relaxation pass.
13989                The address we have calculated will be bogus if this is
13990                a forward branch to another frag, as the forward frag
13991                will have fr_address == 0.  */
13992             return 0;
13993         }
13994
13995       /* In this case, we know for sure that the symbol fragment is in
13996          the same section.  If the relax_marker of the symbol fragment
13997          differs from the relax_marker of this fragment, we have not
13998          yet adjusted the symbol fragment fr_address.  We want to add
13999          in STRETCH in order to get a better estimate of the address.
14000          This particularly matters because of the shift bits.  */
14001       if (stretch != 0
14002           && sym_frag->relax_marker != fragp->relax_marker)
14003         {
14004           fragS *f;
14005
14006           /* Adjust stretch for any alignment frag.  Note that if have
14007              been expanding the earlier code, the symbol may be
14008              defined in what appears to be an earlier frag.  FIXME:
14009              This doesn't handle the fr_subtype field, which specifies
14010              a maximum number of bytes to skip when doing an
14011              alignment.  */
14012           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14013             {
14014               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14015                 {
14016                   if (stretch < 0)
14017                     stretch = - ((- stretch)
14018                                  & ~ ((1 << (int) f->fr_offset) - 1));
14019                   else
14020                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14021                   if (stretch == 0)
14022                     break;
14023                 }
14024             }
14025           if (f != NULL)
14026             val += stretch;
14027         }
14028
14029       addr = fragp->fr_address + fragp->fr_fix;
14030
14031       /* The base address rules are complicated.  The base address of
14032          a branch is the following instruction.  The base address of a
14033          PC relative load or add is the instruction itself, but if it
14034          is in a delay slot (in which case it can not be extended) use
14035          the address of the instruction whose delay slot it is in.  */
14036       if (type == 'p' || type == 'q')
14037         {
14038           addr += 2;
14039
14040           /* If we are currently assuming that this frag should be
14041              extended, then, the current address is two bytes
14042              higher.  */
14043           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14044             addr += 2;
14045
14046           /* Ignore the low bit in the target, since it will be set
14047              for a text label.  */
14048           if ((val & 1) != 0)
14049             --val;
14050         }
14051       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14052         addr -= 4;
14053       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14054         addr -= 2;
14055
14056       val -= addr & ~ ((1 << op->shift) - 1);
14057
14058       /* Branch offsets have an implicit 0 in the lowest bit.  */
14059       if (type == 'p' || type == 'q')
14060         val /= 2;
14061
14062       /* If any of the shifted bits are set, we must use an extended
14063          opcode.  If the address depends on the size of this
14064          instruction, this can lead to a loop, so we arrange to always
14065          use an extended opcode.  We only check this when we are in
14066          the main relaxation loop, when SEC is NULL.  */
14067       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14068         {
14069           fragp->fr_subtype =
14070             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14071           return 1;
14072         }
14073
14074       /* If we are about to mark a frag as extended because the value
14075          is precisely maxtiny + 1, then there is a chance of an
14076          infinite loop as in the following code:
14077              la $4,foo
14078              .skip      1020
14079              .align     2
14080            foo:
14081          In this case when the la is extended, foo is 0x3fc bytes
14082          away, so the la can be shrunk, but then foo is 0x400 away, so
14083          the la must be extended.  To avoid this loop, we mark the
14084          frag as extended if it was small, and is about to become
14085          extended with a value of maxtiny + 1.  */
14086       if (val == ((maxtiny + 1) << op->shift)
14087           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14088           && sec == NULL)
14089         {
14090           fragp->fr_subtype =
14091             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14092           return 1;
14093         }
14094     }
14095   else if (symsec != absolute_section && sec != NULL)
14096     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14097
14098   if ((val & ((1 << op->shift) - 1)) != 0
14099       || val < (mintiny << op->shift)
14100       || val > (maxtiny << op->shift))
14101     return 1;
14102   else
14103     return 0;
14104 }
14105
14106 /* Compute the length of a branch sequence, and adjust the
14107    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14108    worst-case length is computed, with UPDATE being used to indicate
14109    whether an unconditional (-1), branch-likely (+1) or regular (0)
14110    branch is to be computed.  */
14111 static int
14112 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14113 {
14114   bfd_boolean toofar;
14115   int length;
14116
14117   if (fragp
14118       && S_IS_DEFINED (fragp->fr_symbol)
14119       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14120     {
14121       addressT addr;
14122       offsetT val;
14123
14124       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14125
14126       addr = fragp->fr_address + fragp->fr_fix + 4;
14127
14128       val -= addr;
14129
14130       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14131     }
14132   else if (fragp)
14133     /* If the symbol is not defined or it's in a different segment,
14134        assume the user knows what's going on and emit a short
14135        branch.  */
14136     toofar = FALSE;
14137   else
14138     toofar = TRUE;
14139
14140   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14141     fragp->fr_subtype
14142       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14143                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14144                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14145                              toofar);
14146
14147   length = 4;
14148   if (toofar)
14149     {
14150       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14151         length += 8;
14152
14153       if (mips_pic != NO_PIC)
14154         {
14155           /* Additional space for PIC loading of target address.  */
14156           length += 8;
14157           if (mips_opts.isa == ISA_MIPS1)
14158             /* Additional space for $at-stabilizing nop.  */
14159             length += 4;
14160         }
14161
14162       /* If branch is conditional.  */
14163       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14164         length += 8;
14165     }
14166
14167   return length;
14168 }
14169
14170 /* Estimate the size of a frag before relaxing.  Unless this is the
14171    mips16, we are not really relaxing here, and the final size is
14172    encoded in the subtype information.  For the mips16, we have to
14173    decide whether we are using an extended opcode or not.  */
14174
14175 int
14176 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14177 {
14178   int change;
14179
14180   if (RELAX_BRANCH_P (fragp->fr_subtype))
14181     {
14182
14183       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14184
14185       return fragp->fr_var;
14186     }
14187
14188   if (RELAX_MIPS16_P (fragp->fr_subtype))
14189     /* We don't want to modify the EXTENDED bit here; it might get us
14190        into infinite loops.  We change it only in mips_relax_frag().  */
14191     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14192
14193   if (mips_pic == NO_PIC)
14194     change = nopic_need_relax (fragp->fr_symbol, 0);
14195   else if (mips_pic == SVR4_PIC)
14196     change = pic_need_relax (fragp->fr_symbol, segtype);
14197   else if (mips_pic == VXWORKS_PIC)
14198     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14199     change = 0;
14200   else
14201     abort ();
14202
14203   if (change)
14204     {
14205       fragp->fr_subtype |= RELAX_USE_SECOND;
14206       return -RELAX_FIRST (fragp->fr_subtype);
14207     }
14208   else
14209     return -RELAX_SECOND (fragp->fr_subtype);
14210 }
14211
14212 /* This is called to see whether a reloc against a defined symbol
14213    should be converted into a reloc against a section.  */
14214
14215 int
14216 mips_fix_adjustable (fixS *fixp)
14217 {
14218   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14219       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14220     return 0;
14221
14222   if (fixp->fx_addsy == NULL)
14223     return 1;
14224
14225   /* If symbol SYM is in a mergeable section, relocations of the form
14226      SYM + 0 can usually be made section-relative.  The mergeable data
14227      is then identified by the section offset rather than by the symbol.
14228
14229      However, if we're generating REL LO16 relocations, the offset is split
14230      between the LO16 and parterning high part relocation.  The linker will
14231      need to recalculate the complete offset in order to correctly identify
14232      the merge data.
14233
14234      The linker has traditionally not looked for the parterning high part
14235      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14236      placed anywhere.  Rather than break backwards compatibility by changing
14237      this, it seems better not to force the issue, and instead keep the
14238      original symbol.  This will work with either linker behavior.  */
14239   if ((lo16_reloc_p (fixp->fx_r_type)
14240        || reloc_needs_lo_p (fixp->fx_r_type))
14241       && HAVE_IN_PLACE_ADDENDS
14242       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14243     return 0;
14244
14245   /* There is no place to store an in-place offset for JALR relocations.  */
14246   if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14247     return 0;
14248
14249 #ifdef OBJ_ELF
14250   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14251      to a floating-point stub.  The same is true for non-R_MIPS16_26
14252      relocations against MIPS16 functions; in this case, the stub becomes
14253      the function's canonical address.
14254
14255      Floating-point stubs are stored in unique .mips16.call.* or
14256      .mips16.fn.* sections.  If a stub T for function F is in section S,
14257      the first relocation in section S must be against F; this is how the
14258      linker determines the target function.  All relocations that might
14259      resolve to T must also be against F.  We therefore have the following
14260      restrictions, which are given in an intentionally-redundant way:
14261
14262        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14263           symbols.
14264
14265        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14266           if that stub might be used.
14267
14268        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14269           symbols.
14270
14271        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14272           that stub might be used.
14273
14274      There is a further restriction:
14275
14276        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14277           on targets with in-place addends; the relocation field cannot
14278           encode the low bit.
14279
14280      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14281      against a MIPS16 symbol.
14282
14283      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14284      relocation against some symbol R, no relocation against R may be
14285      reduced.  (Note that this deals with (2) as well as (1) because
14286      relocations against global symbols will never be reduced on ELF
14287      targets.)  This approach is a little simpler than trying to detect
14288      stub sections, and gives the "all or nothing" per-symbol consistency
14289      that we have for MIPS16 symbols.  */
14290   if (IS_ELF
14291       && fixp->fx_subsy == NULL
14292       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14293           || *symbol_get_tc (fixp->fx_addsy)))
14294     return 0;
14295 #endif
14296
14297   return 1;
14298 }
14299
14300 /* Translate internal representation of relocation info to BFD target
14301    format.  */
14302
14303 arelent **
14304 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14305 {
14306   static arelent *retval[4];
14307   arelent *reloc;
14308   bfd_reloc_code_real_type code;
14309
14310   memset (retval, 0, sizeof(retval));
14311   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14312   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14313   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14314   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14315
14316   if (fixp->fx_pcrel)
14317     {
14318       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14319
14320       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14321          Relocations want only the symbol offset.  */
14322       reloc->addend = fixp->fx_addnumber + reloc->address;
14323       if (!IS_ELF)
14324         {
14325           /* A gruesome hack which is a result of the gruesome gas
14326              reloc handling.  What's worse, for COFF (as opposed to
14327              ECOFF), we might need yet another copy of reloc->address.
14328              See bfd_install_relocation.  */
14329           reloc->addend += reloc->address;
14330         }
14331     }
14332   else
14333     reloc->addend = fixp->fx_addnumber;
14334
14335   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14336      entry to be used in the relocation's section offset.  */
14337   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14338     {
14339       reloc->address = reloc->addend;
14340       reloc->addend = 0;
14341     }
14342
14343   code = fixp->fx_r_type;
14344
14345   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14346   if (reloc->howto == NULL)
14347     {
14348       as_bad_where (fixp->fx_file, fixp->fx_line,
14349                     _("Can not represent %s relocation in this object file format"),
14350                     bfd_get_reloc_code_name (code));
14351       retval[0] = NULL;
14352     }
14353
14354   return retval;
14355 }
14356
14357 /* Relax a machine dependent frag.  This returns the amount by which
14358    the current size of the frag should change.  */
14359
14360 int
14361 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14362 {
14363   if (RELAX_BRANCH_P (fragp->fr_subtype))
14364     {
14365       offsetT old_var = fragp->fr_var;
14366
14367       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14368
14369       return fragp->fr_var - old_var;
14370     }
14371
14372   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14373     return 0;
14374
14375   if (mips16_extended_frag (fragp, NULL, stretch))
14376     {
14377       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14378         return 0;
14379       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14380       return 2;
14381     }
14382   else
14383     {
14384       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14385         return 0;
14386       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14387       return -2;
14388     }
14389
14390   return 0;
14391 }
14392
14393 /* Convert a machine dependent frag.  */
14394
14395 void
14396 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14397 {
14398   if (RELAX_BRANCH_P (fragp->fr_subtype))
14399     {
14400       bfd_byte *buf;
14401       unsigned long insn;
14402       expressionS exp;
14403       fixS *fixp;
14404
14405       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14406
14407       if (target_big_endian)
14408         insn = bfd_getb32 (buf);
14409       else
14410         insn = bfd_getl32 (buf);
14411
14412       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14413         {
14414           /* We generate a fixup instead of applying it right now
14415              because, if there are linker relaxations, we're going to
14416              need the relocations.  */
14417           exp.X_op = O_symbol;
14418           exp.X_add_symbol = fragp->fr_symbol;
14419           exp.X_add_number = fragp->fr_offset;
14420
14421           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14422                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14423           fixp->fx_file = fragp->fr_file;
14424           fixp->fx_line = fragp->fr_line;
14425
14426           md_number_to_chars ((char *) buf, insn, 4);
14427           buf += 4;
14428         }
14429       else
14430         {
14431           int i;
14432
14433           as_warn_where (fragp->fr_file, fragp->fr_line,
14434                          _("relaxed out-of-range branch into a jump"));
14435
14436           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14437             goto uncond;
14438
14439           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14440             {
14441               /* Reverse the branch.  */
14442               switch ((insn >> 28) & 0xf)
14443                 {
14444                 case 4:
14445                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14446                      have the condition reversed by tweaking a single
14447                      bit, and their opcodes all have 0x4???????.  */
14448                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14449                   insn ^= 0x00010000;
14450                   break;
14451
14452                 case 0:
14453                   /* bltz       0x04000000      bgez    0x04010000
14454                      bltzal     0x04100000      bgezal  0x04110000  */
14455                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14456                   insn ^= 0x00010000;
14457                   break;
14458
14459                 case 1:
14460                   /* beq        0x10000000      bne     0x14000000
14461                      blez       0x18000000      bgtz    0x1c000000  */
14462                   insn ^= 0x04000000;
14463                   break;
14464
14465                 default:
14466                   abort ();
14467                 }
14468             }
14469
14470           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14471             {
14472               /* Clear the and-link bit.  */
14473               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14474
14475               /* bltzal         0x04100000      bgezal  0x04110000
14476                  bltzall        0x04120000      bgezall 0x04130000  */
14477               insn &= ~0x00100000;
14478             }
14479
14480           /* Branch over the branch (if the branch was likely) or the
14481              full jump (not likely case).  Compute the offset from the
14482              current instruction to branch to.  */
14483           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14484             i = 16;
14485           else
14486             {
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             }
14492           /* Convert to instruction count.  */
14493           i >>= 2;
14494           /* Branch counts from the next instruction.  */
14495           i--;
14496           insn |= i;
14497           /* Branch over the jump.  */
14498           md_number_to_chars ((char *) buf, insn, 4);
14499           buf += 4;
14500
14501           /* nop */
14502           md_number_to_chars ((char *) buf, 0, 4);
14503           buf += 4;
14504
14505           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14506             {
14507               /* beql $0, $0, 2f */
14508               insn = 0x50000000;
14509               /* Compute the PC offset from the current instruction to
14510                  the end of the variable frag.  */
14511               /* How many bytes in instructions we've already emitted?  */
14512               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14513               /* How many bytes in instructions from here to the end?  */
14514               i = fragp->fr_var - i;
14515               /* Convert to instruction count.  */
14516               i >>= 2;
14517               /* Don't decrement i, because we want to branch over the
14518                  delay slot.  */
14519
14520               insn |= i;
14521               md_number_to_chars ((char *) buf, insn, 4);
14522               buf += 4;
14523
14524               md_number_to_chars ((char *) buf, 0, 4);
14525               buf += 4;
14526             }
14527
14528         uncond:
14529           if (mips_pic == NO_PIC)
14530             {
14531               /* j or jal.  */
14532               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14533                       ? 0x0c000000 : 0x08000000);
14534               exp.X_op = O_symbol;
14535               exp.X_add_symbol = fragp->fr_symbol;
14536               exp.X_add_number = fragp->fr_offset;
14537
14538               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14539                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14540               fixp->fx_file = fragp->fr_file;
14541               fixp->fx_line = fragp->fr_line;
14542
14543               md_number_to_chars ((char *) buf, insn, 4);
14544               buf += 4;
14545             }
14546           else
14547             {
14548               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14549               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14550               exp.X_op = O_symbol;
14551               exp.X_add_symbol = fragp->fr_symbol;
14552               exp.X_add_number = fragp->fr_offset;
14553
14554               if (fragp->fr_offset)
14555                 {
14556                   exp.X_add_symbol = make_expr_symbol (&exp);
14557                   exp.X_add_number = 0;
14558                 }
14559
14560               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14561                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14562               fixp->fx_file = fragp->fr_file;
14563               fixp->fx_line = fragp->fr_line;
14564
14565               md_number_to_chars ((char *) buf, insn, 4);
14566               buf += 4;
14567
14568               if (mips_opts.isa == ISA_MIPS1)
14569                 {
14570                   /* nop */
14571                   md_number_to_chars ((char *) buf, 0, 4);
14572                   buf += 4;
14573                 }
14574
14575               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14576               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14577
14578               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14579                                   4, &exp, FALSE, BFD_RELOC_LO16);
14580               fixp->fx_file = fragp->fr_file;
14581               fixp->fx_line = fragp->fr_line;
14582
14583               md_number_to_chars ((char *) buf, insn, 4);
14584               buf += 4;
14585
14586               /* j(al)r $at.  */
14587               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14588                 insn = 0x0020f809;
14589               else
14590                 insn = 0x00200008;
14591
14592               md_number_to_chars ((char *) buf, insn, 4);
14593               buf += 4;
14594             }
14595         }
14596
14597       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14598               + fragp->fr_fix + fragp->fr_var);
14599
14600       fragp->fr_fix += fragp->fr_var;
14601
14602       return;
14603     }
14604
14605   if (RELAX_MIPS16_P (fragp->fr_subtype))
14606     {
14607       int type;
14608       const struct mips16_immed_operand *op;
14609       bfd_boolean small, ext;
14610       offsetT val;
14611       bfd_byte *buf;
14612       unsigned long insn;
14613       bfd_boolean use_extend;
14614       unsigned short extend;
14615
14616       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14617       op = mips16_immed_operands;
14618       while (op->type != type)
14619         ++op;
14620
14621       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14622         {
14623           small = FALSE;
14624           ext = TRUE;
14625         }
14626       else
14627         {
14628           small = TRUE;
14629           ext = FALSE;
14630         }
14631
14632       val = resolve_symbol_value (fragp->fr_symbol);
14633       if (op->pcrel)
14634         {
14635           addressT addr;
14636
14637           addr = fragp->fr_address + fragp->fr_fix;
14638
14639           /* The rules for the base address of a PC relative reloc are
14640              complicated; see mips16_extended_frag.  */
14641           if (type == 'p' || type == 'q')
14642             {
14643               addr += 2;
14644               if (ext)
14645                 addr += 2;
14646               /* Ignore the low bit in the target, since it will be
14647                  set for a text label.  */
14648               if ((val & 1) != 0)
14649                 --val;
14650             }
14651           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14652             addr -= 4;
14653           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14654             addr -= 2;
14655
14656           addr &= ~ (addressT) ((1 << op->shift) - 1);
14657           val -= addr;
14658
14659           /* Make sure the section winds up with the alignment we have
14660              assumed.  */
14661           if (op->shift > 0)
14662             record_alignment (asec, op->shift);
14663         }
14664
14665       if (ext
14666           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14667               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14668         as_warn_where (fragp->fr_file, fragp->fr_line,
14669                        _("extended instruction in delay slot"));
14670
14671       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14672
14673       if (target_big_endian)
14674         insn = bfd_getb16 (buf);
14675       else
14676         insn = bfd_getl16 (buf);
14677
14678       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14679                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14680                     small, ext, &insn, &use_extend, &extend);
14681
14682       if (use_extend)
14683         {
14684           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14685           fragp->fr_fix += 2;
14686           buf += 2;
14687         }
14688
14689       md_number_to_chars ((char *) buf, insn, 2);
14690       fragp->fr_fix += 2;
14691       buf += 2;
14692     }
14693   else
14694     {
14695       int first, second;
14696       fixS *fixp;
14697
14698       first = RELAX_FIRST (fragp->fr_subtype);
14699       second = RELAX_SECOND (fragp->fr_subtype);
14700       fixp = (fixS *) fragp->fr_opcode;
14701
14702       /* Possibly emit a warning if we've chosen the longer option.  */
14703       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14704           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14705         {
14706           const char *msg = macro_warning (fragp->fr_subtype);
14707           if (msg != 0)
14708             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14709         }
14710
14711       /* Go through all the fixups for the first sequence.  Disable them
14712          (by marking them as done) if we're going to use the second
14713          sequence instead.  */
14714       while (fixp
14715              && fixp->fx_frag == fragp
14716              && fixp->fx_where < fragp->fr_fix - second)
14717         {
14718           if (fragp->fr_subtype & RELAX_USE_SECOND)
14719             fixp->fx_done = 1;
14720           fixp = fixp->fx_next;
14721         }
14722
14723       /* Go through the fixups for the second sequence.  Disable them if
14724          we're going to use the first sequence, otherwise adjust their
14725          addresses to account for the relaxation.  */
14726       while (fixp && fixp->fx_frag == fragp)
14727         {
14728           if (fragp->fr_subtype & RELAX_USE_SECOND)
14729             fixp->fx_where -= first;
14730           else
14731             fixp->fx_done = 1;
14732           fixp = fixp->fx_next;
14733         }
14734
14735       /* Now modify the frag contents.  */
14736       if (fragp->fr_subtype & RELAX_USE_SECOND)
14737         {
14738           char *start;
14739
14740           start = fragp->fr_literal + fragp->fr_fix - first - second;
14741           memmove (start, start + first, second);
14742           fragp->fr_fix -= first;
14743         }
14744       else
14745         fragp->fr_fix -= second;
14746     }
14747 }
14748
14749 #ifdef OBJ_ELF
14750
14751 /* This function is called after the relocs have been generated.
14752    We've been storing mips16 text labels as odd.  Here we convert them
14753    back to even for the convenience of the debugger.  */
14754
14755 void
14756 mips_frob_file_after_relocs (void)
14757 {
14758   asymbol **syms;
14759   unsigned int count, i;
14760
14761   if (!IS_ELF)
14762     return;
14763
14764   syms = bfd_get_outsymbols (stdoutput);
14765   count = bfd_get_symcount (stdoutput);
14766   for (i = 0; i < count; i++, syms++)
14767     {
14768       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14769           && ((*syms)->value & 1) != 0)
14770         {
14771           (*syms)->value &= ~1;
14772           /* If the symbol has an odd size, it was probably computed
14773              incorrectly, so adjust that as well.  */
14774           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14775             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14776         }
14777     }
14778 }
14779
14780 #endif
14781
14782 /* This function is called whenever a label is defined, including fake
14783    labels instantiated off the dot special symbol.  It is used when
14784    handling branch delays; if a branch has a label, we assume we cannot
14785    move it.  This also bumps the value of the symbol by 1 in compressed
14786    code.  */
14787
14788 void
14789 mips_record_label (symbolS *sym)
14790 {
14791   segment_info_type *si = seg_info (now_seg);
14792   struct insn_label_list *l;
14793
14794   if (free_insn_labels == NULL)
14795     l = (struct insn_label_list *) xmalloc (sizeof *l);
14796   else
14797     {
14798       l = free_insn_labels;
14799       free_insn_labels = l->next;
14800     }
14801
14802   l->label = sym;
14803   l->next = si->label_list;
14804   si->label_list = l;
14805 }
14806
14807 /* This function is called as tc_frob_label() whenever a label is defined
14808    and adds a DWARF-2 record we only want for true labels.  */
14809
14810 void
14811 mips_define_label (symbolS *sym)
14812 {
14813   mips_record_label (sym);
14814 #ifdef OBJ_ELF
14815   dwarf2_emit_label (sym);
14816 #endif
14817 }
14818 \f
14819 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14820
14821 /* Some special processing for a MIPS ELF file.  */
14822
14823 void
14824 mips_elf_final_processing (void)
14825 {
14826   /* Write out the register information.  */
14827   if (mips_abi != N64_ABI)
14828     {
14829       Elf32_RegInfo s;
14830
14831       s.ri_gprmask = mips_gprmask;
14832       s.ri_cprmask[0] = mips_cprmask[0];
14833       s.ri_cprmask[1] = mips_cprmask[1];
14834       s.ri_cprmask[2] = mips_cprmask[2];
14835       s.ri_cprmask[3] = mips_cprmask[3];
14836       /* The gp_value field is set by the MIPS ELF backend.  */
14837
14838       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14839                                        ((Elf32_External_RegInfo *)
14840                                         mips_regmask_frag));
14841     }
14842   else
14843     {
14844       Elf64_Internal_RegInfo s;
14845
14846       s.ri_gprmask = mips_gprmask;
14847       s.ri_pad = 0;
14848       s.ri_cprmask[0] = mips_cprmask[0];
14849       s.ri_cprmask[1] = mips_cprmask[1];
14850       s.ri_cprmask[2] = mips_cprmask[2];
14851       s.ri_cprmask[3] = mips_cprmask[3];
14852       /* The gp_value field is set by the MIPS ELF backend.  */
14853
14854       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14855                                        ((Elf64_External_RegInfo *)
14856                                         mips_regmask_frag));
14857     }
14858
14859   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14860      sort of BFD interface for this.  */
14861   if (mips_any_noreorder)
14862     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14863   if (mips_pic != NO_PIC)
14864     {
14865     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14866       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14867     }
14868   if (mips_abicalls)
14869     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14870
14871   /* Set MIPS ELF flags for ASEs.  */
14872   /* We may need to define a new flag for DSP ASE, and set this flag when
14873      file_ase_dsp is true.  */
14874   /* Same for DSP R2.  */
14875   /* We may need to define a new flag for MT ASE, and set this flag when
14876      file_ase_mt is true.  */
14877   if (file_ase_mips16)
14878     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14879 #if 0 /* XXX FIXME */
14880   if (file_ase_mips3d)
14881     elf_elfheader (stdoutput)->e_flags |= ???;
14882 #endif
14883   if (file_ase_mdmx)
14884     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14885
14886   /* Set the MIPS ELF ABI flags.  */
14887   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14888     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14889   else if (mips_abi == O64_ABI)
14890     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14891   else if (mips_abi == EABI_ABI)
14892     {
14893       if (!file_mips_gp32)
14894         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14895       else
14896         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14897     }
14898   else if (mips_abi == N32_ABI)
14899     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14900
14901   /* Nothing to do for N64_ABI.  */
14902
14903   if (mips_32bitmode)
14904     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14905
14906 #if 0 /* XXX FIXME */
14907   /* 32 bit code with 64 bit FP registers.  */
14908   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14909     elf_elfheader (stdoutput)->e_flags |= ???;
14910 #endif
14911 }
14912
14913 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14914 \f
14915 typedef struct proc {
14916   symbolS *func_sym;
14917   symbolS *func_end_sym;
14918   unsigned long reg_mask;
14919   unsigned long reg_offset;
14920   unsigned long fpreg_mask;
14921   unsigned long fpreg_offset;
14922   unsigned long frame_offset;
14923   unsigned long frame_reg;
14924   unsigned long pc_reg;
14925 } procS;
14926
14927 static procS cur_proc;
14928 static procS *cur_proc_ptr;
14929 static int numprocs;
14930
14931 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14932    nop as "0".  */
14933
14934 char
14935 mips_nop_opcode (void)
14936 {
14937   return seg_info (now_seg)->tc_segment_info_data.mips16;
14938 }
14939
14940 /* Fill in an rs_align_code fragment.  This only needs to do something
14941    for MIPS16 code, where 0 is not a nop.  */
14942
14943 void
14944 mips_handle_align (fragS *fragp)
14945 {
14946   char *p;
14947   int bytes, size, excess;
14948   valueT opcode;
14949
14950   if (fragp->fr_type != rs_align_code)
14951     return;
14952
14953   p = fragp->fr_literal + fragp->fr_fix;
14954   if (*p)
14955     {
14956       opcode = mips16_nop_insn.insn_opcode;
14957       size = 2;
14958     }
14959   else
14960     {
14961       opcode = nop_insn.insn_opcode;
14962       size = 4;
14963     }
14964
14965   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14966   excess = bytes % size;
14967   if (excess != 0)
14968     {
14969       /* If we're not inserting a whole number of instructions,
14970          pad the end of the fixed part of the frag with zeros.  */
14971       memset (p, 0, excess);
14972       p += excess;
14973       fragp->fr_fix += excess;
14974     }
14975
14976   md_number_to_chars (p, opcode, size);
14977   fragp->fr_var = size;
14978 }
14979
14980 static void
14981 md_obj_begin (void)
14982 {
14983 }
14984
14985 static void
14986 md_obj_end (void)
14987 {
14988   /* Check for premature end, nesting errors, etc.  */
14989   if (cur_proc_ptr)
14990     as_warn (_("missing .end at end of assembly"));
14991 }
14992
14993 static long
14994 get_number (void)
14995 {
14996   int negative = 0;
14997   long val = 0;
14998
14999   if (*input_line_pointer == '-')
15000     {
15001       ++input_line_pointer;
15002       negative = 1;
15003     }
15004   if (!ISDIGIT (*input_line_pointer))
15005     as_bad (_("expected simple number"));
15006   if (input_line_pointer[0] == '0')
15007     {
15008       if (input_line_pointer[1] == 'x')
15009         {
15010           input_line_pointer += 2;
15011           while (ISXDIGIT (*input_line_pointer))
15012             {
15013               val <<= 4;
15014               val |= hex_value (*input_line_pointer++);
15015             }
15016           return negative ? -val : val;
15017         }
15018       else
15019         {
15020           ++input_line_pointer;
15021           while (ISDIGIT (*input_line_pointer))
15022             {
15023               val <<= 3;
15024               val |= *input_line_pointer++ - '0';
15025             }
15026           return negative ? -val : val;
15027         }
15028     }
15029   if (!ISDIGIT (*input_line_pointer))
15030     {
15031       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15032               *input_line_pointer, *input_line_pointer);
15033       as_warn (_("invalid number"));
15034       return -1;
15035     }
15036   while (ISDIGIT (*input_line_pointer))
15037     {
15038       val *= 10;
15039       val += *input_line_pointer++ - '0';
15040     }
15041   return negative ? -val : val;
15042 }
15043
15044 /* The .file directive; just like the usual .file directive, but there
15045    is an initial number which is the ECOFF file index.  In the non-ECOFF
15046    case .file implies DWARF-2.  */
15047
15048 static void
15049 s_mips_file (int x ATTRIBUTE_UNUSED)
15050 {
15051   static int first_file_directive = 0;
15052
15053   if (ECOFF_DEBUGGING)
15054     {
15055       get_number ();
15056       s_app_file (0);
15057     }
15058   else
15059     {
15060       char *filename;
15061
15062       filename = dwarf2_directive_file (0);
15063
15064       /* Versions of GCC up to 3.1 start files with a ".file"
15065          directive even for stabs output.  Make sure that this
15066          ".file" is handled.  Note that you need a version of GCC
15067          after 3.1 in order to support DWARF-2 on MIPS.  */
15068       if (filename != NULL && ! first_file_directive)
15069         {
15070           (void) new_logical_line (filename, -1);
15071           s_app_file_string (filename, 0);
15072         }
15073       first_file_directive = 1;
15074     }
15075 }
15076
15077 /* The .loc directive, implying DWARF-2.  */
15078
15079 static void
15080 s_mips_loc (int x ATTRIBUTE_UNUSED)
15081 {
15082   if (!ECOFF_DEBUGGING)
15083     dwarf2_directive_loc (0);
15084 }
15085
15086 /* The .end directive.  */
15087
15088 static void
15089 s_mips_end (int x ATTRIBUTE_UNUSED)
15090 {
15091   symbolS *p;
15092
15093   /* Following functions need their own .frame and .cprestore directives.  */
15094   mips_frame_reg_valid = 0;
15095   mips_cprestore_valid = 0;
15096
15097   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15098     {
15099       p = get_symbol ();
15100       demand_empty_rest_of_line ();
15101     }
15102   else
15103     p = NULL;
15104
15105   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15106     as_warn (_(".end not in text section"));
15107
15108   if (!cur_proc_ptr)
15109     {
15110       as_warn (_(".end directive without a preceding .ent directive."));
15111       demand_empty_rest_of_line ();
15112       return;
15113     }
15114
15115   if (p != NULL)
15116     {
15117       gas_assert (S_GET_NAME (p));
15118       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15119         as_warn (_(".end symbol does not match .ent symbol."));
15120
15121       if (debug_type == DEBUG_STABS)
15122         stabs_generate_asm_endfunc (S_GET_NAME (p),
15123                                     S_GET_NAME (p));
15124     }
15125   else
15126     as_warn (_(".end directive missing or unknown symbol"));
15127
15128 #ifdef OBJ_ELF
15129   /* Create an expression to calculate the size of the function.  */
15130   if (p && cur_proc_ptr)
15131     {
15132       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15133       expressionS *exp = xmalloc (sizeof (expressionS));
15134
15135       obj->size = exp;
15136       exp->X_op = O_subtract;
15137       exp->X_add_symbol = symbol_temp_new_now ();
15138       exp->X_op_symbol = p;
15139       exp->X_add_number = 0;
15140
15141       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15142     }
15143
15144   /* Generate a .pdr section.  */
15145   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15146     {
15147       segT saved_seg = now_seg;
15148       subsegT saved_subseg = now_subseg;
15149       expressionS exp;
15150       char *fragp;
15151
15152 #ifdef md_flush_pending_output
15153       md_flush_pending_output ();
15154 #endif
15155
15156       gas_assert (pdr_seg);
15157       subseg_set (pdr_seg, 0);
15158
15159       /* Write the symbol.  */
15160       exp.X_op = O_symbol;
15161       exp.X_add_symbol = p;
15162       exp.X_add_number = 0;
15163       emit_expr (&exp, 4);
15164
15165       fragp = frag_more (7 * 4);
15166
15167       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15168       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15169       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15170       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15171       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15172       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15173       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15174
15175       subseg_set (saved_seg, saved_subseg);
15176     }
15177 #endif /* OBJ_ELF */
15178
15179   cur_proc_ptr = NULL;
15180 }
15181
15182 /* The .aent and .ent directives.  */
15183
15184 static void
15185 s_mips_ent (int aent)
15186 {
15187   symbolS *symbolP;
15188
15189   symbolP = get_symbol ();
15190   if (*input_line_pointer == ',')
15191     ++input_line_pointer;
15192   SKIP_WHITESPACE ();
15193   if (ISDIGIT (*input_line_pointer)
15194       || *input_line_pointer == '-')
15195     get_number ();
15196
15197   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15198     as_warn (_(".ent or .aent not in text section."));
15199
15200   if (!aent && cur_proc_ptr)
15201     as_warn (_("missing .end"));
15202
15203   if (!aent)
15204     {
15205       /* This function needs its own .frame and .cprestore directives.  */
15206       mips_frame_reg_valid = 0;
15207       mips_cprestore_valid = 0;
15208
15209       cur_proc_ptr = &cur_proc;
15210       memset (cur_proc_ptr, '\0', sizeof (procS));
15211
15212       cur_proc_ptr->func_sym = symbolP;
15213
15214       ++numprocs;
15215
15216       if (debug_type == DEBUG_STABS)
15217         stabs_generate_asm_func (S_GET_NAME (symbolP),
15218                                  S_GET_NAME (symbolP));
15219     }
15220
15221   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15222
15223   demand_empty_rest_of_line ();
15224 }
15225
15226 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15227    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15228    s_mips_frame is used so that we can set the PDR information correctly.
15229    We can't use the ecoff routines because they make reference to the ecoff
15230    symbol table (in the mdebug section).  */
15231
15232 static void
15233 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15234 {
15235 #ifdef OBJ_ELF
15236   if (IS_ELF && !ECOFF_DEBUGGING)
15237     {
15238       long val;
15239
15240       if (cur_proc_ptr == (procS *) NULL)
15241         {
15242           as_warn (_(".frame outside of .ent"));
15243           demand_empty_rest_of_line ();
15244           return;
15245         }
15246
15247       cur_proc_ptr->frame_reg = tc_get_register (1);
15248
15249       SKIP_WHITESPACE ();
15250       if (*input_line_pointer++ != ','
15251           || get_absolute_expression_and_terminator (&val) != ',')
15252         {
15253           as_warn (_("Bad .frame directive"));
15254           --input_line_pointer;
15255           demand_empty_rest_of_line ();
15256           return;
15257         }
15258
15259       cur_proc_ptr->frame_offset = val;
15260       cur_proc_ptr->pc_reg = tc_get_register (0);
15261
15262       demand_empty_rest_of_line ();
15263     }
15264   else
15265 #endif /* OBJ_ELF */
15266     s_ignore (ignore);
15267 }
15268
15269 /* The .fmask and .mask directives. If the mdebug section is present
15270    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15271    embedded targets, s_mips_mask is used so that we can set the PDR
15272    information correctly. We can't use the ecoff routines because they
15273    make reference to the ecoff symbol table (in the mdebug section).  */
15274
15275 static void
15276 s_mips_mask (int reg_type)
15277 {
15278 #ifdef OBJ_ELF
15279   if (IS_ELF && !ECOFF_DEBUGGING)
15280     {
15281       long mask, off;
15282
15283       if (cur_proc_ptr == (procS *) NULL)
15284         {
15285           as_warn (_(".mask/.fmask outside of .ent"));
15286           demand_empty_rest_of_line ();
15287           return;
15288         }
15289
15290       if (get_absolute_expression_and_terminator (&mask) != ',')
15291         {
15292           as_warn (_("Bad .mask/.fmask directive"));
15293           --input_line_pointer;
15294           demand_empty_rest_of_line ();
15295           return;
15296         }
15297
15298       off = get_absolute_expression ();
15299
15300       if (reg_type == 'F')
15301         {
15302           cur_proc_ptr->fpreg_mask = mask;
15303           cur_proc_ptr->fpreg_offset = off;
15304         }
15305       else
15306         {
15307           cur_proc_ptr->reg_mask = mask;
15308           cur_proc_ptr->reg_offset = off;
15309         }
15310
15311       demand_empty_rest_of_line ();
15312     }
15313   else
15314 #endif /* OBJ_ELF */
15315     s_ignore (reg_type);
15316 }
15317
15318 /* A table describing all the processors gas knows about.  Names are
15319    matched in the order listed.
15320
15321    To ease comparison, please keep this table in the same order as
15322    gcc's mips_cpu_info_table[].  */
15323 static const struct mips_cpu_info mips_cpu_info_table[] =
15324 {
15325   /* Entries for generic ISAs */
15326   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15327   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15328   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15329   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15330   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15331   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15332   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15333   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15334   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15335
15336   /* MIPS I */
15337   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15338   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15339   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15340
15341   /* MIPS II */
15342   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15343
15344   /* MIPS III */
15345   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15346   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15347   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15348   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15349   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15350   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15351   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15352   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15353   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15354   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15355   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15356   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15357   /* ST Microelectronics Loongson 2E and 2F cores */
15358   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15359   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15360
15361   /* MIPS IV */
15362   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15363   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15364   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15365   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15366   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15367   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15368   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15369   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15370   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15371   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15372   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15373   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15374   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15375   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15376   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15377
15378   /* MIPS 32 */
15379   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15380   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15381   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15382   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15383
15384   /* MIPS 32 Release 2 */
15385   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15386   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15387   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15388   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15389   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15390   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15391   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15392   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15393   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15394   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15395   /* Deprecated forms of the above.  */
15396   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15397   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15398   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15399   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15400   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15401   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15402   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15403   /* Deprecated forms of the above.  */
15404   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15405   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15406   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15407   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15408                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15409   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15410                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15411   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15412                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15413   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15414                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15415   /* Deprecated forms of the above.  */
15416   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15417                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15418   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15419                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15420   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15421   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15422                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15423   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15424                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15425   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15426                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15427   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15428                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15429   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15430                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15431   /* Deprecated forms of the above.  */
15432   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15433                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15434   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15435                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15436   /* 1004K cores are multiprocessor versions of the 34K.  */
15437   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15438                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15439   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15440                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15441   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15442                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15443   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15444                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15445
15446   /* MIPS 64 */
15447   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15448   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15449   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15450   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15451
15452   /* Broadcom SB-1 CPU core */
15453   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15454                                                 ISA_MIPS64,     CPU_SB1 },
15455   /* Broadcom SB-1A CPU core */
15456   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15457                                                 ISA_MIPS64,     CPU_SB1 },
15458   
15459   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
15460
15461   /* MIPS 64 Release 2 */
15462
15463   /* Cavium Networks Octeon CPU core */
15464   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15465
15466   /* RMI Xlr */
15467   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15468
15469   /* End marker */
15470   { NULL, 0, 0, 0 }
15471 };
15472
15473
15474 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15475    with a final "000" replaced by "k".  Ignore case.
15476
15477    Note: this function is shared between GCC and GAS.  */
15478
15479 static bfd_boolean
15480 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15481 {
15482   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15483     given++, canonical++;
15484
15485   return ((*given == 0 && *canonical == 0)
15486           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15487 }
15488
15489
15490 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15491    CPU name.  We've traditionally allowed a lot of variation here.
15492
15493    Note: this function is shared between GCC and GAS.  */
15494
15495 static bfd_boolean
15496 mips_matching_cpu_name_p (const char *canonical, const char *given)
15497 {
15498   /* First see if the name matches exactly, or with a final "000"
15499      turned into "k".  */
15500   if (mips_strict_matching_cpu_name_p (canonical, given))
15501     return TRUE;
15502
15503   /* If not, try comparing based on numerical designation alone.
15504      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15505   if (TOLOWER (*given) == 'r')
15506     given++;
15507   if (!ISDIGIT (*given))
15508     return FALSE;
15509
15510   /* Skip over some well-known prefixes in the canonical name,
15511      hoping to find a number there too.  */
15512   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15513     canonical += 2;
15514   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15515     canonical += 2;
15516   else if (TOLOWER (canonical[0]) == 'r')
15517     canonical += 1;
15518
15519   return mips_strict_matching_cpu_name_p (canonical, given);
15520 }
15521
15522
15523 /* Parse an option that takes the name of a processor as its argument.
15524    OPTION is the name of the option and CPU_STRING is the argument.
15525    Return the corresponding processor enumeration if the CPU_STRING is
15526    recognized, otherwise report an error and return null.
15527
15528    A similar function exists in GCC.  */
15529
15530 static const struct mips_cpu_info *
15531 mips_parse_cpu (const char *option, const char *cpu_string)
15532 {
15533   const struct mips_cpu_info *p;
15534
15535   /* 'from-abi' selects the most compatible architecture for the given
15536      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15537      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15538      version.  Look first at the -mgp options, if given, otherwise base
15539      the choice on MIPS_DEFAULT_64BIT.
15540
15541      Treat NO_ABI like the EABIs.  One reason to do this is that the
15542      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15543      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15544      'mips64', just as we did in the days before 'from-abi'.  */
15545   if (strcasecmp (cpu_string, "from-abi") == 0)
15546     {
15547       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15548         return mips_cpu_info_from_isa (ISA_MIPS1);
15549
15550       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15551         return mips_cpu_info_from_isa (ISA_MIPS3);
15552
15553       if (file_mips_gp32 >= 0)
15554         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15555
15556       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15557                                      ? ISA_MIPS3
15558                                      : ISA_MIPS1);
15559     }
15560
15561   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15562   if (strcasecmp (cpu_string, "default") == 0)
15563     return 0;
15564
15565   for (p = mips_cpu_info_table; p->name != 0; p++)
15566     if (mips_matching_cpu_name_p (p->name, cpu_string))
15567       return p;
15568
15569   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15570   return 0;
15571 }
15572
15573 /* Return the canonical processor information for ISA (a member of the
15574    ISA_MIPS* enumeration).  */
15575
15576 static const struct mips_cpu_info *
15577 mips_cpu_info_from_isa (int isa)
15578 {
15579   int i;
15580
15581   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15582     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15583         && isa == mips_cpu_info_table[i].isa)
15584       return (&mips_cpu_info_table[i]);
15585
15586   return NULL;
15587 }
15588
15589 static const struct mips_cpu_info *
15590 mips_cpu_info_from_arch (int arch)
15591 {
15592   int i;
15593
15594   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15595     if (arch == mips_cpu_info_table[i].cpu)
15596       return (&mips_cpu_info_table[i]);
15597
15598   return NULL;
15599 }
15600 \f
15601 static void
15602 show (FILE *stream, const char *string, int *col_p, int *first_p)
15603 {
15604   if (*first_p)
15605     {
15606       fprintf (stream, "%24s", "");
15607       *col_p = 24;
15608     }
15609   else
15610     {
15611       fprintf (stream, ", ");
15612       *col_p += 2;
15613     }
15614
15615   if (*col_p + strlen (string) > 72)
15616     {
15617       fprintf (stream, "\n%24s", "");
15618       *col_p = 24;
15619     }
15620
15621   fprintf (stream, "%s", string);
15622   *col_p += strlen (string);
15623
15624   *first_p = 0;
15625 }
15626
15627 void
15628 md_show_usage (FILE *stream)
15629 {
15630   int column, first;
15631   size_t i;
15632
15633   fprintf (stream, _("\
15634 MIPS options:\n\
15635 -EB                     generate big endian output\n\
15636 -EL                     generate little endian output\n\
15637 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15638 -G NUM                  allow referencing objects up to NUM bytes\n\
15639                         implicitly with the gp register [default 8]\n"));
15640   fprintf (stream, _("\
15641 -mips1                  generate MIPS ISA I instructions\n\
15642 -mips2                  generate MIPS ISA II instructions\n\
15643 -mips3                  generate MIPS ISA III instructions\n\
15644 -mips4                  generate MIPS ISA IV instructions\n\
15645 -mips5                  generate MIPS ISA V instructions\n\
15646 -mips32                 generate MIPS32 ISA instructions\n\
15647 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15648 -mips64                 generate MIPS64 ISA instructions\n\
15649 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15650 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15651
15652   first = 1;
15653
15654   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15655     show (stream, mips_cpu_info_table[i].name, &column, &first);
15656   show (stream, "from-abi", &column, &first);
15657   fputc ('\n', stream);
15658
15659   fprintf (stream, _("\
15660 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15661 -no-mCPU                don't generate code specific to CPU.\n\
15662                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15663
15664   first = 1;
15665
15666   show (stream, "3900", &column, &first);
15667   show (stream, "4010", &column, &first);
15668   show (stream, "4100", &column, &first);
15669   show (stream, "4650", &column, &first);
15670   fputc ('\n', stream);
15671
15672   fprintf (stream, _("\
15673 -mips16                 generate mips16 instructions\n\
15674 -no-mips16              do not generate mips16 instructions\n"));
15675   fprintf (stream, _("\
15676 -msmartmips             generate smartmips instructions\n\
15677 -mno-smartmips          do not generate smartmips instructions\n"));  
15678   fprintf (stream, _("\
15679 -mdsp                   generate DSP instructions\n\
15680 -mno-dsp                do not generate DSP instructions\n"));
15681   fprintf (stream, _("\
15682 -mdspr2                 generate DSP R2 instructions\n\
15683 -mno-dspr2              do not generate DSP R2 instructions\n"));
15684   fprintf (stream, _("\
15685 -mmt                    generate MT instructions\n\
15686 -mno-mt                 do not generate MT instructions\n"));
15687   fprintf (stream, _("\
15688 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15689 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15690 -mfix-vr4120            work around certain VR4120 errata\n\
15691 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15692 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15693 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15694 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15695 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15696 -msym32                 assume all symbols have 32-bit values\n\
15697 -O0                     remove unneeded NOPs, do not swap branches\n\
15698 -O                      remove unneeded NOPs and swap branches\n\
15699 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15700 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15701   fprintf (stream, _("\
15702 -mhard-float            allow floating-point instructions\n\
15703 -msoft-float            do not allow floating-point instructions\n\
15704 -msingle-float          only allow 32-bit floating-point operations\n\
15705 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15706 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15707                      ));
15708 #ifdef OBJ_ELF
15709   fprintf (stream, _("\
15710 -KPIC, -call_shared     generate SVR4 position independent code\n\
15711 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15712 -mvxworks-pic           generate VxWorks position independent code\n\
15713 -non_shared             do not generate code that can operate with DSOs\n\
15714 -xgot                   assume a 32 bit GOT\n\
15715 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15716 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15717                         position dependent (non shared) code\n\
15718 -mabi=ABI               create ABI conformant object file for:\n"));
15719
15720   first = 1;
15721
15722   show (stream, "32", &column, &first);
15723   show (stream, "o64", &column, &first);
15724   show (stream, "n32", &column, &first);
15725   show (stream, "64", &column, &first);
15726   show (stream, "eabi", &column, &first);
15727
15728   fputc ('\n', stream);
15729
15730   fprintf (stream, _("\
15731 -32                     create o32 ABI object file (default)\n\
15732 -n32                    create n32 ABI object file\n\
15733 -64                     create 64 ABI object file\n"));
15734 #endif
15735 }
15736
15737 #ifdef TE_IRIX
15738 enum dwarf2_format
15739 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15740 {
15741   if (HAVE_64BIT_SYMBOLS)
15742     return dwarf2_format_64bit_irix;
15743   else
15744     return dwarf2_format_32bit;
15745 }
15746 #endif
15747
15748 int
15749 mips_dwarf2_addr_size (void)
15750 {
15751   if (HAVE_64BIT_OBJECTS)
15752     return 8;
15753   else
15754     return 4;
15755 }
15756
15757 /* Standard calling conventions leave the CFA at SP on entry.  */
15758 void
15759 mips_cfi_frame_initial_instructions (void)
15760 {
15761   cfi_add_CFA_def_cfa_register (SP);
15762 }
15763
15764 int
15765 tc_mips_regname_to_dw2regnum (char *regname)
15766 {
15767   unsigned int regnum = -1;
15768   unsigned int reg;
15769
15770   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15771     regnum = reg;
15772
15773   return regnum;
15774 }