xref: /netbsd-src/external/gpl3/binutils/dist/gas/config/tc-mips.c (revision 7f21db1c0118155e0dd40b75182e30c589d9f63e)
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 Free Software Foundation, Inc.
4    Contributed by the OSF and Ralph Campbell.
5    Written by Keith Knowles and Ralph Campbell, working independently.
6    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7    Support.
8 
9    This file is part of GAS.
10 
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3, or (at your option)
14    any later version.
15 
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20 
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25 
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30 
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35 
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
41 
42 #ifdef OBJ_MAYBE_ELF
43 /* Clean up namespace so we can include obj-elf.h too.  */
44 static int mips_output_flavor (void);
45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46 #undef OBJ_PROCESS_STAB
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
58 
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about.  */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
64 
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
68 
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
73 
74 int mips_flag_mdebug = -1;
75 
76 /* Control generation of .pdr sections.  Off by default on IRIX: the native
77    linker doesn't know about and discards them, but relocations against them
78    remain, leading to rld crashes.  */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
84 
85 #include "ecoff.h"
86 
87 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88 static char *mips_regmask_frag;
89 #endif
90 
91 #define ZERO 0
92 #define ATREG 1
93 #define TREG 24
94 #define PIC_CALL_REG 25
95 #define KT0 26
96 #define KT1 27
97 #define GP  28
98 #define SP  29
99 #define FP  30
100 #define RA  31
101 
102 #define ILLEGAL_REG (32)
103 
104 #define AT  mips_opts.at
105 
106 /* Allow override of standard little-endian ECOFF format.  */
107 
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111 
112 extern int target_big_endian;
113 
114 /* The name of the readonly data section.  */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116 			    ? ".rdata" \
117 			    : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118 			    ? ".rdata" \
119 			    : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120 			    ? ".rodata" \
121 			    : (abort (), ""))
122 
123 /* Information about an instruction, including its format, operands
124    and fixups.  */
125 struct mips_cl_insn
126 {
127   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128   const struct mips_opcode *insn_mo;
129 
130   /* True if this is a mips16 instruction and if we want the extended
131      form of INSN_MO.  */
132   bfd_boolean use_extend;
133 
134   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135   unsigned short extend;
136 
137   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138      a copy of INSN_MO->match with the operands filled in.  */
139   unsigned long insn_opcode;
140 
141   /* The frag that contains the instruction.  */
142   struct frag *frag;
143 
144   /* The offset into FRAG of the first instruction byte.  */
145   long where;
146 
147   /* The relocs associated with the instruction, if any.  */
148   fixS *fixp[3];
149 
150   /* True if this entry cannot be moved from its current position.  */
151   unsigned int fixed_p : 1;
152 
153   /* True if this instruction occurred in a .set noreorder block.  */
154   unsigned int noreorder_p : 1;
155 
156   /* True for mips16 instructions that jump to an absolute address.  */
157   unsigned int mips16_absolute_jump_p : 1;
158 };
159 
160 /* The ABI to use.  */
161 enum mips_abi_level
162 {
163   NO_ABI = 0,
164   O32_ABI,
165   O64_ABI,
166   N32_ABI,
167   N64_ABI,
168   EABI_ABI
169 };
170 
171 /* MIPS ABI we are using for this output file.  */
172 static enum mips_abi_level mips_abi = NO_ABI;
173 
174 /* Whether or not we have code that can call pic code.  */
175 int mips_abicalls = FALSE;
176 
177 /* Whether or not we have code which can be put into a shared
178    library.  */
179 static bfd_boolean mips_in_shared = TRUE;
180 
181 /* This is the set of options which may be modified by the .set
182    pseudo-op.  We use a struct so that .set push and .set pop are more
183    reliable.  */
184 
185 struct mips_set_options
186 {
187   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188      if it has not been initialized.  Changed by `.set mipsN', and the
189      -mipsN command line option, and the default CPU.  */
190   int isa;
191   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192      if they have not been initialized.  Changed by `.set <asename>', by
193      command line options, and based on the default architecture.  */
194   int ase_mips3d;
195   int ase_mdmx;
196   int ase_smartmips;
197   int ase_dsp;
198   int ase_dspr2;
199   int ase_mt;
200   /* Whether we are assembling for the mips16 processor.  0 if we are
201      not, 1 if we are, and -1 if the value has not been initialized.
202      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203      -nomips16 command line options, and the default CPU.  */
204   int mips16;
205   /* Non-zero if we should not reorder instructions.  Changed by `.set
206      reorder' and `.set noreorder'.  */
207   int noreorder;
208   /* Non-zero if we should not permit the register designated "assembler
209      temporary" to be used in instructions.  The value is the register
210      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
211      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
212   unsigned int at;
213   /* Non-zero if we should warn when a macro instruction expands into
214      more than one machine instruction.  Changed by `.set nomacro' and
215      `.set macro'.  */
216   int warn_about_macros;
217   /* Non-zero if we should not move instructions.  Changed by `.set
218      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
219   int nomove;
220   /* Non-zero if we should not optimize branches by moving the target
221      of the branch into the delay slot.  Actually, we don't perform
222      this optimization anyhow.  Changed by `.set bopt' and `.set
223      nobopt'.  */
224   int nobopt;
225   /* Non-zero if we should not autoextend mips16 instructions.
226      Changed by `.set autoextend' and `.set noautoextend'.  */
227   int noautoextend;
228   /* Restrict general purpose registers and floating point registers
229      to 32 bit.  This is initially determined when -mgp32 or -mfp32
230      is passed but can changed if the assembler code uses .set mipsN.  */
231   int gp32;
232   int fp32;
233   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
234      command line option, and the default CPU.  */
235   int arch;
236   /* True if ".set sym32" is in effect.  */
237   bfd_boolean sym32;
238   /* True if floating-point operations are not allowed.  Changed by .set
239      softfloat or .set hardfloat, by command line options -msoft-float or
240      -mhard-float.  The default is false.  */
241   bfd_boolean soft_float;
242 
243   /* True if only single-precision floating-point operations are allowed.
244      Changed by .set singlefloat or .set doublefloat, command-line options
245      -msingle-float or -mdouble-float.  The default is false.  */
246   bfd_boolean single_float;
247 };
248 
249 /* This is the struct we use to hold the current set of options.  Note
250    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
251    -1 to indicate that they have not been initialized.  */
252 
253 /* True if -mgp32 was passed.  */
254 static int file_mips_gp32 = -1;
255 
256 /* True if -mfp32 was passed.  */
257 static int file_mips_fp32 = -1;
258 
259 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
260 static int file_mips_soft_float = 0;
261 
262 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
263 static int file_mips_single_float = 0;
264 
265 static struct mips_set_options mips_opts =
266 {
267   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
268   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
269   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
270   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
271   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
272   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
273 };
274 
275 /* These variables are filled in with the masks of registers used.
276    The object format code reads them and puts them in the appropriate
277    place.  */
278 unsigned long mips_gprmask;
279 unsigned long mips_cprmask[4];
280 
281 /* MIPS ISA we are using for this output file.  */
282 static int file_mips_isa = ISA_UNKNOWN;
283 
284 /* True if -mips16 was passed or implied by arguments passed on the
285    command line (e.g., by -march).  */
286 static int file_ase_mips16;
287 
288 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32		\
289 			      || mips_opts.isa == ISA_MIPS32R2		\
290 			      || mips_opts.isa == ISA_MIPS64		\
291 			      || mips_opts.isa == ISA_MIPS64R2)
292 
293 /* True if -mips3d was passed or implied by arguments passed on the
294    command line (e.g., by -march).  */
295 static int file_ase_mips3d;
296 
297 /* True if -mdmx was passed or implied by arguments passed on the
298    command line (e.g., by -march).  */
299 static int file_ase_mdmx;
300 
301 /* True if -msmartmips was passed or implied by arguments passed on the
302    command line (e.g., by -march).  */
303 static int file_ase_smartmips;
304 
305 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32		\
306 				|| mips_opts.isa == ISA_MIPS32R2)
307 
308 /* True if -mdsp was passed or implied by arguments passed on the
309    command line (e.g., by -march).  */
310 static int file_ase_dsp;
311 
312 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2		\
313 			      || mips_opts.isa == ISA_MIPS64R2)
314 
315 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
316 
317 /* True if -mdspr2 was passed or implied by arguments passed on the
318    command line (e.g., by -march).  */
319 static int file_ase_dspr2;
320 
321 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2		\
322 			        || mips_opts.isa == ISA_MIPS64R2)
323 
324 /* True if -mmt was passed or implied by arguments passed on the
325    command line (e.g., by -march).  */
326 static int file_ase_mt;
327 
328 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2		\
329 			     || mips_opts.isa == ISA_MIPS64R2)
330 
331 /* The argument of the -march= flag.  The architecture we are assembling.  */
332 static int file_mips_arch = CPU_UNKNOWN;
333 static const char *mips_arch_string;
334 
335 /* The argument of the -mtune= flag.  The architecture for which we
336    are optimizing.  */
337 static int mips_tune = CPU_UNKNOWN;
338 static const char *mips_tune_string;
339 
340 /* True when generating 32-bit code for a 64-bit processor.  */
341 static int mips_32bitmode = 0;
342 
343 /* True if the given ABI requires 32-bit registers.  */
344 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
345 
346 /* Likewise 64-bit registers.  */
347 #define ABI_NEEDS_64BIT_REGS(ABI)	\
348   ((ABI) == N32_ABI 			\
349    || (ABI) == N64_ABI			\
350    || (ABI) == O64_ABI)
351 
352 /*  Return true if ISA supports 64 bit wide gp registers.  */
353 #define ISA_HAS_64BIT_REGS(ISA)		\
354   ((ISA) == ISA_MIPS3			\
355    || (ISA) == ISA_MIPS4		\
356    || (ISA) == ISA_MIPS5		\
357    || (ISA) == ISA_MIPS64		\
358    || (ISA) == ISA_MIPS64R2)
359 
360 /*  Return true if ISA supports 64 bit wide float registers.  */
361 #define ISA_HAS_64BIT_FPRS(ISA)		\
362   ((ISA) == ISA_MIPS3			\
363    || (ISA) == ISA_MIPS4		\
364    || (ISA) == ISA_MIPS5		\
365    || (ISA) == ISA_MIPS32R2		\
366    || (ISA) == ISA_MIPS64		\
367    || (ISA) == ISA_MIPS64R2)
368 
369 /* Return true if ISA supports 64-bit right rotate (dror et al.)
370    instructions.  */
371 #define ISA_HAS_DROR(ISA)		\
372   ((ISA) == ISA_MIPS64R2)
373 
374 /* Return true if ISA supports 32-bit right rotate (ror et al.)
375    instructions.  */
376 #define ISA_HAS_ROR(ISA)		\
377   ((ISA) == ISA_MIPS32R2		\
378    || (ISA) == ISA_MIPS64R2		\
379    || mips_opts.ase_smartmips)
380 
381 /* Return true if ISA supports single-precision floats in odd registers.  */
382 #define ISA_HAS_ODD_SINGLE_FPR(ISA)	\
383   ((ISA) == ISA_MIPS32			\
384    || (ISA) == ISA_MIPS32R2		\
385    || (ISA) == ISA_MIPS64		\
386    || (ISA) == ISA_MIPS64R2)
387 
388 /* Return true if ISA supports move to/from high part of a 64-bit
389    floating-point register. */
390 #define ISA_HAS_MXHC1(ISA)		\
391   ((ISA) == ISA_MIPS32R2		\
392    || (ISA) == ISA_MIPS64R2)
393 
394 #define HAVE_32BIT_GPRS		                   \
395     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
396 
397 #define HAVE_32BIT_FPRS                            \
398     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
399 
400 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
401 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
402 
403 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
404 
405 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
406 
407 /* True if relocations are stored in-place.  */
408 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
409 
410 /* The ABI-derived address size.  */
411 #define HAVE_64BIT_ADDRESSES \
412   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
413 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
414 
415 /* The size of symbolic constants (i.e., expressions of the form
416    "SYMBOL" or "SYMBOL + OFFSET").  */
417 #define HAVE_32BIT_SYMBOLS \
418   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
419 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
420 
421 /* Addresses are loaded in different ways, depending on the address size
422    in use.  The n32 ABI Documentation also mandates the use of additions
423    with overflow checking, but existing implementations don't follow it.  */
424 #define ADDRESS_ADD_INSN						\
425    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
426 
427 #define ADDRESS_ADDI_INSN						\
428    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
429 
430 #define ADDRESS_LOAD_INSN						\
431    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
432 
433 #define ADDRESS_STORE_INSN						\
434    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
435 
436 /* Return true if the given CPU supports the MIPS16 ASE.  */
437 #define CPU_HAS_MIPS16(cpu)						\
438    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0		\
439     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
440 
441 /* True if CPU has a dror instruction.  */
442 #define CPU_HAS_DROR(CPU)	((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443 
444 /* True if CPU has a ror instruction.  */
445 #define CPU_HAS_ROR(CPU)	CPU_HAS_DROR (CPU)
446 
447 /* True if CPU has seq/sne and seqi/snei instructions.  */
448 #define CPU_HAS_SEQ(CPU)	((CPU) == CPU_OCTEON)
449 
450 /* True if CPU does not implement the all the coprocessor insns.  For these
451    CPUs only those COP insns are accepted that are explicitly marked to be
452    available on the CPU.  ISA membership for COP insns is ignored.  */
453 #define NO_ISA_COP(CPU)		((CPU) == CPU_OCTEON)
454 
455 /* True if mflo and mfhi can be immediately followed by instructions
456    which write to the HI and LO registers.
457 
458    According to MIPS specifications, MIPS ISAs I, II, and III need
459    (at least) two instructions between the reads of HI/LO and
460    instructions which write them, and later ISAs do not.  Contradicting
461    the MIPS specifications, some MIPS IV processor user manuals (e.g.
462    the UM for the NEC Vr5000) document needing the instructions between
463    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
464    MIPS64 and later ISAs to have the interlocks, plus any specific
465    earlier-ISA CPUs for which CPU documentation declares that the
466    instructions are really interlocked.  */
467 #define hilo_interlocks \
468   (mips_opts.isa == ISA_MIPS32                        \
469    || mips_opts.isa == ISA_MIPS32R2                   \
470    || mips_opts.isa == ISA_MIPS64                     \
471    || mips_opts.isa == ISA_MIPS64R2                   \
472    || mips_opts.arch == CPU_R4010                     \
473    || mips_opts.arch == CPU_R10000                    \
474    || mips_opts.arch == CPU_R12000                    \
475    || mips_opts.arch == CPU_RM7000                    \
476    || mips_opts.arch == CPU_VR5500                    \
477    )
478 
479 /* Whether the processor uses hardware interlocks to protect reads
480    from the GPRs after they are loaded from memory, and thus does not
481    require nops to be inserted.  This applies to instructions marked
482    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
483    level I.  */
484 #define gpr_interlocks \
485   (mips_opts.isa != ISA_MIPS1  \
486    || mips_opts.arch == CPU_R3900)
487 
488 /* Whether the processor uses hardware interlocks to avoid delays
489    required by coprocessor instructions, and thus does not require
490    nops to be inserted.  This applies to instructions marked
491    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
492    between instructions marked INSN_WRITE_COND_CODE and ones marked
493    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
494    levels I, II, and III.  */
495 /* Itbl support may require additional care here.  */
496 #define cop_interlocks                                \
497   ((mips_opts.isa != ISA_MIPS1                        \
498     && mips_opts.isa != ISA_MIPS2                     \
499     && mips_opts.isa != ISA_MIPS3)                    \
500    || mips_opts.arch == CPU_R4300                     \
501    )
502 
503 /* Whether the processor uses hardware interlocks to protect reads
504    from coprocessor registers after they are loaded from memory, and
505    thus does not require nops to be inserted.  This applies to
506    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
507    requires at MIPS ISA level I.  */
508 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
509 
510 /* Is this a mfhi or mflo instruction?  */
511 #define MF_HILO_INSN(PINFO) \
512   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
513 
514 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
515    or writing the condition code is only possible on the coprocessors and
516    these insns are not marked with INSN_COP.  Thus for these insns use the
517    condition-code flags.  */
518 #define COP_INSN(PINFO)							\
519   (PINFO != INSN_MACRO							\
520    && ((PINFO) & (FP_S | FP_D)) == 0					\
521    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
522 
523 /* MIPS PIC level.  */
524 
525 enum mips_pic_level mips_pic;
526 
527 /* 1 if we should generate 32 bit offsets from the $gp register in
528    SVR4_PIC mode.  Currently has no meaning in other modes.  */
529 static int mips_big_got = 0;
530 
531 /* 1 if trap instructions should used for overflow rather than break
532    instructions.  */
533 static int mips_trap = 0;
534 
535 /* 1 if double width floating point constants should not be constructed
536    by assembling two single width halves into two single width floating
537    point registers which just happen to alias the double width destination
538    register.  On some architectures this aliasing can be disabled by a bit
539    in the status register, and the setting of this bit cannot be determined
540    automatically at assemble time.  */
541 static int mips_disable_float_construction;
542 
543 /* Non-zero if any .set noreorder directives were used.  */
544 
545 static int mips_any_noreorder;
546 
547 /* Non-zero if nops should be inserted when the register referenced in
548    an mfhi/mflo instruction is read in the next two instructions.  */
549 static int mips_7000_hilo_fix;
550 
551 /* The size of objects in the small data section.  */
552 static unsigned int g_switch_value = 8;
553 /* Whether the -G option was used.  */
554 static int g_switch_seen = 0;
555 
556 #define N_RMASK 0xc4
557 #define N_VFP   0xd4
558 
559 /* If we can determine in advance that GP optimization won't be
560    possible, we can skip the relaxation stuff that tries to produce
561    GP-relative references.  This makes delay slot optimization work
562    better.
563 
564    This function can only provide a guess, but it seems to work for
565    gcc output.  It needs to guess right for gcc, otherwise gcc
566    will put what it thinks is a GP-relative instruction in a branch
567    delay slot.
568 
569    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
570    fixed it for the non-PIC mode.  KR 95/04/07  */
571 static int nopic_need_relax (symbolS *, int);
572 
573 /* handle of the OPCODE hash table */
574 static struct hash_control *op_hash = NULL;
575 
576 /* The opcode hash table we use for the mips16.  */
577 static struct hash_control *mips16_op_hash = NULL;
578 
579 /* This array holds the chars that always start a comment.  If the
580     pre-processor is disabled, these aren't very useful */
581 const char comment_chars[] = "#";
582 
583 /* This array holds the chars that only start a comment at the beginning of
584    a line.  If the line seems to have the form '# 123 filename'
585    .line and .file directives will appear in the pre-processed output */
586 /* Note that input_file.c hand checks for '#' at the beginning of the
587    first line of the input file.  This is because the compiler outputs
588    #NO_APP at the beginning of its output.  */
589 /* Also note that C style comments are always supported.  */
590 const char line_comment_chars[] = "#";
591 
592 /* This array holds machine specific line separator characters.  */
593 const char line_separator_chars[] = ";";
594 
595 /* Chars that can be used to separate mant from exp in floating point nums */
596 const char EXP_CHARS[] = "eE";
597 
598 /* Chars that mean this number is a floating point constant */
599 /* As in 0f12.456 */
600 /* or    0d1.2345e12 */
601 const char FLT_CHARS[] = "rRsSfFdDxXpP";
602 
603 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
604    changed in read.c .  Ideally it shouldn't have to know about it at all,
605    but nothing is ideal around here.
606  */
607 
608 static char *insn_error;
609 
610 static int auto_align = 1;
611 
612 /* When outputting SVR4 PIC code, the assembler needs to know the
613    offset in the stack frame from which to restore the $gp register.
614    This is set by the .cprestore pseudo-op, and saved in this
615    variable.  */
616 static offsetT mips_cprestore_offset = -1;
617 
618 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
619    more optimizations, it can use a register value instead of a memory-saved
620    offset and even an other register than $gp as global pointer.  */
621 static offsetT mips_cpreturn_offset = -1;
622 static int mips_cpreturn_register = -1;
623 static int mips_gp_register = GP;
624 static int mips_gprel_offset = 0;
625 
626 /* Whether mips_cprestore_offset has been set in the current function
627    (or whether it has already been warned about, if not).  */
628 static int mips_cprestore_valid = 0;
629 
630 /* This is the register which holds the stack frame, as set by the
631    .frame pseudo-op.  This is needed to implement .cprestore.  */
632 static int mips_frame_reg = SP;
633 
634 /* Whether mips_frame_reg has been set in the current function
635    (or whether it has already been warned about, if not).  */
636 static int mips_frame_reg_valid = 0;
637 
638 /* To output NOP instructions correctly, we need to keep information
639    about the previous two instructions.  */
640 
641 /* Whether we are optimizing.  The default value of 2 means to remove
642    unneeded NOPs and swap branch instructions when possible.  A value
643    of 1 means to not swap branches.  A value of 0 means to always
644    insert NOPs.  */
645 static int mips_optimize = 2;
646 
647 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
648    equivalent to seeing no -g option at all.  */
649 static int mips_debug = 0;
650 
651 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
652 #define MAX_VR4130_NOPS 4
653 
654 /* The maximum number of NOPs needed to fill delay slots.  */
655 #define MAX_DELAY_NOPS 2
656 
657 /* The maximum number of NOPs needed for any purpose.  */
658 #define MAX_NOPS 4
659 
660 /* A list of previous instructions, with index 0 being the most recent.
661    We need to look back MAX_NOPS instructions when filling delay slots
662    or working around processor errata.  We need to look back one
663    instruction further if we're thinking about using history[0] to
664    fill a branch delay slot.  */
665 static struct mips_cl_insn history[1 + MAX_NOPS];
666 
667 /* Nop instructions used by emit_nop.  */
668 static struct mips_cl_insn nop_insn, mips16_nop_insn;
669 
670 /* The appropriate nop for the current mode.  */
671 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
672 
673 /* If this is set, it points to a frag holding nop instructions which
674    were inserted before the start of a noreorder section.  If those
675    nops turn out to be unnecessary, the size of the frag can be
676    decreased.  */
677 static fragS *prev_nop_frag;
678 
679 /* The number of nop instructions we created in prev_nop_frag.  */
680 static int prev_nop_frag_holds;
681 
682 /* The number of nop instructions that we know we need in
683    prev_nop_frag.  */
684 static int prev_nop_frag_required;
685 
686 /* The number of instructions we've seen since prev_nop_frag.  */
687 static int prev_nop_frag_since;
688 
689 /* For ECOFF and ELF, relocations against symbols are done in two
690    parts, with a HI relocation and a LO relocation.  Each relocation
691    has only 16 bits of space to store an addend.  This means that in
692    order for the linker to handle carries correctly, it must be able
693    to locate both the HI and the LO relocation.  This means that the
694    relocations must appear in order in the relocation table.
695 
696    In order to implement this, we keep track of each unmatched HI
697    relocation.  We then sort them so that they immediately precede the
698    corresponding LO relocation.  */
699 
700 struct mips_hi_fixup
701 {
702   /* Next HI fixup.  */
703   struct mips_hi_fixup *next;
704   /* This fixup.  */
705   fixS *fixp;
706   /* The section this fixup is in.  */
707   segT seg;
708 };
709 
710 /* The list of unmatched HI relocs.  */
711 
712 static struct mips_hi_fixup *mips_hi_fixup_list;
713 
714 /* The frag containing the last explicit relocation operator.
715    Null if explicit relocations have not been used.  */
716 
717 static fragS *prev_reloc_op_frag;
718 
719 /* Map normal MIPS register numbers to mips16 register numbers.  */
720 
721 #define X ILLEGAL_REG
722 static const int mips32_to_16_reg_map[] =
723 {
724   X, X, 2, 3, 4, 5, 6, 7,
725   X, X, X, X, X, X, X, X,
726   0, 1, X, X, X, X, X, X,
727   X, X, X, X, X, X, X, X
728 };
729 #undef X
730 
731 /* Map mips16 register numbers to normal MIPS register numbers.  */
732 
733 static const unsigned int mips16_to_32_reg_map[] =
734 {
735   16, 17, 2, 3, 4, 5, 6, 7
736 };
737 
738 /* Classifies the kind of instructions we're interested in when
739    implementing -mfix-vr4120.  */
740 enum fix_vr4120_class {
741   FIX_VR4120_MACC,
742   FIX_VR4120_DMACC,
743   FIX_VR4120_MULT,
744   FIX_VR4120_DMULT,
745   FIX_VR4120_DIV,
746   FIX_VR4120_MTHILO,
747   NUM_FIX_VR4120_CLASSES
748 };
749 
750 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
751    there must be at least one other instruction between an instruction
752    of type X and an instruction of type Y.  */
753 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
754 
755 /* True if -mfix-vr4120 is in force.  */
756 static int mips_fix_vr4120;
757 
758 /* ...likewise -mfix-vr4130.  */
759 static int mips_fix_vr4130;
760 
761 /* We don't relax branches by default, since this causes us to expand
762    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
763    fail to compute the offset before expanding the macro to the most
764    efficient expansion.  */
765 
766 static int mips_relax_branch;
767 
768 /* The expansion of many macros depends on the type of symbol that
769    they refer to.  For example, when generating position-dependent code,
770    a macro that refers to a symbol may have two different expansions,
771    one which uses GP-relative addresses and one which uses absolute
772    addresses.  When generating SVR4-style PIC, a macro may have
773    different expansions for local and global symbols.
774 
775    We handle these situations by generating both sequences and putting
776    them in variant frags.  In position-dependent code, the first sequence
777    will be the GP-relative one and the second sequence will be the
778    absolute one.  In SVR4 PIC, the first sequence will be for global
779    symbols and the second will be for local symbols.
780 
781    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
782    SECOND are the lengths of the two sequences in bytes.  These fields
783    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
784    the subtype has the following flags:
785 
786    RELAX_USE_SECOND
787 	Set if it has been decided that we should use the second
788 	sequence instead of the first.
789 
790    RELAX_SECOND_LONGER
791 	Set in the first variant frag if the macro's second implementation
792 	is longer than its first.  This refers to the macro as a whole,
793 	not an individual relaxation.
794 
795    RELAX_NOMACRO
796 	Set in the first variant frag if the macro appeared in a .set nomacro
797 	block and if one alternative requires a warning but the other does not.
798 
799    RELAX_DELAY_SLOT
800 	Like RELAX_NOMACRO, but indicates that the macro appears in a branch
801 	delay slot.
802 
803    The frag's "opcode" points to the first fixup for relaxable code.
804 
805    Relaxable macros are generated using a sequence such as:
806 
807       relax_start (SYMBOL);
808       ... generate first expansion ...
809       relax_switch ();
810       ... generate second expansion ...
811       relax_end ();
812 
813    The code and fixups for the unwanted alternative are discarded
814    by md_convert_frag.  */
815 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
816 
817 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
818 #define RELAX_SECOND(X) ((X) & 0xff)
819 #define RELAX_USE_SECOND 0x10000
820 #define RELAX_SECOND_LONGER 0x20000
821 #define RELAX_NOMACRO 0x40000
822 #define RELAX_DELAY_SLOT 0x80000
823 
824 /* Branch without likely bit.  If label is out of range, we turn:
825 
826  	beq reg1, reg2, label
827 	delay slot
828 
829    into
830 
831         bne reg1, reg2, 0f
832         nop
833         j label
834      0: delay slot
835 
836    with the following opcode replacements:
837 
838 	beq <-> bne
839 	blez <-> bgtz
840 	bltz <-> bgez
841 	bc1f <-> bc1t
842 
843 	bltzal <-> bgezal  (with jal label instead of j label)
844 
845    Even though keeping the delay slot instruction in the delay slot of
846    the branch would be more efficient, it would be very tricky to do
847    correctly, because we'd have to introduce a variable frag *after*
848    the delay slot instruction, and expand that instead.  Let's do it
849    the easy way for now, even if the branch-not-taken case now costs
850    one additional instruction.  Out-of-range branches are not supposed
851    to be common, anyway.
852 
853    Branch likely.  If label is out of range, we turn:
854 
855 	beql reg1, reg2, label
856 	delay slot (annulled if branch not taken)
857 
858    into
859 
860         beql reg1, reg2, 1f
861         nop
862         beql $0, $0, 2f
863         nop
864      1: j[al] label
865         delay slot (executed only if branch taken)
866      2:
867 
868    It would be possible to generate a shorter sequence by losing the
869    likely bit, generating something like:
870 
871 	bne reg1, reg2, 0f
872 	nop
873 	j[al] label
874 	delay slot (executed only if branch taken)
875      0:
876 
877 	beql -> bne
878 	bnel -> beq
879 	blezl -> bgtz
880 	bgtzl -> blez
881 	bltzl -> bgez
882 	bgezl -> bltz
883 	bc1fl -> bc1t
884 	bc1tl -> bc1f
885 
886 	bltzall -> bgezal  (with jal label instead of j label)
887 	bgezall -> bltzal  (ditto)
888 
889 
890    but it's not clear that it would actually improve performance.  */
891 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
892   ((relax_substateT) \
893    (0xc0000000 \
894     | ((toofar) ? 1 : 0) \
895     | ((link) ? 2 : 0) \
896     | ((likely) ? 4 : 0) \
897     | ((uncond) ? 8 : 0)))
898 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
899 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
900 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
901 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
902 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
903 
904 /* For mips16 code, we use an entirely different form of relaxation.
905    mips16 supports two versions of most instructions which take
906    immediate values: a small one which takes some small value, and a
907    larger one which takes a 16 bit value.  Since branches also follow
908    this pattern, relaxing these values is required.
909 
910    We can assemble both mips16 and normal MIPS code in a single
911    object.  Therefore, we need to support this type of relaxation at
912    the same time that we support the relaxation described above.  We
913    use the high bit of the subtype field to distinguish these cases.
914 
915    The information we store for this type of relaxation is the
916    argument code found in the opcode file for this relocation, whether
917    the user explicitly requested a small or extended form, and whether
918    the relocation is in a jump or jal delay slot.  That tells us the
919    size of the value, and how it should be stored.  We also store
920    whether the fragment is considered to be extended or not.  We also
921    store whether this is known to be a branch to a different section,
922    whether we have tried to relax this frag yet, and whether we have
923    ever extended a PC relative fragment because of a shift count.  */
924 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot)	\
925   (0x80000000							\
926    | ((type) & 0xff)						\
927    | ((small) ? 0x100 : 0)					\
928    | ((ext) ? 0x200 : 0)					\
929    | ((dslot) ? 0x400 : 0)					\
930    | ((jal_dslot) ? 0x800 : 0))
931 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
932 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
933 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
934 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
935 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
936 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
937 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
938 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
939 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
940 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
941 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
942 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
943 
944 /* Is the given value a sign-extended 32-bit value?  */
945 #define IS_SEXT_32BIT_NUM(x)						\
946   (((x) &~ (offsetT) 0x7fffffff) == 0					\
947    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
948 
949 /* Is the given value a sign-extended 16-bit value?  */
950 #define IS_SEXT_16BIT_NUM(x)						\
951   (((x) &~ (offsetT) 0x7fff) == 0					\
952    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
953 
954 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
955 #define IS_ZEXT_32BIT_NUM(x)						\
956   (((x) &~ (offsetT) 0xffffffff) == 0					\
957    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
958 
959 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
960    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
961 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
962   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
963 	      | (((VALUE) & (MASK)) << (SHIFT)))
964 
965 /* Extract bits MASK << SHIFT from STRUCT and shift them right
966    SHIFT places.  */
967 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
968   (((STRUCT) >> (SHIFT)) & (MASK))
969 
970 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
971    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
972 
973    include/opcode/mips.h specifies operand fields using the macros
974    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
975    with "MIPS16OP" instead of "OP".  */
976 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
977   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
978 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
979   INSERT_BITS ((INSN).insn_opcode, VALUE, \
980 		MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
981 
982 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
983 #define EXTRACT_OPERAND(FIELD, INSN) \
984   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
985 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
986   EXTRACT_BITS ((INSN).insn_opcode, \
987 		MIPS16OP_MASK_##FIELD, \
988 		MIPS16OP_SH_##FIELD)
989 
990 /* Global variables used when generating relaxable macros.  See the
991    comment above RELAX_ENCODE for more details about how relaxation
992    is used.  */
993 static struct {
994   /* 0 if we're not emitting a relaxable macro.
995      1 if we're emitting the first of the two relaxation alternatives.
996      2 if we're emitting the second alternative.  */
997   int sequence;
998 
999   /* The first relaxable fixup in the current frag.  (In other words,
1000      the first fixup that refers to relaxable code.)  */
1001   fixS *first_fixup;
1002 
1003   /* sizes[0] says how many bytes of the first alternative are stored in
1004      the current frag.  Likewise sizes[1] for the second alternative.  */
1005   unsigned int sizes[2];
1006 
1007   /* The symbol on which the choice of sequence depends.  */
1008   symbolS *symbol;
1009 } mips_relax;
1010 
1011 /* Global variables used to decide whether a macro needs a warning.  */
1012 static struct {
1013   /* True if the macro is in a branch delay slot.  */
1014   bfd_boolean delay_slot_p;
1015 
1016   /* For relaxable macros, sizes[0] is the length of the first alternative
1017      in bytes and sizes[1] is the length of the second alternative.
1018      For non-relaxable macros, both elements give the length of the
1019      macro in bytes.  */
1020   unsigned int sizes[2];
1021 
1022   /* The first variant frag for this macro.  */
1023   fragS *first_frag;
1024 } mips_macro_warning;
1025 
1026 /* Prototypes for static functions.  */
1027 
1028 #define internalError()							\
1029     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1030 
1031 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1032 
1033 static void append_insn
1034   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1035 static void mips_no_prev_insn (void);
1036 static void mips16_macro_build
1037   (expressionS *, const char *, const char *, va_list);
1038 static void load_register (int, expressionS *, int);
1039 static void macro_start (void);
1040 static void macro_end (void);
1041 static void macro (struct mips_cl_insn * ip);
1042 static void mips16_macro (struct mips_cl_insn * ip);
1043 #ifdef LOSING_COMPILER
1044 static void macro2 (struct mips_cl_insn * ip);
1045 #endif
1046 static void mips_ip (char *str, struct mips_cl_insn * ip);
1047 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1048 static void mips16_immed
1049   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1050    unsigned long *, bfd_boolean *, unsigned short *);
1051 static size_t my_getSmallExpression
1052   (expressionS *, bfd_reloc_code_real_type *, char *);
1053 static void my_getExpression (expressionS *, char *);
1054 static void s_align (int);
1055 static void s_change_sec (int);
1056 static void s_change_section (int);
1057 static void s_cons (int);
1058 static void s_float_cons (int);
1059 static void s_mips_globl (int);
1060 static void s_option (int);
1061 static void s_mipsset (int);
1062 static void s_abicalls (int);
1063 static void s_cpload (int);
1064 static void s_cpsetup (int);
1065 static void s_cplocal (int);
1066 static void s_cprestore (int);
1067 static void s_cpreturn (int);
1068 static void s_dtprelword (int);
1069 static void s_dtpreldword (int);
1070 static void s_gpvalue (int);
1071 static void s_gpword (int);
1072 static void s_gpdword (int);
1073 static void s_cpadd (int);
1074 static void s_insn (int);
1075 static void md_obj_begin (void);
1076 static void md_obj_end (void);
1077 static void s_mips_ent (int);
1078 static void s_mips_end (int);
1079 static void s_mips_frame (int);
1080 static void s_mips_mask (int reg_type);
1081 static void s_mips_stab (int);
1082 static void s_mips_weakext (int);
1083 static void s_mips_file (int);
1084 static void s_mips_loc (int);
1085 static bfd_boolean pic_need_relax (symbolS *, asection *);
1086 static int relaxed_branch_length (fragS *, asection *, int);
1087 static int validate_mips_insn (const struct mips_opcode *);
1088 
1089 /* Table and functions used to map between CPU/ISA names, and
1090    ISA levels, and CPU numbers.  */
1091 
1092 struct mips_cpu_info
1093 {
1094   const char *name;           /* CPU or ISA name.  */
1095   int flags;                  /* ASEs available, or ISA flag.  */
1096   int isa;                    /* ISA level.  */
1097   int cpu;                    /* CPU number (default CPU if ISA).  */
1098 };
1099 
1100 #define MIPS_CPU_IS_ISA		0x0001	/* Is this an ISA?  (If 0, a CPU.) */
1101 #define MIPS_CPU_ASE_SMARTMIPS	0x0002	/* CPU implements SmartMIPS ASE */
1102 #define MIPS_CPU_ASE_DSP	0x0004	/* CPU implements DSP ASE */
1103 #define MIPS_CPU_ASE_MT		0x0008	/* CPU implements MT ASE */
1104 #define MIPS_CPU_ASE_MIPS3D	0x0010	/* CPU implements MIPS-3D ASE */
1105 #define MIPS_CPU_ASE_MDMX	0x0020	/* CPU implements MDMX ASE */
1106 #define MIPS_CPU_ASE_DSPR2	0x0040	/* CPU implements DSP R2 ASE */
1107 
1108 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1109 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1110 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1111 
1112 /* Pseudo-op table.
1113 
1114    The following pseudo-ops from the Kane and Heinrich MIPS book
1115    should be defined here, but are currently unsupported: .alias,
1116    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1117 
1118    The following pseudo-ops from the Kane and Heinrich MIPS book are
1119    specific to the type of debugging information being generated, and
1120    should be defined by the object format: .aent, .begin, .bend,
1121    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1122    .vreg.
1123 
1124    The following pseudo-ops from the Kane and Heinrich MIPS book are
1125    not MIPS CPU specific, but are also not specific to the object file
1126    format.  This file is probably the best place to define them, but
1127    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1128 
1129 static const pseudo_typeS mips_pseudo_table[] =
1130 {
1131   /* MIPS specific pseudo-ops.  */
1132   {"option", s_option, 0},
1133   {"set", s_mipsset, 0},
1134   {"rdata", s_change_sec, 'r'},
1135   {"sdata", s_change_sec, 's'},
1136   {"livereg", s_ignore, 0},
1137   {"abicalls", s_abicalls, 0},
1138   {"cpload", s_cpload, 0},
1139   {"cpsetup", s_cpsetup, 0},
1140   {"cplocal", s_cplocal, 0},
1141   {"cprestore", s_cprestore, 0},
1142   {"cpreturn", s_cpreturn, 0},
1143   {"dtprelword", s_dtprelword, 0},
1144   {"dtpreldword", s_dtpreldword, 0},
1145   {"gpvalue", s_gpvalue, 0},
1146   {"gpword", s_gpword, 0},
1147   {"gpdword", s_gpdword, 0},
1148   {"cpadd", s_cpadd, 0},
1149   {"insn", s_insn, 0},
1150 
1151   /* Relatively generic pseudo-ops that happen to be used on MIPS
1152      chips.  */
1153   {"asciiz", stringer, 8 + 1},
1154   {"bss", s_change_sec, 'b'},
1155   {"err", s_err, 0},
1156   {"half", s_cons, 1},
1157   {"dword", s_cons, 3},
1158   {"weakext", s_mips_weakext, 0},
1159   {"origin", s_org, 0},
1160   {"repeat", s_rept, 0},
1161 
1162   /* These pseudo-ops are defined in read.c, but must be overridden
1163      here for one reason or another.  */
1164   {"align", s_align, 0},
1165   {"byte", s_cons, 0},
1166   {"data", s_change_sec, 'd'},
1167   {"double", s_float_cons, 'd'},
1168   {"float", s_float_cons, 'f'},
1169   {"globl", s_mips_globl, 0},
1170   {"global", s_mips_globl, 0},
1171   {"hword", s_cons, 1},
1172   {"int", s_cons, 2},
1173   {"long", s_cons, 2},
1174   {"octa", s_cons, 4},
1175   {"quad", s_cons, 3},
1176   {"section", s_change_section, 0},
1177   {"short", s_cons, 1},
1178   {"single", s_float_cons, 'f'},
1179   {"stabn", s_mips_stab, 'n'},
1180   {"text", s_change_sec, 't'},
1181   {"word", s_cons, 2},
1182 
1183   { "extern", ecoff_directive_extern, 0},
1184 
1185   { NULL, NULL, 0 },
1186 };
1187 
1188 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1189 {
1190   /* These pseudo-ops should be defined by the object file format.
1191      However, a.out doesn't support them, so we have versions here.  */
1192   {"aent", s_mips_ent, 1},
1193   {"bgnb", s_ignore, 0},
1194   {"end", s_mips_end, 0},
1195   {"endb", s_ignore, 0},
1196   {"ent", s_mips_ent, 0},
1197   {"file", s_mips_file, 0},
1198   {"fmask", s_mips_mask, 'F'},
1199   {"frame", s_mips_frame, 0},
1200   {"loc", s_mips_loc, 0},
1201   {"mask", s_mips_mask, 'R'},
1202   {"verstamp", s_ignore, 0},
1203   { NULL, NULL, 0 },
1204 };
1205 
1206 extern void pop_insert (const pseudo_typeS *);
1207 
1208 void
1209 mips_pop_insert (void)
1210 {
1211   pop_insert (mips_pseudo_table);
1212   if (! ECOFF_DEBUGGING)
1213     pop_insert (mips_nonecoff_pseudo_table);
1214 }
1215 
1216 /* Symbols labelling the current insn.  */
1217 
1218 struct insn_label_list
1219 {
1220   struct insn_label_list *next;
1221   symbolS *label;
1222 };
1223 
1224 static struct insn_label_list *free_insn_labels;
1225 #define label_list tc_segment_info_data.labels
1226 
1227 static void mips_clear_insn_labels (void);
1228 
1229 static inline void
1230 mips_clear_insn_labels (void)
1231 {
1232   register struct insn_label_list **pl;
1233   segment_info_type *si;
1234 
1235   if (now_seg)
1236     {
1237       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1238 	;
1239 
1240       si = seg_info (now_seg);
1241       *pl = si->label_list;
1242       si->label_list = NULL;
1243     }
1244 }
1245 
1246 
1247 static char *expr_end;
1248 
1249 /* Expressions which appear in instructions.  These are set by
1250    mips_ip.  */
1251 
1252 static expressionS imm_expr;
1253 static expressionS imm2_expr;
1254 static expressionS offset_expr;
1255 
1256 /* Relocs associated with imm_expr and offset_expr.  */
1257 
1258 static bfd_reloc_code_real_type imm_reloc[3]
1259   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1260 static bfd_reloc_code_real_type offset_reloc[3]
1261   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1262 
1263 /* These are set by mips16_ip if an explicit extension is used.  */
1264 
1265 static bfd_boolean mips16_small, mips16_ext;
1266 
1267 #ifdef OBJ_ELF
1268 /* The pdr segment for per procedure frame/regmask info.  Not used for
1269    ECOFF debugging.  */
1270 
1271 static segT pdr_seg;
1272 #endif
1273 
1274 /* The default target format to use.  */
1275 
1276 const char *
1277 mips_target_format (void)
1278 {
1279   switch (OUTPUT_FLAVOR)
1280     {
1281     case bfd_target_ecoff_flavour:
1282       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1283     case bfd_target_coff_flavour:
1284       return "pe-mips";
1285     case bfd_target_elf_flavour:
1286 #ifdef TE_VXWORKS
1287       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1288 	return (target_big_endian
1289 		? "elf32-bigmips-vxworks"
1290 		: "elf32-littlemips-vxworks");
1291 #endif
1292 #ifdef TE_TMIPS
1293       /* This is traditional mips.  */
1294       return (target_big_endian
1295 	      ? (HAVE_64BIT_OBJECTS
1296 		 ? "elf64-tradbigmips"
1297 		 : (HAVE_NEWABI
1298 		    ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1299 	      : (HAVE_64BIT_OBJECTS
1300 		 ? "elf64-tradlittlemips"
1301 		 : (HAVE_NEWABI
1302 		    ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1303 #else
1304       return (target_big_endian
1305 	      ? (HAVE_64BIT_OBJECTS
1306 		 ? "elf64-bigmips"
1307 		 : (HAVE_NEWABI
1308 		    ? "elf32-nbigmips" : "elf32-bigmips"))
1309 	      : (HAVE_64BIT_OBJECTS
1310 		 ? "elf64-littlemips"
1311 		 : (HAVE_NEWABI
1312 		    ? "elf32-nlittlemips" : "elf32-littlemips")));
1313 #endif
1314     default:
1315       abort ();
1316       return NULL;
1317     }
1318 }
1319 
1320 /* Return the length of instruction INSN.  */
1321 
1322 static inline unsigned int
1323 insn_length (const struct mips_cl_insn *insn)
1324 {
1325   if (!mips_opts.mips16)
1326     return 4;
1327   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1328 }
1329 
1330 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1331 
1332 static void
1333 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1334 {
1335   size_t i;
1336 
1337   insn->insn_mo = mo;
1338   insn->use_extend = FALSE;
1339   insn->extend = 0;
1340   insn->insn_opcode = mo->match;
1341   insn->frag = NULL;
1342   insn->where = 0;
1343   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1344     insn->fixp[i] = NULL;
1345   insn->fixed_p = (mips_opts.noreorder > 0);
1346   insn->noreorder_p = (mips_opts.noreorder > 0);
1347   insn->mips16_absolute_jump_p = 0;
1348 }
1349 
1350 /* Record the current MIPS16 mode in now_seg.  */
1351 
1352 static void
1353 mips_record_mips16_mode (void)
1354 {
1355   segment_info_type *si;
1356 
1357   si = seg_info (now_seg);
1358   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1359     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1360 }
1361 
1362 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1363 
1364 static void
1365 install_insn (const struct mips_cl_insn *insn)
1366 {
1367   char *f = insn->frag->fr_literal + insn->where;
1368   if (!mips_opts.mips16)
1369     md_number_to_chars (f, insn->insn_opcode, 4);
1370   else if (insn->mips16_absolute_jump_p)
1371     {
1372       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1373       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1374     }
1375   else
1376     {
1377       if (insn->use_extend)
1378 	{
1379 	  md_number_to_chars (f, 0xf000 | insn->extend, 2);
1380 	  f += 2;
1381 	}
1382       md_number_to_chars (f, insn->insn_opcode, 2);
1383     }
1384   mips_record_mips16_mode ();
1385 }
1386 
1387 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1388    and install the opcode in the new location.  */
1389 
1390 static void
1391 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1392 {
1393   size_t i;
1394 
1395   insn->frag = frag;
1396   insn->where = where;
1397   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1398     if (insn->fixp[i] != NULL)
1399       {
1400 	insn->fixp[i]->fx_frag = frag;
1401 	insn->fixp[i]->fx_where = where;
1402       }
1403   install_insn (insn);
1404 }
1405 
1406 /* Add INSN to the end of the output.  */
1407 
1408 static void
1409 add_fixed_insn (struct mips_cl_insn *insn)
1410 {
1411   char *f = frag_more (insn_length (insn));
1412   move_insn (insn, frag_now, f - frag_now->fr_literal);
1413 }
1414 
1415 /* Start a variant frag and move INSN to the start of the variant part,
1416    marking it as fixed.  The other arguments are as for frag_var.  */
1417 
1418 static void
1419 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1420 		  relax_substateT subtype, symbolS *symbol, offsetT offset)
1421 {
1422   frag_grow (max_chars);
1423   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1424   insn->fixed_p = 1;
1425   frag_var (rs_machine_dependent, max_chars, var,
1426 	    subtype, symbol, offset, NULL);
1427 }
1428 
1429 /* Insert N copies of INSN into the history buffer, starting at
1430    position FIRST.  Neither FIRST nor N need to be clipped.  */
1431 
1432 static void
1433 insert_into_history (unsigned int first, unsigned int n,
1434 		     const struct mips_cl_insn *insn)
1435 {
1436   if (mips_relax.sequence != 2)
1437     {
1438       unsigned int i;
1439 
1440       for (i = ARRAY_SIZE (history); i-- > first;)
1441 	if (i >= first + n)
1442 	  history[i] = history[i - n];
1443 	else
1444 	  history[i] = *insn;
1445     }
1446 }
1447 
1448 /* Emit a nop instruction, recording it in the history buffer.  */
1449 
1450 static void
1451 emit_nop (void)
1452 {
1453   add_fixed_insn (NOP_INSN);
1454   insert_into_history (0, 1, NOP_INSN);
1455 }
1456 
1457 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1458    the idea is to make it obvious at a glance that each errata is
1459    included.  */
1460 
1461 static void
1462 init_vr4120_conflicts (void)
1463 {
1464 #define CONFLICT(FIRST, SECOND) \
1465     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1466 
1467   /* Errata 21 - [D]DIV[U] after [D]MACC */
1468   CONFLICT (MACC, DIV);
1469   CONFLICT (DMACC, DIV);
1470 
1471   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1472   CONFLICT (DMULT, DMULT);
1473   CONFLICT (DMULT, DMACC);
1474   CONFLICT (DMACC, DMULT);
1475   CONFLICT (DMACC, DMACC);
1476 
1477   /* Errata 24 - MT{LO,HI} after [D]MACC */
1478   CONFLICT (MACC, MTHILO);
1479   CONFLICT (DMACC, MTHILO);
1480 
1481   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1482      instruction is executed immediately after a MACC or DMACC
1483      instruction, the result of [either instruction] is incorrect."  */
1484   CONFLICT (MACC, MULT);
1485   CONFLICT (MACC, DMULT);
1486   CONFLICT (DMACC, MULT);
1487   CONFLICT (DMACC, DMULT);
1488 
1489   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1490      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1491      DDIV or DDIVU instruction, the result of the MACC or
1492      DMACC instruction is incorrect.".  */
1493   CONFLICT (DMULT, MACC);
1494   CONFLICT (DMULT, DMACC);
1495   CONFLICT (DIV, MACC);
1496   CONFLICT (DIV, DMACC);
1497 
1498 #undef CONFLICT
1499 }
1500 
1501 struct regname {
1502   const char *name;
1503   unsigned int num;
1504 };
1505 
1506 #define RTYPE_MASK	0x1ff00
1507 #define RTYPE_NUM	0x00100
1508 #define RTYPE_FPU	0x00200
1509 #define RTYPE_FCC	0x00400
1510 #define RTYPE_VEC	0x00800
1511 #define RTYPE_GP	0x01000
1512 #define RTYPE_CP0	0x02000
1513 #define RTYPE_PC	0x04000
1514 #define RTYPE_ACC	0x08000
1515 #define RTYPE_CCC	0x10000
1516 #define RNUM_MASK	0x000ff
1517 #define RWARN		0x80000
1518 
1519 #define GENERIC_REGISTER_NUMBERS \
1520     {"$0",	RTYPE_NUM | 0},  \
1521     {"$1",	RTYPE_NUM | 1},  \
1522     {"$2",	RTYPE_NUM | 2},  \
1523     {"$3",	RTYPE_NUM | 3},  \
1524     {"$4",	RTYPE_NUM | 4},  \
1525     {"$5",	RTYPE_NUM | 5},  \
1526     {"$6",	RTYPE_NUM | 6},  \
1527     {"$7",	RTYPE_NUM | 7},  \
1528     {"$8",	RTYPE_NUM | 8},  \
1529     {"$9",	RTYPE_NUM | 9},  \
1530     {"$10",	RTYPE_NUM | 10}, \
1531     {"$11",	RTYPE_NUM | 11}, \
1532     {"$12",	RTYPE_NUM | 12}, \
1533     {"$13",	RTYPE_NUM | 13}, \
1534     {"$14",	RTYPE_NUM | 14}, \
1535     {"$15",	RTYPE_NUM | 15}, \
1536     {"$16",	RTYPE_NUM | 16}, \
1537     {"$17",	RTYPE_NUM | 17}, \
1538     {"$18",	RTYPE_NUM | 18}, \
1539     {"$19",	RTYPE_NUM | 19}, \
1540     {"$20",	RTYPE_NUM | 20}, \
1541     {"$21",	RTYPE_NUM | 21}, \
1542     {"$22",	RTYPE_NUM | 22}, \
1543     {"$23",	RTYPE_NUM | 23}, \
1544     {"$24",	RTYPE_NUM | 24}, \
1545     {"$25",	RTYPE_NUM | 25}, \
1546     {"$26",	RTYPE_NUM | 26}, \
1547     {"$27",	RTYPE_NUM | 27}, \
1548     {"$28",	RTYPE_NUM | 28}, \
1549     {"$29",	RTYPE_NUM | 29}, \
1550     {"$30",	RTYPE_NUM | 30}, \
1551     {"$31",	RTYPE_NUM | 31}
1552 
1553 #define FPU_REGISTER_NAMES       \
1554     {"$f0",	RTYPE_FPU | 0},  \
1555     {"$f1",	RTYPE_FPU | 1},  \
1556     {"$f2",	RTYPE_FPU | 2},  \
1557     {"$f3",	RTYPE_FPU | 3},  \
1558     {"$f4",	RTYPE_FPU | 4},  \
1559     {"$f5",	RTYPE_FPU | 5},  \
1560     {"$f6",	RTYPE_FPU | 6},  \
1561     {"$f7",	RTYPE_FPU | 7},  \
1562     {"$f8",	RTYPE_FPU | 8},  \
1563     {"$f9",	RTYPE_FPU | 9},  \
1564     {"$f10",	RTYPE_FPU | 10}, \
1565     {"$f11",	RTYPE_FPU | 11}, \
1566     {"$f12",	RTYPE_FPU | 12}, \
1567     {"$f13",	RTYPE_FPU | 13}, \
1568     {"$f14",	RTYPE_FPU | 14}, \
1569     {"$f15",	RTYPE_FPU | 15}, \
1570     {"$f16",	RTYPE_FPU | 16}, \
1571     {"$f17",	RTYPE_FPU | 17}, \
1572     {"$f18",	RTYPE_FPU | 18}, \
1573     {"$f19",	RTYPE_FPU | 19}, \
1574     {"$f20",	RTYPE_FPU | 20}, \
1575     {"$f21",	RTYPE_FPU | 21}, \
1576     {"$f22",	RTYPE_FPU | 22}, \
1577     {"$f23",	RTYPE_FPU | 23}, \
1578     {"$f24",	RTYPE_FPU | 24}, \
1579     {"$f25",	RTYPE_FPU | 25}, \
1580     {"$f26",	RTYPE_FPU | 26}, \
1581     {"$f27",	RTYPE_FPU | 27}, \
1582     {"$f28",	RTYPE_FPU | 28}, \
1583     {"$f29",	RTYPE_FPU | 29}, \
1584     {"$f30",	RTYPE_FPU | 30}, \
1585     {"$f31",	RTYPE_FPU | 31}
1586 
1587 #define FPU_CONDITION_CODE_NAMES \
1588     {"$fcc0",	RTYPE_FCC | 0},  \
1589     {"$fcc1",	RTYPE_FCC | 1},  \
1590     {"$fcc2",	RTYPE_FCC | 2},  \
1591     {"$fcc3",	RTYPE_FCC | 3},  \
1592     {"$fcc4",	RTYPE_FCC | 4},  \
1593     {"$fcc5",	RTYPE_FCC | 5},  \
1594     {"$fcc6",	RTYPE_FCC | 6},  \
1595     {"$fcc7",	RTYPE_FCC | 7}
1596 
1597 #define COPROC_CONDITION_CODE_NAMES         \
1598     {"$cc0",	RTYPE_FCC | RTYPE_CCC | 0}, \
1599     {"$cc1",	RTYPE_FCC | RTYPE_CCC | 1}, \
1600     {"$cc2",	RTYPE_FCC | RTYPE_CCC | 2}, \
1601     {"$cc3",	RTYPE_FCC | RTYPE_CCC | 3}, \
1602     {"$cc4",	RTYPE_FCC | RTYPE_CCC | 4}, \
1603     {"$cc5",	RTYPE_FCC | RTYPE_CCC | 5}, \
1604     {"$cc6",	RTYPE_FCC | RTYPE_CCC | 6}, \
1605     {"$cc7",	RTYPE_FCC | RTYPE_CCC | 7}
1606 
1607 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1608     {"$a4",	RTYPE_GP | 8},  \
1609     {"$a5",	RTYPE_GP | 9},  \
1610     {"$a6",	RTYPE_GP | 10}, \
1611     {"$a7",	RTYPE_GP | 11}, \
1612     {"$ta0",	RTYPE_GP | 8},  /* alias for $a4 */ \
1613     {"$ta1",	RTYPE_GP | 9},  /* alias for $a5 */ \
1614     {"$ta2",	RTYPE_GP | 10}, /* alias for $a6 */ \
1615     {"$ta3",	RTYPE_GP | 11}, /* alias for $a7 */ \
1616     {"$t0",	RTYPE_GP | 12}, \
1617     {"$t1",	RTYPE_GP | 13}, \
1618     {"$t2",	RTYPE_GP | 14}, \
1619     {"$t3",	RTYPE_GP | 15}
1620 
1621 #define O32_SYMBOLIC_REGISTER_NAMES \
1622     {"$t0",	RTYPE_GP | 8},  \
1623     {"$t1",	RTYPE_GP | 9},  \
1624     {"$t2",	RTYPE_GP | 10}, \
1625     {"$t3",	RTYPE_GP | 11}, \
1626     {"$t4",	RTYPE_GP | 12}, \
1627     {"$t5",	RTYPE_GP | 13}, \
1628     {"$t6",	RTYPE_GP | 14}, \
1629     {"$t7",	RTYPE_GP | 15}, \
1630     {"$ta0",	RTYPE_GP | 12}, /* alias for $t4 */ \
1631     {"$ta1",	RTYPE_GP | 13}, /* alias for $t5 */ \
1632     {"$ta2",	RTYPE_GP | 14}, /* alias for $t6 */ \
1633     {"$ta3",	RTYPE_GP | 15}  /* alias for $t7 */
1634 
1635 /* Remaining symbolic register names */
1636 #define SYMBOLIC_REGISTER_NAMES \
1637     {"$zero",	RTYPE_GP | 0},  \
1638     {"$at",	RTYPE_GP | 1},  \
1639     {"$AT",	RTYPE_GP | 1},  \
1640     {"$v0",	RTYPE_GP | 2},  \
1641     {"$v1",	RTYPE_GP | 3},  \
1642     {"$a0",	RTYPE_GP | 4},  \
1643     {"$a1",	RTYPE_GP | 5},  \
1644     {"$a2",	RTYPE_GP | 6},  \
1645     {"$a3",	RTYPE_GP | 7},  \
1646     {"$s0",	RTYPE_GP | 16}, \
1647     {"$s1",	RTYPE_GP | 17}, \
1648     {"$s2",	RTYPE_GP | 18}, \
1649     {"$s3",	RTYPE_GP | 19}, \
1650     {"$s4",	RTYPE_GP | 20}, \
1651     {"$s5",	RTYPE_GP | 21}, \
1652     {"$s6",	RTYPE_GP | 22}, \
1653     {"$s7",	RTYPE_GP | 23}, \
1654     {"$t8",	RTYPE_GP | 24}, \
1655     {"$t9",	RTYPE_GP | 25}, \
1656     {"$k0",	RTYPE_GP | 26}, \
1657     {"$kt0",	RTYPE_GP | 26}, \
1658     {"$k1",	RTYPE_GP | 27}, \
1659     {"$kt1",	RTYPE_GP | 27}, \
1660     {"$gp",	RTYPE_GP | 28}, \
1661     {"$sp",	RTYPE_GP | 29}, \
1662     {"$s8",	RTYPE_GP | 30}, \
1663     {"$fp",	RTYPE_GP | 30}, \
1664     {"$ra",	RTYPE_GP | 31}
1665 
1666 #define MIPS16_SPECIAL_REGISTER_NAMES \
1667     {"$pc",	RTYPE_PC | 0}
1668 
1669 #define MDMX_VECTOR_REGISTER_NAMES \
1670     /* {"$v0",	RTYPE_VEC | 0},  clash with REG 2 above */ \
1671     /* {"$v1",	RTYPE_VEC | 1},  clash with REG 3 above */ \
1672     {"$v2",	RTYPE_VEC | 2},  \
1673     {"$v3",	RTYPE_VEC | 3},  \
1674     {"$v4",	RTYPE_VEC | 4},  \
1675     {"$v5",	RTYPE_VEC | 5},  \
1676     {"$v6",	RTYPE_VEC | 6},  \
1677     {"$v7",	RTYPE_VEC | 7},  \
1678     {"$v8",	RTYPE_VEC | 8},  \
1679     {"$v9",	RTYPE_VEC | 9},  \
1680     {"$v10",	RTYPE_VEC | 10}, \
1681     {"$v11",	RTYPE_VEC | 11}, \
1682     {"$v12",	RTYPE_VEC | 12}, \
1683     {"$v13",	RTYPE_VEC | 13}, \
1684     {"$v14",	RTYPE_VEC | 14}, \
1685     {"$v15",	RTYPE_VEC | 15}, \
1686     {"$v16",	RTYPE_VEC | 16}, \
1687     {"$v17",	RTYPE_VEC | 17}, \
1688     {"$v18",	RTYPE_VEC | 18}, \
1689     {"$v19",	RTYPE_VEC | 19}, \
1690     {"$v20",	RTYPE_VEC | 20}, \
1691     {"$v21",	RTYPE_VEC | 21}, \
1692     {"$v22",	RTYPE_VEC | 22}, \
1693     {"$v23",	RTYPE_VEC | 23}, \
1694     {"$v24",	RTYPE_VEC | 24}, \
1695     {"$v25",	RTYPE_VEC | 25}, \
1696     {"$v26",	RTYPE_VEC | 26}, \
1697     {"$v27",	RTYPE_VEC | 27}, \
1698     {"$v28",	RTYPE_VEC | 28}, \
1699     {"$v29",	RTYPE_VEC | 29}, \
1700     {"$v30",	RTYPE_VEC | 30}, \
1701     {"$v31",	RTYPE_VEC | 31}
1702 
1703 #define MIPS_DSP_ACCUMULATOR_NAMES \
1704     {"$ac0",	RTYPE_ACC | 0}, \
1705     {"$ac1",	RTYPE_ACC | 1}, \
1706     {"$ac2",	RTYPE_ACC | 2}, \
1707     {"$ac3",	RTYPE_ACC | 3}
1708 
1709 static const struct regname reg_names[] = {
1710   GENERIC_REGISTER_NUMBERS,
1711   FPU_REGISTER_NAMES,
1712   FPU_CONDITION_CODE_NAMES,
1713   COPROC_CONDITION_CODE_NAMES,
1714 
1715   /* The $txx registers depends on the abi,
1716      these will be added later into the symbol table from
1717      one of the tables below once mips_abi is set after
1718      parsing of arguments from the command line. */
1719   SYMBOLIC_REGISTER_NAMES,
1720 
1721   MIPS16_SPECIAL_REGISTER_NAMES,
1722   MDMX_VECTOR_REGISTER_NAMES,
1723   MIPS_DSP_ACCUMULATOR_NAMES,
1724   {0, 0}
1725 };
1726 
1727 static const struct regname reg_names_o32[] = {
1728   O32_SYMBOLIC_REGISTER_NAMES,
1729   {0, 0}
1730 };
1731 
1732 static const struct regname reg_names_n32n64[] = {
1733   N32N64_SYMBOLIC_REGISTER_NAMES,
1734   {0, 0}
1735 };
1736 
1737 static int
1738 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1739 {
1740   symbolS *symbolP;
1741   char *e;
1742   char save_c;
1743   int reg = -1;
1744 
1745   /* Find end of name.  */
1746   e = *s;
1747   if (is_name_beginner (*e))
1748     ++e;
1749   while (is_part_of_name (*e))
1750     ++e;
1751 
1752   /* Terminate name.  */
1753   save_c = *e;
1754   *e = '\0';
1755 
1756   /* Look for a register symbol.  */
1757   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1758     {
1759       int r = S_GET_VALUE (symbolP);
1760       if (r & types)
1761 	reg = r & RNUM_MASK;
1762       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1763 	/* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1764 	reg = (r & RNUM_MASK) - 2;
1765     }
1766   /* Else see if this is a register defined in an itbl entry.  */
1767   else if ((types & RTYPE_GP) && itbl_have_entries)
1768     {
1769       char *n = *s;
1770       unsigned long r;
1771 
1772       if (*n == '$')
1773 	++n;
1774       if (itbl_get_reg_val (n, &r))
1775 	reg = r & RNUM_MASK;
1776     }
1777 
1778   /* Advance to next token if a register was recognised.  */
1779   if (reg >= 0)
1780     *s = e;
1781   else if (types & RWARN)
1782     as_warn ("Unrecognized register name `%s'", *s);
1783 
1784   *e = save_c;
1785   if (regnop)
1786     *regnop = reg;
1787   return reg >= 0;
1788 }
1789 
1790 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1791    architecture.  If EXPANSIONP is TRUE then this check is done while
1792    expanding a macro.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1793 
1794 static bfd_boolean
1795 is_opcode_valid (const struct mips_opcode *mo, bfd_boolean expansionp)
1796 {
1797   int isa = mips_opts.isa;
1798   int fp_s, fp_d;
1799 
1800   if (mips_opts.ase_mdmx)
1801     isa |= INSN_MDMX;
1802   if (mips_opts.ase_dsp)
1803     isa |= INSN_DSP;
1804   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1805     isa |= INSN_DSP64;
1806   if (mips_opts.ase_dspr2)
1807     isa |= INSN_DSPR2;
1808   if (mips_opts.ase_mt)
1809     isa |= INSN_MT;
1810   if (mips_opts.ase_mips3d)
1811     isa |= INSN_MIPS3D;
1812   if (mips_opts.ase_smartmips)
1813     isa |= INSN_SMARTMIPS;
1814 
1815   /* For user code we don't check for mips_opts.mips16 since we want
1816      to allow jalx if -mips16 was specified on the command line.  */
1817   if (expansionp ? mips_opts.mips16 : file_ase_mips16)
1818     isa |= INSN_MIPS16;
1819 
1820   /* Don't accept instructions based on the ISA if the CPU does not implement
1821      all the coprocessor insns. */
1822   if (NO_ISA_COP (mips_opts.arch)
1823       && COP_INSN (mo->pinfo))
1824     isa = 0;
1825 
1826   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1827     return FALSE;
1828 
1829   /* Check whether the instruction or macro requires single-precision or
1830      double-precision floating-point support.  Note that this information is
1831      stored differently in the opcode table for insns and macros.  */
1832   if (mo->pinfo == INSN_MACRO)
1833     {
1834       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1835       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1836     }
1837   else
1838     {
1839       fp_s = mo->pinfo & FP_S;
1840       fp_d = mo->pinfo & FP_D;
1841     }
1842 
1843   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1844     return FALSE;
1845 
1846   if (fp_s && mips_opts.soft_float)
1847     return FALSE;
1848 
1849   return TRUE;
1850 }
1851 
1852 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1853    selected ISA and architecture.  */
1854 
1855 static bfd_boolean
1856 is_opcode_valid_16 (const struct mips_opcode *mo)
1857 {
1858   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1859 }
1860 
1861 /* This function is called once, at assembler startup time.  It should set up
1862    all the tables, etc. that the MD part of the assembler will need.  */
1863 
1864 void
1865 md_begin (void)
1866 {
1867   const char *retval = NULL;
1868   int i = 0;
1869   int broken = 0;
1870 
1871   if (mips_pic != NO_PIC)
1872     {
1873       if (g_switch_seen && g_switch_value != 0)
1874 	as_bad (_("-G may not be used in position-independent code"));
1875       g_switch_value = 0;
1876     }
1877 
1878   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1879     as_warn (_("Could not set architecture and machine"));
1880 
1881   op_hash = hash_new ();
1882 
1883   for (i = 0; i < NUMOPCODES;)
1884     {
1885       const char *name = mips_opcodes[i].name;
1886 
1887       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1888       if (retval != NULL)
1889 	{
1890 	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1891 		   mips_opcodes[i].name, retval);
1892 	  /* Probably a memory allocation problem?  Give up now.  */
1893 	  as_fatal (_("Broken assembler.  No assembly attempted."));
1894 	}
1895       do
1896 	{
1897 	  if (mips_opcodes[i].pinfo != INSN_MACRO)
1898 	    {
1899 	      if (!validate_mips_insn (&mips_opcodes[i]))
1900 		broken = 1;
1901 	      if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1902 		{
1903 		  create_insn (&nop_insn, mips_opcodes + i);
1904 		  nop_insn.fixed_p = 1;
1905 		}
1906 	    }
1907 	  ++i;
1908 	}
1909       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1910     }
1911 
1912   mips16_op_hash = hash_new ();
1913 
1914   i = 0;
1915   while (i < bfd_mips16_num_opcodes)
1916     {
1917       const char *name = mips16_opcodes[i].name;
1918 
1919       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1920       if (retval != NULL)
1921 	as_fatal (_("internal: can't hash `%s': %s"),
1922 		  mips16_opcodes[i].name, retval);
1923       do
1924 	{
1925 	  if (mips16_opcodes[i].pinfo != INSN_MACRO
1926 	      && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1927 		  != mips16_opcodes[i].match))
1928 	    {
1929 	      fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1930 		       mips16_opcodes[i].name, mips16_opcodes[i].args);
1931 	      broken = 1;
1932 	    }
1933 	  if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1934 	    {
1935 	      create_insn (&mips16_nop_insn, mips16_opcodes + i);
1936 	      mips16_nop_insn.fixed_p = 1;
1937 	    }
1938 	  ++i;
1939 	}
1940       while (i < bfd_mips16_num_opcodes
1941 	     && strcmp (mips16_opcodes[i].name, name) == 0);
1942     }
1943 
1944   if (broken)
1945     as_fatal (_("Broken assembler.  No assembly attempted."));
1946 
1947   /* We add all the general register names to the symbol table.  This
1948      helps us detect invalid uses of them.  */
1949   for (i = 0; reg_names[i].name; i++)
1950     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1951 				     reg_names[i].num, // & RNUM_MASK,
1952 				     &zero_address_frag));
1953   if (HAVE_NEWABI)
1954     for (i = 0; reg_names_n32n64[i].name; i++)
1955       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1956 				       reg_names_n32n64[i].num, // & RNUM_MASK,
1957 				       &zero_address_frag));
1958   else
1959     for (i = 0; reg_names_o32[i].name; i++)
1960       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1961 				       reg_names_o32[i].num, // & RNUM_MASK,
1962 				       &zero_address_frag));
1963 
1964   mips_no_prev_insn ();
1965 
1966   mips_gprmask = 0;
1967   mips_cprmask[0] = 0;
1968   mips_cprmask[1] = 0;
1969   mips_cprmask[2] = 0;
1970   mips_cprmask[3] = 0;
1971 
1972   /* set the default alignment for the text section (2**2) */
1973   record_alignment (text_section, 2);
1974 
1975   bfd_set_gp_size (stdoutput, g_switch_value);
1976 
1977 #ifdef OBJ_ELF
1978   if (IS_ELF)
1979     {
1980       /* On a native system other than VxWorks, sections must be aligned
1981 	 to 16 byte boundaries.  When configured for an embedded ELF
1982 	 target, we don't bother.  */
1983       if (strncmp (TARGET_OS, "elf", 3) != 0
1984 	  && strncmp (TARGET_OS, "vxworks", 7) != 0)
1985 	{
1986 	  (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1987 	  (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1988 	  (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1989 	}
1990 
1991       /* Create a .reginfo section for register masks and a .mdebug
1992 	 section for debugging information.  */
1993       {
1994 	segT seg;
1995 	subsegT subseg;
1996 	flagword flags;
1997 	segT sec;
1998 
1999 	seg = now_seg;
2000 	subseg = now_subseg;
2001 
2002 	/* The ABI says this section should be loaded so that the
2003 	   running program can access it.  However, we don't load it
2004 	   if we are configured for an embedded target */
2005 	flags = SEC_READONLY | SEC_DATA;
2006 	if (strncmp (TARGET_OS, "elf", 3) != 0)
2007 	  flags |= SEC_ALLOC | SEC_LOAD;
2008 
2009 	if (mips_abi != N64_ABI)
2010 	  {
2011 	    sec = subseg_new (".reginfo", (subsegT) 0);
2012 
2013 	    bfd_set_section_flags (stdoutput, sec, flags);
2014 	    bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2015 
2016 	    mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2017 	  }
2018 	else
2019 	  {
2020 	    /* The 64-bit ABI uses a .MIPS.options section rather than
2021                .reginfo section.  */
2022 	    sec = subseg_new (".MIPS.options", (subsegT) 0);
2023 	    bfd_set_section_flags (stdoutput, sec, flags);
2024 	    bfd_set_section_alignment (stdoutput, sec, 3);
2025 
2026 	    /* Set up the option header.  */
2027 	    {
2028 	      Elf_Internal_Options opthdr;
2029 	      char *f;
2030 
2031 	      opthdr.kind = ODK_REGINFO;
2032 	      opthdr.size = (sizeof (Elf_External_Options)
2033 			     + sizeof (Elf64_External_RegInfo));
2034 	      opthdr.section = 0;
2035 	      opthdr.info = 0;
2036 	      f = frag_more (sizeof (Elf_External_Options));
2037 	      bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2038 					     (Elf_External_Options *) f);
2039 
2040 	      mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2041 	    }
2042 	  }
2043 
2044 	if (ECOFF_DEBUGGING)
2045 	  {
2046 	    sec = subseg_new (".mdebug", (subsegT) 0);
2047 	    (void) bfd_set_section_flags (stdoutput, sec,
2048 					  SEC_HAS_CONTENTS | SEC_READONLY);
2049 	    (void) bfd_set_section_alignment (stdoutput, sec, 2);
2050 	  }
2051 	else if (mips_flag_pdr)
2052 	  {
2053 	    pdr_seg = subseg_new (".pdr", (subsegT) 0);
2054 	    (void) bfd_set_section_flags (stdoutput, pdr_seg,
2055 					  SEC_READONLY | SEC_RELOC
2056 					  | SEC_DEBUGGING);
2057 	    (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2058 	  }
2059 
2060 	subseg_set (seg, subseg);
2061       }
2062     }
2063 #endif /* OBJ_ELF */
2064 
2065   if (! ECOFF_DEBUGGING)
2066     md_obj_begin ();
2067 
2068   if (mips_fix_vr4120)
2069     init_vr4120_conflicts ();
2070 }
2071 
2072 void
2073 md_mips_end (void)
2074 {
2075   if (! ECOFF_DEBUGGING)
2076     md_obj_end ();
2077 }
2078 
2079 void
2080 md_assemble (char *str)
2081 {
2082   struct mips_cl_insn insn;
2083   bfd_reloc_code_real_type unused_reloc[3]
2084     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2085 
2086   imm_expr.X_op = O_absent;
2087   imm2_expr.X_op = O_absent;
2088   offset_expr.X_op = O_absent;
2089   imm_reloc[0] = BFD_RELOC_UNUSED;
2090   imm_reloc[1] = BFD_RELOC_UNUSED;
2091   imm_reloc[2] = BFD_RELOC_UNUSED;
2092   offset_reloc[0] = BFD_RELOC_UNUSED;
2093   offset_reloc[1] = BFD_RELOC_UNUSED;
2094   offset_reloc[2] = BFD_RELOC_UNUSED;
2095 
2096   if (mips_opts.mips16)
2097     mips16_ip (str, &insn);
2098   else
2099     {
2100       mips_ip (str, &insn);
2101       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2102 	    str, insn.insn_opcode));
2103     }
2104 
2105   if (insn_error)
2106     {
2107       as_bad ("%s `%s'", insn_error, str);
2108       return;
2109     }
2110 
2111   if (insn.insn_mo->pinfo == INSN_MACRO)
2112     {
2113       macro_start ();
2114       if (mips_opts.mips16)
2115 	mips16_macro (&insn);
2116       else
2117 	macro (&insn);
2118       macro_end ();
2119     }
2120   else
2121     {
2122       if (imm_expr.X_op != O_absent)
2123 	append_insn (&insn, &imm_expr, imm_reloc);
2124       else if (offset_expr.X_op != O_absent)
2125 	append_insn (&insn, &offset_expr, offset_reloc);
2126       else
2127 	append_insn (&insn, NULL, unused_reloc);
2128     }
2129 }
2130 
2131 /* Convenience functions for abstracting away the differences between
2132    MIPS16 and non-MIPS16 relocations.  */
2133 
2134 static inline bfd_boolean
2135 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2136 {
2137   switch (reloc)
2138     {
2139     case BFD_RELOC_MIPS16_JMP:
2140     case BFD_RELOC_MIPS16_GPREL:
2141     case BFD_RELOC_MIPS16_GOT16:
2142     case BFD_RELOC_MIPS16_CALL16:
2143     case BFD_RELOC_MIPS16_HI16_S:
2144     case BFD_RELOC_MIPS16_HI16:
2145     case BFD_RELOC_MIPS16_LO16:
2146       return TRUE;
2147 
2148     default:
2149       return FALSE;
2150     }
2151 }
2152 
2153 static inline bfd_boolean
2154 got16_reloc_p (bfd_reloc_code_real_type reloc)
2155 {
2156   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2157 }
2158 
2159 static inline bfd_boolean
2160 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2161 {
2162   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2163 }
2164 
2165 static inline bfd_boolean
2166 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2167 {
2168   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2169 }
2170 
2171 /* Return true if the given relocation might need a matching %lo().
2172    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2173    need a matching %lo() when applied to local symbols.  */
2174 
2175 static inline bfd_boolean
2176 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2177 {
2178   return (HAVE_IN_PLACE_ADDENDS
2179 	  && (hi16_reloc_p (reloc)
2180 	      /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2181 		 all GOT16 relocations evaluate to "G".  */
2182 	      || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2183 }
2184 
2185 /* Return the type of %lo() reloc needed by RELOC, given that
2186    reloc_needs_lo_p.  */
2187 
2188 static inline bfd_reloc_code_real_type
2189 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2190 {
2191   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2192 }
2193 
2194 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2195    relocation.  */
2196 
2197 static inline bfd_boolean
2198 fixup_has_matching_lo_p (fixS *fixp)
2199 {
2200   return (fixp->fx_next != NULL
2201 	  && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2202 	  && fixp->fx_addsy == fixp->fx_next->fx_addsy
2203 	  && fixp->fx_offset == fixp->fx_next->fx_offset);
2204 }
2205 
2206 /* See whether instruction IP reads register REG.  CLASS is the type
2207    of register.  */
2208 
2209 static int
2210 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2211 	       enum mips_regclass class)
2212 {
2213   if (class == MIPS16_REG)
2214     {
2215       assert (mips_opts.mips16);
2216       reg = mips16_to_32_reg_map[reg];
2217       class = MIPS_GR_REG;
2218     }
2219 
2220   /* Don't report on general register ZERO, since it never changes.  */
2221   if (class == MIPS_GR_REG && reg == ZERO)
2222     return 0;
2223 
2224   if (class == MIPS_FP_REG)
2225     {
2226       assert (! mips_opts.mips16);
2227       /* If we are called with either $f0 or $f1, we must check $f0.
2228 	 This is not optimal, because it will introduce an unnecessary
2229 	 NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2230 	 need to distinguish reading both $f0 and $f1 or just one of
2231 	 them.  Note that we don't have to check the other way,
2232 	 because there is no instruction that sets both $f0 and $f1
2233 	 and requires a delay.  */
2234       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2235 	  && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2236 	      == (reg &~ (unsigned) 1)))
2237 	return 1;
2238       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2239 	  && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2240 	      == (reg &~ (unsigned) 1)))
2241 	return 1;
2242     }
2243   else if (! mips_opts.mips16)
2244     {
2245       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2246 	  && EXTRACT_OPERAND (RS, *ip) == reg)
2247 	return 1;
2248       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2249 	  && EXTRACT_OPERAND (RT, *ip) == reg)
2250 	return 1;
2251     }
2252   else
2253     {
2254       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2255 	  && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2256 	return 1;
2257       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2258 	  && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2259 	return 1;
2260       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2261 	  && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2262 	      == reg))
2263 	return 1;
2264       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2265 	return 1;
2266       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2267 	return 1;
2268       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2269 	return 1;
2270       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2271 	  && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2272 	return 1;
2273     }
2274 
2275   return 0;
2276 }
2277 
2278 /* This function returns true if modifying a register requires a
2279    delay.  */
2280 
2281 static int
2282 reg_needs_delay (unsigned int reg)
2283 {
2284   unsigned long prev_pinfo;
2285 
2286   prev_pinfo = history[0].insn_mo->pinfo;
2287   if (! mips_opts.noreorder
2288       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2289 	   && ! gpr_interlocks)
2290 	  || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2291 	      && ! cop_interlocks)))
2292     {
2293       /* A load from a coprocessor or from memory.  All load delays
2294 	 delay the use of general register rt for one instruction.  */
2295       /* Itbl support may require additional care here.  */
2296       know (prev_pinfo & INSN_WRITE_GPR_T);
2297       if (reg == EXTRACT_OPERAND (RT, history[0]))
2298 	return 1;
2299     }
2300 
2301   return 0;
2302 }
2303 
2304 /* Move all labels in insn_labels to the current insertion point.  */
2305 
2306 static void
2307 mips_move_labels (void)
2308 {
2309   segment_info_type *si = seg_info (now_seg);
2310   struct insn_label_list *l;
2311   valueT val;
2312 
2313   for (l = si->label_list; l != NULL; l = l->next)
2314     {
2315       assert (S_GET_SEGMENT (l->label) == now_seg);
2316       symbol_set_frag (l->label, frag_now);
2317       val = (valueT) frag_now_fix ();
2318       /* mips16 text labels are stored as odd.  */
2319       if (mips_opts.mips16)
2320 	++val;
2321       S_SET_VALUE (l->label, val);
2322     }
2323 }
2324 
2325 static bfd_boolean
2326 s_is_linkonce (symbolS *sym, segT from_seg)
2327 {
2328   bfd_boolean linkonce = FALSE;
2329   segT symseg = S_GET_SEGMENT (sym);
2330 
2331   if (symseg != from_seg && !S_IS_LOCAL (sym))
2332     {
2333       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2334 	linkonce = TRUE;
2335 #ifdef OBJ_ELF
2336       /* The GNU toolchain uses an extension for ELF: a section
2337 	 beginning with the magic string .gnu.linkonce is a
2338 	 linkonce section.  */
2339       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2340 		   sizeof ".gnu.linkonce" - 1) == 0)
2341 	linkonce = TRUE;
2342 #endif
2343     }
2344   return linkonce;
2345 }
2346 
2347 /* Mark instruction labels in mips16 mode.  This permits the linker to
2348    handle them specially, such as generating jalx instructions when
2349    needed.  We also make them odd for the duration of the assembly, in
2350    order to generate the right sort of code.  We will make them even
2351    in the adjust_symtab routine, while leaving them marked.  This is
2352    convenient for the debugger and the disassembler.  The linker knows
2353    to make them odd again.  */
2354 
2355 static void
2356 mips16_mark_labels (void)
2357 {
2358   segment_info_type *si = seg_info (now_seg);
2359   struct insn_label_list *l;
2360 
2361   if (!mips_opts.mips16)
2362     return;
2363 
2364   for (l = si->label_list; l != NULL; l = l->next)
2365    {
2366       symbolS *label = l->label;
2367 
2368 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2369       if (IS_ELF)
2370 	S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2371 #endif
2372       if ((S_GET_VALUE (label) & 1) == 0
2373 	/* Don't adjust the address if the label is global or weak, or
2374 	   in a link-once section, since we'll be emitting symbol reloc
2375 	   references to it which will be patched up by the linker, and
2376 	   the final value of the symbol may or may not be MIPS16.  */
2377 	  && ! S_IS_WEAK (label)
2378 	  && ! S_IS_EXTERNAL (label)
2379 	  && ! s_is_linkonce (label, now_seg))
2380 	S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2381     }
2382 }
2383 
2384 /* End the current frag.  Make it a variant frag and record the
2385    relaxation info.  */
2386 
2387 static void
2388 relax_close_frag (void)
2389 {
2390   mips_macro_warning.first_frag = frag_now;
2391   frag_var (rs_machine_dependent, 0, 0,
2392 	    RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2393 	    mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2394 
2395   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2396   mips_relax.first_fixup = 0;
2397 }
2398 
2399 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2400    See the comment above RELAX_ENCODE for more details.  */
2401 
2402 static void
2403 relax_start (symbolS *symbol)
2404 {
2405   assert (mips_relax.sequence == 0);
2406   mips_relax.sequence = 1;
2407   mips_relax.symbol = symbol;
2408 }
2409 
2410 /* Start generating the second version of a relaxable sequence.
2411    See the comment above RELAX_ENCODE for more details.  */
2412 
2413 static void
2414 relax_switch (void)
2415 {
2416   assert (mips_relax.sequence == 1);
2417   mips_relax.sequence = 2;
2418 }
2419 
2420 /* End the current relaxable sequence.  */
2421 
2422 static void
2423 relax_end (void)
2424 {
2425   assert (mips_relax.sequence == 2);
2426   relax_close_frag ();
2427   mips_relax.sequence = 0;
2428 }
2429 
2430 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2431    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2432    by VR4120 errata.  */
2433 
2434 static unsigned int
2435 classify_vr4120_insn (const char *name)
2436 {
2437   if (strncmp (name, "macc", 4) == 0)
2438     return FIX_VR4120_MACC;
2439   if (strncmp (name, "dmacc", 5) == 0)
2440     return FIX_VR4120_DMACC;
2441   if (strncmp (name, "mult", 4) == 0)
2442     return FIX_VR4120_MULT;
2443   if (strncmp (name, "dmult", 5) == 0)
2444     return FIX_VR4120_DMULT;
2445   if (strstr (name, "div"))
2446     return FIX_VR4120_DIV;
2447   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2448     return FIX_VR4120_MTHILO;
2449   return NUM_FIX_VR4120_CLASSES;
2450 }
2451 
2452 /* Return the number of instructions that must separate INSN1 and INSN2,
2453    where INSN1 is the earlier instruction.  Return the worst-case value
2454    for any INSN2 if INSN2 is null.  */
2455 
2456 static unsigned int
2457 insns_between (const struct mips_cl_insn *insn1,
2458 	       const struct mips_cl_insn *insn2)
2459 {
2460   unsigned long pinfo1, pinfo2;
2461 
2462   /* This function needs to know which pinfo flags are set for INSN2
2463      and which registers INSN2 uses.  The former is stored in PINFO2 and
2464      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2465      will have every flag set and INSN2_USES_REG will always return true.  */
2466   pinfo1 = insn1->insn_mo->pinfo;
2467   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2468 
2469 #define INSN2_USES_REG(REG, CLASS) \
2470    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2471 
2472   /* For most targets, write-after-read dependencies on the HI and LO
2473      registers must be separated by at least two instructions.  */
2474   if (!hilo_interlocks)
2475     {
2476       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2477 	return 2;
2478       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2479 	return 2;
2480     }
2481 
2482   /* If we're working around r7000 errata, there must be two instructions
2483      between an mfhi or mflo and any instruction that uses the result.  */
2484   if (mips_7000_hilo_fix
2485       && MF_HILO_INSN (pinfo1)
2486       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2487     return 2;
2488 
2489   /* If working around VR4120 errata, check for combinations that need
2490      a single intervening instruction.  */
2491   if (mips_fix_vr4120)
2492     {
2493       unsigned int class1, class2;
2494 
2495       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2496       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2497 	{
2498 	  if (insn2 == NULL)
2499 	    return 1;
2500 	  class2 = classify_vr4120_insn (insn2->insn_mo->name);
2501 	  if (vr4120_conflicts[class1] & (1 << class2))
2502 	    return 1;
2503 	}
2504     }
2505 
2506   if (!mips_opts.mips16)
2507     {
2508       /* Check for GPR or coprocessor load delays.  All such delays
2509 	 are on the RT register.  */
2510       /* Itbl support may require additional care here.  */
2511       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2512 	  || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2513 	{
2514 	  know (pinfo1 & INSN_WRITE_GPR_T);
2515 	  if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2516 	    return 1;
2517 	}
2518 
2519       /* Check for generic coprocessor hazards.
2520 
2521 	 This case is not handled very well.  There is no special
2522 	 knowledge of CP0 handling, and the coprocessors other than
2523 	 the floating point unit are not distinguished at all.  */
2524       /* Itbl support may require additional care here. FIXME!
2525 	 Need to modify this to include knowledge about
2526 	 user specified delays!  */
2527       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2528 	       || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2529 	{
2530 	  /* Handle cases where INSN1 writes to a known general coprocessor
2531 	     register.  There must be a one instruction delay before INSN2
2532 	     if INSN2 reads that register, otherwise no delay is needed.  */
2533 	  if (pinfo1 & INSN_WRITE_FPR_T)
2534 	    {
2535 	      if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2536 		return 1;
2537 	    }
2538 	  else if (pinfo1 & INSN_WRITE_FPR_S)
2539 	    {
2540 	      if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2541 		return 1;
2542 	    }
2543 	  else
2544 	    {
2545 	      /* Read-after-write dependencies on the control registers
2546 		 require a two-instruction gap.  */
2547 	      if ((pinfo1 & INSN_WRITE_COND_CODE)
2548 		  && (pinfo2 & INSN_READ_COND_CODE))
2549 		return 2;
2550 
2551 	      /* We don't know exactly what INSN1 does.  If INSN2 is
2552 		 also a coprocessor instruction, assume there must be
2553 		 a one instruction gap.  */
2554 	      if (pinfo2 & INSN_COP)
2555 		return 1;
2556 	    }
2557 	}
2558 
2559       /* Check for read-after-write dependencies on the coprocessor
2560 	 control registers in cases where INSN1 does not need a general
2561 	 coprocessor delay.  This means that INSN1 is a floating point
2562 	 comparison instruction.  */
2563       /* Itbl support may require additional care here.  */
2564       else if (!cop_interlocks
2565 	       && (pinfo1 & INSN_WRITE_COND_CODE)
2566 	       && (pinfo2 & INSN_READ_COND_CODE))
2567 	return 1;
2568     }
2569 
2570 #undef INSN2_USES_REG
2571 
2572   return 0;
2573 }
2574 
2575 /* Return the number of nops that would be needed to work around the
2576    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2577    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2578 
2579 static int
2580 nops_for_vr4130 (const struct mips_cl_insn *history,
2581 		 const struct mips_cl_insn *insn)
2582 {
2583   int i, j, reg;
2584 
2585   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2586      are not affected by the errata.  */
2587   if (insn != 0
2588       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2589 	  || strcmp (insn->insn_mo->name, "mtlo") == 0
2590 	  || strcmp (insn->insn_mo->name, "mthi") == 0))
2591     return 0;
2592 
2593   /* Search for the first MFLO or MFHI.  */
2594   for (i = 0; i < MAX_VR4130_NOPS; i++)
2595     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2596       {
2597 	/* Extract the destination register.  */
2598 	if (mips_opts.mips16)
2599 	  reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2600 	else
2601 	  reg = EXTRACT_OPERAND (RD, history[i]);
2602 
2603 	/* No nops are needed if INSN reads that register.  */
2604 	if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2605 	  return 0;
2606 
2607 	/* ...or if any of the intervening instructions do.  */
2608 	for (j = 0; j < i; j++)
2609 	  if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2610 	    return 0;
2611 
2612 	return MAX_VR4130_NOPS - i;
2613       }
2614   return 0;
2615 }
2616 
2617 /* Return the number of nops that would be needed if instruction INSN
2618    immediately followed the MAX_NOPS instructions given by HISTORY,
2619    where HISTORY[0] is the most recent instruction.  If INSN is null,
2620    return the worse-case number of nops for any instruction.  */
2621 
2622 static int
2623 nops_for_insn (const struct mips_cl_insn *history,
2624 	       const struct mips_cl_insn *insn)
2625 {
2626   int i, nops, tmp_nops;
2627 
2628   nops = 0;
2629   for (i = 0; i < MAX_DELAY_NOPS; i++)
2630     if (!history[i].noreorder_p)
2631       {
2632 	tmp_nops = insns_between (history + i, insn) - i;
2633 	if (tmp_nops > nops)
2634 	  nops = tmp_nops;
2635       }
2636 
2637   if (mips_fix_vr4130)
2638     {
2639       tmp_nops = nops_for_vr4130 (history, insn);
2640       if (tmp_nops > nops)
2641 	nops = tmp_nops;
2642     }
2643 
2644   return nops;
2645 }
2646 
2647 /* The variable arguments provide NUM_INSNS extra instructions that
2648    might be added to HISTORY.  Return the largest number of nops that
2649    would be needed after the extended sequence.  */
2650 
2651 static int
2652 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2653 {
2654   va_list args;
2655   struct mips_cl_insn buffer[MAX_NOPS];
2656   struct mips_cl_insn *cursor;
2657   int nops;
2658 
2659   va_start (args, history);
2660   cursor = buffer + num_insns;
2661   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2662   while (cursor > buffer)
2663     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2664 
2665   nops = nops_for_insn (buffer, NULL);
2666   va_end (args);
2667   return nops;
2668 }
2669 
2670 /* Like nops_for_insn, but if INSN is a branch, take into account the
2671    worst-case delay for the branch target.  */
2672 
2673 static int
2674 nops_for_insn_or_target (const struct mips_cl_insn *history,
2675 			 const struct mips_cl_insn *insn)
2676 {
2677   int nops, tmp_nops;
2678 
2679   nops = nops_for_insn (history, insn);
2680   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2681 			      | INSN_COND_BRANCH_DELAY
2682 			      | INSN_COND_BRANCH_LIKELY))
2683     {
2684       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2685       if (tmp_nops > nops)
2686 	nops = tmp_nops;
2687     }
2688   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2689     {
2690       tmp_nops = nops_for_sequence (1, history, insn);
2691       if (tmp_nops > nops)
2692 	nops = tmp_nops;
2693     }
2694   return nops;
2695 }
2696 
2697 /* Output an instruction.  IP is the instruction information.
2698    ADDRESS_EXPR is an operand of the instruction to be used with
2699    RELOC_TYPE.  */
2700 
2701 static void
2702 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2703 	     bfd_reloc_code_real_type *reloc_type)
2704 {
2705   unsigned long prev_pinfo, pinfo;
2706   relax_stateT prev_insn_frag_type = 0;
2707   bfd_boolean relaxed_branch = FALSE;
2708   segment_info_type *si = seg_info (now_seg);
2709 
2710   /* Mark instruction labels in mips16 mode.  */
2711   mips16_mark_labels ();
2712 
2713   prev_pinfo = history[0].insn_mo->pinfo;
2714   pinfo = ip->insn_mo->pinfo;
2715 
2716   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2717     {
2718       /* There are a lot of optimizations we could do that we don't.
2719 	 In particular, we do not, in general, reorder instructions.
2720 	 If you use gcc with optimization, it will reorder
2721 	 instructions and generally do much more optimization then we
2722 	 do here; repeating all that work in the assembler would only
2723 	 benefit hand written assembly code, and does not seem worth
2724 	 it.  */
2725       int nops = (mips_optimize == 0
2726 		  ? nops_for_insn (history, NULL)
2727 		  : nops_for_insn_or_target (history, ip));
2728       if (nops > 0)
2729 	{
2730 	  fragS *old_frag;
2731 	  unsigned long old_frag_offset;
2732 	  int i;
2733 
2734 	  old_frag = frag_now;
2735 	  old_frag_offset = frag_now_fix ();
2736 
2737 	  for (i = 0; i < nops; i++)
2738 	    emit_nop ();
2739 
2740 	  if (listing)
2741 	    {
2742 	      listing_prev_line ();
2743 	      /* We may be at the start of a variant frag.  In case we
2744                  are, make sure there is enough space for the frag
2745                  after the frags created by listing_prev_line.  The
2746                  argument to frag_grow here must be at least as large
2747                  as the argument to all other calls to frag_grow in
2748                  this file.  We don't have to worry about being in the
2749                  middle of a variant frag, because the variants insert
2750                  all needed nop instructions themselves.  */
2751 	      frag_grow (40);
2752 	    }
2753 
2754 	  mips_move_labels ();
2755 
2756 #ifndef NO_ECOFF_DEBUGGING
2757 	  if (ECOFF_DEBUGGING)
2758 	    ecoff_fix_loc (old_frag, old_frag_offset);
2759 #endif
2760 	}
2761     }
2762   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2763     {
2764       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2765       int nops = nops_for_insn_or_target (history, ip);
2766       assert (nops <= prev_nop_frag_holds);
2767 
2768       /* Enforce NOPS as a minimum.  */
2769       if (nops > prev_nop_frag_required)
2770 	prev_nop_frag_required = nops;
2771 
2772       if (prev_nop_frag_holds == prev_nop_frag_required)
2773 	{
2774 	  /* Settle for the current number of nops.  Update the history
2775 	     accordingly (for the benefit of any future .set reorder code).  */
2776 	  prev_nop_frag = NULL;
2777 	  insert_into_history (prev_nop_frag_since,
2778 			       prev_nop_frag_holds, NOP_INSN);
2779 	}
2780       else
2781 	{
2782 	  /* Allow this instruction to replace one of the nops that was
2783 	     tentatively added to prev_nop_frag.  */
2784 	  prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2785 	  prev_nop_frag_holds--;
2786 	  prev_nop_frag_since++;
2787 	}
2788     }
2789 
2790 #ifdef OBJ_ELF
2791   /* The value passed to dwarf2_emit_insn is the distance between
2792      the beginning of the current instruction and the address that
2793      should be recorded in the debug tables.  For MIPS16 debug info
2794      we want to use ISA-encoded addresses, so we pass -1 for an
2795      address higher by one than the current.  */
2796   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2797 #endif
2798 
2799   /* Record the frag type before frag_var.  */
2800   if (history[0].frag)
2801     prev_insn_frag_type = history[0].frag->fr_type;
2802 
2803   if (address_expr
2804       && *reloc_type == BFD_RELOC_16_PCREL_S2
2805       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2806 	  || pinfo & INSN_COND_BRANCH_LIKELY)
2807       && mips_relax_branch
2808       /* Don't try branch relaxation within .set nomacro, or within
2809 	 .set noat if we use $at for PIC computations.  If it turns
2810 	 out that the branch was out-of-range, we'll get an error.  */
2811       && !mips_opts.warn_about_macros
2812       && (mips_opts.at || mips_pic == NO_PIC)
2813       && !mips_opts.mips16)
2814     {
2815       relaxed_branch = TRUE;
2816       add_relaxed_insn (ip, (relaxed_branch_length
2817 			     (NULL, NULL,
2818 			      (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2819 			      : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2820 			      : 0)), 4,
2821 			RELAX_BRANCH_ENCODE
2822 			(pinfo & INSN_UNCOND_BRANCH_DELAY,
2823 			 pinfo & INSN_COND_BRANCH_LIKELY,
2824 			 pinfo & INSN_WRITE_GPR_31,
2825 			 0),
2826 			address_expr->X_add_symbol,
2827 			address_expr->X_add_number);
2828       *reloc_type = BFD_RELOC_UNUSED;
2829     }
2830   else if (*reloc_type > BFD_RELOC_UNUSED)
2831     {
2832       /* We need to set up a variant frag.  */
2833       assert (mips_opts.mips16 && address_expr != NULL);
2834       add_relaxed_insn (ip, 4, 0,
2835 			RELAX_MIPS16_ENCODE
2836 			(*reloc_type - BFD_RELOC_UNUSED,
2837 			 mips16_small, mips16_ext,
2838 			 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2839 			 history[0].mips16_absolute_jump_p),
2840 			make_expr_symbol (address_expr), 0);
2841     }
2842   else if (mips_opts.mips16
2843 	   && ! ip->use_extend
2844 	   && *reloc_type != BFD_RELOC_MIPS16_JMP)
2845     {
2846       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2847 	/* Make sure there is enough room to swap this instruction with
2848 	   a following jump instruction.  */
2849 	frag_grow (6);
2850       add_fixed_insn (ip);
2851     }
2852   else
2853     {
2854       if (mips_opts.mips16
2855 	  && mips_opts.noreorder
2856 	  && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2857 	as_warn (_("extended instruction in delay slot"));
2858 
2859       if (mips_relax.sequence)
2860 	{
2861 	  /* If we've reached the end of this frag, turn it into a variant
2862 	     frag and record the information for the instructions we've
2863 	     written so far.  */
2864 	  if (frag_room () < 4)
2865 	    relax_close_frag ();
2866 	  mips_relax.sizes[mips_relax.sequence - 1] += 4;
2867 	}
2868 
2869       if (mips_relax.sequence != 2)
2870 	mips_macro_warning.sizes[0] += 4;
2871       if (mips_relax.sequence != 1)
2872 	mips_macro_warning.sizes[1] += 4;
2873 
2874       if (mips_opts.mips16)
2875 	{
2876 	  ip->fixed_p = 1;
2877 	  ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2878 	}
2879       add_fixed_insn (ip);
2880     }
2881 
2882   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2883     {
2884       if (address_expr->X_op == O_constant)
2885 	{
2886 	  unsigned int tmp;
2887 
2888 	  switch (*reloc_type)
2889 	    {
2890 	    case BFD_RELOC_32:
2891 	      ip->insn_opcode |= address_expr->X_add_number;
2892 	      break;
2893 
2894 	    case BFD_RELOC_MIPS_HIGHEST:
2895 	      tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2896 	      ip->insn_opcode |= tmp & 0xffff;
2897 	      break;
2898 
2899 	    case BFD_RELOC_MIPS_HIGHER:
2900 	      tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2901 	      ip->insn_opcode |= tmp & 0xffff;
2902 	      break;
2903 
2904 	    case BFD_RELOC_HI16_S:
2905 	      tmp = (address_expr->X_add_number + 0x8000) >> 16;
2906 	      ip->insn_opcode |= tmp & 0xffff;
2907 	      break;
2908 
2909 	    case BFD_RELOC_HI16:
2910 	      ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2911 	      break;
2912 
2913 	    case BFD_RELOC_UNUSED:
2914 	    case BFD_RELOC_LO16:
2915 	    case BFD_RELOC_MIPS_GOT_DISP:
2916 	      ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2917 	      break;
2918 
2919 	    case BFD_RELOC_MIPS_JMP:
2920 	      if ((address_expr->X_add_number & 3) != 0)
2921 		as_bad (_("jump to misaligned address (0x%lx)"),
2922 			(unsigned long) address_expr->X_add_number);
2923 	      ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2924 	      break;
2925 
2926 	    case BFD_RELOC_MIPS16_JMP:
2927 	      if ((address_expr->X_add_number & 3) != 0)
2928 		as_bad (_("jump to misaligned address (0x%lx)"),
2929 			(unsigned long) address_expr->X_add_number);
2930 	      ip->insn_opcode |=
2931 		(((address_expr->X_add_number & 0x7c0000) << 3)
2932 		 | ((address_expr->X_add_number & 0xf800000) >> 7)
2933 		 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2934 	      break;
2935 
2936 	    case BFD_RELOC_16_PCREL_S2:
2937 	      if ((address_expr->X_add_number & 3) != 0)
2938 		as_bad (_("branch to misaligned address (0x%lx)"),
2939 			(unsigned long) address_expr->X_add_number);
2940 	      if (mips_relax_branch)
2941 		goto need_reloc;
2942 	      if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2943 		as_bad (_("branch address range overflow (0x%lx)"),
2944 			(unsigned long) address_expr->X_add_number);
2945 	      ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2946 	      break;
2947 
2948 	    default:
2949 	      internalError ();
2950 	    }
2951 	}
2952       else if (*reloc_type < BFD_RELOC_UNUSED)
2953 	need_reloc:
2954 	{
2955 	  reloc_howto_type *howto;
2956 	  int i;
2957 
2958 	  /* In a compound relocation, it is the final (outermost)
2959 	     operator that determines the relocated field.  */
2960 	  for (i = 1; i < 3; i++)
2961 	    if (reloc_type[i] == BFD_RELOC_UNUSED)
2962 	      break;
2963 
2964 	  howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2965 	  ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2966 				     bfd_get_reloc_size (howto),
2967 				     address_expr,
2968 				     reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2969 				     reloc_type[0]);
2970 
2971 	  /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2972 	  if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2973 	      && ip->fixp[0]->fx_addsy)
2974 	    *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2975 
2976 	  /* These relocations can have an addend that won't fit in
2977 	     4 octets for 64bit assembly.  */
2978 	  if (HAVE_64BIT_GPRS
2979 	      && ! howto->partial_inplace
2980 	      && (reloc_type[0] == BFD_RELOC_16
2981 		  || reloc_type[0] == BFD_RELOC_32
2982 		  || reloc_type[0] == BFD_RELOC_MIPS_JMP
2983 		  || reloc_type[0] == BFD_RELOC_GPREL16
2984 		  || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2985 		  || reloc_type[0] == BFD_RELOC_GPREL32
2986 		  || reloc_type[0] == BFD_RELOC_64
2987 		  || reloc_type[0] == BFD_RELOC_CTOR
2988 		  || reloc_type[0] == BFD_RELOC_MIPS_SUB
2989 		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2990 		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2991 		  || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2992 		  || reloc_type[0] == BFD_RELOC_MIPS_REL16
2993 		  || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2994 		  || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2995 		  || hi16_reloc_p (reloc_type[0])
2996 		  || lo16_reloc_p (reloc_type[0])))
2997 	    ip->fixp[0]->fx_no_overflow = 1;
2998 
2999 	  if (mips_relax.sequence)
3000 	    {
3001 	      if (mips_relax.first_fixup == 0)
3002 		mips_relax.first_fixup = ip->fixp[0];
3003 	    }
3004 	  else if (reloc_needs_lo_p (*reloc_type))
3005 	    {
3006 	      struct mips_hi_fixup *hi_fixup;
3007 
3008 	      /* Reuse the last entry if it already has a matching %lo.  */
3009 	      hi_fixup = mips_hi_fixup_list;
3010 	      if (hi_fixup == 0
3011 		  || !fixup_has_matching_lo_p (hi_fixup->fixp))
3012 		{
3013 		  hi_fixup = ((struct mips_hi_fixup *)
3014 			      xmalloc (sizeof (struct mips_hi_fixup)));
3015 		  hi_fixup->next = mips_hi_fixup_list;
3016 		  mips_hi_fixup_list = hi_fixup;
3017 		}
3018 	      hi_fixup->fixp = ip->fixp[0];
3019 	      hi_fixup->seg = now_seg;
3020 	    }
3021 
3022 	  /* Add fixups for the second and third relocations, if given.
3023 	     Note that the ABI allows the second relocation to be
3024 	     against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3025 	     moment we only use RSS_UNDEF, but we could add support
3026 	     for the others if it ever becomes necessary.  */
3027 	  for (i = 1; i < 3; i++)
3028 	    if (reloc_type[i] != BFD_RELOC_UNUSED)
3029 	      {
3030 		ip->fixp[i] = fix_new (ip->frag, ip->where,
3031 				       ip->fixp[0]->fx_size, NULL, 0,
3032 				       FALSE, reloc_type[i]);
3033 
3034 		/* Use fx_tcbit to mark compound relocs.  */
3035 		ip->fixp[0]->fx_tcbit = 1;
3036 		ip->fixp[i]->fx_tcbit = 1;
3037 	      }
3038 	}
3039     }
3040   install_insn (ip);
3041 
3042   /* Update the register mask information.  */
3043   if (! mips_opts.mips16)
3044     {
3045       if (pinfo & INSN_WRITE_GPR_D)
3046 	mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3047       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3048 	mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3049       if (pinfo & INSN_READ_GPR_S)
3050 	mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3051       if (pinfo & INSN_WRITE_GPR_31)
3052 	mips_gprmask |= 1 << RA;
3053       if (pinfo & INSN_WRITE_FPR_D)
3054 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3055       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3056 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3057       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3058 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3059       if ((pinfo & INSN_READ_FPR_R) != 0)
3060 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3061       if (pinfo & INSN_COP)
3062 	{
3063 	  /* We don't keep enough information to sort these cases out.
3064 	     The itbl support does keep this information however, although
3065 	     we currently don't support itbl fprmats as part of the cop
3066 	     instruction.  May want to add this support in the future.  */
3067 	}
3068       /* Never set the bit for $0, which is always zero.  */
3069       mips_gprmask &= ~1 << 0;
3070     }
3071   else
3072     {
3073       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3074 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3075       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3076 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3077       if (pinfo & MIPS16_INSN_WRITE_Z)
3078 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3079       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3080 	mips_gprmask |= 1 << TREG;
3081       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3082 	mips_gprmask |= 1 << SP;
3083       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3084 	mips_gprmask |= 1 << RA;
3085       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3086 	mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3087       if (pinfo & MIPS16_INSN_READ_Z)
3088 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3089       if (pinfo & MIPS16_INSN_READ_GPR_X)
3090 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3091     }
3092 
3093   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3094     {
3095       /* Filling the branch delay slot is more complex.  We try to
3096 	 switch the branch with the previous instruction, which we can
3097 	 do if the previous instruction does not set up a condition
3098 	 that the branch tests and if the branch is not itself the
3099 	 target of any branch.  */
3100       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3101 	  || (pinfo & INSN_COND_BRANCH_DELAY))
3102 	{
3103 	  if (mips_optimize < 2
3104 	      /* If we have seen .set volatile or .set nomove, don't
3105 		 optimize.  */
3106 	      || mips_opts.nomove != 0
3107 	      /* We can't swap if the previous instruction's position
3108 		 is fixed.  */
3109 	      || history[0].fixed_p
3110 	      /* If the previous previous insn was in a .set
3111 		 noreorder, we can't swap.  Actually, the MIPS
3112 		 assembler will swap in this situation.  However, gcc
3113 		 configured -with-gnu-as will generate code like
3114 		   .set noreorder
3115 		   lw	$4,XXX
3116 		   .set	reorder
3117 		   INSN
3118 		   bne	$4,$0,foo
3119 		 in which we can not swap the bne and INSN.  If gcc is
3120 		 not configured -with-gnu-as, it does not output the
3121 		 .set pseudo-ops.  */
3122 	      || history[1].noreorder_p
3123 	      /* If the branch is itself the target of a branch, we
3124 		 can not swap.  We cheat on this; all we check for is
3125 		 whether there is a label on this instruction.  If
3126 		 there are any branches to anything other than a
3127 		 label, users must use .set noreorder.  */
3128 	      || si->label_list != NULL
3129 	      /* If the previous instruction is in a variant frag
3130 		 other than this branch's one, we cannot do the swap.
3131 		 This does not apply to the mips16, which uses variant
3132 		 frags for different purposes.  */
3133 	      || (! mips_opts.mips16
3134 		  && prev_insn_frag_type == rs_machine_dependent)
3135 	      /* Check for conflicts between the branch and the instructions
3136 		 before the candidate delay slot.  */
3137 	      || nops_for_insn (history + 1, ip) > 0
3138 	      /* Check for conflicts between the swapped sequence and the
3139 		 target of the branch.  */
3140 	      || nops_for_sequence (2, history + 1, ip, history) > 0
3141 	      /* We do not swap with a trap instruction, since it
3142 		 complicates trap handlers to have the trap
3143 		 instruction be in a delay slot.  */
3144 	      || (prev_pinfo & INSN_TRAP)
3145 	      /* If the branch reads a register that the previous
3146 		 instruction sets, we can not swap.  */
3147 	      || (! mips_opts.mips16
3148 		  && (prev_pinfo & INSN_WRITE_GPR_T)
3149 		  && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3150 				    MIPS_GR_REG))
3151 	      || (! mips_opts.mips16
3152 		  && (prev_pinfo & INSN_WRITE_GPR_D)
3153 		  && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3154 				    MIPS_GR_REG))
3155 	      || (mips_opts.mips16
3156 		  && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3157 		       && (insn_uses_reg
3158 			   (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3159 			    MIPS16_REG)))
3160 		      || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3161 			  && (insn_uses_reg
3162 			      (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3163 			       MIPS16_REG)))
3164 		      || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3165 			  && (insn_uses_reg
3166 			      (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3167 			       MIPS16_REG)))
3168 		      || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3169 			  && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3170 		      || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3171 			  && insn_uses_reg (ip, RA, MIPS_GR_REG))
3172 		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3173 			  && insn_uses_reg (ip,
3174 					    MIPS16OP_EXTRACT_REG32R
3175 					      (history[0].insn_opcode),
3176 					    MIPS_GR_REG))))
3177 	      /* If the branch writes a register that the previous
3178 		 instruction sets, we can not swap (we know that
3179 		 branches write only to RD or to $31).  */
3180 	      || (! mips_opts.mips16
3181 		  && (prev_pinfo & INSN_WRITE_GPR_T)
3182 		  && (((pinfo & INSN_WRITE_GPR_D)
3183 		       && (EXTRACT_OPERAND (RT, history[0])
3184 			   == EXTRACT_OPERAND (RD, *ip)))
3185 		      || ((pinfo & INSN_WRITE_GPR_31)
3186 			  && EXTRACT_OPERAND (RT, history[0]) == RA)))
3187 	      || (! mips_opts.mips16
3188 		  && (prev_pinfo & INSN_WRITE_GPR_D)
3189 		  && (((pinfo & INSN_WRITE_GPR_D)
3190 		       && (EXTRACT_OPERAND (RD, history[0])
3191 			   == EXTRACT_OPERAND (RD, *ip)))
3192 		      || ((pinfo & INSN_WRITE_GPR_31)
3193 			  && EXTRACT_OPERAND (RD, history[0]) == RA)))
3194 	      || (mips_opts.mips16
3195 		  && (pinfo & MIPS16_INSN_WRITE_31)
3196 		  && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3197 		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3198 			  && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3199 			      == RA))))
3200 	      /* If the branch writes a register that the previous
3201 		 instruction reads, we can not swap (we know that
3202 		 branches only write to RD or to $31).  */
3203 	      || (! mips_opts.mips16
3204 		  && (pinfo & INSN_WRITE_GPR_D)
3205 		  && insn_uses_reg (&history[0],
3206 				    EXTRACT_OPERAND (RD, *ip),
3207 				    MIPS_GR_REG))
3208 	      || (! mips_opts.mips16
3209 		  && (pinfo & INSN_WRITE_GPR_31)
3210 		  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3211 	      || (mips_opts.mips16
3212 		  && (pinfo & MIPS16_INSN_WRITE_31)
3213 		  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3214 	      /* If one instruction sets a condition code and the
3215                  other one uses a condition code, we can not swap.  */
3216 	      || ((pinfo & INSN_READ_COND_CODE)
3217 		  && (prev_pinfo & INSN_WRITE_COND_CODE))
3218 	      || ((pinfo & INSN_WRITE_COND_CODE)
3219 		  && (prev_pinfo & INSN_READ_COND_CODE))
3220 	      /* If the previous instruction uses the PC, we can not
3221                  swap.  */
3222 	      || (mips_opts.mips16
3223 		  && (prev_pinfo & MIPS16_INSN_READ_PC))
3224 	      /* If the previous instruction had a fixup in mips16
3225                  mode, we can not swap.  This normally means that the
3226                  previous instruction was a 4 byte branch anyhow.  */
3227 	      || (mips_opts.mips16 && history[0].fixp[0])
3228 	      /* If the previous instruction is a sync, sync.l, or
3229 		 sync.p, we can not swap.  */
3230 	      || (prev_pinfo & INSN_SYNC))
3231 	    {
3232 	      if (mips_opts.mips16
3233 		  && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3234 		  && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3235 		  && ISA_SUPPORTS_MIPS16E)
3236 		{
3237 		  /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3238 		  ip->insn_opcode |= 0x0080;
3239 		  install_insn (ip);
3240 		  insert_into_history (0, 1, ip);
3241 		}
3242 	      else
3243 		{
3244 		  /* We could do even better for unconditional branches to
3245 		     portions of this object file; we could pick up the
3246 		     instruction at the destination, put it in the delay
3247 		     slot, and bump the destination address.  */
3248 		  insert_into_history (0, 1, ip);
3249 		  emit_nop ();
3250 		}
3251 
3252 	      if (mips_relax.sequence)
3253 		mips_relax.sizes[mips_relax.sequence - 1] += 4;
3254 	    }
3255 	  else
3256 	    {
3257 	      /* It looks like we can actually do the swap.  */
3258 	      struct mips_cl_insn delay = history[0];
3259 	      if (mips_opts.mips16)
3260 		{
3261 		  know (delay.frag == ip->frag);
3262                   move_insn (ip, delay.frag, delay.where);
3263 		  move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3264 		}
3265 	      else if (relaxed_branch)
3266 		{
3267 		  /* Add the delay slot instruction to the end of the
3268 		     current frag and shrink the fixed part of the
3269 		     original frag.  If the branch occupies the tail of
3270 		     the latter, move it backwards to cover the gap.  */
3271 		  delay.frag->fr_fix -= 4;
3272 		  if (delay.frag == ip->frag)
3273 		    move_insn (ip, ip->frag, ip->where - 4);
3274 		  add_fixed_insn (&delay);
3275 		}
3276 	      else
3277 		{
3278 		  move_insn (&delay, ip->frag, ip->where);
3279 		  move_insn (ip, history[0].frag, history[0].where);
3280 		}
3281 	      history[0] = *ip;
3282 	      delay.fixed_p = 1;
3283 	      insert_into_history (0, 1, &delay);
3284 	    }
3285 
3286 	  /* If that was an unconditional branch, forget the previous
3287 	     insn information.  */
3288 	  if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3289 	    mips_no_prev_insn ();
3290 	}
3291       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3292 	{
3293 	  /* We don't yet optimize a branch likely.  What we should do
3294 	     is look at the target, copy the instruction found there
3295 	     into the delay slot, and increment the branch to jump to
3296 	     the next instruction.  */
3297 	  insert_into_history (0, 1, ip);
3298 	  emit_nop ();
3299 	}
3300       else
3301 	insert_into_history (0, 1, ip);
3302     }
3303   else
3304     insert_into_history (0, 1, ip);
3305 
3306   /* We just output an insn, so the next one doesn't have a label.  */
3307   mips_clear_insn_labels ();
3308 }
3309 
3310 /* Forget that there was any previous instruction or label.  */
3311 
3312 static void
3313 mips_no_prev_insn (void)
3314 {
3315   prev_nop_frag = NULL;
3316   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3317   mips_clear_insn_labels ();
3318 }
3319 
3320 /* This function must be called before we emit something other than
3321    instructions.  It is like mips_no_prev_insn except that it inserts
3322    any NOPS that might be needed by previous instructions.  */
3323 
3324 void
3325 mips_emit_delays (void)
3326 {
3327   if (! mips_opts.noreorder)
3328     {
3329       int nops = nops_for_insn (history, NULL);
3330       if (nops > 0)
3331 	{
3332 	  while (nops-- > 0)
3333 	    add_fixed_insn (NOP_INSN);
3334 	  mips_move_labels ();
3335 	}
3336     }
3337   mips_no_prev_insn ();
3338 }
3339 
3340 /* Start a (possibly nested) noreorder block.  */
3341 
3342 static void
3343 start_noreorder (void)
3344 {
3345   if (mips_opts.noreorder == 0)
3346     {
3347       unsigned int i;
3348       int nops;
3349 
3350       /* None of the instructions before the .set noreorder can be moved.  */
3351       for (i = 0; i < ARRAY_SIZE (history); i++)
3352 	history[i].fixed_p = 1;
3353 
3354       /* Insert any nops that might be needed between the .set noreorder
3355 	 block and the previous instructions.  We will later remove any
3356 	 nops that turn out not to be needed.  */
3357       nops = nops_for_insn (history, NULL);
3358       if (nops > 0)
3359 	{
3360 	  if (mips_optimize != 0)
3361 	    {
3362 	      /* Record the frag which holds the nop instructions, so
3363                  that we can remove them if we don't need them.  */
3364 	      frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3365 	      prev_nop_frag = frag_now;
3366 	      prev_nop_frag_holds = nops;
3367 	      prev_nop_frag_required = 0;
3368 	      prev_nop_frag_since = 0;
3369 	    }
3370 
3371 	  for (; nops > 0; --nops)
3372 	    add_fixed_insn (NOP_INSN);
3373 
3374 	  /* Move on to a new frag, so that it is safe to simply
3375 	     decrease the size of prev_nop_frag.  */
3376 	  frag_wane (frag_now);
3377 	  frag_new (0);
3378 	  mips_move_labels ();
3379 	}
3380       mips16_mark_labels ();
3381       mips_clear_insn_labels ();
3382     }
3383   mips_opts.noreorder++;
3384   mips_any_noreorder = 1;
3385 }
3386 
3387 /* End a nested noreorder block.  */
3388 
3389 static void
3390 end_noreorder (void)
3391 {
3392   mips_opts.noreorder--;
3393   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3394     {
3395       /* Commit to inserting prev_nop_frag_required nops and go back to
3396 	 handling nop insertion the .set reorder way.  */
3397       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3398 				* (mips_opts.mips16 ? 2 : 4));
3399       insert_into_history (prev_nop_frag_since,
3400 			   prev_nop_frag_required, NOP_INSN);
3401       prev_nop_frag = NULL;
3402     }
3403 }
3404 
3405 /* Set up global variables for the start of a new macro.  */
3406 
3407 static void
3408 macro_start (void)
3409 {
3410   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3411   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3412 				     && (history[0].insn_mo->pinfo
3413 					 & (INSN_UNCOND_BRANCH_DELAY
3414 					    | INSN_COND_BRANCH_DELAY
3415 					    | INSN_COND_BRANCH_LIKELY)) != 0);
3416 }
3417 
3418 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3419    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3420    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3421 
3422 static const char *
3423 macro_warning (relax_substateT subtype)
3424 {
3425   if (subtype & RELAX_DELAY_SLOT)
3426     return _("Macro instruction expanded into multiple instructions"
3427 	     " in a branch delay slot");
3428   else if (subtype & RELAX_NOMACRO)
3429     return _("Macro instruction expanded into multiple instructions");
3430   else
3431     return 0;
3432 }
3433 
3434 /* Finish up a macro.  Emit warnings as appropriate.  */
3435 
3436 static void
3437 macro_end (void)
3438 {
3439   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3440     {
3441       relax_substateT subtype;
3442 
3443       /* Set up the relaxation warning flags.  */
3444       subtype = 0;
3445       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3446 	subtype |= RELAX_SECOND_LONGER;
3447       if (mips_opts.warn_about_macros)
3448 	subtype |= RELAX_NOMACRO;
3449       if (mips_macro_warning.delay_slot_p)
3450 	subtype |= RELAX_DELAY_SLOT;
3451 
3452       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3453 	{
3454 	  /* Either the macro has a single implementation or both
3455 	     implementations are longer than 4 bytes.  Emit the
3456 	     warning now.  */
3457 	  const char *msg = macro_warning (subtype);
3458 	  if (msg != 0)
3459 	    as_warn ("%s", msg);
3460 	}
3461       else
3462 	{
3463 	  /* One implementation might need a warning but the other
3464 	     definitely doesn't.  */
3465 	  mips_macro_warning.first_frag->fr_subtype |= subtype;
3466 	}
3467     }
3468 }
3469 
3470 /* Read a macro's relocation codes from *ARGS and store them in *R.
3471    The first argument in *ARGS will be either the code for a single
3472    relocation or -1 followed by the three codes that make up a
3473    composite relocation.  */
3474 
3475 static void
3476 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3477 {
3478   int i, next;
3479 
3480   next = va_arg (*args, int);
3481   if (next >= 0)
3482     r[0] = (bfd_reloc_code_real_type) next;
3483   else
3484     for (i = 0; i < 3; i++)
3485       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3486 }
3487 
3488 /* Build an instruction created by a macro expansion.  This is passed
3489    a pointer to the count of instructions created so far, an
3490    expression, the name of the instruction to build, an operand format
3491    string, and corresponding arguments.  */
3492 
3493 static void
3494 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3495 {
3496   const struct mips_opcode *mo;
3497   struct mips_cl_insn insn;
3498   bfd_reloc_code_real_type r[3];
3499   va_list args;
3500 
3501   va_start (args, fmt);
3502 
3503   if (mips_opts.mips16)
3504     {
3505       mips16_macro_build (ep, name, fmt, args);
3506       va_end (args);
3507       return;
3508     }
3509 
3510   r[0] = BFD_RELOC_UNUSED;
3511   r[1] = BFD_RELOC_UNUSED;
3512   r[2] = BFD_RELOC_UNUSED;
3513   mo = (struct mips_opcode *) hash_find (op_hash, name);
3514   assert (mo);
3515   assert (strcmp (name, mo->name) == 0);
3516 
3517   while (1)
3518     {
3519       /* Search until we get a match for NAME.  It is assumed here that
3520 	 macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3521       if (strcmp (fmt, mo->args) == 0
3522 	  && mo->pinfo != INSN_MACRO
3523 	  && is_opcode_valid (mo, TRUE))
3524 	break;
3525 
3526       ++mo;
3527       assert (mo->name);
3528       assert (strcmp (name, mo->name) == 0);
3529     }
3530 
3531   create_insn (&insn, mo);
3532   for (;;)
3533     {
3534       switch (*fmt++)
3535 	{
3536 	case '\0':
3537 	  break;
3538 
3539 	case ',':
3540 	case '(':
3541 	case ')':
3542 	  continue;
3543 
3544 	case '+':
3545 	  switch (*fmt++)
3546 	    {
3547 	    case 'A':
3548 	    case 'E':
3549 	      INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3550 	      continue;
3551 
3552 	    case 'B':
3553 	    case 'F':
3554 	      /* Note that in the macro case, these arguments are already
3555 		 in MSB form.  (When handling the instruction in the
3556 		 non-macro case, these arguments are sizes from which
3557 		 MSB values must be calculated.)  */
3558 	      INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3559 	      continue;
3560 
3561 	    case 'C':
3562 	    case 'G':
3563 	    case 'H':
3564 	      /* Note that in the macro case, these arguments are already
3565 		 in MSBD form.  (When handling the instruction in the
3566 		 non-macro case, these arguments are sizes from which
3567 		 MSBD values must be calculated.)  */
3568 	      INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3569 	      continue;
3570 
3571 	    case 'Q':
3572 	      INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3573 	      continue;
3574 
3575 	    default:
3576 	      internalError ();
3577 	    }
3578 	  continue;
3579 
3580 	case '2':
3581 	  INSERT_OPERAND (BP, insn, va_arg (args, int));
3582 	  continue;
3583 
3584 	case 't':
3585 	case 'w':
3586 	case 'E':
3587 	  INSERT_OPERAND (RT, insn, va_arg (args, int));
3588 	  continue;
3589 
3590 	case 'c':
3591 	  INSERT_OPERAND (CODE, insn, va_arg (args, int));
3592 	  continue;
3593 
3594 	case 'T':
3595 	case 'W':
3596 	  INSERT_OPERAND (FT, insn, va_arg (args, int));
3597 	  continue;
3598 
3599 	case 'd':
3600 	case 'G':
3601 	case 'K':
3602 	  INSERT_OPERAND (RD, insn, va_arg (args, int));
3603 	  continue;
3604 
3605 	case 'U':
3606 	  {
3607 	    int tmp = va_arg (args, int);
3608 
3609 	    INSERT_OPERAND (RT, insn, tmp);
3610 	    INSERT_OPERAND (RD, insn, tmp);
3611 	    continue;
3612 	  }
3613 
3614 	case 'V':
3615 	case 'S':
3616 	  INSERT_OPERAND (FS, insn, va_arg (args, int));
3617 	  continue;
3618 
3619 	case 'z':
3620 	  continue;
3621 
3622 	case '<':
3623 	  INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3624 	  continue;
3625 
3626 	case 'D':
3627 	  INSERT_OPERAND (FD, insn, va_arg (args, int));
3628 	  continue;
3629 
3630 	case 'B':
3631 	  INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3632 	  continue;
3633 
3634 	case 'J':
3635 	  INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3636 	  continue;
3637 
3638 	case 'q':
3639 	  INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3640 	  continue;
3641 
3642 	case 'b':
3643 	case 's':
3644 	case 'r':
3645 	case 'v':
3646 	  INSERT_OPERAND (RS, insn, va_arg (args, int));
3647 	  continue;
3648 
3649 	case 'i':
3650 	case 'j':
3651 	case 'o':
3652 	  macro_read_relocs (&args, r);
3653 	  assert (*r == BFD_RELOC_GPREL16
3654 		  || *r == BFD_RELOC_MIPS_LITERAL
3655 		  || *r == BFD_RELOC_MIPS_HIGHER
3656 		  || *r == BFD_RELOC_HI16_S
3657 		  || *r == BFD_RELOC_LO16
3658 		  || *r == BFD_RELOC_MIPS_GOT16
3659 		  || *r == BFD_RELOC_MIPS_CALL16
3660 		  || *r == BFD_RELOC_MIPS_GOT_DISP
3661 		  || *r == BFD_RELOC_MIPS_GOT_PAGE
3662 		  || *r == BFD_RELOC_MIPS_GOT_OFST
3663 		  || *r == BFD_RELOC_MIPS_GOT_LO16
3664 		  || *r == BFD_RELOC_MIPS_CALL_LO16);
3665 	  continue;
3666 
3667 	case 'u':
3668 	  macro_read_relocs (&args, r);
3669 	  assert (ep != NULL
3670 		  && (ep->X_op == O_constant
3671 		      || (ep->X_op == O_symbol
3672 			  && (*r == BFD_RELOC_MIPS_HIGHEST
3673 			      || *r == BFD_RELOC_HI16_S
3674 			      || *r == BFD_RELOC_HI16
3675 			      || *r == BFD_RELOC_GPREL16
3676 			      || *r == BFD_RELOC_MIPS_GOT_HI16
3677 			      || *r == BFD_RELOC_MIPS_CALL_HI16))));
3678 	  continue;
3679 
3680 	case 'p':
3681 	  assert (ep != NULL);
3682 
3683 	  /*
3684 	   * This allows macro() to pass an immediate expression for
3685 	   * creating short branches without creating a symbol.
3686 	   *
3687 	   * We don't allow branch relaxation for these branches, as
3688 	   * they should only appear in ".set nomacro" anyway.
3689 	   */
3690 	  if (ep->X_op == O_constant)
3691 	    {
3692 	      if ((ep->X_add_number & 3) != 0)
3693 		as_bad (_("branch to misaligned address (0x%lx)"),
3694 			(unsigned long) ep->X_add_number);
3695 	      if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3696 		as_bad (_("branch address range overflow (0x%lx)"),
3697 			(unsigned long) ep->X_add_number);
3698 	      insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3699 	      ep = NULL;
3700 	    }
3701 	  else
3702 	    *r = BFD_RELOC_16_PCREL_S2;
3703 	  continue;
3704 
3705 	case 'a':
3706 	  assert (ep != NULL);
3707 	  *r = BFD_RELOC_MIPS_JMP;
3708 	  continue;
3709 
3710 	case 'C':
3711 	  INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3712 	  continue;
3713 
3714 	case 'k':
3715 	  INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3716 	  continue;
3717 
3718 	default:
3719 	  internalError ();
3720 	}
3721       break;
3722     }
3723   va_end (args);
3724   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3725 
3726   append_insn (&insn, ep, r);
3727 }
3728 
3729 static void
3730 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3731 		    va_list args)
3732 {
3733   struct mips_opcode *mo;
3734   struct mips_cl_insn insn;
3735   bfd_reloc_code_real_type r[3]
3736     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3737 
3738   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3739   assert (mo);
3740   assert (strcmp (name, mo->name) == 0);
3741 
3742   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3743     {
3744       ++mo;
3745       assert (mo->name);
3746       assert (strcmp (name, mo->name) == 0);
3747     }
3748 
3749   create_insn (&insn, mo);
3750   for (;;)
3751     {
3752       int c;
3753 
3754       c = *fmt++;
3755       switch (c)
3756 	{
3757 	case '\0':
3758 	  break;
3759 
3760 	case ',':
3761 	case '(':
3762 	case ')':
3763 	  continue;
3764 
3765 	case 'y':
3766 	case 'w':
3767 	  MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3768 	  continue;
3769 
3770 	case 'x':
3771 	case 'v':
3772 	  MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3773 	  continue;
3774 
3775 	case 'z':
3776 	  MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3777 	  continue;
3778 
3779 	case 'Z':
3780 	  MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3781 	  continue;
3782 
3783 	case '0':
3784 	case 'S':
3785 	case 'P':
3786 	case 'R':
3787 	  continue;
3788 
3789 	case 'X':
3790 	  MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3791 	  continue;
3792 
3793 	case 'Y':
3794 	  {
3795 	    int regno;
3796 
3797 	    regno = va_arg (args, int);
3798 	    regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3799 	    MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3800 	  }
3801 	  continue;
3802 
3803 	case '<':
3804 	case '>':
3805 	case '4':
3806 	case '5':
3807 	case 'H':
3808 	case 'W':
3809 	case 'D':
3810 	case 'j':
3811 	case '8':
3812 	case 'V':
3813 	case 'C':
3814 	case 'U':
3815 	case 'k':
3816 	case 'K':
3817 	case 'p':
3818 	case 'q':
3819 	  {
3820 	    assert (ep != NULL);
3821 
3822 	    if (ep->X_op != O_constant)
3823 	      *r = (int) BFD_RELOC_UNUSED + c;
3824 	    else
3825 	      {
3826 		mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3827 			      FALSE, &insn.insn_opcode, &insn.use_extend,
3828 			      &insn.extend);
3829 		ep = NULL;
3830 		*r = BFD_RELOC_UNUSED;
3831 	      }
3832 	  }
3833 	  continue;
3834 
3835 	case '6':
3836 	  MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3837 	  continue;
3838 	}
3839 
3840       break;
3841     }
3842 
3843   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3844 
3845   append_insn (&insn, ep, r);
3846 }
3847 
3848 /*
3849  * Sign-extend 32-bit mode constants that have bit 31 set and all
3850  * higher bits unset.
3851  */
3852 static void
3853 normalize_constant_expr (expressionS *ex)
3854 {
3855   if (ex->X_op == O_constant
3856       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3857     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3858 			- 0x80000000);
3859 }
3860 
3861 /*
3862  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3863  * all higher bits unset.
3864  */
3865 static void
3866 normalize_address_expr (expressionS *ex)
3867 {
3868   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3869 	|| (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3870       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3871     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3872 			- 0x80000000);
3873 }
3874 
3875 /*
3876  * Generate a "jalr" instruction with a relocation hint to the called
3877  * function.  This occurs in NewABI PIC code.
3878  */
3879 static void
3880 macro_build_jalr (expressionS *ep)
3881 {
3882   char *f = NULL;
3883 
3884   if (HAVE_NEWABI)
3885     {
3886       frag_grow (8);
3887       f = frag_more (0);
3888     }
3889   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3890   if (HAVE_NEWABI)
3891     fix_new_exp (frag_now, f - frag_now->fr_literal,
3892 		 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3893 }
3894 
3895 /*
3896  * Generate a "lui" instruction.
3897  */
3898 static void
3899 macro_build_lui (expressionS *ep, int regnum)
3900 {
3901   expressionS high_expr;
3902   const struct mips_opcode *mo;
3903   struct mips_cl_insn insn;
3904   bfd_reloc_code_real_type r[3]
3905     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3906   const char *name = "lui";
3907   const char *fmt = "t,u";
3908 
3909   assert (! mips_opts.mips16);
3910 
3911   high_expr = *ep;
3912 
3913   if (high_expr.X_op == O_constant)
3914     {
3915       /* We can compute the instruction now without a relocation entry.  */
3916       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3917 				>> 16) & 0xffff;
3918       *r = BFD_RELOC_UNUSED;
3919     }
3920   else
3921     {
3922       assert (ep->X_op == O_symbol);
3923       /* _gp_disp is a special case, used from s_cpload.
3924 	 __gnu_local_gp is used if mips_no_shared.  */
3925       assert (mips_pic == NO_PIC
3926 	      || (! HAVE_NEWABI
3927 		  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3928 	      || (! mips_in_shared
3929 		  && strcmp (S_GET_NAME (ep->X_add_symbol),
3930                              "__gnu_local_gp") == 0));
3931       *r = BFD_RELOC_HI16_S;
3932     }
3933 
3934   mo = hash_find (op_hash, name);
3935   assert (strcmp (name, mo->name) == 0);
3936   assert (strcmp (fmt, mo->args) == 0);
3937   create_insn (&insn, mo);
3938 
3939   insn.insn_opcode = insn.insn_mo->match;
3940   INSERT_OPERAND (RT, insn, regnum);
3941   if (*r == BFD_RELOC_UNUSED)
3942     {
3943       insn.insn_opcode |= high_expr.X_add_number;
3944       append_insn (&insn, NULL, r);
3945     }
3946   else
3947     append_insn (&insn, &high_expr, r);
3948 }
3949 
3950 /* Generate a sequence of instructions to do a load or store from a constant
3951    offset off of a base register (breg) into/from a target register (treg),
3952    using AT if necessary.  */
3953 static void
3954 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3955 			      int treg, int breg, int dbl)
3956 {
3957   assert (ep->X_op == O_constant);
3958 
3959   /* Sign-extending 32-bit constants makes their handling easier.  */
3960   if (!dbl)
3961     normalize_constant_expr (ep);
3962 
3963   /* Right now, this routine can only handle signed 32-bit constants.  */
3964   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3965     as_warn (_("operand overflow"));
3966 
3967   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3968     {
3969       /* Signed 16-bit offset will fit in the op.  Easy!  */
3970       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3971     }
3972   else
3973     {
3974       /* 32-bit offset, need multiple instructions and AT, like:
3975 	   lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3976 	   addu     $tempreg,$tempreg,$breg
3977            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3978          to handle the complete offset.  */
3979       macro_build_lui (ep, AT);
3980       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3981       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3982 
3983       if (!mips_opts.at)
3984 	as_bad (_("Macro used $at after \".set noat\""));
3985     }
3986 }
3987 
3988 /*			set_at()
3989  * Generates code to set the $at register to true (one)
3990  * if reg is less than the immediate expression.
3991  */
3992 static void
3993 set_at (int reg, int unsignedp)
3994 {
3995   if (imm_expr.X_op == O_constant
3996       && imm_expr.X_add_number >= -0x8000
3997       && imm_expr.X_add_number < 0x8000)
3998     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3999 		 AT, reg, BFD_RELOC_LO16);
4000   else
4001     {
4002       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4003       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4004     }
4005 }
4006 
4007 /* Warn if an expression is not a constant.  */
4008 
4009 static void
4010 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4011 {
4012   if (ex->X_op == O_big)
4013     as_bad (_("unsupported large constant"));
4014   else if (ex->X_op != O_constant)
4015     as_bad (_("Instruction %s requires absolute expression"),
4016 	    ip->insn_mo->name);
4017 
4018   if (HAVE_32BIT_GPRS)
4019     normalize_constant_expr (ex);
4020 }
4021 
4022 /* Count the leading zeroes by performing a binary chop. This is a
4023    bulky bit of source, but performance is a LOT better for the
4024    majority of values than a simple loop to count the bits:
4025        for (lcnt = 0; (lcnt < 32); lcnt++)
4026          if ((v) & (1 << (31 - lcnt)))
4027            break;
4028   However it is not code size friendly, and the gain will drop a bit
4029   on certain cached systems.
4030 */
4031 #define COUNT_TOP_ZEROES(v)             \
4032   (((v) & ~0xffff) == 0                 \
4033    ? ((v) & ~0xff) == 0                 \
4034      ? ((v) & ~0xf) == 0                \
4035        ? ((v) & ~0x3) == 0              \
4036          ? ((v) & ~0x1) == 0            \
4037            ? !(v)                       \
4038              ? 32                       \
4039              : 31                       \
4040            : 30                         \
4041          : ((v) & ~0x7) == 0            \
4042            ? 29                         \
4043            : 28                         \
4044        : ((v) & ~0x3f) == 0             \
4045          ? ((v) & ~0x1f) == 0           \
4046            ? 27                         \
4047            : 26                         \
4048          : ((v) & ~0x7f) == 0           \
4049            ? 25                         \
4050            : 24                         \
4051      : ((v) & ~0xfff) == 0              \
4052        ? ((v) & ~0x3ff) == 0            \
4053          ? ((v) & ~0x1ff) == 0          \
4054            ? 23                         \
4055            : 22                         \
4056          : ((v) & ~0x7ff) == 0          \
4057            ? 21                         \
4058            : 20                         \
4059        : ((v) & ~0x3fff) == 0           \
4060          ? ((v) & ~0x1fff) == 0         \
4061            ? 19                         \
4062            : 18                         \
4063          : ((v) & ~0x7fff) == 0         \
4064            ? 17                         \
4065            : 16                         \
4066    : ((v) & ~0xffffff) == 0             \
4067      ? ((v) & ~0xfffff) == 0            \
4068        ? ((v) & ~0x3ffff) == 0          \
4069          ? ((v) & ~0x1ffff) == 0        \
4070            ? 15                         \
4071            : 14                         \
4072          : ((v) & ~0x7ffff) == 0        \
4073            ? 13                         \
4074            : 12                         \
4075        : ((v) & ~0x3fffff) == 0         \
4076          ? ((v) & ~0x1fffff) == 0       \
4077            ? 11                         \
4078            : 10                         \
4079          : ((v) & ~0x7fffff) == 0       \
4080            ? 9                          \
4081            : 8                          \
4082      : ((v) & ~0xfffffff) == 0          \
4083        ? ((v) & ~0x3ffffff) == 0        \
4084          ? ((v) & ~0x1ffffff) == 0      \
4085            ? 7                          \
4086            : 6                          \
4087          : ((v) & ~0x7ffffff) == 0      \
4088            ? 5                          \
4089            : 4                          \
4090        : ((v) & ~0x3fffffff) == 0       \
4091          ? ((v) & ~0x1fffffff) == 0     \
4092            ? 3                          \
4093            : 2                          \
4094          : ((v) & ~0x7fffffff) == 0     \
4095            ? 1                          \
4096            : 0)
4097 
4098 /*			load_register()
4099  *  This routine generates the least number of instructions necessary to load
4100  *  an absolute expression value into a register.
4101  */
4102 static void
4103 load_register (int reg, expressionS *ep, int dbl)
4104 {
4105   int freg;
4106   expressionS hi32, lo32;
4107 
4108   if (ep->X_op != O_big)
4109     {
4110       assert (ep->X_op == O_constant);
4111 
4112       /* Sign-extending 32-bit constants makes their handling easier.  */
4113       if (!dbl)
4114 	normalize_constant_expr (ep);
4115 
4116       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4117 	{
4118 	  /* We can handle 16 bit signed values with an addiu to
4119 	     $zero.  No need to ever use daddiu here, since $zero and
4120 	     the result are always correct in 32 bit mode.  */
4121 	  macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4122 	  return;
4123 	}
4124       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4125 	{
4126 	  /* We can handle 16 bit unsigned values with an ori to
4127              $zero.  */
4128 	  macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4129 	  return;
4130 	}
4131       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4132 	{
4133 	  /* 32 bit values require an lui.  */
4134 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4135 	  if ((ep->X_add_number & 0xffff) != 0)
4136 	    macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4137 	  return;
4138 	}
4139     }
4140 
4141   /* The value is larger than 32 bits.  */
4142 
4143   if (!dbl || HAVE_32BIT_GPRS)
4144     {
4145       char value[32];
4146 
4147       sprintf_vma (value, ep->X_add_number);
4148       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4149       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4150       return;
4151     }
4152 
4153   if (ep->X_op != O_big)
4154     {
4155       hi32 = *ep;
4156       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4157       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4158       hi32.X_add_number &= 0xffffffff;
4159       lo32 = *ep;
4160       lo32.X_add_number &= 0xffffffff;
4161     }
4162   else
4163     {
4164       assert (ep->X_add_number > 2);
4165       if (ep->X_add_number == 3)
4166 	generic_bignum[3] = 0;
4167       else if (ep->X_add_number > 4)
4168 	as_bad (_("Number larger than 64 bits"));
4169       lo32.X_op = O_constant;
4170       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4171       hi32.X_op = O_constant;
4172       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4173     }
4174 
4175   if (hi32.X_add_number == 0)
4176     freg = 0;
4177   else
4178     {
4179       int shift, bit;
4180       unsigned long hi, lo;
4181 
4182       if (hi32.X_add_number == (offsetT) 0xffffffff)
4183 	{
4184 	  if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4185 	    {
4186 	      macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4187 	      return;
4188 	    }
4189 	  if (lo32.X_add_number & 0x80000000)
4190 	    {
4191 	      macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4192 	      if (lo32.X_add_number & 0xffff)
4193 		macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4194 	      return;
4195 	    }
4196 	}
4197 
4198       /* Check for 16bit shifted constant.  We know that hi32 is
4199          non-zero, so start the mask on the first bit of the hi32
4200          value.  */
4201       shift = 17;
4202       do
4203 	{
4204 	  unsigned long himask, lomask;
4205 
4206 	  if (shift < 32)
4207 	    {
4208 	      himask = 0xffff >> (32 - shift);
4209 	      lomask = (0xffff << shift) & 0xffffffff;
4210 	    }
4211 	  else
4212 	    {
4213 	      himask = 0xffff << (shift - 32);
4214 	      lomask = 0;
4215 	    }
4216 	  if ((hi32.X_add_number & ~(offsetT) himask) == 0
4217 	      && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4218 	    {
4219 	      expressionS tmp;
4220 
4221 	      tmp.X_op = O_constant;
4222 	      if (shift < 32)
4223 		tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4224 				    | (lo32.X_add_number >> shift));
4225 	      else
4226 		tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4227 	      macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4228 	      macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4229 			   reg, reg, (shift >= 32) ? shift - 32 : shift);
4230 	      return;
4231 	    }
4232 	  ++shift;
4233 	}
4234       while (shift <= (64 - 16));
4235 
4236       /* Find the bit number of the lowest one bit, and store the
4237          shifted value in hi/lo.  */
4238       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4239       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4240       if (lo != 0)
4241 	{
4242 	  bit = 0;
4243 	  while ((lo & 1) == 0)
4244 	    {
4245 	      lo >>= 1;
4246 	      ++bit;
4247 	    }
4248 	  lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4249 	  hi >>= bit;
4250 	}
4251       else
4252 	{
4253 	  bit = 32;
4254 	  while ((hi & 1) == 0)
4255 	    {
4256 	      hi >>= 1;
4257 	      ++bit;
4258 	    }
4259 	  lo = hi;
4260 	  hi = 0;
4261 	}
4262 
4263       /* Optimize if the shifted value is a (power of 2) - 1.  */
4264       if ((hi == 0 && ((lo + 1) & lo) == 0)
4265 	  || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4266 	{
4267 	  shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4268 	  if (shift != 0)
4269 	    {
4270 	      expressionS tmp;
4271 
4272 	      /* This instruction will set the register to be all
4273                  ones.  */
4274 	      tmp.X_op = O_constant;
4275 	      tmp.X_add_number = (offsetT) -1;
4276 	      macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4277 	      if (bit != 0)
4278 		{
4279 		  bit += shift;
4280 		  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4281 			       reg, reg, (bit >= 32) ? bit - 32 : bit);
4282 		}
4283 	      macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4284 			   reg, reg, (shift >= 32) ? shift - 32 : shift);
4285 	      return;
4286 	    }
4287 	}
4288 
4289       /* Sign extend hi32 before calling load_register, because we can
4290          generally get better code when we load a sign extended value.  */
4291       if ((hi32.X_add_number & 0x80000000) != 0)
4292 	hi32.X_add_number |= ~(offsetT) 0xffffffff;
4293       load_register (reg, &hi32, 0);
4294       freg = reg;
4295     }
4296   if ((lo32.X_add_number & 0xffff0000) == 0)
4297     {
4298       if (freg != 0)
4299 	{
4300 	  macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4301 	  freg = reg;
4302 	}
4303     }
4304   else
4305     {
4306       expressionS mid16;
4307 
4308       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4309 	{
4310 	  macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4311 	  macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4312 	  return;
4313 	}
4314 
4315       if (freg != 0)
4316 	{
4317 	  macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4318 	  freg = reg;
4319 	}
4320       mid16 = lo32;
4321       mid16.X_add_number >>= 16;
4322       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4323       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4324       freg = reg;
4325     }
4326   if ((lo32.X_add_number & 0xffff) != 0)
4327     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4328 }
4329 
4330 static inline void
4331 load_delay_nop (void)
4332 {
4333   if (!gpr_interlocks)
4334     macro_build (NULL, "nop", "");
4335 }
4336 
4337 /* Load an address into a register.  */
4338 
4339 static void
4340 load_address (int reg, expressionS *ep, int *used_at)
4341 {
4342   if (ep->X_op != O_constant
4343       && ep->X_op != O_symbol)
4344     {
4345       as_bad (_("expression too complex"));
4346       ep->X_op = O_constant;
4347     }
4348 
4349   if (ep->X_op == O_constant)
4350     {
4351       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4352       return;
4353     }
4354 
4355   if (mips_pic == NO_PIC)
4356     {
4357       /* If this is a reference to a GP relative symbol, we want
4358 	   addiu	$reg,$gp,<sym>		(BFD_RELOC_GPREL16)
4359 	 Otherwise we want
4360 	   lui		$reg,<sym>		(BFD_RELOC_HI16_S)
4361 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4362 	 If we have an addend, we always use the latter form.
4363 
4364 	 With 64bit address space and a usable $at we want
4365 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4366 	   lui		$at,<sym>		(BFD_RELOC_HI16_S)
4367 	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4368 	   daddiu	$at,<sym>		(BFD_RELOC_LO16)
4369 	   dsll32	$reg,0
4370 	   daddu	$reg,$reg,$at
4371 
4372 	 If $at is already in use, we use a path which is suboptimal
4373 	 on superscalar processors.
4374 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4375 	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4376 	   dsll		$reg,16
4377 	   daddiu	$reg,<sym>		(BFD_RELOC_HI16_S)
4378 	   dsll		$reg,16
4379 	   daddiu	$reg,<sym>		(BFD_RELOC_LO16)
4380 
4381 	 For GP relative symbols in 64bit address space we can use
4382 	 the same sequence as in 32bit address space.  */
4383       if (HAVE_64BIT_SYMBOLS)
4384 	{
4385 	  if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4386 	      && !nopic_need_relax (ep->X_add_symbol, 1))
4387 	    {
4388 	      relax_start (ep->X_add_symbol);
4389 	      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4390 			   mips_gp_register, BFD_RELOC_GPREL16);
4391 	      relax_switch ();
4392 	    }
4393 
4394 	  if (*used_at == 0 && mips_opts.at)
4395 	    {
4396 	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4397 	      macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4398 	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
4399 			   BFD_RELOC_MIPS_HIGHER);
4400 	      macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4401 	      macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4402 	      macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4403 	      *used_at = 1;
4404 	    }
4405 	  else
4406 	    {
4407 	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4408 	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
4409 			   BFD_RELOC_MIPS_HIGHER);
4410 	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4411 	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4412 	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4413 	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4414 	    }
4415 
4416 	  if (mips_relax.sequence)
4417 	    relax_end ();
4418 	}
4419       else
4420 	{
4421 	  if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4422 	      && !nopic_need_relax (ep->X_add_symbol, 1))
4423 	    {
4424 	      relax_start (ep->X_add_symbol);
4425 	      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4426 			   mips_gp_register, BFD_RELOC_GPREL16);
4427 	      relax_switch ();
4428 	    }
4429 	  macro_build_lui (ep, reg);
4430 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4431 		       reg, reg, BFD_RELOC_LO16);
4432 	  if (mips_relax.sequence)
4433 	    relax_end ();
4434 	}
4435     }
4436   else if (!mips_big_got)
4437     {
4438       expressionS ex;
4439 
4440       /* If this is a reference to an external symbol, we want
4441 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4442 	 Otherwise we want
4443 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4444 	   nop
4445 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4446 	 If there is a constant, it must be added in after.
4447 
4448 	 If we have NewABI, we want
4449 	   lw		$reg,<sym+cst>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
4450          unless we're referencing a global symbol with a non-zero
4451          offset, in which case cst must be added separately.  */
4452       if (HAVE_NEWABI)
4453 	{
4454 	  if (ep->X_add_number)
4455 	    {
4456 	      ex.X_add_number = ep->X_add_number;
4457 	      ep->X_add_number = 0;
4458 	      relax_start (ep->X_add_symbol);
4459 	      macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4460 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4461 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4462 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4463 	      ex.X_op = O_constant;
4464 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4465 			   reg, reg, BFD_RELOC_LO16);
4466 	      ep->X_add_number = ex.X_add_number;
4467 	      relax_switch ();
4468 	    }
4469 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4470 		       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4471 	  if (mips_relax.sequence)
4472 	    relax_end ();
4473 	}
4474       else
4475 	{
4476 	  ex.X_add_number = ep->X_add_number;
4477 	  ep->X_add_number = 0;
4478 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4479 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4480 	  load_delay_nop ();
4481 	  relax_start (ep->X_add_symbol);
4482 	  relax_switch ();
4483 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4484 		       BFD_RELOC_LO16);
4485 	  relax_end ();
4486 
4487 	  if (ex.X_add_number != 0)
4488 	    {
4489 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4490 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4491 	      ex.X_op = O_constant;
4492 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4493 			   reg, reg, BFD_RELOC_LO16);
4494 	    }
4495 	}
4496     }
4497   else if (mips_big_got)
4498     {
4499       expressionS ex;
4500 
4501       /* This is the large GOT case.  If this is a reference to an
4502 	 external symbol, we want
4503 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
4504 	   addu		$reg,$reg,$gp
4505 	   lw		$reg,<sym>($reg)	(BFD_RELOC_MIPS_GOT_LO16)
4506 
4507 	 Otherwise, for a reference to a local symbol in old ABI, we want
4508 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4509 	   nop
4510 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4511 	 If there is a constant, it must be added in after.
4512 
4513 	 In the NewABI, for local symbols, with or without offsets, we want:
4514 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
4515 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
4516       */
4517       if (HAVE_NEWABI)
4518 	{
4519 	  ex.X_add_number = ep->X_add_number;
4520 	  ep->X_add_number = 0;
4521 	  relax_start (ep->X_add_symbol);
4522 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4523 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4524 		       reg, reg, mips_gp_register);
4525 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4526 		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4527 	  if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4528 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4529 	  else if (ex.X_add_number)
4530 	    {
4531 	      ex.X_op = O_constant;
4532 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4533 			   BFD_RELOC_LO16);
4534 	    }
4535 
4536 	  ep->X_add_number = ex.X_add_number;
4537 	  relax_switch ();
4538 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4539 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4540 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4541 		       BFD_RELOC_MIPS_GOT_OFST);
4542 	  relax_end ();
4543 	}
4544       else
4545 	{
4546 	  ex.X_add_number = ep->X_add_number;
4547 	  ep->X_add_number = 0;
4548 	  relax_start (ep->X_add_symbol);
4549 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4550 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4551 		       reg, reg, mips_gp_register);
4552 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4553 		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4554 	  relax_switch ();
4555 	  if (reg_needs_delay (mips_gp_register))
4556 	    {
4557 	      /* We need a nop before loading from $gp.  This special
4558 		 check is required because the lui which starts the main
4559 		 instruction stream does not refer to $gp, and so will not
4560 		 insert the nop which may be required.  */
4561 	      macro_build (NULL, "nop", "");
4562 	    }
4563 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4564 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4565 	  load_delay_nop ();
4566 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4567 		       BFD_RELOC_LO16);
4568 	  relax_end ();
4569 
4570 	  if (ex.X_add_number != 0)
4571 	    {
4572 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4573 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4574 	      ex.X_op = O_constant;
4575 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4576 			   BFD_RELOC_LO16);
4577 	    }
4578 	}
4579     }
4580   else
4581     abort ();
4582 
4583   if (!mips_opts.at && *used_at == 1)
4584     as_bad (_("Macro used $at after \".set noat\""));
4585 }
4586 
4587 /* Move the contents of register SOURCE into register DEST.  */
4588 
4589 static void
4590 move_register (int dest, int source)
4591 {
4592   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4593 	       dest, source, 0);
4594 }
4595 
4596 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4597    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4598    The two alternatives are:
4599 
4600    Global symbol		Local sybmol
4601    -------------		------------
4602    lw DEST,%got(SYMBOL)		lw DEST,%got(SYMBOL + OFFSET)
4603    ...				...
4604    addiu DEST,DEST,OFFSET	addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4605 
4606    load_got_offset emits the first instruction and add_got_offset
4607    emits the second for a 16-bit offset or add_got_offset_hilo emits
4608    a sequence to add a 32-bit offset using a scratch register.  */
4609 
4610 static void
4611 load_got_offset (int dest, expressionS *local)
4612 {
4613   expressionS global;
4614 
4615   global = *local;
4616   global.X_add_number = 0;
4617 
4618   relax_start (local->X_add_symbol);
4619   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4620 	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4621   relax_switch ();
4622   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4623 	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4624   relax_end ();
4625 }
4626 
4627 static void
4628 add_got_offset (int dest, expressionS *local)
4629 {
4630   expressionS global;
4631 
4632   global.X_op = O_constant;
4633   global.X_op_symbol = NULL;
4634   global.X_add_symbol = NULL;
4635   global.X_add_number = local->X_add_number;
4636 
4637   relax_start (local->X_add_symbol);
4638   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4639 	       dest, dest, BFD_RELOC_LO16);
4640   relax_switch ();
4641   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4642   relax_end ();
4643 }
4644 
4645 static void
4646 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4647 {
4648   expressionS global;
4649   int hold_mips_optimize;
4650 
4651   global.X_op = O_constant;
4652   global.X_op_symbol = NULL;
4653   global.X_add_symbol = NULL;
4654   global.X_add_number = local->X_add_number;
4655 
4656   relax_start (local->X_add_symbol);
4657   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4658   relax_switch ();
4659   /* Set mips_optimize around the lui instruction to avoid
4660      inserting an unnecessary nop after the lw.  */
4661   hold_mips_optimize = mips_optimize;
4662   mips_optimize = 2;
4663   macro_build_lui (&global, tmp);
4664   mips_optimize = hold_mips_optimize;
4665   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4666   relax_end ();
4667 
4668   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4669 }
4670 
4671 /*
4672  *			Build macros
4673  *   This routine implements the seemingly endless macro or synthesized
4674  * instructions and addressing modes in the mips assembly language. Many
4675  * of these macros are simple and are similar to each other. These could
4676  * probably be handled by some kind of table or grammar approach instead of
4677  * this verbose method. Others are not simple macros but are more like
4678  * optimizing code generation.
4679  *   One interesting optimization is when several store macros appear
4680  * consecutively that would load AT with the upper half of the same address.
4681  * The ensuing load upper instructions are ommited. This implies some kind
4682  * of global optimization. We currently only optimize within a single macro.
4683  *   For many of the load and store macros if the address is specified as a
4684  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4685  * first load register 'at' with zero and use it as the base register. The
4686  * mips assembler simply uses register $zero. Just one tiny optimization
4687  * we're missing.
4688  */
4689 static void
4690 macro (struct mips_cl_insn *ip)
4691 {
4692   unsigned int treg, sreg, dreg, breg;
4693   unsigned int tempreg;
4694   int mask;
4695   int used_at = 0;
4696   expressionS expr1;
4697   const char *s;
4698   const char *s2;
4699   const char *fmt;
4700   int likely = 0;
4701   int dbl = 0;
4702   int coproc = 0;
4703   int lr = 0;
4704   int imm = 0;
4705   int call = 0;
4706   int off;
4707   offsetT maxnum;
4708   bfd_reloc_code_real_type r;
4709   int hold_mips_optimize;
4710 
4711   assert (! mips_opts.mips16);
4712 
4713   treg = (ip->insn_opcode >> 16) & 0x1f;
4714   dreg = (ip->insn_opcode >> 11) & 0x1f;
4715   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4716   mask = ip->insn_mo->mask;
4717 
4718   expr1.X_op = O_constant;
4719   expr1.X_op_symbol = NULL;
4720   expr1.X_add_symbol = NULL;
4721   expr1.X_add_number = 1;
4722 
4723   switch (mask)
4724     {
4725     case M_DABS:
4726       dbl = 1;
4727     case M_ABS:
4728       /* bgez $a0,.+12
4729 	 move v0,$a0
4730 	 sub v0,$zero,$a0
4731 	 */
4732 
4733       start_noreorder ();
4734 
4735       expr1.X_add_number = 8;
4736       macro_build (&expr1, "bgez", "s,p", sreg);
4737       if (dreg == sreg)
4738 	macro_build (NULL, "nop", "", 0);
4739       else
4740 	move_register (dreg, sreg);
4741       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4742 
4743       end_noreorder ();
4744       break;
4745 
4746     case M_ADD_I:
4747       s = "addi";
4748       s2 = "add";
4749       goto do_addi;
4750     case M_ADDU_I:
4751       s = "addiu";
4752       s2 = "addu";
4753       goto do_addi;
4754     case M_DADD_I:
4755       dbl = 1;
4756       s = "daddi";
4757       s2 = "dadd";
4758       goto do_addi;
4759     case M_DADDU_I:
4760       dbl = 1;
4761       s = "daddiu";
4762       s2 = "daddu";
4763     do_addi:
4764       if (imm_expr.X_op == O_constant
4765 	  && imm_expr.X_add_number >= -0x8000
4766 	  && imm_expr.X_add_number < 0x8000)
4767 	{
4768 	  macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4769 	  break;
4770 	}
4771       used_at = 1;
4772       load_register (AT, &imm_expr, dbl);
4773       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4774       break;
4775 
4776     case M_AND_I:
4777       s = "andi";
4778       s2 = "and";
4779       goto do_bit;
4780     case M_OR_I:
4781       s = "ori";
4782       s2 = "or";
4783       goto do_bit;
4784     case M_NOR_I:
4785       s = "";
4786       s2 = "nor";
4787       goto do_bit;
4788     case M_XOR_I:
4789       s = "xori";
4790       s2 = "xor";
4791     do_bit:
4792       if (imm_expr.X_op == O_constant
4793 	  && imm_expr.X_add_number >= 0
4794 	  && imm_expr.X_add_number < 0x10000)
4795 	{
4796 	  if (mask != M_NOR_I)
4797 	    macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4798 	  else
4799 	    {
4800 	      macro_build (&imm_expr, "ori", "t,r,i",
4801 			   treg, sreg, BFD_RELOC_LO16);
4802 	      macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4803 	    }
4804 	  break;
4805 	}
4806 
4807       used_at = 1;
4808       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4809       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4810       break;
4811 
4812     case M_BALIGN:
4813       switch (imm_expr.X_add_number)
4814 	{
4815 	case 0:
4816 	  macro_build (NULL, "nop", "");
4817 	  break;
4818 	case 2:
4819 	  macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4820 	  break;
4821 	default:
4822 	  macro_build (NULL, "balign", "t,s,2", treg, sreg,
4823 		       (int)imm_expr.X_add_number);
4824 	  break;
4825 	}
4826       break;
4827 
4828     case M_BEQ_I:
4829       s = "beq";
4830       goto beq_i;
4831     case M_BEQL_I:
4832       s = "beql";
4833       likely = 1;
4834       goto beq_i;
4835     case M_BNE_I:
4836       s = "bne";
4837       goto beq_i;
4838     case M_BNEL_I:
4839       s = "bnel";
4840       likely = 1;
4841     beq_i:
4842       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4843 	{
4844 	  macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4845 	  break;
4846 	}
4847       used_at = 1;
4848       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4849       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4850       break;
4851 
4852     case M_BGEL:
4853       likely = 1;
4854     case M_BGE:
4855       if (treg == 0)
4856 	{
4857 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4858 	  break;
4859 	}
4860       if (sreg == 0)
4861 	{
4862 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4863 	  break;
4864 	}
4865       used_at = 1;
4866       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4867       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4868       break;
4869 
4870     case M_BGTL_I:
4871       likely = 1;
4872     case M_BGT_I:
4873       /* check for > max integer */
4874       maxnum = 0x7fffffff;
4875       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4876 	{
4877 	  maxnum <<= 16;
4878 	  maxnum |= 0xffff;
4879 	  maxnum <<= 16;
4880 	  maxnum |= 0xffff;
4881 	}
4882       if (imm_expr.X_op == O_constant
4883 	  && imm_expr.X_add_number >= maxnum
4884 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4885 	{
4886 	do_false:
4887 	  /* result is always false */
4888 	  if (! likely)
4889 	    macro_build (NULL, "nop", "", 0);
4890 	  else
4891 	    macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4892 	  break;
4893 	}
4894       if (imm_expr.X_op != O_constant)
4895 	as_bad (_("Unsupported large constant"));
4896       ++imm_expr.X_add_number;
4897       /* FALLTHROUGH */
4898     case M_BGE_I:
4899     case M_BGEL_I:
4900       if (mask == M_BGEL_I)
4901 	likely = 1;
4902       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4903 	{
4904 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4905 	  break;
4906 	}
4907       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4908 	{
4909 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4910 	  break;
4911 	}
4912       maxnum = 0x7fffffff;
4913       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4914 	{
4915 	  maxnum <<= 16;
4916 	  maxnum |= 0xffff;
4917 	  maxnum <<= 16;
4918 	  maxnum |= 0xffff;
4919 	}
4920       maxnum = - maxnum - 1;
4921       if (imm_expr.X_op == O_constant
4922 	  && imm_expr.X_add_number <= maxnum
4923 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4924 	{
4925 	do_true:
4926 	  /* result is always true */
4927 	  as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4928 	  macro_build (&offset_expr, "b", "p");
4929 	  break;
4930 	}
4931       used_at = 1;
4932       set_at (sreg, 0);
4933       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4934       break;
4935 
4936     case M_BGEUL:
4937       likely = 1;
4938     case M_BGEU:
4939       if (treg == 0)
4940 	goto do_true;
4941       if (sreg == 0)
4942 	{
4943 	  macro_build (&offset_expr, likely ? "beql" : "beq",
4944 		       "s,t,p", 0, treg);
4945 	  break;
4946 	}
4947       used_at = 1;
4948       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4949       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4950       break;
4951 
4952     case M_BGTUL_I:
4953       likely = 1;
4954     case M_BGTU_I:
4955       if (sreg == 0
4956 	  || (HAVE_32BIT_GPRS
4957 	      && imm_expr.X_op == O_constant
4958 	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
4959 	goto do_false;
4960       if (imm_expr.X_op != O_constant)
4961 	as_bad (_("Unsupported large constant"));
4962       ++imm_expr.X_add_number;
4963       /* FALLTHROUGH */
4964     case M_BGEU_I:
4965     case M_BGEUL_I:
4966       if (mask == M_BGEUL_I)
4967 	likely = 1;
4968       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4969 	goto do_true;
4970       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4971 	{
4972 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4973 		       "s,t,p", sreg, 0);
4974 	  break;
4975 	}
4976       used_at = 1;
4977       set_at (sreg, 1);
4978       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4979       break;
4980 
4981     case M_BGTL:
4982       likely = 1;
4983     case M_BGT:
4984       if (treg == 0)
4985 	{
4986 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4987 	  break;
4988 	}
4989       if (sreg == 0)
4990 	{
4991 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4992 	  break;
4993 	}
4994       used_at = 1;
4995       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4996       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4997       break;
4998 
4999     case M_BGTUL:
5000       likely = 1;
5001     case M_BGTU:
5002       if (treg == 0)
5003 	{
5004 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
5005 		       "s,t,p", sreg, 0);
5006 	  break;
5007 	}
5008       if (sreg == 0)
5009 	goto do_false;
5010       used_at = 1;
5011       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5012       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5013       break;
5014 
5015     case M_BLEL:
5016       likely = 1;
5017     case M_BLE:
5018       if (treg == 0)
5019 	{
5020 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5021 	  break;
5022 	}
5023       if (sreg == 0)
5024 	{
5025 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5026 	  break;
5027 	}
5028       used_at = 1;
5029       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5030       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5031       break;
5032 
5033     case M_BLEL_I:
5034       likely = 1;
5035     case M_BLE_I:
5036       maxnum = 0x7fffffff;
5037       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5038 	{
5039 	  maxnum <<= 16;
5040 	  maxnum |= 0xffff;
5041 	  maxnum <<= 16;
5042 	  maxnum |= 0xffff;
5043 	}
5044       if (imm_expr.X_op == O_constant
5045 	  && imm_expr.X_add_number >= maxnum
5046 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5047 	goto do_true;
5048       if (imm_expr.X_op != O_constant)
5049 	as_bad (_("Unsupported large constant"));
5050       ++imm_expr.X_add_number;
5051       /* FALLTHROUGH */
5052     case M_BLT_I:
5053     case M_BLTL_I:
5054       if (mask == M_BLTL_I)
5055 	likely = 1;
5056       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5057 	{
5058 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5059 	  break;
5060 	}
5061       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5062 	{
5063 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5064 	  break;
5065 	}
5066       used_at = 1;
5067       set_at (sreg, 0);
5068       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5069       break;
5070 
5071     case M_BLEUL:
5072       likely = 1;
5073     case M_BLEU:
5074       if (treg == 0)
5075 	{
5076 	  macro_build (&offset_expr, likely ? "beql" : "beq",
5077 		       "s,t,p", sreg, 0);
5078 	  break;
5079 	}
5080       if (sreg == 0)
5081 	goto do_true;
5082       used_at = 1;
5083       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5084       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5085       break;
5086 
5087     case M_BLEUL_I:
5088       likely = 1;
5089     case M_BLEU_I:
5090       if (sreg == 0
5091 	  || (HAVE_32BIT_GPRS
5092 	      && imm_expr.X_op == O_constant
5093 	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
5094 	goto do_true;
5095       if (imm_expr.X_op != O_constant)
5096 	as_bad (_("Unsupported large constant"));
5097       ++imm_expr.X_add_number;
5098       /* FALLTHROUGH */
5099     case M_BLTU_I:
5100     case M_BLTUL_I:
5101       if (mask == M_BLTUL_I)
5102 	likely = 1;
5103       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5104 	goto do_false;
5105       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5106 	{
5107 	  macro_build (&offset_expr, likely ? "beql" : "beq",
5108 		       "s,t,p", sreg, 0);
5109 	  break;
5110 	}
5111       used_at = 1;
5112       set_at (sreg, 1);
5113       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5114       break;
5115 
5116     case M_BLTL:
5117       likely = 1;
5118     case M_BLT:
5119       if (treg == 0)
5120 	{
5121 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5122 	  break;
5123 	}
5124       if (sreg == 0)
5125 	{
5126 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5127 	  break;
5128 	}
5129       used_at = 1;
5130       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5131       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5132       break;
5133 
5134     case M_BLTUL:
5135       likely = 1;
5136     case M_BLTU:
5137       if (treg == 0)
5138 	goto do_false;
5139       if (sreg == 0)
5140 	{
5141 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
5142 		       "s,t,p", 0, treg);
5143 	  break;
5144 	}
5145       used_at = 1;
5146       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5147       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5148       break;
5149 
5150     case M_DEXT:
5151       {
5152 	unsigned long pos;
5153 	unsigned long size;
5154 
5155         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5156 	  {
5157 	    as_bad (_("Unsupported large constant"));
5158 	    pos = size = 1;
5159 	  }
5160 	else
5161 	  {
5162 	    pos = (unsigned long) imm_expr.X_add_number;
5163 	    size = (unsigned long) imm2_expr.X_add_number;
5164 	  }
5165 
5166 	if (pos > 63)
5167 	  {
5168 	    as_bad (_("Improper position (%lu)"), pos);
5169 	    pos = 1;
5170 	  }
5171         if (size == 0 || size > 64
5172 	    || (pos + size - 1) > 63)
5173 	  {
5174 	    as_bad (_("Improper extract size (%lu, position %lu)"),
5175 		    size, pos);
5176 	    size = 1;
5177 	  }
5178 
5179 	if (size <= 32 && pos < 32)
5180 	  {
5181 	    s = "dext";
5182 	    fmt = "t,r,+A,+C";
5183 	  }
5184 	else if (size <= 32)
5185 	  {
5186 	    s = "dextu";
5187 	    fmt = "t,r,+E,+H";
5188 	  }
5189 	else
5190 	  {
5191 	    s = "dextm";
5192 	    fmt = "t,r,+A,+G";
5193 	  }
5194 	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5195       }
5196       break;
5197 
5198     case M_DINS:
5199       {
5200 	unsigned long pos;
5201 	unsigned long size;
5202 
5203         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5204 	  {
5205 	    as_bad (_("Unsupported large constant"));
5206 	    pos = size = 1;
5207 	  }
5208 	else
5209 	  {
5210 	    pos = (unsigned long) imm_expr.X_add_number;
5211 	    size = (unsigned long) imm2_expr.X_add_number;
5212 	  }
5213 
5214 	if (pos > 63)
5215 	  {
5216 	    as_bad (_("Improper position (%lu)"), pos);
5217 	    pos = 1;
5218 	  }
5219         if (size == 0 || size > 64
5220 	    || (pos + size - 1) > 63)
5221 	  {
5222 	    as_bad (_("Improper insert size (%lu, position %lu)"),
5223 		    size, pos);
5224 	    size = 1;
5225 	  }
5226 
5227 	if (pos < 32 && (pos + size - 1) < 32)
5228 	  {
5229 	    s = "dins";
5230 	    fmt = "t,r,+A,+B";
5231 	  }
5232 	else if (pos >= 32)
5233 	  {
5234 	    s = "dinsu";
5235 	    fmt = "t,r,+E,+F";
5236 	  }
5237 	else
5238 	  {
5239 	    s = "dinsm";
5240 	    fmt = "t,r,+A,+F";
5241 	  }
5242 	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5243 		     pos + size - 1);
5244       }
5245       break;
5246 
5247     case M_DDIV_3:
5248       dbl = 1;
5249     case M_DIV_3:
5250       s = "mflo";
5251       goto do_div3;
5252     case M_DREM_3:
5253       dbl = 1;
5254     case M_REM_3:
5255       s = "mfhi";
5256     do_div3:
5257       if (treg == 0)
5258 	{
5259 	  as_warn (_("Divide by zero."));
5260 	  if (mips_trap)
5261 	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5262 	  else
5263 	    macro_build (NULL, "break", "c", 7);
5264 	  break;
5265 	}
5266 
5267       start_noreorder ();
5268       if (mips_trap)
5269 	{
5270 	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5271 	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5272 	}
5273       else
5274 	{
5275 	  expr1.X_add_number = 8;
5276 	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
5277 	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5278 	  macro_build (NULL, "break", "c", 7);
5279 	}
5280       expr1.X_add_number = -1;
5281       used_at = 1;
5282       load_register (AT, &expr1, dbl);
5283       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5284       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5285       if (dbl)
5286 	{
5287 	  expr1.X_add_number = 1;
5288 	  load_register (AT, &expr1, dbl);
5289 	  macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5290 	}
5291       else
5292 	{
5293 	  expr1.X_add_number = 0x80000000;
5294 	  macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5295 	}
5296       if (mips_trap)
5297 	{
5298 	  macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5299 	  /* We want to close the noreorder block as soon as possible, so
5300 	     that later insns are available for delay slot filling.  */
5301 	  end_noreorder ();
5302 	}
5303       else
5304 	{
5305 	  expr1.X_add_number = 8;
5306 	  macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5307 	  macro_build (NULL, "nop", "", 0);
5308 
5309 	  /* We want to close the noreorder block as soon as possible, so
5310 	     that later insns are available for delay slot filling.  */
5311 	  end_noreorder ();
5312 
5313 	  macro_build (NULL, "break", "c", 6);
5314 	}
5315       macro_build (NULL, s, "d", dreg);
5316       break;
5317 
5318     case M_DIV_3I:
5319       s = "div";
5320       s2 = "mflo";
5321       goto do_divi;
5322     case M_DIVU_3I:
5323       s = "divu";
5324       s2 = "mflo";
5325       goto do_divi;
5326     case M_REM_3I:
5327       s = "div";
5328       s2 = "mfhi";
5329       goto do_divi;
5330     case M_REMU_3I:
5331       s = "divu";
5332       s2 = "mfhi";
5333       goto do_divi;
5334     case M_DDIV_3I:
5335       dbl = 1;
5336       s = "ddiv";
5337       s2 = "mflo";
5338       goto do_divi;
5339     case M_DDIVU_3I:
5340       dbl = 1;
5341       s = "ddivu";
5342       s2 = "mflo";
5343       goto do_divi;
5344     case M_DREM_3I:
5345       dbl = 1;
5346       s = "ddiv";
5347       s2 = "mfhi";
5348       goto do_divi;
5349     case M_DREMU_3I:
5350       dbl = 1;
5351       s = "ddivu";
5352       s2 = "mfhi";
5353     do_divi:
5354       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5355 	{
5356 	  as_warn (_("Divide by zero."));
5357 	  if (mips_trap)
5358 	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5359 	  else
5360 	    macro_build (NULL, "break", "c", 7);
5361 	  break;
5362 	}
5363       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5364 	{
5365 	  if (strcmp (s2, "mflo") == 0)
5366 	    move_register (dreg, sreg);
5367 	  else
5368 	    move_register (dreg, 0);
5369 	  break;
5370 	}
5371       if (imm_expr.X_op == O_constant
5372 	  && imm_expr.X_add_number == -1
5373 	  && s[strlen (s) - 1] != 'u')
5374 	{
5375 	  if (strcmp (s2, "mflo") == 0)
5376 	    {
5377 	      macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5378 	    }
5379 	  else
5380 	    move_register (dreg, 0);
5381 	  break;
5382 	}
5383 
5384       used_at = 1;
5385       load_register (AT, &imm_expr, dbl);
5386       macro_build (NULL, s, "z,s,t", sreg, AT);
5387       macro_build (NULL, s2, "d", dreg);
5388       break;
5389 
5390     case M_DIVU_3:
5391       s = "divu";
5392       s2 = "mflo";
5393       goto do_divu3;
5394     case M_REMU_3:
5395       s = "divu";
5396       s2 = "mfhi";
5397       goto do_divu3;
5398     case M_DDIVU_3:
5399       s = "ddivu";
5400       s2 = "mflo";
5401       goto do_divu3;
5402     case M_DREMU_3:
5403       s = "ddivu";
5404       s2 = "mfhi";
5405     do_divu3:
5406       start_noreorder ();
5407       if (mips_trap)
5408 	{
5409 	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5410 	  macro_build (NULL, s, "z,s,t", sreg, treg);
5411 	  /* We want to close the noreorder block as soon as possible, so
5412 	     that later insns are available for delay slot filling.  */
5413 	  end_noreorder ();
5414 	}
5415       else
5416 	{
5417 	  expr1.X_add_number = 8;
5418 	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
5419 	  macro_build (NULL, s, "z,s,t", sreg, treg);
5420 
5421 	  /* We want to close the noreorder block as soon as possible, so
5422 	     that later insns are available for delay slot filling.  */
5423 	  end_noreorder ();
5424 	  macro_build (NULL, "break", "c", 7);
5425 	}
5426       macro_build (NULL, s2, "d", dreg);
5427       break;
5428 
5429     case M_DLCA_AB:
5430       dbl = 1;
5431     case M_LCA_AB:
5432       call = 1;
5433       goto do_la;
5434     case M_DLA_AB:
5435       dbl = 1;
5436     case M_LA_AB:
5437     do_la:
5438       /* Load the address of a symbol into a register.  If breg is not
5439 	 zero, we then add a base register to it.  */
5440 
5441       if (dbl && HAVE_32BIT_GPRS)
5442 	as_warn (_("dla used to load 32-bit register"));
5443 
5444       if (! dbl && HAVE_64BIT_OBJECTS)
5445 	as_warn (_("la used to load 64-bit address"));
5446 
5447       if (offset_expr.X_op == O_constant
5448 	  && offset_expr.X_add_number >= -0x8000
5449 	  && offset_expr.X_add_number < 0x8000)
5450 	{
5451 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5452 		       "t,r,j", treg, sreg, BFD_RELOC_LO16);
5453 	  break;
5454 	}
5455 
5456       if (mips_opts.at && (treg == breg))
5457 	{
5458 	  tempreg = AT;
5459 	  used_at = 1;
5460 	}
5461       else
5462 	{
5463 	  tempreg = treg;
5464 	}
5465 
5466       if (offset_expr.X_op != O_symbol
5467 	  && offset_expr.X_op != O_constant)
5468 	{
5469 	  as_bad (_("expression too complex"));
5470 	  offset_expr.X_op = O_constant;
5471 	}
5472 
5473       if (offset_expr.X_op == O_constant)
5474 	load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5475       else if (mips_pic == NO_PIC)
5476 	{
5477 	  /* If this is a reference to a GP relative symbol, we want
5478 	       addiu	$tempreg,$gp,<sym>	(BFD_RELOC_GPREL16)
5479 	     Otherwise we want
5480 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5481 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5482 	     If we have a constant, we need two instructions anyhow,
5483 	     so we may as well always use the latter form.
5484 
5485 	     With 64bit address space and a usable $at we want
5486 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5487 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
5488 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5489 	       daddiu	$at,<sym>		(BFD_RELOC_LO16)
5490 	       dsll32	$tempreg,0
5491 	       daddu	$tempreg,$tempreg,$at
5492 
5493 	     If $at is already in use, we use a path which is suboptimal
5494 	     on superscalar processors.
5495 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5496 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5497 	       dsll	$tempreg,16
5498 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5499 	       dsll	$tempreg,16
5500 	       daddiu	$tempreg,<sym>		(BFD_RELOC_LO16)
5501 
5502 	     For GP relative symbols in 64bit address space we can use
5503 	     the same sequence as in 32bit address space.  */
5504 	  if (HAVE_64BIT_SYMBOLS)
5505 	    {
5506 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5507 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5508 		{
5509 		  relax_start (offset_expr.X_add_symbol);
5510 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5511 			       tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5512 		  relax_switch ();
5513 		}
5514 
5515 	      if (used_at == 0 && mips_opts.at)
5516 		{
5517 		  macro_build (&offset_expr, "lui", "t,u",
5518 			       tempreg, BFD_RELOC_MIPS_HIGHEST);
5519 		  macro_build (&offset_expr, "lui", "t,u",
5520 			       AT, BFD_RELOC_HI16_S);
5521 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5522 			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5523 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5524 			       AT, AT, BFD_RELOC_LO16);
5525 		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5526 		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5527 		  used_at = 1;
5528 		}
5529 	      else
5530 		{
5531 		  macro_build (&offset_expr, "lui", "t,u",
5532 			       tempreg, BFD_RELOC_MIPS_HIGHEST);
5533 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5534 			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5535 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5536 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5537 			       tempreg, tempreg, BFD_RELOC_HI16_S);
5538 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5539 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5540 			       tempreg, tempreg, BFD_RELOC_LO16);
5541 		}
5542 
5543 	      if (mips_relax.sequence)
5544 		relax_end ();
5545 	    }
5546 	  else
5547 	    {
5548 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5549 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5550 		{
5551 		  relax_start (offset_expr.X_add_symbol);
5552 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5553 			       tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5554 		  relax_switch ();
5555 		}
5556 	      if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5557 		as_bad (_("offset too large"));
5558 	      macro_build_lui (&offset_expr, tempreg);
5559 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5560 			   tempreg, tempreg, BFD_RELOC_LO16);
5561 	      if (mips_relax.sequence)
5562 		relax_end ();
5563 	    }
5564 	}
5565       else if (!mips_big_got && !HAVE_NEWABI)
5566 	{
5567 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5568 
5569 	  /* If this is a reference to an external symbol, and there
5570 	     is no constant, we want
5571 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5572 	     or for lca or if tempreg is PIC_CALL_REG
5573 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5574 	     For a local symbol, we want
5575 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5576 	       nop
5577 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5578 
5579 	     If we have a small constant, and this is a reference to
5580 	     an external symbol, we want
5581 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5582 	       nop
5583 	       addiu	$tempreg,$tempreg,<constant>
5584 	     For a local symbol, we want the same instruction
5585 	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5586 	     addiu instruction.
5587 
5588 	     If we have a large constant, and this is a reference to
5589 	     an external symbol, we want
5590 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5591 	       lui	$at,<hiconstant>
5592 	       addiu	$at,$at,<loconstant>
5593 	       addu	$tempreg,$tempreg,$at
5594 	     For a local symbol, we want the same instruction
5595 	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5596 	     addiu instruction.
5597 	   */
5598 
5599 	  if (offset_expr.X_add_number == 0)
5600 	    {
5601 	      if (mips_pic == SVR4_PIC
5602 		  && breg == 0
5603 		  && (call || tempreg == PIC_CALL_REG))
5604 		lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5605 
5606 	      relax_start (offset_expr.X_add_symbol);
5607 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5608 			   lw_reloc_type, mips_gp_register);
5609 	      if (breg != 0)
5610 		{
5611 		  /* We're going to put in an addu instruction using
5612 		     tempreg, so we may as well insert the nop right
5613 		     now.  */
5614 		  load_delay_nop ();
5615 		}
5616 	      relax_switch ();
5617 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5618 			   tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5619 	      load_delay_nop ();
5620 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5621 			   tempreg, tempreg, BFD_RELOC_LO16);
5622 	      relax_end ();
5623 	      /* FIXME: If breg == 0, and the next instruction uses
5624 		 $tempreg, then if this variant case is used an extra
5625 		 nop will be generated.  */
5626 	    }
5627 	  else if (offset_expr.X_add_number >= -0x8000
5628 		   && offset_expr.X_add_number < 0x8000)
5629 	    {
5630 	      load_got_offset (tempreg, &offset_expr);
5631 	      load_delay_nop ();
5632 	      add_got_offset (tempreg, &offset_expr);
5633 	    }
5634 	  else
5635 	    {
5636 	      expr1.X_add_number = offset_expr.X_add_number;
5637 	      offset_expr.X_add_number =
5638 		((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5639 	      load_got_offset (tempreg, &offset_expr);
5640 	      offset_expr.X_add_number = expr1.X_add_number;
5641 	      /* If we are going to add in a base register, and the
5642 		 target register and the base register are the same,
5643 		 then we are using AT as a temporary register.  Since
5644 		 we want to load the constant into AT, we add our
5645 		 current AT (from the global offset table) and the
5646 		 register into the register now, and pretend we were
5647 		 not using a base register.  */
5648 	      if (breg == treg)
5649 		{
5650 		  load_delay_nop ();
5651 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5652 			       treg, AT, breg);
5653 		  breg = 0;
5654 		  tempreg = treg;
5655 		}
5656 	      add_got_offset_hilo (tempreg, &offset_expr, AT);
5657 	      used_at = 1;
5658 	    }
5659 	}
5660       else if (!mips_big_got && HAVE_NEWABI)
5661 	{
5662 	  int add_breg_early = 0;
5663 
5664 	  /* If this is a reference to an external, and there is no
5665 	     constant, or local symbol (*), with or without a
5666 	     constant, we want
5667 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5668 	     or for lca or if tempreg is PIC_CALL_REG
5669 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5670 
5671 	     If we have a small constant, and this is a reference to
5672 	     an external symbol, we want
5673 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5674 	       addiu	$tempreg,$tempreg,<constant>
5675 
5676 	     If we have a large constant, and this is a reference to
5677 	     an external symbol, we want
5678 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5679 	       lui	$at,<hiconstant>
5680 	       addiu	$at,$at,<loconstant>
5681 	       addu	$tempreg,$tempreg,$at
5682 
5683 	     (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5684 	     local symbols, even though it introduces an additional
5685 	     instruction.  */
5686 
5687 	  if (offset_expr.X_add_number)
5688 	    {
5689 	      expr1.X_add_number = offset_expr.X_add_number;
5690 	      offset_expr.X_add_number = 0;
5691 
5692 	      relax_start (offset_expr.X_add_symbol);
5693 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5694 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5695 
5696 	      if (expr1.X_add_number >= -0x8000
5697 		  && expr1.X_add_number < 0x8000)
5698 		{
5699 		  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5700 			       tempreg, tempreg, BFD_RELOC_LO16);
5701 		}
5702 	      else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5703 		{
5704 		  int dreg;
5705 
5706 		  /* If we are going to add in a base register, and the
5707 		     target register and the base register are the same,
5708 		     then we are using AT as a temporary register.  Since
5709 		     we want to load the constant into AT, we add our
5710 		     current AT (from the global offset table) and the
5711 		     register into the register now, and pretend we were
5712 		     not using a base register.  */
5713 		  if (breg != treg)
5714 		    dreg = tempreg;
5715 		  else
5716 		    {
5717 		      assert (tempreg == AT);
5718 		      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5719 				   treg, AT, breg);
5720 		      dreg = treg;
5721 		      add_breg_early = 1;
5722 		    }
5723 
5724 		  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5725 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5726 			       dreg, dreg, AT);
5727 
5728 		  used_at = 1;
5729 		}
5730 	      else
5731 		as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5732 
5733 	      relax_switch ();
5734 	      offset_expr.X_add_number = expr1.X_add_number;
5735 
5736 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5737 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5738 	      if (add_breg_early)
5739 		{
5740 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5741 			       treg, tempreg, breg);
5742 		  breg = 0;
5743 		  tempreg = treg;
5744 		}
5745 	      relax_end ();
5746 	    }
5747 	  else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5748 	    {
5749 	      relax_start (offset_expr.X_add_symbol);
5750 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5751 			   BFD_RELOC_MIPS_CALL16, mips_gp_register);
5752 	      relax_switch ();
5753 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5754 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5755 	      relax_end ();
5756 	    }
5757 	  else
5758 	    {
5759 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5760 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5761 	    }
5762 	}
5763       else if (mips_big_got && !HAVE_NEWABI)
5764 	{
5765 	  int gpdelay;
5766 	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5767 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5768 	  int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5769 
5770 	  /* This is the large GOT case.  If this is a reference to an
5771 	     external symbol, and there is no constant, we want
5772 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5773 	       addu	$tempreg,$tempreg,$gp
5774 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5775 	     or for lca or if tempreg is PIC_CALL_REG
5776 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5777 	       addu	$tempreg,$tempreg,$gp
5778 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5779 	     For a local symbol, we want
5780 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5781 	       nop
5782 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5783 
5784 	     If we have a small constant, and this is a reference to
5785 	     an external symbol, we want
5786 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5787 	       addu	$tempreg,$tempreg,$gp
5788 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5789 	       nop
5790 	       addiu	$tempreg,$tempreg,<constant>
5791 	     For a local symbol, we want
5792 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5793 	       nop
5794 	       addiu	$tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5795 
5796 	     If we have a large constant, and this is a reference to
5797 	     an external symbol, we want
5798 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5799 	       addu	$tempreg,$tempreg,$gp
5800 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5801 	       lui	$at,<hiconstant>
5802 	       addiu	$at,$at,<loconstant>
5803 	       addu	$tempreg,$tempreg,$at
5804 	     For a local symbol, we want
5805 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5806 	       lui	$at,<hiconstant>
5807 	       addiu	$at,$at,<loconstant>	(BFD_RELOC_LO16)
5808 	       addu	$tempreg,$tempreg,$at
5809 	  */
5810 
5811 	  expr1.X_add_number = offset_expr.X_add_number;
5812 	  offset_expr.X_add_number = 0;
5813 	  relax_start (offset_expr.X_add_symbol);
5814 	  gpdelay = reg_needs_delay (mips_gp_register);
5815 	  if (expr1.X_add_number == 0 && breg == 0
5816 	      && (call || tempreg == PIC_CALL_REG))
5817 	    {
5818 	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5819 	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5820 	    }
5821 	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5822 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5823 		       tempreg, tempreg, mips_gp_register);
5824 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5825 		       tempreg, lw_reloc_type, tempreg);
5826 	  if (expr1.X_add_number == 0)
5827 	    {
5828 	      if (breg != 0)
5829 		{
5830 		  /* We're going to put in an addu instruction using
5831 		     tempreg, so we may as well insert the nop right
5832 		     now.  */
5833 		  load_delay_nop ();
5834 		}
5835 	    }
5836 	  else if (expr1.X_add_number >= -0x8000
5837 		   && expr1.X_add_number < 0x8000)
5838 	    {
5839 	      load_delay_nop ();
5840 	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5841 			   tempreg, tempreg, BFD_RELOC_LO16);
5842 	    }
5843 	  else
5844 	    {
5845 	      int dreg;
5846 
5847 	      /* If we are going to add in a base register, and the
5848 		 target register and the base register are the same,
5849 		 then we are using AT as a temporary register.  Since
5850 		 we want to load the constant into AT, we add our
5851 		 current AT (from the global offset table) and the
5852 		 register into the register now, and pretend we were
5853 		 not using a base register.  */
5854 	      if (breg != treg)
5855 		dreg = tempreg;
5856 	      else
5857 		{
5858 		  assert (tempreg == AT);
5859 		  load_delay_nop ();
5860 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5861 			       treg, AT, breg);
5862 		  dreg = treg;
5863 		}
5864 
5865 	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5866 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5867 
5868 	      used_at = 1;
5869 	    }
5870 	  offset_expr.X_add_number =
5871 	    ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5872 	  relax_switch ();
5873 
5874 	  if (gpdelay)
5875 	    {
5876 	      /* This is needed because this instruction uses $gp, but
5877 		 the first instruction on the main stream does not.  */
5878 	      macro_build (NULL, "nop", "");
5879 	    }
5880 
5881 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5882 		       local_reloc_type, mips_gp_register);
5883 	  if (expr1.X_add_number >= -0x8000
5884 	      && expr1.X_add_number < 0x8000)
5885 	    {
5886 	      load_delay_nop ();
5887 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5888 			   tempreg, tempreg, BFD_RELOC_LO16);
5889 	      /* FIXME: If add_number is 0, and there was no base
5890 		 register, the external symbol case ended with a load,
5891 		 so if the symbol turns out to not be external, and
5892 		 the next instruction uses tempreg, an unnecessary nop
5893 		 will be inserted.  */
5894 	    }
5895 	  else
5896 	    {
5897 	      if (breg == treg)
5898 		{
5899 		  /* We must add in the base register now, as in the
5900 		     external symbol case.  */
5901 		  assert (tempreg == AT);
5902 		  load_delay_nop ();
5903 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5904 			       treg, AT, breg);
5905 		  tempreg = treg;
5906 		  /* We set breg to 0 because we have arranged to add
5907 		     it in in both cases.  */
5908 		  breg = 0;
5909 		}
5910 
5911 	      macro_build_lui (&expr1, AT);
5912 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5913 			   AT, AT, BFD_RELOC_LO16);
5914 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5915 			   tempreg, tempreg, AT);
5916 	      used_at = 1;
5917 	    }
5918 	  relax_end ();
5919 	}
5920       else if (mips_big_got && HAVE_NEWABI)
5921 	{
5922 	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5923 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5924 	  int add_breg_early = 0;
5925 
5926 	  /* This is the large GOT case.  If this is a reference to an
5927 	     external symbol, and there is no constant, we want
5928 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5929 	       add	$tempreg,$tempreg,$gp
5930 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5931 	     or for lca or if tempreg is PIC_CALL_REG
5932 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5933 	       add	$tempreg,$tempreg,$gp
5934 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5935 
5936 	     If we have a small constant, and this is a reference to
5937 	     an external symbol, we want
5938 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5939 	       add	$tempreg,$tempreg,$gp
5940 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5941 	       addi	$tempreg,$tempreg,<constant>
5942 
5943 	     If we have a large constant, and this is a reference to
5944 	     an external symbol, we want
5945 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5946 	       addu	$tempreg,$tempreg,$gp
5947 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5948 	       lui	$at,<hiconstant>
5949 	       addi	$at,$at,<loconstant>
5950 	       add	$tempreg,$tempreg,$at
5951 
5952 	     If we have NewABI, and we know it's a local symbol, we want
5953 	       lw	$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
5954 	       addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
5955 	     otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5956 
5957 	  relax_start (offset_expr.X_add_symbol);
5958 
5959 	  expr1.X_add_number = offset_expr.X_add_number;
5960 	  offset_expr.X_add_number = 0;
5961 
5962 	  if (expr1.X_add_number == 0 && breg == 0
5963 	      && (call || tempreg == PIC_CALL_REG))
5964 	    {
5965 	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5966 	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5967 	    }
5968 	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5969 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5970 		       tempreg, tempreg, mips_gp_register);
5971 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5972 		       tempreg, lw_reloc_type, tempreg);
5973 
5974 	  if (expr1.X_add_number == 0)
5975 	    ;
5976 	  else if (expr1.X_add_number >= -0x8000
5977 		   && expr1.X_add_number < 0x8000)
5978 	    {
5979 	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5980 			   tempreg, tempreg, BFD_RELOC_LO16);
5981 	    }
5982 	  else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5983 	    {
5984 	      int dreg;
5985 
5986 	      /* If we are going to add in a base register, and the
5987 		 target register and the base register are the same,
5988 		 then we are using AT as a temporary register.  Since
5989 		 we want to load the constant into AT, we add our
5990 		 current AT (from the global offset table) and the
5991 		 register into the register now, and pretend we were
5992 		 not using a base register.  */
5993 	      if (breg != treg)
5994 		dreg = tempreg;
5995 	      else
5996 		{
5997 		  assert (tempreg == AT);
5998 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5999 			       treg, AT, breg);
6000 		  dreg = treg;
6001 		  add_breg_early = 1;
6002 		}
6003 
6004 	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6005 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6006 
6007 	      used_at = 1;
6008 	    }
6009 	  else
6010 	    as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6011 
6012 	  relax_switch ();
6013 	  offset_expr.X_add_number = expr1.X_add_number;
6014 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6015 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6016 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6017 		       tempreg, BFD_RELOC_MIPS_GOT_OFST);
6018 	  if (add_breg_early)
6019 	    {
6020 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6021 			   treg, tempreg, breg);
6022 	      breg = 0;
6023 	      tempreg = treg;
6024 	    }
6025 	  relax_end ();
6026 	}
6027       else
6028 	abort ();
6029 
6030       if (breg != 0)
6031 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6032       break;
6033 
6034     case M_J_A:
6035       /* The j instruction may not be used in PIC code, since it
6036 	 requires an absolute address.  We convert it to a b
6037 	 instruction.  */
6038       if (mips_pic == NO_PIC)
6039 	macro_build (&offset_expr, "j", "a");
6040       else
6041 	macro_build (&offset_expr, "b", "p");
6042       break;
6043 
6044       /* The jal instructions must be handled as macros because when
6045 	 generating PIC code they expand to multi-instruction
6046 	 sequences.  Normally they are simple instructions.  */
6047     case M_JAL_1:
6048       dreg = RA;
6049       /* Fall through.  */
6050     case M_JAL_2:
6051       if (mips_pic == NO_PIC)
6052 	macro_build (NULL, "jalr", "d,s", dreg, sreg);
6053       else
6054 	{
6055 	  if (sreg != PIC_CALL_REG)
6056 	    as_warn (_("MIPS PIC call to register other than $25"));
6057 
6058 	  macro_build (NULL, "jalr", "d,s", dreg, sreg);
6059 	  if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6060 	    {
6061 	      if (mips_cprestore_offset < 0)
6062 		as_warn (_("No .cprestore pseudo-op used in PIC code"));
6063 	      else
6064 		{
6065 		  if (! mips_frame_reg_valid)
6066 		    {
6067 		      as_warn (_("No .frame pseudo-op used in PIC code"));
6068 		      /* Quiet this warning.  */
6069 		      mips_frame_reg_valid = 1;
6070 		    }
6071 		  if (! mips_cprestore_valid)
6072 		    {
6073 		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6074 		      /* Quiet this warning.  */
6075 		      mips_cprestore_valid = 1;
6076 		    }
6077 		  expr1.X_add_number = mips_cprestore_offset;
6078   		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6079 						mips_gp_register,
6080 						mips_frame_reg,
6081 						HAVE_64BIT_ADDRESSES);
6082 		}
6083 	    }
6084 	}
6085 
6086       break;
6087 
6088     case M_JAL_A:
6089       if (mips_pic == NO_PIC)
6090 	macro_build (&offset_expr, "jal", "a");
6091       else if (mips_pic == SVR4_PIC)
6092 	{
6093 	  /* If this is a reference to an external symbol, and we are
6094 	     using a small GOT, we want
6095 	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_CALL16)
6096 	       nop
6097 	       jalr	$ra,$25
6098 	       nop
6099 	       lw	$gp,cprestore($sp)
6100 	     The cprestore value is set using the .cprestore
6101 	     pseudo-op.  If we are using a big GOT, we want
6102 	       lui	$25,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
6103 	       addu	$25,$25,$gp
6104 	       lw	$25,<sym>($25)		(BFD_RELOC_MIPS_CALL_LO16)
6105 	       nop
6106 	       jalr	$ra,$25
6107 	       nop
6108 	       lw	$gp,cprestore($sp)
6109 	     If the symbol is not external, we want
6110 	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6111 	       nop
6112 	       addiu	$25,$25,<sym>		(BFD_RELOC_LO16)
6113 	       jalr	$ra,$25
6114 	       nop
6115 	       lw $gp,cprestore($sp)
6116 
6117 	     For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6118 	     sequences above, minus nops, unless the symbol is local,
6119 	     which enables us to use GOT_PAGE/GOT_OFST (big got) or
6120 	     GOT_DISP.  */
6121 	  if (HAVE_NEWABI)
6122 	    {
6123 	      if (! mips_big_got)
6124 		{
6125 		  relax_start (offset_expr.X_add_symbol);
6126 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6127 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6128 			       mips_gp_register);
6129 		  relax_switch ();
6130 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6131 			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6132 			       mips_gp_register);
6133 		  relax_end ();
6134 		}
6135 	      else
6136 		{
6137 		  relax_start (offset_expr.X_add_symbol);
6138 		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6139 			       BFD_RELOC_MIPS_CALL_HI16);
6140 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6141 			       PIC_CALL_REG, mips_gp_register);
6142 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6143 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6144 			       PIC_CALL_REG);
6145 		  relax_switch ();
6146 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6147 			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6148 			       mips_gp_register);
6149 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6150 			       PIC_CALL_REG, PIC_CALL_REG,
6151 			       BFD_RELOC_MIPS_GOT_OFST);
6152 		  relax_end ();
6153 		}
6154 
6155 	      macro_build_jalr (&offset_expr);
6156 	    }
6157 	  else
6158 	    {
6159 	      relax_start (offset_expr.X_add_symbol);
6160 	      if (! mips_big_got)
6161 		{
6162 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6163 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6164 			       mips_gp_register);
6165 		  load_delay_nop ();
6166 		  relax_switch ();
6167 		}
6168 	      else
6169 		{
6170 		  int gpdelay;
6171 
6172 		  gpdelay = reg_needs_delay (mips_gp_register);
6173 		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6174 			       BFD_RELOC_MIPS_CALL_HI16);
6175 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6176 			       PIC_CALL_REG, mips_gp_register);
6177 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6178 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6179 			       PIC_CALL_REG);
6180 		  load_delay_nop ();
6181 		  relax_switch ();
6182 		  if (gpdelay)
6183 		    macro_build (NULL, "nop", "");
6184 		}
6185 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6186 			   PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6187 			   mips_gp_register);
6188 	      load_delay_nop ();
6189 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6190 			   PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6191 	      relax_end ();
6192 	      macro_build_jalr (&offset_expr);
6193 
6194 	      if (mips_cprestore_offset < 0)
6195 		as_warn (_("No .cprestore pseudo-op used in PIC code"));
6196 	      else
6197 		{
6198 		  if (! mips_frame_reg_valid)
6199 		    {
6200 		      as_warn (_("No .frame pseudo-op used in PIC code"));
6201 		      /* Quiet this warning.  */
6202 		      mips_frame_reg_valid = 1;
6203 		    }
6204 		  if (! mips_cprestore_valid)
6205 		    {
6206 		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6207 		      /* Quiet this warning.  */
6208 		      mips_cprestore_valid = 1;
6209 		    }
6210 		  if (mips_opts.noreorder)
6211 		    macro_build (NULL, "nop", "");
6212 		  expr1.X_add_number = mips_cprestore_offset;
6213   		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6214 						mips_gp_register,
6215 						mips_frame_reg,
6216 						HAVE_64BIT_ADDRESSES);
6217 		}
6218 	    }
6219 	}
6220       else if (mips_pic == VXWORKS_PIC)
6221 	as_bad (_("Non-PIC jump used in PIC library"));
6222       else
6223 	abort ();
6224 
6225       break;
6226 
6227     case M_LB_AB:
6228       s = "lb";
6229       goto ld;
6230     case M_LBU_AB:
6231       s = "lbu";
6232       goto ld;
6233     case M_LH_AB:
6234       s = "lh";
6235       goto ld;
6236     case M_LHU_AB:
6237       s = "lhu";
6238       goto ld;
6239     case M_LW_AB:
6240       s = "lw";
6241       goto ld;
6242     case M_LWC0_AB:
6243       s = "lwc0";
6244       /* Itbl support may require additional care here.  */
6245       coproc = 1;
6246       goto ld;
6247     case M_LWC1_AB:
6248       s = "lwc1";
6249       /* Itbl support may require additional care here.  */
6250       coproc = 1;
6251       goto ld;
6252     case M_LWC2_AB:
6253       s = "lwc2";
6254       /* Itbl support may require additional care here.  */
6255       coproc = 1;
6256       goto ld;
6257     case M_LWC3_AB:
6258       s = "lwc3";
6259       /* Itbl support may require additional care here.  */
6260       coproc = 1;
6261       goto ld;
6262     case M_LWL_AB:
6263       s = "lwl";
6264       lr = 1;
6265       goto ld;
6266     case M_LWR_AB:
6267       s = "lwr";
6268       lr = 1;
6269       goto ld;
6270     case M_LDC1_AB:
6271       s = "ldc1";
6272       /* Itbl support may require additional care here.  */
6273       coproc = 1;
6274       goto ld;
6275     case M_LDC2_AB:
6276       s = "ldc2";
6277       /* Itbl support may require additional care here.  */
6278       coproc = 1;
6279       goto ld;
6280     case M_LDC3_AB:
6281       s = "ldc3";
6282       /* Itbl support may require additional care here.  */
6283       coproc = 1;
6284       goto ld;
6285     case M_LDL_AB:
6286       s = "ldl";
6287       lr = 1;
6288       goto ld;
6289     case M_LDR_AB:
6290       s = "ldr";
6291       lr = 1;
6292       goto ld;
6293     case M_LL_AB:
6294       s = "ll";
6295       goto ld;
6296     case M_LLD_AB:
6297       s = "lld";
6298       goto ld;
6299     case M_LWU_AB:
6300       s = "lwu";
6301     ld:
6302       if (breg == treg || coproc || lr)
6303 	{
6304 	  tempreg = AT;
6305 	  used_at = 1;
6306 	}
6307       else
6308 	{
6309 	  tempreg = treg;
6310 	}
6311       goto ld_st;
6312     case M_SB_AB:
6313       s = "sb";
6314       goto st;
6315     case M_SH_AB:
6316       s = "sh";
6317       goto st;
6318     case M_SW_AB:
6319       s = "sw";
6320       goto st;
6321     case M_SWC0_AB:
6322       s = "swc0";
6323       /* Itbl support may require additional care here.  */
6324       coproc = 1;
6325       goto st;
6326     case M_SWC1_AB:
6327       s = "swc1";
6328       /* Itbl support may require additional care here.  */
6329       coproc = 1;
6330       goto st;
6331     case M_SWC2_AB:
6332       s = "swc2";
6333       /* Itbl support may require additional care here.  */
6334       coproc = 1;
6335       goto st;
6336     case M_SWC3_AB:
6337       s = "swc3";
6338       /* Itbl support may require additional care here.  */
6339       coproc = 1;
6340       goto st;
6341     case M_SWL_AB:
6342       s = "swl";
6343       goto st;
6344     case M_SWR_AB:
6345       s = "swr";
6346       goto st;
6347     case M_SC_AB:
6348       s = "sc";
6349       goto st;
6350     case M_SCD_AB:
6351       s = "scd";
6352       goto st;
6353     case M_CACHE_AB:
6354       s = "cache";
6355       goto st;
6356     case M_SDC1_AB:
6357       s = "sdc1";
6358       coproc = 1;
6359       /* Itbl support may require additional care here.  */
6360       goto st;
6361     case M_SDC2_AB:
6362       s = "sdc2";
6363       /* Itbl support may require additional care here.  */
6364       coproc = 1;
6365       goto st;
6366     case M_SDC3_AB:
6367       s = "sdc3";
6368       /* Itbl support may require additional care here.  */
6369       coproc = 1;
6370       goto st;
6371     case M_SDL_AB:
6372       s = "sdl";
6373       goto st;
6374     case M_SDR_AB:
6375       s = "sdr";
6376     st:
6377       tempreg = AT;
6378       used_at = 1;
6379     ld_st:
6380       if (coproc
6381 	  && NO_ISA_COP (mips_opts.arch)
6382 	  && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6383 	{
6384 	  as_bad (_("opcode not supported on this processor: %s"),
6385 		  mips_cpu_info_from_arch (mips_opts.arch)->name);
6386 	  break;
6387 	}
6388 
6389       /* Itbl support may require additional care here.  */
6390       if (mask == M_LWC1_AB
6391 	  || mask == M_SWC1_AB
6392 	  || mask == M_LDC1_AB
6393 	  || mask == M_SDC1_AB
6394 	  || mask == M_L_DAB
6395 	  || mask == M_S_DAB)
6396 	fmt = "T,o(b)";
6397       else if (mask == M_CACHE_AB)
6398 	fmt = "k,o(b)";
6399       else if (coproc)
6400 	fmt = "E,o(b)";
6401       else
6402 	fmt = "t,o(b)";
6403 
6404       if (offset_expr.X_op != O_constant
6405 	  && offset_expr.X_op != O_symbol)
6406 	{
6407 	  as_bad (_("expression too complex"));
6408 	  offset_expr.X_op = O_constant;
6409 	}
6410 
6411       if (HAVE_32BIT_ADDRESSES
6412 	  && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6413 	{
6414 	  char value [32];
6415 
6416 	  sprintf_vma (value, offset_expr.X_add_number);
6417 	  as_bad (_("Number (0x%s) larger than 32 bits"), value);
6418 	}
6419 
6420       /* A constant expression in PIC code can be handled just as it
6421 	 is in non PIC code.  */
6422       if (offset_expr.X_op == O_constant)
6423 	{
6424 	  expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6425 				& ~(bfd_vma) 0xffff);
6426 	  normalize_address_expr (&expr1);
6427 	  load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6428 	  if (breg != 0)
6429 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6430 			 tempreg, tempreg, breg);
6431 	  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6432 	}
6433       else if (mips_pic == NO_PIC)
6434 	{
6435 	  /* If this is a reference to a GP relative symbol, and there
6436 	     is no base register, we want
6437 	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6438 	     Otherwise, if there is no base register, we want
6439 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6440 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6441 	     If we have a constant, we need two instructions anyhow,
6442 	     so we always use the latter form.
6443 
6444 	     If we have a base register, and this is a reference to a
6445 	     GP relative symbol, we want
6446 	       addu	$tempreg,$breg,$gp
6447 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_GPREL16)
6448 	     Otherwise we want
6449 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6450 	       addu	$tempreg,$tempreg,$breg
6451 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6452 	     With a constant we always use the latter case.
6453 
6454 	     With 64bit address space and no base register and $at usable,
6455 	     we want
6456 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6457 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6458 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6459 	       dsll32	$tempreg,0
6460 	       daddu	$tempreg,$at
6461 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6462 	     If we have a base register, we want
6463 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6464 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6465 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6466 	       daddu	$at,$breg
6467 	       dsll32	$tempreg,0
6468 	       daddu	$tempreg,$at
6469 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6470 
6471 	     Without $at we can't generate the optimal path for superscalar
6472 	     processors here since this would require two temporary registers.
6473 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6474 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6475 	       dsll	$tempreg,16
6476 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6477 	       dsll	$tempreg,16
6478 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6479 	     If we have a base register, we want
6480 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6481 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6482 	       dsll	$tempreg,16
6483 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6484 	       dsll	$tempreg,16
6485 	       daddu	$tempreg,$tempreg,$breg
6486 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6487 
6488 	     For GP relative symbols in 64bit address space we can use
6489 	     the same sequence as in 32bit address space.  */
6490 	  if (HAVE_64BIT_SYMBOLS)
6491 	    {
6492 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6493 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6494 		{
6495 		  relax_start (offset_expr.X_add_symbol);
6496 		  if (breg == 0)
6497 		    {
6498 		      macro_build (&offset_expr, s, fmt, treg,
6499 				   BFD_RELOC_GPREL16, mips_gp_register);
6500 		    }
6501 		  else
6502 		    {
6503 		      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6504 				   tempreg, breg, mips_gp_register);
6505 		      macro_build (&offset_expr, s, fmt, treg,
6506 				   BFD_RELOC_GPREL16, tempreg);
6507 		    }
6508 		  relax_switch ();
6509 		}
6510 
6511 	      if (used_at == 0 && mips_opts.at)
6512 		{
6513 		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6514 			       BFD_RELOC_MIPS_HIGHEST);
6515 		  macro_build (&offset_expr, "lui", "t,u", AT,
6516 			       BFD_RELOC_HI16_S);
6517 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6518 			       tempreg, BFD_RELOC_MIPS_HIGHER);
6519 		  if (breg != 0)
6520 		    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6521 		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6522 		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6523 		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6524 			       tempreg);
6525 		  used_at = 1;
6526 		}
6527 	      else
6528 		{
6529 		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6530 			       BFD_RELOC_MIPS_HIGHEST);
6531 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6532 			       tempreg, BFD_RELOC_MIPS_HIGHER);
6533 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6534 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6535 			       tempreg, BFD_RELOC_HI16_S);
6536 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6537 		  if (breg != 0)
6538 		    macro_build (NULL, "daddu", "d,v,t",
6539 				 tempreg, tempreg, breg);
6540 		  macro_build (&offset_expr, s, fmt, treg,
6541 			       BFD_RELOC_LO16, tempreg);
6542 		}
6543 
6544 	      if (mips_relax.sequence)
6545 		relax_end ();
6546 	      break;
6547 	    }
6548 
6549 	  if (breg == 0)
6550 	    {
6551 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6552 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6553 		{
6554 		  relax_start (offset_expr.X_add_symbol);
6555 		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6556 			       mips_gp_register);
6557 		  relax_switch ();
6558 		}
6559 	      macro_build_lui (&offset_expr, tempreg);
6560 	      macro_build (&offset_expr, s, fmt, treg,
6561 			   BFD_RELOC_LO16, tempreg);
6562 	      if (mips_relax.sequence)
6563 		relax_end ();
6564 	    }
6565 	  else
6566 	    {
6567 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6568 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6569 		{
6570 		  relax_start (offset_expr.X_add_symbol);
6571 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6572 			       tempreg, breg, mips_gp_register);
6573 		  macro_build (&offset_expr, s, fmt, treg,
6574 			       BFD_RELOC_GPREL16, tempreg);
6575 		  relax_switch ();
6576 		}
6577 	      macro_build_lui (&offset_expr, tempreg);
6578 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6579 			   tempreg, tempreg, breg);
6580 	      macro_build (&offset_expr, s, fmt, treg,
6581 			   BFD_RELOC_LO16, tempreg);
6582 	      if (mips_relax.sequence)
6583 		relax_end ();
6584 	    }
6585 	}
6586       else if (!mips_big_got)
6587 	{
6588 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6589 
6590 	  /* If this is a reference to an external symbol, we want
6591 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6592 	       nop
6593 	       <op>	$treg,0($tempreg)
6594 	     Otherwise we want
6595 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6596 	       nop
6597 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6598 	       <op>	$treg,0($tempreg)
6599 
6600 	     For NewABI, we want
6601 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6602 	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6603 
6604 	     If there is a base register, we add it to $tempreg before
6605 	     the <op>.  If there is a constant, we stick it in the
6606 	     <op> instruction.  We don't handle constants larger than
6607 	     16 bits, because we have no way to load the upper 16 bits
6608 	     (actually, we could handle them for the subset of cases
6609 	     in which we are not using $at).  */
6610 	  assert (offset_expr.X_op == O_symbol);
6611 	  if (HAVE_NEWABI)
6612 	    {
6613 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6614 			   BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6615 	      if (breg != 0)
6616 		macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6617 			     tempreg, tempreg, breg);
6618 	      macro_build (&offset_expr, s, fmt, treg,
6619 			   BFD_RELOC_MIPS_GOT_OFST, tempreg);
6620 	      break;
6621 	    }
6622 	  expr1.X_add_number = offset_expr.X_add_number;
6623 	  offset_expr.X_add_number = 0;
6624 	  if (expr1.X_add_number < -0x8000
6625 	      || expr1.X_add_number >= 0x8000)
6626 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6627 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6628 		       lw_reloc_type, mips_gp_register);
6629 	  load_delay_nop ();
6630 	  relax_start (offset_expr.X_add_symbol);
6631 	  relax_switch ();
6632 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6633 		       tempreg, BFD_RELOC_LO16);
6634 	  relax_end ();
6635 	  if (breg != 0)
6636 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6637 			 tempreg, tempreg, breg);
6638 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6639 	}
6640       else if (mips_big_got && !HAVE_NEWABI)
6641 	{
6642 	  int gpdelay;
6643 
6644 	  /* If this is a reference to an external symbol, we want
6645 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6646 	       addu	$tempreg,$tempreg,$gp
6647 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6648 	       <op>	$treg,0($tempreg)
6649 	     Otherwise we want
6650 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6651 	       nop
6652 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6653 	       <op>	$treg,0($tempreg)
6654 	     If there is a base register, we add it to $tempreg before
6655 	     the <op>.  If there is a constant, we stick it in the
6656 	     <op> instruction.  We don't handle constants larger than
6657 	     16 bits, because we have no way to load the upper 16 bits
6658 	     (actually, we could handle them for the subset of cases
6659 	     in which we are not using $at).  */
6660 	  assert (offset_expr.X_op == O_symbol);
6661 	  expr1.X_add_number = offset_expr.X_add_number;
6662 	  offset_expr.X_add_number = 0;
6663 	  if (expr1.X_add_number < -0x8000
6664 	      || expr1.X_add_number >= 0x8000)
6665 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6666 	  gpdelay = reg_needs_delay (mips_gp_register);
6667 	  relax_start (offset_expr.X_add_symbol);
6668 	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6669 		       BFD_RELOC_MIPS_GOT_HI16);
6670 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6671 		       mips_gp_register);
6672 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6673 		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6674 	  relax_switch ();
6675 	  if (gpdelay)
6676 	    macro_build (NULL, "nop", "");
6677 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6678 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6679 	  load_delay_nop ();
6680 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6681 		       tempreg, BFD_RELOC_LO16);
6682 	  relax_end ();
6683 
6684 	  if (breg != 0)
6685 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6686 			 tempreg, tempreg, breg);
6687 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6688 	}
6689       else if (mips_big_got && HAVE_NEWABI)
6690 	{
6691 	  /* If this is a reference to an external symbol, we want
6692 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6693 	       add	$tempreg,$tempreg,$gp
6694 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6695 	       <op>	$treg,<ofst>($tempreg)
6696 	     Otherwise, for local symbols, we want:
6697 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6698 	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6699 	  assert (offset_expr.X_op == O_symbol);
6700 	  expr1.X_add_number = offset_expr.X_add_number;
6701 	  offset_expr.X_add_number = 0;
6702 	  if (expr1.X_add_number < -0x8000
6703 	      || expr1.X_add_number >= 0x8000)
6704 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6705 	  relax_start (offset_expr.X_add_symbol);
6706 	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6707 		       BFD_RELOC_MIPS_GOT_HI16);
6708 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6709 		       mips_gp_register);
6710 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6711 		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6712 	  if (breg != 0)
6713 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6714 			 tempreg, tempreg, breg);
6715 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6716 
6717 	  relax_switch ();
6718 	  offset_expr.X_add_number = expr1.X_add_number;
6719 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6720 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6721 	  if (breg != 0)
6722 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6723 			 tempreg, tempreg, breg);
6724 	  macro_build (&offset_expr, s, fmt, treg,
6725 		       BFD_RELOC_MIPS_GOT_OFST, tempreg);
6726 	  relax_end ();
6727 	}
6728       else
6729 	abort ();
6730 
6731       break;
6732 
6733     case M_LI:
6734     case M_LI_S:
6735       load_register (treg, &imm_expr, 0);
6736       break;
6737 
6738     case M_DLI:
6739       load_register (treg, &imm_expr, 1);
6740       break;
6741 
6742     case M_LI_SS:
6743       if (imm_expr.X_op == O_constant)
6744 	{
6745 	  used_at = 1;
6746 	  load_register (AT, &imm_expr, 0);
6747 	  macro_build (NULL, "mtc1", "t,G", AT, treg);
6748 	  break;
6749 	}
6750       else
6751 	{
6752 	  assert (offset_expr.X_op == O_symbol
6753 		  && strcmp (segment_name (S_GET_SEGMENT
6754 					   (offset_expr.X_add_symbol)),
6755 			     ".lit4") == 0
6756 		  && offset_expr.X_add_number == 0);
6757 	  macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6758 		       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6759 	  break;
6760 	}
6761 
6762     case M_LI_D:
6763       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6764          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6765          order 32 bits of the value and the low order 32 bits are either
6766          zero or in OFFSET_EXPR.  */
6767       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6768 	{
6769 	  if (HAVE_64BIT_GPRS)
6770 	    load_register (treg, &imm_expr, 1);
6771 	  else
6772 	    {
6773 	      int hreg, lreg;
6774 
6775 	      if (target_big_endian)
6776 		{
6777 		  hreg = treg;
6778 		  lreg = treg + 1;
6779 		}
6780 	      else
6781 		{
6782 		  hreg = treg + 1;
6783 		  lreg = treg;
6784 		}
6785 
6786 	      if (hreg <= 31)
6787 		load_register (hreg, &imm_expr, 0);
6788 	      if (lreg <= 31)
6789 		{
6790 		  if (offset_expr.X_op == O_absent)
6791 		    move_register (lreg, 0);
6792 		  else
6793 		    {
6794 		      assert (offset_expr.X_op == O_constant);
6795 		      load_register (lreg, &offset_expr, 0);
6796 		    }
6797 		}
6798 	    }
6799 	  break;
6800 	}
6801 
6802       /* We know that sym is in the .rdata section.  First we get the
6803 	 upper 16 bits of the address.  */
6804       if (mips_pic == NO_PIC)
6805 	{
6806 	  macro_build_lui (&offset_expr, AT);
6807 	  used_at = 1;
6808 	}
6809       else
6810 	{
6811 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6812 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6813 	  used_at = 1;
6814 	}
6815 
6816       /* Now we load the register(s).  */
6817       if (HAVE_64BIT_GPRS)
6818 	{
6819 	  used_at = 1;
6820 	  macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6821 	}
6822       else
6823 	{
6824 	  used_at = 1;
6825 	  macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6826 	  if (treg != RA)
6827 	    {
6828 	      /* FIXME: How in the world do we deal with the possible
6829 		 overflow here?  */
6830 	      offset_expr.X_add_number += 4;
6831 	      macro_build (&offset_expr, "lw", "t,o(b)",
6832 			   treg + 1, BFD_RELOC_LO16, AT);
6833 	    }
6834 	}
6835       break;
6836 
6837     case M_LI_DD:
6838       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6839          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6840          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6841          the value and the low order 32 bits are either zero or in
6842          OFFSET_EXPR.  */
6843       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6844 	{
6845 	  used_at = 1;
6846 	  load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6847 	  if (HAVE_64BIT_FPRS)
6848 	    {
6849 	      assert (HAVE_64BIT_GPRS);
6850 	      macro_build (NULL, "dmtc1", "t,S", AT, treg);
6851 	    }
6852 	  else
6853 	    {
6854 	      macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6855 	      if (offset_expr.X_op == O_absent)
6856 		macro_build (NULL, "mtc1", "t,G", 0, treg);
6857 	      else
6858 		{
6859 		  assert (offset_expr.X_op == O_constant);
6860 		  load_register (AT, &offset_expr, 0);
6861 		  macro_build (NULL, "mtc1", "t,G", AT, treg);
6862 		}
6863 	    }
6864 	  break;
6865 	}
6866 
6867       assert (offset_expr.X_op == O_symbol
6868 	      && offset_expr.X_add_number == 0);
6869       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6870       if (strcmp (s, ".lit8") == 0)
6871 	{
6872 	  if (mips_opts.isa != ISA_MIPS1)
6873 	    {
6874 	      macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6875 			   BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6876 	      break;
6877 	    }
6878 	  breg = mips_gp_register;
6879 	  r = BFD_RELOC_MIPS_LITERAL;
6880 	  goto dob;
6881 	}
6882       else
6883 	{
6884 	  assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6885 	  used_at = 1;
6886 	  if (mips_pic != NO_PIC)
6887 	    macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6888 			 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6889 	  else
6890 	    {
6891 	      /* FIXME: This won't work for a 64 bit address.  */
6892 	      macro_build_lui (&offset_expr, AT);
6893 	    }
6894 
6895 	  if (mips_opts.isa != ISA_MIPS1)
6896 	    {
6897 	      macro_build (&offset_expr, "ldc1", "T,o(b)",
6898 			   treg, BFD_RELOC_LO16, AT);
6899 	      break;
6900 	    }
6901 	  breg = AT;
6902 	  r = BFD_RELOC_LO16;
6903 	  goto dob;
6904 	}
6905 
6906     case M_L_DOB:
6907       /* Even on a big endian machine $fn comes before $fn+1.  We have
6908 	 to adjust when loading from memory.  */
6909       r = BFD_RELOC_LO16;
6910     dob:
6911       assert (mips_opts.isa == ISA_MIPS1);
6912       macro_build (&offset_expr, "lwc1", "T,o(b)",
6913 		   target_big_endian ? treg + 1 : treg, r, breg);
6914       /* FIXME: A possible overflow which I don't know how to deal
6915 	 with.  */
6916       offset_expr.X_add_number += 4;
6917       macro_build (&offset_expr, "lwc1", "T,o(b)",
6918 		   target_big_endian ? treg : treg + 1, r, breg);
6919       break;
6920 
6921     case M_L_DAB:
6922       /*
6923        * The MIPS assembler seems to check for X_add_number not
6924        * being double aligned and generating:
6925        *	lui	at,%hi(foo+1)
6926        *	addu	at,at,v1
6927        *	addiu	at,at,%lo(foo+1)
6928        *	lwc1	f2,0(at)
6929        *	lwc1	f3,4(at)
6930        * But, the resulting address is the same after relocation so why
6931        * generate the extra instruction?
6932        */
6933       /* Itbl support may require additional care here.  */
6934       coproc = 1;
6935       if (mips_opts.isa != ISA_MIPS1)
6936 	{
6937 	  s = "ldc1";
6938 	  goto ld;
6939 	}
6940 
6941       s = "lwc1";
6942       fmt = "T,o(b)";
6943       goto ldd_std;
6944 
6945     case M_S_DAB:
6946       if (mips_opts.isa != ISA_MIPS1)
6947 	{
6948 	  s = "sdc1";
6949 	  goto st;
6950 	}
6951 
6952       s = "swc1";
6953       fmt = "T,o(b)";
6954       /* Itbl support may require additional care here.  */
6955       coproc = 1;
6956       goto ldd_std;
6957 
6958     case M_LD_AB:
6959       if (HAVE_64BIT_GPRS)
6960 	{
6961 	  s = "ld";
6962 	  goto ld;
6963 	}
6964 
6965       s = "lw";
6966       fmt = "t,o(b)";
6967       goto ldd_std;
6968 
6969     case M_SD_AB:
6970       if (HAVE_64BIT_GPRS)
6971 	{
6972 	  s = "sd";
6973 	  goto st;
6974 	}
6975 
6976       s = "sw";
6977       fmt = "t,o(b)";
6978 
6979     ldd_std:
6980       if (offset_expr.X_op != O_symbol
6981 	  && offset_expr.X_op != O_constant)
6982 	{
6983 	  as_bad (_("expression too complex"));
6984 	  offset_expr.X_op = O_constant;
6985 	}
6986 
6987       if (HAVE_32BIT_ADDRESSES
6988 	  && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6989 	{
6990 	  char value [32];
6991 
6992 	  sprintf_vma (value, offset_expr.X_add_number);
6993 	  as_bad (_("Number (0x%s) larger than 32 bits"), value);
6994 	}
6995 
6996       /* Even on a big endian machine $fn comes before $fn+1.  We have
6997 	 to adjust when loading from memory.  We set coproc if we must
6998 	 load $fn+1 first.  */
6999       /* Itbl support may require additional care here.  */
7000       if (! target_big_endian)
7001 	coproc = 0;
7002 
7003       if (mips_pic == NO_PIC
7004 	  || offset_expr.X_op == O_constant)
7005 	{
7006 	  /* If this is a reference to a GP relative symbol, we want
7007 	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
7008 	       <op>	$treg+1,<sym>+4($gp)	(BFD_RELOC_GPREL16)
7009 	     If we have a base register, we use this
7010 	       addu	$at,$breg,$gp
7011 	       <op>	$treg,<sym>($at)	(BFD_RELOC_GPREL16)
7012 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_GPREL16)
7013 	     If this is not a GP relative symbol, we want
7014 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
7015 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
7016 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
7017 	     If there is a base register, we add it to $at after the
7018 	     lui instruction.  If there is a constant, we always use
7019 	     the last case.  */
7020 	  if (offset_expr.X_op == O_symbol
7021 	      && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7022 	      && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7023 	    {
7024 	      relax_start (offset_expr.X_add_symbol);
7025 	      if (breg == 0)
7026 		{
7027 		  tempreg = mips_gp_register;
7028 		}
7029 	      else
7030 		{
7031 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7032 			       AT, breg, mips_gp_register);
7033 		  tempreg = AT;
7034 		  used_at = 1;
7035 		}
7036 
7037 	      /* Itbl support may require additional care here.  */
7038 	      macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7039 			   BFD_RELOC_GPREL16, tempreg);
7040 	      offset_expr.X_add_number += 4;
7041 
7042 	      /* Set mips_optimize to 2 to avoid inserting an
7043                  undesired nop.  */
7044 	      hold_mips_optimize = mips_optimize;
7045 	      mips_optimize = 2;
7046 	      /* Itbl support may require additional care here.  */
7047 	      macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7048 			   BFD_RELOC_GPREL16, tempreg);
7049 	      mips_optimize = hold_mips_optimize;
7050 
7051 	      relax_switch ();
7052 
7053 	      /* We just generated two relocs.  When tc_gen_reloc
7054 		 handles this case, it will skip the first reloc and
7055 		 handle the second.  The second reloc already has an
7056 		 extra addend of 4, which we added above.  We must
7057 		 subtract it out, and then subtract another 4 to make
7058 		 the first reloc come out right.  The second reloc
7059 		 will come out right because we are going to add 4 to
7060 		 offset_expr when we build its instruction below.
7061 
7062 		 If we have a symbol, then we don't want to include
7063 		 the offset, because it will wind up being included
7064 		 when we generate the reloc.  */
7065 
7066 	      if (offset_expr.X_op == O_constant)
7067 		offset_expr.X_add_number -= 8;
7068 	      else
7069 		{
7070 		  offset_expr.X_add_number = -4;
7071 		  offset_expr.X_op = O_constant;
7072 		}
7073 	    }
7074 	  used_at = 1;
7075 	  macro_build_lui (&offset_expr, AT);
7076 	  if (breg != 0)
7077 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7078 	  /* Itbl support may require additional care here.  */
7079 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7080 		       BFD_RELOC_LO16, AT);
7081 	  /* FIXME: How do we handle overflow here?  */
7082 	  offset_expr.X_add_number += 4;
7083 	  /* Itbl support may require additional care here.  */
7084 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7085 		       BFD_RELOC_LO16, AT);
7086 	  if (mips_relax.sequence)
7087 	    relax_end ();
7088 	}
7089       else if (!mips_big_got)
7090 	{
7091 	  /* If this is a reference to an external symbol, we want
7092 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
7093 	       nop
7094 	       <op>	$treg,0($at)
7095 	       <op>	$treg+1,4($at)
7096 	     Otherwise we want
7097 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
7098 	       nop
7099 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
7100 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
7101 	     If there is a base register we add it to $at before the
7102 	     lwc1 instructions.  If there is a constant we include it
7103 	     in the lwc1 instructions.  */
7104 	  used_at = 1;
7105 	  expr1.X_add_number = offset_expr.X_add_number;
7106 	  if (expr1.X_add_number < -0x8000
7107 	      || expr1.X_add_number >= 0x8000 - 4)
7108 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7109 	  load_got_offset (AT, &offset_expr);
7110 	  load_delay_nop ();
7111 	  if (breg != 0)
7112 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7113 
7114 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7115              nop.  */
7116 	  hold_mips_optimize = mips_optimize;
7117 	  mips_optimize = 2;
7118 
7119 	  /* Itbl support may require additional care here.  */
7120 	  relax_start (offset_expr.X_add_symbol);
7121 	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7122 		       BFD_RELOC_LO16, AT);
7123 	  expr1.X_add_number += 4;
7124 	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7125 		       BFD_RELOC_LO16, AT);
7126 	  relax_switch ();
7127 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7128 		       BFD_RELOC_LO16, AT);
7129 	  offset_expr.X_add_number += 4;
7130 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7131 		       BFD_RELOC_LO16, AT);
7132 	  relax_end ();
7133 
7134 	  mips_optimize = hold_mips_optimize;
7135 	}
7136       else if (mips_big_got)
7137 	{
7138 	  int gpdelay;
7139 
7140 	  /* If this is a reference to an external symbol, we want
7141 	       lui	$at,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
7142 	       addu	$at,$at,$gp
7143 	       lw	$at,<sym>($at)		(BFD_RELOC_MIPS_GOT_LO16)
7144 	       nop
7145 	       <op>	$treg,0($at)
7146 	       <op>	$treg+1,4($at)
7147 	     Otherwise we want
7148 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
7149 	       nop
7150 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
7151 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
7152 	     If there is a base register we add it to $at before the
7153 	     lwc1 instructions.  If there is a constant we include it
7154 	     in the lwc1 instructions.  */
7155 	  used_at = 1;
7156 	  expr1.X_add_number = offset_expr.X_add_number;
7157 	  offset_expr.X_add_number = 0;
7158 	  if (expr1.X_add_number < -0x8000
7159 	      || expr1.X_add_number >= 0x8000 - 4)
7160 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7161 	  gpdelay = reg_needs_delay (mips_gp_register);
7162 	  relax_start (offset_expr.X_add_symbol);
7163 	  macro_build (&offset_expr, "lui", "t,u",
7164 		       AT, BFD_RELOC_MIPS_GOT_HI16);
7165 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7166 		       AT, AT, mips_gp_register);
7167 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7168 		       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7169 	  load_delay_nop ();
7170 	  if (breg != 0)
7171 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7172 	  /* Itbl support may require additional care here.  */
7173 	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7174 		       BFD_RELOC_LO16, AT);
7175 	  expr1.X_add_number += 4;
7176 
7177 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7178              nop.  */
7179 	  hold_mips_optimize = mips_optimize;
7180 	  mips_optimize = 2;
7181 	  /* Itbl support may require additional care here.  */
7182 	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7183 		       BFD_RELOC_LO16, AT);
7184 	  mips_optimize = hold_mips_optimize;
7185 	  expr1.X_add_number -= 4;
7186 
7187 	  relax_switch ();
7188 	  offset_expr.X_add_number = expr1.X_add_number;
7189 	  if (gpdelay)
7190 	    macro_build (NULL, "nop", "");
7191 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7192 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7193 	  load_delay_nop ();
7194 	  if (breg != 0)
7195 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7196 	  /* Itbl support may require additional care here.  */
7197 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7198 		       BFD_RELOC_LO16, AT);
7199 	  offset_expr.X_add_number += 4;
7200 
7201 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7202              nop.  */
7203 	  hold_mips_optimize = mips_optimize;
7204 	  mips_optimize = 2;
7205 	  /* Itbl support may require additional care here.  */
7206 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7207 		       BFD_RELOC_LO16, AT);
7208 	  mips_optimize = hold_mips_optimize;
7209 	  relax_end ();
7210 	}
7211       else
7212 	abort ();
7213 
7214       break;
7215 
7216     case M_LD_OB:
7217       s = "lw";
7218       goto sd_ob;
7219     case M_SD_OB:
7220       s = "sw";
7221     sd_ob:
7222       assert (HAVE_32BIT_ADDRESSES);
7223       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7224       offset_expr.X_add_number += 4;
7225       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7226       break;
7227 
7228    /* New code added to support COPZ instructions.
7229       This code builds table entries out of the macros in mip_opcodes.
7230       R4000 uses interlocks to handle coproc delays.
7231       Other chips (like the R3000) require nops to be inserted for delays.
7232 
7233       FIXME: Currently, we require that the user handle delays.
7234       In order to fill delay slots for non-interlocked chips,
7235       we must have a way to specify delays based on the coprocessor.
7236       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7237       What are the side-effects of the cop instruction?
7238       What cache support might we have and what are its effects?
7239       Both coprocessor & memory require delays. how long???
7240       What registers are read/set/modified?
7241 
7242       If an itbl is provided to interpret cop instructions,
7243       this knowledge can be encoded in the itbl spec.  */
7244 
7245     case M_COP0:
7246       s = "c0";
7247       goto copz;
7248     case M_COP1:
7249       s = "c1";
7250       goto copz;
7251     case M_COP2:
7252       s = "c2";
7253       goto copz;
7254     case M_COP3:
7255       s = "c3";
7256     copz:
7257       if (NO_ISA_COP (mips_opts.arch)
7258 	  && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7259 	{
7260 	  as_bad (_("opcode not supported on this processor: %s"),
7261 		  mips_cpu_info_from_arch (mips_opts.arch)->name);
7262 	  break;
7263 	}
7264 
7265       /* For now we just do C (same as Cz).  The parameter will be
7266          stored in insn_opcode by mips_ip.  */
7267       macro_build (NULL, s, "C", ip->insn_opcode);
7268       break;
7269 
7270     case M_MOVE:
7271       move_register (dreg, sreg);
7272       break;
7273 
7274 #ifdef LOSING_COMPILER
7275     default:
7276       /* Try and see if this is a new itbl instruction.
7277          This code builds table entries out of the macros in mip_opcodes.
7278          FIXME: For now we just assemble the expression and pass it's
7279          value along as a 32-bit immediate.
7280          We may want to have the assembler assemble this value,
7281          so that we gain the assembler's knowledge of delay slots,
7282          symbols, etc.
7283          Would it be more efficient to use mask (id) here? */
7284       if (itbl_have_entries
7285 	  && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7286 	{
7287 	  s = ip->insn_mo->name;
7288 	  s2 = "cop3";
7289 	  coproc = ITBL_DECODE_PNUM (immed_expr);;
7290 	  macro_build (&immed_expr, s, "C");
7291 	  break;
7292 	}
7293       macro2 (ip);
7294       break;
7295     }
7296   if (!mips_opts.at && used_at)
7297     as_bad (_("Macro used $at after \".set noat\""));
7298 }
7299 
7300 static void
7301 macro2 (struct mips_cl_insn *ip)
7302 {
7303   unsigned int treg, sreg, dreg, breg;
7304   unsigned int tempreg;
7305   int mask;
7306   int used_at;
7307   expressionS expr1;
7308   const char *s;
7309   const char *s2;
7310   const char *fmt;
7311   int likely = 0;
7312   int dbl = 0;
7313   int coproc = 0;
7314   int lr = 0;
7315   int imm = 0;
7316   int off;
7317   offsetT maxnum;
7318   bfd_reloc_code_real_type r;
7319 
7320   treg = (ip->insn_opcode >> 16) & 0x1f;
7321   dreg = (ip->insn_opcode >> 11) & 0x1f;
7322   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7323   mask = ip->insn_mo->mask;
7324 
7325   expr1.X_op = O_constant;
7326   expr1.X_op_symbol = NULL;
7327   expr1.X_add_symbol = NULL;
7328   expr1.X_add_number = 1;
7329 
7330   switch (mask)
7331     {
7332 #endif /* LOSING_COMPILER */
7333 
7334     case M_DMUL:
7335       dbl = 1;
7336     case M_MUL:
7337       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7338       macro_build (NULL, "mflo", "d", dreg);
7339       break;
7340 
7341     case M_DMUL_I:
7342       dbl = 1;
7343     case M_MUL_I:
7344       /* The MIPS assembler some times generates shifts and adds.  I'm
7345 	 not trying to be that fancy. GCC should do this for us
7346 	 anyway.  */
7347       used_at = 1;
7348       load_register (AT, &imm_expr, dbl);
7349       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7350       macro_build (NULL, "mflo", "d", dreg);
7351       break;
7352 
7353     case M_DMULO_I:
7354       dbl = 1;
7355     case M_MULO_I:
7356       imm = 1;
7357       goto do_mulo;
7358 
7359     case M_DMULO:
7360       dbl = 1;
7361     case M_MULO:
7362     do_mulo:
7363       start_noreorder ();
7364       used_at = 1;
7365       if (imm)
7366 	load_register (AT, &imm_expr, dbl);
7367       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7368       macro_build (NULL, "mflo", "d", dreg);
7369       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7370       macro_build (NULL, "mfhi", "d", AT);
7371       if (mips_trap)
7372 	macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7373       else
7374 	{
7375 	  expr1.X_add_number = 8;
7376 	  macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7377 	  macro_build (NULL, "nop", "", 0);
7378 	  macro_build (NULL, "break", "c", 6);
7379 	}
7380       end_noreorder ();
7381       macro_build (NULL, "mflo", "d", dreg);
7382       break;
7383 
7384     case M_DMULOU_I:
7385       dbl = 1;
7386     case M_MULOU_I:
7387       imm = 1;
7388       goto do_mulou;
7389 
7390     case M_DMULOU:
7391       dbl = 1;
7392     case M_MULOU:
7393     do_mulou:
7394       start_noreorder ();
7395       used_at = 1;
7396       if (imm)
7397 	load_register (AT, &imm_expr, dbl);
7398       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7399 		   sreg, imm ? AT : treg);
7400       macro_build (NULL, "mfhi", "d", AT);
7401       macro_build (NULL, "mflo", "d", dreg);
7402       if (mips_trap)
7403 	macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7404       else
7405 	{
7406 	  expr1.X_add_number = 8;
7407 	  macro_build (&expr1, "beq", "s,t,p", AT, 0);
7408 	  macro_build (NULL, "nop", "", 0);
7409 	  macro_build (NULL, "break", "c", 6);
7410 	}
7411       end_noreorder ();
7412       break;
7413 
7414     case M_DROL:
7415       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7416 	{
7417 	  if (dreg == sreg)
7418 	    {
7419 	      tempreg = AT;
7420 	      used_at = 1;
7421 	    }
7422 	  else
7423 	    {
7424 	      tempreg = dreg;
7425 	    }
7426 	  macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7427 	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7428 	  break;
7429 	}
7430       used_at = 1;
7431       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7432       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7433       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7434       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7435       break;
7436 
7437     case M_ROL:
7438       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7439 	{
7440 	  if (dreg == sreg)
7441 	    {
7442 	      tempreg = AT;
7443 	      used_at = 1;
7444 	    }
7445 	  else
7446 	    {
7447 	      tempreg = dreg;
7448 	    }
7449 	  macro_build (NULL, "negu", "d,w", tempreg, treg);
7450 	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7451 	  break;
7452 	}
7453       used_at = 1;
7454       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7455       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7456       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7457       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7458       break;
7459 
7460     case M_DROL_I:
7461       {
7462 	unsigned int rot;
7463 	char *l, *r;
7464 
7465 	if (imm_expr.X_op != O_constant)
7466 	  as_bad (_("Improper rotate count"));
7467 	rot = imm_expr.X_add_number & 0x3f;
7468 	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7469 	  {
7470 	    rot = (64 - rot) & 0x3f;
7471 	    if (rot >= 32)
7472 	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7473 	    else
7474 	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7475 	    break;
7476 	  }
7477 	if (rot == 0)
7478 	  {
7479 	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7480 	    break;
7481 	  }
7482 	l = (rot < 0x20) ? "dsll" : "dsll32";
7483 	r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7484 	rot &= 0x1f;
7485 	used_at = 1;
7486 	macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7487 	macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7488 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7489       }
7490       break;
7491 
7492     case M_ROL_I:
7493       {
7494 	unsigned int rot;
7495 
7496 	if (imm_expr.X_op != O_constant)
7497 	  as_bad (_("Improper rotate count"));
7498 	rot = imm_expr.X_add_number & 0x1f;
7499 	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7500 	  {
7501 	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7502 	    break;
7503 	  }
7504 	if (rot == 0)
7505 	  {
7506 	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7507 	    break;
7508 	  }
7509 	used_at = 1;
7510 	macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7511 	macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7512 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7513       }
7514       break;
7515 
7516     case M_DROR:
7517       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7518 	{
7519 	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7520 	  break;
7521 	}
7522       used_at = 1;
7523       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7524       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7525       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7526       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7527       break;
7528 
7529     case M_ROR:
7530       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7531 	{
7532 	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7533 	  break;
7534 	}
7535       used_at = 1;
7536       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7537       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7538       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7539       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7540       break;
7541 
7542     case M_DROR_I:
7543       {
7544 	unsigned int rot;
7545 	char *l, *r;
7546 
7547 	if (imm_expr.X_op != O_constant)
7548 	  as_bad (_("Improper rotate count"));
7549 	rot = imm_expr.X_add_number & 0x3f;
7550 	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7551 	  {
7552 	    if (rot >= 32)
7553 	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7554 	    else
7555 	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7556 	    break;
7557 	  }
7558 	if (rot == 0)
7559 	  {
7560 	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7561 	    break;
7562 	  }
7563 	r = (rot < 0x20) ? "dsrl" : "dsrl32";
7564 	l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7565 	rot &= 0x1f;
7566 	used_at = 1;
7567 	macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7568 	macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7569 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7570       }
7571       break;
7572 
7573     case M_ROR_I:
7574       {
7575 	unsigned int rot;
7576 
7577 	if (imm_expr.X_op != O_constant)
7578 	  as_bad (_("Improper rotate count"));
7579 	rot = imm_expr.X_add_number & 0x1f;
7580 	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7581 	  {
7582 	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7583 	    break;
7584 	  }
7585 	if (rot == 0)
7586 	  {
7587 	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7588 	    break;
7589 	  }
7590 	used_at = 1;
7591 	macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7592 	macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7593 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7594       }
7595       break;
7596 
7597     case M_S_DOB:
7598       assert (mips_opts.isa == ISA_MIPS1);
7599       /* Even on a big endian machine $fn comes before $fn+1.  We have
7600 	 to adjust when storing to memory.  */
7601       macro_build (&offset_expr, "swc1", "T,o(b)",
7602 		   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7603       offset_expr.X_add_number += 4;
7604       macro_build (&offset_expr, "swc1", "T,o(b)",
7605 		   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7606       break;
7607 
7608     case M_SEQ:
7609       if (sreg == 0)
7610 	macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7611       else if (treg == 0)
7612 	macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7613       else
7614 	{
7615 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7616 	  macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7617 	}
7618       break;
7619 
7620     case M_SEQ_I:
7621       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7622 	{
7623 	  macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7624 	  break;
7625 	}
7626       if (sreg == 0)
7627 	{
7628 	  as_warn (_("Instruction %s: result is always false"),
7629 		   ip->insn_mo->name);
7630 	  move_register (dreg, 0);
7631 	  break;
7632 	}
7633       if (CPU_HAS_SEQ (mips_opts.arch)
7634 	  && -512 <= imm_expr.X_add_number
7635 	  && imm_expr.X_add_number < 512)
7636 	{
7637 	  macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7638 		       imm_expr.X_add_number);
7639 	  break;
7640 	}
7641       if (imm_expr.X_op == O_constant
7642 	  && imm_expr.X_add_number >= 0
7643 	  && imm_expr.X_add_number < 0x10000)
7644 	{
7645 	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7646 	}
7647       else if (imm_expr.X_op == O_constant
7648 	       && imm_expr.X_add_number > -0x8000
7649 	       && imm_expr.X_add_number < 0)
7650 	{
7651 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7652 	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7653 		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7654 	}
7655       else if (CPU_HAS_SEQ (mips_opts.arch))
7656 	{
7657 	  used_at = 1;
7658 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7659 	  macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7660 	  break;
7661 	}
7662       else
7663 	{
7664 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7665 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7666 	  used_at = 1;
7667 	}
7668       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7669       break;
7670 
7671     case M_SGE:		/* sreg >= treg <==> not (sreg < treg) */
7672       s = "slt";
7673       goto sge;
7674     case M_SGEU:
7675       s = "sltu";
7676     sge:
7677       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7678       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7679       break;
7680 
7681     case M_SGE_I:		/* sreg >= I <==> not (sreg < I) */
7682     case M_SGEU_I:
7683       if (imm_expr.X_op == O_constant
7684 	  && imm_expr.X_add_number >= -0x8000
7685 	  && imm_expr.X_add_number < 0x8000)
7686 	{
7687 	  macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7688 		       dreg, sreg, BFD_RELOC_LO16);
7689 	}
7690       else
7691 	{
7692 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7693 	  macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7694 		       dreg, sreg, AT);
7695 	  used_at = 1;
7696 	}
7697       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7698       break;
7699 
7700     case M_SGT:		/* sreg > treg  <==>  treg < sreg */
7701       s = "slt";
7702       goto sgt;
7703     case M_SGTU:
7704       s = "sltu";
7705     sgt:
7706       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7707       break;
7708 
7709     case M_SGT_I:		/* sreg > I  <==>  I < sreg */
7710       s = "slt";
7711       goto sgti;
7712     case M_SGTU_I:
7713       s = "sltu";
7714     sgti:
7715       used_at = 1;
7716       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7717       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7718       break;
7719 
7720     case M_SLE:	/* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7721       s = "slt";
7722       goto sle;
7723     case M_SLEU:
7724       s = "sltu";
7725     sle:
7726       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7727       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7728       break;
7729 
7730     case M_SLE_I:	/* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7731       s = "slt";
7732       goto slei;
7733     case M_SLEU_I:
7734       s = "sltu";
7735     slei:
7736       used_at = 1;
7737       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7738       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7739       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7740       break;
7741 
7742     case M_SLT_I:
7743       if (imm_expr.X_op == O_constant
7744 	  && imm_expr.X_add_number >= -0x8000
7745 	  && imm_expr.X_add_number < 0x8000)
7746 	{
7747 	  macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7748 	  break;
7749 	}
7750       used_at = 1;
7751       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7752       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7753       break;
7754 
7755     case M_SLTU_I:
7756       if (imm_expr.X_op == O_constant
7757 	  && imm_expr.X_add_number >= -0x8000
7758 	  && imm_expr.X_add_number < 0x8000)
7759 	{
7760 	  macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7761 		       BFD_RELOC_LO16);
7762 	  break;
7763 	}
7764       used_at = 1;
7765       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7766       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7767       break;
7768 
7769     case M_SNE:
7770       if (sreg == 0)
7771 	macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7772       else if (treg == 0)
7773 	macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7774       else
7775 	{
7776 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7777 	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7778 	}
7779       break;
7780 
7781     case M_SNE_I:
7782       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7783 	{
7784 	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7785 	  break;
7786 	}
7787       if (sreg == 0)
7788 	{
7789 	  as_warn (_("Instruction %s: result is always true"),
7790 		   ip->insn_mo->name);
7791 	  macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7792 		       dreg, 0, BFD_RELOC_LO16);
7793 	  break;
7794 	}
7795       if (CPU_HAS_SEQ (mips_opts.arch)
7796 	  && -512 <= imm_expr.X_add_number
7797 	  && imm_expr.X_add_number < 512)
7798 	{
7799 	  macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7800 		       imm_expr.X_add_number);
7801 	  break;
7802 	}
7803       if (imm_expr.X_op == O_constant
7804 	  && imm_expr.X_add_number >= 0
7805 	  && imm_expr.X_add_number < 0x10000)
7806 	{
7807 	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7808 	}
7809       else if (imm_expr.X_op == O_constant
7810 	       && imm_expr.X_add_number > -0x8000
7811 	       && imm_expr.X_add_number < 0)
7812 	{
7813 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7814 	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7815 		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7816 	}
7817       else if (CPU_HAS_SEQ (mips_opts.arch))
7818 	{
7819 	  used_at = 1;
7820 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7821 	  macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7822 	  break;
7823 	}
7824       else
7825 	{
7826 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7827 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7828 	  used_at = 1;
7829 	}
7830       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7831       break;
7832 
7833     case M_DSUB_I:
7834       dbl = 1;
7835     case M_SUB_I:
7836       if (imm_expr.X_op == O_constant
7837 	  && imm_expr.X_add_number > -0x8000
7838 	  && imm_expr.X_add_number <= 0x8000)
7839 	{
7840 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7841 	  macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7842 		       dreg, sreg, BFD_RELOC_LO16);
7843 	  break;
7844 	}
7845       used_at = 1;
7846       load_register (AT, &imm_expr, dbl);
7847       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7848       break;
7849 
7850     case M_DSUBU_I:
7851       dbl = 1;
7852     case M_SUBU_I:
7853       if (imm_expr.X_op == O_constant
7854 	  && imm_expr.X_add_number > -0x8000
7855 	  && imm_expr.X_add_number <= 0x8000)
7856 	{
7857 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7858 	  macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7859 		       dreg, sreg, BFD_RELOC_LO16);
7860 	  break;
7861 	}
7862       used_at = 1;
7863       load_register (AT, &imm_expr, dbl);
7864       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7865       break;
7866 
7867     case M_TEQ_I:
7868       s = "teq";
7869       goto trap;
7870     case M_TGE_I:
7871       s = "tge";
7872       goto trap;
7873     case M_TGEU_I:
7874       s = "tgeu";
7875       goto trap;
7876     case M_TLT_I:
7877       s = "tlt";
7878       goto trap;
7879     case M_TLTU_I:
7880       s = "tltu";
7881       goto trap;
7882     case M_TNE_I:
7883       s = "tne";
7884     trap:
7885       used_at = 1;
7886       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7887       macro_build (NULL, s, "s,t", sreg, AT);
7888       break;
7889 
7890     case M_TRUNCWS:
7891     case M_TRUNCWD:
7892       assert (mips_opts.isa == ISA_MIPS1);
7893       used_at = 1;
7894       sreg = (ip->insn_opcode >> 11) & 0x1f;	/* floating reg */
7895       dreg = (ip->insn_opcode >> 06) & 0x1f;	/* floating reg */
7896 
7897       /*
7898        * Is the double cfc1 instruction a bug in the mips assembler;
7899        * or is there a reason for it?
7900        */
7901       start_noreorder ();
7902       macro_build (NULL, "cfc1", "t,G", treg, RA);
7903       macro_build (NULL, "cfc1", "t,G", treg, RA);
7904       macro_build (NULL, "nop", "");
7905       expr1.X_add_number = 3;
7906       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7907       expr1.X_add_number = 2;
7908       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7909       macro_build (NULL, "ctc1", "t,G", AT, RA);
7910       macro_build (NULL, "nop", "");
7911       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7912 		   dreg, sreg);
7913       macro_build (NULL, "ctc1", "t,G", treg, RA);
7914       macro_build (NULL, "nop", "");
7915       end_noreorder ();
7916       break;
7917 
7918     case M_ULH:
7919       s = "lb";
7920       goto ulh;
7921     case M_ULHU:
7922       s = "lbu";
7923     ulh:
7924       used_at = 1;
7925       if (offset_expr.X_add_number >= 0x7fff)
7926 	as_bad (_("operand overflow"));
7927       if (! target_big_endian)
7928 	++offset_expr.X_add_number;
7929       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7930       if (! target_big_endian)
7931 	--offset_expr.X_add_number;
7932       else
7933 	++offset_expr.X_add_number;
7934       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7935       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7936       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7937       break;
7938 
7939     case M_ULD:
7940       s = "ldl";
7941       s2 = "ldr";
7942       off = 7;
7943       goto ulw;
7944     case M_ULW:
7945       s = "lwl";
7946       s2 = "lwr";
7947       off = 3;
7948     ulw:
7949       if (offset_expr.X_add_number >= 0x8000 - off)
7950 	as_bad (_("operand overflow"));
7951       if (treg != breg)
7952 	tempreg = treg;
7953       else
7954 	{
7955 	  used_at = 1;
7956 	  tempreg = AT;
7957 	}
7958       if (! target_big_endian)
7959 	offset_expr.X_add_number += off;
7960       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7961       if (! target_big_endian)
7962 	offset_expr.X_add_number -= off;
7963       else
7964 	offset_expr.X_add_number += off;
7965       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7966 
7967       /* If necessary, move the result in tempreg the final destination.  */
7968       if (treg == tempreg)
7969         break;
7970       /* Protect second load's delay slot.  */
7971       load_delay_nop ();
7972       move_register (treg, tempreg);
7973       break;
7974 
7975     case M_ULD_A:
7976       s = "ldl";
7977       s2 = "ldr";
7978       off = 7;
7979       goto ulwa;
7980     case M_ULW_A:
7981       s = "lwl";
7982       s2 = "lwr";
7983       off = 3;
7984     ulwa:
7985       used_at = 1;
7986       load_address (AT, &offset_expr, &used_at);
7987       if (breg != 0)
7988 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7989       if (! target_big_endian)
7990 	expr1.X_add_number = off;
7991       else
7992 	expr1.X_add_number = 0;
7993       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7994       if (! target_big_endian)
7995 	expr1.X_add_number = 0;
7996       else
7997 	expr1.X_add_number = off;
7998       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7999       break;
8000 
8001     case M_ULH_A:
8002     case M_ULHU_A:
8003       used_at = 1;
8004       load_address (AT, &offset_expr, &used_at);
8005       if (breg != 0)
8006 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8007       if (target_big_endian)
8008 	expr1.X_add_number = 0;
8009       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8010 		   treg, BFD_RELOC_LO16, AT);
8011       if (target_big_endian)
8012 	expr1.X_add_number = 1;
8013       else
8014 	expr1.X_add_number = 0;
8015       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8016       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8017       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8018       break;
8019 
8020     case M_USH:
8021       used_at = 1;
8022       if (offset_expr.X_add_number >= 0x7fff)
8023 	as_bad (_("operand overflow"));
8024       if (target_big_endian)
8025 	++offset_expr.X_add_number;
8026       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8027       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8028       if (target_big_endian)
8029 	--offset_expr.X_add_number;
8030       else
8031 	++offset_expr.X_add_number;
8032       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8033       break;
8034 
8035     case M_USD:
8036       s = "sdl";
8037       s2 = "sdr";
8038       off = 7;
8039       goto usw;
8040     case M_USW:
8041       s = "swl";
8042       s2 = "swr";
8043       off = 3;
8044     usw:
8045       if (offset_expr.X_add_number >= 0x8000 - off)
8046 	as_bad (_("operand overflow"));
8047       if (! target_big_endian)
8048 	offset_expr.X_add_number += off;
8049       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8050       if (! target_big_endian)
8051 	offset_expr.X_add_number -= off;
8052       else
8053 	offset_expr.X_add_number += off;
8054       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8055       break;
8056 
8057     case M_USD_A:
8058       s = "sdl";
8059       s2 = "sdr";
8060       off = 7;
8061       goto uswa;
8062     case M_USW_A:
8063       s = "swl";
8064       s2 = "swr";
8065       off = 3;
8066     uswa:
8067       used_at = 1;
8068       load_address (AT, &offset_expr, &used_at);
8069       if (breg != 0)
8070 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8071       if (! target_big_endian)
8072 	expr1.X_add_number = off;
8073       else
8074 	expr1.X_add_number = 0;
8075       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8076       if (! target_big_endian)
8077 	expr1.X_add_number = 0;
8078       else
8079 	expr1.X_add_number = off;
8080       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8081       break;
8082 
8083     case M_USH_A:
8084       used_at = 1;
8085       load_address (AT, &offset_expr, &used_at);
8086       if (breg != 0)
8087 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8088       if (! target_big_endian)
8089 	expr1.X_add_number = 0;
8090       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8091       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8092       if (! target_big_endian)
8093 	expr1.X_add_number = 1;
8094       else
8095 	expr1.X_add_number = 0;
8096       macro_build (&expr1, "sb", "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 = 1;
8101       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8102       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8103       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8104       break;
8105 
8106     default:
8107       /* FIXME: Check if this is one of the itbl macros, since they
8108 	 are added dynamically.  */
8109       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8110       break;
8111     }
8112   if (!mips_opts.at && used_at)
8113     as_bad (_("Macro used $at after \".set noat\""));
8114 }
8115 
8116 /* Implement macros in mips16 mode.  */
8117 
8118 static void
8119 mips16_macro (struct mips_cl_insn *ip)
8120 {
8121   int mask;
8122   int xreg, yreg, zreg, tmp;
8123   expressionS expr1;
8124   int dbl;
8125   const char *s, *s2, *s3;
8126 
8127   mask = ip->insn_mo->mask;
8128 
8129   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8130   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8131   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8132 
8133   expr1.X_op = O_constant;
8134   expr1.X_op_symbol = NULL;
8135   expr1.X_add_symbol = NULL;
8136   expr1.X_add_number = 1;
8137 
8138   dbl = 0;
8139 
8140   switch (mask)
8141     {
8142     default:
8143       internalError ();
8144 
8145     case M_DDIV_3:
8146       dbl = 1;
8147     case M_DIV_3:
8148       s = "mflo";
8149       goto do_div3;
8150     case M_DREM_3:
8151       dbl = 1;
8152     case M_REM_3:
8153       s = "mfhi";
8154     do_div3:
8155       start_noreorder ();
8156       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8157       expr1.X_add_number = 2;
8158       macro_build (&expr1, "bnez", "x,p", yreg);
8159       macro_build (NULL, "break", "6", 7);
8160 
8161       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8162          since that causes an overflow.  We should do that as well,
8163          but I don't see how to do the comparisons without a temporary
8164          register.  */
8165       end_noreorder ();
8166       macro_build (NULL, s, "x", zreg);
8167       break;
8168 
8169     case M_DIVU_3:
8170       s = "divu";
8171       s2 = "mflo";
8172       goto do_divu3;
8173     case M_REMU_3:
8174       s = "divu";
8175       s2 = "mfhi";
8176       goto do_divu3;
8177     case M_DDIVU_3:
8178       s = "ddivu";
8179       s2 = "mflo";
8180       goto do_divu3;
8181     case M_DREMU_3:
8182       s = "ddivu";
8183       s2 = "mfhi";
8184     do_divu3:
8185       start_noreorder ();
8186       macro_build (NULL, s, "0,x,y", xreg, yreg);
8187       expr1.X_add_number = 2;
8188       macro_build (&expr1, "bnez", "x,p", yreg);
8189       macro_build (NULL, "break", "6", 7);
8190       end_noreorder ();
8191       macro_build (NULL, s2, "x", zreg);
8192       break;
8193 
8194     case M_DMUL:
8195       dbl = 1;
8196     case M_MUL:
8197       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8198       macro_build (NULL, "mflo", "x", zreg);
8199       break;
8200 
8201     case M_DSUBU_I:
8202       dbl = 1;
8203       goto do_subu;
8204     case M_SUBU_I:
8205     do_subu:
8206       if (imm_expr.X_op != O_constant)
8207 	as_bad (_("Unsupported large constant"));
8208       imm_expr.X_add_number = -imm_expr.X_add_number;
8209       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8210       break;
8211 
8212     case M_SUBU_I_2:
8213       if (imm_expr.X_op != O_constant)
8214 	as_bad (_("Unsupported large constant"));
8215       imm_expr.X_add_number = -imm_expr.X_add_number;
8216       macro_build (&imm_expr, "addiu", "x,k", xreg);
8217       break;
8218 
8219     case M_DSUBU_I_2:
8220       if (imm_expr.X_op != O_constant)
8221 	as_bad (_("Unsupported large constant"));
8222       imm_expr.X_add_number = -imm_expr.X_add_number;
8223       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8224       break;
8225 
8226     case M_BEQ:
8227       s = "cmp";
8228       s2 = "bteqz";
8229       goto do_branch;
8230     case M_BNE:
8231       s = "cmp";
8232       s2 = "btnez";
8233       goto do_branch;
8234     case M_BLT:
8235       s = "slt";
8236       s2 = "btnez";
8237       goto do_branch;
8238     case M_BLTU:
8239       s = "sltu";
8240       s2 = "btnez";
8241       goto do_branch;
8242     case M_BLE:
8243       s = "slt";
8244       s2 = "bteqz";
8245       goto do_reverse_branch;
8246     case M_BLEU:
8247       s = "sltu";
8248       s2 = "bteqz";
8249       goto do_reverse_branch;
8250     case M_BGE:
8251       s = "slt";
8252       s2 = "bteqz";
8253       goto do_branch;
8254     case M_BGEU:
8255       s = "sltu";
8256       s2 = "bteqz";
8257       goto do_branch;
8258     case M_BGT:
8259       s = "slt";
8260       s2 = "btnez";
8261       goto do_reverse_branch;
8262     case M_BGTU:
8263       s = "sltu";
8264       s2 = "btnez";
8265 
8266     do_reverse_branch:
8267       tmp = xreg;
8268       xreg = yreg;
8269       yreg = tmp;
8270 
8271     do_branch:
8272       macro_build (NULL, s, "x,y", xreg, yreg);
8273       macro_build (&offset_expr, s2, "p");
8274       break;
8275 
8276     case M_BEQ_I:
8277       s = "cmpi";
8278       s2 = "bteqz";
8279       s3 = "x,U";
8280       goto do_branch_i;
8281     case M_BNE_I:
8282       s = "cmpi";
8283       s2 = "btnez";
8284       s3 = "x,U";
8285       goto do_branch_i;
8286     case M_BLT_I:
8287       s = "slti";
8288       s2 = "btnez";
8289       s3 = "x,8";
8290       goto do_branch_i;
8291     case M_BLTU_I:
8292       s = "sltiu";
8293       s2 = "btnez";
8294       s3 = "x,8";
8295       goto do_branch_i;
8296     case M_BLE_I:
8297       s = "slti";
8298       s2 = "btnez";
8299       s3 = "x,8";
8300       goto do_addone_branch_i;
8301     case M_BLEU_I:
8302       s = "sltiu";
8303       s2 = "btnez";
8304       s3 = "x,8";
8305       goto do_addone_branch_i;
8306     case M_BGE_I:
8307       s = "slti";
8308       s2 = "bteqz";
8309       s3 = "x,8";
8310       goto do_branch_i;
8311     case M_BGEU_I:
8312       s = "sltiu";
8313       s2 = "bteqz";
8314       s3 = "x,8";
8315       goto do_branch_i;
8316     case M_BGT_I:
8317       s = "slti";
8318       s2 = "bteqz";
8319       s3 = "x,8";
8320       goto do_addone_branch_i;
8321     case M_BGTU_I:
8322       s = "sltiu";
8323       s2 = "bteqz";
8324       s3 = "x,8";
8325 
8326     do_addone_branch_i:
8327       if (imm_expr.X_op != O_constant)
8328 	as_bad (_("Unsupported large constant"));
8329       ++imm_expr.X_add_number;
8330 
8331     do_branch_i:
8332       macro_build (&imm_expr, s, s3, xreg);
8333       macro_build (&offset_expr, s2, "p");
8334       break;
8335 
8336     case M_ABS:
8337       expr1.X_add_number = 0;
8338       macro_build (&expr1, "slti", "x,8", yreg);
8339       if (xreg != yreg)
8340 	move_register (xreg, yreg);
8341       expr1.X_add_number = 2;
8342       macro_build (&expr1, "bteqz", "p");
8343       macro_build (NULL, "neg", "x,w", xreg, xreg);
8344     }
8345 }
8346 
8347 /* For consistency checking, verify that all bits are specified either
8348    by the match/mask part of the instruction definition, or by the
8349    operand list.  */
8350 static int
8351 validate_mips_insn (const struct mips_opcode *opc)
8352 {
8353   const char *p = opc->args;
8354   char c;
8355   unsigned long used_bits = opc->mask;
8356 
8357   if ((used_bits & opc->match) != opc->match)
8358     {
8359       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8360 	      opc->name, opc->args);
8361       return 0;
8362     }
8363 #define USE_BITS(mask,shift)	(used_bits |= ((mask) << (shift)))
8364   while (*p)
8365     switch (c = *p++)
8366       {
8367       case ',': break;
8368       case '(': break;
8369       case ')': break;
8370       case '+':
8371     	switch (c = *p++)
8372 	  {
8373 	  case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1); 	break;
8374 	  case '2': USE_BITS (OP_MASK_UDI2,	OP_SH_UDI2); 	break;
8375 	  case '3': USE_BITS (OP_MASK_UDI3,	OP_SH_UDI3); 	break;
8376 	  case '4': USE_BITS (OP_MASK_UDI4,	OP_SH_UDI4); 	break;
8377 	  case 'A': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8378 	  case 'B': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
8379 	  case 'C': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8380 	  case 'D': USE_BITS (OP_MASK_RD,	OP_SH_RD);
8381 		    USE_BITS (OP_MASK_SEL,	OP_SH_SEL);	break;
8382 	  case 'E': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8383 	  case 'F': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
8384 	  case 'G': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8385 	  case 'H': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8386 	  case 'I': break;
8387 	  case 't': USE_BITS (OP_MASK_RT,	OP_SH_RT);	break;
8388 	  case 'T': USE_BITS (OP_MASK_RT,	OP_SH_RT);
8389 		    USE_BITS (OP_MASK_SEL,	OP_SH_SEL);	break;
8390 	  case 'x': USE_BITS (OP_MASK_BBITIND,	OP_SH_BBITIND);	break;
8391 	  case 'X': USE_BITS (OP_MASK_BBITIND,	OP_SH_BBITIND);	break;
8392 	  case 'p': USE_BITS (OP_MASK_CINSPOS,	OP_SH_CINSPOS);	break;
8393 	  case 'P': USE_BITS (OP_MASK_CINSPOS,	OP_SH_CINSPOS);	break;
8394 	  case 'Q': USE_BITS (OP_MASK_SEQI,	OP_SH_SEQI);	break;
8395 	  case 's': USE_BITS (OP_MASK_CINSLM1,	OP_SH_CINSLM1);	break;
8396 	  case 'S': USE_BITS (OP_MASK_CINSLM1,	OP_SH_CINSLM1);	break;
8397 
8398 	  default:
8399 	    as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8400 		    c, opc->name, opc->args);
8401 	    return 0;
8402 	  }
8403 	break;
8404       case '<': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8405       case '>':	USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8406       case 'A': break;
8407       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8408       case 'C':	USE_BITS (OP_MASK_COPZ,		OP_SH_COPZ);	break;
8409       case 'D':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
8410       case 'E':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8411       case 'F': break;
8412       case 'G':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8413       case 'H': USE_BITS (OP_MASK_SEL,		OP_SH_SEL);	break;
8414       case 'I': break;
8415       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8416       case 'K':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8417       case 'L': break;
8418       case 'M':	USE_BITS (OP_MASK_CCC,		OP_SH_CCC);	break;
8419       case 'N':	USE_BITS (OP_MASK_BCC,		OP_SH_BCC);	break;
8420       case 'O':	USE_BITS (OP_MASK_ALN,		OP_SH_ALN);	break;
8421       case 'Q':	USE_BITS (OP_MASK_VSEL,		OP_SH_VSEL);
8422 		USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8423       case 'R':	USE_BITS (OP_MASK_FR,		OP_SH_FR);	break;
8424       case 'S':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8425       case 'T':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8426       case 'V':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8427       case 'W':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8428       case 'X':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
8429       case 'Y':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8430       case 'Z':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8431       case 'a':	USE_BITS (OP_MASK_TARGET,	OP_SH_TARGET);	break;
8432       case 'b':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8433       case 'c':	USE_BITS (OP_MASK_CODE,		OP_SH_CODE);	break;
8434       case 'd':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8435       case 'f': break;
8436       case 'h':	USE_BITS (OP_MASK_PREFX,	OP_SH_PREFX);	break;
8437       case 'i':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8438       case 'j':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8439       case 'k':	USE_BITS (OP_MASK_CACHE,	OP_SH_CACHE);	break;
8440       case 'l': break;
8441       case 'o': USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8442       case 'p':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8443       case 'q':	USE_BITS (OP_MASK_CODE2,	OP_SH_CODE2);	break;
8444       case 'r': USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8445       case 's':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8446       case 't':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8447       case 'u':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8448       case 'v':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8449       case 'w':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8450       case 'x': break;
8451       case 'z': break;
8452       case 'P': USE_BITS (OP_MASK_PERFREG,	OP_SH_PERFREG);	break;
8453       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8454 	        USE_BITS (OP_MASK_RT,           OP_SH_RT);	break;
8455       case 'e': USE_BITS (OP_MASK_VECBYTE,	OP_SH_VECBYTE);	break;
8456       case '%': USE_BITS (OP_MASK_VECALIGN,	OP_SH_VECALIGN); break;
8457       case '[': break;
8458       case ']': break;
8459       case '2': USE_BITS (OP_MASK_BP,		OP_SH_BP);	break;
8460       case '3': USE_BITS (OP_MASK_SA3,  	OP_SH_SA3);	break;
8461       case '4': USE_BITS (OP_MASK_SA4,  	OP_SH_SA4);	break;
8462       case '5': USE_BITS (OP_MASK_IMM8, 	OP_SH_IMM8);	break;
8463       case '6': USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8464       case '7': USE_BITS (OP_MASK_DSPACC,	OP_SH_DSPACC);	break;
8465       case '8': USE_BITS (OP_MASK_WRDSP,	OP_SH_WRDSP);	break;
8466       case '9': USE_BITS (OP_MASK_DSPACC_S,	OP_SH_DSPACC_S);break;
8467       case '0': USE_BITS (OP_MASK_DSPSFT,	OP_SH_DSPSFT);	break;
8468       case '\'': USE_BITS (OP_MASK_RDDSP,	OP_SH_RDDSP);	break;
8469       case ':': USE_BITS (OP_MASK_DSPSFT_7,	OP_SH_DSPSFT_7);break;
8470       case '@': USE_BITS (OP_MASK_IMM10,	OP_SH_IMM10);	break;
8471       case '!': USE_BITS (OP_MASK_MT_U,		OP_SH_MT_U);	break;
8472       case '$': USE_BITS (OP_MASK_MT_H,		OP_SH_MT_H);	break;
8473       case '*': USE_BITS (OP_MASK_MTACC_T,	OP_SH_MTACC_T);	break;
8474       case '&': USE_BITS (OP_MASK_MTACC_D,	OP_SH_MTACC_D);	break;
8475       case 'g': USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8476       default:
8477 	as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8478 		c, opc->name, opc->args);
8479 	return 0;
8480       }
8481 #undef USE_BITS
8482   if (used_bits != 0xffffffff)
8483     {
8484       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8485 	      ~used_bits & 0xffffffff, opc->name, opc->args);
8486       return 0;
8487     }
8488   return 1;
8489 }
8490 
8491 /* UDI immediates.  */
8492 struct mips_immed {
8493   char		type;
8494   unsigned int	shift;
8495   unsigned long	mask;
8496   const char *	desc;
8497 };
8498 
8499 static const struct mips_immed mips_immed[] = {
8500   { '1',	OP_SH_UDI1,	OP_MASK_UDI1,		0},
8501   { '2',	OP_SH_UDI2,	OP_MASK_UDI2,		0},
8502   { '3',	OP_SH_UDI3,	OP_MASK_UDI3,		0},
8503   { '4',	OP_SH_UDI4,	OP_MASK_UDI4,		0},
8504   { 0,0,0,0 }
8505 };
8506 
8507 /* Check whether an odd floating-point register is allowed.  */
8508 static int
8509 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8510 {
8511   const char *s = insn->name;
8512 
8513   if (insn->pinfo == INSN_MACRO)
8514     /* Let a macro pass, we'll catch it later when it is expanded.  */
8515     return 1;
8516 
8517   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8518     {
8519       /* Allow odd registers for single-precision ops.  */
8520       switch (insn->pinfo & (FP_S | FP_D))
8521 	{
8522 	case FP_S:
8523 	case 0:
8524 	  return 1;	/* both single precision - ok */
8525 	case FP_D:
8526 	  return 0;	/* both double precision - fail */
8527 	default:
8528 	  break;
8529 	}
8530 
8531       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8532       s = strchr (insn->name, '.');
8533       if (argnum == 2)
8534 	s = s != NULL ? strchr (s + 1, '.') : NULL;
8535       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8536     }
8537 
8538   /* Single-precision coprocessor loads and moves are OK too.  */
8539   if ((insn->pinfo & FP_S)
8540       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8541 			 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8542     return 1;
8543 
8544   return 0;
8545 }
8546 
8547 /* This routine assembles an instruction into its binary format.  As a
8548    side effect, it sets one of the global variables imm_reloc or
8549    offset_reloc to the type of relocation to do if one of the operands
8550    is an address expression.  */
8551 
8552 static void
8553 mips_ip (char *str, struct mips_cl_insn *ip)
8554 {
8555   char *s;
8556   const char *args;
8557   char c = 0;
8558   struct mips_opcode *insn;
8559   char *argsStart;
8560   unsigned int regno;
8561   unsigned int lastregno = 0;
8562   unsigned int lastpos = 0;
8563   unsigned int limlo, limhi;
8564   char *s_reset;
8565   char save_c = 0;
8566   offsetT min_range, max_range;
8567   int argnum;
8568   unsigned int rtype;
8569 
8570   insn_error = NULL;
8571 
8572   /* If the instruction contains a '.', we first try to match an instruction
8573      including the '.'.  Then we try again without the '.'.  */
8574   insn = NULL;
8575   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8576     continue;
8577 
8578   /* If we stopped on whitespace, then replace the whitespace with null for
8579      the call to hash_find.  Save the character we replaced just in case we
8580      have to re-parse the instruction.  */
8581   if (ISSPACE (*s))
8582     {
8583       save_c = *s;
8584       *s++ = '\0';
8585     }
8586 
8587   insn = (struct mips_opcode *) hash_find (op_hash, str);
8588 
8589   /* If we didn't find the instruction in the opcode table, try again, but
8590      this time with just the instruction up to, but not including the
8591      first '.'.  */
8592   if (insn == NULL)
8593     {
8594       /* Restore the character we overwrite above (if any).  */
8595       if (save_c)
8596 	*(--s) = save_c;
8597 
8598       /* Scan up to the first '.' or whitespace.  */
8599       for (s = str;
8600 	   *s != '\0' && *s != '.' && !ISSPACE (*s);
8601 	   ++s)
8602 	continue;
8603 
8604       /* If we did not find a '.', then we can quit now.  */
8605       if (*s != '.')
8606 	{
8607 	  insn_error = "unrecognized opcode";
8608 	  return;
8609 	}
8610 
8611       /* Lookup the instruction in the hash table.  */
8612       *s++ = '\0';
8613       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8614 	{
8615 	  insn_error = "unrecognized opcode";
8616 	  return;
8617 	}
8618     }
8619 
8620   argsStart = s;
8621   for (;;)
8622     {
8623       bfd_boolean ok;
8624 
8625       assert (strcmp (insn->name, str) == 0);
8626 
8627       ok = is_opcode_valid (insn, FALSE);
8628       if (! ok)
8629 	{
8630 	  if (insn + 1 < &mips_opcodes[NUMOPCODES]
8631 	      && strcmp (insn->name, insn[1].name) == 0)
8632 	    {
8633 	      ++insn;
8634 	      continue;
8635 	    }
8636 	  else
8637 	    {
8638 	      if (!insn_error)
8639 		{
8640 		  static char buf[100];
8641 		  sprintf (buf,
8642 			   _("opcode not supported on this processor: %s (%s)"),
8643 			   mips_cpu_info_from_arch (mips_opts.arch)->name,
8644 			   mips_cpu_info_from_isa (mips_opts.isa)->name);
8645 		  insn_error = buf;
8646 		}
8647 	      if (save_c)
8648 		*(--s) = save_c;
8649 	      return;
8650 	    }
8651 	}
8652 
8653       create_insn (ip, insn);
8654       insn_error = NULL;
8655       argnum = 1;
8656       for (args = insn->args;; ++args)
8657 	{
8658 	  int is_mdmx;
8659 
8660 	  s += strspn (s, " \t");
8661 	  is_mdmx = 0;
8662 	  switch (*args)
8663 	    {
8664 	    case '\0':		/* end of args */
8665 	      if (*s == '\0')
8666 		return;
8667 	      break;
8668 
8669 	    case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8670 	      my_getExpression (&imm_expr, s);
8671 	      check_absolute_expr (ip, &imm_expr);
8672 	      if ((unsigned long) imm_expr.X_add_number != 1
8673 		  && (unsigned long) imm_expr.X_add_number != 3)
8674 		{
8675 		  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8676 			  (unsigned long) imm_expr.X_add_number);
8677 		}
8678 	      INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8679 	      imm_expr.X_op = O_absent;
8680 	      s = expr_end;
8681 	      continue;
8682 
8683 	    case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8684 	      my_getExpression (&imm_expr, s);
8685 	      check_absolute_expr (ip, &imm_expr);
8686 	      if (imm_expr.X_add_number & ~OP_MASK_SA3)
8687 		{
8688 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8689 			  OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8690 		}
8691 	      INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8692 	      imm_expr.X_op = O_absent;
8693 	      s = expr_end;
8694 	      continue;
8695 
8696 	    case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8697 	      my_getExpression (&imm_expr, s);
8698 	      check_absolute_expr (ip, &imm_expr);
8699 	      if (imm_expr.X_add_number & ~OP_MASK_SA4)
8700 		{
8701 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8702 			  OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8703 		}
8704 	      INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8705 	      imm_expr.X_op = O_absent;
8706 	      s = expr_end;
8707 	      continue;
8708 
8709 	    case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8710 	      my_getExpression (&imm_expr, s);
8711 	      check_absolute_expr (ip, &imm_expr);
8712 	      if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8713 		{
8714 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8715 			  OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8716 		}
8717 	      INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8718 	      imm_expr.X_op = O_absent;
8719 	      s = expr_end;
8720 	      continue;
8721 
8722 	    case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8723 	      my_getExpression (&imm_expr, s);
8724 	      check_absolute_expr (ip, &imm_expr);
8725 	      if (imm_expr.X_add_number & ~OP_MASK_RS)
8726 		{
8727 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8728 			  OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8729 		}
8730 	      INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8731 	      imm_expr.X_op = O_absent;
8732 	      s = expr_end;
8733 	      continue;
8734 
8735 	    case '7': /* four dsp accumulators in bits 11,12 */
8736 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8737 		  s[3] >= '0' && s[3] <= '3')
8738 		{
8739 		  regno = s[3] - '0';
8740 		  s += 4;
8741 		  INSERT_OPERAND (DSPACC, *ip, regno);
8742 		  continue;
8743 		}
8744 	      else
8745 		as_bad (_("Invalid dsp acc register"));
8746 	      break;
8747 
8748 	    case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8749 	      my_getExpression (&imm_expr, s);
8750 	      check_absolute_expr (ip, &imm_expr);
8751 	      if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8752 		{
8753 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8754 			  OP_MASK_WRDSP,
8755 			  (unsigned long) imm_expr.X_add_number);
8756 		}
8757 	      INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8758 	      imm_expr.X_op = O_absent;
8759 	      s = expr_end;
8760 	      continue;
8761 
8762 	    case '9': /* four dsp accumulators in bits 21,22 */
8763 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8764 		  s[3] >= '0' && s[3] <= '3')
8765 		{
8766 		  regno = s[3] - '0';
8767 		  s += 4;
8768 		  INSERT_OPERAND (DSPACC_S, *ip, regno);
8769 		  continue;
8770 		}
8771 	      else
8772 		as_bad (_("Invalid dsp acc register"));
8773 	      break;
8774 
8775 	    case '0': /* dsp 6-bit signed immediate in bit 20 */
8776 	      my_getExpression (&imm_expr, s);
8777 	      check_absolute_expr (ip, &imm_expr);
8778 	      min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8779 	      max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8780 	      if (imm_expr.X_add_number < min_range ||
8781 		  imm_expr.X_add_number > max_range)
8782 		{
8783 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8784 			  (long) min_range, (long) max_range,
8785 			  (long) imm_expr.X_add_number);
8786 		}
8787 	      INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8788 	      imm_expr.X_op = O_absent;
8789 	      s = expr_end;
8790 	      continue;
8791 
8792 	    case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8793 	      my_getExpression (&imm_expr, s);
8794 	      check_absolute_expr (ip, &imm_expr);
8795 	      if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8796 		{
8797 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8798 			  OP_MASK_RDDSP,
8799 			  (unsigned long) imm_expr.X_add_number);
8800 		}
8801 	      INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8802 	      imm_expr.X_op = O_absent;
8803 	      s = expr_end;
8804 	      continue;
8805 
8806 	    case ':': /* dsp 7-bit signed immediate in bit 19 */
8807 	      my_getExpression (&imm_expr, s);
8808 	      check_absolute_expr (ip, &imm_expr);
8809 	      min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8810 	      max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8811 	      if (imm_expr.X_add_number < min_range ||
8812 		  imm_expr.X_add_number > max_range)
8813 		{
8814 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8815 			  (long) min_range, (long) max_range,
8816 			  (long) imm_expr.X_add_number);
8817 		}
8818 	      INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8819 	      imm_expr.X_op = O_absent;
8820 	      s = expr_end;
8821 	      continue;
8822 
8823 	    case '@': /* dsp 10-bit signed immediate in bit 16 */
8824 	      my_getExpression (&imm_expr, s);
8825 	      check_absolute_expr (ip, &imm_expr);
8826 	      min_range = -((OP_MASK_IMM10 + 1) >> 1);
8827 	      max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8828 	      if (imm_expr.X_add_number < min_range ||
8829 		  imm_expr.X_add_number > max_range)
8830 		{
8831 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8832 			  (long) min_range, (long) max_range,
8833 			  (long) imm_expr.X_add_number);
8834 		}
8835 	      INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8836 	      imm_expr.X_op = O_absent;
8837 	      s = expr_end;
8838 	      continue;
8839 
8840             case '!': /* MT usermode flag bit.  */
8841 	      my_getExpression (&imm_expr, s);
8842 	      check_absolute_expr (ip, &imm_expr);
8843 	      if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8844 		as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8845 			(unsigned long) imm_expr.X_add_number);
8846 	      INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8847 	      imm_expr.X_op = O_absent;
8848 	      s = expr_end;
8849 	      continue;
8850 
8851             case '$': /* MT load high flag bit.  */
8852 	      my_getExpression (&imm_expr, s);
8853 	      check_absolute_expr (ip, &imm_expr);
8854 	      if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8855 		as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8856 			(unsigned long) imm_expr.X_add_number);
8857 	      INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8858 	      imm_expr.X_op = O_absent;
8859 	      s = expr_end;
8860 	      continue;
8861 
8862 	    case '*': /* four dsp accumulators in bits 18,19 */
8863 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8864 		  s[3] >= '0' && s[3] <= '3')
8865 		{
8866 		  regno = s[3] - '0';
8867 		  s += 4;
8868 		  INSERT_OPERAND (MTACC_T, *ip, regno);
8869 		  continue;
8870 		}
8871 	      else
8872 		as_bad (_("Invalid dsp/smartmips acc register"));
8873 	      break;
8874 
8875 	    case '&': /* four dsp accumulators in bits 13,14 */
8876 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8877 		  s[3] >= '0' && s[3] <= '3')
8878 		{
8879 		  regno = s[3] - '0';
8880 		  s += 4;
8881 		  INSERT_OPERAND (MTACC_D, *ip, regno);
8882 		  continue;
8883 		}
8884 	      else
8885 		as_bad (_("Invalid dsp/smartmips acc register"));
8886 	      break;
8887 
8888 	    case ',':
8889 	      ++argnum;
8890 	      if (*s++ == *args)
8891 		continue;
8892 	      s--;
8893 	      switch (*++args)
8894 		{
8895 		case 'r':
8896 		case 'v':
8897 		  INSERT_OPERAND (RS, *ip, lastregno);
8898 		  continue;
8899 
8900 		case 'w':
8901 		  INSERT_OPERAND (RT, *ip, lastregno);
8902 		  continue;
8903 
8904 		case 'W':
8905 		  INSERT_OPERAND (FT, *ip, lastregno);
8906 		  continue;
8907 
8908 		case 'V':
8909 		  INSERT_OPERAND (FS, *ip, lastregno);
8910 		  continue;
8911 		}
8912 	      break;
8913 
8914 	    case '(':
8915 	      /* Handle optional base register.
8916 		 Either the base register is omitted or
8917 		 we must have a left paren.  */
8918 	      /* This is dependent on the next operand specifier
8919 		 is a base register specification.  */
8920 	      assert (args[1] == 'b' || args[1] == '5'
8921 		      || args[1] == '-' || args[1] == '4');
8922 	      if (*s == '\0')
8923 		return;
8924 
8925 	    case ')':		/* these must match exactly */
8926 	    case '[':
8927 	    case ']':
8928 	      if (*s++ == *args)
8929 		continue;
8930 	      break;
8931 
8932 	    case '+':		/* Opcode extension character.  */
8933 	      switch (*++args)
8934 		{
8935 		case '1':	/* UDI immediates.  */
8936 		case '2':
8937 		case '3':
8938 		case '4':
8939 		  {
8940 		    const struct mips_immed *imm = mips_immed;
8941 
8942 		    while (imm->type && imm->type != *args)
8943 		      ++imm;
8944 		    if (! imm->type)
8945 		      internalError ();
8946 		    my_getExpression (&imm_expr, s);
8947 		    check_absolute_expr (ip, &imm_expr);
8948 		    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8949 		      {
8950 		        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8951 				 imm->desc ? imm->desc : ip->insn_mo->name,
8952 				 (unsigned long) imm_expr.X_add_number,
8953 				 (unsigned long) imm_expr.X_add_number);
8954 			      imm_expr.X_add_number &= imm->mask;
8955 		      }
8956 		    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8957 					<< imm->shift);
8958 		    imm_expr.X_op = O_absent;
8959 		    s = expr_end;
8960 		  }
8961 		  continue;
8962 
8963 		case 'A':		/* ins/ext position, becomes LSB.  */
8964 		  limlo = 0;
8965 		  limhi = 31;
8966 		  goto do_lsb;
8967 		case 'E':
8968 		  limlo = 32;
8969 		  limhi = 63;
8970 		  goto do_lsb;
8971 do_lsb:
8972 		  my_getExpression (&imm_expr, s);
8973 		  check_absolute_expr (ip, &imm_expr);
8974 		  if ((unsigned long) imm_expr.X_add_number < limlo
8975 		      || (unsigned long) imm_expr.X_add_number > limhi)
8976 		    {
8977 		      as_bad (_("Improper position (%lu)"),
8978 			      (unsigned long) imm_expr.X_add_number);
8979 		      imm_expr.X_add_number = limlo;
8980 		    }
8981 		  lastpos = imm_expr.X_add_number;
8982 		  INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8983 		  imm_expr.X_op = O_absent;
8984 		  s = expr_end;
8985 		  continue;
8986 
8987 		case 'B':		/* ins size, becomes MSB.  */
8988 		  limlo = 1;
8989 		  limhi = 32;
8990 		  goto do_msb;
8991 		case 'F':
8992 		  limlo = 33;
8993 		  limhi = 64;
8994 		  goto do_msb;
8995 do_msb:
8996 		  my_getExpression (&imm_expr, s);
8997 		  check_absolute_expr (ip, &imm_expr);
8998 		  /* Check for negative input so that small negative numbers
8999 		     will not succeed incorrectly.  The checks against
9000 		     (pos+size) transitively check "size" itself,
9001 		     assuming that "pos" is reasonable.  */
9002 		  if ((long) imm_expr.X_add_number < 0
9003 		      || ((unsigned long) imm_expr.X_add_number
9004 			  + lastpos) < limlo
9005 		      || ((unsigned long) imm_expr.X_add_number
9006 			  + lastpos) > limhi)
9007 		    {
9008 		      as_bad (_("Improper insert size (%lu, position %lu)"),
9009 			      (unsigned long) imm_expr.X_add_number,
9010 			      (unsigned long) lastpos);
9011 		      imm_expr.X_add_number = limlo - lastpos;
9012 		    }
9013 		  INSERT_OPERAND (INSMSB, *ip,
9014 				 lastpos + imm_expr.X_add_number - 1);
9015 		  imm_expr.X_op = O_absent;
9016 		  s = expr_end;
9017 		  continue;
9018 
9019 		case 'C':		/* ext size, becomes MSBD.  */
9020 		  limlo = 1;
9021 		  limhi = 32;
9022 		  goto do_msbd;
9023 		case 'G':
9024 		  limlo = 33;
9025 		  limhi = 64;
9026 		  goto do_msbd;
9027 		case 'H':
9028 		  limlo = 33;
9029 		  limhi = 64;
9030 		  goto do_msbd;
9031 do_msbd:
9032 		  my_getExpression (&imm_expr, s);
9033 		  check_absolute_expr (ip, &imm_expr);
9034 		  /* Check for negative input so that small negative numbers
9035 		     will not succeed incorrectly.  The checks against
9036 		     (pos+size) transitively check "size" itself,
9037 		     assuming that "pos" is reasonable.  */
9038 		  if ((long) imm_expr.X_add_number < 0
9039 		      || ((unsigned long) imm_expr.X_add_number
9040 			  + lastpos) < limlo
9041 		      || ((unsigned long) imm_expr.X_add_number
9042 			  + lastpos) > limhi)
9043 		    {
9044 		      as_bad (_("Improper extract size (%lu, position %lu)"),
9045 			      (unsigned long) imm_expr.X_add_number,
9046 			      (unsigned long) lastpos);
9047 		      imm_expr.X_add_number = limlo - lastpos;
9048 		    }
9049 		  INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9050 		  imm_expr.X_op = O_absent;
9051 		  s = expr_end;
9052 		  continue;
9053 
9054 		case 'D':
9055 		  /* +D is for disassembly only; never match.  */
9056 		  break;
9057 
9058 		case 'I':
9059 		  /* "+I" is like "I", except that imm2_expr is used.  */
9060 		  my_getExpression (&imm2_expr, s);
9061 		  if (imm2_expr.X_op != O_big
9062 		      && imm2_expr.X_op != O_constant)
9063 		  insn_error = _("absolute expression required");
9064 		  if (HAVE_32BIT_GPRS)
9065 		    normalize_constant_expr (&imm2_expr);
9066 		  s = expr_end;
9067 		  continue;
9068 
9069 		case 'T': /* Coprocessor register.  */
9070 		  /* +T is for disassembly only; never match.  */
9071 		  break;
9072 
9073 		case 't': /* Coprocessor register number.  */
9074 		  if (s[0] == '$' && ISDIGIT (s[1]))
9075 		    {
9076 		      ++s;
9077 		      regno = 0;
9078 		      do
9079 		        {
9080 			  regno *= 10;
9081 			  regno += *s - '0';
9082 			  ++s;
9083 			}
9084 		      while (ISDIGIT (*s));
9085 		      if (regno > 31)
9086 			as_bad (_("Invalid register number (%d)"), regno);
9087 		      else
9088 			{
9089 			  INSERT_OPERAND (RT, *ip, regno);
9090 			  continue;
9091 			}
9092 		    }
9093 		  else
9094 		    as_bad (_("Invalid coprocessor 0 register number"));
9095 		  break;
9096 
9097 		case 'x':
9098 		  /* bbit[01] and bbit[01]32 bit index.  Give error if index
9099 		     is not in the valid range.  */
9100 		  my_getExpression (&imm_expr, s);
9101 		  check_absolute_expr (ip, &imm_expr);
9102 		  if ((unsigned) imm_expr.X_add_number > 31)
9103 		    {
9104 		      as_bad (_("Improper bit index (%lu)"),
9105 			      (unsigned long) imm_expr.X_add_number);
9106 		      imm_expr.X_add_number = 0;
9107 		    }
9108 		  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9109 		  imm_expr.X_op = O_absent;
9110 		  s = expr_end;
9111 		  continue;
9112 
9113 		case 'X':
9114 		  /* bbit[01] bit index when bbit is used but we generate
9115 		     bbit[01]32 because the index is over 32.  Move to the
9116 		     next candidate if index is not in the valid range.  */
9117 		  my_getExpression (&imm_expr, s);
9118 		  check_absolute_expr (ip, &imm_expr);
9119 		  if ((unsigned) imm_expr.X_add_number < 32
9120 		      || (unsigned) imm_expr.X_add_number > 63)
9121 		    break;
9122 		  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9123 		  imm_expr.X_op = O_absent;
9124 		  s = expr_end;
9125 		  continue;
9126 
9127 		case 'p':
9128 		  /* cins, cins32, exts and exts32 position field.  Give error
9129 		     if it's not in the valid range.  */
9130 		  my_getExpression (&imm_expr, s);
9131 		  check_absolute_expr (ip, &imm_expr);
9132 		  if ((unsigned) imm_expr.X_add_number > 31)
9133 		    {
9134 		      as_bad (_("Improper position (%lu)"),
9135 			      (unsigned long) imm_expr.X_add_number);
9136 		      imm_expr.X_add_number = 0;
9137 		    }
9138 		  /* Make the pos explicit to simplify +S.  */
9139 		  lastpos = imm_expr.X_add_number + 32;
9140 		  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9141 		  imm_expr.X_op = O_absent;
9142 		  s = expr_end;
9143 		  continue;
9144 
9145 		case 'P':
9146 		  /* cins, cins32, exts and exts32 position field.  Move to
9147 		     the next candidate if it's not in the valid range.  */
9148 		  my_getExpression (&imm_expr, s);
9149 		  check_absolute_expr (ip, &imm_expr);
9150 		  if ((unsigned) imm_expr.X_add_number < 32
9151 		      || (unsigned) imm_expr.X_add_number > 63)
9152 		    break;
9153  		  lastpos = imm_expr.X_add_number;
9154 		  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9155 		  imm_expr.X_op = O_absent;
9156 		  s = expr_end;
9157 		  continue;
9158 
9159 		case 's':
9160 		  /* cins and exts length-minus-one field.  */
9161 		  my_getExpression (&imm_expr, s);
9162 		  check_absolute_expr (ip, &imm_expr);
9163 		  if ((unsigned long) imm_expr.X_add_number > 31)
9164 		    {
9165 		      as_bad (_("Improper size (%lu)"),
9166 			      (unsigned long) imm_expr.X_add_number);
9167 		      imm_expr.X_add_number = 0;
9168 		    }
9169 		  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9170 		  imm_expr.X_op = O_absent;
9171 		  s = expr_end;
9172 		  continue;
9173 
9174 		case 'S':
9175 		  /* cins32/exts32 and cins/exts aliasing cint32/exts32
9176 		     length-minus-one field.  */
9177 		  my_getExpression (&imm_expr, s);
9178 		  check_absolute_expr (ip, &imm_expr);
9179 		  if ((long) imm_expr.X_add_number < 0
9180 		      || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9181 		    {
9182 		      as_bad (_("Improper size (%lu)"),
9183 			      (unsigned long) imm_expr.X_add_number);
9184 		      imm_expr.X_add_number = 0;
9185 		    }
9186 		  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9187 		  imm_expr.X_op = O_absent;
9188 		  s = expr_end;
9189 		  continue;
9190 
9191 		case 'Q':
9192 		  /* seqi/snei immediate field.  */
9193 		  my_getExpression (&imm_expr, s);
9194 		  check_absolute_expr (ip, &imm_expr);
9195 		  if ((long) imm_expr.X_add_number < -512
9196 		      || (long) imm_expr.X_add_number >= 512)
9197 		    {
9198 		      as_bad (_("Improper immediate (%ld)"),
9199 			       (long) imm_expr.X_add_number);
9200 		      imm_expr.X_add_number = 0;
9201 		    }
9202 		  INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9203 		  imm_expr.X_op = O_absent;
9204 		  s = expr_end;
9205 		  continue;
9206 
9207 		default:
9208 		  as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9209 		    *args, insn->name, insn->args);
9210 		  /* Further processing is fruitless.  */
9211 		  return;
9212 		}
9213 	      break;
9214 
9215 	    case '<':		/* must be at least one digit */
9216 	      /*
9217 	       * According to the manual, if the shift amount is greater
9218 	       * than 31 or less than 0, then the shift amount should be
9219 	       * mod 32.  In reality the mips assembler issues an error.
9220 	       * We issue a warning and mask out all but the low 5 bits.
9221 	       */
9222 	      my_getExpression (&imm_expr, s);
9223 	      check_absolute_expr (ip, &imm_expr);
9224 	      if ((unsigned long) imm_expr.X_add_number > 31)
9225 		as_warn (_("Improper shift amount (%lu)"),
9226 			 (unsigned long) imm_expr.X_add_number);
9227 	      INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9228 	      imm_expr.X_op = O_absent;
9229 	      s = expr_end;
9230 	      continue;
9231 
9232 	    case '>':		/* shift amount minus 32 */
9233 	      my_getExpression (&imm_expr, s);
9234 	      check_absolute_expr (ip, &imm_expr);
9235 	      if ((unsigned long) imm_expr.X_add_number < 32
9236 		  || (unsigned long) imm_expr.X_add_number > 63)
9237 		break;
9238 	      INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9239 	      imm_expr.X_op = O_absent;
9240 	      s = expr_end;
9241 	      continue;
9242 
9243 	    case 'k':		/* cache code */
9244 	    case 'h':		/* prefx code */
9245 	      my_getExpression (&imm_expr, s);
9246 	      check_absolute_expr (ip, &imm_expr);
9247 	      if ((unsigned long) imm_expr.X_add_number > 31)
9248 		as_warn (_("Invalid value for `%s' (%lu)"),
9249 			 ip->insn_mo->name,
9250 			 (unsigned long) imm_expr.X_add_number);
9251 	      if (*args == 'k')
9252 		INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9253 	      else
9254 		INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9255 	      imm_expr.X_op = O_absent;
9256 	      s = expr_end;
9257 	      continue;
9258 
9259 	    case 'c':		/* break code */
9260 	      my_getExpression (&imm_expr, s);
9261 	      check_absolute_expr (ip, &imm_expr);
9262 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9263 		as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9264 			 ip->insn_mo->name,
9265 			 (unsigned long) imm_expr.X_add_number);
9266 	      INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9267 	      imm_expr.X_op = O_absent;
9268 	      s = expr_end;
9269 	      continue;
9270 
9271 	    case 'q':		/* lower break code */
9272 	      my_getExpression (&imm_expr, s);
9273 	      check_absolute_expr (ip, &imm_expr);
9274 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9275 		as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9276 			 ip->insn_mo->name,
9277 			 (unsigned long) imm_expr.X_add_number);
9278 	      INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9279 	      imm_expr.X_op = O_absent;
9280 	      s = expr_end;
9281 	      continue;
9282 
9283 	    case 'B':           /* 20-bit syscall/break code.  */
9284 	      my_getExpression (&imm_expr, s);
9285 	      check_absolute_expr (ip, &imm_expr);
9286 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9287 		as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9288 			 ip->insn_mo->name,
9289 			 (unsigned long) imm_expr.X_add_number);
9290 	      INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9291 	      imm_expr.X_op = O_absent;
9292 	      s = expr_end;
9293 	      continue;
9294 
9295 	    case 'C':           /* Coprocessor code */
9296 	      my_getExpression (&imm_expr, s);
9297 	      check_absolute_expr (ip, &imm_expr);
9298 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9299 		{
9300 		  as_warn (_("Coproccesor code > 25 bits (%lu)"),
9301 			   (unsigned long) imm_expr.X_add_number);
9302 		  imm_expr.X_add_number &= OP_MASK_COPZ;
9303 		}
9304 	      INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9305 	      imm_expr.X_op = O_absent;
9306 	      s = expr_end;
9307 	      continue;
9308 
9309 	    case 'J':           /* 19-bit wait code.  */
9310 	      my_getExpression (&imm_expr, s);
9311 	      check_absolute_expr (ip, &imm_expr);
9312 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9313 		{
9314 		  as_warn (_("Illegal 19-bit code (%lu)"),
9315 			   (unsigned long) imm_expr.X_add_number);
9316 		  imm_expr.X_add_number &= OP_MASK_CODE19;
9317 		}
9318 	      INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9319 	      imm_expr.X_op = O_absent;
9320 	      s = expr_end;
9321 	      continue;
9322 
9323 	    case 'P':		/* Performance register.  */
9324 	      my_getExpression (&imm_expr, s);
9325 	      check_absolute_expr (ip, &imm_expr);
9326 	      if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9327 		as_warn (_("Invalid performance register (%lu)"),
9328 			 (unsigned long) imm_expr.X_add_number);
9329 	      INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9330 	      imm_expr.X_op = O_absent;
9331 	      s = expr_end;
9332 	      continue;
9333 
9334 	    case 'G':		/* Coprocessor destination register.  */
9335 	      if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9336 		ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9337 	      else
9338 		ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9339 	      INSERT_OPERAND (RD, *ip, regno);
9340 	      if (ok)
9341 		{
9342 		  lastregno = regno;
9343 		  continue;
9344 		}
9345 	      else
9346 		break;
9347 
9348 	    case 'b':		/* base register */
9349 	    case 'd':		/* destination register */
9350 	    case 's':		/* source register */
9351 	    case 't':		/* target register */
9352 	    case 'r':		/* both target and source */
9353 	    case 'v':		/* both dest and source */
9354 	    case 'w':		/* both dest and target */
9355 	    case 'E':		/* coprocessor target register */
9356 	    case 'K':		/* 'rdhwr' destination register */
9357 	    case 'x':		/* ignore register name */
9358 	    case 'z':		/* must be zero register */
9359 	    case 'U':           /* destination register (clo/clz).  */
9360 	    case 'g':		/* coprocessor destination register */
9361 	      s_reset = s;
9362 	      if (*args == 'E' || *args == 'K')
9363 		ok = reg_lookup (&s, RTYPE_NUM, &regno);
9364 	      else
9365 		{
9366 		  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9367 		  if (regno == AT && mips_opts.at)
9368 		    {
9369 		      if (mips_opts.at == ATREG)
9370 			as_warn (_("used $at without \".set noat\""));
9371 		      else
9372 			as_warn (_("used $%u with \".set at=$%u\""),
9373 				 regno, mips_opts.at);
9374 		    }
9375 		}
9376 	      if (ok)
9377 		{
9378 		  c = *args;
9379 		  if (*s == ' ')
9380 		    ++s;
9381 		  if (args[1] != *s)
9382 		    {
9383 		      if (c == 'r' || c == 'v' || c == 'w')
9384 			{
9385 			  regno = lastregno;
9386 			  s = s_reset;
9387 			  ++args;
9388 			}
9389 		    }
9390 		  /* 'z' only matches $0.  */
9391 		  if (c == 'z' && regno != 0)
9392 		    break;
9393 
9394 		  if (c == 's' && !strcmp (ip->insn_mo->name, "jalr"))
9395 		    {
9396 		      if (regno == lastregno)
9397 		        {
9398 			  insn_error = _("source and destinationations must be different");
9399 			  continue;
9400 		        }
9401 		      if (regno == 31 && lastregno == 0)
9402 		        {
9403 			  insn_error = _("a destination register must be supplied");
9404 			  continue;
9405 		        }
9406 		    }
9407 	/* Now that we have assembled one operand, we use the args string
9408 	 * to figure out where it goes in the instruction.  */
9409 		  switch (c)
9410 		    {
9411 		    case 'r':
9412 		    case 's':
9413 		    case 'v':
9414 		    case 'b':
9415 		      INSERT_OPERAND (RS, *ip, regno);
9416 		      break;
9417 		    case 'd':
9418 		    case 'G':
9419 		    case 'K':
9420 		    case 'g':
9421 		      INSERT_OPERAND (RD, *ip, regno);
9422 		      break;
9423 		    case 'U':
9424 		      INSERT_OPERAND (RD, *ip, regno);
9425 		      INSERT_OPERAND (RT, *ip, regno);
9426 		      break;
9427 		    case 'w':
9428 		    case 't':
9429 		    case 'E':
9430 		      INSERT_OPERAND (RT, *ip, regno);
9431 		      break;
9432 		    case 'x':
9433 		      /* This case exists because on the r3000 trunc
9434 			 expands into a macro which requires a gp
9435 			 register.  On the r6000 or r4000 it is
9436 			 assembled into a single instruction which
9437 			 ignores the register.  Thus the insn version
9438 			 is MIPS_ISA2 and uses 'x', and the macro
9439 			 version is MIPS_ISA1 and uses 't'.  */
9440 		      break;
9441 		    case 'z':
9442 		      /* This case is for the div instruction, which
9443 			 acts differently if the destination argument
9444 			 is $0.  This only matches $0, and is checked
9445 			 outside the switch.  */
9446 		      break;
9447 		    case 'D':
9448 		      /* Itbl operand; not yet implemented. FIXME ?? */
9449 		      break;
9450 		      /* What about all other operands like 'i', which
9451 			 can be specified in the opcode table? */
9452 		    }
9453 		  lastregno = regno;
9454 		  continue;
9455 		}
9456 	      switch (*args++)
9457 		{
9458 		case 'r':
9459 		case 'v':
9460 		  INSERT_OPERAND (RS, *ip, lastregno);
9461 		  continue;
9462 		case 'w':
9463 		  INSERT_OPERAND (RT, *ip, lastregno);
9464 		  continue;
9465 		}
9466 	      break;
9467 
9468 	    case 'O':		/* MDMX alignment immediate constant.  */
9469 	      my_getExpression (&imm_expr, s);
9470 	      check_absolute_expr (ip, &imm_expr);
9471 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9472 		as_warn ("Improper align amount (%ld), using low bits",
9473 			 (long) imm_expr.X_add_number);
9474 	      INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9475 	      imm_expr.X_op = O_absent;
9476 	      s = expr_end;
9477 	      continue;
9478 
9479 	    case 'Q':		/* MDMX vector, element sel, or const.  */
9480 	      if (s[0] != '$')
9481 		{
9482 		  /* MDMX Immediate.  */
9483 		  my_getExpression (&imm_expr, s);
9484 		  check_absolute_expr (ip, &imm_expr);
9485 		  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9486 		    as_warn (_("Invalid MDMX Immediate (%ld)"),
9487 			     (long) imm_expr.X_add_number);
9488 		  INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9489 		  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9490 		    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9491 		  else
9492 		    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9493 		  imm_expr.X_op = O_absent;
9494 		  s = expr_end;
9495 		  continue;
9496 		}
9497 	      /* Not MDMX Immediate.  Fall through.  */
9498 	    case 'X':           /* MDMX destination register.  */
9499 	    case 'Y':           /* MDMX source register.  */
9500 	    case 'Z':           /* MDMX target register.  */
9501 	      is_mdmx = 1;
9502 	    case 'D':		/* floating point destination register */
9503 	    case 'S':		/* floating point source register */
9504 	    case 'T':		/* floating point target register */
9505 	    case 'R':		/* floating point source register */
9506 	    case 'V':
9507 	    case 'W':
9508 	      rtype = RTYPE_FPU;
9509 	      if (is_mdmx
9510 		  || (mips_opts.ase_mdmx
9511 		      && (ip->insn_mo->pinfo & FP_D)
9512 		      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9513 						| INSN_COPROC_MEMORY_DELAY
9514 						| INSN_LOAD_COPROC_DELAY
9515 						| INSN_LOAD_MEMORY_DELAY
9516 						| INSN_STORE_MEMORY))))
9517 		rtype |= RTYPE_VEC;
9518 	      s_reset = s;
9519 	      if (reg_lookup (&s, rtype, &regno))
9520 		{
9521 		  if ((regno & 1) != 0
9522 		      && HAVE_32BIT_FPRS
9523 		      && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9524 		    as_warn (_("Float register should be even, was %d"),
9525 			     regno);
9526 
9527 		  c = *args;
9528 		  if (*s == ' ')
9529 		    ++s;
9530 		  if (args[1] != *s)
9531 		    {
9532 		      if (c == 'V' || c == 'W')
9533 			{
9534 			  regno = lastregno;
9535 			  s = s_reset;
9536 			  ++args;
9537 			}
9538 		    }
9539 		  switch (c)
9540 		    {
9541 		    case 'D':
9542 		    case 'X':
9543 		      INSERT_OPERAND (FD, *ip, regno);
9544 		      break;
9545 		    case 'V':
9546 		    case 'S':
9547 		    case 'Y':
9548 		      INSERT_OPERAND (FS, *ip, regno);
9549 		      break;
9550 		    case 'Q':
9551 		      /* This is like 'Z', but also needs to fix the MDMX
9552 			 vector/scalar select bits.  Note that the
9553 			 scalar immediate case is handled above.  */
9554 		      if (*s == '[')
9555 			{
9556 			  int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9557 			  int max_el = (is_qh ? 3 : 7);
9558 			  s++;
9559 			  my_getExpression(&imm_expr, s);
9560 			  check_absolute_expr (ip, &imm_expr);
9561 			  s = expr_end;
9562 			  if (imm_expr.X_add_number > max_el)
9563 			    as_bad(_("Bad element selector %ld"),
9564 				   (long) imm_expr.X_add_number);
9565 			  imm_expr.X_add_number &= max_el;
9566 			  ip->insn_opcode |= (imm_expr.X_add_number
9567 					      << (OP_SH_VSEL +
9568 						  (is_qh ? 2 : 1)));
9569 			  imm_expr.X_op = O_absent;
9570 			  if (*s != ']')
9571 			    as_warn(_("Expecting ']' found '%s'"), s);
9572 			  else
9573 			    s++;
9574 			}
9575 		      else
9576                         {
9577                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9578                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9579 						<< OP_SH_VSEL);
9580 			  else
9581 			    ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9582 						OP_SH_VSEL);
9583 			}
9584                       /* Fall through */
9585 		    case 'W':
9586 		    case 'T':
9587 		    case 'Z':
9588 		      INSERT_OPERAND (FT, *ip, regno);
9589 		      break;
9590 		    case 'R':
9591 		      INSERT_OPERAND (FR, *ip, regno);
9592 		      break;
9593 		    }
9594 		  lastregno = regno;
9595 		  continue;
9596 		}
9597 
9598 	      switch (*args++)
9599 		{
9600 		case 'V':
9601 		  INSERT_OPERAND (FS, *ip, lastregno);
9602 		  continue;
9603 		case 'W':
9604 		  INSERT_OPERAND (FT, *ip, lastregno);
9605 		  continue;
9606 		}
9607 	      break;
9608 
9609 	    case 'I':
9610 	      my_getExpression (&imm_expr, s);
9611 	      if (imm_expr.X_op != O_big
9612 		  && imm_expr.X_op != O_constant)
9613 		insn_error = _("absolute expression required");
9614 	      if (HAVE_32BIT_GPRS)
9615 		normalize_constant_expr (&imm_expr);
9616 	      s = expr_end;
9617 	      continue;
9618 
9619 	    case 'A':
9620 	      my_getExpression (&offset_expr, s);
9621 	      normalize_address_expr (&offset_expr);
9622 	      *imm_reloc = BFD_RELOC_32;
9623 	      s = expr_end;
9624 	      continue;
9625 
9626 	    case 'F':
9627 	    case 'L':
9628 	    case 'f':
9629 	    case 'l':
9630 	      {
9631 		int f64;
9632 		int using_gprs;
9633 		char *save_in;
9634 		char *err;
9635 		unsigned char temp[8];
9636 		int len;
9637 		unsigned int length;
9638 		segT seg;
9639 		subsegT subseg;
9640 		char *p;
9641 
9642 		/* These only appear as the last operand in an
9643 		   instruction, and every instruction that accepts
9644 		   them in any variant accepts them in all variants.
9645 		   This means we don't have to worry about backing out
9646 		   any changes if the instruction does not match.
9647 
9648 		   The difference between them is the size of the
9649 		   floating point constant and where it goes.  For 'F'
9650 		   and 'L' the constant is 64 bits; for 'f' and 'l' it
9651 		   is 32 bits.  Where the constant is placed is based
9652 		   on how the MIPS assembler does things:
9653 		    F -- .rdata
9654 		    L -- .lit8
9655 		    f -- immediate value
9656 		    l -- .lit4
9657 
9658 		    The .lit4 and .lit8 sections are only used if
9659 		    permitted by the -G argument.
9660 
9661 		    The code below needs to know whether the target register
9662 		    is 32 or 64 bits wide.  It relies on the fact 'f' and
9663 		    'F' are used with GPR-based instructions and 'l' and
9664 		    'L' are used with FPR-based instructions.  */
9665 
9666 		f64 = *args == 'F' || *args == 'L';
9667 		using_gprs = *args == 'F' || *args == 'f';
9668 
9669 		save_in = input_line_pointer;
9670 		input_line_pointer = s;
9671 		err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9672 		length = len;
9673 		s = input_line_pointer;
9674 		input_line_pointer = save_in;
9675 		if (err != NULL && *err != '\0')
9676 		  {
9677 		    as_bad (_("Bad floating point constant: %s"), err);
9678 		    memset (temp, '\0', sizeof temp);
9679 		    length = f64 ? 8 : 4;
9680 		  }
9681 
9682 		assert (length == (unsigned) (f64 ? 8 : 4));
9683 
9684 		if (*args == 'f'
9685 		    || (*args == 'l'
9686 			&& (g_switch_value < 4
9687 			    || (temp[0] == 0 && temp[1] == 0)
9688 			    || (temp[2] == 0 && temp[3] == 0))))
9689 		  {
9690 		    imm_expr.X_op = O_constant;
9691 		    if (! target_big_endian)
9692 		      imm_expr.X_add_number = bfd_getl32 (temp);
9693 		    else
9694 		      imm_expr.X_add_number = bfd_getb32 (temp);
9695 		  }
9696 		else if (length > 4
9697 			 && ! mips_disable_float_construction
9698 			 /* Constants can only be constructed in GPRs and
9699 			    copied to FPRs if the GPRs are at least as wide
9700 			    as the FPRs.  Force the constant into memory if
9701 			    we are using 64-bit FPRs but the GPRs are only
9702 			    32 bits wide.  */
9703 			 && (using_gprs
9704 			     || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9705 			 && ((temp[0] == 0 && temp[1] == 0)
9706 			     || (temp[2] == 0 && temp[3] == 0))
9707 			 && ((temp[4] == 0 && temp[5] == 0)
9708 			     || (temp[6] == 0 && temp[7] == 0)))
9709 		  {
9710 		    /* The value is simple enough to load with a couple of
9711                        instructions.  If using 32-bit registers, set
9712                        imm_expr to the high order 32 bits and offset_expr to
9713                        the low order 32 bits.  Otherwise, set imm_expr to
9714                        the entire 64 bit constant.  */
9715 		    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9716 		      {
9717 			imm_expr.X_op = O_constant;
9718 			offset_expr.X_op = O_constant;
9719 			if (! target_big_endian)
9720 			  {
9721 			    imm_expr.X_add_number = bfd_getl32 (temp + 4);
9722 			    offset_expr.X_add_number = bfd_getl32 (temp);
9723 			  }
9724 			else
9725 			  {
9726 			    imm_expr.X_add_number = bfd_getb32 (temp);
9727 			    offset_expr.X_add_number = bfd_getb32 (temp + 4);
9728 			  }
9729 			if (offset_expr.X_add_number == 0)
9730 			  offset_expr.X_op = O_absent;
9731 		      }
9732 		    else if (sizeof (imm_expr.X_add_number) > 4)
9733 		      {
9734 			imm_expr.X_op = O_constant;
9735 			if (! target_big_endian)
9736 			  imm_expr.X_add_number = bfd_getl64 (temp);
9737 			else
9738 			  imm_expr.X_add_number = bfd_getb64 (temp);
9739 		      }
9740 		    else
9741 		      {
9742 			imm_expr.X_op = O_big;
9743 			imm_expr.X_add_number = 4;
9744 			if (! target_big_endian)
9745 			  {
9746 			    generic_bignum[0] = bfd_getl16 (temp);
9747 			    generic_bignum[1] = bfd_getl16 (temp + 2);
9748 			    generic_bignum[2] = bfd_getl16 (temp + 4);
9749 			    generic_bignum[3] = bfd_getl16 (temp + 6);
9750 			  }
9751 			else
9752 			  {
9753 			    generic_bignum[0] = bfd_getb16 (temp + 6);
9754 			    generic_bignum[1] = bfd_getb16 (temp + 4);
9755 			    generic_bignum[2] = bfd_getb16 (temp + 2);
9756 			    generic_bignum[3] = bfd_getb16 (temp);
9757 			  }
9758 		      }
9759 		  }
9760 		else
9761 		  {
9762 		    const char *newname;
9763 		    segT new_seg;
9764 
9765 		    /* Switch to the right section.  */
9766 		    seg = now_seg;
9767 		    subseg = now_subseg;
9768 		    switch (*args)
9769 		      {
9770 		      default: /* unused default case avoids warnings.  */
9771 		      case 'L':
9772 			newname = RDATA_SECTION_NAME;
9773 			if (g_switch_value >= 8)
9774 			  newname = ".lit8";
9775 			break;
9776 		      case 'F':
9777 			newname = RDATA_SECTION_NAME;
9778 			break;
9779 		      case 'l':
9780 			assert (g_switch_value >= 4);
9781 			newname = ".lit4";
9782 			break;
9783 		      }
9784 		    new_seg = subseg_new (newname, (subsegT) 0);
9785 		    if (IS_ELF)
9786 		      bfd_set_section_flags (stdoutput, new_seg,
9787 					     (SEC_ALLOC
9788 					      | SEC_LOAD
9789 					      | SEC_READONLY
9790 					      | SEC_DATA));
9791 		    frag_align (*args == 'l' ? 2 : 3, 0, 0);
9792 		    if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9793 		      record_alignment (new_seg, 4);
9794 		    else
9795 		      record_alignment (new_seg, *args == 'l' ? 2 : 3);
9796 		    if (seg == now_seg)
9797 		      as_bad (_("Can't use floating point insn in this section"));
9798 
9799 		    /* Set the argument to the current address in the
9800 		       section.  */
9801 		    offset_expr.X_op = O_symbol;
9802 		    offset_expr.X_add_symbol =
9803 		      symbol_new ("L0\001", now_seg,
9804 				  (valueT) frag_now_fix (), frag_now);
9805 		    offset_expr.X_add_number = 0;
9806 
9807 		    /* Put the floating point number into the section.  */
9808 		    p = frag_more ((int) length);
9809 		    memcpy (p, temp, length);
9810 
9811 		    /* Switch back to the original section.  */
9812 		    subseg_set (seg, subseg);
9813 		  }
9814 	      }
9815 	      continue;
9816 
9817 	    case 'i':		/* 16 bit unsigned immediate */
9818 	    case 'j':		/* 16 bit signed immediate */
9819 	      *imm_reloc = BFD_RELOC_LO16;
9820 	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9821 		{
9822 		  int more;
9823 		  offsetT minval, maxval;
9824 
9825 		  more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9826 			  && strcmp (insn->name, insn[1].name) == 0);
9827 
9828 		  /* If the expression was written as an unsigned number,
9829 		     only treat it as signed if there are no more
9830 		     alternatives.  */
9831 		  if (more
9832 		      && *args == 'j'
9833 		      && sizeof (imm_expr.X_add_number) <= 4
9834 		      && imm_expr.X_op == O_constant
9835 		      && imm_expr.X_add_number < 0
9836 		      && imm_expr.X_unsigned
9837 		      && HAVE_64BIT_GPRS)
9838 		    break;
9839 
9840 		  /* For compatibility with older assemblers, we accept
9841 		     0x8000-0xffff as signed 16-bit numbers when only
9842 		     signed numbers are allowed.  */
9843 		  if (*args == 'i')
9844 		    minval = 0, maxval = 0xffff;
9845 		  else if (more)
9846 		    minval = -0x8000, maxval = 0x7fff;
9847 		  else
9848 		    minval = -0x8000, maxval = 0xffff;
9849 
9850 		  if (imm_expr.X_op != O_constant
9851 		      || imm_expr.X_add_number < minval
9852 		      || imm_expr.X_add_number > maxval)
9853 		    {
9854 		      if (more)
9855 			break;
9856 		      if (imm_expr.X_op == O_constant
9857 			  || imm_expr.X_op == O_big)
9858 			as_bad (_("expression out of range"));
9859 		    }
9860 		}
9861 	      s = expr_end;
9862 	      continue;
9863 
9864 	    case 'o':		/* 16 bit offset */
9865 	      /* Check whether there is only a single bracketed expression
9866 		 left.  If so, it must be the base register and the
9867 		 constant must be zero.  */
9868 	      if (*s == '(' && strchr (s + 1, '(') == 0)
9869 		{
9870 		  offset_expr.X_op = O_constant;
9871 		  offset_expr.X_add_number = 0;
9872 		  continue;
9873 		}
9874 
9875 	      /* If this value won't fit into a 16 bit offset, then go
9876 		 find a macro that will generate the 32 bit offset
9877 		 code pattern.  */
9878 	      if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9879 		  && (offset_expr.X_op != O_constant
9880 		      || offset_expr.X_add_number >= 0x8000
9881 		      || offset_expr.X_add_number < -0x8000))
9882 		break;
9883 
9884 	      s = expr_end;
9885 	      continue;
9886 
9887 	    case 'p':		/* pc relative offset */
9888 	      *offset_reloc = BFD_RELOC_16_PCREL_S2;
9889 	      my_getExpression (&offset_expr, s);
9890 	      s = expr_end;
9891 	      continue;
9892 
9893 	    case 'u':		/* upper 16 bits */
9894 	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9895 		  && imm_expr.X_op == O_constant
9896 		  && (imm_expr.X_add_number < 0
9897 		      || imm_expr.X_add_number >= 0x10000))
9898 		as_bad (_("lui expression not in range 0..65535"));
9899 	      s = expr_end;
9900 	      continue;
9901 
9902 	    case 'a':		/* 26 bit address */
9903 	      my_getExpression (&offset_expr, s);
9904 	      s = expr_end;
9905 	      *offset_reloc = BFD_RELOC_MIPS_JMP;
9906 	      continue;
9907 
9908 	    case 'N':		/* 3 bit branch condition code */
9909 	    case 'M':		/* 3 bit compare condition code */
9910 	      rtype = RTYPE_CCC;
9911 	      if (ip->insn_mo->pinfo & (FP_D| FP_S))
9912 		rtype |= RTYPE_FCC;
9913 	      if (!reg_lookup (&s, rtype, &regno))
9914 		break;
9915 	      if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9916 		   || strcmp(str + strlen(str) - 5, "any2f") == 0
9917 		   || strcmp(str + strlen(str) - 5, "any2t") == 0)
9918 		  && (regno & 1) != 0)
9919 		as_warn(_("Condition code register should be even for %s, was %d"),
9920 			str, regno);
9921 	      if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9922 		   || strcmp(str + strlen(str) - 5, "any4t") == 0)
9923 		  && (regno & 3) != 0)
9924 		as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9925 			str, regno);
9926 	      if (*args == 'N')
9927 		INSERT_OPERAND (BCC, *ip, regno);
9928 	      else
9929 		INSERT_OPERAND (CCC, *ip, regno);
9930 	      continue;
9931 
9932 	    case 'H':
9933 	      if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9934 		s += 2;
9935 	      if (ISDIGIT (*s))
9936 		{
9937 		  c = 0;
9938 		  do
9939 		    {
9940 		      c *= 10;
9941 		      c += *s - '0';
9942 		      ++s;
9943 		    }
9944 		  while (ISDIGIT (*s));
9945 		}
9946 	      else
9947 		c = 8; /* Invalid sel value.  */
9948 
9949 	      if (c > 7)
9950 		as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9951 	      ip->insn_opcode |= c;
9952 	      continue;
9953 
9954 	    case 'e':
9955 	      /* Must be at least one digit.  */
9956 	      my_getExpression (&imm_expr, s);
9957 	      check_absolute_expr (ip, &imm_expr);
9958 
9959 	      if ((unsigned long) imm_expr.X_add_number
9960 		  > (unsigned long) OP_MASK_VECBYTE)
9961 		{
9962 		  as_bad (_("bad byte vector index (%ld)"),
9963 			   (long) imm_expr.X_add_number);
9964 		  imm_expr.X_add_number = 0;
9965 		}
9966 
9967 	      INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9968 	      imm_expr.X_op = O_absent;
9969 	      s = expr_end;
9970 	      continue;
9971 
9972 	    case '%':
9973 	      my_getExpression (&imm_expr, s);
9974 	      check_absolute_expr (ip, &imm_expr);
9975 
9976 	      if ((unsigned long) imm_expr.X_add_number
9977 		  > (unsigned long) OP_MASK_VECALIGN)
9978 		{
9979 		  as_bad (_("bad byte vector index (%ld)"),
9980 			   (long) imm_expr.X_add_number);
9981 		  imm_expr.X_add_number = 0;
9982 		}
9983 
9984 	      INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9985 	      imm_expr.X_op = O_absent;
9986 	      s = expr_end;
9987 	      continue;
9988 
9989 	    default:
9990 	      as_bad (_("bad char = '%c'\n"), *args);
9991 	      internalError ();
9992 	    }
9993 	  break;
9994 	}
9995       /* Args don't match.  */
9996       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9997 	  !strcmp (insn->name, insn[1].name))
9998 	{
9999 	  ++insn;
10000 	  s = argsStart;
10001 	  insn_error = _("illegal operands");
10002 	  continue;
10003 	}
10004       if (save_c)
10005 	*(--argsStart) = save_c;
10006       insn_error = _("illegal operands");
10007       return;
10008     }
10009 }
10010 
10011 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10012 
10013 /* This routine assembles an instruction into its binary format when
10014    assembling for the mips16.  As a side effect, it sets one of the
10015    global variables imm_reloc or offset_reloc to the type of
10016    relocation to do if one of the operands is an address expression.
10017    It also sets mips16_small and mips16_ext if the user explicitly
10018    requested a small or extended instruction.  */
10019 
10020 static void
10021 mips16_ip (char *str, struct mips_cl_insn *ip)
10022 {
10023   char *s;
10024   const char *args;
10025   struct mips_opcode *insn;
10026   char *argsstart;
10027   unsigned int regno;
10028   unsigned int lastregno = 0;
10029   char *s_reset;
10030   size_t i;
10031 
10032   insn_error = NULL;
10033 
10034   mips16_small = FALSE;
10035   mips16_ext = FALSE;
10036 
10037   for (s = str; ISLOWER (*s); ++s)
10038     ;
10039   switch (*s)
10040     {
10041     case '\0':
10042       break;
10043 
10044     case ' ':
10045       *s++ = '\0';
10046       break;
10047 
10048     case '.':
10049       if (s[1] == 't' && s[2] == ' ')
10050 	{
10051 	  *s = '\0';
10052 	  mips16_small = TRUE;
10053 	  s += 3;
10054 	  break;
10055 	}
10056       else if (s[1] == 'e' && s[2] == ' ')
10057 	{
10058 	  *s = '\0';
10059 	  mips16_ext = TRUE;
10060 	  s += 3;
10061 	  break;
10062 	}
10063       /* Fall through.  */
10064     default:
10065       insn_error = _("unknown opcode");
10066       return;
10067     }
10068 
10069   if (mips_opts.noautoextend && ! mips16_ext)
10070     mips16_small = TRUE;
10071 
10072   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10073     {
10074       insn_error = _("unrecognized opcode");
10075       return;
10076     }
10077 
10078   argsstart = s;
10079   for (;;)
10080     {
10081       bfd_boolean ok;
10082 
10083       assert (strcmp (insn->name, str) == 0);
10084 
10085       ok = is_opcode_valid_16 (insn);
10086       if (! ok)
10087 	{
10088 	  if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10089 	      && strcmp (insn->name, insn[1].name) == 0)
10090 	    {
10091 	      ++insn;
10092 	      continue;
10093 	    }
10094 	  else
10095 	    {
10096 	      if (!insn_error)
10097 		{
10098 		  static char buf[100];
10099 		  sprintf (buf,
10100 			   _("opcode not supported on this processor: %s (%s)"),
10101 			   mips_cpu_info_from_arch (mips_opts.arch)->name,
10102 			   mips_cpu_info_from_isa (mips_opts.isa)->name);
10103 		  insn_error = buf;
10104 		}
10105 	      return;
10106 	    }
10107 	}
10108 
10109       create_insn (ip, insn);
10110       imm_expr.X_op = O_absent;
10111       imm_reloc[0] = BFD_RELOC_UNUSED;
10112       imm_reloc[1] = BFD_RELOC_UNUSED;
10113       imm_reloc[2] = BFD_RELOC_UNUSED;
10114       imm2_expr.X_op = O_absent;
10115       offset_expr.X_op = O_absent;
10116       offset_reloc[0] = BFD_RELOC_UNUSED;
10117       offset_reloc[1] = BFD_RELOC_UNUSED;
10118       offset_reloc[2] = BFD_RELOC_UNUSED;
10119       for (args = insn->args; 1; ++args)
10120 	{
10121 	  int c;
10122 
10123 	  if (*s == ' ')
10124 	    ++s;
10125 
10126 	  /* In this switch statement we call break if we did not find
10127              a match, continue if we did find a match, or return if we
10128              are done.  */
10129 
10130 	  c = *args;
10131 	  switch (c)
10132 	    {
10133 	    case '\0':
10134 	      if (*s == '\0')
10135 		{
10136 		  /* Stuff the immediate value in now, if we can.  */
10137 		  if (imm_expr.X_op == O_constant
10138 		      && *imm_reloc > BFD_RELOC_UNUSED
10139 		      && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10140 		      && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10141 		      && insn->pinfo != INSN_MACRO)
10142 		    {
10143 		      valueT tmp;
10144 
10145 		      switch (*offset_reloc)
10146 			{
10147 			  case BFD_RELOC_MIPS16_HI16_S:
10148 			    tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10149 			    break;
10150 
10151 			  case BFD_RELOC_MIPS16_HI16:
10152 			    tmp = imm_expr.X_add_number >> 16;
10153 			    break;
10154 
10155 			  case BFD_RELOC_MIPS16_LO16:
10156 			    tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10157 				  - 0x8000;
10158 			    break;
10159 
10160 			  case BFD_RELOC_UNUSED:
10161 			    tmp = imm_expr.X_add_number;
10162 			    break;
10163 
10164 			  default:
10165 			    internalError ();
10166 			}
10167 		      *offset_reloc = BFD_RELOC_UNUSED;
10168 
10169 		      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10170 				    tmp, TRUE, mips16_small,
10171 				    mips16_ext, &ip->insn_opcode,
10172 				    &ip->use_extend, &ip->extend);
10173 		      imm_expr.X_op = O_absent;
10174 		      *imm_reloc = BFD_RELOC_UNUSED;
10175 		    }
10176 
10177 		  return;
10178 		}
10179 	      break;
10180 
10181 	    case ',':
10182 	      if (*s++ == c)
10183 		continue;
10184 	      s--;
10185 	      switch (*++args)
10186 		{
10187 		case 'v':
10188 		  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10189 		  continue;
10190 		case 'w':
10191 		  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10192 		  continue;
10193 		}
10194 	      break;
10195 
10196 	    case '(':
10197 	    case ')':
10198 	      if (*s++ == c)
10199 		continue;
10200 	      break;
10201 
10202 	    case 'v':
10203 	    case 'w':
10204 	      if (s[0] != '$')
10205 		{
10206 		  if (c == 'v')
10207 		    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10208 		  else
10209 		    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10210 		  ++args;
10211 		  continue;
10212 		}
10213 	      /* Fall through.  */
10214 	    case 'x':
10215 	    case 'y':
10216 	    case 'z':
10217 	    case 'Z':
10218 	    case '0':
10219 	    case 'S':
10220 	    case 'R':
10221 	    case 'X':
10222 	    case 'Y':
10223   	      s_reset = s;
10224 	      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10225 		{
10226 		  if (c == 'v' || c == 'w')
10227 		    {
10228 		      if (c == 'v')
10229 			MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10230 		      else
10231 			MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10232 		      ++args;
10233 		      continue;
10234 		    }
10235 		  break;
10236 		}
10237 
10238 	      if (*s == ' ')
10239 		++s;
10240 	      if (args[1] != *s)
10241 		{
10242 		  if (c == 'v' || c == 'w')
10243 		    {
10244 		      regno = mips16_to_32_reg_map[lastregno];
10245 		      s = s_reset;
10246 		      ++args;
10247 		    }
10248 		}
10249 
10250 	      switch (c)
10251 		{
10252 		case 'x':
10253 		case 'y':
10254 		case 'z':
10255 		case 'v':
10256 		case 'w':
10257 		case 'Z':
10258 		  regno = mips32_to_16_reg_map[regno];
10259 		  break;
10260 
10261 		case '0':
10262 		  if (regno != 0)
10263 		    regno = ILLEGAL_REG;
10264 		  break;
10265 
10266 		case 'S':
10267 		  if (regno != SP)
10268 		    regno = ILLEGAL_REG;
10269 		  break;
10270 
10271 		case 'R':
10272 		  if (regno != RA)
10273 		    regno = ILLEGAL_REG;
10274 		  break;
10275 
10276 		case 'X':
10277 		case 'Y':
10278 		  if (regno == AT && mips_opts.at)
10279 		    {
10280 		      if (mips_opts.at == ATREG)
10281 			as_warn (_("used $at without \".set noat\""));
10282 		      else
10283 			as_warn (_("used $%u with \".set at=$%u\""),
10284 				 regno, mips_opts.at);
10285 		    }
10286 		  break;
10287 
10288 		default:
10289 		  internalError ();
10290 		}
10291 
10292 	      if (regno == ILLEGAL_REG)
10293 		break;
10294 
10295 	      switch (c)
10296 		{
10297 		case 'x':
10298 		case 'v':
10299 		  MIPS16_INSERT_OPERAND (RX, *ip, regno);
10300 		  break;
10301 		case 'y':
10302 		case 'w':
10303 		  MIPS16_INSERT_OPERAND (RY, *ip, regno);
10304 		  break;
10305 		case 'z':
10306 		  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10307 		  break;
10308 		case 'Z':
10309 		  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10310 		case '0':
10311 		case 'S':
10312 		case 'R':
10313 		  break;
10314 		case 'X':
10315 		  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10316 		  break;
10317 		case 'Y':
10318 		  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10319 		  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10320 		  break;
10321 		default:
10322 		  internalError ();
10323 		}
10324 
10325 	      lastregno = regno;
10326 	      continue;
10327 
10328 	    case 'P':
10329 	      if (strncmp (s, "$pc", 3) == 0)
10330 		{
10331 		  s += 3;
10332 		  continue;
10333 		}
10334 	      break;
10335 
10336 	    case '5':
10337 	    case 'H':
10338 	    case 'W':
10339 	    case 'D':
10340 	    case 'j':
10341 	    case 'V':
10342 	    case 'C':
10343 	    case 'U':
10344 	    case 'k':
10345 	    case 'K':
10346 	      i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10347 	      if (i > 0)
10348 		{
10349 		  if (imm_expr.X_op != O_constant)
10350 		    {
10351 		      mips16_ext = TRUE;
10352 		      ip->use_extend = TRUE;
10353 		      ip->extend = 0;
10354 		    }
10355 		  else
10356 		    {
10357 		      /* We need to relax this instruction.  */
10358 		      *offset_reloc = *imm_reloc;
10359 		      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10360 		    }
10361 		  s = expr_end;
10362 		  continue;
10363 		}
10364 	      *imm_reloc = BFD_RELOC_UNUSED;
10365 	      /* Fall through.  */
10366 	    case '<':
10367 	    case '>':
10368 	    case '[':
10369 	    case ']':
10370 	    case '4':
10371 	    case '8':
10372 	      my_getExpression (&imm_expr, s);
10373 	      if (imm_expr.X_op == O_register)
10374 		{
10375 		  /* What we thought was an expression turned out to
10376                      be a register.  */
10377 
10378 		  if (s[0] == '(' && args[1] == '(')
10379 		    {
10380 		      /* It looks like the expression was omitted
10381 			 before a register indirection, which means
10382 			 that the expression is implicitly zero.  We
10383 			 still set up imm_expr, so that we handle
10384 			 explicit extensions correctly.  */
10385 		      imm_expr.X_op = O_constant;
10386 		      imm_expr.X_add_number = 0;
10387 		      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10388 		      continue;
10389 		    }
10390 
10391 		  break;
10392 		}
10393 
10394 	      /* We need to relax this instruction.  */
10395 	      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10396 	      s = expr_end;
10397 	      continue;
10398 
10399 	    case 'p':
10400 	    case 'q':
10401 	    case 'A':
10402 	    case 'B':
10403 	    case 'E':
10404 	      /* We use offset_reloc rather than imm_reloc for the PC
10405                  relative operands.  This lets macros with both
10406                  immediate and address operands work correctly.  */
10407 	      my_getExpression (&offset_expr, s);
10408 
10409 	      if (offset_expr.X_op == O_register)
10410 		break;
10411 
10412 	      /* We need to relax this instruction.  */
10413 	      *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10414 	      s = expr_end;
10415 	      continue;
10416 
10417 	    case '6':		/* break code */
10418 	      my_getExpression (&imm_expr, s);
10419 	      check_absolute_expr (ip, &imm_expr);
10420 	      if ((unsigned long) imm_expr.X_add_number > 63)
10421 		as_warn (_("Invalid value for `%s' (%lu)"),
10422 			 ip->insn_mo->name,
10423 			 (unsigned long) imm_expr.X_add_number);
10424 	      MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10425 	      imm_expr.X_op = O_absent;
10426 	      s = expr_end;
10427 	      continue;
10428 
10429 	    case 'a':		/* 26 bit address */
10430 	      my_getExpression (&offset_expr, s);
10431 	      s = expr_end;
10432 	      *offset_reloc = BFD_RELOC_MIPS16_JMP;
10433 	      ip->insn_opcode <<= 16;
10434 	      continue;
10435 
10436 	    case 'l':		/* register list for entry macro */
10437 	    case 'L':		/* register list for exit macro */
10438 	      {
10439 		int mask;
10440 
10441 		if (c == 'l')
10442 		  mask = 0;
10443 		else
10444 		  mask = 7 << 3;
10445 		while (*s != '\0')
10446 		  {
10447 		    unsigned int freg, reg1, reg2;
10448 
10449 		    while (*s == ' ' || *s == ',')
10450 		      ++s;
10451 		    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10452 		      freg = 0;
10453 		    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10454 		      freg = 1;
10455 		    else
10456 		      {
10457 			as_bad (_("can't parse register list"));
10458 			break;
10459 		      }
10460 		    if (*s == ' ')
10461 		      ++s;
10462 		    if (*s != '-')
10463 		      reg2 = reg1;
10464 		    else
10465 		      {
10466 			++s;
10467 			if (!reg_lookup (&s, freg ? RTYPE_FPU
10468 					 : (RTYPE_GP | RTYPE_NUM), &reg2))
10469 			  {
10470 			    as_bad (_("invalid register list"));
10471 			    break;
10472 			  }
10473 		      }
10474 		    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10475 		      {
10476 			mask &= ~ (7 << 3);
10477 			mask |= 5 << 3;
10478 		      }
10479 		    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10480 		      {
10481 			mask &= ~ (7 << 3);
10482 			mask |= 6 << 3;
10483 		      }
10484 		    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10485 		      mask |= (reg2 - 3) << 3;
10486 		    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10487 		      mask |= (reg2 - 15) << 1;
10488 		    else if (reg1 == RA && reg2 == RA)
10489 		      mask |= 1;
10490 		    else
10491 		      {
10492 			as_bad (_("invalid register list"));
10493 			break;
10494 		      }
10495 		  }
10496 		/* The mask is filled in in the opcode table for the
10497                    benefit of the disassembler.  We remove it before
10498                    applying the actual mask.  */
10499 		ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10500 		ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10501 	      }
10502 	    continue;
10503 
10504 	    case 'm':		/* Register list for save insn.  */
10505 	    case 'M':		/* Register list for restore insn.  */
10506 	      {
10507 		int opcode = 0;
10508 		int framesz = 0, seen_framesz = 0;
10509 		int args = 0, statics = 0, sregs = 0;
10510 
10511 		while (*s != '\0')
10512 		  {
10513 		    unsigned int reg1, reg2;
10514 
10515 		    SKIP_SPACE_TABS (s);
10516 		    while (*s == ',')
10517 		      ++s;
10518 		    SKIP_SPACE_TABS (s);
10519 
10520 		    my_getExpression (&imm_expr, s);
10521 		    if (imm_expr.X_op == O_constant)
10522 		      {
10523 			/* Handle the frame size.  */
10524 			if (seen_framesz)
10525 			  {
10526 			    as_bad (_("more than one frame size in list"));
10527 			    break;
10528 			  }
10529 			seen_framesz = 1;
10530 			framesz = imm_expr.X_add_number;
10531 			imm_expr.X_op = O_absent;
10532 			s = expr_end;
10533 			continue;
10534 		      }
10535 
10536 		    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10537 		      {
10538 			as_bad (_("can't parse register list"));
10539 			break;
10540 		      }
10541 
10542 		    while (*s == ' ')
10543 		      ++s;
10544 
10545 		    if (*s != '-')
10546 		      reg2 = reg1;
10547 		    else
10548 		      {
10549 			++s;
10550 			if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10551 			    || reg2 < reg1)
10552 			  {
10553 			    as_bad (_("can't parse register list"));
10554 			    break;
10555 			  }
10556 		      }
10557 
10558 		    while (reg1 <= reg2)
10559 		      {
10560 			if (reg1 >= 4 && reg1 <= 7)
10561 			  {
10562 			    if (!seen_framesz)
10563 				/* args $a0-$a3 */
10564 				args |= 1 << (reg1 - 4);
10565 			    else
10566 				/* statics $a0-$a3 */
10567 				statics |= 1 << (reg1 - 4);
10568 			  }
10569 			else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10570 			  {
10571 			    /* $s0-$s8 */
10572 			    sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10573 			  }
10574 			else if (reg1 == 31)
10575 			  {
10576 			    /* Add $ra to insn.  */
10577 			    opcode |= 0x40;
10578 			  }
10579 			else
10580 			  {
10581 			    as_bad (_("unexpected register in list"));
10582 			    break;
10583 			  }
10584 			if (++reg1 == 24)
10585 			  reg1 = 30;
10586 		      }
10587 		  }
10588 
10589 		/* Encode args/statics combination.  */
10590 		if (args & statics)
10591 		  as_bad (_("arg/static registers overlap"));
10592 		else if (args == 0xf)
10593 		  /* All $a0-$a3 are args.  */
10594 		  opcode |= MIPS16_ALL_ARGS << 16;
10595 		else if (statics == 0xf)
10596 		  /* All $a0-$a3 are statics.  */
10597 		  opcode |= MIPS16_ALL_STATICS << 16;
10598 		else
10599 		  {
10600 		    int narg = 0, nstat = 0;
10601 
10602 		    /* Count arg registers.  */
10603 		    while (args & 0x1)
10604 		      {
10605 			args >>= 1;
10606 			narg++;
10607 		      }
10608 		    if (args != 0)
10609 		      as_bad (_("invalid arg register list"));
10610 
10611 		    /* Count static registers.  */
10612 		    while (statics & 0x8)
10613 		      {
10614 			statics = (statics << 1) & 0xf;
10615 			nstat++;
10616 		      }
10617 		    if (statics != 0)
10618 		      as_bad (_("invalid static register list"));
10619 
10620 		    /* Encode args/statics.  */
10621 		    opcode |= ((narg << 2) | nstat) << 16;
10622 		  }
10623 
10624 		/* Encode $s0/$s1.  */
10625 		if (sregs & (1 << 0))		/* $s0 */
10626 		  opcode |= 0x20;
10627 		if (sregs & (1 << 1))		/* $s1 */
10628 		  opcode |= 0x10;
10629 		sregs >>= 2;
10630 
10631 		if (sregs != 0)
10632 		  {
10633 		    /* Count regs $s2-$s8.  */
10634 		    int nsreg = 0;
10635 		    while (sregs & 1)
10636 		      {
10637 			sregs >>= 1;
10638 			nsreg++;
10639 		      }
10640 		    if (sregs != 0)
10641 		      as_bad (_("invalid static register list"));
10642 		    /* Encode $s2-$s8. */
10643 		    opcode |= nsreg << 24;
10644 		  }
10645 
10646 		/* Encode frame size.  */
10647 		if (!seen_framesz)
10648 		  as_bad (_("missing frame size"));
10649 		else if ((framesz & 7) != 0 || framesz < 0
10650 			 || framesz > 0xff * 8)
10651 		  as_bad (_("invalid frame size"));
10652 		else if (framesz != 128 || (opcode >> 16) != 0)
10653 		  {
10654 		    framesz /= 8;
10655 		    opcode |= (((framesz & 0xf0) << 16)
10656 			     | (framesz & 0x0f));
10657 		  }
10658 
10659 		/* Finally build the instruction.  */
10660 		if ((opcode >> 16) != 0 || framesz == 0)
10661 		  {
10662 		    ip->use_extend = TRUE;
10663 		    ip->extend = opcode >> 16;
10664 		  }
10665 		ip->insn_opcode |= opcode & 0x7f;
10666 	      }
10667 	    continue;
10668 
10669 	    case 'e':		/* extend code */
10670 	      my_getExpression (&imm_expr, s);
10671 	      check_absolute_expr (ip, &imm_expr);
10672 	      if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10673 		{
10674 		  as_warn (_("Invalid value for `%s' (%lu)"),
10675 			   ip->insn_mo->name,
10676 			   (unsigned long) imm_expr.X_add_number);
10677 		  imm_expr.X_add_number &= 0x7ff;
10678 		}
10679 	      ip->insn_opcode |= imm_expr.X_add_number;
10680 	      imm_expr.X_op = O_absent;
10681 	      s = expr_end;
10682 	      continue;
10683 
10684 	    default:
10685 	      internalError ();
10686 	    }
10687 	  break;
10688 	}
10689 
10690       /* Args don't match.  */
10691       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10692 	  strcmp (insn->name, insn[1].name) == 0)
10693 	{
10694 	  ++insn;
10695 	  s = argsstart;
10696 	  continue;
10697 	}
10698 
10699       insn_error = _("illegal operands");
10700 
10701       return;
10702     }
10703 }
10704 
10705 /* This structure holds information we know about a mips16 immediate
10706    argument type.  */
10707 
10708 struct mips16_immed_operand
10709 {
10710   /* The type code used in the argument string in the opcode table.  */
10711   int type;
10712   /* The number of bits in the short form of the opcode.  */
10713   int nbits;
10714   /* The number of bits in the extended form of the opcode.  */
10715   int extbits;
10716   /* The amount by which the short form is shifted when it is used;
10717      for example, the sw instruction has a shift count of 2.  */
10718   int shift;
10719   /* The amount by which the short form is shifted when it is stored
10720      into the instruction code.  */
10721   int op_shift;
10722   /* Non-zero if the short form is unsigned.  */
10723   int unsp;
10724   /* Non-zero if the extended form is unsigned.  */
10725   int extu;
10726   /* Non-zero if the value is PC relative.  */
10727   int pcrel;
10728 };
10729 
10730 /* The mips16 immediate operand types.  */
10731 
10732 static const struct mips16_immed_operand mips16_immed_operands[] =
10733 {
10734   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10735   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10736   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10737   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10738   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10739   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10740   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10741   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10742   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10743   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10744   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10745   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10746   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10747   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10748   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10749   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10750   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10751   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10752   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10753   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10754   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10755 };
10756 
10757 #define MIPS16_NUM_IMMED \
10758   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10759 
10760 /* Handle a mips16 instruction with an immediate value.  This or's the
10761    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10762    whether an extended value is needed; if one is needed, it sets
10763    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10764    If SMALL is true, an unextended opcode was explicitly requested.
10765    If EXT is true, an extended opcode was explicitly requested.  If
10766    WARN is true, warn if EXT does not match reality.  */
10767 
10768 static void
10769 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10770 	      bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10771 	      unsigned long *insn, bfd_boolean *use_extend,
10772 	      unsigned short *extend)
10773 {
10774   const struct mips16_immed_operand *op;
10775   int mintiny, maxtiny;
10776   bfd_boolean needext;
10777 
10778   op = mips16_immed_operands;
10779   while (op->type != type)
10780     {
10781       ++op;
10782       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10783     }
10784 
10785   if (op->unsp)
10786     {
10787       if (type == '<' || type == '>' || type == '[' || type == ']')
10788 	{
10789 	  mintiny = 1;
10790 	  maxtiny = 1 << op->nbits;
10791 	}
10792       else
10793 	{
10794 	  mintiny = 0;
10795 	  maxtiny = (1 << op->nbits) - 1;
10796 	}
10797     }
10798   else
10799     {
10800       mintiny = - (1 << (op->nbits - 1));
10801       maxtiny = (1 << (op->nbits - 1)) - 1;
10802     }
10803 
10804   /* Branch offsets have an implicit 0 in the lowest bit.  */
10805   if (type == 'p' || type == 'q')
10806     val /= 2;
10807 
10808   if ((val & ((1 << op->shift) - 1)) != 0
10809       || val < (mintiny << op->shift)
10810       || val > (maxtiny << op->shift))
10811     needext = TRUE;
10812   else
10813     needext = FALSE;
10814 
10815   if (warn && ext && ! needext)
10816     as_warn_where (file, line,
10817 		   _("extended operand requested but not required"));
10818   if (small && needext)
10819     as_bad_where (file, line, _("invalid unextended operand value"));
10820 
10821   if (small || (! ext && ! needext))
10822     {
10823       int insnval;
10824 
10825       *use_extend = FALSE;
10826       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10827       insnval <<= op->op_shift;
10828       *insn |= insnval;
10829     }
10830   else
10831     {
10832       long minext, maxext;
10833       int extval;
10834 
10835       if (op->extu)
10836 	{
10837 	  minext = 0;
10838 	  maxext = (1 << op->extbits) - 1;
10839 	}
10840       else
10841 	{
10842 	  minext = - (1 << (op->extbits - 1));
10843 	  maxext = (1 << (op->extbits - 1)) - 1;
10844 	}
10845       if (val < minext || val > maxext)
10846 	as_bad_where (file, line,
10847 		      _("operand value out of range for instruction"));
10848 
10849       *use_extend = TRUE;
10850       if (op->extbits == 16)
10851 	{
10852 	  extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10853 	  val &= 0x1f;
10854 	}
10855       else if (op->extbits == 15)
10856 	{
10857 	  extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10858 	  val &= 0xf;
10859 	}
10860       else
10861 	{
10862 	  extval = ((val & 0x1f) << 6) | (val & 0x20);
10863 	  val = 0;
10864 	}
10865 
10866       *extend = (unsigned short) extval;
10867       *insn |= val;
10868     }
10869 }
10870 
10871 struct percent_op_match
10872 {
10873   const char *str;
10874   bfd_reloc_code_real_type reloc;
10875 };
10876 
10877 static const struct percent_op_match mips_percent_op[] =
10878 {
10879   {"%lo", BFD_RELOC_LO16},
10880 #ifdef OBJ_ELF
10881   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10882   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10883   {"%call16", BFD_RELOC_MIPS_CALL16},
10884   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10885   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10886   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10887   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10888   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10889   {"%got", BFD_RELOC_MIPS_GOT16},
10890   {"%gp_rel", BFD_RELOC_GPREL16},
10891   {"%half", BFD_RELOC_16},
10892   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10893   {"%higher", BFD_RELOC_MIPS_HIGHER},
10894   {"%neg", BFD_RELOC_MIPS_SUB},
10895   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10896   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10897   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10898   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10899   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10900   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10901   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10902 #endif
10903   {"%hi", BFD_RELOC_HI16_S}
10904 };
10905 
10906 static const struct percent_op_match mips16_percent_op[] =
10907 {
10908   {"%lo", BFD_RELOC_MIPS16_LO16},
10909   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10910   {"%got", BFD_RELOC_MIPS16_GOT16},
10911   {"%call16", BFD_RELOC_MIPS16_CALL16},
10912   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10913 };
10914 
10915 
10916 /* Return true if *STR points to a relocation operator.  When returning true,
10917    move *STR over the operator and store its relocation code in *RELOC.
10918    Leave both *STR and *RELOC alone when returning false.  */
10919 
10920 static bfd_boolean
10921 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10922 {
10923   const struct percent_op_match *percent_op;
10924   size_t limit, i;
10925 
10926   if (mips_opts.mips16)
10927     {
10928       percent_op = mips16_percent_op;
10929       limit = ARRAY_SIZE (mips16_percent_op);
10930     }
10931   else
10932     {
10933       percent_op = mips_percent_op;
10934       limit = ARRAY_SIZE (mips_percent_op);
10935     }
10936 
10937   for (i = 0; i < limit; i++)
10938     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10939       {
10940 	int len = strlen (percent_op[i].str);
10941 
10942 	if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10943 	  continue;
10944 
10945 	*str += strlen (percent_op[i].str);
10946 	*reloc = percent_op[i].reloc;
10947 
10948 	/* Check whether the output BFD supports this relocation.
10949 	   If not, issue an error and fall back on something safe.  */
10950 	if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10951 	  {
10952 	    as_bad ("relocation %s isn't supported by the current ABI",
10953 		    percent_op[i].str);
10954 	    *reloc = BFD_RELOC_UNUSED;
10955 	  }
10956 	return TRUE;
10957       }
10958   return FALSE;
10959 }
10960 
10961 
10962 /* Parse string STR as a 16-bit relocatable operand.  Store the
10963    expression in *EP and the relocations in the array starting
10964    at RELOC.  Return the number of relocation operators used.
10965 
10966    On exit, EXPR_END points to the first character after the expression.  */
10967 
10968 static size_t
10969 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10970 		       char *str)
10971 {
10972   bfd_reloc_code_real_type reversed_reloc[3];
10973   size_t reloc_index, i;
10974   int crux_depth, str_depth;
10975   char *crux;
10976 
10977   /* Search for the start of the main expression, recoding relocations
10978      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10979      of the main expression and with CRUX_DEPTH containing the number
10980      of open brackets at that point.  */
10981   reloc_index = -1;
10982   str_depth = 0;
10983   do
10984     {
10985       reloc_index++;
10986       crux = str;
10987       crux_depth = str_depth;
10988 
10989       /* Skip over whitespace and brackets, keeping count of the number
10990 	 of brackets.  */
10991       while (*str == ' ' || *str == '\t' || *str == '(')
10992 	if (*str++ == '(')
10993 	  str_depth++;
10994     }
10995   while (*str == '%'
10996 	 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10997 	 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10998 
10999   my_getExpression (ep, crux);
11000   str = expr_end;
11001 
11002   /* Match every open bracket.  */
11003   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11004     if (*str++ == ')')
11005       crux_depth--;
11006 
11007   if (crux_depth > 0)
11008     as_bad ("unclosed '('");
11009 
11010   expr_end = str;
11011 
11012   if (reloc_index != 0)
11013     {
11014       prev_reloc_op_frag = frag_now;
11015       for (i = 0; i < reloc_index; i++)
11016 	reloc[i] = reversed_reloc[reloc_index - 1 - i];
11017     }
11018 
11019   return reloc_index;
11020 }
11021 
11022 static void
11023 my_getExpression (expressionS *ep, char *str)
11024 {
11025   char *save_in;
11026   valueT val;
11027 
11028   save_in = input_line_pointer;
11029   input_line_pointer = str;
11030   expression (ep);
11031   expr_end = input_line_pointer;
11032   input_line_pointer = save_in;
11033 
11034   /* If we are in mips16 mode, and this is an expression based on `.',
11035      then we bump the value of the symbol by 1 since that is how other
11036      text symbols are handled.  We don't bother to handle complex
11037      expressions, just `.' plus or minus a constant.  */
11038   if (mips_opts.mips16
11039       && ep->X_op == O_symbol
11040       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11041       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11042       && symbol_get_frag (ep->X_add_symbol) == frag_now
11043       && symbol_constant_p (ep->X_add_symbol)
11044       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11045     S_SET_VALUE (ep->X_add_symbol, val + 1);
11046 }
11047 
11048 char *
11049 md_atof (int type, char *litP, int *sizeP)
11050 {
11051   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11052 }
11053 
11054 void
11055 md_number_to_chars (char *buf, valueT val, int n)
11056 {
11057   if (target_big_endian)
11058     number_to_chars_bigendian (buf, val, n);
11059   else
11060     number_to_chars_littleendian (buf, val, n);
11061 }
11062 
11063 #ifdef OBJ_ELF
11064 static int support_64bit_objects(void)
11065 {
11066   const char **list, **l;
11067   int yes;
11068 
11069   list = bfd_target_list ();
11070   for (l = list; *l != NULL; l++)
11071 #ifdef TE_TMIPS
11072     /* This is traditional mips */
11073     if (strcmp (*l, "elf64-tradbigmips") == 0
11074 	|| strcmp (*l, "elf64-tradlittlemips") == 0)
11075 #else
11076     if (strcmp (*l, "elf64-bigmips") == 0
11077 	|| strcmp (*l, "elf64-littlemips") == 0)
11078 #endif
11079       break;
11080   yes = (*l != NULL);
11081   free (list);
11082   return yes;
11083 }
11084 #endif /* OBJ_ELF */
11085 
11086 const char *md_shortopts = "O::g::G:";
11087 
11088 struct option md_longopts[] =
11089 {
11090   /* Options which specify architecture.  */
11091 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
11092 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
11093   {"march", required_argument, NULL, OPTION_MARCH},
11094 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
11095   {"mtune", required_argument, NULL, OPTION_MTUNE},
11096 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
11097   {"mips0", no_argument, NULL, OPTION_MIPS1},
11098   {"mips1", no_argument, NULL, OPTION_MIPS1},
11099 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
11100   {"mips2", no_argument, NULL, OPTION_MIPS2},
11101 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
11102   {"mips3", no_argument, NULL, OPTION_MIPS3},
11103 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
11104   {"mips4", no_argument, NULL, OPTION_MIPS4},
11105 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
11106   {"mips5", no_argument, NULL, OPTION_MIPS5},
11107 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
11108   {"mips32", no_argument, NULL, OPTION_MIPS32},
11109 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
11110   {"mips64", no_argument, NULL, OPTION_MIPS64},
11111 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
11112   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11113 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
11114   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11115 
11116   /* Options which specify Application Specific Extensions (ASEs).  */
11117 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
11118 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
11119   {"mips16", no_argument, NULL, OPTION_MIPS16},
11120 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
11121   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11122 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
11123   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11124 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
11125   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11126 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
11127   {"mdmx", no_argument, NULL, OPTION_MDMX},
11128 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
11129   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11130 #define OPTION_DSP (OPTION_ASE_BASE + 6)
11131   {"mdsp", no_argument, NULL, OPTION_DSP},
11132 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
11133   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11134 #define OPTION_MT (OPTION_ASE_BASE + 8)
11135   {"mmt", no_argument, NULL, OPTION_MT},
11136 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
11137   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11138 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
11139   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11140 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
11141   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11142 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
11143   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11144 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
11145   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11146 
11147   /* Old-style architecture options.  Don't add more of these.  */
11148 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
11149 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
11150   {"m4650", no_argument, NULL, OPTION_M4650},
11151 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
11152   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11153 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
11154   {"m4010", no_argument, NULL, OPTION_M4010},
11155 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
11156   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11157 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
11158   {"m4100", no_argument, NULL, OPTION_M4100},
11159 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
11160   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11161 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
11162   {"m3900", no_argument, NULL, OPTION_M3900},
11163 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
11164   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11165 
11166   /* Options which enable bug fixes.  */
11167 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
11168 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
11169   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11170 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
11171   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11172   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11173 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
11174 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
11175   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11176   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11177 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
11178 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
11179   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11180   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11181 
11182   /* Miscellaneous options.  */
11183 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
11184 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
11185   {"trap", no_argument, NULL, OPTION_TRAP},
11186   {"no-break", no_argument, NULL, OPTION_TRAP},
11187 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
11188   {"break", no_argument, NULL, OPTION_BREAK},
11189   {"no-trap", no_argument, NULL, OPTION_BREAK},
11190 #define OPTION_EB (OPTION_MISC_BASE + 2)
11191   {"EB", no_argument, NULL, OPTION_EB},
11192 #define OPTION_EL (OPTION_MISC_BASE + 3)
11193   {"EL", no_argument, NULL, OPTION_EL},
11194 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
11195   {"mfp32", no_argument, NULL, OPTION_FP32},
11196 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
11197   {"mgp32", no_argument, NULL, OPTION_GP32},
11198 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
11199   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11200 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
11201   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11202 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
11203   {"mfp64", no_argument, NULL, OPTION_FP64},
11204 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
11205   {"mgp64", no_argument, NULL, OPTION_GP64},
11206 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
11207 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
11208   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11209   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11210 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
11211 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
11212   {"mshared", no_argument, NULL, OPTION_MSHARED},
11213   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11214 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
11215 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
11216   {"msym32", no_argument, NULL, OPTION_MSYM32},
11217   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11218 #define OPTION_SOFT_FLOAT (OPTION_MISC_BASE + 16)
11219 #define OPTION_HARD_FLOAT (OPTION_MISC_BASE + 17)
11220   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11221   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11222 #define OPTION_SINGLE_FLOAT (OPTION_MISC_BASE + 18)
11223 #define OPTION_DOUBLE_FLOAT (OPTION_MISC_BASE + 19)
11224   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11225   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11226 
11227   /* ELF-specific options.  */
11228 #ifdef OBJ_ELF
11229 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 20)
11230 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
11231   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11232   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11233 #define OPTION_CALL_NONPIC (OPTION_ELF_BASE + 1)
11234   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11235 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 2)
11236   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11237 #define OPTION_XGOT        (OPTION_ELF_BASE + 3)
11238   {"xgot",        no_argument, NULL, OPTION_XGOT},
11239 #define OPTION_MABI        (OPTION_ELF_BASE + 4)
11240   {"mabi", required_argument, NULL, OPTION_MABI},
11241 #define OPTION_32 	   (OPTION_ELF_BASE + 5)
11242   {"32",          no_argument, NULL, OPTION_32},
11243 #define OPTION_N32 	   (OPTION_ELF_BASE + 6)
11244   {"n32",         no_argument, NULL, OPTION_N32},
11245 #define OPTION_64          (OPTION_ELF_BASE + 7)
11246   {"64",          no_argument, NULL, OPTION_64},
11247 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 8)
11248   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11249 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 9)
11250   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11251 #define OPTION_PDR	   (OPTION_ELF_BASE + 10)
11252   {"mpdr", no_argument, NULL, OPTION_PDR},
11253 #define OPTION_NO_PDR	   (OPTION_ELF_BASE + 11)
11254   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11255 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 12)
11256   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11257 #endif /* OBJ_ELF */
11258 
11259   {NULL, no_argument, NULL, 0}
11260 };
11261 size_t md_longopts_size = sizeof (md_longopts);
11262 
11263 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11264    NEW_VALUE.  Warn if another value was already specified.  Note:
11265    we have to defer parsing the -march and -mtune arguments in order
11266    to handle 'from-abi' correctly, since the ABI might be specified
11267    in a later argument.  */
11268 
11269 static void
11270 mips_set_option_string (const char **string_ptr, const char *new_value)
11271 {
11272   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11273     as_warn (_("A different %s was already specified, is now %s"),
11274 	     string_ptr == &mips_arch_string ? "-march" : "-mtune",
11275 	     new_value);
11276 
11277   *string_ptr = new_value;
11278 }
11279 
11280 int
11281 md_parse_option (int c, char *arg)
11282 {
11283   switch (c)
11284     {
11285     case OPTION_CONSTRUCT_FLOATS:
11286       mips_disable_float_construction = 0;
11287       break;
11288 
11289     case OPTION_NO_CONSTRUCT_FLOATS:
11290       mips_disable_float_construction = 1;
11291       break;
11292 
11293     case OPTION_TRAP:
11294       mips_trap = 1;
11295       break;
11296 
11297     case OPTION_BREAK:
11298       mips_trap = 0;
11299       break;
11300 
11301     case OPTION_EB:
11302       target_big_endian = 1;
11303       break;
11304 
11305     case OPTION_EL:
11306       target_big_endian = 0;
11307       break;
11308 
11309     case 'O':
11310       if (arg == NULL)
11311 	mips_optimize = 1;
11312       else if (arg[0] == '0')
11313 	mips_optimize = 0;
11314       else if (arg[0] == '1')
11315 	mips_optimize = 1;
11316       else
11317 	mips_optimize = 2;
11318       break;
11319 
11320     case 'g':
11321       if (arg == NULL)
11322 	mips_debug = 2;
11323       else
11324 	mips_debug = atoi (arg);
11325       break;
11326 
11327     case OPTION_MIPS1:
11328       file_mips_isa = ISA_MIPS1;
11329       break;
11330 
11331     case OPTION_MIPS2:
11332       file_mips_isa = ISA_MIPS2;
11333       break;
11334 
11335     case OPTION_MIPS3:
11336       file_mips_isa = ISA_MIPS3;
11337       break;
11338 
11339     case OPTION_MIPS4:
11340       file_mips_isa = ISA_MIPS4;
11341       break;
11342 
11343     case OPTION_MIPS5:
11344       file_mips_isa = ISA_MIPS5;
11345       break;
11346 
11347     case OPTION_MIPS32:
11348       file_mips_isa = ISA_MIPS32;
11349       break;
11350 
11351     case OPTION_MIPS32R2:
11352       file_mips_isa = ISA_MIPS32R2;
11353       break;
11354 
11355     case OPTION_MIPS64R2:
11356       file_mips_isa = ISA_MIPS64R2;
11357       break;
11358 
11359     case OPTION_MIPS64:
11360       file_mips_isa = ISA_MIPS64;
11361       break;
11362 
11363     case OPTION_MTUNE:
11364       mips_set_option_string (&mips_tune_string, arg);
11365       break;
11366 
11367     case OPTION_MARCH:
11368       mips_set_option_string (&mips_arch_string, arg);
11369       break;
11370 
11371     case OPTION_M4650:
11372       mips_set_option_string (&mips_arch_string, "4650");
11373       mips_set_option_string (&mips_tune_string, "4650");
11374       break;
11375 
11376     case OPTION_NO_M4650:
11377       break;
11378 
11379     case OPTION_M4010:
11380       mips_set_option_string (&mips_arch_string, "4010");
11381       mips_set_option_string (&mips_tune_string, "4010");
11382       break;
11383 
11384     case OPTION_NO_M4010:
11385       break;
11386 
11387     case OPTION_M4100:
11388       mips_set_option_string (&mips_arch_string, "4100");
11389       mips_set_option_string (&mips_tune_string, "4100");
11390       break;
11391 
11392     case OPTION_NO_M4100:
11393       break;
11394 
11395     case OPTION_M3900:
11396       mips_set_option_string (&mips_arch_string, "3900");
11397       mips_set_option_string (&mips_tune_string, "3900");
11398       break;
11399 
11400     case OPTION_NO_M3900:
11401       break;
11402 
11403     case OPTION_MDMX:
11404       mips_opts.ase_mdmx = 1;
11405       break;
11406 
11407     case OPTION_NO_MDMX:
11408       mips_opts.ase_mdmx = 0;
11409       break;
11410 
11411     case OPTION_DSP:
11412       mips_opts.ase_dsp = 1;
11413       mips_opts.ase_dspr2 = 0;
11414       break;
11415 
11416     case OPTION_NO_DSP:
11417       mips_opts.ase_dsp = 0;
11418       mips_opts.ase_dspr2 = 0;
11419       break;
11420 
11421     case OPTION_DSPR2:
11422       mips_opts.ase_dspr2 = 1;
11423       mips_opts.ase_dsp = 1;
11424       break;
11425 
11426     case OPTION_NO_DSPR2:
11427       mips_opts.ase_dspr2 = 0;
11428       mips_opts.ase_dsp = 0;
11429       break;
11430 
11431     case OPTION_MT:
11432       mips_opts.ase_mt = 1;
11433       break;
11434 
11435     case OPTION_NO_MT:
11436       mips_opts.ase_mt = 0;
11437       break;
11438 
11439     case OPTION_MIPS16:
11440       mips_opts.mips16 = 1;
11441       mips_no_prev_insn ();
11442       break;
11443 
11444     case OPTION_NO_MIPS16:
11445       mips_opts.mips16 = 0;
11446       mips_no_prev_insn ();
11447       break;
11448 
11449     case OPTION_MIPS3D:
11450       mips_opts.ase_mips3d = 1;
11451       break;
11452 
11453     case OPTION_NO_MIPS3D:
11454       mips_opts.ase_mips3d = 0;
11455       break;
11456 
11457     case OPTION_SMARTMIPS:
11458       mips_opts.ase_smartmips = 1;
11459       break;
11460 
11461     case OPTION_NO_SMARTMIPS:
11462       mips_opts.ase_smartmips = 0;
11463       break;
11464 
11465     case OPTION_FIX_VR4120:
11466       mips_fix_vr4120 = 1;
11467       break;
11468 
11469     case OPTION_NO_FIX_VR4120:
11470       mips_fix_vr4120 = 0;
11471       break;
11472 
11473     case OPTION_FIX_VR4130:
11474       mips_fix_vr4130 = 1;
11475       break;
11476 
11477     case OPTION_NO_FIX_VR4130:
11478       mips_fix_vr4130 = 0;
11479       break;
11480 
11481     case OPTION_RELAX_BRANCH:
11482       mips_relax_branch = 1;
11483       break;
11484 
11485     case OPTION_NO_RELAX_BRANCH:
11486       mips_relax_branch = 0;
11487       break;
11488 
11489     case OPTION_MSHARED:
11490       mips_in_shared = TRUE;
11491       break;
11492 
11493     case OPTION_MNO_SHARED:
11494       mips_in_shared = FALSE;
11495       break;
11496 
11497     case OPTION_MSYM32:
11498       mips_opts.sym32 = TRUE;
11499       break;
11500 
11501     case OPTION_MNO_SYM32:
11502       mips_opts.sym32 = FALSE;
11503       break;
11504 
11505 #ifdef OBJ_ELF
11506       /* When generating ELF code, we permit -KPIC and -call_shared to
11507 	 select SVR4_PIC, and -non_shared to select no PIC.  This is
11508 	 intended to be compatible with Irix 5.  */
11509     case OPTION_CALL_SHARED:
11510       if (!IS_ELF)
11511 	{
11512 	  as_bad (_("-call_shared is supported only for ELF format"));
11513 	  return 0;
11514 	}
11515       mips_pic = SVR4_PIC;
11516       mips_abicalls = TRUE;
11517       break;
11518 
11519     case OPTION_CALL_NONPIC:
11520       if (!IS_ELF)
11521 	{
11522 	  as_bad (_("-call_nonpic is supported only for ELF format"));
11523 	  return 0;
11524 	}
11525       mips_pic = NO_PIC;
11526       mips_abicalls = TRUE;
11527       break;
11528 
11529     case OPTION_NON_SHARED:
11530       if (!IS_ELF)
11531 	{
11532 	  as_bad (_("-non_shared is supported only for ELF format"));
11533 	  return 0;
11534 	}
11535       mips_pic = NO_PIC;
11536       mips_abicalls = FALSE;
11537       break;
11538 
11539       /* The -xgot option tells the assembler to use 32 bit offsets
11540          when accessing the got in SVR4_PIC mode.  It is for Irix
11541          compatibility.  */
11542     case OPTION_XGOT:
11543       mips_big_got = 1;
11544       break;
11545 #endif /* OBJ_ELF */
11546 
11547     case 'G':
11548       g_switch_value = atoi (arg);
11549       g_switch_seen = 1;
11550       break;
11551 
11552 #ifdef OBJ_ELF
11553       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11554 	 and -mabi=64.  */
11555     case OPTION_32:
11556       if (!IS_ELF)
11557 	{
11558 	  as_bad (_("-32 is supported for ELF format only"));
11559 	  return 0;
11560 	}
11561       mips_abi = O32_ABI;
11562       break;
11563 
11564     case OPTION_N32:
11565       if (!IS_ELF)
11566 	{
11567 	  as_bad (_("-n32 is supported for ELF format only"));
11568 	  return 0;
11569 	}
11570       mips_abi = N32_ABI;
11571       break;
11572 
11573     case OPTION_64:
11574       if (!IS_ELF)
11575 	{
11576 	  as_bad (_("-64 is supported for ELF format only"));
11577 	  return 0;
11578 	}
11579       mips_abi = N64_ABI;
11580       if (!support_64bit_objects())
11581 	as_fatal (_("No compiled in support for 64 bit object file format"));
11582       break;
11583 #endif /* OBJ_ELF */
11584 
11585     case OPTION_GP32:
11586       file_mips_gp32 = 1;
11587       break;
11588 
11589     case OPTION_GP64:
11590       file_mips_gp32 = 0;
11591       break;
11592 
11593     case OPTION_FP32:
11594       file_mips_fp32 = 1;
11595       break;
11596 
11597     case OPTION_FP64:
11598       file_mips_fp32 = 0;
11599       break;
11600 
11601     case OPTION_SINGLE_FLOAT:
11602       file_mips_single_float = 1;
11603       break;
11604 
11605     case OPTION_DOUBLE_FLOAT:
11606       file_mips_single_float = 0;
11607       break;
11608 
11609     case OPTION_SOFT_FLOAT:
11610       file_mips_soft_float = 1;
11611       break;
11612 
11613     case OPTION_HARD_FLOAT:
11614       file_mips_soft_float = 0;
11615       break;
11616 
11617 #ifdef OBJ_ELF
11618     case OPTION_MABI:
11619       if (!IS_ELF)
11620 	{
11621 	  as_bad (_("-mabi is supported for ELF format only"));
11622 	  return 0;
11623 	}
11624       if (strcmp (arg, "32") == 0)
11625 	mips_abi = O32_ABI;
11626       else if (strcmp (arg, "o64") == 0)
11627 	mips_abi = O64_ABI;
11628       else if (strcmp (arg, "n32") == 0)
11629 	mips_abi = N32_ABI;
11630       else if (strcmp (arg, "64") == 0)
11631 	{
11632 	  mips_abi = N64_ABI;
11633 	  if (! support_64bit_objects())
11634 	    as_fatal (_("No compiled in support for 64 bit object file "
11635 			"format"));
11636 	}
11637       else if (strcmp (arg, "eabi") == 0)
11638 	mips_abi = EABI_ABI;
11639       else
11640 	{
11641 	  as_fatal (_("invalid abi -mabi=%s"), arg);
11642 	  return 0;
11643 	}
11644       break;
11645 #endif /* OBJ_ELF */
11646 
11647     case OPTION_M7000_HILO_FIX:
11648       mips_7000_hilo_fix = TRUE;
11649       break;
11650 
11651     case OPTION_MNO_7000_HILO_FIX:
11652       mips_7000_hilo_fix = FALSE;
11653       break;
11654 
11655 #ifdef OBJ_ELF
11656     case OPTION_MDEBUG:
11657       mips_flag_mdebug = TRUE;
11658       break;
11659 
11660     case OPTION_NO_MDEBUG:
11661       mips_flag_mdebug = FALSE;
11662       break;
11663 
11664     case OPTION_PDR:
11665       mips_flag_pdr = TRUE;
11666       break;
11667 
11668     case OPTION_NO_PDR:
11669       mips_flag_pdr = FALSE;
11670       break;
11671 
11672     case OPTION_MVXWORKS_PIC:
11673       mips_pic = VXWORKS_PIC;
11674       break;
11675 #endif /* OBJ_ELF */
11676 
11677     default:
11678       return 0;
11679     }
11680 
11681   return 1;
11682 }
11683 
11684 /* Set up globals to generate code for the ISA or processor
11685    described by INFO.  */
11686 
11687 static void
11688 mips_set_architecture (const struct mips_cpu_info *info)
11689 {
11690   if (info != 0)
11691     {
11692       file_mips_arch = info->cpu;
11693       mips_opts.arch = info->cpu;
11694       mips_opts.isa = info->isa;
11695     }
11696 }
11697 
11698 
11699 /* Likewise for tuning.  */
11700 
11701 static void
11702 mips_set_tune (const struct mips_cpu_info *info)
11703 {
11704   if (info != 0)
11705     mips_tune = info->cpu;
11706 }
11707 
11708 
11709 void
11710 mips_after_parse_args (void)
11711 {
11712   const struct mips_cpu_info *arch_info = 0;
11713   const struct mips_cpu_info *tune_info = 0;
11714 
11715   /* GP relative stuff not working for PE */
11716   if (strncmp (TARGET_OS, "pe", 2) == 0)
11717     {
11718       if (g_switch_seen && g_switch_value != 0)
11719 	as_bad (_("-G not supported in this configuration."));
11720       g_switch_value = 0;
11721     }
11722 
11723   if (mips_abi == NO_ABI)
11724     mips_abi = MIPS_DEFAULT_ABI;
11725 
11726   /* The following code determines the architecture and register size.
11727      Similar code was added to GCC 3.3 (see override_options() in
11728      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11729      as much as possible.  */
11730 
11731   if (mips_arch_string != 0)
11732     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11733 
11734   if (file_mips_isa != ISA_UNKNOWN)
11735     {
11736       /* Handle -mipsN.  At this point, file_mips_isa contains the
11737 	 ISA level specified by -mipsN, while arch_info->isa contains
11738 	 the -march selection (if any).  */
11739       if (arch_info != 0)
11740 	{
11741 	  /* -march takes precedence over -mipsN, since it is more descriptive.
11742 	     There's no harm in specifying both as long as the ISA levels
11743 	     are the same.  */
11744 	  if (file_mips_isa != arch_info->isa)
11745 	    as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11746 		    mips_cpu_info_from_isa (file_mips_isa)->name,
11747 		    mips_cpu_info_from_isa (arch_info->isa)->name);
11748 	}
11749       else
11750 	arch_info = mips_cpu_info_from_isa (file_mips_isa);
11751     }
11752 
11753   if (arch_info == 0)
11754     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11755 
11756   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11757     as_bad ("-march=%s is not compatible with the selected ABI",
11758 	    arch_info->name);
11759 
11760   mips_set_architecture (arch_info);
11761 
11762   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11763   if (mips_tune_string != 0)
11764     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11765 
11766   if (tune_info == 0)
11767     mips_set_tune (arch_info);
11768   else
11769     mips_set_tune (tune_info);
11770 
11771   if (file_mips_gp32 >= 0)
11772     {
11773       /* The user specified the size of the integer registers.  Make sure
11774 	 it agrees with the ABI and ISA.  */
11775       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11776 	as_bad (_("-mgp64 used with a 32-bit processor"));
11777       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11778 	as_bad (_("-mgp32 used with a 64-bit ABI"));
11779       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11780 	as_bad (_("-mgp64 used with a 32-bit ABI"));
11781     }
11782   else
11783     {
11784       /* Infer the integer register size from the ABI and processor.
11785 	 Restrict ourselves to 32-bit registers if that's all the
11786 	 processor has, or if the ABI cannot handle 64-bit registers.  */
11787       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11788 			|| !ISA_HAS_64BIT_REGS (mips_opts.isa));
11789     }
11790 
11791   switch (file_mips_fp32)
11792     {
11793     default:
11794     case -1:
11795       /* No user specified float register size.
11796 	 ??? GAS treats single-float processors as though they had 64-bit
11797 	 float registers (although it complains when double-precision
11798 	 instructions are used).  As things stand, saying they have 32-bit
11799 	 registers would lead to spurious "register must be even" messages.
11800 	 So here we assume float registers are never smaller than the
11801 	 integer ones.  */
11802       if (file_mips_gp32 == 0)
11803 	/* 64-bit integer registers implies 64-bit float registers.  */
11804 	file_mips_fp32 = 0;
11805       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11806 	       && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11807 	/* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11808 	file_mips_fp32 = 0;
11809       else
11810 	/* 32-bit float registers.  */
11811 	file_mips_fp32 = 1;
11812       break;
11813 
11814     /* The user specified the size of the float registers.  Check if it
11815        agrees with the ABI and ISA.  */
11816     case 0:
11817       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11818 	as_bad (_("-mfp64 used with a 32-bit fpu"));
11819       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11820 	       && !ISA_HAS_MXHC1 (mips_opts.isa))
11821 	as_warn (_("-mfp64 used with a 32-bit ABI"));
11822       break;
11823     case 1:
11824       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11825 	as_warn (_("-mfp32 used with a 64-bit ABI"));
11826       break;
11827     }
11828 
11829   /* End of GCC-shared inference code.  */
11830 
11831   /* This flag is set when we have a 64-bit capable CPU but use only
11832      32-bit wide registers.  Note that EABI does not use it.  */
11833   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11834       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11835 	  || mips_abi == O32_ABI))
11836     mips_32bitmode = 1;
11837 
11838   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11839     as_bad (_("trap exception not supported at ISA 1"));
11840 
11841   /* If the selected architecture includes support for ASEs, enable
11842      generation of code for them.  */
11843   if (mips_opts.mips16 == -1)
11844     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11845   if (mips_opts.ase_mips3d == -1)
11846     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11847 			    && file_mips_fp32 == 0) ? 1 : 0;
11848   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11849     as_bad (_("-mfp32 used with -mips3d"));
11850 
11851   if (mips_opts.ase_mdmx == -1)
11852     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11853 			  && file_mips_fp32 == 0) ? 1 : 0;
11854   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11855     as_bad (_("-mfp32 used with -mdmx"));
11856 
11857   if (mips_opts.ase_smartmips == -1)
11858     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11859   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11860       as_warn ("%s ISA does not support SmartMIPS",
11861 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11862 
11863   if (mips_opts.ase_dsp == -1)
11864     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11865   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11866       as_warn ("%s ISA does not support DSP ASE",
11867 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11868 
11869   if (mips_opts.ase_dspr2 == -1)
11870     {
11871       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11872       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11873     }
11874   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11875       as_warn ("%s ISA does not support DSP R2 ASE",
11876 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11877 
11878   if (mips_opts.ase_mt == -1)
11879     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11880   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11881       as_warn ("%s ISA does not support MT ASE",
11882 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11883 
11884   file_mips_isa = mips_opts.isa;
11885   file_ase_mips16 = mips_opts.mips16;
11886   file_ase_mips3d = mips_opts.ase_mips3d;
11887   file_ase_mdmx = mips_opts.ase_mdmx;
11888   file_ase_smartmips = mips_opts.ase_smartmips;
11889   file_ase_dsp = mips_opts.ase_dsp;
11890   file_ase_dspr2 = mips_opts.ase_dspr2;
11891   file_ase_mt = mips_opts.ase_mt;
11892   mips_opts.gp32 = file_mips_gp32;
11893   mips_opts.fp32 = file_mips_fp32;
11894   mips_opts.soft_float = file_mips_soft_float;
11895   mips_opts.single_float = file_mips_single_float;
11896 
11897   if (mips_flag_mdebug < 0)
11898     {
11899 #ifdef OBJ_MAYBE_ECOFF
11900       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11901 	mips_flag_mdebug = 1;
11902       else
11903 #endif /* OBJ_MAYBE_ECOFF */
11904 	mips_flag_mdebug = 0;
11905     }
11906 }
11907 
11908 void
11909 mips_init_after_args (void)
11910 {
11911   /* initialize opcodes */
11912   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11913   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11914 }
11915 
11916 long
11917 md_pcrel_from (fixS *fixP)
11918 {
11919   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11920   switch (fixP->fx_r_type)
11921     {
11922     case BFD_RELOC_16_PCREL_S2:
11923     case BFD_RELOC_MIPS_JMP:
11924       /* Return the address of the delay slot.  */
11925       return addr + 4;
11926     default:
11927       /* We have no relocation type for PC relative MIPS16 instructions.  */
11928       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11929 	as_bad_where (fixP->fx_file, fixP->fx_line,
11930 		      _("PC relative MIPS16 instruction references a different section"));
11931       return addr;
11932     }
11933 }
11934 
11935 /* This is called before the symbol table is processed.  In order to
11936    work with gcc when using mips-tfile, we must keep all local labels.
11937    However, in other cases, we want to discard them.  If we were
11938    called with -g, but we didn't see any debugging information, it may
11939    mean that gcc is smuggling debugging information through to
11940    mips-tfile, in which case we must generate all local labels.  */
11941 
11942 void
11943 mips_frob_file_before_adjust (void)
11944 {
11945 #ifndef NO_ECOFF_DEBUGGING
11946   if (ECOFF_DEBUGGING
11947       && mips_debug != 0
11948       && ! ecoff_debugging_seen)
11949     flag_keep_locals = 1;
11950 #endif
11951 }
11952 
11953 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11954    the corresponding LO16 reloc.  This is called before md_apply_fix and
11955    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11956    relocation operators.
11957 
11958    For our purposes, a %lo() expression matches a %got() or %hi()
11959    expression if:
11960 
11961       (a) it refers to the same symbol; and
11962       (b) the offset applied in the %lo() expression is no lower than
11963 	  the offset applied in the %got() or %hi().
11964 
11965    (b) allows us to cope with code like:
11966 
11967 	lui	$4,%hi(foo)
11968 	lh	$4,%lo(foo+2)($4)
11969 
11970    ...which is legal on RELA targets, and has a well-defined behaviour
11971    if the user knows that adding 2 to "foo" will not induce a carry to
11972    the high 16 bits.
11973 
11974    When several %lo()s match a particular %got() or %hi(), we use the
11975    following rules to distinguish them:
11976 
11977      (1) %lo()s with smaller offsets are a better match than %lo()s with
11978          higher offsets.
11979 
11980      (2) %lo()s with no matching %got() or %hi() are better than those
11981          that already have a matching %got() or %hi().
11982 
11983      (3) later %lo()s are better than earlier %lo()s.
11984 
11985    These rules are applied in order.
11986 
11987    (1) means, among other things, that %lo()s with identical offsets are
11988    chosen if they exist.
11989 
11990    (2) means that we won't associate several high-part relocations with
11991    the same low-part relocation unless there's no alternative.  Having
11992    several high parts for the same low part is a GNU extension; this rule
11993    allows careful users to avoid it.
11994 
11995    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11996    with the last high-part relocation being at the front of the list.
11997    It therefore makes sense to choose the last matching low-part
11998    relocation, all other things being equal.  It's also easier
11999    to code that way.  */
12000 
12001 void
12002 mips_frob_file (void)
12003 {
12004   struct mips_hi_fixup *l;
12005   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12006 
12007   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12008     {
12009       segment_info_type *seginfo;
12010       bfd_boolean matched_lo_p;
12011       fixS **hi_pos, **lo_pos, **pos;
12012 
12013       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12014 
12015       /* If a GOT16 relocation turns out to be against a global symbol,
12016 	 there isn't supposed to be a matching LO.  */
12017       if (got16_reloc_p (l->fixp->fx_r_type)
12018 	  && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12019 	continue;
12020 
12021       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12022       if (fixup_has_matching_lo_p (l->fixp))
12023 	continue;
12024 
12025       seginfo = seg_info (l->seg);
12026 
12027       /* Set HI_POS to the position of this relocation in the chain.
12028 	 Set LO_POS to the position of the chosen low-part relocation.
12029 	 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12030 	 relocation that matches an immediately-preceding high-part
12031 	 relocation.  */
12032       hi_pos = NULL;
12033       lo_pos = NULL;
12034       matched_lo_p = FALSE;
12035       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12036 
12037       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12038 	{
12039 	  if (*pos == l->fixp)
12040 	    hi_pos = pos;
12041 
12042 	  if ((*pos)->fx_r_type == looking_for_rtype
12043 	      && (*pos)->fx_addsy == l->fixp->fx_addsy
12044 	      && (*pos)->fx_offset >= l->fixp->fx_offset
12045 	      && (lo_pos == NULL
12046 		  || (*pos)->fx_offset < (*lo_pos)->fx_offset
12047 		  || (!matched_lo_p
12048 		      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12049 	    lo_pos = pos;
12050 
12051 	  matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12052 			  && fixup_has_matching_lo_p (*pos));
12053 	}
12054 
12055       /* If we found a match, remove the high-part relocation from its
12056 	 current position and insert it before the low-part relocation.
12057 	 Make the offsets match so that fixup_has_matching_lo_p()
12058 	 will return true.
12059 
12060 	 We don't warn about unmatched high-part relocations since some
12061 	 versions of gcc have been known to emit dead "lui ...%hi(...)"
12062 	 instructions.  */
12063       if (lo_pos != NULL)
12064 	{
12065 	  l->fixp->fx_offset = (*lo_pos)->fx_offset;
12066 	  if (l->fixp->fx_next != *lo_pos)
12067 	    {
12068 	      *hi_pos = l->fixp->fx_next;
12069 	      l->fixp->fx_next = *lo_pos;
12070 	      *lo_pos = l->fixp;
12071 	    }
12072 	}
12073     }
12074 }
12075 
12076 /* We may have combined relocations without symbols in the N32/N64 ABI.
12077    We have to prevent gas from dropping them.  */
12078 
12079 int
12080 mips_force_relocation (fixS *fixp)
12081 {
12082   if (generic_force_reloc (fixp))
12083     return 1;
12084 
12085   if (HAVE_NEWABI
12086       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12087       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12088 	  || hi16_reloc_p (fixp->fx_r_type)
12089 	  || lo16_reloc_p (fixp->fx_r_type)))
12090     return 1;
12091 
12092   return 0;
12093 }
12094 
12095 /* Apply a fixup to the object file.  */
12096 
12097 void
12098 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12099 {
12100   bfd_byte *buf;
12101   long insn;
12102   reloc_howto_type *howto;
12103 
12104   /* We ignore generic BFD relocations we don't know about.  */
12105   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12106   if (! howto)
12107     return;
12108 
12109   assert (fixP->fx_size == 4
12110 	  || fixP->fx_r_type == BFD_RELOC_16
12111 	  || fixP->fx_r_type == BFD_RELOC_64
12112 	  || fixP->fx_r_type == BFD_RELOC_CTOR
12113 	  || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12114 	  || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12115 	  || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12116 	  || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12117 
12118   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12119 
12120   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12121 
12122   /* Don't treat parts of a composite relocation as done.  There are two
12123      reasons for this:
12124 
12125      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12126 	 should nevertheless be emitted if the first part is.
12127 
12128      (2) In normal usage, composite relocations are never assembly-time
12129 	 constants.  The easiest way of dealing with the pathological
12130 	 exceptions is to generate a relocation against STN_UNDEF and
12131 	 leave everything up to the linker.  */
12132   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12133     fixP->fx_done = 1;
12134 
12135   switch (fixP->fx_r_type)
12136     {
12137     case BFD_RELOC_MIPS_TLS_GD:
12138     case BFD_RELOC_MIPS_TLS_LDM:
12139     case BFD_RELOC_MIPS_TLS_DTPREL32:
12140     case BFD_RELOC_MIPS_TLS_DTPREL64:
12141     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12142     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12143     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12144     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12145     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12146       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12147       /* fall through */
12148 
12149     case BFD_RELOC_MIPS_JMP:
12150     case BFD_RELOC_MIPS_SHIFT5:
12151     case BFD_RELOC_MIPS_SHIFT6:
12152     case BFD_RELOC_MIPS_GOT_DISP:
12153     case BFD_RELOC_MIPS_GOT_PAGE:
12154     case BFD_RELOC_MIPS_GOT_OFST:
12155     case BFD_RELOC_MIPS_SUB:
12156     case BFD_RELOC_MIPS_INSERT_A:
12157     case BFD_RELOC_MIPS_INSERT_B:
12158     case BFD_RELOC_MIPS_DELETE:
12159     case BFD_RELOC_MIPS_HIGHEST:
12160     case BFD_RELOC_MIPS_HIGHER:
12161     case BFD_RELOC_MIPS_SCN_DISP:
12162     case BFD_RELOC_MIPS_REL16:
12163     case BFD_RELOC_MIPS_RELGOT:
12164     case BFD_RELOC_MIPS_JALR:
12165     case BFD_RELOC_HI16:
12166     case BFD_RELOC_HI16_S:
12167     case BFD_RELOC_GPREL16:
12168     case BFD_RELOC_MIPS_LITERAL:
12169     case BFD_RELOC_MIPS_CALL16:
12170     case BFD_RELOC_MIPS_GOT16:
12171     case BFD_RELOC_GPREL32:
12172     case BFD_RELOC_MIPS_GOT_HI16:
12173     case BFD_RELOC_MIPS_GOT_LO16:
12174     case BFD_RELOC_MIPS_CALL_HI16:
12175     case BFD_RELOC_MIPS_CALL_LO16:
12176     case BFD_RELOC_MIPS16_GPREL:
12177     case BFD_RELOC_MIPS16_GOT16:
12178     case BFD_RELOC_MIPS16_CALL16:
12179     case BFD_RELOC_MIPS16_HI16:
12180     case BFD_RELOC_MIPS16_HI16_S:
12181     case BFD_RELOC_MIPS16_JMP:
12182       /* Nothing needed to do.  The value comes from the reloc entry.  */
12183       break;
12184 
12185     case BFD_RELOC_64:
12186       /* This is handled like BFD_RELOC_32, but we output a sign
12187          extended value if we are only 32 bits.  */
12188       if (fixP->fx_done)
12189 	{
12190 	  if (8 <= sizeof (valueT))
12191 	    md_number_to_chars ((char *) buf, *valP, 8);
12192 	  else
12193 	    {
12194 	      valueT hiv;
12195 
12196 	      if ((*valP & 0x80000000) != 0)
12197 		hiv = 0xffffffff;
12198 	      else
12199 		hiv = 0;
12200 	      md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12201 				  *valP, 4);
12202 	      md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12203 				  hiv, 4);
12204 	    }
12205 	}
12206       break;
12207 
12208     case BFD_RELOC_RVA:
12209     case BFD_RELOC_32:
12210     case BFD_RELOC_16:
12211       /* If we are deleting this reloc entry, we must fill in the
12212 	 value now.  This can happen if we have a .word which is not
12213 	 resolved when it appears but is later defined.  */
12214       if (fixP->fx_done)
12215 	md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12216       break;
12217 
12218     case BFD_RELOC_LO16:
12219     case BFD_RELOC_MIPS16_LO16:
12220       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12221 	 may be safe to remove, but if so it's not obvious.  */
12222       /* When handling an embedded PIC switch statement, we can wind
12223 	 up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12224       if (fixP->fx_done)
12225 	{
12226 	  if (*valP + 0x8000 > 0xffff)
12227 	    as_bad_where (fixP->fx_file, fixP->fx_line,
12228 			  _("relocation overflow"));
12229 	  if (target_big_endian)
12230 	    buf += 2;
12231 	  md_number_to_chars ((char *) buf, *valP, 2);
12232 	}
12233       break;
12234 
12235     case BFD_RELOC_16_PCREL_S2:
12236       if ((*valP & 0x3) != 0)
12237 	as_bad_where (fixP->fx_file, fixP->fx_line,
12238 		      _("Branch to misaligned address (%lx)"), (long) *valP);
12239 
12240       /* We need to save the bits in the instruction since fixup_segment()
12241 	 might be deleting the relocation entry (i.e., a branch within
12242 	 the current segment).  */
12243       if (! fixP->fx_done)
12244 	break;
12245 
12246       /* Update old instruction data.  */
12247       if (target_big_endian)
12248 	insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12249       else
12250 	insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12251 
12252       if (*valP + 0x20000 <= 0x3ffff)
12253 	{
12254 	  insn |= (*valP >> 2) & 0xffff;
12255 	  md_number_to_chars ((char *) buf, insn, 4);
12256 	}
12257       else if (mips_pic == NO_PIC
12258 	       && fixP->fx_done
12259 	       && fixP->fx_frag->fr_address >= text_section->vma
12260 	       && (fixP->fx_frag->fr_address
12261 		   < text_section->vma + bfd_get_section_size (text_section))
12262 	       && ((insn & 0xffff0000) == 0x10000000	 /* beq $0,$0 */
12263 		   || (insn & 0xffff0000) == 0x04010000	 /* bgez $0 */
12264 		   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12265 	{
12266 	  /* The branch offset is too large.  If this is an
12267              unconditional branch, and we are not generating PIC code,
12268              we can convert it to an absolute jump instruction.  */
12269 	  if ((insn & 0xffff0000) == 0x04110000)	 /* bgezal $0 */
12270 	    insn = 0x0c000000;	/* jal */
12271 	  else
12272 	    insn = 0x08000000;	/* j */
12273 	  fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12274 	  fixP->fx_done = 0;
12275 	  fixP->fx_addsy = section_symbol (text_section);
12276 	  *valP += md_pcrel_from (fixP);
12277 	  md_number_to_chars ((char *) buf, insn, 4);
12278 	}
12279       else
12280 	{
12281 	  /* If we got here, we have branch-relaxation disabled,
12282 	     and there's nothing we can do to fix this instruction
12283 	     without turning it into a longer sequence.  */
12284 	  as_bad_where (fixP->fx_file, fixP->fx_line,
12285 			_("Branch out of range"));
12286 	}
12287       break;
12288 
12289     case BFD_RELOC_VTABLE_INHERIT:
12290       fixP->fx_done = 0;
12291       if (fixP->fx_addsy
12292           && !S_IS_DEFINED (fixP->fx_addsy)
12293           && !S_IS_WEAK (fixP->fx_addsy))
12294         S_SET_WEAK (fixP->fx_addsy);
12295       break;
12296 
12297     case BFD_RELOC_VTABLE_ENTRY:
12298       fixP->fx_done = 0;
12299       break;
12300 
12301     default:
12302       internalError ();
12303     }
12304 
12305   /* Remember value for tc_gen_reloc.  */
12306   fixP->fx_addnumber = *valP;
12307 }
12308 
12309 static symbolS *
12310 get_symbol (void)
12311 {
12312   int c;
12313   char *name;
12314   symbolS *p;
12315 
12316   name = input_line_pointer;
12317   c = get_symbol_end ();
12318   p = (symbolS *) symbol_find_or_make (name);
12319   *input_line_pointer = c;
12320   return p;
12321 }
12322 
12323 /* Align the current frag to a given power of two.  If a particular
12324    fill byte should be used, FILL points to an integer that contains
12325    that byte, otherwise FILL is null.
12326 
12327    The MIPS assembler also automatically adjusts any preceding
12328    label.  */
12329 
12330 static void
12331 mips_align (int to, int *fill, symbolS *label)
12332 {
12333   mips_emit_delays ();
12334   mips_record_mips16_mode ();
12335   if (fill == NULL && subseg_text_p (now_seg))
12336     frag_align_code (to, 0);
12337   else
12338     frag_align (to, fill ? *fill : 0, 0);
12339   record_alignment (now_seg, to);
12340   if (label != NULL)
12341     {
12342       assert (S_GET_SEGMENT (label) == now_seg);
12343       symbol_set_frag (label, frag_now);
12344       S_SET_VALUE (label, (valueT) frag_now_fix ());
12345     }
12346 }
12347 
12348 /* Align to a given power of two.  .align 0 turns off the automatic
12349    alignment used by the data creating pseudo-ops.  */
12350 
12351 static void
12352 s_align (int x ATTRIBUTE_UNUSED)
12353 {
12354   int temp, fill_value, *fill_ptr;
12355   long max_alignment = 28;
12356 
12357   /* o Note that the assembler pulls down any immediately preceding label
12358        to the aligned address.
12359      o It's not documented but auto alignment is reinstated by
12360        a .align pseudo instruction.
12361      o Note also that after auto alignment is turned off the mips assembler
12362        issues an error on attempt to assemble an improperly aligned data item.
12363        We don't.  */
12364 
12365   temp = get_absolute_expression ();
12366   if (temp > max_alignment)
12367     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12368   else if (temp < 0)
12369     {
12370       as_warn (_("Alignment negative: 0 assumed."));
12371       temp = 0;
12372     }
12373   if (*input_line_pointer == ',')
12374     {
12375       ++input_line_pointer;
12376       fill_value = get_absolute_expression ();
12377       fill_ptr = &fill_value;
12378     }
12379   else
12380     fill_ptr = 0;
12381   if (temp)
12382     {
12383       segment_info_type *si = seg_info (now_seg);
12384       struct insn_label_list *l = si->label_list;
12385       /* Auto alignment should be switched on by next section change.  */
12386       auto_align = 1;
12387       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12388     }
12389   else
12390     {
12391       auto_align = 0;
12392     }
12393 
12394   demand_empty_rest_of_line ();
12395 }
12396 
12397 static void
12398 s_change_sec (int sec)
12399 {
12400   segT seg;
12401 
12402 #ifdef OBJ_ELF
12403   /* The ELF backend needs to know that we are changing sections, so
12404      that .previous works correctly.  We could do something like check
12405      for an obj_section_change_hook macro, but that might be confusing
12406      as it would not be appropriate to use it in the section changing
12407      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12408      This should be cleaner, somehow.  */
12409   if (IS_ELF)
12410     obj_elf_section_change_hook ();
12411 #endif
12412 
12413   mips_emit_delays ();
12414   switch (sec)
12415     {
12416     case 't':
12417       s_text (0);
12418       break;
12419     case 'd':
12420       s_data (0);
12421       break;
12422     case 'b':
12423       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12424       demand_empty_rest_of_line ();
12425       break;
12426 
12427     case 'r':
12428       seg = subseg_new (RDATA_SECTION_NAME,
12429 			(subsegT) get_absolute_expression ());
12430       if (IS_ELF)
12431 	{
12432 	  bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12433 						  | SEC_READONLY | SEC_RELOC
12434 						  | SEC_DATA));
12435 	  if (strncmp (TARGET_OS, "elf", 3) != 0)
12436 	    record_alignment (seg, 4);
12437 	}
12438       demand_empty_rest_of_line ();
12439       break;
12440 
12441     case 's':
12442       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12443       if (IS_ELF)
12444 	{
12445 	  bfd_set_section_flags (stdoutput, seg,
12446 				 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12447 	  if (strncmp (TARGET_OS, "elf", 3) != 0)
12448 	    record_alignment (seg, 4);
12449 	}
12450       demand_empty_rest_of_line ();
12451       break;
12452     }
12453 
12454   auto_align = 1;
12455 }
12456 
12457 void
12458 s_change_section (int ignore ATTRIBUTE_UNUSED)
12459 {
12460 #ifdef OBJ_ELF
12461   char *section_name;
12462   char c;
12463   char next_c = 0;
12464   int section_type;
12465   int section_flag;
12466   int section_entry_size;
12467   int section_alignment;
12468 
12469   if (!IS_ELF)
12470     return;
12471 
12472   section_name = input_line_pointer;
12473   c = get_symbol_end ();
12474   if (c)
12475     next_c = *(input_line_pointer + 1);
12476 
12477   /* Do we have .section Name<,"flags">?  */
12478   if (c != ',' || (c == ',' && next_c == '"'))
12479     {
12480       /* just after name is now '\0'.  */
12481       *input_line_pointer = c;
12482       input_line_pointer = section_name;
12483       obj_elf_section (ignore);
12484       return;
12485     }
12486   input_line_pointer++;
12487 
12488   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12489   if (c == ',')
12490     section_type = get_absolute_expression ();
12491   else
12492     section_type = 0;
12493   if (*input_line_pointer++ == ',')
12494     section_flag = get_absolute_expression ();
12495   else
12496     section_flag = 0;
12497   if (*input_line_pointer++ == ',')
12498     section_entry_size = get_absolute_expression ();
12499   else
12500     section_entry_size = 0;
12501   if (*input_line_pointer++ == ',')
12502     section_alignment = get_absolute_expression ();
12503   else
12504     section_alignment = 0;
12505 
12506   section_name = xstrdup (section_name);
12507 
12508   /* When using the generic form of .section (as implemented by obj-elf.c),
12509      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12510      traditionally had to fall back on the more common @progbits instead.
12511 
12512      There's nothing really harmful in this, since bfd will correct
12513      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12514      means that, for backwards compatibility, the special_section entries
12515      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12516 
12517      Even so, we shouldn't force users of the MIPS .section syntax to
12518      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12519      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12520      generic type-checking code.  */
12521   if (section_type == SHT_MIPS_DWARF)
12522     section_type = SHT_PROGBITS;
12523 
12524   obj_elf_change_section (section_name, section_type, section_flag,
12525 			  section_entry_size, 0, 0, 0);
12526 
12527   if (now_seg->name != section_name)
12528     free (section_name);
12529 #endif /* OBJ_ELF */
12530 }
12531 
12532 void
12533 mips_enable_auto_align (void)
12534 {
12535   auto_align = 1;
12536 }
12537 
12538 static void
12539 s_cons (int log_size)
12540 {
12541   segment_info_type *si = seg_info (now_seg);
12542   struct insn_label_list *l = si->label_list;
12543   symbolS *label;
12544 
12545   label = l != NULL ? l->label : NULL;
12546   mips_emit_delays ();
12547   if (log_size > 0 && auto_align)
12548     mips_align (log_size, 0, label);
12549   mips_clear_insn_labels ();
12550   cons (1 << log_size);
12551 }
12552 
12553 static void
12554 s_float_cons (int type)
12555 {
12556   segment_info_type *si = seg_info (now_seg);
12557   struct insn_label_list *l = si->label_list;
12558   symbolS *label;
12559 
12560   label = l != NULL ? l->label : NULL;
12561 
12562   mips_emit_delays ();
12563 
12564   if (auto_align)
12565     {
12566       if (type == 'd')
12567 	mips_align (3, 0, label);
12568       else
12569 	mips_align (2, 0, label);
12570     }
12571 
12572   mips_clear_insn_labels ();
12573 
12574   float_cons (type);
12575 }
12576 
12577 /* Handle .globl.  We need to override it because on Irix 5 you are
12578    permitted to say
12579        .globl foo .text
12580    where foo is an undefined symbol, to mean that foo should be
12581    considered to be the address of a function.  */
12582 
12583 static void
12584 s_mips_globl (int x ATTRIBUTE_UNUSED)
12585 {
12586   char *name;
12587   int c;
12588   symbolS *symbolP;
12589   flagword flag;
12590 
12591   do
12592     {
12593       name = input_line_pointer;
12594       c = get_symbol_end ();
12595       symbolP = symbol_find_or_make (name);
12596       S_SET_EXTERNAL (symbolP);
12597 
12598       *input_line_pointer = c;
12599       SKIP_WHITESPACE ();
12600 
12601       /* On Irix 5, every global symbol that is not explicitly labelled as
12602          being a function is apparently labelled as being an object.  */
12603       flag = BSF_OBJECT;
12604 
12605       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12606 	  && (*input_line_pointer != ','))
12607 	{
12608 	  char *secname;
12609 	  asection *sec;
12610 
12611 	  secname = input_line_pointer;
12612 	  c = get_symbol_end ();
12613 	  sec = bfd_get_section_by_name (stdoutput, secname);
12614 	  if (sec == NULL)
12615 	    as_bad (_("%s: no such section"), secname);
12616 	  *input_line_pointer = c;
12617 
12618 	  if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12619 	    flag = BSF_FUNCTION;
12620 	}
12621 
12622       symbol_get_bfdsym (symbolP)->flags |= flag;
12623 
12624       c = *input_line_pointer;
12625       if (c == ',')
12626 	{
12627 	  input_line_pointer++;
12628 	  SKIP_WHITESPACE ();
12629 	  if (is_end_of_line[(unsigned char) *input_line_pointer])
12630 	    c = '\n';
12631 	}
12632     }
12633   while (c == ',');
12634 
12635   demand_empty_rest_of_line ();
12636 }
12637 
12638 static void
12639 s_option (int x ATTRIBUTE_UNUSED)
12640 {
12641   char *opt;
12642   char c;
12643 
12644   opt = input_line_pointer;
12645   c = get_symbol_end ();
12646 
12647   if (*opt == 'O')
12648     {
12649       /* FIXME: What does this mean?  */
12650     }
12651   else if (strncmp (opt, "pic", 3) == 0)
12652     {
12653       int i;
12654 
12655       i = atoi (opt + 3);
12656       if (i == 0)
12657 	mips_pic = NO_PIC;
12658       else if (i == 2)
12659 	{
12660 	mips_pic = SVR4_PIC;
12661 	  mips_abicalls = TRUE;
12662 	}
12663       else
12664 	as_bad (_(".option pic%d not supported"), i);
12665 
12666       if (mips_pic == SVR4_PIC)
12667 	{
12668 	  if (g_switch_seen && g_switch_value != 0)
12669 	    as_warn (_("-G may not be used with SVR4 PIC code"));
12670 	  g_switch_value = 0;
12671 	  bfd_set_gp_size (stdoutput, 0);
12672 	}
12673     }
12674   else
12675     as_warn (_("Unrecognized option \"%s\""), opt);
12676 
12677   *input_line_pointer = c;
12678   demand_empty_rest_of_line ();
12679 }
12680 
12681 /* This structure is used to hold a stack of .set values.  */
12682 
12683 struct mips_option_stack
12684 {
12685   struct mips_option_stack *next;
12686   struct mips_set_options options;
12687 };
12688 
12689 static struct mips_option_stack *mips_opts_stack;
12690 
12691 /* Handle the .set pseudo-op.  */
12692 
12693 static void
12694 s_mipsset (int x ATTRIBUTE_UNUSED)
12695 {
12696   char *name = input_line_pointer, ch;
12697 
12698   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12699     ++input_line_pointer;
12700   ch = *input_line_pointer;
12701   *input_line_pointer = '\0';
12702 
12703   if (strcmp (name, "reorder") == 0)
12704     {
12705       if (mips_opts.noreorder)
12706 	end_noreorder ();
12707     }
12708   else if (strcmp (name, "noreorder") == 0)
12709     {
12710       if (!mips_opts.noreorder)
12711 	start_noreorder ();
12712     }
12713   else if (strncmp (name, "at=", 3) == 0)
12714     {
12715       char *s = name + 3;
12716 
12717       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12718 	as_bad (_("Unrecognized register name `%s'"), s);
12719     }
12720   else if (strcmp (name, "at") == 0)
12721     {
12722       mips_opts.at = ATREG;
12723     }
12724   else if (strcmp (name, "noat") == 0)
12725     {
12726       mips_opts.at = ZERO;
12727     }
12728   else if (strcmp (name, "macro") == 0)
12729     {
12730       mips_opts.warn_about_macros = 0;
12731     }
12732   else if (strcmp (name, "nomacro") == 0)
12733     {
12734       if (mips_opts.noreorder == 0)
12735 	as_bad (_("`noreorder' must be set before `nomacro'"));
12736       mips_opts.warn_about_macros = 1;
12737     }
12738   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12739     {
12740       mips_opts.nomove = 0;
12741     }
12742   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12743     {
12744       mips_opts.nomove = 1;
12745     }
12746   else if (strcmp (name, "bopt") == 0)
12747     {
12748       mips_opts.nobopt = 0;
12749     }
12750   else if (strcmp (name, "nobopt") == 0)
12751     {
12752       mips_opts.nobopt = 1;
12753     }
12754   else if (strcmp (name, "gp=default") == 0)
12755     mips_opts.gp32 = file_mips_gp32;
12756   else if (strcmp (name, "gp=32") == 0)
12757     mips_opts.gp32 = 1;
12758   else if (strcmp (name, "gp=64") == 0)
12759     {
12760       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12761 	as_warn ("%s isa does not support 64-bit registers",
12762 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12763       mips_opts.gp32 = 0;
12764     }
12765   else if (strcmp (name, "fp=default") == 0)
12766     mips_opts.fp32 = file_mips_fp32;
12767   else if (strcmp (name, "fp=32") == 0)
12768     mips_opts.fp32 = 1;
12769   else if (strcmp (name, "fp=64") == 0)
12770     {
12771       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12772 	as_warn ("%s isa does not support 64-bit floating point registers",
12773 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12774       mips_opts.fp32 = 0;
12775     }
12776   else if (strcmp (name, "softfloat") == 0)
12777     mips_opts.soft_float = 1;
12778   else if (strcmp (name, "hardfloat") == 0)
12779     mips_opts.soft_float = 0;
12780   else if (strcmp (name, "singlefloat") == 0)
12781     mips_opts.single_float = 1;
12782   else if (strcmp (name, "doublefloat") == 0)
12783     mips_opts.single_float = 0;
12784   else if (strcmp (name, "mips16") == 0
12785 	   || strcmp (name, "MIPS-16") == 0)
12786     mips_opts.mips16 = 1;
12787   else if (strcmp (name, "nomips16") == 0
12788 	   || strcmp (name, "noMIPS-16") == 0)
12789     mips_opts.mips16 = 0;
12790   else if (strcmp (name, "smartmips") == 0)
12791     {
12792       if (!ISA_SUPPORTS_SMARTMIPS)
12793 	as_warn ("%s ISA does not support SmartMIPS ASE",
12794 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12795       mips_opts.ase_smartmips = 1;
12796     }
12797   else if (strcmp (name, "nosmartmips") == 0)
12798     mips_opts.ase_smartmips = 0;
12799   else if (strcmp (name, "mips3d") == 0)
12800     mips_opts.ase_mips3d = 1;
12801   else if (strcmp (name, "nomips3d") == 0)
12802     mips_opts.ase_mips3d = 0;
12803   else if (strcmp (name, "mdmx") == 0)
12804     mips_opts.ase_mdmx = 1;
12805   else if (strcmp (name, "nomdmx") == 0)
12806     mips_opts.ase_mdmx = 0;
12807   else if (strcmp (name, "dsp") == 0)
12808     {
12809       if (!ISA_SUPPORTS_DSP_ASE)
12810 	as_warn ("%s ISA does not support DSP ASE",
12811 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12812       mips_opts.ase_dsp = 1;
12813       mips_opts.ase_dspr2 = 0;
12814     }
12815   else if (strcmp (name, "nodsp") == 0)
12816     {
12817       mips_opts.ase_dsp = 0;
12818       mips_opts.ase_dspr2 = 0;
12819     }
12820   else if (strcmp (name, "dspr2") == 0)
12821     {
12822       if (!ISA_SUPPORTS_DSPR2_ASE)
12823 	as_warn ("%s ISA does not support DSP R2 ASE",
12824 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12825       mips_opts.ase_dspr2 = 1;
12826       mips_opts.ase_dsp = 1;
12827     }
12828   else if (strcmp (name, "nodspr2") == 0)
12829     {
12830       mips_opts.ase_dspr2 = 0;
12831       mips_opts.ase_dsp = 0;
12832     }
12833   else if (strcmp (name, "mt") == 0)
12834     {
12835       if (!ISA_SUPPORTS_MT_ASE)
12836 	as_warn ("%s ISA does not support MT ASE",
12837 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12838       mips_opts.ase_mt = 1;
12839     }
12840   else if (strcmp (name, "nomt") == 0)
12841     mips_opts.ase_mt = 0;
12842   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12843     {
12844       int reset = 0;
12845 
12846       /* Permit the user to change the ISA and architecture on the fly.
12847 	 Needless to say, misuse can cause serious problems.  */
12848       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12849 	{
12850 	  reset = 1;
12851 	  mips_opts.isa = file_mips_isa;
12852 	  mips_opts.arch = file_mips_arch;
12853 	}
12854       else if (strncmp (name, "arch=", 5) == 0)
12855 	{
12856 	  const struct mips_cpu_info *p;
12857 
12858 	  p = mips_parse_cpu("internal use", name + 5);
12859 	  if (!p)
12860 	    as_bad (_("unknown architecture %s"), name + 5);
12861 	  else
12862 	    {
12863 	      mips_opts.arch = p->cpu;
12864 	      mips_opts.isa = p->isa;
12865 	    }
12866 	}
12867       else if (strncmp (name, "mips", 4) == 0)
12868 	{
12869 	  const struct mips_cpu_info *p;
12870 
12871 	  p = mips_parse_cpu("internal use", name);
12872 	  if (!p)
12873 	    as_bad (_("unknown ISA level %s"), name + 4);
12874 	  else
12875 	    {
12876 	      mips_opts.arch = p->cpu;
12877 	      mips_opts.isa = p->isa;
12878 	    }
12879 	}
12880       else
12881 	as_bad (_("unknown ISA or architecture %s"), name);
12882 
12883       switch (mips_opts.isa)
12884 	{
12885 	case  0:
12886 	  break;
12887 	case ISA_MIPS1:
12888 	case ISA_MIPS2:
12889 	case ISA_MIPS32:
12890 	case ISA_MIPS32R2:
12891 	  mips_opts.gp32 = 1;
12892 	  mips_opts.fp32 = 1;
12893 	  break;
12894 	case ISA_MIPS3:
12895 	case ISA_MIPS4:
12896 	case ISA_MIPS5:
12897 	case ISA_MIPS64:
12898 	case ISA_MIPS64R2:
12899 	  mips_opts.gp32 = 0;
12900 	  mips_opts.fp32 = 0;
12901 	  break;
12902 	default:
12903 	  as_bad (_("unknown ISA level %s"), name + 4);
12904 	  break;
12905 	}
12906       if (reset)
12907 	{
12908 	  mips_opts.gp32 = file_mips_gp32;
12909 	  mips_opts.fp32 = file_mips_fp32;
12910 	}
12911     }
12912   else if (strcmp (name, "autoextend") == 0)
12913     mips_opts.noautoextend = 0;
12914   else if (strcmp (name, "noautoextend") == 0)
12915     mips_opts.noautoextend = 1;
12916   else if (strcmp (name, "push") == 0)
12917     {
12918       struct mips_option_stack *s;
12919 
12920       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12921       s->next = mips_opts_stack;
12922       s->options = mips_opts;
12923       mips_opts_stack = s;
12924     }
12925   else if (strcmp (name, "pop") == 0)
12926     {
12927       struct mips_option_stack *s;
12928 
12929       s = mips_opts_stack;
12930       if (s == NULL)
12931 	as_bad (_(".set pop with no .set push"));
12932       else
12933 	{
12934 	  /* If we're changing the reorder mode we need to handle
12935              delay slots correctly.  */
12936 	  if (s->options.noreorder && ! mips_opts.noreorder)
12937 	    start_noreorder ();
12938 	  else if (! s->options.noreorder && mips_opts.noreorder)
12939 	    end_noreorder ();
12940 
12941 	  mips_opts = s->options;
12942 	  mips_opts_stack = s->next;
12943 	  free (s);
12944 	}
12945     }
12946   else if (strcmp (name, "sym32") == 0)
12947     mips_opts.sym32 = TRUE;
12948   else if (strcmp (name, "nosym32") == 0)
12949     mips_opts.sym32 = FALSE;
12950   else if (strchr (name, ','))
12951     {
12952       /* Generic ".set" directive; use the generic handler.  */
12953       *input_line_pointer = ch;
12954       input_line_pointer = name;
12955       s_set (0);
12956       return;
12957     }
12958   else
12959     {
12960       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12961     }
12962   *input_line_pointer = ch;
12963   demand_empty_rest_of_line ();
12964 }
12965 
12966 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12967    .option pic2.  It means to generate SVR4 PIC calls.  */
12968 
12969 static void
12970 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12971 {
12972   mips_pic = SVR4_PIC;
12973   mips_abicalls = TRUE;
12974 
12975   if (g_switch_seen && g_switch_value != 0)
12976     as_warn (_("-G may not be used with SVR4 PIC code"));
12977   g_switch_value = 0;
12978 
12979   bfd_set_gp_size (stdoutput, 0);
12980   demand_empty_rest_of_line ();
12981 }
12982 
12983 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12984    PIC code.  It sets the $gp register for the function based on the
12985    function address, which is in the register named in the argument.
12986    This uses a relocation against _gp_disp, which is handled specially
12987    by the linker.  The result is:
12988 	lui	$gp,%hi(_gp_disp)
12989 	addiu	$gp,$gp,%lo(_gp_disp)
12990 	addu	$gp,$gp,.cpload argument
12991    The .cpload argument is normally $25 == $t9.
12992 
12993    The -mno-shared option changes this to:
12994 	lui	$gp,%hi(__gnu_local_gp)
12995 	addiu	$gp,$gp,%lo(__gnu_local_gp)
12996    and the argument is ignored.  This saves an instruction, but the
12997    resulting code is not position independent; it uses an absolute
12998    address for __gnu_local_gp.  Thus code assembled with -mno-shared
12999    can go into an ordinary executable, but not into a shared library.  */
13000 
13001 static void
13002 s_cpload (int ignore ATTRIBUTE_UNUSED)
13003 {
13004   expressionS ex;
13005   int reg;
13006   int in_shared;
13007 
13008   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13009      .cpload is ignored.  */
13010   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13011     {
13012       s_ignore (0);
13013       return;
13014     }
13015 
13016   /* .cpload should be in a .set noreorder section.  */
13017   if (mips_opts.noreorder == 0)
13018     as_warn (_(".cpload not in noreorder section"));
13019 
13020   reg = tc_get_register (0);
13021 
13022   /* If we need to produce a 64-bit address, we are better off using
13023      the default instruction sequence.  */
13024   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13025 
13026   ex.X_op = O_symbol;
13027   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13028                                          "__gnu_local_gp");
13029   ex.X_op_symbol = NULL;
13030   ex.X_add_number = 0;
13031 
13032   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13033   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13034 
13035   macro_start ();
13036   macro_build_lui (&ex, mips_gp_register);
13037   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13038 	       mips_gp_register, BFD_RELOC_LO16);
13039   if (in_shared)
13040     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13041 		 mips_gp_register, reg);
13042   macro_end ();
13043 
13044   demand_empty_rest_of_line ();
13045 }
13046 
13047 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13048      .cpsetup $reg1, offset|$reg2, label
13049 
13050    If offset is given, this results in:
13051      sd		$gp, offset($sp)
13052      lui	$gp, %hi(%neg(%gp_rel(label)))
13053      addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
13054      daddu	$gp, $gp, $reg1
13055 
13056    If $reg2 is given, this results in:
13057      daddu	$reg2, $gp, $0
13058      lui	$gp, %hi(%neg(%gp_rel(label)))
13059      addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
13060      daddu	$gp, $gp, $reg1
13061    $reg1 is normally $25 == $t9.
13062 
13063    The -mno-shared option replaces the last three instructions with
13064 	lui	$gp,%hi(_gp)
13065 	addiu	$gp,$gp,%lo(_gp)  */
13066 
13067 static void
13068 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13069 {
13070   expressionS ex_off;
13071   expressionS ex_sym;
13072   int reg1;
13073 
13074   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13075      We also need NewABI support.  */
13076   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13077     {
13078       s_ignore (0);
13079       return;
13080     }
13081 
13082   reg1 = tc_get_register (0);
13083   SKIP_WHITESPACE ();
13084   if (*input_line_pointer != ',')
13085     {
13086       as_bad (_("missing argument separator ',' for .cpsetup"));
13087       return;
13088     }
13089   else
13090     ++input_line_pointer;
13091   SKIP_WHITESPACE ();
13092   if (*input_line_pointer == '$')
13093     {
13094       mips_cpreturn_register = tc_get_register (0);
13095       mips_cpreturn_offset = -1;
13096     }
13097   else
13098     {
13099       mips_cpreturn_offset = get_absolute_expression ();
13100       mips_cpreturn_register = -1;
13101     }
13102   SKIP_WHITESPACE ();
13103   if (*input_line_pointer != ',')
13104     {
13105       as_bad (_("missing argument separator ',' for .cpsetup"));
13106       return;
13107     }
13108   else
13109     ++input_line_pointer;
13110   SKIP_WHITESPACE ();
13111   expression (&ex_sym);
13112 
13113   macro_start ();
13114   if (mips_cpreturn_register == -1)
13115     {
13116       ex_off.X_op = O_constant;
13117       ex_off.X_add_symbol = NULL;
13118       ex_off.X_op_symbol = NULL;
13119       ex_off.X_add_number = mips_cpreturn_offset;
13120 
13121       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13122 		   BFD_RELOC_LO16, SP);
13123     }
13124   else
13125     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13126 		 mips_gp_register, 0);
13127 
13128   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13129     {
13130       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13131 		   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13132 		   BFD_RELOC_HI16_S);
13133 
13134       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13135 		   mips_gp_register, -1, BFD_RELOC_GPREL16,
13136 		   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13137 
13138       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13139 		   mips_gp_register, reg1);
13140     }
13141   else
13142     {
13143       expressionS ex;
13144 
13145       ex.X_op = O_symbol;
13146       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13147       ex.X_op_symbol = NULL;
13148       ex.X_add_number = 0;
13149 
13150       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13151       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13152 
13153       macro_build_lui (&ex, mips_gp_register);
13154       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13155 		   mips_gp_register, BFD_RELOC_LO16);
13156     }
13157 
13158   macro_end ();
13159 
13160   demand_empty_rest_of_line ();
13161 }
13162 
13163 static void
13164 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13165 {
13166   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13167      .cplocal is ignored.  */
13168   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13169     {
13170       s_ignore (0);
13171       return;
13172     }
13173 
13174   mips_gp_register = tc_get_register (0);
13175   demand_empty_rest_of_line ();
13176 }
13177 
13178 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13179    offset from $sp.  The offset is remembered, and after making a PIC
13180    call $gp is restored from that location.  */
13181 
13182 static void
13183 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13184 {
13185   expressionS ex;
13186 
13187   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13188      .cprestore is ignored.  */
13189   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13190     {
13191       s_ignore (0);
13192       return;
13193     }
13194 
13195   mips_cprestore_offset = get_absolute_expression ();
13196   mips_cprestore_valid = 1;
13197 
13198   ex.X_op = O_constant;
13199   ex.X_add_symbol = NULL;
13200   ex.X_op_symbol = NULL;
13201   ex.X_add_number = mips_cprestore_offset;
13202 
13203   macro_start ();
13204   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13205 				SP, HAVE_64BIT_ADDRESSES);
13206   macro_end ();
13207 
13208   demand_empty_rest_of_line ();
13209 }
13210 
13211 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13212    was given in the preceding .cpsetup, it results in:
13213      ld		$gp, offset($sp)
13214 
13215    If a register $reg2 was given there, it results in:
13216      daddu	$gp, $reg2, $0  */
13217 
13218 static void
13219 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13220 {
13221   expressionS ex;
13222 
13223   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13224      We also need NewABI support.  */
13225   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13226     {
13227       s_ignore (0);
13228       return;
13229     }
13230 
13231   macro_start ();
13232   if (mips_cpreturn_register == -1)
13233     {
13234       ex.X_op = O_constant;
13235       ex.X_add_symbol = NULL;
13236       ex.X_op_symbol = NULL;
13237       ex.X_add_number = mips_cpreturn_offset;
13238 
13239       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13240     }
13241   else
13242     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13243 		 mips_cpreturn_register, 0);
13244   macro_end ();
13245 
13246   demand_empty_rest_of_line ();
13247 }
13248 
13249 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13250    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13251    use in DWARF debug information.  */
13252 
13253 static void
13254 s_dtprel_internal (size_t bytes)
13255 {
13256   expressionS ex;
13257   char *p;
13258 
13259   expression (&ex);
13260 
13261   if (ex.X_op != O_symbol)
13262     {
13263       as_bad (_("Unsupported use of %s"), (bytes == 8
13264 					   ? ".dtpreldword"
13265 					   : ".dtprelword"));
13266       ignore_rest_of_line ();
13267     }
13268 
13269   p = frag_more (bytes);
13270   md_number_to_chars (p, 0, bytes);
13271   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13272 	       (bytes == 8
13273 		? BFD_RELOC_MIPS_TLS_DTPREL64
13274 		: BFD_RELOC_MIPS_TLS_DTPREL32));
13275 
13276   demand_empty_rest_of_line ();
13277 }
13278 
13279 /* Handle .dtprelword.  */
13280 
13281 static void
13282 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13283 {
13284   s_dtprel_internal (4);
13285 }
13286 
13287 /* Handle .dtpreldword.  */
13288 
13289 static void
13290 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13291 {
13292   s_dtprel_internal (8);
13293 }
13294 
13295 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13296    code.  It sets the offset to use in gp_rel relocations.  */
13297 
13298 static void
13299 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13300 {
13301   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13302      We also need NewABI support.  */
13303   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13304     {
13305       s_ignore (0);
13306       return;
13307     }
13308 
13309   mips_gprel_offset = get_absolute_expression ();
13310 
13311   demand_empty_rest_of_line ();
13312 }
13313 
13314 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13315    code.  It generates a 32 bit GP relative reloc.  */
13316 
13317 static void
13318 s_gpword (int ignore ATTRIBUTE_UNUSED)
13319 {
13320   segment_info_type *si;
13321   struct insn_label_list *l;
13322   symbolS *label;
13323   expressionS ex;
13324   char *p;
13325 
13326   /* When not generating PIC code, this is treated as .word.  */
13327   if (mips_pic != SVR4_PIC)
13328     {
13329       s_cons (2);
13330       return;
13331     }
13332 
13333   si = seg_info (now_seg);
13334   l = si->label_list;
13335   label = l != NULL ? l->label : NULL;
13336   mips_emit_delays ();
13337   if (auto_align)
13338     mips_align (2, 0, label);
13339   mips_clear_insn_labels ();
13340 
13341   expression (&ex);
13342 
13343   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13344     {
13345       as_bad (_("Unsupported use of .gpword"));
13346       ignore_rest_of_line ();
13347     }
13348 
13349   p = frag_more (4);
13350   md_number_to_chars (p, 0, 4);
13351   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13352 	       BFD_RELOC_GPREL32);
13353 
13354   demand_empty_rest_of_line ();
13355 }
13356 
13357 static void
13358 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13359 {
13360   segment_info_type *si;
13361   struct insn_label_list *l;
13362   symbolS *label;
13363   expressionS ex;
13364   char *p;
13365 
13366   /* When not generating PIC code, this is treated as .dword.  */
13367   if (mips_pic != SVR4_PIC)
13368     {
13369       s_cons (3);
13370       return;
13371     }
13372 
13373   si = seg_info (now_seg);
13374   l = si->label_list;
13375   label = l != NULL ? l->label : NULL;
13376   mips_emit_delays ();
13377   if (auto_align)
13378     mips_align (3, 0, label);
13379   mips_clear_insn_labels ();
13380 
13381   expression (&ex);
13382 
13383   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13384     {
13385       as_bad (_("Unsupported use of .gpdword"));
13386       ignore_rest_of_line ();
13387     }
13388 
13389   p = frag_more (8);
13390   md_number_to_chars (p, 0, 8);
13391   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13392 	       BFD_RELOC_GPREL32)->fx_tcbit = 1;
13393 
13394   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13395   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13396 	   FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13397 
13398   demand_empty_rest_of_line ();
13399 }
13400 
13401 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13402    tables in SVR4 PIC code.  */
13403 
13404 static void
13405 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13406 {
13407   int reg;
13408 
13409   /* This is ignored when not generating SVR4 PIC code.  */
13410   if (mips_pic != SVR4_PIC)
13411     {
13412       s_ignore (0);
13413       return;
13414     }
13415 
13416   /* Add $gp to the register named as an argument.  */
13417   macro_start ();
13418   reg = tc_get_register (0);
13419   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13420   macro_end ();
13421 
13422   demand_empty_rest_of_line ();
13423 }
13424 
13425 /* Handle the .insn pseudo-op.  This marks instruction labels in
13426    mips16 mode.  This permits the linker to handle them specially,
13427    such as generating jalx instructions when needed.  We also make
13428    them odd for the duration of the assembly, in order to generate the
13429    right sort of code.  We will make them even in the adjust_symtab
13430    routine, while leaving them marked.  This is convenient for the
13431    debugger and the disassembler.  The linker knows to make them odd
13432    again.  */
13433 
13434 static void
13435 s_insn (int ignore ATTRIBUTE_UNUSED)
13436 {
13437   mips16_mark_labels ();
13438 
13439   demand_empty_rest_of_line ();
13440 }
13441 
13442 /* Handle a .stabn directive.  We need these in order to mark a label
13443    as being a mips16 text label correctly.  Sometimes the compiler
13444    will emit a label, followed by a .stabn, and then switch sections.
13445    If the label and .stabn are in mips16 mode, then the label is
13446    really a mips16 text label.  */
13447 
13448 static void
13449 s_mips_stab (int type)
13450 {
13451   if (type == 'n')
13452     mips16_mark_labels ();
13453 
13454   s_stab (type);
13455 }
13456 
13457 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13458 
13459 static void
13460 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13461 {
13462   char *name;
13463   int c;
13464   symbolS *symbolP;
13465   expressionS exp;
13466 
13467   name = input_line_pointer;
13468   c = get_symbol_end ();
13469   symbolP = symbol_find_or_make (name);
13470   S_SET_WEAK (symbolP);
13471   *input_line_pointer = c;
13472 
13473   SKIP_WHITESPACE ();
13474 
13475   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13476     {
13477       if (S_IS_DEFINED (symbolP))
13478 	{
13479 	  as_bad ("ignoring attempt to redefine symbol %s",
13480 		  S_GET_NAME (symbolP));
13481 	  ignore_rest_of_line ();
13482 	  return;
13483 	}
13484 
13485       if (*input_line_pointer == ',')
13486 	{
13487 	  ++input_line_pointer;
13488 	  SKIP_WHITESPACE ();
13489 	}
13490 
13491       expression (&exp);
13492       if (exp.X_op != O_symbol)
13493 	{
13494 	  as_bad ("bad .weakext directive");
13495 	  ignore_rest_of_line ();
13496 	  return;
13497 	}
13498       symbol_set_value_expression (symbolP, &exp);
13499     }
13500 
13501   demand_empty_rest_of_line ();
13502 }
13503 
13504 /* Parse a register string into a number.  Called from the ECOFF code
13505    to parse .frame.  The argument is non-zero if this is the frame
13506    register, so that we can record it in mips_frame_reg.  */
13507 
13508 int
13509 tc_get_register (int frame)
13510 {
13511   unsigned int reg;
13512 
13513   SKIP_WHITESPACE ();
13514   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13515     reg = 0;
13516   if (frame)
13517     {
13518       mips_frame_reg = reg != 0 ? reg : SP;
13519       mips_frame_reg_valid = 1;
13520       mips_cprestore_valid = 0;
13521     }
13522   return reg;
13523 }
13524 
13525 valueT
13526 md_section_align (asection *seg, valueT addr)
13527 {
13528   int align = bfd_get_section_alignment (stdoutput, seg);
13529 
13530   if (IS_ELF)
13531     {
13532       /* We don't need to align ELF sections to the full alignment.
13533 	 However, Irix 5 may prefer that we align them at least to a 16
13534 	 byte boundary.  We don't bother to align the sections if we
13535 	 are targeted for an embedded system.  */
13536       if (strncmp (TARGET_OS, "elf", 3) == 0)
13537         return addr;
13538       if (align > 4)
13539         align = 4;
13540     }
13541 
13542   return ((addr + (1 << align) - 1) & (-1 << align));
13543 }
13544 
13545 /* Utility routine, called from above as well.  If called while the
13546    input file is still being read, it's only an approximation.  (For
13547    example, a symbol may later become defined which appeared to be
13548    undefined earlier.)  */
13549 
13550 static int
13551 nopic_need_relax (symbolS *sym, int before_relaxing)
13552 {
13553   if (sym == 0)
13554     return 0;
13555 
13556   if (g_switch_value > 0)
13557     {
13558       const char *symname;
13559       int change;
13560 
13561       /* Find out whether this symbol can be referenced off the $gp
13562 	 register.  It can be if it is smaller than the -G size or if
13563 	 it is in the .sdata or .sbss section.  Certain symbols can
13564 	 not be referenced off the $gp, although it appears as though
13565 	 they can.  */
13566       symname = S_GET_NAME (sym);
13567       if (symname != (const char *) NULL
13568 	  && (strcmp (symname, "eprol") == 0
13569 	      || strcmp (symname, "etext") == 0
13570 	      || strcmp (symname, "_gp") == 0
13571 	      || strcmp (symname, "edata") == 0
13572 	      || strcmp (symname, "_fbss") == 0
13573 	      || strcmp (symname, "_fdata") == 0
13574 	      || strcmp (symname, "_ftext") == 0
13575 	      || strcmp (symname, "end") == 0
13576 	      || strcmp (symname, "_gp_disp") == 0))
13577 	change = 1;
13578       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13579 	       && (0
13580 #ifndef NO_ECOFF_DEBUGGING
13581 		   || (symbol_get_obj (sym)->ecoff_extern_size != 0
13582 		       && (symbol_get_obj (sym)->ecoff_extern_size
13583 			   <= g_switch_value))
13584 #endif
13585 		   /* We must defer this decision until after the whole
13586 		      file has been read, since there might be a .extern
13587 		      after the first use of this symbol.  */
13588 		   || (before_relaxing
13589 #ifndef NO_ECOFF_DEBUGGING
13590 		       && symbol_get_obj (sym)->ecoff_extern_size == 0
13591 #endif
13592 		       && S_GET_VALUE (sym) == 0)
13593 		   || (S_GET_VALUE (sym) != 0
13594 		       && S_GET_VALUE (sym) <= g_switch_value)))
13595 	change = 0;
13596       else
13597 	{
13598 	  const char *segname;
13599 
13600 	  segname = segment_name (S_GET_SEGMENT (sym));
13601 	  assert (strcmp (segname, ".lit8") != 0
13602 		  && strcmp (segname, ".lit4") != 0);
13603 	  change = (strcmp (segname, ".sdata") != 0
13604 		    && strcmp (segname, ".sbss") != 0
13605 		    && strncmp (segname, ".sdata.", 7) != 0
13606 		    && strncmp (segname, ".sbss.", 6) != 0
13607 		    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13608 		    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13609 	}
13610       return change;
13611     }
13612   else
13613     /* We are not optimizing for the $gp register.  */
13614     return 1;
13615 }
13616 
13617 
13618 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13619 
13620 static bfd_boolean
13621 pic_need_relax (symbolS *sym, asection *segtype)
13622 {
13623   asection *symsec;
13624 
13625   /* Handle the case of a symbol equated to another symbol.  */
13626   while (symbol_equated_reloc_p (sym))
13627     {
13628       symbolS *n;
13629 
13630       /* It's possible to get a loop here in a badly written program.  */
13631       n = symbol_get_value_expression (sym)->X_add_symbol;
13632       if (n == sym)
13633 	break;
13634       sym = n;
13635     }
13636 
13637   if (symbol_section_p (sym))
13638     return TRUE;
13639 
13640   symsec = S_GET_SEGMENT (sym);
13641 
13642   /* This must duplicate the test in adjust_reloc_syms.  */
13643   return (symsec != &bfd_und_section
13644 	  && symsec != &bfd_abs_section
13645 	  && !bfd_is_com_section (symsec)
13646 	  && !s_is_linkonce (sym, segtype)
13647 #ifdef OBJ_ELF
13648 	  /* A global or weak symbol is treated as external.  */
13649 	  && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13650 #endif
13651 	  );
13652 }
13653 
13654 
13655 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13656    extended opcode.  SEC is the section the frag is in.  */
13657 
13658 static int
13659 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13660 {
13661   int type;
13662   const struct mips16_immed_operand *op;
13663   offsetT val;
13664   int mintiny, maxtiny;
13665   segT symsec;
13666   fragS *sym_frag;
13667 
13668   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13669     return 0;
13670   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13671     return 1;
13672 
13673   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13674   op = mips16_immed_operands;
13675   while (op->type != type)
13676     {
13677       ++op;
13678       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13679     }
13680 
13681   if (op->unsp)
13682     {
13683       if (type == '<' || type == '>' || type == '[' || type == ']')
13684 	{
13685 	  mintiny = 1;
13686 	  maxtiny = 1 << op->nbits;
13687 	}
13688       else
13689 	{
13690 	  mintiny = 0;
13691 	  maxtiny = (1 << op->nbits) - 1;
13692 	}
13693     }
13694   else
13695     {
13696       mintiny = - (1 << (op->nbits - 1));
13697       maxtiny = (1 << (op->nbits - 1)) - 1;
13698     }
13699 
13700   sym_frag = symbol_get_frag (fragp->fr_symbol);
13701   val = S_GET_VALUE (fragp->fr_symbol);
13702   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13703 
13704   if (op->pcrel)
13705     {
13706       addressT addr;
13707 
13708       /* We won't have the section when we are called from
13709          mips_relax_frag.  However, we will always have been called
13710          from md_estimate_size_before_relax first.  If this is a
13711          branch to a different section, we mark it as such.  If SEC is
13712          NULL, and the frag is not marked, then it must be a branch to
13713          the same section.  */
13714       if (sec == NULL)
13715 	{
13716 	  if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13717 	    return 1;
13718 	}
13719       else
13720 	{
13721 	  /* Must have been called from md_estimate_size_before_relax.  */
13722 	  if (symsec != sec)
13723 	    {
13724 	      fragp->fr_subtype =
13725 		RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13726 
13727 	      /* FIXME: We should support this, and let the linker
13728                  catch branches and loads that are out of range.  */
13729 	      as_bad_where (fragp->fr_file, fragp->fr_line,
13730 			    _("unsupported PC relative reference to different section"));
13731 
13732 	      return 1;
13733 	    }
13734 	  if (fragp != sym_frag && sym_frag->fr_address == 0)
13735 	    /* Assume non-extended on the first relaxation pass.
13736 	       The address we have calculated will be bogus if this is
13737 	       a forward branch to another frag, as the forward frag
13738 	       will have fr_address == 0.  */
13739 	    return 0;
13740 	}
13741 
13742       /* In this case, we know for sure that the symbol fragment is in
13743 	 the same section.  If the relax_marker of the symbol fragment
13744 	 differs from the relax_marker of this fragment, we have not
13745 	 yet adjusted the symbol fragment fr_address.  We want to add
13746 	 in STRETCH in order to get a better estimate of the address.
13747 	 This particularly matters because of the shift bits.  */
13748       if (stretch != 0
13749 	  && sym_frag->relax_marker != fragp->relax_marker)
13750 	{
13751 	  fragS *f;
13752 
13753 	  /* Adjust stretch for any alignment frag.  Note that if have
13754              been expanding the earlier code, the symbol may be
13755              defined in what appears to be an earlier frag.  FIXME:
13756              This doesn't handle the fr_subtype field, which specifies
13757              a maximum number of bytes to skip when doing an
13758              alignment.  */
13759 	  for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13760 	    {
13761 	      if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13762 		{
13763 		  if (stretch < 0)
13764 		    stretch = - ((- stretch)
13765 				 & ~ ((1 << (int) f->fr_offset) - 1));
13766 		  else
13767 		    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13768 		  if (stretch == 0)
13769 		    break;
13770 		}
13771 	    }
13772 	  if (f != NULL)
13773 	    val += stretch;
13774 	}
13775 
13776       addr = fragp->fr_address + fragp->fr_fix;
13777 
13778       /* The base address rules are complicated.  The base address of
13779          a branch is the following instruction.  The base address of a
13780          PC relative load or add is the instruction itself, but if it
13781          is in a delay slot (in which case it can not be extended) use
13782          the address of the instruction whose delay slot it is in.  */
13783       if (type == 'p' || type == 'q')
13784 	{
13785 	  addr += 2;
13786 
13787 	  /* If we are currently assuming that this frag should be
13788 	     extended, then, the current address is two bytes
13789 	     higher.  */
13790 	  if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13791 	    addr += 2;
13792 
13793 	  /* Ignore the low bit in the target, since it will be set
13794              for a text label.  */
13795 	  if ((val & 1) != 0)
13796 	    --val;
13797 	}
13798       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13799 	addr -= 4;
13800       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13801 	addr -= 2;
13802 
13803       val -= addr & ~ ((1 << op->shift) - 1);
13804 
13805       /* Branch offsets have an implicit 0 in the lowest bit.  */
13806       if (type == 'p' || type == 'q')
13807 	val /= 2;
13808 
13809       /* If any of the shifted bits are set, we must use an extended
13810          opcode.  If the address depends on the size of this
13811          instruction, this can lead to a loop, so we arrange to always
13812          use an extended opcode.  We only check this when we are in
13813          the main relaxation loop, when SEC is NULL.  */
13814       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13815 	{
13816 	  fragp->fr_subtype =
13817 	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13818 	  return 1;
13819 	}
13820 
13821       /* If we are about to mark a frag as extended because the value
13822          is precisely maxtiny + 1, then there is a chance of an
13823          infinite loop as in the following code:
13824 	     la	$4,foo
13825 	     .skip	1020
13826 	     .align	2
13827 	   foo:
13828 	 In this case when the la is extended, foo is 0x3fc bytes
13829 	 away, so the la can be shrunk, but then foo is 0x400 away, so
13830 	 the la must be extended.  To avoid this loop, we mark the
13831 	 frag as extended if it was small, and is about to become
13832 	 extended with a value of maxtiny + 1.  */
13833       if (val == ((maxtiny + 1) << op->shift)
13834 	  && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13835 	  && sec == NULL)
13836 	{
13837 	  fragp->fr_subtype =
13838 	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13839 	  return 1;
13840 	}
13841     }
13842   else if (symsec != absolute_section && sec != NULL)
13843     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13844 
13845   if ((val & ((1 << op->shift) - 1)) != 0
13846       || val < (mintiny << op->shift)
13847       || val > (maxtiny << op->shift))
13848     return 1;
13849   else
13850     return 0;
13851 }
13852 
13853 /* Compute the length of a branch sequence, and adjust the
13854    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13855    worst-case length is computed, with UPDATE being used to indicate
13856    whether an unconditional (-1), branch-likely (+1) or regular (0)
13857    branch is to be computed.  */
13858 static int
13859 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13860 {
13861   bfd_boolean toofar;
13862   int length;
13863 
13864   if (fragp
13865       && S_IS_DEFINED (fragp->fr_symbol)
13866       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13867     {
13868       addressT addr;
13869       offsetT val;
13870 
13871       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13872 
13873       addr = fragp->fr_address + fragp->fr_fix + 4;
13874 
13875       val -= addr;
13876 
13877       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13878     }
13879   else if (fragp)
13880     /* If the symbol is not defined or it's in a different segment,
13881        assume the user knows what's going on and emit a short
13882        branch.  */
13883     toofar = FALSE;
13884   else
13885     toofar = TRUE;
13886 
13887   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13888     fragp->fr_subtype
13889       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13890 			     RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13891 			     RELAX_BRANCH_LINK (fragp->fr_subtype),
13892 			     toofar);
13893 
13894   length = 4;
13895   if (toofar)
13896     {
13897       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13898 	length += 8;
13899 
13900       if (mips_pic != NO_PIC)
13901 	{
13902 	  /* Additional space for PIC loading of target address.  */
13903 	  length += 8;
13904 	  if (mips_opts.isa == ISA_MIPS1)
13905 	    /* Additional space for $at-stabilizing nop.  */
13906 	    length += 4;
13907 	}
13908 
13909       /* If branch is conditional.  */
13910       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13911 	length += 8;
13912     }
13913 
13914   return length;
13915 }
13916 
13917 /* Estimate the size of a frag before relaxing.  Unless this is the
13918    mips16, we are not really relaxing here, and the final size is
13919    encoded in the subtype information.  For the mips16, we have to
13920    decide whether we are using an extended opcode or not.  */
13921 
13922 int
13923 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13924 {
13925   int change;
13926 
13927   if (RELAX_BRANCH_P (fragp->fr_subtype))
13928     {
13929 
13930       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13931 
13932       return fragp->fr_var;
13933     }
13934 
13935   if (RELAX_MIPS16_P (fragp->fr_subtype))
13936     /* We don't want to modify the EXTENDED bit here; it might get us
13937        into infinite loops.  We change it only in mips_relax_frag().  */
13938     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13939 
13940   if (mips_pic == NO_PIC)
13941     change = nopic_need_relax (fragp->fr_symbol, 0);
13942   else if (mips_pic == SVR4_PIC)
13943     change = pic_need_relax (fragp->fr_symbol, segtype);
13944   else if (mips_pic == VXWORKS_PIC)
13945     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13946     change = 0;
13947   else
13948     abort ();
13949 
13950   if (change)
13951     {
13952       fragp->fr_subtype |= RELAX_USE_SECOND;
13953       return -RELAX_FIRST (fragp->fr_subtype);
13954     }
13955   else
13956     return -RELAX_SECOND (fragp->fr_subtype);
13957 }
13958 
13959 /* This is called to see whether a reloc against a defined symbol
13960    should be converted into a reloc against a section.  */
13961 
13962 int
13963 mips_fix_adjustable (fixS *fixp)
13964 {
13965   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13966       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13967     return 0;
13968 
13969   if (fixp->fx_addsy == NULL)
13970     return 1;
13971 
13972   /* If symbol SYM is in a mergeable section, relocations of the form
13973      SYM + 0 can usually be made section-relative.  The mergeable data
13974      is then identified by the section offset rather than by the symbol.
13975 
13976      However, if we're generating REL LO16 relocations, the offset is split
13977      between the LO16 and parterning high part relocation.  The linker will
13978      need to recalculate the complete offset in order to correctly identify
13979      the merge data.
13980 
13981      The linker has traditionally not looked for the parterning high part
13982      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13983      placed anywhere.  Rather than break backwards compatibility by changing
13984      this, it seems better not to force the issue, and instead keep the
13985      original symbol.  This will work with either linker behavior.  */
13986   if ((lo16_reloc_p (fixp->fx_r_type)
13987        || reloc_needs_lo_p (fixp->fx_r_type))
13988       && HAVE_IN_PLACE_ADDENDS
13989       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13990     return 0;
13991 
13992 #ifdef OBJ_ELF
13993   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13994      to a floating-point stub.  The same is true for non-R_MIPS16_26
13995      relocations against MIPS16 functions; in this case, the stub becomes
13996      the function's canonical address.
13997 
13998      Floating-point stubs are stored in unique .mips16.call.* or
13999      .mips16.fn.* sections.  If a stub T for function F is in section S,
14000      the first relocation in section S must be against F; this is how the
14001      linker determines the target function.  All relocations that might
14002      resolve to T must also be against F.  We therefore have the following
14003      restrictions, which are given in an intentionally-redundant way:
14004 
14005        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14006 	  symbols.
14007 
14008        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14009 	  if that stub might be used.
14010 
14011        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14012 	  symbols.
14013 
14014        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14015 	  that stub might be used.
14016 
14017      There is a further restriction:
14018 
14019        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14020 	  on targets with in-place addends; the relocation field cannot
14021 	  encode the low bit.
14022 
14023      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14024      against a MIPS16 symbol.
14025 
14026      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14027      relocation against some symbol R, no relocation against R may be
14028      reduced.  (Note that this deals with (2) as well as (1) because
14029      relocations against global symbols will never be reduced on ELF
14030      targets.)  This approach is a little simpler than trying to detect
14031      stub sections, and gives the "all or nothing" per-symbol consistency
14032      that we have for MIPS16 symbols.  */
14033   if (IS_ELF
14034       && fixp->fx_subsy == NULL
14035       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14036 	  || *symbol_get_tc (fixp->fx_addsy)))
14037     return 0;
14038 #endif
14039 
14040   return 1;
14041 }
14042 
14043 /* Translate internal representation of relocation info to BFD target
14044    format.  */
14045 
14046 arelent **
14047 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14048 {
14049   static arelent *retval[4];
14050   arelent *reloc;
14051   bfd_reloc_code_real_type code;
14052 
14053   memset (retval, 0, sizeof(retval));
14054   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14055   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14056   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14057   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14058 
14059   if (fixp->fx_pcrel)
14060     {
14061       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14062 
14063       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14064 	 Relocations want only the symbol offset.  */
14065       reloc->addend = fixp->fx_addnumber + reloc->address;
14066       if (!IS_ELF)
14067 	{
14068 	  /* A gruesome hack which is a result of the gruesome gas
14069 	     reloc handling.  What's worse, for COFF (as opposed to
14070 	     ECOFF), we might need yet another copy of reloc->address.
14071 	     See bfd_install_relocation.  */
14072 	  reloc->addend += reloc->address;
14073 	}
14074     }
14075   else
14076     reloc->addend = fixp->fx_addnumber;
14077 
14078   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14079      entry to be used in the relocation's section offset.  */
14080   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14081     {
14082       reloc->address = reloc->addend;
14083       reloc->addend = 0;
14084     }
14085 
14086   code = fixp->fx_r_type;
14087 
14088   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14089   if (reloc->howto == NULL)
14090     {
14091       as_bad_where (fixp->fx_file, fixp->fx_line,
14092 		    _("Can not represent %s relocation in this object file format"),
14093 		    bfd_get_reloc_code_name (code));
14094       retval[0] = NULL;
14095     }
14096 
14097   return retval;
14098 }
14099 
14100 /* Relax a machine dependent frag.  This returns the amount by which
14101    the current size of the frag should change.  */
14102 
14103 int
14104 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14105 {
14106   if (RELAX_BRANCH_P (fragp->fr_subtype))
14107     {
14108       offsetT old_var = fragp->fr_var;
14109 
14110       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14111 
14112       return fragp->fr_var - old_var;
14113     }
14114 
14115   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14116     return 0;
14117 
14118   if (mips16_extended_frag (fragp, NULL, stretch))
14119     {
14120       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14121 	return 0;
14122       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14123       return 2;
14124     }
14125   else
14126     {
14127       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14128 	return 0;
14129       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14130       return -2;
14131     }
14132 
14133   return 0;
14134 }
14135 
14136 /* Convert a machine dependent frag.  */
14137 
14138 void
14139 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14140 {
14141   if (RELAX_BRANCH_P (fragp->fr_subtype))
14142     {
14143       bfd_byte *buf;
14144       unsigned long insn;
14145       expressionS exp;
14146       fixS *fixp;
14147 
14148       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14149 
14150       if (target_big_endian)
14151 	insn = bfd_getb32 (buf);
14152       else
14153 	insn = bfd_getl32 (buf);
14154 
14155       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14156 	{
14157 	  /* We generate a fixup instead of applying it right now
14158 	     because, if there are linker relaxations, we're going to
14159 	     need the relocations.  */
14160 	  exp.X_op = O_symbol;
14161 	  exp.X_add_symbol = fragp->fr_symbol;
14162 	  exp.X_add_number = fragp->fr_offset;
14163 
14164 	  fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14165 			      4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14166 	  fixp->fx_file = fragp->fr_file;
14167 	  fixp->fx_line = fragp->fr_line;
14168 
14169 	  md_number_to_chars ((char *) buf, insn, 4);
14170 	  buf += 4;
14171 	}
14172       else
14173 	{
14174 	  int i;
14175 
14176 	  as_warn_where (fragp->fr_file, fragp->fr_line,
14177 			 _("relaxed out-of-range branch into a jump"));
14178 
14179 	  if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14180 	    goto uncond;
14181 
14182 	  if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14183 	    {
14184 	      /* Reverse the branch.  */
14185 	      switch ((insn >> 28) & 0xf)
14186 		{
14187 		case 4:
14188 		  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14189 		     have the condition reversed by tweaking a single
14190 		     bit, and their opcodes all have 0x4???????.  */
14191 		  assert ((insn & 0xf1000000) == 0x41000000);
14192 		  insn ^= 0x00010000;
14193 		  break;
14194 
14195 		case 0:
14196 		  /* bltz	0x04000000	bgez	0x04010000
14197 		     bltzal	0x04100000	bgezal	0x04110000  */
14198 		  assert ((insn & 0xfc0e0000) == 0x04000000);
14199 		  insn ^= 0x00010000;
14200 		  break;
14201 
14202 		case 1:
14203 		  /* beq	0x10000000	bne	0x14000000
14204 		     blez	0x18000000	bgtz	0x1c000000  */
14205 		  insn ^= 0x04000000;
14206 		  break;
14207 
14208 		default:
14209 		  abort ();
14210 		}
14211 	    }
14212 
14213 	  if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14214 	    {
14215 	      /* Clear the and-link bit.  */
14216 	      assert ((insn & 0xfc1c0000) == 0x04100000);
14217 
14218 	      /* bltzal		0x04100000	bgezal	0x04110000
14219 		 bltzall	0x04120000	bgezall	0x04130000  */
14220 	      insn &= ~0x00100000;
14221 	    }
14222 
14223 	  /* Branch over the branch (if the branch was likely) or the
14224 	     full jump (not likely case).  Compute the offset from the
14225 	     current instruction to branch to.  */
14226 	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14227 	    i = 16;
14228 	  else
14229 	    {
14230 	      /* How many bytes in instructions we've already emitted?  */
14231 	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14232 	      /* How many bytes in instructions from here to the end?  */
14233 	      i = fragp->fr_var - i;
14234 	    }
14235 	  /* Convert to instruction count.  */
14236 	  i >>= 2;
14237 	  /* Branch counts from the next instruction.  */
14238 	  i--;
14239 	  insn |= i;
14240 	  /* Branch over the jump.  */
14241 	  md_number_to_chars ((char *) buf, insn, 4);
14242 	  buf += 4;
14243 
14244 	  /* nop */
14245 	  md_number_to_chars ((char *) buf, 0, 4);
14246 	  buf += 4;
14247 
14248 	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14249 	    {
14250 	      /* beql $0, $0, 2f */
14251 	      insn = 0x50000000;
14252 	      /* Compute the PC offset from the current instruction to
14253 		 the end of the variable frag.  */
14254 	      /* How many bytes in instructions we've already emitted?  */
14255 	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14256 	      /* How many bytes in instructions from here to the end?  */
14257 	      i = fragp->fr_var - i;
14258 	      /* Convert to instruction count.  */
14259 	      i >>= 2;
14260 	      /* Don't decrement i, because we want to branch over the
14261 		 delay slot.  */
14262 
14263 	      insn |= i;
14264 	      md_number_to_chars ((char *) buf, insn, 4);
14265 	      buf += 4;
14266 
14267 	      md_number_to_chars ((char *) buf, 0, 4);
14268 	      buf += 4;
14269 	    }
14270 
14271 	uncond:
14272 	  if (mips_pic == NO_PIC)
14273 	    {
14274 	      /* j or jal.  */
14275 	      insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14276 		      ? 0x0c000000 : 0x08000000);
14277 	      exp.X_op = O_symbol;
14278 	      exp.X_add_symbol = fragp->fr_symbol;
14279 	      exp.X_add_number = fragp->fr_offset;
14280 
14281 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14282 				  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14283 	      fixp->fx_file = fragp->fr_file;
14284 	      fixp->fx_line = fragp->fr_line;
14285 
14286 	      md_number_to_chars ((char *) buf, insn, 4);
14287 	      buf += 4;
14288 	    }
14289 	  else
14290 	    {
14291 	      /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14292 	      insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14293 	      exp.X_op = O_symbol;
14294 	      exp.X_add_symbol = fragp->fr_symbol;
14295 	      exp.X_add_number = fragp->fr_offset;
14296 
14297 	      if (fragp->fr_offset)
14298 		{
14299 		  exp.X_add_symbol = make_expr_symbol (&exp);
14300 		  exp.X_add_number = 0;
14301 		}
14302 
14303 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14304 				  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14305 	      fixp->fx_file = fragp->fr_file;
14306 	      fixp->fx_line = fragp->fr_line;
14307 
14308 	      md_number_to_chars ((char *) buf, insn, 4);
14309 	      buf += 4;
14310 
14311 	      if (mips_opts.isa == ISA_MIPS1)
14312 		{
14313 		  /* nop */
14314 		  md_number_to_chars ((char *) buf, 0, 4);
14315 		  buf += 4;
14316 		}
14317 
14318 	      /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14319 	      insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14320 
14321 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14322 				  4, &exp, FALSE, BFD_RELOC_LO16);
14323 	      fixp->fx_file = fragp->fr_file;
14324 	      fixp->fx_line = fragp->fr_line;
14325 
14326 	      md_number_to_chars ((char *) buf, insn, 4);
14327 	      buf += 4;
14328 
14329 	      /* j(al)r $at.  */
14330 	      if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14331 		insn = 0x0020f809;
14332 	      else
14333 		insn = 0x00200008;
14334 
14335 	      md_number_to_chars ((char *) buf, insn, 4);
14336 	      buf += 4;
14337 	    }
14338 	}
14339 
14340       assert (buf == (bfd_byte *)fragp->fr_literal
14341 	      + fragp->fr_fix + fragp->fr_var);
14342 
14343       fragp->fr_fix += fragp->fr_var;
14344 
14345       return;
14346     }
14347 
14348   if (RELAX_MIPS16_P (fragp->fr_subtype))
14349     {
14350       int type;
14351       const struct mips16_immed_operand *op;
14352       bfd_boolean small, ext;
14353       offsetT val;
14354       bfd_byte *buf;
14355       unsigned long insn;
14356       bfd_boolean use_extend;
14357       unsigned short extend;
14358 
14359       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14360       op = mips16_immed_operands;
14361       while (op->type != type)
14362 	++op;
14363 
14364       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14365 	{
14366 	  small = FALSE;
14367 	  ext = TRUE;
14368 	}
14369       else
14370 	{
14371 	  small = TRUE;
14372 	  ext = FALSE;
14373 	}
14374 
14375       resolve_symbol_value (fragp->fr_symbol);
14376       val = S_GET_VALUE (fragp->fr_symbol);
14377       if (op->pcrel)
14378 	{
14379 	  addressT addr;
14380 
14381 	  addr = fragp->fr_address + fragp->fr_fix;
14382 
14383 	  /* The rules for the base address of a PC relative reloc are
14384              complicated; see mips16_extended_frag.  */
14385 	  if (type == 'p' || type == 'q')
14386 	    {
14387 	      addr += 2;
14388 	      if (ext)
14389 		addr += 2;
14390 	      /* Ignore the low bit in the target, since it will be
14391                  set for a text label.  */
14392 	      if ((val & 1) != 0)
14393 		--val;
14394 	    }
14395 	  else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14396 	    addr -= 4;
14397 	  else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14398 	    addr -= 2;
14399 
14400 	  addr &= ~ (addressT) ((1 << op->shift) - 1);
14401 	  val -= addr;
14402 
14403 	  /* Make sure the section winds up with the alignment we have
14404              assumed.  */
14405 	  if (op->shift > 0)
14406 	    record_alignment (asec, op->shift);
14407 	}
14408 
14409       if (ext
14410 	  && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14411 	      || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14412 	as_warn_where (fragp->fr_file, fragp->fr_line,
14413 		       _("extended instruction in delay slot"));
14414 
14415       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14416 
14417       if (target_big_endian)
14418 	insn = bfd_getb16 (buf);
14419       else
14420 	insn = bfd_getl16 (buf);
14421 
14422       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14423 		    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14424 		    small, ext, &insn, &use_extend, &extend);
14425 
14426       if (use_extend)
14427 	{
14428 	  md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14429 	  fragp->fr_fix += 2;
14430 	  buf += 2;
14431 	}
14432 
14433       md_number_to_chars ((char *) buf, insn, 2);
14434       fragp->fr_fix += 2;
14435       buf += 2;
14436     }
14437   else
14438     {
14439       int first, second;
14440       fixS *fixp;
14441 
14442       first = RELAX_FIRST (fragp->fr_subtype);
14443       second = RELAX_SECOND (fragp->fr_subtype);
14444       fixp = (fixS *) fragp->fr_opcode;
14445 
14446       /* Possibly emit a warning if we've chosen the longer option.  */
14447       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14448 	  == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14449 	{
14450 	  const char *msg = macro_warning (fragp->fr_subtype);
14451 	  if (msg != 0)
14452 	    as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14453 	}
14454 
14455       /* Go through all the fixups for the first sequence.  Disable them
14456 	 (by marking them as done) if we're going to use the second
14457 	 sequence instead.  */
14458       while (fixp
14459 	     && fixp->fx_frag == fragp
14460 	     && fixp->fx_where < fragp->fr_fix - second)
14461 	{
14462 	  if (fragp->fr_subtype & RELAX_USE_SECOND)
14463 	    fixp->fx_done = 1;
14464 	  fixp = fixp->fx_next;
14465 	}
14466 
14467       /* Go through the fixups for the second sequence.  Disable them if
14468 	 we're going to use the first sequence, otherwise adjust their
14469 	 addresses to account for the relaxation.  */
14470       while (fixp && fixp->fx_frag == fragp)
14471 	{
14472 	  if (fragp->fr_subtype & RELAX_USE_SECOND)
14473 	    fixp->fx_where -= first;
14474 	  else
14475 	    fixp->fx_done = 1;
14476 	  fixp = fixp->fx_next;
14477 	}
14478 
14479       /* Now modify the frag contents.  */
14480       if (fragp->fr_subtype & RELAX_USE_SECOND)
14481 	{
14482 	  char *start;
14483 
14484 	  start = fragp->fr_literal + fragp->fr_fix - first - second;
14485 	  memmove (start, start + first, second);
14486 	  fragp->fr_fix -= first;
14487 	}
14488       else
14489 	fragp->fr_fix -= second;
14490     }
14491 }
14492 
14493 #ifdef OBJ_ELF
14494 
14495 /* This function is called after the relocs have been generated.
14496    We've been storing mips16 text labels as odd.  Here we convert them
14497    back to even for the convenience of the debugger.  */
14498 
14499 void
14500 mips_frob_file_after_relocs (void)
14501 {
14502   asymbol **syms;
14503   unsigned int count, i;
14504 
14505   if (!IS_ELF)
14506     return;
14507 
14508   syms = bfd_get_outsymbols (stdoutput);
14509   count = bfd_get_symcount (stdoutput);
14510   for (i = 0; i < count; i++, syms++)
14511     {
14512       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14513 	  && ((*syms)->value & 1) != 0)
14514 	{
14515 	  (*syms)->value &= ~1;
14516 	  /* If the symbol has an odd size, it was probably computed
14517 	     incorrectly, so adjust that as well.  */
14518 	  if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14519 	    ++elf_symbol (*syms)->internal_elf_sym.st_size;
14520 	}
14521     }
14522 }
14523 
14524 #endif
14525 
14526 /* This function is called whenever a label is defined.  It is used
14527    when handling branch delays; if a branch has a label, we assume we
14528    can not move it.  */
14529 
14530 void
14531 mips_define_label (symbolS *sym)
14532 {
14533   segment_info_type *si = seg_info (now_seg);
14534   struct insn_label_list *l;
14535 
14536   if (free_insn_labels == NULL)
14537     l = (struct insn_label_list *) xmalloc (sizeof *l);
14538   else
14539     {
14540       l = free_insn_labels;
14541       free_insn_labels = l->next;
14542     }
14543 
14544   l->label = sym;
14545   l->next = si->label_list;
14546   si->label_list = l;
14547 
14548 #ifdef OBJ_ELF
14549   dwarf2_emit_label (sym);
14550 #endif
14551 }
14552 
14553 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14554 
14555 /* Some special processing for a MIPS ELF file.  */
14556 
14557 void
14558 mips_elf_final_processing (void)
14559 {
14560   /* Write out the register information.  */
14561   if (mips_abi != N64_ABI)
14562     {
14563       Elf32_RegInfo s;
14564 
14565       s.ri_gprmask = mips_gprmask;
14566       s.ri_cprmask[0] = mips_cprmask[0];
14567       s.ri_cprmask[1] = mips_cprmask[1];
14568       s.ri_cprmask[2] = mips_cprmask[2];
14569       s.ri_cprmask[3] = mips_cprmask[3];
14570       /* The gp_value field is set by the MIPS ELF backend.  */
14571 
14572       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14573 				       ((Elf32_External_RegInfo *)
14574 					mips_regmask_frag));
14575     }
14576   else
14577     {
14578       Elf64_Internal_RegInfo s;
14579 
14580       s.ri_gprmask = mips_gprmask;
14581       s.ri_pad = 0;
14582       s.ri_cprmask[0] = mips_cprmask[0];
14583       s.ri_cprmask[1] = mips_cprmask[1];
14584       s.ri_cprmask[2] = mips_cprmask[2];
14585       s.ri_cprmask[3] = mips_cprmask[3];
14586       /* The gp_value field is set by the MIPS ELF backend.  */
14587 
14588       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14589 				       ((Elf64_External_RegInfo *)
14590 					mips_regmask_frag));
14591     }
14592 
14593   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14594      sort of BFD interface for this.  */
14595   if (mips_any_noreorder)
14596     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14597   if (mips_pic != NO_PIC)
14598     {
14599     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14600       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14601     }
14602   if (mips_abicalls)
14603     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14604 
14605   /* Set MIPS ELF flags for ASEs.  */
14606   /* We may need to define a new flag for DSP ASE, and set this flag when
14607      file_ase_dsp is true.  */
14608   /* Same for DSP R2.  */
14609   /* We may need to define a new flag for MT ASE, and set this flag when
14610      file_ase_mt is true.  */
14611   if (file_ase_mips16)
14612     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14613 #if 0 /* XXX FIXME */
14614   if (file_ase_mips3d)
14615     elf_elfheader (stdoutput)->e_flags |= ???;
14616 #endif
14617   if (file_ase_mdmx)
14618     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14619 
14620   /* Set the MIPS ELF ABI flags.  */
14621   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14622     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14623   else if (mips_abi == O64_ABI)
14624     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14625   else if (mips_abi == EABI_ABI)
14626     {
14627       if (!file_mips_gp32)
14628 	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14629       else
14630 	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14631     }
14632   else if (mips_abi == N32_ABI)
14633     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14634 
14635   /* Nothing to do for N64_ABI.  */
14636 
14637   if (mips_32bitmode)
14638     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14639 
14640 #if 0 /* XXX FIXME */
14641   /* 32 bit code with 64 bit FP registers.  */
14642   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14643     elf_elfheader (stdoutput)->e_flags |= ???;
14644 #endif
14645 }
14646 
14647 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14648 
14649 typedef struct proc {
14650   symbolS *func_sym;
14651   symbolS *func_end_sym;
14652   unsigned long reg_mask;
14653   unsigned long reg_offset;
14654   unsigned long fpreg_mask;
14655   unsigned long fpreg_offset;
14656   unsigned long frame_offset;
14657   unsigned long frame_reg;
14658   unsigned long pc_reg;
14659 } procS;
14660 
14661 static procS cur_proc;
14662 static procS *cur_proc_ptr;
14663 static int numprocs;
14664 
14665 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14666    nop as "0".  */
14667 
14668 char
14669 mips_nop_opcode (void)
14670 {
14671   return seg_info (now_seg)->tc_segment_info_data.mips16;
14672 }
14673 
14674 /* Fill in an rs_align_code fragment.  This only needs to do something
14675    for MIPS16 code, where 0 is not a nop.  */
14676 
14677 void
14678 mips_handle_align (fragS *fragp)
14679 {
14680   char *p;
14681 
14682   if (fragp->fr_type != rs_align_code)
14683     return;
14684 
14685   p = fragp->fr_literal + fragp->fr_fix;
14686   if (*p)
14687     {
14688       int bytes;
14689 
14690       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14691       if (bytes & 1)
14692 	{
14693 	  *p++ = 0;
14694 	  fragp->fr_fix++;
14695 	}
14696       md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14697       fragp->fr_var = 2;
14698     }
14699 }
14700 
14701 static void
14702 md_obj_begin (void)
14703 {
14704 }
14705 
14706 static void
14707 md_obj_end (void)
14708 {
14709   /* Check for premature end, nesting errors, etc.  */
14710   if (cur_proc_ptr)
14711     as_warn (_("missing .end at end of assembly"));
14712 }
14713 
14714 static long
14715 get_number (void)
14716 {
14717   int negative = 0;
14718   long val = 0;
14719 
14720   if (*input_line_pointer == '-')
14721     {
14722       ++input_line_pointer;
14723       negative = 1;
14724     }
14725   if (!ISDIGIT (*input_line_pointer))
14726     as_bad (_("expected simple number"));
14727   if (input_line_pointer[0] == '0')
14728     {
14729       if (input_line_pointer[1] == 'x')
14730 	{
14731 	  input_line_pointer += 2;
14732 	  while (ISXDIGIT (*input_line_pointer))
14733 	    {
14734 	      val <<= 4;
14735 	      val |= hex_value (*input_line_pointer++);
14736 	    }
14737 	  return negative ? -val : val;
14738 	}
14739       else
14740 	{
14741 	  ++input_line_pointer;
14742 	  while (ISDIGIT (*input_line_pointer))
14743 	    {
14744 	      val <<= 3;
14745 	      val |= *input_line_pointer++ - '0';
14746 	    }
14747 	  return negative ? -val : val;
14748 	}
14749     }
14750   if (!ISDIGIT (*input_line_pointer))
14751     {
14752       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14753 	      *input_line_pointer, *input_line_pointer);
14754       as_warn (_("invalid number"));
14755       return -1;
14756     }
14757   while (ISDIGIT (*input_line_pointer))
14758     {
14759       val *= 10;
14760       val += *input_line_pointer++ - '0';
14761     }
14762   return negative ? -val : val;
14763 }
14764 
14765 /* The .file directive; just like the usual .file directive, but there
14766    is an initial number which is the ECOFF file index.  In the non-ECOFF
14767    case .file implies DWARF-2.  */
14768 
14769 static void
14770 s_mips_file (int x ATTRIBUTE_UNUSED)
14771 {
14772   static int first_file_directive = 0;
14773 
14774   if (ECOFF_DEBUGGING)
14775     {
14776       get_number ();
14777       s_app_file (0);
14778     }
14779   else
14780     {
14781       char *filename;
14782 
14783       filename = dwarf2_directive_file (0);
14784 
14785       /* Versions of GCC up to 3.1 start files with a ".file"
14786 	 directive even for stabs output.  Make sure that this
14787 	 ".file" is handled.  Note that you need a version of GCC
14788          after 3.1 in order to support DWARF-2 on MIPS.  */
14789       if (filename != NULL && ! first_file_directive)
14790 	{
14791 	  (void) new_logical_line (filename, -1);
14792 	  s_app_file_string (filename, 0);
14793 	}
14794       first_file_directive = 1;
14795     }
14796 }
14797 
14798 /* The .loc directive, implying DWARF-2.  */
14799 
14800 static void
14801 s_mips_loc (int x ATTRIBUTE_UNUSED)
14802 {
14803   if (!ECOFF_DEBUGGING)
14804     dwarf2_directive_loc (0);
14805 }
14806 
14807 /* The .end directive.  */
14808 
14809 static void
14810 s_mips_end (int x ATTRIBUTE_UNUSED)
14811 {
14812   symbolS *p;
14813 
14814   /* Following functions need their own .frame and .cprestore directives.  */
14815   mips_frame_reg_valid = 0;
14816   mips_cprestore_valid = 0;
14817 
14818   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14819     {
14820       p = get_symbol ();
14821       demand_empty_rest_of_line ();
14822     }
14823   else
14824     p = NULL;
14825 
14826   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14827     as_warn (_(".end not in text section"));
14828 
14829   if (!cur_proc_ptr)
14830     {
14831       as_warn (_(".end directive without a preceding .ent directive."));
14832       demand_empty_rest_of_line ();
14833       return;
14834     }
14835 
14836   if (p != NULL)
14837     {
14838       assert (S_GET_NAME (p));
14839       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14840 	as_warn (_(".end symbol does not match .ent symbol."));
14841 
14842       if (debug_type == DEBUG_STABS)
14843 	stabs_generate_asm_endfunc (S_GET_NAME (p),
14844 				    S_GET_NAME (p));
14845     }
14846   else
14847     as_warn (_(".end directive missing or unknown symbol"));
14848 
14849 #ifdef OBJ_ELF
14850   /* Create an expression to calculate the size of the function.  */
14851   if (p && cur_proc_ptr)
14852     {
14853       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14854       expressionS *exp = xmalloc (sizeof (expressionS));
14855 
14856       obj->size = exp;
14857       exp->X_op = O_subtract;
14858       exp->X_add_symbol = symbol_temp_new_now ();
14859       exp->X_op_symbol = p;
14860       exp->X_add_number = 0;
14861 
14862       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14863     }
14864 
14865   /* Generate a .pdr section.  */
14866   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14867     {
14868       segT saved_seg = now_seg;
14869       subsegT saved_subseg = now_subseg;
14870       valueT dot;
14871       expressionS exp;
14872       char *fragp;
14873 
14874       dot = frag_now_fix ();
14875 
14876 #ifdef md_flush_pending_output
14877       md_flush_pending_output ();
14878 #endif
14879 
14880       assert (pdr_seg);
14881       subseg_set (pdr_seg, 0);
14882 
14883       /* Write the symbol.  */
14884       exp.X_op = O_symbol;
14885       exp.X_add_symbol = p;
14886       exp.X_add_number = 0;
14887       emit_expr (&exp, 4);
14888 
14889       fragp = frag_more (7 * 4);
14890 
14891       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14892       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14893       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14894       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14895       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14896       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14897       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14898 
14899       subseg_set (saved_seg, saved_subseg);
14900     }
14901 #endif /* OBJ_ELF */
14902 
14903   cur_proc_ptr = NULL;
14904 }
14905 
14906 /* The .aent and .ent directives.  */
14907 
14908 static void
14909 s_mips_ent (int aent)
14910 {
14911   symbolS *symbolP;
14912 
14913   symbolP = get_symbol ();
14914   if (*input_line_pointer == ',')
14915     ++input_line_pointer;
14916   SKIP_WHITESPACE ();
14917   if (ISDIGIT (*input_line_pointer)
14918       || *input_line_pointer == '-')
14919     get_number ();
14920 
14921   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14922     as_warn (_(".ent or .aent not in text section."));
14923 
14924   if (!aent && cur_proc_ptr)
14925     as_warn (_("missing .end"));
14926 
14927   if (!aent)
14928     {
14929       /* This function needs its own .frame and .cprestore directives.  */
14930       mips_frame_reg_valid = 0;
14931       mips_cprestore_valid = 0;
14932 
14933       cur_proc_ptr = &cur_proc;
14934       memset (cur_proc_ptr, '\0', sizeof (procS));
14935 
14936       cur_proc_ptr->func_sym = symbolP;
14937 
14938       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14939 
14940       ++numprocs;
14941 
14942       if (debug_type == DEBUG_STABS)
14943         stabs_generate_asm_func (S_GET_NAME (symbolP),
14944 				 S_GET_NAME (symbolP));
14945     }
14946 
14947   demand_empty_rest_of_line ();
14948 }
14949 
14950 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14951    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14952    s_mips_frame is used so that we can set the PDR information correctly.
14953    We can't use the ecoff routines because they make reference to the ecoff
14954    symbol table (in the mdebug section).  */
14955 
14956 static void
14957 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14958 {
14959 #ifdef OBJ_ELF
14960   if (IS_ELF && !ECOFF_DEBUGGING)
14961     {
14962       long val;
14963 
14964       if (cur_proc_ptr == (procS *) NULL)
14965 	{
14966 	  as_warn (_(".frame outside of .ent"));
14967 	  demand_empty_rest_of_line ();
14968 	  return;
14969 	}
14970 
14971       cur_proc_ptr->frame_reg = tc_get_register (1);
14972 
14973       SKIP_WHITESPACE ();
14974       if (*input_line_pointer++ != ','
14975 	  || get_absolute_expression_and_terminator (&val) != ',')
14976 	{
14977 	  as_warn (_("Bad .frame directive"));
14978 	  --input_line_pointer;
14979 	  demand_empty_rest_of_line ();
14980 	  return;
14981 	}
14982 
14983       cur_proc_ptr->frame_offset = val;
14984       cur_proc_ptr->pc_reg = tc_get_register (0);
14985 
14986       demand_empty_rest_of_line ();
14987     }
14988   else
14989 #endif /* OBJ_ELF */
14990     s_ignore (ignore);
14991 }
14992 
14993 /* The .fmask and .mask directives. If the mdebug section is present
14994    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14995    embedded targets, s_mips_mask is used so that we can set the PDR
14996    information correctly. We can't use the ecoff routines because they
14997    make reference to the ecoff symbol table (in the mdebug section).  */
14998 
14999 static void
15000 s_mips_mask (int reg_type)
15001 {
15002 #ifdef OBJ_ELF
15003   if (IS_ELF && !ECOFF_DEBUGGING)
15004     {
15005       long mask, off;
15006 
15007       if (cur_proc_ptr == (procS *) NULL)
15008 	{
15009 	  as_warn (_(".mask/.fmask outside of .ent"));
15010 	  demand_empty_rest_of_line ();
15011 	  return;
15012 	}
15013 
15014       if (get_absolute_expression_and_terminator (&mask) != ',')
15015 	{
15016 	  as_warn (_("Bad .mask/.fmask directive"));
15017 	  --input_line_pointer;
15018 	  demand_empty_rest_of_line ();
15019 	  return;
15020 	}
15021 
15022       off = get_absolute_expression ();
15023 
15024       if (reg_type == 'F')
15025 	{
15026 	  cur_proc_ptr->fpreg_mask = mask;
15027 	  cur_proc_ptr->fpreg_offset = off;
15028 	}
15029       else
15030 	{
15031 	  cur_proc_ptr->reg_mask = mask;
15032 	  cur_proc_ptr->reg_offset = off;
15033 	}
15034 
15035       demand_empty_rest_of_line ();
15036     }
15037   else
15038 #endif /* OBJ_ELF */
15039     s_ignore (reg_type);
15040 }
15041 
15042 /* A table describing all the processors gas knows about.  Names are
15043    matched in the order listed.
15044 
15045    To ease comparison, please keep this table in the same order as
15046    gcc's mips_cpu_info_table[].  */
15047 static const struct mips_cpu_info mips_cpu_info_table[] =
15048 {
15049   /* Entries for generic ISAs */
15050   { "mips1",          MIPS_CPU_IS_ISA,		ISA_MIPS1,      CPU_R3000 },
15051   { "mips2",          MIPS_CPU_IS_ISA,		ISA_MIPS2,      CPU_R6000 },
15052   { "mips3",          MIPS_CPU_IS_ISA,		ISA_MIPS3,      CPU_R4000 },
15053   { "mips4",          MIPS_CPU_IS_ISA,		ISA_MIPS4,      CPU_R8000 },
15054   { "mips5",          MIPS_CPU_IS_ISA,		ISA_MIPS5,      CPU_MIPS5 },
15055   { "mips32",         MIPS_CPU_IS_ISA,		ISA_MIPS32,     CPU_MIPS32 },
15056   { "mips32r2",       MIPS_CPU_IS_ISA,		ISA_MIPS32R2,   CPU_MIPS32R2 },
15057   { "mips64",         MIPS_CPU_IS_ISA,		ISA_MIPS64,     CPU_MIPS64 },
15058   { "mips64r2",       MIPS_CPU_IS_ISA,		ISA_MIPS64R2,   CPU_MIPS64R2 },
15059 
15060   /* MIPS I */
15061   { "r3000",          0,			ISA_MIPS1,      CPU_R3000 },
15062   { "r2000",          0,			ISA_MIPS1,      CPU_R3000 },
15063   { "r3900",          0,			ISA_MIPS1,      CPU_R3900 },
15064 
15065   /* MIPS II */
15066   { "r6000",          0,			ISA_MIPS2,      CPU_R6000 },
15067 
15068   /* MIPS III */
15069   { "r4000",          0,			ISA_MIPS3,      CPU_R4000 },
15070   { "r4010",          0,			ISA_MIPS2,      CPU_R4010 },
15071   { "vr4100",         0,			ISA_MIPS3,      CPU_VR4100 },
15072   { "vr4111",         0,			ISA_MIPS3,      CPU_R4111 },
15073   { "vr4120",         0,			ISA_MIPS3,      CPU_VR4120 },
15074   { "vr4130",         0,			ISA_MIPS3,      CPU_VR4120 },
15075   { "vr4181",         0,			ISA_MIPS3,      CPU_R4111 },
15076   { "vr4300",         0,			ISA_MIPS3,      CPU_R4300 },
15077   { "r4400",          0,			ISA_MIPS3,      CPU_R4400 },
15078   { "r4600",          0,			ISA_MIPS3,      CPU_R4600 },
15079   { "orion",          0,			ISA_MIPS3,      CPU_R4600 },
15080   { "r4650",          0,			ISA_MIPS3,      CPU_R4650 },
15081   /* ST Microelectronics Loongson 2E and 2F cores */
15082   { "loongson2e",     0,			ISA_MIPS3,   CPU_LOONGSON_2E },
15083   { "loongson2f",     0,			ISA_MIPS3,   CPU_LOONGSON_2F },
15084 
15085   /* MIPS IV */
15086   { "r8000",          0,			ISA_MIPS4,      CPU_R8000 },
15087   { "r10000",         0,			ISA_MIPS4,      CPU_R10000 },
15088   { "r12000",         0,			ISA_MIPS4,      CPU_R12000 },
15089   { "vr5000",         0,			ISA_MIPS4,      CPU_R5000 },
15090   { "vr5400",         0,			ISA_MIPS4,      CPU_VR5400 },
15091   { "vr5500",         0,			ISA_MIPS4,      CPU_VR5500 },
15092   { "rm5200",         0,			ISA_MIPS4,      CPU_R5000 },
15093   { "rm5230",         0,			ISA_MIPS4,      CPU_R5000 },
15094   { "rm5231",         0,			ISA_MIPS4,      CPU_R5000 },
15095   { "rm5261",         0,			ISA_MIPS4,      CPU_R5000 },
15096   { "rm5721",         0,			ISA_MIPS4,      CPU_R5000 },
15097   { "rm7000",         0,			ISA_MIPS4,      CPU_RM7000 },
15098   { "rm9000",         0,			ISA_MIPS4,      CPU_RM9000 },
15099 
15100   /* MIPS 32 */
15101   { "4kc",            0,			ISA_MIPS32,	CPU_MIPS32 },
15102   { "4km",            0,			ISA_MIPS32,	CPU_MIPS32 },
15103   { "4kp",            0,			ISA_MIPS32,	CPU_MIPS32 },
15104   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,	ISA_MIPS32,	CPU_MIPS32 },
15105 
15106   /* MIPS 32 Release 2 */
15107   { "4kec",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15108   { "4kem",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15109   { "4kep",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15110   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,	ISA_MIPS32R2,   CPU_MIPS32R2 },
15111   { "m4k",            0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15112   { "m4kp",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15113   { "24kc",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15114   { "24kf2_1",        0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15115   { "24kf",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15116   { "24kf1_1",        0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15117   /* Deprecated forms of the above.  */
15118   { "24kfx",          0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15119   { "24kx",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15120   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15121   { "24kec",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15122   { "24kef2_1",       MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15123   { "24kef",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15124   { "24kef1_1",       MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15125   /* Deprecated forms of the above.  */
15126   { "24kefx",         MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15127   { "24kex",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15128   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15129   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15130 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15131   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15132 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15133   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15134 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15135   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15136 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15137   /* Deprecated forms of the above.  */
15138   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15139 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15140   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15141 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15142   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15143   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15144 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15145   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15146 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15147   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15148 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15149   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15150 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15151   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15152 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15153   /* Deprecated forms of the above.  */
15154   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15155 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15156   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15157 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15158 
15159   /* MIPS 64 */
15160   { "5kc",            0,			ISA_MIPS64,	CPU_MIPS64 },
15161   { "5kf",            0,			ISA_MIPS64,	CPU_MIPS64 },
15162   { "20kc",           MIPS_CPU_ASE_MIPS3D,	ISA_MIPS64,	CPU_MIPS64 },
15163   { "25kf",           MIPS_CPU_ASE_MIPS3D,	ISA_MIPS64,     CPU_MIPS64 },
15164 
15165   /* MIPS 64 Release 2 */
15166 
15167   /* Broadcom SB-1 CPU core */
15168   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15169 						ISA_MIPS64,	CPU_SB1 },
15170   /* Broadcom SB-1A CPU core */
15171   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15172 						ISA_MIPS64,	CPU_SB1 },
15173 
15174   /* Cavium Networks Octeon CPU core */
15175   { "octeon",	      0,      ISA_MIPS64R2,   CPU_OCTEON },
15176 
15177   /* End marker */
15178   { NULL, 0, 0, 0 }
15179 };
15180 
15181 
15182 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15183    with a final "000" replaced by "k".  Ignore case.
15184 
15185    Note: this function is shared between GCC and GAS.  */
15186 
15187 static bfd_boolean
15188 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15189 {
15190   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15191     given++, canonical++;
15192 
15193   return ((*given == 0 && *canonical == 0)
15194 	  || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15195 }
15196 
15197 
15198 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15199    CPU name.  We've traditionally allowed a lot of variation here.
15200 
15201    Note: this function is shared between GCC and GAS.  */
15202 
15203 static bfd_boolean
15204 mips_matching_cpu_name_p (const char *canonical, const char *given)
15205 {
15206   /* First see if the name matches exactly, or with a final "000"
15207      turned into "k".  */
15208   if (mips_strict_matching_cpu_name_p (canonical, given))
15209     return TRUE;
15210 
15211   /* If not, try comparing based on numerical designation alone.
15212      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15213   if (TOLOWER (*given) == 'r')
15214     given++;
15215   if (!ISDIGIT (*given))
15216     return FALSE;
15217 
15218   /* Skip over some well-known prefixes in the canonical name,
15219      hoping to find a number there too.  */
15220   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15221     canonical += 2;
15222   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15223     canonical += 2;
15224   else if (TOLOWER (canonical[0]) == 'r')
15225     canonical += 1;
15226 
15227   return mips_strict_matching_cpu_name_p (canonical, given);
15228 }
15229 
15230 
15231 /* Parse an option that takes the name of a processor as its argument.
15232    OPTION is the name of the option and CPU_STRING is the argument.
15233    Return the corresponding processor enumeration if the CPU_STRING is
15234    recognized, otherwise report an error and return null.
15235 
15236    A similar function exists in GCC.  */
15237 
15238 static const struct mips_cpu_info *
15239 mips_parse_cpu (const char *option, const char *cpu_string)
15240 {
15241   const struct mips_cpu_info *p;
15242 
15243   /* 'from-abi' selects the most compatible architecture for the given
15244      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15245      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15246      version.  Look first at the -mgp options, if given, otherwise base
15247      the choice on MIPS_DEFAULT_64BIT.
15248 
15249      Treat NO_ABI like the EABIs.  One reason to do this is that the
15250      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15251      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15252      'mips64', just as we did in the days before 'from-abi'.  */
15253   if (strcasecmp (cpu_string, "from-abi") == 0)
15254     {
15255       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15256 	return mips_cpu_info_from_isa (ISA_MIPS1);
15257 
15258       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15259 	return mips_cpu_info_from_isa (ISA_MIPS3);
15260 
15261       if (file_mips_gp32 >= 0)
15262 	return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15263 
15264       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15265 				     ? ISA_MIPS3
15266 				     : ISA_MIPS1);
15267     }
15268 
15269   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15270   if (strcasecmp (cpu_string, "default") == 0)
15271     return 0;
15272 
15273   for (p = mips_cpu_info_table; p->name != 0; p++)
15274     if (mips_matching_cpu_name_p (p->name, cpu_string))
15275       return p;
15276 
15277   as_bad ("Bad value (%s) for %s", cpu_string, option);
15278   return 0;
15279 }
15280 
15281 /* Return the canonical processor information for ISA (a member of the
15282    ISA_MIPS* enumeration).  */
15283 
15284 static const struct mips_cpu_info *
15285 mips_cpu_info_from_isa (int isa)
15286 {
15287   int i;
15288 
15289   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15290     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15291 	&& isa == mips_cpu_info_table[i].isa)
15292       return (&mips_cpu_info_table[i]);
15293 
15294   return NULL;
15295 }
15296 
15297 static const struct mips_cpu_info *
15298 mips_cpu_info_from_arch (int arch)
15299 {
15300   int i;
15301 
15302   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15303     if (arch == mips_cpu_info_table[i].cpu)
15304       return (&mips_cpu_info_table[i]);
15305 
15306   return NULL;
15307 }
15308 
15309 static void
15310 show (FILE *stream, const char *string, int *col_p, int *first_p)
15311 {
15312   if (*first_p)
15313     {
15314       fprintf (stream, "%24s", "");
15315       *col_p = 24;
15316     }
15317   else
15318     {
15319       fprintf (stream, ", ");
15320       *col_p += 2;
15321     }
15322 
15323   if (*col_p + strlen (string) > 72)
15324     {
15325       fprintf (stream, "\n%24s", "");
15326       *col_p = 24;
15327     }
15328 
15329   fprintf (stream, "%s", string);
15330   *col_p += strlen (string);
15331 
15332   *first_p = 0;
15333 }
15334 
15335 void
15336 md_show_usage (FILE *stream)
15337 {
15338   int column, first;
15339   size_t i;
15340 
15341   fprintf (stream, _("\
15342 MIPS options:\n\
15343 -EB			generate big endian output\n\
15344 -EL			generate little endian output\n\
15345 -g, -g2			do not remove unneeded NOPs or swap branches\n\
15346 -G NUM			allow referencing objects up to NUM bytes\n\
15347 			implicitly with the gp register [default 8]\n"));
15348   fprintf (stream, _("\
15349 -mips1			generate MIPS ISA I instructions\n\
15350 -mips2			generate MIPS ISA II instructions\n\
15351 -mips3			generate MIPS ISA III instructions\n\
15352 -mips4			generate MIPS ISA IV instructions\n\
15353 -mips5                  generate MIPS ISA V instructions\n\
15354 -mips32                 generate MIPS32 ISA instructions\n\
15355 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15356 -mips64                 generate MIPS64 ISA instructions\n\
15357 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15358 -march=CPU/-mtune=CPU	generate code/schedule for CPU, where CPU is one of:\n"));
15359 
15360   first = 1;
15361 
15362   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15363     show (stream, mips_cpu_info_table[i].name, &column, &first);
15364   show (stream, "from-abi", &column, &first);
15365   fputc ('\n', stream);
15366 
15367   fprintf (stream, _("\
15368 -mCPU			equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15369 -no-mCPU		don't generate code specific to CPU.\n\
15370 			For -mCPU and -no-mCPU, CPU must be one of:\n"));
15371 
15372   first = 1;
15373 
15374   show (stream, "3900", &column, &first);
15375   show (stream, "4010", &column, &first);
15376   show (stream, "4100", &column, &first);
15377   show (stream, "4650", &column, &first);
15378   fputc ('\n', stream);
15379 
15380   fprintf (stream, _("\
15381 -mips16			generate mips16 instructions\n\
15382 -no-mips16		do not generate mips16 instructions\n"));
15383   fprintf (stream, _("\
15384 -msmartmips		generate smartmips instructions\n\
15385 -mno-smartmips		do not generate smartmips instructions\n"));
15386   fprintf (stream, _("\
15387 -mdsp			generate DSP instructions\n\
15388 -mno-dsp		do not generate DSP instructions\n"));
15389   fprintf (stream, _("\
15390 -mdspr2			generate DSP R2 instructions\n\
15391 -mno-dspr2		do not generate DSP R2 instructions\n"));
15392   fprintf (stream, _("\
15393 -mmt			generate MT instructions\n\
15394 -mno-mt			do not generate MT instructions\n"));
15395   fprintf (stream, _("\
15396 -mfix-vr4120		work around certain VR4120 errata\n\
15397 -mfix-vr4130		work around VR4130 mflo/mfhi errata\n\
15398 -mgp32			use 32-bit GPRs, regardless of the chosen ISA\n\
15399 -mfp32			use 32-bit FPRs, regardless of the chosen ISA\n\
15400 -msym32			assume all symbols have 32-bit values\n\
15401 -O0			remove unneeded NOPs, do not swap branches\n\
15402 -O			remove unneeded NOPs and swap branches\n\
15403 --trap, --no-break	trap exception on div by 0 and mult overflow\n\
15404 --break, --no-trap	break exception on div by 0 and mult overflow\n"));
15405   fprintf (stream, _("\
15406 -mhard-float		allow floating-point instructions\n\
15407 -msoft-float		do not allow floating-point instructions\n\
15408 -msingle-float		only allow 32-bit floating-point operations\n\
15409 -mdouble-float		allow 32-bit and 64-bit floating-point operations\n\
15410 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15411 		     ));
15412 #ifdef OBJ_ELF
15413   fprintf (stream, _("\
15414 -KPIC, -call_shared	generate SVR4 position independent code\n\
15415 -call_nonpic		generate non-PIC code that can operate with DSOs\n\
15416 -mvxworks-pic		generate VxWorks position independent code\n\
15417 -non_shared		do not generate code that can operate with DSOs\n\
15418 -xgot			assume a 32 bit GOT\n\
15419 -mpdr, -mno-pdr		enable/disable creation of .pdr sections\n\
15420 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15421                         position dependent (non shared) code\n\
15422 -mabi=ABI		create ABI conformant object file for:\n"));
15423 
15424   first = 1;
15425 
15426   show (stream, "32", &column, &first);
15427   show (stream, "o64", &column, &first);
15428   show (stream, "n32", &column, &first);
15429   show (stream, "64", &column, &first);
15430   show (stream, "eabi", &column, &first);
15431 
15432   fputc ('\n', stream);
15433 
15434   fprintf (stream, _("\
15435 -32			create o32 ABI object file (default)\n\
15436 -n32			create n32 ABI object file\n\
15437 -64			create 64 ABI object file\n"));
15438 #endif
15439 }
15440 
15441 enum dwarf2_format
15442 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15443 {
15444   if (HAVE_64BIT_SYMBOLS)
15445     {
15446 #ifdef TE_IRIX
15447       return dwarf2_format_64bit_irix;
15448 #else
15449       return dwarf2_format_64bit;
15450 #endif
15451     }
15452   else
15453     return dwarf2_format_32bit;
15454 }
15455 
15456 int
15457 mips_dwarf2_addr_size (void)
15458 {
15459   if (HAVE_64BIT_SYMBOLS)
15460     return 8;
15461   else
15462     return 4;
15463 }
15464 
15465 /* Standard calling conventions leave the CFA at SP on entry.  */
15466 void
15467 mips_cfi_frame_initial_instructions (void)
15468 {
15469   cfi_add_CFA_def_cfa_register (SP);
15470 }
15471 
15472 int
15473 tc_mips_regname_to_dw2regnum (char *regname)
15474 {
15475   unsigned int regnum = -1;
15476   unsigned int reg;
15477 
15478   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15479     regnum = reg;
15480 
15481   return regnum;
15482 }
15483