]> Git Repo - binutils.git/blob - gas/config/tc-mips.c
* config/tc-mipc.c (ISA_HAS_ODD_SINGLE_FPR): New define.
[binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005 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, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include <stdarg.h>
32
33 #include "opcode/mips.h"
34 #include "itbl-ops.h"
35 #include "dwarf2dbg.h"
36 #include "dw2gencfi.h"
37
38 #ifdef DEBUG
39 #define DBG(x) printf x
40 #else
41 #define DBG(x)
42 #endif
43
44 #ifdef OBJ_MAYBE_ELF
45 /* Clean up namespace so we can include obj-elf.h too.  */
46 static int mips_output_flavor (void);
47 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
48 #undef OBJ_PROCESS_STAB
49 #undef OUTPUT_FLAVOR
50 #undef S_GET_ALIGN
51 #undef S_GET_SIZE
52 #undef S_SET_ALIGN
53 #undef S_SET_SIZE
54 #undef obj_frob_file
55 #undef obj_frob_file_after_relocs
56 #undef obj_frob_symbol
57 #undef obj_pop_insert
58 #undef obj_sec_sym_ok_for_reloc
59 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
60
61 #include "obj-elf.h"
62 /* Fix any of them that we actually care about.  */
63 #undef OUTPUT_FLAVOR
64 #define OUTPUT_FLAVOR mips_output_flavor()
65 #endif
66
67 #if defined (OBJ_ELF)
68 #include "elf/mips.h"
69 #endif
70
71 #ifndef ECOFF_DEBUGGING
72 #define NO_ECOFF_DEBUGGING
73 #define ECOFF_DEBUGGING 0
74 #endif
75
76 int mips_flag_mdebug = -1;
77
78 /* Control generation of .pdr sections.  Off by default on IRIX: the native
79    linker doesn't know about and discards them, but relocations against them
80    remain, leading to rld crashes.  */
81 #ifdef TE_IRIX
82 int mips_flag_pdr = FALSE;
83 #else
84 int mips_flag_pdr = TRUE;
85 #endif
86
87 #include "ecoff.h"
88
89 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
90 static char *mips_regmask_frag;
91 #endif
92
93 #define ZERO 0
94 #define AT  1
95 #define TREG 24
96 #define PIC_CALL_REG 25
97 #define KT0 26
98 #define KT1 27
99 #define GP  28
100 #define SP  29
101 #define FP  30
102 #define RA  31
103
104 #define ILLEGAL_REG (32)
105
106 /* Allow override of standard little-endian ECOFF format.  */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section.  */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116                             ? ".rdata" \
117                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118                             ? ".rdata" \
119                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120                             ? ".rodata" \
121                             : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124    and fixups.  */
125 struct mips_cl_insn
126 {
127   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128   const struct mips_opcode *insn_mo;
129
130   /* True if this is a mips16 instruction and if we want the extended
131      form of INSN_MO.  */
132   bfd_boolean use_extend;
133
134   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135   unsigned short extend;
136
137   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138      a copy of INSN_MO->match with the operands filled in.  */
139   unsigned long insn_opcode;
140
141   /* The frag that contains the instruction.  */
142   struct frag *frag;
143
144   /* The offset into FRAG of the first instruction byte.  */
145   long where;
146
147   /* The relocs associated with the instruction, if any.  */
148   fixS *fixp[3];
149
150   /* True if this entry cannot be moved from its current position.  */
151   unsigned int fixed_p : 1;
152
153   /* True if this instruction occurred in a .set noreorder block.  */
154   unsigned int noreorder_p : 1;
155
156   /* True for mips16 instructions that jump to an absolute address.  */
157   unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use.  */
161 enum mips_abi_level
162 {
163   NO_ABI = 0,
164   O32_ABI,
165   O64_ABI,
166   N32_ABI,
167   N64_ABI,
168   EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file.  */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code.  */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178    library.  */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182    pseudo-op.  We use a struct so that .set push and .set pop are more
183    reliable.  */
184
185 struct mips_set_options
186 {
187   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188      if it has not been initialized.  Changed by `.set mipsN', and the
189      -mipsN command line option, and the default CPU.  */
190   int isa;
191   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192      if they have not been initialized.  Changed by `.set <asename>', by
193      command line options, and based on the default architecture.  */
194   int ase_mips3d;
195   int ase_mdmx;
196   int ase_smartmips;
197   int ase_dsp;
198   int ase_mt;
199   /* Whether we are assembling for the mips16 processor.  0 if we are
200      not, 1 if we are, and -1 if the value has not been initialized.
201      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
202      -nomips16 command line options, and the default CPU.  */
203   int mips16;
204   /* Non-zero if we should not reorder instructions.  Changed by `.set
205      reorder' and `.set noreorder'.  */
206   int noreorder;
207   /* Non-zero if we should not permit the $at ($1) register to be used
208      in instructions.  Changed by `.set at' and `.set noat'.  */
209   int noat;
210   /* Non-zero if we should warn when a macro instruction expands into
211      more than one machine instruction.  Changed by `.set nomacro' and
212      `.set macro'.  */
213   int warn_about_macros;
214   /* Non-zero if we should not move instructions.  Changed by `.set
215      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
216   int nomove;
217   /* Non-zero if we should not optimize branches by moving the target
218      of the branch into the delay slot.  Actually, we don't perform
219      this optimization anyhow.  Changed by `.set bopt' and `.set
220      nobopt'.  */
221   int nobopt;
222   /* Non-zero if we should not autoextend mips16 instructions.
223      Changed by `.set autoextend' and `.set noautoextend'.  */
224   int noautoextend;
225   /* Restrict general purpose registers and floating point registers
226      to 32 bit.  This is initially determined when -mgp32 or -mfp32
227      is passed but can changed if the assembler code uses .set mipsN.  */
228   int gp32;
229   int fp32;
230   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
231      command line option, and the default CPU.  */
232   int arch;
233   /* True if ".set sym32" is in effect.  */
234   bfd_boolean sym32;
235 };
236
237 /* True if -mgp32 was passed.  */
238 static int file_mips_gp32 = -1;
239
240 /* True if -mfp32 was passed.  */
241 static int file_mips_fp32 = -1;
242
243 /* This is the struct we use to hold the current set of options.  Note
244    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
245    -1 to indicate that they have not been initialized.  */
246
247 static struct mips_set_options mips_opts =
248 {
249   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
250 };
251
252 /* These variables are filled in with the masks of registers used.
253    The object format code reads them and puts them in the appropriate
254    place.  */
255 unsigned long mips_gprmask;
256 unsigned long mips_cprmask[4];
257
258 /* MIPS ISA we are using for this output file.  */
259 static int file_mips_isa = ISA_UNKNOWN;
260
261 /* True if -mips16 was passed or implied by arguments passed on the
262    command line (e.g., by -march).  */
263 static int file_ase_mips16;
264
265 /* True if -mips3d was passed or implied by arguments passed on the
266    command line (e.g., by -march).  */
267 static int file_ase_mips3d;
268
269 /* True if -mdmx was passed or implied by arguments passed on the
270    command line (e.g., by -march).  */
271 static int file_ase_mdmx;
272
273 /* True if -msmartmips was passed or implied by arguments passed on the
274    command line (e.g., by -march).  */
275 static int file_ase_smartmips;
276
277 #define ISA_SUPPORT_SMARTMIPS (mips_opts.isa == ISA_MIPS32       \
278                                || mips_opts.isa == ISA_MIPS32R2)
279
280 /* True if -mdsp was passed or implied by arguments passed on the
281    command line (e.g., by -march).  */
282 static int file_ase_dsp;
283
284 /* True if -mmt was passed or implied by arguments passed on the
285    command line (e.g., by -march).  */
286 static int file_ase_mt;
287
288 /* The argument of the -march= flag.  The architecture we are assembling.  */
289 static int file_mips_arch = CPU_UNKNOWN;
290 static const char *mips_arch_string;
291
292 /* The argument of the -mtune= flag.  The architecture for which we
293    are optimizing.  */
294 static int mips_tune = CPU_UNKNOWN;
295 static const char *mips_tune_string;
296
297 /* True when generating 32-bit code for a 64-bit processor.  */
298 static int mips_32bitmode = 0;
299
300 /* True if the given ABI requires 32-bit registers.  */
301 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
302
303 /* Likewise 64-bit registers.  */
304 #define ABI_NEEDS_64BIT_REGS(ABI)       \
305   ((ABI) == N32_ABI                     \
306    || (ABI) == N64_ABI                  \
307    || (ABI) == O64_ABI)
308
309 /*  Return true if ISA supports 64 bit gp register instructions.  */
310 #define ISA_HAS_64BIT_REGS(ISA)         \
311   ((ISA) == ISA_MIPS3                   \
312    || (ISA) == ISA_MIPS4                \
313    || (ISA) == ISA_MIPS5                \
314    || (ISA) == ISA_MIPS64               \
315    || (ISA) == ISA_MIPS64R2)
316
317 /* Return true if ISA supports 64-bit right rotate (dror et al.)
318    instructions.  */
319 #define ISA_HAS_DROR(ISA)               \
320   ((ISA) == ISA_MIPS64R2)
321
322 /* Return true if ISA supports 32-bit right rotate (ror et al.)
323    instructions.  */
324 #define ISA_HAS_ROR(ISA)                \
325   ((ISA) == ISA_MIPS32R2                \
326    || (ISA) == ISA_MIPS64R2             \
327    || mips_opts.ase_smartmips)
328
329 /* Return true if ISA supports single-precision floats in odd registers.  */
330 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
331   ((ISA) == ISA_MIPS32                  \
332    || (ISA) == ISA_MIPS32R2             \
333    || (ISA) == ISA_MIPS64               \
334    || (ISA) == ISA_MIPS64R2)
335
336 #define HAVE_32BIT_GPRS                            \
337     (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
338
339 #define HAVE_32BIT_FPRS                            \
340     (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
341
342 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
343 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
344
345 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
346
347 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
348
349 /* True if relocations are stored in-place.  */
350 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
351
352 /* The ABI-derived address size.  */
353 #define HAVE_64BIT_ADDRESSES \
354   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
355 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
356
357 /* The size of symbolic constants (i.e., expressions of the form
358    "SYMBOL" or "SYMBOL + OFFSET").  */
359 #define HAVE_32BIT_SYMBOLS \
360   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
361 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
362
363 /* Addresses are loaded in different ways, depending on the address size
364    in use.  The n32 ABI Documentation also mandates the use of additions
365    with overflow checking, but existing implementations don't follow it.  */
366 #define ADDRESS_ADD_INSN                                                \
367    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
368
369 #define ADDRESS_ADDI_INSN                                               \
370    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
371
372 #define ADDRESS_LOAD_INSN                                               \
373    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
374
375 #define ADDRESS_STORE_INSN                                              \
376    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
377
378 /* Return true if the given CPU supports the MIPS16 ASE.  */
379 #define CPU_HAS_MIPS16(cpu)                                             \
380    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
381     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
382
383 /* Return true if the given CPU supports the MIPS3D ASE.  */
384 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
385                                  )
386
387 /* Return true if the given CPU supports the MDMX ASE.  */
388 #define CPU_HAS_MDMX(cpu)       (FALSE                 \
389                                  )
390
391 /* Return true if the given CPU supports the DSP ASE.  */
392 #define CPU_HAS_DSP(cpu)        (FALSE                 \
393                                  )
394
395 /* Return true if the given CPU supports the MT ASE.  */
396 #define CPU_HAS_MT(cpu)         (FALSE                 \
397                                  )
398
399 /* True if CPU has a dror instruction.  */
400 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
401
402 /* True if CPU has a ror instruction.  */
403 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
404
405 /* True if mflo and mfhi can be immediately followed by instructions
406    which write to the HI and LO registers.
407
408    According to MIPS specifications, MIPS ISAs I, II, and III need
409    (at least) two instructions between the reads of HI/LO and
410    instructions which write them, and later ISAs do not.  Contradicting
411    the MIPS specifications, some MIPS IV processor user manuals (e.g.
412    the UM for the NEC Vr5000) document needing the instructions between
413    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
414    MIPS64 and later ISAs to have the interlocks, plus any specific
415    earlier-ISA CPUs for which CPU documentation declares that the
416    instructions are really interlocked.  */
417 #define hilo_interlocks \
418   (mips_opts.isa == ISA_MIPS32                        \
419    || mips_opts.isa == ISA_MIPS32R2                   \
420    || mips_opts.isa == ISA_MIPS64                     \
421    || mips_opts.isa == ISA_MIPS64R2                   \
422    || mips_opts.arch == CPU_R4010                     \
423    || mips_opts.arch == CPU_R10000                    \
424    || mips_opts.arch == CPU_R12000                    \
425    || mips_opts.arch == CPU_RM7000                    \
426    || mips_opts.arch == CPU_VR5500                    \
427    )
428
429 /* Whether the processor uses hardware interlocks to protect reads
430    from the GPRs after they are loaded from memory, and thus does not
431    require nops to be inserted.  This applies to instructions marked
432    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
433    level I.  */
434 #define gpr_interlocks \
435   (mips_opts.isa != ISA_MIPS1  \
436    || mips_opts.arch == CPU_R3900)
437
438 /* Whether the processor uses hardware interlocks to avoid delays
439    required by coprocessor instructions, and thus does not require
440    nops to be inserted.  This applies to instructions marked
441    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
442    between instructions marked INSN_WRITE_COND_CODE and ones marked
443    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
444    levels I, II, and III.  */
445 /* Itbl support may require additional care here.  */
446 #define cop_interlocks                                \
447   ((mips_opts.isa != ISA_MIPS1                        \
448     && mips_opts.isa != ISA_MIPS2                     \
449     && mips_opts.isa != ISA_MIPS3)                    \
450    || mips_opts.arch == CPU_R4300                     \
451    )
452
453 /* Whether the processor uses hardware interlocks to protect reads
454    from coprocessor registers after they are loaded from memory, and
455    thus does not require nops to be inserted.  This applies to
456    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
457    requires at MIPS ISA level I.  */
458 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
459
460 /* Is this a mfhi or mflo instruction?  */
461 #define MF_HILO_INSN(PINFO) \
462           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
463
464 /* MIPS PIC level.  */
465
466 enum mips_pic_level mips_pic;
467
468 /* 1 if we should generate 32 bit offsets from the $gp register in
469    SVR4_PIC mode.  Currently has no meaning in other modes.  */
470 static int mips_big_got = 0;
471
472 /* 1 if trap instructions should used for overflow rather than break
473    instructions.  */
474 static int mips_trap = 0;
475
476 /* 1 if double width floating point constants should not be constructed
477    by assembling two single width halves into two single width floating
478    point registers which just happen to alias the double width destination
479    register.  On some architectures this aliasing can be disabled by a bit
480    in the status register, and the setting of this bit cannot be determined
481    automatically at assemble time.  */
482 static int mips_disable_float_construction;
483
484 /* Non-zero if any .set noreorder directives were used.  */
485
486 static int mips_any_noreorder;
487
488 /* Non-zero if nops should be inserted when the register referenced in
489    an mfhi/mflo instruction is read in the next two instructions.  */
490 static int mips_7000_hilo_fix;
491
492 /* The size of the small data section.  */
493 static unsigned int g_switch_value = 8;
494 /* Whether the -G option was used.  */
495 static int g_switch_seen = 0;
496
497 #define N_RMASK 0xc4
498 #define N_VFP   0xd4
499
500 /* If we can determine in advance that GP optimization won't be
501    possible, we can skip the relaxation stuff that tries to produce
502    GP-relative references.  This makes delay slot optimization work
503    better.
504
505    This function can only provide a guess, but it seems to work for
506    gcc output.  It needs to guess right for gcc, otherwise gcc
507    will put what it thinks is a GP-relative instruction in a branch
508    delay slot.
509
510    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
511    fixed it for the non-PIC mode.  KR 95/04/07  */
512 static int nopic_need_relax (symbolS *, int);
513
514 /* handle of the OPCODE hash table */
515 static struct hash_control *op_hash = NULL;
516
517 /* The opcode hash table we use for the mips16.  */
518 static struct hash_control *mips16_op_hash = NULL;
519
520 /* This array holds the chars that always start a comment.  If the
521     pre-processor is disabled, these aren't very useful */
522 const char comment_chars[] = "#";
523
524 /* This array holds the chars that only start a comment at the beginning of
525    a line.  If the line seems to have the form '# 123 filename'
526    .line and .file directives will appear in the pre-processed output */
527 /* Note that input_file.c hand checks for '#' at the beginning of the
528    first line of the input file.  This is because the compiler outputs
529    #NO_APP at the beginning of its output.  */
530 /* Also note that C style comments are always supported.  */
531 const char line_comment_chars[] = "#";
532
533 /* This array holds machine specific line separator characters.  */
534 const char line_separator_chars[] = ";";
535
536 /* Chars that can be used to separate mant from exp in floating point nums */
537 const char EXP_CHARS[] = "eE";
538
539 /* Chars that mean this number is a floating point constant */
540 /* As in 0f12.456 */
541 /* or    0d1.2345e12 */
542 const char FLT_CHARS[] = "rRsSfFdDxXpP";
543
544 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
545    changed in read.c .  Ideally it shouldn't have to know about it at all,
546    but nothing is ideal around here.
547  */
548
549 static char *insn_error;
550
551 static int auto_align = 1;
552
553 /* When outputting SVR4 PIC code, the assembler needs to know the
554    offset in the stack frame from which to restore the $gp register.
555    This is set by the .cprestore pseudo-op, and saved in this
556    variable.  */
557 static offsetT mips_cprestore_offset = -1;
558
559 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
560    more optimizations, it can use a register value instead of a memory-saved
561    offset and even an other register than $gp as global pointer.  */
562 static offsetT mips_cpreturn_offset = -1;
563 static int mips_cpreturn_register = -1;
564 static int mips_gp_register = GP;
565 static int mips_gprel_offset = 0;
566
567 /* Whether mips_cprestore_offset has been set in the current function
568    (or whether it has already been warned about, if not).  */
569 static int mips_cprestore_valid = 0;
570
571 /* This is the register which holds the stack frame, as set by the
572    .frame pseudo-op.  This is needed to implement .cprestore.  */
573 static int mips_frame_reg = SP;
574
575 /* Whether mips_frame_reg has been set in the current function
576    (or whether it has already been warned about, if not).  */
577 static int mips_frame_reg_valid = 0;
578
579 /* To output NOP instructions correctly, we need to keep information
580    about the previous two instructions.  */
581
582 /* Whether we are optimizing.  The default value of 2 means to remove
583    unneeded NOPs and swap branch instructions when possible.  A value
584    of 1 means to not swap branches.  A value of 0 means to always
585    insert NOPs.  */
586 static int mips_optimize = 2;
587
588 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
589    equivalent to seeing no -g option at all.  */
590 static int mips_debug = 0;
591
592 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
593 #define MAX_VR4130_NOPS 4
594
595 /* The maximum number of NOPs needed to fill delay slots.  */
596 #define MAX_DELAY_NOPS 2
597
598 /* The maximum number of NOPs needed for any purpose.  */
599 #define MAX_NOPS 4
600
601 /* A list of previous instructions, with index 0 being the most recent.
602    We need to look back MAX_NOPS instructions when filling delay slots
603    or working around processor errata.  We need to look back one
604    instruction further if we're thinking about using history[0] to
605    fill a branch delay slot.  */
606 static struct mips_cl_insn history[1 + MAX_NOPS];
607
608 /* Nop instructions used by emit_nop.  */
609 static struct mips_cl_insn nop_insn, mips16_nop_insn;
610
611 /* The appropriate nop for the current mode.  */
612 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
613
614 /* If this is set, it points to a frag holding nop instructions which
615    were inserted before the start of a noreorder section.  If those
616    nops turn out to be unnecessary, the size of the frag can be
617    decreased.  */
618 static fragS *prev_nop_frag;
619
620 /* The number of nop instructions we created in prev_nop_frag.  */
621 static int prev_nop_frag_holds;
622
623 /* The number of nop instructions that we know we need in
624    prev_nop_frag.  */
625 static int prev_nop_frag_required;
626
627 /* The number of instructions we've seen since prev_nop_frag.  */
628 static int prev_nop_frag_since;
629
630 /* For ECOFF and ELF, relocations against symbols are done in two
631    parts, with a HI relocation and a LO relocation.  Each relocation
632    has only 16 bits of space to store an addend.  This means that in
633    order for the linker to handle carries correctly, it must be able
634    to locate both the HI and the LO relocation.  This means that the
635    relocations must appear in order in the relocation table.
636
637    In order to implement this, we keep track of each unmatched HI
638    relocation.  We then sort them so that they immediately precede the
639    corresponding LO relocation.  */
640
641 struct mips_hi_fixup
642 {
643   /* Next HI fixup.  */
644   struct mips_hi_fixup *next;
645   /* This fixup.  */
646   fixS *fixp;
647   /* The section this fixup is in.  */
648   segT seg;
649 };
650
651 /* The list of unmatched HI relocs.  */
652
653 static struct mips_hi_fixup *mips_hi_fixup_list;
654
655 /* The frag containing the last explicit relocation operator.
656    Null if explicit relocations have not been used.  */
657
658 static fragS *prev_reloc_op_frag;
659
660 /* Map normal MIPS register numbers to mips16 register numbers.  */
661
662 #define X ILLEGAL_REG
663 static const int mips32_to_16_reg_map[] =
664 {
665   X, X, 2, 3, 4, 5, 6, 7,
666   X, X, X, X, X, X, X, X,
667   0, 1, X, X, X, X, X, X,
668   X, X, X, X, X, X, X, X
669 };
670 #undef X
671
672 /* Map mips16 register numbers to normal MIPS register numbers.  */
673
674 static const unsigned int mips16_to_32_reg_map[] =
675 {
676   16, 17, 2, 3, 4, 5, 6, 7
677 };
678
679 /* Classifies the kind of instructions we're interested in when
680    implementing -mfix-vr4120.  */
681 enum fix_vr4120_class {
682   FIX_VR4120_MACC,
683   FIX_VR4120_DMACC,
684   FIX_VR4120_MULT,
685   FIX_VR4120_DMULT,
686   FIX_VR4120_DIV,
687   FIX_VR4120_MTHILO,
688   NUM_FIX_VR4120_CLASSES
689 };
690
691 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
692    there must be at least one other instruction between an instruction
693    of type X and an instruction of type Y.  */
694 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
695
696 /* True if -mfix-vr4120 is in force.  */
697 static int mips_fix_vr4120;
698
699 /* ...likewise -mfix-vr4130.  */
700 static int mips_fix_vr4130;
701
702 /* We don't relax branches by default, since this causes us to expand
703    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
704    fail to compute the offset before expanding the macro to the most
705    efficient expansion.  */
706
707 static int mips_relax_branch;
708 \f
709 /* The expansion of many macros depends on the type of symbol that
710    they refer to.  For example, when generating position-dependent code,
711    a macro that refers to a symbol may have two different expansions,
712    one which uses GP-relative addresses and one which uses absolute
713    addresses.  When generating SVR4-style PIC, a macro may have
714    different expansions for local and global symbols.
715
716    We handle these situations by generating both sequences and putting
717    them in variant frags.  In position-dependent code, the first sequence
718    will be the GP-relative one and the second sequence will be the
719    absolute one.  In SVR4 PIC, the first sequence will be for global
720    symbols and the second will be for local symbols.
721
722    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
723    SECOND are the lengths of the two sequences in bytes.  These fields
724    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
725    the subtype has the following flags:
726
727    RELAX_USE_SECOND
728         Set if it has been decided that we should use the second
729         sequence instead of the first.
730
731    RELAX_SECOND_LONGER
732         Set in the first variant frag if the macro's second implementation
733         is longer than its first.  This refers to the macro as a whole,
734         not an individual relaxation.
735
736    RELAX_NOMACRO
737         Set in the first variant frag if the macro appeared in a .set nomacro
738         block and if one alternative requires a warning but the other does not.
739
740    RELAX_DELAY_SLOT
741         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
742         delay slot.
743
744    The frag's "opcode" points to the first fixup for relaxable code.
745
746    Relaxable macros are generated using a sequence such as:
747
748       relax_start (SYMBOL);
749       ... generate first expansion ...
750       relax_switch ();
751       ... generate second expansion ...
752       relax_end ();
753
754    The code and fixups for the unwanted alternative are discarded
755    by md_convert_frag.  */
756 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
757
758 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
759 #define RELAX_SECOND(X) ((X) & 0xff)
760 #define RELAX_USE_SECOND 0x10000
761 #define RELAX_SECOND_LONGER 0x20000
762 #define RELAX_NOMACRO 0x40000
763 #define RELAX_DELAY_SLOT 0x80000
764
765 /* Branch without likely bit.  If label is out of range, we turn:
766
767         beq reg1, reg2, label
768         delay slot
769
770    into
771
772         bne reg1, reg2, 0f
773         nop
774         j label
775      0: delay slot
776
777    with the following opcode replacements:
778
779         beq <-> bne
780         blez <-> bgtz
781         bltz <-> bgez
782         bc1f <-> bc1t
783
784         bltzal <-> bgezal  (with jal label instead of j label)
785
786    Even though keeping the delay slot instruction in the delay slot of
787    the branch would be more efficient, it would be very tricky to do
788    correctly, because we'd have to introduce a variable frag *after*
789    the delay slot instruction, and expand that instead.  Let's do it
790    the easy way for now, even if the branch-not-taken case now costs
791    one additional instruction.  Out-of-range branches are not supposed
792    to be common, anyway.
793
794    Branch likely.  If label is out of range, we turn:
795
796         beql reg1, reg2, label
797         delay slot (annulled if branch not taken)
798
799    into
800
801         beql reg1, reg2, 1f
802         nop
803         beql $0, $0, 2f
804         nop
805      1: j[al] label
806         delay slot (executed only if branch taken)
807      2:
808
809    It would be possible to generate a shorter sequence by losing the
810    likely bit, generating something like:
811
812         bne reg1, reg2, 0f
813         nop
814         j[al] label
815         delay slot (executed only if branch taken)
816      0:
817
818         beql -> bne
819         bnel -> beq
820         blezl -> bgtz
821         bgtzl -> blez
822         bltzl -> bgez
823         bgezl -> bltz
824         bc1fl -> bc1t
825         bc1tl -> bc1f
826
827         bltzall -> bgezal  (with jal label instead of j label)
828         bgezall -> bltzal  (ditto)
829
830
831    but it's not clear that it would actually improve performance.  */
832 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
833   ((relax_substateT) \
834    (0xc0000000 \
835     | ((toofar) ? 1 : 0) \
836     | ((link) ? 2 : 0) \
837     | ((likely) ? 4 : 0) \
838     | ((uncond) ? 8 : 0)))
839 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
840 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
841 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
842 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
843 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
844
845 /* For mips16 code, we use an entirely different form of relaxation.
846    mips16 supports two versions of most instructions which take
847    immediate values: a small one which takes some small value, and a
848    larger one which takes a 16 bit value.  Since branches also follow
849    this pattern, relaxing these values is required.
850
851    We can assemble both mips16 and normal MIPS code in a single
852    object.  Therefore, we need to support this type of relaxation at
853    the same time that we support the relaxation described above.  We
854    use the high bit of the subtype field to distinguish these cases.
855
856    The information we store for this type of relaxation is the
857    argument code found in the opcode file for this relocation, whether
858    the user explicitly requested a small or extended form, and whether
859    the relocation is in a jump or jal delay slot.  That tells us the
860    size of the value, and how it should be stored.  We also store
861    whether the fragment is considered to be extended or not.  We also
862    store whether this is known to be a branch to a different section,
863    whether we have tried to relax this frag yet, and whether we have
864    ever extended a PC relative fragment because of a shift count.  */
865 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
866   (0x80000000                                                   \
867    | ((type) & 0xff)                                            \
868    | ((small) ? 0x100 : 0)                                      \
869    | ((ext) ? 0x200 : 0)                                        \
870    | ((dslot) ? 0x400 : 0)                                      \
871    | ((jal_dslot) ? 0x800 : 0))
872 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
873 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
874 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
875 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
876 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
877 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
878 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
879 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
880 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
881 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
882 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
883 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
884
885 /* Is the given value a sign-extended 32-bit value?  */
886 #define IS_SEXT_32BIT_NUM(x)                                            \
887   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
888    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
889
890 /* Is the given value a sign-extended 16-bit value?  */
891 #define IS_SEXT_16BIT_NUM(x)                                            \
892   (((x) &~ (offsetT) 0x7fff) == 0                                       \
893    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
894
895 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
896 #define IS_ZEXT_32BIT_NUM(x)                                            \
897   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
898    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
899
900 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
901    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
902 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
903   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
904               | (((VALUE) & (MASK)) << (SHIFT)))
905
906 /* Extract bits MASK << SHIFT from STRUCT and shift them right
907    SHIFT places.  */
908 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
909   (((STRUCT) >> (SHIFT)) & (MASK))
910
911 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
912    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
913
914    include/opcode/mips.h specifies operand fields using the macros
915    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
916    with "MIPS16OP" instead of "OP".  */
917 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
918   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
919 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
920   INSERT_BITS ((INSN).insn_opcode, VALUE, \
921                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
922
923 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
924 #define EXTRACT_OPERAND(FIELD, INSN) \
925   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
926 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
927   EXTRACT_BITS ((INSN).insn_opcode, \
928                 MIPS16OP_MASK_##FIELD, \
929                 MIPS16OP_SH_##FIELD)
930 \f
931 /* Global variables used when generating relaxable macros.  See the
932    comment above RELAX_ENCODE for more details about how relaxation
933    is used.  */
934 static struct {
935   /* 0 if we're not emitting a relaxable macro.
936      1 if we're emitting the first of the two relaxation alternatives.
937      2 if we're emitting the second alternative.  */
938   int sequence;
939
940   /* The first relaxable fixup in the current frag.  (In other words,
941      the first fixup that refers to relaxable code.)  */
942   fixS *first_fixup;
943
944   /* sizes[0] says how many bytes of the first alternative are stored in
945      the current frag.  Likewise sizes[1] for the second alternative.  */
946   unsigned int sizes[2];
947
948   /* The symbol on which the choice of sequence depends.  */
949   symbolS *symbol;
950 } mips_relax;
951 \f
952 /* Global variables used to decide whether a macro needs a warning.  */
953 static struct {
954   /* True if the macro is in a branch delay slot.  */
955   bfd_boolean delay_slot_p;
956
957   /* For relaxable macros, sizes[0] is the length of the first alternative
958      in bytes and sizes[1] is the length of the second alternative.
959      For non-relaxable macros, both elements give the length of the
960      macro in bytes.  */
961   unsigned int sizes[2];
962
963   /* The first variant frag for this macro.  */
964   fragS *first_frag;
965 } mips_macro_warning;
966 \f
967 /* Prototypes for static functions.  */
968
969 #define internalError()                                                 \
970     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
971
972 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
973
974 static void append_insn
975   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
976 static void mips_no_prev_insn (void);
977 static void mips16_macro_build
978   (expressionS *, const char *, const char *, va_list);
979 static void load_register (int, expressionS *, int);
980 static void macro_start (void);
981 static void macro_end (void);
982 static void macro (struct mips_cl_insn * ip);
983 static void mips16_macro (struct mips_cl_insn * ip);
984 #ifdef LOSING_COMPILER
985 static void macro2 (struct mips_cl_insn * ip);
986 #endif
987 static void mips_ip (char *str, struct mips_cl_insn * ip);
988 static void mips16_ip (char *str, struct mips_cl_insn * ip);
989 static void mips16_immed
990   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
991    unsigned long *, bfd_boolean *, unsigned short *);
992 static size_t my_getSmallExpression
993   (expressionS *, bfd_reloc_code_real_type *, char *);
994 static void my_getExpression (expressionS *, char *);
995 static void s_align (int);
996 static void s_change_sec (int);
997 static void s_change_section (int);
998 static void s_cons (int);
999 static void s_float_cons (int);
1000 static void s_mips_globl (int);
1001 static void s_option (int);
1002 static void s_mipsset (int);
1003 static void s_abicalls (int);
1004 static void s_cpload (int);
1005 static void s_cpsetup (int);
1006 static void s_cplocal (int);
1007 static void s_cprestore (int);
1008 static void s_cpreturn (int);
1009 static void s_gpvalue (int);
1010 static void s_gpword (int);
1011 static void s_gpdword (int);
1012 static void s_cpadd (int);
1013 static void s_insn (int);
1014 static void md_obj_begin (void);
1015 static void md_obj_end (void);
1016 static void s_mips_ent (int);
1017 static void s_mips_end (int);
1018 static void s_mips_frame (int);
1019 static void s_mips_mask (int reg_type);
1020 static void s_mips_stab (int);
1021 static void s_mips_weakext (int);
1022 static void s_mips_file (int);
1023 static void s_mips_loc (int);
1024 static bfd_boolean pic_need_relax (symbolS *, asection *);
1025 static int relaxed_branch_length (fragS *, asection *, int);
1026 static int validate_mips_insn (const struct mips_opcode *);
1027
1028 /* Table and functions used to map between CPU/ISA names, and
1029    ISA levels, and CPU numbers.  */
1030
1031 struct mips_cpu_info
1032 {
1033   const char *name;           /* CPU or ISA name.  */
1034   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
1035   int isa;                    /* ISA level.  */
1036   int cpu;                    /* CPU number (default CPU if ISA).  */
1037 };
1038
1039 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1040 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1041 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1042 \f
1043 /* Pseudo-op table.
1044
1045    The following pseudo-ops from the Kane and Heinrich MIPS book
1046    should be defined here, but are currently unsupported: .alias,
1047    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1048
1049    The following pseudo-ops from the Kane and Heinrich MIPS book are
1050    specific to the type of debugging information being generated, and
1051    should be defined by the object format: .aent, .begin, .bend,
1052    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1053    .vreg.
1054
1055    The following pseudo-ops from the Kane and Heinrich MIPS book are
1056    not MIPS CPU specific, but are also not specific to the object file
1057    format.  This file is probably the best place to define them, but
1058    they are not currently supported: .asm0, .endr, .lab, .repeat,
1059    .struct.  */
1060
1061 static const pseudo_typeS mips_pseudo_table[] =
1062 {
1063   /* MIPS specific pseudo-ops.  */
1064   {"option", s_option, 0},
1065   {"set", s_mipsset, 0},
1066   {"rdata", s_change_sec, 'r'},
1067   {"sdata", s_change_sec, 's'},
1068   {"livereg", s_ignore, 0},
1069   {"abicalls", s_abicalls, 0},
1070   {"cpload", s_cpload, 0},
1071   {"cpsetup", s_cpsetup, 0},
1072   {"cplocal", s_cplocal, 0},
1073   {"cprestore", s_cprestore, 0},
1074   {"cpreturn", s_cpreturn, 0},
1075   {"gpvalue", s_gpvalue, 0},
1076   {"gpword", s_gpword, 0},
1077   {"gpdword", s_gpdword, 0},
1078   {"cpadd", s_cpadd, 0},
1079   {"insn", s_insn, 0},
1080
1081   /* Relatively generic pseudo-ops that happen to be used on MIPS
1082      chips.  */
1083   {"asciiz", stringer, 1},
1084   {"bss", s_change_sec, 'b'},
1085   {"err", s_err, 0},
1086   {"half", s_cons, 1},
1087   {"dword", s_cons, 3},
1088   {"weakext", s_mips_weakext, 0},
1089
1090   /* These pseudo-ops are defined in read.c, but must be overridden
1091      here for one reason or another.  */
1092   {"align", s_align, 0},
1093   {"byte", s_cons, 0},
1094   {"data", s_change_sec, 'd'},
1095   {"double", s_float_cons, 'd'},
1096   {"float", s_float_cons, 'f'},
1097   {"globl", s_mips_globl, 0},
1098   {"global", s_mips_globl, 0},
1099   {"hword", s_cons, 1},
1100   {"int", s_cons, 2},
1101   {"long", s_cons, 2},
1102   {"octa", s_cons, 4},
1103   {"quad", s_cons, 3},
1104   {"section", s_change_section, 0},
1105   {"short", s_cons, 1},
1106   {"single", s_float_cons, 'f'},
1107   {"stabn", s_mips_stab, 'n'},
1108   {"text", s_change_sec, 't'},
1109   {"word", s_cons, 2},
1110
1111   { "extern", ecoff_directive_extern, 0},
1112
1113   { NULL, NULL, 0 },
1114 };
1115
1116 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1117 {
1118   /* These pseudo-ops should be defined by the object file format.
1119      However, a.out doesn't support them, so we have versions here.  */
1120   {"aent", s_mips_ent, 1},
1121   {"bgnb", s_ignore, 0},
1122   {"end", s_mips_end, 0},
1123   {"endb", s_ignore, 0},
1124   {"ent", s_mips_ent, 0},
1125   {"file", s_mips_file, 0},
1126   {"fmask", s_mips_mask, 'F'},
1127   {"frame", s_mips_frame, 0},
1128   {"loc", s_mips_loc, 0},
1129   {"mask", s_mips_mask, 'R'},
1130   {"verstamp", s_ignore, 0},
1131   { NULL, NULL, 0 },
1132 };
1133
1134 extern void pop_insert (const pseudo_typeS *);
1135
1136 void
1137 mips_pop_insert (void)
1138 {
1139   pop_insert (mips_pseudo_table);
1140   if (! ECOFF_DEBUGGING)
1141     pop_insert (mips_nonecoff_pseudo_table);
1142 }
1143 \f
1144 /* Symbols labelling the current insn.  */
1145
1146 struct insn_label_list
1147 {
1148   struct insn_label_list *next;
1149   symbolS *label;
1150 };
1151
1152 static struct insn_label_list *insn_labels;
1153 static struct insn_label_list *free_insn_labels;
1154
1155 static void mips_clear_insn_labels (void);
1156
1157 static inline void
1158 mips_clear_insn_labels (void)
1159 {
1160   register struct insn_label_list **pl;
1161
1162   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1163     ;
1164   *pl = insn_labels;
1165   insn_labels = NULL;
1166 }
1167 \f
1168 static char *expr_end;
1169
1170 /* Expressions which appear in instructions.  These are set by
1171    mips_ip.  */
1172
1173 static expressionS imm_expr;
1174 static expressionS imm2_expr;
1175 static expressionS offset_expr;
1176
1177 /* Relocs associated with imm_expr and offset_expr.  */
1178
1179 static bfd_reloc_code_real_type imm_reloc[3]
1180   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1181 static bfd_reloc_code_real_type offset_reloc[3]
1182   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1183
1184 /* These are set by mips16_ip if an explicit extension is used.  */
1185
1186 static bfd_boolean mips16_small, mips16_ext;
1187
1188 #ifdef OBJ_ELF
1189 /* The pdr segment for per procedure frame/regmask info.  Not used for
1190    ECOFF debugging.  */
1191
1192 static segT pdr_seg;
1193 #endif
1194
1195 /* The default target format to use.  */
1196
1197 const char *
1198 mips_target_format (void)
1199 {
1200   switch (OUTPUT_FLAVOR)
1201     {
1202     case bfd_target_ecoff_flavour:
1203       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1204     case bfd_target_coff_flavour:
1205       return "pe-mips";
1206     case bfd_target_elf_flavour:
1207 #ifdef TE_VXWORKS
1208       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1209         return (target_big_endian
1210                 ? "elf32-bigmips-vxworks"
1211                 : "elf32-littlemips-vxworks");
1212 #endif
1213 #ifdef TE_TMIPS
1214       /* This is traditional mips.  */
1215       return (target_big_endian
1216               ? (HAVE_64BIT_OBJECTS
1217                  ? "elf64-tradbigmips"
1218                  : (HAVE_NEWABI
1219                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1220               : (HAVE_64BIT_OBJECTS
1221                  ? "elf64-tradlittlemips"
1222                  : (HAVE_NEWABI
1223                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1224 #else
1225       return (target_big_endian
1226               ? (HAVE_64BIT_OBJECTS
1227                  ? "elf64-bigmips"
1228                  : (HAVE_NEWABI
1229                     ? "elf32-nbigmips" : "elf32-bigmips"))
1230               : (HAVE_64BIT_OBJECTS
1231                  ? "elf64-littlemips"
1232                  : (HAVE_NEWABI
1233                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1234 #endif
1235     default:
1236       abort ();
1237       return NULL;
1238     }
1239 }
1240
1241 /* Return the length of instruction INSN.  */
1242
1243 static inline unsigned int
1244 insn_length (const struct mips_cl_insn *insn)
1245 {
1246   if (!mips_opts.mips16)
1247     return 4;
1248   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1249 }
1250
1251 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1252
1253 static void
1254 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1255 {
1256   size_t i;
1257
1258   insn->insn_mo = mo;
1259   insn->use_extend = FALSE;
1260   insn->extend = 0;
1261   insn->insn_opcode = mo->match;
1262   insn->frag = NULL;
1263   insn->where = 0;
1264   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1265     insn->fixp[i] = NULL;
1266   insn->fixed_p = (mips_opts.noreorder > 0);
1267   insn->noreorder_p = (mips_opts.noreorder > 0);
1268   insn->mips16_absolute_jump_p = 0;
1269 }
1270
1271 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1272
1273 static void
1274 install_insn (const struct mips_cl_insn *insn)
1275 {
1276   char *f = insn->frag->fr_literal + insn->where;
1277   if (!mips_opts.mips16)
1278     md_number_to_chars (f, insn->insn_opcode, 4);
1279   else if (insn->mips16_absolute_jump_p)
1280     {
1281       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1282       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1283     }
1284   else
1285     {
1286       if (insn->use_extend)
1287         {
1288           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1289           f += 2;
1290         }
1291       md_number_to_chars (f, insn->insn_opcode, 2);
1292     }
1293 }
1294
1295 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1296    and install the opcode in the new location.  */
1297
1298 static void
1299 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1300 {
1301   size_t i;
1302
1303   insn->frag = frag;
1304   insn->where = where;
1305   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1306     if (insn->fixp[i] != NULL)
1307       {
1308         insn->fixp[i]->fx_frag = frag;
1309         insn->fixp[i]->fx_where = where;
1310       }
1311   install_insn (insn);
1312 }
1313
1314 /* Add INSN to the end of the output.  */
1315
1316 static void
1317 add_fixed_insn (struct mips_cl_insn *insn)
1318 {
1319   char *f = frag_more (insn_length (insn));
1320   move_insn (insn, frag_now, f - frag_now->fr_literal);
1321 }
1322
1323 /* Start a variant frag and move INSN to the start of the variant part,
1324    marking it as fixed.  The other arguments are as for frag_var.  */
1325
1326 static void
1327 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1328                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1329 {
1330   frag_grow (max_chars);
1331   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1332   insn->fixed_p = 1;
1333   frag_var (rs_machine_dependent, max_chars, var,
1334             subtype, symbol, offset, NULL);
1335 }
1336
1337 /* Insert N copies of INSN into the history buffer, starting at
1338    position FIRST.  Neither FIRST nor N need to be clipped.  */
1339
1340 static void
1341 insert_into_history (unsigned int first, unsigned int n,
1342                      const struct mips_cl_insn *insn)
1343 {
1344   if (mips_relax.sequence != 2)
1345     {
1346       unsigned int i;
1347
1348       for (i = ARRAY_SIZE (history); i-- > first;)
1349         if (i >= first + n)
1350           history[i] = history[i - n];
1351         else
1352           history[i] = *insn;
1353     }
1354 }
1355
1356 /* Emit a nop instruction, recording it in the history buffer.  */
1357
1358 static void
1359 emit_nop (void)
1360 {
1361   add_fixed_insn (NOP_INSN);
1362   insert_into_history (0, 1, NOP_INSN);
1363 }
1364
1365 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1366    the idea is to make it obvious at a glance that each errata is
1367    included.  */
1368
1369 static void
1370 init_vr4120_conflicts (void)
1371 {
1372 #define CONFLICT(FIRST, SECOND) \
1373     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1374
1375   /* Errata 21 - [D]DIV[U] after [D]MACC */
1376   CONFLICT (MACC, DIV);
1377   CONFLICT (DMACC, DIV);
1378
1379   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1380   CONFLICT (DMULT, DMULT);
1381   CONFLICT (DMULT, DMACC);
1382   CONFLICT (DMACC, DMULT);
1383   CONFLICT (DMACC, DMACC);
1384
1385   /* Errata 24 - MT{LO,HI} after [D]MACC */
1386   CONFLICT (MACC, MTHILO);
1387   CONFLICT (DMACC, MTHILO);
1388
1389   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1390      instruction is executed immediately after a MACC or DMACC
1391      instruction, the result of [either instruction] is incorrect."  */
1392   CONFLICT (MACC, MULT);
1393   CONFLICT (MACC, DMULT);
1394   CONFLICT (DMACC, MULT);
1395   CONFLICT (DMACC, DMULT);
1396
1397   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1398      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1399      DDIV or DDIVU instruction, the result of the MACC or
1400      DMACC instruction is incorrect.".  */
1401   CONFLICT (DMULT, MACC);
1402   CONFLICT (DMULT, DMACC);
1403   CONFLICT (DIV, MACC);
1404   CONFLICT (DIV, DMACC);
1405
1406 #undef CONFLICT
1407 }
1408
1409 struct regname {
1410   const char *name;
1411   unsigned int num;
1412 };
1413
1414 #define RTYPE_MASK      0x1ff00
1415 #define RTYPE_NUM       0x00100
1416 #define RTYPE_FPU       0x00200
1417 #define RTYPE_FCC       0x00400
1418 #define RTYPE_VEC       0x00800
1419 #define RTYPE_GP        0x01000
1420 #define RTYPE_CP0       0x02000
1421 #define RTYPE_PC        0x04000
1422 #define RTYPE_ACC       0x08000
1423 #define RTYPE_CCC       0x10000
1424 #define RNUM_MASK       0x000ff
1425 #define RWARN           0x80000
1426
1427 #define GENERIC_REGISTER_NUMBERS \
1428     {"$0",      RTYPE_NUM | 0},  \
1429     {"$1",      RTYPE_NUM | 1},  \
1430     {"$2",      RTYPE_NUM | 2},  \
1431     {"$3",      RTYPE_NUM | 3},  \
1432     {"$4",      RTYPE_NUM | 4},  \
1433     {"$5",      RTYPE_NUM | 5},  \
1434     {"$6",      RTYPE_NUM | 6},  \
1435     {"$7",      RTYPE_NUM | 7},  \
1436     {"$8",      RTYPE_NUM | 8},  \
1437     {"$9",      RTYPE_NUM | 9},  \
1438     {"$10",     RTYPE_NUM | 10}, \
1439     {"$11",     RTYPE_NUM | 11}, \
1440     {"$12",     RTYPE_NUM | 12}, \
1441     {"$13",     RTYPE_NUM | 13}, \
1442     {"$14",     RTYPE_NUM | 14}, \
1443     {"$15",     RTYPE_NUM | 15}, \
1444     {"$16",     RTYPE_NUM | 16}, \
1445     {"$17",     RTYPE_NUM | 17}, \
1446     {"$18",     RTYPE_NUM | 18}, \
1447     {"$19",     RTYPE_NUM | 19}, \
1448     {"$20",     RTYPE_NUM | 20}, \
1449     {"$21",     RTYPE_NUM | 21}, \
1450     {"$22",     RTYPE_NUM | 22}, \
1451     {"$23",     RTYPE_NUM | 23}, \
1452     {"$24",     RTYPE_NUM | 24}, \
1453     {"$25",     RTYPE_NUM | 25}, \
1454     {"$26",     RTYPE_NUM | 26}, \
1455     {"$27",     RTYPE_NUM | 27}, \
1456     {"$28",     RTYPE_NUM | 28}, \
1457     {"$29",     RTYPE_NUM | 29}, \
1458     {"$30",     RTYPE_NUM | 30}, \
1459     {"$31",     RTYPE_NUM | 31} 
1460
1461 #define FPU_REGISTER_NAMES       \
1462     {"$f0",     RTYPE_FPU | 0},  \
1463     {"$f1",     RTYPE_FPU | 1},  \
1464     {"$f2",     RTYPE_FPU | 2},  \
1465     {"$f3",     RTYPE_FPU | 3},  \
1466     {"$f4",     RTYPE_FPU | 4},  \
1467     {"$f5",     RTYPE_FPU | 5},  \
1468     {"$f6",     RTYPE_FPU | 6},  \
1469     {"$f7",     RTYPE_FPU | 7},  \
1470     {"$f8",     RTYPE_FPU | 8},  \
1471     {"$f9",     RTYPE_FPU | 9},  \
1472     {"$f10",    RTYPE_FPU | 10}, \
1473     {"$f11",    RTYPE_FPU | 11}, \
1474     {"$f12",    RTYPE_FPU | 12}, \
1475     {"$f13",    RTYPE_FPU | 13}, \
1476     {"$f14",    RTYPE_FPU | 14}, \
1477     {"$f15",    RTYPE_FPU | 15}, \
1478     {"$f16",    RTYPE_FPU | 16}, \
1479     {"$f17",    RTYPE_FPU | 17}, \
1480     {"$f18",    RTYPE_FPU | 18}, \
1481     {"$f19",    RTYPE_FPU | 19}, \
1482     {"$f20",    RTYPE_FPU | 20}, \
1483     {"$f21",    RTYPE_FPU | 21}, \
1484     {"$f22",    RTYPE_FPU | 22}, \
1485     {"$f23",    RTYPE_FPU | 23}, \
1486     {"$f24",    RTYPE_FPU | 24}, \
1487     {"$f25",    RTYPE_FPU | 25}, \
1488     {"$f26",    RTYPE_FPU | 26}, \
1489     {"$f27",    RTYPE_FPU | 27}, \
1490     {"$f28",    RTYPE_FPU | 28}, \
1491     {"$f29",    RTYPE_FPU | 29}, \
1492     {"$f30",    RTYPE_FPU | 30}, \
1493     {"$f31",    RTYPE_FPU | 31}
1494
1495 #define FPU_CONDITION_CODE_NAMES \
1496     {"$fcc0",   RTYPE_FCC | 0},  \
1497     {"$fcc1",   RTYPE_FCC | 1},  \
1498     {"$fcc2",   RTYPE_FCC | 2},  \
1499     {"$fcc3",   RTYPE_FCC | 3},  \
1500     {"$fcc4",   RTYPE_FCC | 4},  \
1501     {"$fcc5",   RTYPE_FCC | 5},  \
1502     {"$fcc6",   RTYPE_FCC | 6},  \
1503     {"$fcc7",   RTYPE_FCC | 7}
1504
1505 #define COPROC_CONDITION_CODE_NAMES         \
1506     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1507     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1508     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1509     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1510     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1511     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1512     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1513     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1514
1515 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1516     {"$a4",     RTYPE_GP | 8},  \
1517     {"$a5",     RTYPE_GP | 9},  \
1518     {"$a6",     RTYPE_GP | 10}, \
1519     {"$a7",     RTYPE_GP | 11}, \
1520     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1521     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1522     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1523     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1524     {"$t0",     RTYPE_GP | 12}, \
1525     {"$t1",     RTYPE_GP | 13}, \
1526     {"$t2",     RTYPE_GP | 14}, \
1527     {"$t3",     RTYPE_GP | 15}
1528
1529 #define O32_SYMBOLIC_REGISTER_NAMES \
1530     {"$t0",     RTYPE_GP | 8},  \
1531     {"$t1",     RTYPE_GP | 9},  \
1532     {"$t2",     RTYPE_GP | 10}, \
1533     {"$t3",     RTYPE_GP | 11}, \
1534     {"$t4",     RTYPE_GP | 12}, \
1535     {"$t5",     RTYPE_GP | 13}, \
1536     {"$t6",     RTYPE_GP | 14}, \
1537     {"$t7",     RTYPE_GP | 15}, \
1538     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1539     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1540     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1541     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1542
1543 /* Remaining symbolic register names */
1544 #define SYMBOLIC_REGISTER_NAMES \
1545     {"$zero",   RTYPE_GP | 0},  \
1546     {"$at",     RTYPE_GP | 1},  \
1547     {"$AT",     RTYPE_GP | 1},  \
1548     {"$v0",     RTYPE_GP | 2},  \
1549     {"$v1",     RTYPE_GP | 3},  \
1550     {"$a0",     RTYPE_GP | 4},  \
1551     {"$a1",     RTYPE_GP | 5},  \
1552     {"$a2",     RTYPE_GP | 6},  \
1553     {"$a3",     RTYPE_GP | 7},  \
1554     {"$s0",     RTYPE_GP | 16}, \
1555     {"$s1",     RTYPE_GP | 17}, \
1556     {"$s2",     RTYPE_GP | 18}, \
1557     {"$s3",     RTYPE_GP | 19}, \
1558     {"$s4",     RTYPE_GP | 20}, \
1559     {"$s5",     RTYPE_GP | 21}, \
1560     {"$s6",     RTYPE_GP | 22}, \
1561     {"$s7",     RTYPE_GP | 23}, \
1562     {"$t8",     RTYPE_GP | 24}, \
1563     {"$t9",     RTYPE_GP | 25}, \
1564     {"$k0",     RTYPE_GP | 26}, \
1565     {"$kt0",    RTYPE_GP | 26}, \
1566     {"$k1",     RTYPE_GP | 27}, \
1567     {"$kt1",    RTYPE_GP | 27}, \
1568     {"$gp",     RTYPE_GP | 28}, \
1569     {"$sp",     RTYPE_GP | 29}, \
1570     {"$s8",     RTYPE_GP | 30}, \
1571     {"$fp",     RTYPE_GP | 30}, \
1572     {"$ra",     RTYPE_GP | 31}
1573
1574 #define MIPS16_SPECIAL_REGISTER_NAMES \
1575     {"$pc",     RTYPE_PC | 0}
1576
1577 #define MDMX_VECTOR_REGISTER_NAMES \
1578     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1579     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1580     {"$v2",     RTYPE_VEC | 2},  \
1581     {"$v3",     RTYPE_VEC | 3},  \
1582     {"$v4",     RTYPE_VEC | 4},  \
1583     {"$v5",     RTYPE_VEC | 5},  \
1584     {"$v6",     RTYPE_VEC | 6},  \
1585     {"$v7",     RTYPE_VEC | 7},  \
1586     {"$v8",     RTYPE_VEC | 8},  \
1587     {"$v9",     RTYPE_VEC | 9},  \
1588     {"$v10",    RTYPE_VEC | 10}, \
1589     {"$v11",    RTYPE_VEC | 11}, \
1590     {"$v12",    RTYPE_VEC | 12}, \
1591     {"$v13",    RTYPE_VEC | 13}, \
1592     {"$v14",    RTYPE_VEC | 14}, \
1593     {"$v15",    RTYPE_VEC | 15}, \
1594     {"$v16",    RTYPE_VEC | 16}, \
1595     {"$v17",    RTYPE_VEC | 17}, \
1596     {"$v18",    RTYPE_VEC | 18}, \
1597     {"$v19",    RTYPE_VEC | 19}, \
1598     {"$v20",    RTYPE_VEC | 20}, \
1599     {"$v21",    RTYPE_VEC | 21}, \
1600     {"$v22",    RTYPE_VEC | 22}, \
1601     {"$v23",    RTYPE_VEC | 23}, \
1602     {"$v24",    RTYPE_VEC | 24}, \
1603     {"$v25",    RTYPE_VEC | 25}, \
1604     {"$v26",    RTYPE_VEC | 26}, \
1605     {"$v27",    RTYPE_VEC | 27}, \
1606     {"$v28",    RTYPE_VEC | 28}, \
1607     {"$v29",    RTYPE_VEC | 29}, \
1608     {"$v30",    RTYPE_VEC | 30}, \
1609     {"$v31",    RTYPE_VEC | 31}
1610
1611 #define MIPS_DSP_ACCUMULATOR_NAMES \
1612     {"$ac0",    RTYPE_ACC | 0}, \
1613     {"$ac1",    RTYPE_ACC | 1}, \
1614     {"$ac2",    RTYPE_ACC | 2}, \
1615     {"$ac3",    RTYPE_ACC | 3}
1616
1617 static const struct regname reg_names[] = {
1618   GENERIC_REGISTER_NUMBERS,
1619   FPU_REGISTER_NAMES,
1620   FPU_CONDITION_CODE_NAMES,
1621   COPROC_CONDITION_CODE_NAMES,
1622
1623   /* The $txx registers depends on the abi,
1624      these will be added later into the symbol table from
1625      one of the tables below once mips_abi is set after 
1626      parsing of arguments from the command line. */
1627   SYMBOLIC_REGISTER_NAMES,
1628
1629   MIPS16_SPECIAL_REGISTER_NAMES,
1630   MDMX_VECTOR_REGISTER_NAMES,
1631   MIPS_DSP_ACCUMULATOR_NAMES,
1632   {0, 0}
1633 };
1634
1635 static const struct regname reg_names_o32[] = {
1636   O32_SYMBOLIC_REGISTER_NAMES,
1637   {0, 0}
1638 };
1639
1640 static const struct regname reg_names_n32n64[] = {
1641   N32N64_SYMBOLIC_REGISTER_NAMES,
1642   {0, 0}
1643 };
1644
1645 static int
1646 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1647 {
1648   symbolS *symbolP;
1649   char *e;
1650   char save_c;
1651   int reg = -1;
1652
1653   /* Find end of name.  */
1654   e = *s;
1655   if (is_name_beginner (*e))
1656     ++e;
1657   while (is_part_of_name (*e))
1658     ++e;
1659
1660   /* Terminate name.  */
1661   save_c = *e;
1662   *e = '\0';
1663
1664   /* Look for a register symbol.  */
1665   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1666     {
1667       int r = S_GET_VALUE (symbolP);
1668       if (r & types)
1669         reg = r & RNUM_MASK;
1670       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1671         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1672         reg = (r & RNUM_MASK) - 2;
1673     }
1674   /* Else see if this is a register defined in an itbl entry.  */
1675   else if ((types & RTYPE_GP) && itbl_have_entries)
1676     {
1677       char *n = *s;
1678       unsigned long r;
1679
1680       if (*n == '$')
1681         ++n;
1682       if (itbl_get_reg_val (n, &r))
1683         reg = r & RNUM_MASK;
1684     }
1685
1686   /* Advance to next token if a register was recognised.  */
1687   if (reg >= 0)
1688     *s = e;
1689   else if (types & RWARN)
1690     as_warn ("Unrecognized register name `%s'", *s);
1691
1692   *e = save_c;
1693   if (regnop)
1694     *regnop = reg;
1695   return reg >= 0;
1696 }
1697
1698 /* This function is called once, at assembler startup time.  It should set up
1699    all the tables, etc. that the MD part of the assembler will need.  */
1700
1701 void
1702 md_begin (void)
1703 {
1704   register const char *retval = NULL;
1705   int i = 0;
1706   int broken = 0;
1707
1708   if (mips_pic != NO_PIC)
1709     {
1710       if (g_switch_seen && g_switch_value != 0)
1711         as_bad (_("-G may not be used in position-independent code"));
1712       g_switch_value = 0;
1713     }
1714
1715   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1716     as_warn (_("Could not set architecture and machine"));
1717
1718   op_hash = hash_new ();
1719
1720   for (i = 0; i < NUMOPCODES;)
1721     {
1722       const char *name = mips_opcodes[i].name;
1723
1724       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1725       if (retval != NULL)
1726         {
1727           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1728                    mips_opcodes[i].name, retval);
1729           /* Probably a memory allocation problem?  Give up now.  */
1730           as_fatal (_("Broken assembler.  No assembly attempted."));
1731         }
1732       do
1733         {
1734           if (mips_opcodes[i].pinfo != INSN_MACRO)
1735             {
1736               if (!validate_mips_insn (&mips_opcodes[i]))
1737                 broken = 1;
1738               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1739                 {
1740                   create_insn (&nop_insn, mips_opcodes + i);
1741                   nop_insn.fixed_p = 1;
1742                 }
1743             }
1744           ++i;
1745         }
1746       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1747     }
1748
1749   mips16_op_hash = hash_new ();
1750
1751   i = 0;
1752   while (i < bfd_mips16_num_opcodes)
1753     {
1754       const char *name = mips16_opcodes[i].name;
1755
1756       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1757       if (retval != NULL)
1758         as_fatal (_("internal: can't hash `%s': %s"),
1759                   mips16_opcodes[i].name, retval);
1760       do
1761         {
1762           if (mips16_opcodes[i].pinfo != INSN_MACRO
1763               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1764                   != mips16_opcodes[i].match))
1765             {
1766               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1767                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1768               broken = 1;
1769             }
1770           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1771             {
1772               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1773               mips16_nop_insn.fixed_p = 1;
1774             }
1775           ++i;
1776         }
1777       while (i < bfd_mips16_num_opcodes
1778              && strcmp (mips16_opcodes[i].name, name) == 0);
1779     }
1780
1781   if (broken)
1782     as_fatal (_("Broken assembler.  No assembly attempted."));
1783
1784   /* We add all the general register names to the symbol table.  This
1785      helps us detect invalid uses of them.  */
1786   for (i = 0; reg_names[i].name; i++) 
1787     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1788                                      reg_names[i].num, // & RNUM_MASK,
1789                                      &zero_address_frag));
1790   if (HAVE_NEWABI)
1791     for (i = 0; reg_names_n32n64[i].name; i++) 
1792       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1793                                        reg_names_n32n64[i].num, // & RNUM_MASK,
1794                                        &zero_address_frag));
1795   else
1796     for (i = 0; reg_names_o32[i].name; i++) 
1797       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1798                                        reg_names_o32[i].num, // & RNUM_MASK,
1799                                        &zero_address_frag));
1800
1801   mips_no_prev_insn ();
1802
1803   mips_gprmask = 0;
1804   mips_cprmask[0] = 0;
1805   mips_cprmask[1] = 0;
1806   mips_cprmask[2] = 0;
1807   mips_cprmask[3] = 0;
1808
1809   /* set the default alignment for the text section (2**2) */
1810   record_alignment (text_section, 2);
1811
1812   bfd_set_gp_size (stdoutput, g_switch_value);
1813
1814 #ifdef OBJ_ELF
1815   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1816     {
1817       /* On a native system other than VxWorks, sections must be aligned
1818          to 16 byte boundaries.  When configured for an embedded ELF
1819          target, we don't bother.  */
1820       if (strcmp (TARGET_OS, "elf") != 0
1821           && strcmp (TARGET_OS, "vxworks") != 0)
1822         {
1823           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1824           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1825           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1826         }
1827
1828       /* Create a .reginfo section for register masks and a .mdebug
1829          section for debugging information.  */
1830       {
1831         segT seg;
1832         subsegT subseg;
1833         flagword flags;
1834         segT sec;
1835
1836         seg = now_seg;
1837         subseg = now_subseg;
1838
1839         /* The ABI says this section should be loaded so that the
1840            running program can access it.  However, we don't load it
1841            if we are configured for an embedded target */
1842         flags = SEC_READONLY | SEC_DATA;
1843         if (strcmp (TARGET_OS, "elf") != 0)
1844           flags |= SEC_ALLOC | SEC_LOAD;
1845
1846         if (mips_abi != N64_ABI)
1847           {
1848             sec = subseg_new (".reginfo", (subsegT) 0);
1849
1850             bfd_set_section_flags (stdoutput, sec, flags);
1851             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1852
1853             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1854           }
1855         else
1856           {
1857             /* The 64-bit ABI uses a .MIPS.options section rather than
1858                .reginfo section.  */
1859             sec = subseg_new (".MIPS.options", (subsegT) 0);
1860             bfd_set_section_flags (stdoutput, sec, flags);
1861             bfd_set_section_alignment (stdoutput, sec, 3);
1862
1863             /* Set up the option header.  */
1864             {
1865               Elf_Internal_Options opthdr;
1866               char *f;
1867
1868               opthdr.kind = ODK_REGINFO;
1869               opthdr.size = (sizeof (Elf_External_Options)
1870                              + sizeof (Elf64_External_RegInfo));
1871               opthdr.section = 0;
1872               opthdr.info = 0;
1873               f = frag_more (sizeof (Elf_External_Options));
1874               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1875                                              (Elf_External_Options *) f);
1876
1877               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1878             }
1879           }
1880
1881         if (ECOFF_DEBUGGING)
1882           {
1883             sec = subseg_new (".mdebug", (subsegT) 0);
1884             (void) bfd_set_section_flags (stdoutput, sec,
1885                                           SEC_HAS_CONTENTS | SEC_READONLY);
1886             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1887           }
1888         else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1889           {
1890             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1891             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1892                                           SEC_READONLY | SEC_RELOC
1893                                           | SEC_DEBUGGING);
1894             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1895           }
1896
1897         subseg_set (seg, subseg);
1898       }
1899     }
1900 #endif /* OBJ_ELF */
1901
1902   if (! ECOFF_DEBUGGING)
1903     md_obj_begin ();
1904
1905   if (mips_fix_vr4120)
1906     init_vr4120_conflicts ();
1907 }
1908
1909 void
1910 md_mips_end (void)
1911 {
1912   if (! ECOFF_DEBUGGING)
1913     md_obj_end ();
1914 }
1915
1916 void
1917 md_assemble (char *str)
1918 {
1919   struct mips_cl_insn insn;
1920   bfd_reloc_code_real_type unused_reloc[3]
1921     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1922
1923   imm_expr.X_op = O_absent;
1924   imm2_expr.X_op = O_absent;
1925   offset_expr.X_op = O_absent;
1926   imm_reloc[0] = BFD_RELOC_UNUSED;
1927   imm_reloc[1] = BFD_RELOC_UNUSED;
1928   imm_reloc[2] = BFD_RELOC_UNUSED;
1929   offset_reloc[0] = BFD_RELOC_UNUSED;
1930   offset_reloc[1] = BFD_RELOC_UNUSED;
1931   offset_reloc[2] = BFD_RELOC_UNUSED;
1932
1933   if (mips_opts.mips16)
1934     mips16_ip (str, &insn);
1935   else
1936     {
1937       mips_ip (str, &insn);
1938       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1939             str, insn.insn_opcode));
1940     }
1941
1942   if (insn_error)
1943     {
1944       as_bad ("%s `%s'", insn_error, str);
1945       return;
1946     }
1947
1948   if (insn.insn_mo->pinfo == INSN_MACRO)
1949     {
1950       macro_start ();
1951       if (mips_opts.mips16)
1952         mips16_macro (&insn);
1953       else
1954         macro (&insn);
1955       macro_end ();
1956     }
1957   else
1958     {
1959       if (imm_expr.X_op != O_absent)
1960         append_insn (&insn, &imm_expr, imm_reloc);
1961       else if (offset_expr.X_op != O_absent)
1962         append_insn (&insn, &offset_expr, offset_reloc);
1963       else
1964         append_insn (&insn, NULL, unused_reloc);
1965     }
1966 }
1967
1968 /* Return true if the given relocation might need a matching %lo().
1969    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
1970    need a matching %lo() when applied to local symbols.  */
1971
1972 static inline bfd_boolean
1973 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1974 {
1975   return (HAVE_IN_PLACE_ADDENDS
1976           && (reloc == BFD_RELOC_HI16_S
1977               || reloc == BFD_RELOC_MIPS16_HI16_S
1978               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
1979                  all GOT16 relocations evaluate to "G".  */
1980               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
1981 }
1982
1983 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1984    relocation.  */
1985
1986 static inline bfd_boolean
1987 fixup_has_matching_lo_p (fixS *fixp)
1988 {
1989   return (fixp->fx_next != NULL
1990           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1991              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
1992           && fixp->fx_addsy == fixp->fx_next->fx_addsy
1993           && fixp->fx_offset == fixp->fx_next->fx_offset);
1994 }
1995
1996 /* See whether instruction IP reads register REG.  CLASS is the type
1997    of register.  */
1998
1999 static int
2000 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2001                enum mips_regclass class)
2002 {
2003   if (class == MIPS16_REG)
2004     {
2005       assert (mips_opts.mips16);
2006       reg = mips16_to_32_reg_map[reg];
2007       class = MIPS_GR_REG;
2008     }
2009
2010   /* Don't report on general register ZERO, since it never changes.  */
2011   if (class == MIPS_GR_REG && reg == ZERO)
2012     return 0;
2013
2014   if (class == MIPS_FP_REG)
2015     {
2016       assert (! mips_opts.mips16);
2017       /* If we are called with either $f0 or $f1, we must check $f0.
2018          This is not optimal, because it will introduce an unnecessary
2019          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2020          need to distinguish reading both $f0 and $f1 or just one of
2021          them.  Note that we don't have to check the other way,
2022          because there is no instruction that sets both $f0 and $f1
2023          and requires a delay.  */
2024       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2025           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2026               == (reg &~ (unsigned) 1)))
2027         return 1;
2028       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2029           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2030               == (reg &~ (unsigned) 1)))
2031         return 1;
2032     }
2033   else if (! mips_opts.mips16)
2034     {
2035       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2036           && EXTRACT_OPERAND (RS, *ip) == reg)
2037         return 1;
2038       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2039           && EXTRACT_OPERAND (RT, *ip) == reg)
2040         return 1;
2041     }
2042   else
2043     {
2044       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2045           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2046         return 1;
2047       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2048           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2049         return 1;
2050       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2051           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2052               == reg))
2053         return 1;
2054       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2055         return 1;
2056       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2057         return 1;
2058       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2059         return 1;
2060       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2061           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2062         return 1;
2063     }
2064
2065   return 0;
2066 }
2067
2068 /* This function returns true if modifying a register requires a
2069    delay.  */
2070
2071 static int
2072 reg_needs_delay (unsigned int reg)
2073 {
2074   unsigned long prev_pinfo;
2075
2076   prev_pinfo = history[0].insn_mo->pinfo;
2077   if (! mips_opts.noreorder
2078       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2079            && ! gpr_interlocks)
2080           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2081               && ! cop_interlocks)))
2082     {
2083       /* A load from a coprocessor or from memory.  All load delays
2084          delay the use of general register rt for one instruction.  */
2085       /* Itbl support may require additional care here.  */
2086       know (prev_pinfo & INSN_WRITE_GPR_T);
2087       if (reg == EXTRACT_OPERAND (RT, history[0]))
2088         return 1;
2089     }
2090
2091   return 0;
2092 }
2093
2094 /* Move all labels in insn_labels to the current insertion point.  */
2095
2096 static void
2097 mips_move_labels (void)
2098 {
2099   struct insn_label_list *l;
2100   valueT val;
2101
2102   for (l = insn_labels; l != NULL; l = l->next)
2103     {
2104       assert (S_GET_SEGMENT (l->label) == now_seg);
2105       symbol_set_frag (l->label, frag_now);
2106       val = (valueT) frag_now_fix ();
2107       /* mips16 text labels are stored as odd.  */
2108       if (mips_opts.mips16)
2109         ++val;
2110       S_SET_VALUE (l->label, val);
2111     }
2112 }
2113
2114 /* Mark instruction labels in mips16 mode.  This permits the linker to
2115    handle them specially, such as generating jalx instructions when
2116    needed.  We also make them odd for the duration of the assembly, in
2117    order to generate the right sort of code.  We will make them even
2118    in the adjust_symtab routine, while leaving them marked.  This is
2119    convenient for the debugger and the disassembler.  The linker knows
2120    to make them odd again.  */
2121
2122 static void
2123 mips16_mark_labels (void)
2124 {
2125   if (mips_opts.mips16)
2126     {
2127       struct insn_label_list *l;
2128       valueT val;
2129
2130       for (l = insn_labels; l != NULL; l = l->next)
2131         {
2132 #ifdef OBJ_ELF
2133           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
2134             S_SET_OTHER (l->label, STO_MIPS16);
2135 #endif
2136           val = S_GET_VALUE (l->label);
2137           if ((val & 1) == 0)
2138             S_SET_VALUE (l->label, val + 1);
2139         }
2140     }
2141 }
2142
2143 /* End the current frag.  Make it a variant frag and record the
2144    relaxation info.  */
2145
2146 static void
2147 relax_close_frag (void)
2148 {
2149   mips_macro_warning.first_frag = frag_now;
2150   frag_var (rs_machine_dependent, 0, 0,
2151             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2152             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2153
2154   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2155   mips_relax.first_fixup = 0;
2156 }
2157
2158 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2159    See the comment above RELAX_ENCODE for more details.  */
2160
2161 static void
2162 relax_start (symbolS *symbol)
2163 {
2164   assert (mips_relax.sequence == 0);
2165   mips_relax.sequence = 1;
2166   mips_relax.symbol = symbol;
2167 }
2168
2169 /* Start generating the second version of a relaxable sequence.
2170    See the comment above RELAX_ENCODE for more details.  */
2171
2172 static void
2173 relax_switch (void)
2174 {
2175   assert (mips_relax.sequence == 1);
2176   mips_relax.sequence = 2;
2177 }
2178
2179 /* End the current relaxable sequence.  */
2180
2181 static void
2182 relax_end (void)
2183 {
2184   assert (mips_relax.sequence == 2);
2185   relax_close_frag ();
2186   mips_relax.sequence = 0;
2187 }
2188
2189 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2190    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2191    by VR4120 errata.  */
2192
2193 static unsigned int
2194 classify_vr4120_insn (const char *name)
2195 {
2196   if (strncmp (name, "macc", 4) == 0)
2197     return FIX_VR4120_MACC;
2198   if (strncmp (name, "dmacc", 5) == 0)
2199     return FIX_VR4120_DMACC;
2200   if (strncmp (name, "mult", 4) == 0)
2201     return FIX_VR4120_MULT;
2202   if (strncmp (name, "dmult", 5) == 0)
2203     return FIX_VR4120_DMULT;
2204   if (strstr (name, "div"))
2205     return FIX_VR4120_DIV;
2206   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2207     return FIX_VR4120_MTHILO;
2208   return NUM_FIX_VR4120_CLASSES;
2209 }
2210
2211 /* Return the number of instructions that must separate INSN1 and INSN2,
2212    where INSN1 is the earlier instruction.  Return the worst-case value
2213    for any INSN2 if INSN2 is null.  */
2214
2215 static unsigned int
2216 insns_between (const struct mips_cl_insn *insn1,
2217                const struct mips_cl_insn *insn2)
2218 {
2219   unsigned long pinfo1, pinfo2;
2220
2221   /* This function needs to know which pinfo flags are set for INSN2
2222      and which registers INSN2 uses.  The former is stored in PINFO2 and
2223      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2224      will have every flag set and INSN2_USES_REG will always return true.  */
2225   pinfo1 = insn1->insn_mo->pinfo;
2226   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2227
2228 #define INSN2_USES_REG(REG, CLASS) \
2229    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2230
2231   /* For most targets, write-after-read dependencies on the HI and LO
2232      registers must be separated by at least two instructions.  */
2233   if (!hilo_interlocks)
2234     {
2235       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2236         return 2;
2237       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2238         return 2;
2239     }
2240
2241   /* If we're working around r7000 errata, there must be two instructions
2242      between an mfhi or mflo and any instruction that uses the result.  */
2243   if (mips_7000_hilo_fix
2244       && MF_HILO_INSN (pinfo1)
2245       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2246     return 2;
2247
2248   /* If working around VR4120 errata, check for combinations that need
2249      a single intervening instruction.  */
2250   if (mips_fix_vr4120)
2251     {
2252       unsigned int class1, class2;
2253
2254       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2255       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2256         {
2257           if (insn2 == NULL)
2258             return 1;
2259           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2260           if (vr4120_conflicts[class1] & (1 << class2))
2261             return 1;
2262         }
2263     }
2264
2265   if (!mips_opts.mips16)
2266     {
2267       /* Check for GPR or coprocessor load delays.  All such delays
2268          are on the RT register.  */
2269       /* Itbl support may require additional care here.  */
2270       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2271           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2272         {
2273           know (pinfo1 & INSN_WRITE_GPR_T);
2274           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2275             return 1;
2276         }
2277
2278       /* Check for generic coprocessor hazards.
2279
2280          This case is not handled very well.  There is no special
2281          knowledge of CP0 handling, and the coprocessors other than
2282          the floating point unit are not distinguished at all.  */
2283       /* Itbl support may require additional care here. FIXME!
2284          Need to modify this to include knowledge about
2285          user specified delays!  */
2286       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2287                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2288         {
2289           /* Handle cases where INSN1 writes to a known general coprocessor
2290              register.  There must be a one instruction delay before INSN2
2291              if INSN2 reads that register, otherwise no delay is needed.  */
2292           if (pinfo1 & INSN_WRITE_FPR_T)
2293             {
2294               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2295                 return 1;
2296             }
2297           else if (pinfo1 & INSN_WRITE_FPR_S)
2298             {
2299               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2300                 return 1;
2301             }
2302           else
2303             {
2304               /* Read-after-write dependencies on the control registers
2305                  require a two-instruction gap.  */
2306               if ((pinfo1 & INSN_WRITE_COND_CODE)
2307                   && (pinfo2 & INSN_READ_COND_CODE))
2308                 return 2;
2309
2310               /* We don't know exactly what INSN1 does.  If INSN2 is
2311                  also a coprocessor instruction, assume there must be
2312                  a one instruction gap.  */
2313               if (pinfo2 & INSN_COP)
2314                 return 1;
2315             }
2316         }
2317
2318       /* Check for read-after-write dependencies on the coprocessor
2319          control registers in cases where INSN1 does not need a general
2320          coprocessor delay.  This means that INSN1 is a floating point
2321          comparison instruction.  */
2322       /* Itbl support may require additional care here.  */
2323       else if (!cop_interlocks
2324                && (pinfo1 & INSN_WRITE_COND_CODE)
2325                && (pinfo2 & INSN_READ_COND_CODE))
2326         return 1;
2327     }
2328
2329 #undef INSN2_USES_REG
2330
2331   return 0;
2332 }
2333
2334 /* Return the number of nops that would be needed to work around the
2335    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2336    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2337
2338 static int
2339 nops_for_vr4130 (const struct mips_cl_insn *history,
2340                  const struct mips_cl_insn *insn)
2341 {
2342   int i, j, reg;
2343
2344   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2345      are not affected by the errata.  */
2346   if (insn != 0
2347       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2348           || strcmp (insn->insn_mo->name, "mtlo") == 0
2349           || strcmp (insn->insn_mo->name, "mthi") == 0))
2350     return 0;
2351
2352   /* Search for the first MFLO or MFHI.  */
2353   for (i = 0; i < MAX_VR4130_NOPS; i++)
2354     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2355       {
2356         /* Extract the destination register.  */
2357         if (mips_opts.mips16)
2358           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2359         else
2360           reg = EXTRACT_OPERAND (RD, history[i]);
2361
2362         /* No nops are needed if INSN reads that register.  */
2363         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2364           return 0;
2365
2366         /* ...or if any of the intervening instructions do.  */
2367         for (j = 0; j < i; j++)
2368           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2369             return 0;
2370
2371         return MAX_VR4130_NOPS - i;
2372       }
2373   return 0;
2374 }
2375
2376 /* Return the number of nops that would be needed if instruction INSN
2377    immediately followed the MAX_NOPS instructions given by HISTORY,
2378    where HISTORY[0] is the most recent instruction.  If INSN is null,
2379    return the worse-case number of nops for any instruction.  */
2380
2381 static int
2382 nops_for_insn (const struct mips_cl_insn *history,
2383                const struct mips_cl_insn *insn)
2384 {
2385   int i, nops, tmp_nops;
2386
2387   nops = 0;
2388   for (i = 0; i < MAX_DELAY_NOPS; i++)
2389     if (!history[i].noreorder_p)
2390       {
2391         tmp_nops = insns_between (history + i, insn) - i;
2392         if (tmp_nops > nops)
2393           nops = tmp_nops;
2394       }
2395
2396   if (mips_fix_vr4130)
2397     {
2398       tmp_nops = nops_for_vr4130 (history, insn);
2399       if (tmp_nops > nops)
2400         nops = tmp_nops;
2401     }
2402
2403   return nops;
2404 }
2405
2406 /* The variable arguments provide NUM_INSNS extra instructions that
2407    might be added to HISTORY.  Return the largest number of nops that
2408    would be needed after the extended sequence.  */
2409
2410 static int
2411 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2412 {
2413   va_list args;
2414   struct mips_cl_insn buffer[MAX_NOPS];
2415   struct mips_cl_insn *cursor;
2416   int nops;
2417
2418   va_start (args, history);
2419   cursor = buffer + num_insns;
2420   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2421   while (cursor > buffer)
2422     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2423
2424   nops = nops_for_insn (buffer, NULL);
2425   va_end (args);
2426   return nops;
2427 }
2428
2429 /* Like nops_for_insn, but if INSN is a branch, take into account the
2430    worst-case delay for the branch target.  */
2431
2432 static int
2433 nops_for_insn_or_target (const struct mips_cl_insn *history,
2434                          const struct mips_cl_insn *insn)
2435 {
2436   int nops, tmp_nops;
2437
2438   nops = nops_for_insn (history, insn);
2439   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2440                               | INSN_COND_BRANCH_DELAY
2441                               | INSN_COND_BRANCH_LIKELY))
2442     {
2443       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2444       if (tmp_nops > nops)
2445         nops = tmp_nops;
2446     }
2447   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2448     {
2449       tmp_nops = nops_for_sequence (1, history, insn);
2450       if (tmp_nops > nops)
2451         nops = tmp_nops;
2452     }
2453   return nops;
2454 }
2455
2456 /* Output an instruction.  IP is the instruction information.
2457    ADDRESS_EXPR is an operand of the instruction to be used with
2458    RELOC_TYPE.  */
2459
2460 static void
2461 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2462              bfd_reloc_code_real_type *reloc_type)
2463 {
2464   register unsigned long prev_pinfo, pinfo;
2465   relax_stateT prev_insn_frag_type = 0;
2466   bfd_boolean relaxed_branch = FALSE;
2467
2468   /* Mark instruction labels in mips16 mode.  */
2469   mips16_mark_labels ();
2470
2471   prev_pinfo = history[0].insn_mo->pinfo;
2472   pinfo = ip->insn_mo->pinfo;
2473
2474   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2475     {
2476       /* There are a lot of optimizations we could do that we don't.
2477          In particular, we do not, in general, reorder instructions.
2478          If you use gcc with optimization, it will reorder
2479          instructions and generally do much more optimization then we
2480          do here; repeating all that work in the assembler would only
2481          benefit hand written assembly code, and does not seem worth
2482          it.  */
2483       int nops = (mips_optimize == 0
2484                   ? nops_for_insn (history, NULL)
2485                   : nops_for_insn_or_target (history, ip));
2486       if (nops > 0)
2487         {
2488           fragS *old_frag;
2489           unsigned long old_frag_offset;
2490           int i;
2491
2492           old_frag = frag_now;
2493           old_frag_offset = frag_now_fix ();
2494
2495           for (i = 0; i < nops; i++)
2496             emit_nop ();
2497
2498           if (listing)
2499             {
2500               listing_prev_line ();
2501               /* We may be at the start of a variant frag.  In case we
2502                  are, make sure there is enough space for the frag
2503                  after the frags created by listing_prev_line.  The
2504                  argument to frag_grow here must be at least as large
2505                  as the argument to all other calls to frag_grow in
2506                  this file.  We don't have to worry about being in the
2507                  middle of a variant frag, because the variants insert
2508                  all needed nop instructions themselves.  */
2509               frag_grow (40);
2510             }
2511
2512           mips_move_labels ();
2513
2514 #ifndef NO_ECOFF_DEBUGGING
2515           if (ECOFF_DEBUGGING)
2516             ecoff_fix_loc (old_frag, old_frag_offset);
2517 #endif
2518         }
2519     }
2520   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2521     {
2522       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2523       int nops = nops_for_insn_or_target (history, ip);
2524       assert (nops <= prev_nop_frag_holds);
2525
2526       /* Enforce NOPS as a minimum.  */
2527       if (nops > prev_nop_frag_required)
2528         prev_nop_frag_required = nops;
2529
2530       if (prev_nop_frag_holds == prev_nop_frag_required)
2531         {
2532           /* Settle for the current number of nops.  Update the history
2533              accordingly (for the benefit of any future .set reorder code).  */
2534           prev_nop_frag = NULL;
2535           insert_into_history (prev_nop_frag_since,
2536                                prev_nop_frag_holds, NOP_INSN);
2537         }
2538       else
2539         {
2540           /* Allow this instruction to replace one of the nops that was
2541              tentatively added to prev_nop_frag.  */
2542           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2543           prev_nop_frag_holds--;
2544           prev_nop_frag_since++;
2545         }
2546     }
2547
2548 #ifdef OBJ_ELF
2549   /* The value passed to dwarf2_emit_insn is the distance between
2550      the beginning of the current instruction and the address that
2551      should be recorded in the debug tables.  For MIPS16 debug info
2552      we want to use ISA-encoded addresses, so we pass -1 for an
2553      address higher by one than the current.  */
2554   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2555 #endif
2556
2557   /* Record the frag type before frag_var.  */
2558   if (history[0].frag)
2559     prev_insn_frag_type = history[0].frag->fr_type;
2560
2561   if (address_expr
2562       && *reloc_type == BFD_RELOC_16_PCREL_S2
2563       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2564           || pinfo & INSN_COND_BRANCH_LIKELY)
2565       && mips_relax_branch
2566       /* Don't try branch relaxation within .set nomacro, or within
2567          .set noat if we use $at for PIC computations.  If it turns
2568          out that the branch was out-of-range, we'll get an error.  */
2569       && !mips_opts.warn_about_macros
2570       && !(mips_opts.noat && mips_pic != NO_PIC)
2571       && !mips_opts.mips16)
2572     {
2573       relaxed_branch = TRUE;
2574       add_relaxed_insn (ip, (relaxed_branch_length
2575                              (NULL, NULL,
2576                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2577                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2578                               : 0)), 4,
2579                         RELAX_BRANCH_ENCODE
2580                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2581                          pinfo & INSN_COND_BRANCH_LIKELY,
2582                          pinfo & INSN_WRITE_GPR_31,
2583                          0),
2584                         address_expr->X_add_symbol,
2585                         address_expr->X_add_number);
2586       *reloc_type = BFD_RELOC_UNUSED;
2587     }
2588   else if (*reloc_type > BFD_RELOC_UNUSED)
2589     {
2590       /* We need to set up a variant frag.  */
2591       assert (mips_opts.mips16 && address_expr != NULL);
2592       add_relaxed_insn (ip, 4, 0,
2593                         RELAX_MIPS16_ENCODE
2594                         (*reloc_type - BFD_RELOC_UNUSED,
2595                          mips16_small, mips16_ext,
2596                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2597                          history[0].mips16_absolute_jump_p),
2598                         make_expr_symbol (address_expr), 0);
2599     }
2600   else if (mips_opts.mips16
2601            && ! ip->use_extend
2602            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2603     {
2604       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2605         /* Make sure there is enough room to swap this instruction with
2606            a following jump instruction.  */
2607         frag_grow (6);
2608       add_fixed_insn (ip);
2609     }
2610   else
2611     {
2612       if (mips_opts.mips16
2613           && mips_opts.noreorder
2614           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2615         as_warn (_("extended instruction in delay slot"));
2616
2617       if (mips_relax.sequence)
2618         {
2619           /* If we've reached the end of this frag, turn it into a variant
2620              frag and record the information for the instructions we've
2621              written so far.  */
2622           if (frag_room () < 4)
2623             relax_close_frag ();
2624           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2625         }
2626
2627       if (mips_relax.sequence != 2)
2628         mips_macro_warning.sizes[0] += 4;
2629       if (mips_relax.sequence != 1)
2630         mips_macro_warning.sizes[1] += 4;
2631
2632       if (mips_opts.mips16)
2633         {
2634           ip->fixed_p = 1;
2635           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2636         }
2637       add_fixed_insn (ip);
2638     }
2639
2640   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2641     {
2642       if (address_expr->X_op == O_constant)
2643         {
2644           unsigned int tmp;
2645
2646           switch (*reloc_type)
2647             {
2648             case BFD_RELOC_32:
2649               ip->insn_opcode |= address_expr->X_add_number;
2650               break;
2651
2652             case BFD_RELOC_MIPS_HIGHEST:
2653               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2654               ip->insn_opcode |= tmp & 0xffff;
2655               break;
2656
2657             case BFD_RELOC_MIPS_HIGHER:
2658               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2659               ip->insn_opcode |= tmp & 0xffff;
2660               break;
2661
2662             case BFD_RELOC_HI16_S:
2663               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2664               ip->insn_opcode |= tmp & 0xffff;
2665               break;
2666
2667             case BFD_RELOC_HI16:
2668               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2669               break;
2670
2671             case BFD_RELOC_UNUSED:
2672             case BFD_RELOC_LO16:
2673             case BFD_RELOC_MIPS_GOT_DISP:
2674               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2675               break;
2676
2677             case BFD_RELOC_MIPS_JMP:
2678               if ((address_expr->X_add_number & 3) != 0)
2679                 as_bad (_("jump to misaligned address (0x%lx)"),
2680                         (unsigned long) address_expr->X_add_number);
2681               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2682               break;
2683
2684             case BFD_RELOC_MIPS16_JMP:
2685               if ((address_expr->X_add_number & 3) != 0)
2686                 as_bad (_("jump to misaligned address (0x%lx)"),
2687                         (unsigned long) address_expr->X_add_number);
2688               ip->insn_opcode |=
2689                 (((address_expr->X_add_number & 0x7c0000) << 3)
2690                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2691                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2692               break;
2693
2694             case BFD_RELOC_16_PCREL_S2:
2695               if ((address_expr->X_add_number & 3) != 0)
2696                 as_bad (_("branch to misaligned address (0x%lx)"),
2697                         (unsigned long) address_expr->X_add_number);
2698               if (mips_relax_branch)
2699                 goto need_reloc;
2700               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2701                 as_bad (_("branch address range overflow (0x%lx)"),
2702                         (unsigned long) address_expr->X_add_number);
2703               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2704               break;
2705
2706             default:
2707               internalError ();
2708             }
2709         }
2710       else if (*reloc_type < BFD_RELOC_UNUSED)
2711         need_reloc:
2712         {
2713           reloc_howto_type *howto;
2714           int i;
2715
2716           /* In a compound relocation, it is the final (outermost)
2717              operator that determines the relocated field.  */
2718           for (i = 1; i < 3; i++)
2719             if (reloc_type[i] == BFD_RELOC_UNUSED)
2720               break;
2721
2722           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2723           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2724                                      bfd_get_reloc_size (howto),
2725                                      address_expr,
2726                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2727                                      reloc_type[0]);
2728
2729           /* These relocations can have an addend that won't fit in
2730              4 octets for 64bit assembly.  */
2731           if (HAVE_64BIT_GPRS
2732               && ! howto->partial_inplace
2733               && (reloc_type[0] == BFD_RELOC_16
2734                   || reloc_type[0] == BFD_RELOC_32
2735                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2736                   || reloc_type[0] == BFD_RELOC_HI16_S
2737                   || reloc_type[0] == BFD_RELOC_LO16
2738                   || reloc_type[0] == BFD_RELOC_GPREL16
2739                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2740                   || reloc_type[0] == BFD_RELOC_GPREL32
2741                   || reloc_type[0] == BFD_RELOC_64
2742                   || reloc_type[0] == BFD_RELOC_CTOR
2743                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2744                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2745                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2746                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2747                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2748                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2749                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2750                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2751                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2752             ip->fixp[0]->fx_no_overflow = 1;
2753
2754           if (mips_relax.sequence)
2755             {
2756               if (mips_relax.first_fixup == 0)
2757                 mips_relax.first_fixup = ip->fixp[0];
2758             }
2759           else if (reloc_needs_lo_p (*reloc_type))
2760             {
2761               struct mips_hi_fixup *hi_fixup;
2762
2763               /* Reuse the last entry if it already has a matching %lo.  */
2764               hi_fixup = mips_hi_fixup_list;
2765               if (hi_fixup == 0
2766                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2767                 {
2768                   hi_fixup = ((struct mips_hi_fixup *)
2769                               xmalloc (sizeof (struct mips_hi_fixup)));
2770                   hi_fixup->next = mips_hi_fixup_list;
2771                   mips_hi_fixup_list = hi_fixup;
2772                 }
2773               hi_fixup->fixp = ip->fixp[0];
2774               hi_fixup->seg = now_seg;
2775             }
2776
2777           /* Add fixups for the second and third relocations, if given.
2778              Note that the ABI allows the second relocation to be
2779              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2780              moment we only use RSS_UNDEF, but we could add support
2781              for the others if it ever becomes necessary.  */
2782           for (i = 1; i < 3; i++)
2783             if (reloc_type[i] != BFD_RELOC_UNUSED)
2784               {
2785                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2786                                        ip->fixp[0]->fx_size, NULL, 0,
2787                                        FALSE, reloc_type[i]);
2788
2789                 /* Use fx_tcbit to mark compound relocs.  */
2790                 ip->fixp[0]->fx_tcbit = 1;
2791                 ip->fixp[i]->fx_tcbit = 1;
2792               }
2793         }
2794     }
2795   install_insn (ip);
2796
2797   /* Update the register mask information.  */
2798   if (! mips_opts.mips16)
2799     {
2800       if (pinfo & INSN_WRITE_GPR_D)
2801         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2802       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2803         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2804       if (pinfo & INSN_READ_GPR_S)
2805         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2806       if (pinfo & INSN_WRITE_GPR_31)
2807         mips_gprmask |= 1 << RA;
2808       if (pinfo & INSN_WRITE_FPR_D)
2809         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2810       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2811         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2812       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2813         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2814       if ((pinfo & INSN_READ_FPR_R) != 0)
2815         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2816       if (pinfo & INSN_COP)
2817         {
2818           /* We don't keep enough information to sort these cases out.
2819              The itbl support does keep this information however, although
2820              we currently don't support itbl fprmats as part of the cop
2821              instruction.  May want to add this support in the future.  */
2822         }
2823       /* Never set the bit for $0, which is always zero.  */
2824       mips_gprmask &= ~1 << 0;
2825     }
2826   else
2827     {
2828       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2829         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2830       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2831         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2832       if (pinfo & MIPS16_INSN_WRITE_Z)
2833         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2834       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2835         mips_gprmask |= 1 << TREG;
2836       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2837         mips_gprmask |= 1 << SP;
2838       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2839         mips_gprmask |= 1 << RA;
2840       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2841         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2842       if (pinfo & MIPS16_INSN_READ_Z)
2843         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2844       if (pinfo & MIPS16_INSN_READ_GPR_X)
2845         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2846     }
2847
2848   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2849     {
2850       /* Filling the branch delay slot is more complex.  We try to
2851          switch the branch with the previous instruction, which we can
2852          do if the previous instruction does not set up a condition
2853          that the branch tests and if the branch is not itself the
2854          target of any branch.  */
2855       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2856           || (pinfo & INSN_COND_BRANCH_DELAY))
2857         {
2858           if (mips_optimize < 2
2859               /* If we have seen .set volatile or .set nomove, don't
2860                  optimize.  */
2861               || mips_opts.nomove != 0
2862               /* We can't swap if the previous instruction's position
2863                  is fixed.  */
2864               || history[0].fixed_p
2865               /* If the previous previous insn was in a .set
2866                  noreorder, we can't swap.  Actually, the MIPS
2867                  assembler will swap in this situation.  However, gcc
2868                  configured -with-gnu-as will generate code like
2869                    .set noreorder
2870                    lw   $4,XXX
2871                    .set reorder
2872                    INSN
2873                    bne  $4,$0,foo
2874                  in which we can not swap the bne and INSN.  If gcc is
2875                  not configured -with-gnu-as, it does not output the
2876                  .set pseudo-ops.  */
2877               || history[1].noreorder_p
2878               /* If the branch is itself the target of a branch, we
2879                  can not swap.  We cheat on this; all we check for is
2880                  whether there is a label on this instruction.  If
2881                  there are any branches to anything other than a
2882                  label, users must use .set noreorder.  */
2883               || insn_labels != NULL
2884               /* If the previous instruction is in a variant frag
2885                  other than this branch's one, we cannot do the swap.
2886                  This does not apply to the mips16, which uses variant
2887                  frags for different purposes.  */
2888               || (! mips_opts.mips16
2889                   && prev_insn_frag_type == rs_machine_dependent)
2890               /* Check for conflicts between the branch and the instructions
2891                  before the candidate delay slot.  */
2892               || nops_for_insn (history + 1, ip) > 0
2893               /* Check for conflicts between the swapped sequence and the
2894                  target of the branch.  */
2895               || nops_for_sequence (2, history + 1, ip, history) > 0
2896               /* We do not swap with a trap instruction, since it
2897                  complicates trap handlers to have the trap
2898                  instruction be in a delay slot.  */
2899               || (prev_pinfo & INSN_TRAP)
2900               /* If the branch reads a register that the previous
2901                  instruction sets, we can not swap.  */
2902               || (! mips_opts.mips16
2903                   && (prev_pinfo & INSN_WRITE_GPR_T)
2904                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2905                                     MIPS_GR_REG))
2906               || (! mips_opts.mips16
2907                   && (prev_pinfo & INSN_WRITE_GPR_D)
2908                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
2909                                     MIPS_GR_REG))
2910               || (mips_opts.mips16
2911                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2912                        && (insn_uses_reg
2913                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
2914                             MIPS16_REG)))
2915                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2916                           && (insn_uses_reg
2917                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
2918                                MIPS16_REG)))
2919                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2920                           && (insn_uses_reg
2921                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
2922                                MIPS16_REG)))
2923                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2924                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2925                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2926                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2927                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2928                           && insn_uses_reg (ip,
2929                                             MIPS16OP_EXTRACT_REG32R
2930                                               (history[0].insn_opcode),
2931                                             MIPS_GR_REG))))
2932               /* If the branch writes a register that the previous
2933                  instruction sets, we can not swap (we know that
2934                  branches write only to RD or to $31).  */
2935               || (! mips_opts.mips16
2936                   && (prev_pinfo & INSN_WRITE_GPR_T)
2937                   && (((pinfo & INSN_WRITE_GPR_D)
2938                        && (EXTRACT_OPERAND (RT, history[0])
2939                            == EXTRACT_OPERAND (RD, *ip)))
2940                       || ((pinfo & INSN_WRITE_GPR_31)
2941                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
2942               || (! mips_opts.mips16
2943                   && (prev_pinfo & INSN_WRITE_GPR_D)
2944                   && (((pinfo & INSN_WRITE_GPR_D)
2945                        && (EXTRACT_OPERAND (RD, history[0])
2946                            == EXTRACT_OPERAND (RD, *ip)))
2947                       || ((pinfo & INSN_WRITE_GPR_31)
2948                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
2949               || (mips_opts.mips16
2950                   && (pinfo & MIPS16_INSN_WRITE_31)
2951                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2952                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2953                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
2954                               == RA))))
2955               /* If the branch writes a register that the previous
2956                  instruction reads, we can not swap (we know that
2957                  branches only write to RD or to $31).  */
2958               || (! mips_opts.mips16
2959                   && (pinfo & INSN_WRITE_GPR_D)
2960                   && insn_uses_reg (&history[0],
2961                                     EXTRACT_OPERAND (RD, *ip),
2962                                     MIPS_GR_REG))
2963               || (! mips_opts.mips16
2964                   && (pinfo & INSN_WRITE_GPR_31)
2965                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2966               || (mips_opts.mips16
2967                   && (pinfo & MIPS16_INSN_WRITE_31)
2968                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2969               /* If one instruction sets a condition code and the
2970                  other one uses a condition code, we can not swap.  */
2971               || ((pinfo & INSN_READ_COND_CODE)
2972                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2973               || ((pinfo & INSN_WRITE_COND_CODE)
2974                   && (prev_pinfo & INSN_READ_COND_CODE))
2975               /* If the previous instruction uses the PC, we can not
2976                  swap.  */
2977               || (mips_opts.mips16
2978                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2979               /* If the previous instruction had a fixup in mips16
2980                  mode, we can not swap.  This normally means that the
2981                  previous instruction was a 4 byte branch anyhow.  */
2982               || (mips_opts.mips16 && history[0].fixp[0])
2983               /* If the previous instruction is a sync, sync.l, or
2984                  sync.p, we can not swap.  */
2985               || (prev_pinfo & INSN_SYNC))
2986             {
2987               if (mips_opts.mips16
2988                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
2989                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
2990                   && (mips_opts.isa == ISA_MIPS32
2991                       || mips_opts.isa == ISA_MIPS32R2
2992                       || mips_opts.isa == ISA_MIPS64
2993                       || mips_opts.isa == ISA_MIPS64R2))
2994                 {
2995                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
2996                   ip->insn_opcode |= 0x0080;
2997                   install_insn (ip);
2998                   insert_into_history (0, 1, ip);
2999                 } 
3000               else
3001                 {
3002                   /* We could do even better for unconditional branches to
3003                      portions of this object file; we could pick up the
3004                      instruction at the destination, put it in the delay
3005                      slot, and bump the destination address.  */
3006                   insert_into_history (0, 1, ip);
3007                   emit_nop ();
3008                 }
3009                 
3010               if (mips_relax.sequence)
3011                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3012             }
3013           else
3014             {
3015               /* It looks like we can actually do the swap.  */
3016               struct mips_cl_insn delay = history[0];
3017               if (mips_opts.mips16)
3018                 {
3019                   know (delay.frag == ip->frag);
3020                   move_insn (ip, delay.frag, delay.where);
3021                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3022                 }
3023               else if (relaxed_branch)
3024                 {
3025                   /* Add the delay slot instruction to the end of the
3026                      current frag and shrink the fixed part of the
3027                      original frag.  If the branch occupies the tail of
3028                      the latter, move it backwards to cover the gap.  */
3029                   delay.frag->fr_fix -= 4;
3030                   if (delay.frag == ip->frag)
3031                     move_insn (ip, ip->frag, ip->where - 4);
3032                   add_fixed_insn (&delay);
3033                 }
3034               else
3035                 {
3036                   move_insn (&delay, ip->frag, ip->where);
3037                   move_insn (ip, history[0].frag, history[0].where);
3038                 }
3039               history[0] = *ip;
3040               delay.fixed_p = 1;
3041               insert_into_history (0, 1, &delay);
3042             }
3043
3044           /* If that was an unconditional branch, forget the previous
3045              insn information.  */
3046           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3047             mips_no_prev_insn ();
3048         }
3049       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3050         {
3051           /* We don't yet optimize a branch likely.  What we should do
3052              is look at the target, copy the instruction found there
3053              into the delay slot, and increment the branch to jump to
3054              the next instruction.  */
3055           insert_into_history (0, 1, ip);
3056           emit_nop ();
3057         }
3058       else
3059         insert_into_history (0, 1, ip);
3060     }
3061   else
3062     insert_into_history (0, 1, ip);
3063
3064   /* We just output an insn, so the next one doesn't have a label.  */
3065   mips_clear_insn_labels ();
3066 }
3067
3068 /* Forget that there was any previous instruction or label.  */
3069
3070 static void
3071 mips_no_prev_insn (void)
3072 {
3073   prev_nop_frag = NULL;
3074   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3075   mips_clear_insn_labels ();
3076 }
3077
3078 /* This function must be called before we emit something other than
3079    instructions.  It is like mips_no_prev_insn except that it inserts
3080    any NOPS that might be needed by previous instructions.  */
3081
3082 void
3083 mips_emit_delays (void)
3084 {
3085   if (! mips_opts.noreorder)
3086     {
3087       int nops = nops_for_insn (history, NULL);
3088       if (nops > 0)
3089         {
3090           while (nops-- > 0)
3091             add_fixed_insn (NOP_INSN);
3092           mips_move_labels ();
3093         }
3094     }
3095   mips_no_prev_insn ();
3096 }
3097
3098 /* Start a (possibly nested) noreorder block.  */
3099
3100 static void
3101 start_noreorder (void)
3102 {
3103   if (mips_opts.noreorder == 0)
3104     {
3105       unsigned int i;
3106       int nops;
3107
3108       /* None of the instructions before the .set noreorder can be moved.  */
3109       for (i = 0; i < ARRAY_SIZE (history); i++)
3110         history[i].fixed_p = 1;
3111
3112       /* Insert any nops that might be needed between the .set noreorder
3113          block and the previous instructions.  We will later remove any
3114          nops that turn out not to be needed.  */
3115       nops = nops_for_insn (history, NULL);
3116       if (nops > 0)
3117         {
3118           if (mips_optimize != 0)
3119             {
3120               /* Record the frag which holds the nop instructions, so
3121                  that we can remove them if we don't need them.  */
3122               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3123               prev_nop_frag = frag_now;
3124               prev_nop_frag_holds = nops;
3125               prev_nop_frag_required = 0;
3126               prev_nop_frag_since = 0;
3127             }
3128
3129           for (; nops > 0; --nops)
3130             add_fixed_insn (NOP_INSN);
3131
3132           /* Move on to a new frag, so that it is safe to simply
3133              decrease the size of prev_nop_frag.  */
3134           frag_wane (frag_now);
3135           frag_new (0);
3136           mips_move_labels ();
3137         }
3138       mips16_mark_labels ();
3139       mips_clear_insn_labels ();
3140     }
3141   mips_opts.noreorder++;
3142   mips_any_noreorder = 1;
3143 }
3144
3145 /* End a nested noreorder block.  */
3146
3147 static void
3148 end_noreorder (void)
3149 {
3150   mips_opts.noreorder--;
3151   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3152     {
3153       /* Commit to inserting prev_nop_frag_required nops and go back to
3154          handling nop insertion the .set reorder way.  */
3155       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3156                                 * (mips_opts.mips16 ? 2 : 4));
3157       insert_into_history (prev_nop_frag_since,
3158                            prev_nop_frag_required, NOP_INSN);
3159       prev_nop_frag = NULL;
3160     }
3161 }
3162
3163 /* Set up global variables for the start of a new macro.  */
3164
3165 static void
3166 macro_start (void)
3167 {
3168   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3169   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3170                                      && (history[0].insn_mo->pinfo
3171                                          & (INSN_UNCOND_BRANCH_DELAY
3172                                             | INSN_COND_BRANCH_DELAY
3173                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3174 }
3175
3176 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3177    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3178    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3179
3180 static const char *
3181 macro_warning (relax_substateT subtype)
3182 {
3183   if (subtype & RELAX_DELAY_SLOT)
3184     return _("Macro instruction expanded into multiple instructions"
3185              " in a branch delay slot");
3186   else if (subtype & RELAX_NOMACRO)
3187     return _("Macro instruction expanded into multiple instructions");
3188   else
3189     return 0;
3190 }
3191
3192 /* Finish up a macro.  Emit warnings as appropriate.  */
3193
3194 static void
3195 macro_end (void)
3196 {
3197   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3198     {
3199       relax_substateT subtype;
3200
3201       /* Set up the relaxation warning flags.  */
3202       subtype = 0;
3203       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3204         subtype |= RELAX_SECOND_LONGER;
3205       if (mips_opts.warn_about_macros)
3206         subtype |= RELAX_NOMACRO;
3207       if (mips_macro_warning.delay_slot_p)
3208         subtype |= RELAX_DELAY_SLOT;
3209
3210       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3211         {
3212           /* Either the macro has a single implementation or both
3213              implementations are longer than 4 bytes.  Emit the
3214              warning now.  */
3215           const char *msg = macro_warning (subtype);
3216           if (msg != 0)
3217             as_warn (msg);
3218         }
3219       else
3220         {
3221           /* One implementation might need a warning but the other
3222              definitely doesn't.  */
3223           mips_macro_warning.first_frag->fr_subtype |= subtype;
3224         }
3225     }
3226 }
3227
3228 /* Read a macro's relocation codes from *ARGS and store them in *R.
3229    The first argument in *ARGS will be either the code for a single
3230    relocation or -1 followed by the three codes that make up a
3231    composite relocation.  */
3232
3233 static void
3234 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3235 {
3236   int i, next;
3237
3238   next = va_arg (*args, int);
3239   if (next >= 0)
3240     r[0] = (bfd_reloc_code_real_type) next;
3241   else
3242     for (i = 0; i < 3; i++)
3243       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3244 }
3245
3246 /* Build an instruction created by a macro expansion.  This is passed
3247    a pointer to the count of instructions created so far, an
3248    expression, the name of the instruction to build, an operand format
3249    string, and corresponding arguments.  */
3250
3251 static void
3252 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3253 {
3254   const struct mips_opcode *mo;
3255   struct mips_cl_insn insn;
3256   bfd_reloc_code_real_type r[3];
3257   va_list args;
3258
3259   va_start (args, fmt);
3260
3261   if (mips_opts.mips16)
3262     {
3263       mips16_macro_build (ep, name, fmt, args);
3264       va_end (args);
3265       return;
3266     }
3267
3268   r[0] = BFD_RELOC_UNUSED;
3269   r[1] = BFD_RELOC_UNUSED;
3270   r[2] = BFD_RELOC_UNUSED;
3271   mo = (struct mips_opcode *) hash_find (op_hash, name);
3272   assert (mo);
3273   assert (strcmp (name, mo->name) == 0);
3274
3275   /* Search until we get a match for NAME.  It is assumed here that
3276      macros will never generate MDMX or MIPS-3D instructions.  */
3277   while (strcmp (fmt, mo->args) != 0
3278          || mo->pinfo == INSN_MACRO
3279          || !OPCODE_IS_MEMBER (mo,
3280                                (mips_opts.isa
3281                                 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3282                                 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3283                                mips_opts.arch)
3284          || (mips_opts.arch == CPU_R4650 && (mo->pinfo & FP_D) != 0))
3285     {
3286       ++mo;
3287       assert (mo->name);
3288       assert (strcmp (name, mo->name) == 0);
3289     }
3290
3291   create_insn (&insn, mo);
3292   for (;;)
3293     {
3294       switch (*fmt++)
3295         {
3296         case '\0':
3297           break;
3298
3299         case ',':
3300         case '(':
3301         case ')':
3302           continue;
3303
3304         case '+':
3305           switch (*fmt++)
3306             {
3307             case 'A':
3308             case 'E':
3309               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3310               continue;
3311
3312             case 'B':
3313             case 'F':
3314               /* Note that in the macro case, these arguments are already
3315                  in MSB form.  (When handling the instruction in the
3316                  non-macro case, these arguments are sizes from which
3317                  MSB values must be calculated.)  */
3318               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3319               continue;
3320
3321             case 'C':
3322             case 'G':
3323             case 'H':
3324               /* Note that in the macro case, these arguments are already
3325                  in MSBD form.  (When handling the instruction in the
3326                  non-macro case, these arguments are sizes from which
3327                  MSBD values must be calculated.)  */
3328               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3329               continue;
3330
3331             default:
3332               internalError ();
3333             }
3334           continue;
3335
3336         case 't':
3337         case 'w':
3338         case 'E':
3339           INSERT_OPERAND (RT, insn, va_arg (args, int));
3340           continue;
3341
3342         case 'c':
3343           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3344           continue;
3345
3346         case 'T':
3347         case 'W':
3348           INSERT_OPERAND (FT, insn, va_arg (args, int));
3349           continue;
3350
3351         case 'd':
3352         case 'G':
3353         case 'K':
3354           INSERT_OPERAND (RD, insn, va_arg (args, int));
3355           continue;
3356
3357         case 'U':
3358           {
3359             int tmp = va_arg (args, int);
3360
3361             INSERT_OPERAND (RT, insn, tmp);
3362             INSERT_OPERAND (RD, insn, tmp);
3363             continue;
3364           }
3365
3366         case 'V':
3367         case 'S':
3368           INSERT_OPERAND (FS, insn, va_arg (args, int));
3369           continue;
3370
3371         case 'z':
3372           continue;
3373
3374         case '<':
3375           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3376           continue;
3377
3378         case 'D':
3379           INSERT_OPERAND (FD, insn, va_arg (args, int));
3380           continue;
3381
3382         case 'B':
3383           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3384           continue;
3385
3386         case 'J':
3387           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3388           continue;
3389
3390         case 'q':
3391           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3392           continue;
3393
3394         case 'b':
3395         case 's':
3396         case 'r':
3397         case 'v':
3398           INSERT_OPERAND (RS, insn, va_arg (args, int));
3399           continue;
3400
3401         case 'i':
3402         case 'j':
3403         case 'o':
3404           macro_read_relocs (&args, r);
3405           assert (*r == BFD_RELOC_GPREL16
3406                   || *r == BFD_RELOC_MIPS_LITERAL
3407                   || *r == BFD_RELOC_MIPS_HIGHER
3408                   || *r == BFD_RELOC_HI16_S
3409                   || *r == BFD_RELOC_LO16
3410                   || *r == BFD_RELOC_MIPS_GOT16
3411                   || *r == BFD_RELOC_MIPS_CALL16
3412                   || *r == BFD_RELOC_MIPS_GOT_DISP
3413                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3414                   || *r == BFD_RELOC_MIPS_GOT_OFST
3415                   || *r == BFD_RELOC_MIPS_GOT_LO16
3416                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3417           continue;
3418
3419         case 'u':
3420           macro_read_relocs (&args, r);
3421           assert (ep != NULL
3422                   && (ep->X_op == O_constant
3423                       || (ep->X_op == O_symbol
3424                           && (*r == BFD_RELOC_MIPS_HIGHEST
3425                               || *r == BFD_RELOC_HI16_S
3426                               || *r == BFD_RELOC_HI16
3427                               || *r == BFD_RELOC_GPREL16
3428                               || *r == BFD_RELOC_MIPS_GOT_HI16
3429                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3430           continue;
3431
3432         case 'p':
3433           assert (ep != NULL);
3434
3435           /*
3436            * This allows macro() to pass an immediate expression for
3437            * creating short branches without creating a symbol.
3438            *
3439            * We don't allow branch relaxation for these branches, as
3440            * they should only appear in ".set nomacro" anyway.
3441            */
3442           if (ep->X_op == O_constant)
3443             {
3444               if ((ep->X_add_number & 3) != 0)
3445                 as_bad (_("branch to misaligned address (0x%lx)"),
3446                         (unsigned long) ep->X_add_number);
3447               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3448                 as_bad (_("branch address range overflow (0x%lx)"),
3449                         (unsigned long) ep->X_add_number);
3450               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3451               ep = NULL;
3452             }
3453           else
3454             *r = BFD_RELOC_16_PCREL_S2;
3455           continue;
3456
3457         case 'a':
3458           assert (ep != NULL);
3459           *r = BFD_RELOC_MIPS_JMP;
3460           continue;
3461
3462         case 'C':
3463           insn.insn_opcode |= va_arg (args, unsigned long);
3464           continue;
3465
3466         case 'k':
3467           insn.insn_opcode |= va_arg (args, unsigned long) << OP_SH_CACHE;
3468           continue;
3469
3470         default:
3471           internalError ();
3472         }
3473       break;
3474     }
3475   va_end (args);
3476   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3477
3478   append_insn (&insn, ep, r);
3479 }
3480
3481 static void
3482 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3483                     va_list args)
3484 {
3485   struct mips_opcode *mo;
3486   struct mips_cl_insn insn;
3487   bfd_reloc_code_real_type r[3]
3488     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3489
3490   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3491   assert (mo);
3492   assert (strcmp (name, mo->name) == 0);
3493
3494   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3495     {
3496       ++mo;
3497       assert (mo->name);
3498       assert (strcmp (name, mo->name) == 0);
3499     }
3500
3501   create_insn (&insn, mo);
3502   for (;;)
3503     {
3504       int c;
3505
3506       c = *fmt++;
3507       switch (c)
3508         {
3509         case '\0':
3510           break;
3511
3512         case ',':
3513         case '(':
3514         case ')':
3515           continue;
3516
3517         case 'y':
3518         case 'w':
3519           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3520           continue;
3521
3522         case 'x':
3523         case 'v':
3524           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3525           continue;
3526
3527         case 'z':
3528           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3529           continue;
3530
3531         case 'Z':
3532           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3533           continue;
3534
3535         case '0':
3536         case 'S':
3537         case 'P':
3538         case 'R':
3539           continue;
3540
3541         case 'X':
3542           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3543           continue;
3544
3545         case 'Y':
3546           {
3547             int regno;
3548
3549             regno = va_arg (args, int);
3550             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3551             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3552           }
3553           continue;
3554
3555         case '<':
3556         case '>':
3557         case '4':
3558         case '5':
3559         case 'H':
3560         case 'W':
3561         case 'D':
3562         case 'j':
3563         case '8':
3564         case 'V':
3565         case 'C':
3566         case 'U':
3567         case 'k':
3568         case 'K':
3569         case 'p':
3570         case 'q':
3571           {
3572             assert (ep != NULL);
3573
3574             if (ep->X_op != O_constant)
3575               *r = (int) BFD_RELOC_UNUSED + c;
3576             else
3577               {
3578                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3579                               FALSE, &insn.insn_opcode, &insn.use_extend,
3580                               &insn.extend);
3581                 ep = NULL;
3582                 *r = BFD_RELOC_UNUSED;
3583               }
3584           }
3585           continue;
3586
3587         case '6':
3588           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3589           continue;
3590         }
3591
3592       break;
3593     }
3594
3595   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3596
3597   append_insn (&insn, ep, r);
3598 }
3599
3600 /*
3601  * Sign-extend 32-bit mode constants that have bit 31 set and all
3602  * higher bits unset.
3603  */
3604 static void
3605 normalize_constant_expr (expressionS *ex)
3606 {
3607   if (ex->X_op == O_constant
3608       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3609     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3610                         - 0x80000000);
3611 }
3612
3613 /*
3614  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3615  * all higher bits unset.
3616  */
3617 static void
3618 normalize_address_expr (expressionS *ex)
3619 {
3620   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3621         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3622       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3623     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3624                         - 0x80000000);
3625 }
3626
3627 /*
3628  * Generate a "jalr" instruction with a relocation hint to the called
3629  * function.  This occurs in NewABI PIC code.
3630  */
3631 static void
3632 macro_build_jalr (expressionS *ep)
3633 {
3634   char *f = NULL;
3635
3636   if (HAVE_NEWABI)
3637     {
3638       frag_grow (8);
3639       f = frag_more (0);
3640     }
3641   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3642   if (HAVE_NEWABI)
3643     fix_new_exp (frag_now, f - frag_now->fr_literal,
3644                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3645 }
3646
3647 /*
3648  * Generate a "lui" instruction.
3649  */
3650 static void
3651 macro_build_lui (expressionS *ep, int regnum)
3652 {
3653   expressionS high_expr;
3654   const struct mips_opcode *mo;
3655   struct mips_cl_insn insn;
3656   bfd_reloc_code_real_type r[3]
3657     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3658   const char *name = "lui";
3659   const char *fmt = "t,u";
3660
3661   assert (! mips_opts.mips16);
3662
3663   high_expr = *ep;
3664
3665   if (high_expr.X_op == O_constant)
3666     {
3667       /* we can compute the instruction now without a relocation entry */
3668       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3669                                 >> 16) & 0xffff;
3670       *r = BFD_RELOC_UNUSED;
3671     }
3672   else
3673     {
3674       assert (ep->X_op == O_symbol);
3675       /* _gp_disp is a special case, used from s_cpload.
3676          __gnu_local_gp is used if mips_no_shared.  */
3677       assert (mips_pic == NO_PIC
3678               || (! HAVE_NEWABI
3679                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3680               || (! mips_in_shared
3681                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3682                              "__gnu_local_gp") == 0));
3683       *r = BFD_RELOC_HI16_S;
3684     }
3685
3686   mo = hash_find (op_hash, name);
3687   assert (strcmp (name, mo->name) == 0);
3688   assert (strcmp (fmt, mo->args) == 0);
3689   create_insn (&insn, mo);
3690
3691   insn.insn_opcode = insn.insn_mo->match;
3692   INSERT_OPERAND (RT, insn, regnum);
3693   if (*r == BFD_RELOC_UNUSED)
3694     {
3695       insn.insn_opcode |= high_expr.X_add_number;
3696       append_insn (&insn, NULL, r);
3697     }
3698   else
3699     append_insn (&insn, &high_expr, r);
3700 }
3701
3702 /* Generate a sequence of instructions to do a load or store from a constant
3703    offset off of a base register (breg) into/from a target register (treg),
3704    using AT if necessary.  */
3705 static void
3706 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3707                               int treg, int breg, int dbl)
3708 {
3709   assert (ep->X_op == O_constant);
3710
3711   /* Sign-extending 32-bit constants makes their handling easier.  */
3712   if (!dbl)
3713     normalize_constant_expr (ep);
3714
3715   /* Right now, this routine can only handle signed 32-bit constants.  */
3716   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3717     as_warn (_("operand overflow"));
3718
3719   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3720     {
3721       /* Signed 16-bit offset will fit in the op.  Easy!  */
3722       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3723     }
3724   else
3725     {
3726       /* 32-bit offset, need multiple instructions and AT, like:
3727            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3728            addu     $tempreg,$tempreg,$breg
3729            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3730          to handle the complete offset.  */
3731       macro_build_lui (ep, AT);
3732       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3733       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3734
3735       if (mips_opts.noat)
3736         as_bad (_("Macro used $at after \".set noat\""));
3737     }
3738 }
3739
3740 /*                      set_at()
3741  * Generates code to set the $at register to true (one)
3742  * if reg is less than the immediate expression.
3743  */
3744 static void
3745 set_at (int reg, int unsignedp)
3746 {
3747   if (imm_expr.X_op == O_constant
3748       && imm_expr.X_add_number >= -0x8000
3749       && imm_expr.X_add_number < 0x8000)
3750     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3751                  AT, reg, BFD_RELOC_LO16);
3752   else
3753     {
3754       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3755       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3756     }
3757 }
3758
3759 /* Warn if an expression is not a constant.  */
3760
3761 static void
3762 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3763 {
3764   if (ex->X_op == O_big)
3765     as_bad (_("unsupported large constant"));
3766   else if (ex->X_op != O_constant)
3767     as_bad (_("Instruction %s requires absolute expression"),
3768             ip->insn_mo->name);
3769
3770   if (HAVE_32BIT_GPRS)
3771     normalize_constant_expr (ex);
3772 }
3773
3774 /* Count the leading zeroes by performing a binary chop. This is a
3775    bulky bit of source, but performance is a LOT better for the
3776    majority of values than a simple loop to count the bits:
3777        for (lcnt = 0; (lcnt < 32); lcnt++)
3778          if ((v) & (1 << (31 - lcnt)))
3779            break;
3780   However it is not code size friendly, and the gain will drop a bit
3781   on certain cached systems.
3782 */
3783 #define COUNT_TOP_ZEROES(v)             \
3784   (((v) & ~0xffff) == 0                 \
3785    ? ((v) & ~0xff) == 0                 \
3786      ? ((v) & ~0xf) == 0                \
3787        ? ((v) & ~0x3) == 0              \
3788          ? ((v) & ~0x1) == 0            \
3789            ? !(v)                       \
3790              ? 32                       \
3791              : 31                       \
3792            : 30                         \
3793          : ((v) & ~0x7) == 0            \
3794            ? 29                         \
3795            : 28                         \
3796        : ((v) & ~0x3f) == 0             \
3797          ? ((v) & ~0x1f) == 0           \
3798            ? 27                         \
3799            : 26                         \
3800          : ((v) & ~0x7f) == 0           \
3801            ? 25                         \
3802            : 24                         \
3803      : ((v) & ~0xfff) == 0              \
3804        ? ((v) & ~0x3ff) == 0            \
3805          ? ((v) & ~0x1ff) == 0          \
3806            ? 23                         \
3807            : 22                         \
3808          : ((v) & ~0x7ff) == 0          \
3809            ? 21                         \
3810            : 20                         \
3811        : ((v) & ~0x3fff) == 0           \
3812          ? ((v) & ~0x1fff) == 0         \
3813            ? 19                         \
3814            : 18                         \
3815          : ((v) & ~0x7fff) == 0         \
3816            ? 17                         \
3817            : 16                         \
3818    : ((v) & ~0xffffff) == 0             \
3819      ? ((v) & ~0xfffff) == 0            \
3820        ? ((v) & ~0x3ffff) == 0          \
3821          ? ((v) & ~0x1ffff) == 0        \
3822            ? 15                         \
3823            : 14                         \
3824          : ((v) & ~0x7ffff) == 0        \
3825            ? 13                         \
3826            : 12                         \
3827        : ((v) & ~0x3fffff) == 0         \
3828          ? ((v) & ~0x1fffff) == 0       \
3829            ? 11                         \
3830            : 10                         \
3831          : ((v) & ~0x7fffff) == 0       \
3832            ? 9                          \
3833            : 8                          \
3834      : ((v) & ~0xfffffff) == 0          \
3835        ? ((v) & ~0x3ffffff) == 0        \
3836          ? ((v) & ~0x1ffffff) == 0      \
3837            ? 7                          \
3838            : 6                          \
3839          : ((v) & ~0x7ffffff) == 0      \
3840            ? 5                          \
3841            : 4                          \
3842        : ((v) & ~0x3fffffff) == 0       \
3843          ? ((v) & ~0x1fffffff) == 0     \
3844            ? 3                          \
3845            : 2                          \
3846          : ((v) & ~0x7fffffff) == 0     \
3847            ? 1                          \
3848            : 0)
3849
3850 /*                      load_register()
3851  *  This routine generates the least number of instructions necessary to load
3852  *  an absolute expression value into a register.
3853  */
3854 static void
3855 load_register (int reg, expressionS *ep, int dbl)
3856 {
3857   int freg;
3858   expressionS hi32, lo32;
3859
3860   if (ep->X_op != O_big)
3861     {
3862       assert (ep->X_op == O_constant);
3863
3864       /* Sign-extending 32-bit constants makes their handling easier.  */
3865       if (!dbl)
3866         normalize_constant_expr (ep);
3867
3868       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3869         {
3870           /* We can handle 16 bit signed values with an addiu to
3871              $zero.  No need to ever use daddiu here, since $zero and
3872              the result are always correct in 32 bit mode.  */
3873           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3874           return;
3875         }
3876       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3877         {
3878           /* We can handle 16 bit unsigned values with an ori to
3879              $zero.  */
3880           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3881           return;
3882         }
3883       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3884         {
3885           /* 32 bit values require an lui.  */
3886           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3887           if ((ep->X_add_number & 0xffff) != 0)
3888             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3889           return;
3890         }
3891     }
3892
3893   /* The value is larger than 32 bits.  */
3894
3895   if (!dbl || HAVE_32BIT_GPRS)
3896     {
3897       char value[32];
3898
3899       sprintf_vma (value, ep->X_add_number);
3900       as_bad (_("Number (0x%s) larger than 32 bits"), value);
3901       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3902       return;
3903     }
3904
3905   if (ep->X_op != O_big)
3906     {
3907       hi32 = *ep;
3908       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3909       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3910       hi32.X_add_number &= 0xffffffff;
3911       lo32 = *ep;
3912       lo32.X_add_number &= 0xffffffff;
3913     }
3914   else
3915     {
3916       assert (ep->X_add_number > 2);
3917       if (ep->X_add_number == 3)
3918         generic_bignum[3] = 0;
3919       else if (ep->X_add_number > 4)
3920         as_bad (_("Number larger than 64 bits"));
3921       lo32.X_op = O_constant;
3922       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3923       hi32.X_op = O_constant;
3924       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3925     }
3926
3927   if (hi32.X_add_number == 0)
3928     freg = 0;
3929   else
3930     {
3931       int shift, bit;
3932       unsigned long hi, lo;
3933
3934       if (hi32.X_add_number == (offsetT) 0xffffffff)
3935         {
3936           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3937             {
3938               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3939               return;
3940             }
3941           if (lo32.X_add_number & 0x80000000)
3942             {
3943               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3944               if (lo32.X_add_number & 0xffff)
3945                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3946               return;
3947             }
3948         }
3949
3950       /* Check for 16bit shifted constant.  We know that hi32 is
3951          non-zero, so start the mask on the first bit of the hi32
3952          value.  */
3953       shift = 17;
3954       do
3955         {
3956           unsigned long himask, lomask;
3957
3958           if (shift < 32)
3959             {
3960               himask = 0xffff >> (32 - shift);
3961               lomask = (0xffff << shift) & 0xffffffff;
3962             }
3963           else
3964             {
3965               himask = 0xffff << (shift - 32);
3966               lomask = 0;
3967             }
3968           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3969               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3970             {
3971               expressionS tmp;
3972
3973               tmp.X_op = O_constant;
3974               if (shift < 32)
3975                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3976                                     | (lo32.X_add_number >> shift));
3977               else
3978                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3979               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3980               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3981                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3982               return;
3983             }
3984           ++shift;
3985         }
3986       while (shift <= (64 - 16));
3987
3988       /* Find the bit number of the lowest one bit, and store the
3989          shifted value in hi/lo.  */
3990       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3991       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3992       if (lo != 0)
3993         {
3994           bit = 0;
3995           while ((lo & 1) == 0)
3996             {
3997               lo >>= 1;
3998               ++bit;
3999             }
4000           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4001           hi >>= bit;
4002         }
4003       else
4004         {
4005           bit = 32;
4006           while ((hi & 1) == 0)
4007             {
4008               hi >>= 1;
4009               ++bit;
4010             }
4011           lo = hi;
4012           hi = 0;
4013         }
4014
4015       /* Optimize if the shifted value is a (power of 2) - 1.  */
4016       if ((hi == 0 && ((lo + 1) & lo) == 0)
4017           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4018         {
4019           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4020           if (shift != 0)
4021             {
4022               expressionS tmp;
4023
4024               /* This instruction will set the register to be all
4025                  ones.  */
4026               tmp.X_op = O_constant;
4027               tmp.X_add_number = (offsetT) -1;
4028               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4029               if (bit != 0)
4030                 {
4031                   bit += shift;
4032                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4033                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4034                 }
4035               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4036                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4037               return;
4038             }
4039         }
4040
4041       /* Sign extend hi32 before calling load_register, because we can
4042          generally get better code when we load a sign extended value.  */
4043       if ((hi32.X_add_number & 0x80000000) != 0)
4044         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4045       load_register (reg, &hi32, 0);
4046       freg = reg;
4047     }
4048   if ((lo32.X_add_number & 0xffff0000) == 0)
4049     {
4050       if (freg != 0)
4051         {
4052           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4053           freg = reg;
4054         }
4055     }
4056   else
4057     {
4058       expressionS mid16;
4059
4060       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4061         {
4062           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4063           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4064           return;
4065         }
4066
4067       if (freg != 0)
4068         {
4069           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4070           freg = reg;
4071         }
4072       mid16 = lo32;
4073       mid16.X_add_number >>= 16;
4074       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4075       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4076       freg = reg;
4077     }
4078   if ((lo32.X_add_number & 0xffff) != 0)
4079     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4080 }
4081
4082 static inline void
4083 load_delay_nop (void)
4084 {
4085   if (!gpr_interlocks)
4086     macro_build (NULL, "nop", "");
4087 }
4088
4089 /* Load an address into a register.  */
4090
4091 static void
4092 load_address (int reg, expressionS *ep, int *used_at)
4093 {
4094   if (ep->X_op != O_constant
4095       && ep->X_op != O_symbol)
4096     {
4097       as_bad (_("expression too complex"));
4098       ep->X_op = O_constant;
4099     }
4100
4101   if (ep->X_op == O_constant)
4102     {
4103       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4104       return;
4105     }
4106
4107   if (mips_pic == NO_PIC)
4108     {
4109       /* If this is a reference to a GP relative symbol, we want
4110            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4111          Otherwise we want
4112            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4113            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4114          If we have an addend, we always use the latter form.
4115
4116          With 64bit address space and a usable $at we want
4117            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4118            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4119            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4120            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4121            dsll32       $reg,0
4122            daddu        $reg,$reg,$at
4123
4124          If $at is already in use, we use a path which is suboptimal
4125          on superscalar processors.
4126            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4127            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4128            dsll         $reg,16
4129            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4130            dsll         $reg,16
4131            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4132
4133          For GP relative symbols in 64bit address space we can use
4134          the same sequence as in 32bit address space.  */
4135       if (HAVE_64BIT_SYMBOLS)
4136         {
4137           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4138               && !nopic_need_relax (ep->X_add_symbol, 1))
4139             {
4140               relax_start (ep->X_add_symbol);
4141               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4142                            mips_gp_register, BFD_RELOC_GPREL16);
4143               relax_switch ();
4144             }
4145
4146           if (*used_at == 0 && !mips_opts.noat)
4147             {
4148               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4149               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4150               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4151                            BFD_RELOC_MIPS_HIGHER);
4152               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4153               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4154               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4155               *used_at = 1;
4156             }
4157           else
4158             {
4159               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4160               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4161                            BFD_RELOC_MIPS_HIGHER);
4162               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4163               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4164               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4165               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4166             }
4167
4168           if (mips_relax.sequence)
4169             relax_end ();
4170         }
4171       else
4172         {
4173           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4174               && !nopic_need_relax (ep->X_add_symbol, 1))
4175             {
4176               relax_start (ep->X_add_symbol);
4177               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4178                            mips_gp_register, BFD_RELOC_GPREL16);
4179               relax_switch ();
4180             }
4181           macro_build_lui (ep, reg);
4182           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4183                        reg, reg, BFD_RELOC_LO16);
4184           if (mips_relax.sequence)
4185             relax_end ();
4186         }
4187     }
4188   else if (!mips_big_got)
4189     {
4190       expressionS ex;
4191
4192       /* If this is a reference to an external symbol, we want
4193            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4194          Otherwise we want
4195            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4196            nop
4197            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4198          If there is a constant, it must be added in after.
4199
4200          If we have NewABI, we want
4201            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4202          unless we're referencing a global symbol with a non-zero
4203          offset, in which case cst must be added separately.  */
4204       if (HAVE_NEWABI)
4205         {
4206           if (ep->X_add_number)
4207             {
4208               ex.X_add_number = ep->X_add_number;
4209               ep->X_add_number = 0;
4210               relax_start (ep->X_add_symbol);
4211               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4212                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4213               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4214                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4215               ex.X_op = O_constant;
4216               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4217                            reg, reg, BFD_RELOC_LO16);
4218               ep->X_add_number = ex.X_add_number;
4219               relax_switch ();
4220             }
4221           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4222                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4223           if (mips_relax.sequence)
4224             relax_end ();
4225         }
4226       else
4227         {
4228           ex.X_add_number = ep->X_add_number;
4229           ep->X_add_number = 0;
4230           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4231                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4232           load_delay_nop ();
4233           relax_start (ep->X_add_symbol);
4234           relax_switch ();
4235           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4236                        BFD_RELOC_LO16);
4237           relax_end ();
4238
4239           if (ex.X_add_number != 0)
4240             {
4241               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4242                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4243               ex.X_op = O_constant;
4244               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4245                            reg, reg, BFD_RELOC_LO16);
4246             }
4247         }
4248     }
4249   else if (mips_big_got)
4250     {
4251       expressionS ex;
4252
4253       /* This is the large GOT case.  If this is a reference to an
4254          external symbol, we want
4255            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4256            addu         $reg,$reg,$gp
4257            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4258
4259          Otherwise, for a reference to a local symbol in old ABI, we want
4260            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4261            nop
4262            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4263          If there is a constant, it must be added in after.
4264
4265          In the NewABI, for local symbols, with or without offsets, we want:
4266            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4267            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4268       */
4269       if (HAVE_NEWABI)
4270         {
4271           ex.X_add_number = ep->X_add_number;
4272           ep->X_add_number = 0;
4273           relax_start (ep->X_add_symbol);
4274           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4275           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4276                        reg, reg, mips_gp_register);
4277           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4278                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4279           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4280             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4281           else if (ex.X_add_number)
4282             {
4283               ex.X_op = O_constant;
4284               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4285                            BFD_RELOC_LO16);
4286             }
4287
4288           ep->X_add_number = ex.X_add_number;
4289           relax_switch ();
4290           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4291                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4292           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4293                        BFD_RELOC_MIPS_GOT_OFST);
4294           relax_end ();
4295         }
4296       else
4297         {
4298           ex.X_add_number = ep->X_add_number;
4299           ep->X_add_number = 0;
4300           relax_start (ep->X_add_symbol);
4301           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4302           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4303                        reg, reg, mips_gp_register);
4304           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4305                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4306           relax_switch ();
4307           if (reg_needs_delay (mips_gp_register))
4308             {
4309               /* We need a nop before loading from $gp.  This special
4310                  check is required because the lui which starts the main
4311                  instruction stream does not refer to $gp, and so will not
4312                  insert the nop which may be required.  */
4313               macro_build (NULL, "nop", "");
4314             }
4315           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4316                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4317           load_delay_nop ();
4318           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4319                        BFD_RELOC_LO16);
4320           relax_end ();
4321
4322           if (ex.X_add_number != 0)
4323             {
4324               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4325                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4326               ex.X_op = O_constant;
4327               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4328                            BFD_RELOC_LO16);
4329             }
4330         }
4331     }
4332   else
4333     abort ();
4334
4335   if (mips_opts.noat && *used_at == 1)
4336     as_bad (_("Macro used $at after \".set noat\""));
4337 }
4338
4339 /* Move the contents of register SOURCE into register DEST.  */
4340
4341 static void
4342 move_register (int dest, int source)
4343 {
4344   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4345                dest, source, 0);
4346 }
4347
4348 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4349    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4350    The two alternatives are:
4351
4352    Global symbol                Local sybmol
4353    -------------                ------------
4354    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4355    ...                          ...
4356    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4357
4358    load_got_offset emits the first instruction and add_got_offset
4359    emits the second for a 16-bit offset or add_got_offset_hilo emits
4360    a sequence to add a 32-bit offset using a scratch register.  */
4361
4362 static void
4363 load_got_offset (int dest, expressionS *local)
4364 {
4365   expressionS global;
4366
4367   global = *local;
4368   global.X_add_number = 0;
4369
4370   relax_start (local->X_add_symbol);
4371   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4372                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4373   relax_switch ();
4374   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4375                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4376   relax_end ();
4377 }
4378
4379 static void
4380 add_got_offset (int dest, expressionS *local)
4381 {
4382   expressionS global;
4383
4384   global.X_op = O_constant;
4385   global.X_op_symbol = NULL;
4386   global.X_add_symbol = NULL;
4387   global.X_add_number = local->X_add_number;
4388
4389   relax_start (local->X_add_symbol);
4390   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4391                dest, dest, BFD_RELOC_LO16);
4392   relax_switch ();
4393   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4394   relax_end ();
4395 }
4396
4397 static void
4398 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4399 {
4400   expressionS global;
4401   int hold_mips_optimize;
4402
4403   global.X_op = O_constant;
4404   global.X_op_symbol = NULL;
4405   global.X_add_symbol = NULL;
4406   global.X_add_number = local->X_add_number;
4407
4408   relax_start (local->X_add_symbol);
4409   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4410   relax_switch ();
4411   /* Set mips_optimize around the lui instruction to avoid
4412      inserting an unnecessary nop after the lw.  */
4413   hold_mips_optimize = mips_optimize;
4414   mips_optimize = 2;
4415   macro_build_lui (&global, tmp);
4416   mips_optimize = hold_mips_optimize;
4417   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4418   relax_end ();
4419
4420   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4421 }
4422
4423 /*
4424  *                      Build macros
4425  *   This routine implements the seemingly endless macro or synthesized
4426  * instructions and addressing modes in the mips assembly language. Many
4427  * of these macros are simple and are similar to each other. These could
4428  * probably be handled by some kind of table or grammar approach instead of
4429  * this verbose method. Others are not simple macros but are more like
4430  * optimizing code generation.
4431  *   One interesting optimization is when several store macros appear
4432  * consecutively that would load AT with the upper half of the same address.
4433  * The ensuing load upper instructions are ommited. This implies some kind
4434  * of global optimization. We currently only optimize within a single macro.
4435  *   For many of the load and store macros if the address is specified as a
4436  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4437  * first load register 'at' with zero and use it as the base register. The
4438  * mips assembler simply uses register $zero. Just one tiny optimization
4439  * we're missing.
4440  */
4441 static void
4442 macro (struct mips_cl_insn *ip)
4443 {
4444   register int treg, sreg, dreg, breg;
4445   int tempreg;
4446   int mask;
4447   int used_at = 0;
4448   expressionS expr1;
4449   const char *s;
4450   const char *s2;
4451   const char *fmt;
4452   int likely = 0;
4453   int dbl = 0;
4454   int coproc = 0;
4455   int lr = 0;
4456   int imm = 0;
4457   int call = 0;
4458   int off;
4459   offsetT maxnum;
4460   bfd_reloc_code_real_type r;
4461   int hold_mips_optimize;
4462
4463   assert (! mips_opts.mips16);
4464
4465   treg = (ip->insn_opcode >> 16) & 0x1f;
4466   dreg = (ip->insn_opcode >> 11) & 0x1f;
4467   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4468   mask = ip->insn_mo->mask;
4469
4470   expr1.X_op = O_constant;
4471   expr1.X_op_symbol = NULL;
4472   expr1.X_add_symbol = NULL;
4473   expr1.X_add_number = 1;
4474
4475   switch (mask)
4476     {
4477     case M_DABS:
4478       dbl = 1;
4479     case M_ABS:
4480       /* bgez $a0,.+12
4481          move v0,$a0
4482          sub v0,$zero,$a0
4483          */
4484
4485       start_noreorder ();
4486
4487       expr1.X_add_number = 8;
4488       macro_build (&expr1, "bgez", "s,p", sreg);
4489       if (dreg == sreg)
4490         macro_build (NULL, "nop", "", 0);
4491       else
4492         move_register (dreg, sreg);
4493       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4494
4495       end_noreorder ();
4496       break;
4497
4498     case M_ADD_I:
4499       s = "addi";
4500       s2 = "add";
4501       goto do_addi;
4502     case M_ADDU_I:
4503       s = "addiu";
4504       s2 = "addu";
4505       goto do_addi;
4506     case M_DADD_I:
4507       dbl = 1;
4508       s = "daddi";
4509       s2 = "dadd";
4510       goto do_addi;
4511     case M_DADDU_I:
4512       dbl = 1;
4513       s = "daddiu";
4514       s2 = "daddu";
4515     do_addi:
4516       if (imm_expr.X_op == O_constant
4517           && imm_expr.X_add_number >= -0x8000
4518           && imm_expr.X_add_number < 0x8000)
4519         {
4520           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4521           break;
4522         }
4523       used_at = 1;
4524       load_register (AT, &imm_expr, dbl);
4525       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4526       break;
4527
4528     case M_AND_I:
4529       s = "andi";
4530       s2 = "and";
4531       goto do_bit;
4532     case M_OR_I:
4533       s = "ori";
4534       s2 = "or";
4535       goto do_bit;
4536     case M_NOR_I:
4537       s = "";
4538       s2 = "nor";
4539       goto do_bit;
4540     case M_XOR_I:
4541       s = "xori";
4542       s2 = "xor";
4543     do_bit:
4544       if (imm_expr.X_op == O_constant
4545           && imm_expr.X_add_number >= 0
4546           && imm_expr.X_add_number < 0x10000)
4547         {
4548           if (mask != M_NOR_I)
4549             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4550           else
4551             {
4552               macro_build (&imm_expr, "ori", "t,r,i",
4553                            treg, sreg, BFD_RELOC_LO16);
4554               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4555             }
4556           break;
4557         }
4558
4559       used_at = 1;
4560       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4561       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4562       break;
4563
4564     case M_BEQ_I:
4565       s = "beq";
4566       goto beq_i;
4567     case M_BEQL_I:
4568       s = "beql";
4569       likely = 1;
4570       goto beq_i;
4571     case M_BNE_I:
4572       s = "bne";
4573       goto beq_i;
4574     case M_BNEL_I:
4575       s = "bnel";
4576       likely = 1;
4577     beq_i:
4578       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4579         {
4580           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4581           break;
4582         }
4583       used_at = 1;
4584       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4585       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4586       break;
4587
4588     case M_BGEL:
4589       likely = 1;
4590     case M_BGE:
4591       if (treg == 0)
4592         {
4593           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4594           break;
4595         }
4596       if (sreg == 0)
4597         {
4598           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4599           break;
4600         }
4601       used_at = 1;
4602       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4603       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4604       break;
4605
4606     case M_BGTL_I:
4607       likely = 1;
4608     case M_BGT_I:
4609       /* check for > max integer */
4610       maxnum = 0x7fffffff;
4611       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4612         {
4613           maxnum <<= 16;
4614           maxnum |= 0xffff;
4615           maxnum <<= 16;
4616           maxnum |= 0xffff;
4617         }
4618       if (imm_expr.X_op == O_constant
4619           && imm_expr.X_add_number >= maxnum
4620           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4621         {
4622         do_false:
4623           /* result is always false */
4624           if (! likely)
4625             macro_build (NULL, "nop", "", 0);
4626           else
4627             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4628           break;
4629         }
4630       if (imm_expr.X_op != O_constant)
4631         as_bad (_("Unsupported large constant"));
4632       ++imm_expr.X_add_number;
4633       /* FALLTHROUGH */
4634     case M_BGE_I:
4635     case M_BGEL_I:
4636       if (mask == M_BGEL_I)
4637         likely = 1;
4638       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4639         {
4640           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4641           break;
4642         }
4643       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4644         {
4645           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4646           break;
4647         }
4648       maxnum = 0x7fffffff;
4649       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4650         {
4651           maxnum <<= 16;
4652           maxnum |= 0xffff;
4653           maxnum <<= 16;
4654           maxnum |= 0xffff;
4655         }
4656       maxnum = - maxnum - 1;
4657       if (imm_expr.X_op == O_constant
4658           && imm_expr.X_add_number <= maxnum
4659           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4660         {
4661         do_true:
4662           /* result is always true */
4663           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4664           macro_build (&offset_expr, "b", "p");
4665           break;
4666         }
4667       used_at = 1;
4668       set_at (sreg, 0);
4669       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4670       break;
4671
4672     case M_BGEUL:
4673       likely = 1;
4674     case M_BGEU:
4675       if (treg == 0)
4676         goto do_true;
4677       if (sreg == 0)
4678         {
4679           macro_build (&offset_expr, likely ? "beql" : "beq",
4680                        "s,t,p", 0, treg);
4681           break;
4682         }
4683       used_at = 1;
4684       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4685       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4686       break;
4687
4688     case M_BGTUL_I:
4689       likely = 1;
4690     case M_BGTU_I:
4691       if (sreg == 0
4692           || (HAVE_32BIT_GPRS
4693               && imm_expr.X_op == O_constant
4694               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4695         goto do_false;
4696       if (imm_expr.X_op != O_constant)
4697         as_bad (_("Unsupported large constant"));
4698       ++imm_expr.X_add_number;
4699       /* FALLTHROUGH */
4700     case M_BGEU_I:
4701     case M_BGEUL_I:
4702       if (mask == M_BGEUL_I)
4703         likely = 1;
4704       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4705         goto do_true;
4706       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4707         {
4708           macro_build (&offset_expr, likely ? "bnel" : "bne",
4709                        "s,t,p", sreg, 0);
4710           break;
4711         }
4712       used_at = 1;
4713       set_at (sreg, 1);
4714       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4715       break;
4716
4717     case M_BGTL:
4718       likely = 1;
4719     case M_BGT:
4720       if (treg == 0)
4721         {
4722           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4723           break;
4724         }
4725       if (sreg == 0)
4726         {
4727           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4728           break;
4729         }
4730       used_at = 1;
4731       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4732       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4733       break;
4734
4735     case M_BGTUL:
4736       likely = 1;
4737     case M_BGTU:
4738       if (treg == 0)
4739         {
4740           macro_build (&offset_expr, likely ? "bnel" : "bne",
4741                        "s,t,p", sreg, 0);
4742           break;
4743         }
4744       if (sreg == 0)
4745         goto do_false;
4746       used_at = 1;
4747       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4748       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4749       break;
4750
4751     case M_BLEL:
4752       likely = 1;
4753     case M_BLE:
4754       if (treg == 0)
4755         {
4756           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4757           break;
4758         }
4759       if (sreg == 0)
4760         {
4761           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4762           break;
4763         }
4764       used_at = 1;
4765       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4766       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4767       break;
4768
4769     case M_BLEL_I:
4770       likely = 1;
4771     case M_BLE_I:
4772       maxnum = 0x7fffffff;
4773       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4774         {
4775           maxnum <<= 16;
4776           maxnum |= 0xffff;
4777           maxnum <<= 16;
4778           maxnum |= 0xffff;
4779         }
4780       if (imm_expr.X_op == O_constant
4781           && imm_expr.X_add_number >= maxnum
4782           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4783         goto do_true;
4784       if (imm_expr.X_op != O_constant)
4785         as_bad (_("Unsupported large constant"));
4786       ++imm_expr.X_add_number;
4787       /* FALLTHROUGH */
4788     case M_BLT_I:
4789     case M_BLTL_I:
4790       if (mask == M_BLTL_I)
4791         likely = 1;
4792       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4793         {
4794           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4795           break;
4796         }
4797       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4798         {
4799           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4800           break;
4801         }
4802       used_at = 1;
4803       set_at (sreg, 0);
4804       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4805       break;
4806
4807     case M_BLEUL:
4808       likely = 1;
4809     case M_BLEU:
4810       if (treg == 0)
4811         {
4812           macro_build (&offset_expr, likely ? "beql" : "beq",
4813                        "s,t,p", sreg, 0);
4814           break;
4815         }
4816       if (sreg == 0)
4817         goto do_true;
4818       used_at = 1;
4819       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4820       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4821       break;
4822
4823     case M_BLEUL_I:
4824       likely = 1;
4825     case M_BLEU_I:
4826       if (sreg == 0
4827           || (HAVE_32BIT_GPRS
4828               && imm_expr.X_op == O_constant
4829               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4830         goto do_true;
4831       if (imm_expr.X_op != O_constant)
4832         as_bad (_("Unsupported large constant"));
4833       ++imm_expr.X_add_number;
4834       /* FALLTHROUGH */
4835     case M_BLTU_I:
4836     case M_BLTUL_I:
4837       if (mask == M_BLTUL_I)
4838         likely = 1;
4839       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4840         goto do_false;
4841       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4842         {
4843           macro_build (&offset_expr, likely ? "beql" : "beq",
4844                        "s,t,p", sreg, 0);
4845           break;
4846         }
4847       used_at = 1;
4848       set_at (sreg, 1);
4849       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4850       break;
4851
4852     case M_BLTL:
4853       likely = 1;
4854     case M_BLT:
4855       if (treg == 0)
4856         {
4857           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4858           break;
4859         }
4860       if (sreg == 0)
4861         {
4862           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4863           break;
4864         }
4865       used_at = 1;
4866       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4867       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4868       break;
4869
4870     case M_BLTUL:
4871       likely = 1;
4872     case M_BLTU:
4873       if (treg == 0)
4874         goto do_false;
4875       if (sreg == 0)
4876         {
4877           macro_build (&offset_expr, likely ? "bnel" : "bne",
4878                        "s,t,p", 0, treg);
4879           break;
4880         }
4881       used_at = 1;
4882       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4883       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4884       break;
4885
4886     case M_DEXT:
4887       {
4888         unsigned long pos;
4889         unsigned long size;
4890
4891         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4892           {
4893             as_bad (_("Unsupported large constant"));
4894             pos = size = 1;
4895           }
4896         else
4897           {
4898             pos = (unsigned long) imm_expr.X_add_number;
4899             size = (unsigned long) imm2_expr.X_add_number;
4900           }
4901
4902         if (pos > 63)
4903           {
4904             as_bad (_("Improper position (%lu)"), pos);
4905             pos = 1;
4906           }
4907         if (size == 0 || size > 64
4908             || (pos + size - 1) > 63)
4909           {
4910             as_bad (_("Improper extract size (%lu, position %lu)"),
4911                     size, pos);
4912             size = 1;
4913           }
4914
4915         if (size <= 32 && pos < 32)
4916           {
4917             s = "dext";
4918             fmt = "t,r,+A,+C";
4919           }
4920         else if (size <= 32)
4921           {
4922             s = "dextu";
4923             fmt = "t,r,+E,+H";
4924           }
4925         else
4926           {
4927             s = "dextm";
4928             fmt = "t,r,+A,+G";
4929           }
4930         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4931       }
4932       break;
4933
4934     case M_DINS:
4935       {
4936         unsigned long pos;
4937         unsigned long size;
4938
4939         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4940           {
4941             as_bad (_("Unsupported large constant"));
4942             pos = size = 1;
4943           }
4944         else
4945           {
4946             pos = (unsigned long) imm_expr.X_add_number;
4947             size = (unsigned long) imm2_expr.X_add_number;
4948           }
4949
4950         if (pos > 63)
4951           {
4952             as_bad (_("Improper position (%lu)"), pos);
4953             pos = 1;
4954           }
4955         if (size == 0 || size > 64
4956             || (pos + size - 1) > 63)
4957           {
4958             as_bad (_("Improper insert size (%lu, position %lu)"),
4959                     size, pos);
4960             size = 1;
4961           }
4962
4963         if (pos < 32 && (pos + size - 1) < 32)
4964           {
4965             s = "dins";
4966             fmt = "t,r,+A,+B";
4967           }
4968         else if (pos >= 32)
4969           {
4970             s = "dinsu";
4971             fmt = "t,r,+E,+F";
4972           }
4973         else
4974           {
4975             s = "dinsm";
4976             fmt = "t,r,+A,+F";
4977           }
4978         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4979                      pos + size - 1);
4980       }
4981       break;
4982
4983     case M_DDIV_3:
4984       dbl = 1;
4985     case M_DIV_3:
4986       s = "mflo";
4987       goto do_div3;
4988     case M_DREM_3:
4989       dbl = 1;
4990     case M_REM_3:
4991       s = "mfhi";
4992     do_div3:
4993       if (treg == 0)
4994         {
4995           as_warn (_("Divide by zero."));
4996           if (mips_trap)
4997             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4998           else
4999             macro_build (NULL, "break", "c", 7);
5000           break;
5001         }
5002
5003       start_noreorder ();
5004       if (mips_trap)
5005         {
5006           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5007           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5008         }
5009       else
5010         {
5011           expr1.X_add_number = 8;
5012           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5013           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5014           macro_build (NULL, "break", "c", 7);
5015         }
5016       expr1.X_add_number = -1;
5017       used_at = 1;
5018       load_register (AT, &expr1, dbl);
5019       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5020       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5021       if (dbl)
5022         {
5023           expr1.X_add_number = 1;
5024           load_register (AT, &expr1, dbl);
5025           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5026         }
5027       else
5028         {
5029           expr1.X_add_number = 0x80000000;
5030           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5031         }
5032       if (mips_trap)
5033         {
5034           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5035           /* We want to close the noreorder block as soon as possible, so
5036              that later insns are available for delay slot filling.  */
5037           end_noreorder ();
5038         }
5039       else
5040         {
5041           expr1.X_add_number = 8;
5042           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5043           macro_build (NULL, "nop", "", 0);
5044
5045           /* We want to close the noreorder block as soon as possible, so
5046              that later insns are available for delay slot filling.  */
5047           end_noreorder ();
5048
5049           macro_build (NULL, "break", "c", 6);
5050         }
5051       macro_build (NULL, s, "d", dreg);
5052       break;
5053
5054     case M_DIV_3I:
5055       s = "div";
5056       s2 = "mflo";
5057       goto do_divi;
5058     case M_DIVU_3I:
5059       s = "divu";
5060       s2 = "mflo";
5061       goto do_divi;
5062     case M_REM_3I:
5063       s = "div";
5064       s2 = "mfhi";
5065       goto do_divi;
5066     case M_REMU_3I:
5067       s = "divu";
5068       s2 = "mfhi";
5069       goto do_divi;
5070     case M_DDIV_3I:
5071       dbl = 1;
5072       s = "ddiv";
5073       s2 = "mflo";
5074       goto do_divi;
5075     case M_DDIVU_3I:
5076       dbl = 1;
5077       s = "ddivu";
5078       s2 = "mflo";
5079       goto do_divi;
5080     case M_DREM_3I:
5081       dbl = 1;
5082       s = "ddiv";
5083       s2 = "mfhi";
5084       goto do_divi;
5085     case M_DREMU_3I:
5086       dbl = 1;
5087       s = "ddivu";
5088       s2 = "mfhi";
5089     do_divi:
5090       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5091         {
5092           as_warn (_("Divide by zero."));
5093           if (mips_trap)
5094             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5095           else
5096             macro_build (NULL, "break", "c", 7);
5097           break;
5098         }
5099       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5100         {
5101           if (strcmp (s2, "mflo") == 0)
5102             move_register (dreg, sreg);
5103           else
5104             move_register (dreg, 0);
5105           break;
5106         }
5107       if (imm_expr.X_op == O_constant
5108           && imm_expr.X_add_number == -1
5109           && s[strlen (s) - 1] != 'u')
5110         {
5111           if (strcmp (s2, "mflo") == 0)
5112             {
5113               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5114             }
5115           else
5116             move_register (dreg, 0);
5117           break;
5118         }
5119
5120       used_at = 1;
5121       load_register (AT, &imm_expr, dbl);
5122       macro_build (NULL, s, "z,s,t", sreg, AT);
5123       macro_build (NULL, s2, "d", dreg);
5124       break;
5125
5126     case M_DIVU_3:
5127       s = "divu";
5128       s2 = "mflo";
5129       goto do_divu3;
5130     case M_REMU_3:
5131       s = "divu";
5132       s2 = "mfhi";
5133       goto do_divu3;
5134     case M_DDIVU_3:
5135       s = "ddivu";
5136       s2 = "mflo";
5137       goto do_divu3;
5138     case M_DREMU_3:
5139       s = "ddivu";
5140       s2 = "mfhi";
5141     do_divu3:
5142       start_noreorder ();
5143       if (mips_trap)
5144         {
5145           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5146           macro_build (NULL, s, "z,s,t", sreg, treg);
5147           /* We want to close the noreorder block as soon as possible, so
5148              that later insns are available for delay slot filling.  */
5149           end_noreorder ();
5150         }
5151       else
5152         {
5153           expr1.X_add_number = 8;
5154           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5155           macro_build (NULL, s, "z,s,t", sreg, treg);
5156
5157           /* We want to close the noreorder block as soon as possible, so
5158              that later insns are available for delay slot filling.  */
5159           end_noreorder ();
5160           macro_build (NULL, "break", "c", 7);
5161         }
5162       macro_build (NULL, s2, "d", dreg);
5163       break;
5164
5165     case M_DLCA_AB:
5166       dbl = 1;
5167     case M_LCA_AB:
5168       call = 1;
5169       goto do_la;
5170     case M_DLA_AB:
5171       dbl = 1;
5172     case M_LA_AB:
5173     do_la:
5174       /* Load the address of a symbol into a register.  If breg is not
5175          zero, we then add a base register to it.  */
5176
5177       if (dbl && HAVE_32BIT_GPRS)
5178         as_warn (_("dla used to load 32-bit register"));
5179
5180       if (! dbl && HAVE_64BIT_OBJECTS)
5181         as_warn (_("la used to load 64-bit address"));
5182
5183       if (offset_expr.X_op == O_constant
5184           && offset_expr.X_add_number >= -0x8000
5185           && offset_expr.X_add_number < 0x8000)
5186         {
5187           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5188                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5189           break;
5190         }
5191
5192       if (!mips_opts.noat && (treg == breg))
5193         {
5194           tempreg = AT;
5195           used_at = 1;
5196         }
5197       else
5198         {
5199           tempreg = treg;
5200         }
5201
5202       if (offset_expr.X_op != O_symbol
5203           && offset_expr.X_op != O_constant)
5204         {
5205           as_bad (_("expression too complex"));
5206           offset_expr.X_op = O_constant;
5207         }
5208
5209       if (offset_expr.X_op == O_constant)
5210         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5211       else if (mips_pic == NO_PIC)
5212         {
5213           /* If this is a reference to a GP relative symbol, we want
5214                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5215              Otherwise we want
5216                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5217                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5218              If we have a constant, we need two instructions anyhow,
5219              so we may as well always use the latter form.
5220
5221              With 64bit address space and a usable $at we want
5222                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5223                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5224                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5225                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5226                dsll32   $tempreg,0
5227                daddu    $tempreg,$tempreg,$at
5228
5229              If $at is already in use, we use a path which is suboptimal
5230              on superscalar processors.
5231                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5232                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5233                dsll     $tempreg,16
5234                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5235                dsll     $tempreg,16
5236                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5237
5238              For GP relative symbols in 64bit address space we can use
5239              the same sequence as in 32bit address space.  */
5240           if (HAVE_64BIT_SYMBOLS)
5241             {
5242               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5243                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5244                 {
5245                   relax_start (offset_expr.X_add_symbol);
5246                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5247                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5248                   relax_switch ();
5249                 }
5250
5251               if (used_at == 0 && !mips_opts.noat)
5252                 {
5253                   macro_build (&offset_expr, "lui", "t,u",
5254                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5255                   macro_build (&offset_expr, "lui", "t,u",
5256                                AT, BFD_RELOC_HI16_S);
5257                   macro_build (&offset_expr, "daddiu", "t,r,j",
5258                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5259                   macro_build (&offset_expr, "daddiu", "t,r,j",
5260                                AT, AT, BFD_RELOC_LO16);
5261                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5262                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5263                   used_at = 1;
5264                 }
5265               else
5266                 {
5267                   macro_build (&offset_expr, "lui", "t,u",
5268                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5269                   macro_build (&offset_expr, "daddiu", "t,r,j",
5270                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5271                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5272                   macro_build (&offset_expr, "daddiu", "t,r,j",
5273                                tempreg, tempreg, BFD_RELOC_HI16_S);
5274                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5275                   macro_build (&offset_expr, "daddiu", "t,r,j",
5276                                tempreg, tempreg, BFD_RELOC_LO16);
5277                 }
5278
5279               if (mips_relax.sequence)
5280                 relax_end ();
5281             }
5282           else
5283             {
5284               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5285                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5286                 {
5287                   relax_start (offset_expr.X_add_symbol);
5288                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5289                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5290                   relax_switch ();
5291                 }
5292               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5293                 as_bad (_("offset too large"));
5294               macro_build_lui (&offset_expr, tempreg);
5295               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5296                            tempreg, tempreg, BFD_RELOC_LO16);
5297               if (mips_relax.sequence)
5298                 relax_end ();
5299             }
5300         }
5301       else if (!mips_big_got && !HAVE_NEWABI)
5302         {
5303           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5304
5305           /* If this is a reference to an external symbol, and there
5306              is no constant, we want
5307                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5308              or for lca or if tempreg is PIC_CALL_REG
5309                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5310              For a local symbol, we want
5311                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5312                nop
5313                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5314
5315              If we have a small constant, and this is a reference to
5316              an external symbol, we want
5317                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5318                nop
5319                addiu    $tempreg,$tempreg,<constant>
5320              For a local symbol, we want the same instruction
5321              sequence, but we output a BFD_RELOC_LO16 reloc on the
5322              addiu instruction.
5323
5324              If we have a large constant, and this is a reference to
5325              an external symbol, we want
5326                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5327                lui      $at,<hiconstant>
5328                addiu    $at,$at,<loconstant>
5329                addu     $tempreg,$tempreg,$at
5330              For a local symbol, we want the same instruction
5331              sequence, but we output a BFD_RELOC_LO16 reloc on the
5332              addiu instruction.
5333            */
5334
5335           if (offset_expr.X_add_number == 0)
5336             {
5337               if (mips_pic == SVR4_PIC
5338                   && breg == 0
5339                   && (call || tempreg == PIC_CALL_REG))
5340                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5341
5342               relax_start (offset_expr.X_add_symbol);
5343               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5344                            lw_reloc_type, mips_gp_register);
5345               if (breg != 0)
5346                 {
5347                   /* We're going to put in an addu instruction using
5348                      tempreg, so we may as well insert the nop right
5349                      now.  */
5350                   load_delay_nop ();
5351                 }
5352               relax_switch ();
5353               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5354                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5355               load_delay_nop ();
5356               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5357                            tempreg, tempreg, BFD_RELOC_LO16);
5358               relax_end ();
5359               /* FIXME: If breg == 0, and the next instruction uses
5360                  $tempreg, then if this variant case is used an extra
5361                  nop will be generated.  */
5362             }
5363           else if (offset_expr.X_add_number >= -0x8000
5364                    && offset_expr.X_add_number < 0x8000)
5365             {
5366               load_got_offset (tempreg, &offset_expr);
5367               load_delay_nop ();
5368               add_got_offset (tempreg, &offset_expr);
5369             }
5370           else
5371             {
5372               expr1.X_add_number = offset_expr.X_add_number;
5373               offset_expr.X_add_number =
5374                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5375               load_got_offset (tempreg, &offset_expr);
5376               offset_expr.X_add_number = expr1.X_add_number;
5377               /* If we are going to add in a base register, and the
5378                  target register and the base register are the same,
5379                  then we are using AT as a temporary register.  Since
5380                  we want to load the constant into AT, we add our
5381                  current AT (from the global offset table) and the
5382                  register into the register now, and pretend we were
5383                  not using a base register.  */
5384               if (breg == treg)
5385                 {
5386                   load_delay_nop ();
5387                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5388                                treg, AT, breg);
5389                   breg = 0;
5390                   tempreg = treg;
5391                 }
5392               add_got_offset_hilo (tempreg, &offset_expr, AT);
5393               used_at = 1;
5394             }
5395         }
5396       else if (!mips_big_got && HAVE_NEWABI)
5397         {
5398           int add_breg_early = 0;
5399
5400           /* If this is a reference to an external, and there is no
5401              constant, or local symbol (*), with or without a
5402              constant, we want
5403                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5404              or for lca or if tempreg is PIC_CALL_REG
5405                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5406
5407              If we have a small constant, and this is a reference to
5408              an external symbol, we want
5409                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5410                addiu    $tempreg,$tempreg,<constant>
5411
5412              If we have a large constant, and this is a reference to
5413              an external symbol, we want
5414                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5415                lui      $at,<hiconstant>
5416                addiu    $at,$at,<loconstant>
5417                addu     $tempreg,$tempreg,$at
5418
5419              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5420              local symbols, even though it introduces an additional
5421              instruction.  */
5422
5423           if (offset_expr.X_add_number)
5424             {
5425               expr1.X_add_number = offset_expr.X_add_number;
5426               offset_expr.X_add_number = 0;
5427
5428               relax_start (offset_expr.X_add_symbol);
5429               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5430                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5431
5432               if (expr1.X_add_number >= -0x8000
5433                   && expr1.X_add_number < 0x8000)
5434                 {
5435                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5436                                tempreg, tempreg, BFD_RELOC_LO16);
5437                 }
5438               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5439                 {
5440                   int dreg;
5441
5442                   /* If we are going to add in a base register, and the
5443                      target register and the base register are the same,
5444                      then we are using AT as a temporary register.  Since
5445                      we want to load the constant into AT, we add our
5446                      current AT (from the global offset table) and the
5447                      register into the register now, and pretend we were
5448                      not using a base register.  */
5449                   if (breg != treg)
5450                     dreg = tempreg;
5451                   else
5452                     {
5453                       assert (tempreg == AT);
5454                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5455                                    treg, AT, breg);
5456                       dreg = treg;
5457                       add_breg_early = 1;
5458                     }
5459
5460                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5461                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5462                                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
5472               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5473                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5474               if (add_breg_early)
5475                 {
5476                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5477                                treg, tempreg, breg);
5478                   breg = 0;
5479                   tempreg = treg;
5480                 }
5481               relax_end ();
5482             }
5483           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5484             {
5485               relax_start (offset_expr.X_add_symbol);
5486               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5487                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5488               relax_switch ();
5489               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5490                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5491               relax_end ();
5492             }
5493           else
5494             {
5495               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5496                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5497             }
5498         }
5499       else if (mips_big_got && !HAVE_NEWABI)
5500         {
5501           int gpdelay;
5502           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5503           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5504           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5505
5506           /* This is the large GOT case.  If this is a reference to an
5507              external symbol, and there is no constant, we want
5508                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5509                addu     $tempreg,$tempreg,$gp
5510                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5511              or for lca or if tempreg is PIC_CALL_REG
5512                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5513                addu     $tempreg,$tempreg,$gp
5514                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5515              For a local symbol, we want
5516                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5517                nop
5518                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5519
5520              If we have a small constant, and this is a reference to
5521              an external symbol, we want
5522                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5523                addu     $tempreg,$tempreg,$gp
5524                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5525                nop
5526                addiu    $tempreg,$tempreg,<constant>
5527              For a local symbol, we want
5528                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5529                nop
5530                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5531
5532              If we have a large constant, and this is a reference to
5533              an external symbol, we want
5534                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5535                addu     $tempreg,$tempreg,$gp
5536                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5537                lui      $at,<hiconstant>
5538                addiu    $at,$at,<loconstant>
5539                addu     $tempreg,$tempreg,$at
5540              For a local symbol, we want
5541                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5542                lui      $at,<hiconstant>
5543                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5544                addu     $tempreg,$tempreg,$at
5545           */
5546
5547           expr1.X_add_number = offset_expr.X_add_number;
5548           offset_expr.X_add_number = 0;
5549           relax_start (offset_expr.X_add_symbol);
5550           gpdelay = reg_needs_delay (mips_gp_register);
5551           if (expr1.X_add_number == 0 && breg == 0
5552               && (call || tempreg == PIC_CALL_REG))
5553             {
5554               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5555               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5556             }
5557           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5558           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5559                        tempreg, tempreg, mips_gp_register);
5560           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5561                        tempreg, lw_reloc_type, tempreg);
5562           if (expr1.X_add_number == 0)
5563             {
5564               if (breg != 0)
5565                 {
5566                   /* We're going to put in an addu instruction using
5567                      tempreg, so we may as well insert the nop right
5568                      now.  */
5569                   load_delay_nop ();
5570                 }
5571             }
5572           else if (expr1.X_add_number >= -0x8000
5573                    && expr1.X_add_number < 0x8000)
5574             {
5575               load_delay_nop ();
5576               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5577                            tempreg, tempreg, BFD_RELOC_LO16);
5578             }
5579           else
5580             {
5581               int dreg;
5582
5583               /* If we are going to add in a base register, and the
5584                  target register and the base register are the same,
5585                  then we are using AT as a temporary register.  Since
5586                  we want to load the constant into AT, we add our
5587                  current AT (from the global offset table) and the
5588                  register into the register now, and pretend we were
5589                  not using a base register.  */
5590               if (breg != treg)
5591                 dreg = tempreg;
5592               else
5593                 {
5594                   assert (tempreg == AT);
5595                   load_delay_nop ();
5596                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5597                                treg, AT, breg);
5598                   dreg = treg;
5599                 }
5600
5601               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5602               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5603
5604               used_at = 1;
5605             }
5606           offset_expr.X_add_number =
5607             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5608           relax_switch ();
5609
5610           if (gpdelay)
5611             {
5612               /* This is needed because this instruction uses $gp, but
5613                  the first instruction on the main stream does not.  */
5614               macro_build (NULL, "nop", "");
5615             }
5616
5617           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5618                        local_reloc_type, mips_gp_register);
5619           if (expr1.X_add_number >= -0x8000
5620               && expr1.X_add_number < 0x8000)
5621             {
5622               load_delay_nop ();
5623               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5624                            tempreg, tempreg, BFD_RELOC_LO16);
5625               /* FIXME: If add_number is 0, and there was no base
5626                  register, the external symbol case ended with a load,
5627                  so if the symbol turns out to not be external, and
5628                  the next instruction uses tempreg, an unnecessary nop
5629                  will be inserted.  */
5630             }
5631           else
5632             {
5633               if (breg == treg)
5634                 {
5635                   /* We must add in the base register now, as in the
5636                      external symbol case.  */
5637                   assert (tempreg == AT);
5638                   load_delay_nop ();
5639                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5640                                treg, AT, breg);
5641                   tempreg = treg;
5642                   /* We set breg to 0 because we have arranged to add
5643                      it in in both cases.  */
5644                   breg = 0;
5645                 }
5646
5647               macro_build_lui (&expr1, AT);
5648               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5649                            AT, AT, BFD_RELOC_LO16);
5650               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5651                            tempreg, tempreg, AT);
5652               used_at = 1;
5653             }
5654           relax_end ();
5655         }
5656       else if (mips_big_got && HAVE_NEWABI)
5657         {
5658           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5659           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5660           int add_breg_early = 0;
5661
5662           /* This is the large GOT case.  If this is a reference to an
5663              external symbol, and there is no constant, we want
5664                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5665                add      $tempreg,$tempreg,$gp
5666                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5667              or for lca or if tempreg is PIC_CALL_REG
5668                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5669                add      $tempreg,$tempreg,$gp
5670                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5671
5672              If we have a small constant, and this is a reference to
5673              an external symbol, we want
5674                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5675                add      $tempreg,$tempreg,$gp
5676                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5677                addi     $tempreg,$tempreg,<constant>
5678
5679              If we have a large constant, and this is a reference to
5680              an external symbol, we want
5681                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5682                addu     $tempreg,$tempreg,$gp
5683                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5684                lui      $at,<hiconstant>
5685                addi     $at,$at,<loconstant>
5686                add      $tempreg,$tempreg,$at
5687
5688              If we have NewABI, and we know it's a local symbol, we want
5689                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5690                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5691              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5692
5693           relax_start (offset_expr.X_add_symbol);
5694
5695           expr1.X_add_number = offset_expr.X_add_number;
5696           offset_expr.X_add_number = 0;
5697
5698           if (expr1.X_add_number == 0 && breg == 0
5699               && (call || tempreg == PIC_CALL_REG))
5700             {
5701               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5702               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5703             }
5704           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5705           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5706                        tempreg, tempreg, mips_gp_register);
5707           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5708                        tempreg, lw_reloc_type, tempreg);
5709
5710           if (expr1.X_add_number == 0)
5711             ;
5712           else if (expr1.X_add_number >= -0x8000
5713                    && expr1.X_add_number < 0x8000)
5714             {
5715               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5716                            tempreg, tempreg, BFD_RELOC_LO16);
5717             }
5718           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5719             {
5720               int dreg;
5721
5722               /* If we are going to add in a base register, and the
5723                  target register and the base register are the same,
5724                  then we are using AT as a temporary register.  Since
5725                  we want to load the constant into AT, we add our
5726                  current AT (from the global offset table) and the
5727                  register into the register now, and pretend we were
5728                  not using a base register.  */
5729               if (breg != treg)
5730                 dreg = tempreg;
5731               else
5732                 {
5733                   assert (tempreg == AT);
5734                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5735                                treg, AT, breg);
5736                   dreg = treg;
5737                   add_breg_early = 1;
5738                 }
5739
5740               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5741               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5742
5743               used_at = 1;
5744             }
5745           else
5746             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5747
5748           relax_switch ();
5749           offset_expr.X_add_number = expr1.X_add_number;
5750           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5751                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5752           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5753                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5754           if (add_breg_early)
5755             {
5756               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5757                            treg, tempreg, breg);
5758               breg = 0;
5759               tempreg = treg;
5760             }
5761           relax_end ();
5762         }
5763       else
5764         abort ();
5765
5766       if (breg != 0)
5767         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5768       break;
5769
5770     case M_J_A:
5771       /* The j instruction may not be used in PIC code, since it
5772          requires an absolute address.  We convert it to a b
5773          instruction.  */
5774       if (mips_pic == NO_PIC)
5775         macro_build (&offset_expr, "j", "a");
5776       else
5777         macro_build (&offset_expr, "b", "p");
5778       break;
5779
5780       /* The jal instructions must be handled as macros because when
5781          generating PIC code they expand to multi-instruction
5782          sequences.  Normally they are simple instructions.  */
5783     case M_JAL_1:
5784       dreg = RA;
5785       /* Fall through.  */
5786     case M_JAL_2:
5787       if (mips_pic == NO_PIC)
5788         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5789       else
5790         {
5791           if (sreg != PIC_CALL_REG)
5792             as_warn (_("MIPS PIC call to register other than $25"));
5793
5794           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5795           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5796             {
5797               if (mips_cprestore_offset < 0)
5798                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5799               else
5800                 {
5801                   if (! mips_frame_reg_valid)
5802                     {
5803                       as_warn (_("No .frame pseudo-op used in PIC code"));
5804                       /* Quiet this warning.  */
5805                       mips_frame_reg_valid = 1;
5806                     }
5807                   if (! mips_cprestore_valid)
5808                     {
5809                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5810                       /* Quiet this warning.  */
5811                       mips_cprestore_valid = 1;
5812                     }
5813                   expr1.X_add_number = mips_cprestore_offset;
5814                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5815                                                 mips_gp_register,
5816                                                 mips_frame_reg,
5817                                                 HAVE_64BIT_ADDRESSES);
5818                 }
5819             }
5820         }
5821
5822       break;
5823
5824     case M_JAL_A:
5825       if (mips_pic == NO_PIC)
5826         macro_build (&offset_expr, "jal", "a");
5827       else if (mips_pic == SVR4_PIC)
5828         {
5829           /* If this is a reference to an external symbol, and we are
5830              using a small GOT, we want
5831                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5832                nop
5833                jalr     $ra,$25
5834                nop
5835                lw       $gp,cprestore($sp)
5836              The cprestore value is set using the .cprestore
5837              pseudo-op.  If we are using a big GOT, we want
5838                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5839                addu     $25,$25,$gp
5840                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5841                nop
5842                jalr     $ra,$25
5843                nop
5844                lw       $gp,cprestore($sp)
5845              If the symbol is not external, we want
5846                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5847                nop
5848                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5849                jalr     $ra,$25
5850                nop
5851                lw $gp,cprestore($sp)
5852
5853              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5854              sequences above, minus nops, unless the symbol is local,
5855              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5856              GOT_DISP.  */
5857           if (HAVE_NEWABI)
5858             {
5859               if (! mips_big_got)
5860                 {
5861                   relax_start (offset_expr.X_add_symbol);
5862                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5863                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5864                                mips_gp_register);
5865                   relax_switch ();
5866                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5867                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5868                                mips_gp_register);
5869                   relax_end ();
5870                 }
5871               else
5872                 {
5873                   relax_start (offset_expr.X_add_symbol);
5874                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5875                                BFD_RELOC_MIPS_CALL_HI16);
5876                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5877                                PIC_CALL_REG, mips_gp_register);
5878                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5879                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5880                                PIC_CALL_REG);
5881                   relax_switch ();
5882                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5883                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5884                                mips_gp_register);
5885                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5886                                PIC_CALL_REG, PIC_CALL_REG,
5887                                BFD_RELOC_MIPS_GOT_OFST);
5888                   relax_end ();
5889                 }
5890
5891               macro_build_jalr (&offset_expr);
5892             }
5893           else
5894             {
5895               relax_start (offset_expr.X_add_symbol);
5896               if (! mips_big_got)
5897                 {
5898                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5899                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5900                                mips_gp_register);
5901                   load_delay_nop ();
5902                   relax_switch ();
5903                 }
5904               else
5905                 {
5906                   int gpdelay;
5907
5908                   gpdelay = reg_needs_delay (mips_gp_register);
5909                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5910                                BFD_RELOC_MIPS_CALL_HI16);
5911                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5912                                PIC_CALL_REG, mips_gp_register);
5913                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5914                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5915                                PIC_CALL_REG);
5916                   load_delay_nop ();
5917                   relax_switch ();
5918                   if (gpdelay)
5919                     macro_build (NULL, "nop", "");
5920                 }
5921               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5922                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5923                            mips_gp_register);
5924               load_delay_nop ();
5925               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5926                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5927               relax_end ();
5928               macro_build_jalr (&offset_expr);
5929
5930               if (mips_cprestore_offset < 0)
5931                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5932               else
5933                 {
5934                   if (! mips_frame_reg_valid)
5935                     {
5936                       as_warn (_("No .frame pseudo-op used in PIC code"));
5937                       /* Quiet this warning.  */
5938                       mips_frame_reg_valid = 1;
5939                     }
5940                   if (! mips_cprestore_valid)
5941                     {
5942                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5943                       /* Quiet this warning.  */
5944                       mips_cprestore_valid = 1;
5945                     }
5946                   if (mips_opts.noreorder)
5947                     macro_build (NULL, "nop", "");
5948                   expr1.X_add_number = mips_cprestore_offset;
5949                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5950                                                 mips_gp_register,
5951                                                 mips_frame_reg,
5952                                                 HAVE_64BIT_ADDRESSES);
5953                 }
5954             }
5955         }
5956       else if (mips_pic == VXWORKS_PIC)
5957         as_bad (_("Non-PIC jump used in PIC library"));
5958       else
5959         abort ();
5960
5961       break;
5962
5963     case M_LB_AB:
5964       s = "lb";
5965       goto ld;
5966     case M_LBU_AB:
5967       s = "lbu";
5968       goto ld;
5969     case M_LH_AB:
5970       s = "lh";
5971       goto ld;
5972     case M_LHU_AB:
5973       s = "lhu";
5974       goto ld;
5975     case M_LW_AB:
5976       s = "lw";
5977       goto ld;
5978     case M_LWC0_AB:
5979       s = "lwc0";
5980       /* Itbl support may require additional care here.  */
5981       coproc = 1;
5982       goto ld;
5983     case M_LWC1_AB:
5984       s = "lwc1";
5985       /* Itbl support may require additional care here.  */
5986       coproc = 1;
5987       goto ld;
5988     case M_LWC2_AB:
5989       s = "lwc2";
5990       /* Itbl support may require additional care here.  */
5991       coproc = 1;
5992       goto ld;
5993     case M_LWC3_AB:
5994       s = "lwc3";
5995       /* Itbl support may require additional care here.  */
5996       coproc = 1;
5997       goto ld;
5998     case M_LWL_AB:
5999       s = "lwl";
6000       lr = 1;
6001       goto ld;
6002     case M_LWR_AB:
6003       s = "lwr";
6004       lr = 1;
6005       goto ld;
6006     case M_LDC1_AB:
6007       if (mips_opts.arch == CPU_R4650)
6008         {
6009           as_bad (_("opcode not supported on this processor"));
6010           break;
6011         }
6012       s = "ldc1";
6013       /* Itbl support may require additional care here.  */
6014       coproc = 1;
6015       goto ld;
6016     case M_LDC2_AB:
6017       s = "ldc2";
6018       /* Itbl support may require additional care here.  */
6019       coproc = 1;
6020       goto ld;
6021     case M_LDC3_AB:
6022       s = "ldc3";
6023       /* Itbl support may require additional care here.  */
6024       coproc = 1;
6025       goto ld;
6026     case M_LDL_AB:
6027       s = "ldl";
6028       lr = 1;
6029       goto ld;
6030     case M_LDR_AB:
6031       s = "ldr";
6032       lr = 1;
6033       goto ld;
6034     case M_LL_AB:
6035       s = "ll";
6036       goto ld;
6037     case M_LLD_AB:
6038       s = "lld";
6039       goto ld;
6040     case M_LWU_AB:
6041       s = "lwu";
6042     ld:
6043       if (breg == treg || coproc || lr)
6044         {
6045           tempreg = AT;
6046           used_at = 1;
6047         }
6048       else
6049         {
6050           tempreg = treg;
6051         }
6052       goto ld_st;
6053     case M_SB_AB:
6054       s = "sb";
6055       goto st;
6056     case M_SH_AB:
6057       s = "sh";
6058       goto st;
6059     case M_SW_AB:
6060       s = "sw";
6061       goto st;
6062     case M_SWC0_AB:
6063       s = "swc0";
6064       /* Itbl support may require additional care here.  */
6065       coproc = 1;
6066       goto st;
6067     case M_SWC1_AB:
6068       s = "swc1";
6069       /* Itbl support may require additional care here.  */
6070       coproc = 1;
6071       goto st;
6072     case M_SWC2_AB:
6073       s = "swc2";
6074       /* Itbl support may require additional care here.  */
6075       coproc = 1;
6076       goto st;
6077     case M_SWC3_AB:
6078       s = "swc3";
6079       /* Itbl support may require additional care here.  */
6080       coproc = 1;
6081       goto st;
6082     case M_SWL_AB:
6083       s = "swl";
6084       goto st;
6085     case M_SWR_AB:
6086       s = "swr";
6087       goto st;
6088     case M_SC_AB:
6089       s = "sc";
6090       goto st;
6091     case M_SCD_AB:
6092       s = "scd";
6093       goto st;
6094     case M_CACHE_AB:
6095       s = "cache";
6096       goto st;
6097     case M_SDC1_AB:
6098       if (mips_opts.arch == CPU_R4650)
6099         {
6100           as_bad (_("opcode not supported on this processor"));
6101           break;
6102         }
6103       s = "sdc1";
6104       coproc = 1;
6105       /* Itbl support may require additional care here.  */
6106       goto st;
6107     case M_SDC2_AB:
6108       s = "sdc2";
6109       /* Itbl support may require additional care here.  */
6110       coproc = 1;
6111       goto st;
6112     case M_SDC3_AB:
6113       s = "sdc3";
6114       /* Itbl support may require additional care here.  */
6115       coproc = 1;
6116       goto st;
6117     case M_SDL_AB:
6118       s = "sdl";
6119       goto st;
6120     case M_SDR_AB:
6121       s = "sdr";
6122     st:
6123       tempreg = AT;
6124       used_at = 1;
6125     ld_st:
6126       /* Itbl support may require additional care here.  */
6127       if (mask == M_LWC1_AB
6128           || mask == M_SWC1_AB
6129           || mask == M_LDC1_AB
6130           || mask == M_SDC1_AB
6131           || mask == M_L_DAB
6132           || mask == M_S_DAB)
6133         fmt = "T,o(b)";
6134       else if (mask == M_CACHE_AB)
6135         fmt = "k,o(b)";
6136       else if (coproc)
6137         fmt = "E,o(b)";
6138       else
6139         fmt = "t,o(b)";
6140
6141       if (offset_expr.X_op != O_constant
6142           && offset_expr.X_op != O_symbol)
6143         {
6144           as_bad (_("expression too complex"));
6145           offset_expr.X_op = O_constant;
6146         }
6147
6148       if (HAVE_32BIT_ADDRESSES
6149           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6150         {
6151           char value [32];
6152
6153           sprintf_vma (value, offset_expr.X_add_number);
6154           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6155         }
6156
6157       /* A constant expression in PIC code can be handled just as it
6158          is in non PIC code.  */
6159       if (offset_expr.X_op == O_constant)
6160         {
6161           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6162                                 & ~(bfd_vma) 0xffff);
6163           normalize_address_expr (&expr1);
6164           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6165           if (breg != 0)
6166             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6167                          tempreg, tempreg, breg);
6168           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6169         }
6170       else if (mips_pic == NO_PIC)
6171         {
6172           /* If this is a reference to a GP relative symbol, and there
6173              is no base register, we want
6174                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6175              Otherwise, if there is no base register, we want
6176                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6177                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6178              If we have a constant, we need two instructions anyhow,
6179              so we always use the latter form.
6180
6181              If we have a base register, and this is a reference to a
6182              GP relative symbol, we want
6183                addu     $tempreg,$breg,$gp
6184                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6185              Otherwise we want
6186                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6187                addu     $tempreg,$tempreg,$breg
6188                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6189              With a constant we always use the latter case.
6190
6191              With 64bit address space and no base register and $at usable,
6192              we want
6193                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6194                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6195                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6196                dsll32   $tempreg,0
6197                daddu    $tempreg,$at
6198                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6199              If we have a base register, we want
6200                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6201                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6202                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6203                daddu    $at,$breg
6204                dsll32   $tempreg,0
6205                daddu    $tempreg,$at
6206                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6207
6208              Without $at we can't generate the optimal path for superscalar
6209              processors here since this would require two temporary registers.
6210                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6211                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6212                dsll     $tempreg,16
6213                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6214                dsll     $tempreg,16
6215                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6216              If we have a base register, we want
6217                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6218                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6219                dsll     $tempreg,16
6220                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6221                dsll     $tempreg,16
6222                daddu    $tempreg,$tempreg,$breg
6223                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6224
6225              For GP relative symbols in 64bit address space we can use
6226              the same sequence as in 32bit address space.  */
6227           if (HAVE_64BIT_SYMBOLS)
6228             {
6229               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6230                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6231                 {
6232                   relax_start (offset_expr.X_add_symbol);
6233                   if (breg == 0)
6234                     {
6235                       macro_build (&offset_expr, s, fmt, treg,
6236                                    BFD_RELOC_GPREL16, mips_gp_register);
6237                     }
6238                   else
6239                     {
6240                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6241                                    tempreg, breg, mips_gp_register);
6242                       macro_build (&offset_expr, s, fmt, treg,
6243                                    BFD_RELOC_GPREL16, tempreg);
6244                     }
6245                   relax_switch ();
6246                 }
6247
6248               if (used_at == 0 && !mips_opts.noat)
6249                 {
6250                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6251                                BFD_RELOC_MIPS_HIGHEST);
6252                   macro_build (&offset_expr, "lui", "t,u", AT,
6253                                BFD_RELOC_HI16_S);
6254                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6255                                tempreg, BFD_RELOC_MIPS_HIGHER);
6256                   if (breg != 0)
6257                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6258                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6259                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6260                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6261                                tempreg);
6262                   used_at = 1;
6263                 }
6264               else
6265                 {
6266                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6267                                BFD_RELOC_MIPS_HIGHEST);
6268                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6269                                tempreg, BFD_RELOC_MIPS_HIGHER);
6270                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6271                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6272                                tempreg, BFD_RELOC_HI16_S);
6273                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6274                   if (breg != 0)
6275                     macro_build (NULL, "daddu", "d,v,t",
6276                                  tempreg, tempreg, breg);
6277                   macro_build (&offset_expr, s, fmt, treg,
6278                                BFD_RELOC_LO16, tempreg);
6279                 }
6280
6281               if (mips_relax.sequence)
6282                 relax_end ();
6283               break;
6284             }
6285
6286           if (breg == 0)
6287             {
6288               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6289                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6290                 {
6291                   relax_start (offset_expr.X_add_symbol);
6292                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6293                                mips_gp_register);
6294                   relax_switch ();
6295                 }
6296               macro_build_lui (&offset_expr, tempreg);
6297               macro_build (&offset_expr, s, fmt, treg,
6298                            BFD_RELOC_LO16, tempreg);
6299               if (mips_relax.sequence)
6300                 relax_end ();
6301             }
6302           else
6303             {
6304               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6305                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6306                 {
6307                   relax_start (offset_expr.X_add_symbol);
6308                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6309                                tempreg, breg, mips_gp_register);
6310                   macro_build (&offset_expr, s, fmt, treg,
6311                                BFD_RELOC_GPREL16, tempreg);
6312                   relax_switch ();
6313                 }
6314               macro_build_lui (&offset_expr, tempreg);
6315               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6316                            tempreg, tempreg, breg);
6317               macro_build (&offset_expr, s, fmt, treg,
6318                            BFD_RELOC_LO16, tempreg);
6319               if (mips_relax.sequence)
6320                 relax_end ();
6321             }
6322         }
6323       else if (!mips_big_got)
6324         {
6325           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6326
6327           /* If this is a reference to an external symbol, we want
6328                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6329                nop
6330                <op>     $treg,0($tempreg)
6331              Otherwise we want
6332                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6333                nop
6334                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6335                <op>     $treg,0($tempreg)
6336
6337              For NewABI, we want
6338                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6339                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6340
6341              If there is a base register, we add it to $tempreg before
6342              the <op>.  If there is a constant, we stick it in the
6343              <op> instruction.  We don't handle constants larger than
6344              16 bits, because we have no way to load the upper 16 bits
6345              (actually, we could handle them for the subset of cases
6346              in which we are not using $at).  */
6347           assert (offset_expr.X_op == O_symbol);
6348           if (HAVE_NEWABI)
6349             {
6350               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6351                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6352               if (breg != 0)
6353                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6354                              tempreg, tempreg, breg);
6355               macro_build (&offset_expr, s, fmt, treg,
6356                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6357               break;
6358             }
6359           expr1.X_add_number = offset_expr.X_add_number;
6360           offset_expr.X_add_number = 0;
6361           if (expr1.X_add_number < -0x8000
6362               || expr1.X_add_number >= 0x8000)
6363             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6364           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6365                        lw_reloc_type, mips_gp_register);
6366           load_delay_nop ();
6367           relax_start (offset_expr.X_add_symbol);
6368           relax_switch ();
6369           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6370                        tempreg, BFD_RELOC_LO16);
6371           relax_end ();
6372           if (breg != 0)
6373             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6374                          tempreg, tempreg, breg);
6375           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6376         }
6377       else if (mips_big_got && !HAVE_NEWABI)
6378         {
6379           int gpdelay;
6380
6381           /* If this is a reference to an external symbol, we want
6382                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6383                addu     $tempreg,$tempreg,$gp
6384                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6385                <op>     $treg,0($tempreg)
6386              Otherwise we want
6387                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6388                nop
6389                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6390                <op>     $treg,0($tempreg)
6391              If there is a base register, we add it to $tempreg before
6392              the <op>.  If there is a constant, we stick it in the
6393              <op> instruction.  We don't handle constants larger than
6394              16 bits, because we have no way to load the upper 16 bits
6395              (actually, we could handle them for the subset of cases
6396              in which we are not using $at).  */
6397           assert (offset_expr.X_op == O_symbol);
6398           expr1.X_add_number = offset_expr.X_add_number;
6399           offset_expr.X_add_number = 0;
6400           if (expr1.X_add_number < -0x8000
6401               || expr1.X_add_number >= 0x8000)
6402             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6403           gpdelay = reg_needs_delay (mips_gp_register);
6404           relax_start (offset_expr.X_add_symbol);
6405           macro_build (&offset_expr, "lui", "t,u", tempreg,
6406                        BFD_RELOC_MIPS_GOT_HI16);
6407           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6408                        mips_gp_register);
6409           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6410                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6411           relax_switch ();
6412           if (gpdelay)
6413             macro_build (NULL, "nop", "");
6414           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6415                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6416           load_delay_nop ();
6417           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6418                        tempreg, BFD_RELOC_LO16);
6419           relax_end ();
6420
6421           if (breg != 0)
6422             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6423                          tempreg, tempreg, breg);
6424           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6425         }
6426       else if (mips_big_got && HAVE_NEWABI)
6427         {
6428           /* If this is a reference to an external symbol, we want
6429                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6430                add      $tempreg,$tempreg,$gp
6431                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6432                <op>     $treg,<ofst>($tempreg)
6433              Otherwise, for local symbols, we want:
6434                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6435                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6436           assert (offset_expr.X_op == O_symbol);
6437           expr1.X_add_number = offset_expr.X_add_number;
6438           offset_expr.X_add_number = 0;
6439           if (expr1.X_add_number < -0x8000
6440               || expr1.X_add_number >= 0x8000)
6441             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6442           relax_start (offset_expr.X_add_symbol);
6443           macro_build (&offset_expr, "lui", "t,u", tempreg,
6444                        BFD_RELOC_MIPS_GOT_HI16);
6445           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6446                        mips_gp_register);
6447           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6448                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6449           if (breg != 0)
6450             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6451                          tempreg, tempreg, breg);
6452           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6453
6454           relax_switch ();
6455           offset_expr.X_add_number = expr1.X_add_number;
6456           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6457                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6458           if (breg != 0)
6459             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6460                          tempreg, tempreg, breg);
6461           macro_build (&offset_expr, s, fmt, treg,
6462                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6463           relax_end ();
6464         }
6465       else
6466         abort ();
6467
6468       break;
6469
6470     case M_LI:
6471     case M_LI_S:
6472       load_register (treg, &imm_expr, 0);
6473       break;
6474
6475     case M_DLI:
6476       load_register (treg, &imm_expr, 1);
6477       break;
6478
6479     case M_LI_SS:
6480       if (imm_expr.X_op == O_constant)
6481         {
6482           used_at = 1;
6483           load_register (AT, &imm_expr, 0);
6484           macro_build (NULL, "mtc1", "t,G", AT, treg);
6485           break;
6486         }
6487       else
6488         {
6489           assert (offset_expr.X_op == O_symbol
6490                   && strcmp (segment_name (S_GET_SEGMENT
6491                                            (offset_expr.X_add_symbol)),
6492                              ".lit4") == 0
6493                   && offset_expr.X_add_number == 0);
6494           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6495                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6496           break;
6497         }
6498
6499     case M_LI_D:
6500       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6501          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6502          order 32 bits of the value and the low order 32 bits are either
6503          zero or in OFFSET_EXPR.  */
6504       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6505         {
6506           if (HAVE_64BIT_GPRS)
6507             load_register (treg, &imm_expr, 1);
6508           else
6509             {
6510               int hreg, lreg;
6511
6512               if (target_big_endian)
6513                 {
6514                   hreg = treg;
6515                   lreg = treg + 1;
6516                 }
6517               else
6518                 {
6519                   hreg = treg + 1;
6520                   lreg = treg;
6521                 }
6522
6523               if (hreg <= 31)
6524                 load_register (hreg, &imm_expr, 0);
6525               if (lreg <= 31)
6526                 {
6527                   if (offset_expr.X_op == O_absent)
6528                     move_register (lreg, 0);
6529                   else
6530                     {
6531                       assert (offset_expr.X_op == O_constant);
6532                       load_register (lreg, &offset_expr, 0);
6533                     }
6534                 }
6535             }
6536           break;
6537         }
6538
6539       /* We know that sym is in the .rdata section.  First we get the
6540          upper 16 bits of the address.  */
6541       if (mips_pic == NO_PIC)
6542         {
6543           macro_build_lui (&offset_expr, AT);
6544           used_at = 1;
6545         }
6546       else
6547         {
6548           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6549                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6550           used_at = 1;
6551         }
6552
6553       /* Now we load the register(s).  */
6554       if (HAVE_64BIT_GPRS)
6555         {
6556           used_at = 1;
6557           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6558         }
6559       else
6560         {
6561           used_at = 1;
6562           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6563           if (treg != RA)
6564             {
6565               /* FIXME: How in the world do we deal with the possible
6566                  overflow here?  */
6567               offset_expr.X_add_number += 4;
6568               macro_build (&offset_expr, "lw", "t,o(b)",
6569                            treg + 1, BFD_RELOC_LO16, AT);
6570             }
6571         }
6572       break;
6573
6574     case M_LI_DD:
6575       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6576          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6577          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6578          the value and the low order 32 bits are either zero or in
6579          OFFSET_EXPR.  */
6580       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6581         {
6582           used_at = 1;
6583           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6584           if (HAVE_64BIT_FPRS)
6585             {
6586               assert (HAVE_64BIT_GPRS);
6587               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6588             }
6589           else
6590             {
6591               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6592               if (offset_expr.X_op == O_absent)
6593                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6594               else
6595                 {
6596                   assert (offset_expr.X_op == O_constant);
6597                   load_register (AT, &offset_expr, 0);
6598                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6599                 }
6600             }
6601           break;
6602         }
6603
6604       assert (offset_expr.X_op == O_symbol
6605               && offset_expr.X_add_number == 0);
6606       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6607       if (strcmp (s, ".lit8") == 0)
6608         {
6609           if (mips_opts.isa != ISA_MIPS1)
6610             {
6611               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6612                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6613               break;
6614             }
6615           breg = mips_gp_register;
6616           r = BFD_RELOC_MIPS_LITERAL;
6617           goto dob;
6618         }
6619       else
6620         {
6621           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6622           used_at = 1;
6623           if (mips_pic != NO_PIC)
6624             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6625                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6626           else
6627             {
6628               /* FIXME: This won't work for a 64 bit address.  */
6629               macro_build_lui (&offset_expr, AT);
6630             }
6631
6632           if (mips_opts.isa != ISA_MIPS1)
6633             {
6634               macro_build (&offset_expr, "ldc1", "T,o(b)",
6635                            treg, BFD_RELOC_LO16, AT);
6636               break;
6637             }
6638           breg = AT;
6639           r = BFD_RELOC_LO16;
6640           goto dob;
6641         }
6642
6643     case M_L_DOB:
6644       if (mips_opts.arch == CPU_R4650)
6645         {
6646           as_bad (_("opcode not supported on this processor"));
6647           break;
6648         }
6649       /* Even on a big endian machine $fn comes before $fn+1.  We have
6650          to adjust when loading from memory.  */
6651       r = BFD_RELOC_LO16;
6652     dob:
6653       assert (mips_opts.isa == ISA_MIPS1);
6654       macro_build (&offset_expr, "lwc1", "T,o(b)",
6655                    target_big_endian ? treg + 1 : treg, r, breg);
6656       /* FIXME: A possible overflow which I don't know how to deal
6657          with.  */
6658       offset_expr.X_add_number += 4;
6659       macro_build (&offset_expr, "lwc1", "T,o(b)",
6660                    target_big_endian ? treg : treg + 1, r, breg);
6661       break;
6662
6663     case M_L_DAB:
6664       /*
6665        * The MIPS assembler seems to check for X_add_number not
6666        * being double aligned and generating:
6667        *        lui     at,%hi(foo+1)
6668        *        addu    at,at,v1
6669        *        addiu   at,at,%lo(foo+1)
6670        *        lwc1    f2,0(at)
6671        *        lwc1    f3,4(at)
6672        * But, the resulting address is the same after relocation so why
6673        * generate the extra instruction?
6674        */
6675       if (mips_opts.arch == CPU_R4650)
6676         {
6677           as_bad (_("opcode not supported on this processor"));
6678           break;
6679         }
6680       /* Itbl support may require additional care here.  */
6681       coproc = 1;
6682       if (mips_opts.isa != ISA_MIPS1)
6683         {
6684           s = "ldc1";
6685           goto ld;
6686         }
6687
6688       s = "lwc1";
6689       fmt = "T,o(b)";
6690       goto ldd_std;
6691
6692     case M_S_DAB:
6693       if (mips_opts.arch == CPU_R4650)
6694         {
6695           as_bad (_("opcode not supported on this processor"));
6696           break;
6697         }
6698
6699       if (mips_opts.isa != ISA_MIPS1)
6700         {
6701           s = "sdc1";
6702           goto st;
6703         }
6704
6705       s = "swc1";
6706       fmt = "T,o(b)";
6707       /* Itbl support may require additional care here.  */
6708       coproc = 1;
6709       goto ldd_std;
6710
6711     case M_LD_AB:
6712       if (HAVE_64BIT_GPRS)
6713         {
6714           s = "ld";
6715           goto ld;
6716         }
6717
6718       s = "lw";
6719       fmt = "t,o(b)";
6720       goto ldd_std;
6721
6722     case M_SD_AB:
6723       if (HAVE_64BIT_GPRS)
6724         {
6725           s = "sd";
6726           goto st;
6727         }
6728
6729       s = "sw";
6730       fmt = "t,o(b)";
6731
6732     ldd_std:
6733       if (offset_expr.X_op != O_symbol
6734           && offset_expr.X_op != O_constant)
6735         {
6736           as_bad (_("expression too complex"));
6737           offset_expr.X_op = O_constant;
6738         }
6739
6740       if (HAVE_32BIT_ADDRESSES
6741           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6742         {
6743           char value [32];
6744
6745           sprintf_vma (value, offset_expr.X_add_number);
6746           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6747         }
6748
6749       /* Even on a big endian machine $fn comes before $fn+1.  We have
6750          to adjust when loading from memory.  We set coproc if we must
6751          load $fn+1 first.  */
6752       /* Itbl support may require additional care here.  */
6753       if (! target_big_endian)
6754         coproc = 0;
6755
6756       if (mips_pic == NO_PIC
6757           || offset_expr.X_op == O_constant)
6758         {
6759           /* If this is a reference to a GP relative symbol, we want
6760                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6761                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6762              If we have a base register, we use this
6763                addu     $at,$breg,$gp
6764                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6765                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6766              If this is not a GP relative symbol, we want
6767                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6768                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6769                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6770              If there is a base register, we add it to $at after the
6771              lui instruction.  If there is a constant, we always use
6772              the last case.  */
6773           if (offset_expr.X_op == O_symbol
6774               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6775               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6776             {
6777               relax_start (offset_expr.X_add_symbol);
6778               if (breg == 0)
6779                 {
6780                   tempreg = mips_gp_register;
6781                 }
6782               else
6783                 {
6784                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6785                                AT, breg, mips_gp_register);
6786                   tempreg = AT;
6787                   used_at = 1;
6788                 }
6789
6790               /* Itbl support may require additional care here.  */
6791               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6792                            BFD_RELOC_GPREL16, tempreg);
6793               offset_expr.X_add_number += 4;
6794
6795               /* Set mips_optimize to 2 to avoid inserting an
6796                  undesired nop.  */
6797               hold_mips_optimize = mips_optimize;
6798               mips_optimize = 2;
6799               /* Itbl support may require additional care here.  */
6800               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6801                            BFD_RELOC_GPREL16, tempreg);
6802               mips_optimize = hold_mips_optimize;
6803
6804               relax_switch ();
6805
6806               /* We just generated two relocs.  When tc_gen_reloc
6807                  handles this case, it will skip the first reloc and
6808                  handle the second.  The second reloc already has an
6809                  extra addend of 4, which we added above.  We must
6810                  subtract it out, and then subtract another 4 to make
6811                  the first reloc come out right.  The second reloc
6812                  will come out right because we are going to add 4 to
6813                  offset_expr when we build its instruction below.
6814
6815                  If we have a symbol, then we don't want to include
6816                  the offset, because it will wind up being included
6817                  when we generate the reloc.  */
6818
6819               if (offset_expr.X_op == O_constant)
6820                 offset_expr.X_add_number -= 8;
6821               else
6822                 {
6823                   offset_expr.X_add_number = -4;
6824                   offset_expr.X_op = O_constant;
6825                 }
6826             }
6827           used_at = 1;
6828           macro_build_lui (&offset_expr, AT);
6829           if (breg != 0)
6830             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6831           /* Itbl support may require additional care here.  */
6832           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6833                        BFD_RELOC_LO16, AT);
6834           /* FIXME: How do we handle overflow here?  */
6835           offset_expr.X_add_number += 4;
6836           /* Itbl support may require additional care here.  */
6837           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6838                        BFD_RELOC_LO16, AT);
6839           if (mips_relax.sequence)
6840             relax_end ();
6841         }
6842       else if (!mips_big_got)
6843         {
6844           /* If this is a reference to an external symbol, we want
6845                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6846                nop
6847                <op>     $treg,0($at)
6848                <op>     $treg+1,4($at)
6849              Otherwise we want
6850                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6851                nop
6852                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6853                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6854              If there is a base register we add it to $at before the
6855              lwc1 instructions.  If there is a constant we include it
6856              in the lwc1 instructions.  */
6857           used_at = 1;
6858           expr1.X_add_number = offset_expr.X_add_number;
6859           if (expr1.X_add_number < -0x8000
6860               || expr1.X_add_number >= 0x8000 - 4)
6861             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6862           load_got_offset (AT, &offset_expr);
6863           load_delay_nop ();
6864           if (breg != 0)
6865             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6866
6867           /* Set mips_optimize to 2 to avoid inserting an undesired
6868              nop.  */
6869           hold_mips_optimize = mips_optimize;
6870           mips_optimize = 2;
6871
6872           /* Itbl support may require additional care here.  */
6873           relax_start (offset_expr.X_add_symbol);
6874           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6875                        BFD_RELOC_LO16, AT);
6876           expr1.X_add_number += 4;
6877           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6878                        BFD_RELOC_LO16, AT);
6879           relax_switch ();
6880           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6881                        BFD_RELOC_LO16, AT);
6882           offset_expr.X_add_number += 4;
6883           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6884                        BFD_RELOC_LO16, AT);
6885           relax_end ();
6886
6887           mips_optimize = hold_mips_optimize;
6888         }
6889       else if (mips_big_got)
6890         {
6891           int gpdelay;
6892
6893           /* If this is a reference to an external symbol, we want
6894                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6895                addu     $at,$at,$gp
6896                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6897                nop
6898                <op>     $treg,0($at)
6899                <op>     $treg+1,4($at)
6900              Otherwise we want
6901                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6902                nop
6903                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6904                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6905              If there is a base register we add it to $at before the
6906              lwc1 instructions.  If there is a constant we include it
6907              in the lwc1 instructions.  */
6908           used_at = 1;
6909           expr1.X_add_number = offset_expr.X_add_number;
6910           offset_expr.X_add_number = 0;
6911           if (expr1.X_add_number < -0x8000
6912               || expr1.X_add_number >= 0x8000 - 4)
6913             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6914           gpdelay = reg_needs_delay (mips_gp_register);
6915           relax_start (offset_expr.X_add_symbol);
6916           macro_build (&offset_expr, "lui", "t,u",
6917                        AT, BFD_RELOC_MIPS_GOT_HI16);
6918           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6919                        AT, AT, mips_gp_register);
6920           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6921                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6922           load_delay_nop ();
6923           if (breg != 0)
6924             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6925           /* Itbl support may require additional care here.  */
6926           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6927                        BFD_RELOC_LO16, AT);
6928           expr1.X_add_number += 4;
6929
6930           /* Set mips_optimize to 2 to avoid inserting an undesired
6931              nop.  */
6932           hold_mips_optimize = mips_optimize;
6933           mips_optimize = 2;
6934           /* Itbl support may require additional care here.  */
6935           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6936                        BFD_RELOC_LO16, AT);
6937           mips_optimize = hold_mips_optimize;
6938           expr1.X_add_number -= 4;
6939
6940           relax_switch ();
6941           offset_expr.X_add_number = expr1.X_add_number;
6942           if (gpdelay)
6943             macro_build (NULL, "nop", "");
6944           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6945                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6946           load_delay_nop ();
6947           if (breg != 0)
6948             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6949           /* Itbl support may require additional care here.  */
6950           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6951                        BFD_RELOC_LO16, AT);
6952           offset_expr.X_add_number += 4;
6953
6954           /* Set mips_optimize to 2 to avoid inserting an undesired
6955              nop.  */
6956           hold_mips_optimize = mips_optimize;
6957           mips_optimize = 2;
6958           /* Itbl support may require additional care here.  */
6959           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6960                        BFD_RELOC_LO16, AT);
6961           mips_optimize = hold_mips_optimize;
6962           relax_end ();
6963         }
6964       else
6965         abort ();
6966
6967       break;
6968
6969     case M_LD_OB:
6970       s = "lw";
6971       goto sd_ob;
6972     case M_SD_OB:
6973       s = "sw";
6974     sd_ob:
6975       assert (HAVE_32BIT_ADDRESSES);
6976       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6977       offset_expr.X_add_number += 4;
6978       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6979       break;
6980
6981    /* New code added to support COPZ instructions.
6982       This code builds table entries out of the macros in mip_opcodes.
6983       R4000 uses interlocks to handle coproc delays.
6984       Other chips (like the R3000) require nops to be inserted for delays.
6985
6986       FIXME: Currently, we require that the user handle delays.
6987       In order to fill delay slots for non-interlocked chips,
6988       we must have a way to specify delays based on the coprocessor.
6989       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6990       What are the side-effects of the cop instruction?
6991       What cache support might we have and what are its effects?
6992       Both coprocessor & memory require delays. how long???
6993       What registers are read/set/modified?
6994
6995       If an itbl is provided to interpret cop instructions,
6996       this knowledge can be encoded in the itbl spec.  */
6997
6998     case M_COP0:
6999       s = "c0";
7000       goto copz;
7001     case M_COP1:
7002       s = "c1";
7003       goto copz;
7004     case M_COP2:
7005       s = "c2";
7006       goto copz;
7007     case M_COP3:
7008       s = "c3";
7009     copz:
7010       /* For now we just do C (same as Cz).  The parameter will be
7011          stored in insn_opcode by mips_ip.  */
7012       macro_build (NULL, s, "C", ip->insn_opcode);
7013       break;
7014
7015     case M_MOVE:
7016       move_register (dreg, sreg);
7017       break;
7018
7019 #ifdef LOSING_COMPILER
7020     default:
7021       /* Try and see if this is a new itbl instruction.
7022          This code builds table entries out of the macros in mip_opcodes.
7023          FIXME: For now we just assemble the expression and pass it's
7024          value along as a 32-bit immediate.
7025          We may want to have the assembler assemble this value,
7026          so that we gain the assembler's knowledge of delay slots,
7027          symbols, etc.
7028          Would it be more efficient to use mask (id) here? */
7029       if (itbl_have_entries
7030           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7031         {
7032           s = ip->insn_mo->name;
7033           s2 = "cop3";
7034           coproc = ITBL_DECODE_PNUM (immed_expr);;
7035           macro_build (&immed_expr, s, "C");
7036           break;
7037         }
7038       macro2 (ip);
7039       break;
7040     }
7041   if (mips_opts.noat && used_at)
7042     as_bad (_("Macro used $at after \".set noat\""));
7043 }
7044
7045 static void
7046 macro2 (struct mips_cl_insn *ip)
7047 {
7048   register int treg, sreg, dreg, breg;
7049   int tempreg;
7050   int mask;
7051   int used_at;
7052   expressionS expr1;
7053   const char *s;
7054   const char *s2;
7055   const char *fmt;
7056   int likely = 0;
7057   int dbl = 0;
7058   int coproc = 0;
7059   int lr = 0;
7060   int imm = 0;
7061   int off;
7062   offsetT maxnum;
7063   bfd_reloc_code_real_type r;
7064
7065   treg = (ip->insn_opcode >> 16) & 0x1f;
7066   dreg = (ip->insn_opcode >> 11) & 0x1f;
7067   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7068   mask = ip->insn_mo->mask;
7069
7070   expr1.X_op = O_constant;
7071   expr1.X_op_symbol = NULL;
7072   expr1.X_add_symbol = NULL;
7073   expr1.X_add_number = 1;
7074
7075   switch (mask)
7076     {
7077 #endif /* LOSING_COMPILER */
7078
7079     case M_DMUL:
7080       dbl = 1;
7081     case M_MUL:
7082       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7083       macro_build (NULL, "mflo", "d", dreg);
7084       break;
7085
7086     case M_DMUL_I:
7087       dbl = 1;
7088     case M_MUL_I:
7089       /* The MIPS assembler some times generates shifts and adds.  I'm
7090          not trying to be that fancy. GCC should do this for us
7091          anyway.  */
7092       used_at = 1;
7093       load_register (AT, &imm_expr, dbl);
7094       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7095       macro_build (NULL, "mflo", "d", dreg);
7096       break;
7097
7098     case M_DMULO_I:
7099       dbl = 1;
7100     case M_MULO_I:
7101       imm = 1;
7102       goto do_mulo;
7103
7104     case M_DMULO:
7105       dbl = 1;
7106     case M_MULO:
7107     do_mulo:
7108       start_noreorder ();
7109       used_at = 1;
7110       if (imm)
7111         load_register (AT, &imm_expr, dbl);
7112       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7113       macro_build (NULL, "mflo", "d", dreg);
7114       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7115       macro_build (NULL, "mfhi", "d", AT);
7116       if (mips_trap)
7117         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7118       else
7119         {
7120           expr1.X_add_number = 8;
7121           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7122           macro_build (NULL, "nop", "", 0);
7123           macro_build (NULL, "break", "c", 6);
7124         }
7125       end_noreorder ();
7126       macro_build (NULL, "mflo", "d", dreg);
7127       break;
7128
7129     case M_DMULOU_I:
7130       dbl = 1;
7131     case M_MULOU_I:
7132       imm = 1;
7133       goto do_mulou;
7134
7135     case M_DMULOU:
7136       dbl = 1;
7137     case M_MULOU:
7138     do_mulou:
7139       start_noreorder ();
7140       used_at = 1;
7141       if (imm)
7142         load_register (AT, &imm_expr, dbl);
7143       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7144                    sreg, imm ? AT : treg);
7145       macro_build (NULL, "mfhi", "d", AT);
7146       macro_build (NULL, "mflo", "d", dreg);
7147       if (mips_trap)
7148         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7149       else
7150         {
7151           expr1.X_add_number = 8;
7152           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7153           macro_build (NULL, "nop", "", 0);
7154           macro_build (NULL, "break", "c", 6);
7155         }
7156       end_noreorder ();
7157       break;
7158
7159     case M_DROL:
7160       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7161         {
7162           if (dreg == sreg)
7163             {
7164               tempreg = AT;
7165               used_at = 1;
7166             }
7167           else
7168             {
7169               tempreg = dreg;
7170             }
7171           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7172           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7173           break;
7174         }
7175       used_at = 1;
7176       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7177       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7178       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7179       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7180       break;
7181
7182     case M_ROL:
7183       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7184         {
7185           if (dreg == sreg)
7186             {
7187               tempreg = AT;
7188               used_at = 1;
7189             }
7190           else
7191             {
7192               tempreg = dreg;
7193             }
7194           macro_build (NULL, "negu", "d,w", tempreg, treg);
7195           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7196           break;
7197         }
7198       used_at = 1;
7199       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7200       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7201       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7202       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7203       break;
7204
7205     case M_DROL_I:
7206       {
7207         unsigned int rot;
7208         char *l, *r;
7209
7210         if (imm_expr.X_op != O_constant)
7211           as_bad (_("Improper rotate count"));
7212         rot = imm_expr.X_add_number & 0x3f;
7213         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7214           {
7215             rot = (64 - rot) & 0x3f;
7216             if (rot >= 32)
7217               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7218             else
7219               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7220             break;
7221           }
7222         if (rot == 0)
7223           {
7224             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7225             break;
7226           }
7227         l = (rot < 0x20) ? "dsll" : "dsll32";
7228         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7229         rot &= 0x1f;
7230         used_at = 1;
7231         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7232         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7233         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7234       }
7235       break;
7236
7237     case M_ROL_I:
7238       {
7239         unsigned int rot;
7240
7241         if (imm_expr.X_op != O_constant)
7242           as_bad (_("Improper rotate count"));
7243         rot = imm_expr.X_add_number & 0x1f;
7244         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7245           {
7246             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7247             break;
7248           }
7249         if (rot == 0)
7250           {
7251             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7252             break;
7253           }
7254         used_at = 1;
7255         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7256         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7257         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7258       }
7259       break;
7260
7261     case M_DROR:
7262       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7263         {
7264           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7265           break;
7266         }
7267       used_at = 1;
7268       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7269       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7270       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7271       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7272       break;
7273
7274     case M_ROR:
7275       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7276         {
7277           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7278           break;
7279         }
7280       used_at = 1;
7281       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7282       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7283       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7284       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7285       break;
7286
7287     case M_DROR_I:
7288       {
7289         unsigned int rot;
7290         char *l, *r;
7291
7292         if (imm_expr.X_op != O_constant)
7293           as_bad (_("Improper rotate count"));
7294         rot = imm_expr.X_add_number & 0x3f;
7295         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7296           {
7297             if (rot >= 32)
7298               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7299             else
7300               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7301             break;
7302           }
7303         if (rot == 0)
7304           {
7305             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7306             break;
7307           }
7308         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7309         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7310         rot &= 0x1f;
7311         used_at = 1;
7312         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7313         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7314         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7315       }
7316       break;
7317
7318     case M_ROR_I:
7319       {
7320         unsigned int rot;
7321
7322         if (imm_expr.X_op != O_constant)
7323           as_bad (_("Improper rotate count"));
7324         rot = imm_expr.X_add_number & 0x1f;
7325         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7326           {
7327             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7328             break;
7329           }
7330         if (rot == 0)
7331           {
7332             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7333             break;
7334           }
7335         used_at = 1;
7336         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7337         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7338         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7339       }
7340       break;
7341
7342     case M_S_DOB:
7343       if (mips_opts.arch == CPU_R4650)
7344         {
7345           as_bad (_("opcode not supported on this processor"));
7346           break;
7347         }
7348       assert (mips_opts.isa == ISA_MIPS1);
7349       /* Even on a big endian machine $fn comes before $fn+1.  We have
7350          to adjust when storing to memory.  */
7351       macro_build (&offset_expr, "swc1", "T,o(b)",
7352                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7353       offset_expr.X_add_number += 4;
7354       macro_build (&offset_expr, "swc1", "T,o(b)",
7355                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7356       break;
7357
7358     case M_SEQ:
7359       if (sreg == 0)
7360         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7361       else if (treg == 0)
7362         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7363       else
7364         {
7365           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7366           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7367         }
7368       break;
7369
7370     case M_SEQ_I:
7371       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7372         {
7373           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7374           break;
7375         }
7376       if (sreg == 0)
7377         {
7378           as_warn (_("Instruction %s: result is always false"),
7379                    ip->insn_mo->name);
7380           move_register (dreg, 0);
7381           break;
7382         }
7383       if (imm_expr.X_op == O_constant
7384           && imm_expr.X_add_number >= 0
7385           && imm_expr.X_add_number < 0x10000)
7386         {
7387           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7388         }
7389       else if (imm_expr.X_op == O_constant
7390                && imm_expr.X_add_number > -0x8000
7391                && imm_expr.X_add_number < 0)
7392         {
7393           imm_expr.X_add_number = -imm_expr.X_add_number;
7394           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7395                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7396         }
7397       else
7398         {
7399           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7400           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7401           used_at = 1;
7402         }
7403       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7404       break;
7405
7406     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7407       s = "slt";
7408       goto sge;
7409     case M_SGEU:
7410       s = "sltu";
7411     sge:
7412       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7413       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7414       break;
7415
7416     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7417     case M_SGEU_I:
7418       if (imm_expr.X_op == O_constant
7419           && imm_expr.X_add_number >= -0x8000
7420           && imm_expr.X_add_number < 0x8000)
7421         {
7422           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7423                        dreg, sreg, BFD_RELOC_LO16);
7424         }
7425       else
7426         {
7427           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7428           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7429                        dreg, sreg, AT);
7430           used_at = 1;
7431         }
7432       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7433       break;
7434
7435     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7436       s = "slt";
7437       goto sgt;
7438     case M_SGTU:
7439       s = "sltu";
7440     sgt:
7441       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7442       break;
7443
7444     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7445       s = "slt";
7446       goto sgti;
7447     case M_SGTU_I:
7448       s = "sltu";
7449     sgti:
7450       used_at = 1;
7451       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7452       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7453       break;
7454
7455     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7456       s = "slt";
7457       goto sle;
7458     case M_SLEU:
7459       s = "sltu";
7460     sle:
7461       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7462       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7463       break;
7464
7465     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7466       s = "slt";
7467       goto slei;
7468     case M_SLEU_I:
7469       s = "sltu";
7470     slei:
7471       used_at = 1;
7472       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7473       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7474       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7475       break;
7476
7477     case M_SLT_I:
7478       if (imm_expr.X_op == O_constant
7479           && imm_expr.X_add_number >= -0x8000
7480           && imm_expr.X_add_number < 0x8000)
7481         {
7482           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7483           break;
7484         }
7485       used_at = 1;
7486       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7487       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7488       break;
7489
7490     case M_SLTU_I:
7491       if (imm_expr.X_op == O_constant
7492           && imm_expr.X_add_number >= -0x8000
7493           && imm_expr.X_add_number < 0x8000)
7494         {
7495           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7496                        BFD_RELOC_LO16);
7497           break;
7498         }
7499       used_at = 1;
7500       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7501       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7502       break;
7503
7504     case M_SNE:
7505       if (sreg == 0)
7506         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7507       else if (treg == 0)
7508         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7509       else
7510         {
7511           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7512           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7513         }
7514       break;
7515
7516     case M_SNE_I:
7517       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7518         {
7519           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7520           break;
7521         }
7522       if (sreg == 0)
7523         {
7524           as_warn (_("Instruction %s: result is always true"),
7525                    ip->insn_mo->name);
7526           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7527                        dreg, 0, BFD_RELOC_LO16);
7528           break;
7529         }
7530       if (imm_expr.X_op == O_constant
7531           && imm_expr.X_add_number >= 0
7532           && imm_expr.X_add_number < 0x10000)
7533         {
7534           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7535         }
7536       else if (imm_expr.X_op == O_constant
7537                && imm_expr.X_add_number > -0x8000
7538                && imm_expr.X_add_number < 0)
7539         {
7540           imm_expr.X_add_number = -imm_expr.X_add_number;
7541           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7542                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7543         }
7544       else
7545         {
7546           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7547           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7548           used_at = 1;
7549         }
7550       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7551       break;
7552
7553     case M_DSUB_I:
7554       dbl = 1;
7555     case M_SUB_I:
7556       if (imm_expr.X_op == O_constant
7557           && imm_expr.X_add_number > -0x8000
7558           && imm_expr.X_add_number <= 0x8000)
7559         {
7560           imm_expr.X_add_number = -imm_expr.X_add_number;
7561           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7562                        dreg, sreg, BFD_RELOC_LO16);
7563           break;
7564         }
7565       used_at = 1;
7566       load_register (AT, &imm_expr, dbl);
7567       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7568       break;
7569
7570     case M_DSUBU_I:
7571       dbl = 1;
7572     case M_SUBU_I:
7573       if (imm_expr.X_op == O_constant
7574           && imm_expr.X_add_number > -0x8000
7575           && imm_expr.X_add_number <= 0x8000)
7576         {
7577           imm_expr.X_add_number = -imm_expr.X_add_number;
7578           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7579                        dreg, sreg, BFD_RELOC_LO16);
7580           break;
7581         }
7582       used_at = 1;
7583       load_register (AT, &imm_expr, dbl);
7584       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7585       break;
7586
7587     case M_TEQ_I:
7588       s = "teq";
7589       goto trap;
7590     case M_TGE_I:
7591       s = "tge";
7592       goto trap;
7593     case M_TGEU_I:
7594       s = "tgeu";
7595       goto trap;
7596     case M_TLT_I:
7597       s = "tlt";
7598       goto trap;
7599     case M_TLTU_I:
7600       s = "tltu";
7601       goto trap;
7602     case M_TNE_I:
7603       s = "tne";
7604     trap:
7605       used_at = 1;
7606       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7607       macro_build (NULL, s, "s,t", sreg, AT);
7608       break;
7609
7610     case M_TRUNCWS:
7611     case M_TRUNCWD:
7612       assert (mips_opts.isa == ISA_MIPS1);
7613       used_at = 1;
7614       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7615       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7616
7617       /*
7618        * Is the double cfc1 instruction a bug in the mips assembler;
7619        * or is there a reason for it?
7620        */
7621       start_noreorder ();
7622       macro_build (NULL, "cfc1", "t,G", treg, RA);
7623       macro_build (NULL, "cfc1", "t,G", treg, RA);
7624       macro_build (NULL, "nop", "");
7625       expr1.X_add_number = 3;
7626       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7627       expr1.X_add_number = 2;
7628       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7629       macro_build (NULL, "ctc1", "t,G", AT, RA);
7630       macro_build (NULL, "nop", "");
7631       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7632                    dreg, sreg);
7633       macro_build (NULL, "ctc1", "t,G", treg, RA);
7634       macro_build (NULL, "nop", "");
7635       end_noreorder ();
7636       break;
7637
7638     case M_ULH:
7639       s = "lb";
7640       goto ulh;
7641     case M_ULHU:
7642       s = "lbu";
7643     ulh:
7644       used_at = 1;
7645       if (offset_expr.X_add_number >= 0x7fff)
7646         as_bad (_("operand overflow"));
7647       if (! target_big_endian)
7648         ++offset_expr.X_add_number;
7649       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7650       if (! target_big_endian)
7651         --offset_expr.X_add_number;
7652       else
7653         ++offset_expr.X_add_number;
7654       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7655       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7656       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7657       break;
7658
7659     case M_ULD:
7660       s = "ldl";
7661       s2 = "ldr";
7662       off = 7;
7663       goto ulw;
7664     case M_ULW:
7665       s = "lwl";
7666       s2 = "lwr";
7667       off = 3;
7668     ulw:
7669       if (offset_expr.X_add_number >= 0x8000 - off)
7670         as_bad (_("operand overflow"));
7671       if (treg != breg)
7672         tempreg = treg;
7673       else
7674         {
7675           used_at = 1;
7676           tempreg = AT;
7677         }
7678       if (! target_big_endian)
7679         offset_expr.X_add_number += off;
7680       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7681       if (! target_big_endian)
7682         offset_expr.X_add_number -= off;
7683       else
7684         offset_expr.X_add_number += off;
7685       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7686
7687       /* If necessary, move the result in tempreg the final destination.  */
7688       if (treg == tempreg)
7689         break;
7690       /* Protect second load's delay slot.  */
7691       load_delay_nop ();
7692       move_register (treg, tempreg);
7693       break;
7694
7695     case M_ULD_A:
7696       s = "ldl";
7697       s2 = "ldr";
7698       off = 7;
7699       goto ulwa;
7700     case M_ULW_A:
7701       s = "lwl";
7702       s2 = "lwr";
7703       off = 3;
7704     ulwa:
7705       used_at = 1;
7706       load_address (AT, &offset_expr, &used_at);
7707       if (breg != 0)
7708         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7709       if (! target_big_endian)
7710         expr1.X_add_number = off;
7711       else
7712         expr1.X_add_number = 0;
7713       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7714       if (! target_big_endian)
7715         expr1.X_add_number = 0;
7716       else
7717         expr1.X_add_number = off;
7718       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7719       break;
7720
7721     case M_ULH_A:
7722     case M_ULHU_A:
7723       used_at = 1;
7724       load_address (AT, &offset_expr, &used_at);
7725       if (breg != 0)
7726         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7727       if (target_big_endian)
7728         expr1.X_add_number = 0;
7729       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7730                    treg, BFD_RELOC_LO16, AT);
7731       if (target_big_endian)
7732         expr1.X_add_number = 1;
7733       else
7734         expr1.X_add_number = 0;
7735       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7736       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7737       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7738       break;
7739
7740     case M_USH:
7741       used_at = 1;
7742       if (offset_expr.X_add_number >= 0x7fff)
7743         as_bad (_("operand overflow"));
7744       if (target_big_endian)
7745         ++offset_expr.X_add_number;
7746       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7747       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7748       if (target_big_endian)
7749         --offset_expr.X_add_number;
7750       else
7751         ++offset_expr.X_add_number;
7752       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7753       break;
7754
7755     case M_USD:
7756       s = "sdl";
7757       s2 = "sdr";
7758       off = 7;
7759       goto usw;
7760     case M_USW:
7761       s = "swl";
7762       s2 = "swr";
7763       off = 3;
7764     usw:
7765       if (offset_expr.X_add_number >= 0x8000 - off)
7766         as_bad (_("operand overflow"));
7767       if (! target_big_endian)
7768         offset_expr.X_add_number += off;
7769       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7770       if (! target_big_endian)
7771         offset_expr.X_add_number -= off;
7772       else
7773         offset_expr.X_add_number += off;
7774       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7775       break;
7776
7777     case M_USD_A:
7778       s = "sdl";
7779       s2 = "sdr";
7780       off = 7;
7781       goto uswa;
7782     case M_USW_A:
7783       s = "swl";
7784       s2 = "swr";
7785       off = 3;
7786     uswa:
7787       used_at = 1;
7788       load_address (AT, &offset_expr, &used_at);
7789       if (breg != 0)
7790         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7791       if (! target_big_endian)
7792         expr1.X_add_number = off;
7793       else
7794         expr1.X_add_number = 0;
7795       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7796       if (! target_big_endian)
7797         expr1.X_add_number = 0;
7798       else
7799         expr1.X_add_number = off;
7800       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7801       break;
7802
7803     case M_USH_A:
7804       used_at = 1;
7805       load_address (AT, &offset_expr, &used_at);
7806       if (breg != 0)
7807         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7808       if (! target_big_endian)
7809         expr1.X_add_number = 0;
7810       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7811       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7812       if (! target_big_endian)
7813         expr1.X_add_number = 1;
7814       else
7815         expr1.X_add_number = 0;
7816       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7817       if (! target_big_endian)
7818         expr1.X_add_number = 0;
7819       else
7820         expr1.X_add_number = 1;
7821       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7822       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7823       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7824       break;
7825
7826     default:
7827       /* FIXME: Check if this is one of the itbl macros, since they
7828          are added dynamically.  */
7829       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7830       break;
7831     }
7832   if (mips_opts.noat && used_at)
7833     as_bad (_("Macro used $at after \".set noat\""));
7834 }
7835
7836 /* Implement macros in mips16 mode.  */
7837
7838 static void
7839 mips16_macro (struct mips_cl_insn *ip)
7840 {
7841   int mask;
7842   int xreg, yreg, zreg, tmp;
7843   expressionS expr1;
7844   int dbl;
7845   const char *s, *s2, *s3;
7846
7847   mask = ip->insn_mo->mask;
7848
7849   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7850   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7851   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7852
7853   expr1.X_op = O_constant;
7854   expr1.X_op_symbol = NULL;
7855   expr1.X_add_symbol = NULL;
7856   expr1.X_add_number = 1;
7857
7858   dbl = 0;
7859
7860   switch (mask)
7861     {
7862     default:
7863       internalError ();
7864
7865     case M_DDIV_3:
7866       dbl = 1;
7867     case M_DIV_3:
7868       s = "mflo";
7869       goto do_div3;
7870     case M_DREM_3:
7871       dbl = 1;
7872     case M_REM_3:
7873       s = "mfhi";
7874     do_div3:
7875       start_noreorder ();
7876       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7877       expr1.X_add_number = 2;
7878       macro_build (&expr1, "bnez", "x,p", yreg);
7879       macro_build (NULL, "break", "6", 7);
7880
7881       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7882          since that causes an overflow.  We should do that as well,
7883          but I don't see how to do the comparisons without a temporary
7884          register.  */
7885       end_noreorder ();
7886       macro_build (NULL, s, "x", zreg);
7887       break;
7888
7889     case M_DIVU_3:
7890       s = "divu";
7891       s2 = "mflo";
7892       goto do_divu3;
7893     case M_REMU_3:
7894       s = "divu";
7895       s2 = "mfhi";
7896       goto do_divu3;
7897     case M_DDIVU_3:
7898       s = "ddivu";
7899       s2 = "mflo";
7900       goto do_divu3;
7901     case M_DREMU_3:
7902       s = "ddivu";
7903       s2 = "mfhi";
7904     do_divu3:
7905       start_noreorder ();
7906       macro_build (NULL, s, "0,x,y", xreg, yreg);
7907       expr1.X_add_number = 2;
7908       macro_build (&expr1, "bnez", "x,p", yreg);
7909       macro_build (NULL, "break", "6", 7);
7910       end_noreorder ();
7911       macro_build (NULL, s2, "x", zreg);
7912       break;
7913
7914     case M_DMUL:
7915       dbl = 1;
7916     case M_MUL:
7917       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7918       macro_build (NULL, "mflo", "x", zreg);
7919       break;
7920
7921     case M_DSUBU_I:
7922       dbl = 1;
7923       goto do_subu;
7924     case M_SUBU_I:
7925     do_subu:
7926       if (imm_expr.X_op != O_constant)
7927         as_bad (_("Unsupported large constant"));
7928       imm_expr.X_add_number = -imm_expr.X_add_number;
7929       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7930       break;
7931
7932     case M_SUBU_I_2:
7933       if (imm_expr.X_op != O_constant)
7934         as_bad (_("Unsupported large constant"));
7935       imm_expr.X_add_number = -imm_expr.X_add_number;
7936       macro_build (&imm_expr, "addiu", "x,k", xreg);
7937       break;
7938
7939     case M_DSUBU_I_2:
7940       if (imm_expr.X_op != O_constant)
7941         as_bad (_("Unsupported large constant"));
7942       imm_expr.X_add_number = -imm_expr.X_add_number;
7943       macro_build (&imm_expr, "daddiu", "y,j", yreg);
7944       break;
7945
7946     case M_BEQ:
7947       s = "cmp";
7948       s2 = "bteqz";
7949       goto do_branch;
7950     case M_BNE:
7951       s = "cmp";
7952       s2 = "btnez";
7953       goto do_branch;
7954     case M_BLT:
7955       s = "slt";
7956       s2 = "btnez";
7957       goto do_branch;
7958     case M_BLTU:
7959       s = "sltu";
7960       s2 = "btnez";
7961       goto do_branch;
7962     case M_BLE:
7963       s = "slt";
7964       s2 = "bteqz";
7965       goto do_reverse_branch;
7966     case M_BLEU:
7967       s = "sltu";
7968       s2 = "bteqz";
7969       goto do_reverse_branch;
7970     case M_BGE:
7971       s = "slt";
7972       s2 = "bteqz";
7973       goto do_branch;
7974     case M_BGEU:
7975       s = "sltu";
7976       s2 = "bteqz";
7977       goto do_branch;
7978     case M_BGT:
7979       s = "slt";
7980       s2 = "btnez";
7981       goto do_reverse_branch;
7982     case M_BGTU:
7983       s = "sltu";
7984       s2 = "btnez";
7985
7986     do_reverse_branch:
7987       tmp = xreg;
7988       xreg = yreg;
7989       yreg = tmp;
7990
7991     do_branch:
7992       macro_build (NULL, s, "x,y", xreg, yreg);
7993       macro_build (&offset_expr, s2, "p");
7994       break;
7995
7996     case M_BEQ_I:
7997       s = "cmpi";
7998       s2 = "bteqz";
7999       s3 = "x,U";
8000       goto do_branch_i;
8001     case M_BNE_I:
8002       s = "cmpi";
8003       s2 = "btnez";
8004       s3 = "x,U";
8005       goto do_branch_i;
8006     case M_BLT_I:
8007       s = "slti";
8008       s2 = "btnez";
8009       s3 = "x,8";
8010       goto do_branch_i;
8011     case M_BLTU_I:
8012       s = "sltiu";
8013       s2 = "btnez";
8014       s3 = "x,8";
8015       goto do_branch_i;
8016     case M_BLE_I:
8017       s = "slti";
8018       s2 = "btnez";
8019       s3 = "x,8";
8020       goto do_addone_branch_i;
8021     case M_BLEU_I:
8022       s = "sltiu";
8023       s2 = "btnez";
8024       s3 = "x,8";
8025       goto do_addone_branch_i;
8026     case M_BGE_I:
8027       s = "slti";
8028       s2 = "bteqz";
8029       s3 = "x,8";
8030       goto do_branch_i;
8031     case M_BGEU_I:
8032       s = "sltiu";
8033       s2 = "bteqz";
8034       s3 = "x,8";
8035       goto do_branch_i;
8036     case M_BGT_I:
8037       s = "slti";
8038       s2 = "bteqz";
8039       s3 = "x,8";
8040       goto do_addone_branch_i;
8041     case M_BGTU_I:
8042       s = "sltiu";
8043       s2 = "bteqz";
8044       s3 = "x,8";
8045
8046     do_addone_branch_i:
8047       if (imm_expr.X_op != O_constant)
8048         as_bad (_("Unsupported large constant"));
8049       ++imm_expr.X_add_number;
8050
8051     do_branch_i:
8052       macro_build (&imm_expr, s, s3, xreg);
8053       macro_build (&offset_expr, s2, "p");
8054       break;
8055
8056     case M_ABS:
8057       expr1.X_add_number = 0;
8058       macro_build (&expr1, "slti", "x,8", yreg);
8059       if (xreg != yreg)
8060         move_register (xreg, yreg);
8061       expr1.X_add_number = 2;
8062       macro_build (&expr1, "bteqz", "p");
8063       macro_build (NULL, "neg", "x,w", xreg, xreg);
8064     }
8065 }
8066
8067 /* For consistency checking, verify that all bits are specified either
8068    by the match/mask part of the instruction definition, or by the
8069    operand list.  */
8070 static int
8071 validate_mips_insn (const struct mips_opcode *opc)
8072 {
8073   const char *p = opc->args;
8074   char c;
8075   unsigned long used_bits = opc->mask;
8076
8077   if ((used_bits & opc->match) != opc->match)
8078     {
8079       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8080               opc->name, opc->args);
8081       return 0;
8082     }
8083 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8084   while (*p)
8085     switch (c = *p++)
8086       {
8087       case ',': break;
8088       case '(': break;
8089       case ')': break;
8090       case '+':
8091         switch (c = *p++)
8092           {
8093           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8094           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8095           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8096           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8097           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8098           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8099           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8100           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8101                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8102           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8103           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8104           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8105           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8106           case 'I': break;
8107           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8108           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8109                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8110           default:
8111             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8112                     c, opc->name, opc->args);
8113             return 0;
8114           }
8115         break;
8116       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8117       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8118       case 'A': break;
8119       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8120       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8121       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8122       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8123       case 'F': break;
8124       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8125       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8126       case 'I': break;
8127       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8128       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8129       case 'L': break;
8130       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8131       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8132       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8133       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8134                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8135       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8136       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8137       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8138       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8139       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8140       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8141       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8142       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8143       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8144       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8145       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8146       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8147       case 'f': break;
8148       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8149       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8150       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8151       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8152       case 'l': break;
8153       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8154       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8155       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8156       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8157       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8158       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8159       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8160       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8161       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8162       case 'x': break;
8163       case 'z': break;
8164       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8165       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8166                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8167       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8168       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8169       case '[': break;
8170       case ']': break;
8171       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8172       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8173       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8174       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8175       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8176       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8177       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8178       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8179       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8180       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8181       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8182       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8183       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8184       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8185       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8186       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8187       default:
8188         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8189                 c, opc->name, opc->args);
8190         return 0;
8191       }
8192 #undef USE_BITS
8193   if (used_bits != 0xffffffff)
8194     {
8195       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8196               ~used_bits & 0xffffffff, opc->name, opc->args);
8197       return 0;
8198     }
8199   return 1;
8200 }
8201
8202 /* UDI immediates.  */
8203 struct mips_immed {
8204   char          type;
8205   unsigned int  shift;
8206   unsigned long mask;
8207   const char *  desc;
8208 };
8209
8210 static const struct mips_immed mips_immed[] = {
8211   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8212   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8213   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8214   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8215   { 0,0,0,0 }
8216 };
8217
8218 /* Check whether an odd floating-point register is allowed.  */
8219 static int
8220 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8221 {
8222   const char *s = insn->name;
8223
8224   if (insn->pinfo == INSN_MACRO)
8225     /* Let a macro pass, we'll catch it later when it is expanded.  */
8226     return 1;
8227
8228   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8229     {
8230       /* Allow odd registers for single-precision ops.  */
8231       switch (insn->pinfo & (FP_S | FP_D))
8232         {
8233         case FP_S:
8234         case 0:
8235           return 1;     /* both single precision - ok */
8236         case FP_D:
8237           return 0;     /* both double precision - fail */
8238         default:
8239           break;
8240         }
8241
8242       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8243       s = strchr (insn->name, '.');
8244       if (argnum == 2)
8245         s = s != NULL ? strchr (s + 1, '.') : NULL;
8246       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8247     } 
8248
8249   /* Single-precision coprocessor loads and moves are OK too.  */
8250   if ((insn->pinfo & FP_S)
8251       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8252                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8253     return 1;
8254
8255   return 0;
8256 }
8257
8258 /* This routine assembles an instruction into its binary format.  As a
8259    side effect, it sets one of the global variables imm_reloc or
8260    offset_reloc to the type of relocation to do if one of the operands
8261    is an address expression.  */
8262
8263 static void
8264 mips_ip (char *str, struct mips_cl_insn *ip)
8265 {
8266   char *s;
8267   const char *args;
8268   char c = 0;
8269   struct mips_opcode *insn;
8270   char *argsStart;
8271   unsigned int regno;
8272   unsigned int lastregno = 0;
8273   unsigned int lastpos = 0;
8274   unsigned int limlo, limhi;
8275   char *s_reset;
8276   char save_c = 0;
8277   offsetT min_range, max_range;
8278   int argnum;
8279   unsigned int rtype;
8280
8281   insn_error = NULL;
8282
8283   /* If the instruction contains a '.', we first try to match an instruction
8284      including the '.'.  Then we try again without the '.'.  */
8285   insn = NULL;
8286   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8287     continue;
8288
8289   /* If we stopped on whitespace, then replace the whitespace with null for
8290      the call to hash_find.  Save the character we replaced just in case we
8291      have to re-parse the instruction.  */
8292   if (ISSPACE (*s))
8293     {
8294       save_c = *s;
8295       *s++ = '\0';
8296     }
8297
8298   insn = (struct mips_opcode *) hash_find (op_hash, str);
8299
8300   /* If we didn't find the instruction in the opcode table, try again, but
8301      this time with just the instruction up to, but not including the
8302      first '.'.  */
8303   if (insn == NULL)
8304     {
8305       /* Restore the character we overwrite above (if any).  */
8306       if (save_c)
8307         *(--s) = save_c;
8308
8309       /* Scan up to the first '.' or whitespace.  */
8310       for (s = str;
8311            *s != '\0' && *s != '.' && !ISSPACE (*s);
8312            ++s)
8313         continue;
8314
8315       /* If we did not find a '.', then we can quit now.  */
8316       if (*s != '.')
8317         {
8318           insn_error = "unrecognized opcode";
8319           return;
8320         }
8321
8322       /* Lookup the instruction in the hash table.  */
8323       *s++ = '\0';
8324       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8325         {
8326           insn_error = "unrecognized opcode";
8327           return;
8328         }
8329     }
8330
8331   argsStart = s;
8332   for (;;)
8333     {
8334       bfd_boolean ok;
8335
8336       assert (strcmp (insn->name, str) == 0);
8337
8338       if (OPCODE_IS_MEMBER (insn,
8339                             (mips_opts.isa
8340                              /* We don't check for mips_opts.mips16 here since
8341                                 we want to allow jalx if -mips16 was specified
8342                                 on the command line.  */
8343                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8344                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8345                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8346                              | (mips_opts.ase_mt ? INSN_MT : 0)
8347                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8348                              | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8349                             mips_opts.arch))
8350         ok = TRUE;
8351       else
8352         ok = FALSE;
8353
8354       if (insn->pinfo != INSN_MACRO)
8355         {
8356           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8357             ok = FALSE;
8358         }
8359
8360       if (! ok)
8361         {
8362           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8363               && strcmp (insn->name, insn[1].name) == 0)
8364             {
8365               ++insn;
8366               continue;
8367             }
8368           else
8369             {
8370               if (!insn_error)
8371                 {
8372                   static char buf[100];
8373                   sprintf (buf,
8374                            _("opcode not supported on this processor: %s (%s)"),
8375                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8376                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8377                   insn_error = buf;
8378                 }
8379               if (save_c)
8380                 *(--s) = save_c;
8381               return;
8382             }
8383         }
8384
8385       create_insn (ip, insn);
8386       insn_error = NULL;
8387       argnum = 1;
8388       for (args = insn->args;; ++args)
8389         {
8390           int is_mdmx;
8391
8392           s += strspn (s, " \t");
8393           is_mdmx = 0;
8394           switch (*args)
8395             {
8396             case '\0':          /* end of args */
8397               if (*s == '\0')
8398                 return;
8399               break;
8400
8401             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8402               my_getExpression (&imm_expr, s);
8403               check_absolute_expr (ip, &imm_expr);
8404               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8405                 {
8406                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8407                            OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8408                   imm_expr.X_add_number &= OP_MASK_SA3;
8409                 }
8410               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA3;
8411               imm_expr.X_op = O_absent;
8412               s = expr_end;
8413               continue;
8414
8415             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8416               my_getExpression (&imm_expr, s);
8417               check_absolute_expr (ip, &imm_expr);
8418               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8419                 {
8420                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8421                            OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8422                   imm_expr.X_add_number &= OP_MASK_SA4;
8423                 }
8424               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA4;
8425               imm_expr.X_op = O_absent;
8426               s = expr_end;
8427               continue;
8428
8429             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8430               my_getExpression (&imm_expr, s);
8431               check_absolute_expr (ip, &imm_expr);
8432               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8433                 {
8434                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8435                            OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8436                   imm_expr.X_add_number &= OP_MASK_IMM8;
8437                 }
8438               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_IMM8;
8439               imm_expr.X_op = O_absent;
8440               s = expr_end;
8441               continue;
8442
8443             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8444               my_getExpression (&imm_expr, s);
8445               check_absolute_expr (ip, &imm_expr);
8446               if (imm_expr.X_add_number & ~OP_MASK_RS)
8447                 {
8448                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8449                            OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8450                   imm_expr.X_add_number &= OP_MASK_RS;
8451                 }
8452               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RS;
8453               imm_expr.X_op = O_absent;
8454               s = expr_end;
8455               continue;
8456
8457             case '7': /* four dsp accumulators in bits 11,12 */ 
8458               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8459                   s[3] >= '0' && s[3] <= '3')
8460                 {
8461                   regno = s[3] - '0';
8462                   s += 4;
8463                   ip->insn_opcode |= regno << OP_SH_DSPACC;
8464                   continue;
8465                 }
8466               else
8467                 as_bad (_("Invalid dsp acc register"));
8468               break;
8469
8470             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8471               my_getExpression (&imm_expr, s);
8472               check_absolute_expr (ip, &imm_expr);
8473               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8474                 {
8475                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8476                            OP_MASK_WRDSP,
8477                            (unsigned long) imm_expr.X_add_number);
8478                   imm_expr.X_add_number &= OP_MASK_WRDSP;
8479                 }
8480               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_WRDSP;
8481               imm_expr.X_op = O_absent;
8482               s = expr_end;
8483               continue;
8484
8485             case '9': /* four dsp accumulators in bits 21,22 */
8486               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8487                   s[3] >= '0' && s[3] <= '3')
8488                 {
8489                   regno = s[3] - '0';
8490                   s += 4;
8491                   ip->insn_opcode |= regno << OP_SH_DSPACC_S;
8492                   continue;
8493                 }
8494               else
8495                 as_bad (_("Invalid dsp acc register"));
8496               break;
8497
8498             case '0': /* dsp 6-bit signed immediate in bit 20 */
8499               my_getExpression (&imm_expr, s);
8500               check_absolute_expr (ip, &imm_expr);
8501               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8502               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8503               if (imm_expr.X_add_number < min_range ||
8504                   imm_expr.X_add_number > max_range)
8505                 {
8506                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8507                            (long) min_range, (long) max_range,
8508                            (long) imm_expr.X_add_number);
8509                 }
8510               imm_expr.X_add_number &= OP_MASK_DSPSFT;
8511               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8512                                   << OP_SH_DSPSFT);
8513               imm_expr.X_op = O_absent;
8514               s = expr_end;
8515               continue;
8516
8517             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8518               my_getExpression (&imm_expr, s);
8519               check_absolute_expr (ip, &imm_expr);
8520               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8521                 {
8522                   as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8523                            OP_MASK_RDDSP,
8524                            (unsigned long) imm_expr.X_add_number);
8525                   imm_expr.X_add_number &= OP_MASK_RDDSP;
8526                 }
8527               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RDDSP;
8528               imm_expr.X_op = O_absent;
8529               s = expr_end;
8530               continue;
8531
8532             case ':': /* dsp 7-bit signed immediate in bit 19 */
8533               my_getExpression (&imm_expr, s);
8534               check_absolute_expr (ip, &imm_expr);
8535               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8536               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8537               if (imm_expr.X_add_number < min_range ||
8538                   imm_expr.X_add_number > max_range)
8539                 {
8540                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8541                            (long) min_range, (long) max_range,
8542                            (long) imm_expr.X_add_number);
8543                 }
8544               imm_expr.X_add_number &= OP_MASK_DSPSFT_7;
8545               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8546                                   << OP_SH_DSPSFT_7);
8547               imm_expr.X_op = O_absent;
8548               s = expr_end;
8549               continue;
8550
8551             case '@': /* dsp 10-bit signed immediate in bit 16 */
8552               my_getExpression (&imm_expr, s);
8553               check_absolute_expr (ip, &imm_expr);
8554               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8555               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8556               if (imm_expr.X_add_number < min_range ||
8557                   imm_expr.X_add_number > max_range)
8558                 {
8559                   as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8560                            (long) min_range, (long) max_range,
8561                            (long) imm_expr.X_add_number);
8562                 }
8563               imm_expr.X_add_number &= OP_MASK_IMM10;
8564               ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8565                                   << OP_SH_IMM10);
8566               imm_expr.X_op = O_absent;
8567               s = expr_end;
8568               continue;
8569
8570             case '!': /* mt 1-bit unsigned immediate in bit 5 */
8571               my_getExpression (&imm_expr, s);
8572               check_absolute_expr (ip, &imm_expr);
8573               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8574                 {
8575                   as_warn (_("MT immediate not in range 0..%d (%lu)"),
8576                            OP_MASK_MT_U, (unsigned long) imm_expr.X_add_number);
8577                   imm_expr.X_add_number &= OP_MASK_MT_U;
8578                 }
8579               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_U;
8580               imm_expr.X_op = O_absent;
8581               s = expr_end;
8582               continue;
8583
8584             case '$': /* mt 1-bit unsigned immediate in bit 4 */
8585               my_getExpression (&imm_expr, s);
8586               check_absolute_expr (ip, &imm_expr);
8587               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8588                 {
8589                   as_warn (_("MT immediate not in range 0..%d (%lu)"),
8590                            OP_MASK_MT_H, (unsigned long) imm_expr.X_add_number);
8591                   imm_expr.X_add_number &= OP_MASK_MT_H;
8592                 }
8593               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_H;
8594               imm_expr.X_op = O_absent;
8595               s = expr_end;
8596               continue;
8597
8598             case '*': /* four dsp accumulators in bits 18,19 */ 
8599               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8600                   s[3] >= '0' && s[3] <= '3')
8601                 {
8602                   regno = s[3] - '0';
8603                   s += 4;
8604                   ip->insn_opcode |= regno << OP_SH_MTACC_T;
8605                   continue;
8606                 }
8607               else
8608                 as_bad (_("Invalid dsp/smartmips acc register"));
8609               break;
8610
8611             case '&': /* four dsp accumulators in bits 13,14 */ 
8612               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8613                   s[3] >= '0' && s[3] <= '3')
8614                 {
8615                   regno = s[3] - '0';
8616                   s += 4;
8617                   ip->insn_opcode |= regno << OP_SH_MTACC_D;
8618                   continue;
8619                 }
8620               else
8621                 as_bad (_("Invalid dsp/smartmips acc register"));
8622               break;
8623
8624             case ',':
8625               if (*s++ == *args)
8626                 continue;
8627               s--;
8628               switch (*++args)
8629                 {
8630                 case 'r':
8631                 case 'v':
8632                   INSERT_OPERAND (RS, *ip, lastregno);
8633                   continue;
8634
8635                 case 'w':
8636                   INSERT_OPERAND (RT, *ip, lastregno);
8637                   continue;
8638
8639                 case 'W':
8640                   INSERT_OPERAND (FT, *ip, lastregno);
8641                   continue;
8642
8643                 case 'V':
8644                   INSERT_OPERAND (FS, *ip, lastregno);
8645                   continue;
8646                 }
8647               break;
8648
8649             case '(':
8650               /* Handle optional base register.
8651                  Either the base register is omitted or
8652                  we must have a left paren.  */
8653               /* This is dependent on the next operand specifier
8654                  is a base register specification.  */
8655               assert (args[1] == 'b' || args[1] == '5'
8656                       || args[1] == '-' || args[1] == '4');
8657               if (*s == '\0')
8658                 return;
8659
8660             case ')':           /* these must match exactly */
8661             case '[':
8662             case ']':
8663               if (*s++ == *args)
8664                 continue;
8665               break;
8666
8667             case '+':           /* Opcode extension character.  */
8668               switch (*++args)
8669                 {
8670                 case '1':       /* UDI immediates.  */
8671                 case '2':
8672                 case '3':
8673                 case '4':
8674                   {
8675                     const struct mips_immed *imm = mips_immed;
8676
8677                     while (imm->type && imm->type != *args)
8678                       ++imm;
8679                     if (! imm->type)
8680                       internalError ();
8681                     my_getExpression (&imm_expr, s);
8682                     check_absolute_expr (ip, &imm_expr);
8683                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8684                       {
8685                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8686                                  imm->desc ? imm->desc : ip->insn_mo->name,
8687                                  (unsigned long) imm_expr.X_add_number,
8688                                  (unsigned long) imm_expr.X_add_number);
8689                               imm_expr.X_add_number &= imm->mask;
8690                       }
8691                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8692                                         << imm->shift);
8693                     imm_expr.X_op = O_absent;
8694                     s = expr_end;
8695                   }
8696                   continue;
8697                   
8698                 case 'A':               /* ins/ext position, becomes LSB.  */
8699                   limlo = 0;
8700                   limhi = 31;
8701                   goto do_lsb;
8702                 case 'E':
8703                   limlo = 32;
8704                   limhi = 63;
8705                   goto do_lsb;
8706 do_lsb:
8707                   my_getExpression (&imm_expr, s);
8708                   check_absolute_expr (ip, &imm_expr);
8709                   if ((unsigned long) imm_expr.X_add_number < limlo
8710                       || (unsigned long) imm_expr.X_add_number > limhi)
8711                     {
8712                       as_bad (_("Improper position (%lu)"),
8713                               (unsigned long) imm_expr.X_add_number);
8714                       imm_expr.X_add_number = limlo;
8715                     }
8716                   lastpos = imm_expr.X_add_number;
8717                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8718                   imm_expr.X_op = O_absent;
8719                   s = expr_end;
8720                   continue;
8721
8722                 case 'B':               /* ins size, becomes MSB.  */
8723                   limlo = 1;
8724                   limhi = 32;
8725                   goto do_msb;
8726                 case 'F':
8727                   limlo = 33;
8728                   limhi = 64;
8729                   goto do_msb;
8730 do_msb:
8731                   my_getExpression (&imm_expr, s);
8732                   check_absolute_expr (ip, &imm_expr);
8733                   /* Check for negative input so that small negative numbers
8734                      will not succeed incorrectly.  The checks against
8735                      (pos+size) transitively check "size" itself,
8736                      assuming that "pos" is reasonable.  */
8737                   if ((long) imm_expr.X_add_number < 0
8738                       || ((unsigned long) imm_expr.X_add_number
8739                           + lastpos) < limlo
8740                       || ((unsigned long) imm_expr.X_add_number
8741                           + lastpos) > limhi)
8742                     {
8743                       as_bad (_("Improper insert size (%lu, position %lu)"),
8744                               (unsigned long) imm_expr.X_add_number,
8745                               (unsigned long) lastpos);
8746                       imm_expr.X_add_number = limlo - lastpos;
8747                     }
8748                   INSERT_OPERAND (INSMSB, *ip,
8749                                  lastpos + imm_expr.X_add_number - 1);
8750                   imm_expr.X_op = O_absent;
8751                   s = expr_end;
8752                   continue;
8753
8754                 case 'C':               /* ext size, becomes MSBD.  */
8755                   limlo = 1;
8756                   limhi = 32;
8757                   goto do_msbd;
8758                 case 'G':
8759                   limlo = 33;
8760                   limhi = 64;
8761                   goto do_msbd;
8762                 case 'H':
8763                   limlo = 33;
8764                   limhi = 64;
8765                   goto do_msbd;
8766 do_msbd:
8767                   my_getExpression (&imm_expr, s);
8768                   check_absolute_expr (ip, &imm_expr);
8769                   /* Check for negative input so that small negative numbers
8770                      will not succeed incorrectly.  The checks against
8771                      (pos+size) transitively check "size" itself,
8772                      assuming that "pos" is reasonable.  */
8773                   if ((long) imm_expr.X_add_number < 0
8774                       || ((unsigned long) imm_expr.X_add_number
8775                           + lastpos) < limlo
8776                       || ((unsigned long) imm_expr.X_add_number
8777                           + lastpos) > limhi)
8778                     {
8779                       as_bad (_("Improper extract size (%lu, position %lu)"),
8780                               (unsigned long) imm_expr.X_add_number,
8781                               (unsigned long) lastpos);
8782                       imm_expr.X_add_number = limlo - lastpos;
8783                     }
8784                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8785                   imm_expr.X_op = O_absent;
8786                   s = expr_end;
8787                   continue;
8788
8789                 case 'D':
8790                   /* +D is for disassembly only; never match.  */
8791                   break;
8792
8793                 case 'I':
8794                   /* "+I" is like "I", except that imm2_expr is used.  */
8795                   my_getExpression (&imm2_expr, s);
8796                   if (imm2_expr.X_op != O_big
8797                       && imm2_expr.X_op != O_constant)
8798                   insn_error = _("absolute expression required");
8799                   if (HAVE_32BIT_GPRS)
8800                     normalize_constant_expr (&imm2_expr);
8801                   s = expr_end;
8802                   continue;
8803
8804                 case 'T': /* Coprocessor register.  */
8805                   /* +T is for disassembly only; never match.  */
8806                   break;
8807
8808                 case 't': /* Coprocessor register number.  */
8809                   if (s[0] == '$' && ISDIGIT (s[1]))
8810                     {
8811                       ++s;
8812                       regno = 0;
8813                       do
8814                         {
8815                           regno *= 10;
8816                           regno += *s - '0';
8817                           ++s;
8818                         }
8819                       while (ISDIGIT (*s));
8820                       if (regno > 31)
8821                         as_bad (_("Invalid register number (%d)"), regno);
8822                       else
8823                         {
8824                           ip->insn_opcode |= regno << OP_SH_RT;
8825                           continue;
8826                         }
8827                     }
8828                   else
8829                     as_bad (_("Invalid coprocessor 0 register number"));
8830                   break;
8831
8832                 default:
8833                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8834                     *args, insn->name, insn->args);
8835                   /* Further processing is fruitless.  */
8836                   return;
8837                 }
8838               break;
8839
8840             case '<':           /* must be at least one digit */
8841               /*
8842                * According to the manual, if the shift amount is greater
8843                * than 31 or less than 0, then the shift amount should be
8844                * mod 32.  In reality the mips assembler issues an error.
8845                * We issue a warning and mask out all but the low 5 bits.
8846                */
8847               my_getExpression (&imm_expr, s);
8848               check_absolute_expr (ip, &imm_expr);
8849               if ((unsigned long) imm_expr.X_add_number > 31)
8850                 as_warn (_("Improper shift amount (%lu)"),
8851                          (unsigned long) imm_expr.X_add_number);
8852               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8853               imm_expr.X_op = O_absent;
8854               s = expr_end;
8855               continue;
8856
8857             case '>':           /* shift amount minus 32 */
8858               my_getExpression (&imm_expr, s);
8859               check_absolute_expr (ip, &imm_expr);
8860               if ((unsigned long) imm_expr.X_add_number < 32
8861                   || (unsigned long) imm_expr.X_add_number > 63)
8862                 break;
8863               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8864               imm_expr.X_op = O_absent;
8865               s = expr_end;
8866               continue;
8867
8868             case 'k':           /* cache code */
8869             case 'h':           /* prefx code */
8870               my_getExpression (&imm_expr, s);
8871               check_absolute_expr (ip, &imm_expr);
8872               if ((unsigned long) imm_expr.X_add_number > 31)
8873                 as_warn (_("Invalid value for `%s' (%lu)"),
8874                          ip->insn_mo->name,
8875                          (unsigned long) imm_expr.X_add_number);
8876               if (*args == 'k')
8877                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8878               else
8879                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8880               imm_expr.X_op = O_absent;
8881               s = expr_end;
8882               continue;
8883
8884             case 'c':           /* break code */
8885               my_getExpression (&imm_expr, s);
8886               check_absolute_expr (ip, &imm_expr);
8887               if ((unsigned long) imm_expr.X_add_number > 1023)
8888                 as_warn (_("Illegal break code (%lu)"),
8889                          (unsigned long) imm_expr.X_add_number);
8890               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
8891               imm_expr.X_op = O_absent;
8892               s = expr_end;
8893               continue;
8894
8895             case 'q':           /* lower break code */
8896               my_getExpression (&imm_expr, s);
8897               check_absolute_expr (ip, &imm_expr);
8898               if ((unsigned long) imm_expr.X_add_number > 1023)
8899                 as_warn (_("Illegal lower break code (%lu)"),
8900                          (unsigned long) imm_expr.X_add_number);
8901               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
8902               imm_expr.X_op = O_absent;
8903               s = expr_end;
8904               continue;
8905
8906             case 'B':           /* 20-bit syscall/break code.  */
8907               my_getExpression (&imm_expr, s);
8908               check_absolute_expr (ip, &imm_expr);
8909               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8910                 as_warn (_("Illegal 20-bit code (%lu)"),
8911                          (unsigned long) imm_expr.X_add_number);
8912               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
8913               imm_expr.X_op = O_absent;
8914               s = expr_end;
8915               continue;
8916
8917             case 'C':           /* Coprocessor code */
8918               my_getExpression (&imm_expr, s);
8919               check_absolute_expr (ip, &imm_expr);
8920               if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8921                 {
8922                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
8923                            (unsigned long) imm_expr.X_add_number);
8924                   imm_expr.X_add_number &= ((1 << 25) - 1);
8925                 }
8926               ip->insn_opcode |= imm_expr.X_add_number;
8927               imm_expr.X_op = O_absent;
8928               s = expr_end;
8929               continue;
8930
8931             case 'J':           /* 19-bit wait code.  */
8932               my_getExpression (&imm_expr, s);
8933               check_absolute_expr (ip, &imm_expr);
8934               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8935                 as_warn (_("Illegal 19-bit code (%lu)"),
8936                          (unsigned long) imm_expr.X_add_number);
8937               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
8938               imm_expr.X_op = O_absent;
8939               s = expr_end;
8940               continue;
8941
8942             case 'P':           /* Performance register.  */
8943               my_getExpression (&imm_expr, s);
8944               check_absolute_expr (ip, &imm_expr);
8945               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8946                 as_warn (_("Invalid performance register (%lu)"),
8947                          (unsigned long) imm_expr.X_add_number);
8948               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
8949               imm_expr.X_op = O_absent;
8950               s = expr_end;
8951               continue;
8952
8953             case 'G':           /* Coprocessor destination register.  */
8954               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
8955                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
8956               else
8957                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
8958               ip->insn_opcode |= regno << OP_SH_RD;
8959               if (ok) 
8960                 {
8961                   lastregno = regno;
8962                   continue;
8963                 }
8964               else
8965                 break;
8966
8967             case 'b':           /* base register */
8968             case 'd':           /* destination register */
8969             case 's':           /* source register */
8970             case 't':           /* target register */
8971             case 'r':           /* both target and source */
8972             case 'v':           /* both dest and source */
8973             case 'w':           /* both dest and target */
8974             case 'E':           /* coprocessor target register */
8975             case 'K':           /* 'rdhwr' destination register */
8976             case 'x':           /* ignore register name */
8977             case 'z':           /* must be zero register */
8978             case 'U':           /* destination register (clo/clz).  */
8979             case 'g':           /* coprocessor destination register */
8980               s_reset = s;            
8981               if (*args == 'E' || *args == 'K')
8982                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
8983               else
8984                 {
8985                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
8986                   if (regno == AT && ! mips_opts.noat)
8987                     as_warn ("Used $at without \".set noat\"");
8988                 }
8989               if (ok)
8990                 {
8991                   c = *args;
8992                   if (*s == ' ')
8993                     ++s;
8994                   if (args[1] != *s)
8995                     {
8996                       if (c == 'r' || c == 'v' || c == 'w')
8997                         {
8998                           regno = lastregno;
8999                           s = s_reset;
9000                           ++args;
9001                         }
9002                     }
9003                   /* 'z' only matches $0.  */
9004                   if (c == 'z' && regno != 0)
9005                     break;
9006
9007         /* Now that we have assembled one operand, we use the args string
9008          * to figure out where it goes in the instruction.  */
9009                   switch (c)
9010                     {
9011                     case 'r':
9012                     case 's':
9013                     case 'v':
9014                     case 'b':
9015                       INSERT_OPERAND (RS, *ip, regno);
9016                       break;
9017                     case 'd':
9018                     case 'G':
9019                     case 'K':
9020                     case 'g':
9021                       INSERT_OPERAND (RD, *ip, regno);
9022                       break;
9023                     case 'U':
9024                       INSERT_OPERAND (RD, *ip, regno);
9025                       INSERT_OPERAND (RT, *ip, regno);
9026                       break;
9027                     case 'w':
9028                     case 't':
9029                     case 'E':
9030                       INSERT_OPERAND (RT, *ip, regno);
9031                       break;
9032                     case 'x':
9033                       /* This case exists because on the r3000 trunc
9034                          expands into a macro which requires a gp
9035                          register.  On the r6000 or r4000 it is
9036                          assembled into a single instruction which
9037                          ignores the register.  Thus the insn version
9038                          is MIPS_ISA2 and uses 'x', and the macro
9039                          version is MIPS_ISA1 and uses 't'.  */
9040                       break;
9041                     case 'z':
9042                       /* This case is for the div instruction, which
9043                          acts differently if the destination argument
9044                          is $0.  This only matches $0, and is checked
9045                          outside the switch.  */
9046                       break;
9047                     case 'D':
9048                       /* Itbl operand; not yet implemented. FIXME ?? */
9049                       break;
9050                       /* What about all other operands like 'i', which
9051                          can be specified in the opcode table? */
9052                     }
9053                   lastregno = regno;
9054                   continue;
9055                 }
9056               switch (*args++)
9057                 {
9058                 case 'r':
9059                 case 'v':
9060                   INSERT_OPERAND (RS, *ip, lastregno);
9061                   continue;
9062                 case 'w':
9063                   INSERT_OPERAND (RT, *ip, lastregno);
9064                   continue;
9065                 }
9066               break;
9067
9068             case 'O':           /* MDMX alignment immediate constant.  */
9069               my_getExpression (&imm_expr, s);
9070               check_absolute_expr (ip, &imm_expr);
9071               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9072                 as_warn ("Improper align amount (%ld), using low bits",
9073                          (long) imm_expr.X_add_number);
9074               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9075               imm_expr.X_op = O_absent;
9076               s = expr_end;
9077               continue;
9078
9079             case 'Q':           /* MDMX vector, element sel, or const.  */
9080               if (s[0] != '$')
9081                 {
9082                   /* MDMX Immediate.  */
9083                   my_getExpression (&imm_expr, s);
9084                   check_absolute_expr (ip, &imm_expr);
9085                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9086                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9087                              (long) imm_expr.X_add_number);
9088                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9089                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9090                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9091                   else
9092                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9093                   imm_expr.X_op = O_absent;
9094                   s = expr_end;
9095                   continue;
9096                 }
9097               /* Not MDMX Immediate.  Fall through.  */
9098             case 'X':           /* MDMX destination register.  */
9099             case 'Y':           /* MDMX source register.  */
9100             case 'Z':           /* MDMX target register.  */
9101               is_mdmx = 1;
9102             case 'D':           /* floating point destination register */
9103             case 'S':           /* floating point source register */
9104             case 'T':           /* floating point target register */
9105             case 'R':           /* floating point source register */
9106             case 'V':
9107             case 'W':
9108               rtype = RTYPE_FPU;
9109               if (is_mdmx
9110                   || (mips_opts.ase_mdmx
9111                       && (ip->insn_mo->pinfo & FP_D)
9112                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9113                                                 | INSN_COPROC_MEMORY_DELAY
9114                                                 | INSN_LOAD_COPROC_DELAY
9115                                                 | INSN_LOAD_MEMORY_DELAY
9116                                                 | INSN_STORE_MEMORY))))
9117                 rtype |= RTYPE_VEC;
9118               s_reset = s;
9119               if (reg_lookup (&s, rtype, &regno))
9120                 {
9121                   if ((regno & 1) != 0
9122                       && HAVE_32BIT_FPRS
9123                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9124                     as_warn (_("Float register should be even, was %d"),
9125                              regno);
9126
9127                   c = *args;
9128                   if (*s == ' ')
9129                     ++s;
9130                   if (args[1] != *s)
9131                     {
9132                       if (c == 'V' || c == 'W')
9133                         {
9134                           regno = lastregno;
9135                           s = s_reset;
9136                           ++args;
9137                         }
9138                     }
9139                   switch (c)
9140                     {
9141                     case 'D':
9142                     case 'X':
9143                       INSERT_OPERAND (FD, *ip, regno);
9144                       break;
9145                     case 'V':
9146                     case 'S':
9147                     case 'Y':
9148                       INSERT_OPERAND (FS, *ip, regno);
9149                       break;
9150                     case 'Q':
9151                       /* This is like 'Z', but also needs to fix the MDMX
9152                          vector/scalar select bits.  Note that the
9153                          scalar immediate case is handled above.  */
9154                       if (*s == '[')
9155                         {
9156                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9157                           int max_el = (is_qh ? 3 : 7);
9158                           s++;
9159                           my_getExpression(&imm_expr, s);
9160                           check_absolute_expr (ip, &imm_expr);
9161                           s = expr_end;
9162                           if (imm_expr.X_add_number > max_el)
9163                             as_bad(_("Bad element selector %ld"),
9164                                    (long) imm_expr.X_add_number);
9165                           imm_expr.X_add_number &= max_el;
9166                           ip->insn_opcode |= (imm_expr.X_add_number
9167                                               << (OP_SH_VSEL +
9168                                                   (is_qh ? 2 : 1)));
9169                           imm_expr.X_op = O_absent;
9170                           if (*s != ']')
9171                             as_warn(_("Expecting ']' found '%s'"), s);
9172                           else
9173                             s++;
9174                         }
9175                       else
9176                         {
9177                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9178                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9179                                                 << OP_SH_VSEL);
9180                           else
9181                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9182                                                 OP_SH_VSEL);
9183                         }
9184                       /* Fall through */
9185                     case 'W':
9186                     case 'T':
9187                     case 'Z':
9188                       INSERT_OPERAND (FT, *ip, regno);
9189                       break;
9190                     case 'R':
9191                       INSERT_OPERAND (FR, *ip, regno);
9192                       break;
9193                     }
9194                   lastregno = regno;
9195                   continue;
9196                 }
9197
9198               switch (*args++)
9199                 {
9200                 case 'V':
9201                   INSERT_OPERAND (FS, *ip, lastregno);
9202                   continue;
9203                 case 'W':
9204                   INSERT_OPERAND (FT, *ip, lastregno);
9205                   continue;
9206                 }
9207               break;
9208
9209             case 'I':
9210               my_getExpression (&imm_expr, s);
9211               if (imm_expr.X_op != O_big
9212                   && imm_expr.X_op != O_constant)
9213                 insn_error = _("absolute expression required");
9214               if (HAVE_32BIT_GPRS)
9215                 normalize_constant_expr (&imm_expr);
9216               s = expr_end;
9217               continue;
9218
9219             case 'A':
9220               my_getExpression (&offset_expr, s);
9221               normalize_address_expr (&offset_expr);
9222               *imm_reloc = BFD_RELOC_32;
9223               s = expr_end;
9224               continue;
9225
9226             case 'F':
9227             case 'L':
9228             case 'f':
9229             case 'l':
9230               {
9231                 int f64;
9232                 int using_gprs;
9233                 char *save_in;
9234                 char *err;
9235                 unsigned char temp[8];
9236                 int len;
9237                 unsigned int length;
9238                 segT seg;
9239                 subsegT subseg;
9240                 char *p;
9241
9242                 /* These only appear as the last operand in an
9243                    instruction, and every instruction that accepts
9244                    them in any variant accepts them in all variants.
9245                    This means we don't have to worry about backing out
9246                    any changes if the instruction does not match.
9247
9248                    The difference between them is the size of the
9249                    floating point constant and where it goes.  For 'F'
9250                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9251                    is 32 bits.  Where the constant is placed is based
9252                    on how the MIPS assembler does things:
9253                     F -- .rdata
9254                     L -- .lit8
9255                     f -- immediate value
9256                     l -- .lit4
9257
9258                     The .lit4 and .lit8 sections are only used if
9259                     permitted by the -G argument.
9260
9261                     The code below needs to know whether the target register
9262                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9263                     'F' are used with GPR-based instructions and 'l' and
9264                     'L' are used with FPR-based instructions.  */
9265
9266                 f64 = *args == 'F' || *args == 'L';
9267                 using_gprs = *args == 'F' || *args == 'f';
9268
9269                 save_in = input_line_pointer;
9270                 input_line_pointer = s;
9271                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9272                 length = len;
9273                 s = input_line_pointer;
9274                 input_line_pointer = save_in;
9275                 if (err != NULL && *err != '\0')
9276                   {
9277                     as_bad (_("Bad floating point constant: %s"), err);
9278                     memset (temp, '\0', sizeof temp);
9279                     length = f64 ? 8 : 4;
9280                   }
9281
9282                 assert (length == (unsigned) (f64 ? 8 : 4));
9283
9284                 if (*args == 'f'
9285                     || (*args == 'l'
9286                         && (g_switch_value < 4
9287                             || (temp[0] == 0 && temp[1] == 0)
9288                             || (temp[2] == 0 && temp[3] == 0))))
9289                   {
9290                     imm_expr.X_op = O_constant;
9291                     if (! target_big_endian)
9292                       imm_expr.X_add_number = bfd_getl32 (temp);
9293                     else
9294                       imm_expr.X_add_number = bfd_getb32 (temp);
9295                   }
9296                 else if (length > 4
9297                          && ! mips_disable_float_construction
9298                          /* Constants can only be constructed in GPRs and
9299                             copied to FPRs if the GPRs are at least as wide
9300                             as the FPRs.  Force the constant into memory if
9301                             we are using 64-bit FPRs but the GPRs are only
9302                             32 bits wide.  */
9303                          && (using_gprs
9304                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9305                          && ((temp[0] == 0 && temp[1] == 0)
9306                              || (temp[2] == 0 && temp[3] == 0))
9307                          && ((temp[4] == 0 && temp[5] == 0)
9308                              || (temp[6] == 0 && temp[7] == 0)))
9309                   {
9310                     /* The value is simple enough to load with a couple of
9311                        instructions.  If using 32-bit registers, set
9312                        imm_expr to the high order 32 bits and offset_expr to
9313                        the low order 32 bits.  Otherwise, set imm_expr to
9314                        the entire 64 bit constant.  */
9315                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9316                       {
9317                         imm_expr.X_op = O_constant;
9318                         offset_expr.X_op = O_constant;
9319                         if (! target_big_endian)
9320                           {
9321                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9322                             offset_expr.X_add_number = bfd_getl32 (temp);
9323                           }
9324                         else
9325                           {
9326                             imm_expr.X_add_number = bfd_getb32 (temp);
9327                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9328                           }
9329                         if (offset_expr.X_add_number == 0)
9330                           offset_expr.X_op = O_absent;
9331                       }
9332                     else if (sizeof (imm_expr.X_add_number) > 4)
9333                       {
9334                         imm_expr.X_op = O_constant;
9335                         if (! target_big_endian)
9336                           imm_expr.X_add_number = bfd_getl64 (temp);
9337                         else
9338                           imm_expr.X_add_number = bfd_getb64 (temp);
9339                       }
9340                     else
9341                       {
9342                         imm_expr.X_op = O_big;
9343                         imm_expr.X_add_number = 4;
9344                         if (! target_big_endian)
9345                           {
9346                             generic_bignum[0] = bfd_getl16 (temp);
9347                             generic_bignum[1] = bfd_getl16 (temp + 2);
9348                             generic_bignum[2] = bfd_getl16 (temp + 4);
9349                             generic_bignum[3] = bfd_getl16 (temp + 6);
9350                           }
9351                         else
9352                           {
9353                             generic_bignum[0] = bfd_getb16 (temp + 6);
9354                             generic_bignum[1] = bfd_getb16 (temp + 4);
9355                             generic_bignum[2] = bfd_getb16 (temp + 2);
9356                             generic_bignum[3] = bfd_getb16 (temp);
9357                           }
9358                       }
9359                   }
9360                 else
9361                   {
9362                     const char *newname;
9363                     segT new_seg;
9364
9365                     /* Switch to the right section.  */
9366                     seg = now_seg;
9367                     subseg = now_subseg;
9368                     switch (*args)
9369                       {
9370                       default: /* unused default case avoids warnings.  */
9371                       case 'L':
9372                         newname = RDATA_SECTION_NAME;
9373                         if (g_switch_value >= 8)
9374                           newname = ".lit8";
9375                         break;
9376                       case 'F':
9377                         newname = RDATA_SECTION_NAME;
9378                         break;
9379                       case 'l':
9380                         assert (g_switch_value >= 4);
9381                         newname = ".lit4";
9382                         break;
9383                       }
9384                     new_seg = subseg_new (newname, (subsegT) 0);
9385                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9386                       bfd_set_section_flags (stdoutput, new_seg,
9387                                              (SEC_ALLOC
9388                                               | SEC_LOAD
9389                                               | SEC_READONLY
9390                                               | SEC_DATA));
9391                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9392                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9393                         && strcmp (TARGET_OS, "elf") != 0)
9394                       record_alignment (new_seg, 4);
9395                     else
9396                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9397                     if (seg == now_seg)
9398                       as_bad (_("Can't use floating point insn in this section"));
9399
9400                     /* Set the argument to the current address in the
9401                        section.  */
9402                     offset_expr.X_op = O_symbol;
9403                     offset_expr.X_add_symbol =
9404                       symbol_new ("L0\001", now_seg,
9405                                   (valueT) frag_now_fix (), frag_now);
9406                     offset_expr.X_add_number = 0;
9407
9408                     /* Put the floating point number into the section.  */
9409                     p = frag_more ((int) length);
9410                     memcpy (p, temp, length);
9411
9412                     /* Switch back to the original section.  */
9413                     subseg_set (seg, subseg);
9414                   }
9415               }
9416               continue;
9417
9418             case 'i':           /* 16 bit unsigned immediate */
9419             case 'j':           /* 16 bit signed immediate */
9420               *imm_reloc = BFD_RELOC_LO16;
9421               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9422                 {
9423                   int more;
9424                   offsetT minval, maxval;
9425
9426                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9427                           && strcmp (insn->name, insn[1].name) == 0);
9428
9429                   /* If the expression was written as an unsigned number,
9430                      only treat it as signed if there are no more
9431                      alternatives.  */
9432                   if (more
9433                       && *args == 'j'
9434                       && sizeof (imm_expr.X_add_number) <= 4
9435                       && imm_expr.X_op == O_constant
9436                       && imm_expr.X_add_number < 0
9437                       && imm_expr.X_unsigned
9438                       && HAVE_64BIT_GPRS)
9439                     break;
9440
9441                   /* For compatibility with older assemblers, we accept
9442                      0x8000-0xffff as signed 16-bit numbers when only
9443                      signed numbers are allowed.  */
9444                   if (*args == 'i')
9445                     minval = 0, maxval = 0xffff;
9446                   else if (more)
9447                     minval = -0x8000, maxval = 0x7fff;
9448                   else
9449                     minval = -0x8000, maxval = 0xffff;
9450
9451                   if (imm_expr.X_op != O_constant
9452                       || imm_expr.X_add_number < minval
9453                       || imm_expr.X_add_number > maxval)
9454                     {
9455                       if (more)
9456                         break;
9457                       if (imm_expr.X_op == O_constant
9458                           || imm_expr.X_op == O_big)
9459                         as_bad (_("expression out of range"));
9460                     }
9461                 }
9462               s = expr_end;
9463               continue;
9464
9465             case 'o':           /* 16 bit offset */
9466               /* Check whether there is only a single bracketed expression
9467                  left.  If so, it must be the base register and the
9468                  constant must be zero.  */
9469               if (*s == '(' && strchr (s + 1, '(') == 0)
9470                 {
9471                   offset_expr.X_op = O_constant;
9472                   offset_expr.X_add_number = 0;
9473                   continue;
9474                 }
9475
9476               /* If this value won't fit into a 16 bit offset, then go
9477                  find a macro that will generate the 32 bit offset
9478                  code pattern.  */
9479               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9480                   && (offset_expr.X_op != O_constant
9481                       || offset_expr.X_add_number >= 0x8000
9482                       || offset_expr.X_add_number < -0x8000))
9483                 break;
9484
9485               s = expr_end;
9486               continue;
9487
9488             case 'p':           /* pc relative offset */
9489               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9490               my_getExpression (&offset_expr, s);
9491               s = expr_end;
9492               continue;
9493
9494             case 'u':           /* upper 16 bits */
9495               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9496                   && imm_expr.X_op == O_constant
9497                   && (imm_expr.X_add_number < 0
9498                       || imm_expr.X_add_number >= 0x10000))
9499                 as_bad (_("lui expression not in range 0..65535"));
9500               s = expr_end;
9501               continue;
9502
9503             case 'a':           /* 26 bit address */
9504               my_getExpression (&offset_expr, s);
9505               s = expr_end;
9506               *offset_reloc = BFD_RELOC_MIPS_JMP;
9507               continue;
9508
9509             case 'N':           /* 3 bit branch condition code */
9510             case 'M':           /* 3 bit compare condition code */
9511               rtype = RTYPE_CCC;
9512               if (ip->insn_mo->pinfo & (FP_D| FP_S))
9513                 rtype |= RTYPE_FCC;
9514               if (!reg_lookup (&s, rtype, &regno))
9515                 break;
9516               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9517                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9518                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9519                   && (regno & 1) != 0)
9520                 as_warn(_("Condition code register should be even for %s, was %d"),
9521                         str, regno);
9522               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9523                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9524                   && (regno & 3) != 0)
9525                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9526                         str, regno);
9527               if (*args == 'N')
9528                 INSERT_OPERAND (BCC, *ip, regno);
9529               else
9530                 INSERT_OPERAND (CCC, *ip, regno);
9531               continue;
9532
9533             case 'H':
9534               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9535                 s += 2;
9536               if (ISDIGIT (*s))
9537                 {
9538                   c = 0;
9539                   do
9540                     {
9541                       c *= 10;
9542                       c += *s - '0';
9543                       ++s;
9544                     }
9545                   while (ISDIGIT (*s));
9546                 }
9547               else
9548                 c = 8; /* Invalid sel value.  */
9549
9550               if (c > 7)
9551                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9552               ip->insn_opcode |= c;
9553               continue;
9554
9555             case 'e':
9556               /* Must be at least one digit.  */
9557               my_getExpression (&imm_expr, s);
9558               check_absolute_expr (ip, &imm_expr);
9559
9560               if ((unsigned long) imm_expr.X_add_number
9561                   > (unsigned long) OP_MASK_VECBYTE)
9562                 {
9563                   as_bad (_("bad byte vector index (%ld)"),
9564                            (long) imm_expr.X_add_number);
9565                   imm_expr.X_add_number = 0;
9566                 }
9567
9568               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9569               imm_expr.X_op = O_absent;
9570               s = expr_end;
9571               continue;
9572
9573             case '%':
9574               my_getExpression (&imm_expr, s);
9575               check_absolute_expr (ip, &imm_expr);
9576
9577               if ((unsigned long) imm_expr.X_add_number
9578                   > (unsigned long) OP_MASK_VECALIGN)
9579                 {
9580                   as_bad (_("bad byte vector index (%ld)"),
9581                            (long) imm_expr.X_add_number);
9582                   imm_expr.X_add_number = 0;
9583                 }
9584
9585               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9586               imm_expr.X_op = O_absent;
9587               s = expr_end;
9588               continue;
9589
9590             default:
9591               as_bad (_("bad char = '%c'\n"), *args);
9592               internalError ();
9593             }
9594           break;
9595         }
9596       /* Args don't match.  */
9597       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9598           !strcmp (insn->name, insn[1].name))
9599         {
9600           ++insn;
9601           s = argsStart;
9602           insn_error = _("illegal operands");
9603           continue;
9604         }
9605       if (save_c)
9606         *(--s) = save_c;
9607       insn_error = _("illegal operands");
9608       return;
9609     }
9610 }
9611
9612 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9613
9614 /* This routine assembles an instruction into its binary format when
9615    assembling for the mips16.  As a side effect, it sets one of the
9616    global variables imm_reloc or offset_reloc to the type of
9617    relocation to do if one of the operands is an address expression.
9618    It also sets mips16_small and mips16_ext if the user explicitly
9619    requested a small or extended instruction.  */
9620
9621 static void
9622 mips16_ip (char *str, struct mips_cl_insn *ip)
9623 {
9624   char *s;
9625   const char *args;
9626   struct mips_opcode *insn;
9627   char *argsstart;
9628   unsigned int regno;
9629   unsigned int lastregno = 0;
9630   char *s_reset;
9631   size_t i;
9632
9633   insn_error = NULL;
9634
9635   mips16_small = FALSE;
9636   mips16_ext = FALSE;
9637
9638   for (s = str; ISLOWER (*s); ++s)
9639     ;
9640   switch (*s)
9641     {
9642     case '\0':
9643       break;
9644
9645     case ' ':
9646       *s++ = '\0';
9647       break;
9648
9649     case '.':
9650       if (s[1] == 't' && s[2] == ' ')
9651         {
9652           *s = '\0';
9653           mips16_small = TRUE;
9654           s += 3;
9655           break;
9656         }
9657       else if (s[1] == 'e' && s[2] == ' ')
9658         {
9659           *s = '\0';
9660           mips16_ext = TRUE;
9661           s += 3;
9662           break;
9663         }
9664       /* Fall through.  */
9665     default:
9666       insn_error = _("unknown opcode");
9667       return;
9668     }
9669
9670   if (mips_opts.noautoextend && ! mips16_ext)
9671     mips16_small = TRUE;
9672
9673   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9674     {
9675       insn_error = _("unrecognized opcode");
9676       return;
9677     }
9678
9679   argsstart = s;
9680   for (;;)
9681     {
9682       bfd_boolean ok;
9683
9684       assert (strcmp (insn->name, str) == 0);
9685
9686       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9687         ok = TRUE;
9688       else
9689         ok = FALSE;
9690
9691       if (! ok)
9692         {
9693           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9694               && strcmp (insn->name, insn[1].name) == 0)
9695             {
9696               ++insn;
9697               continue;
9698             }
9699           else
9700             {
9701               if (!insn_error)
9702                 {
9703                   static char buf[100];
9704                   sprintf (buf,
9705                            _("opcode not supported on this processor: %s (%s)"),
9706                            mips_cpu_info_from_arch (mips_opts.arch)->name,
9707                            mips_cpu_info_from_isa (mips_opts.isa)->name);
9708                   insn_error = buf;
9709                 }
9710               return;
9711             }
9712         }
9713
9714       create_insn (ip, insn);
9715       imm_expr.X_op = O_absent;
9716       imm_reloc[0] = BFD_RELOC_UNUSED;
9717       imm_reloc[1] = BFD_RELOC_UNUSED;
9718       imm_reloc[2] = BFD_RELOC_UNUSED;
9719       imm2_expr.X_op = O_absent;
9720       offset_expr.X_op = O_absent;
9721       offset_reloc[0] = BFD_RELOC_UNUSED;
9722       offset_reloc[1] = BFD_RELOC_UNUSED;
9723       offset_reloc[2] = BFD_RELOC_UNUSED;
9724       for (args = insn->args; 1; ++args)
9725         {
9726           int c;
9727
9728           if (*s == ' ')
9729             ++s;
9730
9731           /* In this switch statement we call break if we did not find
9732              a match, continue if we did find a match, or return if we
9733              are done.  */
9734
9735           c = *args;
9736           switch (c)
9737             {
9738             case '\0':
9739               if (*s == '\0')
9740                 {
9741                   /* Stuff the immediate value in now, if we can.  */
9742                   if (imm_expr.X_op == O_constant
9743                       && *imm_reloc > BFD_RELOC_UNUSED
9744                       && insn->pinfo != INSN_MACRO)
9745                     {
9746                       valueT tmp;
9747
9748                       switch (*offset_reloc)
9749                         {
9750                           case BFD_RELOC_MIPS16_HI16_S:
9751                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9752                             break;
9753
9754                           case BFD_RELOC_MIPS16_HI16:
9755                             tmp = imm_expr.X_add_number >> 16;
9756                             break;
9757
9758                           case BFD_RELOC_MIPS16_LO16:
9759                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9760                                   - 0x8000;
9761                             break;
9762
9763                           case BFD_RELOC_UNUSED:
9764                             tmp = imm_expr.X_add_number;
9765                             break;
9766
9767                           default:
9768                             internalError ();
9769                         }
9770                       *offset_reloc = BFD_RELOC_UNUSED;
9771
9772                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9773                                     tmp, TRUE, mips16_small,
9774                                     mips16_ext, &ip->insn_opcode,
9775                                     &ip->use_extend, &ip->extend);
9776                       imm_expr.X_op = O_absent;
9777                       *imm_reloc = BFD_RELOC_UNUSED;
9778                     }
9779
9780                   return;
9781                 }
9782               break;
9783
9784             case ',':
9785               if (*s++ == c)
9786                 continue;
9787               s--;
9788               switch (*++args)
9789                 {
9790                 case 'v':
9791                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9792                   continue;
9793                 case 'w':
9794                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9795                   continue;
9796                 }
9797               break;
9798
9799             case '(':
9800             case ')':
9801               if (*s++ == c)
9802                 continue;
9803               break;
9804
9805             case 'v':
9806             case 'w':
9807               if (s[0] != '$')
9808                 {
9809                   if (c == 'v')
9810                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9811                   else
9812                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9813                   ++args;
9814                   continue;
9815                 }
9816               /* Fall through.  */
9817             case 'x':
9818             case 'y':
9819             case 'z':
9820             case 'Z':
9821             case '0':
9822             case 'S':
9823             case 'R':
9824             case 'X':
9825             case 'Y':
9826               s_reset = s;
9827               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9828                 {
9829                   if (c == 'v' || c == 'w')
9830                     {
9831                       if (c == 'v')
9832                         ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9833                       else
9834                         ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9835                       ++args;
9836                       continue;
9837                     }
9838                   break;
9839                 }
9840
9841               if (*s == ' ')
9842                 ++s;
9843               if (args[1] != *s)
9844                 {
9845                   if (c == 'v' || c == 'w')
9846                     {
9847                       regno = mips16_to_32_reg_map[lastregno];
9848                       s = s_reset;
9849                       ++args;
9850                     }
9851                 }
9852
9853               switch (c)
9854                 {
9855                 case 'x':
9856                 case 'y':
9857                 case 'z':
9858                 case 'v':
9859                 case 'w':
9860                 case 'Z':
9861                   regno = mips32_to_16_reg_map[regno];
9862                   break;
9863
9864                 case '0':
9865                   if (regno != 0)
9866                     regno = ILLEGAL_REG;
9867                   break;
9868
9869                 case 'S':
9870                   if (regno != SP)
9871                     regno = ILLEGAL_REG;
9872                   break;
9873
9874                 case 'R':
9875                   if (regno != RA)
9876                     regno = ILLEGAL_REG;
9877                   break;
9878
9879                 case 'X':
9880                 case 'Y':
9881                   if (regno == AT && ! mips_opts.noat)
9882                     as_warn (_("used $at without \".set noat\""));
9883                   break;
9884
9885                 default:
9886                   internalError ();
9887                 }
9888
9889               if (regno == ILLEGAL_REG)
9890                 break;
9891
9892               switch (c)
9893                 {
9894                 case 'x':
9895                 case 'v':
9896                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
9897                   break;
9898                 case 'y':
9899                 case 'w':
9900                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
9901                   break;
9902                 case 'z':
9903                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
9904                   break;
9905                 case 'Z':
9906                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
9907                 case '0':
9908                 case 'S':
9909                 case 'R':
9910                   break;
9911                 case 'X':
9912                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
9913                   break;
9914                 case 'Y':
9915                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9916                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
9917                   break;
9918                 default:
9919                   internalError ();
9920                 }
9921
9922               lastregno = regno;
9923               continue;
9924
9925             case 'P':
9926               if (strncmp (s, "$pc", 3) == 0)
9927                 {
9928                   s += 3;
9929                   continue;
9930                 }
9931               break;
9932
9933             case '5':
9934             case 'H':
9935             case 'W':
9936             case 'D':
9937             case 'j':
9938             case 'V':
9939             case 'C':
9940             case 'U':
9941             case 'k':
9942             case 'K':
9943               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
9944               if (i > 0)
9945                 {
9946                   if (imm_expr.X_op != O_constant)
9947                     {
9948                       mips16_ext = TRUE;
9949                       ip->use_extend = TRUE;
9950                       ip->extend = 0;
9951                     }
9952                   else
9953                     {
9954                       /* We need to relax this instruction.  */
9955                       *offset_reloc = *imm_reloc;
9956                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9957                     }
9958                   s = expr_end;
9959                   continue;
9960                 }
9961               *imm_reloc = BFD_RELOC_UNUSED;
9962               /* Fall through.  */
9963             case '<':
9964             case '>':
9965             case '[':
9966             case ']':
9967             case '4':
9968             case '8':
9969               my_getExpression (&imm_expr, s);
9970               if (imm_expr.X_op == O_register)
9971                 {
9972                   /* What we thought was an expression turned out to
9973                      be a register.  */
9974
9975                   if (s[0] == '(' && args[1] == '(')
9976                     {
9977                       /* It looks like the expression was omitted
9978                          before a register indirection, which means
9979                          that the expression is implicitly zero.  We
9980                          still set up imm_expr, so that we handle
9981                          explicit extensions correctly.  */
9982                       imm_expr.X_op = O_constant;
9983                       imm_expr.X_add_number = 0;
9984                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9985                       continue;
9986                     }
9987
9988                   break;
9989                 }
9990
9991               /* We need to relax this instruction.  */
9992               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9993               s = expr_end;
9994               continue;
9995
9996             case 'p':
9997             case 'q':
9998             case 'A':
9999             case 'B':
10000             case 'E':
10001               /* We use offset_reloc rather than imm_reloc for the PC
10002                  relative operands.  This lets macros with both
10003                  immediate and address operands work correctly.  */
10004               my_getExpression (&offset_expr, s);
10005
10006               if (offset_expr.X_op == O_register)
10007                 break;
10008
10009               /* We need to relax this instruction.  */
10010               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10011               s = expr_end;
10012               continue;
10013
10014             case '6':           /* break code */
10015               my_getExpression (&imm_expr, s);
10016               check_absolute_expr (ip, &imm_expr);
10017               if ((unsigned long) imm_expr.X_add_number > 63)
10018                 as_warn (_("Invalid value for `%s' (%lu)"),
10019                          ip->insn_mo->name,
10020                          (unsigned long) imm_expr.X_add_number);
10021               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10022               imm_expr.X_op = O_absent;
10023               s = expr_end;
10024               continue;
10025
10026             case 'a':           /* 26 bit address */
10027               my_getExpression (&offset_expr, s);
10028               s = expr_end;
10029               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10030               ip->insn_opcode <<= 16;
10031               continue;
10032
10033             case 'l':           /* register list for entry macro */
10034             case 'L':           /* register list for exit macro */
10035               {
10036                 int mask;
10037
10038                 if (c == 'l')
10039                   mask = 0;
10040                 else
10041                   mask = 7 << 3;
10042                 while (*s != '\0')
10043                   {
10044                     unsigned int freg, reg1, reg2;
10045
10046                     while (*s == ' ' || *s == ',')
10047                       ++s;
10048                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10049                       freg = 0;
10050                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10051                       freg = 1;
10052                     else
10053                       {
10054                         as_bad (_("can't parse register list"));
10055                         break;
10056                       }
10057                     if (*s == ' ')
10058                       ++s;
10059                     if (*s != '-')
10060                       reg2 = reg1;
10061                     else
10062                       {
10063                         ++s;
10064                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10065                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10066                           {
10067                             as_bad (_("invalid register list"));
10068                             break;
10069                           }
10070                       }
10071                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10072                       {
10073                         mask &= ~ (7 << 3);
10074                         mask |= 5 << 3;
10075                       }
10076                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10077                       {
10078                         mask &= ~ (7 << 3);
10079                         mask |= 6 << 3;
10080                       }
10081                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10082                       mask |= (reg2 - 3) << 3;
10083                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10084                       mask |= (reg2 - 15) << 1;
10085                     else if (reg1 == RA && reg2 == RA)
10086                       mask |= 1;
10087                     else
10088                       {
10089                         as_bad (_("invalid register list"));
10090                         break;
10091                       }
10092                   }
10093                 /* The mask is filled in in the opcode table for the
10094                    benefit of the disassembler.  We remove it before
10095                    applying the actual mask.  */
10096                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10097                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10098               }
10099             continue;
10100
10101             case 'm':           /* Register list for save insn.  */
10102             case 'M':           /* Register list for restore insn.  */
10103               {
10104                 int opcode = 0;
10105                 int framesz = 0, seen_framesz = 0;
10106                 int args = 0, statics = 0, sregs = 0;
10107
10108                 while (*s != '\0')
10109                   {
10110                     unsigned int reg1, reg2;
10111
10112                     SKIP_SPACE_TABS (s);
10113                     while (*s == ',')
10114                       ++s;
10115                     SKIP_SPACE_TABS (s);
10116
10117                     my_getExpression (&imm_expr, s);
10118                     if (imm_expr.X_op == O_constant)
10119                       {
10120                         /* Handle the frame size.  */
10121                         if (seen_framesz)
10122                           {
10123                             as_bad (_("more than one frame size in list"));
10124                             break;
10125                           }
10126                         seen_framesz = 1;
10127                         framesz = imm_expr.X_add_number;
10128                         imm_expr.X_op = O_absent;
10129                         s = expr_end;
10130                         continue;
10131                       }
10132
10133                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10134                       {
10135                         as_bad (_("can't parse register list"));
10136                         break;
10137                       }
10138
10139                     while (*s == ' ')
10140                       ++s;
10141
10142                     if (*s != '-')
10143                       reg2 = reg1;
10144                     else
10145                       {
10146                         ++s;
10147                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10148                             || reg2 < reg1)
10149                           {
10150                             as_bad (_("can't parse register list"));
10151                             break;
10152                           }
10153                       }
10154
10155                     while (reg1 <= reg2)
10156                       {
10157                         if (reg1 >= 4 && reg1 <= 7)
10158                           {
10159                             if (c == 'm' && !seen_framesz)
10160                                 /* args $a0-$a3 */
10161                                 args |= 1 << (reg1 - 4);
10162                             else
10163                                 /* statics $a0-$a3 */
10164                                 statics |= 1 << (reg1 - 4);
10165                           }
10166                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10167                           {
10168                             /* $s0-$s8 */
10169                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10170                           }
10171                         else if (reg1 == 31)
10172                           {
10173                             /* Add $ra to insn.  */
10174                             opcode |= 0x40;
10175                           }
10176                         else
10177                           {
10178                             as_bad (_("unexpected register in list"));
10179                             break;
10180                           }
10181                         if (++reg1 == 24)
10182                           reg1 = 30;
10183                       }
10184                   }
10185
10186                 /* Encode args/statics combination.  */
10187                 if (args & statics)
10188                   as_bad (_("arg/static registers overlap"));
10189                 else if (args == 0xf)
10190                   /* All $a0-$a3 are args.  */
10191                   opcode |= MIPS16_ALL_ARGS << 16;
10192                 else if (statics == 0xf)
10193                   /* All $a0-$a3 are statics.  */
10194                   opcode |= MIPS16_ALL_STATICS << 16;
10195                 else 
10196                   {
10197                     int narg = 0, nstat = 0;
10198
10199                     /* Count arg registers.  */
10200                     while (args & 0x1)
10201                       {
10202                         args >>= 1;
10203                         narg++;
10204                       }
10205                     if (args != 0)
10206                       as_bad (_("invalid arg register list"));
10207
10208                     /* Count static registers.  */
10209                     while (statics & 0x8)
10210                       {
10211                         statics = (statics << 1) & 0xf;
10212                         nstat++;
10213                       }
10214                     if (statics != 0) 
10215                       as_bad (_("invalid static register list"));
10216
10217                     /* Encode args/statics.  */
10218                     opcode |= ((narg << 2) | nstat) << 16;
10219                   }
10220
10221                 /* Encode $s0/$s1.  */
10222                 if (sregs & (1 << 0))           /* $s0 */
10223                   opcode |= 0x20;
10224                 if (sregs & (1 << 1))           /* $s1 */
10225                   opcode |= 0x10;
10226                 sregs >>= 2;
10227
10228                 if (sregs != 0)
10229                   {
10230                     /* Count regs $s2-$s8.  */
10231                     int nsreg = 0;
10232                     while (sregs & 1)
10233                       {
10234                         sregs >>= 1;
10235                         nsreg++;
10236                       }
10237                     if (sregs != 0)
10238                       as_bad (_("invalid static register list"));
10239                     /* Encode $s2-$s8. */
10240                     opcode |= nsreg << 24;
10241                   }
10242
10243                 /* Encode frame size.  */
10244                 if (!seen_framesz)
10245                   as_bad (_("missing frame size"));
10246                 else if ((framesz & 7) != 0 || framesz < 0
10247                          || framesz > 0xff * 8)
10248                   as_bad (_("invalid frame size"));
10249                 else if (framesz != 128 || (opcode >> 16) != 0)
10250                   {
10251                     framesz /= 8;
10252                     opcode |= (((framesz & 0xf0) << 16)
10253                              | (framesz & 0x0f));
10254                   }
10255
10256                 /* Finally build the instruction.  */
10257                 if ((opcode >> 16) != 0 || framesz == 0)
10258                   {
10259                     ip->use_extend = TRUE;
10260                     ip->extend = opcode >> 16;
10261                   }
10262                 ip->insn_opcode |= opcode & 0x7f;
10263               }
10264             continue;
10265
10266             case 'e':           /* extend code */
10267               my_getExpression (&imm_expr, s);
10268               check_absolute_expr (ip, &imm_expr);
10269               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10270                 {
10271                   as_warn (_("Invalid value for `%s' (%lu)"),
10272                            ip->insn_mo->name,
10273                            (unsigned long) imm_expr.X_add_number);
10274                   imm_expr.X_add_number &= 0x7ff;
10275                 }
10276               ip->insn_opcode |= imm_expr.X_add_number;
10277               imm_expr.X_op = O_absent;
10278               s = expr_end;
10279               continue;
10280
10281             default:
10282               internalError ();
10283             }
10284           break;
10285         }
10286
10287       /* Args don't match.  */
10288       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10289           strcmp (insn->name, insn[1].name) == 0)
10290         {
10291           ++insn;
10292           s = argsstart;
10293           continue;
10294         }
10295
10296       insn_error = _("illegal operands");
10297
10298       return;
10299     }
10300 }
10301
10302 /* This structure holds information we know about a mips16 immediate
10303    argument type.  */
10304
10305 struct mips16_immed_operand
10306 {
10307   /* The type code used in the argument string in the opcode table.  */
10308   int type;
10309   /* The number of bits in the short form of the opcode.  */
10310   int nbits;
10311   /* The number of bits in the extended form of the opcode.  */
10312   int extbits;
10313   /* The amount by which the short form is shifted when it is used;
10314      for example, the sw instruction has a shift count of 2.  */
10315   int shift;
10316   /* The amount by which the short form is shifted when it is stored
10317      into the instruction code.  */
10318   int op_shift;
10319   /* Non-zero if the short form is unsigned.  */
10320   int unsp;
10321   /* Non-zero if the extended form is unsigned.  */
10322   int extu;
10323   /* Non-zero if the value is PC relative.  */
10324   int pcrel;
10325 };
10326
10327 /* The mips16 immediate operand types.  */
10328
10329 static const struct mips16_immed_operand mips16_immed_operands[] =
10330 {
10331   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10332   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10333   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10334   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10335   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10336   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10337   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10338   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10339   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10340   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10341   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10342   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10343   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10344   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10345   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10346   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10347   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10348   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10349   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10350   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10351   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10352 };
10353
10354 #define MIPS16_NUM_IMMED \
10355   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10356
10357 /* Handle a mips16 instruction with an immediate value.  This or's the
10358    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10359    whether an extended value is needed; if one is needed, it sets
10360    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10361    If SMALL is true, an unextended opcode was explicitly requested.
10362    If EXT is true, an extended opcode was explicitly requested.  If
10363    WARN is true, warn if EXT does not match reality.  */
10364
10365 static void
10366 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10367               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10368               unsigned long *insn, bfd_boolean *use_extend,
10369               unsigned short *extend)
10370 {
10371   register const struct mips16_immed_operand *op;
10372   int mintiny, maxtiny;
10373   bfd_boolean needext;
10374
10375   op = mips16_immed_operands;
10376   while (op->type != type)
10377     {
10378       ++op;
10379       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10380     }
10381
10382   if (op->unsp)
10383     {
10384       if (type == '<' || type == '>' || type == '[' || type == ']')
10385         {
10386           mintiny = 1;
10387           maxtiny = 1 << op->nbits;
10388         }
10389       else
10390         {
10391           mintiny = 0;
10392           maxtiny = (1 << op->nbits) - 1;
10393         }
10394     }
10395   else
10396     {
10397       mintiny = - (1 << (op->nbits - 1));
10398       maxtiny = (1 << (op->nbits - 1)) - 1;
10399     }
10400
10401   /* Branch offsets have an implicit 0 in the lowest bit.  */
10402   if (type == 'p' || type == 'q')
10403     val /= 2;
10404
10405   if ((val & ((1 << op->shift) - 1)) != 0
10406       || val < (mintiny << op->shift)
10407       || val > (maxtiny << op->shift))
10408     needext = TRUE;
10409   else
10410     needext = FALSE;
10411
10412   if (warn && ext && ! needext)
10413     as_warn_where (file, line,
10414                    _("extended operand requested but not required"));
10415   if (small && needext)
10416     as_bad_where (file, line, _("invalid unextended operand value"));
10417
10418   if (small || (! ext && ! needext))
10419     {
10420       int insnval;
10421
10422       *use_extend = FALSE;
10423       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10424       insnval <<= op->op_shift;
10425       *insn |= insnval;
10426     }
10427   else
10428     {
10429       long minext, maxext;
10430       int extval;
10431
10432       if (op->extu)
10433         {
10434           minext = 0;
10435           maxext = (1 << op->extbits) - 1;
10436         }
10437       else
10438         {
10439           minext = - (1 << (op->extbits - 1));
10440           maxext = (1 << (op->extbits - 1)) - 1;
10441         }
10442       if (val < minext || val > maxext)
10443         as_bad_where (file, line,
10444                       _("operand value out of range for instruction"));
10445
10446       *use_extend = TRUE;
10447       if (op->extbits == 16)
10448         {
10449           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10450           val &= 0x1f;
10451         }
10452       else if (op->extbits == 15)
10453         {
10454           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10455           val &= 0xf;
10456         }
10457       else
10458         {
10459           extval = ((val & 0x1f) << 6) | (val & 0x20);
10460           val = 0;
10461         }
10462
10463       *extend = (unsigned short) extval;
10464       *insn |= val;
10465     }
10466 }
10467 \f
10468 struct percent_op_match
10469 {
10470   const char *str;
10471   bfd_reloc_code_real_type reloc;
10472 };
10473
10474 static const struct percent_op_match mips_percent_op[] =
10475 {
10476   {"%lo", BFD_RELOC_LO16},
10477 #ifdef OBJ_ELF
10478   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10479   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10480   {"%call16", BFD_RELOC_MIPS_CALL16},
10481   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10482   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10483   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10484   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10485   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10486   {"%got", BFD_RELOC_MIPS_GOT16},
10487   {"%gp_rel", BFD_RELOC_GPREL16},
10488   {"%half", BFD_RELOC_16},
10489   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10490   {"%higher", BFD_RELOC_MIPS_HIGHER},
10491   {"%neg", BFD_RELOC_MIPS_SUB},
10492   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10493   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10494   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10495   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10496   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10497   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10498   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10499 #endif
10500   {"%hi", BFD_RELOC_HI16_S}
10501 };
10502
10503 static const struct percent_op_match mips16_percent_op[] =
10504 {
10505   {"%lo", BFD_RELOC_MIPS16_LO16},
10506   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10507   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10508 };
10509
10510
10511 /* Return true if *STR points to a relocation operator.  When returning true,
10512    move *STR over the operator and store its relocation code in *RELOC.
10513    Leave both *STR and *RELOC alone when returning false.  */
10514
10515 static bfd_boolean
10516 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10517 {
10518   const struct percent_op_match *percent_op;
10519   size_t limit, i;
10520
10521   if (mips_opts.mips16)
10522     {
10523       percent_op = mips16_percent_op;
10524       limit = ARRAY_SIZE (mips16_percent_op);
10525     }
10526   else
10527     {
10528       percent_op = mips_percent_op;
10529       limit = ARRAY_SIZE (mips_percent_op);
10530     }
10531
10532   for (i = 0; i < limit; i++)
10533     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10534       {
10535         int len = strlen (percent_op[i].str);
10536
10537         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10538           continue;
10539
10540         *str += strlen (percent_op[i].str);
10541         *reloc = percent_op[i].reloc;
10542
10543         /* Check whether the output BFD supports this relocation.
10544            If not, issue an error and fall back on something safe.  */
10545         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10546           {
10547             as_bad ("relocation %s isn't supported by the current ABI",
10548                     percent_op[i].str);
10549             *reloc = BFD_RELOC_UNUSED;
10550           }
10551         return TRUE;
10552       }
10553   return FALSE;
10554 }
10555
10556
10557 /* Parse string STR as a 16-bit relocatable operand.  Store the
10558    expression in *EP and the relocations in the array starting
10559    at RELOC.  Return the number of relocation operators used.
10560
10561    On exit, EXPR_END points to the first character after the expression.  */
10562
10563 static size_t
10564 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10565                        char *str)
10566 {
10567   bfd_reloc_code_real_type reversed_reloc[3];
10568   size_t reloc_index, i;
10569   int crux_depth, str_depth;
10570   char *crux;
10571
10572   /* Search for the start of the main expression, recoding relocations
10573      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10574      of the main expression and with CRUX_DEPTH containing the number
10575      of open brackets at that point.  */
10576   reloc_index = -1;
10577   str_depth = 0;
10578   do
10579     {
10580       reloc_index++;
10581       crux = str;
10582       crux_depth = str_depth;
10583
10584       /* Skip over whitespace and brackets, keeping count of the number
10585          of brackets.  */
10586       while (*str == ' ' || *str == '\t' || *str == '(')
10587         if (*str++ == '(')
10588           str_depth++;
10589     }
10590   while (*str == '%'
10591          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10592          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10593
10594   my_getExpression (ep, crux);
10595   str = expr_end;
10596
10597   /* Match every open bracket.  */
10598   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10599     if (*str++ == ')')
10600       crux_depth--;
10601
10602   if (crux_depth > 0)
10603     as_bad ("unclosed '('");
10604
10605   expr_end = str;
10606
10607   if (reloc_index != 0)
10608     {
10609       prev_reloc_op_frag = frag_now;
10610       for (i = 0; i < reloc_index; i++)
10611         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10612     }
10613
10614   return reloc_index;
10615 }
10616
10617 static void
10618 my_getExpression (expressionS *ep, char *str)
10619 {
10620   char *save_in;
10621   valueT val;
10622
10623   save_in = input_line_pointer;
10624   input_line_pointer = str;
10625   expression (ep);
10626   expr_end = input_line_pointer;
10627   input_line_pointer = save_in;
10628
10629   /* If we are in mips16 mode, and this is an expression based on `.',
10630      then we bump the value of the symbol by 1 since that is how other
10631      text symbols are handled.  We don't bother to handle complex
10632      expressions, just `.' plus or minus a constant.  */
10633   if (mips_opts.mips16
10634       && ep->X_op == O_symbol
10635       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10636       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10637       && symbol_get_frag (ep->X_add_symbol) == frag_now
10638       && symbol_constant_p (ep->X_add_symbol)
10639       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10640     S_SET_VALUE (ep->X_add_symbol, val + 1);
10641 }
10642
10643 /* Turn a string in input_line_pointer into a floating point constant
10644    of type TYPE, and store the appropriate bytes in *LITP.  The number
10645    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10646    returned, or NULL on OK.  */
10647
10648 char *
10649 md_atof (int type, char *litP, int *sizeP)
10650 {
10651   int prec;
10652   LITTLENUM_TYPE words[4];
10653   char *t;
10654   int i;
10655
10656   switch (type)
10657     {
10658     case 'f':
10659       prec = 2;
10660       break;
10661
10662     case 'd':
10663       prec = 4;
10664       break;
10665
10666     default:
10667       *sizeP = 0;
10668       return _("bad call to md_atof");
10669     }
10670
10671   t = atof_ieee (input_line_pointer, type, words);
10672   if (t)
10673     input_line_pointer = t;
10674
10675   *sizeP = prec * 2;
10676
10677   if (! target_big_endian)
10678     {
10679       for (i = prec - 1; i >= 0; i--)
10680         {
10681           md_number_to_chars (litP, words[i], 2);
10682           litP += 2;
10683         }
10684     }
10685   else
10686     {
10687       for (i = 0; i < prec; i++)
10688         {
10689           md_number_to_chars (litP, words[i], 2);
10690           litP += 2;
10691         }
10692     }
10693
10694   return NULL;
10695 }
10696
10697 void
10698 md_number_to_chars (char *buf, valueT val, int n)
10699 {
10700   if (target_big_endian)
10701     number_to_chars_bigendian (buf, val, n);
10702   else
10703     number_to_chars_littleendian (buf, val, n);
10704 }
10705 \f
10706 #ifdef OBJ_ELF
10707 static int support_64bit_objects(void)
10708 {
10709   const char **list, **l;
10710   int yes;
10711
10712   list = bfd_target_list ();
10713   for (l = list; *l != NULL; l++)
10714 #ifdef TE_TMIPS
10715     /* This is traditional mips */
10716     if (strcmp (*l, "elf64-tradbigmips") == 0
10717         || strcmp (*l, "elf64-tradlittlemips") == 0)
10718 #else
10719     if (strcmp (*l, "elf64-bigmips") == 0
10720         || strcmp (*l, "elf64-littlemips") == 0)
10721 #endif
10722       break;
10723   yes = (*l != NULL);
10724   free (list);
10725   return yes;
10726 }
10727 #endif /* OBJ_ELF */
10728
10729 const char *md_shortopts = "O::g::G:";
10730
10731 struct option md_longopts[] =
10732 {
10733   /* Options which specify architecture.  */
10734 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10735 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10736   {"march", required_argument, NULL, OPTION_MARCH},
10737 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10738   {"mtune", required_argument, NULL, OPTION_MTUNE},
10739 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10740   {"mips0", no_argument, NULL, OPTION_MIPS1},
10741   {"mips1", no_argument, NULL, OPTION_MIPS1},
10742 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10743   {"mips2", no_argument, NULL, OPTION_MIPS2},
10744 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10745   {"mips3", no_argument, NULL, OPTION_MIPS3},
10746 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10747   {"mips4", no_argument, NULL, OPTION_MIPS4},
10748 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10749   {"mips5", no_argument, NULL, OPTION_MIPS5},
10750 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10751   {"mips32", no_argument, NULL, OPTION_MIPS32},
10752 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10753   {"mips64", no_argument, NULL, OPTION_MIPS64},
10754 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10755   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10756 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10757   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10758
10759   /* Options which specify Application Specific Extensions (ASEs).  */
10760 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10761 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10762   {"mips16", no_argument, NULL, OPTION_MIPS16},
10763 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10764   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10765 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10766   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10767 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10768   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10769 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10770   {"mdmx", no_argument, NULL, OPTION_MDMX},
10771 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10772   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10773 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10774   {"mdsp", no_argument, NULL, OPTION_DSP},
10775 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10776   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10777 #define OPTION_MT (OPTION_ASE_BASE + 8)
10778   {"mmt", no_argument, NULL, OPTION_MT},
10779 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10780   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10781 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10782   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10783 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10784   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10785
10786   /* Old-style architecture options.  Don't add more of these.  */
10787 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 12)
10788 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10789   {"m4650", no_argument, NULL, OPTION_M4650},
10790 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10791   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10792 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10793   {"m4010", no_argument, NULL, OPTION_M4010},
10794 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10795   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10796 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10797   {"m4100", no_argument, NULL, OPTION_M4100},
10798 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10799   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10800 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10801   {"m3900", no_argument, NULL, OPTION_M3900},
10802 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10803   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10804
10805   /* Options which enable bug fixes.  */
10806 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10807 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10808   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10809 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10810   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10811   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10812 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10813 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10814   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10815   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10816 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10817 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10818   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
10819   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10820
10821   /* Miscellaneous options.  */
10822 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10823 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10824   {"trap", no_argument, NULL, OPTION_TRAP},
10825   {"no-break", no_argument, NULL, OPTION_TRAP},
10826 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10827   {"break", no_argument, NULL, OPTION_BREAK},
10828   {"no-trap", no_argument, NULL, OPTION_BREAK},
10829 #define OPTION_EB (OPTION_MISC_BASE + 2)
10830   {"EB", no_argument, NULL, OPTION_EB},
10831 #define OPTION_EL (OPTION_MISC_BASE + 3)
10832   {"EL", no_argument, NULL, OPTION_EL},
10833 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10834   {"mfp32", no_argument, NULL, OPTION_FP32},
10835 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10836   {"mgp32", no_argument, NULL, OPTION_GP32},
10837 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10838   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10839 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10840   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10841 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10842   {"mfp64", no_argument, NULL, OPTION_FP64},
10843 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10844   {"mgp64", no_argument, NULL, OPTION_GP64},
10845 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10846 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10847   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10848   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10849 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10850 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10851   {"mshared", no_argument, NULL, OPTION_MSHARED},
10852   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10853 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10854 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10855   {"msym32", no_argument, NULL, OPTION_MSYM32},
10856   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10857
10858   /* ELF-specific options.  */
10859 #ifdef OBJ_ELF
10860 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
10861 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10862   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10863   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10864 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10865   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10866 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10867   {"xgot",        no_argument, NULL, OPTION_XGOT},
10868 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10869   {"mabi", required_argument, NULL, OPTION_MABI},
10870 #define OPTION_32          (OPTION_ELF_BASE + 4)
10871   {"32",          no_argument, NULL, OPTION_32},
10872 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10873   {"n32",         no_argument, NULL, OPTION_N32},
10874 #define OPTION_64          (OPTION_ELF_BASE + 6)
10875   {"64",          no_argument, NULL, OPTION_64},
10876 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10877   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10878 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10879   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10880 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10881   {"mpdr", no_argument, NULL, OPTION_PDR},
10882 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10883   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10884 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10885   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10886 #endif /* OBJ_ELF */
10887
10888   {NULL, no_argument, NULL, 0}
10889 };
10890 size_t md_longopts_size = sizeof (md_longopts);
10891
10892 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10893    NEW_VALUE.  Warn if another value was already specified.  Note:
10894    we have to defer parsing the -march and -mtune arguments in order
10895    to handle 'from-abi' correctly, since the ABI might be specified
10896    in a later argument.  */
10897
10898 static void
10899 mips_set_option_string (const char **string_ptr, const char *new_value)
10900 {
10901   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10902     as_warn (_("A different %s was already specified, is now %s"),
10903              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10904              new_value);
10905
10906   *string_ptr = new_value;
10907 }
10908
10909 int
10910 md_parse_option (int c, char *arg)
10911 {
10912   switch (c)
10913     {
10914     case OPTION_CONSTRUCT_FLOATS:
10915       mips_disable_float_construction = 0;
10916       break;
10917
10918     case OPTION_NO_CONSTRUCT_FLOATS:
10919       mips_disable_float_construction = 1;
10920       break;
10921
10922     case OPTION_TRAP:
10923       mips_trap = 1;
10924       break;
10925
10926     case OPTION_BREAK:
10927       mips_trap = 0;
10928       break;
10929
10930     case OPTION_EB:
10931       target_big_endian = 1;
10932       break;
10933
10934     case OPTION_EL:
10935       target_big_endian = 0;
10936       break;
10937
10938     case 'O':
10939       if (arg && arg[1] == '0')
10940         mips_optimize = 1;
10941       else
10942         mips_optimize = 2;
10943       break;
10944
10945     case 'g':
10946       if (arg == NULL)
10947         mips_debug = 2;
10948       else
10949         mips_debug = atoi (arg);
10950       /* When the MIPS assembler sees -g or -g2, it does not do
10951          optimizations which limit full symbolic debugging.  We take
10952          that to be equivalent to -O0.  */
10953       if (mips_debug == 2)
10954         mips_optimize = 1;
10955       break;
10956
10957     case OPTION_MIPS1:
10958       file_mips_isa = ISA_MIPS1;
10959       break;
10960
10961     case OPTION_MIPS2:
10962       file_mips_isa = ISA_MIPS2;
10963       break;
10964
10965     case OPTION_MIPS3:
10966       file_mips_isa = ISA_MIPS3;
10967       break;
10968
10969     case OPTION_MIPS4:
10970       file_mips_isa = ISA_MIPS4;
10971       break;
10972
10973     case OPTION_MIPS5:
10974       file_mips_isa = ISA_MIPS5;
10975       break;
10976
10977     case OPTION_MIPS32:
10978       file_mips_isa = ISA_MIPS32;
10979       break;
10980
10981     case OPTION_MIPS32R2:
10982       file_mips_isa = ISA_MIPS32R2;
10983       break;
10984
10985     case OPTION_MIPS64R2:
10986       file_mips_isa = ISA_MIPS64R2;
10987       break;
10988
10989     case OPTION_MIPS64:
10990       file_mips_isa = ISA_MIPS64;
10991       break;
10992
10993     case OPTION_MTUNE:
10994       mips_set_option_string (&mips_tune_string, arg);
10995       break;
10996
10997     case OPTION_MARCH:
10998       mips_set_option_string (&mips_arch_string, arg);
10999       break;
11000
11001     case OPTION_M4650:
11002       mips_set_option_string (&mips_arch_string, "4650");
11003       mips_set_option_string (&mips_tune_string, "4650");
11004       break;
11005
11006     case OPTION_NO_M4650:
11007       break;
11008
11009     case OPTION_M4010:
11010       mips_set_option_string (&mips_arch_string, "4010");
11011       mips_set_option_string (&mips_tune_string, "4010");
11012       break;
11013
11014     case OPTION_NO_M4010:
11015       break;
11016
11017     case OPTION_M4100:
11018       mips_set_option_string (&mips_arch_string, "4100");
11019       mips_set_option_string (&mips_tune_string, "4100");
11020       break;
11021
11022     case OPTION_NO_M4100:
11023       break;
11024
11025     case OPTION_M3900:
11026       mips_set_option_string (&mips_arch_string, "3900");
11027       mips_set_option_string (&mips_tune_string, "3900");
11028       break;
11029
11030     case OPTION_NO_M3900:
11031       break;
11032
11033     case OPTION_MDMX:
11034       mips_opts.ase_mdmx = 1;
11035       break;
11036
11037     case OPTION_NO_MDMX:
11038       mips_opts.ase_mdmx = 0;
11039       break;
11040
11041     case OPTION_DSP:
11042       mips_opts.ase_dsp = 1;
11043       break;
11044
11045     case OPTION_NO_DSP:
11046       mips_opts.ase_dsp = 0;
11047       break;
11048
11049     case OPTION_MT:
11050       mips_opts.ase_mt = 1;
11051       break;
11052
11053     case OPTION_NO_MT:
11054       mips_opts.ase_mt = 0;
11055       break;
11056
11057     case OPTION_MIPS16:
11058       mips_opts.mips16 = 1;
11059       mips_no_prev_insn ();
11060       break;
11061
11062     case OPTION_NO_MIPS16:
11063       mips_opts.mips16 = 0;
11064       mips_no_prev_insn ();
11065       break;
11066
11067     case OPTION_MIPS3D:
11068       mips_opts.ase_mips3d = 1;
11069       break;
11070
11071     case OPTION_NO_MIPS3D:
11072       mips_opts.ase_mips3d = 0;
11073       break;
11074
11075     case OPTION_SMARTMIPS:
11076       mips_opts.ase_smartmips = 1;
11077       break;
11078
11079     case OPTION_NO_SMARTMIPS:
11080       mips_opts.ase_smartmips = 0;
11081       break;
11082
11083     case OPTION_FIX_VR4120:
11084       mips_fix_vr4120 = 1;
11085       break;
11086
11087     case OPTION_NO_FIX_VR4120:
11088       mips_fix_vr4120 = 0;
11089       break;
11090
11091     case OPTION_FIX_VR4130:
11092       mips_fix_vr4130 = 1;
11093       break;
11094
11095     case OPTION_NO_FIX_VR4130:
11096       mips_fix_vr4130 = 0;
11097       break;
11098
11099     case OPTION_RELAX_BRANCH:
11100       mips_relax_branch = 1;
11101       break;
11102
11103     case OPTION_NO_RELAX_BRANCH:
11104       mips_relax_branch = 0;
11105       break;
11106
11107     case OPTION_MSHARED:
11108       mips_in_shared = TRUE;
11109       break;
11110
11111     case OPTION_MNO_SHARED:
11112       mips_in_shared = FALSE;
11113       break;
11114
11115     case OPTION_MSYM32:
11116       mips_opts.sym32 = TRUE;
11117       break;
11118
11119     case OPTION_MNO_SYM32:
11120       mips_opts.sym32 = FALSE;
11121       break;
11122
11123 #ifdef OBJ_ELF
11124       /* When generating ELF code, we permit -KPIC and -call_shared to
11125          select SVR4_PIC, and -non_shared to select no PIC.  This is
11126          intended to be compatible with Irix 5.  */
11127     case OPTION_CALL_SHARED:
11128       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11129         {
11130           as_bad (_("-call_shared is supported only for ELF format"));
11131           return 0;
11132         }
11133       mips_pic = SVR4_PIC;
11134       mips_abicalls = TRUE;
11135       break;
11136
11137     case OPTION_NON_SHARED:
11138       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11139         {
11140           as_bad (_("-non_shared is supported only for ELF format"));
11141           return 0;
11142         }
11143       mips_pic = NO_PIC;
11144       mips_abicalls = FALSE;
11145       break;
11146
11147       /* The -xgot option tells the assembler to use 32 bit offsets
11148          when accessing the got in SVR4_PIC mode.  It is for Irix
11149          compatibility.  */
11150     case OPTION_XGOT:
11151       mips_big_got = 1;
11152       break;
11153 #endif /* OBJ_ELF */
11154
11155     case 'G':
11156       g_switch_value = atoi (arg);
11157       g_switch_seen = 1;
11158       break;
11159
11160 #ifdef OBJ_ELF
11161       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11162          and -mabi=64.  */
11163     case OPTION_32:
11164       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11165         {
11166           as_bad (_("-32 is supported for ELF format only"));
11167           return 0;
11168         }
11169       mips_abi = O32_ABI;
11170       break;
11171
11172     case OPTION_N32:
11173       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11174         {
11175           as_bad (_("-n32 is supported for ELF format only"));
11176           return 0;
11177         }
11178       mips_abi = N32_ABI;
11179       break;
11180
11181     case OPTION_64:
11182       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11183         {
11184           as_bad (_("-64 is supported for ELF format only"));
11185           return 0;
11186         }
11187       mips_abi = N64_ABI;
11188       if (! support_64bit_objects())
11189         as_fatal (_("No compiled in support for 64 bit object file format"));
11190       break;
11191 #endif /* OBJ_ELF */
11192
11193     case OPTION_GP32:
11194       file_mips_gp32 = 1;
11195       break;
11196
11197     case OPTION_GP64:
11198       file_mips_gp32 = 0;
11199       break;
11200
11201     case OPTION_FP32:
11202       file_mips_fp32 = 1;
11203       break;
11204
11205     case OPTION_FP64:
11206       file_mips_fp32 = 0;
11207       break;
11208
11209 #ifdef OBJ_ELF
11210     case OPTION_MABI:
11211       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11212         {
11213           as_bad (_("-mabi is supported for ELF format only"));
11214           return 0;
11215         }
11216       if (strcmp (arg, "32") == 0)
11217         mips_abi = O32_ABI;
11218       else if (strcmp (arg, "o64") == 0)
11219         mips_abi = O64_ABI;
11220       else if (strcmp (arg, "n32") == 0)
11221         mips_abi = N32_ABI;
11222       else if (strcmp (arg, "64") == 0)
11223         {
11224           mips_abi = N64_ABI;
11225           if (! support_64bit_objects())
11226             as_fatal (_("No compiled in support for 64 bit object file "
11227                         "format"));
11228         }
11229       else if (strcmp (arg, "eabi") == 0)
11230         mips_abi = EABI_ABI;
11231       else
11232         {
11233           as_fatal (_("invalid abi -mabi=%s"), arg);
11234           return 0;
11235         }
11236       break;
11237 #endif /* OBJ_ELF */
11238
11239     case OPTION_M7000_HILO_FIX:
11240       mips_7000_hilo_fix = TRUE;
11241       break;
11242
11243     case OPTION_MNO_7000_HILO_FIX:
11244       mips_7000_hilo_fix = FALSE;
11245       break;
11246
11247 #ifdef OBJ_ELF
11248     case OPTION_MDEBUG:
11249       mips_flag_mdebug = TRUE;
11250       break;
11251
11252     case OPTION_NO_MDEBUG:
11253       mips_flag_mdebug = FALSE;
11254       break;
11255
11256     case OPTION_PDR:
11257       mips_flag_pdr = TRUE;
11258       break;
11259
11260     case OPTION_NO_PDR:
11261       mips_flag_pdr = FALSE;
11262       break;
11263
11264     case OPTION_MVXWORKS_PIC:
11265       mips_pic = VXWORKS_PIC;
11266       break;
11267 #endif /* OBJ_ELF */
11268
11269     default:
11270       return 0;
11271     }
11272
11273   return 1;
11274 }
11275 \f
11276 /* Set up globals to generate code for the ISA or processor
11277    described by INFO.  */
11278
11279 static void
11280 mips_set_architecture (const struct mips_cpu_info *info)
11281 {
11282   if (info != 0)
11283     {
11284       file_mips_arch = info->cpu;
11285       mips_opts.arch = info->cpu;
11286       mips_opts.isa = info->isa;
11287     }
11288 }
11289
11290
11291 /* Likewise for tuning.  */
11292
11293 static void
11294 mips_set_tune (const struct mips_cpu_info *info)
11295 {
11296   if (info != 0)
11297     mips_tune = info->cpu;
11298 }
11299
11300
11301 void
11302 mips_after_parse_args (void)
11303 {
11304   const struct mips_cpu_info *arch_info = 0;
11305   const struct mips_cpu_info *tune_info = 0;
11306
11307   /* GP relative stuff not working for PE */
11308   if (strncmp (TARGET_OS, "pe", 2) == 0)
11309     {
11310       if (g_switch_seen && g_switch_value != 0)
11311         as_bad (_("-G not supported in this configuration."));
11312       g_switch_value = 0;
11313     }
11314
11315   if (mips_abi == NO_ABI)
11316     mips_abi = MIPS_DEFAULT_ABI;
11317
11318   /* The following code determines the architecture and register size.
11319      Similar code was added to GCC 3.3 (see override_options() in
11320      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11321      as much as possible.  */
11322
11323   if (mips_arch_string != 0)
11324     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11325
11326   if (file_mips_isa != ISA_UNKNOWN)
11327     {
11328       /* Handle -mipsN.  At this point, file_mips_isa contains the
11329          ISA level specified by -mipsN, while arch_info->isa contains
11330          the -march selection (if any).  */
11331       if (arch_info != 0)
11332         {
11333           /* -march takes precedence over -mipsN, since it is more descriptive.
11334              There's no harm in specifying both as long as the ISA levels
11335              are the same.  */
11336           if (file_mips_isa != arch_info->isa)
11337             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11338                     mips_cpu_info_from_isa (file_mips_isa)->name,
11339                     mips_cpu_info_from_isa (arch_info->isa)->name);
11340         }
11341       else
11342         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11343     }
11344
11345   if (arch_info == 0)
11346     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11347
11348   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11349     as_bad ("-march=%s is not compatible with the selected ABI",
11350             arch_info->name);
11351
11352   mips_set_architecture (arch_info);
11353
11354   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11355   if (mips_tune_string != 0)
11356     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11357
11358   if (tune_info == 0)
11359     mips_set_tune (arch_info);
11360   else
11361     mips_set_tune (tune_info);
11362
11363   if (file_mips_gp32 >= 0)
11364     {
11365       /* The user specified the size of the integer registers.  Make sure
11366          it agrees with the ABI and ISA.  */
11367       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11368         as_bad (_("-mgp64 used with a 32-bit processor"));
11369       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11370         as_bad (_("-mgp32 used with a 64-bit ABI"));
11371       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11372         as_bad (_("-mgp64 used with a 32-bit ABI"));
11373     }
11374   else
11375     {
11376       /* Infer the integer register size from the ABI and processor.
11377          Restrict ourselves to 32-bit registers if that's all the
11378          processor has, or if the ABI cannot handle 64-bit registers.  */
11379       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11380                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11381     }
11382
11383   /* ??? GAS treats single-float processors as though they had 64-bit
11384      float registers (although it complains when double-precision
11385      instructions are used).  As things stand, saying they have 32-bit
11386      registers would lead to spurious "register must be even" messages.
11387      So here we assume float registers are always the same size as
11388      integer ones, unless the user says otherwise.  */
11389   if (file_mips_fp32 < 0)
11390     file_mips_fp32 = file_mips_gp32;
11391
11392   /* End of GCC-shared inference code.  */
11393
11394   /* This flag is set when we have a 64-bit capable CPU but use only
11395      32-bit wide registers.  Note that EABI does not use it.  */
11396   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11397       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11398           || mips_abi == O32_ABI))
11399     mips_32bitmode = 1;
11400
11401   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11402     as_bad (_("trap exception not supported at ISA 1"));
11403
11404   /* If the selected architecture includes support for ASEs, enable
11405      generation of code for them.  */
11406   if (mips_opts.mips16 == -1)
11407     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11408   if (mips_opts.ase_mips3d == -1)
11409     mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
11410   if (mips_opts.ase_mdmx == -1)
11411     mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
11412   if (mips_opts.ase_dsp == -1)
11413     mips_opts.ase_dsp = (CPU_HAS_DSP (file_mips_arch)) ? 1 : 0;
11414   if (mips_opts.ase_mt == -1)
11415     mips_opts.ase_mt = (CPU_HAS_MT (file_mips_arch)) ? 1 : 0;
11416
11417   file_mips_isa = mips_opts.isa;
11418   file_ase_mips16 = mips_opts.mips16;
11419   file_ase_mips3d = mips_opts.ase_mips3d;
11420   file_ase_mdmx = mips_opts.ase_mdmx;
11421   file_ase_smartmips = mips_opts.ase_smartmips;
11422   file_ase_dsp = mips_opts.ase_dsp;
11423   file_ase_mt = mips_opts.ase_mt;
11424   mips_opts.gp32 = file_mips_gp32;
11425   mips_opts.fp32 = file_mips_fp32;
11426
11427   if (mips_flag_mdebug < 0)
11428     {
11429 #ifdef OBJ_MAYBE_ECOFF
11430       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11431         mips_flag_mdebug = 1;
11432       else
11433 #endif /* OBJ_MAYBE_ECOFF */
11434         mips_flag_mdebug = 0;
11435     }
11436 }
11437 \f
11438 void
11439 mips_init_after_args (void)
11440 {
11441   /* initialize opcodes */
11442   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11443   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11444 }
11445
11446 long
11447 md_pcrel_from (fixS *fixP)
11448 {
11449   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11450   switch (fixP->fx_r_type)
11451     {
11452     case BFD_RELOC_16_PCREL_S2:
11453     case BFD_RELOC_MIPS_JMP:
11454       /* Return the address of the delay slot.  */
11455       return addr + 4;
11456     default:
11457       return addr;
11458     }
11459 }
11460
11461 /* This is called before the symbol table is processed.  In order to
11462    work with gcc when using mips-tfile, we must keep all local labels.
11463    However, in other cases, we want to discard them.  If we were
11464    called with -g, but we didn't see any debugging information, it may
11465    mean that gcc is smuggling debugging information through to
11466    mips-tfile, in which case we must generate all local labels.  */
11467
11468 void
11469 mips_frob_file_before_adjust (void)
11470 {
11471 #ifndef NO_ECOFF_DEBUGGING
11472   if (ECOFF_DEBUGGING
11473       && mips_debug != 0
11474       && ! ecoff_debugging_seen)
11475     flag_keep_locals = 1;
11476 #endif
11477 }
11478
11479 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11480    the corresponding LO16 reloc.  This is called before md_apply_fix and
11481    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11482    relocation operators.
11483
11484    For our purposes, a %lo() expression matches a %got() or %hi()
11485    expression if:
11486
11487       (a) it refers to the same symbol; and
11488       (b) the offset applied in the %lo() expression is no lower than
11489           the offset applied in the %got() or %hi().
11490
11491    (b) allows us to cope with code like:
11492
11493         lui     $4,%hi(foo)
11494         lh      $4,%lo(foo+2)($4)
11495
11496    ...which is legal on RELA targets, and has a well-defined behaviour
11497    if the user knows that adding 2 to "foo" will not induce a carry to
11498    the high 16 bits.
11499
11500    When several %lo()s match a particular %got() or %hi(), we use the
11501    following rules to distinguish them:
11502
11503      (1) %lo()s with smaller offsets are a better match than %lo()s with
11504          higher offsets.
11505
11506      (2) %lo()s with no matching %got() or %hi() are better than those
11507          that already have a matching %got() or %hi().
11508
11509      (3) later %lo()s are better than earlier %lo()s.
11510
11511    These rules are applied in order.
11512
11513    (1) means, among other things, that %lo()s with identical offsets are
11514    chosen if they exist.
11515
11516    (2) means that we won't associate several high-part relocations with
11517    the same low-part relocation unless there's no alternative.  Having
11518    several high parts for the same low part is a GNU extension; this rule
11519    allows careful users to avoid it.
11520
11521    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11522    with the last high-part relocation being at the front of the list.
11523    It therefore makes sense to choose the last matching low-part
11524    relocation, all other things being equal.  It's also easier
11525    to code that way.  */
11526
11527 void
11528 mips_frob_file (void)
11529 {
11530   struct mips_hi_fixup *l;
11531
11532   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11533     {
11534       segment_info_type *seginfo;
11535       bfd_boolean matched_lo_p;
11536       fixS **hi_pos, **lo_pos, **pos;
11537
11538       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11539
11540       /* If a GOT16 relocation turns out to be against a global symbol,
11541          there isn't supposed to be a matching LO.  */
11542       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11543           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11544         continue;
11545
11546       /* Check quickly whether the next fixup happens to be a matching %lo.  */
11547       if (fixup_has_matching_lo_p (l->fixp))
11548         continue;
11549
11550       seginfo = seg_info (l->seg);
11551
11552       /* Set HI_POS to the position of this relocation in the chain.
11553          Set LO_POS to the position of the chosen low-part relocation.
11554          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11555          relocation that matches an immediately-preceding high-part
11556          relocation.  */
11557       hi_pos = NULL;
11558       lo_pos = NULL;
11559       matched_lo_p = FALSE;
11560       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11561         {
11562           if (*pos == l->fixp)
11563             hi_pos = pos;
11564
11565           if (((*pos)->fx_r_type == BFD_RELOC_LO16
11566                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11567               && (*pos)->fx_addsy == l->fixp->fx_addsy
11568               && (*pos)->fx_offset >= l->fixp->fx_offset
11569               && (lo_pos == NULL
11570                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
11571                   || (!matched_lo_p
11572                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11573             lo_pos = pos;
11574
11575           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11576                           && fixup_has_matching_lo_p (*pos));
11577         }
11578
11579       /* If we found a match, remove the high-part relocation from its
11580          current position and insert it before the low-part relocation.
11581          Make the offsets match so that fixup_has_matching_lo_p()
11582          will return true.
11583
11584          We don't warn about unmatched high-part relocations since some
11585          versions of gcc have been known to emit dead "lui ...%hi(...)"
11586          instructions.  */
11587       if (lo_pos != NULL)
11588         {
11589           l->fixp->fx_offset = (*lo_pos)->fx_offset;
11590           if (l->fixp->fx_next != *lo_pos)
11591             {
11592               *hi_pos = l->fixp->fx_next;
11593               l->fixp->fx_next = *lo_pos;
11594               *lo_pos = l->fixp;
11595             }
11596         }
11597     }
11598 }
11599
11600 /* We may have combined relocations without symbols in the N32/N64 ABI.
11601    We have to prevent gas from dropping them.  */
11602
11603 int
11604 mips_force_relocation (fixS *fixp)
11605 {
11606   if (generic_force_reloc (fixp))
11607     return 1;
11608
11609   if (HAVE_NEWABI
11610       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11611       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11612           || fixp->fx_r_type == BFD_RELOC_HI16_S
11613           || fixp->fx_r_type == BFD_RELOC_LO16))
11614     return 1;
11615
11616   return 0;
11617 }
11618
11619 /* Apply a fixup to the object file.  */
11620
11621 void
11622 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11623 {
11624   bfd_byte *buf;
11625   long insn;
11626   reloc_howto_type *howto;
11627
11628   /* We ignore generic BFD relocations we don't know about.  */
11629   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11630   if (! howto)
11631     return;
11632
11633   assert (fixP->fx_size == 4
11634           || fixP->fx_r_type == BFD_RELOC_16
11635           || fixP->fx_r_type == BFD_RELOC_64
11636           || fixP->fx_r_type == BFD_RELOC_CTOR
11637           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11638           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11639           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
11640
11641   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11642
11643   assert (! fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11644
11645   /* Don't treat parts of a composite relocation as done.  There are two
11646      reasons for this:
11647
11648      (1) The second and third parts will be against 0 (RSS_UNDEF) but
11649          should nevertheless be emitted if the first part is.
11650
11651      (2) In normal usage, composite relocations are never assembly-time
11652          constants.  The easiest way of dealing with the pathological
11653          exceptions is to generate a relocation against STN_UNDEF and
11654          leave everything up to the linker.  */
11655   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel && fixP->fx_tcbit == 0)
11656     fixP->fx_done = 1;
11657
11658   switch (fixP->fx_r_type)
11659     {
11660     case BFD_RELOC_MIPS_TLS_GD:
11661     case BFD_RELOC_MIPS_TLS_LDM:
11662     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11663     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11664     case BFD_RELOC_MIPS_TLS_GOTTPREL:
11665     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11666     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11667       S_SET_THREAD_LOCAL (fixP->fx_addsy);
11668       /* fall through */
11669
11670     case BFD_RELOC_MIPS_JMP:
11671     case BFD_RELOC_MIPS_SHIFT5:
11672     case BFD_RELOC_MIPS_SHIFT6:
11673     case BFD_RELOC_MIPS_GOT_DISP:
11674     case BFD_RELOC_MIPS_GOT_PAGE:
11675     case BFD_RELOC_MIPS_GOT_OFST:
11676     case BFD_RELOC_MIPS_SUB:
11677     case BFD_RELOC_MIPS_INSERT_A:
11678     case BFD_RELOC_MIPS_INSERT_B:
11679     case BFD_RELOC_MIPS_DELETE:
11680     case BFD_RELOC_MIPS_HIGHEST:
11681     case BFD_RELOC_MIPS_HIGHER:
11682     case BFD_RELOC_MIPS_SCN_DISP:
11683     case BFD_RELOC_MIPS_REL16:
11684     case BFD_RELOC_MIPS_RELGOT:
11685     case BFD_RELOC_MIPS_JALR:
11686     case BFD_RELOC_HI16:
11687     case BFD_RELOC_HI16_S:
11688     case BFD_RELOC_GPREL16:
11689     case BFD_RELOC_MIPS_LITERAL:
11690     case BFD_RELOC_MIPS_CALL16:
11691     case BFD_RELOC_MIPS_GOT16:
11692     case BFD_RELOC_GPREL32:
11693     case BFD_RELOC_MIPS_GOT_HI16:
11694     case BFD_RELOC_MIPS_GOT_LO16:
11695     case BFD_RELOC_MIPS_CALL_HI16:
11696     case BFD_RELOC_MIPS_CALL_LO16:
11697     case BFD_RELOC_MIPS16_GPREL:
11698     case BFD_RELOC_MIPS16_HI16:
11699     case BFD_RELOC_MIPS16_HI16_S:
11700       /* Nothing needed to do. The value comes from the reloc entry */
11701       break;
11702
11703     case BFD_RELOC_MIPS16_JMP:
11704       /* We currently always generate a reloc against a symbol, which
11705          means that we don't want an addend even if the symbol is
11706          defined.  */
11707       *valP = 0;
11708       break;
11709
11710     case BFD_RELOC_64:
11711       /* This is handled like BFD_RELOC_32, but we output a sign
11712          extended value if we are only 32 bits.  */
11713       if (fixP->fx_done)
11714         {
11715           if (8 <= sizeof (valueT))
11716             md_number_to_chars ((char *) buf, *valP, 8);
11717           else
11718             {
11719               valueT hiv;
11720
11721               if ((*valP & 0x80000000) != 0)
11722                 hiv = 0xffffffff;
11723               else
11724                 hiv = 0;
11725               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11726                                   *valP, 4);
11727               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11728                                   hiv, 4);
11729             }
11730         }
11731       break;
11732
11733     case BFD_RELOC_RVA:
11734     case BFD_RELOC_32:
11735       /* If we are deleting this reloc entry, we must fill in the
11736          value now.  This can happen if we have a .word which is not
11737          resolved when it appears but is later defined.   */
11738       if (fixP->fx_done)
11739         md_number_to_chars ((char *) buf, *valP, 4);
11740       break;
11741
11742     case BFD_RELOC_16:
11743       /* If we are deleting this reloc entry, we must fill in the
11744          value now.  */
11745       if (fixP->fx_done)
11746         md_number_to_chars ((char *) buf, *valP, 2);
11747       break;
11748
11749     case BFD_RELOC_LO16:
11750     case BFD_RELOC_MIPS16_LO16:
11751       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11752          may be safe to remove, but if so it's not obvious.  */
11753       /* When handling an embedded PIC switch statement, we can wind
11754          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11755       if (fixP->fx_done)
11756         {
11757           if (*valP + 0x8000 > 0xffff)
11758             as_bad_where (fixP->fx_file, fixP->fx_line,
11759                           _("relocation overflow"));
11760           if (target_big_endian)
11761             buf += 2;
11762           md_number_to_chars ((char *) buf, *valP, 2);
11763         }
11764       break;
11765
11766     case BFD_RELOC_16_PCREL_S2:
11767       if ((*valP & 0x3) != 0)
11768         as_bad_where (fixP->fx_file, fixP->fx_line,
11769                       _("Branch to misaligned address (%lx)"), (long) *valP);
11770
11771       /*
11772        * We need to save the bits in the instruction since fixup_segment()
11773        * might be deleting the relocation entry (i.e., a branch within
11774        * the current segment).
11775        */
11776       if (! fixP->fx_done)
11777         break;
11778
11779       /* update old instruction data */
11780       if (target_big_endian)
11781         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11782       else
11783         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11784
11785       if (*valP + 0x20000 <= 0x3ffff)
11786         {
11787           insn |= (*valP >> 2) & 0xffff;
11788           md_number_to_chars ((char *) buf, insn, 4);
11789         }
11790       else if (mips_pic == NO_PIC
11791                && fixP->fx_done
11792                && fixP->fx_frag->fr_address >= text_section->vma
11793                && (fixP->fx_frag->fr_address
11794                    < text_section->vma + bfd_get_section_size (text_section))
11795                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11796                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11797                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11798         {
11799           /* The branch offset is too large.  If this is an
11800              unconditional branch, and we are not generating PIC code,
11801              we can convert it to an absolute jump instruction.  */
11802           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11803             insn = 0x0c000000;  /* jal */
11804           else
11805             insn = 0x08000000;  /* j */
11806           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11807           fixP->fx_done = 0;
11808           fixP->fx_addsy = section_symbol (text_section);
11809           *valP += md_pcrel_from (fixP);
11810           md_number_to_chars ((char *) buf, insn, 4);
11811         }
11812       else
11813         {
11814           /* If we got here, we have branch-relaxation disabled,
11815              and there's nothing we can do to fix this instruction
11816              without turning it into a longer sequence.  */
11817           as_bad_where (fixP->fx_file, fixP->fx_line,
11818                         _("Branch out of range"));
11819         }
11820       break;
11821
11822     case BFD_RELOC_VTABLE_INHERIT:
11823       fixP->fx_done = 0;
11824       if (fixP->fx_addsy
11825           && !S_IS_DEFINED (fixP->fx_addsy)
11826           && !S_IS_WEAK (fixP->fx_addsy))
11827         S_SET_WEAK (fixP->fx_addsy);
11828       break;
11829
11830     case BFD_RELOC_VTABLE_ENTRY:
11831       fixP->fx_done = 0;
11832       break;
11833
11834     default:
11835       internalError ();
11836     }
11837
11838   /* Remember value for tc_gen_reloc.  */
11839   fixP->fx_addnumber = *valP;
11840 }
11841
11842 static symbolS *
11843 get_symbol (void)
11844 {
11845   int c;
11846   char *name;
11847   symbolS *p;
11848
11849   name = input_line_pointer;
11850   c = get_symbol_end ();
11851   p = (symbolS *) symbol_find_or_make (name);
11852   *input_line_pointer = c;
11853   return p;
11854 }
11855
11856 /* Align the current frag to a given power of two.  The MIPS assembler
11857    also automatically adjusts any preceding label.  */
11858
11859 static void
11860 mips_align (int to, int fill, symbolS *label)
11861 {
11862   mips_emit_delays ();
11863   frag_align (to, fill, 0);
11864   record_alignment (now_seg, to);
11865   if (label != NULL)
11866     {
11867       assert (S_GET_SEGMENT (label) == now_seg);
11868       symbol_set_frag (label, frag_now);
11869       S_SET_VALUE (label, (valueT) frag_now_fix ());
11870     }
11871 }
11872
11873 /* Align to a given power of two.  .align 0 turns off the automatic
11874    alignment used by the data creating pseudo-ops.  */
11875
11876 static void
11877 s_align (int x ATTRIBUTE_UNUSED)
11878 {
11879   register int temp;
11880   register long temp_fill;
11881   long max_alignment = 15;
11882
11883   /*
11884
11885     o  Note that the assembler pulls down any immediately preceding label
11886        to the aligned address.
11887     o  It's not documented but auto alignment is reinstated by
11888        a .align pseudo instruction.
11889     o  Note also that after auto alignment is turned off the mips assembler
11890        issues an error on attempt to assemble an improperly aligned data item.
11891        We don't.
11892
11893     */
11894
11895   temp = get_absolute_expression ();
11896   if (temp > max_alignment)
11897     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11898   else if (temp < 0)
11899     {
11900       as_warn (_("Alignment negative: 0 assumed."));
11901       temp = 0;
11902     }
11903   if (*input_line_pointer == ',')
11904     {
11905       ++input_line_pointer;
11906       temp_fill = get_absolute_expression ();
11907     }
11908   else
11909     temp_fill = 0;
11910   if (temp)
11911     {
11912       auto_align = 1;
11913       mips_align (temp, (int) temp_fill,
11914                   insn_labels != NULL ? insn_labels->label : NULL);
11915     }
11916   else
11917     {
11918       auto_align = 0;
11919     }
11920
11921   demand_empty_rest_of_line ();
11922 }
11923
11924 static void
11925 s_change_sec (int sec)
11926 {
11927   segT seg;
11928
11929 #ifdef OBJ_ELF
11930   /* The ELF backend needs to know that we are changing sections, so
11931      that .previous works correctly.  We could do something like check
11932      for an obj_section_change_hook macro, but that might be confusing
11933      as it would not be appropriate to use it in the section changing
11934      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11935      This should be cleaner, somehow.  */
11936   obj_elf_section_change_hook ();
11937 #endif
11938
11939   mips_emit_delays ();
11940   switch (sec)
11941     {
11942     case 't':
11943       s_text (0);
11944       break;
11945     case 'd':
11946       s_data (0);
11947       break;
11948     case 'b':
11949       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11950       demand_empty_rest_of_line ();
11951       break;
11952
11953     case 'r':
11954       seg = subseg_new (RDATA_SECTION_NAME,
11955                         (subsegT) get_absolute_expression ());
11956       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11957         {
11958           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
11959                                                   | SEC_READONLY | SEC_RELOC
11960                                                   | SEC_DATA));
11961           if (strcmp (TARGET_OS, "elf") != 0)
11962             record_alignment (seg, 4);
11963         }
11964       demand_empty_rest_of_line ();
11965       break;
11966
11967     case 's':
11968       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11969       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11970         {
11971           bfd_set_section_flags (stdoutput, seg,
11972                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
11973           if (strcmp (TARGET_OS, "elf") != 0)
11974             record_alignment (seg, 4);
11975         }
11976       demand_empty_rest_of_line ();
11977       break;
11978     }
11979
11980   auto_align = 1;
11981 }
11982
11983 void
11984 s_change_section (int ignore ATTRIBUTE_UNUSED)
11985 {
11986 #ifdef OBJ_ELF
11987   char *section_name;
11988   char c;
11989   char next_c = 0;
11990   int section_type;
11991   int section_flag;
11992   int section_entry_size;
11993   int section_alignment;
11994
11995   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11996     return;
11997
11998   section_name = input_line_pointer;
11999   c = get_symbol_end ();
12000   if (c)
12001     next_c = *(input_line_pointer + 1);
12002
12003   /* Do we have .section Name<,"flags">?  */
12004   if (c != ',' || (c == ',' && next_c == '"'))
12005     {
12006       /* just after name is now '\0'.  */
12007       *input_line_pointer = c;
12008       input_line_pointer = section_name;
12009       obj_elf_section (ignore);
12010       return;
12011     }
12012   input_line_pointer++;
12013
12014   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12015   if (c == ',')
12016     section_type = get_absolute_expression ();
12017   else
12018     section_type = 0;
12019   if (*input_line_pointer++ == ',')
12020     section_flag = get_absolute_expression ();
12021   else
12022     section_flag = 0;
12023   if (*input_line_pointer++ == ',')
12024     section_entry_size = get_absolute_expression ();
12025   else
12026     section_entry_size = 0;
12027   if (*input_line_pointer++ == ',')
12028     section_alignment = get_absolute_expression ();
12029   else
12030     section_alignment = 0;
12031
12032   section_name = xstrdup (section_name);
12033
12034   /* When using the generic form of .section (as implemented by obj-elf.c),
12035      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12036      traditionally had to fall back on the more common @progbits instead.
12037
12038      There's nothing really harmful in this, since bfd will correct
12039      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12040      means that, for backwards compatibility, the special_section entries
12041      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12042
12043      Even so, we shouldn't force users of the MIPS .section syntax to
12044      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12045      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12046      generic type-checking code.  */
12047   if (section_type == SHT_MIPS_DWARF)
12048     section_type = SHT_PROGBITS;
12049
12050   obj_elf_change_section (section_name, section_type, section_flag,
12051                           section_entry_size, 0, 0, 0);
12052
12053   if (now_seg->name != section_name)
12054     free (section_name);
12055 #endif /* OBJ_ELF */
12056 }
12057
12058 void
12059 mips_enable_auto_align (void)
12060 {
12061   auto_align = 1;
12062 }
12063
12064 static void
12065 s_cons (int log_size)
12066 {
12067   symbolS *label;
12068
12069   label = insn_labels != NULL ? insn_labels->label : NULL;
12070   mips_emit_delays ();
12071   if (log_size > 0 && auto_align)
12072     mips_align (log_size, 0, label);
12073   mips_clear_insn_labels ();
12074   cons (1 << log_size);
12075 }
12076
12077 static void
12078 s_float_cons (int type)
12079 {
12080   symbolS *label;
12081
12082   label = insn_labels != NULL ? insn_labels->label : NULL;
12083
12084   mips_emit_delays ();
12085
12086   if (auto_align)
12087     {
12088       if (type == 'd')
12089         mips_align (3, 0, label);
12090       else
12091         mips_align (2, 0, label);
12092     }
12093
12094   mips_clear_insn_labels ();
12095
12096   float_cons (type);
12097 }
12098
12099 /* Handle .globl.  We need to override it because on Irix 5 you are
12100    permitted to say
12101        .globl foo .text
12102    where foo is an undefined symbol, to mean that foo should be
12103    considered to be the address of a function.  */
12104
12105 static void
12106 s_mips_globl (int x ATTRIBUTE_UNUSED)
12107 {
12108   char *name;
12109   int c;
12110   symbolS *symbolP;
12111   flagword flag;
12112
12113   do
12114     {
12115       name = input_line_pointer;
12116       c = get_symbol_end ();
12117       symbolP = symbol_find_or_make (name);
12118       S_SET_EXTERNAL (symbolP);
12119
12120       *input_line_pointer = c;
12121       SKIP_WHITESPACE ();
12122
12123       /* On Irix 5, every global symbol that is not explicitly labelled as
12124          being a function is apparently labelled as being an object.  */
12125       flag = BSF_OBJECT;
12126
12127       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12128           && (*input_line_pointer != ','))
12129         {
12130           char *secname;
12131           asection *sec;
12132
12133           secname = input_line_pointer;
12134           c = get_symbol_end ();
12135           sec = bfd_get_section_by_name (stdoutput, secname);
12136           if (sec == NULL)
12137             as_bad (_("%s: no such section"), secname);
12138           *input_line_pointer = c;
12139
12140           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12141             flag = BSF_FUNCTION;
12142         }
12143
12144       symbol_get_bfdsym (symbolP)->flags |= flag;
12145
12146       c = *input_line_pointer;
12147       if (c == ',')
12148         {
12149           input_line_pointer++;
12150           SKIP_WHITESPACE ();
12151           if (is_end_of_line[(unsigned char) *input_line_pointer])
12152             c = '\n';
12153         }
12154     }
12155   while (c == ',');
12156
12157   demand_empty_rest_of_line ();
12158 }
12159
12160 static void
12161 s_option (int x ATTRIBUTE_UNUSED)
12162 {
12163   char *opt;
12164   char c;
12165
12166   opt = input_line_pointer;
12167   c = get_symbol_end ();
12168
12169   if (*opt == 'O')
12170     {
12171       /* FIXME: What does this mean?  */
12172     }
12173   else if (strncmp (opt, "pic", 3) == 0)
12174     {
12175       int i;
12176
12177       i = atoi (opt + 3);
12178       if (i == 0)
12179         mips_pic = NO_PIC;
12180       else if (i == 2)
12181         {
12182         mips_pic = SVR4_PIC;
12183           mips_abicalls = TRUE;
12184         }
12185       else
12186         as_bad (_(".option pic%d not supported"), i);
12187
12188       if (mips_pic == SVR4_PIC)
12189         {
12190           if (g_switch_seen && g_switch_value != 0)
12191             as_warn (_("-G may not be used with SVR4 PIC code"));
12192           g_switch_value = 0;
12193           bfd_set_gp_size (stdoutput, 0);
12194         }
12195     }
12196   else
12197     as_warn (_("Unrecognized option \"%s\""), opt);
12198
12199   *input_line_pointer = c;
12200   demand_empty_rest_of_line ();
12201 }
12202
12203 /* This structure is used to hold a stack of .set values.  */
12204
12205 struct mips_option_stack
12206 {
12207   struct mips_option_stack *next;
12208   struct mips_set_options options;
12209 };
12210
12211 static struct mips_option_stack *mips_opts_stack;
12212
12213 /* Handle the .set pseudo-op.  */
12214
12215 static void
12216 s_mipsset (int x ATTRIBUTE_UNUSED)
12217 {
12218   char *name = input_line_pointer, ch;
12219
12220   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12221     ++input_line_pointer;
12222   ch = *input_line_pointer;
12223   *input_line_pointer = '\0';
12224
12225   if (strcmp (name, "reorder") == 0)
12226     {
12227       if (mips_opts.noreorder)
12228         end_noreorder ();
12229     }
12230   else if (strcmp (name, "noreorder") == 0)
12231     {
12232       if (!mips_opts.noreorder)
12233         start_noreorder ();
12234     }
12235   else if (strcmp (name, "at") == 0)
12236     {
12237       mips_opts.noat = 0;
12238     }
12239   else if (strcmp (name, "noat") == 0)
12240     {
12241       mips_opts.noat = 1;
12242     }
12243   else if (strcmp (name, "macro") == 0)
12244     {
12245       mips_opts.warn_about_macros = 0;
12246     }
12247   else if (strcmp (name, "nomacro") == 0)
12248     {
12249       if (mips_opts.noreorder == 0)
12250         as_bad (_("`noreorder' must be set before `nomacro'"));
12251       mips_opts.warn_about_macros = 1;
12252     }
12253   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12254     {
12255       mips_opts.nomove = 0;
12256     }
12257   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12258     {
12259       mips_opts.nomove = 1;
12260     }
12261   else if (strcmp (name, "bopt") == 0)
12262     {
12263       mips_opts.nobopt = 0;
12264     }
12265   else if (strcmp (name, "nobopt") == 0)
12266     {
12267       mips_opts.nobopt = 1;
12268     }
12269   else if (strcmp (name, "mips16") == 0
12270            || strcmp (name, "MIPS-16") == 0)
12271     mips_opts.mips16 = 1;
12272   else if (strcmp (name, "nomips16") == 0
12273            || strcmp (name, "noMIPS-16") == 0)
12274     mips_opts.mips16 = 0;
12275   else if (strcmp (name, "smartmips") == 0)
12276     {
12277       if (!ISA_SUPPORT_SMARTMIPS)
12278         as_warn ("%s ISA does not support SmartMIPS ASE", 
12279                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12280       mips_opts.ase_smartmips = 1;
12281     }
12282   else if (strcmp (name, "nosmartmips") == 0)
12283     mips_opts.ase_smartmips = 0;
12284   else if (strcmp (name, "mips3d") == 0)
12285     mips_opts.ase_mips3d = 1;
12286   else if (strcmp (name, "nomips3d") == 0)
12287     mips_opts.ase_mips3d = 0;
12288   else if (strcmp (name, "mdmx") == 0)
12289     mips_opts.ase_mdmx = 1;
12290   else if (strcmp (name, "nomdmx") == 0)
12291     mips_opts.ase_mdmx = 0;
12292   else if (strcmp (name, "dsp") == 0)
12293     mips_opts.ase_dsp = 1;
12294   else if (strcmp (name, "nodsp") == 0)
12295     mips_opts.ase_dsp = 0;
12296   else if (strcmp (name, "mt") == 0)
12297     mips_opts.ase_mt = 1;
12298   else if (strcmp (name, "nomt") == 0)
12299     mips_opts.ase_mt = 0;
12300   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12301     {
12302       int reset = 0;
12303
12304       /* Permit the user to change the ISA and architecture on the fly.
12305          Needless to say, misuse can cause serious problems.  */
12306       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12307         {
12308           reset = 1;
12309           mips_opts.isa = file_mips_isa;
12310           mips_opts.arch = file_mips_arch;
12311         }
12312       else if (strncmp (name, "arch=", 5) == 0)
12313         {
12314           const struct mips_cpu_info *p;
12315
12316           p = mips_parse_cpu("internal use", name + 5);
12317           if (!p)
12318             as_bad (_("unknown architecture %s"), name + 5);
12319           else
12320             {
12321               mips_opts.arch = p->cpu;
12322               mips_opts.isa = p->isa;
12323             }
12324         }
12325       else if (strncmp (name, "mips", 4) == 0)
12326         {
12327           const struct mips_cpu_info *p;
12328
12329           p = mips_parse_cpu("internal use", name);
12330           if (!p)
12331             as_bad (_("unknown ISA level %s"), name + 4);
12332           else
12333             {
12334               mips_opts.arch = p->cpu;
12335               mips_opts.isa = p->isa;
12336             }
12337         }
12338       else
12339         as_bad (_("unknown ISA or architecture %s"), name);
12340
12341       switch (mips_opts.isa)
12342         {
12343         case  0:
12344           break;
12345         case ISA_MIPS1:
12346         case ISA_MIPS2:
12347         case ISA_MIPS32:
12348         case ISA_MIPS32R2:
12349           mips_opts.gp32 = 1;
12350           mips_opts.fp32 = 1;
12351           break;
12352         case ISA_MIPS3:
12353         case ISA_MIPS4:
12354         case ISA_MIPS5:
12355         case ISA_MIPS64:
12356         case ISA_MIPS64R2:
12357           mips_opts.gp32 = 0;
12358           mips_opts.fp32 = 0;
12359           break;
12360         default:
12361           as_bad (_("unknown ISA level %s"), name + 4);
12362           break;
12363         }
12364       if (reset)
12365         {
12366           mips_opts.gp32 = file_mips_gp32;
12367           mips_opts.fp32 = file_mips_fp32;
12368         }
12369     }
12370   else if (strcmp (name, "autoextend") == 0)
12371     mips_opts.noautoextend = 0;
12372   else if (strcmp (name, "noautoextend") == 0)
12373     mips_opts.noautoextend = 1;
12374   else if (strcmp (name, "push") == 0)
12375     {
12376       struct mips_option_stack *s;
12377
12378       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12379       s->next = mips_opts_stack;
12380       s->options = mips_opts;
12381       mips_opts_stack = s;
12382     }
12383   else if (strcmp (name, "pop") == 0)
12384     {
12385       struct mips_option_stack *s;
12386
12387       s = mips_opts_stack;
12388       if (s == NULL)
12389         as_bad (_(".set pop with no .set push"));
12390       else
12391         {
12392           /* If we're changing the reorder mode we need to handle
12393              delay slots correctly.  */
12394           if (s->options.noreorder && ! mips_opts.noreorder)
12395             start_noreorder ();
12396           else if (! s->options.noreorder && mips_opts.noreorder)
12397             end_noreorder ();
12398
12399           mips_opts = s->options;
12400           mips_opts_stack = s->next;
12401           free (s);
12402         }
12403     }
12404   else if (strcmp (name, "sym32") == 0)
12405     mips_opts.sym32 = TRUE;
12406   else if (strcmp (name, "nosym32") == 0)
12407     mips_opts.sym32 = FALSE;
12408   else
12409     {
12410       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12411     }
12412   *input_line_pointer = ch;
12413   demand_empty_rest_of_line ();
12414 }
12415
12416 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12417    .option pic2.  It means to generate SVR4 PIC calls.  */
12418
12419 static void
12420 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12421 {
12422   mips_pic = SVR4_PIC;
12423   mips_abicalls = TRUE;
12424
12425   if (g_switch_seen && g_switch_value != 0)
12426     as_warn (_("-G may not be used with SVR4 PIC code"));
12427   g_switch_value = 0;
12428
12429   bfd_set_gp_size (stdoutput, 0);
12430   demand_empty_rest_of_line ();
12431 }
12432
12433 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12434    PIC code.  It sets the $gp register for the function based on the
12435    function address, which is in the register named in the argument.
12436    This uses a relocation against _gp_disp, which is handled specially
12437    by the linker.  The result is:
12438         lui     $gp,%hi(_gp_disp)
12439         addiu   $gp,$gp,%lo(_gp_disp)
12440         addu    $gp,$gp,.cpload argument
12441    The .cpload argument is normally $25 == $t9.
12442
12443    The -mno-shared option changes this to:
12444         lui     $gp,%hi(__gnu_local_gp)
12445         addiu   $gp,$gp,%lo(__gnu_local_gp)
12446    and the argument is ignored.  This saves an instruction, but the
12447    resulting code is not position independent; it uses an absolute
12448    address for __gnu_local_gp.  Thus code assembled with -mno-shared
12449    can go into an ordinary executable, but not into a shared library.  */
12450
12451 static void
12452 s_cpload (int ignore ATTRIBUTE_UNUSED)
12453 {
12454   expressionS ex;
12455   int reg;
12456   int in_shared;
12457
12458   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12459      .cpload is ignored.  */
12460   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12461     {
12462       s_ignore (0);
12463       return;
12464     }
12465
12466   /* .cpload should be in a .set noreorder section.  */
12467   if (mips_opts.noreorder == 0)
12468     as_warn (_(".cpload not in noreorder section"));
12469
12470   reg = tc_get_register (0);
12471
12472   /* If we need to produce a 64-bit address, we are better off using
12473      the default instruction sequence.  */
12474   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12475
12476   ex.X_op = O_symbol;
12477   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12478                                          "__gnu_local_gp");
12479   ex.X_op_symbol = NULL;
12480   ex.X_add_number = 0;
12481
12482   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12483   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12484
12485   macro_start ();
12486   macro_build_lui (&ex, mips_gp_register);
12487   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12488                mips_gp_register, BFD_RELOC_LO16);
12489   if (in_shared)
12490     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12491                  mips_gp_register, reg);
12492   macro_end ();
12493
12494   demand_empty_rest_of_line ();
12495 }
12496
12497 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12498      .cpsetup $reg1, offset|$reg2, label
12499
12500    If offset is given, this results in:
12501      sd         $gp, offset($sp)
12502      lui        $gp, %hi(%neg(%gp_rel(label)))
12503      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12504      daddu      $gp, $gp, $reg1
12505
12506    If $reg2 is given, this results in:
12507      daddu      $reg2, $gp, $0
12508      lui        $gp, %hi(%neg(%gp_rel(label)))
12509      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12510      daddu      $gp, $gp, $reg1
12511    $reg1 is normally $25 == $t9.
12512
12513    The -mno-shared option replaces the last three instructions with
12514         lui     $gp,%hi(_gp)
12515         addiu   $gp,$gp,%lo(_gp)
12516    */
12517
12518 static void
12519 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12520 {
12521   expressionS ex_off;
12522   expressionS ex_sym;
12523   int reg1;
12524
12525   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12526      We also need NewABI support.  */
12527   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12528     {
12529       s_ignore (0);
12530       return;
12531     }
12532
12533   reg1 = tc_get_register (0);
12534   SKIP_WHITESPACE ();
12535   if (*input_line_pointer != ',')
12536     {
12537       as_bad (_("missing argument separator ',' for .cpsetup"));
12538       return;
12539     }
12540   else
12541     ++input_line_pointer;
12542   SKIP_WHITESPACE ();
12543   if (*input_line_pointer == '$')
12544     {
12545       mips_cpreturn_register = tc_get_register (0);
12546       mips_cpreturn_offset = -1;
12547     }
12548   else
12549     {
12550       mips_cpreturn_offset = get_absolute_expression ();
12551       mips_cpreturn_register = -1;
12552     }
12553   SKIP_WHITESPACE ();
12554   if (*input_line_pointer != ',')
12555     {
12556       as_bad (_("missing argument separator ',' for .cpsetup"));
12557       return;
12558     }
12559   else
12560     ++input_line_pointer;
12561   SKIP_WHITESPACE ();
12562   expression (&ex_sym);
12563
12564   macro_start ();
12565   if (mips_cpreturn_register == -1)
12566     {
12567       ex_off.X_op = O_constant;
12568       ex_off.X_add_symbol = NULL;
12569       ex_off.X_op_symbol = NULL;
12570       ex_off.X_add_number = mips_cpreturn_offset;
12571
12572       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12573                    BFD_RELOC_LO16, SP);
12574     }
12575   else
12576     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12577                  mips_gp_register, 0);
12578
12579   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12580     {
12581       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12582                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12583                    BFD_RELOC_HI16_S);
12584
12585       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12586                    mips_gp_register, -1, BFD_RELOC_GPREL16,
12587                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12588
12589       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12590                    mips_gp_register, reg1);
12591     }
12592   else
12593     {
12594       expressionS ex;
12595
12596       ex.X_op = O_symbol;
12597       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12598       ex.X_op_symbol = NULL;
12599       ex.X_add_number = 0;
12600
12601       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12602       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12603
12604       macro_build_lui (&ex, mips_gp_register);
12605       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12606                    mips_gp_register, BFD_RELOC_LO16);
12607     }
12608
12609   macro_end ();
12610
12611   demand_empty_rest_of_line ();
12612 }
12613
12614 static void
12615 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12616 {
12617   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12618    .cplocal is ignored.  */
12619   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12620     {
12621       s_ignore (0);
12622       return;
12623     }
12624
12625   mips_gp_register = tc_get_register (0);
12626   demand_empty_rest_of_line ();
12627 }
12628
12629 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12630    offset from $sp.  The offset is remembered, and after making a PIC
12631    call $gp is restored from that location.  */
12632
12633 static void
12634 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12635 {
12636   expressionS ex;
12637
12638   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12639      .cprestore is ignored.  */
12640   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12641     {
12642       s_ignore (0);
12643       return;
12644     }
12645
12646   mips_cprestore_offset = get_absolute_expression ();
12647   mips_cprestore_valid = 1;
12648
12649   ex.X_op = O_constant;
12650   ex.X_add_symbol = NULL;
12651   ex.X_op_symbol = NULL;
12652   ex.X_add_number = mips_cprestore_offset;
12653
12654   macro_start ();
12655   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12656                                 SP, HAVE_64BIT_ADDRESSES);
12657   macro_end ();
12658
12659   demand_empty_rest_of_line ();
12660 }
12661
12662 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12663    was given in the preceding .cpsetup, it results in:
12664      ld         $gp, offset($sp)
12665
12666    If a register $reg2 was given there, it results in:
12667      daddu      $gp, $reg2, $0
12668  */
12669 static void
12670 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12671 {
12672   expressionS ex;
12673
12674   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12675      We also need NewABI support.  */
12676   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12677     {
12678       s_ignore (0);
12679       return;
12680     }
12681
12682   macro_start ();
12683   if (mips_cpreturn_register == -1)
12684     {
12685       ex.X_op = O_constant;
12686       ex.X_add_symbol = NULL;
12687       ex.X_op_symbol = NULL;
12688       ex.X_add_number = mips_cpreturn_offset;
12689
12690       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12691     }
12692   else
12693     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12694                  mips_cpreturn_register, 0);
12695   macro_end ();
12696
12697   demand_empty_rest_of_line ();
12698 }
12699
12700 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12701    code.  It sets the offset to use in gp_rel relocations.  */
12702
12703 static void
12704 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12705 {
12706   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12707      We also need NewABI support.  */
12708   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12709     {
12710       s_ignore (0);
12711       return;
12712     }
12713
12714   mips_gprel_offset = get_absolute_expression ();
12715
12716   demand_empty_rest_of_line ();
12717 }
12718
12719 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12720    code.  It generates a 32 bit GP relative reloc.  */
12721
12722 static void
12723 s_gpword (int ignore ATTRIBUTE_UNUSED)
12724 {
12725   symbolS *label;
12726   expressionS ex;
12727   char *p;
12728
12729   /* When not generating PIC code, this is treated as .word.  */
12730   if (mips_pic != SVR4_PIC)
12731     {
12732       s_cons (2);
12733       return;
12734     }
12735
12736   label = insn_labels != NULL ? insn_labels->label : NULL;
12737   mips_emit_delays ();
12738   if (auto_align)
12739     mips_align (2, 0, label);
12740   mips_clear_insn_labels ();
12741
12742   expression (&ex);
12743
12744   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12745     {
12746       as_bad (_("Unsupported use of .gpword"));
12747       ignore_rest_of_line ();
12748     }
12749
12750   p = frag_more (4);
12751   md_number_to_chars (p, 0, 4);
12752   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12753                BFD_RELOC_GPREL32);
12754
12755   demand_empty_rest_of_line ();
12756 }
12757
12758 static void
12759 s_gpdword (int ignore ATTRIBUTE_UNUSED)
12760 {
12761   symbolS *label;
12762   expressionS ex;
12763   char *p;
12764
12765   /* When not generating PIC code, this is treated as .dword.  */
12766   if (mips_pic != SVR4_PIC)
12767     {
12768       s_cons (3);
12769       return;
12770     }
12771
12772   label = insn_labels != NULL ? insn_labels->label : NULL;
12773   mips_emit_delays ();
12774   if (auto_align)
12775     mips_align (3, 0, label);
12776   mips_clear_insn_labels ();
12777
12778   expression (&ex);
12779
12780   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12781     {
12782       as_bad (_("Unsupported use of .gpdword"));
12783       ignore_rest_of_line ();
12784     }
12785
12786   p = frag_more (8);
12787   md_number_to_chars (p, 0, 8);
12788   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12789                BFD_RELOC_GPREL32)->fx_tcbit = 1;
12790
12791   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12792   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
12793            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
12794
12795   demand_empty_rest_of_line ();
12796 }
12797
12798 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12799    tables in SVR4 PIC code.  */
12800
12801 static void
12802 s_cpadd (int ignore ATTRIBUTE_UNUSED)
12803 {
12804   int reg;
12805
12806   /* This is ignored when not generating SVR4 PIC code.  */
12807   if (mips_pic != SVR4_PIC)
12808     {
12809       s_ignore (0);
12810       return;
12811     }
12812
12813   /* Add $gp to the register named as an argument.  */
12814   macro_start ();
12815   reg = tc_get_register (0);
12816   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12817   macro_end ();
12818
12819   demand_empty_rest_of_line ();
12820 }
12821
12822 /* Handle the .insn pseudo-op.  This marks instruction labels in
12823    mips16 mode.  This permits the linker to handle them specially,
12824    such as generating jalx instructions when needed.  We also make
12825    them odd for the duration of the assembly, in order to generate the
12826    right sort of code.  We will make them even in the adjust_symtab
12827    routine, while leaving them marked.  This is convenient for the
12828    debugger and the disassembler.  The linker knows to make them odd
12829    again.  */
12830
12831 static void
12832 s_insn (int ignore ATTRIBUTE_UNUSED)
12833 {
12834   mips16_mark_labels ();
12835
12836   demand_empty_rest_of_line ();
12837 }
12838
12839 /* Handle a .stabn directive.  We need these in order to mark a label
12840    as being a mips16 text label correctly.  Sometimes the compiler
12841    will emit a label, followed by a .stabn, and then switch sections.
12842    If the label and .stabn are in mips16 mode, then the label is
12843    really a mips16 text label.  */
12844
12845 static void
12846 s_mips_stab (int type)
12847 {
12848   if (type == 'n')
12849     mips16_mark_labels ();
12850
12851   s_stab (type);
12852 }
12853
12854 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12855  */
12856
12857 static void
12858 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12859 {
12860   char *name;
12861   int c;
12862   symbolS *symbolP;
12863   expressionS exp;
12864
12865   name = input_line_pointer;
12866   c = get_symbol_end ();
12867   symbolP = symbol_find_or_make (name);
12868   S_SET_WEAK (symbolP);
12869   *input_line_pointer = c;
12870
12871   SKIP_WHITESPACE ();
12872
12873   if (! is_end_of_line[(unsigned char) *input_line_pointer])
12874     {
12875       if (S_IS_DEFINED (symbolP))
12876         {
12877           as_bad ("ignoring attempt to redefine symbol %s",
12878                   S_GET_NAME (symbolP));
12879           ignore_rest_of_line ();
12880           return;
12881         }
12882
12883       if (*input_line_pointer == ',')
12884         {
12885           ++input_line_pointer;
12886           SKIP_WHITESPACE ();
12887         }
12888
12889       expression (&exp);
12890       if (exp.X_op != O_symbol)
12891         {
12892           as_bad ("bad .weakext directive");
12893           ignore_rest_of_line ();
12894           return;
12895         }
12896       symbol_set_value_expression (symbolP, &exp);
12897     }
12898
12899   demand_empty_rest_of_line ();
12900 }
12901
12902 /* Parse a register string into a number.  Called from the ECOFF code
12903    to parse .frame.  The argument is non-zero if this is the frame
12904    register, so that we can record it in mips_frame_reg.  */
12905
12906 int
12907 tc_get_register (int frame)
12908 {
12909   unsigned int reg;
12910
12911   SKIP_WHITESPACE ();
12912   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
12913     reg = 0;
12914   if (frame)
12915     {
12916       mips_frame_reg = reg != 0 ? reg : SP;
12917       mips_frame_reg_valid = 1;
12918       mips_cprestore_valid = 0;
12919     }
12920   return reg;
12921 }
12922
12923 valueT
12924 md_section_align (asection *seg, valueT addr)
12925 {
12926   int align = bfd_get_section_alignment (stdoutput, seg);
12927
12928 #ifdef OBJ_ELF
12929   /* We don't need to align ELF sections to the full alignment.
12930      However, Irix 5 may prefer that we align them at least to a 16
12931      byte boundary.  We don't bother to align the sections if we are
12932      targeted for an embedded system.  */
12933   if (strcmp (TARGET_OS, "elf") == 0)
12934     return addr;
12935   if (align > 4)
12936     align = 4;
12937 #endif
12938
12939   return ((addr + (1 << align) - 1) & (-1 << align));
12940 }
12941
12942 /* Utility routine, called from above as well.  If called while the
12943    input file is still being read, it's only an approximation.  (For
12944    example, a symbol may later become defined which appeared to be
12945    undefined earlier.)  */
12946
12947 static int
12948 nopic_need_relax (symbolS *sym, int before_relaxing)
12949 {
12950   if (sym == 0)
12951     return 0;
12952
12953   if (g_switch_value > 0)
12954     {
12955       const char *symname;
12956       int change;
12957
12958       /* Find out whether this symbol can be referenced off the $gp
12959          register.  It can be if it is smaller than the -G size or if
12960          it is in the .sdata or .sbss section.  Certain symbols can
12961          not be referenced off the $gp, although it appears as though
12962          they can.  */
12963       symname = S_GET_NAME (sym);
12964       if (symname != (const char *) NULL
12965           && (strcmp (symname, "eprol") == 0
12966               || strcmp (symname, "etext") == 0
12967               || strcmp (symname, "_gp") == 0
12968               || strcmp (symname, "edata") == 0
12969               || strcmp (symname, "_fbss") == 0
12970               || strcmp (symname, "_fdata") == 0
12971               || strcmp (symname, "_ftext") == 0
12972               || strcmp (symname, "end") == 0
12973               || strcmp (symname, "_gp_disp") == 0))
12974         change = 1;
12975       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12976                && (0
12977 #ifndef NO_ECOFF_DEBUGGING
12978                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
12979                        && (symbol_get_obj (sym)->ecoff_extern_size
12980                            <= g_switch_value))
12981 #endif
12982                    /* We must defer this decision until after the whole
12983                       file has been read, since there might be a .extern
12984                       after the first use of this symbol.  */
12985                    || (before_relaxing
12986 #ifndef NO_ECOFF_DEBUGGING
12987                        && symbol_get_obj (sym)->ecoff_extern_size == 0
12988 #endif
12989                        && S_GET_VALUE (sym) == 0)
12990                    || (S_GET_VALUE (sym) != 0
12991                        && S_GET_VALUE (sym) <= g_switch_value)))
12992         change = 0;
12993       else
12994         {
12995           const char *segname;
12996
12997           segname = segment_name (S_GET_SEGMENT (sym));
12998           assert (strcmp (segname, ".lit8") != 0
12999                   && strcmp (segname, ".lit4") != 0);
13000           change = (strcmp (segname, ".sdata") != 0
13001                     && strcmp (segname, ".sbss") != 0
13002                     && strncmp (segname, ".sdata.", 7) != 0
13003                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13004         }
13005       return change;
13006     }
13007   else
13008     /* We are not optimizing for the $gp register.  */
13009     return 1;
13010 }
13011
13012
13013 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13014
13015 static bfd_boolean
13016 pic_need_relax (symbolS *sym, asection *segtype)
13017 {
13018   asection *symsec;
13019   bfd_boolean linkonce;
13020
13021   /* Handle the case of a symbol equated to another symbol.  */
13022   while (symbol_equated_reloc_p (sym))
13023     {
13024       symbolS *n;
13025
13026       /* It's possible to get a loop here in a badly written
13027          program.  */
13028       n = symbol_get_value_expression (sym)->X_add_symbol;
13029       if (n == sym)
13030         break;
13031       sym = n;
13032     }
13033
13034   symsec = S_GET_SEGMENT (sym);
13035
13036   /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
13037   linkonce = FALSE;
13038   if (symsec != segtype && ! S_IS_LOCAL (sym))
13039     {
13040       if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
13041           != 0)
13042         linkonce = TRUE;
13043
13044       /* The GNU toolchain uses an extension for ELF: a section
13045          beginning with the magic string .gnu.linkonce is a linkonce
13046          section.  */
13047       if (strncmp (segment_name (symsec), ".gnu.linkonce",
13048                    sizeof ".gnu.linkonce" - 1) == 0)
13049         linkonce = TRUE;
13050     }
13051
13052   /* This must duplicate the test in adjust_reloc_syms.  */
13053   return (symsec != &bfd_und_section
13054           && symsec != &bfd_abs_section
13055           && ! bfd_is_com_section (symsec)
13056           && !linkonce
13057 #ifdef OBJ_ELF
13058           /* A global or weak symbol is treated as external.  */
13059           && (OUTPUT_FLAVOR != bfd_target_elf_flavour
13060               || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13061 #endif
13062           );
13063 }
13064
13065
13066 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13067    extended opcode.  SEC is the section the frag is in.  */
13068
13069 static int
13070 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13071 {
13072   int type;
13073   register const struct mips16_immed_operand *op;
13074   offsetT val;
13075   int mintiny, maxtiny;
13076   segT symsec;
13077   fragS *sym_frag;
13078
13079   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13080     return 0;
13081   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13082     return 1;
13083
13084   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13085   op = mips16_immed_operands;
13086   while (op->type != type)
13087     {
13088       ++op;
13089       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13090     }
13091
13092   if (op->unsp)
13093     {
13094       if (type == '<' || type == '>' || type == '[' || type == ']')
13095         {
13096           mintiny = 1;
13097           maxtiny = 1 << op->nbits;
13098         }
13099       else
13100         {
13101           mintiny = 0;
13102           maxtiny = (1 << op->nbits) - 1;
13103         }
13104     }
13105   else
13106     {
13107       mintiny = - (1 << (op->nbits - 1));
13108       maxtiny = (1 << (op->nbits - 1)) - 1;
13109     }
13110
13111   sym_frag = symbol_get_frag (fragp->fr_symbol);
13112   val = S_GET_VALUE (fragp->fr_symbol);
13113   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13114
13115   if (op->pcrel)
13116     {
13117       addressT addr;
13118
13119       /* We won't have the section when we are called from
13120          mips_relax_frag.  However, we will always have been called
13121          from md_estimate_size_before_relax first.  If this is a
13122          branch to a different section, we mark it as such.  If SEC is
13123          NULL, and the frag is not marked, then it must be a branch to
13124          the same section.  */
13125       if (sec == NULL)
13126         {
13127           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13128             return 1;
13129         }
13130       else
13131         {
13132           /* Must have been called from md_estimate_size_before_relax.  */
13133           if (symsec != sec)
13134             {
13135               fragp->fr_subtype =
13136                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13137
13138               /* FIXME: We should support this, and let the linker
13139                  catch branches and loads that are out of range.  */
13140               as_bad_where (fragp->fr_file, fragp->fr_line,
13141                             _("unsupported PC relative reference to different section"));
13142
13143               return 1;
13144             }
13145           if (fragp != sym_frag && sym_frag->fr_address == 0)
13146             /* Assume non-extended on the first relaxation pass.
13147                The address we have calculated will be bogus if this is
13148                a forward branch to another frag, as the forward frag
13149                will have fr_address == 0.  */
13150             return 0;
13151         }
13152
13153       /* In this case, we know for sure that the symbol fragment is in
13154          the same section.  If the relax_marker of the symbol fragment
13155          differs from the relax_marker of this fragment, we have not
13156          yet adjusted the symbol fragment fr_address.  We want to add
13157          in STRETCH in order to get a better estimate of the address.
13158          This particularly matters because of the shift bits.  */
13159       if (stretch != 0
13160           && sym_frag->relax_marker != fragp->relax_marker)
13161         {
13162           fragS *f;
13163
13164           /* Adjust stretch for any alignment frag.  Note that if have
13165              been expanding the earlier code, the symbol may be
13166              defined in what appears to be an earlier frag.  FIXME:
13167              This doesn't handle the fr_subtype field, which specifies
13168              a maximum number of bytes to skip when doing an
13169              alignment.  */
13170           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13171             {
13172               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13173                 {
13174                   if (stretch < 0)
13175                     stretch = - ((- stretch)
13176                                  & ~ ((1 << (int) f->fr_offset) - 1));
13177                   else
13178                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13179                   if (stretch == 0)
13180                     break;
13181                 }
13182             }
13183           if (f != NULL)
13184             val += stretch;
13185         }
13186
13187       addr = fragp->fr_address + fragp->fr_fix;
13188
13189       /* The base address rules are complicated.  The base address of
13190          a branch is the following instruction.  The base address of a
13191          PC relative load or add is the instruction itself, but if it
13192          is in a delay slot (in which case it can not be extended) use
13193          the address of the instruction whose delay slot it is in.  */
13194       if (type == 'p' || type == 'q')
13195         {
13196           addr += 2;
13197
13198           /* If we are currently assuming that this frag should be
13199              extended, then, the current address is two bytes
13200              higher.  */
13201           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13202             addr += 2;
13203
13204           /* Ignore the low bit in the target, since it will be set
13205              for a text label.  */
13206           if ((val & 1) != 0)
13207             --val;
13208         }
13209       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13210         addr -= 4;
13211       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13212         addr -= 2;
13213
13214       val -= addr & ~ ((1 << op->shift) - 1);
13215
13216       /* Branch offsets have an implicit 0 in the lowest bit.  */
13217       if (type == 'p' || type == 'q')
13218         val /= 2;
13219
13220       /* If any of the shifted bits are set, we must use an extended
13221          opcode.  If the address depends on the size of this
13222          instruction, this can lead to a loop, so we arrange to always
13223          use an extended opcode.  We only check this when we are in
13224          the main relaxation loop, when SEC is NULL.  */
13225       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13226         {
13227           fragp->fr_subtype =
13228             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13229           return 1;
13230         }
13231
13232       /* If we are about to mark a frag as extended because the value
13233          is precisely maxtiny + 1, then there is a chance of an
13234          infinite loop as in the following code:
13235              la $4,foo
13236              .skip      1020
13237              .align     2
13238            foo:
13239          In this case when the la is extended, foo is 0x3fc bytes
13240          away, so the la can be shrunk, but then foo is 0x400 away, so
13241          the la must be extended.  To avoid this loop, we mark the
13242          frag as extended if it was small, and is about to become
13243          extended with a value of maxtiny + 1.  */
13244       if (val == ((maxtiny + 1) << op->shift)
13245           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13246           && sec == NULL)
13247         {
13248           fragp->fr_subtype =
13249             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13250           return 1;
13251         }
13252     }
13253   else if (symsec != absolute_section && sec != NULL)
13254     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13255
13256   if ((val & ((1 << op->shift) - 1)) != 0
13257       || val < (mintiny << op->shift)
13258       || val > (maxtiny << op->shift))
13259     return 1;
13260   else
13261     return 0;
13262 }
13263
13264 /* Compute the length of a branch sequence, and adjust the
13265    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13266    worst-case length is computed, with UPDATE being used to indicate
13267    whether an unconditional (-1), branch-likely (+1) or regular (0)
13268    branch is to be computed.  */
13269 static int
13270 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13271 {
13272   bfd_boolean toofar;
13273   int length;
13274
13275   if (fragp
13276       && S_IS_DEFINED (fragp->fr_symbol)
13277       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13278     {
13279       addressT addr;
13280       offsetT val;
13281
13282       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13283
13284       addr = fragp->fr_address + fragp->fr_fix + 4;
13285
13286       val -= addr;
13287
13288       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13289     }
13290   else if (fragp)
13291     /* If the symbol is not defined or it's in a different segment,
13292        assume the user knows what's going on and emit a short
13293        branch.  */
13294     toofar = FALSE;
13295   else
13296     toofar = TRUE;
13297
13298   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13299     fragp->fr_subtype
13300       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13301                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13302                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13303                              toofar);
13304
13305   length = 4;
13306   if (toofar)
13307     {
13308       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13309         length += 8;
13310
13311       if (mips_pic != NO_PIC)
13312         {
13313           /* Additional space for PIC loading of target address.  */
13314           length += 8;
13315           if (mips_opts.isa == ISA_MIPS1)
13316             /* Additional space for $at-stabilizing nop.  */
13317             length += 4;
13318         }
13319
13320       /* If branch is conditional.  */
13321       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13322         length += 8;
13323     }
13324
13325   return length;
13326 }
13327
13328 /* Estimate the size of a frag before relaxing.  Unless this is the
13329    mips16, we are not really relaxing here, and the final size is
13330    encoded in the subtype information.  For the mips16, we have to
13331    decide whether we are using an extended opcode or not.  */
13332
13333 int
13334 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13335 {
13336   int change;
13337
13338   if (RELAX_BRANCH_P (fragp->fr_subtype))
13339     {
13340
13341       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13342
13343       return fragp->fr_var;
13344     }
13345
13346   if (RELAX_MIPS16_P (fragp->fr_subtype))
13347     /* We don't want to modify the EXTENDED bit here; it might get us
13348        into infinite loops.  We change it only in mips_relax_frag().  */
13349     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13350
13351   if (mips_pic == NO_PIC)
13352     change = nopic_need_relax (fragp->fr_symbol, 0);
13353   else if (mips_pic == SVR4_PIC)
13354     change = pic_need_relax (fragp->fr_symbol, segtype);
13355   else if (mips_pic == VXWORKS_PIC)
13356     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13357     change = 0;
13358   else
13359     abort ();
13360
13361   if (change)
13362     {
13363       fragp->fr_subtype |= RELAX_USE_SECOND;
13364       return -RELAX_FIRST (fragp->fr_subtype);
13365     }
13366   else
13367     return -RELAX_SECOND (fragp->fr_subtype);
13368 }
13369
13370 /* This is called to see whether a reloc against a defined symbol
13371    should be converted into a reloc against a section.  */
13372
13373 int
13374 mips_fix_adjustable (fixS *fixp)
13375 {
13376   /* Don't adjust MIPS16 jump relocations, so we don't have to worry
13377      about the format of the offset in the .o file. */
13378   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13379     return 0;
13380
13381   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13382       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13383     return 0;
13384
13385   if (fixp->fx_addsy == NULL)
13386     return 1;
13387
13388   /* If symbol SYM is in a mergeable section, relocations of the form
13389      SYM + 0 can usually be made section-relative.  The mergeable data
13390      is then identified by the section offset rather than by the symbol.
13391
13392      However, if we're generating REL LO16 relocations, the offset is split
13393      between the LO16 and parterning high part relocation.  The linker will
13394      need to recalculate the complete offset in order to correctly identify
13395      the merge data.
13396
13397      The linker has traditionally not looked for the parterning high part
13398      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13399      placed anywhere.  Rather than break backwards compatibility by changing
13400      this, it seems better not to force the issue, and instead keep the
13401      original symbol.  This will work with either linker behavior.  */
13402   if ((fixp->fx_r_type == BFD_RELOC_LO16
13403        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13404        || reloc_needs_lo_p (fixp->fx_r_type))
13405       && HAVE_IN_PLACE_ADDENDS
13406       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13407     return 0;
13408
13409 #ifdef OBJ_ELF
13410   /* Don't adjust relocations against mips16 symbols, so that the linker
13411      can find them if it needs to set up a stub.  */
13412   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13413       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13414       && fixp->fx_subsy == NULL)
13415     return 0;
13416 #endif
13417
13418   return 1;
13419 }
13420
13421 /* Translate internal representation of relocation info to BFD target
13422    format.  */
13423
13424 arelent **
13425 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13426 {
13427   static arelent *retval[4];
13428   arelent *reloc;
13429   bfd_reloc_code_real_type code;
13430
13431   memset (retval, 0, sizeof(retval));
13432   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13433   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13434   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13435   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13436
13437   if (fixp->fx_pcrel)
13438     {
13439       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13440
13441       /* At this point, fx_addnumber is "symbol offset - pcrel address".
13442          Relocations want only the symbol offset.  */
13443       reloc->addend = fixp->fx_addnumber + reloc->address;
13444       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13445         {
13446           /* A gruesome hack which is a result of the gruesome gas
13447              reloc handling.  What's worse, for COFF (as opposed to
13448              ECOFF), we might need yet another copy of reloc->address.
13449              See bfd_install_relocation.  */
13450           reloc->addend += reloc->address;
13451         }
13452     }
13453   else
13454     reloc->addend = fixp->fx_addnumber;
13455
13456   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13457      entry to be used in the relocation's section offset.  */
13458   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13459     {
13460       reloc->address = reloc->addend;
13461       reloc->addend = 0;
13462     }
13463
13464   code = fixp->fx_r_type;
13465
13466   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13467   if (reloc->howto == NULL)
13468     {
13469       as_bad_where (fixp->fx_file, fixp->fx_line,
13470                     _("Can not represent %s relocation in this object file format"),
13471                     bfd_get_reloc_code_name (code));
13472       retval[0] = NULL;
13473     }
13474
13475   return retval;
13476 }
13477
13478 /* Relax a machine dependent frag.  This returns the amount by which
13479    the current size of the frag should change.  */
13480
13481 int
13482 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13483 {
13484   if (RELAX_BRANCH_P (fragp->fr_subtype))
13485     {
13486       offsetT old_var = fragp->fr_var;
13487
13488       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13489
13490       return fragp->fr_var - old_var;
13491     }
13492
13493   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13494     return 0;
13495
13496   if (mips16_extended_frag (fragp, NULL, stretch))
13497     {
13498       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13499         return 0;
13500       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13501       return 2;
13502     }
13503   else
13504     {
13505       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13506         return 0;
13507       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13508       return -2;
13509     }
13510
13511   return 0;
13512 }
13513
13514 /* Convert a machine dependent frag.  */
13515
13516 void
13517 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13518 {
13519   if (RELAX_BRANCH_P (fragp->fr_subtype))
13520     {
13521       bfd_byte *buf;
13522       unsigned long insn;
13523       expressionS exp;
13524       fixS *fixp;
13525
13526       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13527
13528       if (target_big_endian)
13529         insn = bfd_getb32 (buf);
13530       else
13531         insn = bfd_getl32 (buf);
13532
13533       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13534         {
13535           /* We generate a fixup instead of applying it right now
13536              because, if there are linker relaxations, we're going to
13537              need the relocations.  */
13538           exp.X_op = O_symbol;
13539           exp.X_add_symbol = fragp->fr_symbol;
13540           exp.X_add_number = fragp->fr_offset;
13541
13542           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13543                               4, &exp, 1, BFD_RELOC_16_PCREL_S2);
13544           fixp->fx_file = fragp->fr_file;
13545           fixp->fx_line = fragp->fr_line;
13546
13547           md_number_to_chars ((char *) buf, insn, 4);
13548           buf += 4;
13549         }
13550       else
13551         {
13552           int i;
13553
13554           as_warn_where (fragp->fr_file, fragp->fr_line,
13555                          _("relaxed out-of-range branch into a jump"));
13556
13557           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13558             goto uncond;
13559
13560           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13561             {
13562               /* Reverse the branch.  */
13563               switch ((insn >> 28) & 0xf)
13564                 {
13565                 case 4:
13566                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13567                      have the condition reversed by tweaking a single
13568                      bit, and their opcodes all have 0x4???????.  */
13569                   assert ((insn & 0xf1000000) == 0x41000000);
13570                   insn ^= 0x00010000;
13571                   break;
13572
13573                 case 0:
13574                   /* bltz       0x04000000      bgez    0x04010000
13575                      bltzal     0x04100000      bgezal  0x04110000 */
13576                   assert ((insn & 0xfc0e0000) == 0x04000000);
13577                   insn ^= 0x00010000;
13578                   break;
13579
13580                 case 1:
13581                   /* beq        0x10000000      bne     0x14000000
13582                      blez       0x18000000      bgtz    0x1c000000 */
13583                   insn ^= 0x04000000;
13584                   break;
13585
13586                 default:
13587                   abort ();
13588                 }
13589             }
13590
13591           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13592             {
13593               /* Clear the and-link bit.  */
13594               assert ((insn & 0xfc1c0000) == 0x04100000);
13595
13596               /* bltzal 0x04100000      bgezal  0x04110000
13597                 bltzall 0x04120000     bgezall  0x04130000 */
13598               insn &= ~0x00100000;
13599             }
13600
13601           /* Branch over the branch (if the branch was likely) or the
13602              full jump (not likely case).  Compute the offset from the
13603              current instruction to branch to.  */
13604           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13605             i = 16;
13606           else
13607             {
13608               /* How many bytes in instructions we've already emitted?  */
13609               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13610               /* How many bytes in instructions from here to the end?  */
13611               i = fragp->fr_var - i;
13612             }
13613           /* Convert to instruction count.  */
13614           i >>= 2;
13615           /* Branch counts from the next instruction.  */
13616           i--;
13617           insn |= i;
13618           /* Branch over the jump.  */
13619           md_number_to_chars ((char *) buf, insn, 4);
13620           buf += 4;
13621
13622           /* Nop */
13623           md_number_to_chars ((char *) buf, 0, 4);
13624           buf += 4;
13625
13626           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13627             {
13628               /* beql $0, $0, 2f */
13629               insn = 0x50000000;
13630               /* Compute the PC offset from the current instruction to
13631                  the end of the variable frag.  */
13632               /* How many bytes in instructions we've already emitted?  */
13633               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13634               /* How many bytes in instructions from here to the end?  */
13635               i = fragp->fr_var - i;
13636               /* Convert to instruction count.  */
13637               i >>= 2;
13638               /* Don't decrement i, because we want to branch over the
13639                  delay slot.  */
13640
13641               insn |= i;
13642               md_number_to_chars ((char *) buf, insn, 4);
13643               buf += 4;
13644
13645               md_number_to_chars ((char *) buf, 0, 4);
13646               buf += 4;
13647             }
13648
13649         uncond:
13650           if (mips_pic == NO_PIC)
13651             {
13652               /* j or jal.  */
13653               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13654                       ? 0x0c000000 : 0x08000000);
13655               exp.X_op = O_symbol;
13656               exp.X_add_symbol = fragp->fr_symbol;
13657               exp.X_add_number = fragp->fr_offset;
13658
13659               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13660                                   4, &exp, 0, BFD_RELOC_MIPS_JMP);
13661               fixp->fx_file = fragp->fr_file;
13662               fixp->fx_line = fragp->fr_line;
13663
13664               md_number_to_chars ((char *) buf, insn, 4);
13665               buf += 4;
13666             }
13667           else
13668             {
13669               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13670               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13671               exp.X_op = O_symbol;
13672               exp.X_add_symbol = fragp->fr_symbol;
13673               exp.X_add_number = fragp->fr_offset;
13674
13675               if (fragp->fr_offset)
13676                 {
13677                   exp.X_add_symbol = make_expr_symbol (&exp);
13678                   exp.X_add_number = 0;
13679                 }
13680
13681               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13682                                   4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13683               fixp->fx_file = fragp->fr_file;
13684               fixp->fx_line = fragp->fr_line;
13685
13686               md_number_to_chars ((char *) buf, insn, 4);
13687               buf += 4;
13688
13689               if (mips_opts.isa == ISA_MIPS1)
13690                 {
13691                   /* nop */
13692                   md_number_to_chars ((char *) buf, 0, 4);
13693                   buf += 4;
13694                 }
13695
13696               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13697               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13698
13699               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13700                                   4, &exp, 0, BFD_RELOC_LO16);
13701               fixp->fx_file = fragp->fr_file;
13702               fixp->fx_line = fragp->fr_line;
13703
13704               md_number_to_chars ((char *) buf, insn, 4);
13705               buf += 4;
13706
13707               /* j(al)r $at.  */
13708               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13709                 insn = 0x0020f809;
13710               else
13711                 insn = 0x00200008;
13712
13713               md_number_to_chars ((char *) buf, insn, 4);
13714               buf += 4;
13715             }
13716         }
13717
13718       assert (buf == (bfd_byte *)fragp->fr_literal
13719               + fragp->fr_fix + fragp->fr_var);
13720
13721       fragp->fr_fix += fragp->fr_var;
13722
13723       return;
13724     }
13725
13726   if (RELAX_MIPS16_P (fragp->fr_subtype))
13727     {
13728       int type;
13729       register const struct mips16_immed_operand *op;
13730       bfd_boolean small, ext;
13731       offsetT val;
13732       bfd_byte *buf;
13733       unsigned long insn;
13734       bfd_boolean use_extend;
13735       unsigned short extend;
13736
13737       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13738       op = mips16_immed_operands;
13739       while (op->type != type)
13740         ++op;
13741
13742       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13743         {
13744           small = FALSE;
13745           ext = TRUE;
13746         }
13747       else
13748         {
13749           small = TRUE;
13750           ext = FALSE;
13751         }
13752
13753       resolve_symbol_value (fragp->fr_symbol);
13754       val = S_GET_VALUE (fragp->fr_symbol);
13755       if (op->pcrel)
13756         {
13757           addressT addr;
13758
13759           addr = fragp->fr_address + fragp->fr_fix;
13760
13761           /* The rules for the base address of a PC relative reloc are
13762              complicated; see mips16_extended_frag.  */
13763           if (type == 'p' || type == 'q')
13764             {
13765               addr += 2;
13766               if (ext)
13767                 addr += 2;
13768               /* Ignore the low bit in the target, since it will be
13769                  set for a text label.  */
13770               if ((val & 1) != 0)
13771                 --val;
13772             }
13773           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13774             addr -= 4;
13775           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13776             addr -= 2;
13777
13778           addr &= ~ (addressT) ((1 << op->shift) - 1);
13779           val -= addr;
13780
13781           /* Make sure the section winds up with the alignment we have
13782              assumed.  */
13783           if (op->shift > 0)
13784             record_alignment (asec, op->shift);
13785         }
13786
13787       if (ext
13788           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13789               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13790         as_warn_where (fragp->fr_file, fragp->fr_line,
13791                        _("extended instruction in delay slot"));
13792
13793       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13794
13795       if (target_big_endian)
13796         insn = bfd_getb16 (buf);
13797       else
13798         insn = bfd_getl16 (buf);
13799
13800       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13801                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13802                     small, ext, &insn, &use_extend, &extend);
13803
13804       if (use_extend)
13805         {
13806           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
13807           fragp->fr_fix += 2;
13808           buf += 2;
13809         }
13810
13811       md_number_to_chars ((char *) buf, insn, 2);
13812       fragp->fr_fix += 2;
13813       buf += 2;
13814     }
13815   else
13816     {
13817       int first, second;
13818       fixS *fixp;
13819
13820       first = RELAX_FIRST (fragp->fr_subtype);
13821       second = RELAX_SECOND (fragp->fr_subtype);
13822       fixp = (fixS *) fragp->fr_opcode;
13823
13824       /* Possibly emit a warning if we've chosen the longer option.  */
13825       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13826           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13827         {
13828           const char *msg = macro_warning (fragp->fr_subtype);
13829           if (msg != 0)
13830             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13831         }
13832
13833       /* Go through all the fixups for the first sequence.  Disable them
13834          (by marking them as done) if we're going to use the second
13835          sequence instead.  */
13836       while (fixp
13837              && fixp->fx_frag == fragp
13838              && fixp->fx_where < fragp->fr_fix - second)
13839         {
13840           if (fragp->fr_subtype & RELAX_USE_SECOND)
13841             fixp->fx_done = 1;
13842           fixp = fixp->fx_next;
13843         }
13844
13845       /* Go through the fixups for the second sequence.  Disable them if
13846          we're going to use the first sequence, otherwise adjust their
13847          addresses to account for the relaxation.  */
13848       while (fixp && fixp->fx_frag == fragp)
13849         {
13850           if (fragp->fr_subtype & RELAX_USE_SECOND)
13851             fixp->fx_where -= first;
13852           else
13853             fixp->fx_done = 1;
13854           fixp = fixp->fx_next;
13855         }
13856
13857       /* Now modify the frag contents.  */
13858       if (fragp->fr_subtype & RELAX_USE_SECOND)
13859         {
13860           char *start;
13861
13862           start = fragp->fr_literal + fragp->fr_fix - first - second;
13863           memmove (start, start + first, second);
13864           fragp->fr_fix -= first;
13865         }
13866       else
13867         fragp->fr_fix -= second;
13868     }
13869 }
13870
13871 #ifdef OBJ_ELF
13872
13873 /* This function is called after the relocs have been generated.
13874    We've been storing mips16 text labels as odd.  Here we convert them
13875    back to even for the convenience of the debugger.  */
13876
13877 void
13878 mips_frob_file_after_relocs (void)
13879 {
13880   asymbol **syms;
13881   unsigned int count, i;
13882
13883   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13884     return;
13885
13886   syms = bfd_get_outsymbols (stdoutput);
13887   count = bfd_get_symcount (stdoutput);
13888   for (i = 0; i < count; i++, syms++)
13889     {
13890       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13891           && ((*syms)->value & 1) != 0)
13892         {
13893           (*syms)->value &= ~1;
13894           /* If the symbol has an odd size, it was probably computed
13895              incorrectly, so adjust that as well.  */
13896           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13897             ++elf_symbol (*syms)->internal_elf_sym.st_size;
13898         }
13899     }
13900 }
13901
13902 #endif
13903
13904 /* This function is called whenever a label is defined.  It is used
13905    when handling branch delays; if a branch has a label, we assume we
13906    can not move it.  */
13907
13908 void
13909 mips_define_label (symbolS *sym)
13910 {
13911   struct insn_label_list *l;
13912
13913   if (free_insn_labels == NULL)
13914     l = (struct insn_label_list *) xmalloc (sizeof *l);
13915   else
13916     {
13917       l = free_insn_labels;
13918       free_insn_labels = l->next;
13919     }
13920
13921   l->label = sym;
13922   l->next = insn_labels;
13923   insn_labels = l;
13924
13925 #ifdef OBJ_ELF
13926   dwarf2_emit_label (sym);
13927 #endif
13928 }
13929 \f
13930 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13931
13932 /* Some special processing for a MIPS ELF file.  */
13933
13934 void
13935 mips_elf_final_processing (void)
13936 {
13937   /* Write out the register information.  */
13938   if (mips_abi != N64_ABI)
13939     {
13940       Elf32_RegInfo s;
13941
13942       s.ri_gprmask = mips_gprmask;
13943       s.ri_cprmask[0] = mips_cprmask[0];
13944       s.ri_cprmask[1] = mips_cprmask[1];
13945       s.ri_cprmask[2] = mips_cprmask[2];
13946       s.ri_cprmask[3] = mips_cprmask[3];
13947       /* The gp_value field is set by the MIPS ELF backend.  */
13948
13949       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13950                                        ((Elf32_External_RegInfo *)
13951                                         mips_regmask_frag));
13952     }
13953   else
13954     {
13955       Elf64_Internal_RegInfo s;
13956
13957       s.ri_gprmask = mips_gprmask;
13958       s.ri_pad = 0;
13959       s.ri_cprmask[0] = mips_cprmask[0];
13960       s.ri_cprmask[1] = mips_cprmask[1];
13961       s.ri_cprmask[2] = mips_cprmask[2];
13962       s.ri_cprmask[3] = mips_cprmask[3];
13963       /* The gp_value field is set by the MIPS ELF backend.  */
13964
13965       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13966                                        ((Elf64_External_RegInfo *)
13967                                         mips_regmask_frag));
13968     }
13969
13970   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13971      sort of BFD interface for this.  */
13972   if (mips_any_noreorder)
13973     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13974   if (mips_pic != NO_PIC)
13975     {
13976     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13977       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13978     }
13979   if (mips_abicalls)
13980     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13981
13982   /* Set MIPS ELF flags for ASEs.  */
13983   /* We may need to define a new flag for DSP ASE, and set this flag when
13984      file_ase_dsp is true.  */
13985   /* We may need to define a new flag for MT ASE, and set this flag when
13986      file_ase_mt is true.  */
13987   if (file_ase_mips16)
13988     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13989 #if 0 /* XXX FIXME */
13990   if (file_ase_mips3d)
13991     elf_elfheader (stdoutput)->e_flags |= ???;
13992 #endif
13993   if (file_ase_mdmx)
13994     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13995
13996   /* Set the MIPS ELF ABI flags.  */
13997   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13998     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13999   else if (mips_abi == O64_ABI)
14000     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14001   else if (mips_abi == EABI_ABI)
14002     {
14003       if (!file_mips_gp32)
14004         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14005       else
14006         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14007     }
14008   else if (mips_abi == N32_ABI)
14009     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14010
14011   /* Nothing to do for N64_ABI.  */
14012
14013   if (mips_32bitmode)
14014     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14015 }
14016
14017 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14018 \f
14019 typedef struct proc {
14020   symbolS *func_sym;
14021   symbolS *func_end_sym;
14022   unsigned long reg_mask;
14023   unsigned long reg_offset;
14024   unsigned long fpreg_mask;
14025   unsigned long fpreg_offset;
14026   unsigned long frame_offset;
14027   unsigned long frame_reg;
14028   unsigned long pc_reg;
14029 } procS;
14030
14031 static procS cur_proc;
14032 static procS *cur_proc_ptr;
14033 static int numprocs;
14034
14035 /* Fill in an rs_align_code fragment.  */
14036
14037 void
14038 mips_handle_align (fragS *fragp)
14039 {
14040   if (fragp->fr_type != rs_align_code)
14041     return;
14042
14043   if (mips_opts.mips16)
14044     {
14045       static const unsigned char be_nop[] = { 0x65, 0x00 };
14046       static const unsigned char le_nop[] = { 0x00, 0x65 };
14047
14048       int bytes;
14049       char *p;
14050
14051       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14052       p = fragp->fr_literal + fragp->fr_fix;
14053
14054       if (bytes & 1)
14055         {
14056           *p++ = 0;
14057           fragp->fr_fix++;
14058         }
14059
14060       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14061       fragp->fr_var = 2;
14062     }
14063
14064   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
14065 }
14066
14067 static void
14068 md_obj_begin (void)
14069 {
14070 }
14071
14072 static void
14073 md_obj_end (void)
14074 {
14075   /* check for premature end, nesting errors, etc */
14076   if (cur_proc_ptr)
14077     as_warn (_("missing .end at end of assembly"));
14078 }
14079
14080 static long
14081 get_number (void)
14082 {
14083   int negative = 0;
14084   long val = 0;
14085
14086   if (*input_line_pointer == '-')
14087     {
14088       ++input_line_pointer;
14089       negative = 1;
14090     }
14091   if (!ISDIGIT (*input_line_pointer))
14092     as_bad (_("expected simple number"));
14093   if (input_line_pointer[0] == '0')
14094     {
14095       if (input_line_pointer[1] == 'x')
14096         {
14097           input_line_pointer += 2;
14098           while (ISXDIGIT (*input_line_pointer))
14099             {
14100               val <<= 4;
14101               val |= hex_value (*input_line_pointer++);
14102             }
14103           return negative ? -val : val;
14104         }
14105       else
14106         {
14107           ++input_line_pointer;
14108           while (ISDIGIT (*input_line_pointer))
14109             {
14110               val <<= 3;
14111               val |= *input_line_pointer++ - '0';
14112             }
14113           return negative ? -val : val;
14114         }
14115     }
14116   if (!ISDIGIT (*input_line_pointer))
14117     {
14118       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14119               *input_line_pointer, *input_line_pointer);
14120       as_warn (_("invalid number"));
14121       return -1;
14122     }
14123   while (ISDIGIT (*input_line_pointer))
14124     {
14125       val *= 10;
14126       val += *input_line_pointer++ - '0';
14127     }
14128   return negative ? -val : val;
14129 }
14130
14131 /* The .file directive; just like the usual .file directive, but there
14132    is an initial number which is the ECOFF file index.  In the non-ECOFF
14133    case .file implies DWARF-2.  */
14134
14135 static void
14136 s_mips_file (int x ATTRIBUTE_UNUSED)
14137 {
14138   static int first_file_directive = 0;
14139
14140   if (ECOFF_DEBUGGING)
14141     {
14142       get_number ();
14143       s_app_file (0);
14144     }
14145   else
14146     {
14147       char *filename;
14148
14149       filename = dwarf2_directive_file (0);
14150
14151       /* Versions of GCC up to 3.1 start files with a ".file"
14152          directive even for stabs output.  Make sure that this
14153          ".file" is handled.  Note that you need a version of GCC
14154          after 3.1 in order to support DWARF-2 on MIPS.  */
14155       if (filename != NULL && ! first_file_directive)
14156         {
14157           (void) new_logical_line (filename, -1);
14158           s_app_file_string (filename, 0);
14159         }
14160       first_file_directive = 1;
14161     }
14162 }
14163
14164 /* The .loc directive, implying DWARF-2.  */
14165
14166 static void
14167 s_mips_loc (int x ATTRIBUTE_UNUSED)
14168 {
14169   if (!ECOFF_DEBUGGING)
14170     dwarf2_directive_loc (0);
14171 }
14172
14173 /* The .end directive.  */
14174
14175 static void
14176 s_mips_end (int x ATTRIBUTE_UNUSED)
14177 {
14178   symbolS *p;
14179
14180   /* Following functions need their own .frame and .cprestore directives.  */
14181   mips_frame_reg_valid = 0;
14182   mips_cprestore_valid = 0;
14183
14184   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14185     {
14186       p = get_symbol ();
14187       demand_empty_rest_of_line ();
14188     }
14189   else
14190     p = NULL;
14191
14192   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14193     as_warn (_(".end not in text section"));
14194
14195   if (!cur_proc_ptr)
14196     {
14197       as_warn (_(".end directive without a preceding .ent directive."));
14198       demand_empty_rest_of_line ();
14199       return;
14200     }
14201
14202   if (p != NULL)
14203     {
14204       assert (S_GET_NAME (p));
14205       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14206         as_warn (_(".end symbol does not match .ent symbol."));
14207
14208       if (debug_type == DEBUG_STABS)
14209         stabs_generate_asm_endfunc (S_GET_NAME (p),
14210                                     S_GET_NAME (p));
14211     }
14212   else
14213     as_warn (_(".end directive missing or unknown symbol"));
14214
14215 #ifdef OBJ_ELF
14216   /* Create an expression to calculate the size of the function.  */
14217   if (p && cur_proc_ptr)
14218     {
14219       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14220       expressionS *exp = xmalloc (sizeof (expressionS));
14221
14222       obj->size = exp;
14223       exp->X_op = O_subtract;
14224       exp->X_add_symbol = symbol_temp_new_now ();
14225       exp->X_op_symbol = p;
14226       exp->X_add_number = 0;
14227
14228       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14229     }
14230
14231   /* Generate a .pdr section.  */
14232   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
14233       && mips_flag_pdr)
14234     {
14235       segT saved_seg = now_seg;
14236       subsegT saved_subseg = now_subseg;
14237       valueT dot;
14238       expressionS exp;
14239       char *fragp;
14240
14241       dot = frag_now_fix ();
14242
14243 #ifdef md_flush_pending_output
14244       md_flush_pending_output ();
14245 #endif
14246
14247       assert (pdr_seg);
14248       subseg_set (pdr_seg, 0);
14249
14250       /* Write the symbol.  */
14251       exp.X_op = O_symbol;
14252       exp.X_add_symbol = p;
14253       exp.X_add_number = 0;
14254       emit_expr (&exp, 4);
14255
14256       fragp = frag_more (7 * 4);
14257
14258       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14259       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14260       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14261       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14262       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14263       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14264       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14265
14266       subseg_set (saved_seg, saved_subseg);
14267     }
14268 #endif /* OBJ_ELF */
14269
14270   cur_proc_ptr = NULL;
14271 }
14272
14273 /* The .aent and .ent directives.  */
14274
14275 static void
14276 s_mips_ent (int aent)
14277 {
14278   symbolS *symbolP;
14279
14280   symbolP = get_symbol ();
14281   if (*input_line_pointer == ',')
14282     ++input_line_pointer;
14283   SKIP_WHITESPACE ();
14284   if (ISDIGIT (*input_line_pointer)
14285       || *input_line_pointer == '-')
14286     get_number ();
14287
14288   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14289     as_warn (_(".ent or .aent not in text section."));
14290
14291   if (!aent && cur_proc_ptr)
14292     as_warn (_("missing .end"));
14293
14294   if (!aent)
14295     {
14296       /* This function needs its own .frame and .cprestore directives.  */
14297       mips_frame_reg_valid = 0;
14298       mips_cprestore_valid = 0;
14299
14300       cur_proc_ptr = &cur_proc;
14301       memset (cur_proc_ptr, '\0', sizeof (procS));
14302
14303       cur_proc_ptr->func_sym = symbolP;
14304
14305       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14306
14307       ++numprocs;
14308
14309       if (debug_type == DEBUG_STABS)
14310         stabs_generate_asm_func (S_GET_NAME (symbolP),
14311                                  S_GET_NAME (symbolP));
14312     }
14313
14314   demand_empty_rest_of_line ();
14315 }
14316
14317 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14318    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14319    s_mips_frame is used so that we can set the PDR information correctly.
14320    We can't use the ecoff routines because they make reference to the ecoff
14321    symbol table (in the mdebug section).  */
14322
14323 static void
14324 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14325 {
14326 #ifdef OBJ_ELF
14327   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14328     {
14329       long val;
14330
14331       if (cur_proc_ptr == (procS *) NULL)
14332         {
14333           as_warn (_(".frame outside of .ent"));
14334           demand_empty_rest_of_line ();
14335           return;
14336         }
14337
14338       cur_proc_ptr->frame_reg = tc_get_register (1);
14339
14340       SKIP_WHITESPACE ();
14341       if (*input_line_pointer++ != ','
14342           || get_absolute_expression_and_terminator (&val) != ',')
14343         {
14344           as_warn (_("Bad .frame directive"));
14345           --input_line_pointer;
14346           demand_empty_rest_of_line ();
14347           return;
14348         }
14349
14350       cur_proc_ptr->frame_offset = val;
14351       cur_proc_ptr->pc_reg = tc_get_register (0);
14352
14353       demand_empty_rest_of_line ();
14354     }
14355   else
14356 #endif /* OBJ_ELF */
14357     s_ignore (ignore);
14358 }
14359
14360 /* The .fmask and .mask directives. If the mdebug section is present
14361    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14362    embedded targets, s_mips_mask is used so that we can set the PDR
14363    information correctly. We can't use the ecoff routines because they
14364    make reference to the ecoff symbol table (in the mdebug section).  */
14365
14366 static void
14367 s_mips_mask (int reg_type)
14368 {
14369 #ifdef OBJ_ELF
14370   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14371     {
14372       long mask, off;
14373
14374       if (cur_proc_ptr == (procS *) NULL)
14375         {
14376           as_warn (_(".mask/.fmask outside of .ent"));
14377           demand_empty_rest_of_line ();
14378           return;
14379         }
14380
14381       if (get_absolute_expression_and_terminator (&mask) != ',')
14382         {
14383           as_warn (_("Bad .mask/.fmask directive"));
14384           --input_line_pointer;
14385           demand_empty_rest_of_line ();
14386           return;
14387         }
14388
14389       off = get_absolute_expression ();
14390
14391       if (reg_type == 'F')
14392         {
14393           cur_proc_ptr->fpreg_mask = mask;
14394           cur_proc_ptr->fpreg_offset = off;
14395         }
14396       else
14397         {
14398           cur_proc_ptr->reg_mask = mask;
14399           cur_proc_ptr->reg_offset = off;
14400         }
14401
14402       demand_empty_rest_of_line ();
14403     }
14404   else
14405 #endif /* OBJ_ELF */
14406     s_ignore (reg_type);
14407 }
14408
14409 /* A table describing all the processors gas knows about.  Names are
14410    matched in the order listed.
14411
14412    To ease comparison, please keep this table in the same order as
14413    gcc's mips_cpu_info_table[].  */
14414 static const struct mips_cpu_info mips_cpu_info_table[] =
14415 {
14416   /* Entries for generic ISAs */
14417   { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
14418   { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
14419   { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
14420   { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
14421   { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
14422   { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
14423   { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14424   { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
14425   { "mips64r2",       1,      ISA_MIPS64R2,   CPU_MIPS64R2 },
14426
14427   /* MIPS I */
14428   { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
14429   { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
14430   { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
14431
14432   /* MIPS II */
14433   { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
14434
14435   /* MIPS III */
14436   { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
14437   { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
14438   { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
14439   { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
14440   { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
14441   { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
14442   { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
14443   { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
14444   { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
14445   { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
14446   { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
14447   { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
14448
14449   /* MIPS IV */
14450   { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
14451   { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
14452   { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
14453   { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
14454   { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
14455   { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
14456   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
14457   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
14458   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
14459   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
14460   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
14461   { "rm7000",         0,      ISA_MIPS4,      CPU_RM7000 },
14462   { "rm9000",         0,      ISA_MIPS4,      CPU_RM9000 },
14463
14464   /* MIPS 32 */
14465   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32 },
14466   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
14467   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
14468
14469   /* MIPS32 Release 2 */
14470   { "m4k",            0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14471   { "24k",            0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14472   { "24kc",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14473   { "24kf",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14474   { "24kx",           0,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14475
14476   /* MIPS 64 */
14477   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
14478   { "5kf",            0,      ISA_MIPS64,     CPU_MIPS64 },
14479   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
14480
14481   /* Broadcom SB-1 CPU core */
14482   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
14483
14484   /* End marker */
14485   { NULL, 0, 0, 0 }
14486 };
14487
14488
14489 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14490    with a final "000" replaced by "k".  Ignore case.
14491
14492    Note: this function is shared between GCC and GAS.  */
14493
14494 static bfd_boolean
14495 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14496 {
14497   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14498     given++, canonical++;
14499
14500   return ((*given == 0 && *canonical == 0)
14501           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14502 }
14503
14504
14505 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14506    CPU name.  We've traditionally allowed a lot of variation here.
14507
14508    Note: this function is shared between GCC and GAS.  */
14509
14510 static bfd_boolean
14511 mips_matching_cpu_name_p (const char *canonical, const char *given)
14512 {
14513   /* First see if the name matches exactly, or with a final "000"
14514      turned into "k".  */
14515   if (mips_strict_matching_cpu_name_p (canonical, given))
14516     return TRUE;
14517
14518   /* If not, try comparing based on numerical designation alone.
14519      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14520   if (TOLOWER (*given) == 'r')
14521     given++;
14522   if (!ISDIGIT (*given))
14523     return FALSE;
14524
14525   /* Skip over some well-known prefixes in the canonical name,
14526      hoping to find a number there too.  */
14527   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14528     canonical += 2;
14529   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14530     canonical += 2;
14531   else if (TOLOWER (canonical[0]) == 'r')
14532     canonical += 1;
14533
14534   return mips_strict_matching_cpu_name_p (canonical, given);
14535 }
14536
14537
14538 /* Parse an option that takes the name of a processor as its argument.
14539    OPTION is the name of the option and CPU_STRING is the argument.
14540    Return the corresponding processor enumeration if the CPU_STRING is
14541    recognized, otherwise report an error and return null.
14542
14543    A similar function exists in GCC.  */
14544
14545 static const struct mips_cpu_info *
14546 mips_parse_cpu (const char *option, const char *cpu_string)
14547 {
14548   const struct mips_cpu_info *p;
14549
14550   /* 'from-abi' selects the most compatible architecture for the given
14551      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14552      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14553      version.  Look first at the -mgp options, if given, otherwise base
14554      the choice on MIPS_DEFAULT_64BIT.
14555
14556      Treat NO_ABI like the EABIs.  One reason to do this is that the
14557      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14558      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14559      'mips64', just as we did in the days before 'from-abi'.  */
14560   if (strcasecmp (cpu_string, "from-abi") == 0)
14561     {
14562       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14563         return mips_cpu_info_from_isa (ISA_MIPS1);
14564
14565       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14566         return mips_cpu_info_from_isa (ISA_MIPS3);
14567
14568       if (file_mips_gp32 >= 0)
14569         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14570
14571       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14572                                      ? ISA_MIPS3
14573                                      : ISA_MIPS1);
14574     }
14575
14576   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14577   if (strcasecmp (cpu_string, "default") == 0)
14578     return 0;
14579
14580   for (p = mips_cpu_info_table; p->name != 0; p++)
14581     if (mips_matching_cpu_name_p (p->name, cpu_string))
14582       return p;
14583
14584   as_bad ("Bad value (%s) for %s", cpu_string, option);
14585   return 0;
14586 }
14587
14588 /* Return the canonical processor information for ISA (a member of the
14589    ISA_MIPS* enumeration).  */
14590
14591 static const struct mips_cpu_info *
14592 mips_cpu_info_from_isa (int isa)
14593 {
14594   int i;
14595
14596   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14597     if (mips_cpu_info_table[i].is_isa
14598         && isa == mips_cpu_info_table[i].isa)
14599       return (&mips_cpu_info_table[i]);
14600
14601   return NULL;
14602 }
14603
14604 static const struct mips_cpu_info *
14605 mips_cpu_info_from_arch (int arch)
14606 {
14607   int i;
14608
14609   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14610     if (arch == mips_cpu_info_table[i].cpu)
14611       return (&mips_cpu_info_table[i]);
14612
14613   return NULL;
14614 }
14615 \f
14616 static void
14617 show (FILE *stream, const char *string, int *col_p, int *first_p)
14618 {
14619   if (*first_p)
14620     {
14621       fprintf (stream, "%24s", "");
14622       *col_p = 24;
14623     }
14624   else
14625     {
14626       fprintf (stream, ", ");
14627       *col_p += 2;
14628     }
14629
14630   if (*col_p + strlen (string) > 72)
14631     {
14632       fprintf (stream, "\n%24s", "");
14633       *col_p = 24;
14634     }
14635
14636   fprintf (stream, "%s", string);
14637   *col_p += strlen (string);
14638
14639   *first_p = 0;
14640 }
14641
14642 void
14643 md_show_usage (FILE *stream)
14644 {
14645   int column, first;
14646   size_t i;
14647
14648   fprintf (stream, _("\
14649 MIPS options:\n\
14650 -EB                     generate big endian output\n\
14651 -EL                     generate little endian output\n\
14652 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
14653 -G NUM                  allow referencing objects up to NUM bytes\n\
14654                         implicitly with the gp register [default 8]\n"));
14655   fprintf (stream, _("\
14656 -mips1                  generate MIPS ISA I instructions\n\
14657 -mips2                  generate MIPS ISA II instructions\n\
14658 -mips3                  generate MIPS ISA III instructions\n\
14659 -mips4                  generate MIPS ISA IV instructions\n\
14660 -mips5                  generate MIPS ISA V instructions\n\
14661 -mips32                 generate MIPS32 ISA instructions\n\
14662 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
14663 -mips64                 generate MIPS64 ISA instructions\n\
14664 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
14665 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
14666
14667   first = 1;
14668
14669   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14670     show (stream, mips_cpu_info_table[i].name, &column, &first);
14671   show (stream, "from-abi", &column, &first);
14672   fputc ('\n', stream);
14673
14674   fprintf (stream, _("\
14675 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14676 -no-mCPU                don't generate code specific to CPU.\n\
14677                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
14678
14679   first = 1;
14680
14681   show (stream, "3900", &column, &first);
14682   show (stream, "4010", &column, &first);
14683   show (stream, "4100", &column, &first);
14684   show (stream, "4650", &column, &first);
14685   fputc ('\n', stream);
14686
14687   fprintf (stream, _("\
14688 -mips16                 generate mips16 instructions\n\
14689 -no-mips16              do not generate mips16 instructions\n"));
14690   fprintf (stream, _("\
14691 -msmartmips             generate smartmips instructions\n\
14692 -mno-smartmips          do not generate smartmips instructions\n"));  
14693   fprintf (stream, _("\
14694 -mdsp                   generate DSP instructions\n\
14695 -mno-dsp                do not generate DSP instructions\n"));
14696   fprintf (stream, _("\
14697 -mmt                    generate MT instructions\n\
14698 -mno-mt                 do not generate MT instructions\n"));
14699   fprintf (stream, _("\
14700 -mfix-vr4120            work around certain VR4120 errata\n\
14701 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
14702 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
14703 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
14704 -mno-shared             optimize output for executables\n\
14705 -msym32                 assume all symbols have 32-bit values\n\
14706 -O0                     remove unneeded NOPs, do not swap branches\n\
14707 -O                      remove unneeded NOPs and swap branches\n\
14708 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14709 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
14710 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
14711 #ifdef OBJ_ELF
14712   fprintf (stream, _("\
14713 -KPIC, -call_shared     generate SVR4 position independent code\n\
14714 -non_shared             do not generate position independent code\n\
14715 -xgot                   assume a 32 bit GOT\n\
14716 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
14717 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
14718                         non-shared code\n\
14719 -mabi=ABI               create ABI conformant object file for:\n"));
14720
14721   first = 1;
14722
14723   show (stream, "32", &column, &first);
14724   show (stream, "o64", &column, &first);
14725   show (stream, "n32", &column, &first);
14726   show (stream, "64", &column, &first);
14727   show (stream, "eabi", &column, &first);
14728
14729   fputc ('\n', stream);
14730
14731   fprintf (stream, _("\
14732 -32                     create o32 ABI object file (default)\n\
14733 -n32                    create n32 ABI object file\n\
14734 -64                     create 64 ABI object file\n"));
14735 #endif
14736 }
14737
14738 enum dwarf2_format
14739 mips_dwarf2_format (void)
14740 {
14741   if (mips_abi == N64_ABI)
14742     {
14743 #ifdef TE_IRIX
14744       return dwarf2_format_64bit_irix;
14745 #else
14746       return dwarf2_format_64bit;
14747 #endif
14748     }
14749   else
14750     return dwarf2_format_32bit;
14751 }
14752
14753 int
14754 mips_dwarf2_addr_size (void)
14755 {
14756   if (mips_abi == N64_ABI)
14757     return 8;
14758   else
14759     return 4;
14760 }
14761
14762 /* Standard calling conventions leave the CFA at SP on entry.  */
14763 void
14764 mips_cfi_frame_initial_instructions (void)
14765 {
14766   cfi_add_CFA_def_cfa_register (SP);
14767 }
14768
14769 int
14770 tc_mips_regname_to_dw2regnum (char *regname)
14771 {
14772   unsigned int regnum = -1;
14773   unsigned int reg;
14774
14775   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
14776     regnum = reg;
14777
14778   return regnum;
14779 }
This page took 0.884789 seconds and 4 git commands to generate.