]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/binutils/gas/config/tc-mips.c
add -n option to suppress clearing the build tree and add -DNO_CLEAN
[FreeBSD/FreeBSD.git] / contrib / binutils / 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 Free Software Foundation, Inc.
4    Contributed by the OSF and Ralph Campbell.
5    Written by Keith Knowles and Ralph Campbell, working independently.
6    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7    Support.
8
9    This file is part of GAS.
10
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24    02111-1307, USA.  */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include <stdarg.h>
32
33 #include "opcode/mips.h"
34 #include "itbl-ops.h"
35 #include "dwarf2dbg.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too.  */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about.  */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections.  Off by default on IRIX: the native
78    linker doesn't know about and discards them, but relocations against them
79    remain, leading to rld crashes.  */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define AT  1
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP  28
99 #define SP  29
100 #define FP  30
101 #define RA  31
102
103 #define ILLEGAL_REG (32)
104
105 /* Allow override of standard little-endian ECOFF format.  */
106
107 #ifndef ECOFF_LITTLE_FORMAT
108 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
109 #endif
110
111 extern int target_big_endian;
112
113 /* The name of the readonly data section.  */
114 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
115                             ? ".data" \
116                             : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117                             ? ".rdata" \
118                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119                             ? ".rdata" \
120                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121                             ? ".rodata" \
122                             : (abort (), ""))
123
124 /* The ABI to use.  */
125 enum mips_abi_level
126 {
127   NO_ABI = 0,
128   O32_ABI,
129   O64_ABI,
130   N32_ABI,
131   N64_ABI,
132   EABI_ABI
133 };
134
135 /* MIPS ABI we are using for this output file.  */
136 static enum mips_abi_level mips_abi = NO_ABI;
137
138 /* Whether or not we have code that can call pic code.  */
139 int mips_abicalls = FALSE;
140
141 /* This is the set of options which may be modified by the .set
142    pseudo-op.  We use a struct so that .set push and .set pop are more
143    reliable.  */
144
145 struct mips_set_options
146 {
147   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
148      if it has not been initialized.  Changed by `.set mipsN', and the
149      -mipsN command line option, and the default CPU.  */
150   int isa;
151   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
152      if they have not been initialized.  Changed by `.set <asename>', by
153      command line options, and based on the default architecture.  */
154   int ase_mips3d;
155   int ase_mdmx;
156   /* Whether we are assembling for the mips16 processor.  0 if we are
157      not, 1 if we are, and -1 if the value has not been initialized.
158      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
159      -nomips16 command line options, and the default CPU.  */
160   int mips16;
161   /* Non-zero if we should not reorder instructions.  Changed by `.set
162      reorder' and `.set noreorder'.  */
163   int noreorder;
164   /* Non-zero if we should not permit the $at ($1) register to be used
165      in instructions.  Changed by `.set at' and `.set noat'.  */
166   int noat;
167   /* Non-zero if we should warn when a macro instruction expands into
168      more than one machine instruction.  Changed by `.set nomacro' and
169      `.set macro'.  */
170   int warn_about_macros;
171   /* Non-zero if we should not move instructions.  Changed by `.set
172      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
173   int nomove;
174   /* Non-zero if we should not optimize branches by moving the target
175      of the branch into the delay slot.  Actually, we don't perform
176      this optimization anyhow.  Changed by `.set bopt' and `.set
177      nobopt'.  */
178   int nobopt;
179   /* Non-zero if we should not autoextend mips16 instructions.
180      Changed by `.set autoextend' and `.set noautoextend'.  */
181   int noautoextend;
182   /* Restrict general purpose registers and floating point registers
183      to 32 bit.  This is initially determined when -mgp32 or -mfp32
184      is passed but can changed if the assembler code uses .set mipsN.  */
185   int gp32;
186   int fp32;
187   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
188      command line option, and the default CPU.  */
189   int arch;
190 };
191
192 /* True if -mgp32 was passed.  */
193 static int file_mips_gp32 = -1;
194
195 /* True if -mfp32 was passed.  */
196 static int file_mips_fp32 = -1;
197
198 /* This is the struct we use to hold the current set of options.  Note
199    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
200    -1 to indicate that they have not been initialized.  */
201
202 static struct mips_set_options mips_opts =
203 {
204   ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN
205 };
206
207 /* These variables are filled in with the masks of registers used.
208    The object format code reads them and puts them in the appropriate
209    place.  */
210 unsigned long mips_gprmask;
211 unsigned long mips_cprmask[4];
212
213 /* MIPS ISA we are using for this output file.  */
214 static int file_mips_isa = ISA_UNKNOWN;
215
216 /* True if -mips16 was passed or implied by arguments passed on the
217    command line (e.g., by -march).  */
218 static int file_ase_mips16;
219
220 /* True if -mips3d was passed or implied by arguments passed on the
221    command line (e.g., by -march).  */
222 static int file_ase_mips3d;
223
224 /* True if -mdmx was passed or implied by arguments passed on the
225    command line (e.g., by -march).  */
226 static int file_ase_mdmx;
227
228 /* The argument of the -march= flag.  The architecture we are assembling.  */
229 static int file_mips_arch = CPU_UNKNOWN;
230 static const char *mips_arch_string;
231
232 /* The argument of the -mtune= flag.  The architecture for which we
233    are optimizing.  */
234 static int mips_tune = CPU_UNKNOWN;
235 static const char *mips_tune_string;
236
237 /* True when generating 32-bit code for a 64-bit processor.  */
238 static int mips_32bitmode = 0;
239
240 /* True if the given ABI requires 32-bit registers.  */
241 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
242
243 /* Likewise 64-bit registers.  */
244 #define ABI_NEEDS_64BIT_REGS(ABI) \
245   ((ABI) == N32_ABI               \
246    || (ABI) == N64_ABI            \
247    || (ABI) == O64_ABI)
248
249 /*  Return true if ISA supports 64 bit gp register instructions.  */
250 #define ISA_HAS_64BIT_REGS(ISA) (    \
251    (ISA) == ISA_MIPS3                \
252    || (ISA) == ISA_MIPS4             \
253    || (ISA) == ISA_MIPS5             \
254    || (ISA) == ISA_MIPS64            \
255    || (ISA) == ISA_MIPS64R2          \
256    )
257
258 /* Return true if ISA supports 64-bit right rotate (dror et al.)
259    instructions.  */
260 #define ISA_HAS_DROR(ISA) (     \
261    (ISA) == ISA_MIPS64R2        \
262    )
263
264 /* Return true if ISA supports 32-bit right rotate (ror et al.)
265    instructions.  */
266 #define ISA_HAS_ROR(ISA) (      \
267    (ISA) == ISA_MIPS32R2        \
268    || (ISA) == ISA_MIPS64R2     \
269    )
270
271 #define HAVE_32BIT_GPRS                            \
272     (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
273
274 #define HAVE_32BIT_FPRS                            \
275     (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
276
277 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
278 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
279
280 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
281
282 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
283
284 /* We can only have 64bit addresses if the object file format
285    supports it.  */
286 #define HAVE_32BIT_ADDRESSES                           \
287    (HAVE_32BIT_GPRS                                    \
288     || ((bfd_arch_bits_per_address (stdoutput) == 32   \
289          || ! HAVE_64BIT_OBJECTS)                      \
290         && mips_pic != EMBEDDED_PIC))
291
292 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
293
294 /* Addresses are loaded in different ways, depending on the address size
295    in use.  The n32 ABI Documentation also mandates the use of additions
296    with overflow checking, but existing implementations don't follow it.  */
297 #define ADDRESS_ADD_INSN                                                \
298    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
299
300 #define ADDRESS_ADDI_INSN                                               \
301    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
302
303 #define ADDRESS_LOAD_INSN                                               \
304    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
305
306 #define ADDRESS_STORE_INSN                                              \
307    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
308
309 /* Return true if the given CPU supports the MIPS16 ASE.  */
310 #define CPU_HAS_MIPS16(cpu)                                             \
311    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
312     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
313
314 /* Return true if the given CPU supports the MIPS3D ASE.  */
315 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
316                                  )
317
318 /* Return true if the given CPU supports the MDMX ASE.  */
319 #define CPU_HAS_MDMX(cpu)       (FALSE                 \
320                                  )
321
322 /* True if CPU has a dror instruction.  */
323 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
324
325 /* True if CPU has a ror instruction.  */
326 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
327
328 /* True if mflo and mfhi can be immediately followed by instructions
329    which write to the HI and LO registers.
330
331    According to MIPS specifications, MIPS ISAs I, II, and III need
332    (at least) two instructions between the reads of HI/LO and
333    instructions which write them, and later ISAs do not.  Contradicting
334    the MIPS specifications, some MIPS IV processor user manuals (e.g.
335    the UM for the NEC Vr5000) document needing the instructions between
336    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
337    MIPS64 and later ISAs to have the interlocks, plus any specific
338    earlier-ISA CPUs for which CPU documentation declares that the
339    instructions are really interlocked.  */
340 #define hilo_interlocks \
341   (mips_opts.isa == ISA_MIPS32                        \
342    || mips_opts.isa == ISA_MIPS32R2                   \
343    || mips_opts.isa == ISA_MIPS64                     \
344    || mips_opts.isa == ISA_MIPS64R2                   \
345    || mips_opts.arch == CPU_R4010                     \
346    || mips_opts.arch == CPU_R10000                    \
347    || mips_opts.arch == CPU_R12000                    \
348    || mips_opts.arch == CPU_RM7000                    \
349    || mips_opts.arch == CPU_SB1                       \
350    || mips_opts.arch == CPU_VR5500                    \
351    )
352
353 /* Whether the processor uses hardware interlocks to protect reads
354    from the GPRs after they are loaded from memory, and thus does not
355    require nops to be inserted.  This applies to instructions marked
356    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
357    level I.  */
358 #define gpr_interlocks \
359   (mips_opts.isa != ISA_MIPS1  \
360    || mips_opts.arch == CPU_VR5400  \
361    || mips_opts.arch == CPU_VR5500  \
362    || mips_opts.arch == CPU_R3900)
363
364 /* Whether the processor uses hardware interlocks to avoid delays
365    required by coprocessor instructions, and thus does not require
366    nops to be inserted.  This applies to instructions marked
367    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
368    between instructions marked INSN_WRITE_COND_CODE and ones marked
369    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
370    levels I, II, and III.  */
371 /* Itbl support may require additional care here.  */
372 #define cop_interlocks                                \
373   ((mips_opts.isa != ISA_MIPS1                        \
374     && mips_opts.isa != ISA_MIPS2                     \
375     && mips_opts.isa != ISA_MIPS3)                    \
376    || mips_opts.arch == CPU_R4300                     \
377    || mips_opts.arch == CPU_VR5400                    \
378    || mips_opts.arch == CPU_VR5500                    \
379    || mips_opts.arch == CPU_SB1                       \
380    )
381
382 /* Whether the processor uses hardware interlocks to protect reads
383    from coprocessor registers after they are loaded from memory, and
384    thus does not require nops to be inserted.  This applies to
385    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
386    requires at MIPS ISA level I.  */
387 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
388
389 /* Is this a mfhi or mflo instruction?  */
390 #define MF_HILO_INSN(PINFO) \
391           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
392
393 /* MIPS PIC level.  */
394
395 enum mips_pic_level mips_pic;
396
397 /* 1 if we should generate 32 bit offsets from the $gp register in
398    SVR4_PIC mode.  Currently has no meaning in other modes.  */
399 static int mips_big_got = 0;
400
401 /* 1 if trap instructions should used for overflow rather than break
402    instructions.  */
403 static int mips_trap = 0;
404
405 /* 1 if double width floating point constants should not be constructed
406    by assembling two single width halves into two single width floating
407    point registers which just happen to alias the double width destination
408    register.  On some architectures this aliasing can be disabled by a bit
409    in the status register, and the setting of this bit cannot be determined
410    automatically at assemble time.  */
411 static int mips_disable_float_construction;
412
413 /* Non-zero if any .set noreorder directives were used.  */
414
415 static int mips_any_noreorder;
416
417 /* Non-zero if nops should be inserted when the register referenced in
418    an mfhi/mflo instruction is read in the next two instructions.  */
419 static int mips_7000_hilo_fix;
420
421 /* The size of the small data section.  */
422 static unsigned int g_switch_value = 8;
423 /* Whether the -G option was used.  */
424 static int g_switch_seen = 0;
425
426 #define N_RMASK 0xc4
427 #define N_VFP   0xd4
428
429 /* If we can determine in advance that GP optimization won't be
430    possible, we can skip the relaxation stuff that tries to produce
431    GP-relative references.  This makes delay slot optimization work
432    better.
433
434    This function can only provide a guess, but it seems to work for
435    gcc output.  It needs to guess right for gcc, otherwise gcc
436    will put what it thinks is a GP-relative instruction in a branch
437    delay slot.
438
439    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
440    fixed it for the non-PIC mode.  KR 95/04/07  */
441 static int nopic_need_relax (symbolS *, int);
442
443 /* handle of the OPCODE hash table */
444 static struct hash_control *op_hash = NULL;
445
446 /* The opcode hash table we use for the mips16.  */
447 static struct hash_control *mips16_op_hash = NULL;
448
449 /* This array holds the chars that always start a comment.  If the
450     pre-processor is disabled, these aren't very useful */
451 const char comment_chars[] = "#";
452
453 /* This array holds the chars that only start a comment at the beginning of
454    a line.  If the line seems to have the form '# 123 filename'
455    .line and .file directives will appear in the pre-processed output */
456 /* Note that input_file.c hand checks for '#' at the beginning of the
457    first line of the input file.  This is because the compiler outputs
458    #NO_APP at the beginning of its output.  */
459 /* Also note that C style comments are always supported.  */
460 const char line_comment_chars[] = "#";
461
462 /* This array holds machine specific line separator characters.  */
463 const char line_separator_chars[] = ";";
464
465 /* Chars that can be used to separate mant from exp in floating point nums */
466 const char EXP_CHARS[] = "eE";
467
468 /* Chars that mean this number is a floating point constant */
469 /* As in 0f12.456 */
470 /* or    0d1.2345e12 */
471 const char FLT_CHARS[] = "rRsSfFdDxXpP";
472
473 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
474    changed in read.c .  Ideally it shouldn't have to know about it at all,
475    but nothing is ideal around here.
476  */
477
478 static char *insn_error;
479
480 static int auto_align = 1;
481
482 /* When outputting SVR4 PIC code, the assembler needs to know the
483    offset in the stack frame from which to restore the $gp register.
484    This is set by the .cprestore pseudo-op, and saved in this
485    variable.  */
486 static offsetT mips_cprestore_offset = -1;
487
488 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
489    more optimizations, it can use a register value instead of a memory-saved
490    offset and even an other register than $gp as global pointer.  */
491 static offsetT mips_cpreturn_offset = -1;
492 static int mips_cpreturn_register = -1;
493 static int mips_gp_register = GP;
494 static int mips_gprel_offset = 0;
495
496 /* Whether mips_cprestore_offset has been set in the current function
497    (or whether it has already been warned about, if not).  */
498 static int mips_cprestore_valid = 0;
499
500 /* This is the register which holds the stack frame, as set by the
501    .frame pseudo-op.  This is needed to implement .cprestore.  */
502 static int mips_frame_reg = SP;
503
504 /* Whether mips_frame_reg has been set in the current function
505    (or whether it has already been warned about, if not).  */
506 static int mips_frame_reg_valid = 0;
507
508 /* To output NOP instructions correctly, we need to keep information
509    about the previous two instructions.  */
510
511 /* Whether we are optimizing.  The default value of 2 means to remove
512    unneeded NOPs and swap branch instructions when possible.  A value
513    of 1 means to not swap branches.  A value of 0 means to always
514    insert NOPs.  */
515 static int mips_optimize = 2;
516
517 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
518    equivalent to seeing no -g option at all.  */
519 static int mips_debug = 0;
520
521 /* The previous instruction.  */
522 static struct mips_cl_insn prev_insn;
523
524 /* The instruction before prev_insn.  */
525 static struct mips_cl_insn prev_prev_insn;
526
527 /* If we don't want information for prev_insn or prev_prev_insn, we
528    point the insn_mo field at this dummy integer.  */
529 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
530
531 /* Non-zero if prev_insn is valid.  */
532 static int prev_insn_valid;
533
534 /* The frag for the previous instruction.  */
535 static struct frag *prev_insn_frag;
536
537 /* The offset into prev_insn_frag for the previous instruction.  */
538 static long prev_insn_where;
539
540 /* The reloc type for the previous instruction, if any.  */
541 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
542
543 /* The reloc for the previous instruction, if any.  */
544 static fixS *prev_insn_fixp[3];
545
546 /* Non-zero if the previous instruction was in a delay slot.  */
547 static int prev_insn_is_delay_slot;
548
549 /* Non-zero if the previous instruction was in a .set noreorder.  */
550 static int prev_insn_unreordered;
551
552 /* Non-zero if the previous instruction uses an extend opcode (if
553    mips16).  */
554 static int prev_insn_extended;
555
556 /* Non-zero if the previous previous instruction was in a .set
557    noreorder.  */
558 static int prev_prev_insn_unreordered;
559
560 /* If this is set, it points to a frag holding nop instructions which
561    were inserted before the start of a noreorder section.  If those
562    nops turn out to be unnecessary, the size of the frag can be
563    decreased.  */
564 static fragS *prev_nop_frag;
565
566 /* The number of nop instructions we created in prev_nop_frag.  */
567 static int prev_nop_frag_holds;
568
569 /* The number of nop instructions that we know we need in
570    prev_nop_frag.  */
571 static int prev_nop_frag_required;
572
573 /* The number of instructions we've seen since prev_nop_frag.  */
574 static int prev_nop_frag_since;
575
576 /* For ECOFF and ELF, relocations against symbols are done in two
577    parts, with a HI relocation and a LO relocation.  Each relocation
578    has only 16 bits of space to store an addend.  This means that in
579    order for the linker to handle carries correctly, it must be able
580    to locate both the HI and the LO relocation.  This means that the
581    relocations must appear in order in the relocation table.
582
583    In order to implement this, we keep track of each unmatched HI
584    relocation.  We then sort them so that they immediately precede the
585    corresponding LO relocation.  */
586
587 struct mips_hi_fixup
588 {
589   /* Next HI fixup.  */
590   struct mips_hi_fixup *next;
591   /* This fixup.  */
592   fixS *fixp;
593   /* The section this fixup is in.  */
594   segT seg;
595 };
596
597 /* The list of unmatched HI relocs.  */
598
599 static struct mips_hi_fixup *mips_hi_fixup_list;
600
601 /* The frag containing the last explicit relocation operator.
602    Null if explicit relocations have not been used.  */
603
604 static fragS *prev_reloc_op_frag;
605
606 /* Map normal MIPS register numbers to mips16 register numbers.  */
607
608 #define X ILLEGAL_REG
609 static const int mips32_to_16_reg_map[] =
610 {
611   X, X, 2, 3, 4, 5, 6, 7,
612   X, X, X, X, X, X, X, X,
613   0, 1, X, X, X, X, X, X,
614   X, X, X, X, X, X, X, X
615 };
616 #undef X
617
618 /* Map mips16 register numbers to normal MIPS register numbers.  */
619
620 static const unsigned int mips16_to_32_reg_map[] =
621 {
622   16, 17, 2, 3, 4, 5, 6, 7
623 };
624
625 static int mips_fix_vr4120;
626
627 /* We don't relax branches by default, since this causes us to expand
628    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
629    fail to compute the offset before expanding the macro to the most
630    efficient expansion.  */
631
632 static int mips_relax_branch;
633 \f
634 /* The expansion of many macros depends on the type of symbol that
635    they refer to.  For example, when generating position-dependent code,
636    a macro that refers to a symbol may have two different expansions,
637    one which uses GP-relative addresses and one which uses absolute
638    addresses.  When generating SVR4-style PIC, a macro may have
639    different expansions for local and global symbols.
640
641    We handle these situations by generating both sequences and putting
642    them in variant frags.  In position-dependent code, the first sequence
643    will be the GP-relative one and the second sequence will be the
644    absolute one.  In SVR4 PIC, the first sequence will be for global
645    symbols and the second will be for local symbols.
646
647    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
648    SECOND are the lengths of the two sequences in bytes.  These fields
649    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
650    the subtype has the following flags:
651
652    RELAX_USE_SECOND
653         Set if it has been decided that we should use the second
654         sequence instead of the first.
655
656    RELAX_SECOND_LONGER
657         Set in the first variant frag if the macro's second implementation
658         is longer than its first.  This refers to the macro as a whole,
659         not an individual relaxation.
660
661    RELAX_NOMACRO
662         Set in the first variant frag if the macro appeared in a .set nomacro
663         block and if one alternative requires a warning but the other does not.
664
665    RELAX_DELAY_SLOT
666         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
667         delay slot.
668
669    The frag's "opcode" points to the first fixup for relaxable code.
670
671    Relaxable macros are generated using a sequence such as:
672
673       relax_start (SYMBOL);
674       ... generate first expansion ...
675       relax_switch ();
676       ... generate second expansion ...
677       relax_end ();
678
679    The code and fixups for the unwanted alternative are discarded
680    by md_convert_frag.  */
681 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
682
683 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
684 #define RELAX_SECOND(X) ((X) & 0xff)
685 #define RELAX_USE_SECOND 0x10000
686 #define RELAX_SECOND_LONGER 0x20000
687 #define RELAX_NOMACRO 0x40000
688 #define RELAX_DELAY_SLOT 0x80000
689
690 /* Branch without likely bit.  If label is out of range, we turn:
691
692         beq reg1, reg2, label
693         delay slot
694
695    into
696
697         bne reg1, reg2, 0f
698         nop
699         j label
700      0: delay slot
701
702    with the following opcode replacements:
703
704         beq <-> bne
705         blez <-> bgtz
706         bltz <-> bgez
707         bc1f <-> bc1t
708
709         bltzal <-> bgezal  (with jal label instead of j label)
710
711    Even though keeping the delay slot instruction in the delay slot of
712    the branch would be more efficient, it would be very tricky to do
713    correctly, because we'd have to introduce a variable frag *after*
714    the delay slot instruction, and expand that instead.  Let's do it
715    the easy way for now, even if the branch-not-taken case now costs
716    one additional instruction.  Out-of-range branches are not supposed
717    to be common, anyway.
718
719    Branch likely.  If label is out of range, we turn:
720
721         beql reg1, reg2, label
722         delay slot (annulled if branch not taken)
723
724    into
725
726         beql reg1, reg2, 1f
727         nop
728         beql $0, $0, 2f
729         nop
730      1: j[al] label
731         delay slot (executed only if branch taken)
732      2:
733
734    It would be possible to generate a shorter sequence by losing the
735    likely bit, generating something like:
736
737         bne reg1, reg2, 0f
738         nop
739         j[al] label
740         delay slot (executed only if branch taken)
741      0:
742
743         beql -> bne
744         bnel -> beq
745         blezl -> bgtz
746         bgtzl -> blez
747         bltzl -> bgez
748         bgezl -> bltz
749         bc1fl -> bc1t
750         bc1tl -> bc1f
751
752         bltzall -> bgezal  (with jal label instead of j label)
753         bgezall -> bltzal  (ditto)
754
755
756    but it's not clear that it would actually improve performance.  */
757 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
758   ((relax_substateT) \
759    (0xc0000000 \
760     | ((toofar) ? 1 : 0) \
761     | ((link) ? 2 : 0) \
762     | ((likely) ? 4 : 0) \
763     | ((uncond) ? 8 : 0)))
764 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
765 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
766 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
767 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
768 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
769
770 /* For mips16 code, we use an entirely different form of relaxation.
771    mips16 supports two versions of most instructions which take
772    immediate values: a small one which takes some small value, and a
773    larger one which takes a 16 bit value.  Since branches also follow
774    this pattern, relaxing these values is required.
775
776    We can assemble both mips16 and normal MIPS code in a single
777    object.  Therefore, we need to support this type of relaxation at
778    the same time that we support the relaxation described above.  We
779    use the high bit of the subtype field to distinguish these cases.
780
781    The information we store for this type of relaxation is the
782    argument code found in the opcode file for this relocation, whether
783    the user explicitly requested a small or extended form, and whether
784    the relocation is in a jump or jal delay slot.  That tells us the
785    size of the value, and how it should be stored.  We also store
786    whether the fragment is considered to be extended or not.  We also
787    store whether this is known to be a branch to a different section,
788    whether we have tried to relax this frag yet, and whether we have
789    ever extended a PC relative fragment because of a shift count.  */
790 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
791   (0x80000000                                                   \
792    | ((type) & 0xff)                                            \
793    | ((small) ? 0x100 : 0)                                      \
794    | ((ext) ? 0x200 : 0)                                        \
795    | ((dslot) ? 0x400 : 0)                                      \
796    | ((jal_dslot) ? 0x800 : 0))
797 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
798 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
799 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
800 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
801 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
802 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
803 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
804 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
805 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
806 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
807 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
808 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
809
810 /* Is the given value a sign-extended 32-bit value?  */
811 #define IS_SEXT_32BIT_NUM(x)                                            \
812   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
813    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
814
815 /* Is the given value a sign-extended 16-bit value?  */
816 #define IS_SEXT_16BIT_NUM(x)                                            \
817   (((x) &~ (offsetT) 0x7fff) == 0                                       \
818    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
819
820 \f
821 /* Global variables used when generating relaxable macros.  See the
822    comment above RELAX_ENCODE for more details about how relaxation
823    is used.  */
824 static struct {
825   /* 0 if we're not emitting a relaxable macro.
826      1 if we're emitting the first of the two relaxation alternatives.
827      2 if we're emitting the second alternative.  */
828   int sequence;
829
830   /* The first relaxable fixup in the current frag.  (In other words,
831      the first fixup that refers to relaxable code.)  */
832   fixS *first_fixup;
833
834   /* sizes[0] says how many bytes of the first alternative are stored in
835      the current frag.  Likewise sizes[1] for the second alternative.  */
836   unsigned int sizes[2];
837
838   /* The symbol on which the choice of sequence depends.  */
839   symbolS *symbol;
840 } mips_relax;
841 \f
842 /* Global variables used to decide whether a macro needs a warning.  */
843 static struct {
844   /* True if the macro is in a branch delay slot.  */
845   bfd_boolean delay_slot_p;
846
847   /* For relaxable macros, sizes[0] is the length of the first alternative
848      in bytes and sizes[1] is the length of the second alternative.
849      For non-relaxable macros, both elements give the length of the
850      macro in bytes.  */
851   unsigned int sizes[2];
852
853   /* The first variant frag for this macro.  */
854   fragS *first_frag;
855 } mips_macro_warning;
856 \f
857 /* Prototypes for static functions.  */
858
859 #define internalError()                                                 \
860     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
861
862 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
863
864 static void append_insn
865   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
866 static void mips_no_prev_insn (int);
867 static void mips16_macro_build
868   (expressionS *, const char *, const char *, va_list);
869 static void load_register (int, expressionS *, int);
870 static void macro_start (void);
871 static void macro_end (void);
872 static void macro (struct mips_cl_insn * ip);
873 static void mips16_macro (struct mips_cl_insn * ip);
874 #ifdef LOSING_COMPILER
875 static void macro2 (struct mips_cl_insn * ip);
876 #endif
877 static void mips_ip (char *str, struct mips_cl_insn * ip);
878 static void mips16_ip (char *str, struct mips_cl_insn * ip);
879 static void mips16_immed
880   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
881    unsigned long *, bfd_boolean *, unsigned short *);
882 static size_t my_getSmallExpression
883   (expressionS *, bfd_reloc_code_real_type *, char *);
884 static void my_getExpression (expressionS *, char *);
885 static void s_align (int);
886 static void s_change_sec (int);
887 static void s_change_section (int);
888 static void s_cons (int);
889 static void s_float_cons (int);
890 static void s_mips_globl (int);
891 static void s_option (int);
892 static void s_mipsset (int);
893 static void s_abicalls (int);
894 static void s_cpload (int);
895 static void s_cpsetup (int);
896 static void s_cplocal (int);
897 static void s_cprestore (int);
898 static void s_cpreturn (int);
899 static void s_gpvalue (int);
900 static void s_gpword (int);
901 static void s_gpdword (int);
902 static void s_cpadd (int);
903 static void s_insn (int);
904 static void md_obj_begin (void);
905 static void md_obj_end (void);
906 static void s_mips_ent (int);
907 static void s_mips_end (int);
908 static void s_mips_frame (int);
909 static void s_mips_mask (int reg_type);
910 static void s_mips_stab (int);
911 static void s_mips_weakext (int);
912 static void s_mips_file (int);
913 static void s_mips_loc (int);
914 static bfd_boolean pic_need_relax (symbolS *, asection *);
915 static int relaxed_branch_length (fragS *, asection *, int);
916 static int validate_mips_insn (const struct mips_opcode *);
917
918 /* Table and functions used to map between CPU/ISA names, and
919    ISA levels, and CPU numbers.  */
920
921 struct mips_cpu_info
922 {
923   const char *name;           /* CPU or ISA name.  */
924   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
925   int isa;                    /* ISA level.  */
926   int cpu;                    /* CPU number (default CPU if ISA).  */
927 };
928
929 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
930 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
931 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
932 \f
933 /* Pseudo-op table.
934
935    The following pseudo-ops from the Kane and Heinrich MIPS book
936    should be defined here, but are currently unsupported: .alias,
937    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
938
939    The following pseudo-ops from the Kane and Heinrich MIPS book are
940    specific to the type of debugging information being generated, and
941    should be defined by the object format: .aent, .begin, .bend,
942    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
943    .vreg.
944
945    The following pseudo-ops from the Kane and Heinrich MIPS book are
946    not MIPS CPU specific, but are also not specific to the object file
947    format.  This file is probably the best place to define them, but
948    they are not currently supported: .asm0, .endr, .lab, .repeat,
949    .struct.  */
950
951 static const pseudo_typeS mips_pseudo_table[] =
952 {
953   /* MIPS specific pseudo-ops.  */
954   {"option", s_option, 0},
955   {"set", s_mipsset, 0},
956   {"rdata", s_change_sec, 'r'},
957   {"sdata", s_change_sec, 's'},
958   {"livereg", s_ignore, 0},
959   {"abicalls", s_abicalls, 0},
960   {"cpload", s_cpload, 0},
961   {"cpsetup", s_cpsetup, 0},
962   {"cplocal", s_cplocal, 0},
963   {"cprestore", s_cprestore, 0},
964   {"cpreturn", s_cpreturn, 0},
965   {"gpvalue", s_gpvalue, 0},
966   {"gpword", s_gpword, 0},
967   {"gpdword", s_gpdword, 0},
968   {"cpadd", s_cpadd, 0},
969   {"insn", s_insn, 0},
970
971   /* Relatively generic pseudo-ops that happen to be used on MIPS
972      chips.  */
973   {"asciiz", stringer, 1},
974   {"bss", s_change_sec, 'b'},
975   {"err", s_err, 0},
976   {"half", s_cons, 1},
977   {"dword", s_cons, 3},
978   {"weakext", s_mips_weakext, 0},
979
980   /* These pseudo-ops are defined in read.c, but must be overridden
981      here for one reason or another.  */
982   {"align", s_align, 0},
983   {"byte", s_cons, 0},
984   {"data", s_change_sec, 'd'},
985   {"double", s_float_cons, 'd'},
986   {"float", s_float_cons, 'f'},
987   {"globl", s_mips_globl, 0},
988   {"global", s_mips_globl, 0},
989   {"hword", s_cons, 1},
990   {"int", s_cons, 2},
991   {"long", s_cons, 2},
992   {"octa", s_cons, 4},
993   {"quad", s_cons, 3},
994   {"section", s_change_section, 0},
995   {"short", s_cons, 1},
996   {"single", s_float_cons, 'f'},
997   {"stabn", s_mips_stab, 'n'},
998   {"text", s_change_sec, 't'},
999   {"word", s_cons, 2},
1000
1001   { "extern", ecoff_directive_extern, 0},
1002
1003   { NULL, NULL, 0 },
1004 };
1005
1006 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1007 {
1008   /* These pseudo-ops should be defined by the object file format.
1009      However, a.out doesn't support them, so we have versions here.  */
1010   {"aent", s_mips_ent, 1},
1011   {"bgnb", s_ignore, 0},
1012   {"end", s_mips_end, 0},
1013   {"endb", s_ignore, 0},
1014   {"ent", s_mips_ent, 0},
1015   {"file", s_mips_file, 0},
1016   {"fmask", s_mips_mask, 'F'},
1017   {"frame", s_mips_frame, 0},
1018   {"loc", s_mips_loc, 0},
1019   {"mask", s_mips_mask, 'R'},
1020   {"verstamp", s_ignore, 0},
1021   { NULL, NULL, 0 },
1022 };
1023
1024 extern void pop_insert (const pseudo_typeS *);
1025
1026 void
1027 mips_pop_insert (void)
1028 {
1029   pop_insert (mips_pseudo_table);
1030   if (! ECOFF_DEBUGGING)
1031     pop_insert (mips_nonecoff_pseudo_table);
1032 }
1033 \f
1034 /* Symbols labelling the current insn.  */
1035
1036 struct insn_label_list
1037 {
1038   struct insn_label_list *next;
1039   symbolS *label;
1040 };
1041
1042 static struct insn_label_list *insn_labels;
1043 static struct insn_label_list *free_insn_labels;
1044
1045 static void mips_clear_insn_labels (void);
1046
1047 static inline void
1048 mips_clear_insn_labels (void)
1049 {
1050   register struct insn_label_list **pl;
1051
1052   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1053     ;
1054   *pl = insn_labels;
1055   insn_labels = NULL;
1056 }
1057 \f
1058 static char *expr_end;
1059
1060 /* Expressions which appear in instructions.  These are set by
1061    mips_ip.  */
1062
1063 static expressionS imm_expr;
1064 static expressionS imm2_expr;
1065 static expressionS offset_expr;
1066
1067 /* Relocs associated with imm_expr and offset_expr.  */
1068
1069 static bfd_reloc_code_real_type imm_reloc[3]
1070   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1071 static bfd_reloc_code_real_type offset_reloc[3]
1072   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1073
1074 /* These are set by mips16_ip if an explicit extension is used.  */
1075
1076 static bfd_boolean mips16_small, mips16_ext;
1077
1078 #ifdef OBJ_ELF
1079 /* The pdr segment for per procedure frame/regmask info.  Not used for
1080    ECOFF debugging.  */
1081
1082 static segT pdr_seg;
1083 #endif
1084
1085 /* The default target format to use.  */
1086
1087 const char *
1088 mips_target_format (void)
1089 {
1090   switch (OUTPUT_FLAVOR)
1091     {
1092     case bfd_target_aout_flavour:
1093       return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1094     case bfd_target_ecoff_flavour:
1095       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1096     case bfd_target_coff_flavour:
1097       return "pe-mips";
1098     case bfd_target_elf_flavour:
1099 #ifdef TE_TMIPS
1100       /* This is traditional mips.  */
1101       return (target_big_endian
1102               ? (HAVE_64BIT_OBJECTS
1103                  ? "elf64-tradbigmips"
1104                  : (HAVE_NEWABI
1105                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1106               : (HAVE_64BIT_OBJECTS
1107                  ? "elf64-tradlittlemips"
1108                  : (HAVE_NEWABI
1109                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1110 #else
1111       return (target_big_endian
1112               ? (HAVE_64BIT_OBJECTS
1113                  ? "elf64-bigmips"
1114                  : (HAVE_NEWABI
1115                     ? "elf32-nbigmips" : "elf32-bigmips"))
1116               : (HAVE_64BIT_OBJECTS
1117                  ? "elf64-littlemips"
1118                  : (HAVE_NEWABI
1119                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1120 #endif
1121     default:
1122       abort ();
1123       return NULL;
1124     }
1125 }
1126
1127 /* This function is called once, at assembler startup time.  It should
1128    set up all the tables, etc. that the MD part of the assembler will need.  */
1129
1130 void
1131 md_begin (void)
1132 {
1133   register const char *retval = NULL;
1134   int i = 0;
1135   int broken = 0;
1136
1137   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1138     as_warn (_("Could not set architecture and machine"));
1139
1140   op_hash = hash_new ();
1141
1142   for (i = 0; i < NUMOPCODES;)
1143     {
1144       const char *name = mips_opcodes[i].name;
1145
1146       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1147       if (retval != NULL)
1148         {
1149           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1150                    mips_opcodes[i].name, retval);
1151           /* Probably a memory allocation problem?  Give up now.  */
1152           as_fatal (_("Broken assembler.  No assembly attempted."));
1153         }
1154       do
1155         {
1156           if (mips_opcodes[i].pinfo != INSN_MACRO)
1157             {
1158               if (!validate_mips_insn (&mips_opcodes[i]))
1159                 broken = 1;
1160             }
1161           ++i;
1162         }
1163       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1164     }
1165
1166   mips16_op_hash = hash_new ();
1167
1168   i = 0;
1169   while (i < bfd_mips16_num_opcodes)
1170     {
1171       const char *name = mips16_opcodes[i].name;
1172
1173       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1174       if (retval != NULL)
1175         as_fatal (_("internal: can't hash `%s': %s"),
1176                   mips16_opcodes[i].name, retval);
1177       do
1178         {
1179           if (mips16_opcodes[i].pinfo != INSN_MACRO
1180               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1181                   != mips16_opcodes[i].match))
1182             {
1183               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1184                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1185               broken = 1;
1186             }
1187           ++i;
1188         }
1189       while (i < bfd_mips16_num_opcodes
1190              && strcmp (mips16_opcodes[i].name, name) == 0);
1191     }
1192
1193   if (broken)
1194     as_fatal (_("Broken assembler.  No assembly attempted."));
1195
1196   /* We add all the general register names to the symbol table.  This
1197      helps us detect invalid uses of them.  */
1198   for (i = 0; i < 32; i++)
1199     {
1200       char buf[5];
1201
1202       sprintf (buf, "$%d", i);
1203       symbol_table_insert (symbol_new (buf, reg_section, i,
1204                                        &zero_address_frag));
1205     }
1206   symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1207                                    &zero_address_frag));
1208   symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1209                                    &zero_address_frag));
1210   symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1211                                    &zero_address_frag));
1212   symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1213                                    &zero_address_frag));
1214   symbol_table_insert (symbol_new ("$at", reg_section, AT,
1215                                    &zero_address_frag));
1216   symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1217                                    &zero_address_frag));
1218   symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1219                                    &zero_address_frag));
1220   symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1221                                    &zero_address_frag));
1222   symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1223                                    &zero_address_frag));
1224
1225   /* If we don't add these register names to the symbol table, they
1226      may end up being added as regular symbols by operand(), and then
1227      make it to the object file as undefined in case they're not
1228      regarded as local symbols.  They're local in o32, since `$' is a
1229      local symbol prefix, but not in n32 or n64.  */
1230   for (i = 0; i < 8; i++)
1231     {
1232       char buf[6];
1233
1234       sprintf (buf, "$fcc%i", i);
1235       symbol_table_insert (symbol_new (buf, reg_section, -1,
1236                                        &zero_address_frag));
1237     }
1238
1239   mips_no_prev_insn (FALSE);
1240
1241   mips_gprmask = 0;
1242   mips_cprmask[0] = 0;
1243   mips_cprmask[1] = 0;
1244   mips_cprmask[2] = 0;
1245   mips_cprmask[3] = 0;
1246
1247   /* set the default alignment for the text section (2**2) */
1248   record_alignment (text_section, 2);
1249
1250   if (USE_GLOBAL_POINTER_OPT)
1251     bfd_set_gp_size (stdoutput, g_switch_value);
1252
1253   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1254     {
1255       /* On a native system, sections must be aligned to 16 byte
1256          boundaries.  When configured for an embedded ELF target, we
1257          don't bother.  */
1258       if (strcmp (TARGET_OS, "elf") != 0)
1259         {
1260           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1261           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1262           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1263         }
1264
1265       /* Create a .reginfo section for register masks and a .mdebug
1266          section for debugging information.  */
1267       {
1268         segT seg;
1269         subsegT subseg;
1270         flagword flags;
1271         segT sec;
1272
1273         seg = now_seg;
1274         subseg = now_subseg;
1275
1276         /* The ABI says this section should be loaded so that the
1277            running program can access it.  However, we don't load it
1278            if we are configured for an embedded target */
1279         flags = SEC_READONLY | SEC_DATA;
1280         if (strcmp (TARGET_OS, "elf") != 0)
1281           flags |= SEC_ALLOC | SEC_LOAD;
1282
1283         if (mips_abi != N64_ABI)
1284           {
1285             sec = subseg_new (".reginfo", (subsegT) 0);
1286
1287             bfd_set_section_flags (stdoutput, sec, flags);
1288             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1289
1290 #ifdef OBJ_ELF
1291             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1292 #endif
1293           }
1294         else
1295           {
1296             /* The 64-bit ABI uses a .MIPS.options section rather than
1297                .reginfo section.  */
1298             sec = subseg_new (".MIPS.options", (subsegT) 0);
1299             bfd_set_section_flags (stdoutput, sec, flags);
1300             bfd_set_section_alignment (stdoutput, sec, 3);
1301
1302 #ifdef OBJ_ELF
1303             /* Set up the option header.  */
1304             {
1305               Elf_Internal_Options opthdr;
1306               char *f;
1307
1308               opthdr.kind = ODK_REGINFO;
1309               opthdr.size = (sizeof (Elf_External_Options)
1310                              + sizeof (Elf64_External_RegInfo));
1311               opthdr.section = 0;
1312               opthdr.info = 0;
1313               f = frag_more (sizeof (Elf_External_Options));
1314               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1315                                              (Elf_External_Options *) f);
1316
1317               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1318             }
1319 #endif
1320           }
1321
1322         if (ECOFF_DEBUGGING)
1323           {
1324             sec = subseg_new (".mdebug", (subsegT) 0);
1325             (void) bfd_set_section_flags (stdoutput, sec,
1326                                           SEC_HAS_CONTENTS | SEC_READONLY);
1327             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1328           }
1329 #ifdef OBJ_ELF
1330         else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1331           {
1332             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1333             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1334                                           SEC_READONLY | SEC_RELOC
1335                                           | SEC_DEBUGGING);
1336             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1337           }
1338 #endif
1339
1340         subseg_set (seg, subseg);
1341       }
1342     }
1343
1344   if (! ECOFF_DEBUGGING)
1345     md_obj_begin ();
1346 }
1347
1348 void
1349 md_mips_end (void)
1350 {
1351   if (! ECOFF_DEBUGGING)
1352     md_obj_end ();
1353 }
1354
1355 void
1356 md_assemble (char *str)
1357 {
1358   struct mips_cl_insn insn;
1359   bfd_reloc_code_real_type unused_reloc[3]
1360     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1361
1362   imm_expr.X_op = O_absent;
1363   imm2_expr.X_op = O_absent;
1364   offset_expr.X_op = O_absent;
1365   imm_reloc[0] = BFD_RELOC_UNUSED;
1366   imm_reloc[1] = BFD_RELOC_UNUSED;
1367   imm_reloc[2] = BFD_RELOC_UNUSED;
1368   offset_reloc[0] = BFD_RELOC_UNUSED;
1369   offset_reloc[1] = BFD_RELOC_UNUSED;
1370   offset_reloc[2] = BFD_RELOC_UNUSED;
1371
1372   if (mips_opts.mips16)
1373     mips16_ip (str, &insn);
1374   else
1375     {
1376       mips_ip (str, &insn);
1377       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1378             str, insn.insn_opcode));
1379     }
1380
1381   if (insn_error)
1382     {
1383       as_bad ("%s `%s'", insn_error, str);
1384       return;
1385     }
1386
1387   if (insn.insn_mo->pinfo == INSN_MACRO)
1388     {
1389       macro_start ();
1390       if (mips_opts.mips16)
1391         mips16_macro (&insn);
1392       else
1393         macro (&insn);
1394       macro_end ();
1395     }
1396   else
1397     {
1398       if (imm_expr.X_op != O_absent)
1399         append_insn (&insn, &imm_expr, imm_reloc);
1400       else if (offset_expr.X_op != O_absent)
1401         append_insn (&insn, &offset_expr, offset_reloc);
1402       else
1403         append_insn (&insn, NULL, unused_reloc);
1404     }
1405 }
1406
1407 /* Return true if the given relocation might need a matching %lo().
1408    Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1409    applied to local symbols.  */
1410
1411 static inline bfd_boolean
1412 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1413 {
1414   return (reloc == BFD_RELOC_HI16_S
1415           || reloc == BFD_RELOC_MIPS_GOT16);
1416 }
1417
1418 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1419    relocation.  */
1420
1421 static inline bfd_boolean
1422 fixup_has_matching_lo_p (fixS *fixp)
1423 {
1424   return (fixp->fx_next != NULL
1425           && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1426           && fixp->fx_addsy == fixp->fx_next->fx_addsy
1427           && fixp->fx_offset == fixp->fx_next->fx_offset);
1428 }
1429
1430 /* See whether instruction IP reads register REG.  CLASS is the type
1431    of register.  */
1432
1433 static int
1434 insn_uses_reg (struct mips_cl_insn *ip, unsigned int reg,
1435                enum mips_regclass class)
1436 {
1437   if (class == MIPS16_REG)
1438     {
1439       assert (mips_opts.mips16);
1440       reg = mips16_to_32_reg_map[reg];
1441       class = MIPS_GR_REG;
1442     }
1443
1444   /* Don't report on general register ZERO, since it never changes.  */
1445   if (class == MIPS_GR_REG && reg == ZERO)
1446     return 0;
1447
1448   if (class == MIPS_FP_REG)
1449     {
1450       assert (! mips_opts.mips16);
1451       /* If we are called with either $f0 or $f1, we must check $f0.
1452          This is not optimal, because it will introduce an unnecessary
1453          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1454          need to distinguish reading both $f0 and $f1 or just one of
1455          them.  Note that we don't have to check the other way,
1456          because there is no instruction that sets both $f0 and $f1
1457          and requires a delay.  */
1458       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1459           && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1460               == (reg &~ (unsigned) 1)))
1461         return 1;
1462       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1463           && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1464               == (reg &~ (unsigned) 1)))
1465         return 1;
1466     }
1467   else if (! mips_opts.mips16)
1468     {
1469       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1470           && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1471         return 1;
1472       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1473           && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1474         return 1;
1475     }
1476   else
1477     {
1478       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1479           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1480                                     & MIPS16OP_MASK_RX)]
1481               == reg))
1482         return 1;
1483       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1484           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1485                                     & MIPS16OP_MASK_RY)]
1486               == reg))
1487         return 1;
1488       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1489           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1490                                     & MIPS16OP_MASK_MOVE32Z)]
1491               == reg))
1492         return 1;
1493       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1494         return 1;
1495       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1496         return 1;
1497       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1498         return 1;
1499       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1500           && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1501               & MIPS16OP_MASK_REGR32) == reg)
1502         return 1;
1503     }
1504
1505   return 0;
1506 }
1507
1508 /* This function returns true if modifying a register requires a
1509    delay.  */
1510
1511 static int
1512 reg_needs_delay (unsigned int reg)
1513 {
1514   unsigned long prev_pinfo;
1515
1516   prev_pinfo = prev_insn.insn_mo->pinfo;
1517   if (! mips_opts.noreorder
1518       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1519            && ! gpr_interlocks)
1520           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1521               && ! cop_interlocks)))
1522     {
1523       /* A load from a coprocessor or from memory.  All load delays
1524          delay the use of general register rt for one instruction.  */
1525       /* Itbl support may require additional care here.  */
1526       know (prev_pinfo & INSN_WRITE_GPR_T);
1527       if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1528         return 1;
1529     }
1530
1531   return 0;
1532 }
1533
1534 /* Mark instruction labels in mips16 mode.  This permits the linker to
1535    handle them specially, such as generating jalx instructions when
1536    needed.  We also make them odd for the duration of the assembly, in
1537    order to generate the right sort of code.  We will make them even
1538    in the adjust_symtab routine, while leaving them marked.  This is
1539    convenient for the debugger and the disassembler.  The linker knows
1540    to make them odd again.  */
1541
1542 static void
1543 mips16_mark_labels (void)
1544 {
1545   if (mips_opts.mips16)
1546     {
1547       struct insn_label_list *l;
1548       valueT val;
1549
1550       for (l = insn_labels; l != NULL; l = l->next)
1551         {
1552 #ifdef OBJ_ELF
1553           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1554             S_SET_OTHER (l->label, STO_MIPS16);
1555 #endif
1556           val = S_GET_VALUE (l->label);
1557           if ((val & 1) == 0)
1558             S_SET_VALUE (l->label, val + 1);
1559         }
1560     }
1561 }
1562
1563 /* End the current frag.  Make it a variant frag and record the
1564    relaxation info.  */
1565
1566 static void
1567 relax_close_frag (void)
1568 {
1569   mips_macro_warning.first_frag = frag_now;
1570   frag_var (rs_machine_dependent, 0, 0,
1571             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
1572             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
1573
1574   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
1575   mips_relax.first_fixup = 0;
1576 }
1577
1578 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
1579    See the comment above RELAX_ENCODE for more details.  */
1580
1581 static void
1582 relax_start (symbolS *symbol)
1583 {
1584   assert (mips_relax.sequence == 0);
1585   mips_relax.sequence = 1;
1586   mips_relax.symbol = symbol;
1587 }
1588
1589 /* Start generating the second version of a relaxable sequence.
1590    See the comment above RELAX_ENCODE for more details.  */
1591
1592 static void
1593 relax_switch (void)
1594 {
1595   assert (mips_relax.sequence == 1);
1596   mips_relax.sequence = 2;
1597 }
1598
1599 /* End the current relaxable sequence.  */
1600
1601 static void
1602 relax_end (void)
1603 {
1604   assert (mips_relax.sequence == 2);
1605   relax_close_frag ();
1606   mips_relax.sequence = 0;
1607 }
1608
1609 /* Output an instruction.  IP is the instruction information.
1610    ADDRESS_EXPR is an operand of the instruction to be used with
1611    RELOC_TYPE.  */
1612
1613 static void
1614 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
1615              bfd_reloc_code_real_type *reloc_type)
1616 {
1617   register unsigned long prev_pinfo, pinfo;
1618   char *f;
1619   fixS *fixp[3];
1620   int nops = 0;
1621   relax_stateT prev_insn_frag_type = 0;
1622   bfd_boolean relaxed_branch = FALSE;
1623   bfd_boolean force_new_frag = FALSE;
1624
1625   /* Mark instruction labels in mips16 mode.  */
1626   mips16_mark_labels ();
1627
1628   prev_pinfo = prev_insn.insn_mo->pinfo;
1629   pinfo = ip->insn_mo->pinfo;
1630
1631   if (mips_relax.sequence != 2
1632       && (!mips_opts.noreorder || prev_nop_frag != NULL))
1633     {
1634       int prev_prev_nop;
1635
1636       /* If the previous insn required any delay slots, see if we need
1637          to insert a NOP or two.  There are eight kinds of possible
1638          hazards, of which an instruction can have at most one type.
1639          (1) a load from memory delay
1640          (2) a load from a coprocessor delay
1641          (3) an unconditional branch delay
1642          (4) a conditional branch delay
1643          (5) a move to coprocessor register delay
1644          (6) a load coprocessor register from memory delay
1645          (7) a coprocessor condition code delay
1646          (8) a HI/LO special register delay
1647
1648          There are a lot of optimizations we could do that we don't.
1649          In particular, we do not, in general, reorder instructions.
1650          If you use gcc with optimization, it will reorder
1651          instructions and generally do much more optimization then we
1652          do here; repeating all that work in the assembler would only
1653          benefit hand written assembly code, and does not seem worth
1654          it.  */
1655
1656       /* This is how a NOP is emitted.  */
1657 #define emit_nop()                                      \
1658   (mips_opts.mips16                                     \
1659    ? md_number_to_chars (frag_more (2), 0x6500, 2)      \
1660    : md_number_to_chars (frag_more (4), 0, 4))
1661
1662       /* The previous insn might require a delay slot, depending upon
1663          the contents of the current insn.  */
1664       if (! mips_opts.mips16
1665           && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1666                && ! gpr_interlocks)
1667               || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1668                   && ! cop_interlocks)))
1669         {
1670           /* A load from a coprocessor or from memory.  All load
1671              delays delay the use of general register rt for one
1672              instruction.  */
1673           /* Itbl support may require additional care here.  */
1674           know (prev_pinfo & INSN_WRITE_GPR_T);
1675           if (mips_optimize == 0
1676               || insn_uses_reg (ip,
1677                                 ((prev_insn.insn_opcode >> OP_SH_RT)
1678                                  & OP_MASK_RT),
1679                                 MIPS_GR_REG))
1680             ++nops;
1681         }
1682       else if (! mips_opts.mips16
1683                && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1684                     && ! cop_interlocks)
1685                    || ((prev_pinfo & INSN_COPROC_MEMORY_DELAY)
1686                        && ! cop_mem_interlocks)))
1687         {
1688           /* A generic coprocessor delay.  The previous instruction
1689              modified a coprocessor general or control register.  If
1690              it modified a control register, we need to avoid any
1691              coprocessor instruction (this is probably not always
1692              required, but it sometimes is).  If it modified a general
1693              register, we avoid using that register.
1694
1695              This case is not handled very well.  There is no special
1696              knowledge of CP0 handling, and the coprocessors other
1697              than the floating point unit are not distinguished at
1698              all.  */
1699           /* Itbl support may require additional care here. FIXME!
1700              Need to modify this to include knowledge about
1701              user specified delays!  */
1702           if (prev_pinfo & INSN_WRITE_FPR_T)
1703             {
1704               if (mips_optimize == 0
1705                   || insn_uses_reg (ip,
1706                                     ((prev_insn.insn_opcode >> OP_SH_FT)
1707                                      & OP_MASK_FT),
1708                                     MIPS_FP_REG))
1709                 ++nops;
1710             }
1711           else if (prev_pinfo & INSN_WRITE_FPR_S)
1712             {
1713               if (mips_optimize == 0
1714                   || insn_uses_reg (ip,
1715                                     ((prev_insn.insn_opcode >> OP_SH_FS)
1716                                      & OP_MASK_FS),
1717                                     MIPS_FP_REG))
1718                 ++nops;
1719             }
1720           else
1721             {
1722               /* We don't know exactly what the previous instruction
1723                  does.  If the current instruction uses a coprocessor
1724                  register, we must insert a NOP.  If previous
1725                  instruction may set the condition codes, and the
1726                  current instruction uses them, we must insert two
1727                  NOPS.  */
1728               /* Itbl support may require additional care here.  */
1729               if (mips_optimize == 0
1730                   || ((prev_pinfo & INSN_WRITE_COND_CODE)
1731                       && (pinfo & INSN_READ_COND_CODE)))
1732                 nops += 2;
1733               else if (pinfo & INSN_COP)
1734                 ++nops;
1735             }
1736         }
1737       else if (! mips_opts.mips16
1738                && (prev_pinfo & INSN_WRITE_COND_CODE)
1739                && ! cop_interlocks)
1740         {
1741           /* The previous instruction sets the coprocessor condition
1742              codes, but does not require a general coprocessor delay
1743              (this means it is a floating point comparison
1744              instruction).  If this instruction uses the condition
1745              codes, we need to insert a single NOP.  */
1746           /* Itbl support may require additional care here.  */
1747           if (mips_optimize == 0
1748               || (pinfo & INSN_READ_COND_CODE))
1749             ++nops;
1750         }
1751
1752       /* If we're fixing up mfhi/mflo for the r7000 and the
1753          previous insn was an mfhi/mflo and the current insn
1754          reads the register that the mfhi/mflo wrote to, then
1755          insert two nops.  */
1756
1757       else if (mips_7000_hilo_fix
1758                && MF_HILO_INSN (prev_pinfo)
1759                && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1760                                       & OP_MASK_RD),
1761                                  MIPS_GR_REG))
1762         {
1763           nops += 2;
1764         }
1765
1766       /* If we're fixing up mfhi/mflo for the r7000 and the
1767          2nd previous insn was an mfhi/mflo and the current insn
1768          reads the register that the mfhi/mflo wrote to, then
1769          insert one nop.  */
1770
1771       else if (mips_7000_hilo_fix
1772                && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1773                && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1774                                        & OP_MASK_RD),
1775                                     MIPS_GR_REG))
1776
1777         {
1778           ++nops;
1779         }
1780
1781       else if (prev_pinfo & INSN_READ_LO)
1782         {
1783           /* The previous instruction reads the LO register; if the
1784              current instruction writes to the LO register, we must
1785              insert two NOPS.  Some newer processors have interlocks.
1786              Also the tx39's multiply instructions can be executed
1787              immediately after a read from HI/LO (without the delay),
1788              though the tx39's divide insns still do require the
1789              delay.  */
1790           if (! (hilo_interlocks
1791                  || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1792               && (mips_optimize == 0
1793                   || (pinfo & INSN_WRITE_LO)))
1794             nops += 2;
1795           /* Most mips16 branch insns don't have a delay slot.
1796              If a read from LO is immediately followed by a branch
1797              to a write to LO we have a read followed by a write
1798              less than 2 insns away.  We assume the target of
1799              a branch might be a write to LO, and insert a nop
1800              between a read and an immediately following branch.  */
1801           else if (mips_opts.mips16
1802                    && (mips_optimize == 0
1803                        || (pinfo & MIPS16_INSN_BRANCH)))
1804             ++nops;
1805         }
1806       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1807         {
1808           /* The previous instruction reads the HI register; if the
1809              current instruction writes to the HI register, we must
1810              insert a NOP.  Some newer processors have interlocks.
1811              Also the note tx39's multiply above.  */
1812           if (! (hilo_interlocks
1813                  || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1814               && (mips_optimize == 0
1815                   || (pinfo & INSN_WRITE_HI)))
1816             nops += 2;
1817           /* Most mips16 branch insns don't have a delay slot.
1818              If a read from HI is immediately followed by a branch
1819              to a write to HI we have a read followed by a write
1820              less than 2 insns away.  We assume the target of
1821              a branch might be a write to HI, and insert a nop
1822              between a read and an immediately following branch.  */
1823           else if (mips_opts.mips16
1824                    && (mips_optimize == 0
1825                        || (pinfo & MIPS16_INSN_BRANCH)))
1826             ++nops;
1827         }
1828
1829       /* If the previous instruction was in a noreorder section, then
1830          we don't want to insert the nop after all.  */
1831       /* Itbl support may require additional care here.  */
1832       if (prev_insn_unreordered)
1833         nops = 0;
1834
1835       /* There are two cases which require two intervening
1836          instructions: 1) setting the condition codes using a move to
1837          coprocessor instruction which requires a general coprocessor
1838          delay and then reading the condition codes 2) reading the HI
1839          or LO register and then writing to it (except on processors
1840          which have interlocks).  If we are not already emitting a NOP
1841          instruction, we must check for these cases compared to the
1842          instruction previous to the previous instruction.  */
1843       if ((! mips_opts.mips16
1844            && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1845            && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1846            && (pinfo & INSN_READ_COND_CODE)
1847            && ! cop_interlocks)
1848           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1849               && (pinfo & INSN_WRITE_LO)
1850               && ! (hilo_interlocks
1851                     || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT))))
1852           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1853               && (pinfo & INSN_WRITE_HI)
1854               && ! (hilo_interlocks
1855                     || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))))
1856         prev_prev_nop = 1;
1857       else
1858         prev_prev_nop = 0;
1859
1860       if (prev_prev_insn_unreordered)
1861         prev_prev_nop = 0;
1862
1863       if (prev_prev_nop && nops == 0)
1864         ++nops;
1865
1866       if (mips_fix_vr4120 && prev_insn.insn_mo->name)
1867         {
1868           /* We're out of bits in pinfo, so we must resort to string
1869              ops here.  Shortcuts are selected based on opcodes being
1870              limited to the VR4120 instruction set.  */
1871           int min_nops = 0;
1872           const char *pn = prev_insn.insn_mo->name;
1873           const char *tn = ip->insn_mo->name;
1874           if (strncmp(pn, "macc", 4) == 0
1875               || strncmp(pn, "dmacc", 5) == 0)
1876             {
1877               /* Errata 21 - [D]DIV[U] after [D]MACC */
1878               if (strstr (tn, "div"))
1879                 {
1880                   min_nops = 1;
1881                 }
1882
1883               /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1884               if (pn[0] == 'd' /* dmacc */
1885                   && (strncmp(tn, "dmult", 5) == 0
1886                       || strncmp(tn, "dmacc", 5) == 0))
1887                 {
1888                   min_nops = 1;
1889                 }
1890
1891               /* Errata 24 - MT{LO,HI} after [D]MACC */
1892               if (strcmp (tn, "mtlo") == 0
1893                   || strcmp (tn, "mthi") == 0)
1894                 {
1895                   min_nops = 1;
1896                 }
1897
1898             }
1899           else if (strncmp(pn, "dmult", 5) == 0
1900                    && (strncmp(tn, "dmult", 5) == 0
1901                        || strncmp(tn, "dmacc", 5) == 0))
1902             {
1903               /* Here is the rest of errata 23.  */
1904               min_nops = 1;
1905             }
1906           if (nops < min_nops)
1907             nops = min_nops;
1908         }
1909
1910       /* If we are being given a nop instruction, don't bother with
1911          one of the nops we would otherwise output.  This will only
1912          happen when a nop instruction is used with mips_optimize set
1913          to 0.  */
1914       if (nops > 0
1915           && ! mips_opts.noreorder
1916           && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1917         --nops;
1918
1919       /* Now emit the right number of NOP instructions.  */
1920       if (nops > 0 && ! mips_opts.noreorder)
1921         {
1922           fragS *old_frag;
1923           unsigned long old_frag_offset;
1924           int i;
1925           struct insn_label_list *l;
1926
1927           old_frag = frag_now;
1928           old_frag_offset = frag_now_fix ();
1929
1930           for (i = 0; i < nops; i++)
1931             emit_nop ();
1932
1933           if (listing)
1934             {
1935               listing_prev_line ();
1936               /* We may be at the start of a variant frag.  In case we
1937                  are, make sure there is enough space for the frag
1938                  after the frags created by listing_prev_line.  The
1939                  argument to frag_grow here must be at least as large
1940                  as the argument to all other calls to frag_grow in
1941                  this file.  We don't have to worry about being in the
1942                  middle of a variant frag, because the variants insert
1943                  all needed nop instructions themselves.  */
1944               frag_grow (40);
1945             }
1946
1947           for (l = insn_labels; l != NULL; l = l->next)
1948             {
1949               valueT val;
1950
1951               assert (S_GET_SEGMENT (l->label) == now_seg);
1952               symbol_set_frag (l->label, frag_now);
1953               val = (valueT) frag_now_fix ();
1954               /* mips16 text labels are stored as odd.  */
1955               if (mips_opts.mips16)
1956                 ++val;
1957               S_SET_VALUE (l->label, val);
1958             }
1959
1960 #ifndef NO_ECOFF_DEBUGGING
1961           if (ECOFF_DEBUGGING)
1962             ecoff_fix_loc (old_frag, old_frag_offset);
1963 #endif
1964         }
1965       else if (prev_nop_frag != NULL)
1966         {
1967           /* We have a frag holding nops we may be able to remove.  If
1968              we don't need any nops, we can decrease the size of
1969              prev_nop_frag by the size of one instruction.  If we do
1970              need some nops, we count them in prev_nops_required.  */
1971           if (prev_nop_frag_since == 0)
1972             {
1973               if (nops == 0)
1974                 {
1975                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1976                   --prev_nop_frag_holds;
1977                 }
1978               else
1979                 prev_nop_frag_required += nops;
1980             }
1981           else
1982             {
1983               if (prev_prev_nop == 0)
1984                 {
1985                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1986                   --prev_nop_frag_holds;
1987                 }
1988               else
1989                 ++prev_nop_frag_required;
1990             }
1991
1992           if (prev_nop_frag_holds <= prev_nop_frag_required)
1993             prev_nop_frag = NULL;
1994
1995           ++prev_nop_frag_since;
1996
1997           /* Sanity check: by the time we reach the second instruction
1998              after prev_nop_frag, we should have used up all the nops
1999              one way or another.  */
2000           assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2001         }
2002     }
2003
2004   /* Record the frag type before frag_var.  */
2005   if (prev_insn_frag)
2006     prev_insn_frag_type = prev_insn_frag->fr_type;
2007
2008   if (address_expr
2009       && *reloc_type == BFD_RELOC_16_PCREL_S2
2010       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2011           || pinfo & INSN_COND_BRANCH_LIKELY)
2012       && mips_relax_branch
2013       /* Don't try branch relaxation within .set nomacro, or within
2014          .set noat if we use $at for PIC computations.  If it turns
2015          out that the branch was out-of-range, we'll get an error.  */
2016       && !mips_opts.warn_about_macros
2017       && !(mips_opts.noat && mips_pic != NO_PIC)
2018       && !mips_opts.mips16)
2019     {
2020       relaxed_branch = TRUE;
2021       f = frag_var (rs_machine_dependent,
2022                     relaxed_branch_length
2023                     (NULL, NULL,
2024                      (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2025                      : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2026                     RELAX_BRANCH_ENCODE
2027                     (pinfo & INSN_UNCOND_BRANCH_DELAY,
2028                      pinfo & INSN_COND_BRANCH_LIKELY,
2029                      pinfo & INSN_WRITE_GPR_31,
2030                      0),
2031                     address_expr->X_add_symbol,
2032                     address_expr->X_add_number,
2033                     0);
2034       *reloc_type = BFD_RELOC_UNUSED;
2035     }
2036   else if (*reloc_type > BFD_RELOC_UNUSED)
2037     {
2038       /* We need to set up a variant frag.  */
2039       assert (mips_opts.mips16 && address_expr != NULL);
2040       f = frag_var (rs_machine_dependent, 4, 0,
2041                     RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2042                                          mips16_small, mips16_ext,
2043                                          (prev_pinfo
2044                                           & INSN_UNCOND_BRANCH_DELAY),
2045                                          (*prev_insn_reloc_type
2046                                           == BFD_RELOC_MIPS16_JMP)),
2047                     make_expr_symbol (address_expr), 0, NULL);
2048     }
2049   else if (mips_opts.mips16
2050            && ! ip->use_extend
2051            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2052     {
2053       /* Make sure there is enough room to swap this instruction with
2054          a following jump instruction.  */
2055       frag_grow (6);
2056       f = frag_more (2);
2057     }
2058   else
2059     {
2060       if (mips_opts.mips16
2061           && mips_opts.noreorder
2062           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2063         as_warn (_("extended instruction in delay slot"));
2064
2065       if (mips_relax.sequence)
2066         {
2067           /* If we've reached the end of this frag, turn it into a variant
2068              frag and record the information for the instructions we've
2069              written so far.  */
2070           if (frag_room () < 4)
2071             relax_close_frag ();
2072           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2073         }
2074
2075       if (mips_relax.sequence != 2)
2076         mips_macro_warning.sizes[0] += 4;
2077       if (mips_relax.sequence != 1)
2078         mips_macro_warning.sizes[1] += 4;
2079
2080       f = frag_more (4);
2081     }
2082
2083   fixp[0] = fixp[1] = fixp[2] = NULL;
2084   if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2085     {
2086       if (address_expr->X_op == O_constant)
2087         {
2088           valueT tmp;
2089
2090           switch (*reloc_type)
2091             {
2092             case BFD_RELOC_32:
2093               ip->insn_opcode |= address_expr->X_add_number;
2094               break;
2095
2096             case BFD_RELOC_MIPS_HIGHEST:
2097               tmp = (address_expr->X_add_number
2098                      + ((valueT) 0x8000 << 32) + 0x80008000) >> 16;
2099               tmp >>= 16;
2100               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2101               break;
2102
2103             case BFD_RELOC_MIPS_HIGHER:
2104               tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2105               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2106               break;
2107
2108             case BFD_RELOC_HI16_S:
2109               ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2110                                   >> 16) & 0xffff;
2111               break;
2112
2113             case BFD_RELOC_HI16:
2114               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2115               break;
2116
2117             case BFD_RELOC_LO16:
2118             case BFD_RELOC_MIPS_GOT_DISP:
2119               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2120               break;
2121
2122             case BFD_RELOC_MIPS_JMP:
2123               if ((address_expr->X_add_number & 3) != 0)
2124                 as_bad (_("jump to misaligned address (0x%lx)"),
2125                         (unsigned long) address_expr->X_add_number);
2126               if (address_expr->X_add_number & ~0xfffffff)
2127                 as_bad (_("jump address range overflow (0x%lx)"),
2128                         (unsigned long) address_expr->X_add_number);
2129               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2130               break;
2131
2132             case BFD_RELOC_MIPS16_JMP:
2133               if ((address_expr->X_add_number & 3) != 0)
2134                 as_bad (_("jump to misaligned address (0x%lx)"),
2135                         (unsigned long) address_expr->X_add_number);
2136               if (address_expr->X_add_number & ~0xfffffff)
2137                 as_bad (_("jump address range overflow (0x%lx)"),
2138                         (unsigned long) address_expr->X_add_number);
2139               ip->insn_opcode |=
2140                 (((address_expr->X_add_number & 0x7c0000) << 3)
2141                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2142                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2143               break;
2144
2145             case BFD_RELOC_16_PCREL_S2:
2146               goto need_reloc;
2147
2148             default:
2149               internalError ();
2150             }
2151         }
2152       else
2153         need_reloc:
2154         {
2155           reloc_howto_type *howto;
2156           int i;
2157
2158           /* In a compound relocation, it is the final (outermost)
2159              operator that determines the relocated field.  */
2160           for (i = 1; i < 3; i++)
2161             if (reloc_type[i] == BFD_RELOC_UNUSED)
2162               break;
2163
2164           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2165           fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2166                                  bfd_get_reloc_size(howto),
2167                                  address_expr,
2168                                  reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2169                                  reloc_type[0]);
2170
2171           /* These relocations can have an addend that won't fit in
2172              4 octets for 64bit assembly.  */
2173           if (HAVE_64BIT_GPRS
2174               && ! howto->partial_inplace
2175               && (reloc_type[0] == BFD_RELOC_16
2176                   || reloc_type[0] == BFD_RELOC_32
2177                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2178                   || reloc_type[0] == BFD_RELOC_HI16_S
2179                   || reloc_type[0] == BFD_RELOC_LO16
2180                   || reloc_type[0] == BFD_RELOC_GPREL16
2181                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2182                   || reloc_type[0] == BFD_RELOC_GPREL32
2183                   || reloc_type[0] == BFD_RELOC_64
2184                   || reloc_type[0] == BFD_RELOC_CTOR
2185                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2186                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2187                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2188                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2189                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2190                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT))
2191             fixp[0]->fx_no_overflow = 1;
2192
2193           if (mips_relax.sequence)
2194             {
2195               if (mips_relax.first_fixup == 0)
2196                 mips_relax.first_fixup = fixp[0];
2197             }
2198           else if (reloc_needs_lo_p (*reloc_type))
2199             {
2200               struct mips_hi_fixup *hi_fixup;
2201
2202               /* Reuse the last entry if it already has a matching %lo.  */
2203               hi_fixup = mips_hi_fixup_list;
2204               if (hi_fixup == 0
2205                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2206                 {
2207                   hi_fixup = ((struct mips_hi_fixup *)
2208                               xmalloc (sizeof (struct mips_hi_fixup)));
2209                   hi_fixup->next = mips_hi_fixup_list;
2210                   mips_hi_fixup_list = hi_fixup;
2211                 }
2212               hi_fixup->fixp = fixp[0];
2213               hi_fixup->seg = now_seg;
2214             }
2215
2216           /* Add fixups for the second and third relocations, if given.
2217              Note that the ABI allows the second relocation to be
2218              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2219              moment we only use RSS_UNDEF, but we could add support
2220              for the others if it ever becomes necessary.  */
2221           for (i = 1; i < 3; i++)
2222             if (reloc_type[i] != BFD_RELOC_UNUSED)
2223               {
2224                 address_expr->X_op = O_absent;
2225                 address_expr->X_add_symbol = 0;
2226                 address_expr->X_add_number = 0;
2227
2228                 fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
2229                                        fixp[0]->fx_size, address_expr,
2230                                        FALSE, reloc_type[i]);
2231               }
2232         }
2233     }
2234
2235   if (! mips_opts.mips16)
2236     {
2237       md_number_to_chars (f, ip->insn_opcode, 4);
2238 #ifdef OBJ_ELF
2239       dwarf2_emit_insn (4);
2240 #endif
2241     }
2242   else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2243     {
2244       md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2245       md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2246 #ifdef OBJ_ELF
2247       dwarf2_emit_insn (4);
2248 #endif
2249     }
2250   else
2251     {
2252       if (ip->use_extend)
2253         {
2254           md_number_to_chars (f, 0xf000 | ip->extend, 2);
2255           f += 2;
2256         }
2257       md_number_to_chars (f, ip->insn_opcode, 2);
2258 #ifdef OBJ_ELF
2259       dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2260 #endif
2261     }
2262
2263   /* Update the register mask information.  */
2264   if (! mips_opts.mips16)
2265     {
2266       if (pinfo & INSN_WRITE_GPR_D)
2267         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2268       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2269         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2270       if (pinfo & INSN_READ_GPR_S)
2271         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2272       if (pinfo & INSN_WRITE_GPR_31)
2273         mips_gprmask |= 1 << RA;
2274       if (pinfo & INSN_WRITE_FPR_D)
2275         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2276       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2277         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2278       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2279         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2280       if ((pinfo & INSN_READ_FPR_R) != 0)
2281         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2282       if (pinfo & INSN_COP)
2283         {
2284           /* We don't keep enough information to sort these cases out.
2285              The itbl support does keep this information however, although
2286              we currently don't support itbl fprmats as part of the cop
2287              instruction.  May want to add this support in the future.  */
2288         }
2289       /* Never set the bit for $0, which is always zero.  */
2290       mips_gprmask &= ~1 << 0;
2291     }
2292   else
2293     {
2294       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2295         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2296                               & MIPS16OP_MASK_RX);
2297       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2298         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2299                               & MIPS16OP_MASK_RY);
2300       if (pinfo & MIPS16_INSN_WRITE_Z)
2301         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2302                               & MIPS16OP_MASK_RZ);
2303       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2304         mips_gprmask |= 1 << TREG;
2305       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2306         mips_gprmask |= 1 << SP;
2307       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2308         mips_gprmask |= 1 << RA;
2309       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2310         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2311       if (pinfo & MIPS16_INSN_READ_Z)
2312         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2313                               & MIPS16OP_MASK_MOVE32Z);
2314       if (pinfo & MIPS16_INSN_READ_GPR_X)
2315         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2316                               & MIPS16OP_MASK_REGR32);
2317     }
2318
2319   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2320     {
2321       /* Filling the branch delay slot is more complex.  We try to
2322          switch the branch with the previous instruction, which we can
2323          do if the previous instruction does not set up a condition
2324          that the branch tests and if the branch is not itself the
2325          target of any branch.  */
2326       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2327           || (pinfo & INSN_COND_BRANCH_DELAY))
2328         {
2329           if (mips_optimize < 2
2330               /* If we have seen .set volatile or .set nomove, don't
2331                  optimize.  */
2332               || mips_opts.nomove != 0
2333               /* If we had to emit any NOP instructions, then we
2334                  already know we can not swap.  */
2335               || nops != 0
2336               /* If we don't even know the previous insn, we can not
2337                  swap.  */
2338               || ! prev_insn_valid
2339               /* If the previous insn is already in a branch delay
2340                  slot, then we can not swap.  */
2341               || prev_insn_is_delay_slot
2342               /* If the previous previous insn was in a .set
2343                  noreorder, we can't swap.  Actually, the MIPS
2344                  assembler will swap in this situation.  However, gcc
2345                  configured -with-gnu-as will generate code like
2346                    .set noreorder
2347                    lw   $4,XXX
2348                    .set reorder
2349                    INSN
2350                    bne  $4,$0,foo
2351                  in which we can not swap the bne and INSN.  If gcc is
2352                  not configured -with-gnu-as, it does not output the
2353                  .set pseudo-ops.  We don't have to check
2354                  prev_insn_unreordered, because prev_insn_valid will
2355                  be 0 in that case.  We don't want to use
2356                  prev_prev_insn_valid, because we do want to be able
2357                  to swap at the start of a function.  */
2358               || prev_prev_insn_unreordered
2359               /* If the branch is itself the target of a branch, we
2360                  can not swap.  We cheat on this; all we check for is
2361                  whether there is a label on this instruction.  If
2362                  there are any branches to anything other than a
2363                  label, users must use .set noreorder.  */
2364               || insn_labels != NULL
2365               /* If the previous instruction is in a variant frag
2366                  other than this branch's one, we cannot do the swap.
2367                  This does not apply to the mips16, which uses variant
2368                  frags for different purposes.  */
2369               || (! mips_opts.mips16
2370                   && prev_insn_frag_type == rs_machine_dependent)
2371               /* If the branch reads the condition codes, we don't
2372                  even try to swap, because in the sequence
2373                    ctc1 $X,$31
2374                    INSN
2375                    INSN
2376                    bc1t LABEL
2377                  we can not swap, and I don't feel like handling that
2378                  case.  */
2379               || (! mips_opts.mips16
2380                   && (pinfo & INSN_READ_COND_CODE)
2381                   && ! cop_interlocks)
2382               /* We can not swap with an instruction that requires a
2383                  delay slot, because the target of the branch might
2384                  interfere with that instruction.  */
2385               || (! mips_opts.mips16
2386                   && (prev_pinfo
2387               /* Itbl support may require additional care here.  */
2388                       & (INSN_LOAD_COPROC_DELAY
2389                          | INSN_COPROC_MOVE_DELAY
2390                          | INSN_WRITE_COND_CODE))
2391                   && ! cop_interlocks)
2392               || (! (hilo_interlocks
2393                      || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
2394                   && (prev_pinfo
2395                       & (INSN_READ_LO
2396                          | INSN_READ_HI)))
2397               || (! mips_opts.mips16
2398                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2399                   && ! gpr_interlocks)
2400               || (! mips_opts.mips16
2401                   /* Itbl support may require additional care here.  */
2402                   && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)
2403                   && ! cop_mem_interlocks)
2404               /* We can not swap with a branch instruction.  */
2405               || (prev_pinfo
2406                   & (INSN_UNCOND_BRANCH_DELAY
2407                      | INSN_COND_BRANCH_DELAY
2408                      | INSN_COND_BRANCH_LIKELY))
2409               /* We do not swap with a trap instruction, since it
2410                  complicates trap handlers to have the trap
2411                  instruction be in a delay slot.  */
2412               || (prev_pinfo & INSN_TRAP)
2413               /* If the branch reads a register that the previous
2414                  instruction sets, we can not swap.  */
2415               || (! mips_opts.mips16
2416                   && (prev_pinfo & INSN_WRITE_GPR_T)
2417                   && insn_uses_reg (ip,
2418                                     ((prev_insn.insn_opcode >> OP_SH_RT)
2419                                      & OP_MASK_RT),
2420                                     MIPS_GR_REG))
2421               || (! mips_opts.mips16
2422                   && (prev_pinfo & INSN_WRITE_GPR_D)
2423                   && insn_uses_reg (ip,
2424                                     ((prev_insn.insn_opcode >> OP_SH_RD)
2425                                      & OP_MASK_RD),
2426                                     MIPS_GR_REG))
2427               || (mips_opts.mips16
2428                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2429                        && insn_uses_reg (ip,
2430                                          ((prev_insn.insn_opcode
2431                                            >> MIPS16OP_SH_RX)
2432                                           & MIPS16OP_MASK_RX),
2433                                          MIPS16_REG))
2434                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2435                           && insn_uses_reg (ip,
2436                                             ((prev_insn.insn_opcode
2437                                               >> MIPS16OP_SH_RY)
2438                                              & MIPS16OP_MASK_RY),
2439                                             MIPS16_REG))
2440                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2441                           && insn_uses_reg (ip,
2442                                             ((prev_insn.insn_opcode
2443                                               >> MIPS16OP_SH_RZ)
2444                                              & MIPS16OP_MASK_RZ),
2445                                             MIPS16_REG))
2446                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2447                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2448                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2449                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2450                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2451                           && insn_uses_reg (ip,
2452                                             MIPS16OP_EXTRACT_REG32R (prev_insn.
2453                                                                      insn_opcode),
2454                                             MIPS_GR_REG))))
2455               /* If the branch writes a register that the previous
2456                  instruction sets, we can not swap (we know that
2457                  branches write only to RD or to $31).  */
2458               || (! mips_opts.mips16
2459                   && (prev_pinfo & INSN_WRITE_GPR_T)
2460                   && (((pinfo & INSN_WRITE_GPR_D)
2461                        && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2462                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2463                       || ((pinfo & INSN_WRITE_GPR_31)
2464                           && (((prev_insn.insn_opcode >> OP_SH_RT)
2465                                & OP_MASK_RT)
2466                               == RA))))
2467               || (! mips_opts.mips16
2468                   && (prev_pinfo & INSN_WRITE_GPR_D)
2469                   && (((pinfo & INSN_WRITE_GPR_D)
2470                        && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2471                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2472                       || ((pinfo & INSN_WRITE_GPR_31)
2473                           && (((prev_insn.insn_opcode >> OP_SH_RD)
2474                                & OP_MASK_RD)
2475                               == RA))))
2476               || (mips_opts.mips16
2477                   && (pinfo & MIPS16_INSN_WRITE_31)
2478                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2479                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2480                           && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2481                               == RA))))
2482               /* If the branch writes a register that the previous
2483                  instruction reads, we can not swap (we know that
2484                  branches only write to RD or to $31).  */
2485               || (! mips_opts.mips16
2486                   && (pinfo & INSN_WRITE_GPR_D)
2487                   && insn_uses_reg (&prev_insn,
2488                                     ((ip->insn_opcode >> OP_SH_RD)
2489                                      & OP_MASK_RD),
2490                                     MIPS_GR_REG))
2491               || (! mips_opts.mips16
2492                   && (pinfo & INSN_WRITE_GPR_31)
2493                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2494               || (mips_opts.mips16
2495                   && (pinfo & MIPS16_INSN_WRITE_31)
2496                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2497               /* If we are generating embedded PIC code, the branch
2498                  might be expanded into a sequence which uses $at, so
2499                  we can't swap with an instruction which reads it.  */
2500               || (mips_pic == EMBEDDED_PIC
2501                   && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2502               /* If the previous previous instruction has a load
2503                  delay, and sets a register that the branch reads, we
2504                  can not swap.  */
2505               || (! mips_opts.mips16
2506               /* Itbl support may require additional care here.  */
2507                   && (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2508                        && ! cop_interlocks)
2509                       || ((prev_prev_insn.insn_mo->pinfo
2510                            & INSN_LOAD_MEMORY_DELAY)
2511                           && ! gpr_interlocks))
2512                   && insn_uses_reg (ip,
2513                                     ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2514                                      & OP_MASK_RT),
2515                                     MIPS_GR_REG))
2516               /* If one instruction sets a condition code and the
2517                  other one uses a condition code, we can not swap.  */
2518               || ((pinfo & INSN_READ_COND_CODE)
2519                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2520               || ((pinfo & INSN_WRITE_COND_CODE)
2521                   && (prev_pinfo & INSN_READ_COND_CODE))
2522               /* If the previous instruction uses the PC, we can not
2523                  swap.  */
2524               || (mips_opts.mips16
2525                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2526               /* If the previous instruction was extended, we can not
2527                  swap.  */
2528               || (mips_opts.mips16 && prev_insn_extended)
2529               /* If the previous instruction had a fixup in mips16
2530                  mode, we can not swap.  This normally means that the
2531                  previous instruction was a 4 byte branch anyhow.  */
2532               || (mips_opts.mips16 && prev_insn_fixp[0])
2533               /* If the previous instruction is a sync, sync.l, or
2534                  sync.p, we can not swap.  */
2535               || (prev_pinfo & INSN_SYNC))
2536             {
2537               /* We could do even better for unconditional branches to
2538                  portions of this object file; we could pick up the
2539                  instruction at the destination, put it in the delay
2540                  slot, and bump the destination address.  */
2541               emit_nop ();
2542               /* Update the previous insn information.  */
2543               prev_prev_insn = *ip;
2544               prev_insn.insn_mo = &dummy_opcode;
2545             }
2546           else
2547             {
2548               /* It looks like we can actually do the swap.  */
2549               if (! mips_opts.mips16)
2550                 {
2551                   char *prev_f;
2552                   char temp[4];
2553
2554                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2555                   if (!relaxed_branch)
2556                     {
2557                       /* If this is not a relaxed branch, then just
2558                          swap the instructions.  */
2559                       memcpy (temp, prev_f, 4);
2560                       memcpy (prev_f, f, 4);
2561                       memcpy (f, temp, 4);
2562                     }
2563                   else
2564                     {
2565                       /* If this is a relaxed branch, then we move the
2566                          instruction to be placed in the delay slot to
2567                          the current frag, shrinking the fixed part of
2568                          the originating frag.  If the branch occupies
2569                          the tail of the latter, we move it backwards,
2570                          into the space freed by the moved instruction.  */
2571                       f = frag_more (4);
2572                       memcpy (f, prev_f, 4);
2573                       prev_insn_frag->fr_fix -= 4;
2574                       if (prev_insn_frag->fr_type == rs_machine_dependent)
2575                         memmove (prev_f, prev_f + 4, prev_insn_frag->fr_var);
2576                     }
2577
2578                   if (prev_insn_fixp[0])
2579                     {
2580                       prev_insn_fixp[0]->fx_frag = frag_now;
2581                       prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2582                     }
2583                   if (prev_insn_fixp[1])
2584                     {
2585                       prev_insn_fixp[1]->fx_frag = frag_now;
2586                       prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2587                     }
2588                   if (prev_insn_fixp[2])
2589                     {
2590                       prev_insn_fixp[2]->fx_frag = frag_now;
2591                       prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2592                     }
2593                   if (prev_insn_fixp[0] && HAVE_NEWABI
2594                       && prev_insn_frag != frag_now
2595                       && (prev_insn_fixp[0]->fx_r_type
2596                           == BFD_RELOC_MIPS_GOT_DISP
2597                           || (prev_insn_fixp[0]->fx_r_type
2598                               == BFD_RELOC_MIPS_CALL16)))
2599                     {
2600                       /* To avoid confusion in tc_gen_reloc, we must
2601                          ensure that this does not become a variant
2602                          frag.  */
2603                       force_new_frag = TRUE;
2604                     }
2605
2606                   if (!relaxed_branch)
2607                     {
2608                       if (fixp[0])
2609                         {
2610                           fixp[0]->fx_frag = prev_insn_frag;
2611                           fixp[0]->fx_where = prev_insn_where;
2612                         }
2613                       if (fixp[1])
2614                         {
2615                           fixp[1]->fx_frag = prev_insn_frag;
2616                           fixp[1]->fx_where = prev_insn_where;
2617                         }
2618                       if (fixp[2])
2619                         {
2620                           fixp[2]->fx_frag = prev_insn_frag;
2621                           fixp[2]->fx_where = prev_insn_where;
2622                         }
2623                     }
2624                   else if (prev_insn_frag->fr_type == rs_machine_dependent)
2625                     {
2626                       if (fixp[0])
2627                         fixp[0]->fx_where -= 4;
2628                       if (fixp[1])
2629                         fixp[1]->fx_where -= 4;
2630                       if (fixp[2])
2631                         fixp[2]->fx_where -= 4;
2632                     }
2633                 }
2634               else
2635                 {
2636                   char *prev_f;
2637                   char temp[2];
2638
2639                   assert (prev_insn_fixp[0] == NULL);
2640                   assert (prev_insn_fixp[1] == NULL);
2641                   assert (prev_insn_fixp[2] == NULL);
2642                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2643                   memcpy (temp, prev_f, 2);
2644                   memcpy (prev_f, f, 2);
2645                   if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2646                     {
2647                       assert (*reloc_type == BFD_RELOC_UNUSED);
2648                       memcpy (f, temp, 2);
2649                     }
2650                   else
2651                     {
2652                       memcpy (f, f + 2, 2);
2653                       memcpy (f + 2, temp, 2);
2654                     }
2655                   if (fixp[0])
2656                     {
2657                       fixp[0]->fx_frag = prev_insn_frag;
2658                       fixp[0]->fx_where = prev_insn_where;
2659                     }
2660                   if (fixp[1])
2661                     {
2662                       fixp[1]->fx_frag = prev_insn_frag;
2663                       fixp[1]->fx_where = prev_insn_where;
2664                     }
2665                   if (fixp[2])
2666                     {
2667                       fixp[2]->fx_frag = prev_insn_frag;
2668                       fixp[2]->fx_where = prev_insn_where;
2669                     }
2670                 }
2671
2672               /* Update the previous insn information; leave prev_insn
2673                  unchanged.  */
2674               prev_prev_insn = *ip;
2675             }
2676           prev_insn_is_delay_slot = 1;
2677
2678           /* If that was an unconditional branch, forget the previous
2679              insn information.  */
2680           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2681             {
2682               prev_prev_insn.insn_mo = &dummy_opcode;
2683               prev_insn.insn_mo = &dummy_opcode;
2684             }
2685
2686           prev_insn_fixp[0] = NULL;
2687           prev_insn_fixp[1] = NULL;
2688           prev_insn_fixp[2] = NULL;
2689           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2690           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2691           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2692           prev_insn_extended = 0;
2693         }
2694       else if (pinfo & INSN_COND_BRANCH_LIKELY)
2695         {
2696           /* We don't yet optimize a branch likely.  What we should do
2697              is look at the target, copy the instruction found there
2698              into the delay slot, and increment the branch to jump to
2699              the next instruction.  */
2700           emit_nop ();
2701           /* Update the previous insn information.  */
2702           prev_prev_insn = *ip;
2703           prev_insn.insn_mo = &dummy_opcode;
2704           prev_insn_fixp[0] = NULL;
2705           prev_insn_fixp[1] = NULL;
2706           prev_insn_fixp[2] = NULL;
2707           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2708           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2709           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2710           prev_insn_extended = 0;
2711         }
2712       else
2713         {
2714           /* Update the previous insn information.  */
2715           if (nops > 0)
2716             prev_prev_insn.insn_mo = &dummy_opcode;
2717           else
2718             prev_prev_insn = prev_insn;
2719           prev_insn = *ip;
2720
2721           /* Any time we see a branch, we always fill the delay slot
2722              immediately; since this insn is not a branch, we know it
2723              is not in a delay slot.  */
2724           prev_insn_is_delay_slot = 0;
2725
2726           prev_insn_fixp[0] = fixp[0];
2727           prev_insn_fixp[1] = fixp[1];
2728           prev_insn_fixp[2] = fixp[2];
2729           prev_insn_reloc_type[0] = reloc_type[0];
2730           prev_insn_reloc_type[1] = reloc_type[1];
2731           prev_insn_reloc_type[2] = reloc_type[2];
2732           if (mips_opts.mips16)
2733             prev_insn_extended = (ip->use_extend
2734                                   || *reloc_type > BFD_RELOC_UNUSED);
2735         }
2736
2737       prev_prev_insn_unreordered = prev_insn_unreordered;
2738       prev_insn_unreordered = 0;
2739       prev_insn_frag = frag_now;
2740       prev_insn_where = f - frag_now->fr_literal;
2741       prev_insn_valid = 1;
2742     }
2743   else if (mips_relax.sequence != 2)
2744     {
2745       /* We need to record a bit of information even when we are not
2746          reordering, in order to determine the base address for mips16
2747          PC relative relocs.  */
2748       prev_prev_insn = prev_insn;
2749       prev_insn = *ip;
2750       prev_insn_reloc_type[0] = reloc_type[0];
2751       prev_insn_reloc_type[1] = reloc_type[1];
2752       prev_insn_reloc_type[2] = reloc_type[2];
2753       prev_prev_insn_unreordered = prev_insn_unreordered;
2754       prev_insn_unreordered = 1;
2755     }
2756
2757   /* We just output an insn, so the next one doesn't have a label.  */
2758   mips_clear_insn_labels ();
2759 }
2760
2761 /* This function forgets that there was any previous instruction or
2762    label.  If PRESERVE is non-zero, it remembers enough information to
2763    know whether nops are needed before a noreorder section.  */
2764
2765 static void
2766 mips_no_prev_insn (int preserve)
2767 {
2768   if (! preserve)
2769     {
2770       prev_insn.insn_mo = &dummy_opcode;
2771       prev_prev_insn.insn_mo = &dummy_opcode;
2772       prev_nop_frag = NULL;
2773       prev_nop_frag_holds = 0;
2774       prev_nop_frag_required = 0;
2775       prev_nop_frag_since = 0;
2776     }
2777   prev_insn_valid = 0;
2778   prev_insn_is_delay_slot = 0;
2779   prev_insn_unreordered = 0;
2780   prev_insn_extended = 0;
2781   prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2782   prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2783   prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2784   prev_prev_insn_unreordered = 0;
2785   mips_clear_insn_labels ();
2786 }
2787
2788 /* This function must be called whenever we turn on noreorder or emit
2789    something other than instructions.  It inserts any NOPS which might
2790    be needed by the previous instruction, and clears the information
2791    kept for the previous instructions.  The INSNS parameter is true if
2792    instructions are to follow.  */
2793
2794 static void
2795 mips_emit_delays (bfd_boolean insns)
2796 {
2797   if (! mips_opts.noreorder)
2798     {
2799       int nops;
2800
2801       nops = 0;
2802       if ((! mips_opts.mips16
2803            && ((prev_insn.insn_mo->pinfo
2804                 & (INSN_LOAD_COPROC_DELAY
2805                    | INSN_COPROC_MOVE_DELAY
2806                    | INSN_WRITE_COND_CODE))
2807                && ! cop_interlocks))
2808           || (! hilo_interlocks
2809               && (prev_insn.insn_mo->pinfo
2810                   & (INSN_READ_LO
2811                      | INSN_READ_HI)))
2812           || (! mips_opts.mips16
2813               && (prev_insn.insn_mo->pinfo & INSN_LOAD_MEMORY_DELAY)
2814               && ! gpr_interlocks)
2815           || (! mips_opts.mips16
2816               && (prev_insn.insn_mo->pinfo & INSN_COPROC_MEMORY_DELAY)
2817               && ! cop_mem_interlocks))
2818         {
2819           /* Itbl support may require additional care here.  */
2820           ++nops;
2821           if ((! mips_opts.mips16
2822                && ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2823                    && ! cop_interlocks))
2824               || (! hilo_interlocks
2825                   && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2826                       || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2827             ++nops;
2828
2829           if (prev_insn_unreordered)
2830             nops = 0;
2831         }
2832       else if ((! mips_opts.mips16
2833                 && ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2834                     && ! cop_interlocks))
2835                || (! hilo_interlocks
2836                    && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2837                        || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2838         {
2839           /* Itbl support may require additional care here.  */
2840           if (! prev_prev_insn_unreordered)
2841             ++nops;
2842         }
2843
2844       if (mips_fix_vr4120 && prev_insn.insn_mo->name)
2845         {
2846           int min_nops = 0;
2847           const char *pn = prev_insn.insn_mo->name;
2848           if (strncmp(pn, "macc", 4) == 0
2849               || strncmp(pn, "dmacc", 5) == 0
2850               || strncmp(pn, "dmult", 5) == 0)
2851             {
2852               min_nops = 1;
2853             }
2854           if (nops < min_nops)
2855             nops = min_nops;
2856         }
2857
2858       if (nops > 0)
2859         {
2860           struct insn_label_list *l;
2861
2862           if (insns)
2863             {
2864               /* Record the frag which holds the nop instructions, so
2865                  that we can remove them if we don't need them.  */
2866               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2867               prev_nop_frag = frag_now;
2868               prev_nop_frag_holds = nops;
2869               prev_nop_frag_required = 0;
2870               prev_nop_frag_since = 0;
2871             }
2872
2873           for (; nops > 0; --nops)
2874             emit_nop ();
2875
2876           if (insns)
2877             {
2878               /* Move on to a new frag, so that it is safe to simply
2879                  decrease the size of prev_nop_frag.  */
2880               frag_wane (frag_now);
2881               frag_new (0);
2882             }
2883
2884           for (l = insn_labels; l != NULL; l = l->next)
2885             {
2886               valueT val;
2887
2888               assert (S_GET_SEGMENT (l->label) == now_seg);
2889               symbol_set_frag (l->label, frag_now);
2890               val = (valueT) frag_now_fix ();
2891               /* mips16 text labels are stored as odd.  */
2892               if (mips_opts.mips16)
2893                 ++val;
2894               S_SET_VALUE (l->label, val);
2895             }
2896         }
2897     }
2898
2899   /* Mark instruction labels in mips16 mode.  */
2900   if (insns)
2901     mips16_mark_labels ();
2902
2903   mips_no_prev_insn (insns);
2904 }
2905
2906 /* Set up global variables for the start of a new macro.  */
2907
2908 static void
2909 macro_start (void)
2910 {
2911   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
2912   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
2913                                      && (prev_insn.insn_mo->pinfo
2914                                          & (INSN_UNCOND_BRANCH_DELAY
2915                                             | INSN_COND_BRANCH_DELAY
2916                                             | INSN_COND_BRANCH_LIKELY)) != 0);
2917 }
2918
2919 /* Given that a macro is longer than 4 bytes, return the appropriate warning
2920    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
2921    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
2922
2923 static const char *
2924 macro_warning (relax_substateT subtype)
2925 {
2926   if (subtype & RELAX_DELAY_SLOT)
2927     return _("Macro instruction expanded into multiple instructions"
2928              " in a branch delay slot");
2929   else if (subtype & RELAX_NOMACRO)
2930     return _("Macro instruction expanded into multiple instructions");
2931   else
2932     return 0;
2933 }
2934
2935 /* Finish up a macro.  Emit warnings as appropriate.  */
2936
2937 static void
2938 macro_end (void)
2939 {
2940   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
2941     {
2942       relax_substateT subtype;
2943
2944       /* Set up the relaxation warning flags.  */
2945       subtype = 0;
2946       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
2947         subtype |= RELAX_SECOND_LONGER;
2948       if (mips_opts.warn_about_macros)
2949         subtype |= RELAX_NOMACRO;
2950       if (mips_macro_warning.delay_slot_p)
2951         subtype |= RELAX_DELAY_SLOT;
2952
2953       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
2954         {
2955           /* Either the macro has a single implementation or both
2956              implementations are longer than 4 bytes.  Emit the
2957              warning now.  */
2958           const char *msg = macro_warning (subtype);
2959           if (msg != 0)
2960             as_warn (msg);
2961         }
2962       else
2963         {
2964           /* One implementation might need a warning but the other
2965              definitely doesn't.  */
2966           mips_macro_warning.first_frag->fr_subtype |= subtype;
2967         }
2968     }
2969 }
2970
2971 /* Build an instruction created by a macro expansion.  This is passed
2972    a pointer to the count of instructions created so far, an
2973    expression, the name of the instruction to build, an operand format
2974    string, and corresponding arguments.  */
2975
2976 static void
2977 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
2978 {
2979   struct mips_cl_insn insn;
2980   bfd_reloc_code_real_type r[3];
2981   va_list args;
2982
2983   va_start (args, fmt);
2984
2985   if (mips_opts.mips16)
2986     {
2987       mips16_macro_build (ep, name, fmt, args);
2988       va_end (args);
2989       return;
2990     }
2991
2992   r[0] = BFD_RELOC_UNUSED;
2993   r[1] = BFD_RELOC_UNUSED;
2994   r[2] = BFD_RELOC_UNUSED;
2995   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2996   assert (insn.insn_mo);
2997   assert (strcmp (name, insn.insn_mo->name) == 0);
2998
2999   /* Search until we get a match for NAME.  */
3000   while (1)
3001     {
3002       /* It is assumed here that macros will never generate
3003          MDMX or MIPS-3D instructions.  */
3004       if (strcmp (fmt, insn.insn_mo->args) == 0
3005           && insn.insn_mo->pinfo != INSN_MACRO
3006           && OPCODE_IS_MEMBER (insn.insn_mo,
3007                                (mips_opts.isa
3008                                 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3009                                mips_opts.arch)
3010           && (mips_opts.arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
3011         break;
3012
3013       ++insn.insn_mo;
3014       assert (insn.insn_mo->name);
3015       assert (strcmp (name, insn.insn_mo->name) == 0);
3016     }
3017
3018   insn.insn_opcode = insn.insn_mo->match;
3019   for (;;)
3020     {
3021       switch (*fmt++)
3022         {
3023         case '\0':
3024           break;
3025
3026         case ',':
3027         case '(':
3028         case ')':
3029           continue;
3030
3031         case '+':
3032           switch (*fmt++)
3033             {
3034             case 'A':
3035             case 'E':
3036               insn.insn_opcode |= (va_arg (args, int)
3037                                    & OP_MASK_SHAMT) << OP_SH_SHAMT;
3038               continue;
3039
3040             case 'B':
3041             case 'F':
3042               /* Note that in the macro case, these arguments are already
3043                  in MSB form.  (When handling the instruction in the
3044                  non-macro case, these arguments are sizes from which
3045                  MSB values must be calculated.)  */
3046               insn.insn_opcode |= (va_arg (args, int)
3047                                    & OP_MASK_INSMSB) << OP_SH_INSMSB;
3048               continue;
3049
3050             case 'C':
3051             case 'G':
3052             case 'H':
3053               /* Note that in the macro case, these arguments are already
3054                  in MSBD form.  (When handling the instruction in the
3055                  non-macro case, these arguments are sizes from which
3056                  MSBD values must be calculated.)  */
3057               insn.insn_opcode |= (va_arg (args, int)
3058                                    & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
3059               continue;
3060
3061             default:
3062               internalError ();
3063             }
3064           continue;
3065
3066         case 't':
3067         case 'w':
3068         case 'E':
3069           insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3070           continue;
3071
3072         case 'c':
3073           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3074           continue;
3075
3076         case 'T':
3077         case 'W':
3078           insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3079           continue;
3080
3081         case 'd':
3082         case 'G':
3083         case 'K':
3084           insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3085           continue;
3086
3087         case 'U':
3088           {
3089             int tmp = va_arg (args, int);
3090
3091             insn.insn_opcode |= tmp << OP_SH_RT;
3092             insn.insn_opcode |= tmp << OP_SH_RD;
3093             continue;
3094           }
3095
3096         case 'V':
3097         case 'S':
3098           insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3099           continue;
3100
3101         case 'z':
3102           continue;
3103
3104         case '<':
3105           insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3106           continue;
3107
3108         case 'D':
3109           insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3110           continue;
3111
3112         case 'B':
3113           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3114           continue;
3115
3116         case 'J':
3117           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3118           continue;
3119
3120         case 'q':
3121           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3122           continue;
3123
3124         case 'b':
3125         case 's':
3126         case 'r':
3127         case 'v':
3128           insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3129           continue;
3130
3131         case 'i':
3132         case 'j':
3133         case 'o':
3134           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3135           assert (*r == BFD_RELOC_GPREL16
3136                   || *r == BFD_RELOC_MIPS_LITERAL
3137                   || *r == BFD_RELOC_MIPS_HIGHER
3138                   || *r == BFD_RELOC_HI16_S
3139                   || *r == BFD_RELOC_LO16
3140                   || *r == BFD_RELOC_MIPS_GOT16
3141                   || *r == BFD_RELOC_MIPS_CALL16
3142                   || *r == BFD_RELOC_MIPS_GOT_DISP
3143                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3144                   || *r == BFD_RELOC_MIPS_GOT_OFST
3145                   || *r == BFD_RELOC_MIPS_GOT_LO16
3146                   || *r == BFD_RELOC_MIPS_CALL_LO16
3147                   || (ep->X_op == O_subtract
3148                       && *r == BFD_RELOC_PCREL_LO16));
3149           continue;
3150
3151         case 'u':
3152           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3153           assert (ep != NULL
3154                   && (ep->X_op == O_constant
3155                       || (ep->X_op == O_symbol
3156                           && (*r == BFD_RELOC_MIPS_HIGHEST
3157                               || *r == BFD_RELOC_HI16_S
3158                               || *r == BFD_RELOC_HI16
3159                               || *r == BFD_RELOC_GPREL16
3160                               || *r == BFD_RELOC_MIPS_GOT_HI16
3161                               || *r == BFD_RELOC_MIPS_CALL_HI16))
3162                       || (ep->X_op == O_subtract
3163                           && *r == BFD_RELOC_PCREL_HI16_S)));
3164           continue;
3165
3166         case 'p':
3167           assert (ep != NULL);
3168           /*
3169            * This allows macro() to pass an immediate expression for
3170            * creating short branches without creating a symbol.
3171            * Note that the expression still might come from the assembly
3172            * input, in which case the value is not checked for range nor
3173            * is a relocation entry generated (yuck).
3174            */
3175           if (ep->X_op == O_constant)
3176             {
3177               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3178               ep = NULL;
3179             }
3180           else
3181             *r = BFD_RELOC_16_PCREL_S2;
3182           continue;
3183
3184         case 'a':
3185           assert (ep != NULL);
3186           *r = BFD_RELOC_MIPS_JMP;
3187           continue;
3188
3189         case 'C':
3190           insn.insn_opcode |= va_arg (args, unsigned long);
3191           continue;
3192
3193         default:
3194           internalError ();
3195         }
3196       break;
3197     }
3198   va_end (args);
3199   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3200
3201   append_insn (&insn, ep, r);
3202 }
3203
3204 static void
3205 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3206                     va_list args)
3207 {
3208   struct mips_cl_insn insn;
3209   bfd_reloc_code_real_type r[3]
3210     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3211
3212   insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3213   assert (insn.insn_mo);
3214   assert (strcmp (name, insn.insn_mo->name) == 0);
3215
3216   while (strcmp (fmt, insn.insn_mo->args) != 0
3217          || insn.insn_mo->pinfo == INSN_MACRO)
3218     {
3219       ++insn.insn_mo;
3220       assert (insn.insn_mo->name);
3221       assert (strcmp (name, insn.insn_mo->name) == 0);
3222     }
3223
3224   insn.insn_opcode = insn.insn_mo->match;
3225   insn.use_extend = FALSE;
3226
3227   for (;;)
3228     {
3229       int c;
3230
3231       c = *fmt++;
3232       switch (c)
3233         {
3234         case '\0':
3235           break;
3236
3237         case ',':
3238         case '(':
3239         case ')':
3240           continue;
3241
3242         case 'y':
3243         case 'w':
3244           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3245           continue;
3246
3247         case 'x':
3248         case 'v':
3249           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3250           continue;
3251
3252         case 'z':
3253           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3254           continue;
3255
3256         case 'Z':
3257           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3258           continue;
3259
3260         case '0':
3261         case 'S':
3262         case 'P':
3263         case 'R':
3264           continue;
3265
3266         case 'X':
3267           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3268           continue;
3269
3270         case 'Y':
3271           {
3272             int regno;
3273
3274             regno = va_arg (args, int);
3275             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3276             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3277           }
3278           continue;
3279
3280         case '<':
3281         case '>':
3282         case '4':
3283         case '5':
3284         case 'H':
3285         case 'W':
3286         case 'D':
3287         case 'j':
3288         case '8':
3289         case 'V':
3290         case 'C':
3291         case 'U':
3292         case 'k':
3293         case 'K':
3294         case 'p':
3295         case 'q':
3296           {
3297             assert (ep != NULL);
3298
3299             if (ep->X_op != O_constant)
3300               *r = (int) BFD_RELOC_UNUSED + c;
3301             else
3302               {
3303                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3304                               FALSE, &insn.insn_opcode, &insn.use_extend,
3305                               &insn.extend);
3306                 ep = NULL;
3307                 *r = BFD_RELOC_UNUSED;
3308               }
3309           }
3310           continue;
3311
3312         case '6':
3313           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3314           continue;
3315         }
3316
3317       break;
3318     }
3319
3320   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3321
3322   append_insn (&insn, ep, r);
3323 }
3324
3325 /*
3326  * Generate a "jalr" instruction with a relocation hint to the called
3327  * function.  This occurs in NewABI PIC code.
3328  */
3329 static void
3330 macro_build_jalr (expressionS *ep)
3331 {
3332   char *f = NULL;
3333
3334   if (HAVE_NEWABI)
3335     {
3336       frag_grow (8);
3337       f = frag_more (0);
3338     }
3339   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3340   if (HAVE_NEWABI)
3341     fix_new_exp (frag_now, f - frag_now->fr_literal,
3342                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3343 }
3344
3345 /*
3346  * Generate a "lui" instruction.
3347  */
3348 static void
3349 macro_build_lui (expressionS *ep, int regnum)
3350 {
3351   expressionS high_expr;
3352   struct mips_cl_insn insn;
3353   bfd_reloc_code_real_type r[3]
3354     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3355   const char *name = "lui";
3356   const char *fmt = "t,u";
3357
3358   assert (! mips_opts.mips16);
3359
3360   high_expr = *ep;
3361
3362   if (high_expr.X_op == O_constant)
3363     {
3364       /* we can compute the instruction now without a relocation entry */
3365       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3366                                 >> 16) & 0xffff;
3367       *r = BFD_RELOC_UNUSED;
3368     }
3369   else
3370     {
3371       assert (ep->X_op == O_symbol);
3372       /* _gp_disp is a special case, used from s_cpload.  */
3373       assert (mips_pic == NO_PIC
3374               || (! HAVE_NEWABI
3375                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3376       *r = BFD_RELOC_HI16_S;
3377     }
3378
3379   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3380   assert (insn.insn_mo);
3381   assert (strcmp (name, insn.insn_mo->name) == 0);
3382   assert (strcmp (fmt, insn.insn_mo->args) == 0);
3383
3384   insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3385   if (*r == BFD_RELOC_UNUSED)
3386     {
3387       insn.insn_opcode |= high_expr.X_add_number;
3388       append_insn (&insn, NULL, r);
3389     }
3390   else
3391     append_insn (&insn, &high_expr, r);
3392 }
3393
3394 /* Generate a sequence of instructions to do a load or store from a constant
3395    offset off of a base register (breg) into/from a target register (treg),
3396    using AT if necessary.  */
3397 static void
3398 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3399                               int treg, int breg, int dbl)
3400 {
3401   assert (ep->X_op == O_constant);
3402
3403   /* Sign-extending 32-bit constants makes their handling easier.  */
3404   if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3405                   == ~((bfd_vma) 0x7fffffff)))
3406     {
3407       if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3408         as_bad (_("constant too large"));
3409
3410       ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3411                           - 0x80000000);
3412     }
3413
3414   /* Right now, this routine can only handle signed 32-bit constants.  */
3415   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3416     as_warn (_("operand overflow"));
3417
3418   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3419     {
3420       /* Signed 16-bit offset will fit in the op.  Easy!  */
3421       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3422     }
3423   else
3424     {
3425       /* 32-bit offset, need multiple instructions and AT, like:
3426            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3427            addu     $tempreg,$tempreg,$breg
3428            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3429          to handle the complete offset.  */
3430       macro_build_lui (ep, AT);
3431       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3432       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3433
3434       if (mips_opts.noat)
3435         as_warn (_("Macro used $at after \".set noat\""));
3436     }
3437 }
3438
3439 /*                      set_at()
3440  * Generates code to set the $at register to true (one)
3441  * if reg is less than the immediate expression.
3442  */
3443 static void
3444 set_at (int reg, int unsignedp)
3445 {
3446   if (imm_expr.X_op == O_constant
3447       && imm_expr.X_add_number >= -0x8000
3448       && imm_expr.X_add_number < 0x8000)
3449     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3450                  AT, reg, BFD_RELOC_LO16);
3451   else
3452     {
3453       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3454       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3455     }
3456 }
3457
3458 static void
3459 normalize_constant_expr (expressionS *ex)
3460 {
3461   if (ex->X_op == O_constant && HAVE_32BIT_GPRS)
3462     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3463                         - 0x80000000);
3464 }
3465
3466 /* Warn if an expression is not a constant.  */
3467
3468 static void
3469 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3470 {
3471   if (ex->X_op == O_big)
3472     as_bad (_("unsupported large constant"));
3473   else if (ex->X_op != O_constant)
3474     as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3475
3476   normalize_constant_expr (ex);
3477 }
3478
3479 /* Count the leading zeroes by performing a binary chop. This is a
3480    bulky bit of source, but performance is a LOT better for the
3481    majority of values than a simple loop to count the bits:
3482        for (lcnt = 0; (lcnt < 32); lcnt++)
3483          if ((v) & (1 << (31 - lcnt)))
3484            break;
3485   However it is not code size friendly, and the gain will drop a bit
3486   on certain cached systems.
3487 */
3488 #define COUNT_TOP_ZEROES(v)             \
3489   (((v) & ~0xffff) == 0                 \
3490    ? ((v) & ~0xff) == 0                 \
3491      ? ((v) & ~0xf) == 0                \
3492        ? ((v) & ~0x3) == 0              \
3493          ? ((v) & ~0x1) == 0            \
3494            ? !(v)                       \
3495              ? 32                       \
3496              : 31                       \
3497            : 30                         \
3498          : ((v) & ~0x7) == 0            \
3499            ? 29                         \
3500            : 28                         \
3501        : ((v) & ~0x3f) == 0             \
3502          ? ((v) & ~0x1f) == 0           \
3503            ? 27                         \
3504            : 26                         \
3505          : ((v) & ~0x7f) == 0           \
3506            ? 25                         \
3507            : 24                         \
3508      : ((v) & ~0xfff) == 0              \
3509        ? ((v) & ~0x3ff) == 0            \
3510          ? ((v) & ~0x1ff) == 0          \
3511            ? 23                         \
3512            : 22                         \
3513          : ((v) & ~0x7ff) == 0          \
3514            ? 21                         \
3515            : 20                         \
3516        : ((v) & ~0x3fff) == 0           \
3517          ? ((v) & ~0x1fff) == 0         \
3518            ? 19                         \
3519            : 18                         \
3520          : ((v) & ~0x7fff) == 0         \
3521            ? 17                         \
3522            : 16                         \
3523    : ((v) & ~0xffffff) == 0             \
3524      ? ((v) & ~0xfffff) == 0            \
3525        ? ((v) & ~0x3ffff) == 0          \
3526          ? ((v) & ~0x1ffff) == 0        \
3527            ? 15                         \
3528            : 14                         \
3529          : ((v) & ~0x7ffff) == 0        \
3530            ? 13                         \
3531            : 12                         \
3532        : ((v) & ~0x3fffff) == 0         \
3533          ? ((v) & ~0x1fffff) == 0       \
3534            ? 11                         \
3535            : 10                         \
3536          : ((v) & ~0x7fffff) == 0       \
3537            ? 9                          \
3538            : 8                          \
3539      : ((v) & ~0xfffffff) == 0          \
3540        ? ((v) & ~0x3ffffff) == 0        \
3541          ? ((v) & ~0x1ffffff) == 0      \
3542            ? 7                          \
3543            : 6                          \
3544          : ((v) & ~0x7ffffff) == 0      \
3545            ? 5                          \
3546            : 4                          \
3547        : ((v) & ~0x3fffffff) == 0       \
3548          ? ((v) & ~0x1fffffff) == 0     \
3549            ? 3                          \
3550            : 2                          \
3551          : ((v) & ~0x7fffffff) == 0     \
3552            ? 1                          \
3553            : 0)
3554
3555 /*                      load_register()
3556  *  This routine generates the least number of instructions necessary to load
3557  *  an absolute expression value into a register.
3558  */
3559 static void
3560 load_register (int reg, expressionS *ep, int dbl)
3561 {
3562   int freg;
3563   expressionS hi32, lo32;
3564
3565   if (ep->X_op != O_big)
3566     {
3567       assert (ep->X_op == O_constant);
3568
3569       /* Sign-extending 32-bit constants makes their handling easier.  */
3570       if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3571                       == ~((bfd_vma) 0x7fffffff)))
3572         {
3573           if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3574             as_bad (_("constant too large"));
3575
3576           ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3577                               - 0x80000000);
3578         }
3579
3580       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3581         {
3582           /* We can handle 16 bit signed values with an addiu to
3583              $zero.  No need to ever use daddiu here, since $zero and
3584              the result are always correct in 32 bit mode.  */
3585           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3586           return;
3587         }
3588       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3589         {
3590           /* We can handle 16 bit unsigned values with an ori to
3591              $zero.  */
3592           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3593           return;
3594         }
3595       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3596         {
3597           /* 32 bit values require an lui.  */
3598           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3599           if ((ep->X_add_number & 0xffff) != 0)
3600             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3601           return;
3602         }
3603     }
3604
3605   /* The value is larger than 32 bits.  */
3606
3607   if (HAVE_32BIT_GPRS)
3608     {
3609       as_bad (_("Number (0x%lx) larger than 32 bits"),
3610               (unsigned long) ep->X_add_number);
3611       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3612       return;
3613     }
3614
3615   if (ep->X_op != O_big)
3616     {
3617       hi32 = *ep;
3618       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3619       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3620       hi32.X_add_number &= 0xffffffff;
3621       lo32 = *ep;
3622       lo32.X_add_number &= 0xffffffff;
3623     }
3624   else
3625     {
3626       assert (ep->X_add_number > 2);
3627       if (ep->X_add_number == 3)
3628         generic_bignum[3] = 0;
3629       else if (ep->X_add_number > 4)
3630         as_bad (_("Number larger than 64 bits"));
3631       lo32.X_op = O_constant;
3632       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3633       hi32.X_op = O_constant;
3634       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3635     }
3636
3637   if (hi32.X_add_number == 0)
3638     freg = 0;
3639   else
3640     {
3641       int shift, bit;
3642       unsigned long hi, lo;
3643
3644       if (hi32.X_add_number == (offsetT) 0xffffffff)
3645         {
3646           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3647             {
3648               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3649               return;
3650             }
3651           if (lo32.X_add_number & 0x80000000)
3652             {
3653               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3654               if (lo32.X_add_number & 0xffff)
3655                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3656               return;
3657             }
3658         }
3659
3660       /* Check for 16bit shifted constant.  We know that hi32 is
3661          non-zero, so start the mask on the first bit of the hi32
3662          value.  */
3663       shift = 17;
3664       do
3665         {
3666           unsigned long himask, lomask;
3667
3668           if (shift < 32)
3669             {
3670               himask = 0xffff >> (32 - shift);
3671               lomask = (0xffff << shift) & 0xffffffff;
3672             }
3673           else
3674             {
3675               himask = 0xffff << (shift - 32);
3676               lomask = 0;
3677             }
3678           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3679               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3680             {
3681               expressionS tmp;
3682
3683               tmp.X_op = O_constant;
3684               if (shift < 32)
3685                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3686                                     | (lo32.X_add_number >> shift));
3687               else
3688                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3689               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3690               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3691                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3692               return;
3693             }
3694           ++shift;
3695         }
3696       while (shift <= (64 - 16));
3697
3698       /* Find the bit number of the lowest one bit, and store the
3699          shifted value in hi/lo.  */
3700       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3701       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3702       if (lo != 0)
3703         {
3704           bit = 0;
3705           while ((lo & 1) == 0)
3706             {
3707               lo >>= 1;
3708               ++bit;
3709             }
3710           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3711           hi >>= bit;
3712         }
3713       else
3714         {
3715           bit = 32;
3716           while ((hi & 1) == 0)
3717             {
3718               hi >>= 1;
3719               ++bit;
3720             }
3721           lo = hi;
3722           hi = 0;
3723         }
3724
3725       /* Optimize if the shifted value is a (power of 2) - 1.  */
3726       if ((hi == 0 && ((lo + 1) & lo) == 0)
3727           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3728         {
3729           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3730           if (shift != 0)
3731             {
3732               expressionS tmp;
3733
3734               /* This instruction will set the register to be all
3735                  ones.  */
3736               tmp.X_op = O_constant;
3737               tmp.X_add_number = (offsetT) -1;
3738               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3739               if (bit != 0)
3740                 {
3741                   bit += shift;
3742                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
3743                                reg, reg, (bit >= 32) ? bit - 32 : bit);
3744                 }
3745               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
3746                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3747               return;
3748             }
3749         }
3750
3751       /* Sign extend hi32 before calling load_register, because we can
3752          generally get better code when we load a sign extended value.  */
3753       if ((hi32.X_add_number & 0x80000000) != 0)
3754         hi32.X_add_number |= ~(offsetT) 0xffffffff;
3755       load_register (reg, &hi32, 0);
3756       freg = reg;
3757     }
3758   if ((lo32.X_add_number & 0xffff0000) == 0)
3759     {
3760       if (freg != 0)
3761         {
3762           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
3763           freg = reg;
3764         }
3765     }
3766   else
3767     {
3768       expressionS mid16;
3769
3770       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3771         {
3772           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3773           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
3774           return;
3775         }
3776
3777       if (freg != 0)
3778         {
3779           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
3780           freg = reg;
3781         }
3782       mid16 = lo32;
3783       mid16.X_add_number >>= 16;
3784       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3785       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3786       freg = reg;
3787     }
3788   if ((lo32.X_add_number & 0xffff) != 0)
3789     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3790 }
3791
3792 /* Load an address into a register.  */
3793
3794 static void
3795 load_address (int reg, expressionS *ep, int *used_at)
3796 {
3797   if (ep->X_op != O_constant
3798       && ep->X_op != O_symbol)
3799     {
3800       as_bad (_("expression too complex"));
3801       ep->X_op = O_constant;
3802     }
3803
3804   if (ep->X_op == O_constant)
3805     {
3806       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
3807       return;
3808     }
3809
3810   if (mips_pic == NO_PIC)
3811     {
3812       /* If this is a reference to a GP relative symbol, we want
3813            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
3814          Otherwise we want
3815            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
3816            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3817          If we have an addend, we always use the latter form.
3818
3819          With 64bit address space and a usable $at we want
3820            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3821            lui          $at,<sym>               (BFD_RELOC_HI16_S)
3822            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3823            daddiu       $at,<sym>               (BFD_RELOC_LO16)
3824            dsll32       $reg,0
3825            daddu        $reg,$reg,$at
3826
3827          If $at is already in use, we use a path which is suboptimal
3828          on superscalar processors.
3829            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3830            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3831            dsll         $reg,16
3832            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
3833            dsll         $reg,16
3834            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
3835        */
3836       if (HAVE_64BIT_ADDRESSES)
3837         {
3838           /* ??? We don't provide a GP-relative alternative for these macros.
3839              It used not to be possible with the original relaxation code,
3840              but it could be done now.  */
3841
3842           if (*used_at == 0 && ! mips_opts.noat)
3843             {
3844               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3845               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
3846               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3847                            BFD_RELOC_MIPS_HIGHER);
3848               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
3849               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
3850               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
3851               *used_at = 1;
3852             }
3853           else
3854             {
3855               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3856               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3857                            BFD_RELOC_MIPS_HIGHER);
3858               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3859               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
3860               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3861               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
3862             }
3863         }
3864       else
3865         {
3866           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3867               && ! nopic_need_relax (ep->X_add_symbol, 1))
3868             {
3869               relax_start (ep->X_add_symbol);
3870               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
3871                            mips_gp_register, BFD_RELOC_GPREL16);
3872               relax_switch ();
3873             }
3874           macro_build_lui (ep, reg);
3875           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
3876                        reg, reg, BFD_RELOC_LO16);
3877           if (mips_relax.sequence)
3878             relax_end ();
3879         }
3880     }
3881   else if (mips_pic == SVR4_PIC && ! mips_big_got)
3882     {
3883       expressionS ex;
3884
3885       /* If this is a reference to an external symbol, we want
3886            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3887          Otherwise we want
3888            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3889            nop
3890            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3891          If there is a constant, it must be added in after.
3892
3893          If we have NewABI, we want
3894            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
3895          unless we're referencing a global symbol with a non-zero
3896          offset, in which case cst must be added separately.  */
3897       if (HAVE_NEWABI)
3898         {
3899           if (ep->X_add_number)
3900             {
3901               ex.X_add_number = ep->X_add_number;
3902               ep->X_add_number = 0;
3903               relax_start (ep->X_add_symbol);
3904               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3905                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3906               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3907                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3908               ex.X_op = O_constant;
3909               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3910                            reg, reg, BFD_RELOC_LO16);
3911               ep->X_add_number = ex.X_add_number;
3912               relax_switch ();
3913             }
3914           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3915                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3916           if (mips_relax.sequence)
3917             relax_end ();
3918         }
3919       else
3920         {
3921           ex.X_add_number = ep->X_add_number;
3922           ep->X_add_number = 0;
3923           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3924                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
3925           macro_build (NULL, "nop", "");
3926           relax_start (ep->X_add_symbol);
3927           relax_switch ();
3928           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3929                        BFD_RELOC_LO16);
3930           relax_end ();
3931
3932           if (ex.X_add_number != 0)
3933             {
3934               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3935                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3936               ex.X_op = O_constant;
3937               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3938                            reg, reg, BFD_RELOC_LO16);
3939             }
3940         }
3941     }
3942   else if (mips_pic == SVR4_PIC)
3943     {
3944       expressionS ex;
3945
3946       /* This is the large GOT case.  If this is a reference to an
3947          external symbol, we want
3948            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
3949            addu         $reg,$reg,$gp
3950            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
3951
3952          Otherwise, for a reference to a local symbol in old ABI, we want
3953            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3954            nop
3955            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3956          If there is a constant, it must be added in after.
3957
3958          In the NewABI, for local symbols, with or without offsets, we want:
3959            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
3960            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
3961       */
3962       if (HAVE_NEWABI)
3963         {
3964           ex.X_add_number = ep->X_add_number;
3965           ep->X_add_number = 0;
3966           relax_start (ep->X_add_symbol);
3967           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
3968           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
3969                        reg, reg, mips_gp_register);
3970           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
3971                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
3972           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3973             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3974           else if (ex.X_add_number)
3975             {
3976               ex.X_op = O_constant;
3977               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3978                            BFD_RELOC_LO16);
3979             }
3980
3981           ep->X_add_number = ex.X_add_number;
3982           relax_switch ();
3983           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3984                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
3985           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3986                        BFD_RELOC_MIPS_GOT_OFST);
3987           relax_end ();
3988         }
3989       else
3990         {
3991           ex.X_add_number = ep->X_add_number;
3992           ep->X_add_number = 0;
3993           relax_start (ep->X_add_symbol);
3994           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
3995           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
3996                        reg, reg, mips_gp_register);
3997           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
3998                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
3999           relax_switch ();
4000           if (reg_needs_delay (mips_gp_register))
4001             {
4002               /* We need a nop before loading from $gp.  This special
4003                  check is required because the lui which starts the main
4004                  instruction stream does not refer to $gp, and so will not
4005                  insert the nop which may be required.  */
4006               macro_build (NULL, "nop", "");
4007             }
4008           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4009                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4010           macro_build (NULL, "nop", "");
4011           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4012                        BFD_RELOC_LO16);
4013           relax_end ();
4014
4015           if (ex.X_add_number != 0)
4016             {
4017               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4018                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4019               ex.X_op = O_constant;
4020               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4021                            BFD_RELOC_LO16);
4022             }
4023         }
4024     }
4025   else if (mips_pic == EMBEDDED_PIC)
4026     {
4027       /* We always do
4028            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4029        */
4030       macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4031                    reg, mips_gp_register, BFD_RELOC_GPREL16);
4032     }
4033   else
4034     abort ();
4035 }
4036
4037 /* Move the contents of register SOURCE into register DEST.  */
4038
4039 static void
4040 move_register (int dest, int source)
4041 {
4042   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4043                dest, source, 0);
4044 }
4045
4046 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4047    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4048    The two alternatives are:
4049
4050    Global symbol                Local sybmol
4051    -------------                ------------
4052    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4053    ...                          ...
4054    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4055
4056    load_got_offset emits the first instruction and add_got_offset
4057    emits the second for a 16-bit offset or add_got_offset_hilo emits
4058    a sequence to add a 32-bit offset using a scratch register.  */
4059
4060 static void
4061 load_got_offset (int dest, expressionS *local)
4062 {
4063   expressionS global;
4064
4065   global = *local;
4066   global.X_add_number = 0;
4067
4068   relax_start (local->X_add_symbol);
4069   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4070                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4071   relax_switch ();
4072   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4073                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4074   relax_end ();
4075 }
4076
4077 static void
4078 add_got_offset (int dest, expressionS *local)
4079 {
4080   expressionS global;
4081
4082   global.X_op = O_constant;
4083   global.X_op_symbol = NULL;
4084   global.X_add_symbol = NULL;
4085   global.X_add_number = local->X_add_number;
4086
4087   relax_start (local->X_add_symbol);
4088   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4089                dest, dest, BFD_RELOC_LO16);
4090   relax_switch ();
4091   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4092   relax_end ();
4093 }
4094
4095 static void
4096 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4097 {
4098   expressionS global;
4099   int hold_mips_optimize;
4100
4101   global.X_op = O_constant;
4102   global.X_op_symbol = NULL;
4103   global.X_add_symbol = NULL;
4104   global.X_add_number = local->X_add_number;
4105
4106   relax_start (local->X_add_symbol);
4107   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4108   relax_switch ();
4109   /* Set mips_optimize around the lui instruction to avoid
4110      inserting an unnecessary nop after the lw.  */
4111   hold_mips_optimize = mips_optimize;
4112   mips_optimize = 2;
4113   macro_build_lui (&global, tmp);
4114   mips_optimize = hold_mips_optimize;
4115   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4116   relax_end ();
4117
4118   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4119 }
4120
4121 /*
4122  *                      Build macros
4123  *   This routine implements the seemingly endless macro or synthesized
4124  * instructions and addressing modes in the mips assembly language. Many
4125  * of these macros are simple and are similar to each other. These could
4126  * probably be handled by some kind of table or grammar approach instead of
4127  * this verbose method. Others are not simple macros but are more like
4128  * optimizing code generation.
4129  *   One interesting optimization is when several store macros appear
4130  * consecutively that would load AT with the upper half of the same address.
4131  * The ensuing load upper instructions are ommited. This implies some kind
4132  * of global optimization. We currently only optimize within a single macro.
4133  *   For many of the load and store macros if the address is specified as a
4134  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4135  * first load register 'at' with zero and use it as the base register. The
4136  * mips assembler simply uses register $zero. Just one tiny optimization
4137  * we're missing.
4138  */
4139 static void
4140 macro (struct mips_cl_insn *ip)
4141 {
4142   register int treg, sreg, dreg, breg;
4143   int tempreg;
4144   int mask;
4145   int used_at = 0;
4146   expressionS expr1;
4147   const char *s;
4148   const char *s2;
4149   const char *fmt;
4150   int likely = 0;
4151   int dbl = 0;
4152   int coproc = 0;
4153   int lr = 0;
4154   int imm = 0;
4155   int call = 0;
4156   int off;
4157   offsetT maxnum;
4158   bfd_reloc_code_real_type r;
4159   int hold_mips_optimize;
4160
4161   assert (! mips_opts.mips16);
4162
4163   treg = (ip->insn_opcode >> 16) & 0x1f;
4164   dreg = (ip->insn_opcode >> 11) & 0x1f;
4165   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4166   mask = ip->insn_mo->mask;
4167
4168   expr1.X_op = O_constant;
4169   expr1.X_op_symbol = NULL;
4170   expr1.X_add_symbol = NULL;
4171   expr1.X_add_number = 1;
4172
4173   switch (mask)
4174     {
4175     case M_DABS:
4176       dbl = 1;
4177     case M_ABS:
4178       /* bgez $a0,.+12
4179          move v0,$a0
4180          sub v0,$zero,$a0
4181          */
4182
4183       mips_emit_delays (TRUE);
4184       ++mips_opts.noreorder;
4185       mips_any_noreorder = 1;
4186
4187       expr1.X_add_number = 8;
4188       macro_build (&expr1, "bgez", "s,p", sreg);
4189       if (dreg == sreg)
4190         macro_build (NULL, "nop", "", 0);
4191       else
4192         move_register (dreg, sreg);
4193       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4194
4195       --mips_opts.noreorder;
4196       return;
4197
4198     case M_ADD_I:
4199       s = "addi";
4200       s2 = "add";
4201       goto do_addi;
4202     case M_ADDU_I:
4203       s = "addiu";
4204       s2 = "addu";
4205       goto do_addi;
4206     case M_DADD_I:
4207       dbl = 1;
4208       s = "daddi";
4209       s2 = "dadd";
4210       goto do_addi;
4211     case M_DADDU_I:
4212       dbl = 1;
4213       s = "daddiu";
4214       s2 = "daddu";
4215     do_addi:
4216       if (imm_expr.X_op == O_constant
4217           && imm_expr.X_add_number >= -0x8000
4218           && imm_expr.X_add_number < 0x8000)
4219         {
4220           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4221           return;
4222         }
4223       load_register (AT, &imm_expr, dbl);
4224       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4225       break;
4226
4227     case M_AND_I:
4228       s = "andi";
4229       s2 = "and";
4230       goto do_bit;
4231     case M_OR_I:
4232       s = "ori";
4233       s2 = "or";
4234       goto do_bit;
4235     case M_NOR_I:
4236       s = "";
4237       s2 = "nor";
4238       goto do_bit;
4239     case M_XOR_I:
4240       s = "xori";
4241       s2 = "xor";
4242     do_bit:
4243       if (imm_expr.X_op == O_constant
4244           && imm_expr.X_add_number >= 0
4245           && imm_expr.X_add_number < 0x10000)
4246         {
4247           if (mask != M_NOR_I)
4248             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4249           else
4250             {
4251               macro_build (&imm_expr, "ori", "t,r,i",
4252                            treg, sreg, BFD_RELOC_LO16);
4253               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4254             }
4255           return;
4256         }
4257
4258       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4259       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4260       break;
4261
4262     case M_BEQ_I:
4263       s = "beq";
4264       goto beq_i;
4265     case M_BEQL_I:
4266       s = "beql";
4267       likely = 1;
4268       goto beq_i;
4269     case M_BNE_I:
4270       s = "bne";
4271       goto beq_i;
4272     case M_BNEL_I:
4273       s = "bnel";
4274       likely = 1;
4275     beq_i:
4276       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4277         {
4278           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4279           return;
4280         }
4281       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4282       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4283       break;
4284
4285     case M_BGEL:
4286       likely = 1;
4287     case M_BGE:
4288       if (treg == 0)
4289         {
4290           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4291           return;
4292         }
4293       if (sreg == 0)
4294         {
4295           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4296           return;
4297         }
4298       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4299       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4300       break;
4301
4302     case M_BGTL_I:
4303       likely = 1;
4304     case M_BGT_I:
4305       /* check for > max integer */
4306       maxnum = 0x7fffffff;
4307       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4308         {
4309           maxnum <<= 16;
4310           maxnum |= 0xffff;
4311           maxnum <<= 16;
4312           maxnum |= 0xffff;
4313         }
4314       if (imm_expr.X_op == O_constant
4315           && imm_expr.X_add_number >= maxnum
4316           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4317         {
4318         do_false:
4319           /* result is always false */
4320           if (! likely)
4321             macro_build (NULL, "nop", "", 0);
4322           else
4323             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4324           return;
4325         }
4326       if (imm_expr.X_op != O_constant)
4327         as_bad (_("Unsupported large constant"));
4328       ++imm_expr.X_add_number;
4329       /* FALLTHROUGH */
4330     case M_BGE_I:
4331     case M_BGEL_I:
4332       if (mask == M_BGEL_I)
4333         likely = 1;
4334       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4335         {
4336           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4337           return;
4338         }
4339       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4340         {
4341           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4342           return;
4343         }
4344       maxnum = 0x7fffffff;
4345       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4346         {
4347           maxnum <<= 16;
4348           maxnum |= 0xffff;
4349           maxnum <<= 16;
4350           maxnum |= 0xffff;
4351         }
4352       maxnum = - maxnum - 1;
4353       if (imm_expr.X_op == O_constant
4354           && imm_expr.X_add_number <= maxnum
4355           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4356         {
4357         do_true:
4358           /* result is always true */
4359           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4360           macro_build (&offset_expr, "b", "p");
4361           return;
4362         }
4363       set_at (sreg, 0);
4364       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4365       break;
4366
4367     case M_BGEUL:
4368       likely = 1;
4369     case M_BGEU:
4370       if (treg == 0)
4371         goto do_true;
4372       if (sreg == 0)
4373         {
4374           macro_build (&offset_expr, likely ? "beql" : "beq",
4375                        "s,t,p", 0, treg);
4376           return;
4377         }
4378       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4379       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4380       break;
4381
4382     case M_BGTUL_I:
4383       likely = 1;
4384     case M_BGTU_I:
4385       if (sreg == 0
4386           || (HAVE_32BIT_GPRS
4387               && imm_expr.X_op == O_constant
4388               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4389         goto do_false;
4390       if (imm_expr.X_op != O_constant)
4391         as_bad (_("Unsupported large constant"));
4392       ++imm_expr.X_add_number;
4393       /* FALLTHROUGH */
4394     case M_BGEU_I:
4395     case M_BGEUL_I:
4396       if (mask == M_BGEUL_I)
4397         likely = 1;
4398       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4399         goto do_true;
4400       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4401         {
4402           macro_build (&offset_expr, likely ? "bnel" : "bne",
4403                        "s,t,p", sreg, 0);
4404           return;
4405         }
4406       set_at (sreg, 1);
4407       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4408       break;
4409
4410     case M_BGTL:
4411       likely = 1;
4412     case M_BGT:
4413       if (treg == 0)
4414         {
4415           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4416           return;
4417         }
4418       if (sreg == 0)
4419         {
4420           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4421           return;
4422         }
4423       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4424       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4425       break;
4426
4427     case M_BGTUL:
4428       likely = 1;
4429     case M_BGTU:
4430       if (treg == 0)
4431         {
4432           macro_build (&offset_expr, likely ? "bnel" : "bne",
4433                        "s,t,p", sreg, 0);
4434           return;
4435         }
4436       if (sreg == 0)
4437         goto do_false;
4438       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4439       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4440       break;
4441
4442     case M_BLEL:
4443       likely = 1;
4444     case M_BLE:
4445       if (treg == 0)
4446         {
4447           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4448           return;
4449         }
4450       if (sreg == 0)
4451         {
4452           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4453           return;
4454         }
4455       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4456       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4457       break;
4458
4459     case M_BLEL_I:
4460       likely = 1;
4461     case M_BLE_I:
4462       maxnum = 0x7fffffff;
4463       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4464         {
4465           maxnum <<= 16;
4466           maxnum |= 0xffff;
4467           maxnum <<= 16;
4468           maxnum |= 0xffff;
4469         }
4470       if (imm_expr.X_op == O_constant
4471           && imm_expr.X_add_number >= maxnum
4472           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4473         goto do_true;
4474       if (imm_expr.X_op != O_constant)
4475         as_bad (_("Unsupported large constant"));
4476       ++imm_expr.X_add_number;
4477       /* FALLTHROUGH */
4478     case M_BLT_I:
4479     case M_BLTL_I:
4480       if (mask == M_BLTL_I)
4481         likely = 1;
4482       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4483         {
4484           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4485           return;
4486         }
4487       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4488         {
4489           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4490           return;
4491         }
4492       set_at (sreg, 0);
4493       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4494       break;
4495
4496     case M_BLEUL:
4497       likely = 1;
4498     case M_BLEU:
4499       if (treg == 0)
4500         {
4501           macro_build (&offset_expr, likely ? "beql" : "beq",
4502                        "s,t,p", sreg, 0);
4503           return;
4504         }
4505       if (sreg == 0)
4506         goto do_true;
4507       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4508       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4509       break;
4510
4511     case M_BLEUL_I:
4512       likely = 1;
4513     case M_BLEU_I:
4514       if (sreg == 0
4515           || (HAVE_32BIT_GPRS
4516               && imm_expr.X_op == O_constant
4517               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4518         goto do_true;
4519       if (imm_expr.X_op != O_constant)
4520         as_bad (_("Unsupported large constant"));
4521       ++imm_expr.X_add_number;
4522       /* FALLTHROUGH */
4523     case M_BLTU_I:
4524     case M_BLTUL_I:
4525       if (mask == M_BLTUL_I)
4526         likely = 1;
4527       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4528         goto do_false;
4529       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4530         {
4531           macro_build (&offset_expr, likely ? "beql" : "beq",
4532                        "s,t,p", sreg, 0);
4533           return;
4534         }
4535       set_at (sreg, 1);
4536       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4537       break;
4538
4539     case M_BLTL:
4540       likely = 1;
4541     case M_BLT:
4542       if (treg == 0)
4543         {
4544           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4545           return;
4546         }
4547       if (sreg == 0)
4548         {
4549           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4550           return;
4551         }
4552       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4553       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4554       break;
4555
4556     case M_BLTUL:
4557       likely = 1;
4558     case M_BLTU:
4559       if (treg == 0)
4560         goto do_false;
4561       if (sreg == 0)
4562         {
4563           macro_build (&offset_expr, likely ? "bnel" : "bne",
4564                        "s,t,p", 0, treg);
4565           return;
4566         }
4567       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4568       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4569       break;
4570
4571     case M_DEXT:
4572       {
4573         unsigned long pos;
4574         unsigned long size;
4575
4576         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4577           {
4578             as_bad (_("Unsupported large constant"));
4579             pos = size = 1;
4580           }
4581         else
4582           {
4583             pos = (unsigned long) imm_expr.X_add_number;
4584             size = (unsigned long) imm2_expr.X_add_number;
4585           }
4586
4587         if (pos > 63)
4588           {
4589             as_bad (_("Improper position (%lu)"), pos);
4590             pos = 1;
4591           }
4592         if (size == 0 || size > 64
4593             || (pos + size - 1) > 63)
4594           {
4595             as_bad (_("Improper extract size (%lu, position %lu)"),
4596                     size, pos);
4597             size = 1;
4598           }
4599
4600         if (size <= 32 && pos < 32)
4601           {
4602             s = "dext";
4603             fmt = "t,r,+A,+C";
4604           }
4605         else if (size <= 32)
4606           {
4607             s = "dextu";
4608             fmt = "t,r,+E,+H";
4609           }
4610         else
4611           {
4612             s = "dextm";
4613             fmt = "t,r,+A,+G";
4614           }
4615         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4616       }
4617       return;
4618
4619     case M_DINS:
4620       {
4621         unsigned long pos;
4622         unsigned long size;
4623
4624         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4625           {
4626             as_bad (_("Unsupported large constant"));
4627             pos = size = 1;
4628           }
4629         else
4630           {
4631             pos = (unsigned long) imm_expr.X_add_number;
4632             size = (unsigned long) imm2_expr.X_add_number;
4633           }
4634
4635         if (pos > 63)
4636           {
4637             as_bad (_("Improper position (%lu)"), pos);
4638             pos = 1;
4639           }
4640         if (size == 0 || size > 64
4641             || (pos + size - 1) > 63)
4642           {
4643             as_bad (_("Improper insert size (%lu, position %lu)"),
4644                     size, pos);
4645             size = 1;
4646           }
4647
4648         if (pos < 32 && (pos + size - 1) < 32)
4649           {
4650             s = "dins";
4651             fmt = "t,r,+A,+B";
4652           }
4653         else if (pos >= 32)
4654           {
4655             s = "dinsu";
4656             fmt = "t,r,+E,+F";
4657           }
4658         else
4659           {
4660             s = "dinsm";
4661             fmt = "t,r,+A,+F";
4662           }
4663         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4664                      pos + size - 1);
4665       }
4666       return;
4667
4668     case M_DDIV_3:
4669       dbl = 1;
4670     case M_DIV_3:
4671       s = "mflo";
4672       goto do_div3;
4673     case M_DREM_3:
4674       dbl = 1;
4675     case M_REM_3:
4676       s = "mfhi";
4677     do_div3:
4678       if (treg == 0)
4679         {
4680           as_warn (_("Divide by zero."));
4681           if (mips_trap)
4682             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4683           else
4684             macro_build (NULL, "break", "c", 7);
4685           return;
4686         }
4687
4688       mips_emit_delays (TRUE);
4689       ++mips_opts.noreorder;
4690       mips_any_noreorder = 1;
4691       if (mips_trap)
4692         {
4693           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4694           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4695         }
4696       else
4697         {
4698           expr1.X_add_number = 8;
4699           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4700           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4701           macro_build (NULL, "break", "c", 7);
4702         }
4703       expr1.X_add_number = -1;
4704       load_register (AT, &expr1, dbl);
4705       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4706       macro_build (&expr1, "bne", "s,t,p", treg, AT);
4707       if (dbl)
4708         {
4709           expr1.X_add_number = 1;
4710           load_register (AT, &expr1, dbl);
4711           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
4712         }
4713       else
4714         {
4715           expr1.X_add_number = 0x80000000;
4716           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
4717         }
4718       if (mips_trap)
4719         {
4720           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
4721           /* We want to close the noreorder block as soon as possible, so
4722              that later insns are available for delay slot filling.  */
4723           --mips_opts.noreorder;
4724         }
4725       else
4726         {
4727           expr1.X_add_number = 8;
4728           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
4729           macro_build (NULL, "nop", "", 0);
4730
4731           /* We want to close the noreorder block as soon as possible, so
4732              that later insns are available for delay slot filling.  */
4733           --mips_opts.noreorder;
4734
4735           macro_build (NULL, "break", "c", 6);
4736         }
4737       macro_build (NULL, s, "d", dreg);
4738       break;
4739
4740     case M_DIV_3I:
4741       s = "div";
4742       s2 = "mflo";
4743       goto do_divi;
4744     case M_DIVU_3I:
4745       s = "divu";
4746       s2 = "mflo";
4747       goto do_divi;
4748     case M_REM_3I:
4749       s = "div";
4750       s2 = "mfhi";
4751       goto do_divi;
4752     case M_REMU_3I:
4753       s = "divu";
4754       s2 = "mfhi";
4755       goto do_divi;
4756     case M_DDIV_3I:
4757       dbl = 1;
4758       s = "ddiv";
4759       s2 = "mflo";
4760       goto do_divi;
4761     case M_DDIVU_3I:
4762       dbl = 1;
4763       s = "ddivu";
4764       s2 = "mflo";
4765       goto do_divi;
4766     case M_DREM_3I:
4767       dbl = 1;
4768       s = "ddiv";
4769       s2 = "mfhi";
4770       goto do_divi;
4771     case M_DREMU_3I:
4772       dbl = 1;
4773       s = "ddivu";
4774       s2 = "mfhi";
4775     do_divi:
4776       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4777         {
4778           as_warn (_("Divide by zero."));
4779           if (mips_trap)
4780             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4781           else
4782             macro_build (NULL, "break", "c", 7);
4783           return;
4784         }
4785       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4786         {
4787           if (strcmp (s2, "mflo") == 0)
4788             move_register (dreg, sreg);
4789           else
4790             move_register (dreg, 0);
4791           return;
4792         }
4793       if (imm_expr.X_op == O_constant
4794           && imm_expr.X_add_number == -1
4795           && s[strlen (s) - 1] != 'u')
4796         {
4797           if (strcmp (s2, "mflo") == 0)
4798             {
4799               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4800             }
4801           else
4802             move_register (dreg, 0);
4803           return;
4804         }
4805
4806       load_register (AT, &imm_expr, dbl);
4807       macro_build (NULL, s, "z,s,t", sreg, AT);
4808       macro_build (NULL, s2, "d", dreg);
4809       break;
4810
4811     case M_DIVU_3:
4812       s = "divu";
4813       s2 = "mflo";
4814       goto do_divu3;
4815     case M_REMU_3:
4816       s = "divu";
4817       s2 = "mfhi";
4818       goto do_divu3;
4819     case M_DDIVU_3:
4820       s = "ddivu";
4821       s2 = "mflo";
4822       goto do_divu3;
4823     case M_DREMU_3:
4824       s = "ddivu";
4825       s2 = "mfhi";
4826     do_divu3:
4827       mips_emit_delays (TRUE);
4828       ++mips_opts.noreorder;
4829       mips_any_noreorder = 1;
4830       if (mips_trap)
4831         {
4832           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4833           macro_build (NULL, s, "z,s,t", sreg, treg);
4834           /* We want to close the noreorder block as soon as possible, so
4835              that later insns are available for delay slot filling.  */
4836           --mips_opts.noreorder;
4837         }
4838       else
4839         {
4840           expr1.X_add_number = 8;
4841           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4842           macro_build (NULL, s, "z,s,t", sreg, treg);
4843
4844           /* We want to close the noreorder block as soon as possible, so
4845              that later insns are available for delay slot filling.  */
4846           --mips_opts.noreorder;
4847           macro_build (NULL, "break", "c", 7);
4848         }
4849       macro_build (NULL, s2, "d", dreg);
4850       return;
4851
4852     case M_DLCA_AB:
4853       dbl = 1;
4854     case M_LCA_AB:
4855       call = 1;
4856       goto do_la;
4857     case M_DLA_AB:
4858       dbl = 1;
4859     case M_LA_AB:
4860     do_la:
4861       /* Load the address of a symbol into a register.  If breg is not
4862          zero, we then add a base register to it.  */
4863
4864       if (dbl && HAVE_32BIT_GPRS)
4865         as_warn (_("dla used to load 32-bit register"));
4866
4867       if (! dbl && HAVE_64BIT_OBJECTS)
4868         as_warn (_("la used to load 64-bit address"));
4869
4870       if (offset_expr.X_op == O_constant
4871           && offset_expr.X_add_number >= -0x8000
4872           && offset_expr.X_add_number < 0x8000)
4873         {
4874           macro_build (&offset_expr,
4875                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4876                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
4877           return;
4878         }
4879
4880       if (treg == breg)
4881         {
4882           tempreg = AT;
4883           used_at = 1;
4884         }
4885       else
4886         {
4887           tempreg = treg;
4888           used_at = 0;
4889         }
4890
4891       /* When generating embedded PIC code, we permit expressions of
4892          the form
4893            la   $treg,foo-bar
4894            la   $treg,foo-bar($breg)
4895          where bar is an address in the current section.  These are used
4896          when getting the addresses of functions.  We don't permit
4897          X_add_number to be non-zero, because if the symbol is
4898          external the relaxing code needs to know that any addend is
4899          purely the offset to X_op_symbol.  */
4900       if (mips_pic == EMBEDDED_PIC
4901           && offset_expr.X_op == O_subtract
4902           && (symbol_constant_p (offset_expr.X_op_symbol)
4903               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4904               : (symbol_equated_p (offset_expr.X_op_symbol)
4905                  && (S_GET_SEGMENT
4906                      (symbol_get_value_expression (offset_expr.X_op_symbol)
4907                       ->X_add_symbol)
4908                      == now_seg)))
4909           && (offset_expr.X_add_number == 0
4910               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4911         {
4912           if (breg == 0)
4913             {
4914               tempreg = treg;
4915               used_at = 0;
4916               macro_build (&offset_expr, "lui", "t,u",
4917                            tempreg, BFD_RELOC_PCREL_HI16_S);
4918             }
4919           else
4920             {
4921               macro_build (&offset_expr, "lui", "t,u",
4922                            tempreg, BFD_RELOC_PCREL_HI16_S);
4923               macro_build (NULL,
4924                            (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4925                            "d,v,t", tempreg, tempreg, breg);
4926             }
4927           macro_build (&offset_expr,
4928                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4929                        "t,r,j", treg, tempreg, BFD_RELOC_PCREL_LO16);
4930           if (! used_at)
4931             return;
4932           break;
4933         }
4934
4935       if (offset_expr.X_op != O_symbol
4936           && offset_expr.X_op != O_constant)
4937         {
4938           as_bad (_("expression too complex"));
4939           offset_expr.X_op = O_constant;
4940         }
4941
4942       if (offset_expr.X_op == O_constant)
4943         load_register (tempreg, &offset_expr,
4944                        ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4945                         ? (dbl || HAVE_64BIT_ADDRESSES)
4946                         : HAVE_64BIT_ADDRESSES));
4947       else if (mips_pic == NO_PIC)
4948         {
4949           /* If this is a reference to a GP relative symbol, we want
4950                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
4951              Otherwise we want
4952                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
4953                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4954              If we have a constant, we need two instructions anyhow,
4955              so we may as well always use the latter form.
4956
4957             With 64bit address space and a usable $at we want
4958               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4959               lui       $at,<sym>               (BFD_RELOC_HI16_S)
4960               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4961               daddiu    $at,<sym>               (BFD_RELOC_LO16)
4962               dsll32    $tempreg,0
4963               daddu     $tempreg,$tempreg,$at
4964
4965             If $at is already in use, we use a path which is suboptimal
4966             on superscalar processors.
4967               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4968               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4969               dsll      $tempreg,16
4970               daddiu    $tempreg,<sym>          (BFD_RELOC_HI16_S)
4971               dsll      $tempreg,16
4972               daddiu    $tempreg,<sym>          (BFD_RELOC_LO16)
4973           */
4974           if (HAVE_64BIT_ADDRESSES)
4975             {
4976               /* ??? We don't provide a GP-relative alternative for
4977                  these macros.  It used not to be possible with the
4978                  original relaxation code, but it could be done now.  */
4979
4980               if (used_at == 0 && ! mips_opts.noat)
4981                 {
4982                   macro_build (&offset_expr, "lui", "t,u",
4983                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4984                   macro_build (&offset_expr, "lui", "t,u",
4985                                AT, BFD_RELOC_HI16_S);
4986                   macro_build (&offset_expr, "daddiu", "t,r,j",
4987                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
4988                   macro_build (&offset_expr, "daddiu", "t,r,j",
4989                                AT, AT, BFD_RELOC_LO16);
4990                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
4991                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
4992                   used_at = 1;
4993                 }
4994               else
4995                 {
4996                   macro_build (&offset_expr, "lui", "t,u",
4997                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4998                   macro_build (&offset_expr, "daddiu", "t,r,j",
4999                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5000                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5001                   macro_build (&offset_expr, "daddiu", "t,r,j",
5002                                tempreg, tempreg, BFD_RELOC_HI16_S);
5003                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5004                   macro_build (&offset_expr, "daddiu", "t,r,j",
5005                                tempreg, tempreg, BFD_RELOC_LO16);
5006                 }
5007             }
5008           else
5009             {
5010               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5011                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
5012                 {
5013                   relax_start (offset_expr.X_add_symbol);
5014                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5015                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5016                   relax_switch ();
5017                 }
5018               macro_build_lui (&offset_expr, tempreg);
5019               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5020                            tempreg, tempreg, BFD_RELOC_LO16);
5021               if (mips_relax.sequence)
5022                 relax_end ();
5023             }
5024         }
5025       else if (mips_pic == SVR4_PIC && ! mips_big_got && ! HAVE_NEWABI)
5026         {
5027           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5028
5029           /* If this is a reference to an external symbol, and there
5030              is no constant, we want
5031                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5032              or for lca or if tempreg is PIC_CALL_REG
5033                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5034              For a local symbol, we want
5035                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5036                nop
5037                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5038
5039              If we have a small constant, and this is a reference to
5040              an external symbol, we want
5041                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5042                nop
5043                addiu    $tempreg,$tempreg,<constant>
5044              For a local symbol, we want the same instruction
5045              sequence, but we output a BFD_RELOC_LO16 reloc on the
5046              addiu instruction.
5047
5048              If we have a large constant, and this is a reference to
5049              an external symbol, we want
5050                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5051                lui      $at,<hiconstant>
5052                addiu    $at,$at,<loconstant>
5053                addu     $tempreg,$tempreg,$at
5054              For a local symbol, we want the same instruction
5055              sequence, but we output a BFD_RELOC_LO16 reloc on the
5056              addiu instruction.
5057            */
5058
5059           if (offset_expr.X_add_number == 0)
5060             {
5061               if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5062                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5063
5064               relax_start (offset_expr.X_add_symbol);
5065               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5066                            lw_reloc_type, mips_gp_register);
5067               if (breg != 0)
5068                 {
5069                   /* We're going to put in an addu instruction using
5070                      tempreg, so we may as well insert the nop right
5071                      now.  */
5072                   macro_build (NULL, "nop", "");
5073                 }
5074               relax_switch ();
5075               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5076                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5077               macro_build (NULL, "nop", "");
5078               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5079                            tempreg, tempreg, BFD_RELOC_LO16);
5080               relax_end ();
5081               /* FIXME: If breg == 0, and the next instruction uses
5082                  $tempreg, then if this variant case is used an extra
5083                  nop will be generated.  */
5084             }
5085           else if (offset_expr.X_add_number >= -0x8000
5086                    && offset_expr.X_add_number < 0x8000)
5087             {
5088               load_got_offset (tempreg, &offset_expr);
5089               macro_build (NULL, "nop", "");
5090               add_got_offset (tempreg, &offset_expr);
5091             }
5092           else
5093             {
5094               expr1.X_add_number = offset_expr.X_add_number;
5095               offset_expr.X_add_number =
5096                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5097               load_got_offset (tempreg, &offset_expr);
5098               offset_expr.X_add_number = expr1.X_add_number;
5099               /* If we are going to add in a base register, and the
5100                  target register and the base register are the same,
5101                  then we are using AT as a temporary register.  Since
5102                  we want to load the constant into AT, we add our
5103                  current AT (from the global offset table) and the
5104                  register into the register now, and pretend we were
5105                  not using a base register.  */
5106               if (breg == treg)
5107                 {
5108                   macro_build (NULL, "nop", "");
5109                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5110                                treg, AT, breg);
5111                   breg = 0;
5112                   tempreg = treg;
5113                 }
5114               add_got_offset_hilo (tempreg, &offset_expr, AT);
5115               used_at = 1;
5116             }
5117         }
5118       else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
5119         {
5120           int add_breg_early = 0;
5121
5122           /* If this is a reference to an external, and there is no
5123              constant, or local symbol (*), with or without a
5124              constant, we want
5125                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5126              or for lca or if tempreg is PIC_CALL_REG
5127                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5128
5129              If we have a small constant, and this is a reference to
5130              an external symbol, we want
5131                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5132                addiu    $tempreg,$tempreg,<constant>
5133
5134              If we have a large constant, and this is a reference to
5135              an external symbol, we want
5136                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5137                lui      $at,<hiconstant>
5138                addiu    $at,$at,<loconstant>
5139                addu     $tempreg,$tempreg,$at
5140
5141              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5142              local symbols, even though it introduces an additional
5143              instruction.  */
5144
5145           if (offset_expr.X_add_number)
5146             {
5147               expr1.X_add_number = offset_expr.X_add_number;
5148               offset_expr.X_add_number = 0;
5149
5150               relax_start (offset_expr.X_add_symbol);
5151               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5152                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5153
5154               if (expr1.X_add_number >= -0x8000
5155                   && expr1.X_add_number < 0x8000)
5156                 {
5157                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5158                                tempreg, tempreg, BFD_RELOC_LO16);
5159                 }
5160               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5161                 {
5162                   int dreg;
5163
5164                   /* If we are going to add in a base register, and the
5165                      target register and the base register are the same,
5166                      then we are using AT as a temporary register.  Since
5167                      we want to load the constant into AT, we add our
5168                      current AT (from the global offset table) and the
5169                      register into the register now, and pretend we were
5170                      not using a base register.  */
5171                   if (breg != treg)
5172                     dreg = tempreg;
5173                   else
5174                     {
5175                       assert (tempreg == AT);
5176                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5177                                    treg, AT, breg);
5178                       dreg = treg;
5179                       add_breg_early = 1;
5180                     }
5181
5182                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5183                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5184                                dreg, dreg, AT);
5185
5186                   used_at = 1;
5187                 }
5188               else
5189                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5190
5191               relax_switch ();
5192               offset_expr.X_add_number = expr1.X_add_number;
5193
5194               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5195                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5196               if (add_breg_early)
5197                 {
5198                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5199                                treg, tempreg, breg);
5200                   breg = 0;
5201                   tempreg = treg;
5202                 }
5203               relax_end ();
5204             }
5205           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5206             {
5207               relax_start (offset_expr.X_add_symbol);
5208               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5209                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5210               relax_switch ();
5211               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5212                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5213               relax_end ();
5214             }
5215           else
5216             {
5217               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5218                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5219             }
5220         }
5221       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
5222         {
5223           int gpdelay;
5224           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5225           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5226           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5227
5228           /* This is the large GOT case.  If this is a reference to an
5229              external symbol, and there is no constant, we want
5230                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5231                addu     $tempreg,$tempreg,$gp
5232                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5233              or for lca or if tempreg is PIC_CALL_REG
5234                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5235                addu     $tempreg,$tempreg,$gp
5236                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5237              For a local symbol, we want
5238                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5239                nop
5240                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5241
5242              If we have a small constant, and this is a reference to
5243              an external symbol, we want
5244                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5245                addu     $tempreg,$tempreg,$gp
5246                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5247                nop
5248                addiu    $tempreg,$tempreg,<constant>
5249              For a local symbol, we want
5250                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5251                nop
5252                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5253
5254              If we have a large constant, and this is a reference to
5255              an external symbol, we want
5256                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5257                addu     $tempreg,$tempreg,$gp
5258                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5259                lui      $at,<hiconstant>
5260                addiu    $at,$at,<loconstant>
5261                addu     $tempreg,$tempreg,$at
5262              For a local symbol, we want
5263                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5264                lui      $at,<hiconstant>
5265                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5266                addu     $tempreg,$tempreg,$at
5267           */
5268
5269           expr1.X_add_number = offset_expr.X_add_number;
5270           offset_expr.X_add_number = 0;
5271           relax_start (offset_expr.X_add_symbol);
5272           gpdelay = reg_needs_delay (mips_gp_register);
5273           if (expr1.X_add_number == 0 && breg == 0
5274               && (call || tempreg == PIC_CALL_REG))
5275             {
5276               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5277               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5278             }
5279           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5280           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5281                        tempreg, tempreg, mips_gp_register);
5282           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5283                        tempreg, lw_reloc_type, tempreg);
5284           if (expr1.X_add_number == 0)
5285             {
5286               if (breg != 0)
5287                 {
5288                   /* We're going to put in an addu instruction using
5289                      tempreg, so we may as well insert the nop right
5290                      now.  */
5291                   macro_build (NULL, "nop", "");
5292                 }
5293             }
5294           else if (expr1.X_add_number >= -0x8000
5295                    && expr1.X_add_number < 0x8000)
5296             {
5297               macro_build (NULL, "nop", "");
5298               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5299                            tempreg, tempreg, BFD_RELOC_LO16);
5300             }
5301           else
5302             {
5303               int dreg;
5304
5305               /* If we are going to add in a base register, and the
5306                  target register and the base register are the same,
5307                  then we are using AT as a temporary register.  Since
5308                  we want to load the constant into AT, we add our
5309                  current AT (from the global offset table) and the
5310                  register into the register now, and pretend we were
5311                  not using a base register.  */
5312               if (breg != treg)
5313                 dreg = tempreg;
5314               else
5315                 {
5316                   assert (tempreg == AT);
5317                   macro_build (NULL, "nop", "");
5318                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5319                                treg, AT, breg);
5320                   dreg = treg;
5321                 }
5322
5323               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5324               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5325
5326               used_at = 1;
5327             }
5328           offset_expr.X_add_number =
5329             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5330           relax_switch ();
5331
5332           if (gpdelay)
5333             {
5334               /* This is needed because this instruction uses $gp, but
5335                  the first instruction on the main stream does not.  */
5336               macro_build (NULL, "nop", "");
5337             }
5338
5339           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5340                        local_reloc_type, mips_gp_register);
5341           if (expr1.X_add_number >= -0x8000
5342               && expr1.X_add_number < 0x8000)
5343             {
5344               macro_build (NULL, "nop", "");
5345               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5346                            tempreg, tempreg, BFD_RELOC_LO16);
5347               /* FIXME: If add_number is 0, and there was no base
5348                  register, the external symbol case ended with a load,
5349                  so if the symbol turns out to not be external, and
5350                  the next instruction uses tempreg, an unnecessary nop
5351                  will be inserted.  */
5352             }
5353           else
5354             {
5355               if (breg == treg)
5356                 {
5357                   /* We must add in the base register now, as in the
5358                      external symbol case.  */
5359                   assert (tempreg == AT);
5360                   macro_build (NULL, "nop", "");
5361                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5362                                treg, AT, breg);
5363                   tempreg = treg;
5364                   /* We set breg to 0 because we have arranged to add
5365                      it in in both cases.  */
5366                   breg = 0;
5367                 }
5368
5369               macro_build_lui (&expr1, AT);
5370               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5371                            AT, AT, BFD_RELOC_LO16);
5372               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5373                            tempreg, tempreg, AT);
5374             }
5375           relax_end ();
5376         }
5377       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
5378         {
5379           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5380           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5381           int add_breg_early = 0;
5382
5383           /* This is the large GOT case.  If this is a reference to an
5384              external symbol, and there is no constant, we want
5385                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5386                add      $tempreg,$tempreg,$gp
5387                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5388              or for lca or if tempreg is PIC_CALL_REG
5389                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5390                add      $tempreg,$tempreg,$gp
5391                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5392
5393              If we have a small constant, and this is a reference to
5394              an external symbol, we want
5395                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5396                add      $tempreg,$tempreg,$gp
5397                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5398                addi     $tempreg,$tempreg,<constant>
5399
5400              If we have a large constant, and this is a reference to
5401              an external symbol, we want
5402                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5403                addu     $tempreg,$tempreg,$gp
5404                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5405                lui      $at,<hiconstant>
5406                addi     $at,$at,<loconstant>
5407                add      $tempreg,$tempreg,$at
5408
5409              If we have NewABI, and we know it's a local symbol, we want
5410                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5411                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5412              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5413
5414           relax_start (offset_expr.X_add_symbol);
5415
5416           expr1.X_add_number = offset_expr.X_add_number;
5417           offset_expr.X_add_number = 0;
5418
5419           if (expr1.X_add_number == 0 && breg == 0
5420               && (call || tempreg == PIC_CALL_REG))
5421             {
5422               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5423               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5424             }
5425           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5426           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5427                        tempreg, tempreg, mips_gp_register);
5428           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5429                        tempreg, lw_reloc_type, tempreg);
5430
5431           if (expr1.X_add_number == 0)
5432             ;
5433           else if (expr1.X_add_number >= -0x8000
5434                    && expr1.X_add_number < 0x8000)
5435             {
5436               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5437                            tempreg, tempreg, BFD_RELOC_LO16);
5438             }
5439           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5440             {
5441               int dreg;
5442
5443               /* If we are going to add in a base register, and the
5444                  target register and the base register are the same,
5445                  then we are using AT as a temporary register.  Since
5446                  we want to load the constant into AT, we add our
5447                  current AT (from the global offset table) and the
5448                  register into the register now, and pretend we were
5449                  not using a base register.  */
5450               if (breg != treg)
5451                 dreg = tempreg;
5452               else
5453                 {
5454                   assert (tempreg == AT);
5455                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5456                                treg, AT, breg);
5457                   dreg = treg;
5458                   add_breg_early = 1;
5459                 }
5460
5461               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5462               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5463
5464               used_at = 1;
5465             }
5466           else
5467             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5468
5469           relax_switch ();
5470           offset_expr.X_add_number = expr1.X_add_number;
5471           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5472                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5473           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5474                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5475           if (add_breg_early)
5476             {
5477               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5478                            treg, tempreg, breg);
5479               breg = 0;
5480               tempreg = treg;
5481             }
5482           relax_end ();
5483         }
5484       else if (mips_pic == EMBEDDED_PIC)
5485         {
5486           /* We use
5487                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5488              */
5489           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5490                        mips_gp_register, BFD_RELOC_GPREL16);
5491         }
5492       else
5493         abort ();
5494
5495       if (breg != 0)
5496         {
5497           char *s;
5498
5499           if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5500             s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5501           else
5502             s = ADDRESS_ADD_INSN;
5503
5504           macro_build (NULL, s, "d,v,t", treg, tempreg, breg);
5505         }
5506
5507       if (! used_at)
5508         return;
5509
5510       break;
5511
5512     case M_J_A:
5513       /* The j instruction may not be used in PIC code, since it
5514          requires an absolute address.  We convert it to a b
5515          instruction.  */
5516       if (mips_pic == NO_PIC)
5517         macro_build (&offset_expr, "j", "a");
5518       else
5519         macro_build (&offset_expr, "b", "p");
5520       return;
5521
5522       /* The jal instructions must be handled as macros because when
5523          generating PIC code they expand to multi-instruction
5524          sequences.  Normally they are simple instructions.  */
5525     case M_JAL_1:
5526       dreg = RA;
5527       /* Fall through.  */
5528     case M_JAL_2:
5529       if (mips_pic == NO_PIC
5530           || mips_pic == EMBEDDED_PIC)
5531         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5532       else if (mips_pic == SVR4_PIC)
5533         {
5534           if (sreg != PIC_CALL_REG)
5535             as_warn (_("MIPS PIC call to register other than $25"));
5536
5537           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5538           if (! HAVE_NEWABI)
5539             {
5540               if (mips_cprestore_offset < 0)
5541                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5542               else
5543                 {
5544                   if (! mips_frame_reg_valid)
5545                     {
5546                       as_warn (_("No .frame pseudo-op used in PIC code"));
5547                       /* Quiet this warning.  */
5548                       mips_frame_reg_valid = 1;
5549                     }
5550                   if (! mips_cprestore_valid)
5551                     {
5552                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5553                       /* Quiet this warning.  */
5554                       mips_cprestore_valid = 1;
5555                     }
5556                   expr1.X_add_number = mips_cprestore_offset;
5557                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5558                                                 mips_gp_register,
5559                                                 mips_frame_reg,
5560                                                 HAVE_64BIT_ADDRESSES);
5561                 }
5562             }
5563         }
5564       else
5565         abort ();
5566
5567       return;
5568
5569     case M_JAL_A:
5570       if (mips_pic == NO_PIC)
5571         macro_build (&offset_expr, "jal", "a");
5572       else if (mips_pic == SVR4_PIC)
5573         {
5574           /* If this is a reference to an external symbol, and we are
5575              using a small GOT, we want
5576                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5577                nop
5578                jalr     $ra,$25
5579                nop
5580                lw       $gp,cprestore($sp)
5581              The cprestore value is set using the .cprestore
5582              pseudo-op.  If we are using a big GOT, we want
5583                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5584                addu     $25,$25,$gp
5585                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5586                nop
5587                jalr     $ra,$25
5588                nop
5589                lw       $gp,cprestore($sp)
5590              If the symbol is not external, we want
5591                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5592                nop
5593                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5594                jalr     $ra,$25
5595                nop
5596                lw $gp,cprestore($sp)
5597
5598              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5599              sequences above, minus nops, unless the symbol is local,
5600              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5601              GOT_DISP.  */
5602           if (HAVE_NEWABI)
5603             {
5604               if (! mips_big_got)
5605                 {
5606                   relax_start (offset_expr.X_add_symbol);
5607                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5608                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5609                                mips_gp_register);
5610                   relax_switch ();
5611                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5612                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5613                                mips_gp_register);
5614                   relax_end ();
5615                 }
5616               else
5617                 {
5618                   relax_start (offset_expr.X_add_symbol);
5619                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5620                                BFD_RELOC_MIPS_CALL_HI16);
5621                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5622                                PIC_CALL_REG, mips_gp_register);
5623                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5624                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5625                                PIC_CALL_REG);
5626                   relax_switch ();
5627                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5628                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5629                                mips_gp_register);
5630                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5631                                PIC_CALL_REG, PIC_CALL_REG,
5632                                BFD_RELOC_MIPS_GOT_OFST);
5633                   relax_end ();
5634                 }
5635
5636               macro_build_jalr (&offset_expr);
5637             }
5638           else
5639             {
5640               relax_start (offset_expr.X_add_symbol);
5641               if (! mips_big_got)
5642                 {
5643                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5644                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5645                                mips_gp_register);
5646                   macro_build (NULL, "nop", "");
5647                   relax_switch ();
5648                 }
5649               else
5650                 {
5651                   int gpdelay;
5652
5653                   gpdelay = reg_needs_delay (mips_gp_register);
5654                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5655                                BFD_RELOC_MIPS_CALL_HI16);
5656                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5657                                PIC_CALL_REG, mips_gp_register);
5658                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5659                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5660                                PIC_CALL_REG);
5661                   macro_build (NULL, "nop", "");
5662                   relax_switch ();
5663                   if (gpdelay)
5664                     macro_build (NULL, "nop", "");
5665                 }
5666               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5667                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5668                            mips_gp_register);
5669               macro_build (NULL, "nop", "");
5670               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5671                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5672               relax_end ();
5673               macro_build_jalr (&offset_expr);
5674
5675               if (mips_cprestore_offset < 0)
5676                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5677               else
5678                 {
5679                   if (! mips_frame_reg_valid)
5680                     {
5681                       as_warn (_("No .frame pseudo-op used in PIC code"));
5682                       /* Quiet this warning.  */
5683                       mips_frame_reg_valid = 1;
5684                     }
5685                   if (! mips_cprestore_valid)
5686                     {
5687                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5688                       /* Quiet this warning.  */
5689                       mips_cprestore_valid = 1;
5690                     }
5691                   if (mips_opts.noreorder)
5692                     macro_build (NULL, "nop", "");
5693                   expr1.X_add_number = mips_cprestore_offset;
5694                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5695                                                 mips_gp_register,
5696                                                 mips_frame_reg,
5697                                                 HAVE_64BIT_ADDRESSES);
5698                 }
5699             }
5700         }
5701       else if (mips_pic == EMBEDDED_PIC)
5702         {
5703           macro_build (&offset_expr, "bal", "p");
5704           /* The linker may expand the call to a longer sequence which
5705              uses $at, so we must break rather than return.  */
5706           break;
5707         }
5708       else
5709         abort ();
5710
5711       return;
5712
5713     case M_LB_AB:
5714       s = "lb";
5715       goto ld;
5716     case M_LBU_AB:
5717       s = "lbu";
5718       goto ld;
5719     case M_LH_AB:
5720       s = "lh";
5721       goto ld;
5722     case M_LHU_AB:
5723       s = "lhu";
5724       goto ld;
5725     case M_LW_AB:
5726       s = "lw";
5727       goto ld;
5728     case M_LWC0_AB:
5729       s = "lwc0";
5730       /* Itbl support may require additional care here.  */
5731       coproc = 1;
5732       goto ld;
5733     case M_LWC1_AB:
5734       s = "lwc1";
5735       /* Itbl support may require additional care here.  */
5736       coproc = 1;
5737       goto ld;
5738     case M_LWC2_AB:
5739       s = "lwc2";
5740       /* Itbl support may require additional care here.  */
5741       coproc = 1;
5742       goto ld;
5743     case M_LWC3_AB:
5744       s = "lwc3";
5745       /* Itbl support may require additional care here.  */
5746       coproc = 1;
5747       goto ld;
5748     case M_LWL_AB:
5749       s = "lwl";
5750       lr = 1;
5751       goto ld;
5752     case M_LWR_AB:
5753       s = "lwr";
5754       lr = 1;
5755       goto ld;
5756     case M_LDC1_AB:
5757       if (mips_opts.arch == CPU_R4650)
5758         {
5759           as_bad (_("opcode not supported on this processor"));
5760           return;
5761         }
5762       s = "ldc1";
5763       /* Itbl support may require additional care here.  */
5764       coproc = 1;
5765       goto ld;
5766     case M_LDC2_AB:
5767       s = "ldc2";
5768       /* Itbl support may require additional care here.  */
5769       coproc = 1;
5770       goto ld;
5771     case M_LDC3_AB:
5772       s = "ldc3";
5773       /* Itbl support may require additional care here.  */
5774       coproc = 1;
5775       goto ld;
5776     case M_LDL_AB:
5777       s = "ldl";
5778       lr = 1;
5779       goto ld;
5780     case M_LDR_AB:
5781       s = "ldr";
5782       lr = 1;
5783       goto ld;
5784     case M_LL_AB:
5785       s = "ll";
5786       goto ld;
5787     case M_LLD_AB:
5788       s = "lld";
5789       goto ld;
5790     case M_LWU_AB:
5791       s = "lwu";
5792     ld:
5793       if (breg == treg || coproc || lr)
5794         {
5795           tempreg = AT;
5796           used_at = 1;
5797         }
5798       else
5799         {
5800           tempreg = treg;
5801           used_at = 0;
5802         }
5803       goto ld_st;
5804     case M_SB_AB:
5805       s = "sb";
5806       goto st;
5807     case M_SH_AB:
5808       s = "sh";
5809       goto st;
5810     case M_SW_AB:
5811       s = "sw";
5812       goto st;
5813     case M_SWC0_AB:
5814       s = "swc0";
5815       /* Itbl support may require additional care here.  */
5816       coproc = 1;
5817       goto st;
5818     case M_SWC1_AB:
5819       s = "swc1";
5820       /* Itbl support may require additional care here.  */
5821       coproc = 1;
5822       goto st;
5823     case M_SWC2_AB:
5824       s = "swc2";
5825       /* Itbl support may require additional care here.  */
5826       coproc = 1;
5827       goto st;
5828     case M_SWC3_AB:
5829       s = "swc3";
5830       /* Itbl support may require additional care here.  */
5831       coproc = 1;
5832       goto st;
5833     case M_SWL_AB:
5834       s = "swl";
5835       goto st;
5836     case M_SWR_AB:
5837       s = "swr";
5838       goto st;
5839     case M_SC_AB:
5840       s = "sc";
5841       goto st;
5842     case M_SCD_AB:
5843       s = "scd";
5844       goto st;
5845     case M_SDC1_AB:
5846       if (mips_opts.arch == CPU_R4650)
5847         {
5848           as_bad (_("opcode not supported on this processor"));
5849           return;
5850         }
5851       s = "sdc1";
5852       coproc = 1;
5853       /* Itbl support may require additional care here.  */
5854       goto st;
5855     case M_SDC2_AB:
5856       s = "sdc2";
5857       /* Itbl support may require additional care here.  */
5858       coproc = 1;
5859       goto st;
5860     case M_SDC3_AB:
5861       s = "sdc3";
5862       /* Itbl support may require additional care here.  */
5863       coproc = 1;
5864       goto st;
5865     case M_SDL_AB:
5866       s = "sdl";
5867       goto st;
5868     case M_SDR_AB:
5869       s = "sdr";
5870     st:
5871       tempreg = AT;
5872       used_at = 1;
5873     ld_st:
5874       /* Itbl support may require additional care here.  */
5875       if (mask == M_LWC1_AB
5876           || mask == M_SWC1_AB
5877           || mask == M_LDC1_AB
5878           || mask == M_SDC1_AB
5879           || mask == M_L_DAB
5880           || mask == M_S_DAB)
5881         fmt = "T,o(b)";
5882       else if (coproc)
5883         fmt = "E,o(b)";
5884       else
5885         fmt = "t,o(b)";
5886
5887       /* Sign-extending 32-bit constants makes their handling easier.
5888          The HAVE_64BIT_GPRS... part is due to the linux kernel hack
5889          described below.  */
5890       if ((! HAVE_64BIT_ADDRESSES
5891            && (! HAVE_64BIT_GPRS && offset_expr.X_op == O_constant))
5892           && (offset_expr.X_op == O_constant)
5893           && ! ((offset_expr.X_add_number & ~((bfd_vma) 0x7fffffff))
5894                 == ~((bfd_vma) 0x7fffffff)))
5895         {
5896           if (offset_expr.X_add_number & ~((bfd_vma) 0xffffffff))
5897             as_bad (_("constant too large"));
5898
5899           offset_expr.X_add_number = (((offset_expr.X_add_number & 0xffffffff)
5900                                        ^ 0x80000000) - 0x80000000);
5901         }
5902
5903       /* For embedded PIC, we allow loads where the offset is calculated
5904          by subtracting a symbol in the current segment from an unknown
5905          symbol, relative to a base register, e.g.:
5906                 <op>    $treg, <sym>-<localsym>($breg)
5907          This is used by the compiler for switch statements.  */
5908       if (mips_pic == EMBEDDED_PIC
5909           && offset_expr.X_op == O_subtract
5910           && (symbol_constant_p (offset_expr.X_op_symbol)
5911               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
5912               : (symbol_equated_p (offset_expr.X_op_symbol)
5913                  && (S_GET_SEGMENT
5914                      (symbol_get_value_expression (offset_expr.X_op_symbol)
5915                       ->X_add_symbol)
5916                      == now_seg)))
5917           && breg != 0
5918           && (offset_expr.X_add_number == 0
5919               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
5920         {
5921           /* For this case, we output the instructions:
5922                 lui     $tempreg,<sym>          (BFD_RELOC_PCREL_HI16_S)
5923                 addiu   $tempreg,$tempreg,$breg
5924                 <op>    $treg,<sym>($tempreg)   (BFD_RELOC_PCREL_LO16)
5925              If the relocation would fit entirely in 16 bits, it would be
5926              nice to emit:
5927                 <op>    $treg,<sym>($breg)      (BFD_RELOC_PCREL_LO16)
5928              instead, but that seems quite difficult.  */
5929           macro_build (&offset_expr, "lui", "t,u", tempreg,
5930                        BFD_RELOC_PCREL_HI16_S);
5931           macro_build (NULL,
5932                        ((bfd_arch_bits_per_address (stdoutput) == 32
5933                          || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
5934                         ? "addu" : "daddu"),
5935                        "d,v,t", tempreg, tempreg, breg);
5936           macro_build (&offset_expr, s, fmt, treg,
5937                        BFD_RELOC_PCREL_LO16, tempreg);
5938           if (! used_at)
5939             return;
5940           break;
5941         }
5942
5943       if (offset_expr.X_op != O_constant
5944           && offset_expr.X_op != O_symbol)
5945         {
5946           as_bad (_("expression too complex"));
5947           offset_expr.X_op = O_constant;
5948         }
5949
5950       /* A constant expression in PIC code can be handled just as it
5951          is in non PIC code.  */
5952       if (mips_pic == NO_PIC
5953           || offset_expr.X_op == O_constant)
5954         {
5955           /* If this is a reference to a GP relative symbol, and there
5956              is no base register, we want
5957                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5958              Otherwise, if there is no base register, we want
5959                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5960                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5961              If we have a constant, we need two instructions anyhow,
5962              so we always use the latter form.
5963
5964              If we have a base register, and this is a reference to a
5965              GP relative symbol, we want
5966                addu     $tempreg,$breg,$gp
5967                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5968              Otherwise we want
5969                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5970                addu     $tempreg,$tempreg,$breg
5971                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5972              With a constant we always use the latter case.
5973
5974              With 64bit address space and no base register and $at usable,
5975              we want
5976                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5977                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5978                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5979                dsll32   $tempreg,0
5980                daddu    $tempreg,$at
5981                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5982              If we have a base register, we want
5983                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5984                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5985                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5986                daddu    $at,$breg
5987                dsll32   $tempreg,0
5988                daddu    $tempreg,$at
5989                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5990
5991              Without $at we can't generate the optimal path for superscalar
5992              processors here since this would require two temporary registers.
5993                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5994                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5995                dsll     $tempreg,16
5996                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5997                dsll     $tempreg,16
5998                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5999              If we have a base register, we want
6000                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6001                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6002                dsll     $tempreg,16
6003                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6004                dsll     $tempreg,16
6005                daddu    $tempreg,$tempreg,$breg
6006                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6007
6008              If we have 64-bit addresses, as an optimization, for
6009              addresses which are 32-bit constants (e.g. kseg0/kseg1
6010              addresses) we fall back to the 32-bit address generation
6011              mechanism since it is more efficient.  Note that due to
6012              the signed offset used by memory operations, the 32-bit
6013              range is shifted down by 32768 here.  This code should
6014              probably attempt to generate 64-bit constants more
6015              efficiently in general.
6016
6017              As an extension for architectures with 64-bit registers,
6018              we don't truncate 64-bit addresses given as literal
6019              constants down to 32 bits, to support existing practice
6020              in the mips64 Linux (the kernel), that compiles source
6021              files with -mabi=64, assembling them as o32 or n32 (with
6022              -Wa,-32 or -Wa,-n32).  This is not beautiful, but since
6023              the whole kernel is loaded into a memory region that is
6024              addressable with sign-extended 32-bit addresses, it is
6025              wasteful to compute the upper 32 bits of every
6026              non-literal address, that takes more space and time.
6027              Some day this should probably be implemented as an
6028              assembler option, such that the kernel doesn't have to
6029              use such ugly hacks, even though it will still have to
6030              end up converting the binary to ELF32 for a number of
6031              platforms whose boot loaders don't support ELF64
6032              binaries.  */
6033           if ((HAVE_64BIT_ADDRESSES
6034                && ! (offset_expr.X_op == O_constant
6035                      && IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
6036               || (HAVE_64BIT_GPRS
6037                   && offset_expr.X_op == O_constant
6038                   && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
6039             {
6040               /* ??? We don't provide a GP-relative alternative for
6041                  these macros.  It used not to be possible with the
6042                  original relaxation code, but it could be done now.  */
6043
6044               if (used_at == 0 && ! mips_opts.noat)
6045                 {
6046                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6047                                BFD_RELOC_MIPS_HIGHEST);
6048                   macro_build (&offset_expr, "lui", "t,u", AT,
6049                                BFD_RELOC_HI16_S);
6050                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6051                                tempreg, BFD_RELOC_MIPS_HIGHER);
6052                   if (breg != 0)
6053                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6054                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6055                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6056                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6057                                tempreg);
6058                   used_at = 1;
6059                 }
6060               else
6061                 {
6062                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6063                                BFD_RELOC_MIPS_HIGHEST);
6064                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6065                                tempreg, BFD_RELOC_MIPS_HIGHER);
6066                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6067                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6068                                tempreg, BFD_RELOC_HI16_S);
6069                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6070                   if (breg != 0)
6071                     macro_build (NULL, "daddu", "d,v,t",
6072                                  tempreg, tempreg, breg);
6073                   macro_build (&offset_expr, s, fmt, treg,
6074                                BFD_RELOC_LO16, tempreg);
6075                 }
6076
6077               return;
6078             }
6079
6080           if (offset_expr.X_op == O_constant
6081               && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000))
6082             as_bad (_("load/store address overflow (max 32 bits)"));
6083
6084           if (breg == 0)
6085             {
6086               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6087                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
6088                 {
6089                   relax_start (offset_expr.X_add_symbol);
6090                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6091                                mips_gp_register);
6092                   relax_switch ();
6093                   used_at = 0;
6094                 }
6095               macro_build_lui (&offset_expr, tempreg);
6096               macro_build (&offset_expr, s, fmt, treg,
6097                            BFD_RELOC_LO16, tempreg);
6098               if (mips_relax.sequence)
6099                 relax_end ();
6100             }
6101           else
6102             {
6103               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6104                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
6105                 {
6106                   relax_start (offset_expr.X_add_symbol);
6107                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6108                                tempreg, breg, mips_gp_register);
6109                   macro_build (&offset_expr, s, fmt, treg,
6110                                BFD_RELOC_GPREL16, tempreg);
6111                   relax_switch ();
6112                 }
6113               macro_build_lui (&offset_expr, tempreg);
6114               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6115                            tempreg, tempreg, breg);
6116               macro_build (&offset_expr, s, fmt, treg,
6117                            BFD_RELOC_LO16, tempreg);
6118               if (mips_relax.sequence)
6119                 relax_end ();
6120             }
6121         }
6122       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6123         {
6124           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6125
6126           /* If this is a reference to an external symbol, we want
6127                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6128                nop
6129                <op>     $treg,0($tempreg)
6130              Otherwise we want
6131                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6132                nop
6133                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6134                <op>     $treg,0($tempreg)
6135
6136              For NewABI, we want
6137                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6138                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6139
6140              If there is a base register, we add it to $tempreg before
6141              the <op>.  If there is a constant, we stick it in the
6142              <op> instruction.  We don't handle constants larger than
6143              16 bits, because we have no way to load the upper 16 bits
6144              (actually, we could handle them for the subset of cases
6145              in which we are not using $at).  */
6146           assert (offset_expr.X_op == O_symbol);
6147           if (HAVE_NEWABI)
6148             {
6149               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6150                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6151               if (breg != 0)
6152                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6153                              tempreg, tempreg, breg);
6154               macro_build (&offset_expr, s, fmt, treg,
6155                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6156
6157               if (! used_at)
6158                 return;
6159
6160               break;
6161             }
6162           expr1.X_add_number = offset_expr.X_add_number;
6163           offset_expr.X_add_number = 0;
6164           if (expr1.X_add_number < -0x8000
6165               || expr1.X_add_number >= 0x8000)
6166             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6167           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6168                        lw_reloc_type, mips_gp_register);
6169           macro_build (NULL, "nop", "");
6170           relax_start (offset_expr.X_add_symbol);
6171           relax_switch ();
6172           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6173                        tempreg, BFD_RELOC_LO16);
6174           relax_end ();
6175           if (breg != 0)
6176             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6177                          tempreg, tempreg, breg);
6178           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6179         }
6180       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
6181         {
6182           int gpdelay;
6183
6184           /* If this is a reference to an external symbol, we want
6185                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6186                addu     $tempreg,$tempreg,$gp
6187                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6188                <op>     $treg,0($tempreg)
6189              Otherwise we want
6190                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6191                nop
6192                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6193                <op>     $treg,0($tempreg)
6194              If there is a base register, we add it to $tempreg before
6195              the <op>.  If there is a constant, we stick it in the
6196              <op> instruction.  We don't handle constants larger than
6197              16 bits, because we have no way to load the upper 16 bits
6198              (actually, we could handle them for the subset of cases
6199              in which we are not using $at).  */
6200           assert (offset_expr.X_op == O_symbol);
6201           expr1.X_add_number = offset_expr.X_add_number;
6202           offset_expr.X_add_number = 0;
6203           if (expr1.X_add_number < -0x8000
6204               || expr1.X_add_number >= 0x8000)
6205             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6206           gpdelay = reg_needs_delay (mips_gp_register);
6207           relax_start (offset_expr.X_add_symbol);
6208           macro_build (&offset_expr, "lui", "t,u", tempreg,
6209                        BFD_RELOC_MIPS_GOT_HI16);
6210           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6211                        mips_gp_register);
6212           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6213                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6214           relax_switch ();
6215           if (gpdelay)
6216             macro_build (NULL, "nop", "");
6217           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6218                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6219           macro_build (NULL, "nop", "");
6220           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6221                        tempreg, BFD_RELOC_LO16);
6222           relax_end ();
6223
6224           if (breg != 0)
6225             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6226                          tempreg, tempreg, breg);
6227           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6228         }
6229       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
6230         {
6231           /* If this is a reference to an external symbol, we want
6232                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6233                add      $tempreg,$tempreg,$gp
6234                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6235                <op>     $treg,<ofst>($tempreg)
6236              Otherwise, for local symbols, we want:
6237                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6238                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6239           assert (offset_expr.X_op == O_symbol);
6240           expr1.X_add_number = offset_expr.X_add_number;
6241           offset_expr.X_add_number = 0;
6242           if (expr1.X_add_number < -0x8000
6243               || expr1.X_add_number >= 0x8000)
6244             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6245           relax_start (offset_expr.X_add_symbol);
6246           macro_build (&offset_expr, "lui", "t,u", tempreg,
6247                        BFD_RELOC_MIPS_GOT_HI16);
6248           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6249                        mips_gp_register);
6250           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6251                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6252           if (breg != 0)
6253             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6254                          tempreg, tempreg, breg);
6255           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6256
6257           relax_switch ();
6258           offset_expr.X_add_number = expr1.X_add_number;
6259           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6260                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6261           if (breg != 0)
6262             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6263                          tempreg, tempreg, breg);
6264           macro_build (&offset_expr, s, fmt, treg,
6265                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6266           relax_end ();
6267         }
6268       else if (mips_pic == EMBEDDED_PIC)
6269         {
6270           /* If there is no base register, we want
6271                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6272              If there is a base register, we want
6273                addu     $tempreg,$breg,$gp
6274                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6275              */
6276           assert (offset_expr.X_op == O_symbol);
6277           if (breg == 0)
6278             {
6279               macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6280                            mips_gp_register);
6281               used_at = 0;
6282             }
6283           else
6284             {
6285               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6286                            tempreg, breg, mips_gp_register);
6287               macro_build (&offset_expr, s, fmt, treg,
6288                            BFD_RELOC_GPREL16, tempreg);
6289             }
6290         }
6291       else
6292         abort ();
6293
6294       if (! used_at)
6295         return;
6296
6297       break;
6298
6299     case M_LI:
6300     case M_LI_S:
6301       load_register (treg, &imm_expr, 0);
6302       return;
6303
6304     case M_DLI:
6305       load_register (treg, &imm_expr, 1);
6306       return;
6307
6308     case M_LI_SS:
6309       if (imm_expr.X_op == O_constant)
6310         {
6311           load_register (AT, &imm_expr, 0);
6312           macro_build (NULL, "mtc1", "t,G", AT, treg);
6313           break;
6314         }
6315       else
6316         {
6317           assert (offset_expr.X_op == O_symbol
6318                   && strcmp (segment_name (S_GET_SEGMENT
6319                                            (offset_expr.X_add_symbol)),
6320                              ".lit4") == 0
6321                   && offset_expr.X_add_number == 0);
6322           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6323                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6324           return;
6325         }
6326
6327     case M_LI_D:
6328       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6329          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6330          order 32 bits of the value and the low order 32 bits are either
6331          zero or in OFFSET_EXPR.  */
6332       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6333         {
6334           if (HAVE_64BIT_GPRS)
6335             load_register (treg, &imm_expr, 1);
6336           else
6337             {
6338               int hreg, lreg;
6339
6340               if (target_big_endian)
6341                 {
6342                   hreg = treg;
6343                   lreg = treg + 1;
6344                 }
6345               else
6346                 {
6347                   hreg = treg + 1;
6348                   lreg = treg;
6349                 }
6350
6351               if (hreg <= 31)
6352                 load_register (hreg, &imm_expr, 0);
6353               if (lreg <= 31)
6354                 {
6355                   if (offset_expr.X_op == O_absent)
6356                     move_register (lreg, 0);
6357                   else
6358                     {
6359                       assert (offset_expr.X_op == O_constant);
6360                       load_register (lreg, &offset_expr, 0);
6361                     }
6362                 }
6363             }
6364           return;
6365         }
6366
6367       /* We know that sym is in the .rdata section.  First we get the
6368          upper 16 bits of the address.  */
6369       if (mips_pic == NO_PIC)
6370         {
6371           macro_build_lui (&offset_expr, AT);
6372         }
6373       else if (mips_pic == SVR4_PIC)
6374         {
6375           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6376                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6377         }
6378       else if (mips_pic == EMBEDDED_PIC)
6379         {
6380           /* For embedded PIC we pick up the entire address off $gp in
6381              a single instruction.  */
6382           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", AT,
6383                        mips_gp_register, BFD_RELOC_GPREL16);
6384           offset_expr.X_op = O_constant;
6385           offset_expr.X_add_number = 0;
6386         }
6387       else
6388         abort ();
6389
6390       /* Now we load the register(s).  */
6391       if (HAVE_64BIT_GPRS)
6392         macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6393       else
6394         {
6395           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6396           if (treg != RA)
6397             {
6398               /* FIXME: How in the world do we deal with the possible
6399                  overflow here?  */
6400               offset_expr.X_add_number += 4;
6401               macro_build (&offset_expr, "lw", "t,o(b)",
6402                            treg + 1, BFD_RELOC_LO16, AT);
6403             }
6404         }
6405       break;
6406
6407     case M_LI_DD:
6408       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6409          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6410          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6411          the value and the low order 32 bits are either zero or in
6412          OFFSET_EXPR.  */
6413       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6414         {
6415           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6416           if (HAVE_64BIT_FPRS)
6417             {
6418               assert (HAVE_64BIT_GPRS);
6419               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6420             }
6421           else
6422             {
6423               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6424               if (offset_expr.X_op == O_absent)
6425                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6426               else
6427                 {
6428                   assert (offset_expr.X_op == O_constant);
6429                   load_register (AT, &offset_expr, 0);
6430                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6431                 }
6432             }
6433           break;
6434         }
6435
6436       assert (offset_expr.X_op == O_symbol
6437               && offset_expr.X_add_number == 0);
6438       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6439       if (strcmp (s, ".lit8") == 0)
6440         {
6441           if (mips_opts.isa != ISA_MIPS1)
6442             {
6443               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6444                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6445               return;
6446             }
6447           breg = mips_gp_register;
6448           r = BFD_RELOC_MIPS_LITERAL;
6449           goto dob;
6450         }
6451       else
6452         {
6453           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6454           if (mips_pic == SVR4_PIC)
6455             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6456                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6457           else
6458             {
6459               /* FIXME: This won't work for a 64 bit address.  */
6460               macro_build_lui (&offset_expr, AT);
6461             }
6462
6463           if (mips_opts.isa != ISA_MIPS1)
6464             {
6465               macro_build (&offset_expr, "ldc1", "T,o(b)",
6466                            treg, BFD_RELOC_LO16, AT);
6467               break;
6468             }
6469           breg = AT;
6470           r = BFD_RELOC_LO16;
6471           goto dob;
6472         }
6473
6474     case M_L_DOB:
6475       if (mips_opts.arch == CPU_R4650)
6476         {
6477           as_bad (_("opcode not supported on this processor"));
6478           return;
6479         }
6480       /* Even on a big endian machine $fn comes before $fn+1.  We have
6481          to adjust when loading from memory.  */
6482       r = BFD_RELOC_LO16;
6483     dob:
6484       assert (mips_opts.isa == ISA_MIPS1);
6485       macro_build (&offset_expr, "lwc1", "T,o(b)",
6486                    target_big_endian ? treg + 1 : treg, r, breg);
6487       /* FIXME: A possible overflow which I don't know how to deal
6488          with.  */
6489       offset_expr.X_add_number += 4;
6490       macro_build (&offset_expr, "lwc1", "T,o(b)",
6491                    target_big_endian ? treg : treg + 1, r, breg);
6492
6493       if (breg != AT)
6494         return;
6495       break;
6496
6497     case M_L_DAB:
6498       /*
6499        * The MIPS assembler seems to check for X_add_number not
6500        * being double aligned and generating:
6501        *        lui     at,%hi(foo+1)
6502        *        addu    at,at,v1
6503        *        addiu   at,at,%lo(foo+1)
6504        *        lwc1    f2,0(at)
6505        *        lwc1    f3,4(at)
6506        * But, the resulting address is the same after relocation so why
6507        * generate the extra instruction?
6508        */
6509       if (mips_opts.arch == CPU_R4650)
6510         {
6511           as_bad (_("opcode not supported on this processor"));
6512           return;
6513         }
6514       /* Itbl support may require additional care here.  */
6515       coproc = 1;
6516       if (mips_opts.isa != ISA_MIPS1)
6517         {
6518           s = "ldc1";
6519           goto ld;
6520         }
6521
6522       s = "lwc1";
6523       fmt = "T,o(b)";
6524       goto ldd_std;
6525
6526     case M_S_DAB:
6527       if (mips_opts.arch == CPU_R4650)
6528         {
6529           as_bad (_("opcode not supported on this processor"));
6530           return;
6531         }
6532
6533       if (mips_opts.isa != ISA_MIPS1)
6534         {
6535           s = "sdc1";
6536           goto st;
6537         }
6538
6539       s = "swc1";
6540       fmt = "T,o(b)";
6541       /* Itbl support may require additional care here.  */
6542       coproc = 1;
6543       goto ldd_std;
6544
6545     case M_LD_AB:
6546       if (HAVE_64BIT_GPRS)
6547         {
6548           s = "ld";
6549           goto ld;
6550         }
6551
6552       s = "lw";
6553       fmt = "t,o(b)";
6554       goto ldd_std;
6555
6556     case M_SD_AB:
6557       if (HAVE_64BIT_GPRS)
6558         {
6559           s = "sd";
6560           goto st;
6561         }
6562
6563       s = "sw";
6564       fmt = "t,o(b)";
6565
6566     ldd_std:
6567       /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6568          loads for the case of doing a pair of loads to simulate an 'ld'.
6569          This is not currently done by the compiler, and assembly coders
6570          writing embedded-pic code can cope.  */
6571
6572       if (offset_expr.X_op != O_symbol
6573           && offset_expr.X_op != O_constant)
6574         {
6575           as_bad (_("expression too complex"));
6576           offset_expr.X_op = O_constant;
6577         }
6578
6579       /* Even on a big endian machine $fn comes before $fn+1.  We have
6580          to adjust when loading from memory.  We set coproc if we must
6581          load $fn+1 first.  */
6582       /* Itbl support may require additional care here.  */
6583       if (! target_big_endian)
6584         coproc = 0;
6585
6586       if (mips_pic == NO_PIC
6587           || offset_expr.X_op == O_constant)
6588         {
6589           /* If this is a reference to a GP relative symbol, we want
6590                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6591                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6592              If we have a base register, we use this
6593                addu     $at,$breg,$gp
6594                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6595                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6596              If this is not a GP relative symbol, we want
6597                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6598                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6599                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6600              If there is a base register, we add it to $at after the
6601              lui instruction.  If there is a constant, we always use
6602              the last case.  */
6603           if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6604               || nopic_need_relax (offset_expr.X_add_symbol, 1))
6605             used_at = 1;
6606           else
6607             {
6608               relax_start (offset_expr.X_add_symbol);
6609               if (breg == 0)
6610                 {
6611                   tempreg = mips_gp_register;
6612                   used_at = 0;
6613                 }
6614               else
6615                 {
6616                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6617                                AT, breg, mips_gp_register);
6618                   tempreg = AT;
6619                   used_at = 1;
6620                 }
6621
6622               /* Itbl support may require additional care here.  */
6623               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6624                            BFD_RELOC_GPREL16, tempreg);
6625               offset_expr.X_add_number += 4;
6626
6627               /* Set mips_optimize to 2 to avoid inserting an
6628                  undesired nop.  */
6629               hold_mips_optimize = mips_optimize;
6630               mips_optimize = 2;
6631               /* Itbl support may require additional care here.  */
6632               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6633                            BFD_RELOC_GPREL16, tempreg);
6634               mips_optimize = hold_mips_optimize;
6635
6636               relax_switch ();
6637
6638               /* We just generated two relocs.  When tc_gen_reloc
6639                  handles this case, it will skip the first reloc and
6640                  handle the second.  The second reloc already has an
6641                  extra addend of 4, which we added above.  We must
6642                  subtract it out, and then subtract another 4 to make
6643                  the first reloc come out right.  The second reloc
6644                  will come out right because we are going to add 4 to
6645                  offset_expr when we build its instruction below.
6646
6647                  If we have a symbol, then we don't want to include
6648                  the offset, because it will wind up being included
6649                  when we generate the reloc.  */
6650
6651               if (offset_expr.X_op == O_constant)
6652                 offset_expr.X_add_number -= 8;
6653               else
6654                 {
6655                   offset_expr.X_add_number = -4;
6656                   offset_expr.X_op = O_constant;
6657                 }
6658             }
6659           macro_build_lui (&offset_expr, AT);
6660           if (breg != 0)
6661             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6662           /* Itbl support may require additional care here.  */
6663           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6664                        BFD_RELOC_LO16, AT);
6665           /* FIXME: How do we handle overflow here?  */
6666           offset_expr.X_add_number += 4;
6667           /* Itbl support may require additional care here.  */
6668           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6669                        BFD_RELOC_LO16, AT);
6670           if (mips_relax.sequence)
6671             relax_end ();
6672         }
6673       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6674         {
6675           /* If this is a reference to an external symbol, we want
6676                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6677                nop
6678                <op>     $treg,0($at)
6679                <op>     $treg+1,4($at)
6680              Otherwise we want
6681                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6682                nop
6683                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6684                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6685              If there is a base register we add it to $at before the
6686              lwc1 instructions.  If there is a constant we include it
6687              in the lwc1 instructions.  */
6688           used_at = 1;
6689           expr1.X_add_number = offset_expr.X_add_number;
6690           if (expr1.X_add_number < -0x8000
6691               || expr1.X_add_number >= 0x8000 - 4)
6692             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6693           load_got_offset (AT, &offset_expr);
6694           macro_build (NULL, "nop", "");
6695           if (breg != 0)
6696             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6697
6698           /* Set mips_optimize to 2 to avoid inserting an undesired
6699              nop.  */
6700           hold_mips_optimize = mips_optimize;
6701           mips_optimize = 2;
6702
6703           /* Itbl support may require additional care here.  */
6704           relax_start (offset_expr.X_add_symbol);
6705           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6706                        BFD_RELOC_LO16, AT);
6707           expr1.X_add_number += 4;
6708           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6709                        BFD_RELOC_LO16, AT);
6710           relax_switch ();
6711           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6712                        BFD_RELOC_LO16, AT);
6713           offset_expr.X_add_number += 4;
6714           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6715                        BFD_RELOC_LO16, AT);
6716           relax_end ();
6717
6718           mips_optimize = hold_mips_optimize;
6719         }
6720       else if (mips_pic == SVR4_PIC)
6721         {
6722           int gpdelay;
6723
6724           /* If this is a reference to an external symbol, we want
6725                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6726                addu     $at,$at,$gp
6727                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6728                nop
6729                <op>     $treg,0($at)
6730                <op>     $treg+1,4($at)
6731              Otherwise we want
6732                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6733                nop
6734                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6735                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6736              If there is a base register we add it to $at before the
6737              lwc1 instructions.  If there is a constant we include it
6738              in the lwc1 instructions.  */
6739           used_at = 1;
6740           expr1.X_add_number = offset_expr.X_add_number;
6741           offset_expr.X_add_number = 0;
6742           if (expr1.X_add_number < -0x8000
6743               || expr1.X_add_number >= 0x8000 - 4)
6744             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6745           gpdelay = reg_needs_delay (mips_gp_register);
6746           relax_start (offset_expr.X_add_symbol);
6747           macro_build (&offset_expr, "lui", "t,u",
6748                        AT, BFD_RELOC_MIPS_GOT_HI16);
6749           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6750                        AT, AT, mips_gp_register);
6751           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6752                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6753           macro_build (NULL, "nop", "");
6754           if (breg != 0)
6755             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6756           /* Itbl support may require additional care here.  */
6757           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6758                        BFD_RELOC_LO16, AT);
6759           expr1.X_add_number += 4;
6760
6761           /* Set mips_optimize to 2 to avoid inserting an undesired
6762              nop.  */
6763           hold_mips_optimize = mips_optimize;
6764           mips_optimize = 2;
6765           /* Itbl support may require additional care here.  */
6766           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6767                        BFD_RELOC_LO16, AT);
6768           mips_optimize = hold_mips_optimize;
6769           expr1.X_add_number -= 4;
6770
6771           relax_switch ();
6772           offset_expr.X_add_number = expr1.X_add_number;
6773           if (gpdelay)
6774             macro_build (NULL, "nop", "");
6775           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6776                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6777           macro_build (NULL, "nop", "");
6778           if (breg != 0)
6779             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6780           /* Itbl support may require additional care here.  */
6781           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6782                        BFD_RELOC_LO16, AT);
6783           offset_expr.X_add_number += 4;
6784
6785           /* Set mips_optimize to 2 to avoid inserting an undesired
6786              nop.  */
6787           hold_mips_optimize = mips_optimize;
6788           mips_optimize = 2;
6789           /* Itbl support may require additional care here.  */
6790           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6791                        BFD_RELOC_LO16, AT);
6792           mips_optimize = hold_mips_optimize;
6793           relax_end ();
6794         }
6795       else if (mips_pic == EMBEDDED_PIC)
6796         {
6797           /* If there is no base register, we use
6798                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6799                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6800              If we have a base register, we use
6801                addu     $at,$breg,$gp
6802                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6803                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6804              */
6805           if (breg == 0)
6806             {
6807               tempreg = mips_gp_register;
6808               used_at = 0;
6809             }
6810           else
6811             {
6812               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6813                            AT, breg, mips_gp_register);
6814               tempreg = AT;
6815               used_at = 1;
6816             }
6817
6818           /* Itbl support may require additional care here.  */
6819           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6820                        BFD_RELOC_GPREL16, tempreg);
6821           offset_expr.X_add_number += 4;
6822           /* Itbl support may require additional care here.  */
6823           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6824                        BFD_RELOC_GPREL16, tempreg);
6825         }
6826       else
6827         abort ();
6828
6829       if (! used_at)
6830         return;
6831
6832       break;
6833
6834     case M_LD_OB:
6835       s = "lw";
6836       goto sd_ob;
6837     case M_SD_OB:
6838       s = "sw";
6839     sd_ob:
6840       assert (HAVE_32BIT_ADDRESSES);
6841       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6842       offset_expr.X_add_number += 4;
6843       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6844       return;
6845
6846    /* New code added to support COPZ instructions.
6847       This code builds table entries out of the macros in mip_opcodes.
6848       R4000 uses interlocks to handle coproc delays.
6849       Other chips (like the R3000) require nops to be inserted for delays.
6850
6851       FIXME: Currently, we require that the user handle delays.
6852       In order to fill delay slots for non-interlocked chips,
6853       we must have a way to specify delays based on the coprocessor.
6854       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6855       What are the side-effects of the cop instruction?
6856       What cache support might we have and what are its effects?
6857       Both coprocessor & memory require delays. how long???
6858       What registers are read/set/modified?
6859
6860       If an itbl is provided to interpret cop instructions,
6861       this knowledge can be encoded in the itbl spec.  */
6862
6863     case M_COP0:
6864       s = "c0";
6865       goto copz;
6866     case M_COP1:
6867       s = "c1";
6868       goto copz;
6869     case M_COP2:
6870       s = "c2";
6871       goto copz;
6872     case M_COP3:
6873       s = "c3";
6874     copz:
6875       /* For now we just do C (same as Cz).  The parameter will be
6876          stored in insn_opcode by mips_ip.  */
6877       macro_build (NULL, s, "C", ip->insn_opcode);
6878       return;
6879
6880     case M_MOVE:
6881       move_register (dreg, sreg);
6882       return;
6883
6884 #ifdef LOSING_COMPILER
6885     default:
6886       /* Try and see if this is a new itbl instruction.
6887          This code builds table entries out of the macros in mip_opcodes.
6888          FIXME: For now we just assemble the expression and pass it's
6889          value along as a 32-bit immediate.
6890          We may want to have the assembler assemble this value,
6891          so that we gain the assembler's knowledge of delay slots,
6892          symbols, etc.
6893          Would it be more efficient to use mask (id) here? */
6894       if (itbl_have_entries
6895           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6896         {
6897           s = ip->insn_mo->name;
6898           s2 = "cop3";
6899           coproc = ITBL_DECODE_PNUM (immed_expr);;
6900           macro_build (&immed_expr, s, "C");
6901           return;
6902         }
6903       macro2 (ip);
6904       return;
6905     }
6906   if (mips_opts.noat)
6907     as_warn (_("Macro used $at after \".set noat\""));
6908 }
6909
6910 static void
6911 macro2 (struct mips_cl_insn *ip)
6912 {
6913   register int treg, sreg, dreg, breg;
6914   int tempreg;
6915   int mask;
6916   int used_at;
6917   expressionS expr1;
6918   const char *s;
6919   const char *s2;
6920   const char *fmt;
6921   int likely = 0;
6922   int dbl = 0;
6923   int coproc = 0;
6924   int lr = 0;
6925   int imm = 0;
6926   int off;
6927   offsetT maxnum;
6928   bfd_reloc_code_real_type r;
6929
6930   treg = (ip->insn_opcode >> 16) & 0x1f;
6931   dreg = (ip->insn_opcode >> 11) & 0x1f;
6932   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6933   mask = ip->insn_mo->mask;
6934
6935   expr1.X_op = O_constant;
6936   expr1.X_op_symbol = NULL;
6937   expr1.X_add_symbol = NULL;
6938   expr1.X_add_number = 1;
6939
6940   switch (mask)
6941     {
6942 #endif /* LOSING_COMPILER */
6943
6944     case M_DMUL:
6945       dbl = 1;
6946     case M_MUL:
6947       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6948       macro_build (NULL, "mflo", "d", dreg);
6949       return;
6950
6951     case M_DMUL_I:
6952       dbl = 1;
6953     case M_MUL_I:
6954       /* The MIPS assembler some times generates shifts and adds.  I'm
6955          not trying to be that fancy. GCC should do this for us
6956          anyway.  */
6957       load_register (AT, &imm_expr, dbl);
6958       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
6959       macro_build (NULL, "mflo", "d", dreg);
6960       break;
6961
6962     case M_DMULO_I:
6963       dbl = 1;
6964     case M_MULO_I:
6965       imm = 1;
6966       goto do_mulo;
6967
6968     case M_DMULO:
6969       dbl = 1;
6970     case M_MULO:
6971     do_mulo:
6972       mips_emit_delays (TRUE);
6973       ++mips_opts.noreorder;
6974       mips_any_noreorder = 1;
6975       if (imm)
6976         load_register (AT, &imm_expr, dbl);
6977       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6978       macro_build (NULL, "mflo", "d", dreg);
6979       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
6980       macro_build (NULL, "mfhi", "d", AT);
6981       if (mips_trap)
6982         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
6983       else
6984         {
6985           expr1.X_add_number = 8;
6986           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
6987           macro_build (NULL, "nop", "", 0);
6988           macro_build (NULL, "break", "c", 6);
6989         }
6990       --mips_opts.noreorder;
6991       macro_build (NULL, "mflo", "d", dreg);
6992       break;
6993
6994     case M_DMULOU_I:
6995       dbl = 1;
6996     case M_MULOU_I:
6997       imm = 1;
6998       goto do_mulou;
6999
7000     case M_DMULOU:
7001       dbl = 1;
7002     case M_MULOU:
7003     do_mulou:
7004       mips_emit_delays (TRUE);
7005       ++mips_opts.noreorder;
7006       mips_any_noreorder = 1;
7007       if (imm)
7008         load_register (AT, &imm_expr, dbl);
7009       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7010                    sreg, imm ? AT : treg);
7011       macro_build (NULL, "mfhi", "d", AT);
7012       macro_build (NULL, "mflo", "d", dreg);
7013       if (mips_trap)
7014         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7015       else
7016         {
7017           expr1.X_add_number = 8;
7018           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7019           macro_build (NULL, "nop", "", 0);
7020           macro_build (NULL, "break", "c", 6);
7021         }
7022       --mips_opts.noreorder;
7023       break;
7024
7025     case M_DROL:
7026       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7027         {
7028           if (dreg == sreg)
7029             {
7030               tempreg = AT;
7031               used_at = 1;
7032             }
7033           else
7034             {
7035               tempreg = dreg;
7036               used_at = 0;
7037             }
7038           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7039           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7040           if (used_at)
7041             break;
7042           return;
7043         }
7044       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7045       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7046       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7047       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7048       break;
7049
7050     case M_ROL:
7051       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7052         {
7053           if (dreg == sreg)
7054             {
7055               tempreg = AT;
7056               used_at = 1;
7057             }
7058           else
7059             {
7060               tempreg = dreg;
7061               used_at = 0;
7062             }
7063           macro_build (NULL, "negu", "d,w", tempreg, treg);
7064           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7065           if (used_at)
7066             break;
7067           return;
7068         }
7069       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7070       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7071       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7072       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7073       break;
7074
7075     case M_DROL_I:
7076       {
7077         unsigned int rot;
7078         char *l, *r;
7079
7080         if (imm_expr.X_op != O_constant)
7081           as_bad (_("Improper rotate count"));
7082         rot = imm_expr.X_add_number & 0x3f;
7083         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7084           {
7085             rot = (64 - rot) & 0x3f;
7086             if (rot >= 32)
7087               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7088             else
7089               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7090             return;
7091           }
7092         if (rot == 0)
7093           {
7094             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7095             return;
7096           }
7097         l = (rot < 0x20) ? "dsll" : "dsll32";
7098         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7099         rot &= 0x1f;
7100         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7101         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7102         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7103       }
7104       break;
7105
7106     case M_ROL_I:
7107       {
7108         unsigned int rot;
7109
7110         if (imm_expr.X_op != O_constant)
7111           as_bad (_("Improper rotate count"));
7112         rot = imm_expr.X_add_number & 0x1f;
7113         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7114           {
7115             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7116             return;
7117           }
7118         if (rot == 0)
7119           {
7120             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7121             return;
7122           }
7123         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7124         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7125         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7126       }
7127       break;
7128
7129     case M_DROR:
7130       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7131         {
7132           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7133           return;
7134         }
7135       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7136       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7137       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7138       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7139       break;
7140
7141     case M_ROR:
7142       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7143         {
7144           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7145           return;
7146         }
7147       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7148       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7149       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7150       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7151       break;
7152
7153     case M_DROR_I:
7154       {
7155         unsigned int rot;
7156         char *l, *r;
7157
7158         if (imm_expr.X_op != O_constant)
7159           as_bad (_("Improper rotate count"));
7160         rot = imm_expr.X_add_number & 0x3f;
7161         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7162           {
7163             if (rot >= 32)
7164               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7165             else
7166               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7167             return;
7168           }
7169         if (rot == 0)
7170           {
7171             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7172             return;
7173           }
7174         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7175         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7176         rot &= 0x1f;
7177         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7178         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7179         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7180       }
7181       break;
7182
7183     case M_ROR_I:
7184       {
7185         unsigned int rot;
7186
7187         if (imm_expr.X_op != O_constant)
7188           as_bad (_("Improper rotate count"));
7189         rot = imm_expr.X_add_number & 0x1f;
7190         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7191           {
7192             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7193             return;
7194           }
7195         if (rot == 0)
7196           {
7197             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7198             return;
7199           }
7200         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7201         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7202         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7203       }
7204       break;
7205
7206     case M_S_DOB:
7207       if (mips_opts.arch == CPU_R4650)
7208         {
7209           as_bad (_("opcode not supported on this processor"));
7210           return;
7211         }
7212       assert (mips_opts.isa == ISA_MIPS1);
7213       /* Even on a big endian machine $fn comes before $fn+1.  We have
7214          to adjust when storing to memory.  */
7215       macro_build (&offset_expr, "swc1", "T,o(b)",
7216                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7217       offset_expr.X_add_number += 4;
7218       macro_build (&offset_expr, "swc1", "T,o(b)",
7219                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7220       return;
7221
7222     case M_SEQ:
7223       if (sreg == 0)
7224         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7225       else if (treg == 0)
7226         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7227       else
7228         {
7229           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7230           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7231         }
7232       return;
7233
7234     case M_SEQ_I:
7235       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7236         {
7237           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7238           return;
7239         }
7240       if (sreg == 0)
7241         {
7242           as_warn (_("Instruction %s: result is always false"),
7243                    ip->insn_mo->name);
7244           move_register (dreg, 0);
7245           return;
7246         }
7247       if (imm_expr.X_op == O_constant
7248           && imm_expr.X_add_number >= 0
7249           && imm_expr.X_add_number < 0x10000)
7250         {
7251           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7252           used_at = 0;
7253         }
7254       else if (imm_expr.X_op == O_constant
7255                && imm_expr.X_add_number > -0x8000
7256                && imm_expr.X_add_number < 0)
7257         {
7258           imm_expr.X_add_number = -imm_expr.X_add_number;
7259           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7260                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7261           used_at = 0;
7262         }
7263       else
7264         {
7265           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7266           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7267           used_at = 1;
7268         }
7269       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7270       if (used_at)
7271         break;
7272       return;
7273
7274     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7275       s = "slt";
7276       goto sge;
7277     case M_SGEU:
7278       s = "sltu";
7279     sge:
7280       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7281       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7282       return;
7283
7284     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7285     case M_SGEU_I:
7286       if (imm_expr.X_op == O_constant
7287           && imm_expr.X_add_number >= -0x8000
7288           && imm_expr.X_add_number < 0x8000)
7289         {
7290           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7291                        dreg, sreg, BFD_RELOC_LO16);
7292           used_at = 0;
7293         }
7294       else
7295         {
7296           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7297           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7298                        dreg, sreg, AT);
7299           used_at = 1;
7300         }
7301       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7302       if (used_at)
7303         break;
7304       return;
7305
7306     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7307       s = "slt";
7308       goto sgt;
7309     case M_SGTU:
7310       s = "sltu";
7311     sgt:
7312       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7313       return;
7314
7315     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7316       s = "slt";
7317       goto sgti;
7318     case M_SGTU_I:
7319       s = "sltu";
7320     sgti:
7321       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7322       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7323       break;
7324
7325     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7326       s = "slt";
7327       goto sle;
7328     case M_SLEU:
7329       s = "sltu";
7330     sle:
7331       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7332       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7333       return;
7334
7335     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7336       s = "slt";
7337       goto slei;
7338     case M_SLEU_I:
7339       s = "sltu";
7340     slei:
7341       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7342       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7343       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7344       break;
7345
7346     case M_SLT_I:
7347       if (imm_expr.X_op == O_constant
7348           && imm_expr.X_add_number >= -0x8000
7349           && imm_expr.X_add_number < 0x8000)
7350         {
7351           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7352           return;
7353         }
7354       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7355       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7356       break;
7357
7358     case M_SLTU_I:
7359       if (imm_expr.X_op == O_constant
7360           && imm_expr.X_add_number >= -0x8000
7361           && imm_expr.X_add_number < 0x8000)
7362         {
7363           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7364                        BFD_RELOC_LO16);
7365           return;
7366         }
7367       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7368       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7369       break;
7370
7371     case M_SNE:
7372       if (sreg == 0)
7373         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7374       else if (treg == 0)
7375         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7376       else
7377         {
7378           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7379           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7380         }
7381       return;
7382
7383     case M_SNE_I:
7384       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7385         {
7386           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7387           return;
7388         }
7389       if (sreg == 0)
7390         {
7391           as_warn (_("Instruction %s: result is always true"),
7392                    ip->insn_mo->name);
7393           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7394                        dreg, 0, BFD_RELOC_LO16);
7395           return;
7396         }
7397       if (imm_expr.X_op == O_constant
7398           && imm_expr.X_add_number >= 0
7399           && imm_expr.X_add_number < 0x10000)
7400         {
7401           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7402           used_at = 0;
7403         }
7404       else if (imm_expr.X_op == O_constant
7405                && imm_expr.X_add_number > -0x8000
7406                && imm_expr.X_add_number < 0)
7407         {
7408           imm_expr.X_add_number = -imm_expr.X_add_number;
7409           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7410                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7411           used_at = 0;
7412         }
7413       else
7414         {
7415           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7416           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7417           used_at = 1;
7418         }
7419       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7420       if (used_at)
7421         break;
7422       return;
7423
7424     case M_DSUB_I:
7425       dbl = 1;
7426     case M_SUB_I:
7427       if (imm_expr.X_op == O_constant
7428           && imm_expr.X_add_number > -0x8000
7429           && imm_expr.X_add_number <= 0x8000)
7430         {
7431           imm_expr.X_add_number = -imm_expr.X_add_number;
7432           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7433                        dreg, sreg, BFD_RELOC_LO16);
7434           return;
7435         }
7436       load_register (AT, &imm_expr, dbl);
7437       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7438       break;
7439
7440     case M_DSUBU_I:
7441       dbl = 1;
7442     case M_SUBU_I:
7443       if (imm_expr.X_op == O_constant
7444           && imm_expr.X_add_number > -0x8000
7445           && imm_expr.X_add_number <= 0x8000)
7446         {
7447           imm_expr.X_add_number = -imm_expr.X_add_number;
7448           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7449                        dreg, sreg, BFD_RELOC_LO16);
7450           return;
7451         }
7452       load_register (AT, &imm_expr, dbl);
7453       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7454       break;
7455
7456     case M_TEQ_I:
7457       s = "teq";
7458       goto trap;
7459     case M_TGE_I:
7460       s = "tge";
7461       goto trap;
7462     case M_TGEU_I:
7463       s = "tgeu";
7464       goto trap;
7465     case M_TLT_I:
7466       s = "tlt";
7467       goto trap;
7468     case M_TLTU_I:
7469       s = "tltu";
7470       goto trap;
7471     case M_TNE_I:
7472       s = "tne";
7473     trap:
7474       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7475       macro_build (NULL, s, "s,t", sreg, AT);
7476       break;
7477
7478     case M_TRUNCWS:
7479     case M_TRUNCWD:
7480       assert (mips_opts.isa == ISA_MIPS1);
7481       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7482       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7483
7484       /*
7485        * Is the double cfc1 instruction a bug in the mips assembler;
7486        * or is there a reason for it?
7487        */
7488       mips_emit_delays (TRUE);
7489       ++mips_opts.noreorder;
7490       mips_any_noreorder = 1;
7491       macro_build (NULL, "cfc1", "t,G", treg, RA);
7492       macro_build (NULL, "cfc1", "t,G", treg, RA);
7493       macro_build (NULL, "nop", "");
7494       expr1.X_add_number = 3;
7495       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7496       expr1.X_add_number = 2;
7497       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7498       macro_build (NULL, "ctc1", "t,G", AT, RA);
7499       macro_build (NULL, "nop", "");
7500       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7501                    dreg, sreg);
7502       macro_build (NULL, "ctc1", "t,G", treg, RA);
7503       macro_build (NULL, "nop", "");
7504       --mips_opts.noreorder;
7505       break;
7506
7507     case M_ULH:
7508       s = "lb";
7509       goto ulh;
7510     case M_ULHU:
7511       s = "lbu";
7512     ulh:
7513       if (offset_expr.X_add_number >= 0x7fff)
7514         as_bad (_("operand overflow"));
7515       if (! target_big_endian)
7516         ++offset_expr.X_add_number;
7517       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7518       if (! target_big_endian)
7519         --offset_expr.X_add_number;
7520       else
7521         ++offset_expr.X_add_number;
7522       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7523       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7524       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7525       break;
7526
7527     case M_ULD:
7528       s = "ldl";
7529       s2 = "ldr";
7530       off = 7;
7531       goto ulw;
7532     case M_ULW:
7533       s = "lwl";
7534       s2 = "lwr";
7535       off = 3;
7536     ulw:
7537       if (offset_expr.X_add_number >= 0x8000 - off)
7538         as_bad (_("operand overflow"));
7539       if (treg != breg)
7540         tempreg = treg;
7541       else
7542         tempreg = AT;
7543       if (! target_big_endian)
7544         offset_expr.X_add_number += off;
7545       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7546       if (! target_big_endian)
7547         offset_expr.X_add_number -= off;
7548       else
7549         offset_expr.X_add_number += off;
7550       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7551
7552       /* If necessary, move the result in tempreg the final destination.  */
7553       if (treg == tempreg)
7554         return;
7555       /* Protect second load's delay slot.  */
7556       if (!gpr_interlocks)
7557         macro_build (NULL, "nop", "");
7558       move_register (treg, tempreg);
7559       break;
7560
7561     case M_ULD_A:
7562       s = "ldl";
7563       s2 = "ldr";
7564       off = 7;
7565       goto ulwa;
7566     case M_ULW_A:
7567       s = "lwl";
7568       s2 = "lwr";
7569       off = 3;
7570     ulwa:
7571       used_at = 1;
7572       load_address (AT, &offset_expr, &used_at);
7573       if (breg != 0)
7574         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7575       if (! target_big_endian)
7576         expr1.X_add_number = off;
7577       else
7578         expr1.X_add_number = 0;
7579       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7580       if (! target_big_endian)
7581         expr1.X_add_number = 0;
7582       else
7583         expr1.X_add_number = off;
7584       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7585       break;
7586
7587     case M_ULH_A:
7588     case M_ULHU_A:
7589       used_at = 1;
7590       load_address (AT, &offset_expr, &used_at);
7591       if (breg != 0)
7592         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7593       if (target_big_endian)
7594         expr1.X_add_number = 0;
7595       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7596                    treg, BFD_RELOC_LO16, AT);
7597       if (target_big_endian)
7598         expr1.X_add_number = 1;
7599       else
7600         expr1.X_add_number = 0;
7601       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7602       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7603       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7604       break;
7605
7606     case M_USH:
7607       if (offset_expr.X_add_number >= 0x7fff)
7608         as_bad (_("operand overflow"));
7609       if (target_big_endian)
7610         ++offset_expr.X_add_number;
7611       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7612       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7613       if (target_big_endian)
7614         --offset_expr.X_add_number;
7615       else
7616         ++offset_expr.X_add_number;
7617       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7618       break;
7619
7620     case M_USD:
7621       s = "sdl";
7622       s2 = "sdr";
7623       off = 7;
7624       goto usw;
7625     case M_USW:
7626       s = "swl";
7627       s2 = "swr";
7628       off = 3;
7629     usw:
7630       if (offset_expr.X_add_number >= 0x8000 - off)
7631         as_bad (_("operand overflow"));
7632       if (! target_big_endian)
7633         offset_expr.X_add_number += off;
7634       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7635       if (! target_big_endian)
7636         offset_expr.X_add_number -= off;
7637       else
7638         offset_expr.X_add_number += off;
7639       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7640       return;
7641
7642     case M_USD_A:
7643       s = "sdl";
7644       s2 = "sdr";
7645       off = 7;
7646       goto uswa;
7647     case M_USW_A:
7648       s = "swl";
7649       s2 = "swr";
7650       off = 3;
7651     uswa:
7652       used_at = 1;
7653       load_address (AT, &offset_expr, &used_at);
7654       if (breg != 0)
7655         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7656       if (! target_big_endian)
7657         expr1.X_add_number = off;
7658       else
7659         expr1.X_add_number = 0;
7660       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7661       if (! target_big_endian)
7662         expr1.X_add_number = 0;
7663       else
7664         expr1.X_add_number = off;
7665       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7666       break;
7667
7668     case M_USH_A:
7669       used_at = 1;
7670       load_address (AT, &offset_expr, &used_at);
7671       if (breg != 0)
7672         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7673       if (! target_big_endian)
7674         expr1.X_add_number = 0;
7675       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7676       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7677       if (! target_big_endian)
7678         expr1.X_add_number = 1;
7679       else
7680         expr1.X_add_number = 0;
7681       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7682       if (! target_big_endian)
7683         expr1.X_add_number = 0;
7684       else
7685         expr1.X_add_number = 1;
7686       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7687       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7688       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7689       break;
7690
7691     default:
7692       /* FIXME: Check if this is one of the itbl macros, since they
7693          are added dynamically.  */
7694       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7695       break;
7696     }
7697   if (mips_opts.noat)
7698     as_warn (_("Macro used $at after \".set noat\""));
7699 }
7700
7701 /* Implement macros in mips16 mode.  */
7702
7703 static void
7704 mips16_macro (struct mips_cl_insn *ip)
7705 {
7706   int mask;
7707   int xreg, yreg, zreg, tmp;
7708   expressionS expr1;
7709   int dbl;
7710   const char *s, *s2, *s3;
7711
7712   mask = ip->insn_mo->mask;
7713
7714   xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7715   yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7716   zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7717
7718   expr1.X_op = O_constant;
7719   expr1.X_op_symbol = NULL;
7720   expr1.X_add_symbol = NULL;
7721   expr1.X_add_number = 1;
7722
7723   dbl = 0;
7724
7725   switch (mask)
7726     {
7727     default:
7728       internalError ();
7729
7730     case M_DDIV_3:
7731       dbl = 1;
7732     case M_DIV_3:
7733       s = "mflo";
7734       goto do_div3;
7735     case M_DREM_3:
7736       dbl = 1;
7737     case M_REM_3:
7738       s = "mfhi";
7739     do_div3:
7740       mips_emit_delays (TRUE);
7741       ++mips_opts.noreorder;
7742       mips_any_noreorder = 1;
7743       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7744       expr1.X_add_number = 2;
7745       macro_build (&expr1, "bnez", "x,p", yreg);
7746       macro_build (NULL, "break", "6", 7);
7747
7748       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7749          since that causes an overflow.  We should do that as well,
7750          but I don't see how to do the comparisons without a temporary
7751          register.  */
7752       --mips_opts.noreorder;
7753       macro_build (NULL, s, "x", zreg);
7754       break;
7755
7756     case M_DIVU_3:
7757       s = "divu";
7758       s2 = "mflo";
7759       goto do_divu3;
7760     case M_REMU_3:
7761       s = "divu";
7762       s2 = "mfhi";
7763       goto do_divu3;
7764     case M_DDIVU_3:
7765       s = "ddivu";
7766       s2 = "mflo";
7767       goto do_divu3;
7768     case M_DREMU_3:
7769       s = "ddivu";
7770       s2 = "mfhi";
7771     do_divu3:
7772       mips_emit_delays (TRUE);
7773       ++mips_opts.noreorder;
7774       mips_any_noreorder = 1;
7775       macro_build (NULL, s, "0,x,y", xreg, yreg);
7776       expr1.X_add_number = 2;
7777       macro_build (&expr1, "bnez", "x,p", yreg);
7778       macro_build (NULL, "break", "6", 7);
7779       --mips_opts.noreorder;
7780       macro_build (NULL, s2, "x", zreg);
7781       break;
7782
7783     case M_DMUL:
7784       dbl = 1;
7785     case M_MUL:
7786       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7787       macro_build (NULL, "mflo", "x", zreg);
7788       return;
7789
7790     case M_DSUBU_I:
7791       dbl = 1;
7792       goto do_subu;
7793     case M_SUBU_I:
7794     do_subu:
7795       if (imm_expr.X_op != O_constant)
7796         as_bad (_("Unsupported large constant"));
7797       imm_expr.X_add_number = -imm_expr.X_add_number;
7798       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7799       break;
7800
7801     case M_SUBU_I_2:
7802       if (imm_expr.X_op != O_constant)
7803         as_bad (_("Unsupported large constant"));
7804       imm_expr.X_add_number = -imm_expr.X_add_number;
7805       macro_build (&imm_expr, "addiu", "x,k", xreg);
7806       break;
7807
7808     case M_DSUBU_I_2:
7809       if (imm_expr.X_op != O_constant)
7810         as_bad (_("Unsupported large constant"));
7811       imm_expr.X_add_number = -imm_expr.X_add_number;
7812       macro_build (&imm_expr, "daddiu", "y,j", yreg);
7813       break;
7814
7815     case M_BEQ:
7816       s = "cmp";
7817       s2 = "bteqz";
7818       goto do_branch;
7819     case M_BNE:
7820       s = "cmp";
7821       s2 = "btnez";
7822       goto do_branch;
7823     case M_BLT:
7824       s = "slt";
7825       s2 = "btnez";
7826       goto do_branch;
7827     case M_BLTU:
7828       s = "sltu";
7829       s2 = "btnez";
7830       goto do_branch;
7831     case M_BLE:
7832       s = "slt";
7833       s2 = "bteqz";
7834       goto do_reverse_branch;
7835     case M_BLEU:
7836       s = "sltu";
7837       s2 = "bteqz";
7838       goto do_reverse_branch;
7839     case M_BGE:
7840       s = "slt";
7841       s2 = "bteqz";
7842       goto do_branch;
7843     case M_BGEU:
7844       s = "sltu";
7845       s2 = "bteqz";
7846       goto do_branch;
7847     case M_BGT:
7848       s = "slt";
7849       s2 = "btnez";
7850       goto do_reverse_branch;
7851     case M_BGTU:
7852       s = "sltu";
7853       s2 = "btnez";
7854
7855     do_reverse_branch:
7856       tmp = xreg;
7857       xreg = yreg;
7858       yreg = tmp;
7859
7860     do_branch:
7861       macro_build (NULL, s, "x,y", xreg, yreg);
7862       macro_build (&offset_expr, s2, "p");
7863       break;
7864
7865     case M_BEQ_I:
7866       s = "cmpi";
7867       s2 = "bteqz";
7868       s3 = "x,U";
7869       goto do_branch_i;
7870     case M_BNE_I:
7871       s = "cmpi";
7872       s2 = "btnez";
7873       s3 = "x,U";
7874       goto do_branch_i;
7875     case M_BLT_I:
7876       s = "slti";
7877       s2 = "btnez";
7878       s3 = "x,8";
7879       goto do_branch_i;
7880     case M_BLTU_I:
7881       s = "sltiu";
7882       s2 = "btnez";
7883       s3 = "x,8";
7884       goto do_branch_i;
7885     case M_BLE_I:
7886       s = "slti";
7887       s2 = "btnez";
7888       s3 = "x,8";
7889       goto do_addone_branch_i;
7890     case M_BLEU_I:
7891       s = "sltiu";
7892       s2 = "btnez";
7893       s3 = "x,8";
7894       goto do_addone_branch_i;
7895     case M_BGE_I:
7896       s = "slti";
7897       s2 = "bteqz";
7898       s3 = "x,8";
7899       goto do_branch_i;
7900     case M_BGEU_I:
7901       s = "sltiu";
7902       s2 = "bteqz";
7903       s3 = "x,8";
7904       goto do_branch_i;
7905     case M_BGT_I:
7906       s = "slti";
7907       s2 = "bteqz";
7908       s3 = "x,8";
7909       goto do_addone_branch_i;
7910     case M_BGTU_I:
7911       s = "sltiu";
7912       s2 = "bteqz";
7913       s3 = "x,8";
7914
7915     do_addone_branch_i:
7916       if (imm_expr.X_op != O_constant)
7917         as_bad (_("Unsupported large constant"));
7918       ++imm_expr.X_add_number;
7919
7920     do_branch_i:
7921       macro_build (&imm_expr, s, s3, xreg);
7922       macro_build (&offset_expr, s2, "p");
7923       break;
7924
7925     case M_ABS:
7926       expr1.X_add_number = 0;
7927       macro_build (&expr1, "slti", "x,8", yreg);
7928       if (xreg != yreg)
7929         move_register (xreg, yreg);
7930       expr1.X_add_number = 2;
7931       macro_build (&expr1, "bteqz", "p");
7932       macro_build (NULL, "neg", "x,w", xreg, xreg);
7933     }
7934 }
7935
7936 /* For consistency checking, verify that all bits are specified either
7937    by the match/mask part of the instruction definition, or by the
7938    operand list.  */
7939 static int
7940 validate_mips_insn (const struct mips_opcode *opc)
7941 {
7942   const char *p = opc->args;
7943   char c;
7944   unsigned long used_bits = opc->mask;
7945
7946   if ((used_bits & opc->match) != opc->match)
7947     {
7948       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
7949               opc->name, opc->args);
7950       return 0;
7951     }
7952 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
7953   while (*p)
7954     switch (c = *p++)
7955       {
7956       case ',': break;
7957       case '(': break;
7958       case ')': break;
7959       case '+':
7960         switch (c = *p++)
7961           {
7962           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7963           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7964           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7965           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
7966                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
7967           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7968           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7969           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7970           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7971           case 'I': break;
7972           default:
7973             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
7974                     c, opc->name, opc->args);
7975             return 0;
7976           }
7977         break;
7978       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7979       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7980       case 'A': break;
7981       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
7982       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
7983       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7984       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7985       case 'F': break;
7986       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7987       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
7988       case 'I': break;
7989       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
7990       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7991       case 'L': break;
7992       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
7993       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
7994       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
7995       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
7996                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7997       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
7998       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7999       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8000       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8001       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8002       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8003       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8004       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8005       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8006       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8007       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8008       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8009       case 'f': break;
8010       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8011       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8012       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8013       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8014       case 'l': break;
8015       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8016       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8017       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8018       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8019       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8020       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8021       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8022       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8023       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8024       case 'x': break;
8025       case 'z': break;
8026       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8027       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8028                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8029       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8030       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8031       case '[': break;
8032       case ']': break;
8033       default:
8034         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8035                 c, opc->name, opc->args);
8036         return 0;
8037       }
8038 #undef USE_BITS
8039   if (used_bits != 0xffffffff)
8040     {
8041       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8042               ~used_bits & 0xffffffff, opc->name, opc->args);
8043       return 0;
8044     }
8045   return 1;
8046 }
8047
8048 /* This routine assembles an instruction into its binary format.  As a
8049    side effect, it sets one of the global variables imm_reloc or
8050    offset_reloc to the type of relocation to do if one of the operands
8051    is an address expression.  */
8052
8053 static void
8054 mips_ip (char *str, struct mips_cl_insn *ip)
8055 {
8056   char *s;
8057   const char *args;
8058   char c = 0;
8059   struct mips_opcode *insn;
8060   char *argsStart;
8061   unsigned int regno;
8062   unsigned int lastregno = 0;
8063   unsigned int lastpos = 0;
8064   unsigned int limlo, limhi;
8065   char *s_reset;
8066   char save_c = 0;
8067
8068   insn_error = NULL;
8069
8070   /* If the instruction contains a '.', we first try to match an instruction
8071      including the '.'.  Then we try again without the '.'.  */
8072   insn = NULL;
8073   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8074     continue;
8075
8076   /* If we stopped on whitespace, then replace the whitespace with null for
8077      the call to hash_find.  Save the character we replaced just in case we
8078      have to re-parse the instruction.  */
8079   if (ISSPACE (*s))
8080     {
8081       save_c = *s;
8082       *s++ = '\0';
8083     }
8084
8085   insn = (struct mips_opcode *) hash_find (op_hash, str);
8086
8087   /* If we didn't find the instruction in the opcode table, try again, but
8088      this time with just the instruction up to, but not including the
8089      first '.'.  */
8090   if (insn == NULL)
8091     {
8092       /* Restore the character we overwrite above (if any).  */
8093       if (save_c)
8094         *(--s) = save_c;
8095
8096       /* Scan up to the first '.' or whitespace.  */
8097       for (s = str;
8098            *s != '\0' && *s != '.' && !ISSPACE (*s);
8099            ++s)
8100         continue;
8101
8102       /* If we did not find a '.', then we can quit now.  */
8103       if (*s != '.')
8104         {
8105           insn_error = "unrecognized opcode";
8106           return;
8107         }
8108
8109       /* Lookup the instruction in the hash table.  */
8110       *s++ = '\0';
8111       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8112         {
8113           insn_error = "unrecognized opcode";
8114           return;
8115         }
8116     }
8117
8118   argsStart = s;
8119   for (;;)
8120     {
8121       bfd_boolean ok;
8122
8123       assert (strcmp (insn->name, str) == 0);
8124
8125       if (OPCODE_IS_MEMBER (insn,
8126                             (mips_opts.isa
8127                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8128                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8129                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8130                             mips_opts.arch))
8131         ok = TRUE;
8132       else
8133         ok = FALSE;
8134
8135       if (insn->pinfo != INSN_MACRO)
8136         {
8137           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8138             ok = FALSE;
8139         }
8140
8141       if (! ok)
8142         {
8143           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8144               && strcmp (insn->name, insn[1].name) == 0)
8145             {
8146               ++insn;
8147               continue;
8148             }
8149           else
8150             {
8151               if (!insn_error)
8152                 {
8153                   static char buf[100];
8154                   sprintf (buf,
8155                            _("opcode not supported on this processor: %s (%s)"),
8156                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8157                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8158                   insn_error = buf;
8159                 }
8160               if (save_c)
8161                 *(--s) = save_c;
8162               return;
8163             }
8164         }
8165
8166       ip->insn_mo = insn;
8167       ip->insn_opcode = insn->match;
8168       insn_error = NULL;
8169       for (args = insn->args;; ++args)
8170         {
8171           int is_mdmx;
8172
8173           s += strspn (s, " \t");
8174           is_mdmx = 0;
8175           switch (*args)
8176             {
8177             case '\0':          /* end of args */
8178               if (*s == '\0')
8179                 return;
8180               break;
8181
8182             case ',':
8183               if (*s++ == *args)
8184                 continue;
8185               s--;
8186               switch (*++args)
8187                 {
8188                 case 'r':
8189                 case 'v':
8190                   ip->insn_opcode |= lastregno << OP_SH_RS;
8191                   continue;
8192
8193                 case 'w':
8194                   ip->insn_opcode |= lastregno << OP_SH_RT;
8195                   continue;
8196
8197                 case 'W':
8198                   ip->insn_opcode |= lastregno << OP_SH_FT;
8199                   continue;
8200
8201                 case 'V':
8202                   ip->insn_opcode |= lastregno << OP_SH_FS;
8203                   continue;
8204                 }
8205               break;
8206
8207             case '(':
8208               /* Handle optional base register.
8209                  Either the base register is omitted or
8210                  we must have a left paren.  */
8211               /* This is dependent on the next operand specifier
8212                  is a base register specification.  */
8213               assert (args[1] == 'b' || args[1] == '5'
8214                       || args[1] == '-' || args[1] == '4');
8215               if (*s == '\0')
8216                 return;
8217
8218             case ')':           /* these must match exactly */
8219             case '[':
8220             case ']':
8221               if (*s++ == *args)
8222                 continue;
8223               break;
8224
8225             case '+':           /* Opcode extension character.  */
8226               switch (*++args)
8227                 {
8228                 case 'A':               /* ins/ext position, becomes LSB.  */
8229                   limlo = 0;
8230                   limhi = 31;
8231                   goto do_lsb;
8232                 case 'E':
8233                   limlo = 32;
8234                   limhi = 63;
8235                   goto do_lsb;
8236 do_lsb:
8237                   my_getExpression (&imm_expr, s);
8238                   check_absolute_expr (ip, &imm_expr);
8239                   if ((unsigned long) imm_expr.X_add_number < limlo
8240                       || (unsigned long) imm_expr.X_add_number > limhi)
8241                     {
8242                       as_bad (_("Improper position (%lu)"),
8243                               (unsigned long) imm_expr.X_add_number);
8244                       imm_expr.X_add_number = limlo;
8245                     }
8246                   lastpos = imm_expr.X_add_number;
8247                   ip->insn_opcode |= (imm_expr.X_add_number
8248                                       & OP_MASK_SHAMT) << OP_SH_SHAMT;
8249                   imm_expr.X_op = O_absent;
8250                   s = expr_end;
8251                   continue;
8252
8253                 case 'B':               /* ins size, becomes MSB.  */
8254                   limlo = 1;
8255                   limhi = 32;
8256                   goto do_msb;
8257                 case 'F':
8258                   limlo = 33;
8259                   limhi = 64;
8260                   goto do_msb;
8261 do_msb:
8262                   my_getExpression (&imm_expr, s);
8263                   check_absolute_expr (ip, &imm_expr);
8264                   /* Check for negative input so that small negative numbers
8265                      will not succeed incorrectly.  The checks against
8266                      (pos+size) transitively check "size" itself,
8267                      assuming that "pos" is reasonable.  */
8268                   if ((long) imm_expr.X_add_number < 0
8269                       || ((unsigned long) imm_expr.X_add_number
8270                           + lastpos) < limlo
8271                       || ((unsigned long) imm_expr.X_add_number
8272                           + lastpos) > limhi)
8273                     {
8274                       as_bad (_("Improper insert size (%lu, position %lu)"),
8275                               (unsigned long) imm_expr.X_add_number,
8276                               (unsigned long) lastpos);
8277                       imm_expr.X_add_number = limlo - lastpos;
8278                     }
8279                   ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8280                                       & OP_MASK_INSMSB) << OP_SH_INSMSB;
8281                   imm_expr.X_op = O_absent;
8282                   s = expr_end;
8283                   continue;
8284
8285                 case 'C':               /* ext size, becomes MSBD.  */
8286                   limlo = 1;
8287                   limhi = 32;
8288                   goto do_msbd;
8289                 case 'G':
8290                   limlo = 33;
8291                   limhi = 64;
8292                   goto do_msbd;
8293                 case 'H':
8294                   limlo = 33;
8295                   limhi = 64;
8296                   goto do_msbd;
8297 do_msbd:
8298                   my_getExpression (&imm_expr, s);
8299                   check_absolute_expr (ip, &imm_expr);
8300                   /* Check for negative input so that small negative numbers
8301                      will not succeed incorrectly.  The checks against
8302                      (pos+size) transitively check "size" itself,
8303                      assuming that "pos" is reasonable.  */
8304                   if ((long) imm_expr.X_add_number < 0
8305                       || ((unsigned long) imm_expr.X_add_number
8306                           + lastpos) < limlo
8307                       || ((unsigned long) imm_expr.X_add_number
8308                           + lastpos) > limhi)
8309                     {
8310                       as_bad (_("Improper extract size (%lu, position %lu)"),
8311                               (unsigned long) imm_expr.X_add_number,
8312                               (unsigned long) lastpos);
8313                       imm_expr.X_add_number = limlo - lastpos;
8314                     }
8315                   ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8316                                       & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8317                   imm_expr.X_op = O_absent;
8318                   s = expr_end;
8319                   continue;
8320
8321                 case 'D':
8322                   /* +D is for disassembly only; never match.  */
8323                   break;
8324
8325                 case 'I':
8326                   /* "+I" is like "I", except that imm2_expr is used.  */
8327                   my_getExpression (&imm2_expr, s);
8328                   if (imm2_expr.X_op != O_big
8329                       && imm2_expr.X_op != O_constant)
8330                   insn_error = _("absolute expression required");
8331                   normalize_constant_expr (&imm2_expr);
8332                   s = expr_end;
8333                   continue;
8334
8335                 default:
8336                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8337                     *args, insn->name, insn->args);
8338                   /* Further processing is fruitless.  */
8339                   return;
8340                 }
8341               break;
8342
8343             case '<':           /* must be at least one digit */
8344               /*
8345                * According to the manual, if the shift amount is greater
8346                * than 31 or less than 0, then the shift amount should be
8347                * mod 32.  In reality the mips assembler issues an error.
8348                * We issue a warning and mask out all but the low 5 bits.
8349                */
8350               my_getExpression (&imm_expr, s);
8351               check_absolute_expr (ip, &imm_expr);
8352               if ((unsigned long) imm_expr.X_add_number > 31)
8353                 {
8354                   as_warn (_("Improper shift amount (%lu)"),
8355                            (unsigned long) imm_expr.X_add_number);
8356                   imm_expr.X_add_number &= OP_MASK_SHAMT;
8357                 }
8358               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8359               imm_expr.X_op = O_absent;
8360               s = expr_end;
8361               continue;
8362
8363             case '>':           /* shift amount minus 32 */
8364               my_getExpression (&imm_expr, s);
8365               check_absolute_expr (ip, &imm_expr);
8366               if ((unsigned long) imm_expr.X_add_number < 32
8367                   || (unsigned long) imm_expr.X_add_number > 63)
8368                 break;
8369               ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8370               imm_expr.X_op = O_absent;
8371               s = expr_end;
8372               continue;
8373
8374             case 'k':           /* cache code */
8375             case 'h':           /* prefx code */
8376               my_getExpression (&imm_expr, s);
8377               check_absolute_expr (ip, &imm_expr);
8378               if ((unsigned long) imm_expr.X_add_number > 31)
8379                 {
8380                   as_warn (_("Invalid value for `%s' (%lu)"),
8381                            ip->insn_mo->name,
8382                            (unsigned long) imm_expr.X_add_number);
8383                   imm_expr.X_add_number &= 0x1f;
8384                 }
8385               if (*args == 'k')
8386                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8387               else
8388                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8389               imm_expr.X_op = O_absent;
8390               s = expr_end;
8391               continue;
8392
8393             case 'c':           /* break code */
8394               my_getExpression (&imm_expr, s);
8395               check_absolute_expr (ip, &imm_expr);
8396               if ((unsigned long) imm_expr.X_add_number > 1023)
8397                 {
8398                   as_warn (_("Illegal break code (%lu)"),
8399                            (unsigned long) imm_expr.X_add_number);
8400                   imm_expr.X_add_number &= OP_MASK_CODE;
8401                 }
8402               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8403               imm_expr.X_op = O_absent;
8404               s = expr_end;
8405               continue;
8406
8407             case 'q':           /* lower break code */
8408               my_getExpression (&imm_expr, s);
8409               check_absolute_expr (ip, &imm_expr);
8410               if ((unsigned long) imm_expr.X_add_number > 1023)
8411                 {
8412                   as_warn (_("Illegal lower break code (%lu)"),
8413                            (unsigned long) imm_expr.X_add_number);
8414                   imm_expr.X_add_number &= OP_MASK_CODE2;
8415                 }
8416               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8417               imm_expr.X_op = O_absent;
8418               s = expr_end;
8419               continue;
8420
8421             case 'B':           /* 20-bit syscall/break code.  */
8422               my_getExpression (&imm_expr, s);
8423               check_absolute_expr (ip, &imm_expr);
8424               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8425                 as_warn (_("Illegal 20-bit code (%lu)"),
8426                          (unsigned long) imm_expr.X_add_number);
8427               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8428               imm_expr.X_op = O_absent;
8429               s = expr_end;
8430               continue;
8431
8432             case 'C':           /* Coprocessor code */
8433               my_getExpression (&imm_expr, s);
8434               check_absolute_expr (ip, &imm_expr);
8435               if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8436                 {
8437                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
8438                            (unsigned long) imm_expr.X_add_number);
8439                   imm_expr.X_add_number &= ((1 << 25) - 1);
8440                 }
8441               ip->insn_opcode |= imm_expr.X_add_number;
8442               imm_expr.X_op = O_absent;
8443               s = expr_end;
8444               continue;
8445
8446             case 'J':           /* 19-bit wait code.  */
8447               my_getExpression (&imm_expr, s);
8448               check_absolute_expr (ip, &imm_expr);
8449               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8450                 as_warn (_("Illegal 19-bit code (%lu)"),
8451                          (unsigned long) imm_expr.X_add_number);
8452               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8453               imm_expr.X_op = O_absent;
8454               s = expr_end;
8455               continue;
8456
8457             case 'P':           /* Performance register */
8458               my_getExpression (&imm_expr, s);
8459               check_absolute_expr (ip, &imm_expr);
8460               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8461                 {
8462                   as_warn (_("Invalid performance register (%lu)"),
8463                            (unsigned long) imm_expr.X_add_number);
8464                   imm_expr.X_add_number &= OP_MASK_PERFREG;
8465                 }
8466               ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8467               imm_expr.X_op = O_absent;
8468               s = expr_end;
8469               continue;
8470
8471             case 'b':           /* base register */
8472             case 'd':           /* destination register */
8473             case 's':           /* source register */
8474             case 't':           /* target register */
8475             case 'r':           /* both target and source */
8476             case 'v':           /* both dest and source */
8477             case 'w':           /* both dest and target */
8478             case 'E':           /* coprocessor target register */
8479             case 'G':           /* coprocessor destination register */
8480             case 'K':           /* 'rdhwr' destination register */
8481             case 'x':           /* ignore register name */
8482             case 'z':           /* must be zero register */
8483             case 'U':           /* destination register (clo/clz).  */
8484               s_reset = s;
8485               if (s[0] == '$')
8486                 {
8487
8488                   if (ISDIGIT (s[1]))
8489                     {
8490                       ++s;
8491                       regno = 0;
8492                       do
8493                         {
8494                           regno *= 10;
8495                           regno += *s - '0';
8496                           ++s;
8497                         }
8498                       while (ISDIGIT (*s));
8499                       if (regno > 31)
8500                         as_bad (_("Invalid register number (%d)"), regno);
8501                     }
8502                   else if (*args == 'E' || *args == 'G' || *args == 'K')
8503                     goto notreg;
8504                   else
8505                     {
8506                       if (s[1] == 'r' && s[2] == 'a')
8507                         {
8508                           s += 3;
8509                           regno = RA;
8510                         }
8511                       else if (s[1] == 'f' && s[2] == 'p')
8512                         {
8513                           s += 3;
8514                           regno = FP;
8515                         }
8516                       else if (s[1] == 's' && s[2] == 'p')
8517                         {
8518                           s += 3;
8519                           regno = SP;
8520                         }
8521                       else if (s[1] == 'g' && s[2] == 'p')
8522                         {
8523                           s += 3;
8524                           regno = GP;
8525                         }
8526                       else if (s[1] == 'a' && s[2] == 't')
8527                         {
8528                           s += 3;
8529                           regno = AT;
8530                         }
8531                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8532                         {
8533                           s += 4;
8534                           regno = KT0;
8535                         }
8536                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8537                         {
8538                           s += 4;
8539                           regno = KT1;
8540                         }
8541                       else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8542                         {
8543                           s += 5;
8544                           regno = ZERO;
8545                         }
8546                       else if (itbl_have_entries)
8547                         {
8548                           char *p, *n;
8549                           unsigned long r;
8550
8551                           p = s + 1;    /* advance past '$' */
8552                           n = itbl_get_field (&p);  /* n is name */
8553
8554                           /* See if this is a register defined in an
8555                              itbl entry.  */
8556                           if (itbl_get_reg_val (n, &r))
8557                             {
8558                               /* Get_field advances to the start of
8559                                  the next field, so we need to back
8560                                  rack to the end of the last field.  */
8561                               if (p)
8562                                 s = p - 1;
8563                               else
8564                                 s = strchr (s, '\0');
8565                               regno = r;
8566                             }
8567                           else
8568                             goto notreg;
8569                         }
8570                       else
8571                         goto notreg;
8572                     }
8573                   if (regno == AT
8574                       && ! mips_opts.noat
8575                       && *args != 'E'
8576                       && *args != 'G'
8577                       && *args != 'K')
8578                     as_warn (_("Used $at without \".set noat\""));
8579                   c = *args;
8580                   if (*s == ' ')
8581                     ++s;
8582                   if (args[1] != *s)
8583                     {
8584                       if (c == 'r' || c == 'v' || c == 'w')
8585                         {
8586                           regno = lastregno;
8587                           s = s_reset;
8588                           ++args;
8589                         }
8590                     }
8591                   /* 'z' only matches $0.  */
8592                   if (c == 'z' && regno != 0)
8593                     break;
8594
8595         /* Now that we have assembled one operand, we use the args string
8596          * to figure out where it goes in the instruction.  */
8597                   switch (c)
8598                     {
8599                     case 'r':
8600                     case 's':
8601                     case 'v':
8602                     case 'b':
8603                       ip->insn_opcode |= regno << OP_SH_RS;
8604                       break;
8605                     case 'd':
8606                     case 'G':
8607                     case 'K':
8608                       ip->insn_opcode |= regno << OP_SH_RD;
8609                       break;
8610                     case 'U':
8611                       ip->insn_opcode |= regno << OP_SH_RD;
8612                       ip->insn_opcode |= regno << OP_SH_RT;
8613                       break;
8614                     case 'w':
8615                     case 't':
8616                     case 'E':
8617                       ip->insn_opcode |= regno << OP_SH_RT;
8618                       break;
8619                     case 'x':
8620                       /* This case exists because on the r3000 trunc
8621                          expands into a macro which requires a gp
8622                          register.  On the r6000 or r4000 it is
8623                          assembled into a single instruction which
8624                          ignores the register.  Thus the insn version
8625                          is MIPS_ISA2 and uses 'x', and the macro
8626                          version is MIPS_ISA1 and uses 't'.  */
8627                       break;
8628                     case 'z':
8629                       /* This case is for the div instruction, which
8630                          acts differently if the destination argument
8631                          is $0.  This only matches $0, and is checked
8632                          outside the switch.  */
8633                       break;
8634                     case 'D':
8635                       /* Itbl operand; not yet implemented. FIXME ?? */
8636                       break;
8637                       /* What about all other operands like 'i', which
8638                          can be specified in the opcode table? */
8639                     }
8640                   lastregno = regno;
8641                   continue;
8642                 }
8643             notreg:
8644               switch (*args++)
8645                 {
8646                 case 'r':
8647                 case 'v':
8648                   ip->insn_opcode |= lastregno << OP_SH_RS;
8649                   continue;
8650                 case 'w':
8651                   ip->insn_opcode |= lastregno << OP_SH_RT;
8652                   continue;
8653                 }
8654               break;
8655
8656             case 'O':           /* MDMX alignment immediate constant.  */
8657               my_getExpression (&imm_expr, s);
8658               check_absolute_expr (ip, &imm_expr);
8659               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8660                 {
8661                   as_warn ("Improper align amount (%ld), using low bits",
8662                            (long) imm_expr.X_add_number);
8663                   imm_expr.X_add_number &= OP_MASK_ALN;
8664                 }
8665               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
8666               imm_expr.X_op = O_absent;
8667               s = expr_end;
8668               continue;
8669
8670             case 'Q':           /* MDMX vector, element sel, or const.  */
8671               if (s[0] != '$')
8672                 {
8673                   /* MDMX Immediate.  */
8674                   my_getExpression (&imm_expr, s);
8675                   check_absolute_expr (ip, &imm_expr);
8676                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8677                     {
8678                       as_warn (_("Invalid MDMX Immediate (%ld)"),
8679                                (long) imm_expr.X_add_number);
8680                       imm_expr.X_add_number &= OP_MASK_FT;
8681                     }
8682                   imm_expr.X_add_number &= OP_MASK_FT;
8683                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8684                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8685                   else
8686                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8687                   ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
8688                   imm_expr.X_op = O_absent;
8689                   s = expr_end;
8690                   continue;
8691                 }
8692               /* Not MDMX Immediate.  Fall through.  */
8693             case 'X':           /* MDMX destination register.  */
8694             case 'Y':           /* MDMX source register.  */
8695             case 'Z':           /* MDMX target register.  */
8696               is_mdmx = 1;
8697             case 'D':           /* floating point destination register */
8698             case 'S':           /* floating point source register */
8699             case 'T':           /* floating point target register */
8700             case 'R':           /* floating point source register */
8701             case 'V':
8702             case 'W':
8703               s_reset = s;
8704               /* Accept $fN for FP and MDMX register numbers, and in
8705                  addition accept $vN for MDMX register numbers.  */
8706               if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8707                   || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8708                       && ISDIGIT (s[2])))
8709                 {
8710                   s += 2;
8711                   regno = 0;
8712                   do
8713                     {
8714                       regno *= 10;
8715                       regno += *s - '0';
8716                       ++s;
8717                     }
8718                   while (ISDIGIT (*s));
8719
8720                   if (regno > 31)
8721                     as_bad (_("Invalid float register number (%d)"), regno);
8722
8723                   if ((regno & 1) != 0
8724                       && HAVE_32BIT_FPRS
8725                       && ! (strcmp (str, "mtc1") == 0
8726                             || strcmp (str, "mfc1") == 0
8727                             || strcmp (str, "lwc1") == 0
8728                             || strcmp (str, "swc1") == 0
8729                             || strcmp (str, "l.s") == 0
8730                             || strcmp (str, "s.s") == 0))
8731                     as_warn (_("Float register should be even, was %d"),
8732                              regno);
8733
8734                   c = *args;
8735                   if (*s == ' ')
8736                     ++s;
8737                   if (args[1] != *s)
8738                     {
8739                       if (c == 'V' || c == 'W')
8740                         {
8741                           regno = lastregno;
8742                           s = s_reset;
8743                           ++args;
8744                         }
8745                     }
8746                   switch (c)
8747                     {
8748                     case 'D':
8749                     case 'X':
8750                       ip->insn_opcode |= regno << OP_SH_FD;
8751                       break;
8752                     case 'V':
8753                     case 'S':
8754                     case 'Y':
8755                       ip->insn_opcode |= regno << OP_SH_FS;
8756                       break;
8757                     case 'Q':
8758                       /* This is like 'Z', but also needs to fix the MDMX
8759                          vector/scalar select bits.  Note that the
8760                          scalar immediate case is handled above.  */
8761                       if (*s == '[')
8762                         {
8763                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8764                           int max_el = (is_qh ? 3 : 7);
8765                           s++;
8766                           my_getExpression(&imm_expr, s);
8767                           check_absolute_expr (ip, &imm_expr);
8768                           s = expr_end;
8769                           if (imm_expr.X_add_number > max_el)
8770                             as_bad(_("Bad element selector %ld"),
8771                                    (long) imm_expr.X_add_number);
8772                           imm_expr.X_add_number &= max_el;
8773                           ip->insn_opcode |= (imm_expr.X_add_number
8774                                               << (OP_SH_VSEL +
8775                                                   (is_qh ? 2 : 1)));
8776                           if (*s != ']')
8777                             as_warn(_("Expecting ']' found '%s'"), s);
8778                           else
8779                             s++;
8780                         }
8781                       else
8782                         {
8783                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8784                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8785                                                 << OP_SH_VSEL);
8786                           else
8787                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8788                                                 OP_SH_VSEL);
8789                         }
8790                       /* Fall through */
8791                     case 'W':
8792                     case 'T':
8793                     case 'Z':
8794                       ip->insn_opcode |= regno << OP_SH_FT;
8795                       break;
8796                     case 'R':
8797                       ip->insn_opcode |= regno << OP_SH_FR;
8798                       break;
8799                     }
8800                   lastregno = regno;
8801                   continue;
8802                 }
8803
8804               switch (*args++)
8805                 {
8806                 case 'V':
8807                   ip->insn_opcode |= lastregno << OP_SH_FS;
8808                   continue;
8809                 case 'W':
8810                   ip->insn_opcode |= lastregno << OP_SH_FT;
8811                   continue;
8812                 }
8813               break;
8814
8815             case 'I':
8816               my_getExpression (&imm_expr, s);
8817               if (imm_expr.X_op != O_big
8818                   && imm_expr.X_op != O_constant)
8819                 insn_error = _("absolute expression required");
8820               normalize_constant_expr (&imm_expr);
8821               s = expr_end;
8822               continue;
8823
8824             case 'A':
8825               my_getExpression (&offset_expr, s);
8826               *imm_reloc = BFD_RELOC_32;
8827               s = expr_end;
8828               continue;
8829
8830             case 'F':
8831             case 'L':
8832             case 'f':
8833             case 'l':
8834               {
8835                 int f64;
8836                 int using_gprs;
8837                 char *save_in;
8838                 char *err;
8839                 unsigned char temp[8];
8840                 int len;
8841                 unsigned int length;
8842                 segT seg;
8843                 subsegT subseg;
8844                 char *p;
8845
8846                 /* These only appear as the last operand in an
8847                    instruction, and every instruction that accepts
8848                    them in any variant accepts them in all variants.
8849                    This means we don't have to worry about backing out
8850                    any changes if the instruction does not match.
8851
8852                    The difference between them is the size of the
8853                    floating point constant and where it goes.  For 'F'
8854                    and 'L' the constant is 64 bits; for 'f' and 'l' it
8855                    is 32 bits.  Where the constant is placed is based
8856                    on how the MIPS assembler does things:
8857                     F -- .rdata
8858                     L -- .lit8
8859                     f -- immediate value
8860                     l -- .lit4
8861
8862                     The .lit4 and .lit8 sections are only used if
8863                     permitted by the -G argument.
8864
8865                     When generating embedded PIC code, we use the
8866                     .lit8 section but not the .lit4 section (we can do
8867                     .lit4 inline easily; we need to put .lit8
8868                     somewhere in the data segment, and using .lit8
8869                     permits the linker to eventually combine identical
8870                     .lit8 entries).
8871
8872                     The code below needs to know whether the target register
8873                     is 32 or 64 bits wide.  It relies on the fact 'f' and
8874                     'F' are used with GPR-based instructions and 'l' and
8875                     'L' are used with FPR-based instructions.  */
8876
8877                 f64 = *args == 'F' || *args == 'L';
8878                 using_gprs = *args == 'F' || *args == 'f';
8879
8880                 save_in = input_line_pointer;
8881                 input_line_pointer = s;
8882                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8883                 length = len;
8884                 s = input_line_pointer;
8885                 input_line_pointer = save_in;
8886                 if (err != NULL && *err != '\0')
8887                   {
8888                     as_bad (_("Bad floating point constant: %s"), err);
8889                     memset (temp, '\0', sizeof temp);
8890                     length = f64 ? 8 : 4;
8891                   }
8892
8893                 assert (length == (unsigned) (f64 ? 8 : 4));
8894
8895                 if (*args == 'f'
8896                     || (*args == 'l'
8897                         && (! USE_GLOBAL_POINTER_OPT
8898                             || mips_pic == EMBEDDED_PIC
8899                             || g_switch_value < 4
8900                             || (temp[0] == 0 && temp[1] == 0)
8901                             || (temp[2] == 0 && temp[3] == 0))))
8902                   {
8903                     imm_expr.X_op = O_constant;
8904                     if (! target_big_endian)
8905                       imm_expr.X_add_number = bfd_getl32 (temp);
8906                     else
8907                       imm_expr.X_add_number = bfd_getb32 (temp);
8908                   }
8909                 else if (length > 4
8910                          && ! mips_disable_float_construction
8911                          /* Constants can only be constructed in GPRs and
8912                             copied to FPRs if the GPRs are at least as wide
8913                             as the FPRs.  Force the constant into memory if
8914                             we are using 64-bit FPRs but the GPRs are only
8915                             32 bits wide.  */
8916                          && (using_gprs
8917                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
8918                          && ((temp[0] == 0 && temp[1] == 0)
8919                              || (temp[2] == 0 && temp[3] == 0))
8920                          && ((temp[4] == 0 && temp[5] == 0)
8921                              || (temp[6] == 0 && temp[7] == 0)))
8922                   {
8923                     /* The value is simple enough to load with a couple of
8924                        instructions.  If using 32-bit registers, set
8925                        imm_expr to the high order 32 bits and offset_expr to
8926                        the low order 32 bits.  Otherwise, set imm_expr to
8927                        the entire 64 bit constant.  */
8928                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
8929                       {
8930                         imm_expr.X_op = O_constant;
8931                         offset_expr.X_op = O_constant;
8932                         if (! target_big_endian)
8933                           {
8934                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
8935                             offset_expr.X_add_number = bfd_getl32 (temp);
8936                           }
8937                         else
8938                           {
8939                             imm_expr.X_add_number = bfd_getb32 (temp);
8940                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
8941                           }
8942                         if (offset_expr.X_add_number == 0)
8943                           offset_expr.X_op = O_absent;
8944                       }
8945                     else if (sizeof (imm_expr.X_add_number) > 4)
8946                       {
8947                         imm_expr.X_op = O_constant;
8948                         if (! target_big_endian)
8949                           imm_expr.X_add_number = bfd_getl64 (temp);
8950                         else
8951                           imm_expr.X_add_number = bfd_getb64 (temp);
8952                       }
8953                     else
8954                       {
8955                         imm_expr.X_op = O_big;
8956                         imm_expr.X_add_number = 4;
8957                         if (! target_big_endian)
8958                           {
8959                             generic_bignum[0] = bfd_getl16 (temp);
8960                             generic_bignum[1] = bfd_getl16 (temp + 2);
8961                             generic_bignum[2] = bfd_getl16 (temp + 4);
8962                             generic_bignum[3] = bfd_getl16 (temp + 6);
8963                           }
8964                         else
8965                           {
8966                             generic_bignum[0] = bfd_getb16 (temp + 6);
8967                             generic_bignum[1] = bfd_getb16 (temp + 4);
8968                             generic_bignum[2] = bfd_getb16 (temp + 2);
8969                             generic_bignum[3] = bfd_getb16 (temp);
8970                           }
8971                       }
8972                   }
8973                 else
8974                   {
8975                     const char *newname;
8976                     segT new_seg;
8977
8978                     /* Switch to the right section.  */
8979                     seg = now_seg;
8980                     subseg = now_subseg;
8981                     switch (*args)
8982                       {
8983                       default: /* unused default case avoids warnings.  */
8984                       case 'L':
8985                         newname = RDATA_SECTION_NAME;
8986                         if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
8987                             || mips_pic == EMBEDDED_PIC)
8988                           newname = ".lit8";
8989                         break;
8990                       case 'F':
8991                         if (mips_pic == EMBEDDED_PIC)
8992                           newname = ".lit8";
8993                         else
8994                           newname = RDATA_SECTION_NAME;
8995                         break;
8996                       case 'l':
8997                         assert (!USE_GLOBAL_POINTER_OPT
8998                                 || g_switch_value >= 4);
8999                         newname = ".lit4";
9000                         break;
9001                       }
9002                     new_seg = subseg_new (newname, (subsegT) 0);
9003                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9004                       bfd_set_section_flags (stdoutput, new_seg,
9005                                              (SEC_ALLOC
9006                                               | SEC_LOAD
9007                                               | SEC_READONLY
9008                                               | SEC_DATA));
9009                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9010                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9011                         && strcmp (TARGET_OS, "elf") != 0)
9012                       record_alignment (new_seg, 4);
9013                     else
9014                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9015                     if (seg == now_seg)
9016                       as_bad (_("Can't use floating point insn in this section"));
9017
9018                     /* Set the argument to the current address in the
9019                        section.  */
9020                     offset_expr.X_op = O_symbol;
9021                     offset_expr.X_add_symbol =
9022                       symbol_new ("L0\001", now_seg,
9023                                   (valueT) frag_now_fix (), frag_now);
9024                     offset_expr.X_add_number = 0;
9025
9026                     /* Put the floating point number into the section.  */
9027                     p = frag_more ((int) length);
9028                     memcpy (p, temp, length);
9029
9030                     /* Switch back to the original section.  */
9031                     subseg_set (seg, subseg);
9032                   }
9033               }
9034               continue;
9035
9036             case 'i':           /* 16 bit unsigned immediate */
9037             case 'j':           /* 16 bit signed immediate */
9038               *imm_reloc = BFD_RELOC_LO16;
9039               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9040                 {
9041                   int more;
9042                   offsetT minval, maxval;
9043
9044                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9045                           && strcmp (insn->name, insn[1].name) == 0);
9046
9047                   /* If the expression was written as an unsigned number,
9048                      only treat it as signed if there are no more
9049                      alternatives.  */
9050                   if (more
9051                       && *args == 'j'
9052                       && sizeof (imm_expr.X_add_number) <= 4
9053                       && imm_expr.X_op == O_constant
9054                       && imm_expr.X_add_number < 0
9055                       && imm_expr.X_unsigned
9056                       && HAVE_64BIT_GPRS)
9057                     break;
9058
9059                   /* For compatibility with older assemblers, we accept
9060                      0x8000-0xffff as signed 16-bit numbers when only
9061                      signed numbers are allowed.  */
9062                   if (*args == 'i')
9063                     minval = 0, maxval = 0xffff;
9064                   else if (more)
9065                     minval = -0x8000, maxval = 0x7fff;
9066                   else
9067                     minval = -0x8000, maxval = 0xffff;
9068
9069                   if (imm_expr.X_op != O_constant
9070                       || imm_expr.X_add_number < minval
9071                       || imm_expr.X_add_number > maxval)
9072                     {
9073                       if (more)
9074                         break;
9075                       if (imm_expr.X_op == O_constant
9076                           || imm_expr.X_op == O_big)
9077                         as_bad (_("expression out of range"));
9078                     }
9079                 }
9080               s = expr_end;
9081               continue;
9082
9083             case 'o':           /* 16 bit offset */
9084               /* Check whether there is only a single bracketed expression
9085                  left.  If so, it must be the base register and the
9086                  constant must be zero.  */
9087               if (*s == '(' && strchr (s + 1, '(') == 0)
9088                 {
9089                   offset_expr.X_op = O_constant;
9090                   offset_expr.X_add_number = 0;
9091                   continue;
9092                 }
9093
9094               /* If this value won't fit into a 16 bit offset, then go
9095                  find a macro that will generate the 32 bit offset
9096                  code pattern.  */
9097               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9098                   && (offset_expr.X_op != O_constant
9099                       || offset_expr.X_add_number >= 0x8000
9100                       || offset_expr.X_add_number < -0x8000))
9101                 break;
9102
9103               s = expr_end;
9104               continue;
9105
9106             case 'p':           /* pc relative offset */
9107               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9108               my_getExpression (&offset_expr, s);
9109               s = expr_end;
9110               continue;
9111
9112             case 'u':           /* upper 16 bits */
9113               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9114                   && imm_expr.X_op == O_constant
9115                   && (imm_expr.X_add_number < 0
9116                       || imm_expr.X_add_number >= 0x10000))
9117                 as_bad (_("lui expression not in range 0..65535"));
9118               s = expr_end;
9119               continue;
9120
9121             case 'a':           /* 26 bit address */
9122               my_getExpression (&offset_expr, s);
9123               s = expr_end;
9124               *offset_reloc = BFD_RELOC_MIPS_JMP;
9125               continue;
9126
9127             case 'N':           /* 3 bit branch condition code */
9128             case 'M':           /* 3 bit compare condition code */
9129               if (strncmp (s, "$fcc", 4) != 0)
9130                 break;
9131               s += 4;
9132               regno = 0;
9133               do
9134                 {
9135                   regno *= 10;
9136                   regno += *s - '0';
9137                   ++s;
9138                 }
9139               while (ISDIGIT (*s));
9140               if (regno > 7)
9141                 as_bad (_("Invalid condition code register $fcc%d"), regno);
9142               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9143                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9144                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9145                   && (regno & 1) != 0)
9146                 as_warn(_("Condition code register should be even for %s, was %d"),
9147                         str, regno);
9148               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9149                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9150                   && (regno & 3) != 0)
9151                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9152                         str, regno);
9153               if (*args == 'N')
9154                 ip->insn_opcode |= regno << OP_SH_BCC;
9155               else
9156                 ip->insn_opcode |= regno << OP_SH_CCC;
9157               continue;
9158
9159             case 'H':
9160               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9161                 s += 2;
9162               if (ISDIGIT (*s))
9163                 {
9164                   c = 0;
9165                   do
9166                     {
9167                       c *= 10;
9168                       c += *s - '0';
9169                       ++s;
9170                     }
9171                   while (ISDIGIT (*s));
9172                 }
9173               else
9174                 c = 8; /* Invalid sel value.  */
9175
9176               if (c > 7)
9177                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9178               ip->insn_opcode |= c;
9179               continue;
9180
9181             case 'e':
9182               /* Must be at least one digit.  */
9183               my_getExpression (&imm_expr, s);
9184               check_absolute_expr (ip, &imm_expr);
9185
9186               if ((unsigned long) imm_expr.X_add_number
9187                   > (unsigned long) OP_MASK_VECBYTE)
9188                 {
9189                   as_bad (_("bad byte vector index (%ld)"),
9190                            (long) imm_expr.X_add_number);
9191                   imm_expr.X_add_number = 0;
9192                 }
9193
9194               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9195               imm_expr.X_op = O_absent;
9196               s = expr_end;
9197               continue;
9198
9199             case '%':
9200               my_getExpression (&imm_expr, s);
9201               check_absolute_expr (ip, &imm_expr);
9202
9203               if ((unsigned long) imm_expr.X_add_number
9204                   > (unsigned long) OP_MASK_VECALIGN)
9205                 {
9206                   as_bad (_("bad byte vector index (%ld)"),
9207                            (long) imm_expr.X_add_number);
9208                   imm_expr.X_add_number = 0;
9209                 }
9210
9211               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9212               imm_expr.X_op = O_absent;
9213               s = expr_end;
9214               continue;
9215
9216             default:
9217               as_bad (_("bad char = '%c'\n"), *args);
9218               internalError ();
9219             }
9220           break;
9221         }
9222       /* Args don't match.  */
9223       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9224           !strcmp (insn->name, insn[1].name))
9225         {
9226           ++insn;
9227           s = argsStart;
9228           insn_error = _("illegal operands");
9229           continue;
9230         }
9231       if (save_c)
9232         *(--s) = save_c;
9233       insn_error = _("illegal operands");
9234       return;
9235     }
9236 }
9237
9238 /* This routine assembles an instruction into its binary format when
9239    assembling for the mips16.  As a side effect, it sets one of the
9240    global variables imm_reloc or offset_reloc to the type of
9241    relocation to do if one of the operands is an address expression.
9242    It also sets mips16_small and mips16_ext if the user explicitly
9243    requested a small or extended instruction.  */
9244
9245 static void
9246 mips16_ip (char *str, struct mips_cl_insn *ip)
9247 {
9248   char *s;
9249   const char *args;
9250   struct mips_opcode *insn;
9251   char *argsstart;
9252   unsigned int regno;
9253   unsigned int lastregno = 0;
9254   char *s_reset;
9255
9256   insn_error = NULL;
9257
9258   mips16_small = FALSE;
9259   mips16_ext = FALSE;
9260
9261   for (s = str; ISLOWER (*s); ++s)
9262     ;
9263   switch (*s)
9264     {
9265     case '\0':
9266       break;
9267
9268     case ' ':
9269       *s++ = '\0';
9270       break;
9271
9272     case '.':
9273       if (s[1] == 't' && s[2] == ' ')
9274         {
9275           *s = '\0';
9276           mips16_small = TRUE;
9277           s += 3;
9278           break;
9279         }
9280       else if (s[1] == 'e' && s[2] == ' ')
9281         {
9282           *s = '\0';
9283           mips16_ext = TRUE;
9284           s += 3;
9285           break;
9286         }
9287       /* Fall through.  */
9288     default:
9289       insn_error = _("unknown opcode");
9290       return;
9291     }
9292
9293   if (mips_opts.noautoextend && ! mips16_ext)
9294     mips16_small = TRUE;
9295
9296   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9297     {
9298       insn_error = _("unrecognized opcode");
9299       return;
9300     }
9301
9302   argsstart = s;
9303   for (;;)
9304     {
9305       assert (strcmp (insn->name, str) == 0);
9306
9307       ip->insn_mo = insn;
9308       ip->insn_opcode = insn->match;
9309       ip->use_extend = FALSE;
9310       imm_expr.X_op = O_absent;
9311       imm_reloc[0] = BFD_RELOC_UNUSED;
9312       imm_reloc[1] = BFD_RELOC_UNUSED;
9313       imm_reloc[2] = BFD_RELOC_UNUSED;
9314       imm2_expr.X_op = O_absent;
9315       offset_expr.X_op = O_absent;
9316       offset_reloc[0] = BFD_RELOC_UNUSED;
9317       offset_reloc[1] = BFD_RELOC_UNUSED;
9318       offset_reloc[2] = BFD_RELOC_UNUSED;
9319       for (args = insn->args; 1; ++args)
9320         {
9321           int c;
9322
9323           if (*s == ' ')
9324             ++s;
9325
9326           /* In this switch statement we call break if we did not find
9327              a match, continue if we did find a match, or return if we
9328              are done.  */
9329
9330           c = *args;
9331           switch (c)
9332             {
9333             case '\0':
9334               if (*s == '\0')
9335                 {
9336                   /* Stuff the immediate value in now, if we can.  */
9337                   if (imm_expr.X_op == O_constant
9338                       && *imm_reloc > BFD_RELOC_UNUSED
9339                       && insn->pinfo != INSN_MACRO)
9340                     {
9341                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9342                                     imm_expr.X_add_number, TRUE, mips16_small,
9343                                     mips16_ext, &ip->insn_opcode,
9344                                     &ip->use_extend, &ip->extend);
9345                       imm_expr.X_op = O_absent;
9346                       *imm_reloc = BFD_RELOC_UNUSED;
9347                     }
9348
9349                   return;
9350                 }
9351               break;
9352
9353             case ',':
9354               if (*s++ == c)
9355                 continue;
9356               s--;
9357               switch (*++args)
9358                 {
9359                 case 'v':
9360                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9361                   continue;
9362                 case 'w':
9363                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9364                   continue;
9365                 }
9366               break;
9367
9368             case '(':
9369             case ')':
9370               if (*s++ == c)
9371                 continue;
9372               break;
9373
9374             case 'v':
9375             case 'w':
9376               if (s[0] != '$')
9377                 {
9378                   if (c == 'v')
9379                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9380                   else
9381                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9382                   ++args;
9383                   continue;
9384                 }
9385               /* Fall through.  */
9386             case 'x':
9387             case 'y':
9388             case 'z':
9389             case 'Z':
9390             case '0':
9391             case 'S':
9392             case 'R':
9393             case 'X':
9394             case 'Y':
9395               if (s[0] != '$')
9396                 break;
9397               s_reset = s;
9398               if (ISDIGIT (s[1]))
9399                 {
9400                   ++s;
9401                   regno = 0;
9402                   do
9403                     {
9404                       regno *= 10;
9405                       regno += *s - '0';
9406                       ++s;
9407                     }
9408                   while (ISDIGIT (*s));
9409                   if (regno > 31)
9410                     {
9411                       as_bad (_("invalid register number (%d)"), regno);
9412                       regno = 2;
9413                     }
9414                 }
9415               else
9416                 {
9417                   if (s[1] == 'r' && s[2] == 'a')
9418                     {
9419                       s += 3;
9420                       regno = RA;
9421                     }
9422                   else if (s[1] == 'f' && s[2] == 'p')
9423                     {
9424                       s += 3;
9425                       regno = FP;
9426                     }
9427                   else if (s[1] == 's' && s[2] == 'p')
9428                     {
9429                       s += 3;
9430                       regno = SP;
9431                     }
9432                   else if (s[1] == 'g' && s[2] == 'p')
9433                     {
9434                       s += 3;
9435                       regno = GP;
9436                     }
9437                   else if (s[1] == 'a' && s[2] == 't')
9438                     {
9439                       s += 3;
9440                       regno = AT;
9441                     }
9442                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9443                     {
9444                       s += 4;
9445                       regno = KT0;
9446                     }
9447                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9448                     {
9449                       s += 4;
9450                       regno = KT1;
9451                     }
9452                   else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9453                     {
9454                       s += 5;
9455                       regno = ZERO;
9456                     }
9457                   else
9458                     break;
9459                 }
9460
9461               if (*s == ' ')
9462                 ++s;
9463               if (args[1] != *s)
9464                 {
9465                   if (c == 'v' || c == 'w')
9466                     {
9467                       regno = mips16_to_32_reg_map[lastregno];
9468                       s = s_reset;
9469                       ++args;
9470                     }
9471                 }
9472
9473               switch (c)
9474                 {
9475                 case 'x':
9476                 case 'y':
9477                 case 'z':
9478                 case 'v':
9479                 case 'w':
9480                 case 'Z':
9481                   regno = mips32_to_16_reg_map[regno];
9482                   break;
9483
9484                 case '0':
9485                   if (regno != 0)
9486                     regno = ILLEGAL_REG;
9487                   break;
9488
9489                 case 'S':
9490                   if (regno != SP)
9491                     regno = ILLEGAL_REG;
9492                   break;
9493
9494                 case 'R':
9495                   if (regno != RA)
9496                     regno = ILLEGAL_REG;
9497                   break;
9498
9499                 case 'X':
9500                 case 'Y':
9501                   if (regno == AT && ! mips_opts.noat)
9502                     as_warn (_("used $at without \".set noat\""));
9503                   break;
9504
9505                 default:
9506                   internalError ();
9507                 }
9508
9509               if (regno == ILLEGAL_REG)
9510                 break;
9511
9512               switch (c)
9513                 {
9514                 case 'x':
9515                 case 'v':
9516                   ip->insn_opcode |= regno << MIPS16OP_SH_RX;
9517                   break;
9518                 case 'y':
9519                 case 'w':
9520                   ip->insn_opcode |= regno << MIPS16OP_SH_RY;
9521                   break;
9522                 case 'z':
9523                   ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
9524                   break;
9525                 case 'Z':
9526                   ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
9527                 case '0':
9528                 case 'S':
9529                 case 'R':
9530                   break;
9531                 case 'X':
9532                   ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
9533                   break;
9534                 case 'Y':
9535                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9536                   ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
9537                   break;
9538                 default:
9539                   internalError ();
9540                 }
9541
9542               lastregno = regno;
9543               continue;
9544
9545             case 'P':
9546               if (strncmp (s, "$pc", 3) == 0)
9547                 {
9548                   s += 3;
9549                   continue;
9550                 }
9551               break;
9552
9553             case '<':
9554             case '>':
9555             case '[':
9556             case ']':
9557             case '4':
9558             case '5':
9559             case 'H':
9560             case 'W':
9561             case 'D':
9562             case 'j':
9563             case '8':
9564             case 'V':
9565             case 'C':
9566             case 'U':
9567             case 'k':
9568             case 'K':
9569               if (s[0] == '%'
9570                   && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
9571                 {
9572                   /* This is %gprel(SYMBOL).  We need to read SYMBOL,
9573                      and generate the appropriate reloc.  If the text
9574                      inside %gprel is not a symbol name with an
9575                      optional offset, then we generate a normal reloc
9576                      and will probably fail later.  */
9577                   my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
9578                   if (imm_expr.X_op == O_symbol)
9579                     {
9580                       mips16_ext = TRUE;
9581                       *imm_reloc = BFD_RELOC_MIPS16_GPREL;
9582                       s = expr_end;
9583                       ip->use_extend = TRUE;
9584                       ip->extend = 0;
9585                       continue;
9586                     }
9587                 }
9588               else
9589                 {
9590                   /* Just pick up a normal expression.  */
9591                   my_getExpression (&imm_expr, s);
9592                 }
9593
9594               if (imm_expr.X_op == O_register)
9595                 {
9596                   /* What we thought was an expression turned out to
9597                      be a register.  */
9598
9599                   if (s[0] == '(' && args[1] == '(')
9600                     {
9601                       /* It looks like the expression was omitted
9602                          before a register indirection, which means
9603                          that the expression is implicitly zero.  We
9604                          still set up imm_expr, so that we handle
9605                          explicit extensions correctly.  */
9606                       imm_expr.X_op = O_constant;
9607                       imm_expr.X_add_number = 0;
9608                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9609                       continue;
9610                     }
9611
9612                   break;
9613                 }
9614
9615               /* We need to relax this instruction.  */
9616               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9617               s = expr_end;
9618               continue;
9619
9620             case 'p':
9621             case 'q':
9622             case 'A':
9623             case 'B':
9624             case 'E':
9625               /* We use offset_reloc rather than imm_reloc for the PC
9626                  relative operands.  This lets macros with both
9627                  immediate and address operands work correctly.  */
9628               my_getExpression (&offset_expr, s);
9629
9630               if (offset_expr.X_op == O_register)
9631                 break;
9632
9633               /* We need to relax this instruction.  */
9634               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9635               s = expr_end;
9636               continue;
9637
9638             case '6':           /* break code */
9639               my_getExpression (&imm_expr, s);
9640               check_absolute_expr (ip, &imm_expr);
9641               if ((unsigned long) imm_expr.X_add_number > 63)
9642                 {
9643                   as_warn (_("Invalid value for `%s' (%lu)"),
9644                            ip->insn_mo->name,
9645                            (unsigned long) imm_expr.X_add_number);
9646                   imm_expr.X_add_number &= 0x3f;
9647                 }
9648               ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9649               imm_expr.X_op = O_absent;
9650               s = expr_end;
9651               continue;
9652
9653             case 'a':           /* 26 bit address */
9654               my_getExpression (&offset_expr, s);
9655               s = expr_end;
9656               *offset_reloc = BFD_RELOC_MIPS16_JMP;
9657               ip->insn_opcode <<= 16;
9658               continue;
9659
9660             case 'l':           /* register list for entry macro */
9661             case 'L':           /* register list for exit macro */
9662               {
9663                 int mask;
9664
9665                 if (c == 'l')
9666                   mask = 0;
9667                 else
9668                   mask = 7 << 3;
9669                 while (*s != '\0')
9670                   {
9671                     int freg, reg1, reg2;
9672
9673                     while (*s == ' ' || *s == ',')
9674                       ++s;
9675                     if (*s != '$')
9676                       {
9677                         as_bad (_("can't parse register list"));
9678                         break;
9679                       }
9680                     ++s;
9681                     if (*s != 'f')
9682                       freg = 0;
9683                     else
9684                       {
9685                         freg = 1;
9686                         ++s;
9687                       }
9688                     reg1 = 0;
9689                     while (ISDIGIT (*s))
9690                       {
9691                         reg1 *= 10;
9692                         reg1 += *s - '0';
9693                         ++s;
9694                       }
9695                     if (*s == ' ')
9696                       ++s;
9697                     if (*s != '-')
9698                       reg2 = reg1;
9699                     else
9700                       {
9701                         ++s;
9702                         if (*s != '$')
9703                           break;
9704                         ++s;
9705                         if (freg)
9706                           {
9707                             if (*s == 'f')
9708                               ++s;
9709                             else
9710                               {
9711                                 as_bad (_("invalid register list"));
9712                                 break;
9713                               }
9714                           }
9715                         reg2 = 0;
9716                         while (ISDIGIT (*s))
9717                           {
9718                             reg2 *= 10;
9719                             reg2 += *s - '0';
9720                             ++s;
9721                           }
9722                       }
9723                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9724                       {
9725                         mask &= ~ (7 << 3);
9726                         mask |= 5 << 3;
9727                       }
9728                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9729                       {
9730                         mask &= ~ (7 << 3);
9731                         mask |= 6 << 3;
9732                       }
9733                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9734                       mask |= (reg2 - 3) << 3;
9735                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9736                       mask |= (reg2 - 15) << 1;
9737                     else if (reg1 == RA && reg2 == RA)
9738                       mask |= 1;
9739                     else
9740                       {
9741                         as_bad (_("invalid register list"));
9742                         break;
9743                       }
9744                   }
9745                 /* The mask is filled in in the opcode table for the
9746                    benefit of the disassembler.  We remove it before
9747                    applying the actual mask.  */
9748                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9749                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9750               }
9751             continue;
9752
9753             case 'e':           /* extend code */
9754               my_getExpression (&imm_expr, s);
9755               check_absolute_expr (ip, &imm_expr);
9756               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9757                 {
9758                   as_warn (_("Invalid value for `%s' (%lu)"),
9759                            ip->insn_mo->name,
9760                            (unsigned long) imm_expr.X_add_number);
9761                   imm_expr.X_add_number &= 0x7ff;
9762                 }
9763               ip->insn_opcode |= imm_expr.X_add_number;
9764               imm_expr.X_op = O_absent;
9765               s = expr_end;
9766               continue;
9767
9768             default:
9769               internalError ();
9770             }
9771           break;
9772         }
9773
9774       /* Args don't match.  */
9775       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9776           strcmp (insn->name, insn[1].name) == 0)
9777         {
9778           ++insn;
9779           s = argsstart;
9780           continue;
9781         }
9782
9783       insn_error = _("illegal operands");
9784
9785       return;
9786     }
9787 }
9788
9789 /* This structure holds information we know about a mips16 immediate
9790    argument type.  */
9791
9792 struct mips16_immed_operand
9793 {
9794   /* The type code used in the argument string in the opcode table.  */
9795   int type;
9796   /* The number of bits in the short form of the opcode.  */
9797   int nbits;
9798   /* The number of bits in the extended form of the opcode.  */
9799   int extbits;
9800   /* The amount by which the short form is shifted when it is used;
9801      for example, the sw instruction has a shift count of 2.  */
9802   int shift;
9803   /* The amount by which the short form is shifted when it is stored
9804      into the instruction code.  */
9805   int op_shift;
9806   /* Non-zero if the short form is unsigned.  */
9807   int unsp;
9808   /* Non-zero if the extended form is unsigned.  */
9809   int extu;
9810   /* Non-zero if the value is PC relative.  */
9811   int pcrel;
9812 };
9813
9814 /* The mips16 immediate operand types.  */
9815
9816 static const struct mips16_immed_operand mips16_immed_operands[] =
9817 {
9818   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9819   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9820   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9821   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9822   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9823   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9824   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9825   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9826   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9827   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9828   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9829   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9830   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9831   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9832   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9833   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9834   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9835   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9836   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9837   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9838   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9839 };
9840
9841 #define MIPS16_NUM_IMMED \
9842   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9843
9844 /* Handle a mips16 instruction with an immediate value.  This or's the
9845    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
9846    whether an extended value is needed; if one is needed, it sets
9847    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
9848    If SMALL is true, an unextended opcode was explicitly requested.
9849    If EXT is true, an extended opcode was explicitly requested.  If
9850    WARN is true, warn if EXT does not match reality.  */
9851
9852 static void
9853 mips16_immed (char *file, unsigned int line, int type, offsetT val,
9854               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
9855               unsigned long *insn, bfd_boolean *use_extend,
9856               unsigned short *extend)
9857 {
9858   register const struct mips16_immed_operand *op;
9859   int mintiny, maxtiny;
9860   bfd_boolean needext;
9861
9862   op = mips16_immed_operands;
9863   while (op->type != type)
9864     {
9865       ++op;
9866       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9867     }
9868
9869   if (op->unsp)
9870     {
9871       if (type == '<' || type == '>' || type == '[' || type == ']')
9872         {
9873           mintiny = 1;
9874           maxtiny = 1 << op->nbits;
9875         }
9876       else
9877         {
9878           mintiny = 0;
9879           maxtiny = (1 << op->nbits) - 1;
9880         }
9881     }
9882   else
9883     {
9884       mintiny = - (1 << (op->nbits - 1));
9885       maxtiny = (1 << (op->nbits - 1)) - 1;
9886     }
9887
9888   /* Branch offsets have an implicit 0 in the lowest bit.  */
9889   if (type == 'p' || type == 'q')
9890     val /= 2;
9891
9892   if ((val & ((1 << op->shift) - 1)) != 0
9893       || val < (mintiny << op->shift)
9894       || val > (maxtiny << op->shift))
9895     needext = TRUE;
9896   else
9897     needext = FALSE;
9898
9899   if (warn && ext && ! needext)
9900     as_warn_where (file, line,
9901                    _("extended operand requested but not required"));
9902   if (small && needext)
9903     as_bad_where (file, line, _("invalid unextended operand value"));
9904
9905   if (small || (! ext && ! needext))
9906     {
9907       int insnval;
9908
9909       *use_extend = FALSE;
9910       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9911       insnval <<= op->op_shift;
9912       *insn |= insnval;
9913     }
9914   else
9915     {
9916       long minext, maxext;
9917       int extval;
9918
9919       if (op->extu)
9920         {
9921           minext = 0;
9922           maxext = (1 << op->extbits) - 1;
9923         }
9924       else
9925         {
9926           minext = - (1 << (op->extbits - 1));
9927           maxext = (1 << (op->extbits - 1)) - 1;
9928         }
9929       if (val < minext || val > maxext)
9930         as_bad_where (file, line,
9931                       _("operand value out of range for instruction"));
9932
9933       *use_extend = TRUE;
9934       if (op->extbits == 16)
9935         {
9936           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
9937           val &= 0x1f;
9938         }
9939       else if (op->extbits == 15)
9940         {
9941           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
9942           val &= 0xf;
9943         }
9944       else
9945         {
9946           extval = ((val & 0x1f) << 6) | (val & 0x20);
9947           val = 0;
9948         }
9949
9950       *extend = (unsigned short) extval;
9951       *insn |= val;
9952     }
9953 }
9954 \f
9955 static const struct percent_op_match
9956 {
9957   const char *str;
9958   bfd_reloc_code_real_type reloc;
9959 } percent_op[] =
9960 {
9961   {"%lo", BFD_RELOC_LO16},
9962 #ifdef OBJ_ELF
9963   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
9964   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
9965   {"%call16", BFD_RELOC_MIPS_CALL16},
9966   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
9967   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
9968   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
9969   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
9970   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
9971   {"%got", BFD_RELOC_MIPS_GOT16},
9972   {"%gp_rel", BFD_RELOC_GPREL16},
9973   {"%half", BFD_RELOC_16},
9974   {"%highest", BFD_RELOC_MIPS_HIGHEST},
9975   {"%higher", BFD_RELOC_MIPS_HIGHER},
9976   {"%neg", BFD_RELOC_MIPS_SUB},
9977 #endif
9978   {"%hi", BFD_RELOC_HI16_S}
9979 };
9980
9981
9982 /* Return true if *STR points to a relocation operator.  When returning true,
9983    move *STR over the operator and store its relocation code in *RELOC.
9984    Leave both *STR and *RELOC alone when returning false.  */
9985
9986 static bfd_boolean
9987 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
9988 {
9989   size_t i;
9990
9991   for (i = 0; i < ARRAY_SIZE (percent_op); i++)
9992     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
9993       {
9994         *str += strlen (percent_op[i].str);
9995         *reloc = percent_op[i].reloc;
9996
9997         /* Check whether the output BFD supports this relocation.
9998            If not, issue an error and fall back on something safe.  */
9999         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10000           {
10001             as_bad ("relocation %s isn't supported by the current ABI",
10002                     percent_op[i].str);
10003             *reloc = BFD_RELOC_LO16;
10004           }
10005         return TRUE;
10006       }
10007   return FALSE;
10008 }
10009
10010
10011 /* Parse string STR as a 16-bit relocatable operand.  Store the
10012    expression in *EP and the relocations in the array starting
10013    at RELOC.  Return the number of relocation operators used.
10014
10015    On exit, EXPR_END points to the first character after the expression.
10016    If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16.  */
10017
10018 static size_t
10019 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10020                        char *str)
10021 {
10022   bfd_reloc_code_real_type reversed_reloc[3];
10023   size_t reloc_index, i;
10024   int crux_depth, str_depth;
10025   char *crux;
10026
10027   /* Search for the start of the main expression, recoding relocations
10028      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10029      of the main expression and with CRUX_DEPTH containing the number
10030      of open brackets at that point.  */
10031   reloc_index = -1;
10032   str_depth = 0;
10033   do
10034     {
10035       reloc_index++;
10036       crux = str;
10037       crux_depth = str_depth;
10038
10039       /* Skip over whitespace and brackets, keeping count of the number
10040          of brackets.  */
10041       while (*str == ' ' || *str == '\t' || *str == '(')
10042         if (*str++ == '(')
10043           str_depth++;
10044     }
10045   while (*str == '%'
10046          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10047          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10048
10049   my_getExpression (ep, crux);
10050   str = expr_end;
10051
10052   /* Match every open bracket.  */
10053   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10054     if (*str++ == ')')
10055       crux_depth--;
10056
10057   if (crux_depth > 0)
10058     as_bad ("unclosed '('");
10059
10060   expr_end = str;
10061
10062   if (reloc_index == 0)
10063     reloc[0] = BFD_RELOC_LO16;
10064   else
10065     {
10066       prev_reloc_op_frag = frag_now;
10067       for (i = 0; i < reloc_index; i++)
10068         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10069     }
10070
10071   return reloc_index;
10072 }
10073
10074 static void
10075 my_getExpression (expressionS *ep, char *str)
10076 {
10077   char *save_in;
10078   valueT val;
10079
10080   save_in = input_line_pointer;
10081   input_line_pointer = str;
10082   expression (ep);
10083   expr_end = input_line_pointer;
10084   input_line_pointer = save_in;
10085
10086   /* If we are in mips16 mode, and this is an expression based on `.',
10087      then we bump the value of the symbol by 1 since that is how other
10088      text symbols are handled.  We don't bother to handle complex
10089      expressions, just `.' plus or minus a constant.  */
10090   if (mips_opts.mips16
10091       && ep->X_op == O_symbol
10092       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10093       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10094       && symbol_get_frag (ep->X_add_symbol) == frag_now
10095       && symbol_constant_p (ep->X_add_symbol)
10096       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10097     S_SET_VALUE (ep->X_add_symbol, val + 1);
10098 }
10099
10100 /* Turn a string in input_line_pointer into a floating point constant
10101    of type TYPE, and store the appropriate bytes in *LITP.  The number
10102    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10103    returned, or NULL on OK.  */
10104
10105 char *
10106 md_atof (int type, char *litP, int *sizeP)
10107 {
10108   int prec;
10109   LITTLENUM_TYPE words[4];
10110   char *t;
10111   int i;
10112
10113   switch (type)
10114     {
10115     case 'f':
10116       prec = 2;
10117       break;
10118
10119     case 'd':
10120       prec = 4;
10121       break;
10122
10123     default:
10124       *sizeP = 0;
10125       return _("bad call to md_atof");
10126     }
10127
10128   t = atof_ieee (input_line_pointer, type, words);
10129   if (t)
10130     input_line_pointer = t;
10131
10132   *sizeP = prec * 2;
10133
10134   if (! target_big_endian)
10135     {
10136       for (i = prec - 1; i >= 0; i--)
10137         {
10138           md_number_to_chars (litP, words[i], 2);
10139           litP += 2;
10140         }
10141     }
10142   else
10143     {
10144       for (i = 0; i < prec; i++)
10145         {
10146           md_number_to_chars (litP, words[i], 2);
10147           litP += 2;
10148         }
10149     }
10150
10151   return NULL;
10152 }
10153
10154 void
10155 md_number_to_chars (char *buf, valueT val, int n)
10156 {
10157   if (target_big_endian)
10158     number_to_chars_bigendian (buf, val, n);
10159   else
10160     number_to_chars_littleendian (buf, val, n);
10161 }
10162 \f
10163 #ifdef OBJ_ELF
10164 static int support_64bit_objects(void)
10165 {
10166   const char **list, **l;
10167   int yes;
10168
10169   list = bfd_target_list ();
10170   for (l = list; *l != NULL; l++)
10171 #ifdef TE_TMIPS
10172     /* This is traditional mips */
10173     if (strcmp (*l, "elf64-tradbigmips") == 0
10174         || strcmp (*l, "elf64-tradlittlemips") == 0)
10175 #else
10176     if (strcmp (*l, "elf64-bigmips") == 0
10177         || strcmp (*l, "elf64-littlemips") == 0)
10178 #endif
10179       break;
10180   yes = (*l != NULL);
10181   free (list);
10182   return yes;
10183 }
10184 #endif /* OBJ_ELF */
10185
10186 const char *md_shortopts = "O::g::G:";
10187
10188 struct option md_longopts[] =
10189 {
10190   /* Options which specify architecture.  */
10191 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10192 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10193   {"march", required_argument, NULL, OPTION_MARCH},
10194 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10195   {"mtune", required_argument, NULL, OPTION_MTUNE},
10196 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10197   {"mips0", no_argument, NULL, OPTION_MIPS1},
10198   {"mips1", no_argument, NULL, OPTION_MIPS1},
10199 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10200   {"mips2", no_argument, NULL, OPTION_MIPS2},
10201 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10202   {"mips3", no_argument, NULL, OPTION_MIPS3},
10203 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10204   {"mips4", no_argument, NULL, OPTION_MIPS4},
10205 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10206   {"mips5", no_argument, NULL, OPTION_MIPS5},
10207 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10208   {"mips32", no_argument, NULL, OPTION_MIPS32},
10209 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10210   {"mips64", no_argument, NULL, OPTION_MIPS64},
10211 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10212   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10213 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10214   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10215
10216   /* Options which specify Application Specific Extensions (ASEs).  */
10217 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10218 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10219   {"mips16", no_argument, NULL, OPTION_MIPS16},
10220 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10221   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10222 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10223   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10224 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10225   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10226 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10227   {"mdmx", no_argument, NULL, OPTION_MDMX},
10228 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10229   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10230
10231   /* Old-style architecture options.  Don't add more of these.  */
10232 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 6)
10233 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10234   {"m4650", no_argument, NULL, OPTION_M4650},
10235 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10236   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10237 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10238   {"m4010", no_argument, NULL, OPTION_M4010},
10239 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10240   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10241 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10242   {"m4100", no_argument, NULL, OPTION_M4100},
10243 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10244   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10245 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10246   {"m3900", no_argument, NULL, OPTION_M3900},
10247 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10248   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10249
10250   /* Options which enable bug fixes.  */
10251 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10252 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10253   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10254 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10255   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10256   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10257 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10258 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10259   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10260   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10261
10262   /* Miscellaneous options.  */
10263 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 4)
10264 #define OPTION_MEMBEDDED_PIC (OPTION_MISC_BASE + 0)
10265   {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
10266 #define OPTION_TRAP (OPTION_MISC_BASE + 1)
10267   {"trap", no_argument, NULL, OPTION_TRAP},
10268   {"no-break", no_argument, NULL, OPTION_TRAP},
10269 #define OPTION_BREAK (OPTION_MISC_BASE + 2)
10270   {"break", no_argument, NULL, OPTION_BREAK},
10271   {"no-trap", no_argument, NULL, OPTION_BREAK},
10272 #define OPTION_EB (OPTION_MISC_BASE + 3)
10273   {"EB", no_argument, NULL, OPTION_EB},
10274 #define OPTION_EL (OPTION_MISC_BASE + 4)
10275   {"EL", no_argument, NULL, OPTION_EL},
10276 #define OPTION_FP32 (OPTION_MISC_BASE + 5)
10277   {"mfp32", no_argument, NULL, OPTION_FP32},
10278 #define OPTION_GP32 (OPTION_MISC_BASE + 6)
10279   {"mgp32", no_argument, NULL, OPTION_GP32},
10280 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10281   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10282 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 8)
10283   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10284 #define OPTION_FP64 (OPTION_MISC_BASE + 9)
10285   {"mfp64", no_argument, NULL, OPTION_FP64},
10286 #define OPTION_GP64 (OPTION_MISC_BASE + 10)
10287   {"mgp64", no_argument, NULL, OPTION_GP64},
10288 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10289 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 12)
10290   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10291   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10292
10293   /* ELF-specific options.  */
10294 #ifdef OBJ_ELF
10295 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 13)
10296 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10297   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10298   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10299 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10300   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10301 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10302   {"xgot",        no_argument, NULL, OPTION_XGOT},
10303 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10304   {"mabi", required_argument, NULL, OPTION_MABI},
10305 #define OPTION_32          (OPTION_ELF_BASE + 4)
10306   {"32",          no_argument, NULL, OPTION_32},
10307 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10308   {"n32",         no_argument, NULL, OPTION_N32},
10309 #define OPTION_64          (OPTION_ELF_BASE + 6)
10310   {"64",          no_argument, NULL, OPTION_64},
10311 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10312   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10313 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10314   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10315 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10316   {"mpdr", no_argument, NULL, OPTION_PDR},
10317 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10318   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10319 #endif /* OBJ_ELF */
10320
10321   {NULL, no_argument, NULL, 0}
10322 };
10323 size_t md_longopts_size = sizeof (md_longopts);
10324
10325 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10326    NEW_VALUE.  Warn if another value was already specified.  Note:
10327    we have to defer parsing the -march and -mtune arguments in order
10328    to handle 'from-abi' correctly, since the ABI might be specified
10329    in a later argument.  */
10330
10331 static void
10332 mips_set_option_string (const char **string_ptr, const char *new_value)
10333 {
10334   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10335     as_warn (_("A different %s was already specified, is now %s"),
10336              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10337              new_value);
10338
10339   *string_ptr = new_value;
10340 }
10341
10342 int
10343 md_parse_option (int c, char *arg)
10344 {
10345   switch (c)
10346     {
10347     case OPTION_CONSTRUCT_FLOATS:
10348       mips_disable_float_construction = 0;
10349       break;
10350
10351     case OPTION_NO_CONSTRUCT_FLOATS:
10352       mips_disable_float_construction = 1;
10353       break;
10354
10355     case OPTION_TRAP:
10356       mips_trap = 1;
10357       break;
10358
10359     case OPTION_BREAK:
10360       mips_trap = 0;
10361       break;
10362
10363     case OPTION_EB:
10364       target_big_endian = 1;
10365       break;
10366
10367     case OPTION_EL:
10368       target_big_endian = 0;
10369       break;
10370
10371     case 'O':
10372       if (arg && arg[1] == '0')
10373         mips_optimize = 1;
10374       else
10375         mips_optimize = 2;
10376       break;
10377
10378     case 'g':
10379       if (arg == NULL)
10380         mips_debug = 2;
10381       else
10382         mips_debug = atoi (arg);
10383       /* When the MIPS assembler sees -g or -g2, it does not do
10384          optimizations which limit full symbolic debugging.  We take
10385          that to be equivalent to -O0.  */
10386       if (mips_debug == 2)
10387         mips_optimize = 1;
10388       break;
10389
10390     case OPTION_MIPS1:
10391       file_mips_isa = ISA_MIPS1;
10392       break;
10393
10394     case OPTION_MIPS2:
10395       file_mips_isa = ISA_MIPS2;
10396       break;
10397
10398     case OPTION_MIPS3:
10399       file_mips_isa = ISA_MIPS3;
10400       break;
10401
10402     case OPTION_MIPS4:
10403       file_mips_isa = ISA_MIPS4;
10404       break;
10405
10406     case OPTION_MIPS5:
10407       file_mips_isa = ISA_MIPS5;
10408       break;
10409
10410     case OPTION_MIPS32:
10411       file_mips_isa = ISA_MIPS32;
10412       break;
10413
10414     case OPTION_MIPS32R2:
10415       file_mips_isa = ISA_MIPS32R2;
10416       break;
10417
10418     case OPTION_MIPS64R2:
10419       file_mips_isa = ISA_MIPS64R2;
10420       break;
10421
10422     case OPTION_MIPS64:
10423       file_mips_isa = ISA_MIPS64;
10424       break;
10425
10426     case OPTION_MTUNE:
10427       mips_set_option_string (&mips_tune_string, arg);
10428       break;
10429
10430     case OPTION_MARCH:
10431       mips_set_option_string (&mips_arch_string, arg);
10432       break;
10433
10434     case OPTION_M4650:
10435       mips_set_option_string (&mips_arch_string, "4650");
10436       mips_set_option_string (&mips_tune_string, "4650");
10437       break;
10438
10439     case OPTION_NO_M4650:
10440       break;
10441
10442     case OPTION_M4010:
10443       mips_set_option_string (&mips_arch_string, "4010");
10444       mips_set_option_string (&mips_tune_string, "4010");
10445       break;
10446
10447     case OPTION_NO_M4010:
10448       break;
10449
10450     case OPTION_M4100:
10451       mips_set_option_string (&mips_arch_string, "4100");
10452       mips_set_option_string (&mips_tune_string, "4100");
10453       break;
10454
10455     case OPTION_NO_M4100:
10456       break;
10457
10458     case OPTION_M3900:
10459       mips_set_option_string (&mips_arch_string, "3900");
10460       mips_set_option_string (&mips_tune_string, "3900");
10461       break;
10462
10463     case OPTION_NO_M3900:
10464       break;
10465
10466     case OPTION_MDMX:
10467       mips_opts.ase_mdmx = 1;
10468       break;
10469
10470     case OPTION_NO_MDMX:
10471       mips_opts.ase_mdmx = 0;
10472       break;
10473
10474     case OPTION_MIPS16:
10475       mips_opts.mips16 = 1;
10476       mips_no_prev_insn (FALSE);
10477       break;
10478
10479     case OPTION_NO_MIPS16:
10480       mips_opts.mips16 = 0;
10481       mips_no_prev_insn (FALSE);
10482       break;
10483
10484     case OPTION_MIPS3D:
10485       mips_opts.ase_mips3d = 1;
10486       break;
10487
10488     case OPTION_NO_MIPS3D:
10489       mips_opts.ase_mips3d = 0;
10490       break;
10491
10492     case OPTION_MEMBEDDED_PIC:
10493       mips_pic = EMBEDDED_PIC;
10494       if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
10495         {
10496           as_bad (_("-G may not be used with embedded PIC code"));
10497           return 0;
10498         }
10499       g_switch_value = 0x7fffffff;
10500       break;
10501
10502     case OPTION_FIX_VR4120:
10503       mips_fix_vr4120 = 1;
10504       break;
10505
10506     case OPTION_NO_FIX_VR4120:
10507       mips_fix_vr4120 = 0;
10508       break;
10509
10510     case OPTION_RELAX_BRANCH:
10511       mips_relax_branch = 1;
10512       break;
10513
10514     case OPTION_NO_RELAX_BRANCH:
10515       mips_relax_branch = 0;
10516       break;
10517
10518 #ifdef OBJ_ELF
10519       /* When generating ELF code, we permit -KPIC and -call_shared to
10520          select SVR4_PIC, and -non_shared to select no PIC.  This is
10521          intended to be compatible with Irix 5.  */
10522     case OPTION_CALL_SHARED:
10523       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10524         {
10525           as_bad (_("-call_shared is supported only for ELF format"));
10526           return 0;
10527         }
10528       mips_pic = SVR4_PIC;
10529       mips_abicalls = TRUE;
10530       if (g_switch_seen && g_switch_value != 0)
10531         {
10532           as_bad (_("-G may not be used with SVR4 PIC code"));
10533           return 0;
10534         }
10535       g_switch_value = 0;
10536       break;
10537
10538     case OPTION_NON_SHARED:
10539       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10540         {
10541           as_bad (_("-non_shared is supported only for ELF format"));
10542           return 0;
10543         }
10544       mips_pic = NO_PIC;
10545       mips_abicalls = FALSE;
10546       break;
10547
10548       /* The -xgot option tells the assembler to use 32 offsets when
10549          accessing the got in SVR4_PIC mode.  It is for Irix
10550          compatibility.  */
10551     case OPTION_XGOT:
10552       mips_big_got = 1;
10553       break;
10554 #endif /* OBJ_ELF */
10555
10556     case 'G':
10557       if (! USE_GLOBAL_POINTER_OPT)
10558         {
10559           as_bad (_("-G is not supported for this configuration"));
10560           return 0;
10561         }
10562       else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
10563         {
10564           as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
10565           return 0;
10566         }
10567       else
10568         g_switch_value = atoi (arg);
10569       g_switch_seen = 1;
10570       break;
10571
10572 #ifdef OBJ_ELF
10573       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10574          and -mabi=64.  */
10575     case OPTION_32:
10576       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10577         {
10578           as_bad (_("-32 is supported for ELF format only"));
10579           return 0;
10580         }
10581       mips_abi = O32_ABI;
10582       break;
10583
10584     case OPTION_N32:
10585       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10586         {
10587           as_bad (_("-n32 is supported for ELF format only"));
10588           return 0;
10589         }
10590       mips_abi = N32_ABI;
10591       break;
10592
10593     case OPTION_64:
10594       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10595         {
10596           as_bad (_("-64 is supported for ELF format only"));
10597           return 0;
10598         }
10599       mips_abi = N64_ABI;
10600       if (! support_64bit_objects())
10601         as_fatal (_("No compiled in support for 64 bit object file format"));
10602       break;
10603 #endif /* OBJ_ELF */
10604
10605     case OPTION_GP32:
10606       file_mips_gp32 = 1;
10607       break;
10608
10609     case OPTION_GP64:
10610       file_mips_gp32 = 0;
10611       break;
10612
10613     case OPTION_FP32:
10614       file_mips_fp32 = 1;
10615       break;
10616
10617     case OPTION_FP64:
10618       file_mips_fp32 = 0;
10619       break;
10620
10621 #ifdef OBJ_ELF
10622     case OPTION_MABI:
10623       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10624         {
10625           as_bad (_("-mabi is supported for ELF format only"));
10626           return 0;
10627         }
10628       if (strcmp (arg, "32") == 0)
10629         mips_abi = O32_ABI;
10630       else if (strcmp (arg, "o64") == 0)
10631         mips_abi = O64_ABI;
10632       else if (strcmp (arg, "n32") == 0)
10633         mips_abi = N32_ABI;
10634       else if (strcmp (arg, "64") == 0)
10635         {
10636           mips_abi = N64_ABI;
10637           if (! support_64bit_objects())
10638             as_fatal (_("No compiled in support for 64 bit object file "
10639                         "format"));
10640         }
10641       else if (strcmp (arg, "eabi") == 0)
10642         mips_abi = EABI_ABI;
10643       else
10644         {
10645           as_fatal (_("invalid abi -mabi=%s"), arg);
10646           return 0;
10647         }
10648       break;
10649 #endif /* OBJ_ELF */
10650
10651     case OPTION_M7000_HILO_FIX:
10652       mips_7000_hilo_fix = TRUE;
10653       break;
10654
10655     case OPTION_MNO_7000_HILO_FIX:
10656       mips_7000_hilo_fix = FALSE;
10657       break;
10658
10659 #ifdef OBJ_ELF
10660     case OPTION_MDEBUG:
10661       mips_flag_mdebug = TRUE;
10662       break;
10663
10664     case OPTION_NO_MDEBUG:
10665       mips_flag_mdebug = FALSE;
10666       break;
10667
10668     case OPTION_PDR:
10669       mips_flag_pdr = TRUE;
10670       break;
10671
10672     case OPTION_NO_PDR:
10673       mips_flag_pdr = FALSE;
10674       break;
10675 #endif /* OBJ_ELF */
10676
10677     default:
10678       return 0;
10679     }
10680
10681   return 1;
10682 }
10683 \f
10684 /* Set up globals to generate code for the ISA or processor
10685    described by INFO.  */
10686
10687 static void
10688 mips_set_architecture (const struct mips_cpu_info *info)
10689 {
10690   if (info != 0)
10691     {
10692       file_mips_arch = info->cpu;
10693       mips_opts.arch = info->cpu;
10694       mips_opts.isa = info->isa;
10695     }
10696 }
10697
10698
10699 /* Likewise for tuning.  */
10700
10701 static void
10702 mips_set_tune (const struct mips_cpu_info *info)
10703 {
10704   if (info != 0)
10705     mips_tune = info->cpu;
10706 }
10707
10708
10709 void
10710 mips_after_parse_args (void)
10711 {
10712   const struct mips_cpu_info *arch_info = 0;
10713   const struct mips_cpu_info *tune_info = 0;
10714
10715   /* GP relative stuff not working for PE */
10716   if (strncmp (TARGET_OS, "pe", 2) == 0
10717       && g_switch_value != 0)
10718     {
10719       if (g_switch_seen)
10720         as_bad (_("-G not supported in this configuration."));
10721       g_switch_value = 0;
10722     }
10723
10724   if (mips_abi == NO_ABI)
10725     mips_abi = MIPS_DEFAULT_ABI;
10726
10727   /* The following code determines the architecture and register size.
10728      Similar code was added to GCC 3.3 (see override_options() in
10729      config/mips/mips.c).  The GAS and GCC code should be kept in sync
10730      as much as possible.  */
10731
10732   if (mips_arch_string != 0)
10733     arch_info = mips_parse_cpu ("-march", mips_arch_string);
10734
10735   if (file_mips_isa != ISA_UNKNOWN)
10736     {
10737       /* Handle -mipsN.  At this point, file_mips_isa contains the
10738          ISA level specified by -mipsN, while arch_info->isa contains
10739          the -march selection (if any).  */
10740       if (arch_info != 0)
10741         {
10742           /* -march takes precedence over -mipsN, since it is more descriptive.
10743              There's no harm in specifying both as long as the ISA levels
10744              are the same.  */
10745           if (file_mips_isa != arch_info->isa)
10746             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
10747                     mips_cpu_info_from_isa (file_mips_isa)->name,
10748                     mips_cpu_info_from_isa (arch_info->isa)->name);
10749         }
10750       else
10751         arch_info = mips_cpu_info_from_isa (file_mips_isa);
10752     }
10753
10754   if (arch_info == 0)
10755     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
10756
10757   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
10758     as_bad ("-march=%s is not compatible with the selected ABI",
10759             arch_info->name);
10760
10761   mips_set_architecture (arch_info);
10762
10763   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
10764   if (mips_tune_string != 0)
10765     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
10766
10767   if (tune_info == 0)
10768     mips_set_tune (arch_info);
10769   else
10770     mips_set_tune (tune_info);
10771
10772   if (file_mips_gp32 >= 0)
10773     {
10774       /* The user specified the size of the integer registers.  Make sure
10775          it agrees with the ABI and ISA.  */
10776       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10777         as_bad (_("-mgp64 used with a 32-bit processor"));
10778       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
10779         as_bad (_("-mgp32 used with a 64-bit ABI"));
10780       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
10781         as_bad (_("-mgp64 used with a 32-bit ABI"));
10782     }
10783   else
10784     {
10785       /* Infer the integer register size from the ABI and processor.
10786          Restrict ourselves to 32-bit registers if that's all the
10787          processor has, or if the ABI cannot handle 64-bit registers.  */
10788       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
10789                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
10790     }
10791
10792   /* ??? GAS treats single-float processors as though they had 64-bit
10793      float registers (although it complains when double-precision
10794      instructions are used).  As things stand, saying they have 32-bit
10795      registers would lead to spurious "register must be even" messages.
10796      So here we assume float registers are always the same size as
10797      integer ones, unless the user says otherwise.  */
10798   if (file_mips_fp32 < 0)
10799     file_mips_fp32 = file_mips_gp32;
10800
10801   /* End of GCC-shared inference code.  */
10802
10803   /* This flag is set when we have a 64-bit capable CPU but use only
10804      32-bit wide registers.  Note that EABI does not use it.  */
10805   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
10806       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
10807           || mips_abi == O32_ABI))
10808     mips_32bitmode = 1;
10809
10810   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
10811     as_bad (_("trap exception not supported at ISA 1"));
10812
10813   /* If the selected architecture includes support for ASEs, enable
10814      generation of code for them.  */
10815   if (mips_opts.mips16 == -1)
10816     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
10817   if (mips_opts.ase_mips3d == -1)
10818     mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
10819   if (mips_opts.ase_mdmx == -1)
10820     mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
10821
10822   file_mips_isa = mips_opts.isa;
10823   file_ase_mips16 = mips_opts.mips16;
10824   file_ase_mips3d = mips_opts.ase_mips3d;
10825   file_ase_mdmx = mips_opts.ase_mdmx;
10826   mips_opts.gp32 = file_mips_gp32;
10827   mips_opts.fp32 = file_mips_fp32;
10828
10829   if (mips_flag_mdebug < 0)
10830     {
10831 #ifdef OBJ_MAYBE_ECOFF
10832       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
10833         mips_flag_mdebug = 1;
10834       else
10835 #endif /* OBJ_MAYBE_ECOFF */
10836         mips_flag_mdebug = 0;
10837     }
10838 }
10839 \f
10840 void
10841 mips_init_after_args (void)
10842 {
10843   /* initialize opcodes */
10844   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
10845   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
10846 }
10847
10848 long
10849 md_pcrel_from (fixS *fixP)
10850 {
10851   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
10852   switch (fixP->fx_r_type)
10853     {
10854     case BFD_RELOC_16_PCREL_S2:
10855     case BFD_RELOC_MIPS_JMP:
10856       /* Return the address of the delay slot.  */
10857       return addr + 4;
10858     default:
10859       return addr;
10860     }
10861 }
10862
10863 /* This is called before the symbol table is processed.  In order to
10864    work with gcc when using mips-tfile, we must keep all local labels.
10865    However, in other cases, we want to discard them.  If we were
10866    called with -g, but we didn't see any debugging information, it may
10867    mean that gcc is smuggling debugging information through to
10868    mips-tfile, in which case we must generate all local labels.  */
10869
10870 void
10871 mips_frob_file_before_adjust (void)
10872 {
10873 #ifndef NO_ECOFF_DEBUGGING
10874   if (ECOFF_DEBUGGING
10875       && mips_debug != 0
10876       && ! ecoff_debugging_seen)
10877     flag_keep_locals = 1;
10878 #endif
10879 }
10880
10881 /* Sort any unmatched HI16_S relocs so that they immediately precede
10882    the corresponding LO reloc.  This is called before md_apply_fix3 and
10883    tc_gen_reloc.  Unmatched HI16_S relocs can only be generated by
10884    explicit use of the %hi modifier.  */
10885
10886 void
10887 mips_frob_file (void)
10888 {
10889   struct mips_hi_fixup *l;
10890
10891   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10892     {
10893       segment_info_type *seginfo;
10894       int pass;
10895
10896       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
10897
10898       /* If a GOT16 relocation turns out to be against a global symbol,
10899          there isn't supposed to be a matching LO.  */
10900       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
10901           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
10902         continue;
10903
10904       /* Check quickly whether the next fixup happens to be a matching %lo.  */
10905       if (fixup_has_matching_lo_p (l->fixp))
10906         continue;
10907
10908       /* Look through the fixups for this segment for a matching %lo.
10909          When we find one, move the %hi just in front of it.  We do
10910          this in two passes.  In the first pass, we try to find a
10911          unique %lo.  In the second pass, we permit multiple %hi
10912          relocs for a single %lo (this is a GNU extension).  */
10913       seginfo = seg_info (l->seg);
10914       for (pass = 0; pass < 2; pass++)
10915         {
10916           fixS *f, *prev;
10917
10918           prev = NULL;
10919           for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
10920             {
10921               /* Check whether this is a %lo fixup which matches l->fixp.  */
10922               if (f->fx_r_type == BFD_RELOC_LO16
10923                   && f->fx_addsy == l->fixp->fx_addsy
10924                   && f->fx_offset == l->fixp->fx_offset
10925                   && (pass == 1
10926                       || prev == NULL
10927                       || !reloc_needs_lo_p (prev->fx_r_type)
10928                       || !fixup_has_matching_lo_p (prev)))
10929                 {
10930                   fixS **pf;
10931
10932                   /* Move l->fixp before f.  */
10933                   for (pf = &seginfo->fix_root;
10934                        *pf != l->fixp;
10935                        pf = &(*pf)->fx_next)
10936                     assert (*pf != NULL);
10937
10938                   *pf = l->fixp->fx_next;
10939
10940                   l->fixp->fx_next = f;
10941                   if (prev == NULL)
10942                     seginfo->fix_root = l->fixp;
10943                   else
10944                     prev->fx_next = l->fixp;
10945
10946                   break;
10947                 }
10948
10949               prev = f;
10950             }
10951
10952           if (f != NULL)
10953             break;
10954
10955 #if 0 /* GCC code motion plus incomplete dead code elimination
10956          can leave a %hi without a %lo.  */
10957           if (pass == 1)
10958             as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
10959                            _("Unmatched %%hi reloc"));
10960 #endif
10961         }
10962     }
10963 }
10964
10965 /* When generating embedded PIC code we need to use a special
10966    relocation to represent the difference of two symbols in the .text
10967    section (switch tables use a difference of this sort).  See
10968    include/coff/mips.h for details.  This macro checks whether this
10969    fixup requires the special reloc.  */
10970 #define SWITCH_TABLE(fixp) \
10971   ((fixp)->fx_r_type == BFD_RELOC_32 \
10972    && OUTPUT_FLAVOR != bfd_target_elf_flavour \
10973    && (fixp)->fx_addsy != NULL \
10974    && (fixp)->fx_subsy != NULL \
10975    && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
10976    && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
10977
10978 /* When generating embedded PIC code we must keep all PC relative
10979    relocations, in case the linker has to relax a call.  We also need
10980    to keep relocations for switch table entries.
10981
10982    We may have combined relocations without symbols in the N32/N64 ABI.
10983    We have to prevent gas from dropping them.  */
10984
10985 int
10986 mips_force_relocation (fixS *fixp)
10987 {
10988   if (generic_force_reloc (fixp))
10989     return 1;
10990
10991   if (HAVE_NEWABI
10992       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
10993       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
10994           || fixp->fx_r_type == BFD_RELOC_HI16_S
10995           || fixp->fx_r_type == BFD_RELOC_LO16))
10996     return 1;
10997
10998   return (mips_pic == EMBEDDED_PIC
10999           && (fixp->fx_pcrel
11000               || SWITCH_TABLE (fixp)
11001               || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11002               || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11003 }
11004
11005 /* This hook is called before a fix is simplified.  We don't really
11006    decide whether to skip a fix here.  Rather, we turn global symbols
11007    used as branch targets into local symbols, such that they undergo
11008    simplification.  We can only do this if the symbol is defined and
11009    it is in the same section as the branch.  If this doesn't hold, we
11010    emit a better error message than just saying the relocation is not
11011    valid for the selected object format.
11012
11013    FIXP is the fix-up we're going to try to simplify, SEG is the
11014    segment in which the fix up occurs.  The return value should be
11015    non-zero to indicate the fix-up is valid for further
11016    simplifications.  */
11017
11018 int
11019 mips_validate_fix (struct fix *fixP, asection *seg)
11020 {
11021   /* There's a lot of discussion on whether it should be possible to
11022      use R_MIPS_PC16 to represent branch relocations.  The outcome
11023      seems to be that it can, but gas/bfd are very broken in creating
11024      RELA relocations for this, so for now we only accept branches to
11025      symbols in the same section.  Anything else is of dubious value,
11026      since there's no guarantee that at link time the symbol would be
11027      in range.  Even for branches to local symbols this is arguably
11028      wrong, since it we assume the symbol is not going to be
11029      overridden, which should be possible per ELF library semantics,
11030      but then, there isn't a dynamic relocation that could be used to
11031      this effect, and the target would likely be out of range as well.
11032
11033      Unfortunately, it seems that there is too much code out there
11034      that relies on branches to symbols that are global to be resolved
11035      as if they were local, like the IRIX tools do, so we do it as
11036      well, but with a warning so that people are reminded to fix their
11037      code.  If we ever get back to using R_MIPS_PC16 for branch
11038      targets, this entire block should go away (and probably the
11039      whole function).  */
11040
11041   if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
11042       && (((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11043             || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11044            && mips_pic != EMBEDDED_PIC)
11045           || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
11046       && fixP->fx_addsy)
11047     {
11048       if (! S_IS_DEFINED (fixP->fx_addsy))
11049         {
11050           as_bad_where (fixP->fx_file, fixP->fx_line,
11051                         _("Cannot branch to undefined symbol."));
11052           /* Avoid any further errors about this fixup.  */
11053           fixP->fx_done = 1;
11054         }
11055       else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
11056         {
11057           as_bad_where (fixP->fx_file, fixP->fx_line,
11058                         _("Cannot branch to symbol in another section."));
11059           fixP->fx_done = 1;
11060         }
11061       else if (S_IS_EXTERNAL (fixP->fx_addsy))
11062         {
11063           symbolS *sym = fixP->fx_addsy;
11064
11065           if (mips_pic == SVR4_PIC)
11066             as_warn_where (fixP->fx_file, fixP->fx_line,
11067                            _("Pretending global symbol used as branch target is local."));
11068
11069           fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
11070                                           S_GET_SEGMENT (sym),
11071                                           S_GET_VALUE (sym),
11072                                           symbol_get_frag (sym));
11073           copy_symbol_attributes (fixP->fx_addsy, sym);
11074           S_CLEAR_EXTERNAL (fixP->fx_addsy);
11075           assert (symbol_resolved_p (sym));
11076           symbol_mark_resolved (fixP->fx_addsy);
11077         }
11078     }
11079
11080   return 1;
11081 }
11082
11083 /* Apply a fixup to the object file.  */
11084
11085 void
11086 md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11087 {
11088   bfd_byte *buf;
11089   long insn;
11090   static int previous_fx_r_type = 0;
11091   reloc_howto_type *howto;
11092
11093   /* We ignore generic BFD relocations we don't know about.  */
11094   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11095   if (! howto)
11096     return;
11097
11098   assert (fixP->fx_size == 4
11099           || fixP->fx_r_type == BFD_RELOC_16
11100           || fixP->fx_r_type == BFD_RELOC_64
11101           || fixP->fx_r_type == BFD_RELOC_CTOR
11102           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11103           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11104           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
11105
11106   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11107
11108   /* We are not done if this is a composite relocation to set up gp.  */
11109   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11110       && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11111            || (fixP->fx_r_type == BFD_RELOC_64
11112                && (previous_fx_r_type == BFD_RELOC_GPREL32
11113                    || previous_fx_r_type == BFD_RELOC_GPREL16))
11114            || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11115                && (fixP->fx_r_type == BFD_RELOC_HI16_S
11116                    || fixP->fx_r_type == BFD_RELOC_LO16))))
11117     fixP->fx_done = 1;
11118   previous_fx_r_type = fixP->fx_r_type;
11119
11120   switch (fixP->fx_r_type)
11121     {
11122     case BFD_RELOC_MIPS_JMP:
11123     case BFD_RELOC_MIPS_SHIFT5:
11124     case BFD_RELOC_MIPS_SHIFT6:
11125     case BFD_RELOC_MIPS_GOT_DISP:
11126     case BFD_RELOC_MIPS_GOT_PAGE:
11127     case BFD_RELOC_MIPS_GOT_OFST:
11128     case BFD_RELOC_MIPS_SUB:
11129     case BFD_RELOC_MIPS_INSERT_A:
11130     case BFD_RELOC_MIPS_INSERT_B:
11131     case BFD_RELOC_MIPS_DELETE:
11132     case BFD_RELOC_MIPS_HIGHEST:
11133     case BFD_RELOC_MIPS_HIGHER:
11134     case BFD_RELOC_MIPS_SCN_DISP:
11135     case BFD_RELOC_MIPS_REL16:
11136     case BFD_RELOC_MIPS_RELGOT:
11137     case BFD_RELOC_MIPS_JALR:
11138     case BFD_RELOC_HI16:
11139     case BFD_RELOC_HI16_S:
11140     case BFD_RELOC_GPREL16:
11141     case BFD_RELOC_MIPS_LITERAL:
11142     case BFD_RELOC_MIPS_CALL16:
11143     case BFD_RELOC_MIPS_GOT16:
11144     case BFD_RELOC_GPREL32:
11145     case BFD_RELOC_MIPS_GOT_HI16:
11146     case BFD_RELOC_MIPS_GOT_LO16:
11147     case BFD_RELOC_MIPS_CALL_HI16:
11148     case BFD_RELOC_MIPS_CALL_LO16:
11149     case BFD_RELOC_MIPS16_GPREL:
11150       if (fixP->fx_pcrel)
11151         as_bad_where (fixP->fx_file, fixP->fx_line,
11152                       _("Invalid PC relative reloc"));
11153       /* Nothing needed to do. The value comes from the reloc entry */
11154       break;
11155
11156     case BFD_RELOC_MIPS16_JMP:
11157       /* We currently always generate a reloc against a symbol, which
11158          means that we don't want an addend even if the symbol is
11159          defined.  */
11160       *valP = 0;
11161       break;
11162
11163     case BFD_RELOC_PCREL_HI16_S:
11164       /* The addend for this is tricky if it is internal, so we just
11165          do everything here rather than in bfd_install_relocation.  */
11166       if (OUTPUT_FLAVOR == bfd_target_elf_flavour && !fixP->fx_done)
11167         break;
11168       if (fixP->fx_addsy
11169           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11170         {
11171           /* For an external symbol adjust by the address to make it
11172              pcrel_offset.  We use the address of the RELLO reloc
11173              which follows this one.  */
11174           *valP += (fixP->fx_next->fx_frag->fr_address
11175                     + fixP->fx_next->fx_where);
11176         }
11177       *valP = ((*valP + 0x8000) >> 16) & 0xffff;
11178       if (target_big_endian)
11179         buf += 2;
11180       md_number_to_chars (buf, *valP, 2);
11181       break;
11182
11183     case BFD_RELOC_PCREL_LO16:
11184       /* The addend for this is tricky if it is internal, so we just
11185          do everything here rather than in bfd_install_relocation.  */
11186       if (OUTPUT_FLAVOR == bfd_target_elf_flavour && !fixP->fx_done)
11187         break;
11188       if (fixP->fx_addsy
11189           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11190         *valP += fixP->fx_frag->fr_address + fixP->fx_where;
11191       if (target_big_endian)
11192         buf += 2;
11193       md_number_to_chars (buf, *valP, 2);
11194       break;
11195
11196     case BFD_RELOC_64:
11197       /* This is handled like BFD_RELOC_32, but we output a sign
11198          extended value if we are only 32 bits.  */
11199       if (fixP->fx_done
11200           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11201         {
11202           if (8 <= sizeof (valueT))
11203             md_number_to_chars (buf, *valP, 8);
11204           else
11205             {
11206               valueT hiv;
11207
11208               if ((*valP & 0x80000000) != 0)
11209                 hiv = 0xffffffff;
11210               else
11211                 hiv = 0;
11212               md_number_to_chars ((char *)(buf + target_big_endian ? 4 : 0),
11213                                   *valP, 4);
11214               md_number_to_chars ((char *)(buf + target_big_endian ? 0 : 4),
11215                                   hiv, 4);
11216             }
11217         }
11218       break;
11219
11220     case BFD_RELOC_RVA:
11221     case BFD_RELOC_32:
11222       /* If we are deleting this reloc entry, we must fill in the
11223          value now.  This can happen if we have a .word which is not
11224          resolved when it appears but is later defined.  We also need
11225          to fill in the value if this is an embedded PIC switch table
11226          entry.  */
11227       if (fixP->fx_done
11228           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11229         md_number_to_chars (buf, *valP, 4);
11230       break;
11231
11232     case BFD_RELOC_16:
11233       /* If we are deleting this reloc entry, we must fill in the
11234          value now.  */
11235       assert (fixP->fx_size == 2);
11236       if (fixP->fx_done)
11237         md_number_to_chars (buf, *valP, 2);
11238       break;
11239
11240     case BFD_RELOC_LO16:
11241       /* When handling an embedded PIC switch statement, we can wind
11242          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11243       if (fixP->fx_done)
11244         {
11245           if (*valP + 0x8000 > 0xffff)
11246             as_bad_where (fixP->fx_file, fixP->fx_line,
11247                           _("relocation overflow"));
11248           if (target_big_endian)
11249             buf += 2;
11250           md_number_to_chars (buf, *valP, 2);
11251         }
11252       break;
11253
11254     case BFD_RELOC_16_PCREL_S2:
11255       if ((*valP & 0x3) != 0)
11256         as_bad_where (fixP->fx_file, fixP->fx_line,
11257                       _("Branch to odd address (%lx)"), (long) *valP);
11258
11259       /*
11260        * We need to save the bits in the instruction since fixup_segment()
11261        * might be deleting the relocation entry (i.e., a branch within
11262        * the current segment).
11263        */
11264       if (! fixP->fx_done)
11265         break;
11266
11267       /* update old instruction data */
11268       if (target_big_endian)
11269         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11270       else
11271         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11272
11273       if (*valP + 0x20000 <= 0x3ffff)
11274         {
11275           insn |= (*valP >> 2) & 0xffff;
11276           md_number_to_chars (buf, insn, 4);
11277         }
11278       else if (mips_pic == NO_PIC
11279                && fixP->fx_done
11280                && fixP->fx_frag->fr_address >= text_section->vma
11281                && (fixP->fx_frag->fr_address
11282                    < text_section->vma + text_section->_raw_size)
11283                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11284                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11285                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11286         {
11287           /* The branch offset is too large.  If this is an
11288              unconditional branch, and we are not generating PIC code,
11289              we can convert it to an absolute jump instruction.  */
11290           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11291             insn = 0x0c000000;  /* jal */
11292           else
11293             insn = 0x08000000;  /* j */
11294           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11295           fixP->fx_done = 0;
11296           fixP->fx_addsy = section_symbol (text_section);
11297           *valP += md_pcrel_from (fixP);
11298           md_number_to_chars (buf, insn, 4);
11299         }
11300       else
11301         {
11302           /* If we got here, we have branch-relaxation disabled,
11303              and there's nothing we can do to fix this instruction
11304              without turning it into a longer sequence.  */
11305           as_bad_where (fixP->fx_file, fixP->fx_line,
11306                         _("Branch out of range"));
11307         }
11308       break;
11309
11310     case BFD_RELOC_VTABLE_INHERIT:
11311       fixP->fx_done = 0;
11312       if (fixP->fx_addsy
11313           && !S_IS_DEFINED (fixP->fx_addsy)
11314           && !S_IS_WEAK (fixP->fx_addsy))
11315         S_SET_WEAK (fixP->fx_addsy);
11316       break;
11317
11318     case BFD_RELOC_VTABLE_ENTRY:
11319       fixP->fx_done = 0;
11320       break;
11321
11322     default:
11323       internalError ();
11324     }
11325
11326   /* Remember value for tc_gen_reloc.  */
11327   fixP->fx_addnumber = *valP;
11328 }
11329
11330 #if 0
11331 void
11332 printInsn (unsigned long oc)
11333 {
11334   const struct mips_opcode *p;
11335   int treg, sreg, dreg, shamt;
11336   short imm;
11337   const char *args;
11338   int i;
11339
11340   for (i = 0; i < NUMOPCODES; ++i)
11341     {
11342       p = &mips_opcodes[i];
11343       if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
11344         {
11345           printf ("%08lx %s\t", oc, p->name);
11346           treg = (oc >> 16) & 0x1f;
11347           sreg = (oc >> 21) & 0x1f;
11348           dreg = (oc >> 11) & 0x1f;
11349           shamt = (oc >> 6) & 0x1f;
11350           imm = oc;
11351           for (args = p->args;; ++args)
11352             {
11353               switch (*args)
11354                 {
11355                 case '\0':
11356                   printf ("\n");
11357                   break;
11358
11359                 case ',':
11360                 case '(':
11361                 case ')':
11362                   printf ("%c", *args);
11363                   continue;
11364
11365                 case 'r':
11366                   assert (treg == sreg);
11367                   printf ("$%d,$%d", treg, sreg);
11368                   continue;
11369
11370                 case 'd':
11371                 case 'G':
11372                   printf ("$%d", dreg);
11373                   continue;
11374
11375                 case 't':
11376                 case 'E':
11377                   printf ("$%d", treg);
11378                   continue;
11379
11380                 case 'k':
11381                   printf ("0x%x", treg);
11382                   continue;
11383
11384                 case 'b':
11385                 case 's':
11386                   printf ("$%d", sreg);
11387                   continue;
11388
11389                 case 'a':
11390                   printf ("0x%08lx", oc & 0x1ffffff);
11391                   continue;
11392
11393                 case 'i':
11394                 case 'j':
11395                 case 'o':
11396                 case 'u':
11397                   printf ("%d", imm);
11398                   continue;
11399
11400                 case '<':
11401                 case '>':
11402                   printf ("$%d", shamt);
11403                   continue;
11404
11405                 default:
11406                   internalError ();
11407                 }
11408               break;
11409             }
11410           return;
11411         }
11412     }
11413   printf (_("%08lx  UNDEFINED\n"), oc);
11414 }
11415 #endif
11416
11417 static symbolS *
11418 get_symbol (void)
11419 {
11420   int c;
11421   char *name;
11422   symbolS *p;
11423
11424   name = input_line_pointer;
11425   c = get_symbol_end ();
11426   p = (symbolS *) symbol_find_or_make (name);
11427   *input_line_pointer = c;
11428   return p;
11429 }
11430
11431 /* Align the current frag to a given power of two.  The MIPS assembler
11432    also automatically adjusts any preceding label.  */
11433
11434 static void
11435 mips_align (int to, int fill, symbolS *label)
11436 {
11437   mips_emit_delays (FALSE);
11438   frag_align (to, fill, 0);
11439   record_alignment (now_seg, to);
11440   if (label != NULL)
11441     {
11442       assert (S_GET_SEGMENT (label) == now_seg);
11443       symbol_set_frag (label, frag_now);
11444       S_SET_VALUE (label, (valueT) frag_now_fix ());
11445     }
11446 }
11447
11448 /* Align to a given power of two.  .align 0 turns off the automatic
11449    alignment used by the data creating pseudo-ops.  */
11450
11451 static void
11452 s_align (int x ATTRIBUTE_UNUSED)
11453 {
11454   register int temp;
11455   register long temp_fill;
11456   long max_alignment = 15;
11457
11458   /*
11459
11460     o  Note that the assembler pulls down any immediately preceding label
11461        to the aligned address.
11462     o  It's not documented but auto alignment is reinstated by
11463        a .align pseudo instruction.
11464     o  Note also that after auto alignment is turned off the mips assembler
11465        issues an error on attempt to assemble an improperly aligned data item.
11466        We don't.
11467
11468     */
11469
11470   temp = get_absolute_expression ();
11471   if (temp > max_alignment)
11472     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11473   else if (temp < 0)
11474     {
11475       as_warn (_("Alignment negative: 0 assumed."));
11476       temp = 0;
11477     }
11478   if (*input_line_pointer == ',')
11479     {
11480       ++input_line_pointer;
11481       temp_fill = get_absolute_expression ();
11482     }
11483   else
11484     temp_fill = 0;
11485   if (temp)
11486     {
11487       auto_align = 1;
11488       mips_align (temp, (int) temp_fill,
11489                   insn_labels != NULL ? insn_labels->label : NULL);
11490     }
11491   else
11492     {
11493       auto_align = 0;
11494     }
11495
11496   demand_empty_rest_of_line ();
11497 }
11498
11499 void
11500 mips_flush_pending_output (void)
11501 {
11502   mips_emit_delays (FALSE);
11503   mips_clear_insn_labels ();
11504 }
11505
11506 static void
11507 s_change_sec (int sec)
11508 {
11509   segT seg;
11510
11511   /* When generating embedded PIC code, we only use the .text, .lit8,
11512      .sdata and .sbss sections.  We change the .data and .rdata
11513      pseudo-ops to use .sdata.  */
11514   if (mips_pic == EMBEDDED_PIC
11515       && (sec == 'd' || sec == 'r'))
11516     sec = 's';
11517
11518 #ifdef OBJ_ELF
11519   /* The ELF backend needs to know that we are changing sections, so
11520      that .previous works correctly.  We could do something like check
11521      for an obj_section_change_hook macro, but that might be confusing
11522      as it would not be appropriate to use it in the section changing
11523      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11524      This should be cleaner, somehow.  */
11525   obj_elf_section_change_hook ();
11526 #endif
11527
11528   mips_emit_delays (FALSE);
11529   switch (sec)
11530     {
11531     case 't':
11532       s_text (0);
11533       break;
11534     case 'd':
11535       s_data (0);
11536       break;
11537     case 'b':
11538       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11539       demand_empty_rest_of_line ();
11540       break;
11541
11542     case 'r':
11543       if (USE_GLOBAL_POINTER_OPT)
11544         {
11545           seg = subseg_new (RDATA_SECTION_NAME,
11546                             (subsegT) get_absolute_expression ());
11547           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11548             {
11549               bfd_set_section_flags (stdoutput, seg,
11550                                      (SEC_ALLOC
11551                                       | SEC_LOAD
11552                                       | SEC_READONLY
11553                                       | SEC_RELOC
11554                                       | SEC_DATA));
11555               if (strcmp (TARGET_OS, "elf") != 0)
11556                 record_alignment (seg, 4);
11557             }
11558           demand_empty_rest_of_line ();
11559         }
11560       else
11561         {
11562           as_bad (_("No read only data section in this object file format"));
11563           demand_empty_rest_of_line ();
11564           return;
11565         }
11566       break;
11567
11568     case 's':
11569       if (USE_GLOBAL_POINTER_OPT)
11570         {
11571           seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11572           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11573             {
11574               bfd_set_section_flags (stdoutput, seg,
11575                                      SEC_ALLOC | SEC_LOAD | SEC_RELOC
11576                                      | SEC_DATA);
11577               if (strcmp (TARGET_OS, "elf") != 0)
11578                 record_alignment (seg, 4);
11579             }
11580           demand_empty_rest_of_line ();
11581           break;
11582         }
11583       else
11584         {
11585           as_bad (_("Global pointers not supported; recompile -G 0"));
11586           demand_empty_rest_of_line ();
11587           return;
11588         }
11589     }
11590
11591   auto_align = 1;
11592 }
11593
11594 void
11595 s_change_section (int ignore ATTRIBUTE_UNUSED)
11596 {
11597 #ifdef OBJ_ELF
11598   char *section_name;
11599   char c;
11600   char next_c = 0;
11601   int section_type;
11602   int section_flag;
11603   int section_entry_size;
11604   int section_alignment;
11605
11606   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11607     return;
11608
11609   section_name = input_line_pointer;
11610   c = get_symbol_end ();
11611   if (c)
11612     next_c = *(input_line_pointer + 1);
11613
11614   /* Do we have .section Name<,"flags">?  */
11615   if (c != ',' || (c == ',' && next_c == '"'))
11616     {
11617       /* just after name is now '\0'.  */
11618       *input_line_pointer = c;
11619       input_line_pointer = section_name;
11620       obj_elf_section (ignore);
11621       return;
11622     }
11623   input_line_pointer++;
11624
11625   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
11626   if (c == ',')
11627     section_type = get_absolute_expression ();
11628   else
11629     section_type = 0;
11630   if (*input_line_pointer++ == ',')
11631     section_flag = get_absolute_expression ();
11632   else
11633     section_flag = 0;
11634   if (*input_line_pointer++ == ',')
11635     section_entry_size = get_absolute_expression ();
11636   else
11637     section_entry_size = 0;
11638   if (*input_line_pointer++ == ',')
11639     section_alignment = get_absolute_expression ();
11640   else
11641     section_alignment = 0;
11642
11643   section_name = xstrdup (section_name);
11644
11645   /* When using the generic form of .section (as implemented by obj-elf.c),
11646      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
11647      traditionally had to fall back on the more common @progbits instead.
11648
11649      There's nothing really harmful in this, since bfd will correct
11650      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
11651      means that, for backwards compatibiltiy, the special_section entries
11652      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
11653
11654      Even so, we shouldn't force users of the MIPS .section syntax to
11655      incorrectly label the sections as SHT_PROGBITS.  The best compromise
11656      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
11657      generic type-checking code.  */
11658   if (section_type == SHT_MIPS_DWARF)
11659     section_type = SHT_PROGBITS;
11660
11661   obj_elf_change_section (section_name, section_type, section_flag,
11662                           section_entry_size, 0, 0, 0);
11663
11664   if (now_seg->name != section_name)
11665     free (section_name);
11666 #endif /* OBJ_ELF */
11667 }
11668
11669 void
11670 mips_enable_auto_align (void)
11671 {
11672   auto_align = 1;
11673 }
11674
11675 static void
11676 s_cons (int log_size)
11677 {
11678   symbolS *label;
11679
11680   label = insn_labels != NULL ? insn_labels->label : NULL;
11681   mips_emit_delays (FALSE);
11682   if (log_size > 0 && auto_align)
11683     mips_align (log_size, 0, label);
11684   mips_clear_insn_labels ();
11685   cons (1 << log_size);
11686 }
11687
11688 static void
11689 s_float_cons (int type)
11690 {
11691   symbolS *label;
11692
11693   label = insn_labels != NULL ? insn_labels->label : NULL;
11694
11695   mips_emit_delays (FALSE);
11696
11697   if (auto_align)
11698     {
11699       if (type == 'd')
11700         mips_align (3, 0, label);
11701       else
11702         mips_align (2, 0, label);
11703     }
11704
11705   mips_clear_insn_labels ();
11706
11707   float_cons (type);
11708 }
11709
11710 /* Handle .globl.  We need to override it because on Irix 5 you are
11711    permitted to say
11712        .globl foo .text
11713    where foo is an undefined symbol, to mean that foo should be
11714    considered to be the address of a function.  */
11715
11716 static void
11717 s_mips_globl (int x ATTRIBUTE_UNUSED)
11718 {
11719   char *name;
11720   int c;
11721   symbolS *symbolP;
11722   flagword flag;
11723
11724   name = input_line_pointer;
11725   c = get_symbol_end ();
11726   symbolP = symbol_find_or_make (name);
11727   *input_line_pointer = c;
11728   SKIP_WHITESPACE ();
11729
11730   /* On Irix 5, every global symbol that is not explicitly labelled as
11731      being a function is apparently labelled as being an object.  */
11732   flag = BSF_OBJECT;
11733
11734   if (! is_end_of_line[(unsigned char) *input_line_pointer])
11735     {
11736       char *secname;
11737       asection *sec;
11738
11739       secname = input_line_pointer;
11740       c = get_symbol_end ();
11741       sec = bfd_get_section_by_name (stdoutput, secname);
11742       if (sec == NULL)
11743         as_bad (_("%s: no such section"), secname);
11744       *input_line_pointer = c;
11745
11746       if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11747         flag = BSF_FUNCTION;
11748     }
11749
11750   symbol_get_bfdsym (symbolP)->flags |= flag;
11751
11752   S_SET_EXTERNAL (symbolP);
11753   demand_empty_rest_of_line ();
11754 }
11755
11756 static void
11757 s_option (int x ATTRIBUTE_UNUSED)
11758 {
11759   char *opt;
11760   char c;
11761
11762   opt = input_line_pointer;
11763   c = get_symbol_end ();
11764
11765   if (*opt == 'O')
11766     {
11767       /* FIXME: What does this mean?  */
11768     }
11769   else if (strncmp (opt, "pic", 3) == 0)
11770     {
11771       int i;
11772
11773       i = atoi (opt + 3);
11774       if (i == 0)
11775         mips_pic = NO_PIC;
11776       else if (i == 2)
11777         {
11778         mips_pic = SVR4_PIC;
11779           mips_abicalls = TRUE;
11780         }
11781       else
11782         as_bad (_(".option pic%d not supported"), i);
11783
11784       if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
11785         {
11786           if (g_switch_seen && g_switch_value != 0)
11787             as_warn (_("-G may not be used with SVR4 PIC code"));
11788           g_switch_value = 0;
11789           bfd_set_gp_size (stdoutput, 0);
11790         }
11791     }
11792   else
11793     as_warn (_("Unrecognized option \"%s\""), opt);
11794
11795   *input_line_pointer = c;
11796   demand_empty_rest_of_line ();
11797 }
11798
11799 /* This structure is used to hold a stack of .set values.  */
11800
11801 struct mips_option_stack
11802 {
11803   struct mips_option_stack *next;
11804   struct mips_set_options options;
11805 };
11806
11807 static struct mips_option_stack *mips_opts_stack;
11808
11809 /* Handle the .set pseudo-op.  */
11810
11811 static void
11812 s_mipsset (int x ATTRIBUTE_UNUSED)
11813 {
11814   char *name = input_line_pointer, ch;
11815
11816   while (!is_end_of_line[(unsigned char) *input_line_pointer])
11817     ++input_line_pointer;
11818   ch = *input_line_pointer;
11819   *input_line_pointer = '\0';
11820
11821   if (strcmp (name, "reorder") == 0)
11822     {
11823       if (mips_opts.noreorder && prev_nop_frag != NULL)
11824         {
11825           /* If we still have pending nops, we can discard them.  The
11826              usual nop handling will insert any that are still
11827              needed.  */
11828           prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11829                                     * (mips_opts.mips16 ? 2 : 4));
11830           prev_nop_frag = NULL;
11831         }
11832       mips_opts.noreorder = 0;
11833     }
11834   else if (strcmp (name, "noreorder") == 0)
11835     {
11836       mips_emit_delays (TRUE);
11837       mips_opts.noreorder = 1;
11838       mips_any_noreorder = 1;
11839     }
11840   else if (strcmp (name, "at") == 0)
11841     {
11842       mips_opts.noat = 0;
11843     }
11844   else if (strcmp (name, "noat") == 0)
11845     {
11846       mips_opts.noat = 1;
11847     }
11848   else if (strcmp (name, "macro") == 0)
11849     {
11850       mips_opts.warn_about_macros = 0;
11851     }
11852   else if (strcmp (name, "nomacro") == 0)
11853     {
11854       if (mips_opts.noreorder == 0)
11855         as_bad (_("`noreorder' must be set before `nomacro'"));
11856       mips_opts.warn_about_macros = 1;
11857     }
11858   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
11859     {
11860       mips_opts.nomove = 0;
11861     }
11862   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
11863     {
11864       mips_opts.nomove = 1;
11865     }
11866   else if (strcmp (name, "bopt") == 0)
11867     {
11868       mips_opts.nobopt = 0;
11869     }
11870   else if (strcmp (name, "nobopt") == 0)
11871     {
11872       mips_opts.nobopt = 1;
11873     }
11874   else if (strcmp (name, "mips16") == 0
11875            || strcmp (name, "MIPS-16") == 0)
11876     mips_opts.mips16 = 1;
11877   else if (strcmp (name, "nomips16") == 0
11878            || strcmp (name, "noMIPS-16") == 0)
11879     mips_opts.mips16 = 0;
11880   else if (strcmp (name, "mips3d") == 0)
11881     mips_opts.ase_mips3d = 1;
11882   else if (strcmp (name, "nomips3d") == 0)
11883     mips_opts.ase_mips3d = 0;
11884   else if (strcmp (name, "mdmx") == 0)
11885     mips_opts.ase_mdmx = 1;
11886   else if (strcmp (name, "nomdmx") == 0)
11887     mips_opts.ase_mdmx = 0;
11888   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
11889     {
11890       int reset = 0;
11891
11892       /* Permit the user to change the ISA and architecture on the fly.
11893          Needless to say, misuse can cause serious problems.  */
11894       if (strcmp (name, "mips0") == 0)
11895         {
11896           reset = 1;
11897           mips_opts.isa = file_mips_isa;
11898         }
11899       else if (strcmp (name, "mips1") == 0)
11900         mips_opts.isa = ISA_MIPS1;
11901       else if (strcmp (name, "mips2") == 0)
11902         mips_opts.isa = ISA_MIPS2;
11903       else if (strcmp (name, "mips3") == 0)
11904         mips_opts.isa = ISA_MIPS3;
11905       else if (strcmp (name, "mips4") == 0)
11906         mips_opts.isa = ISA_MIPS4;
11907       else if (strcmp (name, "mips5") == 0)
11908         mips_opts.isa = ISA_MIPS5;
11909       else if (strcmp (name, "mips32") == 0)
11910         mips_opts.isa = ISA_MIPS32;
11911       else if (strcmp (name, "mips32r2") == 0)
11912         mips_opts.isa = ISA_MIPS32R2;
11913       else if (strcmp (name, "mips64") == 0)
11914         mips_opts.isa = ISA_MIPS64;
11915       else if (strcmp (name, "mips64r2") == 0)
11916         mips_opts.isa = ISA_MIPS64R2;
11917       else if (strcmp (name, "arch=default") == 0)
11918         {
11919           reset = 1;
11920           mips_opts.arch = file_mips_arch;
11921           mips_opts.isa = file_mips_isa;
11922         }
11923       else if (strncmp (name, "arch=", 5) == 0)
11924         {
11925           const struct mips_cpu_info *p;
11926
11927           p = mips_parse_cpu("internal use", name + 5);
11928           if (!p)
11929             as_bad (_("unknown architecture %s"), name + 5);
11930           else
11931             {
11932               mips_opts.arch = p->cpu;
11933               mips_opts.isa = p->isa;
11934             }
11935         }
11936       else
11937         as_bad (_("unknown ISA level %s"), name + 4);
11938
11939       switch (mips_opts.isa)
11940         {
11941         case  0:
11942           break;
11943         case ISA_MIPS1:
11944         case ISA_MIPS2:
11945         case ISA_MIPS32:
11946         case ISA_MIPS32R2:
11947           mips_opts.gp32 = 1;
11948           mips_opts.fp32 = 1;
11949           break;
11950         case ISA_MIPS3:
11951         case ISA_MIPS4:
11952         case ISA_MIPS5:
11953         case ISA_MIPS64:
11954         case ISA_MIPS64R2:
11955           mips_opts.gp32 = 0;
11956           mips_opts.fp32 = 0;
11957           break;
11958         default:
11959           as_bad (_("unknown ISA level %s"), name + 4);
11960           break;
11961         }
11962       if (reset)
11963         {
11964           mips_opts.gp32 = file_mips_gp32;
11965           mips_opts.fp32 = file_mips_fp32;
11966         }
11967     }
11968   else if (strcmp (name, "autoextend") == 0)
11969     mips_opts.noautoextend = 0;
11970   else if (strcmp (name, "noautoextend") == 0)
11971     mips_opts.noautoextend = 1;
11972   else if (strcmp (name, "push") == 0)
11973     {
11974       struct mips_option_stack *s;
11975
11976       s = (struct mips_option_stack *) xmalloc (sizeof *s);
11977       s->next = mips_opts_stack;
11978       s->options = mips_opts;
11979       mips_opts_stack = s;
11980     }
11981   else if (strcmp (name, "pop") == 0)
11982     {
11983       struct mips_option_stack *s;
11984
11985       s = mips_opts_stack;
11986       if (s == NULL)
11987         as_bad (_(".set pop with no .set push"));
11988       else
11989         {
11990           /* If we're changing the reorder mode we need to handle
11991              delay slots correctly.  */
11992           if (s->options.noreorder && ! mips_opts.noreorder)
11993             mips_emit_delays (TRUE);
11994           else if (! s->options.noreorder && mips_opts.noreorder)
11995             {
11996               if (prev_nop_frag != NULL)
11997                 {
11998                   prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11999                                             * (mips_opts.mips16 ? 2 : 4));
12000                   prev_nop_frag = NULL;
12001                 }
12002             }
12003
12004           mips_opts = s->options;
12005           mips_opts_stack = s->next;
12006           free (s);
12007         }
12008     }
12009   else
12010     {
12011       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12012     }
12013   *input_line_pointer = ch;
12014   demand_empty_rest_of_line ();
12015 }
12016
12017 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12018    .option pic2.  It means to generate SVR4 PIC calls.  */
12019
12020 static void
12021 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12022 {
12023   mips_pic = SVR4_PIC;
12024   mips_abicalls = TRUE;
12025   if (USE_GLOBAL_POINTER_OPT)
12026     {
12027       if (g_switch_seen && g_switch_value != 0)
12028         as_warn (_("-G may not be used with SVR4 PIC code"));
12029       g_switch_value = 0;
12030     }
12031   bfd_set_gp_size (stdoutput, 0);
12032   demand_empty_rest_of_line ();
12033 }
12034
12035 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12036    PIC code.  It sets the $gp register for the function based on the
12037    function address, which is in the register named in the argument.
12038    This uses a relocation against _gp_disp, which is handled specially
12039    by the linker.  The result is:
12040         lui     $gp,%hi(_gp_disp)
12041         addiu   $gp,$gp,%lo(_gp_disp)
12042         addu    $gp,$gp,.cpload argument
12043    The .cpload argument is normally $25 == $t9.  */
12044
12045 static void
12046 s_cpload (int ignore ATTRIBUTE_UNUSED)
12047 {
12048   expressionS ex;
12049
12050   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12051      .cpload is ignored.  */
12052   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12053     {
12054       s_ignore (0);
12055       return;
12056     }
12057
12058   /* .cpload should be in a .set noreorder section.  */
12059   if (mips_opts.noreorder == 0)
12060     as_warn (_(".cpload not in noreorder section"));
12061
12062   ex.X_op = O_symbol;
12063   ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12064   ex.X_op_symbol = NULL;
12065   ex.X_add_number = 0;
12066
12067   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12068   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12069
12070   macro_start ();
12071   macro_build_lui (&ex, mips_gp_register);
12072   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12073                mips_gp_register, BFD_RELOC_LO16);
12074   macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12075                mips_gp_register, tc_get_register (0));
12076   macro_end ();
12077
12078   demand_empty_rest_of_line ();
12079 }
12080
12081 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12082      .cpsetup $reg1, offset|$reg2, label
12083
12084    If offset is given, this results in:
12085      sd         $gp, offset($sp)
12086      lui        $gp, %hi(%neg(%gp_rel(label)))
12087      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12088      daddu      $gp, $gp, $reg1
12089
12090    If $reg2 is given, this results in:
12091      daddu      $reg2, $gp, $0
12092      lui        $gp, %hi(%neg(%gp_rel(label)))
12093      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12094      daddu      $gp, $gp, $reg1
12095    $reg1 is normally $25 == $t9.  */
12096 static void
12097 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12098 {
12099   expressionS ex_off;
12100   expressionS ex_sym;
12101   int reg1;
12102   char *f;
12103
12104   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12105      We also need NewABI support.  */
12106   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12107     {
12108       s_ignore (0);
12109       return;
12110     }
12111
12112   reg1 = tc_get_register (0);
12113   SKIP_WHITESPACE ();
12114   if (*input_line_pointer != ',')
12115     {
12116       as_bad (_("missing argument separator ',' for .cpsetup"));
12117       return;
12118     }
12119   else
12120     ++input_line_pointer;
12121   SKIP_WHITESPACE ();
12122   if (*input_line_pointer == '$')
12123     {
12124       mips_cpreturn_register = tc_get_register (0);
12125       mips_cpreturn_offset = -1;
12126     }
12127   else
12128     {
12129       mips_cpreturn_offset = get_absolute_expression ();
12130       mips_cpreturn_register = -1;
12131     }
12132   SKIP_WHITESPACE ();
12133   if (*input_line_pointer != ',')
12134     {
12135       as_bad (_("missing argument separator ',' for .cpsetup"));
12136       return;
12137     }
12138   else
12139     ++input_line_pointer;
12140   SKIP_WHITESPACE ();
12141   expression (&ex_sym);
12142
12143   macro_start ();
12144   if (mips_cpreturn_register == -1)
12145     {
12146       ex_off.X_op = O_constant;
12147       ex_off.X_add_symbol = NULL;
12148       ex_off.X_op_symbol = NULL;
12149       ex_off.X_add_number = mips_cpreturn_offset;
12150
12151       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12152                    BFD_RELOC_LO16, SP);
12153     }
12154   else
12155     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12156                  mips_gp_register, 0);
12157
12158   /* Ensure there's room for the next two instructions, so that `f'
12159      doesn't end up with an address in the wrong frag.  */
12160   frag_grow (8);
12161   f = frag_more (0);
12162   macro_build (&ex_sym, "lui", "t,u", mips_gp_register, BFD_RELOC_GPREL16);
12163   fix_new (frag_now, f - frag_now->fr_literal,
12164            8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12165   fix_new (frag_now, f - frag_now->fr_literal,
12166            4, NULL, 0, 0, BFD_RELOC_HI16_S);
12167
12168   f = frag_more (0);
12169   macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12170                mips_gp_register, BFD_RELOC_GPREL16);
12171   fix_new (frag_now, f - frag_now->fr_literal,
12172            8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12173   fix_new (frag_now, f - frag_now->fr_literal,
12174            4, NULL, 0, 0, BFD_RELOC_LO16);
12175
12176   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12177                mips_gp_register, reg1);
12178   macro_end ();
12179
12180   demand_empty_rest_of_line ();
12181 }
12182
12183 static void
12184 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12185 {
12186   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12187    .cplocal is ignored.  */
12188   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12189     {
12190       s_ignore (0);
12191       return;
12192     }
12193
12194   mips_gp_register = tc_get_register (0);
12195   demand_empty_rest_of_line ();
12196 }
12197
12198 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12199    offset from $sp.  The offset is remembered, and after making a PIC
12200    call $gp is restored from that location.  */
12201
12202 static void
12203 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12204 {
12205   expressionS ex;
12206
12207   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12208      .cprestore is ignored.  */
12209   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12210     {
12211       s_ignore (0);
12212       return;
12213     }
12214
12215   mips_cprestore_offset = get_absolute_expression ();
12216   mips_cprestore_valid = 1;
12217
12218   ex.X_op = O_constant;
12219   ex.X_add_symbol = NULL;
12220   ex.X_op_symbol = NULL;
12221   ex.X_add_number = mips_cprestore_offset;
12222
12223   macro_start ();
12224   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12225                                 SP, HAVE_64BIT_ADDRESSES);
12226   macro_end ();
12227
12228   demand_empty_rest_of_line ();
12229 }
12230
12231 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12232    was given in the preceding .cpsetup, it results in:
12233      ld         $gp, offset($sp)
12234
12235    If a register $reg2 was given there, it results in:
12236      daddu      $gp, $reg2, $0
12237  */
12238 static void
12239 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12240 {
12241   expressionS ex;
12242
12243   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12244      We also need NewABI support.  */
12245   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12246     {
12247       s_ignore (0);
12248       return;
12249     }
12250
12251   macro_start ();
12252   if (mips_cpreturn_register == -1)
12253     {
12254       ex.X_op = O_constant;
12255       ex.X_add_symbol = NULL;
12256       ex.X_op_symbol = NULL;
12257       ex.X_add_number = mips_cpreturn_offset;
12258
12259       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12260     }
12261   else
12262     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12263                  mips_cpreturn_register, 0);
12264   macro_end ();
12265
12266   demand_empty_rest_of_line ();
12267 }
12268
12269 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12270    code.  It sets the offset to use in gp_rel relocations.  */
12271
12272 static void
12273 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12274 {
12275   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12276      We also need NewABI support.  */
12277   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12278     {
12279       s_ignore (0);
12280       return;
12281     }
12282
12283   mips_gprel_offset = get_absolute_expression ();
12284
12285   demand_empty_rest_of_line ();
12286 }
12287
12288 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12289    code.  It generates a 32 bit GP relative reloc.  */
12290
12291 static void
12292 s_gpword (int ignore ATTRIBUTE_UNUSED)
12293 {
12294   symbolS *label;
12295   expressionS ex;
12296   char *p;
12297
12298   /* When not generating PIC code, this is treated as .word.  */
12299   if (mips_pic != SVR4_PIC)
12300     {
12301       s_cons (2);
12302       return;
12303     }
12304
12305   label = insn_labels != NULL ? insn_labels->label : NULL;
12306   mips_emit_delays (TRUE);
12307   if (auto_align)
12308     mips_align (2, 0, label);
12309   mips_clear_insn_labels ();
12310
12311   expression (&ex);
12312
12313   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12314     {
12315       as_bad (_("Unsupported use of .gpword"));
12316       ignore_rest_of_line ();
12317     }
12318
12319   p = frag_more (4);
12320   md_number_to_chars (p, 0, 4);
12321   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12322                BFD_RELOC_GPREL32);
12323
12324   demand_empty_rest_of_line ();
12325 }
12326
12327 static void
12328 s_gpdword (int ignore ATTRIBUTE_UNUSED)
12329 {
12330   symbolS *label;
12331   expressionS ex;
12332   char *p;
12333
12334   /* When not generating PIC code, this is treated as .dword.  */
12335   if (mips_pic != SVR4_PIC)
12336     {
12337       s_cons (3);
12338       return;
12339     }
12340
12341   label = insn_labels != NULL ? insn_labels->label : NULL;
12342   mips_emit_delays (TRUE);
12343   if (auto_align)
12344     mips_align (3, 0, label);
12345   mips_clear_insn_labels ();
12346
12347   expression (&ex);
12348
12349   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12350     {
12351       as_bad (_("Unsupported use of .gpdword"));
12352       ignore_rest_of_line ();
12353     }
12354
12355   p = frag_more (8);
12356   md_number_to_chars (p, 0, 8);
12357   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12358                BFD_RELOC_GPREL32);
12359
12360   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12361   ex.X_op = O_absent;
12362   ex.X_add_symbol = 0;
12363   ex.X_add_number = 0;
12364   fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12365                BFD_RELOC_64);
12366
12367   demand_empty_rest_of_line ();
12368 }
12369
12370 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12371    tables in SVR4 PIC code.  */
12372
12373 static void
12374 s_cpadd (int ignore ATTRIBUTE_UNUSED)
12375 {
12376   int reg;
12377
12378   /* This is ignored when not generating SVR4 PIC code.  */
12379   if (mips_pic != SVR4_PIC)
12380     {
12381       s_ignore (0);
12382       return;
12383     }
12384
12385   /* Add $gp to the register named as an argument.  */
12386   macro_start ();
12387   reg = tc_get_register (0);
12388   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12389   macro_end ();
12390
12391   demand_empty_rest_of_line ();
12392 }
12393
12394 /* Handle the .insn pseudo-op.  This marks instruction labels in
12395    mips16 mode.  This permits the linker to handle them specially,
12396    such as generating jalx instructions when needed.  We also make
12397    them odd for the duration of the assembly, in order to generate the
12398    right sort of code.  We will make them even in the adjust_symtab
12399    routine, while leaving them marked.  This is convenient for the
12400    debugger and the disassembler.  The linker knows to make them odd
12401    again.  */
12402
12403 static void
12404 s_insn (int ignore ATTRIBUTE_UNUSED)
12405 {
12406   mips16_mark_labels ();
12407
12408   demand_empty_rest_of_line ();
12409 }
12410
12411 /* Handle a .stabn directive.  We need these in order to mark a label
12412    as being a mips16 text label correctly.  Sometimes the compiler
12413    will emit a label, followed by a .stabn, and then switch sections.
12414    If the label and .stabn are in mips16 mode, then the label is
12415    really a mips16 text label.  */
12416
12417 static void
12418 s_mips_stab (int type)
12419 {
12420   if (type == 'n')
12421     mips16_mark_labels ();
12422
12423   s_stab (type);
12424 }
12425
12426 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12427  */
12428
12429 static void
12430 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12431 {
12432   char *name;
12433   int c;
12434   symbolS *symbolP;
12435   expressionS exp;
12436
12437   name = input_line_pointer;
12438   c = get_symbol_end ();
12439   symbolP = symbol_find_or_make (name);
12440   S_SET_WEAK (symbolP);
12441   *input_line_pointer = c;
12442
12443   SKIP_WHITESPACE ();
12444
12445   if (! is_end_of_line[(unsigned char) *input_line_pointer])
12446     {
12447       if (S_IS_DEFINED (symbolP))
12448         {
12449           as_bad ("ignoring attempt to redefine symbol %s",
12450                   S_GET_NAME (symbolP));
12451           ignore_rest_of_line ();
12452           return;
12453         }
12454
12455       if (*input_line_pointer == ',')
12456         {
12457           ++input_line_pointer;
12458           SKIP_WHITESPACE ();
12459         }
12460
12461       expression (&exp);
12462       if (exp.X_op != O_symbol)
12463         {
12464           as_bad ("bad .weakext directive");
12465           ignore_rest_of_line ();
12466           return;
12467         }
12468       symbol_set_value_expression (symbolP, &exp);
12469     }
12470
12471   demand_empty_rest_of_line ();
12472 }
12473
12474 /* Parse a register string into a number.  Called from the ECOFF code
12475    to parse .frame.  The argument is non-zero if this is the frame
12476    register, so that we can record it in mips_frame_reg.  */
12477
12478 int
12479 tc_get_register (int frame)
12480 {
12481   int reg;
12482
12483   SKIP_WHITESPACE ();
12484   if (*input_line_pointer++ != '$')
12485     {
12486       as_warn (_("expected `$'"));
12487       reg = ZERO;
12488     }
12489   else if (ISDIGIT (*input_line_pointer))
12490     {
12491       reg = get_absolute_expression ();
12492       if (reg < 0 || reg >= 32)
12493         {
12494           as_warn (_("Bad register number"));
12495           reg = ZERO;
12496         }
12497     }
12498   else
12499     {
12500       if (strncmp (input_line_pointer, "ra", 2) == 0)
12501         {
12502           reg = RA;
12503           input_line_pointer += 2;
12504         }
12505       else if (strncmp (input_line_pointer, "fp", 2) == 0)
12506         {
12507           reg = FP;
12508           input_line_pointer += 2;
12509         }
12510       else if (strncmp (input_line_pointer, "sp", 2) == 0)
12511         {
12512           reg = SP;
12513           input_line_pointer += 2;
12514         }
12515       else if (strncmp (input_line_pointer, "gp", 2) == 0)
12516         {
12517           reg = GP;
12518           input_line_pointer += 2;
12519         }
12520       else if (strncmp (input_line_pointer, "at", 2) == 0)
12521         {
12522           reg = AT;
12523           input_line_pointer += 2;
12524         }
12525       else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12526         {
12527           reg = KT0;
12528           input_line_pointer += 3;
12529         }
12530       else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12531         {
12532           reg = KT1;
12533           input_line_pointer += 3;
12534         }
12535       else if (strncmp (input_line_pointer, "zero", 4) == 0)
12536         {
12537           reg = ZERO;
12538           input_line_pointer += 4;
12539         }
12540       else
12541         {
12542           as_warn (_("Unrecognized register name"));
12543           reg = ZERO;
12544           while (ISALNUM(*input_line_pointer))
12545            input_line_pointer++;
12546         }
12547     }
12548   if (frame)
12549     {
12550       mips_frame_reg = reg != 0 ? reg : SP;
12551       mips_frame_reg_valid = 1;
12552       mips_cprestore_valid = 0;
12553     }
12554   return reg;
12555 }
12556
12557 valueT
12558 md_section_align (asection *seg, valueT addr)
12559 {
12560   int align = bfd_get_section_alignment (stdoutput, seg);
12561
12562 #ifdef OBJ_ELF
12563   /* We don't need to align ELF sections to the full alignment.
12564      However, Irix 5 may prefer that we align them at least to a 16
12565      byte boundary.  We don't bother to align the sections if we are
12566      targeted for an embedded system.  */
12567   if (strcmp (TARGET_OS, "elf") == 0)
12568     return addr;
12569   if (align > 4)
12570     align = 4;
12571 #endif
12572
12573   return ((addr + (1 << align) - 1) & (-1 << align));
12574 }
12575
12576 /* Utility routine, called from above as well.  If called while the
12577    input file is still being read, it's only an approximation.  (For
12578    example, a symbol may later become defined which appeared to be
12579    undefined earlier.)  */
12580
12581 static int
12582 nopic_need_relax (symbolS *sym, int before_relaxing)
12583 {
12584   if (sym == 0)
12585     return 0;
12586
12587   if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
12588     {
12589       const char *symname;
12590       int change;
12591
12592       /* Find out whether this symbol can be referenced off the $gp
12593          register.  It can be if it is smaller than the -G size or if
12594          it is in the .sdata or .sbss section.  Certain symbols can
12595          not be referenced off the $gp, although it appears as though
12596          they can.  */
12597       symname = S_GET_NAME (sym);
12598       if (symname != (const char *) NULL
12599           && (strcmp (symname, "eprol") == 0
12600               || strcmp (symname, "etext") == 0
12601               || strcmp (symname, "_gp") == 0
12602               || strcmp (symname, "edata") == 0
12603               || strcmp (symname, "_fbss") == 0
12604               || strcmp (symname, "_fdata") == 0
12605               || strcmp (symname, "_ftext") == 0
12606               || strcmp (symname, "end") == 0
12607               || strcmp (symname, "_gp_disp") == 0))
12608         change = 1;
12609       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12610                && (0
12611 #ifndef NO_ECOFF_DEBUGGING
12612                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
12613                        && (symbol_get_obj (sym)->ecoff_extern_size
12614                            <= g_switch_value))
12615 #endif
12616                    /* We must defer this decision until after the whole
12617                       file has been read, since there might be a .extern
12618                       after the first use of this symbol.  */
12619                    || (before_relaxing
12620 #ifndef NO_ECOFF_DEBUGGING
12621                        && symbol_get_obj (sym)->ecoff_extern_size == 0
12622 #endif
12623                        && S_GET_VALUE (sym) == 0)
12624                    || (S_GET_VALUE (sym) != 0
12625                        && S_GET_VALUE (sym) <= g_switch_value)))
12626         change = 0;
12627       else
12628         {
12629           const char *segname;
12630
12631           segname = segment_name (S_GET_SEGMENT (sym));
12632           assert (strcmp (segname, ".lit8") != 0
12633                   && strcmp (segname, ".lit4") != 0);
12634           change = (strcmp (segname, ".sdata") != 0
12635                     && strcmp (segname, ".sbss") != 0
12636                     && strncmp (segname, ".sdata.", 7) != 0
12637                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
12638         }
12639       return change;
12640     }
12641   else
12642     /* We are not optimizing for the $gp register.  */
12643     return 1;
12644 }
12645
12646
12647 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
12648
12649 static bfd_boolean
12650 pic_need_relax (symbolS *sym, asection *segtype)
12651 {
12652   asection *symsec;
12653   bfd_boolean linkonce;
12654
12655   /* Handle the case of a symbol equated to another symbol.  */
12656   while (symbol_equated_reloc_p (sym))
12657     {
12658       symbolS *n;
12659
12660       /* It's possible to get a loop here in a badly written
12661          program.  */
12662       n = symbol_get_value_expression (sym)->X_add_symbol;
12663       if (n == sym)
12664         break;
12665       sym = n;
12666     }
12667
12668   symsec = S_GET_SEGMENT (sym);
12669
12670   /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12671   linkonce = FALSE;
12672   if (symsec != segtype && ! S_IS_LOCAL (sym))
12673     {
12674       if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12675           != 0)
12676         linkonce = TRUE;
12677
12678       /* The GNU toolchain uses an extension for ELF: a section
12679          beginning with the magic string .gnu.linkonce is a linkonce
12680          section.  */
12681       if (strncmp (segment_name (symsec), ".gnu.linkonce",
12682                    sizeof ".gnu.linkonce" - 1) == 0)
12683         linkonce = TRUE;
12684     }
12685
12686   /* This must duplicate the test in adjust_reloc_syms.  */
12687   return (symsec != &bfd_und_section
12688           && symsec != &bfd_abs_section
12689           && ! bfd_is_com_section (symsec)
12690           && !linkonce
12691 #ifdef OBJ_ELF
12692           /* A global or weak symbol is treated as external.  */
12693           && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12694               || (! S_IS_WEAK (sym)
12695                   && (! S_IS_EXTERNAL (sym)
12696                       || mips_pic == EMBEDDED_PIC)))
12697 #endif
12698           );
12699 }
12700
12701
12702 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12703    extended opcode.  SEC is the section the frag is in.  */
12704
12705 static int
12706 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
12707 {
12708   int type;
12709   register const struct mips16_immed_operand *op;
12710   offsetT val;
12711   int mintiny, maxtiny;
12712   segT symsec;
12713   fragS *sym_frag;
12714
12715   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12716     return 0;
12717   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12718     return 1;
12719
12720   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12721   op = mips16_immed_operands;
12722   while (op->type != type)
12723     {
12724       ++op;
12725       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12726     }
12727
12728   if (op->unsp)
12729     {
12730       if (type == '<' || type == '>' || type == '[' || type == ']')
12731         {
12732           mintiny = 1;
12733           maxtiny = 1 << op->nbits;
12734         }
12735       else
12736         {
12737           mintiny = 0;
12738           maxtiny = (1 << op->nbits) - 1;
12739         }
12740     }
12741   else
12742     {
12743       mintiny = - (1 << (op->nbits - 1));
12744       maxtiny = (1 << (op->nbits - 1)) - 1;
12745     }
12746
12747   sym_frag = symbol_get_frag (fragp->fr_symbol);
12748   val = S_GET_VALUE (fragp->fr_symbol);
12749   symsec = S_GET_SEGMENT (fragp->fr_symbol);
12750
12751   if (op->pcrel)
12752     {
12753       addressT addr;
12754
12755       /* We won't have the section when we are called from
12756          mips_relax_frag.  However, we will always have been called
12757          from md_estimate_size_before_relax first.  If this is a
12758          branch to a different section, we mark it as such.  If SEC is
12759          NULL, and the frag is not marked, then it must be a branch to
12760          the same section.  */
12761       if (sec == NULL)
12762         {
12763           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12764             return 1;
12765         }
12766       else
12767         {
12768           /* Must have been called from md_estimate_size_before_relax.  */
12769           if (symsec != sec)
12770             {
12771               fragp->fr_subtype =
12772                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12773
12774               /* FIXME: We should support this, and let the linker
12775                  catch branches and loads that are out of range.  */
12776               as_bad_where (fragp->fr_file, fragp->fr_line,
12777                             _("unsupported PC relative reference to different section"));
12778
12779               return 1;
12780             }
12781           if (fragp != sym_frag && sym_frag->fr_address == 0)
12782             /* Assume non-extended on the first relaxation pass.
12783                The address we have calculated will be bogus if this is
12784                a forward branch to another frag, as the forward frag
12785                will have fr_address == 0.  */
12786             return 0;
12787         }
12788
12789       /* In this case, we know for sure that the symbol fragment is in
12790          the same section.  If the relax_marker of the symbol fragment
12791          differs from the relax_marker of this fragment, we have not
12792          yet adjusted the symbol fragment fr_address.  We want to add
12793          in STRETCH in order to get a better estimate of the address.
12794          This particularly matters because of the shift bits.  */
12795       if (stretch != 0
12796           && sym_frag->relax_marker != fragp->relax_marker)
12797         {
12798           fragS *f;
12799
12800           /* Adjust stretch for any alignment frag.  Note that if have
12801              been expanding the earlier code, the symbol may be
12802              defined in what appears to be an earlier frag.  FIXME:
12803              This doesn't handle the fr_subtype field, which specifies
12804              a maximum number of bytes to skip when doing an
12805              alignment.  */
12806           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12807             {
12808               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12809                 {
12810                   if (stretch < 0)
12811                     stretch = - ((- stretch)
12812                                  & ~ ((1 << (int) f->fr_offset) - 1));
12813                   else
12814                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
12815                   if (stretch == 0)
12816                     break;
12817                 }
12818             }
12819           if (f != NULL)
12820             val += stretch;
12821         }
12822
12823       addr = fragp->fr_address + fragp->fr_fix;
12824
12825       /* The base address rules are complicated.  The base address of
12826          a branch is the following instruction.  The base address of a
12827          PC relative load or add is the instruction itself, but if it
12828          is in a delay slot (in which case it can not be extended) use
12829          the address of the instruction whose delay slot it is in.  */
12830       if (type == 'p' || type == 'q')
12831         {
12832           addr += 2;
12833
12834           /* If we are currently assuming that this frag should be
12835              extended, then, the current address is two bytes
12836              higher.  */
12837           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12838             addr += 2;
12839
12840           /* Ignore the low bit in the target, since it will be set
12841              for a text label.  */
12842           if ((val & 1) != 0)
12843             --val;
12844         }
12845       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12846         addr -= 4;
12847       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12848         addr -= 2;
12849
12850       val -= addr & ~ ((1 << op->shift) - 1);
12851
12852       /* Branch offsets have an implicit 0 in the lowest bit.  */
12853       if (type == 'p' || type == 'q')
12854         val /= 2;
12855
12856       /* If any of the shifted bits are set, we must use an extended
12857          opcode.  If the address depends on the size of this
12858          instruction, this can lead to a loop, so we arrange to always
12859          use an extended opcode.  We only check this when we are in
12860          the main relaxation loop, when SEC is NULL.  */
12861       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
12862         {
12863           fragp->fr_subtype =
12864             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12865           return 1;
12866         }
12867
12868       /* If we are about to mark a frag as extended because the value
12869          is precisely maxtiny + 1, then there is a chance of an
12870          infinite loop as in the following code:
12871              la $4,foo
12872              .skip      1020
12873              .align     2
12874            foo:
12875          In this case when the la is extended, foo is 0x3fc bytes
12876          away, so the la can be shrunk, but then foo is 0x400 away, so
12877          the la must be extended.  To avoid this loop, we mark the
12878          frag as extended if it was small, and is about to become
12879          extended with a value of maxtiny + 1.  */
12880       if (val == ((maxtiny + 1) << op->shift)
12881           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
12882           && sec == NULL)
12883         {
12884           fragp->fr_subtype =
12885             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12886           return 1;
12887         }
12888     }
12889   else if (symsec != absolute_section && sec != NULL)
12890     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
12891
12892   if ((val & ((1 << op->shift) - 1)) != 0
12893       || val < (mintiny << op->shift)
12894       || val > (maxtiny << op->shift))
12895     return 1;
12896   else
12897     return 0;
12898 }
12899
12900 /* Compute the length of a branch sequence, and adjust the
12901    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
12902    worst-case length is computed, with UPDATE being used to indicate
12903    whether an unconditional (-1), branch-likely (+1) or regular (0)
12904    branch is to be computed.  */
12905 static int
12906 relaxed_branch_length (fragS *fragp, asection *sec, int update)
12907 {
12908   bfd_boolean toofar;
12909   int length;
12910
12911   if (fragp
12912       && S_IS_DEFINED (fragp->fr_symbol)
12913       && sec == S_GET_SEGMENT (fragp->fr_symbol))
12914     {
12915       addressT addr;
12916       offsetT val;
12917
12918       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
12919
12920       addr = fragp->fr_address + fragp->fr_fix + 4;
12921
12922       val -= addr;
12923
12924       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
12925     }
12926   else if (fragp)
12927     /* If the symbol is not defined or it's in a different segment,
12928        assume the user knows what's going on and emit a short
12929        branch.  */
12930     toofar = FALSE;
12931   else
12932     toofar = TRUE;
12933
12934   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
12935     fragp->fr_subtype
12936       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
12937                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
12938                              RELAX_BRANCH_LINK (fragp->fr_subtype),
12939                              toofar);
12940
12941   length = 4;
12942   if (toofar)
12943     {
12944       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
12945         length += 8;
12946
12947       if (mips_pic != NO_PIC)
12948         {
12949           /* Additional space for PIC loading of target address.  */
12950           length += 8;
12951           if (mips_opts.isa == ISA_MIPS1)
12952             /* Additional space for $at-stabilizing nop.  */
12953             length += 4;
12954         }
12955
12956       /* If branch is conditional.  */
12957       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
12958         length += 8;
12959     }
12960
12961   return length;
12962 }
12963
12964 /* Estimate the size of a frag before relaxing.  Unless this is the
12965    mips16, we are not really relaxing here, and the final size is
12966    encoded in the subtype information.  For the mips16, we have to
12967    decide whether we are using an extended opcode or not.  */
12968
12969 int
12970 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
12971 {
12972   int change;
12973
12974   if (RELAX_BRANCH_P (fragp->fr_subtype))
12975     {
12976
12977       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
12978
12979       return fragp->fr_var;
12980     }
12981
12982   if (RELAX_MIPS16_P (fragp->fr_subtype))
12983     /* We don't want to modify the EXTENDED bit here; it might get us
12984        into infinite loops.  We change it only in mips_relax_frag().  */
12985     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
12986
12987   if (mips_pic == NO_PIC)
12988     change = nopic_need_relax (fragp->fr_symbol, 0);
12989   else if (mips_pic == SVR4_PIC)
12990     change = pic_need_relax (fragp->fr_symbol, segtype);
12991   else
12992     abort ();
12993
12994   if (change)
12995     {
12996       fragp->fr_subtype |= RELAX_USE_SECOND;
12997       return -RELAX_FIRST (fragp->fr_subtype);
12998     }
12999   else
13000     return -RELAX_SECOND (fragp->fr_subtype);
13001 }
13002
13003 /* This is called to see whether a reloc against a defined symbol
13004    should be converted into a reloc against a section.  Don't adjust
13005    MIPS16 jump relocations, so we don't have to worry about the format
13006    of the offset in the .o file.  Don't adjust relocations against
13007    mips16 symbols, so that the linker can find them if it needs to set
13008    up a stub.  */
13009
13010 int
13011 mips_fix_adjustable (fixS *fixp)
13012 {
13013   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13014     return 0;
13015
13016   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13017       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13018     return 0;
13019
13020   if (fixp->fx_addsy == NULL)
13021     return 1;
13022
13023 #ifdef OBJ_ELF
13024   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13025       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13026       && fixp->fx_subsy == NULL)
13027     return 0;
13028 #endif
13029
13030   return 1;
13031 }
13032
13033 /* Translate internal representation of relocation info to BFD target
13034    format.  */
13035
13036 arelent **
13037 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13038 {
13039   static arelent *retval[4];
13040   arelent *reloc;
13041   bfd_reloc_code_real_type code;
13042
13043   memset (retval, 0, sizeof(retval));
13044   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13045   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13046   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13047   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13048
13049   if (mips_pic == EMBEDDED_PIC
13050       && SWITCH_TABLE (fixp))
13051     {
13052       /* For a switch table entry we use a special reloc.  The addend
13053          is actually the difference between the reloc address and the
13054          subtrahend.  */
13055       reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13056       if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13057         as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13058       fixp->fx_r_type = BFD_RELOC_GPREL32;
13059     }
13060   else if (fixp->fx_pcrel)
13061     {
13062       bfd_vma pcrel_address;
13063
13064       /* Set PCREL_ADDRESS to this relocation's "PC".  The PC for high
13065          high-part relocs is the address of the low-part reloc.  */
13066       if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13067         {
13068           assert (fixp->fx_next != NULL
13069                   && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
13070           pcrel_address = (fixp->fx_next->fx_where
13071                            + fixp->fx_next->fx_frag->fr_address);
13072         }
13073       else
13074         pcrel_address = reloc->address;
13075
13076       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13077         {
13078           /* At this point, fx_addnumber is "symbol offset - pcrel_address".
13079              Relocations want only the symbol offset.  */
13080           reloc->addend = fixp->fx_addnumber + pcrel_address;
13081         }
13082       else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16
13083                || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13084         {
13085           /* We use a special addend for an internal RELLO or RELHI reloc.  */
13086           if (symbol_section_p (fixp->fx_addsy))
13087             reloc->addend = pcrel_address - S_GET_VALUE (fixp->fx_subsy);
13088           else
13089             reloc->addend = fixp->fx_addnumber + pcrel_address;
13090         }
13091       else
13092         {
13093           if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13094             /* A gruesome hack which is a result of the gruesome gas reloc
13095                handling.  */
13096             reloc->addend = pcrel_address;
13097           else
13098             reloc->addend = -pcrel_address;
13099         }
13100     }
13101   else
13102     reloc->addend = fixp->fx_addnumber;
13103
13104   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13105      entry to be used in the relocation's section offset.  */
13106   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13107     {
13108       reloc->address = reloc->addend;
13109       reloc->addend = 0;
13110     }
13111
13112   /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13113      fixup_segment converted a non-PC relative reloc into a PC
13114      relative reloc.  In such a case, we need to convert the reloc
13115      code.  */
13116   code = fixp->fx_r_type;
13117   if (fixp->fx_pcrel)
13118     {
13119       switch (code)
13120         {
13121         case BFD_RELOC_8:
13122           code = BFD_RELOC_8_PCREL;
13123           break;
13124         case BFD_RELOC_16:
13125           code = BFD_RELOC_16_PCREL;
13126           break;
13127         case BFD_RELOC_32:
13128           code = BFD_RELOC_32_PCREL;
13129           break;
13130         case BFD_RELOC_64:
13131           code = BFD_RELOC_64_PCREL;
13132           break;
13133         case BFD_RELOC_8_PCREL:
13134         case BFD_RELOC_16_PCREL:
13135         case BFD_RELOC_32_PCREL:
13136         case BFD_RELOC_64_PCREL:
13137         case BFD_RELOC_16_PCREL_S2:
13138         case BFD_RELOC_PCREL_HI16_S:
13139         case BFD_RELOC_PCREL_LO16:
13140           break;
13141         default:
13142           as_bad_where (fixp->fx_file, fixp->fx_line,
13143                         _("Cannot make %s relocation PC relative"),
13144                         bfd_get_reloc_code_name (code));
13145         }
13146     }
13147
13148   /* To support a PC relative reloc when generating embedded PIC code
13149      for ECOFF, we use a Cygnus extension.  We check for that here to
13150      make sure that we don't let such a reloc escape normally.  */
13151   if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13152        || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13153       && code == BFD_RELOC_16_PCREL_S2
13154       && mips_pic != EMBEDDED_PIC)
13155     reloc->howto = NULL;
13156   else
13157     reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13158
13159   if (reloc->howto == NULL)
13160     {
13161       as_bad_where (fixp->fx_file, fixp->fx_line,
13162                     _("Can not represent %s relocation in this object file format"),
13163                     bfd_get_reloc_code_name (code));
13164       retval[0] = NULL;
13165     }
13166
13167   return retval;
13168 }
13169
13170 /* Relax a machine dependent frag.  This returns the amount by which
13171    the current size of the frag should change.  */
13172
13173 int
13174 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13175 {
13176   if (RELAX_BRANCH_P (fragp->fr_subtype))
13177     {
13178       offsetT old_var = fragp->fr_var;
13179
13180       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13181
13182       return fragp->fr_var - old_var;
13183     }
13184
13185   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13186     return 0;
13187
13188   if (mips16_extended_frag (fragp, NULL, stretch))
13189     {
13190       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13191         return 0;
13192       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13193       return 2;
13194     }
13195   else
13196     {
13197       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13198         return 0;
13199       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13200       return -2;
13201     }
13202
13203   return 0;
13204 }
13205
13206 /* Convert a machine dependent frag.  */
13207
13208 void
13209 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13210 {
13211   if (RELAX_BRANCH_P (fragp->fr_subtype))
13212     {
13213       bfd_byte *buf;
13214       unsigned long insn;
13215       expressionS exp;
13216       fixS *fixp;
13217
13218       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13219
13220       if (target_big_endian)
13221         insn = bfd_getb32 (buf);
13222       else
13223         insn = bfd_getl32 (buf);
13224
13225       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13226         {
13227           /* We generate a fixup instead of applying it right now
13228              because, if there are linker relaxations, we're going to
13229              need the relocations.  */
13230           exp.X_op = O_symbol;
13231           exp.X_add_symbol = fragp->fr_symbol;
13232           exp.X_add_number = fragp->fr_offset;
13233
13234           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13235                               4, &exp, 1,
13236                               BFD_RELOC_16_PCREL_S2);
13237           fixp->fx_file = fragp->fr_file;
13238           fixp->fx_line = fragp->fr_line;
13239
13240           md_number_to_chars (buf, insn, 4);
13241           buf += 4;
13242         }
13243       else
13244         {
13245           int i;
13246
13247           as_warn_where (fragp->fr_file, fragp->fr_line,
13248                          _("relaxed out-of-range branch into a jump"));
13249
13250           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13251             goto uncond;
13252
13253           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13254             {
13255               /* Reverse the branch.  */
13256               switch ((insn >> 28) & 0xf)
13257                 {
13258                 case 4:
13259                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13260                      have the condition reversed by tweaking a single
13261                      bit, and their opcodes all have 0x4???????.  */
13262                   assert ((insn & 0xf1000000) == 0x41000000);
13263                   insn ^= 0x00010000;
13264                   break;
13265
13266                 case 0:
13267                   /* bltz       0x04000000      bgez    0x04010000
13268                      bltzal     0x04100000      bgezal  0x04110000 */
13269                   assert ((insn & 0xfc0e0000) == 0x04000000);
13270                   insn ^= 0x00010000;
13271                   break;
13272
13273                 case 1:
13274                   /* beq        0x10000000      bne     0x14000000
13275                      blez       0x18000000      bgtz    0x1c000000 */
13276                   insn ^= 0x04000000;
13277                   break;
13278
13279                 default:
13280                   abort ();
13281                 }
13282             }
13283
13284           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13285             {
13286               /* Clear the and-link bit.  */
13287               assert ((insn & 0xfc1c0000) == 0x04100000);
13288
13289               /* bltzal 0x04100000      bgezal  0x04110000
13290                 bltzall 0x04120000     bgezall  0x04130000 */
13291               insn &= ~0x00100000;
13292             }
13293
13294           /* Branch over the branch (if the branch was likely) or the
13295              full jump (not likely case).  Compute the offset from the
13296              current instruction to branch to.  */
13297           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13298             i = 16;
13299           else
13300             {
13301               /* How many bytes in instructions we've already emitted?  */
13302               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13303               /* How many bytes in instructions from here to the end?  */
13304               i = fragp->fr_var - i;
13305             }
13306           /* Convert to instruction count.  */
13307           i >>= 2;
13308           /* Branch counts from the next instruction.  */
13309           i--;
13310           insn |= i;
13311           /* Branch over the jump.  */
13312           md_number_to_chars (buf, insn, 4);
13313           buf += 4;
13314
13315           /* Nop */
13316           md_number_to_chars (buf, 0, 4);
13317           buf += 4;
13318
13319           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13320             {
13321               /* beql $0, $0, 2f */
13322               insn = 0x50000000;
13323               /* Compute the PC offset from the current instruction to
13324                  the end of the variable frag.  */
13325               /* How many bytes in instructions we've already emitted?  */
13326               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13327               /* How many bytes in instructions from here to the end?  */
13328               i = fragp->fr_var - i;
13329               /* Convert to instruction count.  */
13330               i >>= 2;
13331               /* Don't decrement i, because we want to branch over the
13332                  delay slot.  */
13333
13334               insn |= i;
13335               md_number_to_chars (buf, insn, 4);
13336               buf += 4;
13337
13338               md_number_to_chars (buf, 0, 4);
13339               buf += 4;
13340             }
13341
13342         uncond:
13343           if (mips_pic == NO_PIC)
13344             {
13345               /* j or jal.  */
13346               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13347                       ? 0x0c000000 : 0x08000000);
13348               exp.X_op = O_symbol;
13349               exp.X_add_symbol = fragp->fr_symbol;
13350               exp.X_add_number = fragp->fr_offset;
13351
13352               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13353                                   4, &exp, 0, BFD_RELOC_MIPS_JMP);
13354               fixp->fx_file = fragp->fr_file;
13355               fixp->fx_line = fragp->fr_line;
13356
13357               md_number_to_chars (buf, insn, 4);
13358               buf += 4;
13359             }
13360           else
13361             {
13362               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13363               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13364               exp.X_op = O_symbol;
13365               exp.X_add_symbol = fragp->fr_symbol;
13366               exp.X_add_number = fragp->fr_offset;
13367
13368               if (fragp->fr_offset)
13369                 {
13370                   exp.X_add_symbol = make_expr_symbol (&exp);
13371                   exp.X_add_number = 0;
13372                 }
13373
13374               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13375                                   4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13376               fixp->fx_file = fragp->fr_file;
13377               fixp->fx_line = fragp->fr_line;
13378
13379               md_number_to_chars (buf, insn, 4);
13380               buf += 4;
13381
13382               if (mips_opts.isa == ISA_MIPS1)
13383                 {
13384                   /* nop */
13385                   md_number_to_chars (buf, 0, 4);
13386                   buf += 4;
13387                 }
13388
13389               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13390               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13391
13392               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13393                                   4, &exp, 0, BFD_RELOC_LO16);
13394               fixp->fx_file = fragp->fr_file;
13395               fixp->fx_line = fragp->fr_line;
13396
13397               md_number_to_chars (buf, insn, 4);
13398               buf += 4;
13399
13400               /* j(al)r $at.  */
13401               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13402                 insn = 0x0020f809;
13403               else
13404                 insn = 0x00200008;
13405
13406               md_number_to_chars (buf, insn, 4);
13407               buf += 4;
13408             }
13409         }
13410
13411       assert (buf == (bfd_byte *)fragp->fr_literal
13412               + fragp->fr_fix + fragp->fr_var);
13413
13414       fragp->fr_fix += fragp->fr_var;
13415
13416       return;
13417     }
13418
13419   if (RELAX_MIPS16_P (fragp->fr_subtype))
13420     {
13421       int type;
13422       register const struct mips16_immed_operand *op;
13423       bfd_boolean small, ext;
13424       offsetT val;
13425       bfd_byte *buf;
13426       unsigned long insn;
13427       bfd_boolean use_extend;
13428       unsigned short extend;
13429
13430       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13431       op = mips16_immed_operands;
13432       while (op->type != type)
13433         ++op;
13434
13435       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13436         {
13437           small = FALSE;
13438           ext = TRUE;
13439         }
13440       else
13441         {
13442           small = TRUE;
13443           ext = FALSE;
13444         }
13445
13446       resolve_symbol_value (fragp->fr_symbol);
13447       val = S_GET_VALUE (fragp->fr_symbol);
13448       if (op->pcrel)
13449         {
13450           addressT addr;
13451
13452           addr = fragp->fr_address + fragp->fr_fix;
13453
13454           /* The rules for the base address of a PC relative reloc are
13455              complicated; see mips16_extended_frag.  */
13456           if (type == 'p' || type == 'q')
13457             {
13458               addr += 2;
13459               if (ext)
13460                 addr += 2;
13461               /* Ignore the low bit in the target, since it will be
13462                  set for a text label.  */
13463               if ((val & 1) != 0)
13464                 --val;
13465             }
13466           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13467             addr -= 4;
13468           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13469             addr -= 2;
13470
13471           addr &= ~ (addressT) ((1 << op->shift) - 1);
13472           val -= addr;
13473
13474           /* Make sure the section winds up with the alignment we have
13475              assumed.  */
13476           if (op->shift > 0)
13477             record_alignment (asec, op->shift);
13478         }
13479
13480       if (ext
13481           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13482               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13483         as_warn_where (fragp->fr_file, fragp->fr_line,
13484                        _("extended instruction in delay slot"));
13485
13486       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13487
13488       if (target_big_endian)
13489         insn = bfd_getb16 (buf);
13490       else
13491         insn = bfd_getl16 (buf);
13492
13493       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13494                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13495                     small, ext, &insn, &use_extend, &extend);
13496
13497       if (use_extend)
13498         {
13499           md_number_to_chars (buf, 0xf000 | extend, 2);
13500           fragp->fr_fix += 2;
13501           buf += 2;
13502         }
13503
13504       md_number_to_chars (buf, insn, 2);
13505       fragp->fr_fix += 2;
13506       buf += 2;
13507     }
13508   else
13509     {
13510       int first, second;
13511       fixS *fixp;
13512
13513       first = RELAX_FIRST (fragp->fr_subtype);
13514       second = RELAX_SECOND (fragp->fr_subtype);
13515       fixp = (fixS *) fragp->fr_opcode;
13516
13517       /* Possibly emit a warning if we've chosen the longer option.  */
13518       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13519           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13520         {
13521           const char *msg = macro_warning (fragp->fr_subtype);
13522           if (msg != 0)
13523             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13524         }
13525
13526       /* Go through all the fixups for the first sequence.  Disable them
13527          (by marking them as done) if we're going to use the second
13528          sequence instead.  */
13529       while (fixp
13530              && fixp->fx_frag == fragp
13531              && fixp->fx_where < fragp->fr_fix - second)
13532         {
13533           if (fragp->fr_subtype & RELAX_USE_SECOND)
13534             fixp->fx_done = 1;
13535           fixp = fixp->fx_next;
13536         }
13537
13538       /* Go through the fixups for the second sequence.  Disable them if
13539          we're going to use the first sequence, otherwise adjust their
13540          addresses to account for the relaxation.  */
13541       while (fixp && fixp->fx_frag == fragp)
13542         {
13543           if (fragp->fr_subtype & RELAX_USE_SECOND)
13544             fixp->fx_where -= first;
13545           else
13546             fixp->fx_done = 1;
13547           fixp = fixp->fx_next;
13548         }
13549
13550       /* Now modify the frag contents.  */
13551       if (fragp->fr_subtype & RELAX_USE_SECOND)
13552         {
13553           char *start;
13554
13555           start = fragp->fr_literal + fragp->fr_fix - first - second;
13556           memmove (start, start + first, second);
13557           fragp->fr_fix -= first;
13558         }
13559       else
13560         fragp->fr_fix -= second;
13561     }
13562 }
13563
13564 #ifdef OBJ_ELF
13565
13566 /* This function is called after the relocs have been generated.
13567    We've been storing mips16 text labels as odd.  Here we convert them
13568    back to even for the convenience of the debugger.  */
13569
13570 void
13571 mips_frob_file_after_relocs (void)
13572 {
13573   asymbol **syms;
13574   unsigned int count, i;
13575
13576   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13577     return;
13578
13579   syms = bfd_get_outsymbols (stdoutput);
13580   count = bfd_get_symcount (stdoutput);
13581   for (i = 0; i < count; i++, syms++)
13582     {
13583       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13584           && ((*syms)->value & 1) != 0)
13585         {
13586           (*syms)->value &= ~1;
13587           /* If the symbol has an odd size, it was probably computed
13588              incorrectly, so adjust that as well.  */
13589           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13590             ++elf_symbol (*syms)->internal_elf_sym.st_size;
13591         }
13592     }
13593 }
13594
13595 #endif
13596
13597 /* This function is called whenever a label is defined.  It is used
13598    when handling branch delays; if a branch has a label, we assume we
13599    can not move it.  */
13600
13601 void
13602 mips_define_label (symbolS *sym)
13603 {
13604   struct insn_label_list *l;
13605
13606   if (free_insn_labels == NULL)
13607     l = (struct insn_label_list *) xmalloc (sizeof *l);
13608   else
13609     {
13610       l = free_insn_labels;
13611       free_insn_labels = l->next;
13612     }
13613
13614   l->label = sym;
13615   l->next = insn_labels;
13616   insn_labels = l;
13617 }
13618 \f
13619 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13620
13621 /* Some special processing for a MIPS ELF file.  */
13622
13623 void
13624 mips_elf_final_processing (void)
13625 {
13626   /* Write out the register information.  */
13627   if (mips_abi != N64_ABI)
13628     {
13629       Elf32_RegInfo s;
13630
13631       s.ri_gprmask = mips_gprmask;
13632       s.ri_cprmask[0] = mips_cprmask[0];
13633       s.ri_cprmask[1] = mips_cprmask[1];
13634       s.ri_cprmask[2] = mips_cprmask[2];
13635       s.ri_cprmask[3] = mips_cprmask[3];
13636       /* The gp_value field is set by the MIPS ELF backend.  */
13637
13638       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13639                                        ((Elf32_External_RegInfo *)
13640                                         mips_regmask_frag));
13641     }
13642   else
13643     {
13644       Elf64_Internal_RegInfo s;
13645
13646       s.ri_gprmask = mips_gprmask;
13647       s.ri_pad = 0;
13648       s.ri_cprmask[0] = mips_cprmask[0];
13649       s.ri_cprmask[1] = mips_cprmask[1];
13650       s.ri_cprmask[2] = mips_cprmask[2];
13651       s.ri_cprmask[3] = mips_cprmask[3];
13652       /* The gp_value field is set by the MIPS ELF backend.  */
13653
13654       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13655                                        ((Elf64_External_RegInfo *)
13656                                         mips_regmask_frag));
13657     }
13658
13659   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13660      sort of BFD interface for this.  */
13661   if (mips_any_noreorder)
13662     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13663   if (mips_pic != NO_PIC)
13664     {
13665     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13666       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13667     }
13668   if (mips_abicalls)
13669     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13670
13671   /* Set MIPS ELF flags for ASEs.  */
13672   if (file_ase_mips16)
13673     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13674 #if 0 /* XXX FIXME */
13675   if (file_ase_mips3d)
13676     elf_elfheader (stdoutput)->e_flags |= ???;
13677 #endif
13678   if (file_ase_mdmx)
13679     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13680
13681   /* Set the MIPS ELF ABI flags.  */
13682   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13683     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13684   else if (mips_abi == O64_ABI)
13685     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
13686   else if (mips_abi == EABI_ABI)
13687     {
13688       if (!file_mips_gp32)
13689         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13690       else
13691         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13692     }
13693   else if (mips_abi == N32_ABI)
13694     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13695
13696   /* Nothing to do for N64_ABI.  */
13697
13698   if (mips_32bitmode)
13699     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13700 }
13701
13702 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13703 \f
13704 typedef struct proc {
13705   symbolS *isym;
13706   unsigned long reg_mask;
13707   unsigned long reg_offset;
13708   unsigned long fpreg_mask;
13709   unsigned long fpreg_offset;
13710   unsigned long frame_offset;
13711   unsigned long frame_reg;
13712   unsigned long pc_reg;
13713 } procS;
13714
13715 static procS cur_proc;
13716 static procS *cur_proc_ptr;
13717 static int numprocs;
13718
13719 /* Fill in an rs_align_code fragment.  */
13720
13721 void
13722 mips_handle_align (fragS *fragp)
13723 {
13724   if (fragp->fr_type != rs_align_code)
13725     return;
13726
13727   if (mips_opts.mips16)
13728     {
13729       static const unsigned char be_nop[] = { 0x65, 0x00 };
13730       static const unsigned char le_nop[] = { 0x00, 0x65 };
13731
13732       int bytes;
13733       char *p;
13734
13735       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
13736       p = fragp->fr_literal + fragp->fr_fix;
13737
13738       if (bytes & 1)
13739         {
13740           *p++ = 0;
13741           fragp->fr_fix++;
13742         }
13743
13744       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
13745       fragp->fr_var = 2;
13746     }
13747
13748   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
13749 }
13750
13751 static void
13752 md_obj_begin (void)
13753 {
13754 }
13755
13756 static void
13757 md_obj_end (void)
13758 {
13759   /* check for premature end, nesting errors, etc */
13760   if (cur_proc_ptr)
13761     as_warn (_("missing .end at end of assembly"));
13762 }
13763
13764 static long
13765 get_number (void)
13766 {
13767   int negative = 0;
13768   long val = 0;
13769
13770   if (*input_line_pointer == '-')
13771     {
13772       ++input_line_pointer;
13773       negative = 1;
13774     }
13775   if (!ISDIGIT (*input_line_pointer))
13776     as_bad (_("expected simple number"));
13777   if (input_line_pointer[0] == '0')
13778     {
13779       if (input_line_pointer[1] == 'x')
13780         {
13781           input_line_pointer += 2;
13782           while (ISXDIGIT (*input_line_pointer))
13783             {
13784               val <<= 4;
13785               val |= hex_value (*input_line_pointer++);
13786             }
13787           return negative ? -val : val;
13788         }
13789       else
13790         {
13791           ++input_line_pointer;
13792           while (ISDIGIT (*input_line_pointer))
13793             {
13794               val <<= 3;
13795               val |= *input_line_pointer++ - '0';
13796             }
13797           return negative ? -val : val;
13798         }
13799     }
13800   if (!ISDIGIT (*input_line_pointer))
13801     {
13802       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
13803               *input_line_pointer, *input_line_pointer);
13804       as_warn (_("invalid number"));
13805       return -1;
13806     }
13807   while (ISDIGIT (*input_line_pointer))
13808     {
13809       val *= 10;
13810       val += *input_line_pointer++ - '0';
13811     }
13812   return negative ? -val : val;
13813 }
13814
13815 /* The .file directive; just like the usual .file directive, but there
13816    is an initial number which is the ECOFF file index.  In the non-ECOFF
13817    case .file implies DWARF-2.  */
13818
13819 static void
13820 s_mips_file (int x ATTRIBUTE_UNUSED)
13821 {
13822   static int first_file_directive = 0;
13823
13824   if (ECOFF_DEBUGGING)
13825     {
13826       get_number ();
13827       s_app_file (0);
13828     }
13829   else
13830     {
13831       char *filename;
13832
13833       filename = dwarf2_directive_file (0);
13834
13835       /* Versions of GCC up to 3.1 start files with a ".file"
13836          directive even for stabs output.  Make sure that this
13837          ".file" is handled.  Note that you need a version of GCC
13838          after 3.1 in order to support DWARF-2 on MIPS.  */
13839       if (filename != NULL && ! first_file_directive)
13840         {
13841           (void) new_logical_line (filename, -1);
13842           s_app_file_string (filename);
13843         }
13844       first_file_directive = 1;
13845     }
13846 }
13847
13848 /* The .loc directive, implying DWARF-2.  */
13849
13850 static void
13851 s_mips_loc (int x ATTRIBUTE_UNUSED)
13852 {
13853   if (!ECOFF_DEBUGGING)
13854     dwarf2_directive_loc (0);
13855 }
13856
13857 /* The .end directive.  */
13858
13859 static void
13860 s_mips_end (int x ATTRIBUTE_UNUSED)
13861 {
13862   symbolS *p;
13863
13864   /* Following functions need their own .frame and .cprestore directives.  */
13865   mips_frame_reg_valid = 0;
13866   mips_cprestore_valid = 0;
13867
13868   if (!is_end_of_line[(unsigned char) *input_line_pointer])
13869     {
13870       p = get_symbol ();
13871       demand_empty_rest_of_line ();
13872     }
13873   else
13874     p = NULL;
13875
13876   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13877     as_warn (_(".end not in text section"));
13878
13879   if (!cur_proc_ptr)
13880     {
13881       as_warn (_(".end directive without a preceding .ent directive."));
13882       demand_empty_rest_of_line ();
13883       return;
13884     }
13885
13886   if (p != NULL)
13887     {
13888       assert (S_GET_NAME (p));
13889       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
13890         as_warn (_(".end symbol does not match .ent symbol."));
13891
13892       if (debug_type == DEBUG_STABS)
13893         stabs_generate_asm_endfunc (S_GET_NAME (p),
13894                                     S_GET_NAME (p));
13895     }
13896   else
13897     as_warn (_(".end directive missing or unknown symbol"));
13898
13899 #ifdef OBJ_ELF
13900   /* Generate a .pdr section.  */
13901   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
13902       && mips_flag_pdr)
13903     {
13904       segT saved_seg = now_seg;
13905       subsegT saved_subseg = now_subseg;
13906       valueT dot;
13907       expressionS exp;
13908       char *fragp;
13909
13910       dot = frag_now_fix ();
13911
13912 #ifdef md_flush_pending_output
13913       md_flush_pending_output ();
13914 #endif
13915
13916       assert (pdr_seg);
13917       subseg_set (pdr_seg, 0);
13918
13919       /* Write the symbol.  */
13920       exp.X_op = O_symbol;
13921       exp.X_add_symbol = p;
13922       exp.X_add_number = 0;
13923       emit_expr (&exp, 4);
13924
13925       fragp = frag_more (7 * 4);
13926
13927       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
13928       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
13929       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
13930       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
13931       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
13932       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
13933       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
13934
13935       subseg_set (saved_seg, saved_subseg);
13936     }
13937 #endif /* OBJ_ELF */
13938
13939   cur_proc_ptr = NULL;
13940 }
13941
13942 /* The .aent and .ent directives.  */
13943
13944 static void
13945 s_mips_ent (int aent)
13946 {
13947   symbolS *symbolP;
13948
13949   symbolP = get_symbol ();
13950   if (*input_line_pointer == ',')
13951     ++input_line_pointer;
13952   SKIP_WHITESPACE ();
13953   if (ISDIGIT (*input_line_pointer)
13954       || *input_line_pointer == '-')
13955     get_number ();
13956
13957   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13958     as_warn (_(".ent or .aent not in text section."));
13959
13960   if (!aent && cur_proc_ptr)
13961     as_warn (_("missing .end"));
13962
13963   if (!aent)
13964     {
13965       /* This function needs its own .frame and .cprestore directives.  */
13966       mips_frame_reg_valid = 0;
13967       mips_cprestore_valid = 0;
13968
13969       cur_proc_ptr = &cur_proc;
13970       memset (cur_proc_ptr, '\0', sizeof (procS));
13971
13972       cur_proc_ptr->isym = symbolP;
13973
13974       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
13975
13976       ++numprocs;
13977
13978       if (debug_type == DEBUG_STABS)
13979         stabs_generate_asm_func (S_GET_NAME (symbolP),
13980                                  S_GET_NAME (symbolP));
13981     }
13982
13983   demand_empty_rest_of_line ();
13984 }
13985
13986 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
13987    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
13988    s_mips_frame is used so that we can set the PDR information correctly.
13989    We can't use the ecoff routines because they make reference to the ecoff
13990    symbol table (in the mdebug section).  */
13991
13992 static void
13993 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
13994 {
13995 #ifdef OBJ_ELF
13996   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
13997     {
13998       long val;
13999
14000       if (cur_proc_ptr == (procS *) NULL)
14001         {
14002           as_warn (_(".frame outside of .ent"));
14003           demand_empty_rest_of_line ();
14004           return;
14005         }
14006
14007       cur_proc_ptr->frame_reg = tc_get_register (1);
14008
14009       SKIP_WHITESPACE ();
14010       if (*input_line_pointer++ != ','
14011           || get_absolute_expression_and_terminator (&val) != ',')
14012         {
14013           as_warn (_("Bad .frame directive"));
14014           --input_line_pointer;
14015           demand_empty_rest_of_line ();
14016           return;
14017         }
14018
14019       cur_proc_ptr->frame_offset = val;
14020       cur_proc_ptr->pc_reg = tc_get_register (0);
14021
14022       demand_empty_rest_of_line ();
14023     }
14024   else
14025 #endif /* OBJ_ELF */
14026     s_ignore (ignore);
14027 }
14028
14029 /* The .fmask and .mask directives. If the mdebug section is present
14030    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14031    embedded targets, s_mips_mask is used so that we can set the PDR
14032    information correctly. We can't use the ecoff routines because they
14033    make reference to the ecoff symbol table (in the mdebug section).  */
14034
14035 static void
14036 s_mips_mask (int reg_type)
14037 {
14038 #ifdef OBJ_ELF
14039   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14040     {
14041       long mask, off;
14042
14043       if (cur_proc_ptr == (procS *) NULL)
14044         {
14045           as_warn (_(".mask/.fmask outside of .ent"));
14046           demand_empty_rest_of_line ();
14047           return;
14048         }
14049
14050       if (get_absolute_expression_and_terminator (&mask) != ',')
14051         {
14052           as_warn (_("Bad .mask/.fmask directive"));
14053           --input_line_pointer;
14054           demand_empty_rest_of_line ();
14055           return;
14056         }
14057
14058       off = get_absolute_expression ();
14059
14060       if (reg_type == 'F')
14061         {
14062           cur_proc_ptr->fpreg_mask = mask;
14063           cur_proc_ptr->fpreg_offset = off;
14064         }
14065       else
14066         {
14067           cur_proc_ptr->reg_mask = mask;
14068           cur_proc_ptr->reg_offset = off;
14069         }
14070
14071       demand_empty_rest_of_line ();
14072     }
14073   else
14074 #endif /* OBJ_ELF */
14075     s_ignore (reg_type);
14076 }
14077
14078 /* The .loc directive.  */
14079
14080 #if 0
14081 static void
14082 s_loc (int x)
14083 {
14084   symbolS *symbolP;
14085   int lineno;
14086   int addroff;
14087
14088   assert (now_seg == text_section);
14089
14090   lineno = get_number ();
14091   addroff = frag_now_fix ();
14092
14093   symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14094   S_SET_TYPE (symbolP, N_SLINE);
14095   S_SET_OTHER (symbolP, 0);
14096   S_SET_DESC (symbolP, lineno);
14097   symbolP->sy_segment = now_seg;
14098 }
14099 #endif
14100
14101 /* A table describing all the processors gas knows about.  Names are
14102    matched in the order listed.
14103
14104    To ease comparison, please keep this table in the same order as
14105    gcc's mips_cpu_info_table[].  */
14106 static const struct mips_cpu_info mips_cpu_info_table[] =
14107 {
14108   /* Entries for generic ISAs */
14109   { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
14110   { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
14111   { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
14112   { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
14113   { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
14114   { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
14115   { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14116   { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
14117   { "mips64r2",       1,      ISA_MIPS64R2,   CPU_MIPS64R2 },
14118
14119   /* MIPS I */
14120   { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
14121   { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
14122   { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
14123
14124   /* MIPS II */
14125   { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
14126
14127   /* MIPS III */
14128   { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
14129   { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
14130   { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
14131   { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
14132   { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
14133   { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
14134   { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
14135   { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
14136   { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
14137   { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
14138   { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
14139   { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
14140
14141   /* MIPS IV */
14142   { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
14143   { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
14144   { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
14145   { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
14146   { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
14147   { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
14148   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
14149   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
14150   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
14151   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
14152   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
14153   { "rm7000",         0,      ISA_MIPS4,      CPU_RM7000 },
14154   { "rm9000",         0,      ISA_MIPS4,      CPU_RM7000 },
14155
14156   /* MIPS 32 */
14157   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32 },
14158   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
14159   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
14160
14161   /* MIPS 64 */
14162   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
14163   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
14164
14165   /* Broadcom SB-1 CPU core */
14166   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
14167
14168   /* End marker */
14169   { NULL, 0, 0, 0 }
14170 };
14171
14172
14173 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14174    with a final "000" replaced by "k".  Ignore case.
14175
14176    Note: this function is shared between GCC and GAS.  */
14177
14178 static bfd_boolean
14179 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14180 {
14181   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14182     given++, canonical++;
14183
14184   return ((*given == 0 && *canonical == 0)
14185           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14186 }
14187
14188
14189 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14190    CPU name.  We've traditionally allowed a lot of variation here.
14191
14192    Note: this function is shared between GCC and GAS.  */
14193
14194 static bfd_boolean
14195 mips_matching_cpu_name_p (const char *canonical, const char *given)
14196 {
14197   /* First see if the name matches exactly, or with a final "000"
14198      turned into "k".  */
14199   if (mips_strict_matching_cpu_name_p (canonical, given))
14200     return TRUE;
14201
14202   /* If not, try comparing based on numerical designation alone.
14203      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14204   if (TOLOWER (*given) == 'r')
14205     given++;
14206   if (!ISDIGIT (*given))
14207     return FALSE;
14208
14209   /* Skip over some well-known prefixes in the canonical name,
14210      hoping to find a number there too.  */
14211   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14212     canonical += 2;
14213   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14214     canonical += 2;
14215   else if (TOLOWER (canonical[0]) == 'r')
14216     canonical += 1;
14217
14218   return mips_strict_matching_cpu_name_p (canonical, given);
14219 }
14220
14221
14222 /* Parse an option that takes the name of a processor as its argument.
14223    OPTION is the name of the option and CPU_STRING is the argument.
14224    Return the corresponding processor enumeration if the CPU_STRING is
14225    recognized, otherwise report an error and return null.
14226
14227    A similar function exists in GCC.  */
14228
14229 static const struct mips_cpu_info *
14230 mips_parse_cpu (const char *option, const char *cpu_string)
14231 {
14232   const struct mips_cpu_info *p;
14233
14234   /* 'from-abi' selects the most compatible architecture for the given
14235      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14236      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14237      version.  Look first at the -mgp options, if given, otherwise base
14238      the choice on MIPS_DEFAULT_64BIT.
14239
14240      Treat NO_ABI like the EABIs.  One reason to do this is that the
14241      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14242      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14243      'mips64', just as we did in the days before 'from-abi'.  */
14244   if (strcasecmp (cpu_string, "from-abi") == 0)
14245     {
14246       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14247         return mips_cpu_info_from_isa (ISA_MIPS1);
14248
14249       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14250         return mips_cpu_info_from_isa (ISA_MIPS3);
14251
14252       if (file_mips_gp32 >= 0)
14253         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14254
14255       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14256                                      ? ISA_MIPS3
14257                                      : ISA_MIPS1);
14258     }
14259
14260   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14261   if (strcasecmp (cpu_string, "default") == 0)
14262     return 0;
14263
14264   for (p = mips_cpu_info_table; p->name != 0; p++)
14265     if (mips_matching_cpu_name_p (p->name, cpu_string))
14266       return p;
14267
14268   as_bad ("Bad value (%s) for %s", cpu_string, option);
14269   return 0;
14270 }
14271
14272 /* Return the canonical processor information for ISA (a member of the
14273    ISA_MIPS* enumeration).  */
14274
14275 static const struct mips_cpu_info *
14276 mips_cpu_info_from_isa (int isa)
14277 {
14278   int i;
14279
14280   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14281     if (mips_cpu_info_table[i].is_isa
14282         && isa == mips_cpu_info_table[i].isa)
14283       return (&mips_cpu_info_table[i]);
14284
14285   return NULL;
14286 }
14287
14288 static const struct mips_cpu_info *
14289 mips_cpu_info_from_arch (int arch)
14290 {
14291   int i;
14292
14293   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14294     if (arch == mips_cpu_info_table[i].cpu)
14295       return (&mips_cpu_info_table[i]);
14296
14297   return NULL;
14298 }
14299 \f
14300 static void
14301 show (FILE *stream, const char *string, int *col_p, int *first_p)
14302 {
14303   if (*first_p)
14304     {
14305       fprintf (stream, "%24s", "");
14306       *col_p = 24;
14307     }
14308   else
14309     {
14310       fprintf (stream, ", ");
14311       *col_p += 2;
14312     }
14313
14314   if (*col_p + strlen (string) > 72)
14315     {
14316       fprintf (stream, "\n%24s", "");
14317       *col_p = 24;
14318     }
14319
14320   fprintf (stream, "%s", string);
14321   *col_p += strlen (string);
14322
14323   *first_p = 0;
14324 }
14325
14326 void
14327 md_show_usage (FILE *stream)
14328 {
14329   int column, first;
14330   size_t i;
14331
14332   fprintf (stream, _("\
14333 MIPS options:\n\
14334 -membedded-pic          generate embedded position independent code\n\
14335 -EB                     generate big endian output\n\
14336 -EL                     generate little endian output\n\
14337 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
14338 -G NUM                  allow referencing objects up to NUM bytes\n\
14339                         implicitly with the gp register [default 8]\n"));
14340   fprintf (stream, _("\
14341 -mips1                  generate MIPS ISA I instructions\n\
14342 -mips2                  generate MIPS ISA II instructions\n\
14343 -mips3                  generate MIPS ISA III instructions\n\
14344 -mips4                  generate MIPS ISA IV instructions\n\
14345 -mips5                  generate MIPS ISA V instructions\n\
14346 -mips32                 generate MIPS32 ISA instructions\n\
14347 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
14348 -mips64                 generate MIPS64 ISA instructions\n\
14349 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
14350 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
14351
14352   first = 1;
14353
14354   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14355     show (stream, mips_cpu_info_table[i].name, &column, &first);
14356   show (stream, "from-abi", &column, &first);
14357   fputc ('\n', stream);
14358
14359   fprintf (stream, _("\
14360 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14361 -no-mCPU                don't generate code specific to CPU.\n\
14362                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
14363
14364   first = 1;
14365
14366   show (stream, "3900", &column, &first);
14367   show (stream, "4010", &column, &first);
14368   show (stream, "4100", &column, &first);
14369   show (stream, "4650", &column, &first);
14370   fputc ('\n', stream);
14371
14372   fprintf (stream, _("\
14373 -mips16                 generate mips16 instructions\n\
14374 -no-mips16              do not generate mips16 instructions\n"));
14375   fprintf (stream, _("\
14376 -mfix-vr4120            work around certain VR4120 errata\n\
14377 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
14378 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
14379 -O0                     remove unneeded NOPs, do not swap branches\n\
14380 -O                      remove unneeded NOPs and swap branches\n\
14381 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14382 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
14383 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
14384 #ifdef OBJ_ELF
14385   fprintf (stream, _("\
14386 -KPIC, -call_shared     generate SVR4 position independent code\n\
14387 -non_shared             do not generate position independent code\n\
14388 -xgot                   assume a 32 bit GOT\n\
14389 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
14390 -mabi=ABI               create ABI conformant object file for:\n"));
14391
14392   first = 1;
14393
14394   show (stream, "32", &column, &first);
14395   show (stream, "o64", &column, &first);
14396   show (stream, "n32", &column, &first);
14397   show (stream, "64", &column, &first);
14398   show (stream, "eabi", &column, &first);
14399
14400   fputc ('\n', stream);
14401
14402   fprintf (stream, _("\
14403 -32                     create o32 ABI object file (default)\n\
14404 -n32                    create n32 ABI object file\n\
14405 -64                     create 64 ABI object file\n"));
14406 #endif
14407 }
14408
14409 enum dwarf2_format
14410 mips_dwarf2_format (void)
14411 {
14412   if (mips_abi == N64_ABI)
14413     {
14414 #ifdef TE_IRIX
14415       return dwarf2_format_64bit_irix;
14416 #else
14417       return dwarf2_format_64bit;
14418 #endif
14419     }
14420   else
14421     return dwarf2_format_32bit;
14422 }
14423
14424 int
14425 mips_dwarf2_addr_size (void)
14426 {
14427   if (mips_abi == N64_ABI)
14428     return 8;
14429   else
14430     return 4;
14431 }