tc-mips.c revision 179405
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 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 2, 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, 59 Temple Place - Suite 330, Boston, MA
24   02111-1307, USA.  */
25
26#include "as.h"
27#include "config.h"
28#include "subsegs.h"
29#include "safe-ctype.h"
30
31#include <stdarg.h>
32
33#include "opcode/mips.h"
34#include "itbl-ops.h"
35#include "dwarf2dbg.h"
36
37#ifdef DEBUG
38#define DBG(x) printf x
39#else
40#define DBG(x)
41#endif
42
43#ifdef OBJ_MAYBE_ELF
44/* Clean up namespace so we can include obj-elf.h too.  */
45static int mips_output_flavor (void);
46static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47#undef OBJ_PROCESS_STAB
48#undef OUTPUT_FLAVOR
49#undef S_GET_ALIGN
50#undef S_GET_SIZE
51#undef S_SET_ALIGN
52#undef S_SET_SIZE
53#undef obj_frob_file
54#undef obj_frob_file_after_relocs
55#undef obj_frob_symbol
56#undef obj_pop_insert
57#undef obj_sec_sym_ok_for_reloc
58#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60#include "obj-elf.h"
61/* Fix any of them that we actually care about.  */
62#undef OUTPUT_FLAVOR
63#define OUTPUT_FLAVOR mips_output_flavor()
64#endif
65
66#if defined (OBJ_ELF)
67#include "elf/mips.h"
68#endif
69
70#ifndef ECOFF_DEBUGGING
71#define NO_ECOFF_DEBUGGING
72#define ECOFF_DEBUGGING 0
73#endif
74
75int mips_flag_mdebug = -1;
76
77/* Control generation of .pdr sections.  Off by default on IRIX: the native
78   linker doesn't know about and discards them, but relocations against them
79   remain, leading to rld crashes.  */
80#ifdef TE_IRIX
81int mips_flag_pdr = FALSE;
82#else
83int mips_flag_pdr = TRUE;
84#endif
85
86#include "ecoff.h"
87
88#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89static char *mips_regmask_frag;
90#endif
91
92#define ZERO 0
93#define AT  1
94#define TREG 24
95#define PIC_CALL_REG 25
96#define KT0 26
97#define KT1 27
98#define GP  28
99#define SP  29
100#define FP  30
101#define RA  31
102
103#define ILLEGAL_REG (32)
104
105/* Allow override of standard little-endian ECOFF format.  */
106
107#ifndef ECOFF_LITTLE_FORMAT
108#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
109#endif
110
111extern int target_big_endian;
112
113/* The name of the readonly data section.  */
114#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
115			    ? ".data" \
116			    : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117			    ? ".rdata" \
118			    : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119			    ? ".rdata" \
120			    : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121			    ? ".rodata" \
122			    : (abort (), ""))
123
124/* The ABI to use.  */
125enum mips_abi_level
126{
127  NO_ABI = 0,
128  O32_ABI,
129  O64_ABI,
130  N32_ABI,
131  N64_ABI,
132  EABI_ABI
133};
134
135/* MIPS ABI we are using for this output file.  */
136static enum mips_abi_level mips_abi = NO_ABI;
137
138/* Whether or not we have code that can call pic code.  */
139int mips_abicalls = FALSE;
140
141/* This is the set of options which may be modified by the .set
142   pseudo-op.  We use a struct so that .set push and .set pop are more
143   reliable.  */
144
145struct mips_set_options
146{
147  /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
148     if it has not been initialized.  Changed by `.set mipsN', and the
149     -mipsN command line option, and the default CPU.  */
150  int isa;
151  /* Enabled Application Specific Extensions (ASEs).  These are set to -1
152     if they have not been initialized.  Changed by `.set <asename>', by
153     command line options, and based on the default architecture.  */
154  int ase_mips3d;
155  int ase_mdmx;
156  /* Whether we are assembling for the mips16 processor.  0 if we are
157     not, 1 if we are, and -1 if the value has not been initialized.
158     Changed by `.set mips16' and `.set nomips16', and the -mips16 and
159     -nomips16 command line options, and the default CPU.  */
160  int mips16;
161  /* Non-zero if we should not reorder instructions.  Changed by `.set
162     reorder' and `.set noreorder'.  */
163  int noreorder;
164  /* Non-zero if we should not permit the $at ($1) register to be used
165     in instructions.  Changed by `.set at' and `.set noat'.  */
166  int noat;
167  /* Non-zero if we should warn when a macro instruction expands into
168     more than one machine instruction.  Changed by `.set nomacro' and
169     `.set macro'.  */
170  int warn_about_macros;
171  /* Non-zero if we should not move instructions.  Changed by `.set
172     move', `.set volatile', `.set nomove', and `.set novolatile'.  */
173  int nomove;
174  /* Non-zero if we should not optimize branches by moving the target
175     of the branch into the delay slot.  Actually, we don't perform
176     this optimization anyhow.  Changed by `.set bopt' and `.set
177     nobopt'.  */
178  int nobopt;
179  /* Non-zero if we should not autoextend mips16 instructions.
180     Changed by `.set autoextend' and `.set noautoextend'.  */
181  int noautoextend;
182  /* Restrict general purpose registers and floating point registers
183     to 32 bit.  This is initially determined when -mgp32 or -mfp32
184     is passed but can changed if the assembler code uses .set mipsN.  */
185  int gp32;
186  int fp32;
187  /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
188     command line option, and the default CPU.  */
189  int arch;
190};
191
192/* True if -mgp32 was passed.  */
193static int file_mips_gp32 = -1;
194
195/* True if -mfp32 was passed.  */
196static int file_mips_fp32 = -1;
197
198/* This is the struct we use to hold the current set of options.  Note
199   that we must set the isa field to ISA_UNKNOWN and the ASE fields to
200   -1 to indicate that they have not been initialized.  */
201
202static struct mips_set_options mips_opts =
203{
204  ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN
205};
206
207/* These variables are filled in with the masks of registers used.
208   The object format code reads them and puts them in the appropriate
209   place.  */
210unsigned long mips_gprmask;
211unsigned long mips_cprmask[4];
212
213/* MIPS ISA we are using for this output file.  */
214static int file_mips_isa = ISA_UNKNOWN;
215
216/* True if -mips16 was passed or implied by arguments passed on the
217   command line (e.g., by -march).  */
218static int file_ase_mips16;
219
220/* True if -mips3d was passed or implied by arguments passed on the
221   command line (e.g., by -march).  */
222static int file_ase_mips3d;
223
224/* True if -mdmx was passed or implied by arguments passed on the
225   command line (e.g., by -march).  */
226static int file_ase_mdmx;
227
228/* The argument of the -march= flag.  The architecture we are assembling.  */
229static int file_mips_arch = CPU_UNKNOWN;
230static const char *mips_arch_string;
231
232/* The argument of the -mtune= flag.  The architecture for which we
233   are optimizing.  */
234static int mips_tune = CPU_UNKNOWN;
235static const char *mips_tune_string;
236
237/* True when generating 32-bit code for a 64-bit processor.  */
238static int mips_32bitmode = 0;
239
240/* True if the given ABI requires 32-bit registers.  */
241#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
242
243/* Likewise 64-bit registers.  */
244#define ABI_NEEDS_64BIT_REGS(ABI) \
245  ((ABI) == N32_ABI 		  \
246   || (ABI) == N64_ABI		  \
247   || (ABI) == O64_ABI)
248
249/*  Return true if ISA supports 64 bit gp register instructions.  */
250#define ISA_HAS_64BIT_REGS(ISA) (    \
251   (ISA) == ISA_MIPS3                \
252   || (ISA) == ISA_MIPS4             \
253   || (ISA) == ISA_MIPS5             \
254   || (ISA) == ISA_MIPS64            \
255   || (ISA) == ISA_MIPS64R2          \
256   )
257
258/* Return true if ISA supports 64-bit right rotate (dror et al.)
259   instructions.  */
260#define ISA_HAS_DROR(ISA) (	\
261   (ISA) == ISA_MIPS64R2	\
262   )
263
264/* Return true if ISA supports 32-bit right rotate (ror et al.)
265   instructions.  */
266#define ISA_HAS_ROR(ISA) (	\
267   (ISA) == ISA_MIPS32R2	\
268   || (ISA) == ISA_MIPS64R2	\
269   )
270
271#define HAVE_32BIT_GPRS		                   \
272    (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
273
274#define HAVE_32BIT_FPRS                            \
275    (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
276
277#define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
278#define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
279
280#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
281
282#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
283
284/* We can only have 64bit addresses if the object file format
285   supports it.  */
286#define HAVE_32BIT_ADDRESSES                           \
287   (HAVE_32BIT_GPRS                                    \
288    || ((bfd_arch_bits_per_address (stdoutput) == 32   \
289         || ! HAVE_64BIT_OBJECTS)                      \
290        && mips_pic != EMBEDDED_PIC))
291
292#define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
293
294/* Addresses are loaded in different ways, depending on the address size
295   in use.  The n32 ABI Documentation also mandates the use of additions
296   with overflow checking, but existing implementations don't follow it.  */
297#define ADDRESS_ADD_INSN						\
298   (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
299
300#define ADDRESS_ADDI_INSN						\
301   (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
302
303#define ADDRESS_LOAD_INSN						\
304   (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
305
306#define ADDRESS_STORE_INSN						\
307   (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
308
309/* Return true if the given CPU supports the MIPS16 ASE.  */
310#define CPU_HAS_MIPS16(cpu)						\
311   (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0		\
312    || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
313
314/* Return true if the given CPU supports the MIPS3D ASE.  */
315#define CPU_HAS_MIPS3D(cpu)	((cpu) == CPU_SB1      \
316				 )
317
318/* Return true if the given CPU supports the MDMX ASE.  */
319#define CPU_HAS_MDMX(cpu)	(FALSE                 \
320				 )
321
322/* True if CPU has a dror instruction.  */
323#define CPU_HAS_DROR(CPU)	((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
324
325/* True if CPU has a ror instruction.  */
326#define CPU_HAS_ROR(CPU)	CPU_HAS_DROR (CPU)
327
328/* True if mflo and mfhi can be immediately followed by instructions
329   which write to the HI and LO registers.
330
331   According to MIPS specifications, MIPS ISAs I, II, and III need
332   (at least) two instructions between the reads of HI/LO and
333   instructions which write them, and later ISAs do not.  Contradicting
334   the MIPS specifications, some MIPS IV processor user manuals (e.g.
335   the UM for the NEC Vr5000) document needing the instructions between
336   HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
337   MIPS64 and later ISAs to have the interlocks, plus any specific
338   earlier-ISA CPUs for which CPU documentation declares that the
339   instructions are really interlocked.  */
340#define hilo_interlocks \
341  (mips_opts.isa == ISA_MIPS32                        \
342   || mips_opts.isa == ISA_MIPS32R2                   \
343   || mips_opts.isa == ISA_MIPS64                     \
344   || mips_opts.isa == ISA_MIPS64R2                   \
345   || mips_opts.arch == CPU_R4010                     \
346   || mips_opts.arch == CPU_R10000                    \
347   || mips_opts.arch == CPU_R12000                    \
348   || mips_opts.arch == CPU_RM7000                    \
349   || mips_opts.arch == CPU_SB1                       \
350   || mips_opts.arch == CPU_VR5500                    \
351   )
352
353/* Whether the processor uses hardware interlocks to protect reads
354   from the GPRs after they are loaded from memory, and thus does not
355   require nops to be inserted.  This applies to instructions marked
356   INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
357   level I.  */
358#define gpr_interlocks \
359  (mips_opts.isa != ISA_MIPS1  \
360   || mips_opts.arch == CPU_VR5400  \
361   || mips_opts.arch == CPU_VR5500  \
362   || mips_opts.arch == CPU_R3900)
363
364/* Whether the processor uses hardware interlocks to avoid delays
365   required by coprocessor instructions, and thus does not require
366   nops to be inserted.  This applies to instructions marked
367   INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
368   between instructions marked INSN_WRITE_COND_CODE and ones marked
369   INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
370   levels I, II, and III.  */
371/* Itbl support may require additional care here.  */
372#define cop_interlocks                                \
373  ((mips_opts.isa != ISA_MIPS1                        \
374    && mips_opts.isa != ISA_MIPS2                     \
375    && mips_opts.isa != ISA_MIPS3)                    \
376   || mips_opts.arch == CPU_R4300                     \
377   || mips_opts.arch == CPU_VR5400                    \
378   || mips_opts.arch == CPU_VR5500                    \
379   || mips_opts.arch == CPU_SB1                       \
380   )
381
382/* Whether the processor uses hardware interlocks to protect reads
383   from coprocessor registers after they are loaded from memory, and
384   thus does not require nops to be inserted.  This applies to
385   instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
386   requires at MIPS ISA level I.  */
387#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
388
389/* Is this a mfhi or mflo instruction?  */
390#define MF_HILO_INSN(PINFO) \
391          ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
392
393/* MIPS PIC level.  */
394
395enum mips_pic_level mips_pic;
396
397/* 1 if we should generate 32 bit offsets from the $gp register in
398   SVR4_PIC mode.  Currently has no meaning in other modes.  */
399static int mips_big_got = 0;
400
401/* 1 if trap instructions should used for overflow rather than break
402   instructions.  */
403static int mips_trap = 0;
404
405/* 1 if double width floating point constants should not be constructed
406   by assembling two single width halves into two single width floating
407   point registers which just happen to alias the double width destination
408   register.  On some architectures this aliasing can be disabled by a bit
409   in the status register, and the setting of this bit cannot be determined
410   automatically at assemble time.  */
411static int mips_disable_float_construction;
412
413/* Non-zero if any .set noreorder directives were used.  */
414
415static int mips_any_noreorder;
416
417/* Non-zero if nops should be inserted when the register referenced in
418   an mfhi/mflo instruction is read in the next two instructions.  */
419static int mips_7000_hilo_fix;
420
421/* The size of the small data section.  */
422static unsigned int g_switch_value = 8;
423/* Whether the -G option was used.  */
424static int g_switch_seen = 0;
425
426#define N_RMASK 0xc4
427#define N_VFP   0xd4
428
429/* If we can determine in advance that GP optimization won't be
430   possible, we can skip the relaxation stuff that tries to produce
431   GP-relative references.  This makes delay slot optimization work
432   better.
433
434   This function can only provide a guess, but it seems to work for
435   gcc output.  It needs to guess right for gcc, otherwise gcc
436   will put what it thinks is a GP-relative instruction in a branch
437   delay slot.
438
439   I don't know if a fix is needed for the SVR4_PIC mode.  I've only
440   fixed it for the non-PIC mode.  KR 95/04/07  */
441static int nopic_need_relax (symbolS *, int);
442
443/* handle of the OPCODE hash table */
444static struct hash_control *op_hash = NULL;
445
446/* The opcode hash table we use for the mips16.  */
447static struct hash_control *mips16_op_hash = NULL;
448
449/* This array holds the chars that always start a comment.  If the
450    pre-processor is disabled, these aren't very useful */
451const char comment_chars[] = "#";
452
453/* This array holds the chars that only start a comment at the beginning of
454   a line.  If the line seems to have the form '# 123 filename'
455   .line and .file directives will appear in the pre-processed output */
456/* Note that input_file.c hand checks for '#' at the beginning of the
457   first line of the input file.  This is because the compiler outputs
458   #NO_APP at the beginning of its output.  */
459/* Also note that C style comments are always supported.  */
460const char line_comment_chars[] = "#";
461
462/* This array holds machine specific line separator characters.  */
463const char line_separator_chars[] = ";";
464
465/* Chars that can be used to separate mant from exp in floating point nums */
466const char EXP_CHARS[] = "eE";
467
468/* Chars that mean this number is a floating point constant */
469/* As in 0f12.456 */
470/* or    0d1.2345e12 */
471const char FLT_CHARS[] = "rRsSfFdDxXpP";
472
473/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
474   changed in read.c .  Ideally it shouldn't have to know about it at all,
475   but nothing is ideal around here.
476 */
477
478static char *insn_error;
479
480static int auto_align = 1;
481
482/* When outputting SVR4 PIC code, the assembler needs to know the
483   offset in the stack frame from which to restore the $gp register.
484   This is set by the .cprestore pseudo-op, and saved in this
485   variable.  */
486static offsetT mips_cprestore_offset = -1;
487
488/* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
489   more optimizations, it can use a register value instead of a memory-saved
490   offset and even an other register than $gp as global pointer.  */
491static offsetT mips_cpreturn_offset = -1;
492static int mips_cpreturn_register = -1;
493static int mips_gp_register = GP;
494static int mips_gprel_offset = 0;
495
496/* Whether mips_cprestore_offset has been set in the current function
497   (or whether it has already been warned about, if not).  */
498static int mips_cprestore_valid = 0;
499
500/* This is the register which holds the stack frame, as set by the
501   .frame pseudo-op.  This is needed to implement .cprestore.  */
502static int mips_frame_reg = SP;
503
504/* Whether mips_frame_reg has been set in the current function
505   (or whether it has already been warned about, if not).  */
506static int mips_frame_reg_valid = 0;
507
508/* To output NOP instructions correctly, we need to keep information
509   about the previous two instructions.  */
510
511/* Whether we are optimizing.  The default value of 2 means to remove
512   unneeded NOPs and swap branch instructions when possible.  A value
513   of 1 means to not swap branches.  A value of 0 means to always
514   insert NOPs.  */
515static int mips_optimize = 2;
516
517/* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
518   equivalent to seeing no -g option at all.  */
519static int mips_debug = 0;
520
521/* The previous instruction.  */
522static struct mips_cl_insn prev_insn;
523
524/* The instruction before prev_insn.  */
525static struct mips_cl_insn prev_prev_insn;
526
527/* If we don't want information for prev_insn or prev_prev_insn, we
528   point the insn_mo field at this dummy integer.  */
529static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
530
531/* Non-zero if prev_insn is valid.  */
532static int prev_insn_valid;
533
534/* The frag for the previous instruction.  */
535static struct frag *prev_insn_frag;
536
537/* The offset into prev_insn_frag for the previous instruction.  */
538static long prev_insn_where;
539
540/* The reloc type for the previous instruction, if any.  */
541static bfd_reloc_code_real_type prev_insn_reloc_type[3];
542
543/* The reloc for the previous instruction, if any.  */
544static fixS *prev_insn_fixp[3];
545
546/* Non-zero if the previous instruction was in a delay slot.  */
547static int prev_insn_is_delay_slot;
548
549/* Non-zero if the previous instruction was in a .set noreorder.  */
550static int prev_insn_unreordered;
551
552/* Non-zero if the previous instruction uses an extend opcode (if
553   mips16).  */
554static int prev_insn_extended;
555
556/* Non-zero if the previous previous instruction was in a .set
557   noreorder.  */
558static int prev_prev_insn_unreordered;
559
560/* If this is set, it points to a frag holding nop instructions which
561   were inserted before the start of a noreorder section.  If those
562   nops turn out to be unnecessary, the size of the frag can be
563   decreased.  */
564static fragS *prev_nop_frag;
565
566/* The number of nop instructions we created in prev_nop_frag.  */
567static int prev_nop_frag_holds;
568
569/* The number of nop instructions that we know we need in
570   prev_nop_frag.  */
571static int prev_nop_frag_required;
572
573/* The number of instructions we've seen since prev_nop_frag.  */
574static int prev_nop_frag_since;
575
576/* For ECOFF and ELF, relocations against symbols are done in two
577   parts, with a HI relocation and a LO relocation.  Each relocation
578   has only 16 bits of space to store an addend.  This means that in
579   order for the linker to handle carries correctly, it must be able
580   to locate both the HI and the LO relocation.  This means that the
581   relocations must appear in order in the relocation table.
582
583   In order to implement this, we keep track of each unmatched HI
584   relocation.  We then sort them so that they immediately precede the
585   corresponding LO relocation.  */
586
587struct mips_hi_fixup
588{
589  /* Next HI fixup.  */
590  struct mips_hi_fixup *next;
591  /* This fixup.  */
592  fixS *fixp;
593  /* The section this fixup is in.  */
594  segT seg;
595};
596
597/* The list of unmatched HI relocs.  */
598
599static struct mips_hi_fixup *mips_hi_fixup_list;
600
601/* The frag containing the last explicit relocation operator.
602   Null if explicit relocations have not been used.  */
603
604static fragS *prev_reloc_op_frag;
605
606/* Map normal MIPS register numbers to mips16 register numbers.  */
607
608#define X ILLEGAL_REG
609static const int mips32_to_16_reg_map[] =
610{
611  X, X, 2, 3, 4, 5, 6, 7,
612  X, X, X, X, X, X, X, X,
613  0, 1, X, X, X, X, X, X,
614  X, X, X, X, X, X, X, X
615};
616#undef X
617
618/* Map mips16 register numbers to normal MIPS register numbers.  */
619
620static const unsigned int mips16_to_32_reg_map[] =
621{
622  16, 17, 2, 3, 4, 5, 6, 7
623};
624
625static int mips_fix_vr4120;
626
627/* We don't relax branches by default, since this causes us to expand
628   `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
629   fail to compute the offset before expanding the macro to the most
630   efficient expansion.  */
631
632static int mips_relax_branch;
633
634/* The expansion of many macros depends on the type of symbol that
635   they refer to.  For example, when generating position-dependent code,
636   a macro that refers to a symbol may have two different expansions,
637   one which uses GP-relative addresses and one which uses absolute
638   addresses.  When generating SVR4-style PIC, a macro may have
639   different expansions for local and global symbols.
640
641   We handle these situations by generating both sequences and putting
642   them in variant frags.  In position-dependent code, the first sequence
643   will be the GP-relative one and the second sequence will be the
644   absolute one.  In SVR4 PIC, the first sequence will be for global
645   symbols and the second will be for local symbols.
646
647   The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
648   SECOND are the lengths of the two sequences in bytes.  These fields
649   can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
650   the subtype has the following flags:
651
652   RELAX_USE_SECOND
653	Set if it has been decided that we should use the second
654	sequence instead of the first.
655
656   RELAX_SECOND_LONGER
657	Set in the first variant frag if the macro's second implementation
658	is longer than its first.  This refers to the macro as a whole,
659	not an individual relaxation.
660
661   RELAX_NOMACRO
662	Set in the first variant frag if the macro appeared in a .set nomacro
663	block and if one alternative requires a warning but the other does not.
664
665   RELAX_DELAY_SLOT
666	Like RELAX_NOMACRO, but indicates that the macro appears in a branch
667	delay slot.
668
669   The frag's "opcode" points to the first fixup for relaxable code.
670
671   Relaxable macros are generated using a sequence such as:
672
673      relax_start (SYMBOL);
674      ... generate first expansion ...
675      relax_switch ();
676      ... generate second expansion ...
677      relax_end ();
678
679   The code and fixups for the unwanted alternative are discarded
680   by md_convert_frag.  */
681#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
682
683#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
684#define RELAX_SECOND(X) ((X) & 0xff)
685#define RELAX_USE_SECOND 0x10000
686#define RELAX_SECOND_LONGER 0x20000
687#define RELAX_NOMACRO 0x40000
688#define RELAX_DELAY_SLOT 0x80000
689
690/* Branch without likely bit.  If label is out of range, we turn:
691
692 	beq reg1, reg2, label
693	delay slot
694
695   into
696
697        bne reg1, reg2, 0f
698        nop
699        j label
700     0: delay slot
701
702   with the following opcode replacements:
703
704	beq <-> bne
705	blez <-> bgtz
706	bltz <-> bgez
707	bc1f <-> bc1t
708
709	bltzal <-> bgezal  (with jal label instead of j label)
710
711   Even though keeping the delay slot instruction in the delay slot of
712   the branch would be more efficient, it would be very tricky to do
713   correctly, because we'd have to introduce a variable frag *after*
714   the delay slot instruction, and expand that instead.  Let's do it
715   the easy way for now, even if the branch-not-taken case now costs
716   one additional instruction.  Out-of-range branches are not supposed
717   to be common, anyway.
718
719   Branch likely.  If label is out of range, we turn:
720
721	beql reg1, reg2, label
722	delay slot (annulled if branch not taken)
723
724   into
725
726        beql reg1, reg2, 1f
727        nop
728        beql $0, $0, 2f
729        nop
730     1: j[al] label
731        delay slot (executed only if branch taken)
732     2:
733
734   It would be possible to generate a shorter sequence by losing the
735   likely bit, generating something like:
736
737	bne reg1, reg2, 0f
738	nop
739	j[al] label
740	delay slot (executed only if branch taken)
741     0:
742
743	beql -> bne
744	bnel -> beq
745	blezl -> bgtz
746	bgtzl -> blez
747	bltzl -> bgez
748	bgezl -> bltz
749	bc1fl -> bc1t
750	bc1tl -> bc1f
751
752	bltzall -> bgezal  (with jal label instead of j label)
753	bgezall -> bltzal  (ditto)
754
755
756   but it's not clear that it would actually improve performance.  */
757#define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
758  ((relax_substateT) \
759   (0xc0000000 \
760    | ((toofar) ? 1 : 0) \
761    | ((link) ? 2 : 0) \
762    | ((likely) ? 4 : 0) \
763    | ((uncond) ? 8 : 0)))
764#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
765#define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
766#define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
767#define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
768#define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
769
770/* For mips16 code, we use an entirely different form of relaxation.
771   mips16 supports two versions of most instructions which take
772   immediate values: a small one which takes some small value, and a
773   larger one which takes a 16 bit value.  Since branches also follow
774   this pattern, relaxing these values is required.
775
776   We can assemble both mips16 and normal MIPS code in a single
777   object.  Therefore, we need to support this type of relaxation at
778   the same time that we support the relaxation described above.  We
779   use the high bit of the subtype field to distinguish these cases.
780
781   The information we store for this type of relaxation is the
782   argument code found in the opcode file for this relocation, whether
783   the user explicitly requested a small or extended form, and whether
784   the relocation is in a jump or jal delay slot.  That tells us the
785   size of the value, and how it should be stored.  We also store
786   whether the fragment is considered to be extended or not.  We also
787   store whether this is known to be a branch to a different section,
788   whether we have tried to relax this frag yet, and whether we have
789   ever extended a PC relative fragment because of a shift count.  */
790#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot)	\
791  (0x80000000							\
792   | ((type) & 0xff)						\
793   | ((small) ? 0x100 : 0)					\
794   | ((ext) ? 0x200 : 0)					\
795   | ((dslot) ? 0x400 : 0)					\
796   | ((jal_dslot) ? 0x800 : 0))
797#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
798#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
799#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
800#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
801#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
802#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
803#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
804#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
805#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
806#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
807#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
808#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
809
810/* Is the given value a sign-extended 32-bit value?  */
811#define IS_SEXT_32BIT_NUM(x)						\
812  (((x) &~ (offsetT) 0x7fffffff) == 0					\
813   || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
814
815/* Is the given value a sign-extended 16-bit value?  */
816#define IS_SEXT_16BIT_NUM(x)						\
817  (((x) &~ (offsetT) 0x7fff) == 0					\
818   || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
819
820
821/* Global variables used when generating relaxable macros.  See the
822   comment above RELAX_ENCODE for more details about how relaxation
823   is used.  */
824static struct {
825  /* 0 if we're not emitting a relaxable macro.
826     1 if we're emitting the first of the two relaxation alternatives.
827     2 if we're emitting the second alternative.  */
828  int sequence;
829
830  /* The first relaxable fixup in the current frag.  (In other words,
831     the first fixup that refers to relaxable code.)  */
832  fixS *first_fixup;
833
834  /* sizes[0] says how many bytes of the first alternative are stored in
835     the current frag.  Likewise sizes[1] for the second alternative.  */
836  unsigned int sizes[2];
837
838  /* The symbol on which the choice of sequence depends.  */
839  symbolS *symbol;
840} mips_relax;
841
842/* Global variables used to decide whether a macro needs a warning.  */
843static struct {
844  /* True if the macro is in a branch delay slot.  */
845  bfd_boolean delay_slot_p;
846
847  /* For relaxable macros, sizes[0] is the length of the first alternative
848     in bytes and sizes[1] is the length of the second alternative.
849     For non-relaxable macros, both elements give the length of the
850     macro in bytes.  */
851  unsigned int sizes[2];
852
853  /* The first variant frag for this macro.  */
854  fragS *first_frag;
855} mips_macro_warning;
856
857/* Prototypes for static functions.  */
858
859#define internalError()							\
860    as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
861
862enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
863
864static void append_insn
865  (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
866static void mips_no_prev_insn (int);
867static void mips16_macro_build
868  (expressionS *, const char *, const char *, va_list);
869static void load_register (int, expressionS *, int);
870static void macro_start (void);
871static void macro_end (void);
872static void macro (struct mips_cl_insn * ip);
873static void mips16_macro (struct mips_cl_insn * ip);
874#ifdef LOSING_COMPILER
875static void macro2 (struct mips_cl_insn * ip);
876#endif
877static void mips_ip (char *str, struct mips_cl_insn * ip);
878static void mips16_ip (char *str, struct mips_cl_insn * ip);
879static void mips16_immed
880  (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
881   unsigned long *, bfd_boolean *, unsigned short *);
882static size_t my_getSmallExpression
883  (expressionS *, bfd_reloc_code_real_type *, char *);
884static void my_getExpression (expressionS *, char *);
885static void s_align (int);
886static void s_change_sec (int);
887static void s_change_section (int);
888static void s_cons (int);
889static void s_float_cons (int);
890static void s_mips_globl (int);
891static void s_option (int);
892static void s_mipsset (int);
893static void s_abicalls (int);
894static void s_cpload (int);
895static void s_cpsetup (int);
896static void s_cplocal (int);
897static void s_cprestore (int);
898static void s_cpreturn (int);
899static void s_gpvalue (int);
900static void s_gpword (int);
901static void s_gpdword (int);
902static void s_cpadd (int);
903static void s_insn (int);
904static void md_obj_begin (void);
905static void md_obj_end (void);
906static void s_mips_ent (int);
907static void s_mips_end (int);
908static void s_mips_frame (int);
909static void s_mips_mask (int reg_type);
910static void s_mips_stab (int);
911static void s_mips_weakext (int);
912static void s_mips_file (int);
913static void s_mips_loc (int);
914static bfd_boolean pic_need_relax (symbolS *, asection *);
915static int relaxed_branch_length (fragS *, asection *, int);
916static int validate_mips_insn (const struct mips_opcode *);
917
918/* Table and functions used to map between CPU/ISA names, and
919   ISA levels, and CPU numbers.  */
920
921struct mips_cpu_info
922{
923  const char *name;           /* CPU or ISA name.  */
924  int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
925  int isa;                    /* ISA level.  */
926  int cpu;                    /* CPU number (default CPU if ISA).  */
927};
928
929static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
930static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
931static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
932
933/* Pseudo-op table.
934
935   The following pseudo-ops from the Kane and Heinrich MIPS book
936   should be defined here, but are currently unsupported: .alias,
937   .galive, .gjaldef, .gjrlive, .livereg, .noalias.
938
939   The following pseudo-ops from the Kane and Heinrich MIPS book are
940   specific to the type of debugging information being generated, and
941   should be defined by the object format: .aent, .begin, .bend,
942   .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
943   .vreg.
944
945   The following pseudo-ops from the Kane and Heinrich MIPS book are
946   not MIPS CPU specific, but are also not specific to the object file
947   format.  This file is probably the best place to define them, but
948   they are not currently supported: .asm0, .endr, .lab, .repeat,
949   .struct.  */
950
951static const pseudo_typeS mips_pseudo_table[] =
952{
953  /* MIPS specific pseudo-ops.  */
954  {"option", s_option, 0},
955  {"set", s_mipsset, 0},
956  {"rdata", s_change_sec, 'r'},
957  {"sdata", s_change_sec, 's'},
958  {"livereg", s_ignore, 0},
959  {"abicalls", s_abicalls, 0},
960  {"cpload", s_cpload, 0},
961  {"cpsetup", s_cpsetup, 0},
962  {"cplocal", s_cplocal, 0},
963  {"cprestore", s_cprestore, 0},
964  {"cpreturn", s_cpreturn, 0},
965  {"gpvalue", s_gpvalue, 0},
966  {"gpword", s_gpword, 0},
967  {"gpdword", s_gpdword, 0},
968  {"cpadd", s_cpadd, 0},
969  {"insn", s_insn, 0},
970
971  /* Relatively generic pseudo-ops that happen to be used on MIPS
972     chips.  */
973  {"asciiz", stringer, 1},
974  {"bss", s_change_sec, 'b'},
975  {"err", s_err, 0},
976  {"half", s_cons, 1},
977  {"dword", s_cons, 3},
978  {"weakext", s_mips_weakext, 0},
979
980  /* These pseudo-ops are defined in read.c, but must be overridden
981     here for one reason or another.  */
982  {"align", s_align, 0},
983  {"byte", s_cons, 0},
984  {"data", s_change_sec, 'd'},
985  {"double", s_float_cons, 'd'},
986  {"float", s_float_cons, 'f'},
987  {"globl", s_mips_globl, 0},
988  {"global", s_mips_globl, 0},
989  {"hword", s_cons, 1},
990  {"int", s_cons, 2},
991  {"long", s_cons, 2},
992  {"octa", s_cons, 4},
993  {"quad", s_cons, 3},
994  {"section", s_change_section, 0},
995  {"short", s_cons, 1},
996  {"single", s_float_cons, 'f'},
997  {"stabn", s_mips_stab, 'n'},
998  {"text", s_change_sec, 't'},
999  {"word", s_cons, 2},
1000
1001  { "extern", ecoff_directive_extern, 0},
1002
1003  { NULL, NULL, 0 },
1004};
1005
1006static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1007{
1008  /* These pseudo-ops should be defined by the object file format.
1009     However, a.out doesn't support them, so we have versions here.  */
1010  {"aent", s_mips_ent, 1},
1011  {"bgnb", s_ignore, 0},
1012  {"end", s_mips_end, 0},
1013  {"endb", s_ignore, 0},
1014  {"ent", s_mips_ent, 0},
1015  {"file", s_mips_file, 0},
1016  {"fmask", s_mips_mask, 'F'},
1017  {"frame", s_mips_frame, 0},
1018  {"loc", s_mips_loc, 0},
1019  {"mask", s_mips_mask, 'R'},
1020  {"verstamp", s_ignore, 0},
1021  { NULL, NULL, 0 },
1022};
1023
1024extern void pop_insert (const pseudo_typeS *);
1025
1026void
1027mips_pop_insert (void)
1028{
1029  pop_insert (mips_pseudo_table);
1030  if (! ECOFF_DEBUGGING)
1031    pop_insert (mips_nonecoff_pseudo_table);
1032}
1033
1034/* Symbols labelling the current insn.  */
1035
1036struct insn_label_list
1037{
1038  struct insn_label_list *next;
1039  symbolS *label;
1040};
1041
1042static struct insn_label_list *insn_labels;
1043static struct insn_label_list *free_insn_labels;
1044
1045static void mips_clear_insn_labels (void);
1046
1047static inline void
1048mips_clear_insn_labels (void)
1049{
1050  register struct insn_label_list **pl;
1051
1052  for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1053    ;
1054  *pl = insn_labels;
1055  insn_labels = NULL;
1056}
1057
1058static char *expr_end;
1059
1060/* Expressions which appear in instructions.  These are set by
1061   mips_ip.  */
1062
1063static expressionS imm_expr;
1064static expressionS imm2_expr;
1065static expressionS offset_expr;
1066
1067/* Relocs associated with imm_expr and offset_expr.  */
1068
1069static bfd_reloc_code_real_type imm_reloc[3]
1070  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1071static bfd_reloc_code_real_type offset_reloc[3]
1072  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1073
1074/* These are set by mips16_ip if an explicit extension is used.  */
1075
1076static bfd_boolean mips16_small, mips16_ext;
1077
1078#ifdef OBJ_ELF
1079/* The pdr segment for per procedure frame/regmask info.  Not used for
1080   ECOFF debugging.  */
1081
1082static segT pdr_seg;
1083#endif
1084
1085/* The default target format to use.  */
1086
1087const char *
1088mips_target_format (void)
1089{
1090  switch (OUTPUT_FLAVOR)
1091    {
1092    case bfd_target_aout_flavour:
1093      return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1094    case bfd_target_ecoff_flavour:
1095      return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1096    case bfd_target_coff_flavour:
1097      return "pe-mips";
1098    case bfd_target_elf_flavour:
1099#ifdef TE_TMIPS
1100      /* This is traditional mips.  */
1101      return (target_big_endian
1102	      ? (HAVE_64BIT_OBJECTS
1103		 ? "elf64-tradbigmips"
1104		 : (HAVE_NEWABI
1105		    ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1106	      : (HAVE_64BIT_OBJECTS
1107		 ? "elf64-tradlittlemips"
1108		 : (HAVE_NEWABI
1109		    ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1110#else
1111      return (target_big_endian
1112	      ? (HAVE_64BIT_OBJECTS
1113		 ? "elf64-bigmips"
1114		 : (HAVE_NEWABI
1115		    ? "elf32-nbigmips" : "elf32-bigmips"))
1116	      : (HAVE_64BIT_OBJECTS
1117		 ? "elf64-littlemips"
1118		 : (HAVE_NEWABI
1119		    ? "elf32-nlittlemips" : "elf32-littlemips")));
1120#endif
1121    default:
1122      abort ();
1123      return NULL;
1124    }
1125}
1126
1127/* This function is called once, at assembler startup time.  It should
1128   set up all the tables, etc. that the MD part of the assembler will need.  */
1129
1130void
1131md_begin (void)
1132{
1133  register const char *retval = NULL;
1134  int i = 0;
1135  int broken = 0;
1136
1137  if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1138    as_warn (_("Could not set architecture and machine"));
1139
1140  op_hash = hash_new ();
1141
1142  for (i = 0; i < NUMOPCODES;)
1143    {
1144      const char *name = mips_opcodes[i].name;
1145
1146      retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1147      if (retval != NULL)
1148	{
1149	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1150		   mips_opcodes[i].name, retval);
1151	  /* Probably a memory allocation problem?  Give up now.  */
1152	  as_fatal (_("Broken assembler.  No assembly attempted."));
1153	}
1154      do
1155	{
1156	  if (mips_opcodes[i].pinfo != INSN_MACRO)
1157	    {
1158	      if (!validate_mips_insn (&mips_opcodes[i]))
1159		broken = 1;
1160	    }
1161	  ++i;
1162	}
1163      while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1164    }
1165
1166  mips16_op_hash = hash_new ();
1167
1168  i = 0;
1169  while (i < bfd_mips16_num_opcodes)
1170    {
1171      const char *name = mips16_opcodes[i].name;
1172
1173      retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1174      if (retval != NULL)
1175	as_fatal (_("internal: can't hash `%s': %s"),
1176		  mips16_opcodes[i].name, retval);
1177      do
1178	{
1179	  if (mips16_opcodes[i].pinfo != INSN_MACRO
1180	      && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1181		  != mips16_opcodes[i].match))
1182	    {
1183	      fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1184		       mips16_opcodes[i].name, mips16_opcodes[i].args);
1185	      broken = 1;
1186	    }
1187	  ++i;
1188	}
1189      while (i < bfd_mips16_num_opcodes
1190	     && strcmp (mips16_opcodes[i].name, name) == 0);
1191    }
1192
1193  if (broken)
1194    as_fatal (_("Broken assembler.  No assembly attempted."));
1195
1196  /* We add all the general register names to the symbol table.  This
1197     helps us detect invalid uses of them.  */
1198  for (i = 0; i < 32; i++)
1199    {
1200      char buf[5];
1201
1202      sprintf (buf, "$%d", i);
1203      symbol_table_insert (symbol_new (buf, reg_section, i,
1204				       &zero_address_frag));
1205    }
1206  symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1207				   &zero_address_frag));
1208  symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1209				   &zero_address_frag));
1210  symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1211				   &zero_address_frag));
1212  symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1213				   &zero_address_frag));
1214  symbol_table_insert (symbol_new ("$at", reg_section, AT,
1215				   &zero_address_frag));
1216  symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1217				   &zero_address_frag));
1218  symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1219				   &zero_address_frag));
1220  symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1221				   &zero_address_frag));
1222  symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1223				   &zero_address_frag));
1224
1225  /* If we don't add these register names to the symbol table, they
1226     may end up being added as regular symbols by operand(), and then
1227     make it to the object file as undefined in case they're not
1228     regarded as local symbols.  They're local in o32, since `$' is a
1229     local symbol prefix, but not in n32 or n64.  */
1230  for (i = 0; i < 8; i++)
1231    {
1232      char buf[6];
1233
1234      sprintf (buf, "$fcc%i", i);
1235      symbol_table_insert (symbol_new (buf, reg_section, -1,
1236				       &zero_address_frag));
1237    }
1238
1239  mips_no_prev_insn (FALSE);
1240
1241  mips_gprmask = 0;
1242  mips_cprmask[0] = 0;
1243  mips_cprmask[1] = 0;
1244  mips_cprmask[2] = 0;
1245  mips_cprmask[3] = 0;
1246
1247  /* set the default alignment for the text section (2**2) */
1248  record_alignment (text_section, 2);
1249
1250  if (USE_GLOBAL_POINTER_OPT)
1251    bfd_set_gp_size (stdoutput, g_switch_value);
1252
1253  if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1254    {
1255      /* On a native system, sections must be aligned to 16 byte
1256	 boundaries.  When configured for an embedded ELF target, we
1257	 don't bother.  */
1258      if (strcmp (TARGET_OS, "elf") != 0)
1259	{
1260	  (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1261	  (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1262	  (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1263	}
1264
1265      /* Create a .reginfo section for register masks and a .mdebug
1266	 section for debugging information.  */
1267      {
1268	segT seg;
1269	subsegT subseg;
1270	flagword flags;
1271	segT sec;
1272
1273	seg = now_seg;
1274	subseg = now_subseg;
1275
1276	/* The ABI says this section should be loaded so that the
1277	   running program can access it.  However, we don't load it
1278	   if we are configured for an embedded target */
1279	flags = SEC_READONLY | SEC_DATA;
1280	if (strcmp (TARGET_OS, "elf") != 0)
1281	  flags |= SEC_ALLOC | SEC_LOAD;
1282
1283	if (mips_abi != N64_ABI)
1284	  {
1285	    sec = subseg_new (".reginfo", (subsegT) 0);
1286
1287	    bfd_set_section_flags (stdoutput, sec, flags);
1288	    bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1289
1290#ifdef OBJ_ELF
1291	    mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1292#endif
1293	  }
1294	else
1295	  {
1296	    /* The 64-bit ABI uses a .MIPS.options section rather than
1297               .reginfo section.  */
1298	    sec = subseg_new (".MIPS.options", (subsegT) 0);
1299	    bfd_set_section_flags (stdoutput, sec, flags);
1300	    bfd_set_section_alignment (stdoutput, sec, 3);
1301
1302#ifdef OBJ_ELF
1303	    /* Set up the option header.  */
1304	    {
1305	      Elf_Internal_Options opthdr;
1306	      char *f;
1307
1308	      opthdr.kind = ODK_REGINFO;
1309	      opthdr.size = (sizeof (Elf_External_Options)
1310			     + sizeof (Elf64_External_RegInfo));
1311	      opthdr.section = 0;
1312	      opthdr.info = 0;
1313	      f = frag_more (sizeof (Elf_External_Options));
1314	      bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1315					     (Elf_External_Options *) f);
1316
1317	      mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1318	    }
1319#endif
1320	  }
1321
1322	if (ECOFF_DEBUGGING)
1323	  {
1324	    sec = subseg_new (".mdebug", (subsegT) 0);
1325	    (void) bfd_set_section_flags (stdoutput, sec,
1326					  SEC_HAS_CONTENTS | SEC_READONLY);
1327	    (void) bfd_set_section_alignment (stdoutput, sec, 2);
1328	  }
1329#ifdef OBJ_ELF
1330	else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1331	  {
1332	    pdr_seg = subseg_new (".pdr", (subsegT) 0);
1333	    (void) bfd_set_section_flags (stdoutput, pdr_seg,
1334					  SEC_READONLY | SEC_RELOC
1335					  | SEC_DEBUGGING);
1336	    (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1337	  }
1338#endif
1339
1340	subseg_set (seg, subseg);
1341      }
1342    }
1343
1344  if (! ECOFF_DEBUGGING)
1345    md_obj_begin ();
1346}
1347
1348void
1349md_mips_end (void)
1350{
1351  if (! ECOFF_DEBUGGING)
1352    md_obj_end ();
1353}
1354
1355void
1356md_assemble (char *str)
1357{
1358  struct mips_cl_insn insn;
1359  bfd_reloc_code_real_type unused_reloc[3]
1360    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1361
1362  imm_expr.X_op = O_absent;
1363  imm2_expr.X_op = O_absent;
1364  offset_expr.X_op = O_absent;
1365  imm_reloc[0] = BFD_RELOC_UNUSED;
1366  imm_reloc[1] = BFD_RELOC_UNUSED;
1367  imm_reloc[2] = BFD_RELOC_UNUSED;
1368  offset_reloc[0] = BFD_RELOC_UNUSED;
1369  offset_reloc[1] = BFD_RELOC_UNUSED;
1370  offset_reloc[2] = BFD_RELOC_UNUSED;
1371
1372  if (mips_opts.mips16)
1373    mips16_ip (str, &insn);
1374  else
1375    {
1376      mips_ip (str, &insn);
1377      DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1378	    str, insn.insn_opcode));
1379    }
1380
1381  if (insn_error)
1382    {
1383      as_bad ("%s `%s'", insn_error, str);
1384      return;
1385    }
1386
1387  if (insn.insn_mo->pinfo == INSN_MACRO)
1388    {
1389      macro_start ();
1390      if (mips_opts.mips16)
1391	mips16_macro (&insn);
1392      else
1393	macro (&insn);
1394      macro_end ();
1395    }
1396  else
1397    {
1398      if (imm_expr.X_op != O_absent)
1399	append_insn (&insn, &imm_expr, imm_reloc);
1400      else if (offset_expr.X_op != O_absent)
1401	append_insn (&insn, &offset_expr, offset_reloc);
1402      else
1403	append_insn (&insn, NULL, unused_reloc);
1404    }
1405}
1406
1407/* Return true if the given relocation might need a matching %lo().
1408   Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1409   applied to local symbols.  */
1410
1411static inline bfd_boolean
1412reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1413{
1414  return (reloc == BFD_RELOC_HI16_S
1415	  || reloc == BFD_RELOC_MIPS_GOT16);
1416}
1417
1418/* Return true if the given fixup is followed by a matching R_MIPS_LO16
1419   relocation.  */
1420
1421static inline bfd_boolean
1422fixup_has_matching_lo_p (fixS *fixp)
1423{
1424  return (fixp->fx_next != NULL
1425	  && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1426	  && fixp->fx_addsy == fixp->fx_next->fx_addsy
1427	  && fixp->fx_offset == fixp->fx_next->fx_offset);
1428}
1429
1430/* See whether instruction IP reads register REG.  CLASS is the type
1431   of register.  */
1432
1433static int
1434insn_uses_reg (struct mips_cl_insn *ip, unsigned int reg,
1435	       enum mips_regclass class)
1436{
1437  if (class == MIPS16_REG)
1438    {
1439      assert (mips_opts.mips16);
1440      reg = mips16_to_32_reg_map[reg];
1441      class = MIPS_GR_REG;
1442    }
1443
1444  /* Don't report on general register ZERO, since it never changes.  */
1445  if (class == MIPS_GR_REG && reg == ZERO)
1446    return 0;
1447
1448  if (class == MIPS_FP_REG)
1449    {
1450      assert (! mips_opts.mips16);
1451      /* If we are called with either $f0 or $f1, we must check $f0.
1452	 This is not optimal, because it will introduce an unnecessary
1453	 NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1454	 need to distinguish reading both $f0 and $f1 or just one of
1455	 them.  Note that we don't have to check the other way,
1456	 because there is no instruction that sets both $f0 and $f1
1457	 and requires a delay.  */
1458      if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1459	  && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1460	      == (reg &~ (unsigned) 1)))
1461	return 1;
1462      if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1463	  && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1464	      == (reg &~ (unsigned) 1)))
1465	return 1;
1466    }
1467  else if (! mips_opts.mips16)
1468    {
1469      if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1470	  && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1471	return 1;
1472      if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1473	  && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1474	return 1;
1475    }
1476  else
1477    {
1478      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1479	  && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1480				    & MIPS16OP_MASK_RX)]
1481	      == reg))
1482	return 1;
1483      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1484	  && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1485				    & MIPS16OP_MASK_RY)]
1486	      == reg))
1487	return 1;
1488      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1489	  && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1490				    & MIPS16OP_MASK_MOVE32Z)]
1491	      == reg))
1492	return 1;
1493      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1494	return 1;
1495      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1496	return 1;
1497      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1498	return 1;
1499      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1500	  && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1501	      & MIPS16OP_MASK_REGR32) == reg)
1502	return 1;
1503    }
1504
1505  return 0;
1506}
1507
1508/* This function returns true if modifying a register requires a
1509   delay.  */
1510
1511static int
1512reg_needs_delay (unsigned int reg)
1513{
1514  unsigned long prev_pinfo;
1515
1516  prev_pinfo = prev_insn.insn_mo->pinfo;
1517  if (! mips_opts.noreorder
1518      && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1519	   && ! gpr_interlocks)
1520	  || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1521	      && ! cop_interlocks)))
1522    {
1523      /* A load from a coprocessor or from memory.  All load delays
1524	 delay the use of general register rt for one instruction.  */
1525      /* Itbl support may require additional care here.  */
1526      know (prev_pinfo & INSN_WRITE_GPR_T);
1527      if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1528	return 1;
1529    }
1530
1531  return 0;
1532}
1533
1534/* Mark instruction labels in mips16 mode.  This permits the linker to
1535   handle them specially, such as generating jalx instructions when
1536   needed.  We also make them odd for the duration of the assembly, in
1537   order to generate the right sort of code.  We will make them even
1538   in the adjust_symtab routine, while leaving them marked.  This is
1539   convenient for the debugger and the disassembler.  The linker knows
1540   to make them odd again.  */
1541
1542static void
1543mips16_mark_labels (void)
1544{
1545  if (mips_opts.mips16)
1546    {
1547      struct insn_label_list *l;
1548      valueT val;
1549
1550      for (l = insn_labels; l != NULL; l = l->next)
1551	{
1552#ifdef OBJ_ELF
1553	  if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1554	    S_SET_OTHER (l->label, STO_MIPS16);
1555#endif
1556	  val = S_GET_VALUE (l->label);
1557	  if ((val & 1) == 0)
1558	    S_SET_VALUE (l->label, val + 1);
1559	}
1560    }
1561}
1562
1563/* End the current frag.  Make it a variant frag and record the
1564   relaxation info.  */
1565
1566static void
1567relax_close_frag (void)
1568{
1569  mips_macro_warning.first_frag = frag_now;
1570  frag_var (rs_machine_dependent, 0, 0,
1571	    RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
1572	    mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
1573
1574  memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
1575  mips_relax.first_fixup = 0;
1576}
1577
1578/* Start a new relaxation sequence whose expansion depends on SYMBOL.
1579   See the comment above RELAX_ENCODE for more details.  */
1580
1581static void
1582relax_start (symbolS *symbol)
1583{
1584  assert (mips_relax.sequence == 0);
1585  mips_relax.sequence = 1;
1586  mips_relax.symbol = symbol;
1587}
1588
1589/* Start generating the second version of a relaxable sequence.
1590   See the comment above RELAX_ENCODE for more details.  */
1591
1592static void
1593relax_switch (void)
1594{
1595  assert (mips_relax.sequence == 1);
1596  mips_relax.sequence = 2;
1597}
1598
1599/* End the current relaxable sequence.  */
1600
1601static void
1602relax_end (void)
1603{
1604  assert (mips_relax.sequence == 2);
1605  relax_close_frag ();
1606  mips_relax.sequence = 0;
1607}
1608
1609/* Output an instruction.  IP is the instruction information.
1610   ADDRESS_EXPR is an operand of the instruction to be used with
1611   RELOC_TYPE.  */
1612
1613static void
1614append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
1615	     bfd_reloc_code_real_type *reloc_type)
1616{
1617  register unsigned long prev_pinfo, pinfo;
1618  char *f;
1619  fixS *fixp[3];
1620  int nops = 0;
1621  relax_stateT prev_insn_frag_type = 0;
1622  bfd_boolean relaxed_branch = FALSE;
1623  bfd_boolean force_new_frag = FALSE;
1624
1625  /* Mark instruction labels in mips16 mode.  */
1626  mips16_mark_labels ();
1627
1628  prev_pinfo = prev_insn.insn_mo->pinfo;
1629  pinfo = ip->insn_mo->pinfo;
1630
1631  if (mips_relax.sequence != 2
1632      && (!mips_opts.noreorder || prev_nop_frag != NULL))
1633    {
1634      int prev_prev_nop;
1635
1636      /* If the previous insn required any delay slots, see if we need
1637	 to insert a NOP or two.  There are eight kinds of possible
1638	 hazards, of which an instruction can have at most one type.
1639	 (1) a load from memory delay
1640	 (2) a load from a coprocessor delay
1641	 (3) an unconditional branch delay
1642	 (4) a conditional branch delay
1643	 (5) a move to coprocessor register delay
1644	 (6) a load coprocessor register from memory delay
1645	 (7) a coprocessor condition code delay
1646	 (8) a HI/LO special register delay
1647
1648	 There are a lot of optimizations we could do that we don't.
1649	 In particular, we do not, in general, reorder instructions.
1650	 If you use gcc with optimization, it will reorder
1651	 instructions and generally do much more optimization then we
1652	 do here; repeating all that work in the assembler would only
1653	 benefit hand written assembly code, and does not seem worth
1654	 it.  */
1655
1656      /* This is how a NOP is emitted.  */
1657#define emit_nop()					\
1658  (mips_opts.mips16					\
1659   ? md_number_to_chars (frag_more (2), 0x6500, 2)	\
1660   : md_number_to_chars (frag_more (4), 0, 4))
1661
1662      /* The previous insn might require a delay slot, depending upon
1663	 the contents of the current insn.  */
1664      if (! mips_opts.mips16
1665	  && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1666	       && ! gpr_interlocks)
1667	      || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1668		  && ! cop_interlocks)))
1669	{
1670	  /* A load from a coprocessor or from memory.  All load
1671	     delays delay the use of general register rt for one
1672	     instruction.  */
1673	  /* Itbl support may require additional care here.  */
1674	  know (prev_pinfo & INSN_WRITE_GPR_T);
1675	  if (mips_optimize == 0
1676	      || insn_uses_reg (ip,
1677				((prev_insn.insn_opcode >> OP_SH_RT)
1678				 & OP_MASK_RT),
1679				MIPS_GR_REG))
1680	    ++nops;
1681	}
1682      else if (! mips_opts.mips16
1683	       && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1684		    && ! cop_interlocks)
1685		   || ((prev_pinfo & INSN_COPROC_MEMORY_DELAY)
1686		       && ! cop_mem_interlocks)))
1687	{
1688	  /* A generic coprocessor delay.  The previous instruction
1689	     modified a coprocessor general or control register.  If
1690	     it modified a control register, we need to avoid any
1691	     coprocessor instruction (this is probably not always
1692	     required, but it sometimes is).  If it modified a general
1693	     register, we avoid using that register.
1694
1695	     This case is not handled very well.  There is no special
1696	     knowledge of CP0 handling, and the coprocessors other
1697	     than the floating point unit are not distinguished at
1698	     all.  */
1699          /* Itbl support may require additional care here. FIXME!
1700             Need to modify this to include knowledge about
1701             user specified delays!  */
1702	  if (prev_pinfo & INSN_WRITE_FPR_T)
1703	    {
1704	      if (mips_optimize == 0
1705		  || insn_uses_reg (ip,
1706				    ((prev_insn.insn_opcode >> OP_SH_FT)
1707				     & OP_MASK_FT),
1708				    MIPS_FP_REG))
1709		++nops;
1710	    }
1711	  else if (prev_pinfo & INSN_WRITE_FPR_S)
1712	    {
1713	      if (mips_optimize == 0
1714		  || insn_uses_reg (ip,
1715				    ((prev_insn.insn_opcode >> OP_SH_FS)
1716				     & OP_MASK_FS),
1717				    MIPS_FP_REG))
1718		++nops;
1719	    }
1720	  else
1721	    {
1722	      /* We don't know exactly what the previous instruction
1723		 does.  If the current instruction uses a coprocessor
1724		 register, we must insert a NOP.  If previous
1725		 instruction may set the condition codes, and the
1726		 current instruction uses them, we must insert two
1727		 NOPS.  */
1728              /* Itbl support may require additional care here.  */
1729	      if (mips_optimize == 0
1730		  || ((prev_pinfo & INSN_WRITE_COND_CODE)
1731		      && (pinfo & INSN_READ_COND_CODE)))
1732		nops += 2;
1733	      else if (pinfo & INSN_COP)
1734		++nops;
1735	    }
1736	}
1737      else if (! mips_opts.mips16
1738	       && (prev_pinfo & INSN_WRITE_COND_CODE)
1739               && ! cop_interlocks)
1740	{
1741	  /* The previous instruction sets the coprocessor condition
1742	     codes, but does not require a general coprocessor delay
1743	     (this means it is a floating point comparison
1744	     instruction).  If this instruction uses the condition
1745	     codes, we need to insert a single NOP.  */
1746	  /* Itbl support may require additional care here.  */
1747	  if (mips_optimize == 0
1748	      || (pinfo & INSN_READ_COND_CODE))
1749	    ++nops;
1750	}
1751
1752      /* If we're fixing up mfhi/mflo for the r7000 and the
1753	 previous insn was an mfhi/mflo and the current insn
1754	 reads the register that the mfhi/mflo wrote to, then
1755	 insert two nops.  */
1756
1757      else if (mips_7000_hilo_fix
1758	       && MF_HILO_INSN (prev_pinfo)
1759	       && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1760				      & OP_MASK_RD),
1761				 MIPS_GR_REG))
1762	{
1763	  nops += 2;
1764	}
1765
1766      /* If we're fixing up mfhi/mflo for the r7000 and the
1767	 2nd previous insn was an mfhi/mflo and the current insn
1768	 reads the register that the mfhi/mflo wrote to, then
1769	 insert one nop.  */
1770
1771      else if (mips_7000_hilo_fix
1772	       && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1773	       && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1774                                       & OP_MASK_RD),
1775                                    MIPS_GR_REG))
1776
1777	{
1778	  ++nops;
1779	}
1780
1781      else if (prev_pinfo & INSN_READ_LO)
1782	{
1783	  /* The previous instruction reads the LO register; if the
1784	     current instruction writes to the LO register, we must
1785	     insert two NOPS.  Some newer processors have interlocks.
1786	     Also the tx39's multiply instructions can be executed
1787             immediately after a read from HI/LO (without the delay),
1788             though the tx39's divide insns still do require the
1789	     delay.  */
1790	  if (! (hilo_interlocks
1791		 || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1792	      && (mips_optimize == 0
1793		  || (pinfo & INSN_WRITE_LO)))
1794	    nops += 2;
1795	  /* Most mips16 branch insns don't have a delay slot.
1796	     If a read from LO is immediately followed by a branch
1797	     to a write to LO we have a read followed by a write
1798	     less than 2 insns away.  We assume the target of
1799	     a branch might be a write to LO, and insert a nop
1800	     between a read and an immediately following branch.  */
1801	  else if (mips_opts.mips16
1802		   && (mips_optimize == 0
1803		       || (pinfo & MIPS16_INSN_BRANCH)))
1804	    ++nops;
1805	}
1806      else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1807	{
1808	  /* The previous instruction reads the HI register; if the
1809	     current instruction writes to the HI register, we must
1810	     insert a NOP.  Some newer processors have interlocks.
1811	     Also the note tx39's multiply above.  */
1812	  if (! (hilo_interlocks
1813		 || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1814	      && (mips_optimize == 0
1815		  || (pinfo & INSN_WRITE_HI)))
1816	    nops += 2;
1817	  /* Most mips16 branch insns don't have a delay slot.
1818	     If a read from HI is immediately followed by a branch
1819	     to a write to HI we have a read followed by a write
1820	     less than 2 insns away.  We assume the target of
1821	     a branch might be a write to HI, and insert a nop
1822	     between a read and an immediately following branch.  */
1823	  else if (mips_opts.mips16
1824		   && (mips_optimize == 0
1825		       || (pinfo & MIPS16_INSN_BRANCH)))
1826	    ++nops;
1827	}
1828
1829      /* If the previous instruction was in a noreorder section, then
1830         we don't want to insert the nop after all.  */
1831      /* Itbl support may require additional care here.  */
1832      if (prev_insn_unreordered)
1833	nops = 0;
1834
1835      /* There are two cases which require two intervening
1836	 instructions: 1) setting the condition codes using a move to
1837	 coprocessor instruction which requires a general coprocessor
1838	 delay and then reading the condition codes 2) reading the HI
1839	 or LO register and then writing to it (except on processors
1840	 which have interlocks).  If we are not already emitting a NOP
1841	 instruction, we must check for these cases compared to the
1842	 instruction previous to the previous instruction.  */
1843      if ((! mips_opts.mips16
1844	   && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1845	   && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1846	   && (pinfo & INSN_READ_COND_CODE)
1847	   && ! cop_interlocks)
1848	  || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1849	      && (pinfo & INSN_WRITE_LO)
1850	      && ! (hilo_interlocks
1851		    || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT))))
1852	  || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1853	      && (pinfo & INSN_WRITE_HI)
1854	      && ! (hilo_interlocks
1855		    || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))))
1856	prev_prev_nop = 1;
1857      else
1858	prev_prev_nop = 0;
1859
1860      if (prev_prev_insn_unreordered)
1861	prev_prev_nop = 0;
1862
1863      if (prev_prev_nop && nops == 0)
1864	++nops;
1865
1866      if (mips_fix_vr4120 && prev_insn.insn_mo->name)
1867	{
1868	  /* We're out of bits in pinfo, so we must resort to string
1869	     ops here.  Shortcuts are selected based on opcodes being
1870	     limited to the VR4120 instruction set.  */
1871	  int min_nops = 0;
1872	  const char *pn = prev_insn.insn_mo->name;
1873	  const char *tn = ip->insn_mo->name;
1874	  if (strncmp(pn, "macc", 4) == 0
1875	      || strncmp(pn, "dmacc", 5) == 0)
1876	    {
1877	      /* Errata 21 - [D]DIV[U] after [D]MACC */
1878	      if (strstr (tn, "div"))
1879		{
1880		  min_nops = 1;
1881		}
1882
1883	      /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1884	      if (pn[0] == 'd' /* dmacc */
1885		  && (strncmp(tn, "dmult", 5) == 0
1886		      || strncmp(tn, "dmacc", 5) == 0))
1887		{
1888		  min_nops = 1;
1889		}
1890
1891	      /* Errata 24 - MT{LO,HI} after [D]MACC */
1892	      if (strcmp (tn, "mtlo") == 0
1893		  || strcmp (tn, "mthi") == 0)
1894		{
1895		  min_nops = 1;
1896		}
1897
1898	    }
1899	  else if (strncmp(pn, "dmult", 5) == 0
1900		   && (strncmp(tn, "dmult", 5) == 0
1901		       || strncmp(tn, "dmacc", 5) == 0))
1902	    {
1903	      /* Here is the rest of errata 23.  */
1904	      min_nops = 1;
1905	    }
1906	  if (nops < min_nops)
1907	    nops = min_nops;
1908	}
1909
1910      /* If we are being given a nop instruction, don't bother with
1911	 one of the nops we would otherwise output.  This will only
1912	 happen when a nop instruction is used with mips_optimize set
1913	 to 0.  */
1914      if (nops > 0
1915	  && ! mips_opts.noreorder
1916	  && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1917	--nops;
1918
1919      /* Now emit the right number of NOP instructions.  */
1920      if (nops > 0 && ! mips_opts.noreorder)
1921	{
1922	  fragS *old_frag;
1923	  unsigned long old_frag_offset;
1924	  int i;
1925	  struct insn_label_list *l;
1926
1927	  old_frag = frag_now;
1928	  old_frag_offset = frag_now_fix ();
1929
1930	  for (i = 0; i < nops; i++)
1931	    emit_nop ();
1932
1933	  if (listing)
1934	    {
1935	      listing_prev_line ();
1936	      /* We may be at the start of a variant frag.  In case we
1937                 are, make sure there is enough space for the frag
1938                 after the frags created by listing_prev_line.  The
1939                 argument to frag_grow here must be at least as large
1940                 as the argument to all other calls to frag_grow in
1941                 this file.  We don't have to worry about being in the
1942                 middle of a variant frag, because the variants insert
1943                 all needed nop instructions themselves.  */
1944	      frag_grow (40);
1945	    }
1946
1947	  for (l = insn_labels; l != NULL; l = l->next)
1948	    {
1949	      valueT val;
1950
1951	      assert (S_GET_SEGMENT (l->label) == now_seg);
1952	      symbol_set_frag (l->label, frag_now);
1953	      val = (valueT) frag_now_fix ();
1954	      /* mips16 text labels are stored as odd.  */
1955	      if (mips_opts.mips16)
1956		++val;
1957	      S_SET_VALUE (l->label, val);
1958	    }
1959
1960#ifndef NO_ECOFF_DEBUGGING
1961	  if (ECOFF_DEBUGGING)
1962	    ecoff_fix_loc (old_frag, old_frag_offset);
1963#endif
1964	}
1965      else if (prev_nop_frag != NULL)
1966	{
1967	  /* We have a frag holding nops we may be able to remove.  If
1968             we don't need any nops, we can decrease the size of
1969             prev_nop_frag by the size of one instruction.  If we do
1970             need some nops, we count them in prev_nops_required.  */
1971	  if (prev_nop_frag_since == 0)
1972	    {
1973	      if (nops == 0)
1974		{
1975		  prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1976		  --prev_nop_frag_holds;
1977		}
1978	      else
1979		prev_nop_frag_required += nops;
1980	    }
1981	  else
1982	    {
1983	      if (prev_prev_nop == 0)
1984		{
1985		  prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1986		  --prev_nop_frag_holds;
1987		}
1988	      else
1989		++prev_nop_frag_required;
1990	    }
1991
1992	  if (prev_nop_frag_holds <= prev_nop_frag_required)
1993	    prev_nop_frag = NULL;
1994
1995	  ++prev_nop_frag_since;
1996
1997	  /* Sanity check: by the time we reach the second instruction
1998             after prev_nop_frag, we should have used up all the nops
1999             one way or another.  */
2000	  assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2001	}
2002    }
2003
2004  /* Record the frag type before frag_var.  */
2005  if (prev_insn_frag)
2006    prev_insn_frag_type = prev_insn_frag->fr_type;
2007
2008  if (address_expr
2009      && *reloc_type == BFD_RELOC_16_PCREL_S2
2010      && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2011	  || pinfo & INSN_COND_BRANCH_LIKELY)
2012      && mips_relax_branch
2013      /* Don't try branch relaxation within .set nomacro, or within
2014	 .set noat if we use $at for PIC computations.  If it turns
2015	 out that the branch was out-of-range, we'll get an error.  */
2016      && !mips_opts.warn_about_macros
2017      && !(mips_opts.noat && mips_pic != NO_PIC)
2018      && !mips_opts.mips16)
2019    {
2020      relaxed_branch = TRUE;
2021      f = frag_var (rs_machine_dependent,
2022		    relaxed_branch_length
2023		    (NULL, NULL,
2024		     (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2025		     : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2026		    RELAX_BRANCH_ENCODE
2027		    (pinfo & INSN_UNCOND_BRANCH_DELAY,
2028		     pinfo & INSN_COND_BRANCH_LIKELY,
2029		     pinfo & INSN_WRITE_GPR_31,
2030		     0),
2031		    address_expr->X_add_symbol,
2032		    address_expr->X_add_number,
2033		    0);
2034      *reloc_type = BFD_RELOC_UNUSED;
2035    }
2036  else if (*reloc_type > BFD_RELOC_UNUSED)
2037    {
2038      /* We need to set up a variant frag.  */
2039      assert (mips_opts.mips16 && address_expr != NULL);
2040      f = frag_var (rs_machine_dependent, 4, 0,
2041		    RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2042					 mips16_small, mips16_ext,
2043					 (prev_pinfo
2044					  & INSN_UNCOND_BRANCH_DELAY),
2045					 (*prev_insn_reloc_type
2046					  == BFD_RELOC_MIPS16_JMP)),
2047		    make_expr_symbol (address_expr), 0, NULL);
2048    }
2049  else if (mips_opts.mips16
2050	   && ! ip->use_extend
2051	   && *reloc_type != BFD_RELOC_MIPS16_JMP)
2052    {
2053      /* Make sure there is enough room to swap this instruction with
2054         a following jump instruction.  */
2055      frag_grow (6);
2056      f = frag_more (2);
2057    }
2058  else
2059    {
2060      if (mips_opts.mips16
2061	  && mips_opts.noreorder
2062	  && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2063	as_warn (_("extended instruction in delay slot"));
2064
2065      if (mips_relax.sequence)
2066	{
2067	  /* If we've reached the end of this frag, turn it into a variant
2068	     frag and record the information for the instructions we've
2069	     written so far.  */
2070	  if (frag_room () < 4)
2071	    relax_close_frag ();
2072	  mips_relax.sizes[mips_relax.sequence - 1] += 4;
2073	}
2074
2075      if (mips_relax.sequence != 2)
2076	mips_macro_warning.sizes[0] += 4;
2077      if (mips_relax.sequence != 1)
2078	mips_macro_warning.sizes[1] += 4;
2079
2080      f = frag_more (4);
2081    }
2082
2083  fixp[0] = fixp[1] = fixp[2] = NULL;
2084  if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2085    {
2086      if (address_expr->X_op == O_constant)
2087	{
2088	  valueT tmp;
2089
2090	  switch (*reloc_type)
2091	    {
2092	    case BFD_RELOC_32:
2093	      ip->insn_opcode |= address_expr->X_add_number;
2094	      break;
2095
2096	    case BFD_RELOC_MIPS_HIGHEST:
2097	      tmp = (address_expr->X_add_number
2098		     + ((valueT) 0x8000 << 32) + 0x80008000) >> 16;
2099	      tmp >>= 16;
2100	      ip->insn_opcode |= (tmp >> 16) & 0xffff;
2101	      break;
2102
2103	    case BFD_RELOC_MIPS_HIGHER:
2104	      tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2105	      ip->insn_opcode |= (tmp >> 16) & 0xffff;
2106	      break;
2107
2108	    case BFD_RELOC_HI16_S:
2109	      ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2110				  >> 16) & 0xffff;
2111	      break;
2112
2113	    case BFD_RELOC_HI16:
2114	      ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2115	      break;
2116
2117	    case BFD_RELOC_LO16:
2118	    case BFD_RELOC_MIPS_GOT_DISP:
2119	      ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2120	      break;
2121
2122	    case BFD_RELOC_MIPS_JMP:
2123	      if ((address_expr->X_add_number & 3) != 0)
2124		as_bad (_("jump to misaligned address (0x%lx)"),
2125			(unsigned long) address_expr->X_add_number);
2126	      if (address_expr->X_add_number & ~0xfffffff)
2127		as_bad (_("jump address range overflow (0x%lx)"),
2128			(unsigned long) address_expr->X_add_number);
2129	      ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2130	      break;
2131
2132	    case BFD_RELOC_MIPS16_JMP:
2133	      if ((address_expr->X_add_number & 3) != 0)
2134		as_bad (_("jump to misaligned address (0x%lx)"),
2135			(unsigned long) address_expr->X_add_number);
2136	      if (address_expr->X_add_number & ~0xfffffff)
2137		as_bad (_("jump address range overflow (0x%lx)"),
2138			(unsigned long) address_expr->X_add_number);
2139	      ip->insn_opcode |=
2140		(((address_expr->X_add_number & 0x7c0000) << 3)
2141		 | ((address_expr->X_add_number & 0xf800000) >> 7)
2142		 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2143	      break;
2144
2145	    case BFD_RELOC_16_PCREL_S2:
2146	      goto need_reloc;
2147
2148	    default:
2149	      internalError ();
2150	    }
2151	}
2152      else
2153	need_reloc:
2154	{
2155	  reloc_howto_type *howto;
2156	  int i;
2157
2158	  /* In a compound relocation, it is the final (outermost)
2159	     operator that determines the relocated field.  */
2160	  for (i = 1; i < 3; i++)
2161	    if (reloc_type[i] == BFD_RELOC_UNUSED)
2162	      break;
2163
2164	  howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2165	  fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2166				 bfd_get_reloc_size(howto),
2167				 address_expr,
2168				 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2169				 reloc_type[0]);
2170
2171	  /* These relocations can have an addend that won't fit in
2172	     4 octets for 64bit assembly.  */
2173	  if (HAVE_64BIT_GPRS
2174	      && ! howto->partial_inplace
2175	      && (reloc_type[0] == BFD_RELOC_16
2176		  || reloc_type[0] == BFD_RELOC_32
2177		  || reloc_type[0] == BFD_RELOC_MIPS_JMP
2178		  || reloc_type[0] == BFD_RELOC_HI16_S
2179		  || reloc_type[0] == BFD_RELOC_LO16
2180		  || reloc_type[0] == BFD_RELOC_GPREL16
2181		  || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2182		  || reloc_type[0] == BFD_RELOC_GPREL32
2183		  || reloc_type[0] == BFD_RELOC_64
2184		  || reloc_type[0] == BFD_RELOC_CTOR
2185		  || reloc_type[0] == BFD_RELOC_MIPS_SUB
2186		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2187		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2188		  || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2189		  || reloc_type[0] == BFD_RELOC_MIPS_REL16
2190		  || reloc_type[0] == BFD_RELOC_MIPS_RELGOT))
2191	    fixp[0]->fx_no_overflow = 1;
2192
2193	  if (mips_relax.sequence)
2194	    {
2195	      if (mips_relax.first_fixup == 0)
2196		mips_relax.first_fixup = fixp[0];
2197	    }
2198	  else if (reloc_needs_lo_p (*reloc_type))
2199	    {
2200	      struct mips_hi_fixup *hi_fixup;
2201
2202	      /* Reuse the last entry if it already has a matching %lo.  */
2203	      hi_fixup = mips_hi_fixup_list;
2204	      if (hi_fixup == 0
2205		  || !fixup_has_matching_lo_p (hi_fixup->fixp))
2206		{
2207		  hi_fixup = ((struct mips_hi_fixup *)
2208			      xmalloc (sizeof (struct mips_hi_fixup)));
2209		  hi_fixup->next = mips_hi_fixup_list;
2210		  mips_hi_fixup_list = hi_fixup;
2211		}
2212	      hi_fixup->fixp = fixp[0];
2213	      hi_fixup->seg = now_seg;
2214	    }
2215
2216	  /* Add fixups for the second and third relocations, if given.
2217	     Note that the ABI allows the second relocation to be
2218	     against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2219	     moment we only use RSS_UNDEF, but we could add support
2220	     for the others if it ever becomes necessary.  */
2221	  for (i = 1; i < 3; i++)
2222	    if (reloc_type[i] != BFD_RELOC_UNUSED)
2223	      {
2224		address_expr->X_op = O_absent;
2225		address_expr->X_add_symbol = 0;
2226		address_expr->X_add_number = 0;
2227
2228		fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
2229				       fixp[0]->fx_size, address_expr,
2230				       FALSE, reloc_type[i]);
2231	      }
2232	}
2233    }
2234
2235  if (! mips_opts.mips16)
2236    {
2237      md_number_to_chars (f, ip->insn_opcode, 4);
2238#ifdef OBJ_ELF
2239      dwarf2_emit_insn (4);
2240#endif
2241    }
2242  else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2243    {
2244      md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2245      md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2246#ifdef OBJ_ELF
2247      dwarf2_emit_insn (4);
2248#endif
2249    }
2250  else
2251    {
2252      if (ip->use_extend)
2253	{
2254	  md_number_to_chars (f, 0xf000 | ip->extend, 2);
2255	  f += 2;
2256	}
2257      md_number_to_chars (f, ip->insn_opcode, 2);
2258#ifdef OBJ_ELF
2259      dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2260#endif
2261    }
2262
2263  /* Update the register mask information.  */
2264  if (! mips_opts.mips16)
2265    {
2266      if (pinfo & INSN_WRITE_GPR_D)
2267	mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2268      if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2269	mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2270      if (pinfo & INSN_READ_GPR_S)
2271	mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2272      if (pinfo & INSN_WRITE_GPR_31)
2273	mips_gprmask |= 1 << RA;
2274      if (pinfo & INSN_WRITE_FPR_D)
2275	mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2276      if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2277	mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2278      if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2279	mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2280      if ((pinfo & INSN_READ_FPR_R) != 0)
2281	mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2282      if (pinfo & INSN_COP)
2283	{
2284	  /* We don't keep enough information to sort these cases out.
2285	     The itbl support does keep this information however, although
2286	     we currently don't support itbl fprmats as part of the cop
2287	     instruction.  May want to add this support in the future.  */
2288	}
2289      /* Never set the bit for $0, which is always zero.  */
2290      mips_gprmask &= ~1 << 0;
2291    }
2292  else
2293    {
2294      if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2295	mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2296			      & MIPS16OP_MASK_RX);
2297      if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2298	mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2299			      & MIPS16OP_MASK_RY);
2300      if (pinfo & MIPS16_INSN_WRITE_Z)
2301	mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2302			      & MIPS16OP_MASK_RZ);
2303      if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2304	mips_gprmask |= 1 << TREG;
2305      if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2306	mips_gprmask |= 1 << SP;
2307      if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2308	mips_gprmask |= 1 << RA;
2309      if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2310	mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2311      if (pinfo & MIPS16_INSN_READ_Z)
2312	mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2313			      & MIPS16OP_MASK_MOVE32Z);
2314      if (pinfo & MIPS16_INSN_READ_GPR_X)
2315	mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2316			      & MIPS16OP_MASK_REGR32);
2317    }
2318
2319  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2320    {
2321      /* Filling the branch delay slot is more complex.  We try to
2322	 switch the branch with the previous instruction, which we can
2323	 do if the previous instruction does not set up a condition
2324	 that the branch tests and if the branch is not itself the
2325	 target of any branch.  */
2326      if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2327	  || (pinfo & INSN_COND_BRANCH_DELAY))
2328	{
2329	  if (mips_optimize < 2
2330	      /* If we have seen .set volatile or .set nomove, don't
2331		 optimize.  */
2332	      || mips_opts.nomove != 0
2333	      /* If we had to emit any NOP instructions, then we
2334		 already know we can not swap.  */
2335	      || nops != 0
2336	      /* If we don't even know the previous insn, we can not
2337		 swap.  */
2338	      || ! prev_insn_valid
2339	      /* If the previous insn is already in a branch delay
2340		 slot, then we can not swap.  */
2341	      || prev_insn_is_delay_slot
2342	      /* If the previous previous insn was in a .set
2343		 noreorder, we can't swap.  Actually, the MIPS
2344		 assembler will swap in this situation.  However, gcc
2345		 configured -with-gnu-as will generate code like
2346		   .set noreorder
2347		   lw	$4,XXX
2348		   .set	reorder
2349		   INSN
2350		   bne	$4,$0,foo
2351		 in which we can not swap the bne and INSN.  If gcc is
2352		 not configured -with-gnu-as, it does not output the
2353		 .set pseudo-ops.  We don't have to check
2354		 prev_insn_unreordered, because prev_insn_valid will
2355		 be 0 in that case.  We don't want to use
2356		 prev_prev_insn_valid, because we do want to be able
2357		 to swap at the start of a function.  */
2358	      || prev_prev_insn_unreordered
2359	      /* If the branch is itself the target of a branch, we
2360		 can not swap.  We cheat on this; all we check for is
2361		 whether there is a label on this instruction.  If
2362		 there are any branches to anything other than a
2363		 label, users must use .set noreorder.  */
2364	      || insn_labels != NULL
2365	      /* If the previous instruction is in a variant frag
2366		 other than this branch's one, we cannot do the swap.
2367		 This does not apply to the mips16, which uses variant
2368		 frags for different purposes.  */
2369	      || (! mips_opts.mips16
2370		  && prev_insn_frag_type == rs_machine_dependent)
2371	      /* If the branch reads the condition codes, we don't
2372		 even try to swap, because in the sequence
2373		   ctc1 $X,$31
2374		   INSN
2375		   INSN
2376		   bc1t LABEL
2377		 we can not swap, and I don't feel like handling that
2378		 case.  */
2379	      || (! mips_opts.mips16
2380		  && (pinfo & INSN_READ_COND_CODE)
2381		  && ! cop_interlocks)
2382	      /* We can not swap with an instruction that requires a
2383		 delay slot, because the target of the branch might
2384		 interfere with that instruction.  */
2385	      || (! mips_opts.mips16
2386		  && (prev_pinfo
2387              /* Itbl support may require additional care here.  */
2388		      & (INSN_LOAD_COPROC_DELAY
2389			 | INSN_COPROC_MOVE_DELAY
2390			 | INSN_WRITE_COND_CODE))
2391		  && ! cop_interlocks)
2392	      || (! (hilo_interlocks
2393		     || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
2394		  && (prev_pinfo
2395		      & (INSN_READ_LO
2396			 | INSN_READ_HI)))
2397	      || (! mips_opts.mips16
2398		  && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2399		  && ! gpr_interlocks)
2400	      || (! mips_opts.mips16
2401                  /* Itbl support may require additional care here.  */
2402		  && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)
2403		  && ! cop_mem_interlocks)
2404	      /* We can not swap with a branch instruction.  */
2405	      || (prev_pinfo
2406		  & (INSN_UNCOND_BRANCH_DELAY
2407		     | INSN_COND_BRANCH_DELAY
2408		     | INSN_COND_BRANCH_LIKELY))
2409	      /* We do not swap with a trap instruction, since it
2410		 complicates trap handlers to have the trap
2411		 instruction be in a delay slot.  */
2412	      || (prev_pinfo & INSN_TRAP)
2413	      /* If the branch reads a register that the previous
2414		 instruction sets, we can not swap.  */
2415	      || (! mips_opts.mips16
2416		  && (prev_pinfo & INSN_WRITE_GPR_T)
2417		  && insn_uses_reg (ip,
2418				    ((prev_insn.insn_opcode >> OP_SH_RT)
2419				     & OP_MASK_RT),
2420				    MIPS_GR_REG))
2421	      || (! mips_opts.mips16
2422		  && (prev_pinfo & INSN_WRITE_GPR_D)
2423		  && insn_uses_reg (ip,
2424				    ((prev_insn.insn_opcode >> OP_SH_RD)
2425				     & OP_MASK_RD),
2426				    MIPS_GR_REG))
2427	      || (mips_opts.mips16
2428		  && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2429		       && insn_uses_reg (ip,
2430					 ((prev_insn.insn_opcode
2431					   >> MIPS16OP_SH_RX)
2432					  & MIPS16OP_MASK_RX),
2433					 MIPS16_REG))
2434		      || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2435			  && insn_uses_reg (ip,
2436					    ((prev_insn.insn_opcode
2437					      >> MIPS16OP_SH_RY)
2438					     & MIPS16OP_MASK_RY),
2439					    MIPS16_REG))
2440		      || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2441			  && insn_uses_reg (ip,
2442					    ((prev_insn.insn_opcode
2443					      >> MIPS16OP_SH_RZ)
2444					     & MIPS16OP_MASK_RZ),
2445					    MIPS16_REG))
2446		      || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2447			  && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2448		      || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2449			  && insn_uses_reg (ip, RA, MIPS_GR_REG))
2450		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2451			  && insn_uses_reg (ip,
2452					    MIPS16OP_EXTRACT_REG32R (prev_insn.
2453								     insn_opcode),
2454					    MIPS_GR_REG))))
2455	      /* If the branch writes a register that the previous
2456		 instruction sets, we can not swap (we know that
2457		 branches write only to RD or to $31).  */
2458	      || (! mips_opts.mips16
2459		  && (prev_pinfo & INSN_WRITE_GPR_T)
2460		  && (((pinfo & INSN_WRITE_GPR_D)
2461		       && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2462			   == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2463		      || ((pinfo & INSN_WRITE_GPR_31)
2464			  && (((prev_insn.insn_opcode >> OP_SH_RT)
2465			       & OP_MASK_RT)
2466			      == RA))))
2467	      || (! mips_opts.mips16
2468		  && (prev_pinfo & INSN_WRITE_GPR_D)
2469		  && (((pinfo & INSN_WRITE_GPR_D)
2470		       && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2471			   == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2472		      || ((pinfo & INSN_WRITE_GPR_31)
2473			  && (((prev_insn.insn_opcode >> OP_SH_RD)
2474			       & OP_MASK_RD)
2475			      == RA))))
2476	      || (mips_opts.mips16
2477		  && (pinfo & MIPS16_INSN_WRITE_31)
2478		  && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2479		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2480			  && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2481			      == RA))))
2482	      /* If the branch writes a register that the previous
2483		 instruction reads, we can not swap (we know that
2484		 branches only write to RD or to $31).  */
2485	      || (! mips_opts.mips16
2486		  && (pinfo & INSN_WRITE_GPR_D)
2487		  && insn_uses_reg (&prev_insn,
2488				    ((ip->insn_opcode >> OP_SH_RD)
2489				     & OP_MASK_RD),
2490				    MIPS_GR_REG))
2491	      || (! mips_opts.mips16
2492		  && (pinfo & INSN_WRITE_GPR_31)
2493		  && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2494	      || (mips_opts.mips16
2495		  && (pinfo & MIPS16_INSN_WRITE_31)
2496		  && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2497	      /* If we are generating embedded PIC code, the branch
2498		 might be expanded into a sequence which uses $at, so
2499		 we can't swap with an instruction which reads it.  */
2500	      || (mips_pic == EMBEDDED_PIC
2501		  && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2502	      /* If the previous previous instruction has a load
2503		 delay, and sets a register that the branch reads, we
2504		 can not swap.  */
2505	      || (! mips_opts.mips16
2506              /* Itbl support may require additional care here.  */
2507		  && (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2508		       && ! cop_interlocks)
2509		      || ((prev_prev_insn.insn_mo->pinfo
2510			   & INSN_LOAD_MEMORY_DELAY)
2511			  && ! gpr_interlocks))
2512		  && insn_uses_reg (ip,
2513				    ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2514				     & OP_MASK_RT),
2515				    MIPS_GR_REG))
2516	      /* If one instruction sets a condition code and the
2517                 other one uses a condition code, we can not swap.  */
2518	      || ((pinfo & INSN_READ_COND_CODE)
2519		  && (prev_pinfo & INSN_WRITE_COND_CODE))
2520	      || ((pinfo & INSN_WRITE_COND_CODE)
2521		  && (prev_pinfo & INSN_READ_COND_CODE))
2522	      /* If the previous instruction uses the PC, we can not
2523                 swap.  */
2524	      || (mips_opts.mips16
2525		  && (prev_pinfo & MIPS16_INSN_READ_PC))
2526	      /* If the previous instruction was extended, we can not
2527                 swap.  */
2528	      || (mips_opts.mips16 && prev_insn_extended)
2529	      /* If the previous instruction had a fixup in mips16
2530                 mode, we can not swap.  This normally means that the
2531                 previous instruction was a 4 byte branch anyhow.  */
2532	      || (mips_opts.mips16 && prev_insn_fixp[0])
2533	      /* If the previous instruction is a sync, sync.l, or
2534		 sync.p, we can not swap.  */
2535	      || (prev_pinfo & INSN_SYNC))
2536	    {
2537	      /* We could do even better for unconditional branches to
2538		 portions of this object file; we could pick up the
2539		 instruction at the destination, put it in the delay
2540		 slot, and bump the destination address.  */
2541	      emit_nop ();
2542	      /* Update the previous insn information.  */
2543	      prev_prev_insn = *ip;
2544	      prev_insn.insn_mo = &dummy_opcode;
2545	    }
2546	  else
2547	    {
2548	      /* It looks like we can actually do the swap.  */
2549	      if (! mips_opts.mips16)
2550		{
2551		  char *prev_f;
2552		  char temp[4];
2553
2554		  prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2555		  if (!relaxed_branch)
2556		    {
2557		      /* If this is not a relaxed branch, then just
2558			 swap the instructions.  */
2559		      memcpy (temp, prev_f, 4);
2560		      memcpy (prev_f, f, 4);
2561		      memcpy (f, temp, 4);
2562		    }
2563		  else
2564		    {
2565		      /* If this is a relaxed branch, then we move the
2566			 instruction to be placed in the delay slot to
2567			 the current frag, shrinking the fixed part of
2568			 the originating frag.  If the branch occupies
2569			 the tail of the latter, we move it backwards,
2570			 into the space freed by the moved instruction.  */
2571		      f = frag_more (4);
2572		      memcpy (f, prev_f, 4);
2573		      prev_insn_frag->fr_fix -= 4;
2574		      if (prev_insn_frag->fr_type == rs_machine_dependent)
2575			memmove (prev_f, prev_f + 4, prev_insn_frag->fr_var);
2576		    }
2577
2578		  if (prev_insn_fixp[0])
2579		    {
2580		      prev_insn_fixp[0]->fx_frag = frag_now;
2581		      prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2582		    }
2583		  if (prev_insn_fixp[1])
2584		    {
2585		      prev_insn_fixp[1]->fx_frag = frag_now;
2586		      prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2587		    }
2588		  if (prev_insn_fixp[2])
2589		    {
2590		      prev_insn_fixp[2]->fx_frag = frag_now;
2591		      prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2592		    }
2593		  if (prev_insn_fixp[0] && HAVE_NEWABI
2594		      && prev_insn_frag != frag_now
2595		      && (prev_insn_fixp[0]->fx_r_type
2596			  == BFD_RELOC_MIPS_GOT_DISP
2597			  || (prev_insn_fixp[0]->fx_r_type
2598			      == BFD_RELOC_MIPS_CALL16)))
2599		    {
2600		      /* To avoid confusion in tc_gen_reloc, we must
2601			 ensure that this does not become a variant
2602			 frag.  */
2603		      force_new_frag = TRUE;
2604		    }
2605
2606		  if (!relaxed_branch)
2607		    {
2608		      if (fixp[0])
2609			{
2610			  fixp[0]->fx_frag = prev_insn_frag;
2611			  fixp[0]->fx_where = prev_insn_where;
2612			}
2613		      if (fixp[1])
2614			{
2615			  fixp[1]->fx_frag = prev_insn_frag;
2616			  fixp[1]->fx_where = prev_insn_where;
2617			}
2618		      if (fixp[2])
2619			{
2620			  fixp[2]->fx_frag = prev_insn_frag;
2621			  fixp[2]->fx_where = prev_insn_where;
2622			}
2623		    }
2624		  else if (prev_insn_frag->fr_type == rs_machine_dependent)
2625		    {
2626		      if (fixp[0])
2627			fixp[0]->fx_where -= 4;
2628		      if (fixp[1])
2629			fixp[1]->fx_where -= 4;
2630		      if (fixp[2])
2631			fixp[2]->fx_where -= 4;
2632		    }
2633		}
2634	      else
2635		{
2636		  char *prev_f;
2637		  char temp[2];
2638
2639		  assert (prev_insn_fixp[0] == NULL);
2640		  assert (prev_insn_fixp[1] == NULL);
2641		  assert (prev_insn_fixp[2] == NULL);
2642		  prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2643		  memcpy (temp, prev_f, 2);
2644		  memcpy (prev_f, f, 2);
2645		  if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2646		    {
2647		      assert (*reloc_type == BFD_RELOC_UNUSED);
2648		      memcpy (f, temp, 2);
2649		    }
2650		  else
2651		    {
2652		      memcpy (f, f + 2, 2);
2653		      memcpy (f + 2, temp, 2);
2654		    }
2655		  if (fixp[0])
2656		    {
2657		      fixp[0]->fx_frag = prev_insn_frag;
2658		      fixp[0]->fx_where = prev_insn_where;
2659		    }
2660		  if (fixp[1])
2661		    {
2662		      fixp[1]->fx_frag = prev_insn_frag;
2663		      fixp[1]->fx_where = prev_insn_where;
2664		    }
2665		  if (fixp[2])
2666		    {
2667		      fixp[2]->fx_frag = prev_insn_frag;
2668		      fixp[2]->fx_where = prev_insn_where;
2669		    }
2670		}
2671
2672	      /* Update the previous insn information; leave prev_insn
2673		 unchanged.  */
2674	      prev_prev_insn = *ip;
2675	    }
2676	  prev_insn_is_delay_slot = 1;
2677
2678	  /* If that was an unconditional branch, forget the previous
2679	     insn information.  */
2680	  if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2681	    {
2682	      prev_prev_insn.insn_mo = &dummy_opcode;
2683	      prev_insn.insn_mo = &dummy_opcode;
2684	    }
2685
2686	  prev_insn_fixp[0] = NULL;
2687	  prev_insn_fixp[1] = NULL;
2688	  prev_insn_fixp[2] = NULL;
2689	  prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2690	  prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2691	  prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2692	  prev_insn_extended = 0;
2693	}
2694      else if (pinfo & INSN_COND_BRANCH_LIKELY)
2695	{
2696	  /* We don't yet optimize a branch likely.  What we should do
2697	     is look at the target, copy the instruction found there
2698	     into the delay slot, and increment the branch to jump to
2699	     the next instruction.  */
2700	  emit_nop ();
2701	  /* Update the previous insn information.  */
2702	  prev_prev_insn = *ip;
2703	  prev_insn.insn_mo = &dummy_opcode;
2704	  prev_insn_fixp[0] = NULL;
2705	  prev_insn_fixp[1] = NULL;
2706	  prev_insn_fixp[2] = NULL;
2707	  prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2708	  prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2709	  prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2710	  prev_insn_extended = 0;
2711	}
2712      else
2713	{
2714	  /* Update the previous insn information.  */
2715	  if (nops > 0)
2716	    prev_prev_insn.insn_mo = &dummy_opcode;
2717	  else
2718	    prev_prev_insn = prev_insn;
2719	  prev_insn = *ip;
2720
2721	  /* Any time we see a branch, we always fill the delay slot
2722	     immediately; since this insn is not a branch, we know it
2723	     is not in a delay slot.  */
2724	  prev_insn_is_delay_slot = 0;
2725
2726	  prev_insn_fixp[0] = fixp[0];
2727	  prev_insn_fixp[1] = fixp[1];
2728	  prev_insn_fixp[2] = fixp[2];
2729	  prev_insn_reloc_type[0] = reloc_type[0];
2730	  prev_insn_reloc_type[1] = reloc_type[1];
2731	  prev_insn_reloc_type[2] = reloc_type[2];
2732	  if (mips_opts.mips16)
2733	    prev_insn_extended = (ip->use_extend
2734				  || *reloc_type > BFD_RELOC_UNUSED);
2735	}
2736
2737      prev_prev_insn_unreordered = prev_insn_unreordered;
2738      prev_insn_unreordered = 0;
2739      prev_insn_frag = frag_now;
2740      prev_insn_where = f - frag_now->fr_literal;
2741      prev_insn_valid = 1;
2742    }
2743  else if (mips_relax.sequence != 2)
2744    {
2745      /* We need to record a bit of information even when we are not
2746         reordering, in order to determine the base address for mips16
2747         PC relative relocs.  */
2748      prev_prev_insn = prev_insn;
2749      prev_insn = *ip;
2750      prev_insn_reloc_type[0] = reloc_type[0];
2751      prev_insn_reloc_type[1] = reloc_type[1];
2752      prev_insn_reloc_type[2] = reloc_type[2];
2753      prev_prev_insn_unreordered = prev_insn_unreordered;
2754      prev_insn_unreordered = 1;
2755    }
2756
2757  /* We just output an insn, so the next one doesn't have a label.  */
2758  mips_clear_insn_labels ();
2759}
2760
2761/* This function forgets that there was any previous instruction or
2762   label.  If PRESERVE is non-zero, it remembers enough information to
2763   know whether nops are needed before a noreorder section.  */
2764
2765static void
2766mips_no_prev_insn (int preserve)
2767{
2768  if (! preserve)
2769    {
2770      prev_insn.insn_mo = &dummy_opcode;
2771      prev_prev_insn.insn_mo = &dummy_opcode;
2772      prev_nop_frag = NULL;
2773      prev_nop_frag_holds = 0;
2774      prev_nop_frag_required = 0;
2775      prev_nop_frag_since = 0;
2776    }
2777  prev_insn_valid = 0;
2778  prev_insn_is_delay_slot = 0;
2779  prev_insn_unreordered = 0;
2780  prev_insn_extended = 0;
2781  prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2782  prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2783  prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2784  prev_prev_insn_unreordered = 0;
2785  mips_clear_insn_labels ();
2786}
2787
2788/* This function must be called whenever we turn on noreorder or emit
2789   something other than instructions.  It inserts any NOPS which might
2790   be needed by the previous instruction, and clears the information
2791   kept for the previous instructions.  The INSNS parameter is true if
2792   instructions are to follow.  */
2793
2794static void
2795mips_emit_delays (bfd_boolean insns)
2796{
2797  if (! mips_opts.noreorder)
2798    {
2799      int nops;
2800
2801      nops = 0;
2802      if ((! mips_opts.mips16
2803	   && ((prev_insn.insn_mo->pinfo
2804		& (INSN_LOAD_COPROC_DELAY
2805		   | INSN_COPROC_MOVE_DELAY
2806		   | INSN_WRITE_COND_CODE))
2807	       && ! cop_interlocks))
2808	  || (! hilo_interlocks
2809	      && (prev_insn.insn_mo->pinfo
2810		  & (INSN_READ_LO
2811		     | INSN_READ_HI)))
2812	  || (! mips_opts.mips16
2813	      && (prev_insn.insn_mo->pinfo & INSN_LOAD_MEMORY_DELAY)
2814	      && ! gpr_interlocks)
2815	  || (! mips_opts.mips16
2816	      && (prev_insn.insn_mo->pinfo & INSN_COPROC_MEMORY_DELAY)
2817	      && ! cop_mem_interlocks))
2818	{
2819	  /* Itbl support may require additional care here.  */
2820	  ++nops;
2821	  if ((! mips_opts.mips16
2822	       && ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2823		   && ! cop_interlocks))
2824	      || (! hilo_interlocks
2825		  && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2826		      || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2827	    ++nops;
2828
2829	  if (prev_insn_unreordered)
2830	    nops = 0;
2831	}
2832      else if ((! mips_opts.mips16
2833		&& ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2834		    && ! cop_interlocks))
2835	       || (! hilo_interlocks
2836		   && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2837		       || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2838	{
2839	  /* Itbl support may require additional care here.  */
2840	  if (! prev_prev_insn_unreordered)
2841	    ++nops;
2842	}
2843
2844      if (mips_fix_vr4120 && prev_insn.insn_mo->name)
2845	{
2846	  int min_nops = 0;
2847	  const char *pn = prev_insn.insn_mo->name;
2848	  if (strncmp(pn, "macc", 4) == 0
2849	      || strncmp(pn, "dmacc", 5) == 0
2850	      || strncmp(pn, "dmult", 5) == 0)
2851	    {
2852	      min_nops = 1;
2853	    }
2854	  if (nops < min_nops)
2855	    nops = min_nops;
2856	}
2857
2858      if (nops > 0)
2859	{
2860	  struct insn_label_list *l;
2861
2862	  if (insns)
2863	    {
2864	      /* Record the frag which holds the nop instructions, so
2865                 that we can remove them if we don't need them.  */
2866	      frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2867	      prev_nop_frag = frag_now;
2868	      prev_nop_frag_holds = nops;
2869	      prev_nop_frag_required = 0;
2870	      prev_nop_frag_since = 0;
2871	    }
2872
2873	  for (; nops > 0; --nops)
2874	    emit_nop ();
2875
2876	  if (insns)
2877	    {
2878	      /* Move on to a new frag, so that it is safe to simply
2879                 decrease the size of prev_nop_frag.  */
2880	      frag_wane (frag_now);
2881	      frag_new (0);
2882	    }
2883
2884	  for (l = insn_labels; l != NULL; l = l->next)
2885	    {
2886	      valueT val;
2887
2888	      assert (S_GET_SEGMENT (l->label) == now_seg);
2889	      symbol_set_frag (l->label, frag_now);
2890	      val = (valueT) frag_now_fix ();
2891	      /* mips16 text labels are stored as odd.  */
2892	      if (mips_opts.mips16)
2893		++val;
2894	      S_SET_VALUE (l->label, val);
2895	    }
2896	}
2897    }
2898
2899  /* Mark instruction labels in mips16 mode.  */
2900  if (insns)
2901    mips16_mark_labels ();
2902
2903  mips_no_prev_insn (insns);
2904}
2905
2906/* Set up global variables for the start of a new macro.  */
2907
2908static void
2909macro_start (void)
2910{
2911  memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
2912  mips_macro_warning.delay_slot_p = (mips_opts.noreorder
2913				     && (prev_insn.insn_mo->pinfo
2914					 & (INSN_UNCOND_BRANCH_DELAY
2915					    | INSN_COND_BRANCH_DELAY
2916					    | INSN_COND_BRANCH_LIKELY)) != 0);
2917}
2918
2919/* Given that a macro is longer than 4 bytes, return the appropriate warning
2920   for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
2921   RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
2922
2923static const char *
2924macro_warning (relax_substateT subtype)
2925{
2926  if (subtype & RELAX_DELAY_SLOT)
2927    return _("Macro instruction expanded into multiple instructions"
2928	     " in a branch delay slot");
2929  else if (subtype & RELAX_NOMACRO)
2930    return _("Macro instruction expanded into multiple instructions");
2931  else
2932    return 0;
2933}
2934
2935/* Finish up a macro.  Emit warnings as appropriate.  */
2936
2937static void
2938macro_end (void)
2939{
2940  if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
2941    {
2942      relax_substateT subtype;
2943
2944      /* Set up the relaxation warning flags.  */
2945      subtype = 0;
2946      if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
2947	subtype |= RELAX_SECOND_LONGER;
2948      if (mips_opts.warn_about_macros)
2949	subtype |= RELAX_NOMACRO;
2950      if (mips_macro_warning.delay_slot_p)
2951	subtype |= RELAX_DELAY_SLOT;
2952
2953      if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
2954	{
2955	  /* Either the macro has a single implementation or both
2956	     implementations are longer than 4 bytes.  Emit the
2957	     warning now.  */
2958	  const char *msg = macro_warning (subtype);
2959	  if (msg != 0)
2960	    as_warn (msg);
2961	}
2962      else
2963	{
2964	  /* One implementation might need a warning but the other
2965	     definitely doesn't.  */
2966	  mips_macro_warning.first_frag->fr_subtype |= subtype;
2967	}
2968    }
2969}
2970
2971/* Build an instruction created by a macro expansion.  This is passed
2972   a pointer to the count of instructions created so far, an
2973   expression, the name of the instruction to build, an operand format
2974   string, and corresponding arguments.  */
2975
2976static void
2977macro_build (expressionS *ep, const char *name, const char *fmt, ...)
2978{
2979  struct mips_cl_insn insn;
2980  bfd_reloc_code_real_type r[3];
2981  va_list args;
2982
2983  va_start (args, fmt);
2984
2985  if (mips_opts.mips16)
2986    {
2987      mips16_macro_build (ep, name, fmt, args);
2988      va_end (args);
2989      return;
2990    }
2991
2992  r[0] = BFD_RELOC_UNUSED;
2993  r[1] = BFD_RELOC_UNUSED;
2994  r[2] = BFD_RELOC_UNUSED;
2995  insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2996  assert (insn.insn_mo);
2997  assert (strcmp (name, insn.insn_mo->name) == 0);
2998
2999  /* Search until we get a match for NAME.  */
3000  while (1)
3001    {
3002      /* It is assumed here that macros will never generate
3003         MDMX or MIPS-3D instructions.  */
3004      if (strcmp (fmt, insn.insn_mo->args) == 0
3005	  && insn.insn_mo->pinfo != INSN_MACRO
3006  	  && OPCODE_IS_MEMBER (insn.insn_mo,
3007  			       (mips_opts.isa
3008	      		        | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3009			       mips_opts.arch)
3010	  && (mips_opts.arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
3011	break;
3012
3013      ++insn.insn_mo;
3014      assert (insn.insn_mo->name);
3015      assert (strcmp (name, insn.insn_mo->name) == 0);
3016    }
3017
3018  insn.insn_opcode = insn.insn_mo->match;
3019  for (;;)
3020    {
3021      switch (*fmt++)
3022	{
3023	case '\0':
3024	  break;
3025
3026	case ',':
3027	case '(':
3028	case ')':
3029	  continue;
3030
3031	case '+':
3032	  switch (*fmt++)
3033	    {
3034	    case 'A':
3035	    case 'E':
3036	      insn.insn_opcode |= (va_arg (args, int)
3037				   & OP_MASK_SHAMT) << OP_SH_SHAMT;
3038	      continue;
3039
3040	    case 'B':
3041	    case 'F':
3042	      /* Note that in the macro case, these arguments are already
3043		 in MSB form.  (When handling the instruction in the
3044		 non-macro case, these arguments are sizes from which
3045		 MSB values must be calculated.)  */
3046	      insn.insn_opcode |= (va_arg (args, int)
3047				   & OP_MASK_INSMSB) << OP_SH_INSMSB;
3048	      continue;
3049
3050	    case 'C':
3051	    case 'G':
3052	    case 'H':
3053	      /* Note that in the macro case, these arguments are already
3054		 in MSBD form.  (When handling the instruction in the
3055		 non-macro case, these arguments are sizes from which
3056		 MSBD values must be calculated.)  */
3057	      insn.insn_opcode |= (va_arg (args, int)
3058				   & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
3059	      continue;
3060
3061	    default:
3062	      internalError ();
3063	    }
3064	  continue;
3065
3066	case 't':
3067	case 'w':
3068	case 'E':
3069	  insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3070	  continue;
3071
3072	case 'c':
3073	  insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3074	  continue;
3075
3076	case 'T':
3077	case 'W':
3078	  insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3079	  continue;
3080
3081	case 'd':
3082	case 'G':
3083	case 'K':
3084	  insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3085	  continue;
3086
3087	case 'U':
3088	  {
3089	    int tmp = va_arg (args, int);
3090
3091	    insn.insn_opcode |= tmp << OP_SH_RT;
3092	    insn.insn_opcode |= tmp << OP_SH_RD;
3093	    continue;
3094	  }
3095
3096	case 'V':
3097	case 'S':
3098	  insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3099	  continue;
3100
3101	case 'z':
3102	  continue;
3103
3104	case '<':
3105	  insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3106	  continue;
3107
3108	case 'D':
3109	  insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3110	  continue;
3111
3112	case 'B':
3113	  insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3114	  continue;
3115
3116	case 'J':
3117	  insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3118	  continue;
3119
3120	case 'q':
3121	  insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3122	  continue;
3123
3124	case 'b':
3125	case 's':
3126	case 'r':
3127	case 'v':
3128	  insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3129	  continue;
3130
3131	case 'i':
3132	case 'j':
3133	case 'o':
3134	  *r = (bfd_reloc_code_real_type) va_arg (args, int);
3135	  assert (*r == BFD_RELOC_GPREL16
3136		  || *r == BFD_RELOC_MIPS_LITERAL
3137		  || *r == BFD_RELOC_MIPS_HIGHER
3138		  || *r == BFD_RELOC_HI16_S
3139		  || *r == BFD_RELOC_LO16
3140		  || *r == BFD_RELOC_MIPS_GOT16
3141		  || *r == BFD_RELOC_MIPS_CALL16
3142		  || *r == BFD_RELOC_MIPS_GOT_DISP
3143		  || *r == BFD_RELOC_MIPS_GOT_PAGE
3144		  || *r == BFD_RELOC_MIPS_GOT_OFST
3145		  || *r == BFD_RELOC_MIPS_GOT_LO16
3146		  || *r == BFD_RELOC_MIPS_CALL_LO16
3147		  || (ep->X_op == O_subtract
3148		      && *r == BFD_RELOC_PCREL_LO16));
3149	  continue;
3150
3151	case 'u':
3152	  *r = (bfd_reloc_code_real_type) va_arg (args, int);
3153	  assert (ep != NULL
3154		  && (ep->X_op == O_constant
3155		      || (ep->X_op == O_symbol
3156			  && (*r == BFD_RELOC_MIPS_HIGHEST
3157			      || *r == BFD_RELOC_HI16_S
3158			      || *r == BFD_RELOC_HI16
3159			      || *r == BFD_RELOC_GPREL16
3160			      || *r == BFD_RELOC_MIPS_GOT_HI16
3161			      || *r == BFD_RELOC_MIPS_CALL_HI16))
3162		      || (ep->X_op == O_subtract
3163			  && *r == BFD_RELOC_PCREL_HI16_S)));
3164	  continue;
3165
3166	case 'p':
3167	  assert (ep != NULL);
3168	  /*
3169	   * This allows macro() to pass an immediate expression for
3170	   * creating short branches without creating a symbol.
3171	   * Note that the expression still might come from the assembly
3172	   * input, in which case the value is not checked for range nor
3173	   * is a relocation entry generated (yuck).
3174	   */
3175	  if (ep->X_op == O_constant)
3176	    {
3177	      insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3178	      ep = NULL;
3179	    }
3180	  else
3181	    *r = BFD_RELOC_16_PCREL_S2;
3182	  continue;
3183
3184	case 'a':
3185	  assert (ep != NULL);
3186	  *r = BFD_RELOC_MIPS_JMP;
3187	  continue;
3188
3189	case 'C':
3190	  insn.insn_opcode |= va_arg (args, unsigned long);
3191	  continue;
3192
3193	default:
3194	  internalError ();
3195	}
3196      break;
3197    }
3198  va_end (args);
3199  assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3200
3201  append_insn (&insn, ep, r);
3202}
3203
3204static void
3205mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3206		    va_list args)
3207{
3208  struct mips_cl_insn insn;
3209  bfd_reloc_code_real_type r[3]
3210    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3211
3212  insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3213  assert (insn.insn_mo);
3214  assert (strcmp (name, insn.insn_mo->name) == 0);
3215
3216  while (strcmp (fmt, insn.insn_mo->args) != 0
3217	 || insn.insn_mo->pinfo == INSN_MACRO)
3218    {
3219      ++insn.insn_mo;
3220      assert (insn.insn_mo->name);
3221      assert (strcmp (name, insn.insn_mo->name) == 0);
3222    }
3223
3224  insn.insn_opcode = insn.insn_mo->match;
3225  insn.use_extend = FALSE;
3226
3227  for (;;)
3228    {
3229      int c;
3230
3231      c = *fmt++;
3232      switch (c)
3233	{
3234	case '\0':
3235	  break;
3236
3237	case ',':
3238	case '(':
3239	case ')':
3240	  continue;
3241
3242	case 'y':
3243	case 'w':
3244	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3245	  continue;
3246
3247	case 'x':
3248	case 'v':
3249	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3250	  continue;
3251
3252	case 'z':
3253	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3254	  continue;
3255
3256	case 'Z':
3257	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3258	  continue;
3259
3260	case '0':
3261	case 'S':
3262	case 'P':
3263	case 'R':
3264	  continue;
3265
3266	case 'X':
3267	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3268	  continue;
3269
3270	case 'Y':
3271	  {
3272	    int regno;
3273
3274	    regno = va_arg (args, int);
3275	    regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3276	    insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3277	  }
3278	  continue;
3279
3280	case '<':
3281	case '>':
3282	case '4':
3283	case '5':
3284	case 'H':
3285	case 'W':
3286	case 'D':
3287	case 'j':
3288	case '8':
3289	case 'V':
3290	case 'C':
3291	case 'U':
3292	case 'k':
3293	case 'K':
3294	case 'p':
3295	case 'q':
3296	  {
3297	    assert (ep != NULL);
3298
3299	    if (ep->X_op != O_constant)
3300	      *r = (int) BFD_RELOC_UNUSED + c;
3301	    else
3302	      {
3303		mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3304			      FALSE, &insn.insn_opcode, &insn.use_extend,
3305			      &insn.extend);
3306		ep = NULL;
3307		*r = BFD_RELOC_UNUSED;
3308	      }
3309	  }
3310	  continue;
3311
3312	case '6':
3313	  insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3314	  continue;
3315	}
3316
3317      break;
3318    }
3319
3320  assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3321
3322  append_insn (&insn, ep, r);
3323}
3324
3325/*
3326 * Generate a "jalr" instruction with a relocation hint to the called
3327 * function.  This occurs in NewABI PIC code.
3328 */
3329static void
3330macro_build_jalr (expressionS *ep)
3331{
3332  char *f = NULL;
3333
3334  if (HAVE_NEWABI)
3335    {
3336      frag_grow (8);
3337      f = frag_more (0);
3338    }
3339  macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3340  if (HAVE_NEWABI)
3341    fix_new_exp (frag_now, f - frag_now->fr_literal,
3342		 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3343}
3344
3345/*
3346 * Generate a "lui" instruction.
3347 */
3348static void
3349macro_build_lui (expressionS *ep, int regnum)
3350{
3351  expressionS high_expr;
3352  struct mips_cl_insn insn;
3353  bfd_reloc_code_real_type r[3]
3354    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3355  const char *name = "lui";
3356  const char *fmt = "t,u";
3357
3358  assert (! mips_opts.mips16);
3359
3360  high_expr = *ep;
3361
3362  if (high_expr.X_op == O_constant)
3363    {
3364      /* we can compute the instruction now without a relocation entry */
3365      high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3366				>> 16) & 0xffff;
3367      *r = BFD_RELOC_UNUSED;
3368    }
3369  else
3370    {
3371      assert (ep->X_op == O_symbol);
3372      /* _gp_disp is a special case, used from s_cpload.  */
3373      assert (mips_pic == NO_PIC
3374	      || (! HAVE_NEWABI
3375		  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3376      *r = BFD_RELOC_HI16_S;
3377    }
3378
3379  insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3380  assert (insn.insn_mo);
3381  assert (strcmp (name, insn.insn_mo->name) == 0);
3382  assert (strcmp (fmt, insn.insn_mo->args) == 0);
3383
3384  insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3385  if (*r == BFD_RELOC_UNUSED)
3386    {
3387      insn.insn_opcode |= high_expr.X_add_number;
3388      append_insn (&insn, NULL, r);
3389    }
3390  else
3391    append_insn (&insn, &high_expr, r);
3392}
3393
3394/* Generate a sequence of instructions to do a load or store from a constant
3395   offset off of a base register (breg) into/from a target register (treg),
3396   using AT if necessary.  */
3397static void
3398macro_build_ldst_constoffset (expressionS *ep, const char *op,
3399			      int treg, int breg, int dbl)
3400{
3401  assert (ep->X_op == O_constant);
3402
3403  /* Sign-extending 32-bit constants makes their handling easier.  */
3404  if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3405		  == ~((bfd_vma) 0x7fffffff)))
3406    {
3407      if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3408	as_bad (_("constant too large"));
3409
3410      ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3411			  - 0x80000000);
3412    }
3413
3414  /* Right now, this routine can only handle signed 32-bit constants.  */
3415  if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3416    as_warn (_("operand overflow"));
3417
3418  if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3419    {
3420      /* Signed 16-bit offset will fit in the op.  Easy!  */
3421      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3422    }
3423  else
3424    {
3425      /* 32-bit offset, need multiple instructions and AT, like:
3426	   lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3427	   addu     $tempreg,$tempreg,$breg
3428           <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3429         to handle the complete offset.  */
3430      macro_build_lui (ep, AT);
3431      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3432      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3433
3434      if (mips_opts.noat)
3435	as_warn (_("Macro used $at after \".set noat\""));
3436    }
3437}
3438
3439/*			set_at()
3440 * Generates code to set the $at register to true (one)
3441 * if reg is less than the immediate expression.
3442 */
3443static void
3444set_at (int reg, int unsignedp)
3445{
3446  if (imm_expr.X_op == O_constant
3447      && imm_expr.X_add_number >= -0x8000
3448      && imm_expr.X_add_number < 0x8000)
3449    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3450		 AT, reg, BFD_RELOC_LO16);
3451  else
3452    {
3453      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3454      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3455    }
3456}
3457
3458static void
3459normalize_constant_expr (expressionS *ex)
3460{
3461  if (ex->X_op == O_constant && HAVE_32BIT_GPRS)
3462    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3463			- 0x80000000);
3464}
3465
3466/* Warn if an expression is not a constant.  */
3467
3468static void
3469check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3470{
3471  if (ex->X_op == O_big)
3472    as_bad (_("unsupported large constant"));
3473  else if (ex->X_op != O_constant)
3474    as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3475
3476  normalize_constant_expr (ex);
3477}
3478
3479/* Count the leading zeroes by performing a binary chop. This is a
3480   bulky bit of source, but performance is a LOT better for the
3481   majority of values than a simple loop to count the bits:
3482       for (lcnt = 0; (lcnt < 32); lcnt++)
3483         if ((v) & (1 << (31 - lcnt)))
3484           break;
3485  However it is not code size friendly, and the gain will drop a bit
3486  on certain cached systems.
3487*/
3488#define COUNT_TOP_ZEROES(v)             \
3489  (((v) & ~0xffff) == 0                 \
3490   ? ((v) & ~0xff) == 0                 \
3491     ? ((v) & ~0xf) == 0                \
3492       ? ((v) & ~0x3) == 0              \
3493         ? ((v) & ~0x1) == 0            \
3494           ? !(v)                       \
3495             ? 32                       \
3496             : 31                       \
3497           : 30                         \
3498         : ((v) & ~0x7) == 0            \
3499           ? 29                         \
3500           : 28                         \
3501       : ((v) & ~0x3f) == 0             \
3502         ? ((v) & ~0x1f) == 0           \
3503           ? 27                         \
3504           : 26                         \
3505         : ((v) & ~0x7f) == 0           \
3506           ? 25                         \
3507           : 24                         \
3508     : ((v) & ~0xfff) == 0              \
3509       ? ((v) & ~0x3ff) == 0            \
3510         ? ((v) & ~0x1ff) == 0          \
3511           ? 23                         \
3512           : 22                         \
3513         : ((v) & ~0x7ff) == 0          \
3514           ? 21                         \
3515           : 20                         \
3516       : ((v) & ~0x3fff) == 0           \
3517         ? ((v) & ~0x1fff) == 0         \
3518           ? 19                         \
3519           : 18                         \
3520         : ((v) & ~0x7fff) == 0         \
3521           ? 17                         \
3522           : 16                         \
3523   : ((v) & ~0xffffff) == 0             \
3524     ? ((v) & ~0xfffff) == 0            \
3525       ? ((v) & ~0x3ffff) == 0          \
3526         ? ((v) & ~0x1ffff) == 0        \
3527           ? 15                         \
3528           : 14                         \
3529         : ((v) & ~0x7ffff) == 0        \
3530           ? 13                         \
3531           : 12                         \
3532       : ((v) & ~0x3fffff) == 0         \
3533         ? ((v) & ~0x1fffff) == 0       \
3534           ? 11                         \
3535           : 10                         \
3536         : ((v) & ~0x7fffff) == 0       \
3537           ? 9                          \
3538           : 8                          \
3539     : ((v) & ~0xfffffff) == 0          \
3540       ? ((v) & ~0x3ffffff) == 0        \
3541         ? ((v) & ~0x1ffffff) == 0      \
3542           ? 7                          \
3543           : 6                          \
3544         : ((v) & ~0x7ffffff) == 0      \
3545           ? 5                          \
3546           : 4                          \
3547       : ((v) & ~0x3fffffff) == 0       \
3548         ? ((v) & ~0x1fffffff) == 0     \
3549           ? 3                          \
3550           : 2                          \
3551         : ((v) & ~0x7fffffff) == 0     \
3552           ? 1                          \
3553           : 0)
3554
3555/*			load_register()
3556 *  This routine generates the least number of instructions necessary to load
3557 *  an absolute expression value into a register.
3558 */
3559static void
3560load_register (int reg, expressionS *ep, int dbl)
3561{
3562  int freg;
3563  expressionS hi32, lo32;
3564
3565  if (ep->X_op != O_big)
3566    {
3567      assert (ep->X_op == O_constant);
3568
3569      /* Sign-extending 32-bit constants makes their handling easier.  */
3570      if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3571		      == ~((bfd_vma) 0x7fffffff)))
3572	{
3573	  if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3574	    as_bad (_("constant too large"));
3575
3576	  ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3577			      - 0x80000000);
3578	}
3579
3580      if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3581	{
3582	  /* We can handle 16 bit signed values with an addiu to
3583	     $zero.  No need to ever use daddiu here, since $zero and
3584	     the result are always correct in 32 bit mode.  */
3585	  macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3586	  return;
3587	}
3588      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3589	{
3590	  /* We can handle 16 bit unsigned values with an ori to
3591             $zero.  */
3592	  macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3593	  return;
3594	}
3595      else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3596	{
3597	  /* 32 bit values require an lui.  */
3598	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3599	  if ((ep->X_add_number & 0xffff) != 0)
3600	    macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3601	  return;
3602	}
3603    }
3604
3605  /* The value is larger than 32 bits.  */
3606
3607  if (HAVE_32BIT_GPRS)
3608    {
3609      as_bad (_("Number (0x%lx) larger than 32 bits"),
3610	      (unsigned long) ep->X_add_number);
3611      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3612      return;
3613    }
3614
3615  if (ep->X_op != O_big)
3616    {
3617      hi32 = *ep;
3618      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3619      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3620      hi32.X_add_number &= 0xffffffff;
3621      lo32 = *ep;
3622      lo32.X_add_number &= 0xffffffff;
3623    }
3624  else
3625    {
3626      assert (ep->X_add_number > 2);
3627      if (ep->X_add_number == 3)
3628	generic_bignum[3] = 0;
3629      else if (ep->X_add_number > 4)
3630	as_bad (_("Number larger than 64 bits"));
3631      lo32.X_op = O_constant;
3632      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3633      hi32.X_op = O_constant;
3634      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3635    }
3636
3637  if (hi32.X_add_number == 0)
3638    freg = 0;
3639  else
3640    {
3641      int shift, bit;
3642      unsigned long hi, lo;
3643
3644      if (hi32.X_add_number == (offsetT) 0xffffffff)
3645	{
3646	  if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3647	    {
3648	      macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3649	      return;
3650	    }
3651	  if (lo32.X_add_number & 0x80000000)
3652	    {
3653	      macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3654	      if (lo32.X_add_number & 0xffff)
3655		macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3656	      return;
3657	    }
3658	}
3659
3660      /* Check for 16bit shifted constant.  We know that hi32 is
3661         non-zero, so start the mask on the first bit of the hi32
3662         value.  */
3663      shift = 17;
3664      do
3665	{
3666	  unsigned long himask, lomask;
3667
3668	  if (shift < 32)
3669	    {
3670	      himask = 0xffff >> (32 - shift);
3671	      lomask = (0xffff << shift) & 0xffffffff;
3672	    }
3673	  else
3674	    {
3675	      himask = 0xffff << (shift - 32);
3676	      lomask = 0;
3677	    }
3678	  if ((hi32.X_add_number & ~(offsetT) himask) == 0
3679	      && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3680	    {
3681	      expressionS tmp;
3682
3683	      tmp.X_op = O_constant;
3684	      if (shift < 32)
3685		tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3686				    | (lo32.X_add_number >> shift));
3687	      else
3688		tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3689	      macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3690	      macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3691			   reg, reg, (shift >= 32) ? shift - 32 : shift);
3692	      return;
3693	    }
3694	  ++shift;
3695	}
3696      while (shift <= (64 - 16));
3697
3698      /* Find the bit number of the lowest one bit, and store the
3699         shifted value in hi/lo.  */
3700      hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3701      lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3702      if (lo != 0)
3703	{
3704	  bit = 0;
3705	  while ((lo & 1) == 0)
3706	    {
3707	      lo >>= 1;
3708	      ++bit;
3709	    }
3710	  lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3711	  hi >>= bit;
3712	}
3713      else
3714	{
3715	  bit = 32;
3716	  while ((hi & 1) == 0)
3717	    {
3718	      hi >>= 1;
3719	      ++bit;
3720	    }
3721	  lo = hi;
3722	  hi = 0;
3723	}
3724
3725      /* Optimize if the shifted value is a (power of 2) - 1.  */
3726      if ((hi == 0 && ((lo + 1) & lo) == 0)
3727	  || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3728	{
3729	  shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3730	  if (shift != 0)
3731	    {
3732	      expressionS tmp;
3733
3734	      /* This instruction will set the register to be all
3735                 ones.  */
3736	      tmp.X_op = O_constant;
3737	      tmp.X_add_number = (offsetT) -1;
3738	      macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3739	      if (bit != 0)
3740		{
3741		  bit += shift;
3742		  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
3743			       reg, reg, (bit >= 32) ? bit - 32 : bit);
3744		}
3745	      macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
3746			   reg, reg, (shift >= 32) ? shift - 32 : shift);
3747	      return;
3748	    }
3749	}
3750
3751      /* Sign extend hi32 before calling load_register, because we can
3752         generally get better code when we load a sign extended value.  */
3753      if ((hi32.X_add_number & 0x80000000) != 0)
3754	hi32.X_add_number |= ~(offsetT) 0xffffffff;
3755      load_register (reg, &hi32, 0);
3756      freg = reg;
3757    }
3758  if ((lo32.X_add_number & 0xffff0000) == 0)
3759    {
3760      if (freg != 0)
3761	{
3762	  macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
3763	  freg = reg;
3764	}
3765    }
3766  else
3767    {
3768      expressionS mid16;
3769
3770      if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3771	{
3772	  macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3773	  macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
3774	  return;
3775	}
3776
3777      if (freg != 0)
3778	{
3779	  macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
3780	  freg = reg;
3781	}
3782      mid16 = lo32;
3783      mid16.X_add_number >>= 16;
3784      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3785      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3786      freg = reg;
3787    }
3788  if ((lo32.X_add_number & 0xffff) != 0)
3789    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3790}
3791
3792/* Load an address into a register.  */
3793
3794static void
3795load_address (int reg, expressionS *ep, int *used_at)
3796{
3797  if (ep->X_op != O_constant
3798      && ep->X_op != O_symbol)
3799    {
3800      as_bad (_("expression too complex"));
3801      ep->X_op = O_constant;
3802    }
3803
3804  if (ep->X_op == O_constant)
3805    {
3806      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
3807      return;
3808    }
3809
3810  if (mips_pic == NO_PIC)
3811    {
3812      /* If this is a reference to a GP relative symbol, we want
3813	   addiu	$reg,$gp,<sym>		(BFD_RELOC_GPREL16)
3814	 Otherwise we want
3815	   lui		$reg,<sym>		(BFD_RELOC_HI16_S)
3816	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
3817	 If we have an addend, we always use the latter form.
3818
3819	 With 64bit address space and a usable $at we want
3820	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
3821	   lui		$at,<sym>		(BFD_RELOC_HI16_S)
3822	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
3823	   daddiu	$at,<sym>		(BFD_RELOC_LO16)
3824	   dsll32	$reg,0
3825	   daddu	$reg,$reg,$at
3826
3827	 If $at is already in use, we use a path which is suboptimal
3828	 on superscalar processors.
3829	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
3830	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
3831	   dsll		$reg,16
3832	   daddiu	$reg,<sym>		(BFD_RELOC_HI16_S)
3833	   dsll		$reg,16
3834	   daddiu	$reg,<sym>		(BFD_RELOC_LO16)
3835       */
3836      if (HAVE_64BIT_ADDRESSES)
3837	{
3838	  /* ??? We don't provide a GP-relative alternative for these macros.
3839	     It used not to be possible with the original relaxation code,
3840	     but it could be done now.  */
3841
3842	  if (*used_at == 0 && ! mips_opts.noat)
3843	    {
3844	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3845	      macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
3846	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
3847			   BFD_RELOC_MIPS_HIGHER);
3848	      macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
3849	      macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
3850	      macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
3851	      *used_at = 1;
3852	    }
3853	  else
3854	    {
3855	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3856	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
3857			   BFD_RELOC_MIPS_HIGHER);
3858	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3859	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
3860	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3861	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
3862	    }
3863	}
3864      else
3865	{
3866	  if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3867	      && ! nopic_need_relax (ep->X_add_symbol, 1))
3868	    {
3869	      relax_start (ep->X_add_symbol);
3870	      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
3871			   mips_gp_register, BFD_RELOC_GPREL16);
3872	      relax_switch ();
3873	    }
3874	  macro_build_lui (ep, reg);
3875	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
3876		       reg, reg, BFD_RELOC_LO16);
3877	  if (mips_relax.sequence)
3878	    relax_end ();
3879	}
3880    }
3881  else if (mips_pic == SVR4_PIC && ! mips_big_got)
3882    {
3883      expressionS ex;
3884
3885      /* If this is a reference to an external symbol, we want
3886	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
3887	 Otherwise we want
3888	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
3889	   nop
3890	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
3891	 If there is a constant, it must be added in after.
3892
3893	 If we have NewABI, we want
3894	   lw		$reg,<sym+cst>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
3895         unless we're referencing a global symbol with a non-zero
3896         offset, in which case cst must be added separately.  */
3897      if (HAVE_NEWABI)
3898	{
3899	  if (ep->X_add_number)
3900	    {
3901	      ex.X_add_number = ep->X_add_number;
3902	      ep->X_add_number = 0;
3903	      relax_start (ep->X_add_symbol);
3904	      macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3905			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3906	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3907		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3908	      ex.X_op = O_constant;
3909	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3910			   reg, reg, BFD_RELOC_LO16);
3911	      ep->X_add_number = ex.X_add_number;
3912	      relax_switch ();
3913	    }
3914	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3915		       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3916	  if (mips_relax.sequence)
3917	    relax_end ();
3918	}
3919      else
3920	{
3921	  ex.X_add_number = ep->X_add_number;
3922	  ep->X_add_number = 0;
3923	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3924		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
3925	  macro_build (NULL, "nop", "");
3926	  relax_start (ep->X_add_symbol);
3927	  relax_switch ();
3928	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3929		       BFD_RELOC_LO16);
3930	  relax_end ();
3931
3932	  if (ex.X_add_number != 0)
3933	    {
3934	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3935		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3936	      ex.X_op = O_constant;
3937	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3938			   reg, reg, BFD_RELOC_LO16);
3939	    }
3940	}
3941    }
3942  else if (mips_pic == SVR4_PIC)
3943    {
3944      expressionS ex;
3945
3946      /* This is the large GOT case.  If this is a reference to an
3947	 external symbol, we want
3948	   lui		$reg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
3949	   addu		$reg,$reg,$gp
3950	   lw		$reg,<sym>($reg)	(BFD_RELOC_MIPS_GOT_LO16)
3951
3952	 Otherwise, for a reference to a local symbol in old ABI, we want
3953	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
3954	   nop
3955	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
3956	 If there is a constant, it must be added in after.
3957
3958	 In the NewABI, for local symbols, with or without offsets, we want:
3959	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
3960	   addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
3961      */
3962      if (HAVE_NEWABI)
3963	{
3964	  ex.X_add_number = ep->X_add_number;
3965	  ep->X_add_number = 0;
3966	  relax_start (ep->X_add_symbol);
3967	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
3968	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
3969		       reg, reg, mips_gp_register);
3970	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
3971		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
3972	  if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3973	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3974	  else if (ex.X_add_number)
3975	    {
3976	      ex.X_op = O_constant;
3977	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3978			   BFD_RELOC_LO16);
3979	    }
3980
3981	  ep->X_add_number = ex.X_add_number;
3982	  relax_switch ();
3983	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3984		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
3985	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3986		       BFD_RELOC_MIPS_GOT_OFST);
3987	  relax_end ();
3988	}
3989      else
3990	{
3991	  ex.X_add_number = ep->X_add_number;
3992	  ep->X_add_number = 0;
3993	  relax_start (ep->X_add_symbol);
3994	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
3995	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
3996		       reg, reg, mips_gp_register);
3997	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
3998		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
3999	  relax_switch ();
4000	  if (reg_needs_delay (mips_gp_register))
4001	    {
4002	      /* We need a nop before loading from $gp.  This special
4003		 check is required because the lui which starts the main
4004		 instruction stream does not refer to $gp, and so will not
4005		 insert the nop which may be required.  */
4006	      macro_build (NULL, "nop", "");
4007	    }
4008	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4009		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4010	  macro_build (NULL, "nop", "");
4011	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4012		       BFD_RELOC_LO16);
4013	  relax_end ();
4014
4015	  if (ex.X_add_number != 0)
4016	    {
4017	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4018		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4019	      ex.X_op = O_constant;
4020	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4021			   BFD_RELOC_LO16);
4022	    }
4023	}
4024    }
4025  else if (mips_pic == EMBEDDED_PIC)
4026    {
4027      /* We always do
4028	   addiu	$reg,$gp,<sym>		(BFD_RELOC_GPREL16)
4029       */
4030      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4031		   reg, mips_gp_register, BFD_RELOC_GPREL16);
4032    }
4033  else
4034    abort ();
4035}
4036
4037/* Move the contents of register SOURCE into register DEST.  */
4038
4039static void
4040move_register (int dest, int source)
4041{
4042  macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4043	       dest, source, 0);
4044}
4045
4046/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4047   LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4048   The two alternatives are:
4049
4050   Global symbol		Local sybmol
4051   -------------		------------
4052   lw DEST,%got(SYMBOL)		lw DEST,%got(SYMBOL + OFFSET)
4053   ...				...
4054   addiu DEST,DEST,OFFSET	addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4055
4056   load_got_offset emits the first instruction and add_got_offset
4057   emits the second for a 16-bit offset or add_got_offset_hilo emits
4058   a sequence to add a 32-bit offset using a scratch register.  */
4059
4060static void
4061load_got_offset (int dest, expressionS *local)
4062{
4063  expressionS global;
4064
4065  global = *local;
4066  global.X_add_number = 0;
4067
4068  relax_start (local->X_add_symbol);
4069  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4070	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4071  relax_switch ();
4072  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4073	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4074  relax_end ();
4075}
4076
4077static void
4078add_got_offset (int dest, expressionS *local)
4079{
4080  expressionS global;
4081
4082  global.X_op = O_constant;
4083  global.X_op_symbol = NULL;
4084  global.X_add_symbol = NULL;
4085  global.X_add_number = local->X_add_number;
4086
4087  relax_start (local->X_add_symbol);
4088  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4089	       dest, dest, BFD_RELOC_LO16);
4090  relax_switch ();
4091  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4092  relax_end ();
4093}
4094
4095static void
4096add_got_offset_hilo (int dest, expressionS *local, int tmp)
4097{
4098  expressionS global;
4099  int hold_mips_optimize;
4100
4101  global.X_op = O_constant;
4102  global.X_op_symbol = NULL;
4103  global.X_add_symbol = NULL;
4104  global.X_add_number = local->X_add_number;
4105
4106  relax_start (local->X_add_symbol);
4107  load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4108  relax_switch ();
4109  /* Set mips_optimize around the lui instruction to avoid
4110     inserting an unnecessary nop after the lw.  */
4111  hold_mips_optimize = mips_optimize;
4112  mips_optimize = 2;
4113  macro_build_lui (&global, tmp);
4114  mips_optimize = hold_mips_optimize;
4115  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4116  relax_end ();
4117
4118  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4119}
4120
4121/*
4122 *			Build macros
4123 *   This routine implements the seemingly endless macro or synthesized
4124 * instructions and addressing modes in the mips assembly language. Many
4125 * of these macros are simple and are similar to each other. These could
4126 * probably be handled by some kind of table or grammar approach instead of
4127 * this verbose method. Others are not simple macros but are more like
4128 * optimizing code generation.
4129 *   One interesting optimization is when several store macros appear
4130 * consecutively that would load AT with the upper half of the same address.
4131 * The ensuing load upper instructions are ommited. This implies some kind
4132 * of global optimization. We currently only optimize within a single macro.
4133 *   For many of the load and store macros if the address is specified as a
4134 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4135 * first load register 'at' with zero and use it as the base register. The
4136 * mips assembler simply uses register $zero. Just one tiny optimization
4137 * we're missing.
4138 */
4139static void
4140macro (struct mips_cl_insn *ip)
4141{
4142  register int treg, sreg, dreg, breg;
4143  int tempreg;
4144  int mask;
4145  int used_at = 0;
4146  expressionS expr1;
4147  const char *s;
4148  const char *s2;
4149  const char *fmt;
4150  int likely = 0;
4151  int dbl = 0;
4152  int coproc = 0;
4153  int lr = 0;
4154  int imm = 0;
4155  int call = 0;
4156  int off;
4157  offsetT maxnum;
4158  bfd_reloc_code_real_type r;
4159  int hold_mips_optimize;
4160
4161  assert (! mips_opts.mips16);
4162
4163  treg = (ip->insn_opcode >> 16) & 0x1f;
4164  dreg = (ip->insn_opcode >> 11) & 0x1f;
4165  sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4166  mask = ip->insn_mo->mask;
4167
4168  expr1.X_op = O_constant;
4169  expr1.X_op_symbol = NULL;
4170  expr1.X_add_symbol = NULL;
4171  expr1.X_add_number = 1;
4172
4173  switch (mask)
4174    {
4175    case M_DABS:
4176      dbl = 1;
4177    case M_ABS:
4178      /* bgez $a0,.+12
4179	 move v0,$a0
4180	 sub v0,$zero,$a0
4181	 */
4182
4183      mips_emit_delays (TRUE);
4184      ++mips_opts.noreorder;
4185      mips_any_noreorder = 1;
4186
4187      expr1.X_add_number = 8;
4188      macro_build (&expr1, "bgez", "s,p", sreg);
4189      if (dreg == sreg)
4190	macro_build (NULL, "nop", "", 0);
4191      else
4192	move_register (dreg, sreg);
4193      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4194
4195      --mips_opts.noreorder;
4196      return;
4197
4198    case M_ADD_I:
4199      s = "addi";
4200      s2 = "add";
4201      goto do_addi;
4202    case M_ADDU_I:
4203      s = "addiu";
4204      s2 = "addu";
4205      goto do_addi;
4206    case M_DADD_I:
4207      dbl = 1;
4208      s = "daddi";
4209      s2 = "dadd";
4210      goto do_addi;
4211    case M_DADDU_I:
4212      dbl = 1;
4213      s = "daddiu";
4214      s2 = "daddu";
4215    do_addi:
4216      if (imm_expr.X_op == O_constant
4217	  && imm_expr.X_add_number >= -0x8000
4218	  && imm_expr.X_add_number < 0x8000)
4219	{
4220	  macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4221	  return;
4222	}
4223      load_register (AT, &imm_expr, dbl);
4224      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4225      break;
4226
4227    case M_AND_I:
4228      s = "andi";
4229      s2 = "and";
4230      goto do_bit;
4231    case M_OR_I:
4232      s = "ori";
4233      s2 = "or";
4234      goto do_bit;
4235    case M_NOR_I:
4236      s = "";
4237      s2 = "nor";
4238      goto do_bit;
4239    case M_XOR_I:
4240      s = "xori";
4241      s2 = "xor";
4242    do_bit:
4243      if (imm_expr.X_op == O_constant
4244	  && imm_expr.X_add_number >= 0
4245	  && imm_expr.X_add_number < 0x10000)
4246	{
4247	  if (mask != M_NOR_I)
4248	    macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4249	  else
4250	    {
4251	      macro_build (&imm_expr, "ori", "t,r,i",
4252			   treg, sreg, BFD_RELOC_LO16);
4253	      macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4254	    }
4255	  return;
4256	}
4257
4258      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4259      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4260      break;
4261
4262    case M_BEQ_I:
4263      s = "beq";
4264      goto beq_i;
4265    case M_BEQL_I:
4266      s = "beql";
4267      likely = 1;
4268      goto beq_i;
4269    case M_BNE_I:
4270      s = "bne";
4271      goto beq_i;
4272    case M_BNEL_I:
4273      s = "bnel";
4274      likely = 1;
4275    beq_i:
4276      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4277	{
4278	  macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4279	  return;
4280	}
4281      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4282      macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4283      break;
4284
4285    case M_BGEL:
4286      likely = 1;
4287    case M_BGE:
4288      if (treg == 0)
4289	{
4290	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4291	  return;
4292	}
4293      if (sreg == 0)
4294	{
4295	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4296	  return;
4297	}
4298      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4299      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4300      break;
4301
4302    case M_BGTL_I:
4303      likely = 1;
4304    case M_BGT_I:
4305      /* check for > max integer */
4306      maxnum = 0x7fffffff;
4307      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4308	{
4309	  maxnum <<= 16;
4310	  maxnum |= 0xffff;
4311	  maxnum <<= 16;
4312	  maxnum |= 0xffff;
4313	}
4314      if (imm_expr.X_op == O_constant
4315	  && imm_expr.X_add_number >= maxnum
4316	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4317	{
4318	do_false:
4319	  /* result is always false */
4320	  if (! likely)
4321	    macro_build (NULL, "nop", "", 0);
4322	  else
4323	    macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4324	  return;
4325	}
4326      if (imm_expr.X_op != O_constant)
4327	as_bad (_("Unsupported large constant"));
4328      ++imm_expr.X_add_number;
4329      /* FALLTHROUGH */
4330    case M_BGE_I:
4331    case M_BGEL_I:
4332      if (mask == M_BGEL_I)
4333	likely = 1;
4334      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4335	{
4336	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4337	  return;
4338	}
4339      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4340	{
4341	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4342	  return;
4343	}
4344      maxnum = 0x7fffffff;
4345      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4346	{
4347	  maxnum <<= 16;
4348	  maxnum |= 0xffff;
4349	  maxnum <<= 16;
4350	  maxnum |= 0xffff;
4351	}
4352      maxnum = - maxnum - 1;
4353      if (imm_expr.X_op == O_constant
4354	  && imm_expr.X_add_number <= maxnum
4355	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4356	{
4357	do_true:
4358	  /* result is always true */
4359	  as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4360	  macro_build (&offset_expr, "b", "p");
4361	  return;
4362	}
4363      set_at (sreg, 0);
4364      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4365      break;
4366
4367    case M_BGEUL:
4368      likely = 1;
4369    case M_BGEU:
4370      if (treg == 0)
4371	goto do_true;
4372      if (sreg == 0)
4373	{
4374	  macro_build (&offset_expr, likely ? "beql" : "beq",
4375		       "s,t,p", 0, treg);
4376	  return;
4377	}
4378      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4379      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4380      break;
4381
4382    case M_BGTUL_I:
4383      likely = 1;
4384    case M_BGTU_I:
4385      if (sreg == 0
4386	  || (HAVE_32BIT_GPRS
4387	      && imm_expr.X_op == O_constant
4388	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
4389	goto do_false;
4390      if (imm_expr.X_op != O_constant)
4391	as_bad (_("Unsupported large constant"));
4392      ++imm_expr.X_add_number;
4393      /* FALLTHROUGH */
4394    case M_BGEU_I:
4395    case M_BGEUL_I:
4396      if (mask == M_BGEUL_I)
4397	likely = 1;
4398      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4399	goto do_true;
4400      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4401	{
4402	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4403		       "s,t,p", sreg, 0);
4404	  return;
4405	}
4406      set_at (sreg, 1);
4407      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4408      break;
4409
4410    case M_BGTL:
4411      likely = 1;
4412    case M_BGT:
4413      if (treg == 0)
4414	{
4415	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4416	  return;
4417	}
4418      if (sreg == 0)
4419	{
4420	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4421	  return;
4422	}
4423      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4424      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4425      break;
4426
4427    case M_BGTUL:
4428      likely = 1;
4429    case M_BGTU:
4430      if (treg == 0)
4431	{
4432	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4433		       "s,t,p", sreg, 0);
4434	  return;
4435	}
4436      if (sreg == 0)
4437	goto do_false;
4438      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4439      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4440      break;
4441
4442    case M_BLEL:
4443      likely = 1;
4444    case M_BLE:
4445      if (treg == 0)
4446	{
4447	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4448	  return;
4449	}
4450      if (sreg == 0)
4451	{
4452	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4453	  return;
4454	}
4455      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4456      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4457      break;
4458
4459    case M_BLEL_I:
4460      likely = 1;
4461    case M_BLE_I:
4462      maxnum = 0x7fffffff;
4463      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4464	{
4465	  maxnum <<= 16;
4466	  maxnum |= 0xffff;
4467	  maxnum <<= 16;
4468	  maxnum |= 0xffff;
4469	}
4470      if (imm_expr.X_op == O_constant
4471	  && imm_expr.X_add_number >= maxnum
4472	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4473	goto do_true;
4474      if (imm_expr.X_op != O_constant)
4475	as_bad (_("Unsupported large constant"));
4476      ++imm_expr.X_add_number;
4477      /* FALLTHROUGH */
4478    case M_BLT_I:
4479    case M_BLTL_I:
4480      if (mask == M_BLTL_I)
4481	likely = 1;
4482      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4483	{
4484	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4485	  return;
4486	}
4487      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4488	{
4489	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4490	  return;
4491	}
4492      set_at (sreg, 0);
4493      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4494      break;
4495
4496    case M_BLEUL:
4497      likely = 1;
4498    case M_BLEU:
4499      if (treg == 0)
4500	{
4501	  macro_build (&offset_expr, likely ? "beql" : "beq",
4502		       "s,t,p", sreg, 0);
4503	  return;
4504	}
4505      if (sreg == 0)
4506	goto do_true;
4507      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4508      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4509      break;
4510
4511    case M_BLEUL_I:
4512      likely = 1;
4513    case M_BLEU_I:
4514      if (sreg == 0
4515	  || (HAVE_32BIT_GPRS
4516	      && imm_expr.X_op == O_constant
4517	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
4518	goto do_true;
4519      if (imm_expr.X_op != O_constant)
4520	as_bad (_("Unsupported large constant"));
4521      ++imm_expr.X_add_number;
4522      /* FALLTHROUGH */
4523    case M_BLTU_I:
4524    case M_BLTUL_I:
4525      if (mask == M_BLTUL_I)
4526	likely = 1;
4527      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4528	goto do_false;
4529      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4530	{
4531	  macro_build (&offset_expr, likely ? "beql" : "beq",
4532		       "s,t,p", sreg, 0);
4533	  return;
4534	}
4535      set_at (sreg, 1);
4536      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4537      break;
4538
4539    case M_BLTL:
4540      likely = 1;
4541    case M_BLT:
4542      if (treg == 0)
4543	{
4544	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4545	  return;
4546	}
4547      if (sreg == 0)
4548	{
4549	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4550	  return;
4551	}
4552      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4553      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4554      break;
4555
4556    case M_BLTUL:
4557      likely = 1;
4558    case M_BLTU:
4559      if (treg == 0)
4560	goto do_false;
4561      if (sreg == 0)
4562	{
4563	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4564		       "s,t,p", 0, treg);
4565	  return;
4566	}
4567      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4568      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4569      break;
4570
4571    case M_DEXT:
4572      {
4573	unsigned long pos;
4574	unsigned long size;
4575
4576        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4577	  {
4578	    as_bad (_("Unsupported large constant"));
4579	    pos = size = 1;
4580	  }
4581	else
4582	  {
4583	    pos = (unsigned long) imm_expr.X_add_number;
4584	    size = (unsigned long) imm2_expr.X_add_number;
4585	  }
4586
4587	if (pos > 63)
4588	  {
4589	    as_bad (_("Improper position (%lu)"), pos);
4590	    pos = 1;
4591	  }
4592        if (size == 0 || size > 64
4593	    || (pos + size - 1) > 63)
4594	  {
4595	    as_bad (_("Improper extract size (%lu, position %lu)"),
4596		    size, pos);
4597	    size = 1;
4598	  }
4599
4600	if (size <= 32 && pos < 32)
4601	  {
4602	    s = "dext";
4603	    fmt = "t,r,+A,+C";
4604	  }
4605	else if (size <= 32)
4606	  {
4607	    s = "dextu";
4608	    fmt = "t,r,+E,+H";
4609	  }
4610	else
4611	  {
4612	    s = "dextm";
4613	    fmt = "t,r,+A,+G";
4614	  }
4615	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4616      }
4617      return;
4618
4619    case M_DINS:
4620      {
4621	unsigned long pos;
4622	unsigned long size;
4623
4624        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4625	  {
4626	    as_bad (_("Unsupported large constant"));
4627	    pos = size = 1;
4628	  }
4629	else
4630	  {
4631	    pos = (unsigned long) imm_expr.X_add_number;
4632	    size = (unsigned long) imm2_expr.X_add_number;
4633	  }
4634
4635	if (pos > 63)
4636	  {
4637	    as_bad (_("Improper position (%lu)"), pos);
4638	    pos = 1;
4639	  }
4640        if (size == 0 || size > 64
4641	    || (pos + size - 1) > 63)
4642	  {
4643	    as_bad (_("Improper insert size (%lu, position %lu)"),
4644		    size, pos);
4645	    size = 1;
4646	  }
4647
4648	if (pos < 32 && (pos + size - 1) < 32)
4649	  {
4650	    s = "dins";
4651	    fmt = "t,r,+A,+B";
4652	  }
4653	else if (pos >= 32)
4654	  {
4655	    s = "dinsu";
4656	    fmt = "t,r,+E,+F";
4657	  }
4658	else
4659	  {
4660	    s = "dinsm";
4661	    fmt = "t,r,+A,+F";
4662	  }
4663	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4664		     pos + size - 1);
4665      }
4666      return;
4667
4668    case M_DDIV_3:
4669      dbl = 1;
4670    case M_DIV_3:
4671      s = "mflo";
4672      goto do_div3;
4673    case M_DREM_3:
4674      dbl = 1;
4675    case M_REM_3:
4676      s = "mfhi";
4677    do_div3:
4678      if (treg == 0)
4679	{
4680	  as_warn (_("Divide by zero."));
4681	  if (mips_trap)
4682	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4683	  else
4684	    macro_build (NULL, "break", "c", 7);
4685	  return;
4686	}
4687
4688      mips_emit_delays (TRUE);
4689      ++mips_opts.noreorder;
4690      mips_any_noreorder = 1;
4691      if (mips_trap)
4692	{
4693	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4694	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4695	}
4696      else
4697	{
4698	  expr1.X_add_number = 8;
4699	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
4700	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4701	  macro_build (NULL, "break", "c", 7);
4702	}
4703      expr1.X_add_number = -1;
4704      load_register (AT, &expr1, dbl);
4705      expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4706      macro_build (&expr1, "bne", "s,t,p", treg, AT);
4707      if (dbl)
4708	{
4709	  expr1.X_add_number = 1;
4710	  load_register (AT, &expr1, dbl);
4711	  macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
4712	}
4713      else
4714	{
4715	  expr1.X_add_number = 0x80000000;
4716	  macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
4717	}
4718      if (mips_trap)
4719	{
4720	  macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
4721	  /* We want to close the noreorder block as soon as possible, so
4722	     that later insns are available for delay slot filling.  */
4723	  --mips_opts.noreorder;
4724	}
4725      else
4726	{
4727	  expr1.X_add_number = 8;
4728	  macro_build (&expr1, "bne", "s,t,p", sreg, AT);
4729	  macro_build (NULL, "nop", "", 0);
4730
4731	  /* We want to close the noreorder block as soon as possible, so
4732	     that later insns are available for delay slot filling.  */
4733	  --mips_opts.noreorder;
4734
4735	  macro_build (NULL, "break", "c", 6);
4736	}
4737      macro_build (NULL, s, "d", dreg);
4738      break;
4739
4740    case M_DIV_3I:
4741      s = "div";
4742      s2 = "mflo";
4743      goto do_divi;
4744    case M_DIVU_3I:
4745      s = "divu";
4746      s2 = "mflo";
4747      goto do_divi;
4748    case M_REM_3I:
4749      s = "div";
4750      s2 = "mfhi";
4751      goto do_divi;
4752    case M_REMU_3I:
4753      s = "divu";
4754      s2 = "mfhi";
4755      goto do_divi;
4756    case M_DDIV_3I:
4757      dbl = 1;
4758      s = "ddiv";
4759      s2 = "mflo";
4760      goto do_divi;
4761    case M_DDIVU_3I:
4762      dbl = 1;
4763      s = "ddivu";
4764      s2 = "mflo";
4765      goto do_divi;
4766    case M_DREM_3I:
4767      dbl = 1;
4768      s = "ddiv";
4769      s2 = "mfhi";
4770      goto do_divi;
4771    case M_DREMU_3I:
4772      dbl = 1;
4773      s = "ddivu";
4774      s2 = "mfhi";
4775    do_divi:
4776      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4777	{
4778	  as_warn (_("Divide by zero."));
4779	  if (mips_trap)
4780	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4781	  else
4782	    macro_build (NULL, "break", "c", 7);
4783	  return;
4784	}
4785      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4786	{
4787	  if (strcmp (s2, "mflo") == 0)
4788	    move_register (dreg, sreg);
4789	  else
4790	    move_register (dreg, 0);
4791	  return;
4792	}
4793      if (imm_expr.X_op == O_constant
4794	  && imm_expr.X_add_number == -1
4795	  && s[strlen (s) - 1] != 'u')
4796	{
4797	  if (strcmp (s2, "mflo") == 0)
4798	    {
4799	      macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4800	    }
4801	  else
4802	    move_register (dreg, 0);
4803	  return;
4804	}
4805
4806      load_register (AT, &imm_expr, dbl);
4807      macro_build (NULL, s, "z,s,t", sreg, AT);
4808      macro_build (NULL, s2, "d", dreg);
4809      break;
4810
4811    case M_DIVU_3:
4812      s = "divu";
4813      s2 = "mflo";
4814      goto do_divu3;
4815    case M_REMU_3:
4816      s = "divu";
4817      s2 = "mfhi";
4818      goto do_divu3;
4819    case M_DDIVU_3:
4820      s = "ddivu";
4821      s2 = "mflo";
4822      goto do_divu3;
4823    case M_DREMU_3:
4824      s = "ddivu";
4825      s2 = "mfhi";
4826    do_divu3:
4827      mips_emit_delays (TRUE);
4828      ++mips_opts.noreorder;
4829      mips_any_noreorder = 1;
4830      if (mips_trap)
4831	{
4832	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4833	  macro_build (NULL, s, "z,s,t", sreg, treg);
4834	  /* We want to close the noreorder block as soon as possible, so
4835	     that later insns are available for delay slot filling.  */
4836	  --mips_opts.noreorder;
4837	}
4838      else
4839	{
4840	  expr1.X_add_number = 8;
4841	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
4842	  macro_build (NULL, s, "z,s,t", sreg, treg);
4843
4844	  /* We want to close the noreorder block as soon as possible, so
4845	     that later insns are available for delay slot filling.  */
4846	  --mips_opts.noreorder;
4847	  macro_build (NULL, "break", "c", 7);
4848	}
4849      macro_build (NULL, s2, "d", dreg);
4850      return;
4851
4852    case M_DLCA_AB:
4853      dbl = 1;
4854    case M_LCA_AB:
4855      call = 1;
4856      goto do_la;
4857    case M_DLA_AB:
4858      dbl = 1;
4859    case M_LA_AB:
4860    do_la:
4861      /* Load the address of a symbol into a register.  If breg is not
4862	 zero, we then add a base register to it.  */
4863
4864      if (dbl && HAVE_32BIT_GPRS)
4865	as_warn (_("dla used to load 32-bit register"));
4866
4867      if (! dbl && HAVE_64BIT_OBJECTS)
4868	as_warn (_("la used to load 64-bit address"));
4869
4870      if (offset_expr.X_op == O_constant
4871	  && offset_expr.X_add_number >= -0x8000
4872	  && offset_expr.X_add_number < 0x8000)
4873	{
4874	  macro_build (&offset_expr,
4875		       (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4876		       "t,r,j", treg, sreg, BFD_RELOC_LO16);
4877	  return;
4878	}
4879
4880      if (treg == breg)
4881	{
4882	  tempreg = AT;
4883	  used_at = 1;
4884	}
4885      else
4886	{
4887	  tempreg = treg;
4888	  used_at = 0;
4889	}
4890
4891      /* When generating embedded PIC code, we permit expressions of
4892	 the form
4893	   la	$treg,foo-bar
4894	   la	$treg,foo-bar($breg)
4895	 where bar is an address in the current section.  These are used
4896	 when getting the addresses of functions.  We don't permit
4897	 X_add_number to be non-zero, because if the symbol is
4898	 external the relaxing code needs to know that any addend is
4899	 purely the offset to X_op_symbol.  */
4900      if (mips_pic == EMBEDDED_PIC
4901	  && offset_expr.X_op == O_subtract
4902	  && (symbol_constant_p (offset_expr.X_op_symbol)
4903	      ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4904	      : (symbol_equated_p (offset_expr.X_op_symbol)
4905		 && (S_GET_SEGMENT
4906		     (symbol_get_value_expression (offset_expr.X_op_symbol)
4907		      ->X_add_symbol)
4908		     == now_seg)))
4909	  && (offset_expr.X_add_number == 0
4910	      || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4911	{
4912	  if (breg == 0)
4913	    {
4914	      tempreg = treg;
4915	      used_at = 0;
4916	      macro_build (&offset_expr, "lui", "t,u",
4917			   tempreg, BFD_RELOC_PCREL_HI16_S);
4918	    }
4919	  else
4920	    {
4921	      macro_build (&offset_expr, "lui", "t,u",
4922			   tempreg, BFD_RELOC_PCREL_HI16_S);
4923	      macro_build (NULL,
4924			   (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4925			   "d,v,t", tempreg, tempreg, breg);
4926	    }
4927	  macro_build (&offset_expr,
4928		       (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4929		       "t,r,j", treg, tempreg, BFD_RELOC_PCREL_LO16);
4930	  if (! used_at)
4931	    return;
4932	  break;
4933	}
4934
4935      if (offset_expr.X_op != O_symbol
4936	  && offset_expr.X_op != O_constant)
4937	{
4938	  as_bad (_("expression too complex"));
4939	  offset_expr.X_op = O_constant;
4940	}
4941
4942      if (offset_expr.X_op == O_constant)
4943	load_register (tempreg, &offset_expr,
4944		       ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4945			? (dbl || HAVE_64BIT_ADDRESSES)
4946			: HAVE_64BIT_ADDRESSES));
4947      else if (mips_pic == NO_PIC)
4948	{
4949	  /* If this is a reference to a GP relative symbol, we want
4950	       addiu	$tempreg,$gp,<sym>	(BFD_RELOC_GPREL16)
4951	     Otherwise we want
4952	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
4953	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
4954	     If we have a constant, we need two instructions anyhow,
4955	     so we may as well always use the latter form.
4956
4957	    With 64bit address space and a usable $at we want
4958	      lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4959	      lui	$at,<sym>		(BFD_RELOC_HI16_S)
4960	      daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4961	      daddiu	$at,<sym>		(BFD_RELOC_LO16)
4962	      dsll32	$tempreg,0
4963	      daddu	$tempreg,$tempreg,$at
4964
4965	    If $at is already in use, we use a path which is suboptimal
4966	    on superscalar processors.
4967	      lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4968	      daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4969	      dsll	$tempreg,16
4970	      daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
4971	      dsll	$tempreg,16
4972	      daddiu	$tempreg,<sym>		(BFD_RELOC_LO16)
4973	  */
4974	  if (HAVE_64BIT_ADDRESSES)
4975	    {
4976	      /* ??? We don't provide a GP-relative alternative for
4977		 these macros.  It used not to be possible with the
4978		 original relaxation code, but it could be done now.  */
4979
4980	      if (used_at == 0 && ! mips_opts.noat)
4981		{
4982		  macro_build (&offset_expr, "lui", "t,u",
4983			       tempreg, BFD_RELOC_MIPS_HIGHEST);
4984		  macro_build (&offset_expr, "lui", "t,u",
4985			       AT, BFD_RELOC_HI16_S);
4986		  macro_build (&offset_expr, "daddiu", "t,r,j",
4987			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
4988		  macro_build (&offset_expr, "daddiu", "t,r,j",
4989			       AT, AT, BFD_RELOC_LO16);
4990		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
4991		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
4992		  used_at = 1;
4993		}
4994	      else
4995		{
4996		  macro_build (&offset_expr, "lui", "t,u",
4997			       tempreg, BFD_RELOC_MIPS_HIGHEST);
4998		  macro_build (&offset_expr, "daddiu", "t,r,j",
4999			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5000		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5001		  macro_build (&offset_expr, "daddiu", "t,r,j",
5002			       tempreg, tempreg, BFD_RELOC_HI16_S);
5003		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5004		  macro_build (&offset_expr, "daddiu", "t,r,j",
5005			       tempreg, tempreg, BFD_RELOC_LO16);
5006		}
5007	    }
5008	  else
5009	    {
5010	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5011		  && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
5012		{
5013		  relax_start (offset_expr.X_add_symbol);
5014		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5015			       tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5016		  relax_switch ();
5017		}
5018	      macro_build_lui (&offset_expr, tempreg);
5019	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5020			   tempreg, tempreg, BFD_RELOC_LO16);
5021	      if (mips_relax.sequence)
5022		relax_end ();
5023	    }
5024	}
5025      else if (mips_pic == SVR4_PIC && ! mips_big_got && ! HAVE_NEWABI)
5026	{
5027	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5028
5029	  /* If this is a reference to an external symbol, and there
5030	     is no constant, we want
5031	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5032	     or for lca or if tempreg is PIC_CALL_REG
5033	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5034	     For a local symbol, we want
5035	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5036	       nop
5037	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5038
5039	     If we have a small constant, and this is a reference to
5040	     an external symbol, we want
5041	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5042	       nop
5043	       addiu	$tempreg,$tempreg,<constant>
5044	     For a local symbol, we want the same instruction
5045	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5046	     addiu instruction.
5047
5048	     If we have a large constant, and this is a reference to
5049	     an external symbol, we want
5050	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5051	       lui	$at,<hiconstant>
5052	       addiu	$at,$at,<loconstant>
5053	       addu	$tempreg,$tempreg,$at
5054	     For a local symbol, we want the same instruction
5055	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5056	     addiu instruction.
5057	   */
5058
5059	  if (offset_expr.X_add_number == 0)
5060	    {
5061	      if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5062		lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5063
5064	      relax_start (offset_expr.X_add_symbol);
5065	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5066			   lw_reloc_type, mips_gp_register);
5067	      if (breg != 0)
5068		{
5069		  /* We're going to put in an addu instruction using
5070		     tempreg, so we may as well insert the nop right
5071		     now.  */
5072		  macro_build (NULL, "nop", "");
5073		}
5074	      relax_switch ();
5075	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5076			   tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5077	      macro_build (NULL, "nop", "");
5078	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5079			   tempreg, tempreg, BFD_RELOC_LO16);
5080	      relax_end ();
5081	      /* FIXME: If breg == 0, and the next instruction uses
5082		 $tempreg, then if this variant case is used an extra
5083		 nop will be generated.  */
5084	    }
5085	  else if (offset_expr.X_add_number >= -0x8000
5086		   && offset_expr.X_add_number < 0x8000)
5087	    {
5088	      load_got_offset (tempreg, &offset_expr);
5089	      macro_build (NULL, "nop", "");
5090	      add_got_offset (tempreg, &offset_expr);
5091	    }
5092	  else
5093	    {
5094	      expr1.X_add_number = offset_expr.X_add_number;
5095	      offset_expr.X_add_number =
5096		((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5097	      load_got_offset (tempreg, &offset_expr);
5098	      offset_expr.X_add_number = expr1.X_add_number;
5099	      /* If we are going to add in a base register, and the
5100		 target register and the base register are the same,
5101		 then we are using AT as a temporary register.  Since
5102		 we want to load the constant into AT, we add our
5103		 current AT (from the global offset table) and the
5104		 register into the register now, and pretend we were
5105		 not using a base register.  */
5106	      if (breg == treg)
5107		{
5108		  macro_build (NULL, "nop", "");
5109		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5110			       treg, AT, breg);
5111		  breg = 0;
5112		  tempreg = treg;
5113		}
5114	      add_got_offset_hilo (tempreg, &offset_expr, AT);
5115	      used_at = 1;
5116	    }
5117	}
5118      else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
5119	{
5120	  int add_breg_early = 0;
5121
5122	  /* If this is a reference to an external, and there is no
5123	     constant, or local symbol (*), with or without a
5124	     constant, we want
5125	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5126	     or for lca or if tempreg is PIC_CALL_REG
5127	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5128
5129	     If we have a small constant, and this is a reference to
5130	     an external symbol, we want
5131	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5132	       addiu	$tempreg,$tempreg,<constant>
5133
5134	     If we have a large constant, and this is a reference to
5135	     an external symbol, we want
5136	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5137	       lui	$at,<hiconstant>
5138	       addiu	$at,$at,<loconstant>
5139	       addu	$tempreg,$tempreg,$at
5140
5141	     (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5142	     local symbols, even though it introduces an additional
5143	     instruction.  */
5144
5145	  if (offset_expr.X_add_number)
5146	    {
5147	      expr1.X_add_number = offset_expr.X_add_number;
5148	      offset_expr.X_add_number = 0;
5149
5150	      relax_start (offset_expr.X_add_symbol);
5151	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5152			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5153
5154	      if (expr1.X_add_number >= -0x8000
5155		  && expr1.X_add_number < 0x8000)
5156		{
5157		  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5158			       tempreg, tempreg, BFD_RELOC_LO16);
5159		}
5160	      else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5161		{
5162		  int dreg;
5163
5164		  /* If we are going to add in a base register, and the
5165		     target register and the base register are the same,
5166		     then we are using AT as a temporary register.  Since
5167		     we want to load the constant into AT, we add our
5168		     current AT (from the global offset table) and the
5169		     register into the register now, and pretend we were
5170		     not using a base register.  */
5171		  if (breg != treg)
5172		    dreg = tempreg;
5173		  else
5174		    {
5175		      assert (tempreg == AT);
5176		      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5177				   treg, AT, breg);
5178		      dreg = treg;
5179		      add_breg_early = 1;
5180		    }
5181
5182		  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5183		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5184			       dreg, dreg, AT);
5185
5186		  used_at = 1;
5187		}
5188	      else
5189		as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5190
5191	      relax_switch ();
5192	      offset_expr.X_add_number = expr1.X_add_number;
5193
5194	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5195			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5196	      if (add_breg_early)
5197		{
5198		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5199			       treg, tempreg, breg);
5200		  breg = 0;
5201		  tempreg = treg;
5202		}
5203	      relax_end ();
5204	    }
5205	  else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5206	    {
5207	      relax_start (offset_expr.X_add_symbol);
5208	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5209			   BFD_RELOC_MIPS_CALL16, mips_gp_register);
5210	      relax_switch ();
5211	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5212			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5213	      relax_end ();
5214	    }
5215	  else
5216	    {
5217	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5218			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5219	    }
5220	}
5221      else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
5222	{
5223	  int gpdelay;
5224	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5225	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5226	  int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5227
5228	  /* This is the large GOT case.  If this is a reference to an
5229	     external symbol, and there is no constant, we want
5230	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5231	       addu	$tempreg,$tempreg,$gp
5232	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5233	     or for lca or if tempreg is PIC_CALL_REG
5234	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5235	       addu	$tempreg,$tempreg,$gp
5236	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5237	     For a local symbol, we want
5238	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5239	       nop
5240	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5241
5242	     If we have a small constant, and this is a reference to
5243	     an external symbol, we want
5244	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5245	       addu	$tempreg,$tempreg,$gp
5246	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5247	       nop
5248	       addiu	$tempreg,$tempreg,<constant>
5249	     For a local symbol, we want
5250	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5251	       nop
5252	       addiu	$tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5253
5254	     If we have a large constant, and this is a reference to
5255	     an external symbol, we want
5256	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5257	       addu	$tempreg,$tempreg,$gp
5258	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5259	       lui	$at,<hiconstant>
5260	       addiu	$at,$at,<loconstant>
5261	       addu	$tempreg,$tempreg,$at
5262	     For a local symbol, we want
5263	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5264	       lui	$at,<hiconstant>
5265	       addiu	$at,$at,<loconstant>	(BFD_RELOC_LO16)
5266	       addu	$tempreg,$tempreg,$at
5267	  */
5268
5269	  expr1.X_add_number = offset_expr.X_add_number;
5270	  offset_expr.X_add_number = 0;
5271	  relax_start (offset_expr.X_add_symbol);
5272	  gpdelay = reg_needs_delay (mips_gp_register);
5273	  if (expr1.X_add_number == 0 && breg == 0
5274	      && (call || tempreg == PIC_CALL_REG))
5275	    {
5276	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5277	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5278	    }
5279	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5280	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5281		       tempreg, tempreg, mips_gp_register);
5282	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5283		       tempreg, lw_reloc_type, tempreg);
5284	  if (expr1.X_add_number == 0)
5285	    {
5286	      if (breg != 0)
5287		{
5288		  /* We're going to put in an addu instruction using
5289		     tempreg, so we may as well insert the nop right
5290		     now.  */
5291		  macro_build (NULL, "nop", "");
5292		}
5293	    }
5294	  else if (expr1.X_add_number >= -0x8000
5295		   && expr1.X_add_number < 0x8000)
5296	    {
5297	      macro_build (NULL, "nop", "");
5298	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5299			   tempreg, tempreg, BFD_RELOC_LO16);
5300	    }
5301	  else
5302	    {
5303	      int dreg;
5304
5305	      /* If we are going to add in a base register, and the
5306		 target register and the base register are the same,
5307		 then we are using AT as a temporary register.  Since
5308		 we want to load the constant into AT, we add our
5309		 current AT (from the global offset table) and the
5310		 register into the register now, and pretend we were
5311		 not using a base register.  */
5312	      if (breg != treg)
5313		dreg = tempreg;
5314	      else
5315		{
5316		  assert (tempreg == AT);
5317		  macro_build (NULL, "nop", "");
5318		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5319			       treg, AT, breg);
5320		  dreg = treg;
5321		}
5322
5323	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5324	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5325
5326	      used_at = 1;
5327	    }
5328	  offset_expr.X_add_number =
5329	    ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5330	  relax_switch ();
5331
5332	  if (gpdelay)
5333	    {
5334	      /* This is needed because this instruction uses $gp, but
5335		 the first instruction on the main stream does not.  */
5336	      macro_build (NULL, "nop", "");
5337	    }
5338
5339	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5340		       local_reloc_type, mips_gp_register);
5341	  if (expr1.X_add_number >= -0x8000
5342	      && expr1.X_add_number < 0x8000)
5343	    {
5344	      macro_build (NULL, "nop", "");
5345	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5346			   tempreg, tempreg, BFD_RELOC_LO16);
5347	      /* FIXME: If add_number is 0, and there was no base
5348		 register, the external symbol case ended with a load,
5349		 so if the symbol turns out to not be external, and
5350		 the next instruction uses tempreg, an unnecessary nop
5351		 will be inserted.  */
5352	    }
5353	  else
5354	    {
5355	      if (breg == treg)
5356		{
5357		  /* We must add in the base register now, as in the
5358		     external symbol case.  */
5359		  assert (tempreg == AT);
5360		  macro_build (NULL, "nop", "");
5361		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5362			       treg, AT, breg);
5363		  tempreg = treg;
5364		  /* We set breg to 0 because we have arranged to add
5365		     it in in both cases.  */
5366		  breg = 0;
5367		}
5368
5369	      macro_build_lui (&expr1, AT);
5370	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5371			   AT, AT, BFD_RELOC_LO16);
5372	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5373			   tempreg, tempreg, AT);
5374	    }
5375	  relax_end ();
5376	}
5377      else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
5378	{
5379	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5380	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5381	  int add_breg_early = 0;
5382
5383	  /* This is the large GOT case.  If this is a reference to an
5384	     external symbol, and there is no constant, we want
5385	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5386	       add	$tempreg,$tempreg,$gp
5387	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5388	     or for lca or if tempreg is PIC_CALL_REG
5389	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5390	       add	$tempreg,$tempreg,$gp
5391	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5392
5393	     If we have a small constant, and this is a reference to
5394	     an external symbol, we want
5395	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5396	       add	$tempreg,$tempreg,$gp
5397	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5398	       addi	$tempreg,$tempreg,<constant>
5399
5400	     If we have a large constant, and this is a reference to
5401	     an external symbol, we want
5402	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5403	       addu	$tempreg,$tempreg,$gp
5404	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5405	       lui	$at,<hiconstant>
5406	       addi	$at,$at,<loconstant>
5407	       add	$tempreg,$tempreg,$at
5408
5409	     If we have NewABI, and we know it's a local symbol, we want
5410	       lw	$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
5411	       addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
5412	     otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5413
5414	  relax_start (offset_expr.X_add_symbol);
5415
5416	  expr1.X_add_number = offset_expr.X_add_number;
5417	  offset_expr.X_add_number = 0;
5418
5419	  if (expr1.X_add_number == 0 && breg == 0
5420	      && (call || tempreg == PIC_CALL_REG))
5421	    {
5422	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5423	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5424	    }
5425	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5426	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5427		       tempreg, tempreg, mips_gp_register);
5428	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5429		       tempreg, lw_reloc_type, tempreg);
5430
5431	  if (expr1.X_add_number == 0)
5432	    ;
5433	  else if (expr1.X_add_number >= -0x8000
5434		   && expr1.X_add_number < 0x8000)
5435	    {
5436	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5437			   tempreg, tempreg, BFD_RELOC_LO16);
5438	    }
5439	  else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5440	    {
5441	      int dreg;
5442
5443	      /* If we are going to add in a base register, and the
5444		 target register and the base register are the same,
5445		 then we are using AT as a temporary register.  Since
5446		 we want to load the constant into AT, we add our
5447		 current AT (from the global offset table) and the
5448		 register into the register now, and pretend we were
5449		 not using a base register.  */
5450	      if (breg != treg)
5451		dreg = tempreg;
5452	      else
5453		{
5454		  assert (tempreg == AT);
5455		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5456			       treg, AT, breg);
5457		  dreg = treg;
5458		  add_breg_early = 1;
5459		}
5460
5461	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5462	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5463
5464	      used_at = 1;
5465	    }
5466	  else
5467	    as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5468
5469	  relax_switch ();
5470	  offset_expr.X_add_number = expr1.X_add_number;
5471	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5472		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5473	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5474		       tempreg, BFD_RELOC_MIPS_GOT_OFST);
5475	  if (add_breg_early)
5476	    {
5477	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5478			   treg, tempreg, breg);
5479	      breg = 0;
5480	      tempreg = treg;
5481	    }
5482	  relax_end ();
5483	}
5484      else if (mips_pic == EMBEDDED_PIC)
5485	{
5486	  /* We use
5487	       addiu	$tempreg,$gp,<sym>	(BFD_RELOC_GPREL16)
5488	     */
5489	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5490		       mips_gp_register, BFD_RELOC_GPREL16);
5491	}
5492      else
5493	abort ();
5494
5495      if (breg != 0)
5496	{
5497	  char *s;
5498
5499	  if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5500	    s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5501	  else
5502	    s = ADDRESS_ADD_INSN;
5503
5504	  macro_build (NULL, s, "d,v,t", treg, tempreg, breg);
5505	}
5506
5507      if (! used_at)
5508	return;
5509
5510      break;
5511
5512    case M_J_A:
5513      /* The j instruction may not be used in PIC code, since it
5514	 requires an absolute address.  We convert it to a b
5515	 instruction.  */
5516      if (mips_pic == NO_PIC)
5517	macro_build (&offset_expr, "j", "a");
5518      else
5519	macro_build (&offset_expr, "b", "p");
5520      return;
5521
5522      /* The jal instructions must be handled as macros because when
5523	 generating PIC code they expand to multi-instruction
5524	 sequences.  Normally they are simple instructions.  */
5525    case M_JAL_1:
5526      dreg = RA;
5527      /* Fall through.  */
5528    case M_JAL_2:
5529      if (mips_pic == NO_PIC
5530	  || mips_pic == EMBEDDED_PIC)
5531	macro_build (NULL, "jalr", "d,s", dreg, sreg);
5532      else if (mips_pic == SVR4_PIC)
5533	{
5534	  if (sreg != PIC_CALL_REG)
5535	    as_warn (_("MIPS PIC call to register other than $25"));
5536
5537	  macro_build (NULL, "jalr", "d,s", dreg, sreg);
5538	  if (! HAVE_NEWABI)
5539	    {
5540	      if (mips_cprestore_offset < 0)
5541		as_warn (_("No .cprestore pseudo-op used in PIC code"));
5542	      else
5543		{
5544		  if (! mips_frame_reg_valid)
5545		    {
5546		      as_warn (_("No .frame pseudo-op used in PIC code"));
5547		      /* Quiet this warning.  */
5548		      mips_frame_reg_valid = 1;
5549		    }
5550		  if (! mips_cprestore_valid)
5551		    {
5552		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
5553		      /* Quiet this warning.  */
5554		      mips_cprestore_valid = 1;
5555		    }
5556		  expr1.X_add_number = mips_cprestore_offset;
5557  		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5558						mips_gp_register,
5559						mips_frame_reg,
5560						HAVE_64BIT_ADDRESSES);
5561		}
5562	    }
5563	}
5564      else
5565	abort ();
5566
5567      return;
5568
5569    case M_JAL_A:
5570      if (mips_pic == NO_PIC)
5571	macro_build (&offset_expr, "jal", "a");
5572      else if (mips_pic == SVR4_PIC)
5573	{
5574	  /* If this is a reference to an external symbol, and we are
5575	     using a small GOT, we want
5576	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_CALL16)
5577	       nop
5578	       jalr	$ra,$25
5579	       nop
5580	       lw	$gp,cprestore($sp)
5581	     The cprestore value is set using the .cprestore
5582	     pseudo-op.  If we are using a big GOT, we want
5583	       lui	$25,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5584	       addu	$25,$25,$gp
5585	       lw	$25,<sym>($25)		(BFD_RELOC_MIPS_CALL_LO16)
5586	       nop
5587	       jalr	$ra,$25
5588	       nop
5589	       lw	$gp,cprestore($sp)
5590	     If the symbol is not external, we want
5591	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
5592	       nop
5593	       addiu	$25,$25,<sym>		(BFD_RELOC_LO16)
5594	       jalr	$ra,$25
5595	       nop
5596	       lw $gp,cprestore($sp)
5597
5598	     For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5599	     sequences above, minus nops, unless the symbol is local,
5600	     which enables us to use GOT_PAGE/GOT_OFST (big got) or
5601	     GOT_DISP.  */
5602	  if (HAVE_NEWABI)
5603	    {
5604	      if (! mips_big_got)
5605		{
5606		  relax_start (offset_expr.X_add_symbol);
5607		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5608			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5609			       mips_gp_register);
5610		  relax_switch ();
5611		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5612			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5613			       mips_gp_register);
5614		  relax_end ();
5615		}
5616	      else
5617		{
5618		  relax_start (offset_expr.X_add_symbol);
5619		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5620			       BFD_RELOC_MIPS_CALL_HI16);
5621		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5622			       PIC_CALL_REG, mips_gp_register);
5623		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5624			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5625			       PIC_CALL_REG);
5626		  relax_switch ();
5627		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5628			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5629			       mips_gp_register);
5630		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5631			       PIC_CALL_REG, PIC_CALL_REG,
5632			       BFD_RELOC_MIPS_GOT_OFST);
5633		  relax_end ();
5634		}
5635
5636	      macro_build_jalr (&offset_expr);
5637	    }
5638	  else
5639	    {
5640	      relax_start (offset_expr.X_add_symbol);
5641	      if (! mips_big_got)
5642		{
5643		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5644			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5645			       mips_gp_register);
5646		  macro_build (NULL, "nop", "");
5647		  relax_switch ();
5648		}
5649	      else
5650		{
5651		  int gpdelay;
5652
5653		  gpdelay = reg_needs_delay (mips_gp_register);
5654		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5655			       BFD_RELOC_MIPS_CALL_HI16);
5656		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5657			       PIC_CALL_REG, mips_gp_register);
5658		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5659			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5660			       PIC_CALL_REG);
5661		  macro_build (NULL, "nop", "");
5662		  relax_switch ();
5663		  if (gpdelay)
5664		    macro_build (NULL, "nop", "");
5665		}
5666	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5667			   PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5668			   mips_gp_register);
5669	      macro_build (NULL, "nop", "");
5670	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5671			   PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5672	      relax_end ();
5673	      macro_build_jalr (&offset_expr);
5674
5675	      if (mips_cprestore_offset < 0)
5676		as_warn (_("No .cprestore pseudo-op used in PIC code"));
5677	      else
5678		{
5679		  if (! mips_frame_reg_valid)
5680		    {
5681		      as_warn (_("No .frame pseudo-op used in PIC code"));
5682		      /* Quiet this warning.  */
5683		      mips_frame_reg_valid = 1;
5684		    }
5685		  if (! mips_cprestore_valid)
5686		    {
5687		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
5688		      /* Quiet this warning.  */
5689		      mips_cprestore_valid = 1;
5690		    }
5691		  if (mips_opts.noreorder)
5692		    macro_build (NULL, "nop", "");
5693		  expr1.X_add_number = mips_cprestore_offset;
5694  		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5695						mips_gp_register,
5696						mips_frame_reg,
5697						HAVE_64BIT_ADDRESSES);
5698		}
5699	    }
5700	}
5701      else if (mips_pic == EMBEDDED_PIC)
5702	{
5703	  macro_build (&offset_expr, "bal", "p");
5704	  /* The linker may expand the call to a longer sequence which
5705	     uses $at, so we must break rather than return.  */
5706	  break;
5707	}
5708      else
5709	abort ();
5710
5711      return;
5712
5713    case M_LB_AB:
5714      s = "lb";
5715      goto ld;
5716    case M_LBU_AB:
5717      s = "lbu";
5718      goto ld;
5719    case M_LH_AB:
5720      s = "lh";
5721      goto ld;
5722    case M_LHU_AB:
5723      s = "lhu";
5724      goto ld;
5725    case M_LW_AB:
5726      s = "lw";
5727      goto ld;
5728    case M_LWC0_AB:
5729      s = "lwc0";
5730      /* Itbl support may require additional care here.  */
5731      coproc = 1;
5732      goto ld;
5733    case M_LWC1_AB:
5734      s = "lwc1";
5735      /* Itbl support may require additional care here.  */
5736      coproc = 1;
5737      goto ld;
5738    case M_LWC2_AB:
5739      s = "lwc2";
5740      /* Itbl support may require additional care here.  */
5741      coproc = 1;
5742      goto ld;
5743    case M_LWC3_AB:
5744      s = "lwc3";
5745      /* Itbl support may require additional care here.  */
5746      coproc = 1;
5747      goto ld;
5748    case M_LWL_AB:
5749      s = "lwl";
5750      lr = 1;
5751      goto ld;
5752    case M_LWR_AB:
5753      s = "lwr";
5754      lr = 1;
5755      goto ld;
5756    case M_LDC1_AB:
5757      if (mips_opts.arch == CPU_R4650)
5758	{
5759	  as_bad (_("opcode not supported on this processor"));
5760	  return;
5761	}
5762      s = "ldc1";
5763      /* Itbl support may require additional care here.  */
5764      coproc = 1;
5765      goto ld;
5766    case M_LDC2_AB:
5767      s = "ldc2";
5768      /* Itbl support may require additional care here.  */
5769      coproc = 1;
5770      goto ld;
5771    case M_LDC3_AB:
5772      s = "ldc3";
5773      /* Itbl support may require additional care here.  */
5774      coproc = 1;
5775      goto ld;
5776    case M_LDL_AB:
5777      s = "ldl";
5778      lr = 1;
5779      goto ld;
5780    case M_LDR_AB:
5781      s = "ldr";
5782      lr = 1;
5783      goto ld;
5784    case M_LL_AB:
5785      s = "ll";
5786      goto ld;
5787    case M_LLD_AB:
5788      s = "lld";
5789      goto ld;
5790    case M_LWU_AB:
5791      s = "lwu";
5792    ld:
5793      if (breg == treg || coproc || lr)
5794	{
5795	  tempreg = AT;
5796	  used_at = 1;
5797	}
5798      else
5799	{
5800	  tempreg = treg;
5801	  used_at = 0;
5802	}
5803      goto ld_st;
5804    case M_SB_AB:
5805      s = "sb";
5806      goto st;
5807    case M_SH_AB:
5808      s = "sh";
5809      goto st;
5810    case M_SW_AB:
5811      s = "sw";
5812      goto st;
5813    case M_SWC0_AB:
5814      s = "swc0";
5815      /* Itbl support may require additional care here.  */
5816      coproc = 1;
5817      goto st;
5818    case M_SWC1_AB:
5819      s = "swc1";
5820      /* Itbl support may require additional care here.  */
5821      coproc = 1;
5822      goto st;
5823    case M_SWC2_AB:
5824      s = "swc2";
5825      /* Itbl support may require additional care here.  */
5826      coproc = 1;
5827      goto st;
5828    case M_SWC3_AB:
5829      s = "swc3";
5830      /* Itbl support may require additional care here.  */
5831      coproc = 1;
5832      goto st;
5833    case M_SWL_AB:
5834      s = "swl";
5835      goto st;
5836    case M_SWR_AB:
5837      s = "swr";
5838      goto st;
5839    case M_SC_AB:
5840      s = "sc";
5841      goto st;
5842    case M_SCD_AB:
5843      s = "scd";
5844      goto st;
5845    case M_SDC1_AB:
5846      if (mips_opts.arch == CPU_R4650)
5847	{
5848	  as_bad (_("opcode not supported on this processor"));
5849	  return;
5850	}
5851      s = "sdc1";
5852      coproc = 1;
5853      /* Itbl support may require additional care here.  */
5854      goto st;
5855    case M_SDC2_AB:
5856      s = "sdc2";
5857      /* Itbl support may require additional care here.  */
5858      coproc = 1;
5859      goto st;
5860    case M_SDC3_AB:
5861      s = "sdc3";
5862      /* Itbl support may require additional care here.  */
5863      coproc = 1;
5864      goto st;
5865    case M_SDL_AB:
5866      s = "sdl";
5867      goto st;
5868    case M_SDR_AB:
5869      s = "sdr";
5870    st:
5871      tempreg = AT;
5872      used_at = 1;
5873    ld_st:
5874      /* Itbl support may require additional care here.  */
5875      if (mask == M_LWC1_AB
5876	  || mask == M_SWC1_AB
5877	  || mask == M_LDC1_AB
5878	  || mask == M_SDC1_AB
5879	  || mask == M_L_DAB
5880	  || mask == M_S_DAB)
5881	fmt = "T,o(b)";
5882      else if (coproc)
5883	fmt = "E,o(b)";
5884      else
5885	fmt = "t,o(b)";
5886
5887      /* Sign-extending 32-bit constants makes their handling easier.
5888         The HAVE_64BIT_GPRS... part is due to the linux kernel hack
5889         described below.  */
5890      if ((! HAVE_64BIT_ADDRESSES
5891	   && (! HAVE_64BIT_GPRS && offset_expr.X_op == O_constant))
5892          && (offset_expr.X_op == O_constant)
5893	  && ! ((offset_expr.X_add_number & ~((bfd_vma) 0x7fffffff))
5894		== ~((bfd_vma) 0x7fffffff)))
5895	{
5896	  if (offset_expr.X_add_number & ~((bfd_vma) 0xffffffff))
5897	    as_bad (_("constant too large"));
5898
5899	  offset_expr.X_add_number = (((offset_expr.X_add_number & 0xffffffff)
5900				       ^ 0x80000000) - 0x80000000);
5901	}
5902
5903      /* For embedded PIC, we allow loads where the offset is calculated
5904         by subtracting a symbol in the current segment from an unknown
5905         symbol, relative to a base register, e.g.:
5906		<op>	$treg, <sym>-<localsym>($breg)
5907	 This is used by the compiler for switch statements.  */
5908      if (mips_pic == EMBEDDED_PIC
5909          && offset_expr.X_op == O_subtract
5910          && (symbol_constant_p (offset_expr.X_op_symbol)
5911              ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
5912              : (symbol_equated_p (offset_expr.X_op_symbol)
5913                 && (S_GET_SEGMENT
5914                     (symbol_get_value_expression (offset_expr.X_op_symbol)
5915                      ->X_add_symbol)
5916                     == now_seg)))
5917          && breg != 0
5918          && (offset_expr.X_add_number == 0
5919              || OUTPUT_FLAVOR == bfd_target_elf_flavour))
5920        {
5921          /* For this case, we output the instructions:
5922                lui     $tempreg,<sym>          (BFD_RELOC_PCREL_HI16_S)
5923                addiu   $tempreg,$tempreg,$breg
5924                <op>    $treg,<sym>($tempreg)   (BFD_RELOC_PCREL_LO16)
5925             If the relocation would fit entirely in 16 bits, it would be
5926             nice to emit:
5927                <op>    $treg,<sym>($breg)      (BFD_RELOC_PCREL_LO16)
5928             instead, but that seems quite difficult.  */
5929          macro_build (&offset_expr, "lui", "t,u", tempreg,
5930		       BFD_RELOC_PCREL_HI16_S);
5931          macro_build (NULL,
5932		       ((bfd_arch_bits_per_address (stdoutput) == 32
5933			 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
5934			? "addu" : "daddu"),
5935		       "d,v,t", tempreg, tempreg, breg);
5936          macro_build (&offset_expr, s, fmt, treg,
5937		       BFD_RELOC_PCREL_LO16, tempreg);
5938          if (! used_at)
5939            return;
5940          break;
5941        }
5942
5943      if (offset_expr.X_op != O_constant
5944	  && offset_expr.X_op != O_symbol)
5945	{
5946	  as_bad (_("expression too complex"));
5947	  offset_expr.X_op = O_constant;
5948	}
5949
5950      /* A constant expression in PIC code can be handled just as it
5951	 is in non PIC code.  */
5952      if (mips_pic == NO_PIC
5953	  || offset_expr.X_op == O_constant)
5954	{
5955	  /* If this is a reference to a GP relative symbol, and there
5956	     is no base register, we want
5957	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
5958	     Otherwise, if there is no base register, we want
5959	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5960	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
5961	     If we have a constant, we need two instructions anyhow,
5962	     so we always use the latter form.
5963
5964	     If we have a base register, and this is a reference to a
5965	     GP relative symbol, we want
5966	       addu	$tempreg,$breg,$gp
5967	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_GPREL16)
5968	     Otherwise we want
5969	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5970	       addu	$tempreg,$tempreg,$breg
5971	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
5972	     With a constant we always use the latter case.
5973
5974	     With 64bit address space and no base register and $at usable,
5975	     we want
5976	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5977	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
5978	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5979	       dsll32	$tempreg,0
5980	       daddu	$tempreg,$at
5981	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
5982	     If we have a base register, we want
5983	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5984	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
5985	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5986	       daddu	$at,$breg
5987	       dsll32	$tempreg,0
5988	       daddu	$tempreg,$at
5989	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
5990
5991	     Without $at we can't generate the optimal path for superscalar
5992	     processors here since this would require two temporary registers.
5993	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5994	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5995	       dsll	$tempreg,16
5996	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5997	       dsll	$tempreg,16
5998	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
5999	     If we have a base register, we want
6000	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6001	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6002	       dsll	$tempreg,16
6003	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6004	       dsll	$tempreg,16
6005	       daddu	$tempreg,$tempreg,$breg
6006	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6007
6008	     If we have 64-bit addresses, as an optimization, for
6009	     addresses which are 32-bit constants (e.g. kseg0/kseg1
6010	     addresses) we fall back to the 32-bit address generation
6011	     mechanism since it is more efficient.  Note that due to
6012	     the signed offset used by memory operations, the 32-bit
6013	     range is shifted down by 32768 here.  This code should
6014	     probably attempt to generate 64-bit constants more
6015	     efficiently in general.
6016
6017	     As an extension for architectures with 64-bit registers,
6018	     we don't truncate 64-bit addresses given as literal
6019	     constants down to 32 bits, to support existing practice
6020	     in the mips64 Linux (the kernel), that compiles source
6021	     files with -mabi=64, assembling them as o32 or n32 (with
6022	     -Wa,-32 or -Wa,-n32).  This is not beautiful, but since
6023	     the whole kernel is loaded into a memory region that is
6024	     addressable with sign-extended 32-bit addresses, it is
6025	     wasteful to compute the upper 32 bits of every
6026	     non-literal address, that takes more space and time.
6027	     Some day this should probably be implemented as an
6028	     assembler option, such that the kernel doesn't have to
6029	     use such ugly hacks, even though it will still have to
6030	     end up converting the binary to ELF32 for a number of
6031	     platforms whose boot loaders don't support ELF64
6032	     binaries.  */
6033	  if ((HAVE_64BIT_ADDRESSES
6034	       && ! (offset_expr.X_op == O_constant
6035		     && IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
6036	      || (HAVE_64BIT_GPRS
6037		  && offset_expr.X_op == O_constant
6038		  && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
6039	    {
6040	      /* ??? We don't provide a GP-relative alternative for
6041		 these macros.  It used not to be possible with the
6042		 original relaxation code, but it could be done now.  */
6043
6044	      if (used_at == 0 && ! mips_opts.noat)
6045		{
6046		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6047			       BFD_RELOC_MIPS_HIGHEST);
6048		  macro_build (&offset_expr, "lui", "t,u", AT,
6049			       BFD_RELOC_HI16_S);
6050		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6051			       tempreg, BFD_RELOC_MIPS_HIGHER);
6052		  if (breg != 0)
6053		    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6054		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6055		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6056		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6057			       tempreg);
6058		  used_at = 1;
6059		}
6060	      else
6061		{
6062		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6063			       BFD_RELOC_MIPS_HIGHEST);
6064		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6065			       tempreg, BFD_RELOC_MIPS_HIGHER);
6066		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6067		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6068			       tempreg, BFD_RELOC_HI16_S);
6069		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6070		  if (breg != 0)
6071		    macro_build (NULL, "daddu", "d,v,t",
6072				 tempreg, tempreg, breg);
6073		  macro_build (&offset_expr, s, fmt, treg,
6074			       BFD_RELOC_LO16, tempreg);
6075		}
6076
6077	      return;
6078	    }
6079
6080	  if (offset_expr.X_op == O_constant
6081	      && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000))
6082	    as_bad (_("load/store address overflow (max 32 bits)"));
6083
6084	  if (breg == 0)
6085	    {
6086	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6087		  && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
6088		{
6089		  relax_start (offset_expr.X_add_symbol);
6090		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6091			       mips_gp_register);
6092		  relax_switch ();
6093		  used_at = 0;
6094		}
6095	      macro_build_lui (&offset_expr, tempreg);
6096	      macro_build (&offset_expr, s, fmt, treg,
6097			   BFD_RELOC_LO16, tempreg);
6098	      if (mips_relax.sequence)
6099		relax_end ();
6100	    }
6101	  else
6102	    {
6103	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6104		  && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
6105		{
6106		  relax_start (offset_expr.X_add_symbol);
6107		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6108			       tempreg, breg, mips_gp_register);
6109		  macro_build (&offset_expr, s, fmt, treg,
6110			       BFD_RELOC_GPREL16, tempreg);
6111		  relax_switch ();
6112		}
6113	      macro_build_lui (&offset_expr, tempreg);
6114	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6115			   tempreg, tempreg, breg);
6116	      macro_build (&offset_expr, s, fmt, treg,
6117			   BFD_RELOC_LO16, tempreg);
6118	      if (mips_relax.sequence)
6119		relax_end ();
6120	    }
6121	}
6122      else if (mips_pic == SVR4_PIC && ! mips_big_got)
6123	{
6124	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6125
6126	  /* If this is a reference to an external symbol, we want
6127	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6128	       nop
6129	       <op>	$treg,0($tempreg)
6130	     Otherwise we want
6131	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6132	       nop
6133	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6134	       <op>	$treg,0($tempreg)
6135
6136	     For NewABI, we want
6137	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6138	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6139
6140	     If there is a base register, we add it to $tempreg before
6141	     the <op>.  If there is a constant, we stick it in the
6142	     <op> instruction.  We don't handle constants larger than
6143	     16 bits, because we have no way to load the upper 16 bits
6144	     (actually, we could handle them for the subset of cases
6145	     in which we are not using $at).  */
6146	  assert (offset_expr.X_op == O_symbol);
6147	  if (HAVE_NEWABI)
6148	    {
6149	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6150			   BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6151	      if (breg != 0)
6152		macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6153			     tempreg, tempreg, breg);
6154	      macro_build (&offset_expr, s, fmt, treg,
6155			   BFD_RELOC_MIPS_GOT_OFST, tempreg);
6156
6157	      if (! used_at)
6158		return;
6159
6160	      break;
6161	    }
6162	  expr1.X_add_number = offset_expr.X_add_number;
6163	  offset_expr.X_add_number = 0;
6164	  if (expr1.X_add_number < -0x8000
6165	      || expr1.X_add_number >= 0x8000)
6166	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6167	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6168		       lw_reloc_type, mips_gp_register);
6169	  macro_build (NULL, "nop", "");
6170	  relax_start (offset_expr.X_add_symbol);
6171	  relax_switch ();
6172	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6173		       tempreg, BFD_RELOC_LO16);
6174	  relax_end ();
6175	  if (breg != 0)
6176	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6177			 tempreg, tempreg, breg);
6178	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6179	}
6180      else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
6181	{
6182	  int gpdelay;
6183
6184	  /* If this is a reference to an external symbol, we want
6185	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6186	       addu	$tempreg,$tempreg,$gp
6187	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6188	       <op>	$treg,0($tempreg)
6189	     Otherwise we want
6190	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6191	       nop
6192	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6193	       <op>	$treg,0($tempreg)
6194	     If there is a base register, we add it to $tempreg before
6195	     the <op>.  If there is a constant, we stick it in the
6196	     <op> instruction.  We don't handle constants larger than
6197	     16 bits, because we have no way to load the upper 16 bits
6198	     (actually, we could handle them for the subset of cases
6199	     in which we are not using $at).  */
6200	  assert (offset_expr.X_op == O_symbol);
6201	  expr1.X_add_number = offset_expr.X_add_number;
6202	  offset_expr.X_add_number = 0;
6203	  if (expr1.X_add_number < -0x8000
6204	      || expr1.X_add_number >= 0x8000)
6205	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6206	  gpdelay = reg_needs_delay (mips_gp_register);
6207	  relax_start (offset_expr.X_add_symbol);
6208	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6209		       BFD_RELOC_MIPS_GOT_HI16);
6210	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6211		       mips_gp_register);
6212	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6213		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6214	  relax_switch ();
6215	  if (gpdelay)
6216	    macro_build (NULL, "nop", "");
6217	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6218		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6219	  macro_build (NULL, "nop", "");
6220	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6221		       tempreg, BFD_RELOC_LO16);
6222	  relax_end ();
6223
6224	  if (breg != 0)
6225	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6226			 tempreg, tempreg, breg);
6227	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6228	}
6229      else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
6230	{
6231	  /* If this is a reference to an external symbol, we want
6232	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6233	       add	$tempreg,$tempreg,$gp
6234	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6235	       <op>	$treg,<ofst>($tempreg)
6236	     Otherwise, for local symbols, we want:
6237	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6238	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6239	  assert (offset_expr.X_op == O_symbol);
6240	  expr1.X_add_number = offset_expr.X_add_number;
6241	  offset_expr.X_add_number = 0;
6242	  if (expr1.X_add_number < -0x8000
6243	      || expr1.X_add_number >= 0x8000)
6244	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6245	  relax_start (offset_expr.X_add_symbol);
6246	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6247		       BFD_RELOC_MIPS_GOT_HI16);
6248	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6249		       mips_gp_register);
6250	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6251		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6252	  if (breg != 0)
6253	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6254			 tempreg, tempreg, breg);
6255	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6256
6257	  relax_switch ();
6258	  offset_expr.X_add_number = expr1.X_add_number;
6259	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6260		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6261	  if (breg != 0)
6262	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6263			 tempreg, tempreg, breg);
6264	  macro_build (&offset_expr, s, fmt, treg,
6265		       BFD_RELOC_MIPS_GOT_OFST, tempreg);
6266	  relax_end ();
6267	}
6268      else if (mips_pic == EMBEDDED_PIC)
6269	{
6270	  /* If there is no base register, we want
6271	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6272	     If there is a base register, we want
6273	       addu	$tempreg,$breg,$gp
6274	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_GPREL16)
6275	     */
6276	  assert (offset_expr.X_op == O_symbol);
6277	  if (breg == 0)
6278	    {
6279	      macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6280			   mips_gp_register);
6281	      used_at = 0;
6282	    }
6283	  else
6284	    {
6285	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6286			   tempreg, breg, mips_gp_register);
6287	      macro_build (&offset_expr, s, fmt, treg,
6288			   BFD_RELOC_GPREL16, tempreg);
6289	    }
6290	}
6291      else
6292	abort ();
6293
6294      if (! used_at)
6295	return;
6296
6297      break;
6298
6299    case M_LI:
6300    case M_LI_S:
6301      load_register (treg, &imm_expr, 0);
6302      return;
6303
6304    case M_DLI:
6305      load_register (treg, &imm_expr, 1);
6306      return;
6307
6308    case M_LI_SS:
6309      if (imm_expr.X_op == O_constant)
6310	{
6311	  load_register (AT, &imm_expr, 0);
6312	  macro_build (NULL, "mtc1", "t,G", AT, treg);
6313	  break;
6314	}
6315      else
6316	{
6317	  assert (offset_expr.X_op == O_symbol
6318		  && strcmp (segment_name (S_GET_SEGMENT
6319					   (offset_expr.X_add_symbol)),
6320			     ".lit4") == 0
6321		  && offset_expr.X_add_number == 0);
6322	  macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6323		       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6324	  return;
6325	}
6326
6327    case M_LI_D:
6328      /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6329         wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6330         order 32 bits of the value and the low order 32 bits are either
6331         zero or in OFFSET_EXPR.  */
6332      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6333	{
6334	  if (HAVE_64BIT_GPRS)
6335	    load_register (treg, &imm_expr, 1);
6336	  else
6337	    {
6338	      int hreg, lreg;
6339
6340	      if (target_big_endian)
6341		{
6342		  hreg = treg;
6343		  lreg = treg + 1;
6344		}
6345	      else
6346		{
6347		  hreg = treg + 1;
6348		  lreg = treg;
6349		}
6350
6351	      if (hreg <= 31)
6352		load_register (hreg, &imm_expr, 0);
6353	      if (lreg <= 31)
6354		{
6355		  if (offset_expr.X_op == O_absent)
6356		    move_register (lreg, 0);
6357		  else
6358		    {
6359		      assert (offset_expr.X_op == O_constant);
6360		      load_register (lreg, &offset_expr, 0);
6361		    }
6362		}
6363	    }
6364	  return;
6365	}
6366
6367      /* We know that sym is in the .rdata section.  First we get the
6368	 upper 16 bits of the address.  */
6369      if (mips_pic == NO_PIC)
6370	{
6371	  macro_build_lui (&offset_expr, AT);
6372	}
6373      else if (mips_pic == SVR4_PIC)
6374	{
6375	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6376		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6377	}
6378      else if (mips_pic == EMBEDDED_PIC)
6379	{
6380	  /* For embedded PIC we pick up the entire address off $gp in
6381	     a single instruction.  */
6382	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", AT,
6383		       mips_gp_register, BFD_RELOC_GPREL16);
6384	  offset_expr.X_op = O_constant;
6385	  offset_expr.X_add_number = 0;
6386	}
6387      else
6388	abort ();
6389
6390      /* Now we load the register(s).  */
6391      if (HAVE_64BIT_GPRS)
6392	macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6393      else
6394	{
6395	  macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6396	  if (treg != RA)
6397	    {
6398	      /* FIXME: How in the world do we deal with the possible
6399		 overflow here?  */
6400	      offset_expr.X_add_number += 4;
6401	      macro_build (&offset_expr, "lw", "t,o(b)",
6402			   treg + 1, BFD_RELOC_LO16, AT);
6403	    }
6404	}
6405      break;
6406
6407    case M_LI_DD:
6408      /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6409         wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6410         bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6411         the value and the low order 32 bits are either zero or in
6412         OFFSET_EXPR.  */
6413      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6414	{
6415	  load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6416	  if (HAVE_64BIT_FPRS)
6417	    {
6418	      assert (HAVE_64BIT_GPRS);
6419	      macro_build (NULL, "dmtc1", "t,S", AT, treg);
6420	    }
6421	  else
6422	    {
6423	      macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6424	      if (offset_expr.X_op == O_absent)
6425		macro_build (NULL, "mtc1", "t,G", 0, treg);
6426	      else
6427		{
6428		  assert (offset_expr.X_op == O_constant);
6429		  load_register (AT, &offset_expr, 0);
6430		  macro_build (NULL, "mtc1", "t,G", AT, treg);
6431		}
6432	    }
6433	  break;
6434	}
6435
6436      assert (offset_expr.X_op == O_symbol
6437	      && offset_expr.X_add_number == 0);
6438      s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6439      if (strcmp (s, ".lit8") == 0)
6440	{
6441	  if (mips_opts.isa != ISA_MIPS1)
6442	    {
6443	      macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6444			   BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6445	      return;
6446	    }
6447	  breg = mips_gp_register;
6448	  r = BFD_RELOC_MIPS_LITERAL;
6449	  goto dob;
6450	}
6451      else
6452	{
6453	  assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6454	  if (mips_pic == SVR4_PIC)
6455	    macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6456			 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6457	  else
6458	    {
6459	      /* FIXME: This won't work for a 64 bit address.  */
6460	      macro_build_lui (&offset_expr, AT);
6461	    }
6462
6463	  if (mips_opts.isa != ISA_MIPS1)
6464	    {
6465	      macro_build (&offset_expr, "ldc1", "T,o(b)",
6466			   treg, BFD_RELOC_LO16, AT);
6467	      break;
6468	    }
6469	  breg = AT;
6470	  r = BFD_RELOC_LO16;
6471	  goto dob;
6472	}
6473
6474    case M_L_DOB:
6475      if (mips_opts.arch == CPU_R4650)
6476	{
6477	  as_bad (_("opcode not supported on this processor"));
6478	  return;
6479	}
6480      /* Even on a big endian machine $fn comes before $fn+1.  We have
6481	 to adjust when loading from memory.  */
6482      r = BFD_RELOC_LO16;
6483    dob:
6484      assert (mips_opts.isa == ISA_MIPS1);
6485      macro_build (&offset_expr, "lwc1", "T,o(b)",
6486		   target_big_endian ? treg + 1 : treg, r, breg);
6487      /* FIXME: A possible overflow which I don't know how to deal
6488	 with.  */
6489      offset_expr.X_add_number += 4;
6490      macro_build (&offset_expr, "lwc1", "T,o(b)",
6491		   target_big_endian ? treg : treg + 1, r, breg);
6492
6493      if (breg != AT)
6494	return;
6495      break;
6496
6497    case M_L_DAB:
6498      /*
6499       * The MIPS assembler seems to check for X_add_number not
6500       * being double aligned and generating:
6501       *	lui	at,%hi(foo+1)
6502       *	addu	at,at,v1
6503       *	addiu	at,at,%lo(foo+1)
6504       *	lwc1	f2,0(at)
6505       *	lwc1	f3,4(at)
6506       * But, the resulting address is the same after relocation so why
6507       * generate the extra instruction?
6508       */
6509      if (mips_opts.arch == CPU_R4650)
6510	{
6511	  as_bad (_("opcode not supported on this processor"));
6512	  return;
6513	}
6514      /* Itbl support may require additional care here.  */
6515      coproc = 1;
6516      if (mips_opts.isa != ISA_MIPS1)
6517	{
6518	  s = "ldc1";
6519	  goto ld;
6520	}
6521
6522      s = "lwc1";
6523      fmt = "T,o(b)";
6524      goto ldd_std;
6525
6526    case M_S_DAB:
6527      if (mips_opts.arch == CPU_R4650)
6528	{
6529	  as_bad (_("opcode not supported on this processor"));
6530	  return;
6531	}
6532
6533      if (mips_opts.isa != ISA_MIPS1)
6534	{
6535	  s = "sdc1";
6536	  goto st;
6537	}
6538
6539      s = "swc1";
6540      fmt = "T,o(b)";
6541      /* Itbl support may require additional care here.  */
6542      coproc = 1;
6543      goto ldd_std;
6544
6545    case M_LD_AB:
6546      if (HAVE_64BIT_GPRS)
6547	{
6548	  s = "ld";
6549	  goto ld;
6550	}
6551
6552      s = "lw";
6553      fmt = "t,o(b)";
6554      goto ldd_std;
6555
6556    case M_SD_AB:
6557      if (HAVE_64BIT_GPRS)
6558	{
6559	  s = "sd";
6560	  goto st;
6561	}
6562
6563      s = "sw";
6564      fmt = "t,o(b)";
6565
6566    ldd_std:
6567      /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6568	 loads for the case of doing a pair of loads to simulate an 'ld'.
6569	 This is not currently done by the compiler, and assembly coders
6570	 writing embedded-pic code can cope.  */
6571
6572      if (offset_expr.X_op != O_symbol
6573	  && offset_expr.X_op != O_constant)
6574	{
6575	  as_bad (_("expression too complex"));
6576	  offset_expr.X_op = O_constant;
6577	}
6578
6579      /* Even on a big endian machine $fn comes before $fn+1.  We have
6580	 to adjust when loading from memory.  We set coproc if we must
6581	 load $fn+1 first.  */
6582      /* Itbl support may require additional care here.  */
6583      if (! target_big_endian)
6584	coproc = 0;
6585
6586      if (mips_pic == NO_PIC
6587	  || offset_expr.X_op == O_constant)
6588	{
6589	  /* If this is a reference to a GP relative symbol, we want
6590	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6591	       <op>	$treg+1,<sym>+4($gp)	(BFD_RELOC_GPREL16)
6592	     If we have a base register, we use this
6593	       addu	$at,$breg,$gp
6594	       <op>	$treg,<sym>($at)	(BFD_RELOC_GPREL16)
6595	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_GPREL16)
6596	     If this is not a GP relative symbol, we want
6597	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6598	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
6599	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
6600	     If there is a base register, we add it to $at after the
6601	     lui instruction.  If there is a constant, we always use
6602	     the last case.  */
6603	  if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6604	      || nopic_need_relax (offset_expr.X_add_symbol, 1))
6605	    used_at = 1;
6606	  else
6607	    {
6608	      relax_start (offset_expr.X_add_symbol);
6609	      if (breg == 0)
6610		{
6611		  tempreg = mips_gp_register;
6612		  used_at = 0;
6613		}
6614	      else
6615		{
6616		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6617			       AT, breg, mips_gp_register);
6618		  tempreg = AT;
6619		  used_at = 1;
6620		}
6621
6622	      /* Itbl support may require additional care here.  */
6623	      macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6624			   BFD_RELOC_GPREL16, tempreg);
6625	      offset_expr.X_add_number += 4;
6626
6627	      /* Set mips_optimize to 2 to avoid inserting an
6628                 undesired nop.  */
6629	      hold_mips_optimize = mips_optimize;
6630	      mips_optimize = 2;
6631	      /* Itbl support may require additional care here.  */
6632	      macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6633			   BFD_RELOC_GPREL16, tempreg);
6634	      mips_optimize = hold_mips_optimize;
6635
6636	      relax_switch ();
6637
6638	      /* We just generated two relocs.  When tc_gen_reloc
6639		 handles this case, it will skip the first reloc and
6640		 handle the second.  The second reloc already has an
6641		 extra addend of 4, which we added above.  We must
6642		 subtract it out, and then subtract another 4 to make
6643		 the first reloc come out right.  The second reloc
6644		 will come out right because we are going to add 4 to
6645		 offset_expr when we build its instruction below.
6646
6647		 If we have a symbol, then we don't want to include
6648		 the offset, because it will wind up being included
6649		 when we generate the reloc.  */
6650
6651	      if (offset_expr.X_op == O_constant)
6652		offset_expr.X_add_number -= 8;
6653	      else
6654		{
6655		  offset_expr.X_add_number = -4;
6656		  offset_expr.X_op = O_constant;
6657		}
6658	    }
6659	  macro_build_lui (&offset_expr, AT);
6660	  if (breg != 0)
6661	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6662	  /* Itbl support may require additional care here.  */
6663	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6664		       BFD_RELOC_LO16, AT);
6665	  /* FIXME: How do we handle overflow here?  */
6666	  offset_expr.X_add_number += 4;
6667	  /* Itbl support may require additional care here.  */
6668	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6669		       BFD_RELOC_LO16, AT);
6670	  if (mips_relax.sequence)
6671	    relax_end ();
6672	}
6673      else if (mips_pic == SVR4_PIC && ! mips_big_got)
6674	{
6675	  /* If this is a reference to an external symbol, we want
6676	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6677	       nop
6678	       <op>	$treg,0($at)
6679	       <op>	$treg+1,4($at)
6680	     Otherwise we want
6681	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6682	       nop
6683	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
6684	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
6685	     If there is a base register we add it to $at before the
6686	     lwc1 instructions.  If there is a constant we include it
6687	     in the lwc1 instructions.  */
6688	  used_at = 1;
6689	  expr1.X_add_number = offset_expr.X_add_number;
6690	  if (expr1.X_add_number < -0x8000
6691	      || expr1.X_add_number >= 0x8000 - 4)
6692	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6693	  load_got_offset (AT, &offset_expr);
6694	  macro_build (NULL, "nop", "");
6695	  if (breg != 0)
6696	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6697
6698	  /* Set mips_optimize to 2 to avoid inserting an undesired
6699             nop.  */
6700	  hold_mips_optimize = mips_optimize;
6701	  mips_optimize = 2;
6702
6703	  /* Itbl support may require additional care here.  */
6704	  relax_start (offset_expr.X_add_symbol);
6705	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6706		       BFD_RELOC_LO16, AT);
6707	  expr1.X_add_number += 4;
6708	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6709		       BFD_RELOC_LO16, AT);
6710	  relax_switch ();
6711	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6712		       BFD_RELOC_LO16, AT);
6713	  offset_expr.X_add_number += 4;
6714	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6715		       BFD_RELOC_LO16, AT);
6716	  relax_end ();
6717
6718	  mips_optimize = hold_mips_optimize;
6719	}
6720      else if (mips_pic == SVR4_PIC)
6721	{
6722	  int gpdelay;
6723
6724	  /* If this is a reference to an external symbol, we want
6725	       lui	$at,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6726	       addu	$at,$at,$gp
6727	       lw	$at,<sym>($at)		(BFD_RELOC_MIPS_GOT_LO16)
6728	       nop
6729	       <op>	$treg,0($at)
6730	       <op>	$treg+1,4($at)
6731	     Otherwise we want
6732	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6733	       nop
6734	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
6735	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
6736	     If there is a base register we add it to $at before the
6737	     lwc1 instructions.  If there is a constant we include it
6738	     in the lwc1 instructions.  */
6739	  used_at = 1;
6740	  expr1.X_add_number = offset_expr.X_add_number;
6741	  offset_expr.X_add_number = 0;
6742	  if (expr1.X_add_number < -0x8000
6743	      || expr1.X_add_number >= 0x8000 - 4)
6744	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6745	  gpdelay = reg_needs_delay (mips_gp_register);
6746	  relax_start (offset_expr.X_add_symbol);
6747	  macro_build (&offset_expr, "lui", "t,u",
6748		       AT, BFD_RELOC_MIPS_GOT_HI16);
6749	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6750		       AT, AT, mips_gp_register);
6751	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6752		       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6753	  macro_build (NULL, "nop", "");
6754	  if (breg != 0)
6755	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6756	  /* Itbl support may require additional care here.  */
6757	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6758		       BFD_RELOC_LO16, AT);
6759	  expr1.X_add_number += 4;
6760
6761	  /* Set mips_optimize to 2 to avoid inserting an undesired
6762             nop.  */
6763	  hold_mips_optimize = mips_optimize;
6764	  mips_optimize = 2;
6765	  /* Itbl support may require additional care here.  */
6766	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6767		       BFD_RELOC_LO16, AT);
6768	  mips_optimize = hold_mips_optimize;
6769	  expr1.X_add_number -= 4;
6770
6771	  relax_switch ();
6772	  offset_expr.X_add_number = expr1.X_add_number;
6773	  if (gpdelay)
6774	    macro_build (NULL, "nop", "");
6775	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6776		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6777	  macro_build (NULL, "nop", "");
6778	  if (breg != 0)
6779	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6780	  /* Itbl support may require additional care here.  */
6781	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6782		       BFD_RELOC_LO16, AT);
6783	  offset_expr.X_add_number += 4;
6784
6785	  /* Set mips_optimize to 2 to avoid inserting an undesired
6786             nop.  */
6787	  hold_mips_optimize = mips_optimize;
6788	  mips_optimize = 2;
6789	  /* Itbl support may require additional care here.  */
6790	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6791		       BFD_RELOC_LO16, AT);
6792	  mips_optimize = hold_mips_optimize;
6793	  relax_end ();
6794	}
6795      else if (mips_pic == EMBEDDED_PIC)
6796	{
6797	  /* If there is no base register, we use
6798	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6799	       <op>	$treg+1,<sym>+4($gp)	(BFD_RELOC_GPREL16)
6800	     If we have a base register, we use
6801	       addu	$at,$breg,$gp
6802	       <op>	$treg,<sym>($at)	(BFD_RELOC_GPREL16)
6803	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_GPREL16)
6804	     */
6805	  if (breg == 0)
6806	    {
6807	      tempreg = mips_gp_register;
6808	      used_at = 0;
6809	    }
6810	  else
6811	    {
6812	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6813			   AT, breg, mips_gp_register);
6814	      tempreg = AT;
6815	      used_at = 1;
6816	    }
6817
6818	  /* Itbl support may require additional care here.  */
6819	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6820		       BFD_RELOC_GPREL16, tempreg);
6821	  offset_expr.X_add_number += 4;
6822	  /* Itbl support may require additional care here.  */
6823	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6824		       BFD_RELOC_GPREL16, tempreg);
6825	}
6826      else
6827	abort ();
6828
6829      if (! used_at)
6830	return;
6831
6832      break;
6833
6834    case M_LD_OB:
6835      s = "lw";
6836      goto sd_ob;
6837    case M_SD_OB:
6838      s = "sw";
6839    sd_ob:
6840      assert (HAVE_32BIT_ADDRESSES);
6841      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6842      offset_expr.X_add_number += 4;
6843      macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6844      return;
6845
6846   /* New code added to support COPZ instructions.
6847      This code builds table entries out of the macros in mip_opcodes.
6848      R4000 uses interlocks to handle coproc delays.
6849      Other chips (like the R3000) require nops to be inserted for delays.
6850
6851      FIXME: Currently, we require that the user handle delays.
6852      In order to fill delay slots for non-interlocked chips,
6853      we must have a way to specify delays based on the coprocessor.
6854      Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6855      What are the side-effects of the cop instruction?
6856      What cache support might we have and what are its effects?
6857      Both coprocessor & memory require delays. how long???
6858      What registers are read/set/modified?
6859
6860      If an itbl is provided to interpret cop instructions,
6861      this knowledge can be encoded in the itbl spec.  */
6862
6863    case M_COP0:
6864      s = "c0";
6865      goto copz;
6866    case M_COP1:
6867      s = "c1";
6868      goto copz;
6869    case M_COP2:
6870      s = "c2";
6871      goto copz;
6872    case M_COP3:
6873      s = "c3";
6874    copz:
6875      /* For now we just do C (same as Cz).  The parameter will be
6876         stored in insn_opcode by mips_ip.  */
6877      macro_build (NULL, s, "C", ip->insn_opcode);
6878      return;
6879
6880    case M_MOVE:
6881      move_register (dreg, sreg);
6882      return;
6883
6884#ifdef LOSING_COMPILER
6885    default:
6886      /* Try and see if this is a new itbl instruction.
6887         This code builds table entries out of the macros in mip_opcodes.
6888         FIXME: For now we just assemble the expression and pass it's
6889         value along as a 32-bit immediate.
6890         We may want to have the assembler assemble this value,
6891         so that we gain the assembler's knowledge of delay slots,
6892         symbols, etc.
6893         Would it be more efficient to use mask (id) here? */
6894      if (itbl_have_entries
6895	  && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6896	{
6897	  s = ip->insn_mo->name;
6898	  s2 = "cop3";
6899	  coproc = ITBL_DECODE_PNUM (immed_expr);;
6900	  macro_build (&immed_expr, s, "C");
6901	  return;
6902	}
6903      macro2 (ip);
6904      return;
6905    }
6906  if (mips_opts.noat)
6907    as_warn (_("Macro used $at after \".set noat\""));
6908}
6909
6910static void
6911macro2 (struct mips_cl_insn *ip)
6912{
6913  register int treg, sreg, dreg, breg;
6914  int tempreg;
6915  int mask;
6916  int used_at;
6917  expressionS expr1;
6918  const char *s;
6919  const char *s2;
6920  const char *fmt;
6921  int likely = 0;
6922  int dbl = 0;
6923  int coproc = 0;
6924  int lr = 0;
6925  int imm = 0;
6926  int off;
6927  offsetT maxnum;
6928  bfd_reloc_code_real_type r;
6929
6930  treg = (ip->insn_opcode >> 16) & 0x1f;
6931  dreg = (ip->insn_opcode >> 11) & 0x1f;
6932  sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6933  mask = ip->insn_mo->mask;
6934
6935  expr1.X_op = O_constant;
6936  expr1.X_op_symbol = NULL;
6937  expr1.X_add_symbol = NULL;
6938  expr1.X_add_number = 1;
6939
6940  switch (mask)
6941    {
6942#endif /* LOSING_COMPILER */
6943
6944    case M_DMUL:
6945      dbl = 1;
6946    case M_MUL:
6947      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6948      macro_build (NULL, "mflo", "d", dreg);
6949      return;
6950
6951    case M_DMUL_I:
6952      dbl = 1;
6953    case M_MUL_I:
6954      /* The MIPS assembler some times generates shifts and adds.  I'm
6955	 not trying to be that fancy. GCC should do this for us
6956	 anyway.  */
6957      load_register (AT, &imm_expr, dbl);
6958      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
6959      macro_build (NULL, "mflo", "d", dreg);
6960      break;
6961
6962    case M_DMULO_I:
6963      dbl = 1;
6964    case M_MULO_I:
6965      imm = 1;
6966      goto do_mulo;
6967
6968    case M_DMULO:
6969      dbl = 1;
6970    case M_MULO:
6971    do_mulo:
6972      mips_emit_delays (TRUE);
6973      ++mips_opts.noreorder;
6974      mips_any_noreorder = 1;
6975      if (imm)
6976	load_register (AT, &imm_expr, dbl);
6977      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6978      macro_build (NULL, "mflo", "d", dreg);
6979      macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
6980      macro_build (NULL, "mfhi", "d", AT);
6981      if (mips_trap)
6982	macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
6983      else
6984	{
6985	  expr1.X_add_number = 8;
6986	  macro_build (&expr1, "beq", "s,t,p", dreg, AT);
6987	  macro_build (NULL, "nop", "", 0);
6988	  macro_build (NULL, "break", "c", 6);
6989	}
6990      --mips_opts.noreorder;
6991      macro_build (NULL, "mflo", "d", dreg);
6992      break;
6993
6994    case M_DMULOU_I:
6995      dbl = 1;
6996    case M_MULOU_I:
6997      imm = 1;
6998      goto do_mulou;
6999
7000    case M_DMULOU:
7001      dbl = 1;
7002    case M_MULOU:
7003    do_mulou:
7004      mips_emit_delays (TRUE);
7005      ++mips_opts.noreorder;
7006      mips_any_noreorder = 1;
7007      if (imm)
7008	load_register (AT, &imm_expr, dbl);
7009      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7010		   sreg, imm ? AT : treg);
7011      macro_build (NULL, "mfhi", "d", AT);
7012      macro_build (NULL, "mflo", "d", dreg);
7013      if (mips_trap)
7014	macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7015      else
7016	{
7017	  expr1.X_add_number = 8;
7018	  macro_build (&expr1, "beq", "s,t,p", AT, 0);
7019	  macro_build (NULL, "nop", "", 0);
7020	  macro_build (NULL, "break", "c", 6);
7021	}
7022      --mips_opts.noreorder;
7023      break;
7024
7025    case M_DROL:
7026      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7027	{
7028	  if (dreg == sreg)
7029	    {
7030	      tempreg = AT;
7031	      used_at = 1;
7032	    }
7033	  else
7034	    {
7035	      tempreg = dreg;
7036	      used_at = 0;
7037	    }
7038	  macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7039	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7040	  if (used_at)
7041	    break;
7042	  return;
7043	}
7044      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7045      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7046      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7047      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7048      break;
7049
7050    case M_ROL:
7051      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7052	{
7053	  if (dreg == sreg)
7054	    {
7055	      tempreg = AT;
7056	      used_at = 1;
7057	    }
7058	  else
7059	    {
7060	      tempreg = dreg;
7061	      used_at = 0;
7062	    }
7063	  macro_build (NULL, "negu", "d,w", tempreg, treg);
7064	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7065	  if (used_at)
7066	    break;
7067	  return;
7068	}
7069      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7070      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7071      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7072      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7073      break;
7074
7075    case M_DROL_I:
7076      {
7077	unsigned int rot;
7078	char *l, *r;
7079
7080	if (imm_expr.X_op != O_constant)
7081	  as_bad (_("Improper rotate count"));
7082	rot = imm_expr.X_add_number & 0x3f;
7083	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7084	  {
7085	    rot = (64 - rot) & 0x3f;
7086	    if (rot >= 32)
7087	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7088	    else
7089	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7090	    return;
7091	  }
7092	if (rot == 0)
7093	  {
7094	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7095	    return;
7096	  }
7097	l = (rot < 0x20) ? "dsll" : "dsll32";
7098	r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7099	rot &= 0x1f;
7100	macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7101	macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7102	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7103      }
7104      break;
7105
7106    case M_ROL_I:
7107      {
7108	unsigned int rot;
7109
7110	if (imm_expr.X_op != O_constant)
7111	  as_bad (_("Improper rotate count"));
7112	rot = imm_expr.X_add_number & 0x1f;
7113	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7114	  {
7115	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7116	    return;
7117	  }
7118	if (rot == 0)
7119	  {
7120	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7121	    return;
7122	  }
7123	macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7124	macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7125	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7126      }
7127      break;
7128
7129    case M_DROR:
7130      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7131	{
7132	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7133	  return;
7134	}
7135      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7136      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7137      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7138      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7139      break;
7140
7141    case M_ROR:
7142      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7143	{
7144	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7145	  return;
7146	}
7147      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7148      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7149      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7150      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7151      break;
7152
7153    case M_DROR_I:
7154      {
7155	unsigned int rot;
7156	char *l, *r;
7157
7158	if (imm_expr.X_op != O_constant)
7159	  as_bad (_("Improper rotate count"));
7160	rot = imm_expr.X_add_number & 0x3f;
7161	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7162	  {
7163	    if (rot >= 32)
7164	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7165	    else
7166	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7167	    return;
7168	  }
7169	if (rot == 0)
7170	  {
7171	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7172	    return;
7173	  }
7174	r = (rot < 0x20) ? "dsrl" : "dsrl32";
7175	l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7176	rot &= 0x1f;
7177	macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7178	macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7179	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7180      }
7181      break;
7182
7183    case M_ROR_I:
7184      {
7185	unsigned int rot;
7186
7187	if (imm_expr.X_op != O_constant)
7188	  as_bad (_("Improper rotate count"));
7189	rot = imm_expr.X_add_number & 0x1f;
7190	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7191	  {
7192	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7193	    return;
7194	  }
7195	if (rot == 0)
7196	  {
7197	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7198	    return;
7199	  }
7200	macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7201	macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7202	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7203      }
7204      break;
7205
7206    case M_S_DOB:
7207      if (mips_opts.arch == CPU_R4650)
7208	{
7209	  as_bad (_("opcode not supported on this processor"));
7210	  return;
7211	}
7212      assert (mips_opts.isa == ISA_MIPS1);
7213      /* Even on a big endian machine $fn comes before $fn+1.  We have
7214	 to adjust when storing to memory.  */
7215      macro_build (&offset_expr, "swc1", "T,o(b)",
7216		   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7217      offset_expr.X_add_number += 4;
7218      macro_build (&offset_expr, "swc1", "T,o(b)",
7219		   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7220      return;
7221
7222    case M_SEQ:
7223      if (sreg == 0)
7224	macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7225      else if (treg == 0)
7226	macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7227      else
7228	{
7229	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7230	  macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7231	}
7232      return;
7233
7234    case M_SEQ_I:
7235      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7236	{
7237	  macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7238	  return;
7239	}
7240      if (sreg == 0)
7241	{
7242	  as_warn (_("Instruction %s: result is always false"),
7243		   ip->insn_mo->name);
7244	  move_register (dreg, 0);
7245	  return;
7246	}
7247      if (imm_expr.X_op == O_constant
7248	  && imm_expr.X_add_number >= 0
7249	  && imm_expr.X_add_number < 0x10000)
7250	{
7251	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7252	  used_at = 0;
7253	}
7254      else if (imm_expr.X_op == O_constant
7255	       && imm_expr.X_add_number > -0x8000
7256	       && imm_expr.X_add_number < 0)
7257	{
7258	  imm_expr.X_add_number = -imm_expr.X_add_number;
7259	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7260		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7261	  used_at = 0;
7262	}
7263      else
7264	{
7265	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7266	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7267	  used_at = 1;
7268	}
7269      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7270      if (used_at)
7271	break;
7272      return;
7273
7274    case M_SGE:		/* sreg >= treg <==> not (sreg < treg) */
7275      s = "slt";
7276      goto sge;
7277    case M_SGEU:
7278      s = "sltu";
7279    sge:
7280      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7281      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7282      return;
7283
7284    case M_SGE_I:		/* sreg >= I <==> not (sreg < I) */
7285    case M_SGEU_I:
7286      if (imm_expr.X_op == O_constant
7287	  && imm_expr.X_add_number >= -0x8000
7288	  && imm_expr.X_add_number < 0x8000)
7289	{
7290	  macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7291		       dreg, sreg, BFD_RELOC_LO16);
7292	  used_at = 0;
7293	}
7294      else
7295	{
7296	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7297	  macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7298		       dreg, sreg, AT);
7299	  used_at = 1;
7300	}
7301      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7302      if (used_at)
7303	break;
7304      return;
7305
7306    case M_SGT:		/* sreg > treg  <==>  treg < sreg */
7307      s = "slt";
7308      goto sgt;
7309    case M_SGTU:
7310      s = "sltu";
7311    sgt:
7312      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7313      return;
7314
7315    case M_SGT_I:		/* sreg > I  <==>  I < sreg */
7316      s = "slt";
7317      goto sgti;
7318    case M_SGTU_I:
7319      s = "sltu";
7320    sgti:
7321      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7322      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7323      break;
7324
7325    case M_SLE:	/* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7326      s = "slt";
7327      goto sle;
7328    case M_SLEU:
7329      s = "sltu";
7330    sle:
7331      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7332      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7333      return;
7334
7335    case M_SLE_I:	/* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7336      s = "slt";
7337      goto slei;
7338    case M_SLEU_I:
7339      s = "sltu";
7340    slei:
7341      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7342      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7343      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7344      break;
7345
7346    case M_SLT_I:
7347      if (imm_expr.X_op == O_constant
7348	  && imm_expr.X_add_number >= -0x8000
7349	  && imm_expr.X_add_number < 0x8000)
7350	{
7351	  macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7352	  return;
7353	}
7354      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7355      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7356      break;
7357
7358    case M_SLTU_I:
7359      if (imm_expr.X_op == O_constant
7360	  && imm_expr.X_add_number >= -0x8000
7361	  && imm_expr.X_add_number < 0x8000)
7362	{
7363	  macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7364		       BFD_RELOC_LO16);
7365	  return;
7366	}
7367      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7368      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7369      break;
7370
7371    case M_SNE:
7372      if (sreg == 0)
7373	macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7374      else if (treg == 0)
7375	macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7376      else
7377	{
7378	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7379	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7380	}
7381      return;
7382
7383    case M_SNE_I:
7384      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7385	{
7386	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7387	  return;
7388	}
7389      if (sreg == 0)
7390	{
7391	  as_warn (_("Instruction %s: result is always true"),
7392		   ip->insn_mo->name);
7393	  macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7394		       dreg, 0, BFD_RELOC_LO16);
7395	  return;
7396	}
7397      if (imm_expr.X_op == O_constant
7398	  && imm_expr.X_add_number >= 0
7399	  && imm_expr.X_add_number < 0x10000)
7400	{
7401	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7402	  used_at = 0;
7403	}
7404      else if (imm_expr.X_op == O_constant
7405	       && imm_expr.X_add_number > -0x8000
7406	       && imm_expr.X_add_number < 0)
7407	{
7408	  imm_expr.X_add_number = -imm_expr.X_add_number;
7409	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7410		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7411	  used_at = 0;
7412	}
7413      else
7414	{
7415	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7416	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7417	  used_at = 1;
7418	}
7419      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7420      if (used_at)
7421	break;
7422      return;
7423
7424    case M_DSUB_I:
7425      dbl = 1;
7426    case M_SUB_I:
7427      if (imm_expr.X_op == O_constant
7428	  && imm_expr.X_add_number > -0x8000
7429	  && imm_expr.X_add_number <= 0x8000)
7430	{
7431	  imm_expr.X_add_number = -imm_expr.X_add_number;
7432	  macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7433		       dreg, sreg, BFD_RELOC_LO16);
7434	  return;
7435	}
7436      load_register (AT, &imm_expr, dbl);
7437      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7438      break;
7439
7440    case M_DSUBU_I:
7441      dbl = 1;
7442    case M_SUBU_I:
7443      if (imm_expr.X_op == O_constant
7444	  && imm_expr.X_add_number > -0x8000
7445	  && imm_expr.X_add_number <= 0x8000)
7446	{
7447	  imm_expr.X_add_number = -imm_expr.X_add_number;
7448	  macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7449		       dreg, sreg, BFD_RELOC_LO16);
7450	  return;
7451	}
7452      load_register (AT, &imm_expr, dbl);
7453      macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7454      break;
7455
7456    case M_TEQ_I:
7457      s = "teq";
7458      goto trap;
7459    case M_TGE_I:
7460      s = "tge";
7461      goto trap;
7462    case M_TGEU_I:
7463      s = "tgeu";
7464      goto trap;
7465    case M_TLT_I:
7466      s = "tlt";
7467      goto trap;
7468    case M_TLTU_I:
7469      s = "tltu";
7470      goto trap;
7471    case M_TNE_I:
7472      s = "tne";
7473    trap:
7474      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7475      macro_build (NULL, s, "s,t", sreg, AT);
7476      break;
7477
7478    case M_TRUNCWS:
7479    case M_TRUNCWD:
7480      assert (mips_opts.isa == ISA_MIPS1);
7481      sreg = (ip->insn_opcode >> 11) & 0x1f;	/* floating reg */
7482      dreg = (ip->insn_opcode >> 06) & 0x1f;	/* floating reg */
7483
7484      /*
7485       * Is the double cfc1 instruction a bug in the mips assembler;
7486       * or is there a reason for it?
7487       */
7488      mips_emit_delays (TRUE);
7489      ++mips_opts.noreorder;
7490      mips_any_noreorder = 1;
7491      macro_build (NULL, "cfc1", "t,G", treg, RA);
7492      macro_build (NULL, "cfc1", "t,G", treg, RA);
7493      macro_build (NULL, "nop", "");
7494      expr1.X_add_number = 3;
7495      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7496      expr1.X_add_number = 2;
7497      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7498      macro_build (NULL, "ctc1", "t,G", AT, RA);
7499      macro_build (NULL, "nop", "");
7500      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7501		   dreg, sreg);
7502      macro_build (NULL, "ctc1", "t,G", treg, RA);
7503      macro_build (NULL, "nop", "");
7504      --mips_opts.noreorder;
7505      break;
7506
7507    case M_ULH:
7508      s = "lb";
7509      goto ulh;
7510    case M_ULHU:
7511      s = "lbu";
7512    ulh:
7513      if (offset_expr.X_add_number >= 0x7fff)
7514	as_bad (_("operand overflow"));
7515      if (! target_big_endian)
7516	++offset_expr.X_add_number;
7517      macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7518      if (! target_big_endian)
7519	--offset_expr.X_add_number;
7520      else
7521	++offset_expr.X_add_number;
7522      macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7523      macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7524      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7525      break;
7526
7527    case M_ULD:
7528      s = "ldl";
7529      s2 = "ldr";
7530      off = 7;
7531      goto ulw;
7532    case M_ULW:
7533      s = "lwl";
7534      s2 = "lwr";
7535      off = 3;
7536    ulw:
7537      if (offset_expr.X_add_number >= 0x8000 - off)
7538	as_bad (_("operand overflow"));
7539      if (treg != breg)
7540	tempreg = treg;
7541      else
7542	tempreg = AT;
7543      if (! target_big_endian)
7544	offset_expr.X_add_number += off;
7545      macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7546      if (! target_big_endian)
7547	offset_expr.X_add_number -= off;
7548      else
7549	offset_expr.X_add_number += off;
7550      macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7551
7552      /* If necessary, move the result in tempreg the final destination.  */
7553      if (treg == tempreg)
7554        return;
7555      /* Protect second load's delay slot.  */
7556      if (!gpr_interlocks)
7557	macro_build (NULL, "nop", "");
7558      move_register (treg, tempreg);
7559      break;
7560
7561    case M_ULD_A:
7562      s = "ldl";
7563      s2 = "ldr";
7564      off = 7;
7565      goto ulwa;
7566    case M_ULW_A:
7567      s = "lwl";
7568      s2 = "lwr";
7569      off = 3;
7570    ulwa:
7571      used_at = 1;
7572      load_address (AT, &offset_expr, &used_at);
7573      if (breg != 0)
7574	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7575      if (! target_big_endian)
7576	expr1.X_add_number = off;
7577      else
7578	expr1.X_add_number = 0;
7579      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7580      if (! target_big_endian)
7581	expr1.X_add_number = 0;
7582      else
7583	expr1.X_add_number = off;
7584      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7585      break;
7586
7587    case M_ULH_A:
7588    case M_ULHU_A:
7589      used_at = 1;
7590      load_address (AT, &offset_expr, &used_at);
7591      if (breg != 0)
7592	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7593      if (target_big_endian)
7594	expr1.X_add_number = 0;
7595      macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7596		   treg, BFD_RELOC_LO16, AT);
7597      if (target_big_endian)
7598	expr1.X_add_number = 1;
7599      else
7600	expr1.X_add_number = 0;
7601      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7602      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7603      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7604      break;
7605
7606    case M_USH:
7607      if (offset_expr.X_add_number >= 0x7fff)
7608	as_bad (_("operand overflow"));
7609      if (target_big_endian)
7610	++offset_expr.X_add_number;
7611      macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7612      macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7613      if (target_big_endian)
7614	--offset_expr.X_add_number;
7615      else
7616	++offset_expr.X_add_number;
7617      macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7618      break;
7619
7620    case M_USD:
7621      s = "sdl";
7622      s2 = "sdr";
7623      off = 7;
7624      goto usw;
7625    case M_USW:
7626      s = "swl";
7627      s2 = "swr";
7628      off = 3;
7629    usw:
7630      if (offset_expr.X_add_number >= 0x8000 - off)
7631	as_bad (_("operand overflow"));
7632      if (! target_big_endian)
7633	offset_expr.X_add_number += off;
7634      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7635      if (! target_big_endian)
7636	offset_expr.X_add_number -= off;
7637      else
7638	offset_expr.X_add_number += off;
7639      macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7640      return;
7641
7642    case M_USD_A:
7643      s = "sdl";
7644      s2 = "sdr";
7645      off = 7;
7646      goto uswa;
7647    case M_USW_A:
7648      s = "swl";
7649      s2 = "swr";
7650      off = 3;
7651    uswa:
7652      used_at = 1;
7653      load_address (AT, &offset_expr, &used_at);
7654      if (breg != 0)
7655	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7656      if (! target_big_endian)
7657	expr1.X_add_number = off;
7658      else
7659	expr1.X_add_number = 0;
7660      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7661      if (! target_big_endian)
7662	expr1.X_add_number = 0;
7663      else
7664	expr1.X_add_number = off;
7665      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7666      break;
7667
7668    case M_USH_A:
7669      used_at = 1;
7670      load_address (AT, &offset_expr, &used_at);
7671      if (breg != 0)
7672	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7673      if (! target_big_endian)
7674	expr1.X_add_number = 0;
7675      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7676      macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7677      if (! target_big_endian)
7678	expr1.X_add_number = 1;
7679      else
7680	expr1.X_add_number = 0;
7681      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7682      if (! target_big_endian)
7683	expr1.X_add_number = 0;
7684      else
7685	expr1.X_add_number = 1;
7686      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7687      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7688      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7689      break;
7690
7691    default:
7692      /* FIXME: Check if this is one of the itbl macros, since they
7693	 are added dynamically.  */
7694      as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7695      break;
7696    }
7697  if (mips_opts.noat)
7698    as_warn (_("Macro used $at after \".set noat\""));
7699}
7700
7701/* Implement macros in mips16 mode.  */
7702
7703static void
7704mips16_macro (struct mips_cl_insn *ip)
7705{
7706  int mask;
7707  int xreg, yreg, zreg, tmp;
7708  expressionS expr1;
7709  int dbl;
7710  const char *s, *s2, *s3;
7711
7712  mask = ip->insn_mo->mask;
7713
7714  xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7715  yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7716  zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7717
7718  expr1.X_op = O_constant;
7719  expr1.X_op_symbol = NULL;
7720  expr1.X_add_symbol = NULL;
7721  expr1.X_add_number = 1;
7722
7723  dbl = 0;
7724
7725  switch (mask)
7726    {
7727    default:
7728      internalError ();
7729
7730    case M_DDIV_3:
7731      dbl = 1;
7732    case M_DIV_3:
7733      s = "mflo";
7734      goto do_div3;
7735    case M_DREM_3:
7736      dbl = 1;
7737    case M_REM_3:
7738      s = "mfhi";
7739    do_div3:
7740      mips_emit_delays (TRUE);
7741      ++mips_opts.noreorder;
7742      mips_any_noreorder = 1;
7743      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7744      expr1.X_add_number = 2;
7745      macro_build (&expr1, "bnez", "x,p", yreg);
7746      macro_build (NULL, "break", "6", 7);
7747
7748      /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7749         since that causes an overflow.  We should do that as well,
7750         but I don't see how to do the comparisons without a temporary
7751         register.  */
7752      --mips_opts.noreorder;
7753      macro_build (NULL, s, "x", zreg);
7754      break;
7755
7756    case M_DIVU_3:
7757      s = "divu";
7758      s2 = "mflo";
7759      goto do_divu3;
7760    case M_REMU_3:
7761      s = "divu";
7762      s2 = "mfhi";
7763      goto do_divu3;
7764    case M_DDIVU_3:
7765      s = "ddivu";
7766      s2 = "mflo";
7767      goto do_divu3;
7768    case M_DREMU_3:
7769      s = "ddivu";
7770      s2 = "mfhi";
7771    do_divu3:
7772      mips_emit_delays (TRUE);
7773      ++mips_opts.noreorder;
7774      mips_any_noreorder = 1;
7775      macro_build (NULL, s, "0,x,y", xreg, yreg);
7776      expr1.X_add_number = 2;
7777      macro_build (&expr1, "bnez", "x,p", yreg);
7778      macro_build (NULL, "break", "6", 7);
7779      --mips_opts.noreorder;
7780      macro_build (NULL, s2, "x", zreg);
7781      break;
7782
7783    case M_DMUL:
7784      dbl = 1;
7785    case M_MUL:
7786      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7787      macro_build (NULL, "mflo", "x", zreg);
7788      return;
7789
7790    case M_DSUBU_I:
7791      dbl = 1;
7792      goto do_subu;
7793    case M_SUBU_I:
7794    do_subu:
7795      if (imm_expr.X_op != O_constant)
7796	as_bad (_("Unsupported large constant"));
7797      imm_expr.X_add_number = -imm_expr.X_add_number;
7798      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7799      break;
7800
7801    case M_SUBU_I_2:
7802      if (imm_expr.X_op != O_constant)
7803	as_bad (_("Unsupported large constant"));
7804      imm_expr.X_add_number = -imm_expr.X_add_number;
7805      macro_build (&imm_expr, "addiu", "x,k", xreg);
7806      break;
7807
7808    case M_DSUBU_I_2:
7809      if (imm_expr.X_op != O_constant)
7810	as_bad (_("Unsupported large constant"));
7811      imm_expr.X_add_number = -imm_expr.X_add_number;
7812      macro_build (&imm_expr, "daddiu", "y,j", yreg);
7813      break;
7814
7815    case M_BEQ:
7816      s = "cmp";
7817      s2 = "bteqz";
7818      goto do_branch;
7819    case M_BNE:
7820      s = "cmp";
7821      s2 = "btnez";
7822      goto do_branch;
7823    case M_BLT:
7824      s = "slt";
7825      s2 = "btnez";
7826      goto do_branch;
7827    case M_BLTU:
7828      s = "sltu";
7829      s2 = "btnez";
7830      goto do_branch;
7831    case M_BLE:
7832      s = "slt";
7833      s2 = "bteqz";
7834      goto do_reverse_branch;
7835    case M_BLEU:
7836      s = "sltu";
7837      s2 = "bteqz";
7838      goto do_reverse_branch;
7839    case M_BGE:
7840      s = "slt";
7841      s2 = "bteqz";
7842      goto do_branch;
7843    case M_BGEU:
7844      s = "sltu";
7845      s2 = "bteqz";
7846      goto do_branch;
7847    case M_BGT:
7848      s = "slt";
7849      s2 = "btnez";
7850      goto do_reverse_branch;
7851    case M_BGTU:
7852      s = "sltu";
7853      s2 = "btnez";
7854
7855    do_reverse_branch:
7856      tmp = xreg;
7857      xreg = yreg;
7858      yreg = tmp;
7859
7860    do_branch:
7861      macro_build (NULL, s, "x,y", xreg, yreg);
7862      macro_build (&offset_expr, s2, "p");
7863      break;
7864
7865    case M_BEQ_I:
7866      s = "cmpi";
7867      s2 = "bteqz";
7868      s3 = "x,U";
7869      goto do_branch_i;
7870    case M_BNE_I:
7871      s = "cmpi";
7872      s2 = "btnez";
7873      s3 = "x,U";
7874      goto do_branch_i;
7875    case M_BLT_I:
7876      s = "slti";
7877      s2 = "btnez";
7878      s3 = "x,8";
7879      goto do_branch_i;
7880    case M_BLTU_I:
7881      s = "sltiu";
7882      s2 = "btnez";
7883      s3 = "x,8";
7884      goto do_branch_i;
7885    case M_BLE_I:
7886      s = "slti";
7887      s2 = "btnez";
7888      s3 = "x,8";
7889      goto do_addone_branch_i;
7890    case M_BLEU_I:
7891      s = "sltiu";
7892      s2 = "btnez";
7893      s3 = "x,8";
7894      goto do_addone_branch_i;
7895    case M_BGE_I:
7896      s = "slti";
7897      s2 = "bteqz";
7898      s3 = "x,8";
7899      goto do_branch_i;
7900    case M_BGEU_I:
7901      s = "sltiu";
7902      s2 = "bteqz";
7903      s3 = "x,8";
7904      goto do_branch_i;
7905    case M_BGT_I:
7906      s = "slti";
7907      s2 = "bteqz";
7908      s3 = "x,8";
7909      goto do_addone_branch_i;
7910    case M_BGTU_I:
7911      s = "sltiu";
7912      s2 = "bteqz";
7913      s3 = "x,8";
7914
7915    do_addone_branch_i:
7916      if (imm_expr.X_op != O_constant)
7917	as_bad (_("Unsupported large constant"));
7918      ++imm_expr.X_add_number;
7919
7920    do_branch_i:
7921      macro_build (&imm_expr, s, s3, xreg);
7922      macro_build (&offset_expr, s2, "p");
7923      break;
7924
7925    case M_ABS:
7926      expr1.X_add_number = 0;
7927      macro_build (&expr1, "slti", "x,8", yreg);
7928      if (xreg != yreg)
7929	move_register (xreg, yreg);
7930      expr1.X_add_number = 2;
7931      macro_build (&expr1, "bteqz", "p");
7932      macro_build (NULL, "neg", "x,w", xreg, xreg);
7933    }
7934}
7935
7936/* For consistency checking, verify that all bits are specified either
7937   by the match/mask part of the instruction definition, or by the
7938   operand list.  */
7939static int
7940validate_mips_insn (const struct mips_opcode *opc)
7941{
7942  const char *p = opc->args;
7943  char c;
7944  unsigned long used_bits = opc->mask;
7945
7946  if ((used_bits & opc->match) != opc->match)
7947    {
7948      as_bad (_("internal: bad mips opcode (mask error): %s %s"),
7949	      opc->name, opc->args);
7950      return 0;
7951    }
7952#define USE_BITS(mask,shift)	(used_bits |= ((mask) << (shift)))
7953  while (*p)
7954    switch (c = *p++)
7955      {
7956      case ',': break;
7957      case '(': break;
7958      case ')': break;
7959      case '+':
7960    	switch (c = *p++)
7961	  {
7962	  case 'A': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
7963	  case 'B': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
7964	  case 'C': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
7965	  case 'D': USE_BITS (OP_MASK_RD,	OP_SH_RD);
7966		    USE_BITS (OP_MASK_SEL,	OP_SH_SEL);	break;
7967	  case 'E': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
7968	  case 'F': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
7969	  case 'G': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
7970	  case 'H': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
7971	  case 'I': break;
7972	  default:
7973	    as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
7974		    c, opc->name, opc->args);
7975	    return 0;
7976	  }
7977	break;
7978      case '<': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
7979      case '>':	USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
7980      case 'A': break;
7981      case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
7982      case 'C':	USE_BITS (OP_MASK_COPZ,		OP_SH_COPZ);	break;
7983      case 'D':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
7984      case 'E':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
7985      case 'F': break;
7986      case 'G':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
7987      case 'H': USE_BITS (OP_MASK_SEL,		OP_SH_SEL);	break;
7988      case 'I': break;
7989      case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
7990      case 'K':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
7991      case 'L': break;
7992      case 'M':	USE_BITS (OP_MASK_CCC,		OP_SH_CCC);	break;
7993      case 'N':	USE_BITS (OP_MASK_BCC,		OP_SH_BCC);	break;
7994      case 'O':	USE_BITS (OP_MASK_ALN,		OP_SH_ALN);	break;
7995      case 'Q':	USE_BITS (OP_MASK_VSEL,		OP_SH_VSEL);
7996		USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
7997      case 'R':	USE_BITS (OP_MASK_FR,		OP_SH_FR);	break;
7998      case 'S':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
7999      case 'T':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8000      case 'V':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8001      case 'W':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8002      case 'X':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
8003      case 'Y':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8004      case 'Z':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8005      case 'a':	USE_BITS (OP_MASK_TARGET,	OP_SH_TARGET);	break;
8006      case 'b':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8007      case 'c':	USE_BITS (OP_MASK_CODE,		OP_SH_CODE);	break;
8008      case 'd':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8009      case 'f': break;
8010      case 'h':	USE_BITS (OP_MASK_PREFX,	OP_SH_PREFX);	break;
8011      case 'i':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8012      case 'j':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8013      case 'k':	USE_BITS (OP_MASK_CACHE,	OP_SH_CACHE);	break;
8014      case 'l': break;
8015      case 'o': USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8016      case 'p':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8017      case 'q':	USE_BITS (OP_MASK_CODE2,	OP_SH_CODE2);	break;
8018      case 'r': USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8019      case 's':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8020      case 't':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8021      case 'u':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8022      case 'v':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8023      case 'w':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8024      case 'x': break;
8025      case 'z': break;
8026      case 'P': USE_BITS (OP_MASK_PERFREG,	OP_SH_PERFREG);	break;
8027      case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8028	        USE_BITS (OP_MASK_RT,           OP_SH_RT);	break;
8029      case 'e': USE_BITS (OP_MASK_VECBYTE,	OP_SH_VECBYTE);	break;
8030      case '%': USE_BITS (OP_MASK_VECALIGN,	OP_SH_VECALIGN); break;
8031      case '[': break;
8032      case ']': break;
8033      default:
8034	as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8035		c, opc->name, opc->args);
8036	return 0;
8037      }
8038#undef USE_BITS
8039  if (used_bits != 0xffffffff)
8040    {
8041      as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8042	      ~used_bits & 0xffffffff, opc->name, opc->args);
8043      return 0;
8044    }
8045  return 1;
8046}
8047
8048/* This routine assembles an instruction into its binary format.  As a
8049   side effect, it sets one of the global variables imm_reloc or
8050   offset_reloc to the type of relocation to do if one of the operands
8051   is an address expression.  */
8052
8053static void
8054mips_ip (char *str, struct mips_cl_insn *ip)
8055{
8056  char *s;
8057  const char *args;
8058  char c = 0;
8059  struct mips_opcode *insn;
8060  char *argsStart;
8061  unsigned int regno;
8062  unsigned int lastregno = 0;
8063  unsigned int lastpos = 0;
8064  unsigned int limlo, limhi;
8065  char *s_reset;
8066  char save_c = 0;
8067
8068  insn_error = NULL;
8069
8070  /* If the instruction contains a '.', we first try to match an instruction
8071     including the '.'.  Then we try again without the '.'.  */
8072  insn = NULL;
8073  for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8074    continue;
8075
8076  /* If we stopped on whitespace, then replace the whitespace with null for
8077     the call to hash_find.  Save the character we replaced just in case we
8078     have to re-parse the instruction.  */
8079  if (ISSPACE (*s))
8080    {
8081      save_c = *s;
8082      *s++ = '\0';
8083    }
8084
8085  insn = (struct mips_opcode *) hash_find (op_hash, str);
8086
8087  /* If we didn't find the instruction in the opcode table, try again, but
8088     this time with just the instruction up to, but not including the
8089     first '.'.  */
8090  if (insn == NULL)
8091    {
8092      /* Restore the character we overwrite above (if any).  */
8093      if (save_c)
8094	*(--s) = save_c;
8095
8096      /* Scan up to the first '.' or whitespace.  */
8097      for (s = str;
8098	   *s != '\0' && *s != '.' && !ISSPACE (*s);
8099	   ++s)
8100	continue;
8101
8102      /* If we did not find a '.', then we can quit now.  */
8103      if (*s != '.')
8104	{
8105	  insn_error = "unrecognized opcode";
8106	  return;
8107	}
8108
8109      /* Lookup the instruction in the hash table.  */
8110      *s++ = '\0';
8111      if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8112	{
8113	  insn_error = "unrecognized opcode";
8114	  return;
8115	}
8116    }
8117
8118  argsStart = s;
8119  for (;;)
8120    {
8121      bfd_boolean ok;
8122
8123      assert (strcmp (insn->name, str) == 0);
8124
8125      if (OPCODE_IS_MEMBER (insn,
8126			    (mips_opts.isa
8127			     | (file_ase_mips16 ? INSN_MIPS16 : 0)
8128	      		     | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8129			     | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8130			    mips_opts.arch))
8131	ok = TRUE;
8132      else
8133	ok = FALSE;
8134
8135      if (insn->pinfo != INSN_MACRO)
8136	{
8137	  if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8138	    ok = FALSE;
8139	}
8140
8141      if (! ok)
8142	{
8143	  if (insn + 1 < &mips_opcodes[NUMOPCODES]
8144	      && strcmp (insn->name, insn[1].name) == 0)
8145	    {
8146	      ++insn;
8147	      continue;
8148	    }
8149	  else
8150	    {
8151	      if (!insn_error)
8152		{
8153		  static char buf[100];
8154		  sprintf (buf,
8155			   _("opcode not supported on this processor: %s (%s)"),
8156			   mips_cpu_info_from_arch (mips_opts.arch)->name,
8157			   mips_cpu_info_from_isa (mips_opts.isa)->name);
8158		  insn_error = buf;
8159		}
8160	      if (save_c)
8161		*(--s) = save_c;
8162	      return;
8163	    }
8164	}
8165
8166      ip->insn_mo = insn;
8167      ip->insn_opcode = insn->match;
8168      insn_error = NULL;
8169      for (args = insn->args;; ++args)
8170	{
8171	  int is_mdmx;
8172
8173	  s += strspn (s, " \t");
8174	  is_mdmx = 0;
8175	  switch (*args)
8176	    {
8177	    case '\0':		/* end of args */
8178	      if (*s == '\0')
8179		return;
8180	      break;
8181
8182	    case ',':
8183	      if (*s++ == *args)
8184		continue;
8185	      s--;
8186	      switch (*++args)
8187		{
8188		case 'r':
8189		case 'v':
8190		  ip->insn_opcode |= lastregno << OP_SH_RS;
8191		  continue;
8192
8193		case 'w':
8194		  ip->insn_opcode |= lastregno << OP_SH_RT;
8195		  continue;
8196
8197		case 'W':
8198		  ip->insn_opcode |= lastregno << OP_SH_FT;
8199		  continue;
8200
8201		case 'V':
8202		  ip->insn_opcode |= lastregno << OP_SH_FS;
8203		  continue;
8204		}
8205	      break;
8206
8207	    case '(':
8208	      /* Handle optional base register.
8209		 Either the base register is omitted or
8210		 we must have a left paren.  */
8211	      /* This is dependent on the next operand specifier
8212		 is a base register specification.  */
8213	      assert (args[1] == 'b' || args[1] == '5'
8214		      || args[1] == '-' || args[1] == '4');
8215	      if (*s == '\0')
8216		return;
8217
8218	    case ')':		/* these must match exactly */
8219	    case '[':
8220	    case ']':
8221	      if (*s++ == *args)
8222		continue;
8223	      break;
8224
8225	    case '+':		/* Opcode extension character.  */
8226	      switch (*++args)
8227		{
8228		case 'A':		/* ins/ext position, becomes LSB.  */
8229		  limlo = 0;
8230		  limhi = 31;
8231		  goto do_lsb;
8232		case 'E':
8233		  limlo = 32;
8234		  limhi = 63;
8235		  goto do_lsb;
8236do_lsb:
8237		  my_getExpression (&imm_expr, s);
8238		  check_absolute_expr (ip, &imm_expr);
8239		  if ((unsigned long) imm_expr.X_add_number < limlo
8240		      || (unsigned long) imm_expr.X_add_number > limhi)
8241		    {
8242		      as_bad (_("Improper position (%lu)"),
8243			      (unsigned long) imm_expr.X_add_number);
8244		      imm_expr.X_add_number = limlo;
8245		    }
8246		  lastpos = imm_expr.X_add_number;
8247		  ip->insn_opcode |= (imm_expr.X_add_number
8248				      & OP_MASK_SHAMT) << OP_SH_SHAMT;
8249		  imm_expr.X_op = O_absent;
8250		  s = expr_end;
8251		  continue;
8252
8253		case 'B':		/* ins size, becomes MSB.  */
8254		  limlo = 1;
8255		  limhi = 32;
8256		  goto do_msb;
8257		case 'F':
8258		  limlo = 33;
8259		  limhi = 64;
8260		  goto do_msb;
8261do_msb:
8262		  my_getExpression (&imm_expr, s);
8263		  check_absolute_expr (ip, &imm_expr);
8264		  /* Check for negative input so that small negative numbers
8265		     will not succeed incorrectly.  The checks against
8266		     (pos+size) transitively check "size" itself,
8267		     assuming that "pos" is reasonable.  */
8268		  if ((long) imm_expr.X_add_number < 0
8269		      || ((unsigned long) imm_expr.X_add_number
8270			  + lastpos) < limlo
8271		      || ((unsigned long) imm_expr.X_add_number
8272			  + lastpos) > limhi)
8273		    {
8274		      as_bad (_("Improper insert size (%lu, position %lu)"),
8275			      (unsigned long) imm_expr.X_add_number,
8276			      (unsigned long) lastpos);
8277		      imm_expr.X_add_number = limlo - lastpos;
8278		    }
8279		  ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8280				      & OP_MASK_INSMSB) << OP_SH_INSMSB;
8281		  imm_expr.X_op = O_absent;
8282		  s = expr_end;
8283		  continue;
8284
8285		case 'C':		/* ext size, becomes MSBD.  */
8286		  limlo = 1;
8287		  limhi = 32;
8288		  goto do_msbd;
8289		case 'G':
8290		  limlo = 33;
8291		  limhi = 64;
8292		  goto do_msbd;
8293		case 'H':
8294		  limlo = 33;
8295		  limhi = 64;
8296		  goto do_msbd;
8297do_msbd:
8298		  my_getExpression (&imm_expr, s);
8299		  check_absolute_expr (ip, &imm_expr);
8300		  /* Check for negative input so that small negative numbers
8301		     will not succeed incorrectly.  The checks against
8302		     (pos+size) transitively check "size" itself,
8303		     assuming that "pos" is reasonable.  */
8304		  if ((long) imm_expr.X_add_number < 0
8305		      || ((unsigned long) imm_expr.X_add_number
8306			  + lastpos) < limlo
8307		      || ((unsigned long) imm_expr.X_add_number
8308			  + lastpos) > limhi)
8309		    {
8310		      as_bad (_("Improper extract size (%lu, position %lu)"),
8311			      (unsigned long) imm_expr.X_add_number,
8312			      (unsigned long) lastpos);
8313		      imm_expr.X_add_number = limlo - lastpos;
8314		    }
8315		  ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8316				      & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8317		  imm_expr.X_op = O_absent;
8318		  s = expr_end;
8319		  continue;
8320
8321		case 'D':
8322		  /* +D is for disassembly only; never match.  */
8323		  break;
8324
8325		case 'I':
8326		  /* "+I" is like "I", except that imm2_expr is used.  */
8327		  my_getExpression (&imm2_expr, s);
8328		  if (imm2_expr.X_op != O_big
8329		      && imm2_expr.X_op != O_constant)
8330		  insn_error = _("absolute expression required");
8331		  normalize_constant_expr (&imm2_expr);
8332		  s = expr_end;
8333		  continue;
8334
8335		default:
8336		  as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8337		    *args, insn->name, insn->args);
8338		  /* Further processing is fruitless.  */
8339		  return;
8340		}
8341	      break;
8342
8343	    case '<':		/* must be at least one digit */
8344	      /*
8345	       * According to the manual, if the shift amount is greater
8346	       * than 31 or less than 0, then the shift amount should be
8347	       * mod 32.  In reality the mips assembler issues an error.
8348	       * We issue a warning and mask out all but the low 5 bits.
8349	       */
8350	      my_getExpression (&imm_expr, s);
8351	      check_absolute_expr (ip, &imm_expr);
8352	      if ((unsigned long) imm_expr.X_add_number > 31)
8353		{
8354		  as_warn (_("Improper shift amount (%lu)"),
8355			   (unsigned long) imm_expr.X_add_number);
8356		  imm_expr.X_add_number &= OP_MASK_SHAMT;
8357		}
8358	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8359	      imm_expr.X_op = O_absent;
8360	      s = expr_end;
8361	      continue;
8362
8363	    case '>':		/* shift amount minus 32 */
8364	      my_getExpression (&imm_expr, s);
8365	      check_absolute_expr (ip, &imm_expr);
8366	      if ((unsigned long) imm_expr.X_add_number < 32
8367		  || (unsigned long) imm_expr.X_add_number > 63)
8368		break;
8369	      ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8370	      imm_expr.X_op = O_absent;
8371	      s = expr_end;
8372	      continue;
8373
8374	    case 'k':		/* cache code */
8375	    case 'h':		/* prefx code */
8376	      my_getExpression (&imm_expr, s);
8377	      check_absolute_expr (ip, &imm_expr);
8378	      if ((unsigned long) imm_expr.X_add_number > 31)
8379		{
8380		  as_warn (_("Invalid value for `%s' (%lu)"),
8381			   ip->insn_mo->name,
8382			   (unsigned long) imm_expr.X_add_number);
8383		  imm_expr.X_add_number &= 0x1f;
8384		}
8385	      if (*args == 'k')
8386		ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8387	      else
8388		ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8389	      imm_expr.X_op = O_absent;
8390	      s = expr_end;
8391	      continue;
8392
8393	    case 'c':		/* break code */
8394	      my_getExpression (&imm_expr, s);
8395	      check_absolute_expr (ip, &imm_expr);
8396	      if ((unsigned long) imm_expr.X_add_number > 1023)
8397		{
8398		  as_warn (_("Illegal break code (%lu)"),
8399			   (unsigned long) imm_expr.X_add_number);
8400		  imm_expr.X_add_number &= OP_MASK_CODE;
8401		}
8402	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8403	      imm_expr.X_op = O_absent;
8404	      s = expr_end;
8405	      continue;
8406
8407	    case 'q':		/* lower break code */
8408	      my_getExpression (&imm_expr, s);
8409	      check_absolute_expr (ip, &imm_expr);
8410	      if ((unsigned long) imm_expr.X_add_number > 1023)
8411		{
8412		  as_warn (_("Illegal lower break code (%lu)"),
8413			   (unsigned long) imm_expr.X_add_number);
8414		  imm_expr.X_add_number &= OP_MASK_CODE2;
8415		}
8416	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8417	      imm_expr.X_op = O_absent;
8418	      s = expr_end;
8419	      continue;
8420
8421	    case 'B':           /* 20-bit syscall/break code.  */
8422	      my_getExpression (&imm_expr, s);
8423	      check_absolute_expr (ip, &imm_expr);
8424	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8425		as_warn (_("Illegal 20-bit code (%lu)"),
8426			 (unsigned long) imm_expr.X_add_number);
8427	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8428	      imm_expr.X_op = O_absent;
8429	      s = expr_end;
8430	      continue;
8431
8432	    case 'C':           /* Coprocessor code */
8433	      my_getExpression (&imm_expr, s);
8434	      check_absolute_expr (ip, &imm_expr);
8435	      if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8436		{
8437		  as_warn (_("Coproccesor code > 25 bits (%lu)"),
8438			   (unsigned long) imm_expr.X_add_number);
8439		  imm_expr.X_add_number &= ((1 << 25) - 1);
8440		}
8441	      ip->insn_opcode |= imm_expr.X_add_number;
8442	      imm_expr.X_op = O_absent;
8443	      s = expr_end;
8444	      continue;
8445
8446	    case 'J':           /* 19-bit wait code.  */
8447	      my_getExpression (&imm_expr, s);
8448	      check_absolute_expr (ip, &imm_expr);
8449	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8450		as_warn (_("Illegal 19-bit code (%lu)"),
8451			 (unsigned long) imm_expr.X_add_number);
8452	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8453	      imm_expr.X_op = O_absent;
8454	      s = expr_end;
8455	      continue;
8456
8457	    case 'P':		/* Performance register */
8458	      my_getExpression (&imm_expr, s);
8459	      check_absolute_expr (ip, &imm_expr);
8460	      if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8461		{
8462		  as_warn (_("Invalid performance register (%lu)"),
8463			   (unsigned long) imm_expr.X_add_number);
8464		  imm_expr.X_add_number &= OP_MASK_PERFREG;
8465		}
8466	      ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8467	      imm_expr.X_op = O_absent;
8468	      s = expr_end;
8469	      continue;
8470
8471	    case 'b':		/* base register */
8472	    case 'd':		/* destination register */
8473	    case 's':		/* source register */
8474	    case 't':		/* target register */
8475	    case 'r':		/* both target and source */
8476	    case 'v':		/* both dest and source */
8477	    case 'w':		/* both dest and target */
8478	    case 'E':		/* coprocessor target register */
8479	    case 'G':		/* coprocessor destination register */
8480	    case 'K':		/* 'rdhwr' destination register */
8481	    case 'x':		/* ignore register name */
8482	    case 'z':		/* must be zero register */
8483	    case 'U':           /* destination register (clo/clz).  */
8484	      s_reset = s;
8485	      if (s[0] == '$')
8486		{
8487
8488		  if (ISDIGIT (s[1]))
8489		    {
8490		      ++s;
8491		      regno = 0;
8492		      do
8493			{
8494			  regno *= 10;
8495			  regno += *s - '0';
8496			  ++s;
8497			}
8498		      while (ISDIGIT (*s));
8499		      if (regno > 31)
8500			as_bad (_("Invalid register number (%d)"), regno);
8501		    }
8502		  else if (*args == 'E' || *args == 'G' || *args == 'K')
8503		    goto notreg;
8504		  else
8505		    {
8506		      if (s[1] == 'r' && s[2] == 'a')
8507			{
8508			  s += 3;
8509			  regno = RA;
8510			}
8511		      else if (s[1] == 'f' && s[2] == 'p')
8512			{
8513			  s += 3;
8514			  regno = FP;
8515			}
8516		      else if (s[1] == 's' && s[2] == 'p')
8517			{
8518			  s += 3;
8519			  regno = SP;
8520			}
8521		      else if (s[1] == 'g' && s[2] == 'p')
8522			{
8523			  s += 3;
8524			  regno = GP;
8525			}
8526		      else if (s[1] == 'a' && s[2] == 't')
8527			{
8528			  s += 3;
8529			  regno = AT;
8530			}
8531		      else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8532			{
8533			  s += 4;
8534			  regno = KT0;
8535			}
8536		      else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8537			{
8538			  s += 4;
8539			  regno = KT1;
8540			}
8541		      else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8542			{
8543			  s += 5;
8544			  regno = ZERO;
8545			}
8546		      else if (itbl_have_entries)
8547			{
8548			  char *p, *n;
8549			  unsigned long r;
8550
8551			  p = s + 1; 	/* advance past '$' */
8552			  n = itbl_get_field (&p);  /* n is name */
8553
8554			  /* See if this is a register defined in an
8555			     itbl entry.  */
8556			  if (itbl_get_reg_val (n, &r))
8557			    {
8558			      /* Get_field advances to the start of
8559				 the next field, so we need to back
8560				 rack to the end of the last field.  */
8561			      if (p)
8562				s = p - 1;
8563			      else
8564				s = strchr (s, '\0');
8565			      regno = r;
8566			    }
8567			  else
8568			    goto notreg;
8569			}
8570		      else
8571			goto notreg;
8572		    }
8573		  if (regno == AT
8574		      && ! mips_opts.noat
8575		      && *args != 'E'
8576		      && *args != 'G'
8577		      && *args != 'K')
8578		    as_warn (_("Used $at without \".set noat\""));
8579		  c = *args;
8580		  if (*s == ' ')
8581		    ++s;
8582		  if (args[1] != *s)
8583		    {
8584		      if (c == 'r' || c == 'v' || c == 'w')
8585			{
8586			  regno = lastregno;
8587			  s = s_reset;
8588			  ++args;
8589			}
8590		    }
8591		  /* 'z' only matches $0.  */
8592		  if (c == 'z' && regno != 0)
8593		    break;
8594
8595	/* Now that we have assembled one operand, we use the args string
8596	 * to figure out where it goes in the instruction.  */
8597		  switch (c)
8598		    {
8599		    case 'r':
8600		    case 's':
8601		    case 'v':
8602		    case 'b':
8603		      ip->insn_opcode |= regno << OP_SH_RS;
8604		      break;
8605		    case 'd':
8606		    case 'G':
8607		    case 'K':
8608		      ip->insn_opcode |= regno << OP_SH_RD;
8609		      break;
8610		    case 'U':
8611		      ip->insn_opcode |= regno << OP_SH_RD;
8612		      ip->insn_opcode |= regno << OP_SH_RT;
8613		      break;
8614		    case 'w':
8615		    case 't':
8616		    case 'E':
8617		      ip->insn_opcode |= regno << OP_SH_RT;
8618		      break;
8619		    case 'x':
8620		      /* This case exists because on the r3000 trunc
8621			 expands into a macro which requires a gp
8622			 register.  On the r6000 or r4000 it is
8623			 assembled into a single instruction which
8624			 ignores the register.  Thus the insn version
8625			 is MIPS_ISA2 and uses 'x', and the macro
8626			 version is MIPS_ISA1 and uses 't'.  */
8627		      break;
8628		    case 'z':
8629		      /* This case is for the div instruction, which
8630			 acts differently if the destination argument
8631			 is $0.  This only matches $0, and is checked
8632			 outside the switch.  */
8633		      break;
8634		    case 'D':
8635		      /* Itbl operand; not yet implemented. FIXME ?? */
8636		      break;
8637		      /* What about all other operands like 'i', which
8638			 can be specified in the opcode table? */
8639		    }
8640		  lastregno = regno;
8641		  continue;
8642		}
8643	    notreg:
8644	      switch (*args++)
8645		{
8646		case 'r':
8647		case 'v':
8648		  ip->insn_opcode |= lastregno << OP_SH_RS;
8649		  continue;
8650		case 'w':
8651		  ip->insn_opcode |= lastregno << OP_SH_RT;
8652		  continue;
8653		}
8654	      break;
8655
8656	    case 'O':		/* MDMX alignment immediate constant.  */
8657	      my_getExpression (&imm_expr, s);
8658	      check_absolute_expr (ip, &imm_expr);
8659	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8660		{
8661		  as_warn ("Improper align amount (%ld), using low bits",
8662			   (long) imm_expr.X_add_number);
8663		  imm_expr.X_add_number &= OP_MASK_ALN;
8664		}
8665	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
8666	      imm_expr.X_op = O_absent;
8667	      s = expr_end;
8668	      continue;
8669
8670	    case 'Q':		/* MDMX vector, element sel, or const.  */
8671	      if (s[0] != '$')
8672		{
8673		  /* MDMX Immediate.  */
8674		  my_getExpression (&imm_expr, s);
8675		  check_absolute_expr (ip, &imm_expr);
8676		  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8677		    {
8678		      as_warn (_("Invalid MDMX Immediate (%ld)"),
8679			       (long) imm_expr.X_add_number);
8680		      imm_expr.X_add_number &= OP_MASK_FT;
8681		    }
8682		  imm_expr.X_add_number &= OP_MASK_FT;
8683		  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8684		    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8685		  else
8686		    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8687		  ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
8688		  imm_expr.X_op = O_absent;
8689		  s = expr_end;
8690		  continue;
8691		}
8692	      /* Not MDMX Immediate.  Fall through.  */
8693	    case 'X':           /* MDMX destination register.  */
8694	    case 'Y':           /* MDMX source register.  */
8695	    case 'Z':           /* MDMX target register.  */
8696	      is_mdmx = 1;
8697	    case 'D':		/* floating point destination register */
8698	    case 'S':		/* floating point source register */
8699	    case 'T':		/* floating point target register */
8700	    case 'R':		/* floating point source register */
8701	    case 'V':
8702	    case 'W':
8703	      s_reset = s;
8704	      /* Accept $fN for FP and MDMX register numbers, and in
8705                 addition accept $vN for MDMX register numbers.  */
8706	      if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8707		  || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8708		      && ISDIGIT (s[2])))
8709		{
8710		  s += 2;
8711		  regno = 0;
8712		  do
8713		    {
8714		      regno *= 10;
8715		      regno += *s - '0';
8716		      ++s;
8717		    }
8718		  while (ISDIGIT (*s));
8719
8720		  if (regno > 31)
8721		    as_bad (_("Invalid float register number (%d)"), regno);
8722
8723		  if ((regno & 1) != 0
8724		      && HAVE_32BIT_FPRS
8725		      && ! (strcmp (str, "mtc1") == 0
8726			    || strcmp (str, "mfc1") == 0
8727			    || strcmp (str, "lwc1") == 0
8728			    || strcmp (str, "swc1") == 0
8729			    || strcmp (str, "l.s") == 0
8730			    || strcmp (str, "s.s") == 0))
8731		    as_warn (_("Float register should be even, was %d"),
8732			     regno);
8733
8734		  c = *args;
8735		  if (*s == ' ')
8736		    ++s;
8737		  if (args[1] != *s)
8738		    {
8739		      if (c == 'V' || c == 'W')
8740			{
8741			  regno = lastregno;
8742			  s = s_reset;
8743			  ++args;
8744			}
8745		    }
8746		  switch (c)
8747		    {
8748		    case 'D':
8749		    case 'X':
8750		      ip->insn_opcode |= regno << OP_SH_FD;
8751		      break;
8752		    case 'V':
8753		    case 'S':
8754		    case 'Y':
8755		      ip->insn_opcode |= regno << OP_SH_FS;
8756		      break;
8757		    case 'Q':
8758		      /* This is like 'Z', but also needs to fix the MDMX
8759			 vector/scalar select bits.  Note that the
8760			 scalar immediate case is handled above.  */
8761		      if (*s == '[')
8762			{
8763			  int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8764			  int max_el = (is_qh ? 3 : 7);
8765			  s++;
8766			  my_getExpression(&imm_expr, s);
8767			  check_absolute_expr (ip, &imm_expr);
8768			  s = expr_end;
8769			  if (imm_expr.X_add_number > max_el)
8770			    as_bad(_("Bad element selector %ld"),
8771				   (long) imm_expr.X_add_number);
8772			  imm_expr.X_add_number &= max_el;
8773			  ip->insn_opcode |= (imm_expr.X_add_number
8774					      << (OP_SH_VSEL +
8775						  (is_qh ? 2 : 1)));
8776			  if (*s != ']')
8777			    as_warn(_("Expecting ']' found '%s'"), s);
8778			  else
8779			    s++;
8780			}
8781		      else
8782                        {
8783                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8784                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8785						<< OP_SH_VSEL);
8786			  else
8787			    ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8788						OP_SH_VSEL);
8789			}
8790                      /* Fall through */
8791		    case 'W':
8792		    case 'T':
8793		    case 'Z':
8794		      ip->insn_opcode |= regno << OP_SH_FT;
8795		      break;
8796		    case 'R':
8797		      ip->insn_opcode |= regno << OP_SH_FR;
8798		      break;
8799		    }
8800		  lastregno = regno;
8801		  continue;
8802		}
8803
8804	      switch (*args++)
8805		{
8806		case 'V':
8807		  ip->insn_opcode |= lastregno << OP_SH_FS;
8808		  continue;
8809		case 'W':
8810		  ip->insn_opcode |= lastregno << OP_SH_FT;
8811		  continue;
8812		}
8813	      break;
8814
8815	    case 'I':
8816	      my_getExpression (&imm_expr, s);
8817	      if (imm_expr.X_op != O_big
8818		  && imm_expr.X_op != O_constant)
8819		insn_error = _("absolute expression required");
8820	      normalize_constant_expr (&imm_expr);
8821	      s = expr_end;
8822	      continue;
8823
8824	    case 'A':
8825	      my_getExpression (&offset_expr, s);
8826	      *imm_reloc = BFD_RELOC_32;
8827	      s = expr_end;
8828	      continue;
8829
8830	    case 'F':
8831	    case 'L':
8832	    case 'f':
8833	    case 'l':
8834	      {
8835		int f64;
8836		int using_gprs;
8837		char *save_in;
8838		char *err;
8839		unsigned char temp[8];
8840		int len;
8841		unsigned int length;
8842		segT seg;
8843		subsegT subseg;
8844		char *p;
8845
8846		/* These only appear as the last operand in an
8847		   instruction, and every instruction that accepts
8848		   them in any variant accepts them in all variants.
8849		   This means we don't have to worry about backing out
8850		   any changes if the instruction does not match.
8851
8852		   The difference between them is the size of the
8853		   floating point constant and where it goes.  For 'F'
8854		   and 'L' the constant is 64 bits; for 'f' and 'l' it
8855		   is 32 bits.  Where the constant is placed is based
8856		   on how the MIPS assembler does things:
8857		    F -- .rdata
8858		    L -- .lit8
8859		    f -- immediate value
8860		    l -- .lit4
8861
8862		    The .lit4 and .lit8 sections are only used if
8863		    permitted by the -G argument.
8864
8865		    When generating embedded PIC code, we use the
8866		    .lit8 section but not the .lit4 section (we can do
8867		    .lit4 inline easily; we need to put .lit8
8868		    somewhere in the data segment, and using .lit8
8869		    permits the linker to eventually combine identical
8870		    .lit8 entries).
8871
8872		    The code below needs to know whether the target register
8873		    is 32 or 64 bits wide.  It relies on the fact 'f' and
8874		    'F' are used with GPR-based instructions and 'l' and
8875		    'L' are used with FPR-based instructions.  */
8876
8877		f64 = *args == 'F' || *args == 'L';
8878		using_gprs = *args == 'F' || *args == 'f';
8879
8880		save_in = input_line_pointer;
8881		input_line_pointer = s;
8882		err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8883		length = len;
8884		s = input_line_pointer;
8885		input_line_pointer = save_in;
8886		if (err != NULL && *err != '\0')
8887		  {
8888		    as_bad (_("Bad floating point constant: %s"), err);
8889		    memset (temp, '\0', sizeof temp);
8890		    length = f64 ? 8 : 4;
8891		  }
8892
8893		assert (length == (unsigned) (f64 ? 8 : 4));
8894
8895		if (*args == 'f'
8896		    || (*args == 'l'
8897			&& (! USE_GLOBAL_POINTER_OPT
8898			    || mips_pic == EMBEDDED_PIC
8899			    || g_switch_value < 4
8900			    || (temp[0] == 0 && temp[1] == 0)
8901			    || (temp[2] == 0 && temp[3] == 0))))
8902		  {
8903		    imm_expr.X_op = O_constant;
8904		    if (! target_big_endian)
8905		      imm_expr.X_add_number = bfd_getl32 (temp);
8906		    else
8907		      imm_expr.X_add_number = bfd_getb32 (temp);
8908		  }
8909		else if (length > 4
8910			 && ! mips_disable_float_construction
8911			 /* Constants can only be constructed in GPRs and
8912			    copied to FPRs if the GPRs are at least as wide
8913			    as the FPRs.  Force the constant into memory if
8914			    we are using 64-bit FPRs but the GPRs are only
8915			    32 bits wide.  */
8916			 && (using_gprs
8917			     || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
8918			 && ((temp[0] == 0 && temp[1] == 0)
8919			     || (temp[2] == 0 && temp[3] == 0))
8920			 && ((temp[4] == 0 && temp[5] == 0)
8921			     || (temp[6] == 0 && temp[7] == 0)))
8922		  {
8923		    /* The value is simple enough to load with a couple of
8924                       instructions.  If using 32-bit registers, set
8925                       imm_expr to the high order 32 bits and offset_expr to
8926                       the low order 32 bits.  Otherwise, set imm_expr to
8927                       the entire 64 bit constant.  */
8928		    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
8929		      {
8930			imm_expr.X_op = O_constant;
8931			offset_expr.X_op = O_constant;
8932			if (! target_big_endian)
8933			  {
8934			    imm_expr.X_add_number = bfd_getl32 (temp + 4);
8935			    offset_expr.X_add_number = bfd_getl32 (temp);
8936			  }
8937			else
8938			  {
8939			    imm_expr.X_add_number = bfd_getb32 (temp);
8940			    offset_expr.X_add_number = bfd_getb32 (temp + 4);
8941			  }
8942			if (offset_expr.X_add_number == 0)
8943			  offset_expr.X_op = O_absent;
8944		      }
8945		    else if (sizeof (imm_expr.X_add_number) > 4)
8946		      {
8947			imm_expr.X_op = O_constant;
8948			if (! target_big_endian)
8949			  imm_expr.X_add_number = bfd_getl64 (temp);
8950			else
8951			  imm_expr.X_add_number = bfd_getb64 (temp);
8952		      }
8953		    else
8954		      {
8955			imm_expr.X_op = O_big;
8956			imm_expr.X_add_number = 4;
8957			if (! target_big_endian)
8958			  {
8959			    generic_bignum[0] = bfd_getl16 (temp);
8960			    generic_bignum[1] = bfd_getl16 (temp + 2);
8961			    generic_bignum[2] = bfd_getl16 (temp + 4);
8962			    generic_bignum[3] = bfd_getl16 (temp + 6);
8963			  }
8964			else
8965			  {
8966			    generic_bignum[0] = bfd_getb16 (temp + 6);
8967			    generic_bignum[1] = bfd_getb16 (temp + 4);
8968			    generic_bignum[2] = bfd_getb16 (temp + 2);
8969			    generic_bignum[3] = bfd_getb16 (temp);
8970			  }
8971		      }
8972		  }
8973		else
8974		  {
8975		    const char *newname;
8976		    segT new_seg;
8977
8978		    /* Switch to the right section.  */
8979		    seg = now_seg;
8980		    subseg = now_subseg;
8981		    switch (*args)
8982		      {
8983		      default: /* unused default case avoids warnings.  */
8984		      case 'L':
8985			newname = RDATA_SECTION_NAME;
8986			if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
8987			    || mips_pic == EMBEDDED_PIC)
8988			  newname = ".lit8";
8989			break;
8990		      case 'F':
8991			if (mips_pic == EMBEDDED_PIC)
8992			  newname = ".lit8";
8993			else
8994			  newname = RDATA_SECTION_NAME;
8995			break;
8996		      case 'l':
8997			assert (!USE_GLOBAL_POINTER_OPT
8998				|| g_switch_value >= 4);
8999			newname = ".lit4";
9000			break;
9001		      }
9002		    new_seg = subseg_new (newname, (subsegT) 0);
9003		    if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9004		      bfd_set_section_flags (stdoutput, new_seg,
9005					     (SEC_ALLOC
9006					      | SEC_LOAD
9007					      | SEC_READONLY
9008					      | SEC_DATA));
9009		    frag_align (*args == 'l' ? 2 : 3, 0, 0);
9010		    if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9011			&& strcmp (TARGET_OS, "elf") != 0)
9012		      record_alignment (new_seg, 4);
9013		    else
9014		      record_alignment (new_seg, *args == 'l' ? 2 : 3);
9015		    if (seg == now_seg)
9016		      as_bad (_("Can't use floating point insn in this section"));
9017
9018		    /* Set the argument to the current address in the
9019		       section.  */
9020		    offset_expr.X_op = O_symbol;
9021		    offset_expr.X_add_symbol =
9022		      symbol_new ("L0\001", now_seg,
9023				  (valueT) frag_now_fix (), frag_now);
9024		    offset_expr.X_add_number = 0;
9025
9026		    /* Put the floating point number into the section.  */
9027		    p = frag_more ((int) length);
9028		    memcpy (p, temp, length);
9029
9030		    /* Switch back to the original section.  */
9031		    subseg_set (seg, subseg);
9032		  }
9033	      }
9034	      continue;
9035
9036	    case 'i':		/* 16 bit unsigned immediate */
9037	    case 'j':		/* 16 bit signed immediate */
9038	      *imm_reloc = BFD_RELOC_LO16;
9039	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9040		{
9041		  int more;
9042		  offsetT minval, maxval;
9043
9044		  more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9045			  && strcmp (insn->name, insn[1].name) == 0);
9046
9047		  /* If the expression was written as an unsigned number,
9048		     only treat it as signed if there are no more
9049		     alternatives.  */
9050		  if (more
9051		      && *args == 'j'
9052		      && sizeof (imm_expr.X_add_number) <= 4
9053		      && imm_expr.X_op == O_constant
9054		      && imm_expr.X_add_number < 0
9055		      && imm_expr.X_unsigned
9056		      && HAVE_64BIT_GPRS)
9057		    break;
9058
9059		  /* For compatibility with older assemblers, we accept
9060		     0x8000-0xffff as signed 16-bit numbers when only
9061		     signed numbers are allowed.  */
9062		  if (*args == 'i')
9063		    minval = 0, maxval = 0xffff;
9064		  else if (more)
9065		    minval = -0x8000, maxval = 0x7fff;
9066		  else
9067		    minval = -0x8000, maxval = 0xffff;
9068
9069		  if (imm_expr.X_op != O_constant
9070		      || imm_expr.X_add_number < minval
9071		      || imm_expr.X_add_number > maxval)
9072		    {
9073		      if (more)
9074			break;
9075		      if (imm_expr.X_op == O_constant
9076			  || imm_expr.X_op == O_big)
9077			as_bad (_("expression out of range"));
9078		    }
9079		}
9080	      s = expr_end;
9081	      continue;
9082
9083	    case 'o':		/* 16 bit offset */
9084	      /* Check whether there is only a single bracketed expression
9085		 left.  If so, it must be the base register and the
9086		 constant must be zero.  */
9087	      if (*s == '(' && strchr (s + 1, '(') == 0)
9088		{
9089		  offset_expr.X_op = O_constant;
9090		  offset_expr.X_add_number = 0;
9091		  continue;
9092		}
9093
9094	      /* If this value won't fit into a 16 bit offset, then go
9095		 find a macro that will generate the 32 bit offset
9096		 code pattern.  */
9097	      if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9098		  && (offset_expr.X_op != O_constant
9099		      || offset_expr.X_add_number >= 0x8000
9100		      || offset_expr.X_add_number < -0x8000))
9101		break;
9102
9103	      s = expr_end;
9104	      continue;
9105
9106	    case 'p':		/* pc relative offset */
9107	      *offset_reloc = BFD_RELOC_16_PCREL_S2;
9108	      my_getExpression (&offset_expr, s);
9109	      s = expr_end;
9110	      continue;
9111
9112	    case 'u':		/* upper 16 bits */
9113	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9114		  && imm_expr.X_op == O_constant
9115		  && (imm_expr.X_add_number < 0
9116		      || imm_expr.X_add_number >= 0x10000))
9117		as_bad (_("lui expression not in range 0..65535"));
9118	      s = expr_end;
9119	      continue;
9120
9121	    case 'a':		/* 26 bit address */
9122	      my_getExpression (&offset_expr, s);
9123	      s = expr_end;
9124	      *offset_reloc = BFD_RELOC_MIPS_JMP;
9125	      continue;
9126
9127	    case 'N':		/* 3 bit branch condition code */
9128	    case 'M':		/* 3 bit compare condition code */
9129	      if (strncmp (s, "$fcc", 4) != 0)
9130		break;
9131	      s += 4;
9132	      regno = 0;
9133	      do
9134		{
9135		  regno *= 10;
9136		  regno += *s - '0';
9137		  ++s;
9138		}
9139	      while (ISDIGIT (*s));
9140	      if (regno > 7)
9141		as_bad (_("Invalid condition code register $fcc%d"), regno);
9142	      if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9143		   || strcmp(str + strlen(str) - 5, "any2f") == 0
9144		   || strcmp(str + strlen(str) - 5, "any2t") == 0)
9145		  && (regno & 1) != 0)
9146		as_warn(_("Condition code register should be even for %s, was %d"),
9147			str, regno);
9148	      if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9149		   || strcmp(str + strlen(str) - 5, "any4t") == 0)
9150		  && (regno & 3) != 0)
9151		as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9152			str, regno);
9153	      if (*args == 'N')
9154		ip->insn_opcode |= regno << OP_SH_BCC;
9155	      else
9156		ip->insn_opcode |= regno << OP_SH_CCC;
9157	      continue;
9158
9159	    case 'H':
9160	      if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9161		s += 2;
9162	      if (ISDIGIT (*s))
9163		{
9164		  c = 0;
9165		  do
9166		    {
9167		      c *= 10;
9168		      c += *s - '0';
9169		      ++s;
9170		    }
9171		  while (ISDIGIT (*s));
9172		}
9173	      else
9174		c = 8; /* Invalid sel value.  */
9175
9176	      if (c > 7)
9177		as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9178	      ip->insn_opcode |= c;
9179	      continue;
9180
9181	    case 'e':
9182	      /* Must be at least one digit.  */
9183	      my_getExpression (&imm_expr, s);
9184	      check_absolute_expr (ip, &imm_expr);
9185
9186	      if ((unsigned long) imm_expr.X_add_number
9187		  > (unsigned long) OP_MASK_VECBYTE)
9188		{
9189		  as_bad (_("bad byte vector index (%ld)"),
9190			   (long) imm_expr.X_add_number);
9191		  imm_expr.X_add_number = 0;
9192		}
9193
9194	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9195	      imm_expr.X_op = O_absent;
9196	      s = expr_end;
9197	      continue;
9198
9199	    case '%':
9200	      my_getExpression (&imm_expr, s);
9201	      check_absolute_expr (ip, &imm_expr);
9202
9203	      if ((unsigned long) imm_expr.X_add_number
9204		  > (unsigned long) OP_MASK_VECALIGN)
9205		{
9206		  as_bad (_("bad byte vector index (%ld)"),
9207			   (long) imm_expr.X_add_number);
9208		  imm_expr.X_add_number = 0;
9209		}
9210
9211	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9212	      imm_expr.X_op = O_absent;
9213	      s = expr_end;
9214	      continue;
9215
9216	    default:
9217	      as_bad (_("bad char = '%c'\n"), *args);
9218	      internalError ();
9219	    }
9220	  break;
9221	}
9222      /* Args don't match.  */
9223      if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9224	  !strcmp (insn->name, insn[1].name))
9225	{
9226	  ++insn;
9227	  s = argsStart;
9228	  insn_error = _("illegal operands");
9229	  continue;
9230	}
9231      if (save_c)
9232	*(--s) = save_c;
9233      insn_error = _("illegal operands");
9234      return;
9235    }
9236}
9237
9238/* This routine assembles an instruction into its binary format when
9239   assembling for the mips16.  As a side effect, it sets one of the
9240   global variables imm_reloc or offset_reloc to the type of
9241   relocation to do if one of the operands is an address expression.
9242   It also sets mips16_small and mips16_ext if the user explicitly
9243   requested a small or extended instruction.  */
9244
9245static void
9246mips16_ip (char *str, struct mips_cl_insn *ip)
9247{
9248  char *s;
9249  const char *args;
9250  struct mips_opcode *insn;
9251  char *argsstart;
9252  unsigned int regno;
9253  unsigned int lastregno = 0;
9254  char *s_reset;
9255
9256  insn_error = NULL;
9257
9258  mips16_small = FALSE;
9259  mips16_ext = FALSE;
9260
9261  for (s = str; ISLOWER (*s); ++s)
9262    ;
9263  switch (*s)
9264    {
9265    case '\0':
9266      break;
9267
9268    case ' ':
9269      *s++ = '\0';
9270      break;
9271
9272    case '.':
9273      if (s[1] == 't' && s[2] == ' ')
9274	{
9275	  *s = '\0';
9276	  mips16_small = TRUE;
9277	  s += 3;
9278	  break;
9279	}
9280      else if (s[1] == 'e' && s[2] == ' ')
9281	{
9282	  *s = '\0';
9283	  mips16_ext = TRUE;
9284	  s += 3;
9285	  break;
9286	}
9287      /* Fall through.  */
9288    default:
9289      insn_error = _("unknown opcode");
9290      return;
9291    }
9292
9293  if (mips_opts.noautoextend && ! mips16_ext)
9294    mips16_small = TRUE;
9295
9296  if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9297    {
9298      insn_error = _("unrecognized opcode");
9299      return;
9300    }
9301
9302  argsstart = s;
9303  for (;;)
9304    {
9305      assert (strcmp (insn->name, str) == 0);
9306
9307      ip->insn_mo = insn;
9308      ip->insn_opcode = insn->match;
9309      ip->use_extend = FALSE;
9310      imm_expr.X_op = O_absent;
9311      imm_reloc[0] = BFD_RELOC_UNUSED;
9312      imm_reloc[1] = BFD_RELOC_UNUSED;
9313      imm_reloc[2] = BFD_RELOC_UNUSED;
9314      imm2_expr.X_op = O_absent;
9315      offset_expr.X_op = O_absent;
9316      offset_reloc[0] = BFD_RELOC_UNUSED;
9317      offset_reloc[1] = BFD_RELOC_UNUSED;
9318      offset_reloc[2] = BFD_RELOC_UNUSED;
9319      for (args = insn->args; 1; ++args)
9320	{
9321	  int c;
9322
9323	  if (*s == ' ')
9324	    ++s;
9325
9326	  /* In this switch statement we call break if we did not find
9327             a match, continue if we did find a match, or return if we
9328             are done.  */
9329
9330	  c = *args;
9331	  switch (c)
9332	    {
9333	    case '\0':
9334	      if (*s == '\0')
9335		{
9336		  /* Stuff the immediate value in now, if we can.  */
9337		  if (imm_expr.X_op == O_constant
9338		      && *imm_reloc > BFD_RELOC_UNUSED
9339		      && insn->pinfo != INSN_MACRO)
9340		    {
9341		      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9342				    imm_expr.X_add_number, TRUE, mips16_small,
9343				    mips16_ext, &ip->insn_opcode,
9344				    &ip->use_extend, &ip->extend);
9345		      imm_expr.X_op = O_absent;
9346		      *imm_reloc = BFD_RELOC_UNUSED;
9347		    }
9348
9349		  return;
9350		}
9351	      break;
9352
9353	    case ',':
9354	      if (*s++ == c)
9355		continue;
9356	      s--;
9357	      switch (*++args)
9358		{
9359		case 'v':
9360		  ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9361		  continue;
9362		case 'w':
9363		  ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9364		  continue;
9365		}
9366	      break;
9367
9368	    case '(':
9369	    case ')':
9370	      if (*s++ == c)
9371		continue;
9372	      break;
9373
9374	    case 'v':
9375	    case 'w':
9376	      if (s[0] != '$')
9377		{
9378		  if (c == 'v')
9379		    ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9380		  else
9381		    ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9382		  ++args;
9383		  continue;
9384		}
9385	      /* Fall through.  */
9386	    case 'x':
9387	    case 'y':
9388	    case 'z':
9389	    case 'Z':
9390	    case '0':
9391	    case 'S':
9392	    case 'R':
9393	    case 'X':
9394	    case 'Y':
9395	      if (s[0] != '$')
9396		break;
9397	      s_reset = s;
9398	      if (ISDIGIT (s[1]))
9399		{
9400		  ++s;
9401		  regno = 0;
9402		  do
9403		    {
9404		      regno *= 10;
9405		      regno += *s - '0';
9406		      ++s;
9407		    }
9408		  while (ISDIGIT (*s));
9409		  if (regno > 31)
9410		    {
9411		      as_bad (_("invalid register number (%d)"), regno);
9412		      regno = 2;
9413		    }
9414		}
9415	      else
9416		{
9417		  if (s[1] == 'r' && s[2] == 'a')
9418		    {
9419		      s += 3;
9420		      regno = RA;
9421		    }
9422		  else if (s[1] == 'f' && s[2] == 'p')
9423		    {
9424		      s += 3;
9425		      regno = FP;
9426		    }
9427		  else if (s[1] == 's' && s[2] == 'p')
9428		    {
9429		      s += 3;
9430		      regno = SP;
9431		    }
9432		  else if (s[1] == 'g' && s[2] == 'p')
9433		    {
9434		      s += 3;
9435		      regno = GP;
9436		    }
9437		  else if (s[1] == 'a' && s[2] == 't')
9438		    {
9439		      s += 3;
9440		      regno = AT;
9441		    }
9442		  else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9443		    {
9444		      s += 4;
9445		      regno = KT0;
9446		    }
9447		  else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9448		    {
9449		      s += 4;
9450		      regno = KT1;
9451		    }
9452		  else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9453		    {
9454		      s += 5;
9455		      regno = ZERO;
9456		    }
9457		  else
9458		    break;
9459		}
9460
9461	      if (*s == ' ')
9462		++s;
9463	      if (args[1] != *s)
9464		{
9465		  if (c == 'v' || c == 'w')
9466		    {
9467		      regno = mips16_to_32_reg_map[lastregno];
9468		      s = s_reset;
9469		      ++args;
9470		    }
9471		}
9472
9473	      switch (c)
9474		{
9475		case 'x':
9476		case 'y':
9477		case 'z':
9478		case 'v':
9479		case 'w':
9480		case 'Z':
9481		  regno = mips32_to_16_reg_map[regno];
9482		  break;
9483
9484		case '0':
9485		  if (regno != 0)
9486		    regno = ILLEGAL_REG;
9487		  break;
9488
9489		case 'S':
9490		  if (regno != SP)
9491		    regno = ILLEGAL_REG;
9492		  break;
9493
9494		case 'R':
9495		  if (regno != RA)
9496		    regno = ILLEGAL_REG;
9497		  break;
9498
9499		case 'X':
9500		case 'Y':
9501		  if (regno == AT && ! mips_opts.noat)
9502		    as_warn (_("used $at without \".set noat\""));
9503		  break;
9504
9505		default:
9506		  internalError ();
9507		}
9508
9509	      if (regno == ILLEGAL_REG)
9510		break;
9511
9512	      switch (c)
9513		{
9514		case 'x':
9515		case 'v':
9516		  ip->insn_opcode |= regno << MIPS16OP_SH_RX;
9517		  break;
9518		case 'y':
9519		case 'w':
9520		  ip->insn_opcode |= regno << MIPS16OP_SH_RY;
9521		  break;
9522		case 'z':
9523		  ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
9524		  break;
9525		case 'Z':
9526		  ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
9527		case '0':
9528		case 'S':
9529		case 'R':
9530		  break;
9531		case 'X':
9532		  ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
9533		  break;
9534		case 'Y':
9535		  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9536		  ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
9537		  break;
9538		default:
9539		  internalError ();
9540		}
9541
9542	      lastregno = regno;
9543	      continue;
9544
9545	    case 'P':
9546	      if (strncmp (s, "$pc", 3) == 0)
9547		{
9548		  s += 3;
9549		  continue;
9550		}
9551	      break;
9552
9553	    case '<':
9554	    case '>':
9555	    case '[':
9556	    case ']':
9557	    case '4':
9558	    case '5':
9559	    case 'H':
9560	    case 'W':
9561	    case 'D':
9562	    case 'j':
9563	    case '8':
9564	    case 'V':
9565	    case 'C':
9566	    case 'U':
9567	    case 'k':
9568	    case 'K':
9569	      if (s[0] == '%'
9570		  && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
9571		{
9572		  /* This is %gprel(SYMBOL).  We need to read SYMBOL,
9573                     and generate the appropriate reloc.  If the text
9574                     inside %gprel is not a symbol name with an
9575                     optional offset, then we generate a normal reloc
9576                     and will probably fail later.  */
9577		  my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
9578		  if (imm_expr.X_op == O_symbol)
9579		    {
9580		      mips16_ext = TRUE;
9581		      *imm_reloc = BFD_RELOC_MIPS16_GPREL;
9582		      s = expr_end;
9583		      ip->use_extend = TRUE;
9584		      ip->extend = 0;
9585		      continue;
9586		    }
9587		}
9588	      else
9589		{
9590		  /* Just pick up a normal expression.  */
9591		  my_getExpression (&imm_expr, s);
9592		}
9593
9594	      if (imm_expr.X_op == O_register)
9595		{
9596		  /* What we thought was an expression turned out to
9597                     be a register.  */
9598
9599		  if (s[0] == '(' && args[1] == '(')
9600		    {
9601		      /* It looks like the expression was omitted
9602			 before a register indirection, which means
9603			 that the expression is implicitly zero.  We
9604			 still set up imm_expr, so that we handle
9605			 explicit extensions correctly.  */
9606		      imm_expr.X_op = O_constant;
9607		      imm_expr.X_add_number = 0;
9608		      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9609		      continue;
9610		    }
9611
9612		  break;
9613		}
9614
9615	      /* We need to relax this instruction.  */
9616	      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9617	      s = expr_end;
9618	      continue;
9619
9620	    case 'p':
9621	    case 'q':
9622	    case 'A':
9623	    case 'B':
9624	    case 'E':
9625	      /* We use offset_reloc rather than imm_reloc for the PC
9626                 relative operands.  This lets macros with both
9627                 immediate and address operands work correctly.  */
9628	      my_getExpression (&offset_expr, s);
9629
9630	      if (offset_expr.X_op == O_register)
9631		break;
9632
9633	      /* We need to relax this instruction.  */
9634	      *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9635	      s = expr_end;
9636	      continue;
9637
9638	    case '6':		/* break code */
9639	      my_getExpression (&imm_expr, s);
9640	      check_absolute_expr (ip, &imm_expr);
9641	      if ((unsigned long) imm_expr.X_add_number > 63)
9642		{
9643		  as_warn (_("Invalid value for `%s' (%lu)"),
9644			   ip->insn_mo->name,
9645			   (unsigned long) imm_expr.X_add_number);
9646		  imm_expr.X_add_number &= 0x3f;
9647		}
9648	      ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9649	      imm_expr.X_op = O_absent;
9650	      s = expr_end;
9651	      continue;
9652
9653	    case 'a':		/* 26 bit address */
9654	      my_getExpression (&offset_expr, s);
9655	      s = expr_end;
9656	      *offset_reloc = BFD_RELOC_MIPS16_JMP;
9657	      ip->insn_opcode <<= 16;
9658	      continue;
9659
9660	    case 'l':		/* register list for entry macro */
9661	    case 'L':		/* register list for exit macro */
9662	      {
9663		int mask;
9664
9665		if (c == 'l')
9666		  mask = 0;
9667		else
9668		  mask = 7 << 3;
9669		while (*s != '\0')
9670		  {
9671		    int freg, reg1, reg2;
9672
9673		    while (*s == ' ' || *s == ',')
9674		      ++s;
9675		    if (*s != '$')
9676		      {
9677			as_bad (_("can't parse register list"));
9678			break;
9679		      }
9680		    ++s;
9681		    if (*s != 'f')
9682		      freg = 0;
9683		    else
9684		      {
9685			freg = 1;
9686			++s;
9687		      }
9688		    reg1 = 0;
9689		    while (ISDIGIT (*s))
9690		      {
9691			reg1 *= 10;
9692			reg1 += *s - '0';
9693			++s;
9694		      }
9695		    if (*s == ' ')
9696		      ++s;
9697		    if (*s != '-')
9698		      reg2 = reg1;
9699		    else
9700		      {
9701			++s;
9702			if (*s != '$')
9703			  break;
9704			++s;
9705			if (freg)
9706			  {
9707			    if (*s == 'f')
9708			      ++s;
9709			    else
9710			      {
9711				as_bad (_("invalid register list"));
9712				break;
9713			      }
9714			  }
9715			reg2 = 0;
9716			while (ISDIGIT (*s))
9717			  {
9718			    reg2 *= 10;
9719			    reg2 += *s - '0';
9720			    ++s;
9721			  }
9722		      }
9723		    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9724		      {
9725			mask &= ~ (7 << 3);
9726			mask |= 5 << 3;
9727		      }
9728		    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9729		      {
9730			mask &= ~ (7 << 3);
9731			mask |= 6 << 3;
9732		      }
9733		    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9734		      mask |= (reg2 - 3) << 3;
9735		    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9736		      mask |= (reg2 - 15) << 1;
9737		    else if (reg1 == RA && reg2 == RA)
9738		      mask |= 1;
9739		    else
9740		      {
9741			as_bad (_("invalid register list"));
9742			break;
9743		      }
9744		  }
9745		/* The mask is filled in in the opcode table for the
9746                   benefit of the disassembler.  We remove it before
9747                   applying the actual mask.  */
9748		ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9749		ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9750	      }
9751	    continue;
9752
9753	    case 'e':		/* extend code */
9754	      my_getExpression (&imm_expr, s);
9755	      check_absolute_expr (ip, &imm_expr);
9756	      if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9757		{
9758		  as_warn (_("Invalid value for `%s' (%lu)"),
9759			   ip->insn_mo->name,
9760			   (unsigned long) imm_expr.X_add_number);
9761		  imm_expr.X_add_number &= 0x7ff;
9762		}
9763	      ip->insn_opcode |= imm_expr.X_add_number;
9764	      imm_expr.X_op = O_absent;
9765	      s = expr_end;
9766	      continue;
9767
9768	    default:
9769	      internalError ();
9770	    }
9771	  break;
9772	}
9773
9774      /* Args don't match.  */
9775      if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9776	  strcmp (insn->name, insn[1].name) == 0)
9777	{
9778	  ++insn;
9779	  s = argsstart;
9780	  continue;
9781	}
9782
9783      insn_error = _("illegal operands");
9784
9785      return;
9786    }
9787}
9788
9789/* This structure holds information we know about a mips16 immediate
9790   argument type.  */
9791
9792struct mips16_immed_operand
9793{
9794  /* The type code used in the argument string in the opcode table.  */
9795  int type;
9796  /* The number of bits in the short form of the opcode.  */
9797  int nbits;
9798  /* The number of bits in the extended form of the opcode.  */
9799  int extbits;
9800  /* The amount by which the short form is shifted when it is used;
9801     for example, the sw instruction has a shift count of 2.  */
9802  int shift;
9803  /* The amount by which the short form is shifted when it is stored
9804     into the instruction code.  */
9805  int op_shift;
9806  /* Non-zero if the short form is unsigned.  */
9807  int unsp;
9808  /* Non-zero if the extended form is unsigned.  */
9809  int extu;
9810  /* Non-zero if the value is PC relative.  */
9811  int pcrel;
9812};
9813
9814/* The mips16 immediate operand types.  */
9815
9816static const struct mips16_immed_operand mips16_immed_operands[] =
9817{
9818  { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9819  { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9820  { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9821  { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9822  { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9823  { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9824  { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9825  { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9826  { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9827  { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9828  { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9829  { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9830  { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9831  { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9832  { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9833  { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9834  { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9835  { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9836  { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9837  { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9838  { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9839};
9840
9841#define MIPS16_NUM_IMMED \
9842  (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9843
9844/* Handle a mips16 instruction with an immediate value.  This or's the
9845   small immediate value into *INSN.  It sets *USE_EXTEND to indicate
9846   whether an extended value is needed; if one is needed, it sets
9847   *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
9848   If SMALL is true, an unextended opcode was explicitly requested.
9849   If EXT is true, an extended opcode was explicitly requested.  If
9850   WARN is true, warn if EXT does not match reality.  */
9851
9852static void
9853mips16_immed (char *file, unsigned int line, int type, offsetT val,
9854	      bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
9855	      unsigned long *insn, bfd_boolean *use_extend,
9856	      unsigned short *extend)
9857{
9858  register const struct mips16_immed_operand *op;
9859  int mintiny, maxtiny;
9860  bfd_boolean needext;
9861
9862  op = mips16_immed_operands;
9863  while (op->type != type)
9864    {
9865      ++op;
9866      assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9867    }
9868
9869  if (op->unsp)
9870    {
9871      if (type == '<' || type == '>' || type == '[' || type == ']')
9872	{
9873	  mintiny = 1;
9874	  maxtiny = 1 << op->nbits;
9875	}
9876      else
9877	{
9878	  mintiny = 0;
9879	  maxtiny = (1 << op->nbits) - 1;
9880	}
9881    }
9882  else
9883    {
9884      mintiny = - (1 << (op->nbits - 1));
9885      maxtiny = (1 << (op->nbits - 1)) - 1;
9886    }
9887
9888  /* Branch offsets have an implicit 0 in the lowest bit.  */
9889  if (type == 'p' || type == 'q')
9890    val /= 2;
9891
9892  if ((val & ((1 << op->shift) - 1)) != 0
9893      || val < (mintiny << op->shift)
9894      || val > (maxtiny << op->shift))
9895    needext = TRUE;
9896  else
9897    needext = FALSE;
9898
9899  if (warn && ext && ! needext)
9900    as_warn_where (file, line,
9901		   _("extended operand requested but not required"));
9902  if (small && needext)
9903    as_bad_where (file, line, _("invalid unextended operand value"));
9904
9905  if (small || (! ext && ! needext))
9906    {
9907      int insnval;
9908
9909      *use_extend = FALSE;
9910      insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9911      insnval <<= op->op_shift;
9912      *insn |= insnval;
9913    }
9914  else
9915    {
9916      long minext, maxext;
9917      int extval;
9918
9919      if (op->extu)
9920	{
9921	  minext = 0;
9922	  maxext = (1 << op->extbits) - 1;
9923	}
9924      else
9925	{
9926	  minext = - (1 << (op->extbits - 1));
9927	  maxext = (1 << (op->extbits - 1)) - 1;
9928	}
9929      if (val < minext || val > maxext)
9930	as_bad_where (file, line,
9931		      _("operand value out of range for instruction"));
9932
9933      *use_extend = TRUE;
9934      if (op->extbits == 16)
9935	{
9936	  extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
9937	  val &= 0x1f;
9938	}
9939      else if (op->extbits == 15)
9940	{
9941	  extval = ((val >> 11) & 0xf) | (val & 0x7f0);
9942	  val &= 0xf;
9943	}
9944      else
9945	{
9946	  extval = ((val & 0x1f) << 6) | (val & 0x20);
9947	  val = 0;
9948	}
9949
9950      *extend = (unsigned short) extval;
9951      *insn |= val;
9952    }
9953}
9954
9955static const struct percent_op_match
9956{
9957  const char *str;
9958  bfd_reloc_code_real_type reloc;
9959} percent_op[] =
9960{
9961  {"%lo", BFD_RELOC_LO16},
9962#ifdef OBJ_ELF
9963  {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
9964  {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
9965  {"%call16", BFD_RELOC_MIPS_CALL16},
9966  {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
9967  {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
9968  {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
9969  {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
9970  {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
9971  {"%got", BFD_RELOC_MIPS_GOT16},
9972  {"%gp_rel", BFD_RELOC_GPREL16},
9973  {"%half", BFD_RELOC_16},
9974  {"%highest", BFD_RELOC_MIPS_HIGHEST},
9975  {"%higher", BFD_RELOC_MIPS_HIGHER},
9976  {"%neg", BFD_RELOC_MIPS_SUB},
9977#endif
9978  {"%hi", BFD_RELOC_HI16_S}
9979};
9980
9981
9982/* Return true if *STR points to a relocation operator.  When returning true,
9983   move *STR over the operator and store its relocation code in *RELOC.
9984   Leave both *STR and *RELOC alone when returning false.  */
9985
9986static bfd_boolean
9987parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
9988{
9989  size_t i;
9990
9991  for (i = 0; i < ARRAY_SIZE (percent_op); i++)
9992    if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
9993      {
9994	*str += strlen (percent_op[i].str);
9995	*reloc = percent_op[i].reloc;
9996
9997	/* Check whether the output BFD supports this relocation.
9998	   If not, issue an error and fall back on something safe.  */
9999	if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10000	  {
10001	    as_bad ("relocation %s isn't supported by the current ABI",
10002		    percent_op[i].str);
10003	    *reloc = BFD_RELOC_LO16;
10004	  }
10005	return TRUE;
10006      }
10007  return FALSE;
10008}
10009
10010
10011/* Parse string STR as a 16-bit relocatable operand.  Store the
10012   expression in *EP and the relocations in the array starting
10013   at RELOC.  Return the number of relocation operators used.
10014
10015   On exit, EXPR_END points to the first character after the expression.
10016   If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16.  */
10017
10018static size_t
10019my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10020		       char *str)
10021{
10022  bfd_reloc_code_real_type reversed_reloc[3];
10023  size_t reloc_index, i;
10024  int crux_depth, str_depth;
10025  char *crux;
10026
10027  /* Search for the start of the main expression, recoding relocations
10028     in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10029     of the main expression and with CRUX_DEPTH containing the number
10030     of open brackets at that point.  */
10031  reloc_index = -1;
10032  str_depth = 0;
10033  do
10034    {
10035      reloc_index++;
10036      crux = str;
10037      crux_depth = str_depth;
10038
10039      /* Skip over whitespace and brackets, keeping count of the number
10040	 of brackets.  */
10041      while (*str == ' ' || *str == '\t' || *str == '(')
10042	if (*str++ == '(')
10043	  str_depth++;
10044    }
10045  while (*str == '%'
10046	 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10047	 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10048
10049  my_getExpression (ep, crux);
10050  str = expr_end;
10051
10052  /* Match every open bracket.  */
10053  while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10054    if (*str++ == ')')
10055      crux_depth--;
10056
10057  if (crux_depth > 0)
10058    as_bad ("unclosed '('");
10059
10060  expr_end = str;
10061
10062  if (reloc_index == 0)
10063    reloc[0] = BFD_RELOC_LO16;
10064  else
10065    {
10066      prev_reloc_op_frag = frag_now;
10067      for (i = 0; i < reloc_index; i++)
10068	reloc[i] = reversed_reloc[reloc_index - 1 - i];
10069    }
10070
10071  return reloc_index;
10072}
10073
10074static void
10075my_getExpression (expressionS *ep, char *str)
10076{
10077  char *save_in;
10078  valueT val;
10079
10080  save_in = input_line_pointer;
10081  input_line_pointer = str;
10082  expression (ep);
10083  expr_end = input_line_pointer;
10084  input_line_pointer = save_in;
10085
10086  /* If we are in mips16 mode, and this is an expression based on `.',
10087     then we bump the value of the symbol by 1 since that is how other
10088     text symbols are handled.  We don't bother to handle complex
10089     expressions, just `.' plus or minus a constant.  */
10090  if (mips_opts.mips16
10091      && ep->X_op == O_symbol
10092      && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10093      && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10094      && symbol_get_frag (ep->X_add_symbol) == frag_now
10095      && symbol_constant_p (ep->X_add_symbol)
10096      && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10097    S_SET_VALUE (ep->X_add_symbol, val + 1);
10098}
10099
10100/* Turn a string in input_line_pointer into a floating point constant
10101   of type TYPE, and store the appropriate bytes in *LITP.  The number
10102   of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10103   returned, or NULL on OK.  */
10104
10105char *
10106md_atof (int type, char *litP, int *sizeP)
10107{
10108  int prec;
10109  LITTLENUM_TYPE words[4];
10110  char *t;
10111  int i;
10112
10113  switch (type)
10114    {
10115    case 'f':
10116      prec = 2;
10117      break;
10118
10119    case 'd':
10120      prec = 4;
10121      break;
10122
10123    default:
10124      *sizeP = 0;
10125      return _("bad call to md_atof");
10126    }
10127
10128  t = atof_ieee (input_line_pointer, type, words);
10129  if (t)
10130    input_line_pointer = t;
10131
10132  *sizeP = prec * 2;
10133
10134  if (! target_big_endian)
10135    {
10136      for (i = prec - 1; i >= 0; i--)
10137	{
10138	  md_number_to_chars (litP, words[i], 2);
10139	  litP += 2;
10140	}
10141    }
10142  else
10143    {
10144      for (i = 0; i < prec; i++)
10145	{
10146	  md_number_to_chars (litP, words[i], 2);
10147	  litP += 2;
10148	}
10149    }
10150
10151  return NULL;
10152}
10153
10154void
10155md_number_to_chars (char *buf, valueT val, int n)
10156{
10157  if (target_big_endian)
10158    number_to_chars_bigendian (buf, val, n);
10159  else
10160    number_to_chars_littleendian (buf, val, n);
10161}
10162
10163#ifdef OBJ_ELF
10164static int support_64bit_objects(void)
10165{
10166  const char **list, **l;
10167  int yes;
10168
10169  list = bfd_target_list ();
10170  for (l = list; *l != NULL; l++)
10171#ifdef TE_TMIPS
10172    /* This is traditional mips */
10173    if (strcmp (*l, "elf64-tradbigmips") == 0
10174	|| strcmp (*l, "elf64-tradlittlemips") == 0)
10175#else
10176    if (strcmp (*l, "elf64-bigmips") == 0
10177	|| strcmp (*l, "elf64-littlemips") == 0)
10178#endif
10179      break;
10180  yes = (*l != NULL);
10181  free (list);
10182  return yes;
10183}
10184#endif /* OBJ_ELF */
10185
10186const char *md_shortopts = "O::g::G:";
10187
10188struct option md_longopts[] =
10189{
10190  /* Options which specify architecture.  */
10191#define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10192#define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10193  {"march", required_argument, NULL, OPTION_MARCH},
10194#define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10195  {"mtune", required_argument, NULL, OPTION_MTUNE},
10196#define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10197  {"mips0", no_argument, NULL, OPTION_MIPS1},
10198  {"mips1", no_argument, NULL, OPTION_MIPS1},
10199#define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10200  {"mips2", no_argument, NULL, OPTION_MIPS2},
10201#define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10202  {"mips3", no_argument, NULL, OPTION_MIPS3},
10203#define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10204  {"mips4", no_argument, NULL, OPTION_MIPS4},
10205#define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10206  {"mips5", no_argument, NULL, OPTION_MIPS5},
10207#define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10208  {"mips32", no_argument, NULL, OPTION_MIPS32},
10209#define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10210  {"mips64", no_argument, NULL, OPTION_MIPS64},
10211#define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10212  {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10213#define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10214  {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10215
10216  /* Options which specify Application Specific Extensions (ASEs).  */
10217#define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10218#define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10219  {"mips16", no_argument, NULL, OPTION_MIPS16},
10220#define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10221  {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10222#define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10223  {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10224#define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10225  {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10226#define OPTION_MDMX (OPTION_ASE_BASE + 4)
10227  {"mdmx", no_argument, NULL, OPTION_MDMX},
10228#define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10229  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10230
10231  /* Old-style architecture options.  Don't add more of these.  */
10232#define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 6)
10233#define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10234  {"m4650", no_argument, NULL, OPTION_M4650},
10235#define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10236  {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10237#define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10238  {"m4010", no_argument, NULL, OPTION_M4010},
10239#define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10240  {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10241#define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10242  {"m4100", no_argument, NULL, OPTION_M4100},
10243#define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10244  {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10245#define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10246  {"m3900", no_argument, NULL, OPTION_M3900},
10247#define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10248  {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10249
10250  /* Options which enable bug fixes.  */
10251#define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10252#define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10253  {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10254#define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10255  {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10256  {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10257#define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10258#define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10259  {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10260  {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10261
10262  /* Miscellaneous options.  */
10263#define OPTION_MISC_BASE (OPTION_FIX_BASE + 4)
10264#define OPTION_MEMBEDDED_PIC (OPTION_MISC_BASE + 0)
10265  {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
10266#define OPTION_TRAP (OPTION_MISC_BASE + 1)
10267  {"trap", no_argument, NULL, OPTION_TRAP},
10268  {"no-break", no_argument, NULL, OPTION_TRAP},
10269#define OPTION_BREAK (OPTION_MISC_BASE + 2)
10270  {"break", no_argument, NULL, OPTION_BREAK},
10271  {"no-trap", no_argument, NULL, OPTION_BREAK},
10272#define OPTION_EB (OPTION_MISC_BASE + 3)
10273  {"EB", no_argument, NULL, OPTION_EB},
10274#define OPTION_EL (OPTION_MISC_BASE + 4)
10275  {"EL", no_argument, NULL, OPTION_EL},
10276#define OPTION_FP32 (OPTION_MISC_BASE + 5)
10277  {"mfp32", no_argument, NULL, OPTION_FP32},
10278#define OPTION_GP32 (OPTION_MISC_BASE + 6)
10279  {"mgp32", no_argument, NULL, OPTION_GP32},
10280#define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10281  {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10282#define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 8)
10283  {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10284#define OPTION_FP64 (OPTION_MISC_BASE + 9)
10285  {"mfp64", no_argument, NULL, OPTION_FP64},
10286#define OPTION_GP64 (OPTION_MISC_BASE + 10)
10287  {"mgp64", no_argument, NULL, OPTION_GP64},
10288#define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10289#define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 12)
10290  {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10291  {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10292
10293  /* ELF-specific options.  */
10294#ifdef OBJ_ELF
10295#define OPTION_ELF_BASE    (OPTION_MISC_BASE + 13)
10296#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10297  {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10298  {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10299#define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10300  {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10301#define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10302  {"xgot",        no_argument, NULL, OPTION_XGOT},
10303#define OPTION_MABI        (OPTION_ELF_BASE + 3)
10304  {"mabi", required_argument, NULL, OPTION_MABI},
10305#define OPTION_32 	   (OPTION_ELF_BASE + 4)
10306  {"32",          no_argument, NULL, OPTION_32},
10307#define OPTION_N32 	   (OPTION_ELF_BASE + 5)
10308  {"n32",         no_argument, NULL, OPTION_N32},
10309#define OPTION_64          (OPTION_ELF_BASE + 6)
10310  {"64",          no_argument, NULL, OPTION_64},
10311#define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10312  {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10313#define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10314  {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10315#define OPTION_PDR	   (OPTION_ELF_BASE + 9)
10316  {"mpdr", no_argument, NULL, OPTION_PDR},
10317#define OPTION_NO_PDR	   (OPTION_ELF_BASE + 10)
10318  {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10319#endif /* OBJ_ELF */
10320
10321  {NULL, no_argument, NULL, 0}
10322};
10323size_t md_longopts_size = sizeof (md_longopts);
10324
10325/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10326   NEW_VALUE.  Warn if another value was already specified.  Note:
10327   we have to defer parsing the -march and -mtune arguments in order
10328   to handle 'from-abi' correctly, since the ABI might be specified
10329   in a later argument.  */
10330
10331static void
10332mips_set_option_string (const char **string_ptr, const char *new_value)
10333{
10334  if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10335    as_warn (_("A different %s was already specified, is now %s"),
10336	     string_ptr == &mips_arch_string ? "-march" : "-mtune",
10337	     new_value);
10338
10339  *string_ptr = new_value;
10340}
10341
10342int
10343md_parse_option (int c, char *arg)
10344{
10345  switch (c)
10346    {
10347    case OPTION_CONSTRUCT_FLOATS:
10348      mips_disable_float_construction = 0;
10349      break;
10350
10351    case OPTION_NO_CONSTRUCT_FLOATS:
10352      mips_disable_float_construction = 1;
10353      break;
10354
10355    case OPTION_TRAP:
10356      mips_trap = 1;
10357      break;
10358
10359    case OPTION_BREAK:
10360      mips_trap = 0;
10361      break;
10362
10363    case OPTION_EB:
10364      target_big_endian = 1;
10365      break;
10366
10367    case OPTION_EL:
10368      target_big_endian = 0;
10369      break;
10370
10371    case 'O':
10372      if (arg && arg[1] == '0')
10373	mips_optimize = 1;
10374      else
10375	mips_optimize = 2;
10376      break;
10377
10378    case 'g':
10379      if (arg == NULL)
10380	mips_debug = 2;
10381      else
10382	mips_debug = atoi (arg);
10383      /* When the MIPS assembler sees -g or -g2, it does not do
10384         optimizations which limit full symbolic debugging.  We take
10385         that to be equivalent to -O0.  */
10386      if (mips_debug == 2)
10387	mips_optimize = 1;
10388      break;
10389
10390    case OPTION_MIPS1:
10391      file_mips_isa = ISA_MIPS1;
10392      break;
10393
10394    case OPTION_MIPS2:
10395      file_mips_isa = ISA_MIPS2;
10396      break;
10397
10398    case OPTION_MIPS3:
10399      file_mips_isa = ISA_MIPS3;
10400      break;
10401
10402    case OPTION_MIPS4:
10403      file_mips_isa = ISA_MIPS4;
10404      break;
10405
10406    case OPTION_MIPS5:
10407      file_mips_isa = ISA_MIPS5;
10408      break;
10409
10410    case OPTION_MIPS32:
10411      file_mips_isa = ISA_MIPS32;
10412      break;
10413
10414    case OPTION_MIPS32R2:
10415      file_mips_isa = ISA_MIPS32R2;
10416      break;
10417
10418    case OPTION_MIPS64R2:
10419      file_mips_isa = ISA_MIPS64R2;
10420      break;
10421
10422    case OPTION_MIPS64:
10423      file_mips_isa = ISA_MIPS64;
10424      break;
10425
10426    case OPTION_MTUNE:
10427      mips_set_option_string (&mips_tune_string, arg);
10428      break;
10429
10430    case OPTION_MARCH:
10431      mips_set_option_string (&mips_arch_string, arg);
10432      break;
10433
10434    case OPTION_M4650:
10435      mips_set_option_string (&mips_arch_string, "4650");
10436      mips_set_option_string (&mips_tune_string, "4650");
10437      break;
10438
10439    case OPTION_NO_M4650:
10440      break;
10441
10442    case OPTION_M4010:
10443      mips_set_option_string (&mips_arch_string, "4010");
10444      mips_set_option_string (&mips_tune_string, "4010");
10445      break;
10446
10447    case OPTION_NO_M4010:
10448      break;
10449
10450    case OPTION_M4100:
10451      mips_set_option_string (&mips_arch_string, "4100");
10452      mips_set_option_string (&mips_tune_string, "4100");
10453      break;
10454
10455    case OPTION_NO_M4100:
10456      break;
10457
10458    case OPTION_M3900:
10459      mips_set_option_string (&mips_arch_string, "3900");
10460      mips_set_option_string (&mips_tune_string, "3900");
10461      break;
10462
10463    case OPTION_NO_M3900:
10464      break;
10465
10466    case OPTION_MDMX:
10467      mips_opts.ase_mdmx = 1;
10468      break;
10469
10470    case OPTION_NO_MDMX:
10471      mips_opts.ase_mdmx = 0;
10472      break;
10473
10474    case OPTION_MIPS16:
10475      mips_opts.mips16 = 1;
10476      mips_no_prev_insn (FALSE);
10477      break;
10478
10479    case OPTION_NO_MIPS16:
10480      mips_opts.mips16 = 0;
10481      mips_no_prev_insn (FALSE);
10482      break;
10483
10484    case OPTION_MIPS3D:
10485      mips_opts.ase_mips3d = 1;
10486      break;
10487
10488    case OPTION_NO_MIPS3D:
10489      mips_opts.ase_mips3d = 0;
10490      break;
10491
10492    case OPTION_MEMBEDDED_PIC:
10493      mips_pic = EMBEDDED_PIC;
10494      if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
10495	{
10496	  as_bad (_("-G may not be used with embedded PIC code"));
10497	  return 0;
10498	}
10499      g_switch_value = 0x7fffffff;
10500      break;
10501
10502    case OPTION_FIX_VR4120:
10503      mips_fix_vr4120 = 1;
10504      break;
10505
10506    case OPTION_NO_FIX_VR4120:
10507      mips_fix_vr4120 = 0;
10508      break;
10509
10510    case OPTION_RELAX_BRANCH:
10511      mips_relax_branch = 1;
10512      break;
10513
10514    case OPTION_NO_RELAX_BRANCH:
10515      mips_relax_branch = 0;
10516      break;
10517
10518#ifdef OBJ_ELF
10519      /* When generating ELF code, we permit -KPIC and -call_shared to
10520	 select SVR4_PIC, and -non_shared to select no PIC.  This is
10521	 intended to be compatible with Irix 5.  */
10522    case OPTION_CALL_SHARED:
10523      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10524	{
10525	  as_bad (_("-call_shared is supported only for ELF format"));
10526	  return 0;
10527	}
10528      mips_pic = SVR4_PIC;
10529      mips_abicalls = TRUE;
10530      if (g_switch_seen && g_switch_value != 0)
10531	{
10532	  as_bad (_("-G may not be used with SVR4 PIC code"));
10533	  return 0;
10534	}
10535      g_switch_value = 0;
10536      break;
10537
10538    case OPTION_NON_SHARED:
10539      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10540	{
10541	  as_bad (_("-non_shared is supported only for ELF format"));
10542	  return 0;
10543	}
10544      mips_pic = NO_PIC;
10545      mips_abicalls = FALSE;
10546      break;
10547
10548      /* The -xgot option tells the assembler to use 32 offsets when
10549         accessing the got in SVR4_PIC mode.  It is for Irix
10550         compatibility.  */
10551    case OPTION_XGOT:
10552      mips_big_got = 1;
10553      break;
10554#endif /* OBJ_ELF */
10555
10556    case 'G':
10557      if (! USE_GLOBAL_POINTER_OPT)
10558	{
10559	  as_bad (_("-G is not supported for this configuration"));
10560	  return 0;
10561	}
10562      else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
10563	{
10564	  as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
10565	  return 0;
10566	}
10567      else
10568	g_switch_value = atoi (arg);
10569      g_switch_seen = 1;
10570      break;
10571
10572#ifdef OBJ_ELF
10573      /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10574	 and -mabi=64.  */
10575    case OPTION_32:
10576      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10577	{
10578	  as_bad (_("-32 is supported for ELF format only"));
10579	  return 0;
10580	}
10581      mips_abi = O32_ABI;
10582      break;
10583
10584    case OPTION_N32:
10585      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10586	{
10587	  as_bad (_("-n32 is supported for ELF format only"));
10588	  return 0;
10589	}
10590      mips_abi = N32_ABI;
10591      break;
10592
10593    case OPTION_64:
10594      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10595	{
10596	  as_bad (_("-64 is supported for ELF format only"));
10597	  return 0;
10598	}
10599      mips_abi = N64_ABI;
10600      if (! support_64bit_objects())
10601	as_fatal (_("No compiled in support for 64 bit object file format"));
10602      break;
10603#endif /* OBJ_ELF */
10604
10605    case OPTION_GP32:
10606      file_mips_gp32 = 1;
10607      break;
10608
10609    case OPTION_GP64:
10610      file_mips_gp32 = 0;
10611      break;
10612
10613    case OPTION_FP32:
10614      file_mips_fp32 = 1;
10615      break;
10616
10617    case OPTION_FP64:
10618      file_mips_fp32 = 0;
10619      break;
10620
10621#ifdef OBJ_ELF
10622    case OPTION_MABI:
10623      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10624	{
10625	  as_bad (_("-mabi is supported for ELF format only"));
10626	  return 0;
10627	}
10628      if (strcmp (arg, "32") == 0)
10629	mips_abi = O32_ABI;
10630      else if (strcmp (arg, "o64") == 0)
10631	mips_abi = O64_ABI;
10632      else if (strcmp (arg, "n32") == 0)
10633	mips_abi = N32_ABI;
10634      else if (strcmp (arg, "64") == 0)
10635	{
10636	  mips_abi = N64_ABI;
10637	  if (! support_64bit_objects())
10638	    as_fatal (_("No compiled in support for 64 bit object file "
10639			"format"));
10640	}
10641      else if (strcmp (arg, "eabi") == 0)
10642	mips_abi = EABI_ABI;
10643      else
10644	{
10645	  as_fatal (_("invalid abi -mabi=%s"), arg);
10646	  return 0;
10647	}
10648      break;
10649#endif /* OBJ_ELF */
10650
10651    case OPTION_M7000_HILO_FIX:
10652      mips_7000_hilo_fix = TRUE;
10653      break;
10654
10655    case OPTION_MNO_7000_HILO_FIX:
10656      mips_7000_hilo_fix = FALSE;
10657      break;
10658
10659#ifdef OBJ_ELF
10660    case OPTION_MDEBUG:
10661      mips_flag_mdebug = TRUE;
10662      break;
10663
10664    case OPTION_NO_MDEBUG:
10665      mips_flag_mdebug = FALSE;
10666      break;
10667
10668    case OPTION_PDR:
10669      mips_flag_pdr = TRUE;
10670      break;
10671
10672    case OPTION_NO_PDR:
10673      mips_flag_pdr = FALSE;
10674      break;
10675#endif /* OBJ_ELF */
10676
10677    default:
10678      return 0;
10679    }
10680
10681  return 1;
10682}
10683
10684/* Set up globals to generate code for the ISA or processor
10685   described by INFO.  */
10686
10687static void
10688mips_set_architecture (const struct mips_cpu_info *info)
10689{
10690  if (info != 0)
10691    {
10692      file_mips_arch = info->cpu;
10693      mips_opts.arch = info->cpu;
10694      mips_opts.isa = info->isa;
10695    }
10696}
10697
10698
10699/* Likewise for tuning.  */
10700
10701static void
10702mips_set_tune (const struct mips_cpu_info *info)
10703{
10704  if (info != 0)
10705    mips_tune = info->cpu;
10706}
10707
10708
10709void
10710mips_after_parse_args (void)
10711{
10712  const struct mips_cpu_info *arch_info = 0;
10713  const struct mips_cpu_info *tune_info = 0;
10714
10715  /* GP relative stuff not working for PE */
10716  if (strncmp (TARGET_OS, "pe", 2) == 0
10717      && g_switch_value != 0)
10718    {
10719      if (g_switch_seen)
10720	as_bad (_("-G not supported in this configuration."));
10721      g_switch_value = 0;
10722    }
10723
10724  if (mips_abi == NO_ABI)
10725    mips_abi = MIPS_DEFAULT_ABI;
10726
10727  /* The following code determines the architecture and register size.
10728     Similar code was added to GCC 3.3 (see override_options() in
10729     config/mips/mips.c).  The GAS and GCC code should be kept in sync
10730     as much as possible.  */
10731
10732  if (mips_arch_string != 0)
10733    arch_info = mips_parse_cpu ("-march", mips_arch_string);
10734
10735  if (file_mips_isa != ISA_UNKNOWN)
10736    {
10737      /* Handle -mipsN.  At this point, file_mips_isa contains the
10738	 ISA level specified by -mipsN, while arch_info->isa contains
10739	 the -march selection (if any).  */
10740      if (arch_info != 0)
10741	{
10742	  /* -march takes precedence over -mipsN, since it is more descriptive.
10743	     There's no harm in specifying both as long as the ISA levels
10744	     are the same.  */
10745	  if (file_mips_isa != arch_info->isa)
10746	    as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
10747		    mips_cpu_info_from_isa (file_mips_isa)->name,
10748		    mips_cpu_info_from_isa (arch_info->isa)->name);
10749	}
10750      else
10751	arch_info = mips_cpu_info_from_isa (file_mips_isa);
10752    }
10753
10754  if (arch_info == 0)
10755    arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
10756
10757  if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
10758    as_bad ("-march=%s is not compatible with the selected ABI",
10759	    arch_info->name);
10760
10761  mips_set_architecture (arch_info);
10762
10763  /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
10764  if (mips_tune_string != 0)
10765    tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
10766
10767  if (tune_info == 0)
10768    mips_set_tune (arch_info);
10769  else
10770    mips_set_tune (tune_info);
10771
10772  if (file_mips_gp32 >= 0)
10773    {
10774      /* The user specified the size of the integer registers.  Make sure
10775	 it agrees with the ABI and ISA.  */
10776      if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10777	as_bad (_("-mgp64 used with a 32-bit processor"));
10778      else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
10779	as_bad (_("-mgp32 used with a 64-bit ABI"));
10780      else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
10781	as_bad (_("-mgp64 used with a 32-bit ABI"));
10782    }
10783  else
10784    {
10785      /* Infer the integer register size from the ABI and processor.
10786	 Restrict ourselves to 32-bit registers if that's all the
10787	 processor has, or if the ABI cannot handle 64-bit registers.  */
10788      file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
10789			|| !ISA_HAS_64BIT_REGS (mips_opts.isa));
10790    }
10791
10792  /* ??? GAS treats single-float processors as though they had 64-bit
10793     float registers (although it complains when double-precision
10794     instructions are used).  As things stand, saying they have 32-bit
10795     registers would lead to spurious "register must be even" messages.
10796     So here we assume float registers are always the same size as
10797     integer ones, unless the user says otherwise.  */
10798  if (file_mips_fp32 < 0)
10799    file_mips_fp32 = file_mips_gp32;
10800
10801  /* End of GCC-shared inference code.  */
10802
10803  /* This flag is set when we have a 64-bit capable CPU but use only
10804     32-bit wide registers.  Note that EABI does not use it.  */
10805  if (ISA_HAS_64BIT_REGS (mips_opts.isa)
10806      && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
10807	  || mips_abi == O32_ABI))
10808    mips_32bitmode = 1;
10809
10810  if (mips_opts.isa == ISA_MIPS1 && mips_trap)
10811    as_bad (_("trap exception not supported at ISA 1"));
10812
10813  /* If the selected architecture includes support for ASEs, enable
10814     generation of code for them.  */
10815  if (mips_opts.mips16 == -1)
10816    mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
10817  if (mips_opts.ase_mips3d == -1)
10818    mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
10819  if (mips_opts.ase_mdmx == -1)
10820    mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
10821
10822  file_mips_isa = mips_opts.isa;
10823  file_ase_mips16 = mips_opts.mips16;
10824  file_ase_mips3d = mips_opts.ase_mips3d;
10825  file_ase_mdmx = mips_opts.ase_mdmx;
10826  mips_opts.gp32 = file_mips_gp32;
10827  mips_opts.fp32 = file_mips_fp32;
10828
10829  if (mips_flag_mdebug < 0)
10830    {
10831#ifdef OBJ_MAYBE_ECOFF
10832      if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
10833	mips_flag_mdebug = 1;
10834      else
10835#endif /* OBJ_MAYBE_ECOFF */
10836	mips_flag_mdebug = 0;
10837    }
10838}
10839
10840void
10841mips_init_after_args (void)
10842{
10843  /* initialize opcodes */
10844  bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
10845  mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
10846}
10847
10848long
10849md_pcrel_from (fixS *fixP)
10850{
10851  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
10852  switch (fixP->fx_r_type)
10853    {
10854    case BFD_RELOC_16_PCREL_S2:
10855    case BFD_RELOC_MIPS_JMP:
10856      /* Return the address of the delay slot.  */
10857      return addr + 4;
10858    default:
10859      return addr;
10860    }
10861}
10862
10863/* This is called before the symbol table is processed.  In order to
10864   work with gcc when using mips-tfile, we must keep all local labels.
10865   However, in other cases, we want to discard them.  If we were
10866   called with -g, but we didn't see any debugging information, it may
10867   mean that gcc is smuggling debugging information through to
10868   mips-tfile, in which case we must generate all local labels.  */
10869
10870void
10871mips_frob_file_before_adjust (void)
10872{
10873#ifndef NO_ECOFF_DEBUGGING
10874  if (ECOFF_DEBUGGING
10875      && mips_debug != 0
10876      && ! ecoff_debugging_seen)
10877    flag_keep_locals = 1;
10878#endif
10879}
10880
10881/* Sort any unmatched HI16_S relocs so that they immediately precede
10882   the corresponding LO reloc.  This is called before md_apply_fix3 and
10883   tc_gen_reloc.  Unmatched HI16_S relocs can only be generated by
10884   explicit use of the %hi modifier.  */
10885
10886void
10887mips_frob_file (void)
10888{
10889  struct mips_hi_fixup *l;
10890
10891  for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10892    {
10893      segment_info_type *seginfo;
10894      int pass;
10895
10896      assert (reloc_needs_lo_p (l->fixp->fx_r_type));
10897
10898      /* If a GOT16 relocation turns out to be against a global symbol,
10899	 there isn't supposed to be a matching LO.  */
10900      if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
10901	  && !pic_need_relax (l->fixp->fx_addsy, l->seg))
10902	continue;
10903
10904      /* Check quickly whether the next fixup happens to be a matching %lo.  */
10905      if (fixup_has_matching_lo_p (l->fixp))
10906	continue;
10907
10908      /* Look through the fixups for this segment for a matching %lo.
10909         When we find one, move the %hi just in front of it.  We do
10910         this in two passes.  In the first pass, we try to find a
10911         unique %lo.  In the second pass, we permit multiple %hi
10912         relocs for a single %lo (this is a GNU extension).  */
10913      seginfo = seg_info (l->seg);
10914      for (pass = 0; pass < 2; pass++)
10915	{
10916	  fixS *f, *prev;
10917
10918	  prev = NULL;
10919	  for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
10920	    {
10921	      /* Check whether this is a %lo fixup which matches l->fixp.  */
10922	      if (f->fx_r_type == BFD_RELOC_LO16
10923		  && f->fx_addsy == l->fixp->fx_addsy
10924		  && f->fx_offset == l->fixp->fx_offset
10925		  && (pass == 1
10926		      || prev == NULL
10927		      || !reloc_needs_lo_p (prev->fx_r_type)
10928		      || !fixup_has_matching_lo_p (prev)))
10929		{
10930		  fixS **pf;
10931
10932		  /* Move l->fixp before f.  */
10933		  for (pf = &seginfo->fix_root;
10934		       *pf != l->fixp;
10935		       pf = &(*pf)->fx_next)
10936		    assert (*pf != NULL);
10937
10938		  *pf = l->fixp->fx_next;
10939
10940		  l->fixp->fx_next = f;
10941		  if (prev == NULL)
10942		    seginfo->fix_root = l->fixp;
10943		  else
10944		    prev->fx_next = l->fixp;
10945
10946		  break;
10947		}
10948
10949	      prev = f;
10950	    }
10951
10952	  if (f != NULL)
10953	    break;
10954
10955#if 0 /* GCC code motion plus incomplete dead code elimination
10956	 can leave a %hi without a %lo.  */
10957	  if (pass == 1)
10958	    as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
10959			   _("Unmatched %%hi reloc"));
10960#endif
10961	}
10962    }
10963}
10964
10965/* When generating embedded PIC code we need to use a special
10966   relocation to represent the difference of two symbols in the .text
10967   section (switch tables use a difference of this sort).  See
10968   include/coff/mips.h for details.  This macro checks whether this
10969   fixup requires the special reloc.  */
10970#define SWITCH_TABLE(fixp) \
10971  ((fixp)->fx_r_type == BFD_RELOC_32 \
10972   && OUTPUT_FLAVOR != bfd_target_elf_flavour \
10973   && (fixp)->fx_addsy != NULL \
10974   && (fixp)->fx_subsy != NULL \
10975   && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
10976   && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
10977
10978/* When generating embedded PIC code we must keep all PC relative
10979   relocations, in case the linker has to relax a call.  We also need
10980   to keep relocations for switch table entries.
10981
10982   We may have combined relocations without symbols in the N32/N64 ABI.
10983   We have to prevent gas from dropping them.  */
10984
10985int
10986mips_force_relocation (fixS *fixp)
10987{
10988  if (generic_force_reloc (fixp))
10989    return 1;
10990
10991  if (HAVE_NEWABI
10992      && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
10993      && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
10994	  || fixp->fx_r_type == BFD_RELOC_HI16_S
10995	  || fixp->fx_r_type == BFD_RELOC_LO16))
10996    return 1;
10997
10998  return (mips_pic == EMBEDDED_PIC
10999	  && (fixp->fx_pcrel
11000	      || SWITCH_TABLE (fixp)
11001	      || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11002	      || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11003}
11004
11005/* This hook is called before a fix is simplified.  We don't really
11006   decide whether to skip a fix here.  Rather, we turn global symbols
11007   used as branch targets into local symbols, such that they undergo
11008   simplification.  We can only do this if the symbol is defined and
11009   it is in the same section as the branch.  If this doesn't hold, we
11010   emit a better error message than just saying the relocation is not
11011   valid for the selected object format.
11012
11013   FIXP is the fix-up we're going to try to simplify, SEG is the
11014   segment in which the fix up occurs.  The return value should be
11015   non-zero to indicate the fix-up is valid for further
11016   simplifications.  */
11017
11018int
11019mips_validate_fix (struct fix *fixP, asection *seg)
11020{
11021  /* There's a lot of discussion on whether it should be possible to
11022     use R_MIPS_PC16 to represent branch relocations.  The outcome
11023     seems to be that it can, but gas/bfd are very broken in creating
11024     RELA relocations for this, so for now we only accept branches to
11025     symbols in the same section.  Anything else is of dubious value,
11026     since there's no guarantee that at link time the symbol would be
11027     in range.  Even for branches to local symbols this is arguably
11028     wrong, since it we assume the symbol is not going to be
11029     overridden, which should be possible per ELF library semantics,
11030     but then, there isn't a dynamic relocation that could be used to
11031     this effect, and the target would likely be out of range as well.
11032
11033     Unfortunately, it seems that there is too much code out there
11034     that relies on branches to symbols that are global to be resolved
11035     as if they were local, like the IRIX tools do, so we do it as
11036     well, but with a warning so that people are reminded to fix their
11037     code.  If we ever get back to using R_MIPS_PC16 for branch
11038     targets, this entire block should go away (and probably the
11039     whole function).  */
11040
11041  if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
11042      && (((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11043	    || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11044	   && mips_pic != EMBEDDED_PIC)
11045	  || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
11046      && fixP->fx_addsy)
11047    {
11048      if (! S_IS_DEFINED (fixP->fx_addsy))
11049	{
11050	  as_bad_where (fixP->fx_file, fixP->fx_line,
11051			_("Cannot branch to undefined symbol."));
11052	  /* Avoid any further errors about this fixup.  */
11053	  fixP->fx_done = 1;
11054	}
11055      else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
11056	{
11057	  as_bad_where (fixP->fx_file, fixP->fx_line,
11058			_("Cannot branch to symbol in another section."));
11059	  fixP->fx_done = 1;
11060	}
11061      else if (S_IS_EXTERNAL (fixP->fx_addsy))
11062	{
11063	  symbolS *sym = fixP->fx_addsy;
11064
11065	  if (mips_pic == SVR4_PIC)
11066	    as_warn_where (fixP->fx_file, fixP->fx_line,
11067			   _("Pretending global symbol used as branch target is local."));
11068
11069	  fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
11070					  S_GET_SEGMENT (sym),
11071					  S_GET_VALUE (sym),
11072					  symbol_get_frag (sym));
11073	  copy_symbol_attributes (fixP->fx_addsy, sym);
11074	  S_CLEAR_EXTERNAL (fixP->fx_addsy);
11075	  assert (symbol_resolved_p (sym));
11076	  symbol_mark_resolved (fixP->fx_addsy);
11077	}
11078    }
11079
11080  return 1;
11081}
11082
11083/* Apply a fixup to the object file.  */
11084
11085void
11086md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11087{
11088  bfd_byte *buf;
11089  long insn;
11090  static int previous_fx_r_type = 0;
11091  reloc_howto_type *howto;
11092
11093  /* We ignore generic BFD relocations we don't know about.  */
11094  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11095  if (! howto)
11096    return;
11097
11098  assert (fixP->fx_size == 4
11099	  || fixP->fx_r_type == BFD_RELOC_16
11100	  || fixP->fx_r_type == BFD_RELOC_64
11101	  || fixP->fx_r_type == BFD_RELOC_CTOR
11102	  || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11103	  || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11104	  || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
11105
11106  buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11107
11108  /* We are not done if this is a composite relocation to set up gp.  */
11109  if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11110      && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11111	   || (fixP->fx_r_type == BFD_RELOC_64
11112	       && (previous_fx_r_type == BFD_RELOC_GPREL32
11113		   || previous_fx_r_type == BFD_RELOC_GPREL16))
11114	   || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11115	       && (fixP->fx_r_type == BFD_RELOC_HI16_S
11116		   || fixP->fx_r_type == BFD_RELOC_LO16))))
11117    fixP->fx_done = 1;
11118  previous_fx_r_type = fixP->fx_r_type;
11119
11120  switch (fixP->fx_r_type)
11121    {
11122    case BFD_RELOC_MIPS_JMP:
11123    case BFD_RELOC_MIPS_SHIFT5:
11124    case BFD_RELOC_MIPS_SHIFT6:
11125    case BFD_RELOC_MIPS_GOT_DISP:
11126    case BFD_RELOC_MIPS_GOT_PAGE:
11127    case BFD_RELOC_MIPS_GOT_OFST:
11128    case BFD_RELOC_MIPS_SUB:
11129    case BFD_RELOC_MIPS_INSERT_A:
11130    case BFD_RELOC_MIPS_INSERT_B:
11131    case BFD_RELOC_MIPS_DELETE:
11132    case BFD_RELOC_MIPS_HIGHEST:
11133    case BFD_RELOC_MIPS_HIGHER:
11134    case BFD_RELOC_MIPS_SCN_DISP:
11135    case BFD_RELOC_MIPS_REL16:
11136    case BFD_RELOC_MIPS_RELGOT:
11137    case BFD_RELOC_MIPS_JALR:
11138    case BFD_RELOC_HI16:
11139    case BFD_RELOC_HI16_S:
11140    case BFD_RELOC_GPREL16:
11141    case BFD_RELOC_MIPS_LITERAL:
11142    case BFD_RELOC_MIPS_CALL16:
11143    case BFD_RELOC_MIPS_GOT16:
11144    case BFD_RELOC_GPREL32:
11145    case BFD_RELOC_MIPS_GOT_HI16:
11146    case BFD_RELOC_MIPS_GOT_LO16:
11147    case BFD_RELOC_MIPS_CALL_HI16:
11148    case BFD_RELOC_MIPS_CALL_LO16:
11149    case BFD_RELOC_MIPS16_GPREL:
11150      if (fixP->fx_pcrel)
11151	as_bad_where (fixP->fx_file, fixP->fx_line,
11152		      _("Invalid PC relative reloc"));
11153      /* Nothing needed to do. The value comes from the reloc entry */
11154      break;
11155
11156    case BFD_RELOC_MIPS16_JMP:
11157      /* We currently always generate a reloc against a symbol, which
11158         means that we don't want an addend even if the symbol is
11159         defined.  */
11160      *valP = 0;
11161      break;
11162
11163    case BFD_RELOC_PCREL_HI16_S:
11164      /* The addend for this is tricky if it is internal, so we just
11165	 do everything here rather than in bfd_install_relocation.  */
11166      if (OUTPUT_FLAVOR == bfd_target_elf_flavour && !fixP->fx_done)
11167	break;
11168      if (fixP->fx_addsy
11169	  && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11170	{
11171	  /* For an external symbol adjust by the address to make it
11172	     pcrel_offset.  We use the address of the RELLO reloc
11173	     which follows this one.  */
11174	  *valP += (fixP->fx_next->fx_frag->fr_address
11175		    + fixP->fx_next->fx_where);
11176	}
11177      *valP = ((*valP + 0x8000) >> 16) & 0xffff;
11178      if (target_big_endian)
11179	buf += 2;
11180      md_number_to_chars (buf, *valP, 2);
11181      break;
11182
11183    case BFD_RELOC_PCREL_LO16:
11184      /* The addend for this is tricky if it is internal, so we just
11185	 do everything here rather than in bfd_install_relocation.  */
11186      if (OUTPUT_FLAVOR == bfd_target_elf_flavour && !fixP->fx_done)
11187	break;
11188      if (fixP->fx_addsy
11189	  && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11190	*valP += fixP->fx_frag->fr_address + fixP->fx_where;
11191      if (target_big_endian)
11192	buf += 2;
11193      md_number_to_chars (buf, *valP, 2);
11194      break;
11195
11196    case BFD_RELOC_64:
11197      /* This is handled like BFD_RELOC_32, but we output a sign
11198         extended value if we are only 32 bits.  */
11199      if (fixP->fx_done
11200	  || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11201	{
11202	  if (8 <= sizeof (valueT))
11203	    md_number_to_chars (buf, *valP, 8);
11204	  else
11205	    {
11206	      valueT hiv;
11207
11208	      if ((*valP & 0x80000000) != 0)
11209		hiv = 0xffffffff;
11210	      else
11211		hiv = 0;
11212	      md_number_to_chars ((char *)(buf + target_big_endian ? 4 : 0),
11213				  *valP, 4);
11214	      md_number_to_chars ((char *)(buf + target_big_endian ? 0 : 4),
11215				  hiv, 4);
11216	    }
11217	}
11218      break;
11219
11220    case BFD_RELOC_RVA:
11221    case BFD_RELOC_32:
11222      /* If we are deleting this reloc entry, we must fill in the
11223	 value now.  This can happen if we have a .word which is not
11224	 resolved when it appears but is later defined.  We also need
11225	 to fill in the value if this is an embedded PIC switch table
11226	 entry.  */
11227      if (fixP->fx_done
11228	  || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11229	md_number_to_chars (buf, *valP, 4);
11230      break;
11231
11232    case BFD_RELOC_16:
11233      /* If we are deleting this reloc entry, we must fill in the
11234         value now.  */
11235      assert (fixP->fx_size == 2);
11236      if (fixP->fx_done)
11237	md_number_to_chars (buf, *valP, 2);
11238      break;
11239
11240    case BFD_RELOC_LO16:
11241      /* When handling an embedded PIC switch statement, we can wind
11242	 up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11243      if (fixP->fx_done)
11244	{
11245	  if (*valP + 0x8000 > 0xffff)
11246	    as_bad_where (fixP->fx_file, fixP->fx_line,
11247			  _("relocation overflow"));
11248	  if (target_big_endian)
11249	    buf += 2;
11250	  md_number_to_chars (buf, *valP, 2);
11251	}
11252      break;
11253
11254    case BFD_RELOC_16_PCREL_S2:
11255      if ((*valP & 0x3) != 0)
11256	as_bad_where (fixP->fx_file, fixP->fx_line,
11257		      _("Branch to odd address (%lx)"), (long) *valP);
11258
11259      /*
11260       * We need to save the bits in the instruction since fixup_segment()
11261       * might be deleting the relocation entry (i.e., a branch within
11262       * the current segment).
11263       */
11264      if (! fixP->fx_done)
11265	break;
11266
11267      /* update old instruction data */
11268      if (target_big_endian)
11269	insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11270      else
11271	insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11272
11273      if (*valP + 0x20000 <= 0x3ffff)
11274	{
11275	  insn |= (*valP >> 2) & 0xffff;
11276	  md_number_to_chars (buf, insn, 4);
11277	}
11278      else if (mips_pic == NO_PIC
11279	       && fixP->fx_done
11280	       && fixP->fx_frag->fr_address >= text_section->vma
11281	       && (fixP->fx_frag->fr_address
11282		   < text_section->vma + text_section->_raw_size)
11283	       && ((insn & 0xffff0000) == 0x10000000	 /* beq $0,$0 */
11284		   || (insn & 0xffff0000) == 0x04010000	 /* bgez $0 */
11285		   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11286	{
11287	  /* The branch offset is too large.  If this is an
11288             unconditional branch, and we are not generating PIC code,
11289             we can convert it to an absolute jump instruction.  */
11290	  if ((insn & 0xffff0000) == 0x04110000)	 /* bgezal $0 */
11291	    insn = 0x0c000000;	/* jal */
11292	  else
11293	    insn = 0x08000000;	/* j */
11294	  fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11295	  fixP->fx_done = 0;
11296	  fixP->fx_addsy = section_symbol (text_section);
11297	  *valP += md_pcrel_from (fixP);
11298	  md_number_to_chars (buf, insn, 4);
11299	}
11300      else
11301	{
11302	  /* If we got here, we have branch-relaxation disabled,
11303	     and there's nothing we can do to fix this instruction
11304	     without turning it into a longer sequence.  */
11305	  as_bad_where (fixP->fx_file, fixP->fx_line,
11306			_("Branch out of range"));
11307	}
11308      break;
11309
11310    case BFD_RELOC_VTABLE_INHERIT:
11311      fixP->fx_done = 0;
11312      if (fixP->fx_addsy
11313          && !S_IS_DEFINED (fixP->fx_addsy)
11314          && !S_IS_WEAK (fixP->fx_addsy))
11315        S_SET_WEAK (fixP->fx_addsy);
11316      break;
11317
11318    case BFD_RELOC_VTABLE_ENTRY:
11319      fixP->fx_done = 0;
11320      break;
11321
11322    default:
11323      internalError ();
11324    }
11325
11326  /* Remember value for tc_gen_reloc.  */
11327  fixP->fx_addnumber = *valP;
11328}
11329
11330#if 0
11331void
11332printInsn (unsigned long oc)
11333{
11334  const struct mips_opcode *p;
11335  int treg, sreg, dreg, shamt;
11336  short imm;
11337  const char *args;
11338  int i;
11339
11340  for (i = 0; i < NUMOPCODES; ++i)
11341    {
11342      p = &mips_opcodes[i];
11343      if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
11344	{
11345	  printf ("%08lx %s\t", oc, p->name);
11346	  treg = (oc >> 16) & 0x1f;
11347	  sreg = (oc >> 21) & 0x1f;
11348	  dreg = (oc >> 11) & 0x1f;
11349	  shamt = (oc >> 6) & 0x1f;
11350	  imm = oc;
11351	  for (args = p->args;; ++args)
11352	    {
11353	      switch (*args)
11354		{
11355		case '\0':
11356		  printf ("\n");
11357		  break;
11358
11359		case ',':
11360		case '(':
11361		case ')':
11362		  printf ("%c", *args);
11363		  continue;
11364
11365		case 'r':
11366		  assert (treg == sreg);
11367		  printf ("$%d,$%d", treg, sreg);
11368		  continue;
11369
11370		case 'd':
11371		case 'G':
11372		  printf ("$%d", dreg);
11373		  continue;
11374
11375		case 't':
11376		case 'E':
11377		  printf ("$%d", treg);
11378		  continue;
11379
11380		case 'k':
11381		  printf ("0x%x", treg);
11382		  continue;
11383
11384		case 'b':
11385		case 's':
11386		  printf ("$%d", sreg);
11387		  continue;
11388
11389		case 'a':
11390		  printf ("0x%08lx", oc & 0x1ffffff);
11391		  continue;
11392
11393		case 'i':
11394		case 'j':
11395		case 'o':
11396		case 'u':
11397		  printf ("%d", imm);
11398		  continue;
11399
11400		case '<':
11401		case '>':
11402		  printf ("$%d", shamt);
11403		  continue;
11404
11405		default:
11406		  internalError ();
11407		}
11408	      break;
11409	    }
11410	  return;
11411	}
11412    }
11413  printf (_("%08lx  UNDEFINED\n"), oc);
11414}
11415#endif
11416
11417static symbolS *
11418get_symbol (void)
11419{
11420  int c;
11421  char *name;
11422  symbolS *p;
11423
11424  name = input_line_pointer;
11425  c = get_symbol_end ();
11426  p = (symbolS *) symbol_find_or_make (name);
11427  *input_line_pointer = c;
11428  return p;
11429}
11430
11431/* Align the current frag to a given power of two.  The MIPS assembler
11432   also automatically adjusts any preceding label.  */
11433
11434static void
11435mips_align (int to, int fill, symbolS *label)
11436{
11437  mips_emit_delays (FALSE);
11438  frag_align (to, fill, 0);
11439  record_alignment (now_seg, to);
11440  if (label != NULL)
11441    {
11442      assert (S_GET_SEGMENT (label) == now_seg);
11443      symbol_set_frag (label, frag_now);
11444      S_SET_VALUE (label, (valueT) frag_now_fix ());
11445    }
11446}
11447
11448/* Align to a given power of two.  .align 0 turns off the automatic
11449   alignment used by the data creating pseudo-ops.  */
11450
11451static void
11452s_align (int x ATTRIBUTE_UNUSED)
11453{
11454  register int temp;
11455  register long temp_fill;
11456  long max_alignment = 15;
11457
11458  /*
11459
11460    o  Note that the assembler pulls down any immediately preceding label
11461       to the aligned address.
11462    o  It's not documented but auto alignment is reinstated by
11463       a .align pseudo instruction.
11464    o  Note also that after auto alignment is turned off the mips assembler
11465       issues an error on attempt to assemble an improperly aligned data item.
11466       We don't.
11467
11468    */
11469
11470  temp = get_absolute_expression ();
11471  if (temp > max_alignment)
11472    as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11473  else if (temp < 0)
11474    {
11475      as_warn (_("Alignment negative: 0 assumed."));
11476      temp = 0;
11477    }
11478  if (*input_line_pointer == ',')
11479    {
11480      ++input_line_pointer;
11481      temp_fill = get_absolute_expression ();
11482    }
11483  else
11484    temp_fill = 0;
11485  if (temp)
11486    {
11487      auto_align = 1;
11488      mips_align (temp, (int) temp_fill,
11489		  insn_labels != NULL ? insn_labels->label : NULL);
11490    }
11491  else
11492    {
11493      auto_align = 0;
11494    }
11495
11496  demand_empty_rest_of_line ();
11497}
11498
11499void
11500mips_flush_pending_output (void)
11501{
11502  mips_emit_delays (FALSE);
11503  mips_clear_insn_labels ();
11504}
11505
11506static void
11507s_change_sec (int sec)
11508{
11509  segT seg;
11510
11511  /* When generating embedded PIC code, we only use the .text, .lit8,
11512     .sdata and .sbss sections.  We change the .data and .rdata
11513     pseudo-ops to use .sdata.  */
11514  if (mips_pic == EMBEDDED_PIC
11515      && (sec == 'd' || sec == 'r'))
11516    sec = 's';
11517
11518#ifdef OBJ_ELF
11519  /* The ELF backend needs to know that we are changing sections, so
11520     that .previous works correctly.  We could do something like check
11521     for an obj_section_change_hook macro, but that might be confusing
11522     as it would not be appropriate to use it in the section changing
11523     functions in read.c, since obj-elf.c intercepts those.  FIXME:
11524     This should be cleaner, somehow.  */
11525  obj_elf_section_change_hook ();
11526#endif
11527
11528  mips_emit_delays (FALSE);
11529  switch (sec)
11530    {
11531    case 't':
11532      s_text (0);
11533      break;
11534    case 'd':
11535      s_data (0);
11536      break;
11537    case 'b':
11538      subseg_set (bss_section, (subsegT) get_absolute_expression ());
11539      demand_empty_rest_of_line ();
11540      break;
11541
11542    case 'r':
11543      if (USE_GLOBAL_POINTER_OPT)
11544	{
11545	  seg = subseg_new (RDATA_SECTION_NAME,
11546			    (subsegT) get_absolute_expression ());
11547	  if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11548	    {
11549	      bfd_set_section_flags (stdoutput, seg,
11550				     (SEC_ALLOC
11551				      | SEC_LOAD
11552				      | SEC_READONLY
11553				      | SEC_RELOC
11554				      | SEC_DATA));
11555	      if (strcmp (TARGET_OS, "elf") != 0)
11556		record_alignment (seg, 4);
11557	    }
11558	  demand_empty_rest_of_line ();
11559	}
11560      else
11561	{
11562	  as_bad (_("No read only data section in this object file format"));
11563	  demand_empty_rest_of_line ();
11564	  return;
11565	}
11566      break;
11567
11568    case 's':
11569      if (USE_GLOBAL_POINTER_OPT)
11570	{
11571	  seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11572	  if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11573	    {
11574	      bfd_set_section_flags (stdoutput, seg,
11575				     SEC_ALLOC | SEC_LOAD | SEC_RELOC
11576				     | SEC_DATA);
11577	      if (strcmp (TARGET_OS, "elf") != 0)
11578		record_alignment (seg, 4);
11579	    }
11580	  demand_empty_rest_of_line ();
11581	  break;
11582	}
11583      else
11584	{
11585	  as_bad (_("Global pointers not supported; recompile -G 0"));
11586	  demand_empty_rest_of_line ();
11587	  return;
11588	}
11589    }
11590
11591  auto_align = 1;
11592}
11593
11594void
11595s_change_section (int ignore ATTRIBUTE_UNUSED)
11596{
11597#ifdef OBJ_ELF
11598  char *section_name;
11599  char c;
11600  char next_c = 0;
11601  int section_type;
11602  int section_flag;
11603  int section_entry_size;
11604  int section_alignment;
11605
11606  if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11607    return;
11608
11609  section_name = input_line_pointer;
11610  c = get_symbol_end ();
11611  if (c)
11612    next_c = *(input_line_pointer + 1);
11613
11614  /* Do we have .section Name<,"flags">?  */
11615  if (c != ',' || (c == ',' && next_c == '"'))
11616    {
11617      /* just after name is now '\0'.  */
11618      *input_line_pointer = c;
11619      input_line_pointer = section_name;
11620      obj_elf_section (ignore);
11621      return;
11622    }
11623  input_line_pointer++;
11624
11625  /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
11626  if (c == ',')
11627    section_type = get_absolute_expression ();
11628  else
11629    section_type = 0;
11630  if (*input_line_pointer++ == ',')
11631    section_flag = get_absolute_expression ();
11632  else
11633    section_flag = 0;
11634  if (*input_line_pointer++ == ',')
11635    section_entry_size = get_absolute_expression ();
11636  else
11637    section_entry_size = 0;
11638  if (*input_line_pointer++ == ',')
11639    section_alignment = get_absolute_expression ();
11640  else
11641    section_alignment = 0;
11642
11643  section_name = xstrdup (section_name);
11644
11645  /* When using the generic form of .section (as implemented by obj-elf.c),
11646     there's no way to set the section type to SHT_MIPS_DWARF.  Users have
11647     traditionally had to fall back on the more common @progbits instead.
11648
11649     There's nothing really harmful in this, since bfd will correct
11650     SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
11651     means that, for backwards compatibiltiy, the special_section entries
11652     for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
11653
11654     Even so, we shouldn't force users of the MIPS .section syntax to
11655     incorrectly label the sections as SHT_PROGBITS.  The best compromise
11656     seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
11657     generic type-checking code.  */
11658  if (section_type == SHT_MIPS_DWARF)
11659    section_type = SHT_PROGBITS;
11660
11661  obj_elf_change_section (section_name, section_type, section_flag,
11662			  section_entry_size, 0, 0, 0);
11663
11664  if (now_seg->name != section_name)
11665    free (section_name);
11666#endif /* OBJ_ELF */
11667}
11668
11669void
11670mips_enable_auto_align (void)
11671{
11672  auto_align = 1;
11673}
11674
11675static void
11676s_cons (int log_size)
11677{
11678  symbolS *label;
11679
11680  label = insn_labels != NULL ? insn_labels->label : NULL;
11681  mips_emit_delays (FALSE);
11682  if (log_size > 0 && auto_align)
11683    mips_align (log_size, 0, label);
11684  mips_clear_insn_labels ();
11685  cons (1 << log_size);
11686}
11687
11688static void
11689s_float_cons (int type)
11690{
11691  symbolS *label;
11692
11693  label = insn_labels != NULL ? insn_labels->label : NULL;
11694
11695  mips_emit_delays (FALSE);
11696
11697  if (auto_align)
11698    {
11699      if (type == 'd')
11700	mips_align (3, 0, label);
11701      else
11702	mips_align (2, 0, label);
11703    }
11704
11705  mips_clear_insn_labels ();
11706
11707  float_cons (type);
11708}
11709
11710/* Handle .globl.  We need to override it because on Irix 5 you are
11711   permitted to say
11712       .globl foo .text
11713   where foo is an undefined symbol, to mean that foo should be
11714   considered to be the address of a function.  */
11715
11716static void
11717s_mips_globl (int x ATTRIBUTE_UNUSED)
11718{
11719  char *name;
11720  int c;
11721  symbolS *symbolP;
11722  flagword flag;
11723
11724  name = input_line_pointer;
11725  c = get_symbol_end ();
11726  symbolP = symbol_find_or_make (name);
11727  *input_line_pointer = c;
11728  SKIP_WHITESPACE ();
11729
11730  /* On Irix 5, every global symbol that is not explicitly labelled as
11731     being a function is apparently labelled as being an object.  */
11732  flag = BSF_OBJECT;
11733
11734  if (! is_end_of_line[(unsigned char) *input_line_pointer])
11735    {
11736      char *secname;
11737      asection *sec;
11738
11739      secname = input_line_pointer;
11740      c = get_symbol_end ();
11741      sec = bfd_get_section_by_name (stdoutput, secname);
11742      if (sec == NULL)
11743	as_bad (_("%s: no such section"), secname);
11744      *input_line_pointer = c;
11745
11746      if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11747	flag = BSF_FUNCTION;
11748    }
11749
11750  symbol_get_bfdsym (symbolP)->flags |= flag;
11751
11752  S_SET_EXTERNAL (symbolP);
11753  demand_empty_rest_of_line ();
11754}
11755
11756static void
11757s_option (int x ATTRIBUTE_UNUSED)
11758{
11759  char *opt;
11760  char c;
11761
11762  opt = input_line_pointer;
11763  c = get_symbol_end ();
11764
11765  if (*opt == 'O')
11766    {
11767      /* FIXME: What does this mean?  */
11768    }
11769  else if (strncmp (opt, "pic", 3) == 0)
11770    {
11771      int i;
11772
11773      i = atoi (opt + 3);
11774      if (i == 0)
11775	mips_pic = NO_PIC;
11776      else if (i == 2)
11777	{
11778	mips_pic = SVR4_PIC;
11779	  mips_abicalls = TRUE;
11780	}
11781      else
11782	as_bad (_(".option pic%d not supported"), i);
11783
11784      if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
11785	{
11786	  if (g_switch_seen && g_switch_value != 0)
11787	    as_warn (_("-G may not be used with SVR4 PIC code"));
11788	  g_switch_value = 0;
11789	  bfd_set_gp_size (stdoutput, 0);
11790	}
11791    }
11792  else
11793    as_warn (_("Unrecognized option \"%s\""), opt);
11794
11795  *input_line_pointer = c;
11796  demand_empty_rest_of_line ();
11797}
11798
11799/* This structure is used to hold a stack of .set values.  */
11800
11801struct mips_option_stack
11802{
11803  struct mips_option_stack *next;
11804  struct mips_set_options options;
11805};
11806
11807static struct mips_option_stack *mips_opts_stack;
11808
11809/* Handle the .set pseudo-op.  */
11810
11811static void
11812s_mipsset (int x ATTRIBUTE_UNUSED)
11813{
11814  char *name = input_line_pointer, ch;
11815
11816  while (!is_end_of_line[(unsigned char) *input_line_pointer])
11817    ++input_line_pointer;
11818  ch = *input_line_pointer;
11819  *input_line_pointer = '\0';
11820
11821  if (strcmp (name, "reorder") == 0)
11822    {
11823      if (mips_opts.noreorder && prev_nop_frag != NULL)
11824	{
11825	  /* If we still have pending nops, we can discard them.  The
11826	     usual nop handling will insert any that are still
11827	     needed.  */
11828	  prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11829				    * (mips_opts.mips16 ? 2 : 4));
11830	  prev_nop_frag = NULL;
11831	}
11832      mips_opts.noreorder = 0;
11833    }
11834  else if (strcmp (name, "noreorder") == 0)
11835    {
11836      mips_emit_delays (TRUE);
11837      mips_opts.noreorder = 1;
11838      mips_any_noreorder = 1;
11839    }
11840  else if (strcmp (name, "at") == 0)
11841    {
11842      mips_opts.noat = 0;
11843    }
11844  else if (strcmp (name, "noat") == 0)
11845    {
11846      mips_opts.noat = 1;
11847    }
11848  else if (strcmp (name, "macro") == 0)
11849    {
11850      mips_opts.warn_about_macros = 0;
11851    }
11852  else if (strcmp (name, "nomacro") == 0)
11853    {
11854      if (mips_opts.noreorder == 0)
11855	as_bad (_("`noreorder' must be set before `nomacro'"));
11856      mips_opts.warn_about_macros = 1;
11857    }
11858  else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
11859    {
11860      mips_opts.nomove = 0;
11861    }
11862  else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
11863    {
11864      mips_opts.nomove = 1;
11865    }
11866  else if (strcmp (name, "bopt") == 0)
11867    {
11868      mips_opts.nobopt = 0;
11869    }
11870  else if (strcmp (name, "nobopt") == 0)
11871    {
11872      mips_opts.nobopt = 1;
11873    }
11874  else if (strcmp (name, "mips16") == 0
11875	   || strcmp (name, "MIPS-16") == 0)
11876    mips_opts.mips16 = 1;
11877  else if (strcmp (name, "nomips16") == 0
11878	   || strcmp (name, "noMIPS-16") == 0)
11879    mips_opts.mips16 = 0;
11880  else if (strcmp (name, "mips3d") == 0)
11881    mips_opts.ase_mips3d = 1;
11882  else if (strcmp (name, "nomips3d") == 0)
11883    mips_opts.ase_mips3d = 0;
11884  else if (strcmp (name, "mdmx") == 0)
11885    mips_opts.ase_mdmx = 1;
11886  else if (strcmp (name, "nomdmx") == 0)
11887    mips_opts.ase_mdmx = 0;
11888  else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
11889    {
11890      int reset = 0;
11891
11892      /* Permit the user to change the ISA and architecture on the fly.
11893	 Needless to say, misuse can cause serious problems.  */
11894      if (strcmp (name, "mips0") == 0)
11895	{
11896	  reset = 1;
11897	  mips_opts.isa = file_mips_isa;
11898	}
11899      else if (strcmp (name, "mips1") == 0)
11900	mips_opts.isa = ISA_MIPS1;
11901      else if (strcmp (name, "mips2") == 0)
11902	mips_opts.isa = ISA_MIPS2;
11903      else if (strcmp (name, "mips3") == 0)
11904	mips_opts.isa = ISA_MIPS3;
11905      else if (strcmp (name, "mips4") == 0)
11906	mips_opts.isa = ISA_MIPS4;
11907      else if (strcmp (name, "mips5") == 0)
11908	mips_opts.isa = ISA_MIPS5;
11909      else if (strcmp (name, "mips32") == 0)
11910	mips_opts.isa = ISA_MIPS32;
11911      else if (strcmp (name, "mips32r2") == 0)
11912	mips_opts.isa = ISA_MIPS32R2;
11913      else if (strcmp (name, "mips64") == 0)
11914	mips_opts.isa = ISA_MIPS64;
11915      else if (strcmp (name, "mips64r2") == 0)
11916	mips_opts.isa = ISA_MIPS64R2;
11917      else if (strcmp (name, "arch=default") == 0)
11918	{
11919	  reset = 1;
11920	  mips_opts.arch = file_mips_arch;
11921	  mips_opts.isa = file_mips_isa;
11922	}
11923      else if (strncmp (name, "arch=", 5) == 0)
11924	{
11925	  const struct mips_cpu_info *p;
11926
11927	  p = mips_parse_cpu("internal use", name + 5);
11928	  if (!p)
11929	    as_bad (_("unknown architecture %s"), name + 5);
11930	  else
11931	    {
11932	      mips_opts.arch = p->cpu;
11933	      mips_opts.isa = p->isa;
11934	    }
11935	}
11936      else
11937	as_bad (_("unknown ISA level %s"), name + 4);
11938
11939      switch (mips_opts.isa)
11940	{
11941	case  0:
11942	  break;
11943	case ISA_MIPS1:
11944	case ISA_MIPS2:
11945	case ISA_MIPS32:
11946	case ISA_MIPS32R2:
11947	  mips_opts.gp32 = 1;
11948	  mips_opts.fp32 = 1;
11949	  break;
11950	case ISA_MIPS3:
11951	case ISA_MIPS4:
11952	case ISA_MIPS5:
11953	case ISA_MIPS64:
11954	case ISA_MIPS64R2:
11955	  mips_opts.gp32 = 0;
11956	  mips_opts.fp32 = 0;
11957	  break;
11958	default:
11959	  as_bad (_("unknown ISA level %s"), name + 4);
11960	  break;
11961	}
11962      if (reset)
11963	{
11964	  mips_opts.gp32 = file_mips_gp32;
11965	  mips_opts.fp32 = file_mips_fp32;
11966	}
11967    }
11968  else if (strcmp (name, "autoextend") == 0)
11969    mips_opts.noautoextend = 0;
11970  else if (strcmp (name, "noautoextend") == 0)
11971    mips_opts.noautoextend = 1;
11972  else if (strcmp (name, "push") == 0)
11973    {
11974      struct mips_option_stack *s;
11975
11976      s = (struct mips_option_stack *) xmalloc (sizeof *s);
11977      s->next = mips_opts_stack;
11978      s->options = mips_opts;
11979      mips_opts_stack = s;
11980    }
11981  else if (strcmp (name, "pop") == 0)
11982    {
11983      struct mips_option_stack *s;
11984
11985      s = mips_opts_stack;
11986      if (s == NULL)
11987	as_bad (_(".set pop with no .set push"));
11988      else
11989	{
11990	  /* If we're changing the reorder mode we need to handle
11991             delay slots correctly.  */
11992	  if (s->options.noreorder && ! mips_opts.noreorder)
11993	    mips_emit_delays (TRUE);
11994	  else if (! s->options.noreorder && mips_opts.noreorder)
11995	    {
11996	      if (prev_nop_frag != NULL)
11997		{
11998		  prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11999					    * (mips_opts.mips16 ? 2 : 4));
12000		  prev_nop_frag = NULL;
12001		}
12002	    }
12003
12004	  mips_opts = s->options;
12005	  mips_opts_stack = s->next;
12006	  free (s);
12007	}
12008    }
12009  else
12010    {
12011      as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12012    }
12013  *input_line_pointer = ch;
12014  demand_empty_rest_of_line ();
12015}
12016
12017/* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12018   .option pic2.  It means to generate SVR4 PIC calls.  */
12019
12020static void
12021s_abicalls (int ignore ATTRIBUTE_UNUSED)
12022{
12023  mips_pic = SVR4_PIC;
12024  mips_abicalls = TRUE;
12025  if (USE_GLOBAL_POINTER_OPT)
12026    {
12027      if (g_switch_seen && g_switch_value != 0)
12028	as_warn (_("-G may not be used with SVR4 PIC code"));
12029      g_switch_value = 0;
12030    }
12031  bfd_set_gp_size (stdoutput, 0);
12032  demand_empty_rest_of_line ();
12033}
12034
12035/* Handle the .cpload pseudo-op.  This is used when generating SVR4
12036   PIC code.  It sets the $gp register for the function based on the
12037   function address, which is in the register named in the argument.
12038   This uses a relocation against _gp_disp, which is handled specially
12039   by the linker.  The result is:
12040	lui	$gp,%hi(_gp_disp)
12041	addiu	$gp,$gp,%lo(_gp_disp)
12042	addu	$gp,$gp,.cpload argument
12043   The .cpload argument is normally $25 == $t9.  */
12044
12045static void
12046s_cpload (int ignore ATTRIBUTE_UNUSED)
12047{
12048  expressionS ex;
12049
12050  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12051     .cpload is ignored.  */
12052  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12053    {
12054      s_ignore (0);
12055      return;
12056    }
12057
12058  /* .cpload should be in a .set noreorder section.  */
12059  if (mips_opts.noreorder == 0)
12060    as_warn (_(".cpload not in noreorder section"));
12061
12062  ex.X_op = O_symbol;
12063  ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12064  ex.X_op_symbol = NULL;
12065  ex.X_add_number = 0;
12066
12067  /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12068  symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12069
12070  macro_start ();
12071  macro_build_lui (&ex, mips_gp_register);
12072  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12073	       mips_gp_register, BFD_RELOC_LO16);
12074  macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12075	       mips_gp_register, tc_get_register (0));
12076  macro_end ();
12077
12078  demand_empty_rest_of_line ();
12079}
12080
12081/* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12082     .cpsetup $reg1, offset|$reg2, label
12083
12084   If offset is given, this results in:
12085     sd		$gp, offset($sp)
12086     lui	$gp, %hi(%neg(%gp_rel(label)))
12087     addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
12088     daddu	$gp, $gp, $reg1
12089
12090   If $reg2 is given, this results in:
12091     daddu	$reg2, $gp, $0
12092     lui	$gp, %hi(%neg(%gp_rel(label)))
12093     addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
12094     daddu	$gp, $gp, $reg1
12095   $reg1 is normally $25 == $t9.  */
12096static void
12097s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12098{
12099  expressionS ex_off;
12100  expressionS ex_sym;
12101  int reg1;
12102  char *f;
12103
12104  /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12105     We also need NewABI support.  */
12106  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12107    {
12108      s_ignore (0);
12109      return;
12110    }
12111
12112  reg1 = tc_get_register (0);
12113  SKIP_WHITESPACE ();
12114  if (*input_line_pointer != ',')
12115    {
12116      as_bad (_("missing argument separator ',' for .cpsetup"));
12117      return;
12118    }
12119  else
12120    ++input_line_pointer;
12121  SKIP_WHITESPACE ();
12122  if (*input_line_pointer == '$')
12123    {
12124      mips_cpreturn_register = tc_get_register (0);
12125      mips_cpreturn_offset = -1;
12126    }
12127  else
12128    {
12129      mips_cpreturn_offset = get_absolute_expression ();
12130      mips_cpreturn_register = -1;
12131    }
12132  SKIP_WHITESPACE ();
12133  if (*input_line_pointer != ',')
12134    {
12135      as_bad (_("missing argument separator ',' for .cpsetup"));
12136      return;
12137    }
12138  else
12139    ++input_line_pointer;
12140  SKIP_WHITESPACE ();
12141  expression (&ex_sym);
12142
12143  macro_start ();
12144  if (mips_cpreturn_register == -1)
12145    {
12146      ex_off.X_op = O_constant;
12147      ex_off.X_add_symbol = NULL;
12148      ex_off.X_op_symbol = NULL;
12149      ex_off.X_add_number = mips_cpreturn_offset;
12150
12151      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12152		   BFD_RELOC_LO16, SP);
12153    }
12154  else
12155    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12156		 mips_gp_register, 0);
12157
12158  /* Ensure there's room for the next two instructions, so that `f'
12159     doesn't end up with an address in the wrong frag.  */
12160  frag_grow (8);
12161  f = frag_more (0);
12162  macro_build (&ex_sym, "lui", "t,u", mips_gp_register, BFD_RELOC_GPREL16);
12163  fix_new (frag_now, f - frag_now->fr_literal,
12164	   8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12165  fix_new (frag_now, f - frag_now->fr_literal,
12166	   4, NULL, 0, 0, BFD_RELOC_HI16_S);
12167
12168  f = frag_more (0);
12169  macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12170	       mips_gp_register, BFD_RELOC_GPREL16);
12171  fix_new (frag_now, f - frag_now->fr_literal,
12172	   8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12173  fix_new (frag_now, f - frag_now->fr_literal,
12174	   4, NULL, 0, 0, BFD_RELOC_LO16);
12175
12176  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12177	       mips_gp_register, reg1);
12178  macro_end ();
12179
12180  demand_empty_rest_of_line ();
12181}
12182
12183static void
12184s_cplocal (int ignore ATTRIBUTE_UNUSED)
12185{
12186  /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12187   .cplocal is ignored.  */
12188  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12189    {
12190      s_ignore (0);
12191      return;
12192    }
12193
12194  mips_gp_register = tc_get_register (0);
12195  demand_empty_rest_of_line ();
12196}
12197
12198/* Handle the .cprestore pseudo-op.  This stores $gp into a given
12199   offset from $sp.  The offset is remembered, and after making a PIC
12200   call $gp is restored from that location.  */
12201
12202static void
12203s_cprestore (int ignore ATTRIBUTE_UNUSED)
12204{
12205  expressionS ex;
12206
12207  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12208     .cprestore is ignored.  */
12209  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12210    {
12211      s_ignore (0);
12212      return;
12213    }
12214
12215  mips_cprestore_offset = get_absolute_expression ();
12216  mips_cprestore_valid = 1;
12217
12218  ex.X_op = O_constant;
12219  ex.X_add_symbol = NULL;
12220  ex.X_op_symbol = NULL;
12221  ex.X_add_number = mips_cprestore_offset;
12222
12223  macro_start ();
12224  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12225				SP, HAVE_64BIT_ADDRESSES);
12226  macro_end ();
12227
12228  demand_empty_rest_of_line ();
12229}
12230
12231/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12232   was given in the preceding .cpsetup, it results in:
12233     ld		$gp, offset($sp)
12234
12235   If a register $reg2 was given there, it results in:
12236     daddu	$gp, $reg2, $0
12237 */
12238static void
12239s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12240{
12241  expressionS ex;
12242
12243  /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12244     We also need NewABI support.  */
12245  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12246    {
12247      s_ignore (0);
12248      return;
12249    }
12250
12251  macro_start ();
12252  if (mips_cpreturn_register == -1)
12253    {
12254      ex.X_op = O_constant;
12255      ex.X_add_symbol = NULL;
12256      ex.X_op_symbol = NULL;
12257      ex.X_add_number = mips_cpreturn_offset;
12258
12259      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12260    }
12261  else
12262    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12263		 mips_cpreturn_register, 0);
12264  macro_end ();
12265
12266  demand_empty_rest_of_line ();
12267}
12268
12269/* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12270   code.  It sets the offset to use in gp_rel relocations.  */
12271
12272static void
12273s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12274{
12275  /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12276     We also need NewABI support.  */
12277  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12278    {
12279      s_ignore (0);
12280      return;
12281    }
12282
12283  mips_gprel_offset = get_absolute_expression ();
12284
12285  demand_empty_rest_of_line ();
12286}
12287
12288/* Handle the .gpword pseudo-op.  This is used when generating PIC
12289   code.  It generates a 32 bit GP relative reloc.  */
12290
12291static void
12292s_gpword (int ignore ATTRIBUTE_UNUSED)
12293{
12294  symbolS *label;
12295  expressionS ex;
12296  char *p;
12297
12298  /* When not generating PIC code, this is treated as .word.  */
12299  if (mips_pic != SVR4_PIC)
12300    {
12301      s_cons (2);
12302      return;
12303    }
12304
12305  label = insn_labels != NULL ? insn_labels->label : NULL;
12306  mips_emit_delays (TRUE);
12307  if (auto_align)
12308    mips_align (2, 0, label);
12309  mips_clear_insn_labels ();
12310
12311  expression (&ex);
12312
12313  if (ex.X_op != O_symbol || ex.X_add_number != 0)
12314    {
12315      as_bad (_("Unsupported use of .gpword"));
12316      ignore_rest_of_line ();
12317    }
12318
12319  p = frag_more (4);
12320  md_number_to_chars (p, 0, 4);
12321  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12322	       BFD_RELOC_GPREL32);
12323
12324  demand_empty_rest_of_line ();
12325}
12326
12327static void
12328s_gpdword (int ignore ATTRIBUTE_UNUSED)
12329{
12330  symbolS *label;
12331  expressionS ex;
12332  char *p;
12333
12334  /* When not generating PIC code, this is treated as .dword.  */
12335  if (mips_pic != SVR4_PIC)
12336    {
12337      s_cons (3);
12338      return;
12339    }
12340
12341  label = insn_labels != NULL ? insn_labels->label : NULL;
12342  mips_emit_delays (TRUE);
12343  if (auto_align)
12344    mips_align (3, 0, label);
12345  mips_clear_insn_labels ();
12346
12347  expression (&ex);
12348
12349  if (ex.X_op != O_symbol || ex.X_add_number != 0)
12350    {
12351      as_bad (_("Unsupported use of .gpdword"));
12352      ignore_rest_of_line ();
12353    }
12354
12355  p = frag_more (8);
12356  md_number_to_chars (p, 0, 8);
12357  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12358	       BFD_RELOC_GPREL32);
12359
12360  /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12361  ex.X_op = O_absent;
12362  ex.X_add_symbol = 0;
12363  ex.X_add_number = 0;
12364  fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12365	       BFD_RELOC_64);
12366
12367  demand_empty_rest_of_line ();
12368}
12369
12370/* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12371   tables in SVR4 PIC code.  */
12372
12373static void
12374s_cpadd (int ignore ATTRIBUTE_UNUSED)
12375{
12376  int reg;
12377
12378  /* This is ignored when not generating SVR4 PIC code.  */
12379  if (mips_pic != SVR4_PIC)
12380    {
12381      s_ignore (0);
12382      return;
12383    }
12384
12385  /* Add $gp to the register named as an argument.  */
12386  macro_start ();
12387  reg = tc_get_register (0);
12388  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12389  macro_end ();
12390
12391  demand_empty_rest_of_line ();
12392}
12393
12394/* Handle the .insn pseudo-op.  This marks instruction labels in
12395   mips16 mode.  This permits the linker to handle them specially,
12396   such as generating jalx instructions when needed.  We also make
12397   them odd for the duration of the assembly, in order to generate the
12398   right sort of code.  We will make them even in the adjust_symtab
12399   routine, while leaving them marked.  This is convenient for the
12400   debugger and the disassembler.  The linker knows to make them odd
12401   again.  */
12402
12403static void
12404s_insn (int ignore ATTRIBUTE_UNUSED)
12405{
12406  mips16_mark_labels ();
12407
12408  demand_empty_rest_of_line ();
12409}
12410
12411/* Handle a .stabn directive.  We need these in order to mark a label
12412   as being a mips16 text label correctly.  Sometimes the compiler
12413   will emit a label, followed by a .stabn, and then switch sections.
12414   If the label and .stabn are in mips16 mode, then the label is
12415   really a mips16 text label.  */
12416
12417static void
12418s_mips_stab (int type)
12419{
12420  if (type == 'n')
12421    mips16_mark_labels ();
12422
12423  s_stab (type);
12424}
12425
12426/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12427 */
12428
12429static void
12430s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12431{
12432  char *name;
12433  int c;
12434  symbolS *symbolP;
12435  expressionS exp;
12436
12437  name = input_line_pointer;
12438  c = get_symbol_end ();
12439  symbolP = symbol_find_or_make (name);
12440  S_SET_WEAK (symbolP);
12441  *input_line_pointer = c;
12442
12443  SKIP_WHITESPACE ();
12444
12445  if (! is_end_of_line[(unsigned char) *input_line_pointer])
12446    {
12447      if (S_IS_DEFINED (symbolP))
12448	{
12449	  as_bad ("ignoring attempt to redefine symbol %s",
12450		  S_GET_NAME (symbolP));
12451	  ignore_rest_of_line ();
12452	  return;
12453	}
12454
12455      if (*input_line_pointer == ',')
12456	{
12457	  ++input_line_pointer;
12458	  SKIP_WHITESPACE ();
12459	}
12460
12461      expression (&exp);
12462      if (exp.X_op != O_symbol)
12463	{
12464	  as_bad ("bad .weakext directive");
12465	  ignore_rest_of_line ();
12466	  return;
12467	}
12468      symbol_set_value_expression (symbolP, &exp);
12469    }
12470
12471  demand_empty_rest_of_line ();
12472}
12473
12474/* Parse a register string into a number.  Called from the ECOFF code
12475   to parse .frame.  The argument is non-zero if this is the frame
12476   register, so that we can record it in mips_frame_reg.  */
12477
12478int
12479tc_get_register (int frame)
12480{
12481  int reg;
12482
12483  SKIP_WHITESPACE ();
12484  if (*input_line_pointer++ != '$')
12485    {
12486      as_warn (_("expected `$'"));
12487      reg = ZERO;
12488    }
12489  else if (ISDIGIT (*input_line_pointer))
12490    {
12491      reg = get_absolute_expression ();
12492      if (reg < 0 || reg >= 32)
12493	{
12494	  as_warn (_("Bad register number"));
12495	  reg = ZERO;
12496	}
12497    }
12498  else
12499    {
12500      if (strncmp (input_line_pointer, "ra", 2) == 0)
12501	{
12502	  reg = RA;
12503	  input_line_pointer += 2;
12504	}
12505      else if (strncmp (input_line_pointer, "fp", 2) == 0)
12506	{
12507	  reg = FP;
12508	  input_line_pointer += 2;
12509	}
12510      else if (strncmp (input_line_pointer, "sp", 2) == 0)
12511	{
12512	  reg = SP;
12513	  input_line_pointer += 2;
12514	}
12515      else if (strncmp (input_line_pointer, "gp", 2) == 0)
12516	{
12517	  reg = GP;
12518	  input_line_pointer += 2;
12519	}
12520      else if (strncmp (input_line_pointer, "at", 2) == 0)
12521	{
12522	  reg = AT;
12523	  input_line_pointer += 2;
12524	}
12525      else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12526	{
12527	  reg = KT0;
12528	  input_line_pointer += 3;
12529	}
12530      else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12531	{
12532	  reg = KT1;
12533	  input_line_pointer += 3;
12534	}
12535      else if (strncmp (input_line_pointer, "zero", 4) == 0)
12536	{
12537	  reg = ZERO;
12538	  input_line_pointer += 4;
12539	}
12540      else
12541	{
12542	  as_warn (_("Unrecognized register name"));
12543	  reg = ZERO;
12544	  while (ISALNUM(*input_line_pointer))
12545	   input_line_pointer++;
12546	}
12547    }
12548  if (frame)
12549    {
12550      mips_frame_reg = reg != 0 ? reg : SP;
12551      mips_frame_reg_valid = 1;
12552      mips_cprestore_valid = 0;
12553    }
12554  return reg;
12555}
12556
12557valueT
12558md_section_align (asection *seg, valueT addr)
12559{
12560  int align = bfd_get_section_alignment (stdoutput, seg);
12561
12562#ifdef OBJ_ELF
12563  /* We don't need to align ELF sections to the full alignment.
12564     However, Irix 5 may prefer that we align them at least to a 16
12565     byte boundary.  We don't bother to align the sections if we are
12566     targeted for an embedded system.  */
12567  if (strcmp (TARGET_OS, "elf") == 0)
12568    return addr;
12569  if (align > 4)
12570    align = 4;
12571#endif
12572
12573  return ((addr + (1 << align) - 1) & (-1 << align));
12574}
12575
12576/* Utility routine, called from above as well.  If called while the
12577   input file is still being read, it's only an approximation.  (For
12578   example, a symbol may later become defined which appeared to be
12579   undefined earlier.)  */
12580
12581static int
12582nopic_need_relax (symbolS *sym, int before_relaxing)
12583{
12584  if (sym == 0)
12585    return 0;
12586
12587  if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
12588    {
12589      const char *symname;
12590      int change;
12591
12592      /* Find out whether this symbol can be referenced off the $gp
12593	 register.  It can be if it is smaller than the -G size or if
12594	 it is in the .sdata or .sbss section.  Certain symbols can
12595	 not be referenced off the $gp, although it appears as though
12596	 they can.  */
12597      symname = S_GET_NAME (sym);
12598      if (symname != (const char *) NULL
12599	  && (strcmp (symname, "eprol") == 0
12600	      || strcmp (symname, "etext") == 0
12601	      || strcmp (symname, "_gp") == 0
12602	      || strcmp (symname, "edata") == 0
12603	      || strcmp (symname, "_fbss") == 0
12604	      || strcmp (symname, "_fdata") == 0
12605	      || strcmp (symname, "_ftext") == 0
12606	      || strcmp (symname, "end") == 0
12607	      || strcmp (symname, "_gp_disp") == 0))
12608	change = 1;
12609      else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12610	       && (0
12611#ifndef NO_ECOFF_DEBUGGING
12612		   || (symbol_get_obj (sym)->ecoff_extern_size != 0
12613		       && (symbol_get_obj (sym)->ecoff_extern_size
12614			   <= g_switch_value))
12615#endif
12616		   /* We must defer this decision until after the whole
12617		      file has been read, since there might be a .extern
12618		      after the first use of this symbol.  */
12619		   || (before_relaxing
12620#ifndef NO_ECOFF_DEBUGGING
12621		       && symbol_get_obj (sym)->ecoff_extern_size == 0
12622#endif
12623		       && S_GET_VALUE (sym) == 0)
12624		   || (S_GET_VALUE (sym) != 0
12625		       && S_GET_VALUE (sym) <= g_switch_value)))
12626	change = 0;
12627      else
12628	{
12629	  const char *segname;
12630
12631	  segname = segment_name (S_GET_SEGMENT (sym));
12632	  assert (strcmp (segname, ".lit8") != 0
12633		  && strcmp (segname, ".lit4") != 0);
12634	  change = (strcmp (segname, ".sdata") != 0
12635		    && strcmp (segname, ".sbss") != 0
12636		    && strncmp (segname, ".sdata.", 7) != 0
12637		    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
12638	}
12639      return change;
12640    }
12641  else
12642    /* We are not optimizing for the $gp register.  */
12643    return 1;
12644}
12645
12646
12647/* Return true if the given symbol should be considered local for SVR4 PIC.  */
12648
12649static bfd_boolean
12650pic_need_relax (symbolS *sym, asection *segtype)
12651{
12652  asection *symsec;
12653  bfd_boolean linkonce;
12654
12655  /* Handle the case of a symbol equated to another symbol.  */
12656  while (symbol_equated_reloc_p (sym))
12657    {
12658      symbolS *n;
12659
12660      /* It's possible to get a loop here in a badly written
12661	 program.  */
12662      n = symbol_get_value_expression (sym)->X_add_symbol;
12663      if (n == sym)
12664	break;
12665      sym = n;
12666    }
12667
12668  symsec = S_GET_SEGMENT (sym);
12669
12670  /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12671  linkonce = FALSE;
12672  if (symsec != segtype && ! S_IS_LOCAL (sym))
12673    {
12674      if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12675	  != 0)
12676	linkonce = TRUE;
12677
12678      /* The GNU toolchain uses an extension for ELF: a section
12679	 beginning with the magic string .gnu.linkonce is a linkonce
12680	 section.  */
12681      if (strncmp (segment_name (symsec), ".gnu.linkonce",
12682		   sizeof ".gnu.linkonce" - 1) == 0)
12683	linkonce = TRUE;
12684    }
12685
12686  /* This must duplicate the test in adjust_reloc_syms.  */
12687  return (symsec != &bfd_und_section
12688	  && symsec != &bfd_abs_section
12689	  && ! bfd_is_com_section (symsec)
12690	  && !linkonce
12691#ifdef OBJ_ELF
12692	  /* A global or weak symbol is treated as external.  */
12693	  && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12694	      || (! S_IS_WEAK (sym)
12695		  && (! S_IS_EXTERNAL (sym)
12696		      || mips_pic == EMBEDDED_PIC)))
12697#endif
12698	  );
12699}
12700
12701
12702/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12703   extended opcode.  SEC is the section the frag is in.  */
12704
12705static int
12706mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
12707{
12708  int type;
12709  register const struct mips16_immed_operand *op;
12710  offsetT val;
12711  int mintiny, maxtiny;
12712  segT symsec;
12713  fragS *sym_frag;
12714
12715  if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12716    return 0;
12717  if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12718    return 1;
12719
12720  type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12721  op = mips16_immed_operands;
12722  while (op->type != type)
12723    {
12724      ++op;
12725      assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12726    }
12727
12728  if (op->unsp)
12729    {
12730      if (type == '<' || type == '>' || type == '[' || type == ']')
12731	{
12732	  mintiny = 1;
12733	  maxtiny = 1 << op->nbits;
12734	}
12735      else
12736	{
12737	  mintiny = 0;
12738	  maxtiny = (1 << op->nbits) - 1;
12739	}
12740    }
12741  else
12742    {
12743      mintiny = - (1 << (op->nbits - 1));
12744      maxtiny = (1 << (op->nbits - 1)) - 1;
12745    }
12746
12747  sym_frag = symbol_get_frag (fragp->fr_symbol);
12748  val = S_GET_VALUE (fragp->fr_symbol);
12749  symsec = S_GET_SEGMENT (fragp->fr_symbol);
12750
12751  if (op->pcrel)
12752    {
12753      addressT addr;
12754
12755      /* We won't have the section when we are called from
12756         mips_relax_frag.  However, we will always have been called
12757         from md_estimate_size_before_relax first.  If this is a
12758         branch to a different section, we mark it as such.  If SEC is
12759         NULL, and the frag is not marked, then it must be a branch to
12760         the same section.  */
12761      if (sec == NULL)
12762	{
12763	  if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12764	    return 1;
12765	}
12766      else
12767	{
12768	  /* Must have been called from md_estimate_size_before_relax.  */
12769	  if (symsec != sec)
12770	    {
12771	      fragp->fr_subtype =
12772		RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12773
12774	      /* FIXME: We should support this, and let the linker
12775                 catch branches and loads that are out of range.  */
12776	      as_bad_where (fragp->fr_file, fragp->fr_line,
12777			    _("unsupported PC relative reference to different section"));
12778
12779	      return 1;
12780	    }
12781	  if (fragp != sym_frag && sym_frag->fr_address == 0)
12782	    /* Assume non-extended on the first relaxation pass.
12783	       The address we have calculated will be bogus if this is
12784	       a forward branch to another frag, as the forward frag
12785	       will have fr_address == 0.  */
12786	    return 0;
12787	}
12788
12789      /* In this case, we know for sure that the symbol fragment is in
12790	 the same section.  If the relax_marker of the symbol fragment
12791	 differs from the relax_marker of this fragment, we have not
12792	 yet adjusted the symbol fragment fr_address.  We want to add
12793	 in STRETCH in order to get a better estimate of the address.
12794	 This particularly matters because of the shift bits.  */
12795      if (stretch != 0
12796	  && sym_frag->relax_marker != fragp->relax_marker)
12797	{
12798	  fragS *f;
12799
12800	  /* Adjust stretch for any alignment frag.  Note that if have
12801             been expanding the earlier code, the symbol may be
12802             defined in what appears to be an earlier frag.  FIXME:
12803             This doesn't handle the fr_subtype field, which specifies
12804             a maximum number of bytes to skip when doing an
12805             alignment.  */
12806	  for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12807	    {
12808	      if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12809		{
12810		  if (stretch < 0)
12811		    stretch = - ((- stretch)
12812				 & ~ ((1 << (int) f->fr_offset) - 1));
12813		  else
12814		    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
12815		  if (stretch == 0)
12816		    break;
12817		}
12818	    }
12819	  if (f != NULL)
12820	    val += stretch;
12821	}
12822
12823      addr = fragp->fr_address + fragp->fr_fix;
12824
12825      /* The base address rules are complicated.  The base address of
12826         a branch is the following instruction.  The base address of a
12827         PC relative load or add is the instruction itself, but if it
12828         is in a delay slot (in which case it can not be extended) use
12829         the address of the instruction whose delay slot it is in.  */
12830      if (type == 'p' || type == 'q')
12831	{
12832	  addr += 2;
12833
12834	  /* If we are currently assuming that this frag should be
12835	     extended, then, the current address is two bytes
12836	     higher.  */
12837	  if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12838	    addr += 2;
12839
12840	  /* Ignore the low bit in the target, since it will be set
12841             for a text label.  */
12842	  if ((val & 1) != 0)
12843	    --val;
12844	}
12845      else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12846	addr -= 4;
12847      else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12848	addr -= 2;
12849
12850      val -= addr & ~ ((1 << op->shift) - 1);
12851
12852      /* Branch offsets have an implicit 0 in the lowest bit.  */
12853      if (type == 'p' || type == 'q')
12854	val /= 2;
12855
12856      /* If any of the shifted bits are set, we must use an extended
12857         opcode.  If the address depends on the size of this
12858         instruction, this can lead to a loop, so we arrange to always
12859         use an extended opcode.  We only check this when we are in
12860         the main relaxation loop, when SEC is NULL.  */
12861      if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
12862	{
12863	  fragp->fr_subtype =
12864	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12865	  return 1;
12866	}
12867
12868      /* If we are about to mark a frag as extended because the value
12869         is precisely maxtiny + 1, then there is a chance of an
12870         infinite loop as in the following code:
12871	     la	$4,foo
12872	     .skip	1020
12873	     .align	2
12874	   foo:
12875	 In this case when the la is extended, foo is 0x3fc bytes
12876	 away, so the la can be shrunk, but then foo is 0x400 away, so
12877	 the la must be extended.  To avoid this loop, we mark the
12878	 frag as extended if it was small, and is about to become
12879	 extended with a value of maxtiny + 1.  */
12880      if (val == ((maxtiny + 1) << op->shift)
12881	  && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
12882	  && sec == NULL)
12883	{
12884	  fragp->fr_subtype =
12885	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12886	  return 1;
12887	}
12888    }
12889  else if (symsec != absolute_section && sec != NULL)
12890    as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
12891
12892  if ((val & ((1 << op->shift) - 1)) != 0
12893      || val < (mintiny << op->shift)
12894      || val > (maxtiny << op->shift))
12895    return 1;
12896  else
12897    return 0;
12898}
12899
12900/* Compute the length of a branch sequence, and adjust the
12901   RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
12902   worst-case length is computed, with UPDATE being used to indicate
12903   whether an unconditional (-1), branch-likely (+1) or regular (0)
12904   branch is to be computed.  */
12905static int
12906relaxed_branch_length (fragS *fragp, asection *sec, int update)
12907{
12908  bfd_boolean toofar;
12909  int length;
12910
12911  if (fragp
12912      && S_IS_DEFINED (fragp->fr_symbol)
12913      && sec == S_GET_SEGMENT (fragp->fr_symbol))
12914    {
12915      addressT addr;
12916      offsetT val;
12917
12918      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
12919
12920      addr = fragp->fr_address + fragp->fr_fix + 4;
12921
12922      val -= addr;
12923
12924      toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
12925    }
12926  else if (fragp)
12927    /* If the symbol is not defined or it's in a different segment,
12928       assume the user knows what's going on and emit a short
12929       branch.  */
12930    toofar = FALSE;
12931  else
12932    toofar = TRUE;
12933
12934  if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
12935    fragp->fr_subtype
12936      = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
12937			     RELAX_BRANCH_LIKELY (fragp->fr_subtype),
12938			     RELAX_BRANCH_LINK (fragp->fr_subtype),
12939			     toofar);
12940
12941  length = 4;
12942  if (toofar)
12943    {
12944      if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
12945	length += 8;
12946
12947      if (mips_pic != NO_PIC)
12948	{
12949	  /* Additional space for PIC loading of target address.  */
12950	  length += 8;
12951	  if (mips_opts.isa == ISA_MIPS1)
12952	    /* Additional space for $at-stabilizing nop.  */
12953	    length += 4;
12954	}
12955
12956      /* If branch is conditional.  */
12957      if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
12958	length += 8;
12959    }
12960
12961  return length;
12962}
12963
12964/* Estimate the size of a frag before relaxing.  Unless this is the
12965   mips16, we are not really relaxing here, and the final size is
12966   encoded in the subtype information.  For the mips16, we have to
12967   decide whether we are using an extended opcode or not.  */
12968
12969int
12970md_estimate_size_before_relax (fragS *fragp, asection *segtype)
12971{
12972  int change;
12973
12974  if (RELAX_BRANCH_P (fragp->fr_subtype))
12975    {
12976
12977      fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
12978
12979      return fragp->fr_var;
12980    }
12981
12982  if (RELAX_MIPS16_P (fragp->fr_subtype))
12983    /* We don't want to modify the EXTENDED bit here; it might get us
12984       into infinite loops.  We change it only in mips_relax_frag().  */
12985    return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
12986
12987  if (mips_pic == NO_PIC)
12988    change = nopic_need_relax (fragp->fr_symbol, 0);
12989  else if (mips_pic == SVR4_PIC)
12990    change = pic_need_relax (fragp->fr_symbol, segtype);
12991  else
12992    abort ();
12993
12994  if (change)
12995    {
12996      fragp->fr_subtype |= RELAX_USE_SECOND;
12997      return -RELAX_FIRST (fragp->fr_subtype);
12998    }
12999  else
13000    return -RELAX_SECOND (fragp->fr_subtype);
13001}
13002
13003/* This is called to see whether a reloc against a defined symbol
13004   should be converted into a reloc against a section.  Don't adjust
13005   MIPS16 jump relocations, so we don't have to worry about the format
13006   of the offset in the .o file.  Don't adjust relocations against
13007   mips16 symbols, so that the linker can find them if it needs to set
13008   up a stub.  */
13009
13010int
13011mips_fix_adjustable (fixS *fixp)
13012{
13013  if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13014    return 0;
13015
13016  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13017      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13018    return 0;
13019
13020  if (fixp->fx_addsy == NULL)
13021    return 1;
13022
13023#ifdef OBJ_ELF
13024  if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13025      && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13026      && fixp->fx_subsy == NULL)
13027    return 0;
13028#endif
13029
13030  return 1;
13031}
13032
13033/* Translate internal representation of relocation info to BFD target
13034   format.  */
13035
13036arelent **
13037tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13038{
13039  static arelent *retval[4];
13040  arelent *reloc;
13041  bfd_reloc_code_real_type code;
13042
13043  memset (retval, 0, sizeof(retval));
13044  reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13045  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13046  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13047  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13048
13049  if (mips_pic == EMBEDDED_PIC
13050      && SWITCH_TABLE (fixp))
13051    {
13052      /* For a switch table entry we use a special reloc.  The addend
13053	 is actually the difference between the reloc address and the
13054	 subtrahend.  */
13055      reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13056      if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13057	as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13058      fixp->fx_r_type = BFD_RELOC_GPREL32;
13059    }
13060  else if (fixp->fx_pcrel)
13061    {
13062      bfd_vma pcrel_address;
13063
13064      /* Set PCREL_ADDRESS to this relocation's "PC".  The PC for high
13065	 high-part relocs is the address of the low-part reloc.  */
13066      if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13067	{
13068	  assert (fixp->fx_next != NULL
13069		  && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
13070	  pcrel_address = (fixp->fx_next->fx_where
13071			   + fixp->fx_next->fx_frag->fr_address);
13072	}
13073      else
13074	pcrel_address = reloc->address;
13075
13076      if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13077	{
13078	  /* At this point, fx_addnumber is "symbol offset - pcrel_address".
13079	     Relocations want only the symbol offset.  */
13080	  reloc->addend = fixp->fx_addnumber + pcrel_address;
13081	}
13082      else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16
13083	       || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13084	{
13085	  /* We use a special addend for an internal RELLO or RELHI reloc.  */
13086	  if (symbol_section_p (fixp->fx_addsy))
13087	    reloc->addend = pcrel_address - S_GET_VALUE (fixp->fx_subsy);
13088	  else
13089	    reloc->addend = fixp->fx_addnumber + pcrel_address;
13090	}
13091      else
13092	{
13093	  if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13094	    /* A gruesome hack which is a result of the gruesome gas reloc
13095	       handling.  */
13096	    reloc->addend = pcrel_address;
13097	  else
13098	    reloc->addend = -pcrel_address;
13099	}
13100    }
13101  else
13102    reloc->addend = fixp->fx_addnumber;
13103
13104  /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13105     entry to be used in the relocation's section offset.  */
13106  if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13107    {
13108      reloc->address = reloc->addend;
13109      reloc->addend = 0;
13110    }
13111
13112  /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13113     fixup_segment converted a non-PC relative reloc into a PC
13114     relative reloc.  In such a case, we need to convert the reloc
13115     code.  */
13116  code = fixp->fx_r_type;
13117  if (fixp->fx_pcrel)
13118    {
13119      switch (code)
13120	{
13121	case BFD_RELOC_8:
13122	  code = BFD_RELOC_8_PCREL;
13123	  break;
13124	case BFD_RELOC_16:
13125	  code = BFD_RELOC_16_PCREL;
13126	  break;
13127	case BFD_RELOC_32:
13128	  code = BFD_RELOC_32_PCREL;
13129	  break;
13130	case BFD_RELOC_64:
13131	  code = BFD_RELOC_64_PCREL;
13132	  break;
13133	case BFD_RELOC_8_PCREL:
13134	case BFD_RELOC_16_PCREL:
13135	case BFD_RELOC_32_PCREL:
13136	case BFD_RELOC_64_PCREL:
13137	case BFD_RELOC_16_PCREL_S2:
13138	case BFD_RELOC_PCREL_HI16_S:
13139	case BFD_RELOC_PCREL_LO16:
13140	  break;
13141	default:
13142	  as_bad_where (fixp->fx_file, fixp->fx_line,
13143			_("Cannot make %s relocation PC relative"),
13144			bfd_get_reloc_code_name (code));
13145	}
13146    }
13147
13148  /* To support a PC relative reloc when generating embedded PIC code
13149     for ECOFF, we use a Cygnus extension.  We check for that here to
13150     make sure that we don't let such a reloc escape normally.  */
13151  if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13152       || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13153      && code == BFD_RELOC_16_PCREL_S2
13154      && mips_pic != EMBEDDED_PIC)
13155    reloc->howto = NULL;
13156  else
13157    reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13158
13159  if (reloc->howto == NULL)
13160    {
13161      as_bad_where (fixp->fx_file, fixp->fx_line,
13162		    _("Can not represent %s relocation in this object file format"),
13163		    bfd_get_reloc_code_name (code));
13164      retval[0] = NULL;
13165    }
13166
13167  return retval;
13168}
13169
13170/* Relax a machine dependent frag.  This returns the amount by which
13171   the current size of the frag should change.  */
13172
13173int
13174mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13175{
13176  if (RELAX_BRANCH_P (fragp->fr_subtype))
13177    {
13178      offsetT old_var = fragp->fr_var;
13179
13180      fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13181
13182      return fragp->fr_var - old_var;
13183    }
13184
13185  if (! RELAX_MIPS16_P (fragp->fr_subtype))
13186    return 0;
13187
13188  if (mips16_extended_frag (fragp, NULL, stretch))
13189    {
13190      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13191	return 0;
13192      fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13193      return 2;
13194    }
13195  else
13196    {
13197      if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13198	return 0;
13199      fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13200      return -2;
13201    }
13202
13203  return 0;
13204}
13205
13206/* Convert a machine dependent frag.  */
13207
13208void
13209md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13210{
13211  if (RELAX_BRANCH_P (fragp->fr_subtype))
13212    {
13213      bfd_byte *buf;
13214      unsigned long insn;
13215      expressionS exp;
13216      fixS *fixp;
13217
13218      buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13219
13220      if (target_big_endian)
13221	insn = bfd_getb32 (buf);
13222      else
13223	insn = bfd_getl32 (buf);
13224
13225      if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13226	{
13227	  /* We generate a fixup instead of applying it right now
13228	     because, if there are linker relaxations, we're going to
13229	     need the relocations.  */
13230	  exp.X_op = O_symbol;
13231	  exp.X_add_symbol = fragp->fr_symbol;
13232	  exp.X_add_number = fragp->fr_offset;
13233
13234	  fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13235			      4, &exp, 1,
13236			      BFD_RELOC_16_PCREL_S2);
13237	  fixp->fx_file = fragp->fr_file;
13238	  fixp->fx_line = fragp->fr_line;
13239
13240	  md_number_to_chars (buf, insn, 4);
13241	  buf += 4;
13242	}
13243      else
13244	{
13245	  int i;
13246
13247	  as_warn_where (fragp->fr_file, fragp->fr_line,
13248			 _("relaxed out-of-range branch into a jump"));
13249
13250	  if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13251	    goto uncond;
13252
13253	  if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13254	    {
13255	      /* Reverse the branch.  */
13256	      switch ((insn >> 28) & 0xf)
13257		{
13258		case 4:
13259		  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13260		     have the condition reversed by tweaking a single
13261		     bit, and their opcodes all have 0x4???????.  */
13262		  assert ((insn & 0xf1000000) == 0x41000000);
13263		  insn ^= 0x00010000;
13264		  break;
13265
13266		case 0:
13267		  /* bltz	0x04000000	bgez	0x04010000
13268		     bltzal	0x04100000	bgezal	0x04110000 */
13269		  assert ((insn & 0xfc0e0000) == 0x04000000);
13270		  insn ^= 0x00010000;
13271		  break;
13272
13273		case 1:
13274		  /* beq	0x10000000	bne	0x14000000
13275		     blez	0x18000000	bgtz	0x1c000000 */
13276		  insn ^= 0x04000000;
13277		  break;
13278
13279		default:
13280		  abort ();
13281		}
13282	    }
13283
13284	  if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13285	    {
13286	      /* Clear the and-link bit.  */
13287	      assert ((insn & 0xfc1c0000) == 0x04100000);
13288
13289	      /* bltzal	0x04100000	bgezal	0x04110000
13290		bltzall	0x04120000     bgezall	0x04130000 */
13291	      insn &= ~0x00100000;
13292	    }
13293
13294	  /* Branch over the branch (if the branch was likely) or the
13295	     full jump (not likely case).  Compute the offset from the
13296	     current instruction to branch to.  */
13297	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13298	    i = 16;
13299	  else
13300	    {
13301	      /* How many bytes in instructions we've already emitted?  */
13302	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13303	      /* How many bytes in instructions from here to the end?  */
13304	      i = fragp->fr_var - i;
13305	    }
13306	  /* Convert to instruction count.  */
13307	  i >>= 2;
13308	  /* Branch counts from the next instruction.  */
13309	  i--;
13310	  insn |= i;
13311	  /* Branch over the jump.  */
13312	  md_number_to_chars (buf, insn, 4);
13313	  buf += 4;
13314
13315	  /* Nop */
13316	  md_number_to_chars (buf, 0, 4);
13317	  buf += 4;
13318
13319	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13320	    {
13321	      /* beql $0, $0, 2f */
13322	      insn = 0x50000000;
13323	      /* Compute the PC offset from the current instruction to
13324		 the end of the variable frag.  */
13325	      /* How many bytes in instructions we've already emitted?  */
13326	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13327	      /* How many bytes in instructions from here to the end?  */
13328	      i = fragp->fr_var - i;
13329	      /* Convert to instruction count.  */
13330	      i >>= 2;
13331	      /* Don't decrement i, because we want to branch over the
13332		 delay slot.  */
13333
13334	      insn |= i;
13335	      md_number_to_chars (buf, insn, 4);
13336	      buf += 4;
13337
13338	      md_number_to_chars (buf, 0, 4);
13339	      buf += 4;
13340	    }
13341
13342	uncond:
13343	  if (mips_pic == NO_PIC)
13344	    {
13345	      /* j or jal.  */
13346	      insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13347		      ? 0x0c000000 : 0x08000000);
13348	      exp.X_op = O_symbol;
13349	      exp.X_add_symbol = fragp->fr_symbol;
13350	      exp.X_add_number = fragp->fr_offset;
13351
13352	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13353				  4, &exp, 0, BFD_RELOC_MIPS_JMP);
13354	      fixp->fx_file = fragp->fr_file;
13355	      fixp->fx_line = fragp->fr_line;
13356
13357	      md_number_to_chars (buf, insn, 4);
13358	      buf += 4;
13359	    }
13360	  else
13361	    {
13362	      /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13363	      insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13364	      exp.X_op = O_symbol;
13365	      exp.X_add_symbol = fragp->fr_symbol;
13366	      exp.X_add_number = fragp->fr_offset;
13367
13368	      if (fragp->fr_offset)
13369		{
13370		  exp.X_add_symbol = make_expr_symbol (&exp);
13371		  exp.X_add_number = 0;
13372		}
13373
13374	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13375				  4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13376	      fixp->fx_file = fragp->fr_file;
13377	      fixp->fx_line = fragp->fr_line;
13378
13379	      md_number_to_chars (buf, insn, 4);
13380	      buf += 4;
13381
13382	      if (mips_opts.isa == ISA_MIPS1)
13383		{
13384		  /* nop */
13385		  md_number_to_chars (buf, 0, 4);
13386		  buf += 4;
13387		}
13388
13389	      /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13390	      insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13391
13392	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13393				  4, &exp, 0, BFD_RELOC_LO16);
13394	      fixp->fx_file = fragp->fr_file;
13395	      fixp->fx_line = fragp->fr_line;
13396
13397	      md_number_to_chars (buf, insn, 4);
13398	      buf += 4;
13399
13400	      /* j(al)r $at.  */
13401	      if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13402		insn = 0x0020f809;
13403	      else
13404		insn = 0x00200008;
13405
13406	      md_number_to_chars (buf, insn, 4);
13407	      buf += 4;
13408	    }
13409	}
13410
13411      assert (buf == (bfd_byte *)fragp->fr_literal
13412	      + fragp->fr_fix + fragp->fr_var);
13413
13414      fragp->fr_fix += fragp->fr_var;
13415
13416      return;
13417    }
13418
13419  if (RELAX_MIPS16_P (fragp->fr_subtype))
13420    {
13421      int type;
13422      register const struct mips16_immed_operand *op;
13423      bfd_boolean small, ext;
13424      offsetT val;
13425      bfd_byte *buf;
13426      unsigned long insn;
13427      bfd_boolean use_extend;
13428      unsigned short extend;
13429
13430      type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13431      op = mips16_immed_operands;
13432      while (op->type != type)
13433	++op;
13434
13435      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13436	{
13437	  small = FALSE;
13438	  ext = TRUE;
13439	}
13440      else
13441	{
13442	  small = TRUE;
13443	  ext = FALSE;
13444	}
13445
13446      resolve_symbol_value (fragp->fr_symbol);
13447      val = S_GET_VALUE (fragp->fr_symbol);
13448      if (op->pcrel)
13449	{
13450	  addressT addr;
13451
13452	  addr = fragp->fr_address + fragp->fr_fix;
13453
13454	  /* The rules for the base address of a PC relative reloc are
13455             complicated; see mips16_extended_frag.  */
13456	  if (type == 'p' || type == 'q')
13457	    {
13458	      addr += 2;
13459	      if (ext)
13460		addr += 2;
13461	      /* Ignore the low bit in the target, since it will be
13462                 set for a text label.  */
13463	      if ((val & 1) != 0)
13464		--val;
13465	    }
13466	  else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13467	    addr -= 4;
13468	  else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13469	    addr -= 2;
13470
13471	  addr &= ~ (addressT) ((1 << op->shift) - 1);
13472	  val -= addr;
13473
13474	  /* Make sure the section winds up with the alignment we have
13475             assumed.  */
13476	  if (op->shift > 0)
13477	    record_alignment (asec, op->shift);
13478	}
13479
13480      if (ext
13481	  && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13482	      || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13483	as_warn_where (fragp->fr_file, fragp->fr_line,
13484		       _("extended instruction in delay slot"));
13485
13486      buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13487
13488      if (target_big_endian)
13489	insn = bfd_getb16 (buf);
13490      else
13491	insn = bfd_getl16 (buf);
13492
13493      mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13494		    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13495		    small, ext, &insn, &use_extend, &extend);
13496
13497      if (use_extend)
13498	{
13499	  md_number_to_chars (buf, 0xf000 | extend, 2);
13500	  fragp->fr_fix += 2;
13501	  buf += 2;
13502	}
13503
13504      md_number_to_chars (buf, insn, 2);
13505      fragp->fr_fix += 2;
13506      buf += 2;
13507    }
13508  else
13509    {
13510      int first, second;
13511      fixS *fixp;
13512
13513      first = RELAX_FIRST (fragp->fr_subtype);
13514      second = RELAX_SECOND (fragp->fr_subtype);
13515      fixp = (fixS *) fragp->fr_opcode;
13516
13517      /* Possibly emit a warning if we've chosen the longer option.  */
13518      if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13519	  == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13520	{
13521	  const char *msg = macro_warning (fragp->fr_subtype);
13522	  if (msg != 0)
13523	    as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13524	}
13525
13526      /* Go through all the fixups for the first sequence.  Disable them
13527	 (by marking them as done) if we're going to use the second
13528	 sequence instead.  */
13529      while (fixp
13530	     && fixp->fx_frag == fragp
13531	     && fixp->fx_where < fragp->fr_fix - second)
13532	{
13533	  if (fragp->fr_subtype & RELAX_USE_SECOND)
13534	    fixp->fx_done = 1;
13535	  fixp = fixp->fx_next;
13536	}
13537
13538      /* Go through the fixups for the second sequence.  Disable them if
13539	 we're going to use the first sequence, otherwise adjust their
13540	 addresses to account for the relaxation.  */
13541      while (fixp && fixp->fx_frag == fragp)
13542	{
13543	  if (fragp->fr_subtype & RELAX_USE_SECOND)
13544	    fixp->fx_where -= first;
13545	  else
13546	    fixp->fx_done = 1;
13547	  fixp = fixp->fx_next;
13548	}
13549
13550      /* Now modify the frag contents.  */
13551      if (fragp->fr_subtype & RELAX_USE_SECOND)
13552	{
13553	  char *start;
13554
13555	  start = fragp->fr_literal + fragp->fr_fix - first - second;
13556	  memmove (start, start + first, second);
13557	  fragp->fr_fix -= first;
13558	}
13559      else
13560	fragp->fr_fix -= second;
13561    }
13562}
13563
13564#ifdef OBJ_ELF
13565
13566/* This function is called after the relocs have been generated.
13567   We've been storing mips16 text labels as odd.  Here we convert them
13568   back to even for the convenience of the debugger.  */
13569
13570void
13571mips_frob_file_after_relocs (void)
13572{
13573  asymbol **syms;
13574  unsigned int count, i;
13575
13576  if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13577    return;
13578
13579  syms = bfd_get_outsymbols (stdoutput);
13580  count = bfd_get_symcount (stdoutput);
13581  for (i = 0; i < count; i++, syms++)
13582    {
13583      if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13584	  && ((*syms)->value & 1) != 0)
13585	{
13586	  (*syms)->value &= ~1;
13587	  /* If the symbol has an odd size, it was probably computed
13588	     incorrectly, so adjust that as well.  */
13589	  if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13590	    ++elf_symbol (*syms)->internal_elf_sym.st_size;
13591	}
13592    }
13593}
13594
13595#endif
13596
13597/* This function is called whenever a label is defined.  It is used
13598   when handling branch delays; if a branch has a label, we assume we
13599   can not move it.  */
13600
13601void
13602mips_define_label (symbolS *sym)
13603{
13604  struct insn_label_list *l;
13605
13606  if (free_insn_labels == NULL)
13607    l = (struct insn_label_list *) xmalloc (sizeof *l);
13608  else
13609    {
13610      l = free_insn_labels;
13611      free_insn_labels = l->next;
13612    }
13613
13614  l->label = sym;
13615  l->next = insn_labels;
13616  insn_labels = l;
13617}
13618
13619#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13620
13621/* Some special processing for a MIPS ELF file.  */
13622
13623void
13624mips_elf_final_processing (void)
13625{
13626  /* Write out the register information.  */
13627  if (mips_abi != N64_ABI)
13628    {
13629      Elf32_RegInfo s;
13630
13631      s.ri_gprmask = mips_gprmask;
13632      s.ri_cprmask[0] = mips_cprmask[0];
13633      s.ri_cprmask[1] = mips_cprmask[1];
13634      s.ri_cprmask[2] = mips_cprmask[2];
13635      s.ri_cprmask[3] = mips_cprmask[3];
13636      /* The gp_value field is set by the MIPS ELF backend.  */
13637
13638      bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13639				       ((Elf32_External_RegInfo *)
13640					mips_regmask_frag));
13641    }
13642  else
13643    {
13644      Elf64_Internal_RegInfo s;
13645
13646      s.ri_gprmask = mips_gprmask;
13647      s.ri_pad = 0;
13648      s.ri_cprmask[0] = mips_cprmask[0];
13649      s.ri_cprmask[1] = mips_cprmask[1];
13650      s.ri_cprmask[2] = mips_cprmask[2];
13651      s.ri_cprmask[3] = mips_cprmask[3];
13652      /* The gp_value field is set by the MIPS ELF backend.  */
13653
13654      bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13655				       ((Elf64_External_RegInfo *)
13656					mips_regmask_frag));
13657    }
13658
13659  /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13660     sort of BFD interface for this.  */
13661  if (mips_any_noreorder)
13662    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13663  if (mips_pic != NO_PIC)
13664    {
13665    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13666      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13667    }
13668  if (mips_abicalls)
13669    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13670
13671  /* Set MIPS ELF flags for ASEs.  */
13672  if (file_ase_mips16)
13673    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13674#if 0 /* XXX FIXME */
13675  if (file_ase_mips3d)
13676    elf_elfheader (stdoutput)->e_flags |= ???;
13677#endif
13678  if (file_ase_mdmx)
13679    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13680
13681  /* Set the MIPS ELF ABI flags.  */
13682  if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13683    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13684  else if (mips_abi == O64_ABI)
13685    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
13686  else if (mips_abi == EABI_ABI)
13687    {
13688      if (!file_mips_gp32)
13689	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13690      else
13691	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13692    }
13693  else if (mips_abi == N32_ABI)
13694    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13695
13696  /* Nothing to do for N64_ABI.  */
13697
13698  if (mips_32bitmode)
13699    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13700}
13701
13702#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13703
13704typedef struct proc {
13705  symbolS *isym;
13706  unsigned long reg_mask;
13707  unsigned long reg_offset;
13708  unsigned long fpreg_mask;
13709  unsigned long fpreg_offset;
13710  unsigned long frame_offset;
13711  unsigned long frame_reg;
13712  unsigned long pc_reg;
13713} procS;
13714
13715static procS cur_proc;
13716static procS *cur_proc_ptr;
13717static int numprocs;
13718
13719/* Fill in an rs_align_code fragment.  */
13720
13721void
13722mips_handle_align (fragS *fragp)
13723{
13724  if (fragp->fr_type != rs_align_code)
13725    return;
13726
13727  if (mips_opts.mips16)
13728    {
13729      static const unsigned char be_nop[] = { 0x65, 0x00 };
13730      static const unsigned char le_nop[] = { 0x00, 0x65 };
13731
13732      int bytes;
13733      char *p;
13734
13735      bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
13736      p = fragp->fr_literal + fragp->fr_fix;
13737
13738      if (bytes & 1)
13739	{
13740	  *p++ = 0;
13741	  fragp->fr_fix++;
13742	}
13743
13744      memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
13745      fragp->fr_var = 2;
13746    }
13747
13748  /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
13749}
13750
13751static void
13752md_obj_begin (void)
13753{
13754}
13755
13756static void
13757md_obj_end (void)
13758{
13759  /* check for premature end, nesting errors, etc */
13760  if (cur_proc_ptr)
13761    as_warn (_("missing .end at end of assembly"));
13762}
13763
13764static long
13765get_number (void)
13766{
13767  int negative = 0;
13768  long val = 0;
13769
13770  if (*input_line_pointer == '-')
13771    {
13772      ++input_line_pointer;
13773      negative = 1;
13774    }
13775  if (!ISDIGIT (*input_line_pointer))
13776    as_bad (_("expected simple number"));
13777  if (input_line_pointer[0] == '0')
13778    {
13779      if (input_line_pointer[1] == 'x')
13780	{
13781	  input_line_pointer += 2;
13782	  while (ISXDIGIT (*input_line_pointer))
13783	    {
13784	      val <<= 4;
13785	      val |= hex_value (*input_line_pointer++);
13786	    }
13787	  return negative ? -val : val;
13788	}
13789      else
13790	{
13791	  ++input_line_pointer;
13792	  while (ISDIGIT (*input_line_pointer))
13793	    {
13794	      val <<= 3;
13795	      val |= *input_line_pointer++ - '0';
13796	    }
13797	  return negative ? -val : val;
13798	}
13799    }
13800  if (!ISDIGIT (*input_line_pointer))
13801    {
13802      printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
13803	      *input_line_pointer, *input_line_pointer);
13804      as_warn (_("invalid number"));
13805      return -1;
13806    }
13807  while (ISDIGIT (*input_line_pointer))
13808    {
13809      val *= 10;
13810      val += *input_line_pointer++ - '0';
13811    }
13812  return negative ? -val : val;
13813}
13814
13815/* The .file directive; just like the usual .file directive, but there
13816   is an initial number which is the ECOFF file index.  In the non-ECOFF
13817   case .file implies DWARF-2.  */
13818
13819static void
13820s_mips_file (int x ATTRIBUTE_UNUSED)
13821{
13822  static int first_file_directive = 0;
13823
13824  if (ECOFF_DEBUGGING)
13825    {
13826      get_number ();
13827      s_app_file (0);
13828    }
13829  else
13830    {
13831      char *filename;
13832
13833      filename = dwarf2_directive_file (0);
13834
13835      /* Versions of GCC up to 3.1 start files with a ".file"
13836	 directive even for stabs output.  Make sure that this
13837	 ".file" is handled.  Note that you need a version of GCC
13838         after 3.1 in order to support DWARF-2 on MIPS.  */
13839      if (filename != NULL && ! first_file_directive)
13840	{
13841	  (void) new_logical_line (filename, -1);
13842	  s_app_file_string (filename);
13843	}
13844      first_file_directive = 1;
13845    }
13846}
13847
13848/* The .loc directive, implying DWARF-2.  */
13849
13850static void
13851s_mips_loc (int x ATTRIBUTE_UNUSED)
13852{
13853  if (!ECOFF_DEBUGGING)
13854    dwarf2_directive_loc (0);
13855}
13856
13857/* The .end directive.  */
13858
13859static void
13860s_mips_end (int x ATTRIBUTE_UNUSED)
13861{
13862  symbolS *p;
13863
13864  /* Following functions need their own .frame and .cprestore directives.  */
13865  mips_frame_reg_valid = 0;
13866  mips_cprestore_valid = 0;
13867
13868  if (!is_end_of_line[(unsigned char) *input_line_pointer])
13869    {
13870      p = get_symbol ();
13871      demand_empty_rest_of_line ();
13872    }
13873  else
13874    p = NULL;
13875
13876  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13877    as_warn (_(".end not in text section"));
13878
13879  if (!cur_proc_ptr)
13880    {
13881      as_warn (_(".end directive without a preceding .ent directive."));
13882      demand_empty_rest_of_line ();
13883      return;
13884    }
13885
13886  if (p != NULL)
13887    {
13888      assert (S_GET_NAME (p));
13889      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
13890	as_warn (_(".end symbol does not match .ent symbol."));
13891
13892      if (debug_type == DEBUG_STABS)
13893	stabs_generate_asm_endfunc (S_GET_NAME (p),
13894				    S_GET_NAME (p));
13895    }
13896  else
13897    as_warn (_(".end directive missing or unknown symbol"));
13898
13899#ifdef OBJ_ELF
13900  /* Generate a .pdr section.  */
13901  if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
13902      && mips_flag_pdr)
13903    {
13904      segT saved_seg = now_seg;
13905      subsegT saved_subseg = now_subseg;
13906      valueT dot;
13907      expressionS exp;
13908      char *fragp;
13909
13910      dot = frag_now_fix ();
13911
13912#ifdef md_flush_pending_output
13913      md_flush_pending_output ();
13914#endif
13915
13916      assert (pdr_seg);
13917      subseg_set (pdr_seg, 0);
13918
13919      /* Write the symbol.  */
13920      exp.X_op = O_symbol;
13921      exp.X_add_symbol = p;
13922      exp.X_add_number = 0;
13923      emit_expr (&exp, 4);
13924
13925      fragp = frag_more (7 * 4);
13926
13927      md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
13928      md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
13929      md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
13930      md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
13931      md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
13932      md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
13933      md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
13934
13935      subseg_set (saved_seg, saved_subseg);
13936    }
13937#endif /* OBJ_ELF */
13938
13939  cur_proc_ptr = NULL;
13940}
13941
13942/* The .aent and .ent directives.  */
13943
13944static void
13945s_mips_ent (int aent)
13946{
13947  symbolS *symbolP;
13948
13949  symbolP = get_symbol ();
13950  if (*input_line_pointer == ',')
13951    ++input_line_pointer;
13952  SKIP_WHITESPACE ();
13953  if (ISDIGIT (*input_line_pointer)
13954      || *input_line_pointer == '-')
13955    get_number ();
13956
13957  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13958    as_warn (_(".ent or .aent not in text section."));
13959
13960  if (!aent && cur_proc_ptr)
13961    as_warn (_("missing .end"));
13962
13963  if (!aent)
13964    {
13965      /* This function needs its own .frame and .cprestore directives.  */
13966      mips_frame_reg_valid = 0;
13967      mips_cprestore_valid = 0;
13968
13969      cur_proc_ptr = &cur_proc;
13970      memset (cur_proc_ptr, '\0', sizeof (procS));
13971
13972      cur_proc_ptr->isym = symbolP;
13973
13974      symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
13975
13976      ++numprocs;
13977
13978      if (debug_type == DEBUG_STABS)
13979        stabs_generate_asm_func (S_GET_NAME (symbolP),
13980				 S_GET_NAME (symbolP));
13981    }
13982
13983  demand_empty_rest_of_line ();
13984}
13985
13986/* The .frame directive. If the mdebug section is present (IRIX 5 native)
13987   then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
13988   s_mips_frame is used so that we can set the PDR information correctly.
13989   We can't use the ecoff routines because they make reference to the ecoff
13990   symbol table (in the mdebug section).  */
13991
13992static void
13993s_mips_frame (int ignore ATTRIBUTE_UNUSED)
13994{
13995#ifdef OBJ_ELF
13996  if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
13997    {
13998      long val;
13999
14000      if (cur_proc_ptr == (procS *) NULL)
14001	{
14002	  as_warn (_(".frame outside of .ent"));
14003	  demand_empty_rest_of_line ();
14004	  return;
14005	}
14006
14007      cur_proc_ptr->frame_reg = tc_get_register (1);
14008
14009      SKIP_WHITESPACE ();
14010      if (*input_line_pointer++ != ','
14011	  || get_absolute_expression_and_terminator (&val) != ',')
14012	{
14013	  as_warn (_("Bad .frame directive"));
14014	  --input_line_pointer;
14015	  demand_empty_rest_of_line ();
14016	  return;
14017	}
14018
14019      cur_proc_ptr->frame_offset = val;
14020      cur_proc_ptr->pc_reg = tc_get_register (0);
14021
14022      demand_empty_rest_of_line ();
14023    }
14024  else
14025#endif /* OBJ_ELF */
14026    s_ignore (ignore);
14027}
14028
14029/* The .fmask and .mask directives. If the mdebug section is present
14030   (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14031   embedded targets, s_mips_mask is used so that we can set the PDR
14032   information correctly. We can't use the ecoff routines because they
14033   make reference to the ecoff symbol table (in the mdebug section).  */
14034
14035static void
14036s_mips_mask (int reg_type)
14037{
14038#ifdef OBJ_ELF
14039  if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14040    {
14041      long mask, off;
14042
14043      if (cur_proc_ptr == (procS *) NULL)
14044	{
14045	  as_warn (_(".mask/.fmask outside of .ent"));
14046	  demand_empty_rest_of_line ();
14047	  return;
14048	}
14049
14050      if (get_absolute_expression_and_terminator (&mask) != ',')
14051	{
14052	  as_warn (_("Bad .mask/.fmask directive"));
14053	  --input_line_pointer;
14054	  demand_empty_rest_of_line ();
14055	  return;
14056	}
14057
14058      off = get_absolute_expression ();
14059
14060      if (reg_type == 'F')
14061	{
14062	  cur_proc_ptr->fpreg_mask = mask;
14063	  cur_proc_ptr->fpreg_offset = off;
14064	}
14065      else
14066	{
14067	  cur_proc_ptr->reg_mask = mask;
14068	  cur_proc_ptr->reg_offset = off;
14069	}
14070
14071      demand_empty_rest_of_line ();
14072    }
14073  else
14074#endif /* OBJ_ELF */
14075    s_ignore (reg_type);
14076}
14077
14078/* The .loc directive.  */
14079
14080#if 0
14081static void
14082s_loc (int x)
14083{
14084  symbolS *symbolP;
14085  int lineno;
14086  int addroff;
14087
14088  assert (now_seg == text_section);
14089
14090  lineno = get_number ();
14091  addroff = frag_now_fix ();
14092
14093  symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14094  S_SET_TYPE (symbolP, N_SLINE);
14095  S_SET_OTHER (symbolP, 0);
14096  S_SET_DESC (symbolP, lineno);
14097  symbolP->sy_segment = now_seg;
14098}
14099#endif
14100
14101/* A table describing all the processors gas knows about.  Names are
14102   matched in the order listed.
14103
14104   To ease comparison, please keep this table in the same order as
14105   gcc's mips_cpu_info_table[].  */
14106static const struct mips_cpu_info mips_cpu_info_table[] =
14107{
14108  /* Entries for generic ISAs */
14109  { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
14110  { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
14111  { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
14112  { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
14113  { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
14114  { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
14115  { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14116  { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
14117  { "mips64r2",       1,      ISA_MIPS64R2,   CPU_MIPS64R2 },
14118
14119  /* MIPS I */
14120  { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
14121  { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
14122  { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
14123
14124  /* MIPS II */
14125  { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
14126
14127  /* MIPS III */
14128  { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
14129  { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
14130  { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
14131  { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
14132  { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
14133  { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
14134  { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
14135  { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
14136  { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
14137  { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
14138  { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
14139  { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
14140
14141  /* MIPS IV */
14142  { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
14143  { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
14144  { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
14145  { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
14146  { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
14147  { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
14148  { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
14149  { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
14150  { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
14151  { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
14152  { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
14153  { "rm7000",         0,      ISA_MIPS4,      CPU_RM7000 },
14154  { "rm9000",         0,      ISA_MIPS4,      CPU_RM7000 },
14155
14156  /* MIPS 32 */
14157  { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32 },
14158  { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
14159  { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
14160
14161  /* MIPS 64 */
14162  { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
14163  { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
14164
14165  /* Broadcom SB-1 CPU core */
14166  { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
14167
14168  /* End marker */
14169  { NULL, 0, 0, 0 }
14170};
14171
14172
14173/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14174   with a final "000" replaced by "k".  Ignore case.
14175
14176   Note: this function is shared between GCC and GAS.  */
14177
14178static bfd_boolean
14179mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14180{
14181  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14182    given++, canonical++;
14183
14184  return ((*given == 0 && *canonical == 0)
14185	  || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14186}
14187
14188
14189/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14190   CPU name.  We've traditionally allowed a lot of variation here.
14191
14192   Note: this function is shared between GCC and GAS.  */
14193
14194static bfd_boolean
14195mips_matching_cpu_name_p (const char *canonical, const char *given)
14196{
14197  /* First see if the name matches exactly, or with a final "000"
14198     turned into "k".  */
14199  if (mips_strict_matching_cpu_name_p (canonical, given))
14200    return TRUE;
14201
14202  /* If not, try comparing based on numerical designation alone.
14203     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14204  if (TOLOWER (*given) == 'r')
14205    given++;
14206  if (!ISDIGIT (*given))
14207    return FALSE;
14208
14209  /* Skip over some well-known prefixes in the canonical name,
14210     hoping to find a number there too.  */
14211  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14212    canonical += 2;
14213  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14214    canonical += 2;
14215  else if (TOLOWER (canonical[0]) == 'r')
14216    canonical += 1;
14217
14218  return mips_strict_matching_cpu_name_p (canonical, given);
14219}
14220
14221
14222/* Parse an option that takes the name of a processor as its argument.
14223   OPTION is the name of the option and CPU_STRING is the argument.
14224   Return the corresponding processor enumeration if the CPU_STRING is
14225   recognized, otherwise report an error and return null.
14226
14227   A similar function exists in GCC.  */
14228
14229static const struct mips_cpu_info *
14230mips_parse_cpu (const char *option, const char *cpu_string)
14231{
14232  const struct mips_cpu_info *p;
14233
14234  /* 'from-abi' selects the most compatible architecture for the given
14235     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14236     EABIs, we have to decide whether we're using the 32-bit or 64-bit
14237     version.  Look first at the -mgp options, if given, otherwise base
14238     the choice on MIPS_DEFAULT_64BIT.
14239
14240     Treat NO_ABI like the EABIs.  One reason to do this is that the
14241     plain 'mips' and 'mips64' configs have 'from-abi' as their default
14242     architecture.  This code picks MIPS I for 'mips' and MIPS III for
14243     'mips64', just as we did in the days before 'from-abi'.  */
14244  if (strcasecmp (cpu_string, "from-abi") == 0)
14245    {
14246      if (ABI_NEEDS_32BIT_REGS (mips_abi))
14247	return mips_cpu_info_from_isa (ISA_MIPS1);
14248
14249      if (ABI_NEEDS_64BIT_REGS (mips_abi))
14250	return mips_cpu_info_from_isa (ISA_MIPS3);
14251
14252      if (file_mips_gp32 >= 0)
14253	return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14254
14255      return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14256				     ? ISA_MIPS3
14257				     : ISA_MIPS1);
14258    }
14259
14260  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14261  if (strcasecmp (cpu_string, "default") == 0)
14262    return 0;
14263
14264  for (p = mips_cpu_info_table; p->name != 0; p++)
14265    if (mips_matching_cpu_name_p (p->name, cpu_string))
14266      return p;
14267
14268  as_bad ("Bad value (%s) for %s", cpu_string, option);
14269  return 0;
14270}
14271
14272/* Return the canonical processor information for ISA (a member of the
14273   ISA_MIPS* enumeration).  */
14274
14275static const struct mips_cpu_info *
14276mips_cpu_info_from_isa (int isa)
14277{
14278  int i;
14279
14280  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14281    if (mips_cpu_info_table[i].is_isa
14282	&& isa == mips_cpu_info_table[i].isa)
14283      return (&mips_cpu_info_table[i]);
14284
14285  return NULL;
14286}
14287
14288static const struct mips_cpu_info *
14289mips_cpu_info_from_arch (int arch)
14290{
14291  int i;
14292
14293  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14294    if (arch == mips_cpu_info_table[i].cpu)
14295      return (&mips_cpu_info_table[i]);
14296
14297  return NULL;
14298}
14299
14300static void
14301show (FILE *stream, const char *string, int *col_p, int *first_p)
14302{
14303  if (*first_p)
14304    {
14305      fprintf (stream, "%24s", "");
14306      *col_p = 24;
14307    }
14308  else
14309    {
14310      fprintf (stream, ", ");
14311      *col_p += 2;
14312    }
14313
14314  if (*col_p + strlen (string) > 72)
14315    {
14316      fprintf (stream, "\n%24s", "");
14317      *col_p = 24;
14318    }
14319
14320  fprintf (stream, "%s", string);
14321  *col_p += strlen (string);
14322
14323  *first_p = 0;
14324}
14325
14326void
14327md_show_usage (FILE *stream)
14328{
14329  int column, first;
14330  size_t i;
14331
14332  fprintf (stream, _("\
14333MIPS options:\n\
14334-membedded-pic		generate embedded position independent code\n\
14335-EB			generate big endian output\n\
14336-EL			generate little endian output\n\
14337-g, -g2			do not remove unneeded NOPs or swap branches\n\
14338-G NUM			allow referencing objects up to NUM bytes\n\
14339			implicitly with the gp register [default 8]\n"));
14340  fprintf (stream, _("\
14341-mips1			generate MIPS ISA I instructions\n\
14342-mips2			generate MIPS ISA II instructions\n\
14343-mips3			generate MIPS ISA III instructions\n\
14344-mips4			generate MIPS ISA IV instructions\n\
14345-mips5                  generate MIPS ISA V instructions\n\
14346-mips32                 generate MIPS32 ISA instructions\n\
14347-mips32r2               generate MIPS32 release 2 ISA instructions\n\
14348-mips64                 generate MIPS64 ISA instructions\n\
14349-mips64r2               generate MIPS64 release 2 ISA instructions\n\
14350-march=CPU/-mtune=CPU	generate code/schedule for CPU, where CPU is one of:\n"));
14351
14352  first = 1;
14353
14354  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14355    show (stream, mips_cpu_info_table[i].name, &column, &first);
14356  show (stream, "from-abi", &column, &first);
14357  fputc ('\n', stream);
14358
14359  fprintf (stream, _("\
14360-mCPU			equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14361-no-mCPU		don't generate code specific to CPU.\n\
14362			For -mCPU and -no-mCPU, CPU must be one of:\n"));
14363
14364  first = 1;
14365
14366  show (stream, "3900", &column, &first);
14367  show (stream, "4010", &column, &first);
14368  show (stream, "4100", &column, &first);
14369  show (stream, "4650", &column, &first);
14370  fputc ('\n', stream);
14371
14372  fprintf (stream, _("\
14373-mips16			generate mips16 instructions\n\
14374-no-mips16		do not generate mips16 instructions\n"));
14375  fprintf (stream, _("\
14376-mfix-vr4120		work around certain VR4120 errata\n\
14377-mgp32			use 32-bit GPRs, regardless of the chosen ISA\n\
14378-mfp32			use 32-bit FPRs, regardless of the chosen ISA\n\
14379-O0			remove unneeded NOPs, do not swap branches\n\
14380-O			remove unneeded NOPs and swap branches\n\
14381--[no-]construct-floats [dis]allow floating point values to be constructed\n\
14382--trap, --no-break	trap exception on div by 0 and mult overflow\n\
14383--break, --no-trap	break exception on div by 0 and mult overflow\n"));
14384#ifdef OBJ_ELF
14385  fprintf (stream, _("\
14386-KPIC, -call_shared	generate SVR4 position independent code\n\
14387-non_shared		do not generate position independent code\n\
14388-xgot			assume a 32 bit GOT\n\
14389-mpdr, -mno-pdr		enable/disable creation of .pdr sections\n\
14390-mabi=ABI		create ABI conformant object file for:\n"));
14391
14392  first = 1;
14393
14394  show (stream, "32", &column, &first);
14395  show (stream, "o64", &column, &first);
14396  show (stream, "n32", &column, &first);
14397  show (stream, "64", &column, &first);
14398  show (stream, "eabi", &column, &first);
14399
14400  fputc ('\n', stream);
14401
14402  fprintf (stream, _("\
14403-32			create o32 ABI object file (default)\n\
14404-n32			create n32 ABI object file\n\
14405-64			create 64 ABI object file\n"));
14406#endif
14407}
14408
14409enum dwarf2_format
14410mips_dwarf2_format (void)
14411{
14412  if (mips_abi == N64_ABI)
14413    {
14414#ifdef TE_IRIX
14415      return dwarf2_format_64bit_irix;
14416#else
14417      return dwarf2_format_64bit;
14418#endif
14419    }
14420  else
14421    return dwarf2_format_32bit;
14422}
14423
14424int
14425mips_dwarf2_addr_size (void)
14426{
14427  if (mips_abi == N64_ABI)
14428    return 8;
14429  else
14430    return 4;
14431}
14432