1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006 Free Software Foundation, Inc.
4    Contributed by the OSF and Ralph Campbell.
5    Written by Keith Knowles and Ralph Campbell, working independently.
6    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7    Support.
8 
9    This file is part of GAS.
10 
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2, or (at your option)
14    any later version.
15 
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20 
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25 
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30 
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35 
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
41 
42 #ifdef OBJ_MAYBE_ELF
43 /* Clean up namespace so we can include obj-elf.h too.  */
44 static int mips_output_flavor (void);
mips_output_flavor(void)45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46 #undef OBJ_PROCESS_STAB
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
58 
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about.  */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
64 
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
68 
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
73 
74 int mips_flag_mdebug = -1;
75 
76 /* Control generation of .pdr sections.  Off by default on IRIX: the native
77    linker doesn't know about and discards them, but relocations against them
78    remain, leading to rld crashes.  */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
84 
85 /* Control generation of error message for unsupported instructions in
86    Octeon. Octeon does not have floating point, and all the instructions
87    that use floating point registers are not allowed in Elf targets but
88    are allowed in Linux targets by default.  */
89 #ifdef OCTEON_ERROR_ON_UNSUPPORTED
90 static int octeon_error_on_unsupported = 1;
91 #else
92 static int octeon_error_on_unsupported = 0;
93 #endif
94 
95 /* Control generation of Octeon/MIPS unaligned load/store instructions.
96    For ELF target, default to Octeon load/store instructions.
97    For Linux target, default to MIPS load/store instructions.  */
98 #ifdef OCTEON_USE_UNALIGN
99 static int octeon_use_unalign = 1;
100 #else
101 static int octeon_use_unalign = 0;
102 #endif
103 
104 #include "ecoff.h"
105 
106 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
107 static char *mips_regmask_frag;
108 #endif
109 
110 #define ZERO 0
111 #define AT  1
112 #define TREG 24
113 #define PIC_CALL_REG 25
114 #define KT0 26
115 #define KT1 27
116 #define GP  28
117 #define SP  29
118 #define FP  30
119 #define RA  31
120 
121 #define ILLEGAL_REG (32)
122 
123 /* Allow override of standard little-endian ECOFF format.  */
124 
125 #ifndef ECOFF_LITTLE_FORMAT
126 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
127 #endif
128 
129 extern int target_big_endian;
130 
131 /* The name of the readonly data section.  */
132 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
133 			    ? ".rdata" \
134 			    : OUTPUT_FLAVOR == bfd_target_coff_flavour \
135 			    ? ".rdata" \
136 			    : OUTPUT_FLAVOR == bfd_target_elf_flavour \
137 			    ? ".rodata" \
138 			    : (abort (), ""))
139 
140 /* Information about an instruction, including its format, operands
141    and fixups.  */
142 struct mips_cl_insn
143 {
144   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
145   const struct mips_opcode *insn_mo;
146 
147   /* True if this is a mips16 instruction and if we want the extended
148      form of INSN_MO.  */
149   bfd_boolean use_extend;
150 
151   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
152   unsigned short extend;
153 
154   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
155      a copy of INSN_MO->match with the operands filled in.  */
156   unsigned long insn_opcode;
157 
158   /* The frag that contains the instruction.  */
159   struct frag *frag;
160 
161   /* The offset into FRAG of the first instruction byte.  */
162   long where;
163 
164   /* The relocs associated with the instruction, if any.  */
165   fixS *fixp[3];
166 
167   /* True if this entry cannot be moved from its current position.  */
168   unsigned int fixed_p : 1;
169 
170   /* True if this instruction occurred in a .set noreorder block.  */
171   unsigned int noreorder_p : 1;
172 
173   /* True for mips16 instructions that jump to an absolute address.  */
174   unsigned int mips16_absolute_jump_p : 1;
175 };
176 
177 /* The ABI to use.  */
178 enum mips_abi_level
179 {
180   NO_ABI = 0,
181   O32_ABI,
182   O64_ABI,
183   N32_ABI,
184   N64_ABI,
185   EABI_ABI
186 };
187 
188 /* MIPS ABI we are using for this output file.  */
189 static enum mips_abi_level mips_abi = NO_ABI;
190 
191 /* Whether or not we have code that can call pic code.  */
192 int mips_abicalls = FALSE;
193 
194 /* Whether or not we have code which can be put into a shared
195    library.  */
196 static bfd_boolean mips_in_shared = TRUE;
197 
198 /* This is the set of options which may be modified by the .set
199    pseudo-op.  We use a struct so that .set push and .set pop are more
200    reliable.  */
201 
202 struct mips_set_options
203 {
204   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
205      if it has not been initialized.  Changed by `.set mipsN', and the
206      -mipsN command line option, and the default CPU.  */
207   int isa;
208   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
209      if they have not been initialized.  Changed by `.set <asename>', by
210      command line options, and based on the default architecture.  */
211   int ase_mips3d;
212   int ase_mdmx;
213   int ase_smartmips;
214   int ase_dsp;
215   int ase_dspr2;
216   int ase_mt;
217   /* Whether we are assembling for the mips16 processor.  0 if we are
218      not, 1 if we are, and -1 if the value has not been initialized.
219      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
220      -nomips16 command line options, and the default CPU.  */
221   int mips16;
222   /* Non-zero if we should not reorder instructions.  Changed by `.set
223      reorder' and `.set noreorder'.  */
224   int noreorder;
225   /* Non-zero if we should not permit the $at ($1) register to be used
226      in instructions.  Changed by `.set at' and `.set noat'.  */
227   int noat;
228   /* Non-zero if we should warn when a macro instruction expands into
229      more than one machine instruction.  Changed by `.set nomacro' and
230      `.set macro'.  */
231   int warn_about_macros;
232   /* Non-zero if we should not move instructions.  Changed by `.set
233      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
234   int nomove;
235   /* Non-zero if we should not optimize branches by moving the target
236      of the branch into the delay slot.  Actually, we don't perform
237      this optimization anyhow.  Changed by `.set bopt' and `.set
238      nobopt'.  */
239   int nobopt;
240   /* Non-zero if we should not autoextend mips16 instructions.
241      Changed by `.set autoextend' and `.set noautoextend'.  */
242   int noautoextend;
243   /* Restrict general purpose registers and floating point registers
244      to 32 bit.  This is initially determined when -mgp32 or -mfp32
245      is passed but can changed if the assembler code uses .set mipsN.  */
246   int gp32;
247   int fp32;
248   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
249      command line option, and the default CPU.  */
250   int arch;
251   /* True if ".set sym32" is in effect.  */
252   bfd_boolean sym32;
253 };
254 
255 /* True if -mgp32 was passed.  */
256 static int file_mips_gp32 = -1;
257 
258 /* True if -mfp32 was passed.  */
259 static int file_mips_fp32 = -1;
260 
261 /* This is the struct we use to hold the current set of options.  Note
262    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
263    -1 to indicate that they have not been initialized.  */
264 
265 static struct mips_set_options mips_opts =
266 {
267   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
268 };
269 
270 /* These variables are filled in with the masks of registers used.
271    The object format code reads them and puts them in the appropriate
272    place.  */
273 unsigned long mips_gprmask;
274 unsigned long mips_cprmask[4];
275 
276 /* MIPS ISA we are using for this output file.  */
277 static int file_mips_isa = ISA_UNKNOWN;
278 
279 /* True if -mips16 was passed or implied by arguments passed on the
280    command line (e.g., by -march).  */
281 static int file_ase_mips16;
282 
283 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32		\
284 			      || mips_opts.isa == ISA_MIPS32R2		\
285 			      || mips_opts.isa == ISA_MIPS64		\
286 			      || mips_opts.isa == ISA_MIPS64R2)
287 
288 /* True if -mips3d was passed or implied by arguments passed on the
289    command line (e.g., by -march).  */
290 static int file_ase_mips3d;
291 
292 /* True if -mdmx was passed or implied by arguments passed on the
293    command line (e.g., by -march).  */
294 static int file_ase_mdmx;
295 
296 /* True if -msmartmips was passed or implied by arguments passed on the
297    command line (e.g., by -march).  */
298 static int file_ase_smartmips;
299 
300 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32		\
301 				|| mips_opts.isa == ISA_MIPS32R2)
302 
303 /* True if -mdsp was passed or implied by arguments passed on the
304    command line (e.g., by -march).  */
305 static int file_ase_dsp;
306 
307 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2		\
308 			      || mips_opts.isa == ISA_MIPS64R2)
309 
310 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
311 
312 /* True if -mdspr2 was passed or implied by arguments passed on the
313    command line (e.g., by -march).  */
314 static int file_ase_dspr2;
315 
316 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2		\
317 			        || mips_opts.isa == ISA_MIPS64R2)
318 
319 /* True if -mmt was passed or implied by arguments passed on the
320    command line (e.g., by -march).  */
321 static int file_ase_mt;
322 
323 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2		\
324 			     || mips_opts.isa == ISA_MIPS64R2)
325 
326 /* The argument of the -march= flag.  The architecture we are assembling.  */
327 static int file_mips_arch = CPU_UNKNOWN;
328 static const char *mips_arch_string;
329 
330 /* The argument of the -mtune= flag.  The architecture for which we
331    are optimizing.  */
332 static int mips_tune = CPU_UNKNOWN;
333 static const char *mips_tune_string;
334 
335 /* True when generating 32-bit code for a 64-bit processor.  */
336 static int mips_32bitmode = 0;
337 
338 /* True if the given ABI requires 32-bit registers.  */
339 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
340 
341 /* Likewise 64-bit registers.  */
342 #define ABI_NEEDS_64BIT_REGS(ABI)	\
343   ((ABI) == N32_ABI 			\
344    || (ABI) == N64_ABI			\
345    || (ABI) == O64_ABI)
346 
347 /*  Return true if ISA supports 64 bit wide gp registers.  */
348 #define ISA_HAS_64BIT_REGS(ISA)		\
349   ((ISA) == ISA_MIPS3			\
350    || (ISA) == ISA_MIPS4		\
351    || (ISA) == ISA_MIPS5		\
352    || (ISA) == ISA_MIPS64		\
353    || (ISA) == ISA_MIPS64R2)
354 
355 /*  Return true if ISA supports 64 bit wide float registers.  */
356 #define ISA_HAS_64BIT_FPRS(ISA)		\
357   ((ISA) == ISA_MIPS3			\
358    || (ISA) == ISA_MIPS4		\
359    || (ISA) == ISA_MIPS5		\
360    || (ISA) == ISA_MIPS32R2		\
361    || (ISA) == ISA_MIPS64		\
362    || (ISA) == ISA_MIPS64R2)
363 
364 /* Return true if ISA supports 64-bit right rotate (dror et al.)
365    instructions.  */
366 #define ISA_HAS_DROR(ISA)		\
367   ((ISA) == ISA_MIPS64R2)
368 
369 /* Return true if ISA supports 32-bit right rotate (ror et al.)
370    instructions.  */
371 #define ISA_HAS_ROR(ISA)		\
372   ((ISA) == ISA_MIPS32R2		\
373    || (ISA) == ISA_MIPS64R2		\
374    || mips_opts.ase_smartmips)
375 
376 /* Return true if ISA supports ins instructions. */
377 #define ISA_HAS_INS(ISA)		\
378   ((ISA) == ISA_MIPS32R2		\
379   || (ISA) == ISA_MIPS64R2)
380 
381 /* Return true if ISA supports single-precision floats in odd registers.  */
382 #define ISA_HAS_ODD_SINGLE_FPR(ISA)	\
383   ((ISA) == ISA_MIPS32			\
384    || (ISA) == ISA_MIPS32R2		\
385    || (ISA) == ISA_MIPS64		\
386    || (ISA) == ISA_MIPS64R2)
387 
388 /* Return true if ISA supports move to/from high part of a 64-bit
389    floating-point register. */
390 #define ISA_HAS_MXHC1(ISA)		\
391   ((ISA) == ISA_MIPS32R2		\
392    || (ISA) == ISA_MIPS64R2)
393 
394 #define HAVE_32BIT_GPRS		                   \
395     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
396 
397 #define HAVE_32BIT_FPRS                            \
398     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
399 
400 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
401 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
402 
403 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
404 
405 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
406 
407 /* True if relocations are stored in-place.  */
408 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
409 
410 /* The ABI-derived address size.  */
411 #define HAVE_64BIT_ADDRESSES \
412   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
413 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
414 
415 /* The size of symbolic constants (i.e., expressions of the form
416    "SYMBOL" or "SYMBOL + OFFSET").  */
417 #define HAVE_32BIT_SYMBOLS \
418   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
419 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
420 
421 /* Addresses are loaded in different ways, depending on the address size
422    in use.  The n32 ABI Documentation also mandates the use of additions
423    with overflow checking, but existing implementations don't follow it.  */
424 #define ADDRESS_ADD_INSN						\
425    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
426 
427 #define ADDRESS_ADDI_INSN						\
428    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
429 
430 #define ADDRESS_LOAD_INSN						\
431    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
432 
433 #define ADDRESS_STORE_INSN						\
434    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
435 
436 /* Return true if the given CPU supports the MIPS16 ASE.  */
437 #define CPU_HAS_MIPS16(cpu)						\
438    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0		\
439     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
440 
441 /* True if CPU has a dror instruction.  */
442 #define CPU_HAS_DROR(CPU)	((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443 
444 /* True if CPU has a ror instruction.  */
445 #define CPU_HAS_ROR(CPU)	CPU_HAS_DROR (CPU)
446 
447 /* True if mflo and mfhi can be immediately followed by instructions
448    which write to the HI and LO registers.
449 
450    According to MIPS specifications, MIPS ISAs I, II, and III need
451    (at least) two instructions between the reads of HI/LO and
452    instructions which write them, and later ISAs do not.  Contradicting
453    the MIPS specifications, some MIPS IV processor user manuals (e.g.
454    the UM for the NEC Vr5000) document needing the instructions between
455    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
456    MIPS64 and later ISAs to have the interlocks, plus any specific
457    earlier-ISA CPUs for which CPU documentation declares that the
458    instructions are really interlocked.  */
459 #define hilo_interlocks \
460   (mips_opts.isa == ISA_MIPS32                        \
461    || mips_opts.isa == ISA_MIPS32R2                   \
462    || mips_opts.isa == ISA_MIPS64                     \
463    || mips_opts.isa == ISA_MIPS64R2                   \
464    || mips_opts.arch == CPU_R4010                     \
465    || mips_opts.arch == CPU_R10000                    \
466    || mips_opts.arch == CPU_R12000                    \
467    || mips_opts.arch == CPU_RM7000                    \
468    || mips_opts.arch == CPU_VR5500                    \
469    )
470 
471 /* Whether the processor uses hardware interlocks to protect reads
472    from the GPRs after they are loaded from memory, and thus does not
473    require nops to be inserted.  This applies to instructions marked
474    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
475    level I.  */
476 #define gpr_interlocks \
477   (mips_opts.isa != ISA_MIPS1  \
478    || mips_opts.arch == CPU_R3900)
479 
480 /* Whether the processor uses hardware interlocks to avoid delays
481    required by coprocessor instructions, and thus does not require
482    nops to be inserted.  This applies to instructions marked
483    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
484    between instructions marked INSN_WRITE_COND_CODE and ones marked
485    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
486    levels I, II, and III.  */
487 /* Itbl support may require additional care here.  */
488 #define cop_interlocks                                \
489   ((mips_opts.isa != ISA_MIPS1                        \
490     && mips_opts.isa != ISA_MIPS2                     \
491     && mips_opts.isa != ISA_MIPS3)                    \
492    || mips_opts.arch == CPU_R4300                     \
493    )
494 
495 /* Whether the processor uses hardware interlocks to protect reads
496    from coprocessor registers after they are loaded from memory, and
497    thus does not require nops to be inserted.  This applies to
498    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
499    requires at MIPS ISA level I.  */
500 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
501 
502 /* Is this a mfhi or mflo instruction?  */
503 #define MF_HILO_INSN(PINFO) \
504           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
505 
506 /* MIPS PIC level.  */
507 
508 enum mips_pic_level mips_pic;
509 
510 /* 1 if we should generate 32 bit offsets from the $gp register in
511    SVR4_PIC mode.  Currently has no meaning in other modes.  */
512 static int mips_big_got = 0;
513 
514 /* 1 if trap instructions should used for overflow rather than break
515    instructions.  */
516 static int mips_trap = 0;
517 
518 /* 1 if double width floating point constants should not be constructed
519    by assembling two single width halves into two single width floating
520    point registers which just happen to alias the double width destination
521    register.  On some architectures this aliasing can be disabled by a bit
522    in the status register, and the setting of this bit cannot be determined
523    automatically at assemble time.  */
524 static int mips_disable_float_construction;
525 
526 /* Non-zero if any .set noreorder directives were used.  */
527 
528 static int mips_any_noreorder;
529 
530 /* Non-zero if nops should be inserted when the register referenced in
531    an mfhi/mflo instruction is read in the next two instructions.  */
532 static int mips_7000_hilo_fix;
533 
534 /* The size of objects in the small data section.  */
535 static unsigned int g_switch_value = 8;
536 /* Whether the -G option was used.  */
537 static int g_switch_seen = 0;
538 
539 #define N_RMASK 0xc4
540 #define N_VFP   0xd4
541 
542 /* If we can determine in advance that GP optimization won't be
543    possible, we can skip the relaxation stuff that tries to produce
544    GP-relative references.  This makes delay slot optimization work
545    better.
546 
547    This function can only provide a guess, but it seems to work for
548    gcc output.  It needs to guess right for gcc, otherwise gcc
549    will put what it thinks is a GP-relative instruction in a branch
550    delay slot.
551 
552    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
553    fixed it for the non-PIC mode.  KR 95/04/07  */
554 static int nopic_need_relax (symbolS *, int);
555 
556 /* handle of the OPCODE hash table */
557 static struct hash_control *op_hash = NULL;
558 
559 /* The opcode hash table we use for the mips16.  */
560 static struct hash_control *mips16_op_hash = NULL;
561 
562 /* This array holds the chars that always start a comment.  If the
563     pre-processor is disabled, these aren't very useful */
564 const char comment_chars[] = "#";
565 
566 /* This array holds the chars that only start a comment at the beginning of
567    a line.  If the line seems to have the form '# 123 filename'
568    .line and .file directives will appear in the pre-processed output */
569 /* Note that input_file.c hand checks for '#' at the beginning of the
570    first line of the input file.  This is because the compiler outputs
571    #NO_APP at the beginning of its output.  */
572 /* Also note that C style comments are always supported.  */
573 const char line_comment_chars[] = "#";
574 
575 /* This array holds machine specific line separator characters.  */
576 const char line_separator_chars[] = ";";
577 
578 /* Chars that can be used to separate mant from exp in floating point nums */
579 const char EXP_CHARS[] = "eE";
580 
581 /* Chars that mean this number is a floating point constant */
582 /* As in 0f12.456 */
583 /* or    0d1.2345e12 */
584 const char FLT_CHARS[] = "rRsSfFdDxXpP";
585 
586 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
587    changed in read.c .  Ideally it shouldn't have to know about it at all,
588    but nothing is ideal around here.
589  */
590 
591 static char *insn_error;
592 
593 static int auto_align = 1;
594 
595 /* When outputting SVR4 PIC code, the assembler needs to know the
596    offset in the stack frame from which to restore the $gp register.
597    This is set by the .cprestore pseudo-op, and saved in this
598    variable.  */
599 static offsetT mips_cprestore_offset = -1;
600 
601 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
602    more optimizations, it can use a register value instead of a memory-saved
603    offset and even an other register than $gp as global pointer.  */
604 static offsetT mips_cpreturn_offset = -1;
605 static int mips_cpreturn_register = -1;
606 static int mips_gp_register = GP;
607 static int mips_gprel_offset = 0;
608 
609 /* Whether mips_cprestore_offset has been set in the current function
610    (or whether it has already been warned about, if not).  */
611 static int mips_cprestore_valid = 0;
612 
613 /* This is the register which holds the stack frame, as set by the
614    .frame pseudo-op.  This is needed to implement .cprestore.  */
615 static int mips_frame_reg = SP;
616 
617 /* Whether mips_frame_reg has been set in the current function
618    (or whether it has already been warned about, if not).  */
619 static int mips_frame_reg_valid = 0;
620 
621 /* To output NOP instructions correctly, we need to keep information
622    about the previous two instructions.  */
623 
624 /* Whether we are optimizing.  The default value of 2 means to remove
625    unneeded NOPs and swap branch instructions when possible.  A value
626    of 1 means to not swap branches.  A value of 0 means to always
627    insert NOPs.  */
628 static int mips_optimize = 2;
629 
630 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
631    equivalent to seeing no -g option at all.  */
632 static int mips_debug = 0;
633 
634 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
635 #define MAX_VR4130_NOPS 4
636 
637 /* The maximum number of NOPs needed to fill delay slots.  */
638 #define MAX_DELAY_NOPS 2
639 
640 /* The maximum number of NOPs needed for any purpose.  */
641 #define MAX_NOPS 4
642 
643 /* A list of previous instructions, with index 0 being the most recent.
644    We need to look back MAX_NOPS instructions when filling delay slots
645    or working around processor errata.  We need to look back one
646    instruction further if we're thinking about using history[0] to
647    fill a branch delay slot.  */
648 static struct mips_cl_insn history[1 + MAX_NOPS];
649 
650 /* Nop instructions used by emit_nop.  */
651 static struct mips_cl_insn nop_insn, mips16_nop_insn;
652 
653 /* The appropriate nop for the current mode.  */
654 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
655 
656 /* If this is set, it points to a frag holding nop instructions which
657    were inserted before the start of a noreorder section.  If those
658    nops turn out to be unnecessary, the size of the frag can be
659    decreased.  */
660 static fragS *prev_nop_frag;
661 
662 /* The number of nop instructions we created in prev_nop_frag.  */
663 static int prev_nop_frag_holds;
664 
665 /* The number of nop instructions that we know we need in
666    prev_nop_frag.  */
667 static int prev_nop_frag_required;
668 
669 /* The number of instructions we've seen since prev_nop_frag.  */
670 static int prev_nop_frag_since;
671 
672 /* For ECOFF and ELF, relocations against symbols are done in two
673    parts, with a HI relocation and a LO relocation.  Each relocation
674    has only 16 bits of space to store an addend.  This means that in
675    order for the linker to handle carries correctly, it must be able
676    to locate both the HI and the LO relocation.  This means that the
677    relocations must appear in order in the relocation table.
678 
679    In order to implement this, we keep track of each unmatched HI
680    relocation.  We then sort them so that they immediately precede the
681    corresponding LO relocation.  */
682 
683 struct mips_hi_fixup
684 {
685   /* Next HI fixup.  */
686   struct mips_hi_fixup *next;
687   /* This fixup.  */
688   fixS *fixp;
689   /* The section this fixup is in.  */
690   segT seg;
691 };
692 
693 /* The list of unmatched HI relocs.  */
694 
695 static struct mips_hi_fixup *mips_hi_fixup_list;
696 
697 /* The frag containing the last explicit relocation operator.
698    Null if explicit relocations have not been used.  */
699 
700 static fragS *prev_reloc_op_frag;
701 
702 /* Map normal MIPS register numbers to mips16 register numbers.  */
703 
704 #define X ILLEGAL_REG
705 static const int mips32_to_16_reg_map[] =
706 {
707   X, X, 2, 3, 4, 5, 6, 7,
708   X, X, X, X, X, X, X, X,
709   0, 1, X, X, X, X, X, X,
710   X, X, X, X, X, X, X, X
711 };
712 #undef X
713 
714 /* Map mips16 register numbers to normal MIPS register numbers.  */
715 
716 static const unsigned int mips16_to_32_reg_map[] =
717 {
718   16, 17, 2, 3, 4, 5, 6, 7
719 };
720 
721 /* Classifies the kind of instructions we're interested in when
722    implementing -mfix-vr4120.  */
723 enum fix_vr4120_class {
724   FIX_VR4120_MACC,
725   FIX_VR4120_DMACC,
726   FIX_VR4120_MULT,
727   FIX_VR4120_DMULT,
728   FIX_VR4120_DIV,
729   FIX_VR4120_MTHILO,
730   NUM_FIX_VR4120_CLASSES
731 };
732 
733 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
734    there must be at least one other instruction between an instruction
735    of type X and an instruction of type Y.  */
736 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
737 
738 /* True if -mfix-vr4120 is in force.  */
739 static int mips_fix_vr4120;
740 
741 /* ...likewise -mfix-vr4130.  */
742 static int mips_fix_vr4130;
743 
744 /* We don't relax branches by default, since this causes us to expand
745    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
746    fail to compute the offset before expanding the macro to the most
747    efficient expansion.  */
748 
749 static int mips_relax_branch;
750 
751 /* The expansion of many macros depends on the type of symbol that
752    they refer to.  For example, when generating position-dependent code,
753    a macro that refers to a symbol may have two different expansions,
754    one which uses GP-relative addresses and one which uses absolute
755    addresses.  When generating SVR4-style PIC, a macro may have
756    different expansions for local and global symbols.
757 
758    We handle these situations by generating both sequences and putting
759    them in variant frags.  In position-dependent code, the first sequence
760    will be the GP-relative one and the second sequence will be the
761    absolute one.  In SVR4 PIC, the first sequence will be for global
762    symbols and the second will be for local symbols.
763 
764    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
765    SECOND are the lengths of the two sequences in bytes.  These fields
766    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
767    the subtype has the following flags:
768 
769    RELAX_USE_SECOND
770 	Set if it has been decided that we should use the second
771 	sequence instead of the first.
772 
773    RELAX_SECOND_LONGER
774 	Set in the first variant frag if the macro's second implementation
775 	is longer than its first.  This refers to the macro as a whole,
776 	not an individual relaxation.
777 
778    RELAX_NOMACRO
779 	Set in the first variant frag if the macro appeared in a .set nomacro
780 	block and if one alternative requires a warning but the other does not.
781 
782    RELAX_DELAY_SLOT
783 	Like RELAX_NOMACRO, but indicates that the macro appears in a branch
784 	delay slot.
785 
786    The frag's "opcode" points to the first fixup for relaxable code.
787 
788    Relaxable macros are generated using a sequence such as:
789 
790       relax_start (SYMBOL);
791       ... generate first expansion ...
792       relax_switch ();
793       ... generate second expansion ...
794       relax_end ();
795 
796    The code and fixups for the unwanted alternative are discarded
797    by md_convert_frag.  */
798 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
799 
800 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
801 #define RELAX_SECOND(X) ((X) & 0xff)
802 #define RELAX_USE_SECOND 0x10000
803 #define RELAX_SECOND_LONGER 0x20000
804 #define RELAX_NOMACRO 0x40000
805 #define RELAX_DELAY_SLOT 0x80000
806 
807 /* Branch without likely bit.  If label is out of range, we turn:
808 
809  	beq reg1, reg2, label
810 	delay slot
811 
812    into
813 
814         bne reg1, reg2, 0f
815         nop
816         j label
817      0: delay slot
818 
819    with the following opcode replacements:
820 
821 	beq <-> bne
822 	blez <-> bgtz
823 	bltz <-> bgez
824 	bc1f <-> bc1t
825 
826 	bltzal <-> bgezal  (with jal label instead of j label)
827 
828    Even though keeping the delay slot instruction in the delay slot of
829    the branch would be more efficient, it would be very tricky to do
830    correctly, because we'd have to introduce a variable frag *after*
831    the delay slot instruction, and expand that instead.  Let's do it
832    the easy way for now, even if the branch-not-taken case now costs
833    one additional instruction.  Out-of-range branches are not supposed
834    to be common, anyway.
835 
836    Branch likely.  If label is out of range, we turn:
837 
838 	beql reg1, reg2, label
839 	delay slot (annulled if branch not taken)
840 
841    into
842 
843         beql reg1, reg2, 1f
844         nop
845         beql $0, $0, 2f
846         nop
847      1: j[al] label
848         delay slot (executed only if branch taken)
849      2:
850 
851    It would be possible to generate a shorter sequence by losing the
852    likely bit, generating something like:
853 
854 	bne reg1, reg2, 0f
855 	nop
856 	j[al] label
857 	delay slot (executed only if branch taken)
858      0:
859 
860 	beql -> bne
861 	bnel -> beq
862 	blezl -> bgtz
863 	bgtzl -> blez
864 	bltzl -> bgez
865 	bgezl -> bltz
866 	bc1fl -> bc1t
867 	bc1tl -> bc1f
868 
869 	bltzall -> bgezal  (with jal label instead of j label)
870 	bgezall -> bltzal  (ditto)
871 
872 
873    but it's not clear that it would actually improve performance.  */
874 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
875   ((relax_substateT) \
876    (0xc0000000 \
877     | ((toofar) ? 1 : 0) \
878     | ((link) ? 2 : 0) \
879     | ((likely) ? 4 : 0) \
880     | ((uncond) ? 8 : 0)))
881 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
882 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
883 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
884 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
885 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
886 
887 /* For mips16 code, we use an entirely different form of relaxation.
888    mips16 supports two versions of most instructions which take
889    immediate values: a small one which takes some small value, and a
890    larger one which takes a 16 bit value.  Since branches also follow
891    this pattern, relaxing these values is required.
892 
893    We can assemble both mips16 and normal MIPS code in a single
894    object.  Therefore, we need to support this type of relaxation at
895    the same time that we support the relaxation described above.  We
896    use the high bit of the subtype field to distinguish these cases.
897 
898    The information we store for this type of relaxation is the
899    argument code found in the opcode file for this relocation, whether
900    the user explicitly requested a small or extended form, and whether
901    the relocation is in a jump or jal delay slot.  That tells us the
902    size of the value, and how it should be stored.  We also store
903    whether the fragment is considered to be extended or not.  We also
904    store whether this is known to be a branch to a different section,
905    whether we have tried to relax this frag yet, and whether we have
906    ever extended a PC relative fragment because of a shift count.  */
907 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot)	\
908   (0x80000000							\
909    | ((type) & 0xff)						\
910    | ((small) ? 0x100 : 0)					\
911    | ((ext) ? 0x200 : 0)					\
912    | ((dslot) ? 0x400 : 0)					\
913    | ((jal_dslot) ? 0x800 : 0))
914 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
915 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
916 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
917 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
918 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
919 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
920 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
921 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
922 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
923 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
924 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
925 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
926 
927 /* Is the given value a sign-extended 32-bit value?  */
928 #define IS_SEXT_32BIT_NUM(x)						\
929   (((x) &~ (offsetT) 0x7fffffff) == 0					\
930    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
931 
932 /* Is the given value a sign-extended 16-bit value?  */
933 #define IS_SEXT_16BIT_NUM(x)						\
934   (((x) &~ (offsetT) 0x7fff) == 0					\
935    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
936 
937 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
938 #define IS_ZEXT_32BIT_NUM(x)						\
939   (((x) &~ (offsetT) 0xffffffff) == 0					\
940    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
941 
942 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
943    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
944 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
945   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
946 	      | (((VALUE) & (MASK)) << (SHIFT)))
947 
948 /* Extract bits MASK << SHIFT from STRUCT and shift them right
949    SHIFT places.  */
950 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
951   (((STRUCT) >> (SHIFT)) & (MASK))
952 
953 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
954    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
955 
956    include/opcode/mips.h specifies operand fields using the macros
957    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
958    with "MIPS16OP" instead of "OP".  */
959 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
960   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
961 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
962   INSERT_BITS ((INSN).insn_opcode, VALUE, \
963 		MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
964 
965 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
966 #define EXTRACT_OPERAND(FIELD, INSN) \
967   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
968 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
969   EXTRACT_BITS ((INSN).insn_opcode, \
970 		MIPS16OP_MASK_##FIELD, \
971 		MIPS16OP_SH_##FIELD)
972 
973 /* Global variables used when generating relaxable macros.  See the
974    comment above RELAX_ENCODE for more details about how relaxation
975    is used.  */
976 static struct {
977   /* 0 if we're not emitting a relaxable macro.
978      1 if we're emitting the first of the two relaxation alternatives.
979      2 if we're emitting the second alternative.  */
980   int sequence;
981 
982   /* The first relaxable fixup in the current frag.  (In other words,
983      the first fixup that refers to relaxable code.)  */
984   fixS *first_fixup;
985 
986   /* sizes[0] says how many bytes of the first alternative are stored in
987      the current frag.  Likewise sizes[1] for the second alternative.  */
988   unsigned int sizes[2];
989 
990   /* The symbol on which the choice of sequence depends.  */
991   symbolS *symbol;
992 } mips_relax;
993 
994 /* Global variables used to decide whether a macro needs a warning.  */
995 static struct {
996   /* True if the macro is in a branch delay slot.  */
997   bfd_boolean delay_slot_p;
998 
999   /* For relaxable macros, sizes[0] is the length of the first alternative
1000      in bytes and sizes[1] is the length of the second alternative.
1001      For non-relaxable macros, both elements give the length of the
1002      macro in bytes.  */
1003   unsigned int sizes[2];
1004 
1005   /* The first variant frag for this macro.  */
1006   fragS *first_frag;
1007 } mips_macro_warning;
1008 
1009 /* Prototypes for static functions.  */
1010 
1011 #define internalError()							\
1012     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1013 
1014 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1015 
1016 static void append_insn
1017   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1018 static void mips_no_prev_insn (void);
1019 static void mips16_macro_build
1020   (expressionS *, const char *, const char *, va_list);
1021 static void load_register (int, expressionS *, int);
1022 static void macro_start (void);
1023 static void macro_end (void);
1024 static void macro (struct mips_cl_insn * ip);
1025 static void mips16_macro (struct mips_cl_insn * ip);
1026 #ifdef LOSING_COMPILER
1027 static void macro2 (struct mips_cl_insn * ip);
1028 #endif
1029 static void mips_ip (char *str, struct mips_cl_insn * ip);
1030 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1031 static void mips16_immed
1032   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1033    unsigned long *, bfd_boolean *, unsigned short *);
1034 static size_t my_getSmallExpression
1035   (expressionS *, bfd_reloc_code_real_type *, char *);
1036 static void my_getExpression (expressionS *, char *);
1037 static void s_align (int);
1038 static void s_change_sec (int);
1039 static void s_change_section (int);
1040 static void s_cons (int);
1041 static void s_float_cons (int);
1042 static void s_mips_globl (int);
1043 static void s_option (int);
1044 static void s_mipsset (int);
1045 static void s_abicalls (int);
1046 static void s_cpload (int);
1047 static void s_cpsetup (int);
1048 static void s_cplocal (int);
1049 static void s_cprestore (int);
1050 static void s_cpreturn (int);
1051 static void s_dtprelword (int);
1052 static void s_dtpreldword (int);
1053 static void s_gpvalue (int);
1054 static void s_gpword (int);
1055 static void s_gpdword (int);
1056 static void s_cpadd (int);
1057 static void s_insn (int);
1058 static void md_obj_begin (void);
1059 static void md_obj_end (void);
1060 static void s_mips_ent (int);
1061 static void s_mips_end (int);
1062 static void s_mips_frame (int);
1063 static void s_mips_mask (int reg_type);
1064 static void s_mips_stab (int);
1065 static void s_mips_weakext (int);
1066 static void s_mips_file (int);
1067 static void s_mips_loc (int);
1068 static bfd_boolean pic_need_relax (symbolS *, asection *);
1069 static int relaxed_branch_length (fragS *, asection *, int);
1070 static int validate_mips_insn (const struct mips_opcode *);
1071 
1072 /* Table and functions used to map between CPU/ISA names, and
1073    ISA levels, and CPU numbers.  */
1074 
1075 struct mips_cpu_info
1076 {
1077   const char *name;           /* CPU or ISA name.  */
1078   int flags;                  /* ASEs available, or ISA flag.  */
1079   int isa;                    /* ISA level.  */
1080   int cpu;                    /* CPU number (default CPU if ISA).  */
1081 };
1082 
1083 #define MIPS_CPU_IS_ISA		0x0001	/* Is this an ISA?  (If 0, a CPU.) */
1084 #define MIPS_CPU_ASE_SMARTMIPS	0x0002	/* CPU implements SmartMIPS ASE */
1085 #define MIPS_CPU_ASE_DSP	0x0004	/* CPU implements DSP ASE */
1086 #define MIPS_CPU_ASE_MT		0x0008	/* CPU implements MT ASE */
1087 #define MIPS_CPU_ASE_MIPS3D	0x0010	/* CPU implements MIPS-3D ASE */
1088 #define MIPS_CPU_ASE_MDMX	0x0020	/* CPU implements MDMX ASE */
1089 #define MIPS_CPU_ASE_DSPR2	0x0040	/* CPU implements DSP R2 ASE */
1090 
1091 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1092 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1093 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1094 
1095 /* Pseudo-op table.
1096 
1097    The following pseudo-ops from the Kane and Heinrich MIPS book
1098    should be defined here, but are currently unsupported: .alias,
1099    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1100 
1101    The following pseudo-ops from the Kane and Heinrich MIPS book are
1102    specific to the type of debugging information being generated, and
1103    should be defined by the object format: .aent, .begin, .bend,
1104    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1105    .vreg.
1106 
1107    The following pseudo-ops from the Kane and Heinrich MIPS book are
1108    not MIPS CPU specific, but are also not specific to the object file
1109    format.  This file is probably the best place to define them, but
1110    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1111 
1112 static const pseudo_typeS mips_pseudo_table[] =
1113 {
1114   /* MIPS specific pseudo-ops.  */
1115   {"option", s_option, 0},
1116   {"set", s_mipsset, 0},
1117   {"rdata", s_change_sec, 'r'},
1118   {"sdata", s_change_sec, 's'},
1119   {"livereg", s_ignore, 0},
1120   {"abicalls", s_abicalls, 0},
1121   {"cpload", s_cpload, 0},
1122   {"cpsetup", s_cpsetup, 0},
1123   {"cplocal", s_cplocal, 0},
1124   {"cprestore", s_cprestore, 0},
1125   {"cpreturn", s_cpreturn, 0},
1126   {"dtprelword", s_dtprelword, 0},
1127   {"dtpreldword", s_dtpreldword, 0},
1128   {"gpvalue", s_gpvalue, 0},
1129   {"gpword", s_gpword, 0},
1130   {"gpdword", s_gpdword, 0},
1131   {"cpadd", s_cpadd, 0},
1132   {"insn", s_insn, 0},
1133 
1134   /* Relatively generic pseudo-ops that happen to be used on MIPS
1135      chips.  */
1136   {"asciiz", stringer, 1},
1137   {"bss", s_change_sec, 'b'},
1138   {"err", s_err, 0},
1139   {"half", s_cons, 1},
1140   {"dword", s_cons, 3},
1141   {"weakext", s_mips_weakext, 0},
1142   {"origin", s_org, 0},
1143   {"repeat", s_rept, 0},
1144 
1145   /* These pseudo-ops are defined in read.c, but must be overridden
1146      here for one reason or another.  */
1147   {"align", s_align, 0},
1148   {"byte", s_cons, 0},
1149   {"data", s_change_sec, 'd'},
1150   {"double", s_float_cons, 'd'},
1151   {"float", s_float_cons, 'f'},
1152   {"globl", s_mips_globl, 0},
1153   {"global", s_mips_globl, 0},
1154   {"hword", s_cons, 1},
1155   {"int", s_cons, 2},
1156   {"long", s_cons, 2},
1157   {"octa", s_cons, 4},
1158   {"quad", s_cons, 3},
1159   {"section", s_change_section, 0},
1160   {"short", s_cons, 1},
1161   {"single", s_float_cons, 'f'},
1162   {"stabn", s_mips_stab, 'n'},
1163   {"text", s_change_sec, 't'},
1164   {"word", s_cons, 2},
1165 
1166   { "extern", ecoff_directive_extern, 0},
1167 
1168   { NULL, NULL, 0 },
1169 };
1170 
1171 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1172 {
1173   /* These pseudo-ops should be defined by the object file format.
1174      However, a.out doesn't support them, so we have versions here.  */
1175   {"aent", s_mips_ent, 1},
1176   {"bgnb", s_ignore, 0},
1177   {"end", s_mips_end, 0},
1178   {"endb", s_ignore, 0},
1179   {"ent", s_mips_ent, 0},
1180   {"file", s_mips_file, 0},
1181   {"fmask", s_mips_mask, 'F'},
1182   {"frame", s_mips_frame, 0},
1183   {"loc", s_mips_loc, 0},
1184   {"mask", s_mips_mask, 'R'},
1185   {"verstamp", s_ignore, 0},
1186   { NULL, NULL, 0 },
1187 };
1188 
1189 extern void pop_insert (const pseudo_typeS *);
1190 
1191 void
mips_pop_insert(void)1192 mips_pop_insert (void)
1193 {
1194   pop_insert (mips_pseudo_table);
1195   if (! ECOFF_DEBUGGING)
1196     pop_insert (mips_nonecoff_pseudo_table);
1197 }
1198 
1199 /* Symbols labelling the current insn.  */
1200 
1201 struct insn_label_list
1202 {
1203   struct insn_label_list *next;
1204   symbolS *label;
1205 };
1206 
1207 static struct insn_label_list *free_insn_labels;
1208 #define label_list tc_segment_info_data
1209 
1210 static void mips_clear_insn_labels (void);
1211 
1212 static inline void
mips_clear_insn_labels(void)1213 mips_clear_insn_labels (void)
1214 {
1215   register struct insn_label_list **pl;
1216   segment_info_type *si;
1217 
1218   if (now_seg)
1219     {
1220       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1221 	;
1222 
1223       si = seg_info (now_seg);
1224       *pl = si->label_list;
1225       si->label_list = NULL;
1226     }
1227 }
1228 
1229 
1230 static char *expr_end;
1231 
1232 /* Expressions which appear in instructions.  These are set by
1233    mips_ip.  */
1234 
1235 static expressionS imm_expr;
1236 static expressionS imm2_expr;
1237 static expressionS offset_expr;
1238 
1239 /* Relocs associated with imm_expr and offset_expr.  */
1240 
1241 static bfd_reloc_code_real_type imm_reloc[3]
1242   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1243 static bfd_reloc_code_real_type offset_reloc[3]
1244   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1245 
1246 /* These are set by mips16_ip if an explicit extension is used.  */
1247 
1248 static bfd_boolean mips16_small, mips16_ext;
1249 
1250 #ifdef OBJ_ELF
1251 /* The pdr segment for per procedure frame/regmask info.  Not used for
1252    ECOFF debugging.  */
1253 
1254 static segT pdr_seg;
1255 #endif
1256 
1257 /* The default target format to use.  */
1258 
1259 const char *
mips_target_format(void)1260 mips_target_format (void)
1261 {
1262   switch (OUTPUT_FLAVOR)
1263     {
1264     case bfd_target_ecoff_flavour:
1265       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1266     case bfd_target_coff_flavour:
1267       return "pe-mips";
1268     case bfd_target_elf_flavour:
1269 #ifdef TE_VXWORKS
1270       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1271 	return (target_big_endian
1272 		? "elf32-bigmips-vxworks"
1273 		: "elf32-littlemips-vxworks");
1274 #endif
1275 #ifdef TE_TMIPS
1276       /* This is traditional mips.  */
1277       return (target_big_endian
1278 	      ? (HAVE_64BIT_OBJECTS
1279 		 ? "elf64-tradbigmips"
1280 		 : (HAVE_NEWABI
1281 		    ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1282 	      : (HAVE_64BIT_OBJECTS
1283 		 ? "elf64-tradlittlemips"
1284 		 : (HAVE_NEWABI
1285 		    ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1286 #else
1287       return (target_big_endian
1288 	      ? (HAVE_64BIT_OBJECTS
1289 		 ? "elf64-bigmips"
1290 		 : (HAVE_NEWABI
1291 		    ? "elf32-nbigmips" : "elf32-bigmips"))
1292 	      : (HAVE_64BIT_OBJECTS
1293 		 ? "elf64-littlemips"
1294 		 : (HAVE_NEWABI
1295 		    ? "elf32-nlittlemips" : "elf32-littlemips")));
1296 #endif
1297     default:
1298       abort ();
1299       return NULL;
1300     }
1301 }
1302 
1303 /* Return the length of instruction INSN.  */
1304 
1305 static inline unsigned int
insn_length(const struct mips_cl_insn * insn)1306 insn_length (const struct mips_cl_insn *insn)
1307 {
1308   if (!mips_opts.mips16)
1309     return 4;
1310   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1311 }
1312 
1313 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1314 
1315 static void
create_insn(struct mips_cl_insn * insn,const struct mips_opcode * mo)1316 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1317 {
1318   size_t i;
1319 
1320   insn->insn_mo = mo;
1321   insn->use_extend = FALSE;
1322   insn->extend = 0;
1323   insn->insn_opcode = mo->match;
1324   insn->frag = NULL;
1325   insn->where = 0;
1326   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1327     insn->fixp[i] = NULL;
1328   insn->fixed_p = (mips_opts.noreorder > 0);
1329   insn->noreorder_p = (mips_opts.noreorder > 0);
1330   insn->mips16_absolute_jump_p = 0;
1331 }
1332 
1333 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1334 
1335 static void
install_insn(const struct mips_cl_insn * insn)1336 install_insn (const struct mips_cl_insn *insn)
1337 {
1338   char *f = insn->frag->fr_literal + insn->where;
1339   if (!mips_opts.mips16)
1340     md_number_to_chars (f, insn->insn_opcode, 4);
1341   else if (insn->mips16_absolute_jump_p)
1342     {
1343       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1344       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1345     }
1346   else
1347     {
1348       if (insn->use_extend)
1349 	{
1350 	  md_number_to_chars (f, 0xf000 | insn->extend, 2);
1351 	  f += 2;
1352 	}
1353       md_number_to_chars (f, insn->insn_opcode, 2);
1354     }
1355 }
1356 
1357 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1358    and install the opcode in the new location.  */
1359 
1360 static void
move_insn(struct mips_cl_insn * insn,fragS * frag,long where)1361 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1362 {
1363   size_t i;
1364 
1365   insn->frag = frag;
1366   insn->where = where;
1367   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1368     if (insn->fixp[i] != NULL)
1369       {
1370 	insn->fixp[i]->fx_frag = frag;
1371 	insn->fixp[i]->fx_where = where;
1372       }
1373   install_insn (insn);
1374 }
1375 
1376 /* Add INSN to the end of the output.  */
1377 
1378 static void
add_fixed_insn(struct mips_cl_insn * insn)1379 add_fixed_insn (struct mips_cl_insn *insn)
1380 {
1381   char *f = frag_more (insn_length (insn));
1382   move_insn (insn, frag_now, f - frag_now->fr_literal);
1383 }
1384 
1385 /* Start a variant frag and move INSN to the start of the variant part,
1386    marking it as fixed.  The other arguments are as for frag_var.  */
1387 
1388 static void
add_relaxed_insn(struct mips_cl_insn * insn,int max_chars,int var,relax_substateT subtype,symbolS * symbol,offsetT offset)1389 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1390 		  relax_substateT subtype, symbolS *symbol, offsetT offset)
1391 {
1392   frag_grow (max_chars);
1393   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1394   insn->fixed_p = 1;
1395   frag_var (rs_machine_dependent, max_chars, var,
1396 	    subtype, symbol, offset, NULL);
1397 }
1398 
1399 /* Insert N copies of INSN into the history buffer, starting at
1400    position FIRST.  Neither FIRST nor N need to be clipped.  */
1401 
1402 static void
insert_into_history(unsigned int first,unsigned int n,const struct mips_cl_insn * insn)1403 insert_into_history (unsigned int first, unsigned int n,
1404 		     const struct mips_cl_insn *insn)
1405 {
1406   if (mips_relax.sequence != 2)
1407     {
1408       unsigned int i;
1409 
1410       for (i = ARRAY_SIZE (history); i-- > first;)
1411 	if (i >= first + n)
1412 	  history[i] = history[i - n];
1413 	else
1414 	  history[i] = *insn;
1415     }
1416 }
1417 
1418 /* Emit a nop instruction, recording it in the history buffer.  */
1419 
1420 static void
emit_nop(void)1421 emit_nop (void)
1422 {
1423   add_fixed_insn (NOP_INSN);
1424   insert_into_history (0, 1, NOP_INSN);
1425 }
1426 
1427 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1428    the idea is to make it obvious at a glance that each errata is
1429    included.  */
1430 
1431 static void
init_vr4120_conflicts(void)1432 init_vr4120_conflicts (void)
1433 {
1434 #define CONFLICT(FIRST, SECOND) \
1435     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1436 
1437   /* Errata 21 - [D]DIV[U] after [D]MACC */
1438   CONFLICT (MACC, DIV);
1439   CONFLICT (DMACC, DIV);
1440 
1441   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1442   CONFLICT (DMULT, DMULT);
1443   CONFLICT (DMULT, DMACC);
1444   CONFLICT (DMACC, DMULT);
1445   CONFLICT (DMACC, DMACC);
1446 
1447   /* Errata 24 - MT{LO,HI} after [D]MACC */
1448   CONFLICT (MACC, MTHILO);
1449   CONFLICT (DMACC, MTHILO);
1450 
1451   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1452      instruction is executed immediately after a MACC or DMACC
1453      instruction, the result of [either instruction] is incorrect."  */
1454   CONFLICT (MACC, MULT);
1455   CONFLICT (MACC, DMULT);
1456   CONFLICT (DMACC, MULT);
1457   CONFLICT (DMACC, DMULT);
1458 
1459   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1460      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1461      DDIV or DDIVU instruction, the result of the MACC or
1462      DMACC instruction is incorrect.".  */
1463   CONFLICT (DMULT, MACC);
1464   CONFLICT (DMULT, DMACC);
1465   CONFLICT (DIV, MACC);
1466   CONFLICT (DIV, DMACC);
1467 
1468 #undef CONFLICT
1469 }
1470 
1471 struct regname {
1472   const char *name;
1473   unsigned int num;
1474 };
1475 
1476 #define RTYPE_MASK	0x1ff00
1477 #define RTYPE_NUM	0x00100
1478 #define RTYPE_FPU	0x00200
1479 #define RTYPE_FCC	0x00400
1480 #define RTYPE_VEC	0x00800
1481 #define RTYPE_GP	0x01000
1482 #define RTYPE_CP0	0x02000
1483 #define RTYPE_PC	0x04000
1484 #define RTYPE_ACC	0x08000
1485 #define RTYPE_CCC	0x10000
1486 #define RNUM_MASK	0x000ff
1487 #define RWARN		0x80000
1488 
1489 #define GENERIC_REGISTER_NUMBERS \
1490     {"$0",	RTYPE_NUM | 0},  \
1491     {"$1",	RTYPE_NUM | 1},  \
1492     {"$2",	RTYPE_NUM | 2},  \
1493     {"$3",	RTYPE_NUM | 3},  \
1494     {"$4",	RTYPE_NUM | 4},  \
1495     {"$5",	RTYPE_NUM | 5},  \
1496     {"$6",	RTYPE_NUM | 6},  \
1497     {"$7",	RTYPE_NUM | 7},  \
1498     {"$8",	RTYPE_NUM | 8},  \
1499     {"$9",	RTYPE_NUM | 9},  \
1500     {"$10",	RTYPE_NUM | 10}, \
1501     {"$11",	RTYPE_NUM | 11}, \
1502     {"$12",	RTYPE_NUM | 12}, \
1503     {"$13",	RTYPE_NUM | 13}, \
1504     {"$14",	RTYPE_NUM | 14}, \
1505     {"$15",	RTYPE_NUM | 15}, \
1506     {"$16",	RTYPE_NUM | 16}, \
1507     {"$17",	RTYPE_NUM | 17}, \
1508     {"$18",	RTYPE_NUM | 18}, \
1509     {"$19",	RTYPE_NUM | 19}, \
1510     {"$20",	RTYPE_NUM | 20}, \
1511     {"$21",	RTYPE_NUM | 21}, \
1512     {"$22",	RTYPE_NUM | 22}, \
1513     {"$23",	RTYPE_NUM | 23}, \
1514     {"$24",	RTYPE_NUM | 24}, \
1515     {"$25",	RTYPE_NUM | 25}, \
1516     {"$26",	RTYPE_NUM | 26}, \
1517     {"$27",	RTYPE_NUM | 27}, \
1518     {"$28",	RTYPE_NUM | 28}, \
1519     {"$29",	RTYPE_NUM | 29}, \
1520     {"$30",	RTYPE_NUM | 30}, \
1521     {"$31",	RTYPE_NUM | 31}
1522 
1523 #define FPU_REGISTER_NAMES       \
1524     {"$f0",	RTYPE_FPU | 0},  \
1525     {"$f1",	RTYPE_FPU | 1},  \
1526     {"$f2",	RTYPE_FPU | 2},  \
1527     {"$f3",	RTYPE_FPU | 3},  \
1528     {"$f4",	RTYPE_FPU | 4},  \
1529     {"$f5",	RTYPE_FPU | 5},  \
1530     {"$f6",	RTYPE_FPU | 6},  \
1531     {"$f7",	RTYPE_FPU | 7},  \
1532     {"$f8",	RTYPE_FPU | 8},  \
1533     {"$f9",	RTYPE_FPU | 9},  \
1534     {"$f10",	RTYPE_FPU | 10}, \
1535     {"$f11",	RTYPE_FPU | 11}, \
1536     {"$f12",	RTYPE_FPU | 12}, \
1537     {"$f13",	RTYPE_FPU | 13}, \
1538     {"$f14",	RTYPE_FPU | 14}, \
1539     {"$f15",	RTYPE_FPU | 15}, \
1540     {"$f16",	RTYPE_FPU | 16}, \
1541     {"$f17",	RTYPE_FPU | 17}, \
1542     {"$f18",	RTYPE_FPU | 18}, \
1543     {"$f19",	RTYPE_FPU | 19}, \
1544     {"$f20",	RTYPE_FPU | 20}, \
1545     {"$f21",	RTYPE_FPU | 21}, \
1546     {"$f22",	RTYPE_FPU | 22}, \
1547     {"$f23",	RTYPE_FPU | 23}, \
1548     {"$f24",	RTYPE_FPU | 24}, \
1549     {"$f25",	RTYPE_FPU | 25}, \
1550     {"$f26",	RTYPE_FPU | 26}, \
1551     {"$f27",	RTYPE_FPU | 27}, \
1552     {"$f28",	RTYPE_FPU | 28}, \
1553     {"$f29",	RTYPE_FPU | 29}, \
1554     {"$f30",	RTYPE_FPU | 30}, \
1555     {"$f31",	RTYPE_FPU | 31}
1556 
1557 #define FPU_CONDITION_CODE_NAMES \
1558     {"$fcc0",	RTYPE_FCC | 0},  \
1559     {"$fcc1",	RTYPE_FCC | 1},  \
1560     {"$fcc2",	RTYPE_FCC | 2},  \
1561     {"$fcc3",	RTYPE_FCC | 3},  \
1562     {"$fcc4",	RTYPE_FCC | 4},  \
1563     {"$fcc5",	RTYPE_FCC | 5},  \
1564     {"$fcc6",	RTYPE_FCC | 6},  \
1565     {"$fcc7",	RTYPE_FCC | 7}
1566 
1567 #define COPROC_CONDITION_CODE_NAMES         \
1568     {"$cc0",	RTYPE_FCC | RTYPE_CCC | 0}, \
1569     {"$cc1",	RTYPE_FCC | RTYPE_CCC | 1}, \
1570     {"$cc2",	RTYPE_FCC | RTYPE_CCC | 2}, \
1571     {"$cc3",	RTYPE_FCC | RTYPE_CCC | 3}, \
1572     {"$cc4",	RTYPE_FCC | RTYPE_CCC | 4}, \
1573     {"$cc5",	RTYPE_FCC | RTYPE_CCC | 5}, \
1574     {"$cc6",	RTYPE_FCC | RTYPE_CCC | 6}, \
1575     {"$cc7",	RTYPE_FCC | RTYPE_CCC | 7}
1576 
1577 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1578     {"$a4",	RTYPE_GP | 8},  \
1579     {"$a5",	RTYPE_GP | 9},  \
1580     {"$a6",	RTYPE_GP | 10}, \
1581     {"$a7",	RTYPE_GP | 11}, \
1582     {"$ta0",	RTYPE_GP | 8},  /* alias for $a4 */ \
1583     {"$ta1",	RTYPE_GP | 9},  /* alias for $a5 */ \
1584     {"$ta2",	RTYPE_GP | 10}, /* alias for $a6 */ \
1585     {"$ta3",	RTYPE_GP | 11}, /* alias for $a7 */ \
1586     {"$t0",	RTYPE_GP | 12}, \
1587     {"$t1",	RTYPE_GP | 13}, \
1588     {"$t2",	RTYPE_GP | 14}, \
1589     {"$t3",	RTYPE_GP | 15}
1590 
1591 #define O32_SYMBOLIC_REGISTER_NAMES \
1592     {"$t0",	RTYPE_GP | 8},  \
1593     {"$t1",	RTYPE_GP | 9},  \
1594     {"$t2",	RTYPE_GP | 10}, \
1595     {"$t3",	RTYPE_GP | 11}, \
1596     {"$t4",	RTYPE_GP | 12}, \
1597     {"$t5",	RTYPE_GP | 13}, \
1598     {"$t6",	RTYPE_GP | 14}, \
1599     {"$t7",	RTYPE_GP | 15}, \
1600     {"$ta0",	RTYPE_GP | 12}, /* alias for $t4 */ \
1601     {"$ta1",	RTYPE_GP | 13}, /* alias for $t5 */ \
1602     {"$ta2",	RTYPE_GP | 14}, /* alias for $t6 */ \
1603     {"$ta3",	RTYPE_GP | 15}  /* alias for $t7 */
1604 
1605 /* Remaining symbolic register names */
1606 #define SYMBOLIC_REGISTER_NAMES \
1607     {"$zero",	RTYPE_GP | 0},  \
1608     {"$at",	RTYPE_GP | 1},  \
1609     {"$AT",	RTYPE_GP | 1},  \
1610     {"$v0",	RTYPE_GP | 2},  \
1611     {"$v1",	RTYPE_GP | 3},  \
1612     {"$a0",	RTYPE_GP | 4},  \
1613     {"$a1",	RTYPE_GP | 5},  \
1614     {"$a2",	RTYPE_GP | 6},  \
1615     {"$a3",	RTYPE_GP | 7},  \
1616     {"$s0",	RTYPE_GP | 16}, \
1617     {"$s1",	RTYPE_GP | 17}, \
1618     {"$s2",	RTYPE_GP | 18}, \
1619     {"$s3",	RTYPE_GP | 19}, \
1620     {"$s4",	RTYPE_GP | 20}, \
1621     {"$s5",	RTYPE_GP | 21}, \
1622     {"$s6",	RTYPE_GP | 22}, \
1623     {"$s7",	RTYPE_GP | 23}, \
1624     {"$t8",	RTYPE_GP | 24}, \
1625     {"$t9",	RTYPE_GP | 25}, \
1626     {"$k0",	RTYPE_GP | 26}, \
1627     {"$kt0",	RTYPE_GP | 26}, \
1628     {"$k1",	RTYPE_GP | 27}, \
1629     {"$kt1",	RTYPE_GP | 27}, \
1630     {"$gp",	RTYPE_GP | 28}, \
1631     {"$sp",	RTYPE_GP | 29}, \
1632     {"$s8",	RTYPE_GP | 30}, \
1633     {"$fp",	RTYPE_GP | 30}, \
1634     {"$ra",	RTYPE_GP | 31}
1635 
1636 #define MIPS16_SPECIAL_REGISTER_NAMES \
1637     {"$pc",	RTYPE_PC | 0}
1638 
1639 #define MDMX_VECTOR_REGISTER_NAMES \
1640     /* {"$v0",	RTYPE_VEC | 0},  clash with REG 2 above */ \
1641     /* {"$v1",	RTYPE_VEC | 1},  clash with REG 3 above */ \
1642     {"$v2",	RTYPE_VEC | 2},  \
1643     {"$v3",	RTYPE_VEC | 3},  \
1644     {"$v4",	RTYPE_VEC | 4},  \
1645     {"$v5",	RTYPE_VEC | 5},  \
1646     {"$v6",	RTYPE_VEC | 6},  \
1647     {"$v7",	RTYPE_VEC | 7},  \
1648     {"$v8",	RTYPE_VEC | 8},  \
1649     {"$v9",	RTYPE_VEC | 9},  \
1650     {"$v10",	RTYPE_VEC | 10}, \
1651     {"$v11",	RTYPE_VEC | 11}, \
1652     {"$v12",	RTYPE_VEC | 12}, \
1653     {"$v13",	RTYPE_VEC | 13}, \
1654     {"$v14",	RTYPE_VEC | 14}, \
1655     {"$v15",	RTYPE_VEC | 15}, \
1656     {"$v16",	RTYPE_VEC | 16}, \
1657     {"$v17",	RTYPE_VEC | 17}, \
1658     {"$v18",	RTYPE_VEC | 18}, \
1659     {"$v19",	RTYPE_VEC | 19}, \
1660     {"$v20",	RTYPE_VEC | 20}, \
1661     {"$v21",	RTYPE_VEC | 21}, \
1662     {"$v22",	RTYPE_VEC | 22}, \
1663     {"$v23",	RTYPE_VEC | 23}, \
1664     {"$v24",	RTYPE_VEC | 24}, \
1665     {"$v25",	RTYPE_VEC | 25}, \
1666     {"$v26",	RTYPE_VEC | 26}, \
1667     {"$v27",	RTYPE_VEC | 27}, \
1668     {"$v28",	RTYPE_VEC | 28}, \
1669     {"$v29",	RTYPE_VEC | 29}, \
1670     {"$v30",	RTYPE_VEC | 30}, \
1671     {"$v31",	RTYPE_VEC | 31}
1672 
1673 #define MIPS_DSP_ACCUMULATOR_NAMES \
1674     {"$ac0",	RTYPE_ACC | 0}, \
1675     {"$ac1",	RTYPE_ACC | 1}, \
1676     {"$ac2",	RTYPE_ACC | 2}, \
1677     {"$ac3",	RTYPE_ACC | 3}
1678 
1679 static const struct regname reg_names[] = {
1680   GENERIC_REGISTER_NUMBERS,
1681   FPU_REGISTER_NAMES,
1682   FPU_CONDITION_CODE_NAMES,
1683   COPROC_CONDITION_CODE_NAMES,
1684 
1685   /* The $txx registers depends on the abi,
1686      these will be added later into the symbol table from
1687      one of the tables below once mips_abi is set after
1688      parsing of arguments from the command line. */
1689   SYMBOLIC_REGISTER_NAMES,
1690 
1691   MIPS16_SPECIAL_REGISTER_NAMES,
1692   MDMX_VECTOR_REGISTER_NAMES,
1693   MIPS_DSP_ACCUMULATOR_NAMES,
1694   {0, 0}
1695 };
1696 
1697 static const struct regname reg_names_o32[] = {
1698   O32_SYMBOLIC_REGISTER_NAMES,
1699   {0, 0}
1700 };
1701 
1702 static const struct regname reg_names_n32n64[] = {
1703   N32N64_SYMBOLIC_REGISTER_NAMES,
1704   {0, 0}
1705 };
1706 
1707 static int
reg_lookup(char ** s,unsigned int types,unsigned int * regnop)1708 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1709 {
1710   symbolS *symbolP;
1711   char *e;
1712   char save_c;
1713   int reg = -1;
1714 
1715   /* Find end of name.  */
1716   e = *s;
1717   if (is_name_beginner (*e))
1718     ++e;
1719   while (is_part_of_name (*e))
1720     ++e;
1721 
1722   /* Terminate name.  */
1723   save_c = *e;
1724   *e = '\0';
1725 
1726   /* Look for a register symbol.  */
1727   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1728     {
1729       int r = S_GET_VALUE (symbolP);
1730       if (r & types)
1731 	reg = r & RNUM_MASK;
1732       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1733 	/* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1734 	reg = (r & RNUM_MASK) - 2;
1735     }
1736   /* Else see if this is a register defined in an itbl entry.  */
1737   else if ((types & RTYPE_GP) && itbl_have_entries)
1738     {
1739       char *n = *s;
1740       unsigned long r;
1741 
1742       if (*n == '$')
1743 	++n;
1744       if (itbl_get_reg_val (n, &r))
1745 	reg = r & RNUM_MASK;
1746     }
1747 
1748   /* Advance to next token if a register was recognised.  */
1749   if (reg >= 0)
1750     *s = e;
1751   else if (types & RWARN)
1752     as_warn ("Unrecognized register name `%s'", *s);
1753 
1754   *e = save_c;
1755   if (regnop)
1756     *regnop = reg;
1757   return reg >= 0;
1758 }
1759 
1760 /* This function is called once, at assembler startup time.  It should set up
1761    all the tables, etc. that the MD part of the assembler will need.  */
1762 
1763 void
md_begin(void)1764 md_begin (void)
1765 {
1766   const char *retval = NULL;
1767   int i = 0;
1768   int broken = 0;
1769 
1770   if (mips_pic != NO_PIC)
1771     {
1772       if (g_switch_seen && g_switch_value != 0)
1773 	as_bad (_("-G may not be used in position-independent code"));
1774       g_switch_value = 0;
1775     }
1776 
1777   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1778     as_warn (_("Could not set architecture and machine"));
1779 
1780   op_hash = hash_new ();
1781 
1782   for (i = 0; i < NUMOPCODES;)
1783     {
1784       const char *name = mips_opcodes[i].name;
1785 
1786       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1787       if (retval != NULL)
1788 	{
1789 	  fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1790 		   mips_opcodes[i].name, retval);
1791 	  /* Probably a memory allocation problem?  Give up now.  */
1792 	  as_fatal (_("Broken assembler.  No assembly attempted."));
1793 	}
1794       do
1795 	{
1796 	  if (mips_opcodes[i].pinfo != INSN_MACRO)
1797 	    {
1798 	      if (!validate_mips_insn (&mips_opcodes[i]))
1799 		broken = 1;
1800 	      if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1801 		{
1802 		  create_insn (&nop_insn, mips_opcodes + i);
1803 		  nop_insn.fixed_p = 1;
1804 		}
1805 	    }
1806 	  ++i;
1807 	}
1808       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1809     }
1810 
1811   mips16_op_hash = hash_new ();
1812 
1813   i = 0;
1814   while (i < bfd_mips16_num_opcodes)
1815     {
1816       const char *name = mips16_opcodes[i].name;
1817 
1818       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1819       if (retval != NULL)
1820 	as_fatal (_("internal: can't hash `%s': %s"),
1821 		  mips16_opcodes[i].name, retval);
1822       do
1823 	{
1824 	  if (mips16_opcodes[i].pinfo != INSN_MACRO
1825 	      && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1826 		  != mips16_opcodes[i].match))
1827 	    {
1828 	      fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1829 		       mips16_opcodes[i].name, mips16_opcodes[i].args);
1830 	      broken = 1;
1831 	    }
1832 	  if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1833 	    {
1834 	      create_insn (&mips16_nop_insn, mips16_opcodes + i);
1835 	      mips16_nop_insn.fixed_p = 1;
1836 	    }
1837 	  ++i;
1838 	}
1839       while (i < bfd_mips16_num_opcodes
1840 	     && strcmp (mips16_opcodes[i].name, name) == 0);
1841     }
1842 
1843   if (broken)
1844     as_fatal (_("Broken assembler.  No assembly attempted."));
1845 
1846   /* We add all the general register names to the symbol table.  This
1847      helps us detect invalid uses of them.  */
1848   for (i = 0; reg_names[i].name; i++)
1849     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1850 				     reg_names[i].num, // & RNUM_MASK,
1851 				     &zero_address_frag));
1852   if (HAVE_NEWABI)
1853     for (i = 0; reg_names_n32n64[i].name; i++)
1854       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1855 				       reg_names_n32n64[i].num, // & RNUM_MASK,
1856 				       &zero_address_frag));
1857   else
1858     for (i = 0; reg_names_o32[i].name; i++)
1859       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1860 				       reg_names_o32[i].num, // & RNUM_MASK,
1861 				       &zero_address_frag));
1862 
1863   mips_no_prev_insn ();
1864 
1865   mips_gprmask = 0;
1866   mips_cprmask[0] = 0;
1867   mips_cprmask[1] = 0;
1868   mips_cprmask[2] = 0;
1869   mips_cprmask[3] = 0;
1870 
1871   /* set the default alignment for the text section (2**2) */
1872   record_alignment (text_section, 2);
1873 
1874   bfd_set_gp_size (stdoutput, g_switch_value);
1875 
1876 #ifdef OBJ_ELF
1877   if (IS_ELF)
1878     {
1879       /* On a native system other than VxWorks, sections must be aligned
1880 	 to 16 byte boundaries.  When configured for an embedded ELF
1881 	 target, we don't bother.  */
1882       if (strcmp (TARGET_OS, "elf") != 0
1883 	  && strcmp (TARGET_OS, "vxworks") != 0)
1884 	{
1885 	  (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1886 	  (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1887 	  (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1888 	}
1889 
1890       /* Create a .reginfo section for register masks and a .mdebug
1891 	 section for debugging information.  */
1892       {
1893 	segT seg;
1894 	subsegT subseg;
1895 	flagword flags;
1896 	segT sec;
1897 
1898 	seg = now_seg;
1899 	subseg = now_subseg;
1900 
1901 	/* The ABI says this section should be loaded so that the
1902 	   running program can access it.  However, we don't load it
1903 	   if we are configured for an embedded target */
1904 	flags = SEC_READONLY | SEC_DATA;
1905 	if (strcmp (TARGET_OS, "elf") != 0)
1906 	  flags |= SEC_ALLOC | SEC_LOAD;
1907 
1908 	if (mips_abi != N64_ABI)
1909 	  {
1910 	    sec = subseg_new (".reginfo", (subsegT) 0);
1911 
1912 	    bfd_set_section_flags (stdoutput, sec, flags);
1913 	    bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1914 
1915 	    mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1916 	  }
1917 	else
1918 	  {
1919 	    /* The 64-bit ABI uses a .MIPS.options section rather than
1920                .reginfo section.  */
1921 	    sec = subseg_new (".MIPS.options", (subsegT) 0);
1922 	    bfd_set_section_flags (stdoutput, sec, flags);
1923 	    bfd_set_section_alignment (stdoutput, sec, 3);
1924 
1925 	    /* Set up the option header.  */
1926 	    {
1927 	      Elf_Internal_Options opthdr;
1928 	      char *f;
1929 
1930 	      opthdr.kind = ODK_REGINFO;
1931 	      opthdr.size = (sizeof (Elf_External_Options)
1932 			     + sizeof (Elf64_External_RegInfo));
1933 	      opthdr.section = 0;
1934 	      opthdr.info = 0;
1935 	      f = frag_more (sizeof (Elf_External_Options));
1936 	      bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1937 					     (Elf_External_Options *) f);
1938 
1939 	      mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1940 	    }
1941 	  }
1942 
1943 	if (ECOFF_DEBUGGING)
1944 	  {
1945 	    sec = subseg_new (".mdebug", (subsegT) 0);
1946 	    (void) bfd_set_section_flags (stdoutput, sec,
1947 					  SEC_HAS_CONTENTS | SEC_READONLY);
1948 	    (void) bfd_set_section_alignment (stdoutput, sec, 2);
1949 	  }
1950 	else if (mips_flag_pdr)
1951 	  {
1952 	    pdr_seg = subseg_new (".pdr", (subsegT) 0);
1953 	    (void) bfd_set_section_flags (stdoutput, pdr_seg,
1954 					  SEC_READONLY | SEC_RELOC
1955 					  | SEC_DEBUGGING);
1956 	    (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1957 	  }
1958 
1959 	subseg_set (seg, subseg);
1960       }
1961     }
1962 #endif /* OBJ_ELF */
1963 
1964   if (! ECOFF_DEBUGGING)
1965     md_obj_begin ();
1966 
1967   if (mips_fix_vr4120)
1968     init_vr4120_conflicts ();
1969 }
1970 
1971 void
md_mips_end(void)1972 md_mips_end (void)
1973 {
1974   if (! ECOFF_DEBUGGING)
1975     md_obj_end ();
1976 }
1977 
1978 void
md_assemble(char * str)1979 md_assemble (char *str)
1980 {
1981   struct mips_cl_insn insn;
1982   bfd_reloc_code_real_type unused_reloc[3]
1983     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1984 
1985   imm_expr.X_op = O_absent;
1986   imm2_expr.X_op = O_absent;
1987   offset_expr.X_op = O_absent;
1988   imm_reloc[0] = BFD_RELOC_UNUSED;
1989   imm_reloc[1] = BFD_RELOC_UNUSED;
1990   imm_reloc[2] = BFD_RELOC_UNUSED;
1991   offset_reloc[0] = BFD_RELOC_UNUSED;
1992   offset_reloc[1] = BFD_RELOC_UNUSED;
1993   offset_reloc[2] = BFD_RELOC_UNUSED;
1994 
1995   if (mips_opts.mips16)
1996     mips16_ip (str, &insn);
1997   else
1998     {
1999       mips_ip (str, &insn);
2000       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2001 	    str, insn.insn_opcode));
2002     }
2003 
2004   if (insn_error)
2005     {
2006       as_bad ("%s `%s'", insn_error, str);
2007       return;
2008     }
2009 
2010   if (insn.insn_mo->pinfo == INSN_MACRO)
2011     {
2012       macro_start ();
2013       if (mips_opts.mips16)
2014 	mips16_macro (&insn);
2015       else
2016 	macro (&insn);
2017       macro_end ();
2018     }
2019   else
2020     {
2021       if (imm_expr.X_op != O_absent)
2022 	append_insn (&insn, &imm_expr, imm_reloc);
2023       else if (offset_expr.X_op != O_absent)
2024 	append_insn (&insn, &offset_expr, offset_reloc);
2025       else
2026 	append_insn (&insn, NULL, unused_reloc);
2027     }
2028 }
2029 
2030 /* Return true if the given relocation might need a matching %lo().
2031    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2032    need a matching %lo() when applied to local symbols.  */
2033 
2034 static inline bfd_boolean
reloc_needs_lo_p(bfd_reloc_code_real_type reloc)2035 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2036 {
2037   return (HAVE_IN_PLACE_ADDENDS
2038 	  && (reloc == BFD_RELOC_HI16_S
2039 	      || reloc == BFD_RELOC_MIPS16_HI16_S
2040 	      /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2041 		 all GOT16 relocations evaluate to "G".  */
2042 	      || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2043 }
2044 
2045 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2046    relocation.  */
2047 
2048 static inline bfd_boolean
fixup_has_matching_lo_p(fixS * fixp)2049 fixup_has_matching_lo_p (fixS *fixp)
2050 {
2051   return (fixp->fx_next != NULL
2052 	  && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2053 	     || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2054 	  && fixp->fx_addsy == fixp->fx_next->fx_addsy
2055 	  && fixp->fx_offset == fixp->fx_next->fx_offset);
2056 }
2057 
2058 /* See whether instruction IP reads register REG.  CLASS is the type
2059    of register.  */
2060 
2061 static int
insn_uses_reg(const struct mips_cl_insn * ip,unsigned int reg,enum mips_regclass class)2062 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2063 	       enum mips_regclass class)
2064 {
2065   if (class == MIPS16_REG)
2066     {
2067       assert (mips_opts.mips16);
2068       reg = mips16_to_32_reg_map[reg];
2069       class = MIPS_GR_REG;
2070     }
2071 
2072   /* Don't report on general register ZERO, since it never changes.  */
2073   if (class == MIPS_GR_REG && reg == ZERO)
2074     return 0;
2075 
2076   if (class == MIPS_FP_REG)
2077     {
2078       assert (! mips_opts.mips16);
2079       /* If we are called with either $f0 or $f1, we must check $f0.
2080 	 This is not optimal, because it will introduce an unnecessary
2081 	 NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2082 	 need to distinguish reading both $f0 and $f1 or just one of
2083 	 them.  Note that we don't have to check the other way,
2084 	 because there is no instruction that sets both $f0 and $f1
2085 	 and requires a delay.  */
2086       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2087 	  && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2088 	      == (reg &~ (unsigned) 1)))
2089 	return 1;
2090       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2091 	  && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2092 	      == (reg &~ (unsigned) 1)))
2093 	return 1;
2094     }
2095   else if (! mips_opts.mips16)
2096     {
2097       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2098 	  && EXTRACT_OPERAND (RS, *ip) == reg)
2099 	return 1;
2100       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2101 	  && EXTRACT_OPERAND (RT, *ip) == reg)
2102 	return 1;
2103     }
2104   else
2105     {
2106       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2107 	  && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2108 	return 1;
2109       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2110 	  && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2111 	return 1;
2112       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2113 	  && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2114 	      == reg))
2115 	return 1;
2116       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2117 	return 1;
2118       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2119 	return 1;
2120       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2121 	return 1;
2122       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2123 	  && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2124 	return 1;
2125     }
2126 
2127   return 0;
2128 }
2129 
2130 /* This function returns true if modifying a register requires a
2131    delay.  */
2132 
2133 static int
reg_needs_delay(unsigned int reg)2134 reg_needs_delay (unsigned int reg)
2135 {
2136   unsigned long prev_pinfo;
2137 
2138   prev_pinfo = history[0].insn_mo->pinfo;
2139   if (! mips_opts.noreorder
2140       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2141 	   && ! gpr_interlocks)
2142 	  || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2143 	      && ! cop_interlocks)))
2144     {
2145       /* A load from a coprocessor or from memory.  All load delays
2146 	 delay the use of general register rt for one instruction.  */
2147       /* Itbl support may require additional care here.  */
2148       know (prev_pinfo & INSN_WRITE_GPR_T);
2149       if (reg == EXTRACT_OPERAND (RT, history[0]))
2150 	return 1;
2151     }
2152 
2153   return 0;
2154 }
2155 
2156 /* Move all labels in insn_labels to the current insertion point.  */
2157 
2158 static void
mips_move_labels(void)2159 mips_move_labels (void)
2160 {
2161   segment_info_type *si = seg_info (now_seg);
2162   struct insn_label_list *l;
2163   valueT val;
2164 
2165   for (l = si->label_list; l != NULL; l = l->next)
2166     {
2167       assert (S_GET_SEGMENT (l->label) == now_seg);
2168       symbol_set_frag (l->label, frag_now);
2169       val = (valueT) frag_now_fix ();
2170       /* mips16 text labels are stored as odd.  */
2171       if (mips_opts.mips16)
2172 	++val;
2173       S_SET_VALUE (l->label, val);
2174     }
2175 }
2176 
2177 static bfd_boolean
s_is_linkonce(symbolS * sym,segT from_seg)2178 s_is_linkonce (symbolS *sym, segT from_seg)
2179 {
2180   bfd_boolean linkonce = FALSE;
2181   segT symseg = S_GET_SEGMENT (sym);
2182 
2183   if (symseg != from_seg && !S_IS_LOCAL (sym))
2184     {
2185       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2186 	linkonce = TRUE;
2187 #ifdef OBJ_ELF
2188       /* The GNU toolchain uses an extension for ELF: a section
2189 	 beginning with the magic string .gnu.linkonce is a
2190 	 linkonce section.  */
2191       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2192 		   sizeof ".gnu.linkonce" - 1) == 0)
2193 	linkonce = TRUE;
2194 #endif
2195     }
2196   return linkonce;
2197 }
2198 
2199 /* Mark instruction labels in mips16 mode.  This permits the linker to
2200    handle them specially, such as generating jalx instructions when
2201    needed.  We also make them odd for the duration of the assembly, in
2202    order to generate the right sort of code.  We will make them even
2203    in the adjust_symtab routine, while leaving them marked.  This is
2204    convenient for the debugger and the disassembler.  The linker knows
2205    to make them odd again.  */
2206 
2207 static void
mips16_mark_labels(void)2208 mips16_mark_labels (void)
2209 {
2210   segment_info_type *si = seg_info (now_seg);
2211   struct insn_label_list *l;
2212 
2213   if (!mips_opts.mips16)
2214     return;
2215 
2216   for (l = si->label_list; l != NULL; l = l->next)
2217    {
2218       symbolS *label = l->label;
2219 
2220 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2221       if (IS_ELF)
2222 	S_SET_OTHER (label, STO_MIPS16);
2223 #endif
2224       if ((S_GET_VALUE (label) & 1) == 0
2225 	/* Don't adjust the address if the label is global or weak, or
2226 	   in a link-once section, since we'll be emitting symbol reloc
2227 	   references to it which will be patched up by the linker, and
2228 	   the final value of the symbol may or may not be MIPS16.  */
2229 	  && ! S_IS_WEAK (label)
2230 	  && ! S_IS_EXTERNAL (label)
2231 	  && ! s_is_linkonce (label, now_seg))
2232 	S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2233     }
2234 }
2235 
2236 /* End the current frag.  Make it a variant frag and record the
2237    relaxation info.  */
2238 
2239 static void
relax_close_frag(void)2240 relax_close_frag (void)
2241 {
2242   mips_macro_warning.first_frag = frag_now;
2243   frag_var (rs_machine_dependent, 0, 0,
2244 	    RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2245 	    mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2246 
2247   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2248   mips_relax.first_fixup = 0;
2249 }
2250 
2251 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2252    See the comment above RELAX_ENCODE for more details.  */
2253 
2254 static void
relax_start(symbolS * symbol)2255 relax_start (symbolS *symbol)
2256 {
2257   assert (mips_relax.sequence == 0);
2258   mips_relax.sequence = 1;
2259   mips_relax.symbol = symbol;
2260 }
2261 
2262 /* Start generating the second version of a relaxable sequence.
2263    See the comment above RELAX_ENCODE for more details.  */
2264 
2265 static void
relax_switch(void)2266 relax_switch (void)
2267 {
2268   assert (mips_relax.sequence == 1);
2269   mips_relax.sequence = 2;
2270 }
2271 
2272 /* End the current relaxable sequence.  */
2273 
2274 static void
relax_end(void)2275 relax_end (void)
2276 {
2277   assert (mips_relax.sequence == 2);
2278   relax_close_frag ();
2279   mips_relax.sequence = 0;
2280 }
2281 
2282 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2283    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2284    by VR4120 errata.  */
2285 
2286 static unsigned int
classify_vr4120_insn(const char * name)2287 classify_vr4120_insn (const char *name)
2288 {
2289   if (strncmp (name, "macc", 4) == 0)
2290     return FIX_VR4120_MACC;
2291   if (strncmp (name, "dmacc", 5) == 0)
2292     return FIX_VR4120_DMACC;
2293   if (strncmp (name, "mult", 4) == 0)
2294     return FIX_VR4120_MULT;
2295   if (strncmp (name, "dmult", 5) == 0)
2296     return FIX_VR4120_DMULT;
2297   if (strstr (name, "div"))
2298     return FIX_VR4120_DIV;
2299   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2300     return FIX_VR4120_MTHILO;
2301   return NUM_FIX_VR4120_CLASSES;
2302 }
2303 
2304 /* Return the number of instructions that must separate INSN1 and INSN2,
2305    where INSN1 is the earlier instruction.  Return the worst-case value
2306    for any INSN2 if INSN2 is null.  */
2307 
2308 static unsigned int
insns_between(const struct mips_cl_insn * insn1,const struct mips_cl_insn * insn2)2309 insns_between (const struct mips_cl_insn *insn1,
2310 	       const struct mips_cl_insn *insn2)
2311 {
2312   unsigned long pinfo1, pinfo2;
2313 
2314   /* This function needs to know which pinfo flags are set for INSN2
2315      and which registers INSN2 uses.  The former is stored in PINFO2 and
2316      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2317      will have every flag set and INSN2_USES_REG will always return true.  */
2318   pinfo1 = insn1->insn_mo->pinfo;
2319   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2320 
2321 #define INSN2_USES_REG(REG, CLASS) \
2322    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2323 
2324   /* For most targets, write-after-read dependencies on the HI and LO
2325      registers must be separated by at least two instructions.  */
2326   if (!hilo_interlocks)
2327     {
2328       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2329 	return 2;
2330       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2331 	return 2;
2332     }
2333 
2334   /* If we're working around r7000 errata, there must be two instructions
2335      between an mfhi or mflo and any instruction that uses the result.  */
2336   if (mips_7000_hilo_fix
2337       && MF_HILO_INSN (pinfo1)
2338       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2339     return 2;
2340 
2341   /* If working around VR4120 errata, check for combinations that need
2342      a single intervening instruction.  */
2343   if (mips_fix_vr4120)
2344     {
2345       unsigned int class1, class2;
2346 
2347       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2348       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2349 	{
2350 	  if (insn2 == NULL)
2351 	    return 1;
2352 	  class2 = classify_vr4120_insn (insn2->insn_mo->name);
2353 	  if (vr4120_conflicts[class1] & (1 << class2))
2354 	    return 1;
2355 	}
2356     }
2357 
2358   if (!mips_opts.mips16)
2359     {
2360       /* Check for GPR or coprocessor load delays.  All such delays
2361 	 are on the RT register.  */
2362       /* Itbl support may require additional care here.  */
2363       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2364 	  || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2365 	{
2366 	  know (pinfo1 & INSN_WRITE_GPR_T);
2367 	  if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2368 	    return 1;
2369 	}
2370 
2371       /* Check for generic coprocessor hazards.
2372 
2373 	 This case is not handled very well.  There is no special
2374 	 knowledge of CP0 handling, and the coprocessors other than
2375 	 the floating point unit are not distinguished at all.  */
2376       /* Itbl support may require additional care here. FIXME!
2377 	 Need to modify this to include knowledge about
2378 	 user specified delays!  */
2379       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2380 	       || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2381 	{
2382 	  /* Handle cases where INSN1 writes to a known general coprocessor
2383 	     register.  There must be a one instruction delay before INSN2
2384 	     if INSN2 reads that register, otherwise no delay is needed.  */
2385 	  if (pinfo1 & INSN_WRITE_FPR_T)
2386 	    {
2387 	      if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2388 		return 1;
2389 	    }
2390 	  else if (pinfo1 & INSN_WRITE_FPR_S)
2391 	    {
2392 	      if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2393 		return 1;
2394 	    }
2395 	  else
2396 	    {
2397 	      /* Read-after-write dependencies on the control registers
2398 		 require a two-instruction gap.  */
2399 	      if ((pinfo1 & INSN_WRITE_COND_CODE)
2400 		  && (pinfo2 & INSN_READ_COND_CODE))
2401 		return 2;
2402 
2403 	      /* We don't know exactly what INSN1 does.  If INSN2 is
2404 		 also a coprocessor instruction, assume there must be
2405 		 a one instruction gap.  */
2406 	      if (pinfo2 & INSN_COP)
2407 		return 1;
2408 	    }
2409 	}
2410 
2411       /* Check for read-after-write dependencies on the coprocessor
2412 	 control registers in cases where INSN1 does not need a general
2413 	 coprocessor delay.  This means that INSN1 is a floating point
2414 	 comparison instruction.  */
2415       /* Itbl support may require additional care here.  */
2416       else if (!cop_interlocks
2417 	       && (pinfo1 & INSN_WRITE_COND_CODE)
2418 	       && (pinfo2 & INSN_READ_COND_CODE))
2419 	return 1;
2420     }
2421 
2422 #undef INSN2_USES_REG
2423 
2424   return 0;
2425 }
2426 
2427 /* Return the number of nops that would be needed to work around the
2428    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2429    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2430 
2431 static int
nops_for_vr4130(const struct mips_cl_insn * history,const struct mips_cl_insn * insn)2432 nops_for_vr4130 (const struct mips_cl_insn *history,
2433 		 const struct mips_cl_insn *insn)
2434 {
2435   int i, j, reg;
2436 
2437   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2438      are not affected by the errata.  */
2439   if (insn != 0
2440       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2441 	  || strcmp (insn->insn_mo->name, "mtlo") == 0
2442 	  || strcmp (insn->insn_mo->name, "mthi") == 0))
2443     return 0;
2444 
2445   /* Search for the first MFLO or MFHI.  */
2446   for (i = 0; i < MAX_VR4130_NOPS; i++)
2447     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2448       {
2449 	/* Extract the destination register.  */
2450 	if (mips_opts.mips16)
2451 	  reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2452 	else
2453 	  reg = EXTRACT_OPERAND (RD, history[i]);
2454 
2455 	/* No nops are needed if INSN reads that register.  */
2456 	if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2457 	  return 0;
2458 
2459 	/* ...or if any of the intervening instructions do.  */
2460 	for (j = 0; j < i; j++)
2461 	  if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2462 	    return 0;
2463 
2464 	return MAX_VR4130_NOPS - i;
2465       }
2466   return 0;
2467 }
2468 
2469 /* Return the number of nops that would be needed if instruction INSN
2470    immediately followed the MAX_NOPS instructions given by HISTORY,
2471    where HISTORY[0] is the most recent instruction.  If INSN is null,
2472    return the worse-case number of nops for any instruction.  */
2473 
2474 static int
nops_for_insn(const struct mips_cl_insn * history,const struct mips_cl_insn * insn)2475 nops_for_insn (const struct mips_cl_insn *history,
2476 	       const struct mips_cl_insn *insn)
2477 {
2478   int i, nops, tmp_nops;
2479 
2480   nops = 0;
2481   for (i = 0; i < MAX_DELAY_NOPS; i++)
2482     if (!history[i].noreorder_p)
2483       {
2484 	tmp_nops = insns_between (history + i, insn) - i;
2485 	if (tmp_nops > nops)
2486 	  nops = tmp_nops;
2487       }
2488 
2489   if (mips_fix_vr4130)
2490     {
2491       tmp_nops = nops_for_vr4130 (history, insn);
2492       if (tmp_nops > nops)
2493 	nops = tmp_nops;
2494     }
2495 
2496   return nops;
2497 }
2498 
2499 /* The variable arguments provide NUM_INSNS extra instructions that
2500    might be added to HISTORY.  Return the largest number of nops that
2501    would be needed after the extended sequence.  */
2502 
2503 static int
nops_for_sequence(int num_insns,const struct mips_cl_insn * history,...)2504 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2505 {
2506   va_list args;
2507   struct mips_cl_insn buffer[MAX_NOPS];
2508   struct mips_cl_insn *cursor;
2509   int nops;
2510 
2511   va_start (args, history);
2512   cursor = buffer + num_insns;
2513   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2514   while (cursor > buffer)
2515     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2516 
2517   nops = nops_for_insn (buffer, NULL);
2518   va_end (args);
2519   return nops;
2520 }
2521 
2522 /* Like nops_for_insn, but if INSN is a branch, take into account the
2523    worst-case delay for the branch target.  */
2524 
2525 static int
nops_for_insn_or_target(const struct mips_cl_insn * history,const struct mips_cl_insn * insn)2526 nops_for_insn_or_target (const struct mips_cl_insn *history,
2527 			 const struct mips_cl_insn *insn)
2528 {
2529   int nops, tmp_nops;
2530 
2531   nops = nops_for_insn (history, insn);
2532   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2533 			      | INSN_COND_BRANCH_DELAY
2534 			      | INSN_COND_BRANCH_LIKELY))
2535     {
2536       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2537       if (tmp_nops > nops)
2538 	nops = tmp_nops;
2539     }
2540   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2541     {
2542       tmp_nops = nops_for_sequence (1, history, insn);
2543       if (tmp_nops > nops)
2544 	nops = tmp_nops;
2545     }
2546   return nops;
2547 }
2548 
2549 /* Output an instruction.  IP is the instruction information.
2550    ADDRESS_EXPR is an operand of the instruction to be used with
2551    RELOC_TYPE.  */
2552 
2553 static void
append_insn(struct mips_cl_insn * ip,expressionS * address_expr,bfd_reloc_code_real_type * reloc_type)2554 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2555 	     bfd_reloc_code_real_type *reloc_type)
2556 {
2557   unsigned long prev_pinfo, pinfo;
2558   relax_stateT prev_insn_frag_type = 0;
2559   bfd_boolean relaxed_branch = FALSE;
2560   segment_info_type *si = seg_info (now_seg);
2561 
2562   /* Mark instruction labels in mips16 mode.  */
2563   mips16_mark_labels ();
2564 
2565   prev_pinfo = history[0].insn_mo->pinfo;
2566   pinfo = ip->insn_mo->pinfo;
2567 
2568   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2569     {
2570       /* There are a lot of optimizations we could do that we don't.
2571 	 In particular, we do not, in general, reorder instructions.
2572 	 If you use gcc with optimization, it will reorder
2573 	 instructions and generally do much more optimization then we
2574 	 do here; repeating all that work in the assembler would only
2575 	 benefit hand written assembly code, and does not seem worth
2576 	 it.  */
2577       int nops = (mips_optimize == 0
2578 		  ? nops_for_insn (history, NULL)
2579 		  : nops_for_insn_or_target (history, ip));
2580       if (nops > 0)
2581 	{
2582 	  fragS *old_frag;
2583 	  unsigned long old_frag_offset;
2584 	  int i;
2585 
2586 	  old_frag = frag_now;
2587 	  old_frag_offset = frag_now_fix ();
2588 
2589 	  for (i = 0; i < nops; i++)
2590 	    emit_nop ();
2591 
2592 	  if (listing)
2593 	    {
2594 	      listing_prev_line ();
2595 	      /* We may be at the start of a variant frag.  In case we
2596                  are, make sure there is enough space for the frag
2597                  after the frags created by listing_prev_line.  The
2598                  argument to frag_grow here must be at least as large
2599                  as the argument to all other calls to frag_grow in
2600                  this file.  We don't have to worry about being in the
2601                  middle of a variant frag, because the variants insert
2602                  all needed nop instructions themselves.  */
2603 	      frag_grow (40);
2604 	    }
2605 
2606 	  mips_move_labels ();
2607 
2608 #ifndef NO_ECOFF_DEBUGGING
2609 	  if (ECOFF_DEBUGGING)
2610 	    ecoff_fix_loc (old_frag, old_frag_offset);
2611 #endif
2612 	}
2613     }
2614   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2615     {
2616       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2617       int nops = nops_for_insn_or_target (history, ip);
2618       assert (nops <= prev_nop_frag_holds);
2619 
2620       /* Enforce NOPS as a minimum.  */
2621       if (nops > prev_nop_frag_required)
2622 	prev_nop_frag_required = nops;
2623 
2624       if (prev_nop_frag_holds == prev_nop_frag_required)
2625 	{
2626 	  /* Settle for the current number of nops.  Update the history
2627 	     accordingly (for the benefit of any future .set reorder code).  */
2628 	  prev_nop_frag = NULL;
2629 	  insert_into_history (prev_nop_frag_since,
2630 			       prev_nop_frag_holds, NOP_INSN);
2631 	}
2632       else
2633 	{
2634 	  /* Allow this instruction to replace one of the nops that was
2635 	     tentatively added to prev_nop_frag.  */
2636 	  prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2637 	  prev_nop_frag_holds--;
2638 	  prev_nop_frag_since++;
2639 	}
2640     }
2641 
2642 #ifdef OBJ_ELF
2643   /* The value passed to dwarf2_emit_insn is the distance between
2644      the beginning of the current instruction and the address that
2645      should be recorded in the debug tables.  For MIPS16 debug info
2646      we want to use ISA-encoded addresses, so we pass -1 for an
2647      address higher by one than the current.  */
2648   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2649 #endif
2650 
2651   /* Record the frag type before frag_var.  */
2652   if (history[0].frag)
2653     prev_insn_frag_type = history[0].frag->fr_type;
2654 
2655   if (address_expr
2656       && *reloc_type == BFD_RELOC_16_PCREL_S2
2657       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2658 	  || pinfo & INSN_COND_BRANCH_LIKELY)
2659       && mips_relax_branch
2660       /* Don't try branch relaxation within .set nomacro, or within
2661 	 .set noat if we use $at for PIC computations.  If it turns
2662 	 out that the branch was out-of-range, we'll get an error.  */
2663       && !mips_opts.warn_about_macros
2664       && !(mips_opts.noat && mips_pic != NO_PIC)
2665       && !mips_opts.mips16)
2666     {
2667       relaxed_branch = TRUE;
2668       add_relaxed_insn (ip, (relaxed_branch_length
2669 			     (NULL, NULL,
2670 			      (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2671 			      : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2672 			      : 0)), 4,
2673 			RELAX_BRANCH_ENCODE
2674 			(pinfo & INSN_UNCOND_BRANCH_DELAY,
2675 			 pinfo & INSN_COND_BRANCH_LIKELY,
2676 			 pinfo & INSN_WRITE_GPR_31,
2677 			 0),
2678 			address_expr->X_add_symbol,
2679 			address_expr->X_add_number);
2680       *reloc_type = BFD_RELOC_UNUSED;
2681     }
2682   else if (*reloc_type > BFD_RELOC_UNUSED)
2683     {
2684       /* We need to set up a variant frag.  */
2685       assert (mips_opts.mips16 && address_expr != NULL);
2686       add_relaxed_insn (ip, 4, 0,
2687 			RELAX_MIPS16_ENCODE
2688 			(*reloc_type - BFD_RELOC_UNUSED,
2689 			 mips16_small, mips16_ext,
2690 			 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2691 			 history[0].mips16_absolute_jump_p),
2692 			make_expr_symbol (address_expr), 0);
2693     }
2694   else if (mips_opts.mips16
2695 	   && ! ip->use_extend
2696 	   && *reloc_type != BFD_RELOC_MIPS16_JMP)
2697     {
2698       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2699 	/* Make sure there is enough room to swap this instruction with
2700 	   a following jump instruction.  */
2701 	frag_grow (6);
2702       add_fixed_insn (ip);
2703     }
2704   else
2705     {
2706       if (mips_opts.mips16
2707 	  && mips_opts.noreorder
2708 	  && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2709 	as_warn (_("extended instruction in delay slot"));
2710 
2711       if (mips_relax.sequence)
2712 	{
2713 	  /* If we've reached the end of this frag, turn it into a variant
2714 	     frag and record the information for the instructions we've
2715 	     written so far.  */
2716 	  if (frag_room () < 4)
2717 	    relax_close_frag ();
2718 	  mips_relax.sizes[mips_relax.sequence - 1] += 4;
2719 	}
2720 
2721       if (mips_relax.sequence != 2)
2722 	mips_macro_warning.sizes[0] += 4;
2723       if (mips_relax.sequence != 1)
2724 	mips_macro_warning.sizes[1] += 4;
2725 
2726       if (mips_opts.mips16)
2727 	{
2728 	  ip->fixed_p = 1;
2729 	  ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2730 	}
2731       add_fixed_insn (ip);
2732     }
2733 
2734   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2735     {
2736       if (address_expr->X_op == O_constant)
2737 	{
2738 	  unsigned int tmp;
2739 
2740 	  switch (*reloc_type)
2741 	    {
2742 	    case BFD_RELOC_32:
2743 	      ip->insn_opcode |= address_expr->X_add_number;
2744 	      break;
2745 
2746 	    case BFD_RELOC_MIPS_HIGHEST:
2747 	      tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2748 	      ip->insn_opcode |= tmp & 0xffff;
2749 	      break;
2750 
2751 	    case BFD_RELOC_MIPS_HIGHER:
2752 	      tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2753 	      ip->insn_opcode |= tmp & 0xffff;
2754 	      break;
2755 
2756 	    case BFD_RELOC_HI16_S:
2757 	      tmp = (address_expr->X_add_number + 0x8000) >> 16;
2758 	      ip->insn_opcode |= tmp & 0xffff;
2759 	      break;
2760 
2761 	    case BFD_RELOC_HI16:
2762 	      ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2763 	      break;
2764 
2765 	    case BFD_RELOC_UNUSED:
2766 	    case BFD_RELOC_LO16:
2767 	    case BFD_RELOC_MIPS_GOT_DISP:
2768 	      ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2769 	      break;
2770 
2771 	    case BFD_RELOC_MIPS_JMP:
2772 	      if ((address_expr->X_add_number & 3) != 0)
2773 		as_bad (_("jump to misaligned address (0x%lx)"),
2774 			(unsigned long) address_expr->X_add_number);
2775 	      ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2776 	      break;
2777 
2778 	    case BFD_RELOC_MIPS16_JMP:
2779 	      if ((address_expr->X_add_number & 3) != 0)
2780 		as_bad (_("jump to misaligned address (0x%lx)"),
2781 			(unsigned long) address_expr->X_add_number);
2782 	      ip->insn_opcode |=
2783 		(((address_expr->X_add_number & 0x7c0000) << 3)
2784 		 | ((address_expr->X_add_number & 0xf800000) >> 7)
2785 		 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2786 	      break;
2787 
2788 	    case BFD_RELOC_16_PCREL_S2:
2789 	      if ((address_expr->X_add_number & 3) != 0)
2790 		as_bad (_("branch to misaligned address (0x%lx)"),
2791 			(unsigned long) address_expr->X_add_number);
2792 	      if (mips_relax_branch)
2793 		goto need_reloc;
2794 	      if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2795 		as_bad (_("branch address range overflow (0x%lx)"),
2796 			(unsigned long) address_expr->X_add_number);
2797 	      ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2798 	      break;
2799 
2800 	    default:
2801 	      internalError ();
2802 	    }
2803 	}
2804       else if (*reloc_type < BFD_RELOC_UNUSED)
2805 	need_reloc:
2806 	{
2807 	  reloc_howto_type *howto;
2808 	  int i;
2809 
2810 	  /* In a compound relocation, it is the final (outermost)
2811 	     operator that determines the relocated field.  */
2812 	  for (i = 1; i < 3; i++)
2813 	    if (reloc_type[i] == BFD_RELOC_UNUSED)
2814 	      break;
2815 
2816 	  howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2817 	  ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2818 				     bfd_get_reloc_size (howto),
2819 				     address_expr,
2820 				     reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2821 				     reloc_type[0]);
2822 
2823 	  /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2824 	  if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2825 	      && ip->fixp[0]->fx_addsy)
2826 	    *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2827 
2828 	  /* These relocations can have an addend that won't fit in
2829 	     4 octets for 64bit assembly.  */
2830 	  if (HAVE_64BIT_GPRS
2831 	      && ! howto->partial_inplace
2832 	      && (reloc_type[0] == BFD_RELOC_16
2833 		  || reloc_type[0] == BFD_RELOC_32
2834 		  || reloc_type[0] == BFD_RELOC_MIPS_JMP
2835 		  || reloc_type[0] == BFD_RELOC_HI16_S
2836 		  || reloc_type[0] == BFD_RELOC_LO16
2837 		  || reloc_type[0] == BFD_RELOC_GPREL16
2838 		  || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2839 		  || reloc_type[0] == BFD_RELOC_GPREL32
2840 		  || reloc_type[0] == BFD_RELOC_64
2841 		  || reloc_type[0] == BFD_RELOC_CTOR
2842 		  || reloc_type[0] == BFD_RELOC_MIPS_SUB
2843 		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2844 		  || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2845 		  || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2846 		  || reloc_type[0] == BFD_RELOC_MIPS_REL16
2847 		  || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2848 		  || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2849 		  || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2850 		  || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2851 	    ip->fixp[0]->fx_no_overflow = 1;
2852 
2853 	  if (mips_relax.sequence)
2854 	    {
2855 	      if (mips_relax.first_fixup == 0)
2856 		mips_relax.first_fixup = ip->fixp[0];
2857 	    }
2858 	  else if (reloc_needs_lo_p (*reloc_type))
2859 	    {
2860 	      struct mips_hi_fixup *hi_fixup;
2861 
2862 	      /* Reuse the last entry if it already has a matching %lo.  */
2863 	      hi_fixup = mips_hi_fixup_list;
2864 	      if (hi_fixup == 0
2865 		  || !fixup_has_matching_lo_p (hi_fixup->fixp))
2866 		{
2867 		  hi_fixup = ((struct mips_hi_fixup *)
2868 			      xmalloc (sizeof (struct mips_hi_fixup)));
2869 		  hi_fixup->next = mips_hi_fixup_list;
2870 		  mips_hi_fixup_list = hi_fixup;
2871 		}
2872 	      hi_fixup->fixp = ip->fixp[0];
2873 	      hi_fixup->seg = now_seg;
2874 	    }
2875 
2876 	  /* Add fixups for the second and third relocations, if given.
2877 	     Note that the ABI allows the second relocation to be
2878 	     against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2879 	     moment we only use RSS_UNDEF, but we could add support
2880 	     for the others if it ever becomes necessary.  */
2881 	  for (i = 1; i < 3; i++)
2882 	    if (reloc_type[i] != BFD_RELOC_UNUSED)
2883 	      {
2884 		ip->fixp[i] = fix_new (ip->frag, ip->where,
2885 				       ip->fixp[0]->fx_size, NULL, 0,
2886 				       FALSE, reloc_type[i]);
2887 
2888 		/* Use fx_tcbit to mark compound relocs.  */
2889 		ip->fixp[0]->fx_tcbit = 1;
2890 		ip->fixp[i]->fx_tcbit = 1;
2891 	      }
2892 	}
2893     }
2894   install_insn (ip);
2895 
2896   /* Update the register mask information.  */
2897   if (! mips_opts.mips16)
2898     {
2899       if (pinfo & INSN_WRITE_GPR_D)
2900 	mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2901       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2902 	mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2903       if (pinfo & INSN_READ_GPR_S)
2904 	mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2905       if (pinfo & INSN_WRITE_GPR_31)
2906 	mips_gprmask |= 1 << RA;
2907       if (pinfo & INSN_WRITE_FPR_D)
2908 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2909       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2910 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2911       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2912 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2913       if ((pinfo & INSN_READ_FPR_R) != 0)
2914 	mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2915       if (pinfo & INSN_COP)
2916 	{
2917 	  /* We don't keep enough information to sort these cases out.
2918 	     The itbl support does keep this information however, although
2919 	     we currently don't support itbl fprmats as part of the cop
2920 	     instruction.  May want to add this support in the future.  */
2921 	}
2922       /* Never set the bit for $0, which is always zero.  */
2923       mips_gprmask &= ~(1 << 0);
2924     }
2925   else
2926     {
2927       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2928 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2929       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2930 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2931       if (pinfo & MIPS16_INSN_WRITE_Z)
2932 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2933       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2934 	mips_gprmask |= 1 << TREG;
2935       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2936 	mips_gprmask |= 1 << SP;
2937       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2938 	mips_gprmask |= 1 << RA;
2939       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2940 	mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2941       if (pinfo & MIPS16_INSN_READ_Z)
2942 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2943       if (pinfo & MIPS16_INSN_READ_GPR_X)
2944 	mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2945     }
2946 
2947   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2948     {
2949       /* Filling the branch delay slot is more complex.  We try to
2950 	 switch the branch with the previous instruction, which we can
2951 	 do if the previous instruction does not set up a condition
2952 	 that the branch tests and if the branch is not itself the
2953 	 target of any branch.  */
2954       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2955 	  || (pinfo & INSN_COND_BRANCH_DELAY))
2956 	{
2957 	  if (mips_optimize < 2
2958 	      /* If we have seen .set volatile or .set nomove, don't
2959 		 optimize.  */
2960 	      || mips_opts.nomove != 0
2961 	      /* We can't swap if the previous instruction's position
2962 		 is fixed.  */
2963 	      || history[0].fixed_p
2964 	      /* If the previous previous insn was in a .set
2965 		 noreorder, we can't swap.  Actually, the MIPS
2966 		 assembler will swap in this situation.  However, gcc
2967 		 configured -with-gnu-as will generate code like
2968 		   .set noreorder
2969 		   lw	$4,XXX
2970 		   .set	reorder
2971 		   INSN
2972 		   bne	$4,$0,foo
2973 		 in which we can not swap the bne and INSN.  If gcc is
2974 		 not configured -with-gnu-as, it does not output the
2975 		 .set pseudo-ops.  */
2976 	      || history[1].noreorder_p
2977 	      /* If the branch is itself the target of a branch, we
2978 		 can not swap.  We cheat on this; all we check for is
2979 		 whether there is a label on this instruction.  If
2980 		 there are any branches to anything other than a
2981 		 label, users must use .set noreorder.  */
2982 	      || si->label_list != NULL
2983 	      /* If the previous instruction is in a variant frag
2984 		 other than this branch's one, we cannot do the swap.
2985 		 This does not apply to the mips16, which uses variant
2986 		 frags for different purposes.  */
2987 	      || (! mips_opts.mips16
2988 		  && prev_insn_frag_type == rs_machine_dependent)
2989 	      /* Check for conflicts between the branch and the instructions
2990 		 before the candidate delay slot.  */
2991 	      || nops_for_insn (history + 1, ip) > 0
2992 	      /* Check for conflicts between the swapped sequence and the
2993 		 target of the branch.  */
2994 	      || nops_for_sequence (2, history + 1, ip, history) > 0
2995 	      /* We do not swap with a trap instruction, since it
2996 		 complicates trap handlers to have the trap
2997 		 instruction be in a delay slot.  */
2998 	      || (prev_pinfo & INSN_TRAP)
2999 	      /* If the branch reads a register that the previous
3000 		 instruction sets, we can not swap.  */
3001 	      || (! mips_opts.mips16
3002 		  && (prev_pinfo & INSN_WRITE_GPR_T)
3003 		  && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3004 				    MIPS_GR_REG))
3005 	      || (! mips_opts.mips16
3006 		  && (prev_pinfo & INSN_WRITE_GPR_D)
3007 		  && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3008 				    MIPS_GR_REG))
3009 	      || (mips_opts.mips16
3010 		  && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3011 		       && (insn_uses_reg
3012 			   (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3013 			    MIPS16_REG)))
3014 		      || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3015 			  && (insn_uses_reg
3016 			      (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3017 			       MIPS16_REG)))
3018 		      || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3019 			  && (insn_uses_reg
3020 			      (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3021 			       MIPS16_REG)))
3022 		      || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3023 			  && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3024 		      || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3025 			  && insn_uses_reg (ip, RA, MIPS_GR_REG))
3026 		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3027 			  && insn_uses_reg (ip,
3028 					    MIPS16OP_EXTRACT_REG32R
3029 					      (history[0].insn_opcode),
3030 					    MIPS_GR_REG))))
3031 	      /* If the branch writes a register that the previous
3032 		 instruction sets, we can not swap (we know that
3033 		 branches write only to RD or to $31).  */
3034 	      || (! mips_opts.mips16
3035 		  && (prev_pinfo & INSN_WRITE_GPR_T)
3036 		  && (((pinfo & INSN_WRITE_GPR_D)
3037 		       && (EXTRACT_OPERAND (RT, history[0])
3038 			   == EXTRACT_OPERAND (RD, *ip)))
3039 		      || ((pinfo & INSN_WRITE_GPR_31)
3040 			  && EXTRACT_OPERAND (RT, history[0]) == RA)))
3041 	      || (! mips_opts.mips16
3042 		  && (prev_pinfo & INSN_WRITE_GPR_D)
3043 		  && (((pinfo & INSN_WRITE_GPR_D)
3044 		       && (EXTRACT_OPERAND (RD, history[0])
3045 			   == EXTRACT_OPERAND (RD, *ip)))
3046 		      || ((pinfo & INSN_WRITE_GPR_31)
3047 			  && EXTRACT_OPERAND (RD, history[0]) == RA)))
3048 	      || (mips_opts.mips16
3049 		  && (pinfo & MIPS16_INSN_WRITE_31)
3050 		  && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3051 		      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3052 			  && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3053 			      == RA))))
3054 	      /* If the branch writes a register that the previous
3055 		 instruction reads, we can not swap (we know that
3056 		 branches only write to RD or to $31).  */
3057 	      || (! mips_opts.mips16
3058 		  && (pinfo & INSN_WRITE_GPR_D)
3059 		  && insn_uses_reg (&history[0],
3060 				    EXTRACT_OPERAND (RD, *ip),
3061 				    MIPS_GR_REG))
3062 	      || (! mips_opts.mips16
3063 		  && (pinfo & INSN_WRITE_GPR_31)
3064 		  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3065 	      || (mips_opts.mips16
3066 		  && (pinfo & MIPS16_INSN_WRITE_31)
3067 		  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3068 	      /* If one instruction sets a condition code and the
3069                  other one uses a condition code, we can not swap.  */
3070 	      || ((pinfo & INSN_READ_COND_CODE)
3071 		  && (prev_pinfo & INSN_WRITE_COND_CODE))
3072 	      || ((pinfo & INSN_WRITE_COND_CODE)
3073 		  && (prev_pinfo & INSN_READ_COND_CODE))
3074 	      /* If the previous instruction uses the PC, we can not
3075                  swap.  */
3076 	      || (mips_opts.mips16
3077 		  && (prev_pinfo & MIPS16_INSN_READ_PC))
3078 	      /* If the previous instruction had a fixup in mips16
3079                  mode, we can not swap.  This normally means that the
3080                  previous instruction was a 4 byte branch anyhow.  */
3081 	      || (mips_opts.mips16 && history[0].fixp[0])
3082 	      /* If the previous instruction is a sync, sync.l, or
3083 		 sync.p, we can not swap.  */
3084 	      || (prev_pinfo & INSN_SYNC))
3085 	    {
3086 	      if (mips_opts.mips16
3087 		  && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3088 		  && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3089 		  && ISA_SUPPORTS_MIPS16E)
3090 		{
3091 		  /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3092 		  ip->insn_opcode |= 0x0080;
3093 		  install_insn (ip);
3094 		  insert_into_history (0, 1, ip);
3095 		}
3096 	      else
3097 		{
3098 		  /* We could do even better for unconditional branches to
3099 		     portions of this object file; we could pick up the
3100 		     instruction at the destination, put it in the delay
3101 		     slot, and bump the destination address.  */
3102 		  insert_into_history (0, 1, ip);
3103 		  emit_nop ();
3104 		}
3105 
3106 	      if (mips_relax.sequence)
3107 		mips_relax.sizes[mips_relax.sequence - 1] += 4;
3108 	    }
3109 	  else
3110 	    {
3111 	      /* It looks like we can actually do the swap.  */
3112 	      struct mips_cl_insn delay = history[0];
3113 	      if (mips_opts.mips16)
3114 		{
3115 		  know (delay.frag == ip->frag);
3116                   move_insn (ip, delay.frag, delay.where);
3117 		  move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3118 		}
3119 	      else if (relaxed_branch)
3120 		{
3121 		  /* Add the delay slot instruction to the end of the
3122 		     current frag and shrink the fixed part of the
3123 		     original frag.  If the branch occupies the tail of
3124 		     the latter, move it backwards to cover the gap.  */
3125 		  delay.frag->fr_fix -= 4;
3126 		  if (delay.frag == ip->frag)
3127 		    move_insn (ip, ip->frag, ip->where - 4);
3128 		  add_fixed_insn (&delay);
3129 		}
3130 	      else
3131 		{
3132 		  move_insn (&delay, ip->frag, ip->where);
3133 		  move_insn (ip, history[0].frag, history[0].where);
3134 		}
3135 	      history[0] = *ip;
3136 	      delay.fixed_p = 1;
3137 	      insert_into_history (0, 1, &delay);
3138 	    }
3139 
3140 	  /* If that was an unconditional branch, forget the previous
3141 	     insn information.  */
3142 	  if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3143 	    mips_no_prev_insn ();
3144 	}
3145       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3146 	{
3147 	  /* We don't yet optimize a branch likely.  What we should do
3148 	     is look at the target, copy the instruction found there
3149 	     into the delay slot, and increment the branch to jump to
3150 	     the next instruction.  */
3151 	  insert_into_history (0, 1, ip);
3152 	  emit_nop ();
3153 	}
3154       else
3155 	insert_into_history (0, 1, ip);
3156     }
3157   else
3158     insert_into_history (0, 1, ip);
3159 
3160   /* We just output an insn, so the next one doesn't have a label.  */
3161   mips_clear_insn_labels ();
3162 }
3163 
3164 /* Forget that there was any previous instruction or label.  */
3165 
3166 static void
mips_no_prev_insn(void)3167 mips_no_prev_insn (void)
3168 {
3169   prev_nop_frag = NULL;
3170   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3171   mips_clear_insn_labels ();
3172 }
3173 
3174 /* This function must be called before we emit something other than
3175    instructions.  It is like mips_no_prev_insn except that it inserts
3176    any NOPS that might be needed by previous instructions.  */
3177 
3178 void
mips_emit_delays(void)3179 mips_emit_delays (void)
3180 {
3181   if (! mips_opts.noreorder)
3182     {
3183       int nops = nops_for_insn (history, NULL);
3184       if (nops > 0)
3185 	{
3186 	  while (nops-- > 0)
3187 	    add_fixed_insn (NOP_INSN);
3188 	  mips_move_labels ();
3189 	}
3190     }
3191   mips_no_prev_insn ();
3192 }
3193 
3194 /* Start a (possibly nested) noreorder block.  */
3195 
3196 static void
start_noreorder(void)3197 start_noreorder (void)
3198 {
3199   if (mips_opts.noreorder == 0)
3200     {
3201       unsigned int i;
3202       int nops;
3203 
3204       /* None of the instructions before the .set noreorder can be moved.  */
3205       for (i = 0; i < ARRAY_SIZE (history); i++)
3206 	history[i].fixed_p = 1;
3207 
3208       /* Insert any nops that might be needed between the .set noreorder
3209 	 block and the previous instructions.  We will later remove any
3210 	 nops that turn out not to be needed.  */
3211       nops = nops_for_insn (history, NULL);
3212       if (nops > 0)
3213 	{
3214 	  if (mips_optimize != 0)
3215 	    {
3216 	      /* Record the frag which holds the nop instructions, so
3217                  that we can remove them if we don't need them.  */
3218 	      frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3219 	      prev_nop_frag = frag_now;
3220 	      prev_nop_frag_holds = nops;
3221 	      prev_nop_frag_required = 0;
3222 	      prev_nop_frag_since = 0;
3223 	    }
3224 
3225 	  for (; nops > 0; --nops)
3226 	    add_fixed_insn (NOP_INSN);
3227 
3228 	  /* Move on to a new frag, so that it is safe to simply
3229 	     decrease the size of prev_nop_frag.  */
3230 	  frag_wane (frag_now);
3231 	  frag_new (0);
3232 	  mips_move_labels ();
3233 	}
3234       mips16_mark_labels ();
3235       mips_clear_insn_labels ();
3236     }
3237   mips_opts.noreorder++;
3238   mips_any_noreorder = 1;
3239 }
3240 
3241 /* End a nested noreorder block.  */
3242 
3243 static void
end_noreorder(void)3244 end_noreorder (void)
3245 {
3246   mips_opts.noreorder--;
3247   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3248     {
3249       /* Commit to inserting prev_nop_frag_required nops and go back to
3250 	 handling nop insertion the .set reorder way.  */
3251       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3252 				* (mips_opts.mips16 ? 2 : 4));
3253       insert_into_history (prev_nop_frag_since,
3254 			   prev_nop_frag_required, NOP_INSN);
3255       prev_nop_frag = NULL;
3256     }
3257 }
3258 
3259 /* Set up global variables for the start of a new macro.  */
3260 
3261 static void
macro_start(void)3262 macro_start (void)
3263 {
3264   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3265   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3266 				     && (history[0].insn_mo->pinfo
3267 					 & (INSN_UNCOND_BRANCH_DELAY
3268 					    | INSN_COND_BRANCH_DELAY
3269 					    | INSN_COND_BRANCH_LIKELY)) != 0);
3270 }
3271 
3272 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3273    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3274    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3275 
3276 static const char *
macro_warning(relax_substateT subtype)3277 macro_warning (relax_substateT subtype)
3278 {
3279   if (subtype & RELAX_DELAY_SLOT)
3280     return _("Macro instruction expanded into multiple instructions"
3281 	     " in a branch delay slot");
3282   else if (subtype & RELAX_NOMACRO)
3283     return _("Macro instruction expanded into multiple instructions");
3284   else
3285     return 0;
3286 }
3287 
3288 /* Finish up a macro.  Emit warnings as appropriate.  */
3289 
3290 static void
macro_end(void)3291 macro_end (void)
3292 {
3293   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3294     {
3295       relax_substateT subtype;
3296 
3297       /* Set up the relaxation warning flags.  */
3298       subtype = 0;
3299       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3300 	subtype |= RELAX_SECOND_LONGER;
3301       if (mips_opts.warn_about_macros)
3302 	subtype |= RELAX_NOMACRO;
3303       if (mips_macro_warning.delay_slot_p)
3304 	subtype |= RELAX_DELAY_SLOT;
3305 
3306       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3307 	{
3308 	  /* Either the macro has a single implementation or both
3309 	     implementations are longer than 4 bytes.  Emit the
3310 	     warning now.  */
3311 	  const char *msg = macro_warning (subtype);
3312 	  if (msg != 0)
3313 	    as_warn ("%s", msg);
3314 	}
3315       else
3316 	{
3317 	  /* One implementation might need a warning but the other
3318 	     definitely doesn't.  */
3319 	  mips_macro_warning.first_frag->fr_subtype |= subtype;
3320 	}
3321     }
3322 }
3323 
3324 /* Read a macro's relocation codes from *ARGS and store them in *R.
3325    The first argument in *ARGS will be either the code for a single
3326    relocation or -1 followed by the three codes that make up a
3327    composite relocation.  */
3328 
3329 static void
macro_read_relocs(va_list * args,bfd_reloc_code_real_type * r)3330 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3331 {
3332   int i, next;
3333 
3334   next = va_arg (*args, int);
3335   if (next >= 0)
3336     r[0] = (bfd_reloc_code_real_type) next;
3337   else
3338     for (i = 0; i < 3; i++)
3339       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3340 }
3341 
3342 /* Build an instruction created by a macro expansion.  This is passed
3343    a pointer to the count of instructions created so far, an
3344    expression, the name of the instruction to build, an operand format
3345    string, and corresponding arguments.  */
3346 
3347 static void
macro_build(expressionS * ep,const char * name,const char * fmt,...)3348 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3349 {
3350   const struct mips_opcode *mo;
3351   struct mips_cl_insn insn;
3352   bfd_reloc_code_real_type r[3];
3353   va_list args;
3354 
3355   va_start (args, fmt);
3356 
3357   if (mips_opts.mips16)
3358     {
3359       mips16_macro_build (ep, name, fmt, args);
3360       va_end (args);
3361       return;
3362     }
3363 
3364   r[0] = BFD_RELOC_UNUSED;
3365   r[1] = BFD_RELOC_UNUSED;
3366   r[2] = BFD_RELOC_UNUSED;
3367   mo = (struct mips_opcode *) hash_find (op_hash, name);
3368   assert (mo);
3369   assert (strcmp (name, mo->name) == 0);
3370 
3371   while (1)
3372     {
3373       /* Search until we get a match for NAME.  It is assumed here that
3374 	 macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3375       if (strcmp (fmt, mo->args) == 0
3376 	  && mo->pinfo != INSN_MACRO
3377 	  && OPCODE_IS_MEMBER (mo,
3378 			       (mips_opts.isa
3379 				| (mips_opts.mips16 ? INSN_MIPS16 : 0)
3380 				| (mips_opts.ase_dsp ? INSN_DSP : 0)
3381 				| ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3382 				   ? INSN_DSP64 : 0)
3383 				| (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3384 				| (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3385 			       mips_opts.arch)
3386 	  && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3387 	break;
3388 
3389       ++mo;
3390       assert (mo->name);
3391       assert (strcmp (name, mo->name) == 0);
3392     }
3393 
3394   create_insn (&insn, mo);
3395   for (;;)
3396     {
3397       switch (*fmt++)
3398 	{
3399 	case '\0':
3400 	  break;
3401 
3402 	case ',':
3403 	case '(':
3404 	case ')':
3405 	  continue;
3406 
3407 	case '+':
3408 	  switch (*fmt++)
3409 	    {
3410 	    case 'A':
3411 	    case 'E':
3412 	      INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3413 	      continue;
3414 
3415 	    case 'B':
3416 	    case 'F':
3417 	      /* Note that in the macro case, these arguments are already
3418 		 in MSB form.  (When handling the instruction in the
3419 		 non-macro case, these arguments are sizes from which
3420 		 MSB values must be calculated.)  */
3421 	      INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3422 	      continue;
3423 
3424 	    case 'C':
3425 	    case 'G':
3426 	    case 'H':
3427 	      /* Note that in the macro case, these arguments are already
3428 		 in MSBD form.  (When handling the instruction in the
3429 		 non-macro case, these arguments are sizes from which
3430 		 MSBD values must be calculated.)  */
3431 	      INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3432 	      continue;
3433 
3434 	    default:
3435 	      internalError ();
3436 	    }
3437 	  continue;
3438 
3439 	case '2':
3440 	  INSERT_OPERAND (BP, insn, va_arg (args, int));
3441 	  continue;
3442 
3443 	case 't':
3444 	case 'w':
3445 	case 'E':
3446 	  INSERT_OPERAND (RT, insn, va_arg (args, int));
3447 	  continue;
3448 
3449 	case 'c':
3450 	  INSERT_OPERAND (CODE, insn, va_arg (args, int));
3451 	  continue;
3452 
3453 	case 'T':
3454 	case 'W':
3455 	  INSERT_OPERAND (FT, insn, va_arg (args, int));
3456 	  continue;
3457 
3458 	case 'd':
3459 	case 'G':
3460 	case 'K':
3461 	  INSERT_OPERAND (RD, insn, va_arg (args, int));
3462 	  continue;
3463 
3464 	case 'U':
3465 	  {
3466 	    int tmp = va_arg (args, int);
3467 
3468 	    INSERT_OPERAND (RT, insn, tmp);
3469 	    INSERT_OPERAND (RD, insn, tmp);
3470 	    continue;
3471 	  }
3472 
3473 	case 'V':
3474 	case 'S':
3475 	  INSERT_OPERAND (FS, insn, va_arg (args, int));
3476 	  continue;
3477 
3478 	case 'z':
3479 	  continue;
3480 
3481 	case '<':
3482 	  INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3483 	  continue;
3484 
3485 	case 'D':
3486 	  INSERT_OPERAND (FD, insn, va_arg (args, int));
3487 	  continue;
3488 
3489 	case 'B':
3490 	  INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3491 	  continue;
3492 
3493 	case 'J':
3494 	  INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3495 	  continue;
3496 
3497 	case 'q':
3498 	  INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3499 	  continue;
3500 
3501 	case 'b':
3502 	case 's':
3503 	case 'r':
3504 	case 'v':
3505 	  INSERT_OPERAND (RS, insn, va_arg (args, int));
3506 	  continue;
3507 
3508 	case 'i':
3509 	case 'j':
3510 	case 'o':
3511 	  macro_read_relocs (&args, r);
3512 	  assert (*r == BFD_RELOC_GPREL16
3513 		  || *r == BFD_RELOC_MIPS_LITERAL
3514 		  || *r == BFD_RELOC_MIPS_HIGHER
3515 		  || *r == BFD_RELOC_HI16_S
3516 		  || *r == BFD_RELOC_LO16
3517 		  || *r == BFD_RELOC_MIPS_GOT16
3518 		  || *r == BFD_RELOC_MIPS_CALL16
3519 		  || *r == BFD_RELOC_MIPS_GOT_DISP
3520 		  || *r == BFD_RELOC_MIPS_GOT_PAGE
3521 		  || *r == BFD_RELOC_MIPS_GOT_OFST
3522 		  || *r == BFD_RELOC_MIPS_GOT_LO16
3523 		  || *r == BFD_RELOC_MIPS_CALL_LO16);
3524 	  continue;
3525 
3526 	case 'u':
3527 	  macro_read_relocs (&args, r);
3528 	  assert (ep != NULL
3529 		  && (ep->X_op == O_constant
3530 		      || (ep->X_op == O_symbol
3531 			  && (*r == BFD_RELOC_MIPS_HIGHEST
3532 			      || *r == BFD_RELOC_HI16_S
3533 			      || *r == BFD_RELOC_HI16
3534 			      || *r == BFD_RELOC_GPREL16
3535 			      || *r == BFD_RELOC_MIPS_GOT_HI16
3536 			      || *r == BFD_RELOC_MIPS_CALL_HI16))));
3537 	  continue;
3538 
3539 	case 'p':
3540 	  assert (ep != NULL);
3541 
3542 	  /*
3543 	   * This allows macro() to pass an immediate expression for
3544 	   * creating short branches without creating a symbol.
3545 	   *
3546 	   * We don't allow branch relaxation for these branches, as
3547 	   * they should only appear in ".set nomacro" anyway.
3548 	   */
3549 	  if (ep->X_op == O_constant)
3550 	    {
3551 	      if ((ep->X_add_number & 3) != 0)
3552 		as_bad (_("branch to misaligned address (0x%lx)"),
3553 			(unsigned long) ep->X_add_number);
3554 	      if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3555 		as_bad (_("branch address range overflow (0x%lx)"),
3556 			(unsigned long) ep->X_add_number);
3557 	      insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3558 	      ep = NULL;
3559 	    }
3560 	  else
3561 	    *r = BFD_RELOC_16_PCREL_S2;
3562 	  continue;
3563 
3564 	case 'a':
3565 	  assert (ep != NULL);
3566 	  *r = BFD_RELOC_MIPS_JMP;
3567 	  continue;
3568 
3569 	case 'C':
3570 	  INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3571 	  continue;
3572 
3573 	case 'k':
3574 	  INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3575 	  continue;
3576 
3577 	default:
3578 	  internalError ();
3579 	}
3580       break;
3581     }
3582   va_end (args);
3583   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3584 
3585   append_insn (&insn, ep, r);
3586 }
3587 
3588 static void
mips16_macro_build(expressionS * ep,const char * name,const char * fmt,va_list args)3589 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3590 		    va_list args)
3591 {
3592   struct mips_opcode *mo;
3593   struct mips_cl_insn insn;
3594   bfd_reloc_code_real_type r[3]
3595     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3596 
3597   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3598   assert (mo);
3599   assert (strcmp (name, mo->name) == 0);
3600 
3601   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3602     {
3603       ++mo;
3604       assert (mo->name);
3605       assert (strcmp (name, mo->name) == 0);
3606     }
3607 
3608   create_insn (&insn, mo);
3609   for (;;)
3610     {
3611       int c;
3612 
3613       c = *fmt++;
3614       switch (c)
3615 	{
3616 	case '\0':
3617 	  break;
3618 
3619 	case ',':
3620 	case '(':
3621 	case ')':
3622 	  continue;
3623 
3624 	case 'y':
3625 	case 'w':
3626 	  MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3627 	  continue;
3628 
3629 	case 'x':
3630 	case 'v':
3631 	  MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3632 	  continue;
3633 
3634 	case 'z':
3635 	  MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3636 	  continue;
3637 
3638 	case 'Z':
3639 	  MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3640 	  continue;
3641 
3642 	case '0':
3643 	case 'S':
3644 	case 'P':
3645 	case 'R':
3646 	  continue;
3647 
3648 	case 'X':
3649 	  MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3650 	  continue;
3651 
3652 	case 'Y':
3653 	  {
3654 	    int regno;
3655 
3656 	    regno = va_arg (args, int);
3657 	    regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3658 	    MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3659 	  }
3660 	  continue;
3661 
3662 	case '<':
3663 	case '>':
3664 	case '4':
3665 	case '5':
3666 	case 'H':
3667 	case 'W':
3668 	case 'D':
3669 	case 'j':
3670 	case '8':
3671 	case 'V':
3672 	case 'C':
3673 	case 'U':
3674 	case 'k':
3675 	case 'K':
3676 	case 'p':
3677 	case 'q':
3678 	  {
3679 	    assert (ep != NULL);
3680 
3681 	    if (ep->X_op != O_constant)
3682 	      *r = (int) BFD_RELOC_UNUSED + c;
3683 	    else
3684 	      {
3685 		mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3686 			      FALSE, &insn.insn_opcode, &insn.use_extend,
3687 			      &insn.extend);
3688 		ep = NULL;
3689 		*r = BFD_RELOC_UNUSED;
3690 	      }
3691 	  }
3692 	  continue;
3693 
3694 	case '6':
3695 	  MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3696 	  continue;
3697 	}
3698 
3699       break;
3700     }
3701 
3702   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3703 
3704   append_insn (&insn, ep, r);
3705 }
3706 
3707 /*
3708  * Sign-extend 32-bit mode constants that have bit 31 set and all
3709  * higher bits unset.
3710  */
3711 static void
normalize_constant_expr(expressionS * ex)3712 normalize_constant_expr (expressionS *ex)
3713 {
3714   if (ex->X_op == O_constant
3715       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3716     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3717 			- 0x80000000);
3718 }
3719 
3720 /*
3721  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3722  * all higher bits unset.
3723  */
3724 static void
normalize_address_expr(expressionS * ex)3725 normalize_address_expr (expressionS *ex)
3726 {
3727   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3728 	|| (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3729       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3730     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3731 			- 0x80000000);
3732 }
3733 
3734 /*
3735  * Generate a "jalr" instruction with a relocation hint to the called
3736  * function.  This occurs in NewABI PIC code.
3737  */
3738 static void
macro_build_jalr(expressionS * ep)3739 macro_build_jalr (expressionS *ep)
3740 {
3741   char *f = NULL;
3742 
3743   if (HAVE_NEWABI)
3744     {
3745       frag_grow (8);
3746       f = frag_more (0);
3747     }
3748   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3749   if (HAVE_NEWABI)
3750     fix_new_exp (frag_now, f - frag_now->fr_literal,
3751 		 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3752 }
3753 
3754 /*
3755  * Generate a "lui" instruction.
3756  */
3757 static void
macro_build_lui(expressionS * ep,int regnum)3758 macro_build_lui (expressionS *ep, int regnum)
3759 {
3760   expressionS high_expr;
3761   const struct mips_opcode *mo;
3762   struct mips_cl_insn insn;
3763   bfd_reloc_code_real_type r[3]
3764     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3765   const char *name = "lui";
3766   const char *fmt = "t,u";
3767 
3768   assert (! mips_opts.mips16);
3769 
3770   high_expr = *ep;
3771 
3772   if (high_expr.X_op == O_constant)
3773     {
3774       /* We can compute the instruction now without a relocation entry.  */
3775       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3776 				>> 16) & 0xffff;
3777       *r = BFD_RELOC_UNUSED;
3778     }
3779   else
3780     {
3781       assert (ep->X_op == O_symbol);
3782       /* _gp_disp is a special case, used from s_cpload.
3783 	 __gnu_local_gp is used if mips_no_shared.  */
3784       assert (mips_pic == NO_PIC
3785 	      || (! HAVE_NEWABI
3786 		  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3787 	      || (! mips_in_shared
3788 		  && strcmp (S_GET_NAME (ep->X_add_symbol),
3789                              "__gnu_local_gp") == 0));
3790       *r = BFD_RELOC_HI16_S;
3791     }
3792 
3793   mo = hash_find (op_hash, name);
3794   assert (strcmp (name, mo->name) == 0);
3795   assert (strcmp (fmt, mo->args) == 0);
3796   create_insn (&insn, mo);
3797 
3798   insn.insn_opcode = insn.insn_mo->match;
3799   INSERT_OPERAND (RT, insn, regnum);
3800   if (*r == BFD_RELOC_UNUSED)
3801     {
3802       insn.insn_opcode |= high_expr.X_add_number;
3803       append_insn (&insn, NULL, r);
3804     }
3805   else
3806     append_insn (&insn, &high_expr, r);
3807 }
3808 
3809 /* Generate a sequence of instructions to do a load or store from a constant
3810    offset off of a base register (breg) into/from a target register (treg),
3811    using AT if necessary.  */
3812 static void
macro_build_ldst_constoffset(expressionS * ep,const char * op,int treg,int breg,int dbl)3813 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3814 			      int treg, int breg, int dbl)
3815 {
3816   assert (ep->X_op == O_constant);
3817 
3818   /* Sign-extending 32-bit constants makes their handling easier.  */
3819   if (!dbl)
3820     normalize_constant_expr (ep);
3821 
3822   /* Right now, this routine can only handle signed 32-bit constants.  */
3823   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3824     as_warn (_("operand overflow"));
3825 
3826   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3827     {
3828       /* Signed 16-bit offset will fit in the op.  Easy!  */
3829       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3830     }
3831   else
3832     {
3833       /* 32-bit offset, need multiple instructions and AT, like:
3834 	   lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3835 	   addu     $tempreg,$tempreg,$breg
3836            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3837          to handle the complete offset.  */
3838       macro_build_lui (ep, AT);
3839       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3840       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3841 
3842       if (mips_opts.noat)
3843 	as_bad (_("Macro used $at after \".set noat\""));
3844     }
3845 }
3846 
3847 /*			set_at()
3848  * Generates code to set the $at register to true (one)
3849  * if reg is less than the immediate expression.
3850  */
3851 static void
set_at(int reg,int unsignedp)3852 set_at (int reg, int unsignedp)
3853 {
3854   if (imm_expr.X_op == O_constant
3855       && imm_expr.X_add_number >= -0x8000
3856       && imm_expr.X_add_number < 0x8000)
3857     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3858 		 AT, reg, BFD_RELOC_LO16);
3859   else
3860     {
3861       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3862       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3863     }
3864 }
3865 
3866 /* Warn if an expression is not a constant.  */
3867 
3868 static void
check_absolute_expr(struct mips_cl_insn * ip,expressionS * ex)3869 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3870 {
3871   if (ex->X_op == O_big)
3872     as_bad (_("unsupported large constant"));
3873   else if (ex->X_op != O_constant)
3874     as_bad (_("Instruction %s requires absolute expression"),
3875 	    ip->insn_mo->name);
3876 
3877   if (HAVE_32BIT_GPRS)
3878     normalize_constant_expr (ex);
3879 }
3880 
3881 /* Count the leading zeroes by performing a binary chop. This is a
3882    bulky bit of source, but performance is a LOT better for the
3883    majority of values than a simple loop to count the bits:
3884        for (lcnt = 0; (lcnt < 32); lcnt++)
3885          if ((v) & (1 << (31 - lcnt)))
3886            break;
3887   However it is not code size friendly, and the gain will drop a bit
3888   on certain cached systems.
3889 */
3890 #define COUNT_TOP_ZEROES(v)             \
3891   (((v) & ~0xffff) == 0                 \
3892    ? ((v) & ~0xff) == 0                 \
3893      ? ((v) & ~0xf) == 0                \
3894        ? ((v) & ~0x3) == 0              \
3895          ? ((v) & ~0x1) == 0            \
3896            ? !(v)                       \
3897              ? 32                       \
3898              : 31                       \
3899            : 30                         \
3900          : ((v) & ~0x7) == 0            \
3901            ? 29                         \
3902            : 28                         \
3903        : ((v) & ~0x3f) == 0             \
3904          ? ((v) & ~0x1f) == 0           \
3905            ? 27                         \
3906            : 26                         \
3907          : ((v) & ~0x7f) == 0           \
3908            ? 25                         \
3909            : 24                         \
3910      : ((v) & ~0xfff) == 0              \
3911        ? ((v) & ~0x3ff) == 0            \
3912          ? ((v) & ~0x1ff) == 0          \
3913            ? 23                         \
3914            : 22                         \
3915          : ((v) & ~0x7ff) == 0          \
3916            ? 21                         \
3917            : 20                         \
3918        : ((v) & ~0x3fff) == 0           \
3919          ? ((v) & ~0x1fff) == 0         \
3920            ? 19                         \
3921            : 18                         \
3922          : ((v) & ~0x7fff) == 0         \
3923            ? 17                         \
3924            : 16                         \
3925    : ((v) & ~0xffffff) == 0             \
3926      ? ((v) & ~0xfffff) == 0            \
3927        ? ((v) & ~0x3ffff) == 0          \
3928          ? ((v) & ~0x1ffff) == 0        \
3929            ? 15                         \
3930            : 14                         \
3931          : ((v) & ~0x7ffff) == 0        \
3932            ? 13                         \
3933            : 12                         \
3934        : ((v) & ~0x3fffff) == 0         \
3935          ? ((v) & ~0x1fffff) == 0       \
3936            ? 11                         \
3937            : 10                         \
3938          : ((v) & ~0x7fffff) == 0       \
3939            ? 9                          \
3940            : 8                          \
3941      : ((v) & ~0xfffffff) == 0          \
3942        ? ((v) & ~0x3ffffff) == 0        \
3943          ? ((v) & ~0x1ffffff) == 0      \
3944            ? 7                          \
3945            : 6                          \
3946          : ((v) & ~0x7ffffff) == 0      \
3947            ? 5                          \
3948            : 4                          \
3949        : ((v) & ~0x3fffffff) == 0       \
3950          ? ((v) & ~0x1fffffff) == 0     \
3951            ? 3                          \
3952            : 2                          \
3953          : ((v) & ~0x7fffffff) == 0     \
3954            ? 1                          \
3955            : 0)
3956 
3957 /*			load_register()
3958  *  This routine generates the least number of instructions necessary to load
3959  *  an absolute expression value into a register.
3960  */
3961 static void
load_register(int reg,expressionS * ep,int dbl)3962 load_register (int reg, expressionS *ep, int dbl)
3963 {
3964   int freg;
3965   expressionS hi32, lo32;
3966 
3967   if (ep->X_op != O_big)
3968     {
3969       assert (ep->X_op == O_constant);
3970 
3971       /* Sign-extending 32-bit constants makes their handling easier.  */
3972       if (!dbl)
3973 	normalize_constant_expr (ep);
3974 
3975       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3976 	{
3977 	  /* We can handle 16 bit signed values with an addiu to
3978 	     $zero.  No need to ever use daddiu here, since $zero and
3979 	     the result are always correct in 32 bit mode.  */
3980 	  macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3981 	  return;
3982 	}
3983       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3984 	{
3985 	  /* We can handle 16 bit unsigned values with an ori to
3986              $zero.  */
3987 	  macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3988 	  return;
3989 	}
3990       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3991 	{
3992 	  /* 32 bit values require an lui.  */
3993 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3994 	  if ((ep->X_add_number & 0xffff) != 0)
3995 	    macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3996 	  return;
3997 	}
3998     }
3999 
4000   /* The value is larger than 32 bits.  */
4001 
4002   if (!dbl || HAVE_32BIT_GPRS)
4003     {
4004       char value[32];
4005 
4006       sprintf_vma (value, ep->X_add_number);
4007       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4008       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4009       return;
4010     }
4011 
4012   if (ep->X_op != O_big)
4013     {
4014       hi32 = *ep;
4015       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4016       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4017       hi32.X_add_number &= 0xffffffff;
4018       lo32 = *ep;
4019       lo32.X_add_number &= 0xffffffff;
4020     }
4021   else
4022     {
4023       assert (ep->X_add_number > 2);
4024       if (ep->X_add_number == 3)
4025 	generic_bignum[3] = 0;
4026       else if (ep->X_add_number > 4)
4027 	as_bad (_("Number larger than 64 bits"));
4028       lo32.X_op = O_constant;
4029       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4030       hi32.X_op = O_constant;
4031       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4032     }
4033 
4034   if (hi32.X_add_number == 0)
4035     freg = 0;
4036   else
4037     {
4038       int shift, bit;
4039       unsigned long hi, lo;
4040 
4041       if (hi32.X_add_number == (offsetT) 0xffffffff)
4042 	{
4043 	  if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4044 	    {
4045 	      macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4046 	      return;
4047 	    }
4048 	  if (lo32.X_add_number & 0x80000000)
4049 	    {
4050 	      macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4051 	      if (lo32.X_add_number & 0xffff)
4052 		macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4053 	      return;
4054 	    }
4055 	}
4056 
4057       /* Check for 16bit shifted constant.  We know that hi32 is
4058          non-zero, so start the mask on the first bit of the hi32
4059          value.  */
4060       shift = 17;
4061       do
4062 	{
4063 	  unsigned long himask, lomask;
4064 
4065 	  if (shift < 32)
4066 	    {
4067 	      himask = 0xffff >> (32 - shift);
4068 	      lomask = (0xffff << shift) & 0xffffffff;
4069 	    }
4070 	  else
4071 	    {
4072 	      himask = 0xffff << (shift - 32);
4073 	      lomask = 0;
4074 	    }
4075 	  if ((hi32.X_add_number & ~(offsetT) himask) == 0
4076 	      && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4077 	    {
4078 	      expressionS tmp;
4079 
4080 	      tmp.X_op = O_constant;
4081 	      if (shift < 32)
4082 		tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4083 				    | (lo32.X_add_number >> shift));
4084 	      else
4085 		tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4086 	      macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4087 	      macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4088 			   reg, reg, (shift >= 32) ? shift - 32 : shift);
4089 	      return;
4090 	    }
4091 	  ++shift;
4092 	}
4093       while (shift <= (64 - 16));
4094 
4095       /* Find the bit number of the lowest one bit, and store the
4096          shifted value in hi/lo.  */
4097       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4098       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4099       if (lo != 0)
4100 	{
4101 	  bit = 0;
4102 	  while ((lo & 1) == 0)
4103 	    {
4104 	      lo >>= 1;
4105 	      ++bit;
4106 	    }
4107 	  lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4108 	  hi >>= bit;
4109 	}
4110       else
4111 	{
4112 	  bit = 32;
4113 	  while ((hi & 1) == 0)
4114 	    {
4115 	      hi >>= 1;
4116 	      ++bit;
4117 	    }
4118 	  lo = hi;
4119 	  hi = 0;
4120 	}
4121 
4122       /* Optimize if the shifted value is a (power of 2) - 1.  */
4123       if ((hi == 0 && ((lo + 1) & lo) == 0)
4124 	  || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4125 	{
4126 	  shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4127 	  if (shift != 0)
4128 	    {
4129 	      expressionS tmp;
4130 
4131 	      /* This instruction will set the register to be all
4132                  ones.  */
4133 	      tmp.X_op = O_constant;
4134 	      tmp.X_add_number = (offsetT) -1;
4135 	      macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4136 	      if (bit != 0)
4137 		{
4138 		  bit += shift;
4139 		  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4140 			       reg, reg, (bit >= 32) ? bit - 32 : bit);
4141 		}
4142 	      macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4143 			   reg, reg, (shift >= 32) ? shift - 32 : shift);
4144 	      return;
4145 	    }
4146 	}
4147 
4148       /* Sign extend hi32 before calling load_register, because we can
4149          generally get better code when we load a sign extended value.  */
4150       if ((hi32.X_add_number & 0x80000000) != 0)
4151 	hi32.X_add_number |= ~(offsetT) 0xffffffff;
4152       load_register (reg, &hi32, 0);
4153       freg = reg;
4154     }
4155   if ((lo32.X_add_number & 0xffff0000) == 0)
4156     {
4157       if (freg != 0)
4158 	{
4159 	  macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4160 	  freg = reg;
4161 	}
4162     }
4163   else
4164     {
4165       expressionS mid16;
4166 
4167       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4168 	{
4169 	  macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4170 	  macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4171 	  return;
4172 	}
4173 
4174       if (freg != 0)
4175 	{
4176 	  macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4177 	  freg = reg;
4178 	}
4179       mid16 = lo32;
4180       mid16.X_add_number >>= 16;
4181       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4182       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4183       freg = reg;
4184     }
4185   if ((lo32.X_add_number & 0xffff) != 0)
4186     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4187 }
4188 
4189 static inline void
load_delay_nop(void)4190 load_delay_nop (void)
4191 {
4192   if (!gpr_interlocks)
4193     macro_build (NULL, "nop", "");
4194 }
4195 
4196 /* Load an address into a register.  */
4197 
4198 static void
load_address(int reg,expressionS * ep,int * used_at)4199 load_address (int reg, expressionS *ep, int *used_at)
4200 {
4201   if (ep->X_op != O_constant
4202       && ep->X_op != O_symbol)
4203     {
4204       as_bad (_("expression too complex"));
4205       ep->X_op = O_constant;
4206     }
4207 
4208   if (ep->X_op == O_constant)
4209     {
4210       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4211       return;
4212     }
4213 
4214   if (mips_pic == NO_PIC)
4215     {
4216       /* If this is a reference to a GP relative symbol, we want
4217 	   addiu	$reg,$gp,<sym>		(BFD_RELOC_GPREL16)
4218 	 Otherwise we want
4219 	   lui		$reg,<sym>		(BFD_RELOC_HI16_S)
4220 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4221 	 If we have an addend, we always use the latter form.
4222 
4223 	 With 64bit address space and a usable $at we want
4224 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4225 	   lui		$at,<sym>		(BFD_RELOC_HI16_S)
4226 	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4227 	   daddiu	$at,<sym>		(BFD_RELOC_LO16)
4228 	   dsll32	$reg,0
4229 	   daddu	$reg,$reg,$at
4230 
4231 	 If $at is already in use, we use a path which is suboptimal
4232 	 on superscalar processors.
4233 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
4234 	   daddiu	$reg,<sym>		(BFD_RELOC_MIPS_HIGHER)
4235 	   dsll		$reg,16
4236 	   daddiu	$reg,<sym>		(BFD_RELOC_HI16_S)
4237 	   dsll		$reg,16
4238 	   daddiu	$reg,<sym>		(BFD_RELOC_LO16)
4239 
4240 	 For GP relative symbols in 64bit address space we can use
4241 	 the same sequence as in 32bit address space.  */
4242       if (HAVE_64BIT_SYMBOLS)
4243 	{
4244 	  if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4245 	      && !nopic_need_relax (ep->X_add_symbol, 1))
4246 	    {
4247 	      relax_start (ep->X_add_symbol);
4248 	      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4249 			   mips_gp_register, BFD_RELOC_GPREL16);
4250 	      relax_switch ();
4251 	    }
4252 
4253 	  if (*used_at == 0 && !mips_opts.noat)
4254 	    {
4255 	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4256 	      macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4257 	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
4258 			   BFD_RELOC_MIPS_HIGHER);
4259 	      macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4260 	      macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4261 	      macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4262 	      *used_at = 1;
4263 	    }
4264 	  else
4265 	    {
4266 	      macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4267 	      macro_build (ep, "daddiu", "t,r,j", reg, reg,
4268 			   BFD_RELOC_MIPS_HIGHER);
4269 	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4270 	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4271 	      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4272 	      macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4273 	    }
4274 
4275 	  if (mips_relax.sequence)
4276 	    relax_end ();
4277 	}
4278       else
4279 	{
4280 	  if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4281 	      && !nopic_need_relax (ep->X_add_symbol, 1))
4282 	    {
4283 	      relax_start (ep->X_add_symbol);
4284 	      macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4285 			   mips_gp_register, BFD_RELOC_GPREL16);
4286 	      relax_switch ();
4287 	    }
4288 	  macro_build_lui (ep, reg);
4289 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4290 		       reg, reg, BFD_RELOC_LO16);
4291 	  if (mips_relax.sequence)
4292 	    relax_end ();
4293 	}
4294     }
4295   else if (!mips_big_got)
4296     {
4297       expressionS ex;
4298 
4299       /* If this is a reference to an external symbol, we want
4300 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4301 	 Otherwise we want
4302 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4303 	   nop
4304 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4305 	 If there is a constant, it must be added in after.
4306 
4307 	 If we have NewABI, we want
4308 	   lw		$reg,<sym+cst>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
4309          unless we're referencing a global symbol with a non-zero
4310          offset, in which case cst must be added separately.  */
4311       if (HAVE_NEWABI)
4312 	{
4313 	  if (ep->X_add_number)
4314 	    {
4315 	      ex.X_add_number = ep->X_add_number;
4316 	      ep->X_add_number = 0;
4317 	      relax_start (ep->X_add_symbol);
4318 	      macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4319 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4320 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4321 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4322 	      ex.X_op = O_constant;
4323 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4324 			   reg, reg, BFD_RELOC_LO16);
4325 	      ep->X_add_number = ex.X_add_number;
4326 	      relax_switch ();
4327 	    }
4328 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4329 		       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4330 	  if (mips_relax.sequence)
4331 	    relax_end ();
4332 	}
4333       else
4334 	{
4335 	  ex.X_add_number = ep->X_add_number;
4336 	  ep->X_add_number = 0;
4337 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4338 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4339 	  load_delay_nop ();
4340 	  relax_start (ep->X_add_symbol);
4341 	  relax_switch ();
4342 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4343 		       BFD_RELOC_LO16);
4344 	  relax_end ();
4345 
4346 	  if (ex.X_add_number != 0)
4347 	    {
4348 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4349 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4350 	      ex.X_op = O_constant;
4351 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4352 			   reg, reg, BFD_RELOC_LO16);
4353 	    }
4354 	}
4355     }
4356   else if (mips_big_got)
4357     {
4358       expressionS ex;
4359 
4360       /* This is the large GOT case.  If this is a reference to an
4361 	 external symbol, we want
4362 	   lui		$reg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
4363 	   addu		$reg,$reg,$gp
4364 	   lw		$reg,<sym>($reg)	(BFD_RELOC_MIPS_GOT_LO16)
4365 
4366 	 Otherwise, for a reference to a local symbol in old ABI, we want
4367 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
4368 	   nop
4369 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_LO16)
4370 	 If there is a constant, it must be added in after.
4371 
4372 	 In the NewABI, for local symbols, with or without offsets, we want:
4373 	   lw		$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
4374 	   addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
4375       */
4376       if (HAVE_NEWABI)
4377 	{
4378 	  ex.X_add_number = ep->X_add_number;
4379 	  ep->X_add_number = 0;
4380 	  relax_start (ep->X_add_symbol);
4381 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4382 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4383 		       reg, reg, mips_gp_register);
4384 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4385 		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4386 	  if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4387 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4388 	  else if (ex.X_add_number)
4389 	    {
4390 	      ex.X_op = O_constant;
4391 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4392 			   BFD_RELOC_LO16);
4393 	    }
4394 
4395 	  ep->X_add_number = ex.X_add_number;
4396 	  relax_switch ();
4397 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4398 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4399 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4400 		       BFD_RELOC_MIPS_GOT_OFST);
4401 	  relax_end ();
4402 	}
4403       else
4404 	{
4405 	  ex.X_add_number = ep->X_add_number;
4406 	  ep->X_add_number = 0;
4407 	  relax_start (ep->X_add_symbol);
4408 	  macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4409 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4410 		       reg, reg, mips_gp_register);
4411 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4412 		       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4413 	  relax_switch ();
4414 	  if (reg_needs_delay (mips_gp_register))
4415 	    {
4416 	      /* We need a nop before loading from $gp.  This special
4417 		 check is required because the lui which starts the main
4418 		 instruction stream does not refer to $gp, and so will not
4419 		 insert the nop which may be required.  */
4420 	      macro_build (NULL, "nop", "");
4421 	    }
4422 	  macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4423 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4424 	  load_delay_nop ();
4425 	  macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4426 		       BFD_RELOC_LO16);
4427 	  relax_end ();
4428 
4429 	  if (ex.X_add_number != 0)
4430 	    {
4431 	      if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4432 		as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4433 	      ex.X_op = O_constant;
4434 	      macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4435 			   BFD_RELOC_LO16);
4436 	    }
4437 	}
4438     }
4439   else
4440     abort ();
4441 
4442   if (mips_opts.noat && *used_at == 1)
4443     as_bad (_("Macro used $at after \".set noat\""));
4444 }
4445 
4446 /* Move the contents of register SOURCE into register DEST.  */
4447 
4448 static void
move_register(int dest,int source)4449 move_register (int dest, int source)
4450 {
4451   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4452 	       dest, source, 0);
4453 }
4454 
4455 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4456    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4457    The two alternatives are:
4458 
4459    Global symbol		Local sybmol
4460    -------------		------------
4461    lw DEST,%got(SYMBOL)		lw DEST,%got(SYMBOL + OFFSET)
4462    ...				...
4463    addiu DEST,DEST,OFFSET	addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4464 
4465    load_got_offset emits the first instruction and add_got_offset
4466    emits the second for a 16-bit offset or add_got_offset_hilo emits
4467    a sequence to add a 32-bit offset using a scratch register.  */
4468 
4469 static void
load_got_offset(int dest,expressionS * local)4470 load_got_offset (int dest, expressionS *local)
4471 {
4472   expressionS global;
4473 
4474   global = *local;
4475   global.X_add_number = 0;
4476 
4477   relax_start (local->X_add_symbol);
4478   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4479 	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4480   relax_switch ();
4481   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4482 	       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4483   relax_end ();
4484 }
4485 
4486 static void
add_got_offset(int dest,expressionS * local)4487 add_got_offset (int dest, expressionS *local)
4488 {
4489   expressionS global;
4490 
4491   global.X_op = O_constant;
4492   global.X_op_symbol = NULL;
4493   global.X_add_symbol = NULL;
4494   global.X_add_number = local->X_add_number;
4495 
4496   relax_start (local->X_add_symbol);
4497   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4498 	       dest, dest, BFD_RELOC_LO16);
4499   relax_switch ();
4500   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4501   relax_end ();
4502 }
4503 
4504 static void
add_got_offset_hilo(int dest,expressionS * local,int tmp)4505 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4506 {
4507   expressionS global;
4508   int hold_mips_optimize;
4509 
4510   global.X_op = O_constant;
4511   global.X_op_symbol = NULL;
4512   global.X_add_symbol = NULL;
4513   global.X_add_number = local->X_add_number;
4514 
4515   relax_start (local->X_add_symbol);
4516   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4517   relax_switch ();
4518   /* Set mips_optimize around the lui instruction to avoid
4519      inserting an unnecessary nop after the lw.  */
4520   hold_mips_optimize = mips_optimize;
4521   mips_optimize = 2;
4522   macro_build_lui (&global, tmp);
4523   mips_optimize = hold_mips_optimize;
4524   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4525   relax_end ();
4526 
4527   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4528 }
4529 
4530 /*
4531  *			Build macros
4532  *   This routine implements the seemingly endless macro or synthesized
4533  * instructions and addressing modes in the mips assembly language. Many
4534  * of these macros are simple and are similar to each other. These could
4535  * probably be handled by some kind of table or grammar approach instead of
4536  * this verbose method. Others are not simple macros but are more like
4537  * optimizing code generation.
4538  *   One interesting optimization is when several store macros appear
4539  * consecutively that would load AT with the upper half of the same address.
4540  * The ensuing load upper instructions are ommited. This implies some kind
4541  * of global optimization. We currently only optimize within a single macro.
4542  *   For many of the load and store macros if the address is specified as a
4543  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4544  * first load register 'at' with zero and use it as the base register. The
4545  * mips assembler simply uses register $zero. Just one tiny optimization
4546  * we're missing.
4547  */
4548 static void
macro(struct mips_cl_insn * ip)4549 macro (struct mips_cl_insn *ip)
4550 {
4551   int treg, sreg, dreg, breg;
4552   int tempreg;
4553   int mask;
4554   int used_at = 0;
4555   expressionS expr1;
4556   const char *s;
4557   const char *s2;
4558   const char *fmt;
4559   int likely = 0;
4560   int dbl = 0;
4561   int coproc = 0;
4562   int lr = 0;
4563   int imm = 0;
4564   int call = 0;
4565   int off;
4566   offsetT maxnum;
4567   bfd_reloc_code_real_type r;
4568   int hold_mips_optimize;
4569 
4570   assert (! mips_opts.mips16);
4571 
4572   treg = (ip->insn_opcode >> 16) & 0x1f;
4573   dreg = (ip->insn_opcode >> 11) & 0x1f;
4574   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4575   mask = ip->insn_mo->mask;
4576 
4577   expr1.X_op = O_constant;
4578   expr1.X_op_symbol = NULL;
4579   expr1.X_add_symbol = NULL;
4580   expr1.X_add_number = 1;
4581 
4582   switch (mask)
4583     {
4584     case M_DABS:
4585       dbl = 1;
4586     case M_ABS:
4587       /* bgez $a0,.+12
4588 	 move v0,$a0
4589 	 sub v0,$zero,$a0
4590 	 */
4591 
4592       start_noreorder ();
4593 
4594       expr1.X_add_number = 8;
4595       macro_build (&expr1, "bgez", "s,p", sreg);
4596       if (dreg == sreg)
4597 	macro_build (NULL, "nop", "", 0);
4598       else
4599 	move_register (dreg, sreg);
4600       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4601 
4602       end_noreorder ();
4603       break;
4604 
4605     case M_ADD_I:
4606       s = "addi";
4607       s2 = "add";
4608       goto do_addi;
4609     case M_ADDU_I:
4610       s = "addiu";
4611       s2 = "addu";
4612       goto do_addi;
4613     case M_DADD_I:
4614       dbl = 1;
4615       s = "daddi";
4616       s2 = "dadd";
4617       goto do_addi;
4618     case M_DADDU_I:
4619       dbl = 1;
4620       s = "daddiu";
4621       s2 = "daddu";
4622     do_addi:
4623       if (imm_expr.X_op == O_constant
4624 	  && imm_expr.X_add_number >= -0x8000
4625 	  && imm_expr.X_add_number < 0x8000)
4626 	{
4627 	  macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4628 	  break;
4629 	}
4630       used_at = 1;
4631       load_register (AT, &imm_expr, dbl);
4632       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4633       break;
4634 
4635     case M_AND_I:
4636       s = "andi";
4637       s2 = "and";
4638       goto do_bit;
4639     case M_OR_I:
4640       s = "ori";
4641       s2 = "or";
4642       goto do_bit;
4643     case M_NOR_I:
4644       s = "";
4645       s2 = "nor";
4646       goto do_bit;
4647     case M_XOR_I:
4648       s = "xori";
4649       s2 = "xor";
4650     do_bit:
4651       if (imm_expr.X_op == O_constant
4652 	  && imm_expr.X_add_number >= 0
4653 	  && imm_expr.X_add_number < 0x10000)
4654 	{
4655 	  if (mask != M_NOR_I)
4656 	    macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4657 	  else
4658 	    {
4659 	      macro_build (&imm_expr, "ori", "t,r,i",
4660 			   treg, sreg, BFD_RELOC_LO16);
4661 	      macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4662 	    }
4663 	  break;
4664 	}
4665 
4666       used_at = 1;
4667       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4668       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4669       break;
4670 
4671     case M_BALIGN:
4672       switch (imm_expr.X_add_number)
4673 	{
4674 	case 0:
4675 	  macro_build (NULL, "nop", "");
4676 	  break;
4677 	case 2:
4678 	  macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4679 	  break;
4680 	default:
4681 	  macro_build (NULL, "balign", "t,s,2", treg, sreg,
4682 		       (int)imm_expr.X_add_number);
4683 	  break;
4684 	}
4685       break;
4686 
4687     case M_BEQ_I:
4688       s = "beq";
4689       goto beq_i;
4690     case M_BEQL_I:
4691       s = "beql";
4692       likely = 1;
4693       goto beq_i;
4694     case M_BNE_I:
4695       s = "bne";
4696       goto beq_i;
4697     case M_BNEL_I:
4698       s = "bnel";
4699       likely = 1;
4700     beq_i:
4701       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4702 	{
4703 	  macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4704 	  break;
4705 	}
4706       used_at = 1;
4707       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4708       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4709       break;
4710 
4711     case M_BGEL:
4712       likely = 1;
4713     case M_BGE:
4714       if (treg == 0)
4715 	{
4716 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4717 	  break;
4718 	}
4719       if (sreg == 0)
4720 	{
4721 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4722 	  break;
4723 	}
4724       used_at = 1;
4725       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4726       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4727       break;
4728 
4729     case M_BGTL_I:
4730       likely = 1;
4731     case M_BGT_I:
4732       /* check for > max integer */
4733       maxnum = 0x7fffffff;
4734       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4735 	{
4736 	  maxnum <<= 16;
4737 	  maxnum |= 0xffff;
4738 	  maxnum <<= 16;
4739 	  maxnum |= 0xffff;
4740 	}
4741       if (imm_expr.X_op == O_constant
4742 	  && imm_expr.X_add_number >= maxnum
4743 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4744 	{
4745 	do_false:
4746 	  /* result is always false */
4747 	  if (! likely)
4748 	    macro_build (NULL, "nop", "", 0);
4749 	  else
4750 	    macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4751 	  break;
4752 	}
4753       if (imm_expr.X_op != O_constant)
4754 	as_bad (_("Unsupported large constant"));
4755       ++imm_expr.X_add_number;
4756       /* FALLTHROUGH */
4757     case M_BGE_I:
4758     case M_BGEL_I:
4759       if (mask == M_BGEL_I)
4760 	likely = 1;
4761       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4762 	{
4763 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4764 	  break;
4765 	}
4766       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4767 	{
4768 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4769 	  break;
4770 	}
4771       maxnum = 0x7fffffff;
4772       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4773 	{
4774 	  maxnum <<= 16;
4775 	  maxnum |= 0xffff;
4776 	  maxnum <<= 16;
4777 	  maxnum |= 0xffff;
4778 	}
4779       maxnum = - maxnum - 1;
4780       if (imm_expr.X_op == O_constant
4781 	  && imm_expr.X_add_number <= maxnum
4782 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4783 	{
4784 	do_true:
4785 	  /* result is always true */
4786 	  as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4787 	  macro_build (&offset_expr, "b", "p");
4788 	  break;
4789 	}
4790       used_at = 1;
4791       set_at (sreg, 0);
4792       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4793       break;
4794 
4795     case M_BGEUL:
4796       likely = 1;
4797     case M_BGEU:
4798       if (treg == 0)
4799 	goto do_true;
4800       if (sreg == 0)
4801 	{
4802 	  macro_build (&offset_expr, likely ? "beql" : "beq",
4803 		       "s,t,p", 0, treg);
4804 	  break;
4805 	}
4806       used_at = 1;
4807       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4808       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4809       break;
4810 
4811     case M_BGTUL_I:
4812       likely = 1;
4813     case M_BGTU_I:
4814       if (sreg == 0
4815 	  || (HAVE_32BIT_GPRS
4816 	      && imm_expr.X_op == O_constant
4817 	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
4818 	goto do_false;
4819       if (imm_expr.X_op != O_constant)
4820 	as_bad (_("Unsupported large constant"));
4821       ++imm_expr.X_add_number;
4822       /* FALLTHROUGH */
4823     case M_BGEU_I:
4824     case M_BGEUL_I:
4825       if (mask == M_BGEUL_I)
4826 	likely = 1;
4827       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4828 	goto do_true;
4829       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4830 	{
4831 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4832 		       "s,t,p", sreg, 0);
4833 	  break;
4834 	}
4835       used_at = 1;
4836       set_at (sreg, 1);
4837       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4838       break;
4839 
4840     case M_BGTL:
4841       likely = 1;
4842     case M_BGT:
4843       if (treg == 0)
4844 	{
4845 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4846 	  break;
4847 	}
4848       if (sreg == 0)
4849 	{
4850 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4851 	  break;
4852 	}
4853       used_at = 1;
4854       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4855       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4856       break;
4857 
4858     case M_BGTUL:
4859       likely = 1;
4860     case M_BGTU:
4861       if (treg == 0)
4862 	{
4863 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
4864 		       "s,t,p", sreg, 0);
4865 	  break;
4866 	}
4867       if (sreg == 0)
4868 	goto do_false;
4869       used_at = 1;
4870       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4871       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4872       break;
4873 
4874     case M_BLEL:
4875       likely = 1;
4876     case M_BLE:
4877       if (treg == 0)
4878 	{
4879 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4880 	  break;
4881 	}
4882       if (sreg == 0)
4883 	{
4884 	  macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4885 	  break;
4886 	}
4887       used_at = 1;
4888       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4889       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4890       break;
4891 
4892     case M_BLEL_I:
4893       likely = 1;
4894     case M_BLE_I:
4895       maxnum = 0x7fffffff;
4896       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4897 	{
4898 	  maxnum <<= 16;
4899 	  maxnum |= 0xffff;
4900 	  maxnum <<= 16;
4901 	  maxnum |= 0xffff;
4902 	}
4903       if (imm_expr.X_op == O_constant
4904 	  && imm_expr.X_add_number >= maxnum
4905 	  && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4906 	goto do_true;
4907       if (imm_expr.X_op != O_constant)
4908 	as_bad (_("Unsupported large constant"));
4909       ++imm_expr.X_add_number;
4910       /* FALLTHROUGH */
4911     case M_BLT_I:
4912     case M_BLTL_I:
4913       if (mask == M_BLTL_I)
4914 	likely = 1;
4915       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4916 	{
4917 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4918 	  break;
4919 	}
4920       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4921 	{
4922 	  macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4923 	  break;
4924 	}
4925       used_at = 1;
4926       set_at (sreg, 0);
4927       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4928       break;
4929 
4930     case M_BLEUL:
4931       likely = 1;
4932     case M_BLEU:
4933       if (treg == 0)
4934 	{
4935 	  macro_build (&offset_expr, likely ? "beql" : "beq",
4936 		       "s,t,p", sreg, 0);
4937 	  break;
4938 	}
4939       if (sreg == 0)
4940 	goto do_true;
4941       used_at = 1;
4942       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4943       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4944       break;
4945 
4946     case M_BLEUL_I:
4947       likely = 1;
4948     case M_BLEU_I:
4949       if (sreg == 0
4950 	  || (HAVE_32BIT_GPRS
4951 	      && imm_expr.X_op == O_constant
4952 	      && imm_expr.X_add_number == (offsetT) 0xffffffff))
4953 	goto do_true;
4954       if (imm_expr.X_op != O_constant)
4955 	as_bad (_("Unsupported large constant"));
4956       ++imm_expr.X_add_number;
4957       /* FALLTHROUGH */
4958     case M_BLTU_I:
4959     case M_BLTUL_I:
4960       if (mask == M_BLTUL_I)
4961 	likely = 1;
4962       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4963 	goto do_false;
4964       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4965 	{
4966 	  macro_build (&offset_expr, likely ? "beql" : "beq",
4967 		       "s,t,p", sreg, 0);
4968 	  break;
4969 	}
4970       used_at = 1;
4971       set_at (sreg, 1);
4972       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4973       break;
4974 
4975     case M_BLTL:
4976       likely = 1;
4977     case M_BLT:
4978       if (treg == 0)
4979 	{
4980 	  macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4981 	  break;
4982 	}
4983       if (sreg == 0)
4984 	{
4985 	  macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4986 	  break;
4987 	}
4988       used_at = 1;
4989       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4990       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4991       break;
4992 
4993     case M_BLTUL:
4994       likely = 1;
4995     case M_BLTU:
4996       if (treg == 0)
4997 	goto do_false;
4998       if (sreg == 0)
4999 	{
5000 	  macro_build (&offset_expr, likely ? "bnel" : "bne",
5001 		       "s,t,p", 0, treg);
5002 	  break;
5003 	}
5004       used_at = 1;
5005       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5006       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5007       break;
5008 
5009     case M_DEXT:
5010       {
5011 	unsigned long pos;
5012 	unsigned long size;
5013 
5014         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5015 	  {
5016 	    as_bad (_("Unsupported large constant"));
5017 	    pos = size = 1;
5018 	  }
5019 	else
5020 	  {
5021 	    pos = (unsigned long) imm_expr.X_add_number;
5022 	    size = (unsigned long) imm2_expr.X_add_number;
5023 	  }
5024 
5025 	if (pos > 63)
5026 	  {
5027 	    as_bad (_("Improper position (%lu)"), pos);
5028 	    pos = 1;
5029 	  }
5030         if (size == 0 || size > 64
5031 	    || (pos + size - 1) > 63)
5032 	  {
5033 	    as_bad (_("Improper extract size (%lu, position %lu)"),
5034 		    size, pos);
5035 	    size = 1;
5036 	  }
5037 
5038 	if (size <= 32 && pos < 32)
5039 	  {
5040 	    s = "dext";
5041 	    fmt = "t,r,+A,+C";
5042 	  }
5043 	else if (size <= 32)
5044 	  {
5045 	    s = "dextu";
5046 	    fmt = "t,r,+E,+H";
5047 	  }
5048 	else
5049 	  {
5050 	    s = "dextm";
5051 	    fmt = "t,r,+A,+G";
5052 	  }
5053 	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5054       }
5055       break;
5056 
5057     case M_DINS:
5058       {
5059 	unsigned long pos;
5060 	unsigned long size;
5061 
5062         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5063 	  {
5064 	    as_bad (_("Unsupported large constant"));
5065 	    pos = size = 1;
5066 	  }
5067 	else
5068 	  {
5069 	    pos = (unsigned long) imm_expr.X_add_number;
5070 	    size = (unsigned long) imm2_expr.X_add_number;
5071 	  }
5072 
5073 	if (pos > 63)
5074 	  {
5075 	    as_bad (_("Improper position (%lu)"), pos);
5076 	    pos = 1;
5077 	  }
5078         if (size == 0 || size > 64
5079 	    || (pos + size - 1) > 63)
5080 	  {
5081 	    as_bad (_("Improper insert size (%lu, position %lu)"),
5082 		    size, pos);
5083 	    size = 1;
5084 	  }
5085 
5086 	if (pos < 32 && (pos + size - 1) < 32)
5087 	  {
5088 	    s = "dins";
5089 	    fmt = "t,r,+A,+B";
5090 	  }
5091 	else if (pos >= 32)
5092 	  {
5093 	    s = "dinsu";
5094 	    fmt = "t,r,+E,+F";
5095 	  }
5096 	else
5097 	  {
5098 	    s = "dinsm";
5099 	    fmt = "t,r,+A,+F";
5100 	  }
5101 	macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5102 		     pos + size - 1);
5103       }
5104       break;
5105 
5106     case M_DDIV_3:
5107       dbl = 1;
5108     case M_DIV_3:
5109       s = "mflo";
5110       goto do_div3;
5111     case M_DREM_3:
5112       dbl = 1;
5113     case M_REM_3:
5114       s = "mfhi";
5115     do_div3:
5116       if (treg == 0)
5117 	{
5118 	  as_warn (_("Divide by zero."));
5119 	  if (mips_trap)
5120 	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5121 	  else
5122 	    macro_build (NULL, "break", "c", 7);
5123 	  break;
5124 	}
5125 
5126       start_noreorder ();
5127       if (mips_trap)
5128 	{
5129 	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5130 	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5131 	}
5132       else
5133 	{
5134 	  expr1.X_add_number = 8;
5135 	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
5136 	  macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5137 	  macro_build (NULL, "break", "c", 7);
5138 	}
5139       expr1.X_add_number = -1;
5140       used_at = 1;
5141       load_register (AT, &expr1, dbl);
5142       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5143       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5144       if (dbl)
5145 	{
5146 	  expr1.X_add_number = 1;
5147 	  load_register (AT, &expr1, dbl);
5148 	  macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5149 	}
5150       else
5151 	{
5152 	  expr1.X_add_number = 0x80000000;
5153 	  macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5154 	}
5155       if (mips_trap)
5156 	{
5157 	  macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5158 	  /* We want to close the noreorder block as soon as possible, so
5159 	     that later insns are available for delay slot filling.  */
5160 	  end_noreorder ();
5161 	}
5162       else
5163 	{
5164 	  expr1.X_add_number = 8;
5165 	  macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5166 	  macro_build (NULL, "nop", "", 0);
5167 
5168 	  /* We want to close the noreorder block as soon as possible, so
5169 	     that later insns are available for delay slot filling.  */
5170 	  end_noreorder ();
5171 
5172 	  macro_build (NULL, "break", "c", 6);
5173 	}
5174       macro_build (NULL, s, "d", dreg);
5175       break;
5176 
5177     case M_DIV_3I:
5178       s = "div";
5179       s2 = "mflo";
5180       goto do_divi;
5181     case M_DIVU_3I:
5182       s = "divu";
5183       s2 = "mflo";
5184       goto do_divi;
5185     case M_REM_3I:
5186       s = "div";
5187       s2 = "mfhi";
5188       goto do_divi;
5189     case M_REMU_3I:
5190       s = "divu";
5191       s2 = "mfhi";
5192       goto do_divi;
5193     case M_DDIV_3I:
5194       dbl = 1;
5195       s = "ddiv";
5196       s2 = "mflo";
5197       goto do_divi;
5198     case M_DDIVU_3I:
5199       dbl = 1;
5200       s = "ddivu";
5201       s2 = "mflo";
5202       goto do_divi;
5203     case M_DREM_3I:
5204       dbl = 1;
5205       s = "ddiv";
5206       s2 = "mfhi";
5207       goto do_divi;
5208     case M_DREMU_3I:
5209       dbl = 1;
5210       s = "ddivu";
5211       s2 = "mfhi";
5212     do_divi:
5213       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5214 	{
5215 	  as_warn (_("Divide by zero."));
5216 	  if (mips_trap)
5217 	    macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5218 	  else
5219 	    macro_build (NULL, "break", "c", 7);
5220 	  break;
5221 	}
5222       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5223 	{
5224 	  if (strcmp (s2, "mflo") == 0)
5225 	    move_register (dreg, sreg);
5226 	  else
5227 	    move_register (dreg, 0);
5228 	  break;
5229 	}
5230       if (imm_expr.X_op == O_constant
5231 	  && imm_expr.X_add_number == -1
5232 	  && s[strlen (s) - 1] != 'u')
5233 	{
5234 	  if (strcmp (s2, "mflo") == 0)
5235 	    {
5236 	      macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5237 	    }
5238 	  else
5239 	    move_register (dreg, 0);
5240 	  break;
5241 	}
5242 
5243       used_at = 1;
5244       load_register (AT, &imm_expr, dbl);
5245       macro_build (NULL, s, "z,s,t", sreg, AT);
5246       macro_build (NULL, s2, "d", dreg);
5247       break;
5248 
5249     case M_DIVU_3:
5250       s = "divu";
5251       s2 = "mflo";
5252       goto do_divu3;
5253     case M_REMU_3:
5254       s = "divu";
5255       s2 = "mfhi";
5256       goto do_divu3;
5257     case M_DDIVU_3:
5258       s = "ddivu";
5259       s2 = "mflo";
5260       goto do_divu3;
5261     case M_DREMU_3:
5262       s = "ddivu";
5263       s2 = "mfhi";
5264     do_divu3:
5265       start_noreorder ();
5266       if (mips_trap)
5267 	{
5268 	  macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5269 	  macro_build (NULL, s, "z,s,t", sreg, treg);
5270 	  /* We want to close the noreorder block as soon as possible, so
5271 	     that later insns are available for delay slot filling.  */
5272 	  end_noreorder ();
5273 	}
5274       else
5275 	{
5276 	  expr1.X_add_number = 8;
5277 	  macro_build (&expr1, "bne", "s,t,p", treg, 0);
5278 	  macro_build (NULL, s, "z,s,t", sreg, treg);
5279 
5280 	  /* We want to close the noreorder block as soon as possible, so
5281 	     that later insns are available for delay slot filling.  */
5282 	  end_noreorder ();
5283 	  macro_build (NULL, "break", "c", 7);
5284 	}
5285       macro_build (NULL, s2, "d", dreg);
5286       break;
5287 
5288     case M_DLCA_AB:
5289       dbl = 1;
5290     case M_LCA_AB:
5291       call = 1;
5292       goto do_la;
5293     case M_DLA_AB:
5294       dbl = 1;
5295     case M_LA_AB:
5296     do_la:
5297       /* Load the address of a symbol into a register.  If breg is not
5298 	 zero, we then add a base register to it.  */
5299 
5300       if (dbl && HAVE_32BIT_GPRS)
5301 	as_warn (_("dla used to load 32-bit register"));
5302 
5303       if (! dbl && HAVE_64BIT_OBJECTS)
5304 	as_warn (_("la used to load 64-bit address"));
5305 
5306       if (offset_expr.X_op == O_constant
5307 	  && offset_expr.X_add_number >= -0x8000
5308 	  && offset_expr.X_add_number < 0x8000)
5309 	{
5310 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5311 		       "t,r,j", treg, sreg, BFD_RELOC_LO16);
5312 	  break;
5313 	}
5314 
5315       if (!mips_opts.noat && (treg == breg))
5316 	{
5317 	  tempreg = AT;
5318 	  used_at = 1;
5319 	}
5320       else
5321 	{
5322 	  tempreg = treg;
5323 	}
5324 
5325       if (offset_expr.X_op != O_symbol
5326 	  && offset_expr.X_op != O_constant)
5327 	{
5328 	  as_bad (_("expression too complex"));
5329 	  offset_expr.X_op = O_constant;
5330 	}
5331 
5332       if (offset_expr.X_op == O_constant)
5333 	load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5334       else if (mips_pic == NO_PIC)
5335 	{
5336 	  /* If this is a reference to a GP relative symbol, we want
5337 	       addiu	$tempreg,$gp,<sym>	(BFD_RELOC_GPREL16)
5338 	     Otherwise we want
5339 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5340 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5341 	     If we have a constant, we need two instructions anyhow,
5342 	     so we may as well always use the latter form.
5343 
5344 	     With 64bit address space and a usable $at we want
5345 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5346 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
5347 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5348 	       daddiu	$at,<sym>		(BFD_RELOC_LO16)
5349 	       dsll32	$tempreg,0
5350 	       daddu	$tempreg,$tempreg,$at
5351 
5352 	     If $at is already in use, we use a path which is suboptimal
5353 	     on superscalar processors.
5354 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
5355 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
5356 	       dsll	$tempreg,16
5357 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
5358 	       dsll	$tempreg,16
5359 	       daddiu	$tempreg,<sym>		(BFD_RELOC_LO16)
5360 
5361 	     For GP relative symbols in 64bit address space we can use
5362 	     the same sequence as in 32bit address space.  */
5363 	  if (HAVE_64BIT_SYMBOLS)
5364 	    {
5365 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5366 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5367 		{
5368 		  relax_start (offset_expr.X_add_symbol);
5369 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5370 			       tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5371 		  relax_switch ();
5372 		}
5373 
5374 	      if (used_at == 0 && !mips_opts.noat)
5375 		{
5376 		  macro_build (&offset_expr, "lui", "t,u",
5377 			       tempreg, BFD_RELOC_MIPS_HIGHEST);
5378 		  macro_build (&offset_expr, "lui", "t,u",
5379 			       AT, BFD_RELOC_HI16_S);
5380 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5381 			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5382 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5383 			       AT, AT, BFD_RELOC_LO16);
5384 		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5385 		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5386 		  used_at = 1;
5387 		}
5388 	      else
5389 		{
5390 		  macro_build (&offset_expr, "lui", "t,u",
5391 			       tempreg, BFD_RELOC_MIPS_HIGHEST);
5392 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5393 			       tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5394 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5395 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5396 			       tempreg, tempreg, BFD_RELOC_HI16_S);
5397 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5398 		  macro_build (&offset_expr, "daddiu", "t,r,j",
5399 			       tempreg, tempreg, BFD_RELOC_LO16);
5400 		}
5401 
5402 	      if (mips_relax.sequence)
5403 		relax_end ();
5404 	    }
5405 	  else
5406 	    {
5407 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5408 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5409 		{
5410 		  relax_start (offset_expr.X_add_symbol);
5411 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5412 			       tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5413 		  relax_switch ();
5414 		}
5415 	      if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5416 		as_bad (_("offset too large"));
5417 	      macro_build_lui (&offset_expr, tempreg);
5418 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5419 			   tempreg, tempreg, BFD_RELOC_LO16);
5420 	      if (mips_relax.sequence)
5421 		relax_end ();
5422 	    }
5423 	}
5424       else if (!mips_big_got && !HAVE_NEWABI)
5425 	{
5426 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5427 
5428 	  /* If this is a reference to an external symbol, and there
5429 	     is no constant, we want
5430 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5431 	     or for lca or if tempreg is PIC_CALL_REG
5432 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5433 	     For a local symbol, we want
5434 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5435 	       nop
5436 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5437 
5438 	     If we have a small constant, and this is a reference to
5439 	     an external symbol, we want
5440 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5441 	       nop
5442 	       addiu	$tempreg,$tempreg,<constant>
5443 	     For a local symbol, we want the same instruction
5444 	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5445 	     addiu instruction.
5446 
5447 	     If we have a large constant, and this is a reference to
5448 	     an external symbol, we want
5449 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5450 	       lui	$at,<hiconstant>
5451 	       addiu	$at,$at,<loconstant>
5452 	       addu	$tempreg,$tempreg,$at
5453 	     For a local symbol, we want the same instruction
5454 	     sequence, but we output a BFD_RELOC_LO16 reloc on the
5455 	     addiu instruction.
5456 	   */
5457 
5458 	  if (offset_expr.X_add_number == 0)
5459 	    {
5460 	      if (mips_pic == SVR4_PIC
5461 		  && breg == 0
5462 		  && (call || tempreg == PIC_CALL_REG))
5463 		lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5464 
5465 	      relax_start (offset_expr.X_add_symbol);
5466 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5467 			   lw_reloc_type, mips_gp_register);
5468 	      if (breg != 0)
5469 		{
5470 		  /* We're going to put in an addu instruction using
5471 		     tempreg, so we may as well insert the nop right
5472 		     now.  */
5473 		  load_delay_nop ();
5474 		}
5475 	      relax_switch ();
5476 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5477 			   tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5478 	      load_delay_nop ();
5479 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5480 			   tempreg, tempreg, BFD_RELOC_LO16);
5481 	      relax_end ();
5482 	      /* FIXME: If breg == 0, and the next instruction uses
5483 		 $tempreg, then if this variant case is used an extra
5484 		 nop will be generated.  */
5485 	    }
5486 	  else if (offset_expr.X_add_number >= -0x8000
5487 		   && offset_expr.X_add_number < 0x8000)
5488 	    {
5489 	      load_got_offset (tempreg, &offset_expr);
5490 	      load_delay_nop ();
5491 	      add_got_offset (tempreg, &offset_expr);
5492 	    }
5493 	  else
5494 	    {
5495 	      expr1.X_add_number = offset_expr.X_add_number;
5496 	      offset_expr.X_add_number =
5497 		((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5498 	      load_got_offset (tempreg, &offset_expr);
5499 	      offset_expr.X_add_number = expr1.X_add_number;
5500 	      /* If we are going to add in a base register, and the
5501 		 target register and the base register are the same,
5502 		 then we are using AT as a temporary register.  Since
5503 		 we want to load the constant into AT, we add our
5504 		 current AT (from the global offset table) and the
5505 		 register into the register now, and pretend we were
5506 		 not using a base register.  */
5507 	      if (breg == treg)
5508 		{
5509 		  load_delay_nop ();
5510 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5511 			       treg, AT, breg);
5512 		  breg = 0;
5513 		  tempreg = treg;
5514 		}
5515 	      add_got_offset_hilo (tempreg, &offset_expr, AT);
5516 	      used_at = 1;
5517 	    }
5518 	}
5519       else if (!mips_big_got && HAVE_NEWABI)
5520 	{
5521 	  int add_breg_early = 0;
5522 
5523 	  /* If this is a reference to an external, and there is no
5524 	     constant, or local symbol (*), with or without a
5525 	     constant, we want
5526 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5527 	     or for lca or if tempreg is PIC_CALL_REG
5528 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_CALL16)
5529 
5530 	     If we have a small constant, and this is a reference to
5531 	     an external symbol, we want
5532 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5533 	       addiu	$tempreg,$tempreg,<constant>
5534 
5535 	     If we have a large constant, and this is a reference to
5536 	     an external symbol, we want
5537 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_DISP)
5538 	       lui	$at,<hiconstant>
5539 	       addiu	$at,$at,<loconstant>
5540 	       addu	$tempreg,$tempreg,$at
5541 
5542 	     (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5543 	     local symbols, even though it introduces an additional
5544 	     instruction.  */
5545 
5546 	  if (offset_expr.X_add_number)
5547 	    {
5548 	      expr1.X_add_number = offset_expr.X_add_number;
5549 	      offset_expr.X_add_number = 0;
5550 
5551 	      relax_start (offset_expr.X_add_symbol);
5552 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5553 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5554 
5555 	      if (expr1.X_add_number >= -0x8000
5556 		  && expr1.X_add_number < 0x8000)
5557 		{
5558 		  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5559 			       tempreg, tempreg, BFD_RELOC_LO16);
5560 		}
5561 	      else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5562 		{
5563 		  int dreg;
5564 
5565 		  /* If we are going to add in a base register, and the
5566 		     target register and the base register are the same,
5567 		     then we are using AT as a temporary register.  Since
5568 		     we want to load the constant into AT, we add our
5569 		     current AT (from the global offset table) and the
5570 		     register into the register now, and pretend we were
5571 		     not using a base register.  */
5572 		  if (breg != treg)
5573 		    dreg = tempreg;
5574 		  else
5575 		    {
5576 		      assert (tempreg == AT);
5577 		      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5578 				   treg, AT, breg);
5579 		      dreg = treg;
5580 		      add_breg_early = 1;
5581 		    }
5582 
5583 		  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5584 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5585 			       dreg, dreg, AT);
5586 
5587 		  used_at = 1;
5588 		}
5589 	      else
5590 		as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5591 
5592 	      relax_switch ();
5593 	      offset_expr.X_add_number = expr1.X_add_number;
5594 
5595 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5596 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5597 	      if (add_breg_early)
5598 		{
5599 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5600 			       treg, tempreg, breg);
5601 		  breg = 0;
5602 		  tempreg = treg;
5603 		}
5604 	      relax_end ();
5605 	    }
5606 	  else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5607 	    {
5608 	      relax_start (offset_expr.X_add_symbol);
5609 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5610 			   BFD_RELOC_MIPS_CALL16, mips_gp_register);
5611 	      relax_switch ();
5612 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5613 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5614 	      relax_end ();
5615 	    }
5616 	  else
5617 	    {
5618 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5619 			   BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5620 	    }
5621 	}
5622       else if (mips_big_got && !HAVE_NEWABI)
5623 	{
5624 	  int gpdelay;
5625 	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5626 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5627 	  int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5628 
5629 	  /* This is the large GOT case.  If this is a reference to an
5630 	     external symbol, and there is no constant, we want
5631 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5632 	       addu	$tempreg,$tempreg,$gp
5633 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5634 	     or for lca or if tempreg is PIC_CALL_REG
5635 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5636 	       addu	$tempreg,$tempreg,$gp
5637 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5638 	     For a local symbol, we want
5639 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5640 	       nop
5641 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
5642 
5643 	     If we have a small constant, and this is a reference to
5644 	     an external symbol, we want
5645 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5646 	       addu	$tempreg,$tempreg,$gp
5647 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5648 	       nop
5649 	       addiu	$tempreg,$tempreg,<constant>
5650 	     For a local symbol, we want
5651 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5652 	       nop
5653 	       addiu	$tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5654 
5655 	     If we have a large constant, and this is a reference to
5656 	     an external symbol, we want
5657 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5658 	       addu	$tempreg,$tempreg,$gp
5659 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5660 	       lui	$at,<hiconstant>
5661 	       addiu	$at,$at,<loconstant>
5662 	       addu	$tempreg,$tempreg,$at
5663 	     For a local symbol, we want
5664 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
5665 	       lui	$at,<hiconstant>
5666 	       addiu	$at,$at,<loconstant>	(BFD_RELOC_LO16)
5667 	       addu	$tempreg,$tempreg,$at
5668 	  */
5669 
5670 	  expr1.X_add_number = offset_expr.X_add_number;
5671 	  offset_expr.X_add_number = 0;
5672 	  relax_start (offset_expr.X_add_symbol);
5673 	  gpdelay = reg_needs_delay (mips_gp_register);
5674 	  if (expr1.X_add_number == 0 && breg == 0
5675 	      && (call || tempreg == PIC_CALL_REG))
5676 	    {
5677 	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5678 	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5679 	    }
5680 	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5681 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5682 		       tempreg, tempreg, mips_gp_register);
5683 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5684 		       tempreg, lw_reloc_type, tempreg);
5685 	  if (expr1.X_add_number == 0)
5686 	    {
5687 	      if (breg != 0)
5688 		{
5689 		  /* We're going to put in an addu instruction using
5690 		     tempreg, so we may as well insert the nop right
5691 		     now.  */
5692 		  load_delay_nop ();
5693 		}
5694 	    }
5695 	  else if (expr1.X_add_number >= -0x8000
5696 		   && expr1.X_add_number < 0x8000)
5697 	    {
5698 	      load_delay_nop ();
5699 	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5700 			   tempreg, tempreg, BFD_RELOC_LO16);
5701 	    }
5702 	  else
5703 	    {
5704 	      int dreg;
5705 
5706 	      /* If we are going to add in a base register, and the
5707 		 target register and the base register are the same,
5708 		 then we are using AT as a temporary register.  Since
5709 		 we want to load the constant into AT, we add our
5710 		 current AT (from the global offset table) and the
5711 		 register into the register now, and pretend we were
5712 		 not using a base register.  */
5713 	      if (breg != treg)
5714 		dreg = tempreg;
5715 	      else
5716 		{
5717 		  assert (tempreg == AT);
5718 		  load_delay_nop ();
5719 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5720 			       treg, AT, breg);
5721 		  dreg = treg;
5722 		}
5723 
5724 	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5725 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5726 
5727 	      used_at = 1;
5728 	    }
5729 	  offset_expr.X_add_number =
5730 	    ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5731 	  relax_switch ();
5732 
5733 	  if (gpdelay)
5734 	    {
5735 	      /* This is needed because this instruction uses $gp, but
5736 		 the first instruction on the main stream does not.  */
5737 	      macro_build (NULL, "nop", "");
5738 	    }
5739 
5740 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5741 		       local_reloc_type, mips_gp_register);
5742 	  if (expr1.X_add_number >= -0x8000
5743 	      && expr1.X_add_number < 0x8000)
5744 	    {
5745 	      load_delay_nop ();
5746 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5747 			   tempreg, tempreg, BFD_RELOC_LO16);
5748 	      /* FIXME: If add_number is 0, and there was no base
5749 		 register, the external symbol case ended with a load,
5750 		 so if the symbol turns out to not be external, and
5751 		 the next instruction uses tempreg, an unnecessary nop
5752 		 will be inserted.  */
5753 	    }
5754 	  else
5755 	    {
5756 	      if (breg == treg)
5757 		{
5758 		  /* We must add in the base register now, as in the
5759 		     external symbol case.  */
5760 		  assert (tempreg == AT);
5761 		  load_delay_nop ();
5762 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5763 			       treg, AT, breg);
5764 		  tempreg = treg;
5765 		  /* We set breg to 0 because we have arranged to add
5766 		     it in in both cases.  */
5767 		  breg = 0;
5768 		}
5769 
5770 	      macro_build_lui (&expr1, AT);
5771 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5772 			   AT, AT, BFD_RELOC_LO16);
5773 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5774 			   tempreg, tempreg, AT);
5775 	      used_at = 1;
5776 	    }
5777 	  relax_end ();
5778 	}
5779       else if (mips_big_got && HAVE_NEWABI)
5780 	{
5781 	  int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5782 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5783 	  int add_breg_early = 0;
5784 
5785 	  /* This is the large GOT case.  If this is a reference to an
5786 	     external symbol, and there is no constant, we want
5787 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5788 	       add	$tempreg,$tempreg,$gp
5789 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5790 	     or for lca or if tempreg is PIC_CALL_REG
5791 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5792 	       add	$tempreg,$tempreg,$gp
5793 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5794 
5795 	     If we have a small constant, and this is a reference to
5796 	     an external symbol, we want
5797 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5798 	       add	$tempreg,$tempreg,$gp
5799 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5800 	       addi	$tempreg,$tempreg,<constant>
5801 
5802 	     If we have a large constant, and this is a reference to
5803 	     an external symbol, we want
5804 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
5805 	       addu	$tempreg,$tempreg,$gp
5806 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5807 	       lui	$at,<hiconstant>
5808 	       addi	$at,$at,<loconstant>
5809 	       add	$tempreg,$tempreg,$at
5810 
5811 	     If we have NewABI, and we know it's a local symbol, we want
5812 	       lw	$reg,<sym>($gp)		(BFD_RELOC_MIPS_GOT_PAGE)
5813 	       addiu	$reg,$reg,<sym>		(BFD_RELOC_MIPS_GOT_OFST)
5814 	     otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5815 
5816 	  relax_start (offset_expr.X_add_symbol);
5817 
5818 	  expr1.X_add_number = offset_expr.X_add_number;
5819 	  offset_expr.X_add_number = 0;
5820 
5821 	  if (expr1.X_add_number == 0 && breg == 0
5822 	      && (call || tempreg == PIC_CALL_REG))
5823 	    {
5824 	      lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5825 	      lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5826 	    }
5827 	  macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5828 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5829 		       tempreg, tempreg, mips_gp_register);
5830 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5831 		       tempreg, lw_reloc_type, tempreg);
5832 
5833 	  if (expr1.X_add_number == 0)
5834 	    ;
5835 	  else if (expr1.X_add_number >= -0x8000
5836 		   && expr1.X_add_number < 0x8000)
5837 	    {
5838 	      macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5839 			   tempreg, tempreg, BFD_RELOC_LO16);
5840 	    }
5841 	  else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5842 	    {
5843 	      int dreg;
5844 
5845 	      /* If we are going to add in a base register, and the
5846 		 target register and the base register are the same,
5847 		 then we are using AT as a temporary register.  Since
5848 		 we want to load the constant into AT, we add our
5849 		 current AT (from the global offset table) and the
5850 		 register into the register now, and pretend we were
5851 		 not using a base register.  */
5852 	      if (breg != treg)
5853 		dreg = tempreg;
5854 	      else
5855 		{
5856 		  assert (tempreg == AT);
5857 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5858 			       treg, AT, breg);
5859 		  dreg = treg;
5860 		  add_breg_early = 1;
5861 		}
5862 
5863 	      load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5864 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5865 
5866 	      used_at = 1;
5867 	    }
5868 	  else
5869 	    as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5870 
5871 	  relax_switch ();
5872 	  offset_expr.X_add_number = expr1.X_add_number;
5873 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5874 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5875 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5876 		       tempreg, BFD_RELOC_MIPS_GOT_OFST);
5877 	  if (add_breg_early)
5878 	    {
5879 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5880 			   treg, tempreg, breg);
5881 	      breg = 0;
5882 	      tempreg = treg;
5883 	    }
5884 	  relax_end ();
5885 	}
5886       else
5887 	abort ();
5888 
5889       if (breg != 0)
5890 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5891       break;
5892 
5893     case M_J_A:
5894       /* The j instruction may not be used in PIC code, since it
5895 	 requires an absolute address.  We convert it to a b
5896 	 instruction.  */
5897       if (mips_pic == NO_PIC)
5898 	macro_build (&offset_expr, "j", "a");
5899       else
5900 	macro_build (&offset_expr, "b", "p");
5901       break;
5902 
5903       /* The jal instructions must be handled as macros because when
5904 	 generating PIC code they expand to multi-instruction
5905 	 sequences.  Normally they are simple instructions.  */
5906     case M_JAL_1:
5907       dreg = RA;
5908       /* Fall through.  */
5909     case M_JAL_2:
5910       if (mips_pic == NO_PIC)
5911 	macro_build (NULL, "jalr", "d,s", dreg, sreg);
5912       else
5913 	{
5914 	  if (sreg != PIC_CALL_REG)
5915 	    as_warn (_("MIPS PIC call to register other than $25"));
5916 
5917 	  macro_build (NULL, "jalr", "d,s", dreg, sreg);
5918 	  if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5919 	    {
5920 	      if (mips_cprestore_offset < 0)
5921 		as_warn (_("No .cprestore pseudo-op used in PIC code"));
5922 	      else
5923 		{
5924 		  if (! mips_frame_reg_valid)
5925 		    {
5926 		      as_warn (_("No .frame pseudo-op used in PIC code"));
5927 		      /* Quiet this warning.  */
5928 		      mips_frame_reg_valid = 1;
5929 		    }
5930 		  if (! mips_cprestore_valid)
5931 		    {
5932 		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
5933 		      /* Quiet this warning.  */
5934 		      mips_cprestore_valid = 1;
5935 		    }
5936 		  expr1.X_add_number = mips_cprestore_offset;
5937   		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5938 						mips_gp_register,
5939 						mips_frame_reg,
5940 						HAVE_64BIT_ADDRESSES);
5941 		}
5942 	    }
5943 	}
5944 
5945       break;
5946 
5947     case M_JAL_A:
5948       if (mips_pic == NO_PIC)
5949 	macro_build (&offset_expr, "jal", "a");
5950       else if (mips_pic == SVR4_PIC)
5951 	{
5952 	  /* If this is a reference to an external symbol, and we are
5953 	     using a small GOT, we want
5954 	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_CALL16)
5955 	       nop
5956 	       jalr	$ra,$25
5957 	       nop
5958 	       lw	$gp,cprestore($sp)
5959 	     The cprestore value is set using the .cprestore
5960 	     pseudo-op.  If we are using a big GOT, we want
5961 	       lui	$25,<sym>		(BFD_RELOC_MIPS_CALL_HI16)
5962 	       addu	$25,$25,$gp
5963 	       lw	$25,<sym>($25)		(BFD_RELOC_MIPS_CALL_LO16)
5964 	       nop
5965 	       jalr	$ra,$25
5966 	       nop
5967 	       lw	$gp,cprestore($sp)
5968 	     If the symbol is not external, we want
5969 	       lw	$25,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
5970 	       nop
5971 	       addiu	$25,$25,<sym>		(BFD_RELOC_LO16)
5972 	       jalr	$ra,$25
5973 	       nop
5974 	       lw $gp,cprestore($sp)
5975 
5976 	     For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5977 	     sequences above, minus nops, unless the symbol is local,
5978 	     which enables us to use GOT_PAGE/GOT_OFST (big got) or
5979 	     GOT_DISP.  */
5980 	  if (HAVE_NEWABI)
5981 	    {
5982 	      if (! mips_big_got)
5983 		{
5984 		  relax_start (offset_expr.X_add_symbol);
5985 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5986 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5987 			       mips_gp_register);
5988 		  relax_switch ();
5989 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5990 			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5991 			       mips_gp_register);
5992 		  relax_end ();
5993 		}
5994 	      else
5995 		{
5996 		  relax_start (offset_expr.X_add_symbol);
5997 		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5998 			       BFD_RELOC_MIPS_CALL_HI16);
5999 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6000 			       PIC_CALL_REG, mips_gp_register);
6001 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6002 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6003 			       PIC_CALL_REG);
6004 		  relax_switch ();
6005 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6006 			       PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6007 			       mips_gp_register);
6008 		  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6009 			       PIC_CALL_REG, PIC_CALL_REG,
6010 			       BFD_RELOC_MIPS_GOT_OFST);
6011 		  relax_end ();
6012 		}
6013 
6014 	      macro_build_jalr (&offset_expr);
6015 	    }
6016 	  else
6017 	    {
6018 	      relax_start (offset_expr.X_add_symbol);
6019 	      if (! mips_big_got)
6020 		{
6021 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6022 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6023 			       mips_gp_register);
6024 		  load_delay_nop ();
6025 		  relax_switch ();
6026 		}
6027 	      else
6028 		{
6029 		  int gpdelay;
6030 
6031 		  gpdelay = reg_needs_delay (mips_gp_register);
6032 		  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6033 			       BFD_RELOC_MIPS_CALL_HI16);
6034 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6035 			       PIC_CALL_REG, mips_gp_register);
6036 		  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6037 			       PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6038 			       PIC_CALL_REG);
6039 		  load_delay_nop ();
6040 		  relax_switch ();
6041 		  if (gpdelay)
6042 		    macro_build (NULL, "nop", "");
6043 		}
6044 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6045 			   PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6046 			   mips_gp_register);
6047 	      load_delay_nop ();
6048 	      macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6049 			   PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6050 	      relax_end ();
6051 	      macro_build_jalr (&offset_expr);
6052 
6053 	      if (mips_cprestore_offset < 0)
6054 		as_warn (_("No .cprestore pseudo-op used in PIC code"));
6055 	      else
6056 		{
6057 		  if (! mips_frame_reg_valid)
6058 		    {
6059 		      as_warn (_("No .frame pseudo-op used in PIC code"));
6060 		      /* Quiet this warning.  */
6061 		      mips_frame_reg_valid = 1;
6062 		    }
6063 		  if (! mips_cprestore_valid)
6064 		    {
6065 		      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6066 		      /* Quiet this warning.  */
6067 		      mips_cprestore_valid = 1;
6068 		    }
6069 		  if (mips_opts.noreorder)
6070 		    macro_build (NULL, "nop", "");
6071 		  expr1.X_add_number = mips_cprestore_offset;
6072   		  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6073 						mips_gp_register,
6074 						mips_frame_reg,
6075 						HAVE_64BIT_ADDRESSES);
6076 		}
6077 	    }
6078 	}
6079       else if (mips_pic == VXWORKS_PIC)
6080 	as_bad (_("Non-PIC jump used in PIC library"));
6081       else
6082 	abort ();
6083 
6084       break;
6085 
6086     case M_LB_AB:
6087       s = "lb";
6088       goto ld;
6089     case M_LBU_AB:
6090       s = "lbu";
6091       goto ld;
6092     case M_LH_AB:
6093       s = "lh";
6094       goto ld;
6095     case M_LHU_AB:
6096       s = "lhu";
6097       goto ld;
6098     case M_LW_AB:
6099       s = "lw";
6100       goto ld;
6101     case M_LWC0_AB:
6102       s = "lwc0";
6103       /* Itbl support may require additional care here.  */
6104       coproc = 1;
6105       goto ld;
6106     case M_LWC1_AB:
6107       s = "lwc1";
6108       /* Itbl support may require additional care here.  */
6109       coproc = 1;
6110       goto ld;
6111     case M_LWC2_AB:
6112       s = "lwc2";
6113       /* Itbl support may require additional care here.  */
6114       coproc = 1;
6115       goto ld;
6116     case M_LWC3_AB:
6117       s = "lwc3";
6118       /* Itbl support may require additional care here.  */
6119       coproc = 1;
6120       goto ld;
6121     case M_LWL_AB:
6122       s = "lwl";
6123       lr = 1;
6124       goto ld;
6125     case M_LWR_AB:
6126       s = "lwr";
6127       lr = 1;
6128       goto ld;
6129     case M_LDC1_AB:
6130       if (mips_opts.arch == CPU_R4650)
6131 	{
6132 	  as_bad (_("opcode not supported on this processor"));
6133 	  break;
6134 	}
6135       s = "ldc1";
6136       /* Itbl support may require additional care here.  */
6137       coproc = 1;
6138       goto ld;
6139     case M_LDC2_AB:
6140       s = "ldc2";
6141       /* Itbl support may require additional care here.  */
6142       coproc = 1;
6143       goto ld;
6144     case M_LDC3_AB:
6145       s = "ldc3";
6146       /* Itbl support may require additional care here.  */
6147       coproc = 1;
6148       goto ld;
6149     case M_LDL_AB:
6150       s = "ldl";
6151       lr = 1;
6152       goto ld;
6153     case M_LDR_AB:
6154       s = "ldr";
6155       lr = 1;
6156       goto ld;
6157     case M_LL_AB:
6158       s = "ll";
6159       goto ld;
6160     case M_LLD_AB:
6161       s = "lld";
6162       goto ld;
6163     case M_LWU_AB:
6164       s = "lwu";
6165     ld:
6166       if (mips_opts.arch == CPU_OCTEON
6167 	   && octeon_error_on_unsupported
6168            && (mask == M_LDC1_AB || mask == M_LDC2_AB || mask == M_LDC3_AB
6169                || mask == M_L_DOB || mask == M_L_DAB
6170                || mask == M_LI_D || mask == M_LI_DD
6171                || mask == M_LI_S || mask == M_LI_SS))
6172         {
6173           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
6174           return;
6175         }
6176       if (breg == treg || coproc || lr)
6177 	{
6178 	  tempreg = AT;
6179 	  used_at = 1;
6180 	}
6181       else
6182 	{
6183 	  tempreg = treg;
6184 	}
6185       goto ld_st;
6186     case M_SB_AB:
6187       s = "sb";
6188       goto st;
6189     case M_SH_AB:
6190       s = "sh";
6191       goto st;
6192     case M_SW_AB:
6193       s = "sw";
6194       goto st;
6195     case M_SWC0_AB:
6196       s = "swc0";
6197       /* Itbl support may require additional care here.  */
6198       coproc = 1;
6199       goto st;
6200     case M_SWC1_AB:
6201       s = "swc1";
6202       /* Itbl support may require additional care here.  */
6203       coproc = 1;
6204       goto st;
6205     case M_SWC2_AB:
6206       s = "swc2";
6207       /* Itbl support may require additional care here.  */
6208       coproc = 1;
6209       goto st;
6210     case M_SWC3_AB:
6211       s = "swc3";
6212       /* Itbl support may require additional care here.  */
6213       coproc = 1;
6214       goto st;
6215     case M_SWL_AB:
6216       s = "swl";
6217       goto st;
6218     case M_SWR_AB:
6219       s = "swr";
6220       goto st;
6221     case M_SC_AB:
6222       s = "sc";
6223       goto st;
6224     case M_SCD_AB:
6225       s = "scd";
6226       goto st;
6227     case M_CACHE_AB:
6228       s = "cache";
6229       goto st;
6230     case M_SDC1_AB:
6231       if (mips_opts.arch == CPU_R4650)
6232 	{
6233 	  as_bad (_("opcode not supported on this processor"));
6234 	  break;
6235 	}
6236       s = "sdc1";
6237       coproc = 1;
6238       /* Itbl support may require additional care here.  */
6239       goto st;
6240     case M_SDC2_AB:
6241       s = "sdc2";
6242       /* Itbl support may require additional care here.  */
6243       coproc = 1;
6244       goto st;
6245     case M_SDC3_AB:
6246       s = "sdc3";
6247       /* Itbl support may require additional care here.  */
6248       coproc = 1;
6249       goto st;
6250     case M_SDL_AB:
6251       s = "sdl";
6252       goto st;
6253     case M_SDR_AB:
6254       s = "sdr";
6255     st:
6256       if (mips_opts.arch == CPU_OCTEON
6257 	  && octeon_error_on_unsupported
6258           && (mask == M_SWC0_AB || mask == M_SWC1_AB || mask == M_SWC2_AB
6259               || mask == M_SDC1_AB || mask == M_SDC2_AB || mask == M_SDC3_AB
6260               || mask == M_S_DAB || mask == M_S_DOB))
6261         {
6262           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
6263           return;
6264         }
6265       tempreg = AT;
6266       used_at = 1;
6267     ld_st:
6268       /* Itbl support may require additional care here.  */
6269       if (mask == M_LWC1_AB
6270 	  || mask == M_SWC1_AB
6271 	  || mask == M_LDC1_AB
6272 	  || mask == M_SDC1_AB
6273 	  || mask == M_L_DAB
6274 	  || mask == M_S_DAB)
6275 	fmt = "T,o(b)";
6276       else if (mask == M_CACHE_AB)
6277 	fmt = "k,o(b)";
6278       else if (coproc)
6279 	fmt = "E,o(b)";
6280       else
6281 	fmt = "t,o(b)";
6282 
6283       if (offset_expr.X_op != O_constant
6284 	  && offset_expr.X_op != O_symbol)
6285 	{
6286 	  as_bad (_("expression too complex"));
6287 	  offset_expr.X_op = O_constant;
6288 	}
6289 
6290       if (HAVE_32BIT_ADDRESSES
6291 	  && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6292 	{
6293 	  char value [32];
6294 
6295 	  sprintf_vma (value, offset_expr.X_add_number);
6296 	  as_bad (_("Number (0x%s) larger than 32 bits"), value);
6297 	}
6298 
6299       /* A constant expression in PIC code can be handled just as it
6300 	 is in non PIC code.  */
6301       if (offset_expr.X_op == O_constant)
6302 	{
6303 	  expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6304 				& ~(bfd_vma) 0xffff);
6305 	  normalize_address_expr (&expr1);
6306 	  load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6307 	  if (breg != 0)
6308 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6309 			 tempreg, tempreg, breg);
6310 	  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6311 	}
6312       else if (mips_pic == NO_PIC)
6313 	{
6314 	  /* If this is a reference to a GP relative symbol, and there
6315 	     is no base register, we want
6316 	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6317 	     Otherwise, if there is no base register, we want
6318 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6319 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6320 	     If we have a constant, we need two instructions anyhow,
6321 	     so we always use the latter form.
6322 
6323 	     If we have a base register, and this is a reference to a
6324 	     GP relative symbol, we want
6325 	       addu	$tempreg,$breg,$gp
6326 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_GPREL16)
6327 	     Otherwise we want
6328 	       lui	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6329 	       addu	$tempreg,$tempreg,$breg
6330 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6331 	     With a constant we always use the latter case.
6332 
6333 	     With 64bit address space and no base register and $at usable,
6334 	     we want
6335 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6336 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6337 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6338 	       dsll32	$tempreg,0
6339 	       daddu	$tempreg,$at
6340 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6341 	     If we have a base register, we want
6342 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6343 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6344 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6345 	       daddu	$at,$breg
6346 	       dsll32	$tempreg,0
6347 	       daddu	$tempreg,$at
6348 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6349 
6350 	     Without $at we can't generate the optimal path for superscalar
6351 	     processors here since this would require two temporary registers.
6352 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6353 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6354 	       dsll	$tempreg,16
6355 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6356 	       dsll	$tempreg,16
6357 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6358 	     If we have a base register, we want
6359 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHEST)
6360 	       daddiu	$tempreg,<sym>		(BFD_RELOC_MIPS_HIGHER)
6361 	       dsll	$tempreg,16
6362 	       daddiu	$tempreg,<sym>		(BFD_RELOC_HI16_S)
6363 	       dsll	$tempreg,16
6364 	       daddu	$tempreg,$tempreg,$breg
6365 	       <op>	$treg,<sym>($tempreg)	(BFD_RELOC_LO16)
6366 
6367 	     For GP relative symbols in 64bit address space we can use
6368 	     the same sequence as in 32bit address space.  */
6369 	  if (HAVE_64BIT_SYMBOLS)
6370 	    {
6371 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6372 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6373 		{
6374 		  relax_start (offset_expr.X_add_symbol);
6375 		  if (breg == 0)
6376 		    {
6377 		      macro_build (&offset_expr, s, fmt, treg,
6378 				   BFD_RELOC_GPREL16, mips_gp_register);
6379 		    }
6380 		  else
6381 		    {
6382 		      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6383 				   tempreg, breg, mips_gp_register);
6384 		      macro_build (&offset_expr, s, fmt, treg,
6385 				   BFD_RELOC_GPREL16, tempreg);
6386 		    }
6387 		  relax_switch ();
6388 		}
6389 
6390 	      if (used_at == 0 && !mips_opts.noat)
6391 		{
6392 		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6393 			       BFD_RELOC_MIPS_HIGHEST);
6394 		  macro_build (&offset_expr, "lui", "t,u", AT,
6395 			       BFD_RELOC_HI16_S);
6396 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6397 			       tempreg, BFD_RELOC_MIPS_HIGHER);
6398 		  if (breg != 0)
6399 		    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6400 		  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6401 		  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6402 		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6403 			       tempreg);
6404 		  used_at = 1;
6405 		}
6406 	      else
6407 		{
6408 		  macro_build (&offset_expr, "lui", "t,u", tempreg,
6409 			       BFD_RELOC_MIPS_HIGHEST);
6410 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6411 			       tempreg, BFD_RELOC_MIPS_HIGHER);
6412 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6413 		  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6414 			       tempreg, BFD_RELOC_HI16_S);
6415 		  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6416 		  if (breg != 0)
6417 		    macro_build (NULL, "daddu", "d,v,t",
6418 				 tempreg, tempreg, breg);
6419 		  macro_build (&offset_expr, s, fmt, treg,
6420 			       BFD_RELOC_LO16, tempreg);
6421 		}
6422 
6423 	      if (mips_relax.sequence)
6424 		relax_end ();
6425 	      break;
6426 	    }
6427 
6428 	  if (breg == 0)
6429 	    {
6430 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6431 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6432 		{
6433 		  relax_start (offset_expr.X_add_symbol);
6434 		  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6435 			       mips_gp_register);
6436 		  relax_switch ();
6437 		}
6438 	      macro_build_lui (&offset_expr, tempreg);
6439 	      macro_build (&offset_expr, s, fmt, treg,
6440 			   BFD_RELOC_LO16, tempreg);
6441 	      if (mips_relax.sequence)
6442 		relax_end ();
6443 	    }
6444 	  else
6445 	    {
6446 	      if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6447 		  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6448 		{
6449 		  relax_start (offset_expr.X_add_symbol);
6450 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6451 			       tempreg, breg, mips_gp_register);
6452 		  macro_build (&offset_expr, s, fmt, treg,
6453 			       BFD_RELOC_GPREL16, tempreg);
6454 		  relax_switch ();
6455 		}
6456 	      macro_build_lui (&offset_expr, tempreg);
6457 	      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6458 			   tempreg, tempreg, breg);
6459 	      macro_build (&offset_expr, s, fmt, treg,
6460 			   BFD_RELOC_LO16, tempreg);
6461 	      if (mips_relax.sequence)
6462 		relax_end ();
6463 	    }
6464 	}
6465       else if (!mips_big_got)
6466 	{
6467 	  int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6468 
6469 	  /* If this is a reference to an external symbol, we want
6470 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6471 	       nop
6472 	       <op>	$treg,0($tempreg)
6473 	     Otherwise we want
6474 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6475 	       nop
6476 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6477 	       <op>	$treg,0($tempreg)
6478 
6479 	     For NewABI, we want
6480 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6481 	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6482 
6483 	     If there is a base register, we add it to $tempreg before
6484 	     the <op>.  If there is a constant, we stick it in the
6485 	     <op> instruction.  We don't handle constants larger than
6486 	     16 bits, because we have no way to load the upper 16 bits
6487 	     (actually, we could handle them for the subset of cases
6488 	     in which we are not using $at).  */
6489 	  assert (offset_expr.X_op == O_symbol);
6490 	  if (HAVE_NEWABI)
6491 	    {
6492 	      macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6493 			   BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6494 	      if (breg != 0)
6495 		macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6496 			     tempreg, tempreg, breg);
6497 	      macro_build (&offset_expr, s, fmt, treg,
6498 			   BFD_RELOC_MIPS_GOT_OFST, tempreg);
6499 	      break;
6500 	    }
6501 	  expr1.X_add_number = offset_expr.X_add_number;
6502 	  offset_expr.X_add_number = 0;
6503 	  if (expr1.X_add_number < -0x8000
6504 	      || expr1.X_add_number >= 0x8000)
6505 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6506 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6507 		       lw_reloc_type, mips_gp_register);
6508 	  load_delay_nop ();
6509 	  relax_start (offset_expr.X_add_symbol);
6510 	  relax_switch ();
6511 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6512 		       tempreg, BFD_RELOC_LO16);
6513 	  relax_end ();
6514 	  if (breg != 0)
6515 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6516 			 tempreg, tempreg, breg);
6517 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6518 	}
6519       else if (mips_big_got && !HAVE_NEWABI)
6520 	{
6521 	  int gpdelay;
6522 
6523 	  /* If this is a reference to an external symbol, we want
6524 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6525 	       addu	$tempreg,$tempreg,$gp
6526 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6527 	       <op>	$treg,0($tempreg)
6528 	     Otherwise we want
6529 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT16)
6530 	       nop
6531 	       addiu	$tempreg,$tempreg,<sym>	(BFD_RELOC_LO16)
6532 	       <op>	$treg,0($tempreg)
6533 	     If there is a base register, we add it to $tempreg before
6534 	     the <op>.  If there is a constant, we stick it in the
6535 	     <op> instruction.  We don't handle constants larger than
6536 	     16 bits, because we have no way to load the upper 16 bits
6537 	     (actually, we could handle them for the subset of cases
6538 	     in which we are not using $at).  */
6539 	  assert (offset_expr.X_op == O_symbol);
6540 	  expr1.X_add_number = offset_expr.X_add_number;
6541 	  offset_expr.X_add_number = 0;
6542 	  if (expr1.X_add_number < -0x8000
6543 	      || expr1.X_add_number >= 0x8000)
6544 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6545 	  gpdelay = reg_needs_delay (mips_gp_register);
6546 	  relax_start (offset_expr.X_add_symbol);
6547 	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6548 		       BFD_RELOC_MIPS_GOT_HI16);
6549 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6550 		       mips_gp_register);
6551 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6552 		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6553 	  relax_switch ();
6554 	  if (gpdelay)
6555 	    macro_build (NULL, "nop", "");
6556 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6557 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6558 	  load_delay_nop ();
6559 	  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6560 		       tempreg, BFD_RELOC_LO16);
6561 	  relax_end ();
6562 
6563 	  if (breg != 0)
6564 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6565 			 tempreg, tempreg, breg);
6566 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6567 	}
6568       else if (mips_big_got && HAVE_NEWABI)
6569 	{
6570 	  /* If this is a reference to an external symbol, we want
6571 	       lui	$tempreg,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
6572 	       add	$tempreg,$tempreg,$gp
6573 	       lw	$tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6574 	       <op>	$treg,<ofst>($tempreg)
6575 	     Otherwise, for local symbols, we want:
6576 	       lw	$tempreg,<sym>($gp)	(BFD_RELOC_MIPS_GOT_PAGE)
6577 	       <op>	$treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6578 	  assert (offset_expr.X_op == O_symbol);
6579 	  expr1.X_add_number = offset_expr.X_add_number;
6580 	  offset_expr.X_add_number = 0;
6581 	  if (expr1.X_add_number < -0x8000
6582 	      || expr1.X_add_number >= 0x8000)
6583 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6584 	  relax_start (offset_expr.X_add_symbol);
6585 	  macro_build (&offset_expr, "lui", "t,u", tempreg,
6586 		       BFD_RELOC_MIPS_GOT_HI16);
6587 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6588 		       mips_gp_register);
6589 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6590 		       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6591 	  if (breg != 0)
6592 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6593 			 tempreg, tempreg, breg);
6594 	  macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6595 
6596 	  relax_switch ();
6597 	  offset_expr.X_add_number = expr1.X_add_number;
6598 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6599 		       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6600 	  if (breg != 0)
6601 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6602 			 tempreg, tempreg, breg);
6603 	  macro_build (&offset_expr, s, fmt, treg,
6604 		       BFD_RELOC_MIPS_GOT_OFST, tempreg);
6605 	  relax_end ();
6606 	}
6607       else
6608 	abort ();
6609 
6610       break;
6611 
6612     case M_LI:
6613     case M_LI_S:
6614       load_register (treg, &imm_expr, 0);
6615       break;
6616 
6617     case M_DLI:
6618       load_register (treg, &imm_expr, 1);
6619       break;
6620 
6621     case M_LI_SS:
6622       if (imm_expr.X_op == O_constant)
6623 	{
6624 	  used_at = 1;
6625 	  load_register (AT, &imm_expr, 0);
6626 	  macro_build (NULL, "mtc1", "t,G", AT, treg);
6627 	  break;
6628 	}
6629       else
6630 	{
6631 	  assert (offset_expr.X_op == O_symbol
6632 		  && strcmp (segment_name (S_GET_SEGMENT
6633 					   (offset_expr.X_add_symbol)),
6634 			     ".lit4") == 0
6635 		  && offset_expr.X_add_number == 0);
6636 	  macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6637 		       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6638 	  break;
6639 	}
6640 
6641     case M_LI_D:
6642       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6643          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6644          order 32 bits of the value and the low order 32 bits are either
6645          zero or in OFFSET_EXPR.  */
6646       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6647 	{
6648 	  if (HAVE_64BIT_GPRS)
6649 	    load_register (treg, &imm_expr, 1);
6650 	  else
6651 	    {
6652 	      int hreg, lreg;
6653 
6654 	      if (target_big_endian)
6655 		{
6656 		  hreg = treg;
6657 		  lreg = treg + 1;
6658 		}
6659 	      else
6660 		{
6661 		  hreg = treg + 1;
6662 		  lreg = treg;
6663 		}
6664 
6665 	      if (hreg <= 31)
6666 		load_register (hreg, &imm_expr, 0);
6667 	      if (lreg <= 31)
6668 		{
6669 		  if (offset_expr.X_op == O_absent)
6670 		    move_register (lreg, 0);
6671 		  else
6672 		    {
6673 		      assert (offset_expr.X_op == O_constant);
6674 		      load_register (lreg, &offset_expr, 0);
6675 		    }
6676 		}
6677 	    }
6678 	  break;
6679 	}
6680 
6681       /* We know that sym is in the .rdata section.  First we get the
6682 	 upper 16 bits of the address.  */
6683       if (mips_pic == NO_PIC)
6684 	{
6685 	  macro_build_lui (&offset_expr, AT);
6686 	  used_at = 1;
6687 	}
6688       else
6689 	{
6690 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6691 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6692 	  used_at = 1;
6693 	}
6694 
6695       /* Now we load the register(s).  */
6696       if (HAVE_64BIT_GPRS)
6697 	{
6698 	  used_at = 1;
6699 	  macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6700 	}
6701       else
6702 	{
6703 	  used_at = 1;
6704 	  macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6705 	  if (treg != RA)
6706 	    {
6707 	      /* FIXME: How in the world do we deal with the possible
6708 		 overflow here?  */
6709 	      offset_expr.X_add_number += 4;
6710 	      macro_build (&offset_expr, "lw", "t,o(b)",
6711 			   treg + 1, BFD_RELOC_LO16, AT);
6712 	    }
6713 	}
6714       break;
6715 
6716     case M_LI_DD:
6717       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6718          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6719          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6720          the value and the low order 32 bits are either zero or in
6721          OFFSET_EXPR.  */
6722       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6723 	{
6724 	  used_at = 1;
6725 	  load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6726 	  if (HAVE_64BIT_FPRS)
6727 	    {
6728 	      assert (HAVE_64BIT_GPRS);
6729 	      macro_build (NULL, "dmtc1", "t,S", AT, treg);
6730 	    }
6731 	  else
6732 	    {
6733 	      macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6734 	      if (offset_expr.X_op == O_absent)
6735 		macro_build (NULL, "mtc1", "t,G", 0, treg);
6736 	      else
6737 		{
6738 		  assert (offset_expr.X_op == O_constant);
6739 		  load_register (AT, &offset_expr, 0);
6740 		  macro_build (NULL, "mtc1", "t,G", AT, treg);
6741 		}
6742 	    }
6743 	  break;
6744 	}
6745 
6746       assert (offset_expr.X_op == O_symbol
6747 	      && offset_expr.X_add_number == 0);
6748       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6749       if (strcmp (s, ".lit8") == 0)
6750 	{
6751 	  if (mips_opts.isa != ISA_MIPS1)
6752 	    {
6753 	      macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6754 			   BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6755 	      break;
6756 	    }
6757 	  breg = mips_gp_register;
6758 	  r = BFD_RELOC_MIPS_LITERAL;
6759 	  goto dob;
6760 	}
6761       else
6762 	{
6763 	  assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6764 	  used_at = 1;
6765 	  if (mips_pic != NO_PIC)
6766 	    macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6767 			 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6768 	  else
6769 	    {
6770 	      /* FIXME: This won't work for a 64 bit address.  */
6771 	      macro_build_lui (&offset_expr, AT);
6772 	    }
6773 
6774 	  if (mips_opts.isa != ISA_MIPS1)
6775 	    {
6776 	      macro_build (&offset_expr, "ldc1", "T,o(b)",
6777 			   treg, BFD_RELOC_LO16, AT);
6778 	      break;
6779 	    }
6780 	  breg = AT;
6781 	  r = BFD_RELOC_LO16;
6782 	  goto dob;
6783 	}
6784 
6785     case M_L_DOB:
6786       if (mips_opts.arch == CPU_R4650)
6787 	{
6788 	  as_bad (_("opcode not supported on this processor"));
6789 	  break;
6790 	}
6791       /* Even on a big endian machine $fn comes before $fn+1.  We have
6792 	 to adjust when loading from memory.  */
6793       r = BFD_RELOC_LO16;
6794     dob:
6795       assert (mips_opts.isa == ISA_MIPS1);
6796       macro_build (&offset_expr, "lwc1", "T,o(b)",
6797 		   target_big_endian ? treg + 1 : treg, r, breg);
6798       /* FIXME: A possible overflow which I don't know how to deal
6799 	 with.  */
6800       offset_expr.X_add_number += 4;
6801       macro_build (&offset_expr, "lwc1", "T,o(b)",
6802 		   target_big_endian ? treg : treg + 1, r, breg);
6803       break;
6804 
6805     case M_L_DAB:
6806       /*
6807        * The MIPS assembler seems to check for X_add_number not
6808        * being double aligned and generating:
6809        *	lui	at,%hi(foo+1)
6810        *	addu	at,at,v1
6811        *	addiu	at,at,%lo(foo+1)
6812        *	lwc1	f2,0(at)
6813        *	lwc1	f3,4(at)
6814        * But, the resulting address is the same after relocation so why
6815        * generate the extra instruction?
6816        */
6817       if (mips_opts.arch == CPU_R4650)
6818 	{
6819 	  as_bad (_("opcode not supported on this processor"));
6820 	  break;
6821 	}
6822       /* Itbl support may require additional care here.  */
6823       coproc = 1;
6824       if (mips_opts.isa != ISA_MIPS1)
6825 	{
6826 	  s = "ldc1";
6827 	  goto ld;
6828 	}
6829 
6830       s = "lwc1";
6831       fmt = "T,o(b)";
6832       goto ldd_std;
6833 
6834     case M_S_DAB:
6835       if (mips_opts.arch == CPU_R4650)
6836 	{
6837 	  as_bad (_("opcode not supported on this processor"));
6838 	  break;
6839 	}
6840 
6841       if (mips_opts.isa != ISA_MIPS1)
6842 	{
6843 	  s = "sdc1";
6844 	  goto st;
6845 	}
6846 
6847       s = "swc1";
6848       fmt = "T,o(b)";
6849       /* Itbl support may require additional care here.  */
6850       coproc = 1;
6851       goto ldd_std;
6852 
6853     case M_LD_AB:
6854       if (HAVE_64BIT_GPRS)
6855 	{
6856 	  s = "ld";
6857 	  goto ld;
6858 	}
6859 
6860       s = "lw";
6861       fmt = "t,o(b)";
6862       goto ldd_std;
6863 
6864     case M_SD_AB:
6865       if (HAVE_64BIT_GPRS)
6866 	{
6867 	  s = "sd";
6868 	  goto st;
6869 	}
6870 
6871       s = "sw";
6872       fmt = "t,o(b)";
6873 
6874     ldd_std:
6875       if (offset_expr.X_op != O_symbol
6876 	  && offset_expr.X_op != O_constant)
6877 	{
6878 	  as_bad (_("expression too complex"));
6879 	  offset_expr.X_op = O_constant;
6880 	}
6881 
6882       if (HAVE_32BIT_ADDRESSES
6883 	  && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6884 	{
6885 	  char value [32];
6886 
6887 	  sprintf_vma (value, offset_expr.X_add_number);
6888 	  as_bad (_("Number (0x%s) larger than 32 bits"), value);
6889 	}
6890 
6891       /* Even on a big endian machine $fn comes before $fn+1.  We have
6892 	 to adjust when loading from memory.  We set coproc if we must
6893 	 load $fn+1 first.  */
6894       /* Itbl support may require additional care here.  */
6895       if (! target_big_endian)
6896 	coproc = 0;
6897 
6898       if (mips_pic == NO_PIC
6899 	  || offset_expr.X_op == O_constant)
6900 	{
6901 	  /* If this is a reference to a GP relative symbol, we want
6902 	       <op>	$treg,<sym>($gp)	(BFD_RELOC_GPREL16)
6903 	       <op>	$treg+1,<sym>+4($gp)	(BFD_RELOC_GPREL16)
6904 	     If we have a base register, we use this
6905 	       addu	$at,$breg,$gp
6906 	       <op>	$treg,<sym>($at)	(BFD_RELOC_GPREL16)
6907 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_GPREL16)
6908 	     If this is not a GP relative symbol, we want
6909 	       lui	$at,<sym>		(BFD_RELOC_HI16_S)
6910 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
6911 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
6912 	     If there is a base register, we add it to $at after the
6913 	     lui instruction.  If there is a constant, we always use
6914 	     the last case.  */
6915 	  if (offset_expr.X_op == O_symbol
6916 	      && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6917 	      && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6918 	    {
6919 	      relax_start (offset_expr.X_add_symbol);
6920 	      if (breg == 0)
6921 		{
6922 		  tempreg = mips_gp_register;
6923 		}
6924 	      else
6925 		{
6926 		  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6927 			       AT, breg, mips_gp_register);
6928 		  tempreg = AT;
6929 		  used_at = 1;
6930 		}
6931 
6932 	      /* Itbl support may require additional care here.  */
6933 	      macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6934 			   BFD_RELOC_GPREL16, tempreg);
6935 	      offset_expr.X_add_number += 4;
6936 
6937 	      /* Set mips_optimize to 2 to avoid inserting an
6938                  undesired nop.  */
6939 	      hold_mips_optimize = mips_optimize;
6940 	      mips_optimize = 2;
6941 	      /* Itbl support may require additional care here.  */
6942 	      macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6943 			   BFD_RELOC_GPREL16, tempreg);
6944 	      mips_optimize = hold_mips_optimize;
6945 
6946 	      relax_switch ();
6947 
6948 	      /* We just generated two relocs.  When tc_gen_reloc
6949 		 handles this case, it will skip the first reloc and
6950 		 handle the second.  The second reloc already has an
6951 		 extra addend of 4, which we added above.  We must
6952 		 subtract it out, and then subtract another 4 to make
6953 		 the first reloc come out right.  The second reloc
6954 		 will come out right because we are going to add 4 to
6955 		 offset_expr when we build its instruction below.
6956 
6957 		 If we have a symbol, then we don't want to include
6958 		 the offset, because it will wind up being included
6959 		 when we generate the reloc.  */
6960 
6961 	      if (offset_expr.X_op == O_constant)
6962 		offset_expr.X_add_number -= 8;
6963 	      else
6964 		{
6965 		  offset_expr.X_add_number = -4;
6966 		  offset_expr.X_op = O_constant;
6967 		}
6968 	    }
6969 	  used_at = 1;
6970 	  macro_build_lui (&offset_expr, AT);
6971 	  if (breg != 0)
6972 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6973 	  /* Itbl support may require additional care here.  */
6974 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6975 		       BFD_RELOC_LO16, AT);
6976 	  /* FIXME: How do we handle overflow here?  */
6977 	  offset_expr.X_add_number += 4;
6978 	  /* Itbl support may require additional care here.  */
6979 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6980 		       BFD_RELOC_LO16, AT);
6981 	  if (mips_relax.sequence)
6982 	    relax_end ();
6983 	}
6984       else if (!mips_big_got)
6985 	{
6986 	  /* If this is a reference to an external symbol, we want
6987 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6988 	       nop
6989 	       <op>	$treg,0($at)
6990 	       <op>	$treg+1,4($at)
6991 	     Otherwise we want
6992 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
6993 	       nop
6994 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
6995 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
6996 	     If there is a base register we add it to $at before the
6997 	     lwc1 instructions.  If there is a constant we include it
6998 	     in the lwc1 instructions.  */
6999 	  used_at = 1;
7000 	  expr1.X_add_number = offset_expr.X_add_number;
7001 	  if (expr1.X_add_number < -0x8000
7002 	      || expr1.X_add_number >= 0x8000 - 4)
7003 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7004 	  load_got_offset (AT, &offset_expr);
7005 	  load_delay_nop ();
7006 	  if (breg != 0)
7007 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7008 
7009 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7010              nop.  */
7011 	  hold_mips_optimize = mips_optimize;
7012 	  mips_optimize = 2;
7013 
7014 	  /* Itbl support may require additional care here.  */
7015 	  relax_start (offset_expr.X_add_symbol);
7016 	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7017 		       BFD_RELOC_LO16, AT);
7018 	  expr1.X_add_number += 4;
7019 	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7020 		       BFD_RELOC_LO16, AT);
7021 	  relax_switch ();
7022 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7023 		       BFD_RELOC_LO16, AT);
7024 	  offset_expr.X_add_number += 4;
7025 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7026 		       BFD_RELOC_LO16, AT);
7027 	  relax_end ();
7028 
7029 	  mips_optimize = hold_mips_optimize;
7030 	}
7031       else if (mips_big_got)
7032 	{
7033 	  int gpdelay;
7034 
7035 	  /* If this is a reference to an external symbol, we want
7036 	       lui	$at,<sym>		(BFD_RELOC_MIPS_GOT_HI16)
7037 	       addu	$at,$at,$gp
7038 	       lw	$at,<sym>($at)		(BFD_RELOC_MIPS_GOT_LO16)
7039 	       nop
7040 	       <op>	$treg,0($at)
7041 	       <op>	$treg+1,4($at)
7042 	     Otherwise we want
7043 	       lw	$at,<sym>($gp)		(BFD_RELOC_MIPS_GOT16)
7044 	       nop
7045 	       <op>	$treg,<sym>($at)	(BFD_RELOC_LO16)
7046 	       <op>	$treg+1,<sym>+4($at)	(BFD_RELOC_LO16)
7047 	     If there is a base register we add it to $at before the
7048 	     lwc1 instructions.  If there is a constant we include it
7049 	     in the lwc1 instructions.  */
7050 	  used_at = 1;
7051 	  expr1.X_add_number = offset_expr.X_add_number;
7052 	  offset_expr.X_add_number = 0;
7053 	  if (expr1.X_add_number < -0x8000
7054 	      || expr1.X_add_number >= 0x8000 - 4)
7055 	    as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7056 	  gpdelay = reg_needs_delay (mips_gp_register);
7057 	  relax_start (offset_expr.X_add_symbol);
7058 	  macro_build (&offset_expr, "lui", "t,u",
7059 		       AT, BFD_RELOC_MIPS_GOT_HI16);
7060 	  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7061 		       AT, AT, mips_gp_register);
7062 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7063 		       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7064 	  load_delay_nop ();
7065 	  if (breg != 0)
7066 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7067 	  /* Itbl support may require additional care here.  */
7068 	  macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7069 		       BFD_RELOC_LO16, AT);
7070 	  expr1.X_add_number += 4;
7071 
7072 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7073              nop.  */
7074 	  hold_mips_optimize = mips_optimize;
7075 	  mips_optimize = 2;
7076 	  /* Itbl support may require additional care here.  */
7077 	  macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7078 		       BFD_RELOC_LO16, AT);
7079 	  mips_optimize = hold_mips_optimize;
7080 	  expr1.X_add_number -= 4;
7081 
7082 	  relax_switch ();
7083 	  offset_expr.X_add_number = expr1.X_add_number;
7084 	  if (gpdelay)
7085 	    macro_build (NULL, "nop", "");
7086 	  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7087 		       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7088 	  load_delay_nop ();
7089 	  if (breg != 0)
7090 	    macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7091 	  /* Itbl support may require additional care here.  */
7092 	  macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7093 		       BFD_RELOC_LO16, AT);
7094 	  offset_expr.X_add_number += 4;
7095 
7096 	  /* Set mips_optimize to 2 to avoid inserting an undesired
7097              nop.  */
7098 	  hold_mips_optimize = mips_optimize;
7099 	  mips_optimize = 2;
7100 	  /* Itbl support may require additional care here.  */
7101 	  macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7102 		       BFD_RELOC_LO16, AT);
7103 	  mips_optimize = hold_mips_optimize;
7104 	  relax_end ();
7105 	}
7106       else
7107 	abort ();
7108 
7109       break;
7110 
7111     case M_LD_OB:
7112       s = "lw";
7113       goto sd_ob;
7114     case M_SD_OB:
7115       s = "sw";
7116     sd_ob:
7117       assert (HAVE_32BIT_ADDRESSES);
7118       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7119       offset_expr.X_add_number += 4;
7120       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7121       break;
7122 
7123     case M_SAA_AB:
7124       s = "saa";
7125       goto saa_saad;
7126 
7127     case M_SAAD_AB:
7128       s = "saad";
7129 
7130       saa_saad:
7131       /* The "saa/saad" instructions are new in CN58XX. These instructions
7132 	 do not specify offset. When invoked with address or symbol, then
7133 	 load the address or value of symbol in a register using the dla macro
7134 	 into AT, and pass the register for emitting "saa/saad" instruction.
7135 	 This will get expanded to
7136 
7137 	    dla AT, constant/label
7138 	    saa/saad $treg,(AT)  */
7139       {
7140 	char *name = "dla";
7141 	char *fmt = "t,A(b)";
7142 	const struct mips_opcode *mo;
7143   	struct mips_cl_insn insn;
7144 
7145 	mo = hash_find (op_hash, name);
7146 	assert (strcmp (name, mo->name) == 0);
7147 	assert (strcmp (fmt, mo->args) == 0);
7148 	create_insn (&insn, mo);
7149 
7150 	insn.insn_opcode = insn.insn_mo->match;
7151 
7152 	used_at = 1;
7153 	INSERT_OPERAND (RT, insn, AT);
7154 	if (breg)
7155 	  INSERT_OPERAND (RS, insn, breg);
7156 
7157 	/* The address part is forwarded through the global offset_expr. */
7158 	macro (&insn);
7159 
7160 	macro_build (NULL, s, "t,(b)", treg, AT);
7161 	break;
7162      }
7163 
7164    /* New code added to support COPZ instructions.
7165       This code builds table entries out of the macros in mip_opcodes.
7166       R4000 uses interlocks to handle coproc delays.
7167       Other chips (like the R3000) require nops to be inserted for delays.
7168 
7169       FIXME: Currently, we require that the user handle delays.
7170       In order to fill delay slots for non-interlocked chips,
7171       we must have a way to specify delays based on the coprocessor.
7172       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7173       What are the side-effects of the cop instruction?
7174       What cache support might we have and what are its effects?
7175       Both coprocessor & memory require delays. how long???
7176       What registers are read/set/modified?
7177 
7178       If an itbl is provided to interpret cop instructions,
7179       this knowledge can be encoded in the itbl spec.  */
7180 
7181     case M_COP0:
7182       s = "c0";
7183       goto copz;
7184     case M_COP1:
7185       s = "c1";
7186       goto copz;
7187     case M_COP2:
7188       s = "c2";
7189       goto copz;
7190     case M_COP3:
7191       s = "c3";
7192     copz:
7193       if (!strcmp (s,"c2") && mips_opts.arch == CPU_OCTEON
7194 	  && octeon_error_on_unsupported)
7195         {
7196           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
7197           return;
7198         }
7199       /* For now we just do C (same as Cz).  The parameter will be
7200          stored in insn_opcode by mips_ip.  */
7201       macro_build (NULL, s, "C", ip->insn_opcode);
7202       break;
7203 
7204     case M_MOVE:
7205       move_register (dreg, sreg);
7206       break;
7207 
7208 #ifdef LOSING_COMPILER
7209     default:
7210       /* Try and see if this is a new itbl instruction.
7211          This code builds table entries out of the macros in mip_opcodes.
7212          FIXME: For now we just assemble the expression and pass it's
7213          value along as a 32-bit immediate.
7214          We may want to have the assembler assemble this value,
7215          so that we gain the assembler's knowledge of delay slots,
7216          symbols, etc.
7217          Would it be more efficient to use mask (id) here? */
7218       if (itbl_have_entries
7219 	  && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7220 	{
7221 	  s = ip->insn_mo->name;
7222 	  s2 = "cop3";
7223 	  coproc = ITBL_DECODE_PNUM (immed_expr);;
7224 	  macro_build (&immed_expr, s, "C");
7225 	  break;
7226 	}
7227       macro2 (ip);
7228       break;
7229     }
7230   if (mips_opts.noat && used_at)
7231     as_bad (_("Macro used $at after \".set noat\""));
7232 }
7233 
7234 static void
macro2(struct mips_cl_insn * ip)7235 macro2 (struct mips_cl_insn *ip)
7236 {
7237   int treg, sreg, dreg, breg;
7238   int tempreg;
7239   int mask;
7240   int used_at;
7241   expressionS expr1;
7242   const char *s;
7243   const char *s2;
7244   const char *fmt;
7245   int likely = 0;
7246   int dbl = 0;
7247   int coproc = 0;
7248   int lr = 0;
7249   int imm = 0;
7250   int off;
7251   offsetT maxnum;
7252   bfd_reloc_code_real_type r;
7253 
7254   treg = (ip->insn_opcode >> 16) & 0x1f;
7255   dreg = (ip->insn_opcode >> 11) & 0x1f;
7256   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7257   mask = ip->insn_mo->mask;
7258 
7259   expr1.X_op = O_constant;
7260   expr1.X_op_symbol = NULL;
7261   expr1.X_add_symbol = NULL;
7262   expr1.X_add_number = 1;
7263 
7264   switch (mask)
7265     {
7266 #endif /* LOSING_COMPILER */
7267 
7268     case M_DMUL:
7269       dbl = 1;
7270     case M_MUL:
7271       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7272       macro_build (NULL, "mflo", "d", dreg);
7273       break;
7274 
7275     case M_DMUL_I:
7276       dbl = 1;
7277     case M_MUL_I:
7278       /* The MIPS assembler some times generates shifts and adds.  I'm
7279 	 not trying to be that fancy. GCC should do this for us
7280 	 anyway.  */
7281       used_at = 1;
7282       load_register (AT, &imm_expr, dbl);
7283       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7284       macro_build (NULL, "mflo", "d", dreg);
7285       break;
7286 
7287     case M_DMULO_I:
7288       dbl = 1;
7289     case M_MULO_I:
7290       imm = 1;
7291       goto do_mulo;
7292 
7293     case M_DMULO:
7294       dbl = 1;
7295     case M_MULO:
7296     do_mulo:
7297       start_noreorder ();
7298       used_at = 1;
7299       if (imm)
7300 	load_register (AT, &imm_expr, dbl);
7301       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7302       macro_build (NULL, "mflo", "d", dreg);
7303       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7304       macro_build (NULL, "mfhi", "d", AT);
7305       if (mips_trap)
7306 	macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7307       else
7308 	{
7309 	  expr1.X_add_number = 8;
7310 	  macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7311 	  macro_build (NULL, "nop", "", 0);
7312 	  macro_build (NULL, "break", "c", 6);
7313 	}
7314       end_noreorder ();
7315       macro_build (NULL, "mflo", "d", dreg);
7316       break;
7317 
7318     case M_DMULOU_I:
7319       dbl = 1;
7320     case M_MULOU_I:
7321       imm = 1;
7322       goto do_mulou;
7323 
7324     case M_DMULOU:
7325       dbl = 1;
7326     case M_MULOU:
7327     do_mulou:
7328       start_noreorder ();
7329       used_at = 1;
7330       if (imm)
7331 	load_register (AT, &imm_expr, dbl);
7332       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7333 		   sreg, imm ? AT : treg);
7334       macro_build (NULL, "mfhi", "d", AT);
7335       macro_build (NULL, "mflo", "d", dreg);
7336       if (mips_trap)
7337 	macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7338       else
7339 	{
7340 	  expr1.X_add_number = 8;
7341 	  macro_build (&expr1, "beq", "s,t,p", AT, 0);
7342 	  macro_build (NULL, "nop", "", 0);
7343 	  macro_build (NULL, "break", "c", 6);
7344 	}
7345       end_noreorder ();
7346       break;
7347 
7348     case M_DROL:
7349       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7350 	{
7351 	  if (dreg == sreg)
7352 	    {
7353 	      tempreg = AT;
7354 	      used_at = 1;
7355 	    }
7356 	  else
7357 	    {
7358 	      tempreg = dreg;
7359 	    }
7360 	  macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7361 	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7362 	  break;
7363 	}
7364       used_at = 1;
7365       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7366       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7367       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7368       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7369       break;
7370 
7371     case M_ROL:
7372       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7373 	{
7374 	  if (dreg == sreg)
7375 	    {
7376 	      tempreg = AT;
7377 	      used_at = 1;
7378 	    }
7379 	  else
7380 	    {
7381 	      tempreg = dreg;
7382 	    }
7383 	  macro_build (NULL, "negu", "d,w", tempreg, treg);
7384 	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7385 	  break;
7386 	}
7387       used_at = 1;
7388       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7389       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7390       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7391       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7392       break;
7393 
7394     case M_DROL_I:
7395       {
7396 	unsigned int rot;
7397 	char *l, *r;
7398 
7399 	if (imm_expr.X_op != O_constant)
7400 	  as_bad (_("Improper rotate count"));
7401 	rot = imm_expr.X_add_number & 0x3f;
7402 	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7403 	  {
7404 	    rot = (64 - rot) & 0x3f;
7405 	    if (rot >= 32)
7406 	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7407 	    else
7408 	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7409 	    break;
7410 	  }
7411 	if (rot == 0)
7412 	  {
7413 	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7414 	    break;
7415 	  }
7416 	l = (rot < 0x20) ? "dsll" : "dsll32";
7417 	r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7418 	rot &= 0x1f;
7419 	used_at = 1;
7420 	macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7421 	macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7422 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7423       }
7424       break;
7425 
7426     case M_ROL_I:
7427       {
7428 	unsigned int rot;
7429 
7430 	if (imm_expr.X_op != O_constant)
7431 	  as_bad (_("Improper rotate count"));
7432 	rot = imm_expr.X_add_number & 0x1f;
7433 	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7434 	  {
7435 	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7436 	    break;
7437 	  }
7438 	if (rot == 0)
7439 	  {
7440 	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7441 	    break;
7442 	  }
7443 	used_at = 1;
7444 	macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7445 	macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7446 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7447       }
7448       break;
7449 
7450     case M_DROR:
7451       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7452 	{
7453 	  macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7454 	  break;
7455 	}
7456       used_at = 1;
7457       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7458       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7459       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7460       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7461       break;
7462 
7463     case M_ROR:
7464       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7465 	{
7466 	  macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7467 	  break;
7468 	}
7469       used_at = 1;
7470       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7471       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7472       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7473       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7474       break;
7475 
7476     case M_DROR_I:
7477       {
7478 	unsigned int rot;
7479 	char *l, *r;
7480 
7481 	if (imm_expr.X_op != O_constant)
7482 	  as_bad (_("Improper rotate count"));
7483 	rot = imm_expr.X_add_number & 0x3f;
7484 	if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7485 	  {
7486 	    if (rot >= 32)
7487 	      macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7488 	    else
7489 	      macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7490 	    break;
7491 	  }
7492 	if (rot == 0)
7493 	  {
7494 	    macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7495 	    break;
7496 	  }
7497 	r = (rot < 0x20) ? "dsrl" : "dsrl32";
7498 	l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7499 	rot &= 0x1f;
7500 	used_at = 1;
7501 	macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7502 	macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7503 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7504       }
7505       break;
7506 
7507     case M_ROR_I:
7508       {
7509 	unsigned int rot;
7510 
7511 	if (imm_expr.X_op != O_constant)
7512 	  as_bad (_("Improper rotate count"));
7513 	rot = imm_expr.X_add_number & 0x1f;
7514 	if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7515 	  {
7516 	    macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7517 	    break;
7518 	  }
7519 	if (rot == 0)
7520 	  {
7521 	    macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7522 	    break;
7523 	  }
7524 	used_at = 1;
7525 	macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7526 	macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7527 	macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7528       }
7529       break;
7530 
7531     case M_S_DOB:
7532       if (mips_opts.arch == CPU_R4650)
7533 	{
7534 	  as_bad (_("opcode not supported on this processor"));
7535 	  break;
7536 	}
7537       assert (mips_opts.isa == ISA_MIPS1);
7538       /* Even on a big endian machine $fn comes before $fn+1.  We have
7539 	 to adjust when storing to memory.  */
7540       macro_build (&offset_expr, "swc1", "T,o(b)",
7541 		   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7542       offset_expr.X_add_number += 4;
7543       macro_build (&offset_expr, "swc1", "T,o(b)",
7544 		   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7545       break;
7546 
7547     case M_SEQ:
7548       if (sreg == 0)
7549 	macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7550       else if (treg == 0)
7551 	macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7552       else
7553 	{
7554 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7555 	  macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7556 	}
7557       break;
7558 
7559     case M_SEQ_I:
7560       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7561 	{
7562 	  macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7563 	  break;
7564 	}
7565       if (sreg == 0)
7566 	{
7567 	  as_warn (_("Instruction %s: result is always false"),
7568 		   ip->insn_mo->name);
7569 	  move_register (dreg, 0);
7570 	  break;
7571 	}
7572       if (imm_expr.X_op == O_constant
7573 	  && imm_expr.X_add_number >= 0
7574 	  && imm_expr.X_add_number < 0x10000)
7575 	{
7576 	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7577 	}
7578       else if (imm_expr.X_op == O_constant
7579 	       && imm_expr.X_add_number > -0x8000
7580 	       && imm_expr.X_add_number < 0)
7581 	{
7582 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7583 	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7584 		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7585 	}
7586       else
7587 	{
7588 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7589 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7590 	  used_at = 1;
7591 	}
7592       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7593       break;
7594 
7595     case M_SGE:		/* sreg >= treg <==> not (sreg < treg) */
7596       s = "slt";
7597       goto sge;
7598     case M_SGEU:
7599       s = "sltu";
7600     sge:
7601       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7602       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7603       break;
7604 
7605     case M_SGE_I:		/* sreg >= I <==> not (sreg < I) */
7606     case M_SGEU_I:
7607       if (imm_expr.X_op == O_constant
7608 	  && imm_expr.X_add_number >= -0x8000
7609 	  && imm_expr.X_add_number < 0x8000)
7610 	{
7611 	  macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7612 		       dreg, sreg, BFD_RELOC_LO16);
7613 	}
7614       else
7615 	{
7616 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7617 	  macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7618 		       dreg, sreg, AT);
7619 	  used_at = 1;
7620 	}
7621       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7622       break;
7623 
7624     case M_SGT:		/* sreg > treg  <==>  treg < sreg */
7625       s = "slt";
7626       goto sgt;
7627     case M_SGTU:
7628       s = "sltu";
7629     sgt:
7630       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7631       break;
7632 
7633     case M_SGT_I:		/* sreg > I  <==>  I < sreg */
7634       s = "slt";
7635       goto sgti;
7636     case M_SGTU_I:
7637       s = "sltu";
7638     sgti:
7639       used_at = 1;
7640       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7641       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7642       break;
7643 
7644     case M_SLE:	/* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7645       s = "slt";
7646       goto sle;
7647     case M_SLEU:
7648       s = "sltu";
7649     sle:
7650       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7651       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7652       break;
7653 
7654     case M_SLE_I:	/* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7655       s = "slt";
7656       goto slei;
7657     case M_SLEU_I:
7658       s = "sltu";
7659     slei:
7660       used_at = 1;
7661       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7662       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7663       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7664       break;
7665 
7666     case M_SLT_I:
7667       if (imm_expr.X_op == O_constant
7668 	  && imm_expr.X_add_number >= -0x8000
7669 	  && imm_expr.X_add_number < 0x8000)
7670 	{
7671 	  macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7672 	  break;
7673 	}
7674       used_at = 1;
7675       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7676       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7677       break;
7678 
7679     case M_SLTU_I:
7680       if (imm_expr.X_op == O_constant
7681 	  && imm_expr.X_add_number >= -0x8000
7682 	  && imm_expr.X_add_number < 0x8000)
7683 	{
7684 	  macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7685 		       BFD_RELOC_LO16);
7686 	  break;
7687 	}
7688       used_at = 1;
7689       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7690       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7691       break;
7692 
7693     case M_SNE:
7694       if (sreg == 0)
7695 	macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7696       else if (treg == 0)
7697 	macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7698       else
7699 	{
7700 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7701 	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7702 	}
7703       break;
7704 
7705     case M_SNE_I:
7706       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7707 	{
7708 	  macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7709 	  break;
7710 	}
7711       if (sreg == 0)
7712 	{
7713 	  as_warn (_("Instruction %s: result is always true"),
7714 		   ip->insn_mo->name);
7715 	  macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7716 		       dreg, 0, BFD_RELOC_LO16);
7717 	  break;
7718 	}
7719       if (imm_expr.X_op == O_constant
7720 	  && imm_expr.X_add_number >= 0
7721 	  && imm_expr.X_add_number < 0x10000)
7722 	{
7723 	  macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7724 	}
7725       else if (imm_expr.X_op == O_constant
7726 	       && imm_expr.X_add_number > -0x8000
7727 	       && imm_expr.X_add_number < 0)
7728 	{
7729 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7730 	  macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7731 		       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7732 	}
7733       else
7734 	{
7735 	  load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7736 	  macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7737 	  used_at = 1;
7738 	}
7739       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7740       break;
7741 
7742     case M_DSUB_I:
7743       dbl = 1;
7744     case M_SUB_I:
7745       if (imm_expr.X_op == O_constant
7746 	  && imm_expr.X_add_number > -0x8000
7747 	  && imm_expr.X_add_number <= 0x8000)
7748 	{
7749 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7750 	  macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7751 		       dreg, sreg, BFD_RELOC_LO16);
7752 	  break;
7753 	}
7754       used_at = 1;
7755       load_register (AT, &imm_expr, dbl);
7756       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7757       break;
7758 
7759     case M_DSUBU_I:
7760       dbl = 1;
7761     case M_SUBU_I:
7762       if (imm_expr.X_op == O_constant
7763 	  && imm_expr.X_add_number > -0x8000
7764 	  && imm_expr.X_add_number <= 0x8000)
7765 	{
7766 	  imm_expr.X_add_number = -imm_expr.X_add_number;
7767 	  macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7768 		       dreg, sreg, BFD_RELOC_LO16);
7769 	  break;
7770 	}
7771       used_at = 1;
7772       load_register (AT, &imm_expr, dbl);
7773       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7774       break;
7775 
7776     case M_TEQ_I:
7777       s = "teq";
7778       goto trap;
7779     case M_TGE_I:
7780       s = "tge";
7781       goto trap;
7782     case M_TGEU_I:
7783       s = "tgeu";
7784       goto trap;
7785     case M_TLT_I:
7786       s = "tlt";
7787       goto trap;
7788     case M_TLTU_I:
7789       s = "tltu";
7790       goto trap;
7791     case M_TNE_I:
7792       s = "tne";
7793     trap:
7794       used_at = 1;
7795       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7796       macro_build (NULL, s, "s,t", sreg, AT);
7797       break;
7798 
7799     case M_TRUNCWS:
7800     case M_TRUNCWD:
7801       if (mips_opts.arch == CPU_OCTEON && octeon_error_on_unsupported)
7802         {
7803           as_bad (_("opcode not implemented in Octeon `%s'"), ip->insn_mo->name);
7804           return;
7805         }
7806       assert (mips_opts.isa == ISA_MIPS1);
7807       used_at = 1;
7808       sreg = (ip->insn_opcode >> 11) & 0x1f;	/* floating reg */
7809       dreg = (ip->insn_opcode >> 06) & 0x1f;	/* floating reg */
7810 
7811       /*
7812        * Is the double cfc1 instruction a bug in the mips assembler;
7813        * or is there a reason for it?
7814        */
7815       start_noreorder ();
7816       macro_build (NULL, "cfc1", "t,G", treg, RA);
7817       macro_build (NULL, "cfc1", "t,G", treg, RA);
7818       macro_build (NULL, "nop", "");
7819       expr1.X_add_number = 3;
7820       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7821       expr1.X_add_number = 2;
7822       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7823       macro_build (NULL, "ctc1", "t,G", AT, RA);
7824       macro_build (NULL, "nop", "");
7825       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7826 		   dreg, sreg);
7827       macro_build (NULL, "ctc1", "t,G", treg, RA);
7828       macro_build (NULL, "nop", "");
7829       end_noreorder ();
7830       break;
7831 
7832     case M_ULH:
7833       s = "lb";
7834       goto ulh;
7835     case M_ULHU:
7836       s = "lbu";
7837     ulh:
7838       used_at = 1;
7839       if (offset_expr.X_add_number >= 0x7fff)
7840 	as_bad (_("operand overflow"));
7841       /* Expand the ulh to "lb, lbu, ins" instead of "lb, lbu, sll, ori". */
7842       if (! target_big_endian)
7843 	++offset_expr.X_add_number;
7844       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7845       if (! target_big_endian)
7846 	--offset_expr.X_add_number;
7847       else
7848 	++offset_expr.X_add_number;
7849       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7850       if (ISA_HAS_INS (mips_opts.isa))
7851 	macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31);
7852       else
7853 	{
7854           macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7855           macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7856 	}
7857       break;
7858 
7859     case M_ULD:
7860       s = "ldl";
7861       s2 = "ldr";
7862       off = 7;
7863       goto ulw;
7864     case M_ULW:
7865       s = "lwl";
7866       s2 = "lwr";
7867       off = 3;
7868     ulw:
7869       if (offset_expr.X_add_number >= 0x8000 - off)
7870 	as_bad (_("operand overflow"));
7871       if (treg != breg)
7872 	tempreg = treg;
7873       else
7874 	{
7875 	  used_at = 1;
7876 	  tempreg = AT;
7877 	}
7878 
7879       /* For small variables the compiler uses gp_rel to load the value of
7880 	 the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
7881 	 the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
7882 	 type while emitting instructions otherwise use BFD_RELOC_LO16.  */
7883       if (offset_reloc[0] == BFD_RELOC_UNUSED)
7884 	offset_reloc[0] = BFD_RELOC_LO16;
7885 
7886       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
7887 	{
7888 	  /* Reset used_at as tempreg is not used while generating Octeon
7889 	     unaligned load/store.  */
7890 	  used_at = 0;
7891 	  macro_build (&offset_expr, (mask == M_ULW ? "ulw" : "uld"), "t,o(b)",
7892 		       treg, offset_reloc[0], breg);
7893 	  break;
7894 	}
7895 
7896       if (! target_big_endian)
7897 	offset_expr.X_add_number += off;
7898       macro_build (&offset_expr, s, "t,o(b)", tempreg, offset_reloc[0], breg);
7899       if (! target_big_endian)
7900 	offset_expr.X_add_number -= off;
7901       else
7902 	offset_expr.X_add_number += off;
7903       macro_build (&offset_expr, s2, "t,o(b)", tempreg, offset_reloc[0], breg);
7904 
7905       /* If necessary, move the result in tempreg the final destination.  */
7906       if (treg == tempreg)
7907         break;
7908       /* Protect second load's delay slot.  */
7909       load_delay_nop ();
7910       move_register (treg, tempreg);
7911       break;
7912 
7913     case M_ULD_A:
7914       s = "ldl";
7915       s2 = "ldr";
7916       off = 7;
7917       goto ulwa;
7918     case M_ULW_A:
7919       s = "lwl";
7920       s2 = "lwr";
7921       off = 3;
7922     ulwa:
7923       used_at = 1;
7924       load_address (AT, &offset_expr, &used_at);
7925       if (breg != 0)
7926 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7927 
7928       /* For small variables the compiler uses gp_rel to load the value of
7929 	 the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
7930 	 the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
7931 	 type while emitting instructions otherwise use BFD_RELOC_LO16.  */
7932       if (offset_reloc[0] == BFD_RELOC_UNUSED)
7933 	offset_reloc[0] = BFD_RELOC_LO16;
7934 
7935       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
7936 	{
7937 	  macro_build (&offset_expr, (mask == M_ULW_A ? "ulw" : "uld"),
7938 		       "t,o(b)", treg, offset_reloc[0], AT);
7939 	  break;
7940 	}
7941 
7942       if (! target_big_endian)
7943 	expr1.X_add_number = off;
7944       else
7945 	expr1.X_add_number = 0;
7946       macro_build (&expr1, s, "t,o(b)", treg, offset_reloc[0], AT);
7947       if (! target_big_endian)
7948 	expr1.X_add_number = 0;
7949       else
7950 	expr1.X_add_number = off;
7951       macro_build (&expr1, s2, "t,o(b)", treg, offset_reloc[0], AT);
7952       break;
7953 
7954     case M_ULH_A:
7955     case M_ULHU_A:
7956       used_at = 1;
7957       load_address (AT, &offset_expr, &used_at);
7958       if (breg != 0)
7959 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7960 
7961       if (ISA_HAS_INS (mips_opts.isa))
7962 	{
7963 	  if (target_big_endian)
7964 	    expr1.X_add_number = 1;
7965 	  else
7966 	    expr1.X_add_number = 0;
7967 	  macro_build (&expr1, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7968 	  if (target_big_endian)
7969 	    expr1.X_add_number = 0;
7970 	  else
7971 	    expr1.X_add_number = 1;
7972 	  macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7973 		       AT, BFD_RELOC_LO16, AT);
7974 	  macro_build (NULL, "ins", "t,r,+A,+B", treg, AT, 8, 31);
7975 	  break;
7976 	}
7977       if (target_big_endian)
7978 	expr1.X_add_number = 0;
7979       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7980 		   treg, BFD_RELOC_LO16, AT);
7981       if (target_big_endian)
7982 	expr1.X_add_number = 1;
7983       else
7984 	expr1.X_add_number = 0;
7985       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7986       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7987       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7988       break;
7989 
7990     case M_USH:
7991       used_at = 1;
7992       if (offset_expr.X_add_number >= 0x7fff)
7993 	as_bad (_("operand overflow"));
7994       if (target_big_endian)
7995 	++offset_expr.X_add_number;
7996       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7997       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7998       if (target_big_endian)
7999 	--offset_expr.X_add_number;
8000       else
8001 	++offset_expr.X_add_number;
8002       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8003       break;
8004 
8005     case M_USD:
8006       s = "sdl";
8007       s2 = "sdr";
8008       off = 7;
8009       goto usw;
8010     case M_USW:
8011       s = "swl";
8012       s2 = "swr";
8013       off = 3;
8014     usw:
8015       if (offset_expr.X_add_number >= 0x8000 - off)
8016 	as_bad (_("operand overflow"));
8017 
8018       /* For small variables the compiler uses gp_rel to load the value of
8019 	 the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
8020 	 the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
8021 	 type while emitting instructions otherwise use BFD_RELOC_LO16.  */
8022       if (offset_reloc[0] == BFD_RELOC_UNUSED)
8023 	offset_reloc[0] = BFD_RELOC_LO16;
8024 
8025       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
8026 	{
8027 	  macro_build (&offset_expr, (mask == M_USD ? "usd" : "usw"),
8028 		       "t,o(b)", treg, offset_reloc[0], breg);
8029 	  break;
8030 	}
8031       if (! target_big_endian)
8032 	offset_expr.X_add_number += off;
8033       macro_build (&offset_expr, s, "t,o(b)", treg, offset_reloc[0], breg);
8034       if (! target_big_endian)
8035 	offset_expr.X_add_number -= off;
8036       else
8037 	offset_expr.X_add_number += off;
8038       macro_build (&offset_expr, s2, "t,o(b)", treg, offset_reloc[0], breg);
8039       break;
8040 
8041     case M_USD_A:
8042       s = "sdl";
8043       s2 = "sdr";
8044       off = 7;
8045       goto uswa;
8046     case M_USW_A:
8047       s = "swl";
8048       s2 = "swr";
8049       off = 3;
8050     uswa:
8051       used_at = 1;
8052       load_address (AT, &offset_expr, &used_at);
8053       if (breg != 0)
8054 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8055 
8056       /* For small variables the compiler uses gp_rel to load the value of
8057 	 the variables. While parsing instructions "uld $2,%gp_rel(var)($28)"
8058 	 the offset_reloc[0] is set to BFD_RELOC_GPREL16. Use this relocation
8059 	 type while emitting instructions otherwise use BFD_RELOC_LO16.  */
8060       if (offset_reloc[0] == BFD_RELOC_UNUSED)
8061 	offset_reloc[0] = BFD_RELOC_LO16;
8062 
8063       if (octeon_use_unalign && mips_opts.arch == CPU_OCTEON)
8064 	{
8065 	  macro_build (&offset_expr, (mask == M_USW_A ? "usw" : "usd"),
8066 		       "t,o(b)", treg, offset_reloc[0], AT);
8067 	  break;
8068 	}
8069       if (! target_big_endian)
8070 	expr1.X_add_number = off;
8071       else
8072 	expr1.X_add_number = 0;
8073       macro_build (&expr1, s, "t,o(b)", treg, offset_reloc[0], AT);
8074       if (! target_big_endian)
8075 	expr1.X_add_number = 0;
8076       else
8077 	expr1.X_add_number = off;
8078       macro_build (&expr1, s2, "t,o(b)", treg, offset_reloc[0], AT);
8079       break;
8080 
8081     case M_USH_A:
8082       used_at = 1;
8083       load_address (AT, &offset_expr, &used_at);
8084       if (breg != 0)
8085 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8086       if (! target_big_endian)
8087 	expr1.X_add_number = 0;
8088       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8089       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8090       if (! target_big_endian)
8091 	expr1.X_add_number = 1;
8092       else
8093 	expr1.X_add_number = 0;
8094       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8095       if (! target_big_endian)
8096 	expr1.X_add_number = 0;
8097       else
8098 	expr1.X_add_number = 1;
8099       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8100       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8101       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8102       break;
8103 
8104     default:
8105       /* FIXME: Check if this is one of the itbl macros, since they
8106 	 are added dynamically.  */
8107       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8108       break;
8109     }
8110   if (mips_opts.noat && used_at)
8111     as_bad (_("Macro used $at after \".set noat\""));
8112 }
8113 
8114 /* Implement macros in mips16 mode.  */
8115 
8116 static void
mips16_macro(struct mips_cl_insn * ip)8117 mips16_macro (struct mips_cl_insn *ip)
8118 {
8119   int mask;
8120   int xreg, yreg, zreg, tmp;
8121   expressionS expr1;
8122   int dbl;
8123   const char *s, *s2, *s3;
8124 
8125   mask = ip->insn_mo->mask;
8126 
8127   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8128   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8129   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8130 
8131   expr1.X_op = O_constant;
8132   expr1.X_op_symbol = NULL;
8133   expr1.X_add_symbol = NULL;
8134   expr1.X_add_number = 1;
8135 
8136   dbl = 0;
8137 
8138   switch (mask)
8139     {
8140     default:
8141       internalError ();
8142 
8143     case M_DDIV_3:
8144       dbl = 1;
8145     case M_DIV_3:
8146       s = "mflo";
8147       goto do_div3;
8148     case M_DREM_3:
8149       dbl = 1;
8150     case M_REM_3:
8151       s = "mfhi";
8152     do_div3:
8153       start_noreorder ();
8154       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8155       expr1.X_add_number = 2;
8156       macro_build (&expr1, "bnez", "x,p", yreg);
8157       macro_build (NULL, "break", "6", 7);
8158 
8159       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8160          since that causes an overflow.  We should do that as well,
8161          but I don't see how to do the comparisons without a temporary
8162          register.  */
8163       end_noreorder ();
8164       macro_build (NULL, s, "x", zreg);
8165       break;
8166 
8167     case M_DIVU_3:
8168       s = "divu";
8169       s2 = "mflo";
8170       goto do_divu3;
8171     case M_REMU_3:
8172       s = "divu";
8173       s2 = "mfhi";
8174       goto do_divu3;
8175     case M_DDIVU_3:
8176       s = "ddivu";
8177       s2 = "mflo";
8178       goto do_divu3;
8179     case M_DREMU_3:
8180       s = "ddivu";
8181       s2 = "mfhi";
8182     do_divu3:
8183       start_noreorder ();
8184       macro_build (NULL, s, "0,x,y", xreg, yreg);
8185       expr1.X_add_number = 2;
8186       macro_build (&expr1, "bnez", "x,p", yreg);
8187       macro_build (NULL, "break", "6", 7);
8188       end_noreorder ();
8189       macro_build (NULL, s2, "x", zreg);
8190       break;
8191 
8192     case M_DMUL:
8193       dbl = 1;
8194     case M_MUL:
8195       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8196       macro_build (NULL, "mflo", "x", zreg);
8197       break;
8198 
8199     case M_DSUBU_I:
8200       dbl = 1;
8201       goto do_subu;
8202     case M_SUBU_I:
8203     do_subu:
8204       if (imm_expr.X_op != O_constant)
8205 	as_bad (_("Unsupported large constant"));
8206       imm_expr.X_add_number = -imm_expr.X_add_number;
8207       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8208       break;
8209 
8210     case M_SUBU_I_2:
8211       if (imm_expr.X_op != O_constant)
8212 	as_bad (_("Unsupported large constant"));
8213       imm_expr.X_add_number = -imm_expr.X_add_number;
8214       macro_build (&imm_expr, "addiu", "x,k", xreg);
8215       break;
8216 
8217     case M_DSUBU_I_2:
8218       if (imm_expr.X_op != O_constant)
8219 	as_bad (_("Unsupported large constant"));
8220       imm_expr.X_add_number = -imm_expr.X_add_number;
8221       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8222       break;
8223 
8224     case M_BEQ:
8225       s = "cmp";
8226       s2 = "bteqz";
8227       goto do_branch;
8228     case M_BNE:
8229       s = "cmp";
8230       s2 = "btnez";
8231       goto do_branch;
8232     case M_BLT:
8233       s = "slt";
8234       s2 = "btnez";
8235       goto do_branch;
8236     case M_BLTU:
8237       s = "sltu";
8238       s2 = "btnez";
8239       goto do_branch;
8240     case M_BLE:
8241       s = "slt";
8242       s2 = "bteqz";
8243       goto do_reverse_branch;
8244     case M_BLEU:
8245       s = "sltu";
8246       s2 = "bteqz";
8247       goto do_reverse_branch;
8248     case M_BGE:
8249       s = "slt";
8250       s2 = "bteqz";
8251       goto do_branch;
8252     case M_BGEU:
8253       s = "sltu";
8254       s2 = "bteqz";
8255       goto do_branch;
8256     case M_BGT:
8257       s = "slt";
8258       s2 = "btnez";
8259       goto do_reverse_branch;
8260     case M_BGTU:
8261       s = "sltu";
8262       s2 = "btnez";
8263 
8264     do_reverse_branch:
8265       tmp = xreg;
8266       xreg = yreg;
8267       yreg = tmp;
8268 
8269     do_branch:
8270       macro_build (NULL, s, "x,y", xreg, yreg);
8271       macro_build (&offset_expr, s2, "p");
8272       break;
8273 
8274     case M_BEQ_I:
8275       s = "cmpi";
8276       s2 = "bteqz";
8277       s3 = "x,U";
8278       goto do_branch_i;
8279     case M_BNE_I:
8280       s = "cmpi";
8281       s2 = "btnez";
8282       s3 = "x,U";
8283       goto do_branch_i;
8284     case M_BLT_I:
8285       s = "slti";
8286       s2 = "btnez";
8287       s3 = "x,8";
8288       goto do_branch_i;
8289     case M_BLTU_I:
8290       s = "sltiu";
8291       s2 = "btnez";
8292       s3 = "x,8";
8293       goto do_branch_i;
8294     case M_BLE_I:
8295       s = "slti";
8296       s2 = "btnez";
8297       s3 = "x,8";
8298       goto do_addone_branch_i;
8299     case M_BLEU_I:
8300       s = "sltiu";
8301       s2 = "btnez";
8302       s3 = "x,8";
8303       goto do_addone_branch_i;
8304     case M_BGE_I:
8305       s = "slti";
8306       s2 = "bteqz";
8307       s3 = "x,8";
8308       goto do_branch_i;
8309     case M_BGEU_I:
8310       s = "sltiu";
8311       s2 = "bteqz";
8312       s3 = "x,8";
8313       goto do_branch_i;
8314     case M_BGT_I:
8315       s = "slti";
8316       s2 = "bteqz";
8317       s3 = "x,8";
8318       goto do_addone_branch_i;
8319     case M_BGTU_I:
8320       s = "sltiu";
8321       s2 = "bteqz";
8322       s3 = "x,8";
8323 
8324     do_addone_branch_i:
8325       if (imm_expr.X_op != O_constant)
8326 	as_bad (_("Unsupported large constant"));
8327       ++imm_expr.X_add_number;
8328 
8329     do_branch_i:
8330       macro_build (&imm_expr, s, s3, xreg);
8331       macro_build (&offset_expr, s2, "p");
8332       break;
8333 
8334     case M_ABS:
8335       expr1.X_add_number = 0;
8336       macro_build (&expr1, "slti", "x,8", yreg);
8337       if (xreg != yreg)
8338 	move_register (xreg, yreg);
8339       expr1.X_add_number = 2;
8340       macro_build (&expr1, "bteqz", "p");
8341       macro_build (NULL, "neg", "x,w", xreg, xreg);
8342     }
8343 }
8344 
8345 /* For consistency checking, verify that all bits are specified either
8346    by the match/mask part of the instruction definition, or by the
8347    operand list.  */
8348 static int
validate_mips_insn(const struct mips_opcode * opc)8349 validate_mips_insn (const struct mips_opcode *opc)
8350 {
8351   const char *p = opc->args;
8352   char c;
8353   unsigned long used_bits = opc->mask;
8354 
8355   if ((used_bits & opc->match) != opc->match)
8356     {
8357       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8358 	      opc->name, opc->args);
8359       return 0;
8360     }
8361 #define USE_BITS(mask,shift)	(used_bits |= ((mask) << (shift)))
8362   while (*p)
8363     switch (c = *p++)
8364       {
8365       case ',': break;
8366       case '(': break;
8367       case ')': break;
8368       case '^': USE_BITS (OP_MASK_BITIND,       OP_SH_BITIND);   break;
8369       case '~': USE_BITS (OP_MASK_BITIND,       OP_SH_BITIND);   break;
8370       case '+':
8371     	switch (c = *p++)
8372 	  {
8373 	  case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1); 	break;
8374 	  case '2': USE_BITS (OP_MASK_UDI2,	OP_SH_UDI2); 	break;
8375 	  case '3': USE_BITS (OP_MASK_UDI3,	OP_SH_UDI3); 	break;
8376 	  case '4': USE_BITS (OP_MASK_UDI4,	OP_SH_UDI4); 	break;
8377 	  case 'A': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8378 	  case 'B': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
8379 	  case 'C': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8380 	  case 'D': USE_BITS (OP_MASK_RD,	OP_SH_RD);
8381 		    USE_BITS (OP_MASK_SEL,	OP_SH_SEL);	break;
8382 	  case 'E': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8383 	  case 'F': USE_BITS (OP_MASK_INSMSB,	OP_SH_INSMSB);	break;
8384 	  case 'G': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8385 	  case 'H': USE_BITS (OP_MASK_EXTMSBD,	OP_SH_EXTMSBD);	break;
8386 	  case 'I': break;
8387 	  case 't': USE_BITS (OP_MASK_RT,	OP_SH_RT);	break;
8388 	  case 'T': USE_BITS (OP_MASK_RT,	OP_SH_RT);
8389 		    USE_BITS (OP_MASK_SEL,	OP_SH_SEL);	break;
8390 	  default:
8391 	    as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8392 		    c, opc->name, opc->args);
8393 	    return 0;
8394 	  }
8395 	break;
8396       case '<': USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8397       case '>':	USE_BITS (OP_MASK_SHAMT,	OP_SH_SHAMT);	break;
8398       case 'A': break;
8399       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8400       case 'C':	USE_BITS (OP_MASK_COPZ,		OP_SH_COPZ);	break;
8401       case 'D':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
8402       case 'E':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8403       case 'F': break;
8404       case 'G':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8405       case 'H': USE_BITS (OP_MASK_SEL,		OP_SH_SEL);	break;
8406       case 'I': break;
8407       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8408       case 'K':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8409       case 'L': break;
8410       case 'M':	USE_BITS (OP_MASK_CCC,		OP_SH_CCC);	break;
8411       case 'N':	USE_BITS (OP_MASK_BCC,		OP_SH_BCC);	break;
8412       case 'O':	USE_BITS (OP_MASK_ALN,		OP_SH_ALN);	break;
8413       case 'Q':	USE_BITS (OP_MASK_VSEL,		OP_SH_VSEL);
8414 		USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8415       case 'R':	USE_BITS (OP_MASK_FR,		OP_SH_FR);	break;
8416       case 'S':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8417       case 'T':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8418       case 'V':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8419       case 'W':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8420       case 'X':	USE_BITS (OP_MASK_FD,		OP_SH_FD);	break;
8421       case 'Y':	USE_BITS (OP_MASK_FS,		OP_SH_FS);	break;
8422       case 'Z':	USE_BITS (OP_MASK_FT,		OP_SH_FT);	break;
8423       case 'a':	USE_BITS (OP_MASK_TARGET,	OP_SH_TARGET);	break;
8424       case 'b':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8425       case 'c':	USE_BITS (OP_MASK_CODE,		OP_SH_CODE);	break;
8426       case 'd':	USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8427       case 'f': break;
8428       case 'h':	USE_BITS (OP_MASK_PREFX,	OP_SH_PREFX);	break;
8429       case 'i':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8430       case 'j':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8431       case 'k':	USE_BITS (OP_MASK_CACHE,	OP_SH_CACHE);	break;
8432       case 'l': break;
8433       case 'o': USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8434       case 'p':	USE_BITS (OP_MASK_DELTA,	OP_SH_DELTA);	break;
8435       case 'q':	USE_BITS (OP_MASK_CODE2,	OP_SH_CODE2);	break;
8436       case 'r': USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8437       case 's':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8438       case 't':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8439       case 'u':	USE_BITS (OP_MASK_IMMEDIATE,	OP_SH_IMMEDIATE); break;
8440       case 'v':	USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8441       case 'w':	USE_BITS (OP_MASK_RT,		OP_SH_RT);	break;
8442       case 'x': break;
8443       case 'y': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8444       case 'z': break;
8445       case 'P': USE_BITS (OP_MASK_PERFREG,	OP_SH_PERFREG);	break;
8446       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8447 	        USE_BITS (OP_MASK_RT,           OP_SH_RT);	break;
8448       case 'e': USE_BITS (OP_MASK_VECBYTE,	OP_SH_VECBYTE);	break;
8449       case '%': USE_BITS (OP_MASK_VECALIGN,	OP_SH_VECALIGN); break;
8450       case '[': break;
8451       case ']': break;
8452       case '2': USE_BITS (OP_MASK_BP,		OP_SH_BP);	break;
8453       case '3': USE_BITS (OP_MASK_SA3,  	OP_SH_SA3);	break;
8454       case '4': USE_BITS (OP_MASK_SA4,  	OP_SH_SA4);	break;
8455       case '5': USE_BITS (OP_MASK_IMM8, 	OP_SH_IMM8);	break;
8456       case '6': USE_BITS (OP_MASK_RS,		OP_SH_RS);	break;
8457       case '7': USE_BITS (OP_MASK_DSPACC,	OP_SH_DSPACC);	break;
8458       case '8': USE_BITS (OP_MASK_WRDSP,	OP_SH_WRDSP);	break;
8459       case '9': USE_BITS (OP_MASK_DSPACC_S,	OP_SH_DSPACC_S);break;
8460       case '0': USE_BITS (OP_MASK_DSPSFT,	OP_SH_DSPSFT);	break;
8461       case '\'': USE_BITS (OP_MASK_RDDSP,	OP_SH_RDDSP);	break;
8462       case ':': USE_BITS (OP_MASK_DSPSFT_7,	OP_SH_DSPSFT_7);break;
8463       case '@': USE_BITS (OP_MASK_IMM10,	OP_SH_IMM10);	break;
8464       case '!': USE_BITS (OP_MASK_MT_U,		OP_SH_MT_U);	break;
8465       case '$': USE_BITS (OP_MASK_MT_H,		OP_SH_MT_H);	break;
8466       case '*': USE_BITS (OP_MASK_MTACC_T,	OP_SH_MTACC_T);	break;
8467       case '&': USE_BITS (OP_MASK_MTACC_D,	OP_SH_MTACC_D);	break;
8468       case 'g': USE_BITS (OP_MASK_RD,		OP_SH_RD);	break;
8469       default:
8470 	as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8471 		c, opc->name, opc->args);
8472 	return 0;
8473       }
8474 #undef USE_BITS
8475   if (used_bits != 0xffffffff)
8476     {
8477       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8478 	      ~used_bits & 0xffffffff, opc->name, opc->args);
8479       return 0;
8480     }
8481   return 1;
8482 }
8483 
8484 /* UDI immediates.  */
8485 struct mips_immed {
8486   char		type;
8487   unsigned int	shift;
8488   unsigned long	mask;
8489   const char *	desc;
8490 };
8491 
8492 static const struct mips_immed mips_immed[] = {
8493   { '1',	OP_SH_UDI1,	OP_MASK_UDI1,		0},
8494   { '2',	OP_SH_UDI2,	OP_MASK_UDI2,		0},
8495   { '3',	OP_SH_UDI3,	OP_MASK_UDI3,		0},
8496   { '4',	OP_SH_UDI4,	OP_MASK_UDI4,		0},
8497   { 0,0,0,0 }
8498 };
8499 
8500 /* Check whether an odd floating-point register is allowed.  */
8501 static int
mips_oddfpreg_ok(const struct mips_opcode * insn,int argnum)8502 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8503 {
8504   const char *s = insn->name;
8505 
8506   if (insn->pinfo == INSN_MACRO)
8507     /* Let a macro pass, we'll catch it later when it is expanded.  */
8508     return 1;
8509 
8510   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8511     {
8512       /* Allow odd registers for single-precision ops.  */
8513       switch (insn->pinfo & (FP_S | FP_D))
8514 	{
8515 	case FP_S:
8516 	case 0:
8517 	  return 1;	/* both single precision - ok */
8518 	case FP_D:
8519 	  return 0;	/* both double precision - fail */
8520 	default:
8521 	  break;
8522 	}
8523 
8524       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8525       s = strchr (insn->name, '.');
8526       if (argnum == 2)
8527 	s = s != NULL ? strchr (s + 1, '.') : NULL;
8528       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8529     }
8530 
8531   /* Single-precision coprocessor loads and moves are OK too.  */
8532   if ((insn->pinfo & FP_S)
8533       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8534 			 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8535     return 1;
8536 
8537   return 0;
8538 }
8539 
8540 /* This routine assembles an instruction into its binary format.  As a
8541    side effect, it sets one of the global variables imm_reloc or
8542    offset_reloc to the type of relocation to do if one of the operands
8543    is an address expression.  */
8544 
8545 static void
mips_ip(char * str,struct mips_cl_insn * ip)8546 mips_ip (char *str, struct mips_cl_insn *ip)
8547 {
8548   char *s;
8549   const char *args;
8550   char c = 0;
8551   struct mips_opcode *insn;
8552   char *argsStart;
8553   unsigned int regno;
8554   unsigned int lastregno = 0;
8555   unsigned int lastpos = 0;
8556   unsigned int limlo, limhi;
8557   char *s_reset;
8558   char save_c = 0;
8559   offsetT min_range, max_range;
8560   int argnum;
8561   unsigned int rtype;
8562 
8563   insn_error = NULL;
8564 
8565   /* If the instruction contains a '.', we first try to match an instruction
8566      including the '.'.  Then we try again without the '.'.  */
8567   insn = NULL;
8568   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8569     continue;
8570 
8571   /* If we stopped on whitespace, then replace the whitespace with null for
8572      the call to hash_find.  Save the character we replaced just in case we
8573      have to re-parse the instruction.  */
8574   if (ISSPACE (*s))
8575     {
8576       save_c = *s;
8577       *s++ = '\0';
8578     }
8579 
8580   insn = (struct mips_opcode *) hash_find (op_hash, str);
8581 
8582   /* If we didn't find the instruction in the opcode table, try again, but
8583      this time with just the instruction up to, but not including the
8584      first '.'.  */
8585   if (insn == NULL)
8586     {
8587       /* Restore the character we overwrite above (if any).  */
8588       if (save_c)
8589 	*(--s) = save_c;
8590 
8591       /* Scan up to the first '.' or whitespace.  */
8592       for (s = str;
8593 	   *s != '\0' && *s != '.' && !ISSPACE (*s);
8594 	   ++s)
8595 	continue;
8596 
8597       /* If we did not find a '.', then we can quit now.  */
8598       if (*s != '.')
8599 	{
8600 	  insn_error = "unrecognized opcode";
8601 	  return;
8602 	}
8603 
8604       /* Lookup the instruction in the hash table.  */
8605       *s++ = '\0';
8606       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8607 	{
8608 	  insn_error = "unrecognized opcode";
8609 	  return;
8610 	}
8611     }
8612 
8613   argsStart = s;
8614   for (;;)
8615     {
8616       bfd_boolean ok;
8617 
8618       assert (strcmp (insn->name, str) == 0);
8619 
8620       if (OPCODE_IS_MEMBER (insn,
8621 			    (mips_opts.isa
8622 			     /* We don't check for mips_opts.mips16 here since
8623 			        we want to allow jalx if -mips16 was specified
8624 			        on the command line.  */
8625 			     | (file_ase_mips16 ? INSN_MIPS16 : 0)
8626 	      		     | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8627 	      		     | (mips_opts.ase_dsp ? INSN_DSP : 0)
8628 	      		     | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8629 				? INSN_DSP64 : 0)
8630 	      		     | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8631 	      		     | (mips_opts.ase_mt ? INSN_MT : 0)
8632 			     | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8633 			     | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8634 			    mips_opts.arch))
8635 	ok = TRUE;
8636       else
8637 	ok = FALSE;
8638 
8639       if (insn->pinfo != INSN_MACRO)
8640 	{
8641 	  if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8642 	    ok = FALSE;
8643 
8644 	  if (mips_opts.arch == CPU_OCTEON
8645 	      && octeon_error_on_unsupported
8646 	      && ((insn->pinfo & FP_D) != 0
8647 	          || (insn->pinfo & FP_S) !=0
8648 	          || strcmp (insn->name, "prefx") == 0))
8649 	    {
8650 	      insn_error = "opcode not implemented in Octeon";
8651 	      return;
8652 	    }
8653 
8654 	  if (mips_opts.arch == CPU_OCTEON
8655 	      && octeon_error_on_unsupported
8656 	      && (strcmp (insn->name, "swc2") == 0
8657 		  || strcmp (insn->name, "lwc2") == 0
8658 		  || strcmp (insn->name, "sdc2") == 0
8659 		  || strcmp (insn->name, "ldc2") == 0
8660 		  || strcmp (insn->name, "bc2f") == 0
8661 		  || strcmp (insn->name, "bc2t") == 0
8662 		  || strcmp (insn->name, "mfc2") == 0
8663 		  || strcmp (insn->name, "mtc2") == 0
8664 		  || strcmp (insn->name, "ctc2") == 0
8665 		  || strcmp (insn->name, "cfc2") == 0
8666 		  || strcmp (insn->name, "mfhc2") == 0
8667 		  || strcmp (insn->name, "mthc2") == 0))
8668 	    {
8669 	      insn_error = "opcode not implemented in Octeon";
8670 	      return;
8671 	    }
8672 
8673 	  /* Issue a warning message for Octeon unaligned load/store
8674 	     instructions used when octeon_use_unalign is not set.  */
8675 	  if (mips_opts.arch == CPU_OCTEON && ! octeon_use_unalign
8676               && (strcmp (insn->name, "ulw") == 0
8677                   || strcmp (insn->name, "uld") == 0
8678                   || strcmp (insn->name, "usw") == 0
8679                   || strcmp (insn->name, "usd") == 0))
8680             {
8681               static char buf[120];
8682               sprintf (buf, _("Octeon specific unaligned load/store instructions are not allowed with -mno-octeon-useun"));
8683               insn_error = buf;
8684               return;
8685             }
8686 
8687 	  /* Issue a warning message for MIPS unaligned load/store
8688 	     instructions used when octeon_use_unalign is set.  */
8689           if (mips_opts.arch == CPU_OCTEON && octeon_use_unalign
8690               && (strcmp (insn->name, "lwl") == 0
8691                   || strcmp (insn->name, "lwr") == 0
8692                   || strcmp (insn->name, "ldl") == 0
8693                   || strcmp (insn->name, "ldr") == 0
8694                   || strcmp (insn->name, "sdl") == 0
8695                   || strcmp (insn->name, "sdr") == 0
8696                   || strcmp (insn->name, "swr") == 0
8697                   || strcmp (insn->name, "swl") == 0))
8698             {
8699               static char buf[100];
8700               sprintf (buf, _("Unaligned load/store instructions are not allowed with -mocteon-useun"));
8701               insn_error = buf;
8702               return;
8703             }
8704 	}
8705 
8706       /* Octeon has its own version of dmtc2/dmfc2 instructions, error on
8707 	 other formats.  */
8708       if (mips_opts.arch == CPU_OCTEON
8709 	  && (strcmp (insn->name, "dmtc2") == 0
8710 	      || strcmp (insn->name, "dmfc2") == 0)
8711 	  && (insn->membership & INSN_OCTEON) != INSN_OCTEON)
8712 	{
8713 	  static char buf[100];
8714 	  sprintf (buf,
8715 		   _("opcode not supported in %s"),
8716 		     mips_cpu_info_from_arch (mips_opts.arch)->name);
8717 	  insn_error = buf;
8718 	  ok = FALSE;
8719 	}
8720 
8721       if (! ok)
8722 	{
8723 	  if (insn + 1 < &mips_opcodes[NUMOPCODES]
8724 	      && strcmp (insn->name, insn[1].name) == 0)
8725 	    {
8726 	      ++insn;
8727 	      continue;
8728 	    }
8729 	  else
8730 	    {
8731 	      if (!insn_error)
8732 		{
8733 		  static char buf[100];
8734 		  sprintf (buf,
8735 			   _("opcode not supported on this processor: %s (%s)"),
8736 			   mips_cpu_info_from_arch (mips_opts.arch)->name,
8737 			   mips_cpu_info_from_isa (mips_opts.isa)->name);
8738 		  insn_error = buf;
8739 		}
8740 	      if (save_c)
8741 		*(--s) = save_c;
8742 	      return;
8743 	    }
8744 	}
8745 
8746       create_insn (ip, insn);
8747       insn_error = NULL;
8748       argnum = 1;
8749       for (args = insn->args;; ++args)
8750 	{
8751 	  int is_mdmx;
8752 
8753 	  s += strspn (s, " \t");
8754 	  is_mdmx = 0;
8755 	  switch (*args)
8756 	    {
8757 	    case '\0':		/* end of args */
8758 	      if (*s == '\0')
8759 		return;
8760 	      break;
8761 
8762 	    case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8763 	      my_getExpression (&imm_expr, s);
8764 	      check_absolute_expr (ip, &imm_expr);
8765 	      if ((unsigned long) imm_expr.X_add_number != 1
8766 		  && (unsigned long) imm_expr.X_add_number != 3)
8767 		{
8768 		  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8769 			  (unsigned long) imm_expr.X_add_number);
8770 		}
8771 	      INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8772 	      imm_expr.X_op = O_absent;
8773 	      s = expr_end;
8774 	      continue;
8775 
8776 	    case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8777 	      my_getExpression (&imm_expr, s);
8778 	      check_absolute_expr (ip, &imm_expr);
8779 	      if (imm_expr.X_add_number & ~OP_MASK_SA3)
8780 		{
8781 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8782 			  OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8783 		}
8784 	      INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8785 	      imm_expr.X_op = O_absent;
8786 	      s = expr_end;
8787 	      continue;
8788 
8789 	    case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8790 	      my_getExpression (&imm_expr, s);
8791 	      check_absolute_expr (ip, &imm_expr);
8792 	      if (imm_expr.X_add_number & ~OP_MASK_SA4)
8793 		{
8794 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8795 			  OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8796 		}
8797 	      INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8798 	      imm_expr.X_op = O_absent;
8799 	      s = expr_end;
8800 	      continue;
8801 
8802 	    case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8803 	      my_getExpression (&imm_expr, s);
8804 	      check_absolute_expr (ip, &imm_expr);
8805 	      if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8806 		{
8807 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8808 			  OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8809 		}
8810 	      INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8811 	      imm_expr.X_op = O_absent;
8812 	      s = expr_end;
8813 	      continue;
8814 
8815 	    case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8816 	      my_getExpression (&imm_expr, s);
8817 	      check_absolute_expr (ip, &imm_expr);
8818 	      if (imm_expr.X_add_number & ~OP_MASK_RS)
8819 		{
8820 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8821 			  OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8822 		}
8823 	      INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8824 	      imm_expr.X_op = O_absent;
8825 	      s = expr_end;
8826 	      continue;
8827 
8828 	    case '7': /* four dsp accumulators in bits 11,12 */
8829 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8830 		  s[3] >= '0' && s[3] <= '3')
8831 		{
8832 		  regno = s[3] - '0';
8833 		  s += 4;
8834 		  INSERT_OPERAND (DSPACC, *ip, regno);
8835 		  continue;
8836 		}
8837 	      else
8838 		as_bad (_("Invalid dsp acc register"));
8839 	      break;
8840 
8841 	    case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8842 	      my_getExpression (&imm_expr, s);
8843 	      check_absolute_expr (ip, &imm_expr);
8844 	      if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8845 		{
8846 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8847 			  OP_MASK_WRDSP,
8848 			  (unsigned long) imm_expr.X_add_number);
8849 		}
8850 	      INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8851 	      imm_expr.X_op = O_absent;
8852 	      s = expr_end;
8853 	      continue;
8854 
8855 	    case '9': /* four dsp accumulators in bits 21,22 */
8856 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8857 		  s[3] >= '0' && s[3] <= '3')
8858 		{
8859 		  regno = s[3] - '0';
8860 		  s += 4;
8861 		  INSERT_OPERAND (DSPACC_S, *ip, regno);
8862 		  continue;
8863 		}
8864 	      else
8865 		as_bad (_("Invalid dsp acc register"));
8866 	      break;
8867 
8868 	    case '0': /* dsp 6-bit signed immediate in bit 20 */
8869 	      my_getExpression (&imm_expr, s);
8870 	      check_absolute_expr (ip, &imm_expr);
8871 	      min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8872 	      max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8873 	      if (imm_expr.X_add_number < min_range ||
8874 		  imm_expr.X_add_number > max_range)
8875 		{
8876 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8877 			  (long) min_range, (long) max_range,
8878 			  (long) imm_expr.X_add_number);
8879 		}
8880 	      INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8881 	      imm_expr.X_op = O_absent;
8882 	      s = expr_end;
8883 	      continue;
8884 
8885 	    case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8886 	      my_getExpression (&imm_expr, s);
8887 	      check_absolute_expr (ip, &imm_expr);
8888 	      if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8889 		{
8890 		  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8891 			  OP_MASK_RDDSP,
8892 			  (unsigned long) imm_expr.X_add_number);
8893 		}
8894 	      INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8895 	      imm_expr.X_op = O_absent;
8896 	      s = expr_end;
8897 	      continue;
8898 
8899 	    case ':': /* dsp 7-bit signed immediate in bit 19 */
8900 	      my_getExpression (&imm_expr, s);
8901 	      check_absolute_expr (ip, &imm_expr);
8902 	      min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8903 	      max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8904 	      if (imm_expr.X_add_number < min_range ||
8905 		  imm_expr.X_add_number > max_range)
8906 		{
8907 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8908 			  (long) min_range, (long) max_range,
8909 			  (long) imm_expr.X_add_number);
8910 		}
8911 	      INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8912 	      imm_expr.X_op = O_absent;
8913 	      s = expr_end;
8914 	      continue;
8915 
8916 	    case '@': /* dsp 10-bit signed immediate in bit 16 */
8917 	      my_getExpression (&imm_expr, s);
8918 	      check_absolute_expr (ip, &imm_expr);
8919 	      min_range = -((OP_MASK_IMM10 + 1) >> 1);
8920 	      max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8921 	      if (imm_expr.X_add_number < min_range ||
8922 		  imm_expr.X_add_number > max_range)
8923 		{
8924 		  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8925 			  (long) min_range, (long) max_range,
8926 			  (long) imm_expr.X_add_number);
8927 		}
8928 	      INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8929 	      imm_expr.X_op = O_absent;
8930 	      s = expr_end;
8931 	      continue;
8932 
8933             case '!': /* MT usermode flag bit.  */
8934 	      my_getExpression (&imm_expr, s);
8935 	      check_absolute_expr (ip, &imm_expr);
8936 	      if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8937 		as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8938 			(unsigned long) imm_expr.X_add_number);
8939 	      INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8940 	      imm_expr.X_op = O_absent;
8941 	      s = expr_end;
8942 	      continue;
8943 
8944             case '$': /* MT load high flag bit.  */
8945 	      my_getExpression (&imm_expr, s);
8946 	      check_absolute_expr (ip, &imm_expr);
8947 	      if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8948 		as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8949 			(unsigned long) imm_expr.X_add_number);
8950 	      INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8951 	      imm_expr.X_op = O_absent;
8952 	      s = expr_end;
8953 	      continue;
8954 
8955 	    case '*': /* four dsp accumulators in bits 18,19 */
8956 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8957 		  s[3] >= '0' && s[3] <= '3')
8958 		{
8959 		  regno = s[3] - '0';
8960 		  s += 4;
8961 		  INSERT_OPERAND (MTACC_T, *ip, regno);
8962 		  continue;
8963 		}
8964 	      else
8965 		as_bad (_("Invalid dsp/smartmips acc register"));
8966 	      break;
8967 
8968 	    case '&': /* four dsp accumulators in bits 13,14 */
8969 	      if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8970 		  s[3] >= '0' && s[3] <= '3')
8971 		{
8972 		  regno = s[3] - '0';
8973 		  s += 4;
8974 		  INSERT_OPERAND (MTACC_D, *ip, regno);
8975 		  continue;
8976 		}
8977 	      else
8978 		as_bad (_("Invalid dsp/smartmips acc register"));
8979 	      break;
8980 
8981 	    case ',':
8982 	      ++argnum;
8983 	      if (*s++ == *args)
8984 		continue;
8985 	      s--;
8986 	      switch (*++args)
8987 		{
8988 		case 'r':
8989 		case 'v':
8990 		  INSERT_OPERAND (RS, *ip, lastregno);
8991 		  continue;
8992 
8993 		case 'w':
8994 		  INSERT_OPERAND (RT, *ip, lastregno);
8995 		  continue;
8996 
8997 		case 'W':
8998 		  INSERT_OPERAND (FT, *ip, lastregno);
8999 		  continue;
9000 
9001 		case 'V':
9002 		  INSERT_OPERAND (FS, *ip, lastregno);
9003 		  continue;
9004 		}
9005 	      break;
9006 
9007 	    case '(':
9008 	      /* Handle optional base register.
9009 		 Either the base register is omitted or
9010 		 we must have a left paren.  */
9011 	      /* This is dependent on the next operand specifier
9012 		 is a base register specification.  */
9013 	      assert (args[1] == 'b' || args[1] == '5'
9014 		      || args[1] == '-' || args[1] == '4');
9015 	      if (*s == '\0')
9016 		return;
9017 
9018 	    case ')':		/* these must match exactly */
9019 	    case '[':
9020 	    case ']':
9021 	      if (*s++ == *args)
9022 		continue;
9023 	      break;
9024 
9025 	    case '+':		/* Opcode extension character.  */
9026 	      switch (*++args)
9027 		{
9028 		case '1':	/* UDI immediates.  */
9029 		case '2':
9030 		case '3':
9031 		case '4':
9032 		  {
9033 		    const struct mips_immed *imm = mips_immed;
9034 
9035 		    while (imm->type && imm->type != *args)
9036 		      ++imm;
9037 		    if (! imm->type)
9038 		      internalError ();
9039 		    my_getExpression (&imm_expr, s);
9040 		    check_absolute_expr (ip, &imm_expr);
9041 		    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9042 		      {
9043 		        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9044 				 imm->desc ? imm->desc : ip->insn_mo->name,
9045 				 (unsigned long) imm_expr.X_add_number,
9046 				 (unsigned long) imm_expr.X_add_number);
9047 			      imm_expr.X_add_number &= imm->mask;
9048 		      }
9049 		    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9050 					<< imm->shift);
9051 		    imm_expr.X_op = O_absent;
9052 		    s = expr_end;
9053 		  }
9054 		  continue;
9055 
9056 		case 'A':		/* ins/ext position, becomes LSB.  */
9057 		  limlo = 0;
9058 		  limhi = 31;
9059 		  goto do_lsb;
9060 		case 'E':
9061 		  limlo = 32;
9062 		  limhi = 63;
9063 		  goto do_lsb;
9064 do_lsb:
9065 		  my_getExpression (&imm_expr, s);
9066 		  check_absolute_expr (ip, &imm_expr);
9067 		  if ((unsigned long) imm_expr.X_add_number < limlo
9068 		      || (unsigned long) imm_expr.X_add_number > limhi)
9069 		    {
9070 		      as_bad (_("Improper position (%lu)"),
9071 			      (unsigned long) imm_expr.X_add_number);
9072 		      imm_expr.X_add_number = limlo;
9073 		    }
9074 		  lastpos = imm_expr.X_add_number;
9075 		  INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9076 		  imm_expr.X_op = O_absent;
9077 		  s = expr_end;
9078 		  continue;
9079 
9080 		case 'B':		/* ins size, becomes MSB.  */
9081 		  limlo = 1;
9082 		  limhi = 32;
9083 		  goto do_msb;
9084 		case 'F':
9085 		  limlo = 33;
9086 		  limhi = 64;
9087 		  goto do_msb;
9088 do_msb:
9089 		  my_getExpression (&imm_expr, s);
9090 		  check_absolute_expr (ip, &imm_expr);
9091 		  /* Check for negative input so that small negative numbers
9092 		     will not succeed incorrectly.  The checks against
9093 		     (pos+size) transitively check "size" itself,
9094 		     assuming that "pos" is reasonable.  */
9095 		  if ((long) imm_expr.X_add_number < 0
9096 		      || ((unsigned long) imm_expr.X_add_number
9097 			  + lastpos) < limlo
9098 		      || ((unsigned long) imm_expr.X_add_number
9099 			  + lastpos) > limhi)
9100 		    {
9101 		      as_bad (_("Improper insert size (%lu, position %lu)"),
9102 			      (unsigned long) imm_expr.X_add_number,
9103 			      (unsigned long) lastpos);
9104 		      imm_expr.X_add_number = limlo - lastpos;
9105 		    }
9106 		  INSERT_OPERAND (INSMSB, *ip,
9107 				 lastpos + imm_expr.X_add_number - 1);
9108 		  imm_expr.X_op = O_absent;
9109 		  s = expr_end;
9110 		  continue;
9111 
9112 		case 'C':		/* ext size, becomes MSBD.  */
9113 		  limlo = 1;
9114 		  limhi = 32;
9115 		  goto do_msbd;
9116 		case 'G':
9117 		  limlo = 33;
9118 		  limhi = 64;
9119 		  goto do_msbd;
9120 		case 'H':
9121 		  limlo = 33;
9122 		  limhi = 64;
9123 		  goto do_msbd;
9124 do_msbd:
9125 		  my_getExpression (&imm_expr, s);
9126 		  check_absolute_expr (ip, &imm_expr);
9127 		  /* Check for negative input so that small negative numbers
9128 		     will not succeed incorrectly.  The checks against
9129 		     (pos+size) transitively check "size" itself,
9130 		     assuming that "pos" is reasonable.  */
9131 		  if ((long) imm_expr.X_add_number < 0
9132 		      || ((unsigned long) imm_expr.X_add_number
9133 			  + lastpos) < limlo
9134 		      || ((unsigned long) imm_expr.X_add_number
9135 			  + lastpos) > limhi)
9136 		    {
9137 		      as_bad (_("Improper extract size (%lu, position %lu)"),
9138 			      (unsigned long) imm_expr.X_add_number,
9139 			      (unsigned long) lastpos);
9140 		      imm_expr.X_add_number = limlo - lastpos;
9141 		    }
9142 		  INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9143 		  imm_expr.X_op = O_absent;
9144 		  s = expr_end;
9145 		  continue;
9146 
9147 		case 'D':
9148 		  /* +D is for disassembly only; never match.  */
9149 		  break;
9150 
9151 		case 'I':
9152 		  /* "+I" is like "I", except that imm2_expr is used.  */
9153 		  my_getExpression (&imm2_expr, s);
9154 		  if (imm2_expr.X_op != O_big
9155 		      && imm2_expr.X_op != O_constant)
9156 		  insn_error = _("absolute expression required");
9157 		  if (HAVE_32BIT_GPRS)
9158 		    normalize_constant_expr (&imm2_expr);
9159 		  s = expr_end;
9160 		  continue;
9161 
9162 		case 'T': /* Coprocessor register.  */
9163 		  /* +T is for disassembly only; never match.  */
9164 		  break;
9165 
9166 		case 't': /* Coprocessor register number.  */
9167 		  if (s[0] == '$' && ISDIGIT (s[1]))
9168 		    {
9169 		      ++s;
9170 		      regno = 0;
9171 		      do
9172 		        {
9173 			  regno *= 10;
9174 			  regno += *s - '0';
9175 			  ++s;
9176 			}
9177 		      while (ISDIGIT (*s));
9178 		      if (regno > 31)
9179 			as_bad (_("Invalid register number (%d)"), regno);
9180 		      else
9181 			{
9182 			  INSERT_OPERAND (RT, *ip, regno);
9183 			  continue;
9184 			}
9185 		    }
9186 		  else
9187 		    as_bad (_("Invalid coprocessor 0 register number"));
9188 		  break;
9189 
9190 		default:
9191 		  as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9192 		    *args, insn->name, insn->args);
9193 		  /* Further processing is fruitless.  */
9194 		  return;
9195 		}
9196 	      break;
9197 
9198 	    case '<':		/* must be at least one digit */
9199 	      /*
9200 	       * According to the manual, if the shift amount is greater
9201 	       * than 31 or less than 0, then the shift amount should be
9202 	       * mod 32.  In reality the mips assembler issues an error.
9203 	       * We issue a warning and mask out all but the low 5 bits.
9204 	       */
9205 	      my_getExpression (&imm_expr, s);
9206 	      check_absolute_expr (ip, &imm_expr);
9207 	      if ((unsigned long) imm_expr.X_add_number > 31)
9208 		as_warn (_("Improper shift amount (%lu)"),
9209 			 (unsigned long) imm_expr.X_add_number);
9210 	      INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9211 	      imm_expr.X_op = O_absent;
9212 	      s = expr_end;
9213 	      continue;
9214 
9215 	    case '>':		/* shift amount minus 32 */
9216 	      my_getExpression (&imm_expr, s);
9217 	      check_absolute_expr (ip, &imm_expr);
9218 	      if ((unsigned long) imm_expr.X_add_number < 32
9219 		  || (unsigned long) imm_expr.X_add_number > 63)
9220 		break;
9221 	      INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9222 	      imm_expr.X_op = O_absent;
9223 	      s = expr_end;
9224 	      continue;
9225 
9226              case '^':           /* must be at least one digit */
9227 	      /* Decode 5-bits of bbit0/1's bit index amount. If the value is
9228 		 greater than 31, issue a warning and mask out all but the low
9229 		 5 bits.  */
9230 	      my_getExpression (&imm_expr, s);
9231 	      check_absolute_expr (ip, &imm_expr);
9232 	      if ((unsigned long) imm_expr.X_add_number > 31)
9233 		{
9234 		  as_warn (_("Improper bit index amount (%lu)"),
9235 			   (unsigned long) imm_expr.X_add_number);
9236 		  imm_expr.X_add_number &= OP_MASK_BITIND;
9237 		}
9238 	      ip->insn_opcode |= imm_expr.X_add_number << OP_SH_BITIND;
9239 	      imm_expr.X_op = O_absent;
9240 	      s = expr_end;
9241 	      continue;
9242 
9243             case '~':           /* bit index minus 32 */
9244 	      my_getExpression (&imm_expr, s);
9245 	      check_absolute_expr (ip, &imm_expr);
9246 	      if ((unsigned long) imm_expr.X_add_number < 32
9247 	          || (unsigned long) imm_expr.X_add_number > 63)
9248 	        break;
9249 	      ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_BITIND;
9250 	      imm_expr.X_op = O_absent;
9251 	      s = expr_end;
9252 	      continue;
9253 
9254 	    case 'k':		/* cache code */
9255 	    case 'h':		/* prefx code */
9256 	      my_getExpression (&imm_expr, s);
9257 	      check_absolute_expr (ip, &imm_expr);
9258 	      if ((unsigned long) imm_expr.X_add_number > 31)
9259 		as_warn (_("Invalid value for `%s' (%lu)"),
9260 			 ip->insn_mo->name,
9261 			 (unsigned long) imm_expr.X_add_number);
9262 	      if (*args == 'k')
9263 		INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9264 	      else
9265 		INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9266 	      imm_expr.X_op = O_absent;
9267 	      s = expr_end;
9268 	      continue;
9269 
9270 	    case 'c':		/* break code */
9271 	      my_getExpression (&imm_expr, s);
9272 	      check_absolute_expr (ip, &imm_expr);
9273 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9274 		as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9275 			 ip->insn_mo->name,
9276 			 (unsigned long) imm_expr.X_add_number);
9277 	      INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9278 	      imm_expr.X_op = O_absent;
9279 	      s = expr_end;
9280 	      continue;
9281 
9282 	    case 'q':		/* lower break code */
9283 	      my_getExpression (&imm_expr, s);
9284 	      check_absolute_expr (ip, &imm_expr);
9285 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9286 		as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9287 			 ip->insn_mo->name,
9288 			 (unsigned long) imm_expr.X_add_number);
9289 	      INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9290 	      imm_expr.X_op = O_absent;
9291 	      s = expr_end;
9292 	      continue;
9293 
9294 	    case 'y':
9295 	      /* Decode 10-bits of seqi/snei's signed constant offset. Issue
9296 		 a warning message if the value is not within the range.  */
9297 	      my_getExpression (&imm_expr, s);
9298 	      check_absolute_expr (ip, &imm_expr);
9299 	      if (((unsigned long) imm_expr.X_add_number + 0x200) > 1023)
9300 		{
9301 		  as_warn (_("Illegal 10-bit signed constant (%lu)"),
9302 			   (unsigned long) imm_expr.X_add_number);
9303 		 	   imm_expr.X_add_number &= OP_MASK_CODE2;
9304 		}
9305 	      ip->insn_opcode |= (imm_expr.X_add_number & OP_MASK_CODE2)
9306 				  << OP_SH_CODE2;
9307 	      imm_expr.X_op = O_absent;
9308 	      s = expr_end;
9309 	      continue;
9310 
9311 	    case 'B':           /* 20-bit syscall/break code.  */
9312 	      my_getExpression (&imm_expr, s);
9313 	      check_absolute_expr (ip, &imm_expr);
9314 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9315 		as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9316 			 ip->insn_mo->name,
9317 			 (unsigned long) imm_expr.X_add_number);
9318 	      INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9319 	      imm_expr.X_op = O_absent;
9320 	      s = expr_end;
9321 	      continue;
9322 
9323 	    case 'C':           /* Coprocessor code */
9324 	      my_getExpression (&imm_expr, s);
9325 	      check_absolute_expr (ip, &imm_expr);
9326 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9327 		{
9328 		  as_warn (_("Coproccesor code > 25 bits (%lu)"),
9329 			   (unsigned long) imm_expr.X_add_number);
9330 		  imm_expr.X_add_number &= OP_MASK_COPZ;
9331 		}
9332 	      INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9333 	      imm_expr.X_op = O_absent;
9334 	      s = expr_end;
9335 	      continue;
9336 
9337 	    case 'J':           /* 19-bit wait code.  */
9338 	      my_getExpression (&imm_expr, s);
9339 	      check_absolute_expr (ip, &imm_expr);
9340 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9341 		{
9342 		  as_warn (_("Illegal 19-bit code (%lu)"),
9343 			   (unsigned long) imm_expr.X_add_number);
9344 		  imm_expr.X_add_number &= OP_MASK_CODE19;
9345 		}
9346 	      INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9347 	      imm_expr.X_op = O_absent;
9348 	      s = expr_end;
9349 	      continue;
9350 
9351 	    case 'P':		/* Performance register.  */
9352 	      my_getExpression (&imm_expr, s);
9353 	      check_absolute_expr (ip, &imm_expr);
9354 	      if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9355 		as_warn (_("Invalid performance register (%lu)"),
9356 			 (unsigned long) imm_expr.X_add_number);
9357 	      INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9358 	      imm_expr.X_op = O_absent;
9359 	      s = expr_end;
9360 	      continue;
9361 
9362 	    case 'G':		/* Coprocessor destination register.  */
9363 	      if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9364 		ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9365 	      else
9366 		ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9367 	      INSERT_OPERAND (RD, *ip, regno);
9368 	      if (ok)
9369 		{
9370 		  lastregno = regno;
9371 		  continue;
9372 		}
9373 	      else
9374 		break;
9375 
9376 	    case 'b':		/* base register */
9377 	    case 'd':		/* destination register */
9378 	    case 's':		/* source register */
9379 	    case 't':		/* target register */
9380 	    case 'r':		/* both target and source */
9381 	    case 'v':		/* both dest and source */
9382 	    case 'w':		/* both dest and target */
9383 	    case 'E':		/* coprocessor target register */
9384 	    case 'K':		/* 'rdhwr' destination register */
9385 	    case 'x':		/* ignore register name */
9386 	    case 'z':		/* must be zero register */
9387 	    case 'U':           /* destination register (clo/clz).  */
9388 	    case 'g':		/* coprocessor destination register */
9389 	      s_reset = s;
9390 	      if (*args == 'E' || *args == 'K')
9391 		ok = reg_lookup (&s, RTYPE_NUM, &regno);
9392 	      else
9393 		{
9394 		  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9395 		  if (regno == AT && ! mips_opts.noat)
9396 		    as_warn ("Used $at without \".set noat\"");
9397 		}
9398 	      if (ok)
9399 		{
9400 		  c = *args;
9401 		  if (*s == ' ')
9402 		    ++s;
9403 		  if (args[1] != *s)
9404 		    {
9405 		      if (c == 'r' || c == 'v' || c == 'w')
9406 			{
9407 			  regno = lastregno;
9408 			  s = s_reset;
9409 			  ++args;
9410 			}
9411 		    }
9412 		  /* 'z' only matches $0.  */
9413 		  if (c == 'z' && regno != 0)
9414 		    break;
9415 
9416 	/* Now that we have assembled one operand, we use the args string
9417 	 * to figure out where it goes in the instruction.  */
9418 		  switch (c)
9419 		    {
9420 		    case 'r':
9421 		    case 's':
9422 		    case 'v':
9423 		    case 'b':
9424 		      INSERT_OPERAND (RS, *ip, regno);
9425 		      break;
9426 		    case 'd':
9427 		    case 'G':
9428 		    case 'K':
9429 		    case 'g':
9430 		      INSERT_OPERAND (RD, *ip, regno);
9431 		      break;
9432 		    case 'U':
9433 		      INSERT_OPERAND (RD, *ip, regno);
9434 		      INSERT_OPERAND (RT, *ip, regno);
9435 		      break;
9436 		    case 'w':
9437 		    case 't':
9438 		    case 'E':
9439 		      INSERT_OPERAND (RT, *ip, regno);
9440 		      break;
9441 		    case 'x':
9442 		      /* This case exists because on the r3000 trunc
9443 			 expands into a macro which requires a gp
9444 			 register.  On the r6000 or r4000 it is
9445 			 assembled into a single instruction which
9446 			 ignores the register.  Thus the insn version
9447 			 is MIPS_ISA2 and uses 'x', and the macro
9448 			 version is MIPS_ISA1 and uses 't'.  */
9449 		      break;
9450 		    case 'z':
9451 		      /* This case is for the div instruction, which
9452 			 acts differently if the destination argument
9453 			 is $0.  This only matches $0, and is checked
9454 			 outside the switch.  */
9455 		      break;
9456 		    case 'D':
9457 		      /* Itbl operand; not yet implemented. FIXME ?? */
9458 		      break;
9459 		      /* What about all other operands like 'i', which
9460 			 can be specified in the opcode table? */
9461 		    }
9462 		  lastregno = regno;
9463 		  continue;
9464 		}
9465 	      switch (*args++)
9466 		{
9467 		case 'r':
9468 		case 'v':
9469 		  INSERT_OPERAND (RS, *ip, lastregno);
9470 		  continue;
9471 		case 'w':
9472 		  INSERT_OPERAND (RT, *ip, lastregno);
9473 		  continue;
9474 		}
9475 	      break;
9476 
9477 	    case 'O':		/* MDMX alignment immediate constant.  */
9478 	      my_getExpression (&imm_expr, s);
9479 	      check_absolute_expr (ip, &imm_expr);
9480 	      if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9481 		as_warn ("Improper align amount (%ld), using low bits",
9482 			 (long) imm_expr.X_add_number);
9483 	      INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9484 	      imm_expr.X_op = O_absent;
9485 	      s = expr_end;
9486 	      continue;
9487 
9488 	    case 'Q':		/* MDMX vector, element sel, or const.  */
9489 	      if (s[0] != '$')
9490 		{
9491 		  /* MDMX Immediate.  */
9492 		  my_getExpression (&imm_expr, s);
9493 		  check_absolute_expr (ip, &imm_expr);
9494 		  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9495 		    as_warn (_("Invalid MDMX Immediate (%ld)"),
9496 			     (long) imm_expr.X_add_number);
9497 		  INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9498 		  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9499 		    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9500 		  else
9501 		    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9502 		  imm_expr.X_op = O_absent;
9503 		  s = expr_end;
9504 		  continue;
9505 		}
9506 	      /* Not MDMX Immediate.  Fall through.  */
9507 	    case 'X':           /* MDMX destination register.  */
9508 	    case 'Y':           /* MDMX source register.  */
9509 	    case 'Z':           /* MDMX target register.  */
9510 	      is_mdmx = 1;
9511 	    case 'D':		/* floating point destination register */
9512 	    case 'S':		/* floating point source register */
9513 	    case 'T':		/* floating point target register */
9514 	    case 'R':		/* floating point source register */
9515 	    case 'V':
9516 	    case 'W':
9517 	      rtype = RTYPE_FPU;
9518 	      if (is_mdmx
9519 		  || (mips_opts.ase_mdmx
9520 		      && (ip->insn_mo->pinfo & FP_D)
9521 		      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9522 						| INSN_COPROC_MEMORY_DELAY
9523 						| INSN_LOAD_COPROC_DELAY
9524 						| INSN_LOAD_MEMORY_DELAY
9525 						| INSN_STORE_MEMORY))))
9526 		rtype |= RTYPE_VEC;
9527 	      s_reset = s;
9528 	      if (mips_opts.arch == CPU_OCTEON && octeon_error_on_unsupported)
9529 		{
9530 		  insn_error = "opcode not implemented in Octeon";
9531 		  return;
9532 		}
9533 	      if (reg_lookup (&s, rtype, &regno))
9534 		{
9535 		  if ((regno & 1) != 0
9536 		      && HAVE_32BIT_FPRS
9537 		      && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9538 		    as_warn (_("Float register should be even, was %d"),
9539 			     regno);
9540 
9541 		  c = *args;
9542 		  if (*s == ' ')
9543 		    ++s;
9544 		  if (args[1] != *s)
9545 		    {
9546 		      if (c == 'V' || c == 'W')
9547 			{
9548 			  regno = lastregno;
9549 			  s = s_reset;
9550 			  ++args;
9551 			}
9552 		    }
9553 		  switch (c)
9554 		    {
9555 		    case 'D':
9556 		    case 'X':
9557 		      INSERT_OPERAND (FD, *ip, regno);
9558 		      break;
9559 		    case 'V':
9560 		    case 'S':
9561 		    case 'Y':
9562 		      INSERT_OPERAND (FS, *ip, regno);
9563 		      break;
9564 		    case 'Q':
9565 		      /* This is like 'Z', but also needs to fix the MDMX
9566 			 vector/scalar select bits.  Note that the
9567 			 scalar immediate case is handled above.  */
9568 		      if (*s == '[')
9569 			{
9570 			  int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9571 			  int max_el = (is_qh ? 3 : 7);
9572 			  s++;
9573 			  my_getExpression(&imm_expr, s);
9574 			  check_absolute_expr (ip, &imm_expr);
9575 			  s = expr_end;
9576 			  if (imm_expr.X_add_number > max_el)
9577 			    as_bad(_("Bad element selector %ld"),
9578 				   (long) imm_expr.X_add_number);
9579 			  imm_expr.X_add_number &= max_el;
9580 			  ip->insn_opcode |= (imm_expr.X_add_number
9581 					      << (OP_SH_VSEL +
9582 						  (is_qh ? 2 : 1)));
9583 			  imm_expr.X_op = O_absent;
9584 			  if (*s != ']')
9585 			    as_warn(_("Expecting ']' found '%s'"), s);
9586 			  else
9587 			    s++;
9588 			}
9589 		      else
9590                         {
9591                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9592                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9593 						<< OP_SH_VSEL);
9594 			  else
9595 			    ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9596 						OP_SH_VSEL);
9597 			}
9598                       /* Fall through */
9599 		    case 'W':
9600 		    case 'T':
9601 		    case 'Z':
9602 		      INSERT_OPERAND (FT, *ip, regno);
9603 		      break;
9604 		    case 'R':
9605 		      INSERT_OPERAND (FR, *ip, regno);
9606 		      break;
9607 		    }
9608 		  lastregno = regno;
9609 		  continue;
9610 		}
9611 
9612 	      switch (*args++)
9613 		{
9614 		case 'V':
9615 		  INSERT_OPERAND (FS, *ip, lastregno);
9616 		  continue;
9617 		case 'W':
9618 		  INSERT_OPERAND (FT, *ip, lastregno);
9619 		  continue;
9620 		}
9621 	      break;
9622 
9623 	    case 'I':
9624 	      my_getExpression (&imm_expr, s);
9625 	      if (imm_expr.X_op != O_big
9626 		  && imm_expr.X_op != O_constant)
9627 		insn_error = _("absolute expression required");
9628 	      if (HAVE_32BIT_GPRS)
9629 		normalize_constant_expr (&imm_expr);
9630 	      s = expr_end;
9631 	      continue;
9632 
9633 	    case 'A':
9634 	      my_getExpression (&offset_expr, s);
9635 	      normalize_address_expr (&offset_expr);
9636 	      *imm_reloc = BFD_RELOC_32;
9637 	      s = expr_end;
9638 	      continue;
9639 
9640 	    case 'F':
9641 	    case 'L':
9642 	    case 'f':
9643 	    case 'l':
9644 	      {
9645 		int f64;
9646 		int using_gprs;
9647 		char *save_in;
9648 		char *err;
9649 		unsigned char temp[8];
9650 		int len;
9651 		unsigned int length;
9652 		segT seg;
9653 		subsegT subseg;
9654 		char *p;
9655 
9656 		/* These only appear as the last operand in an
9657 		   instruction, and every instruction that accepts
9658 		   them in any variant accepts them in all variants.
9659 		   This means we don't have to worry about backing out
9660 		   any changes if the instruction does not match.
9661 
9662 		   The difference between them is the size of the
9663 		   floating point constant and where it goes.  For 'F'
9664 		   and 'L' the constant is 64 bits; for 'f' and 'l' it
9665 		   is 32 bits.  Where the constant is placed is based
9666 		   on how the MIPS assembler does things:
9667 		    F -- .rdata
9668 		    L -- .lit8
9669 		    f -- immediate value
9670 		    l -- .lit4
9671 
9672 		    The .lit4 and .lit8 sections are only used if
9673 		    permitted by the -G argument.
9674 
9675 		    The code below needs to know whether the target register
9676 		    is 32 or 64 bits wide.  It relies on the fact 'f' and
9677 		    'F' are used with GPR-based instructions and 'l' and
9678 		    'L' are used with FPR-based instructions.  */
9679 
9680 		f64 = *args == 'F' || *args == 'L';
9681 		using_gprs = *args == 'F' || *args == 'f';
9682 
9683 		save_in = input_line_pointer;
9684 		input_line_pointer = s;
9685 		err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9686 		length = len;
9687 		s = input_line_pointer;
9688 		input_line_pointer = save_in;
9689 		if (err != NULL && *err != '\0')
9690 		  {
9691 		    as_bad (_("Bad floating point constant: %s"), err);
9692 		    memset (temp, '\0', sizeof temp);
9693 		    length = f64 ? 8 : 4;
9694 		  }
9695 
9696 		assert (length == (unsigned) (f64 ? 8 : 4));
9697 
9698 		if (*args == 'f'
9699 		    || (*args == 'l'
9700 			&& (g_switch_value < 4
9701 			    || (temp[0] == 0 && temp[1] == 0)
9702 			    || (temp[2] == 0 && temp[3] == 0))))
9703 		  {
9704 		    imm_expr.X_op = O_constant;
9705 		    if (! target_big_endian)
9706 		      imm_expr.X_add_number = bfd_getl32 (temp);
9707 		    else
9708 		      imm_expr.X_add_number = bfd_getb32 (temp);
9709 		  }
9710 		else if (length > 4
9711 			 && ! mips_disable_float_construction
9712 			 /* Constants can only be constructed in GPRs and
9713 			    copied to FPRs if the GPRs are at least as wide
9714 			    as the FPRs.  Force the constant into memory if
9715 			    we are using 64-bit FPRs but the GPRs are only
9716 			    32 bits wide.  */
9717 			 && (using_gprs
9718 			     || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9719 			 && ((temp[0] == 0 && temp[1] == 0)
9720 			     || (temp[2] == 0 && temp[3] == 0))
9721 			 && ((temp[4] == 0 && temp[5] == 0)
9722 			     || (temp[6] == 0 && temp[7] == 0)))
9723 		  {
9724 		    /* The value is simple enough to load with a couple of
9725                        instructions.  If using 32-bit registers, set
9726                        imm_expr to the high order 32 bits and offset_expr to
9727                        the low order 32 bits.  Otherwise, set imm_expr to
9728                        the entire 64 bit constant.  */
9729 		    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9730 		      {
9731 			imm_expr.X_op = O_constant;
9732 			offset_expr.X_op = O_constant;
9733 			if (! target_big_endian)
9734 			  {
9735 			    imm_expr.X_add_number = bfd_getl32 (temp + 4);
9736 			    offset_expr.X_add_number = bfd_getl32 (temp);
9737 			  }
9738 			else
9739 			  {
9740 			    imm_expr.X_add_number = bfd_getb32 (temp);
9741 			    offset_expr.X_add_number = bfd_getb32 (temp + 4);
9742 			  }
9743 			if (offset_expr.X_add_number == 0)
9744 			  offset_expr.X_op = O_absent;
9745 		      }
9746 		    else if (sizeof (imm_expr.X_add_number) > 4)
9747 		      {
9748 			imm_expr.X_op = O_constant;
9749 			if (! target_big_endian)
9750 			  imm_expr.X_add_number = bfd_getl64 (temp);
9751 			else
9752 			  imm_expr.X_add_number = bfd_getb64 (temp);
9753 		      }
9754 		    else
9755 		      {
9756 			imm_expr.X_op = O_big;
9757 			imm_expr.X_add_number = 4;
9758 			if (! target_big_endian)
9759 			  {
9760 			    generic_bignum[0] = bfd_getl16 (temp);
9761 			    generic_bignum[1] = bfd_getl16 (temp + 2);
9762 			    generic_bignum[2] = bfd_getl16 (temp + 4);
9763 			    generic_bignum[3] = bfd_getl16 (temp + 6);
9764 			  }
9765 			else
9766 			  {
9767 			    generic_bignum[0] = bfd_getb16 (temp + 6);
9768 			    generic_bignum[1] = bfd_getb16 (temp + 4);
9769 			    generic_bignum[2] = bfd_getb16 (temp + 2);
9770 			    generic_bignum[3] = bfd_getb16 (temp);
9771 			  }
9772 		      }
9773 		  }
9774 		else
9775 		  {
9776 		    const char *newname;
9777 		    segT new_seg;
9778 
9779 		    /* Switch to the right section.  */
9780 		    seg = now_seg;
9781 		    subseg = now_subseg;
9782 		    switch (*args)
9783 		      {
9784 		      default: /* unused default case avoids warnings.  */
9785 		      case 'L':
9786 			newname = RDATA_SECTION_NAME;
9787 			if (g_switch_value >= 8)
9788 			  newname = ".lit8";
9789 			break;
9790 		      case 'F':
9791 			newname = RDATA_SECTION_NAME;
9792 			break;
9793 		      case 'l':
9794 			assert (g_switch_value >= 4);
9795 			newname = ".lit4";
9796 			break;
9797 		      }
9798 		    new_seg = subseg_new (newname, (subsegT) 0);
9799 		    if (IS_ELF)
9800 		      bfd_set_section_flags (stdoutput, new_seg,
9801 					     (SEC_ALLOC
9802 					      | SEC_LOAD
9803 					      | SEC_READONLY
9804 					      | SEC_DATA));
9805 		    frag_align (*args == 'l' ? 2 : 3, 0, 0);
9806 		    if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9807 		      record_alignment (new_seg, 4);
9808 		    else
9809 		      record_alignment (new_seg, *args == 'l' ? 2 : 3);
9810 		    if (seg == now_seg)
9811 		      as_bad (_("Can't use floating point insn in this section"));
9812 
9813 		    /* Set the argument to the current address in the
9814 		       section.  */
9815 		    offset_expr.X_op = O_symbol;
9816 		    offset_expr.X_add_symbol =
9817 		      symbol_new ("L0\001", now_seg,
9818 				  (valueT) frag_now_fix (), frag_now);
9819 		    offset_expr.X_add_number = 0;
9820 
9821 		    /* Put the floating point number into the section.  */
9822 		    p = frag_more ((int) length);
9823 		    memcpy (p, temp, length);
9824 
9825 		    /* Switch back to the original section.  */
9826 		    subseg_set (seg, subseg);
9827 		  }
9828 	      }
9829 	      continue;
9830 
9831 	    case 'i':		/* 16 bit unsigned immediate */
9832 	    case 'j':		/* 16 bit signed immediate */
9833 	      *imm_reloc = BFD_RELOC_LO16;
9834 	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9835 		{
9836 		  int more;
9837 		  offsetT minval, maxval;
9838 
9839 		  more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9840 			  && strcmp (insn->name, insn[1].name) == 0);
9841 
9842 		  /* If the expression was written as an unsigned number,
9843 		     only treat it as signed if there are no more
9844 		     alternatives.  */
9845 		  if (more
9846 		      && *args == 'j'
9847 		      && sizeof (imm_expr.X_add_number) <= 4
9848 		      && imm_expr.X_op == O_constant
9849 		      && imm_expr.X_add_number < 0
9850 		      && imm_expr.X_unsigned
9851 		      && HAVE_64BIT_GPRS)
9852 		    break;
9853 
9854 		  /* For compatibility with older assemblers, we accept
9855 		     0x8000-0xffff as signed 16-bit numbers when only
9856 		     signed numbers are allowed.  */
9857 		  if (*args == 'i')
9858 		    minval = 0, maxval = 0xffff;
9859 		  else if (more)
9860 		    minval = -0x8000, maxval = 0x7fff;
9861 		  else
9862 		    minval = -0x8000, maxval = 0xffff;
9863 
9864 		  if (imm_expr.X_op != O_constant
9865 		      || imm_expr.X_add_number < minval
9866 		      || imm_expr.X_add_number > maxval)
9867 		    {
9868 		      if (more)
9869 			break;
9870 		      if (imm_expr.X_op == O_constant
9871 			  || imm_expr.X_op == O_big)
9872 			as_bad (_("expression out of range"));
9873 		    }
9874 		}
9875 	      s = expr_end;
9876 	      continue;
9877 
9878 	    case 'o':		/* 16 bit offset */
9879 	      /* Check whether there is only a single bracketed expression
9880 		 left.  If so, it must be the base register and the
9881 		 constant must be zero.  */
9882 	      if (*s == '(' && strchr (s + 1, '(') == 0)
9883 		{
9884 		  offset_expr.X_op = O_constant;
9885 		  offset_expr.X_add_number = 0;
9886 		  continue;
9887 		}
9888 
9889 	      /* If this value won't fit into a 16 bit offset, then go
9890 		 find a macro that will generate the 32 bit offset
9891 		 code pattern.  */
9892 	      if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9893 		  && (offset_expr.X_op != O_constant
9894 		      || offset_expr.X_add_number >= 0x8000
9895 		      || offset_expr.X_add_number < -0x8000))
9896 		break;
9897 
9898 	      s = expr_end;
9899 	      continue;
9900 
9901 	    case 'p':		/* pc relative offset */
9902 	      *offset_reloc = BFD_RELOC_16_PCREL_S2;
9903 	      my_getExpression (&offset_expr, s);
9904 	      s = expr_end;
9905 	      continue;
9906 
9907 	    case 'u':		/* upper 16 bits */
9908 	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9909 		  && imm_expr.X_op == O_constant
9910 		  && (imm_expr.X_add_number < 0
9911 		      || imm_expr.X_add_number >= 0x10000))
9912 		as_bad (_("lui expression not in range 0..65535"));
9913 	      s = expr_end;
9914 	      continue;
9915 
9916 	    case 'a':		/* 26 bit address */
9917 	      my_getExpression (&offset_expr, s);
9918 	      s = expr_end;
9919 	      *offset_reloc = BFD_RELOC_MIPS_JMP;
9920 	      continue;
9921 
9922 	    case 'N':		/* 3 bit branch condition code */
9923 	    case 'M':		/* 3 bit compare condition code */
9924 	      rtype = RTYPE_CCC;
9925 	      if (ip->insn_mo->pinfo & (FP_D| FP_S))
9926 		rtype |= RTYPE_FCC;
9927 	      if (!reg_lookup (&s, rtype, &regno))
9928 		break;
9929 	      if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9930 		   || strcmp(str + strlen(str) - 5, "any2f") == 0
9931 		   || strcmp(str + strlen(str) - 5, "any2t") == 0)
9932 		  && (regno & 1) != 0)
9933 		as_warn(_("Condition code register should be even for %s, was %d"),
9934 			str, regno);
9935 	      if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9936 		   || strcmp(str + strlen(str) - 5, "any4t") == 0)
9937 		  && (regno & 3) != 0)
9938 		as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9939 			str, regno);
9940 	      if (*args == 'N')
9941 		INSERT_OPERAND (BCC, *ip, regno);
9942 	      else
9943 		INSERT_OPERAND (CCC, *ip, regno);
9944 	      continue;
9945 
9946 	    case 'H':
9947 	      if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9948 		s += 2;
9949 	      if (ISDIGIT (*s))
9950 		{
9951 		  c = 0;
9952 		  do
9953 		    {
9954 		      c *= 10;
9955 		      c += *s - '0';
9956 		      ++s;
9957 		    }
9958 		  while (ISDIGIT (*s));
9959 		}
9960 	      else
9961 		c = 8; /* Invalid sel value.  */
9962 
9963 	      if (c > 7)
9964 		as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9965 	      ip->insn_opcode |= c;
9966 	      continue;
9967 
9968 	    case 'e':
9969 	      /* Must be at least one digit.  */
9970 	      my_getExpression (&imm_expr, s);
9971 	      check_absolute_expr (ip, &imm_expr);
9972 
9973 	      if ((unsigned long) imm_expr.X_add_number
9974 		  > (unsigned long) OP_MASK_VECBYTE)
9975 		{
9976 		  as_bad (_("bad byte vector index (%ld)"),
9977 			   (long) imm_expr.X_add_number);
9978 		  imm_expr.X_add_number = 0;
9979 		}
9980 
9981 	      INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9982 	      imm_expr.X_op = O_absent;
9983 	      s = expr_end;
9984 	      continue;
9985 
9986 	    case '%':
9987 	      my_getExpression (&imm_expr, s);
9988 	      check_absolute_expr (ip, &imm_expr);
9989 
9990 	      if ((unsigned long) imm_expr.X_add_number
9991 		  > (unsigned long) OP_MASK_VECALIGN)
9992 		{
9993 		  as_bad (_("bad byte vector index (%ld)"),
9994 			   (long) imm_expr.X_add_number);
9995 		  imm_expr.X_add_number = 0;
9996 		}
9997 
9998 	      INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9999 	      imm_expr.X_op = O_absent;
10000 	      s = expr_end;
10001 	      continue;
10002 
10003 	    default:
10004 	      as_bad (_("bad char = '%c'\n"), *args);
10005 	      internalError ();
10006 	    }
10007 	  break;
10008 	}
10009       /* Args don't match.  */
10010       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10011 	  !strcmp (insn->name, insn[1].name))
10012 	{
10013 	  ++insn;
10014 	  s = argsStart;
10015 	  insn_error = _("illegal operands");
10016 	  continue;
10017 	}
10018       if (save_c)
10019 	*(--s) = save_c;
10020       insn_error = _("illegal operands");
10021       return;
10022     }
10023 }
10024 
10025 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10026 
10027 /* This routine assembles an instruction into its binary format when
10028    assembling for the mips16.  As a side effect, it sets one of the
10029    global variables imm_reloc or offset_reloc to the type of
10030    relocation to do if one of the operands is an address expression.
10031    It also sets mips16_small and mips16_ext if the user explicitly
10032    requested a small or extended instruction.  */
10033 
10034 static void
mips16_ip(char * str,struct mips_cl_insn * ip)10035 mips16_ip (char *str, struct mips_cl_insn *ip)
10036 {
10037   char *s;
10038   const char *args;
10039   struct mips_opcode *insn;
10040   char *argsstart;
10041   unsigned int regno;
10042   unsigned int lastregno = 0;
10043   char *s_reset;
10044   size_t i;
10045 
10046   insn_error = NULL;
10047 
10048   mips16_small = FALSE;
10049   mips16_ext = FALSE;
10050 
10051   for (s = str; ISLOWER (*s); ++s)
10052     ;
10053   switch (*s)
10054     {
10055     case '\0':
10056       break;
10057 
10058     case ' ':
10059       *s++ = '\0';
10060       break;
10061 
10062     case '.':
10063       if (s[1] == 't' && s[2] == ' ')
10064 	{
10065 	  *s = '\0';
10066 	  mips16_small = TRUE;
10067 	  s += 3;
10068 	  break;
10069 	}
10070       else if (s[1] == 'e' && s[2] == ' ')
10071 	{
10072 	  *s = '\0';
10073 	  mips16_ext = TRUE;
10074 	  s += 3;
10075 	  break;
10076 	}
10077       /* Fall through.  */
10078     default:
10079       insn_error = _("unknown opcode");
10080       return;
10081     }
10082 
10083   if (mips_opts.noautoextend && ! mips16_ext)
10084     mips16_small = TRUE;
10085 
10086   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10087     {
10088       insn_error = _("unrecognized opcode");
10089       return;
10090     }
10091 
10092   argsstart = s;
10093   for (;;)
10094     {
10095       bfd_boolean ok;
10096 
10097       assert (strcmp (insn->name, str) == 0);
10098 
10099       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
10100 	ok = TRUE;
10101       else
10102 	ok = FALSE;
10103 
10104       if (! ok)
10105 	{
10106 	  if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10107 	      && strcmp (insn->name, insn[1].name) == 0)
10108 	    {
10109 	      ++insn;
10110 	      continue;
10111 	    }
10112 	  else
10113 	    {
10114 	      if (!insn_error)
10115 		{
10116 		  static char buf[100];
10117 		  sprintf (buf,
10118 			   _("opcode not supported on this processor: %s (%s)"),
10119 			   mips_cpu_info_from_arch (mips_opts.arch)->name,
10120 			   mips_cpu_info_from_isa (mips_opts.isa)->name);
10121 		  insn_error = buf;
10122 		}
10123 	      return;
10124 	    }
10125 	}
10126 
10127       create_insn (ip, insn);
10128       imm_expr.X_op = O_absent;
10129       imm_reloc[0] = BFD_RELOC_UNUSED;
10130       imm_reloc[1] = BFD_RELOC_UNUSED;
10131       imm_reloc[2] = BFD_RELOC_UNUSED;
10132       imm2_expr.X_op = O_absent;
10133       offset_expr.X_op = O_absent;
10134       offset_reloc[0] = BFD_RELOC_UNUSED;
10135       offset_reloc[1] = BFD_RELOC_UNUSED;
10136       offset_reloc[2] = BFD_RELOC_UNUSED;
10137       for (args = insn->args; 1; ++args)
10138 	{
10139 	  int c;
10140 
10141 	  if (*s == ' ')
10142 	    ++s;
10143 
10144 	  /* In this switch statement we call break if we did not find
10145              a match, continue if we did find a match, or return if we
10146              are done.  */
10147 
10148 	  c = *args;
10149 	  switch (c)
10150 	    {
10151 	    case '\0':
10152 	      if (*s == '\0')
10153 		{
10154 		  /* Stuff the immediate value in now, if we can.  */
10155 		  if (imm_expr.X_op == O_constant
10156 		      && *imm_reloc > BFD_RELOC_UNUSED
10157 		      && insn->pinfo != INSN_MACRO)
10158 		    {
10159 		      valueT tmp;
10160 
10161 		      switch (*offset_reloc)
10162 			{
10163 			  case BFD_RELOC_MIPS16_HI16_S:
10164 			    tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10165 			    break;
10166 
10167 			  case BFD_RELOC_MIPS16_HI16:
10168 			    tmp = imm_expr.X_add_number >> 16;
10169 			    break;
10170 
10171 			  case BFD_RELOC_MIPS16_LO16:
10172 			    tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10173 				  - 0x8000;
10174 			    break;
10175 
10176 			  case BFD_RELOC_UNUSED:
10177 			    tmp = imm_expr.X_add_number;
10178 			    break;
10179 
10180 			  default:
10181 			    internalError ();
10182 			}
10183 		      *offset_reloc = BFD_RELOC_UNUSED;
10184 
10185 		      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10186 				    tmp, TRUE, mips16_small,
10187 				    mips16_ext, &ip->insn_opcode,
10188 				    &ip->use_extend, &ip->extend);
10189 		      imm_expr.X_op = O_absent;
10190 		      *imm_reloc = BFD_RELOC_UNUSED;
10191 		    }
10192 
10193 		  return;
10194 		}
10195 	      break;
10196 
10197 	    case ',':
10198 	      if (*s++ == c)
10199 		continue;
10200 	      s--;
10201 	      switch (*++args)
10202 		{
10203 		case 'v':
10204 		  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10205 		  continue;
10206 		case 'w':
10207 		  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10208 		  continue;
10209 		}
10210 	      break;
10211 
10212 	    case '(':
10213 	    case ')':
10214 	      if (*s++ == c)
10215 		continue;
10216 	      break;
10217 
10218 	    case 'v':
10219 	    case 'w':
10220 	      if (s[0] != '$')
10221 		{
10222 		  if (c == 'v')
10223 		    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10224 		  else
10225 		    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10226 		  ++args;
10227 		  continue;
10228 		}
10229 	      /* Fall through.  */
10230 	    case 'x':
10231 	    case 'y':
10232 	    case 'z':
10233 	    case 'Z':
10234 	    case '0':
10235 	    case 'S':
10236 	    case 'R':
10237 	    case 'X':
10238 	    case 'Y':
10239   	      s_reset = s;
10240 	      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10241 		{
10242 		  if (c == 'v' || c == 'w')
10243 		    {
10244 		      if (c == 'v')
10245 			MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10246 		      else
10247 			MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10248 		      ++args;
10249 		      continue;
10250 		    }
10251 		  break;
10252 		}
10253 
10254 	      if (*s == ' ')
10255 		++s;
10256 	      if (args[1] != *s)
10257 		{
10258 		  if (c == 'v' || c == 'w')
10259 		    {
10260 		      regno = mips16_to_32_reg_map[lastregno];
10261 		      s = s_reset;
10262 		      ++args;
10263 		    }
10264 		}
10265 
10266 	      switch (c)
10267 		{
10268 		case 'x':
10269 		case 'y':
10270 		case 'z':
10271 		case 'v':
10272 		case 'w':
10273 		case 'Z':
10274 		  regno = mips32_to_16_reg_map[regno];
10275 		  break;
10276 
10277 		case '0':
10278 		  if (regno != 0)
10279 		    regno = ILLEGAL_REG;
10280 		  break;
10281 
10282 		case 'S':
10283 		  if (regno != SP)
10284 		    regno = ILLEGAL_REG;
10285 		  break;
10286 
10287 		case 'R':
10288 		  if (regno != RA)
10289 		    regno = ILLEGAL_REG;
10290 		  break;
10291 
10292 		case 'X':
10293 		case 'Y':
10294 		  if (regno == AT && ! mips_opts.noat)
10295 		    as_warn (_("used $at without \".set noat\""));
10296 		  break;
10297 
10298 		default:
10299 		  internalError ();
10300 		}
10301 
10302 	      if (regno == ILLEGAL_REG)
10303 		break;
10304 
10305 	      switch (c)
10306 		{
10307 		case 'x':
10308 		case 'v':
10309 		  MIPS16_INSERT_OPERAND (RX, *ip, regno);
10310 		  break;
10311 		case 'y':
10312 		case 'w':
10313 		  MIPS16_INSERT_OPERAND (RY, *ip, regno);
10314 		  break;
10315 		case 'z':
10316 		  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10317 		  break;
10318 		case 'Z':
10319 		  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10320 		case '0':
10321 		case 'S':
10322 		case 'R':
10323 		  break;
10324 		case 'X':
10325 		  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10326 		  break;
10327 		case 'Y':
10328 		  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10329 		  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10330 		  break;
10331 		default:
10332 		  internalError ();
10333 		}
10334 
10335 	      lastregno = regno;
10336 	      continue;
10337 
10338 	    case 'P':
10339 	      if (strncmp (s, "$pc", 3) == 0)
10340 		{
10341 		  s += 3;
10342 		  continue;
10343 		}
10344 	      break;
10345 
10346 	    case '5':
10347 	    case 'H':
10348 	    case 'W':
10349 	    case 'D':
10350 	    case 'j':
10351 	    case 'V':
10352 	    case 'C':
10353 	    case 'U':
10354 	    case 'k':
10355 	    case 'K':
10356 	      i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10357 	      if (i > 0)
10358 		{
10359 		  if (imm_expr.X_op != O_constant)
10360 		    {
10361 		      mips16_ext = TRUE;
10362 		      ip->use_extend = TRUE;
10363 		      ip->extend = 0;
10364 		    }
10365 		  else
10366 		    {
10367 		      /* We need to relax this instruction.  */
10368 		      *offset_reloc = *imm_reloc;
10369 		      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10370 		    }
10371 		  s = expr_end;
10372 		  continue;
10373 		}
10374 	      *imm_reloc = BFD_RELOC_UNUSED;
10375 	      /* Fall through.  */
10376 	    case '<':
10377 	    case '>':
10378 	    case '[':
10379 	    case ']':
10380 	    case '4':
10381 	    case '8':
10382 	      my_getExpression (&imm_expr, s);
10383 	      if (imm_expr.X_op == O_register)
10384 		{
10385 		  /* What we thought was an expression turned out to
10386                      be a register.  */
10387 
10388 		  if (s[0] == '(' && args[1] == '(')
10389 		    {
10390 		      /* It looks like the expression was omitted
10391 			 before a register indirection, which means
10392 			 that the expression is implicitly zero.  We
10393 			 still set up imm_expr, so that we handle
10394 			 explicit extensions correctly.  */
10395 		      imm_expr.X_op = O_constant;
10396 		      imm_expr.X_add_number = 0;
10397 		      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10398 		      continue;
10399 		    }
10400 
10401 		  break;
10402 		}
10403 
10404 	      /* We need to relax this instruction.  */
10405 	      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10406 	      s = expr_end;
10407 	      continue;
10408 
10409 	    case 'p':
10410 	    case 'q':
10411 	    case 'A':
10412 	    case 'B':
10413 	    case 'E':
10414 	      /* We use offset_reloc rather than imm_reloc for the PC
10415                  relative operands.  This lets macros with both
10416                  immediate and address operands work correctly.  */
10417 	      my_getExpression (&offset_expr, s);
10418 
10419 	      if (offset_expr.X_op == O_register)
10420 		break;
10421 
10422 	      /* We need to relax this instruction.  */
10423 	      *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10424 	      s = expr_end;
10425 	      continue;
10426 
10427 	    case '6':		/* break code */
10428 	      my_getExpression (&imm_expr, s);
10429 	      check_absolute_expr (ip, &imm_expr);
10430 	      if ((unsigned long) imm_expr.X_add_number > 63)
10431 		as_warn (_("Invalid value for `%s' (%lu)"),
10432 			 ip->insn_mo->name,
10433 			 (unsigned long) imm_expr.X_add_number);
10434 	      MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10435 	      imm_expr.X_op = O_absent;
10436 	      s = expr_end;
10437 	      continue;
10438 
10439 	    case 'a':		/* 26 bit address */
10440 	      my_getExpression (&offset_expr, s);
10441 	      s = expr_end;
10442 	      *offset_reloc = BFD_RELOC_MIPS16_JMP;
10443 	      ip->insn_opcode <<= 16;
10444 	      continue;
10445 
10446 	    case 'l':		/* register list for entry macro */
10447 	    case 'L':		/* register list for exit macro */
10448 	      {
10449 		int mask;
10450 
10451 		if (c == 'l')
10452 		  mask = 0;
10453 		else
10454 		  mask = 7 << 3;
10455 		while (*s != '\0')
10456 		  {
10457 		    unsigned int freg, reg1, reg2;
10458 
10459 		    while (*s == ' ' || *s == ',')
10460 		      ++s;
10461 		    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10462 		      freg = 0;
10463 		    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10464 		      freg = 1;
10465 		    else
10466 		      {
10467 			as_bad (_("can't parse register list"));
10468 			break;
10469 		      }
10470 		    if (*s == ' ')
10471 		      ++s;
10472 		    if (*s != '-')
10473 		      reg2 = reg1;
10474 		    else
10475 		      {
10476 			++s;
10477 			if (!reg_lookup (&s, freg ? RTYPE_FPU
10478 					 : (RTYPE_GP | RTYPE_NUM), &reg2))
10479 			  {
10480 			    as_bad (_("invalid register list"));
10481 			    break;
10482 			  }
10483 		      }
10484 		    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10485 		      {
10486 			mask &= ~ (7 << 3);
10487 			mask |= 5 << 3;
10488 		      }
10489 		    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10490 		      {
10491 			mask &= ~ (7 << 3);
10492 			mask |= 6 << 3;
10493 		      }
10494 		    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10495 		      mask |= (reg2 - 3) << 3;
10496 		    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10497 		      mask |= (reg2 - 15) << 1;
10498 		    else if (reg1 == RA && reg2 == RA)
10499 		      mask |= 1;
10500 		    else
10501 		      {
10502 			as_bad (_("invalid register list"));
10503 			break;
10504 		      }
10505 		  }
10506 		/* The mask is filled in in the opcode table for the
10507                    benefit of the disassembler.  We remove it before
10508                    applying the actual mask.  */
10509 		ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10510 		ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10511 	      }
10512 	    continue;
10513 
10514 	    case 'm':		/* Register list for save insn.  */
10515 	    case 'M':		/* Register list for restore insn.  */
10516 	      {
10517 		int opcode = 0;
10518 		int framesz = 0, seen_framesz = 0;
10519 		int args = 0, statics = 0, sregs = 0;
10520 
10521 		while (*s != '\0')
10522 		  {
10523 		    unsigned int reg1, reg2;
10524 
10525 		    SKIP_SPACE_TABS (s);
10526 		    while (*s == ',')
10527 		      ++s;
10528 		    SKIP_SPACE_TABS (s);
10529 
10530 		    my_getExpression (&imm_expr, s);
10531 		    if (imm_expr.X_op == O_constant)
10532 		      {
10533 			/* Handle the frame size.  */
10534 			if (seen_framesz)
10535 			  {
10536 			    as_bad (_("more than one frame size in list"));
10537 			    break;
10538 			  }
10539 			seen_framesz = 1;
10540 			framesz = imm_expr.X_add_number;
10541 			imm_expr.X_op = O_absent;
10542 			s = expr_end;
10543 			continue;
10544 		      }
10545 
10546 		    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10547 		      {
10548 			as_bad (_("can't parse register list"));
10549 			break;
10550 		      }
10551 
10552 		    while (*s == ' ')
10553 		      ++s;
10554 
10555 		    if (*s != '-')
10556 		      reg2 = reg1;
10557 		    else
10558 		      {
10559 			++s;
10560 			if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10561 			    || reg2 < reg1)
10562 			  {
10563 			    as_bad (_("can't parse register list"));
10564 			    break;
10565 			  }
10566 		      }
10567 
10568 		    while (reg1 <= reg2)
10569 		      {
10570 			if (reg1 >= 4 && reg1 <= 7)
10571 			  {
10572 			    if (!seen_framesz)
10573 				/* args $a0-$a3 */
10574 				args |= 1 << (reg1 - 4);
10575 			    else
10576 				/* statics $a0-$a3 */
10577 				statics |= 1 << (reg1 - 4);
10578 			  }
10579 			else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10580 			  {
10581 			    /* $s0-$s8 */
10582 			    sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10583 			  }
10584 			else if (reg1 == 31)
10585 			  {
10586 			    /* Add $ra to insn.  */
10587 			    opcode |= 0x40;
10588 			  }
10589 			else
10590 			  {
10591 			    as_bad (_("unexpected register in list"));
10592 			    break;
10593 			  }
10594 			if (++reg1 == 24)
10595 			  reg1 = 30;
10596 		      }
10597 		  }
10598 
10599 		/* Encode args/statics combination.  */
10600 		if (args & statics)
10601 		  as_bad (_("arg/static registers overlap"));
10602 		else if (args == 0xf)
10603 		  /* All $a0-$a3 are args.  */
10604 		  opcode |= MIPS16_ALL_ARGS << 16;
10605 		else if (statics == 0xf)
10606 		  /* All $a0-$a3 are statics.  */
10607 		  opcode |= MIPS16_ALL_STATICS << 16;
10608 		else
10609 		  {
10610 		    int narg = 0, nstat = 0;
10611 
10612 		    /* Count arg registers.  */
10613 		    while (args & 0x1)
10614 		      {
10615 			args >>= 1;
10616 			narg++;
10617 		      }
10618 		    if (args != 0)
10619 		      as_bad (_("invalid arg register list"));
10620 
10621 		    /* Count static registers.  */
10622 		    while (statics & 0x8)
10623 		      {
10624 			statics = (statics << 1) & 0xf;
10625 			nstat++;
10626 		      }
10627 		    if (statics != 0)
10628 		      as_bad (_("invalid static register list"));
10629 
10630 		    /* Encode args/statics.  */
10631 		    opcode |= ((narg << 2) | nstat) << 16;
10632 		  }
10633 
10634 		/* Encode $s0/$s1.  */
10635 		if (sregs & (1 << 0))		/* $s0 */
10636 		  opcode |= 0x20;
10637 		if (sregs & (1 << 1))		/* $s1 */
10638 		  opcode |= 0x10;
10639 		sregs >>= 2;
10640 
10641 		if (sregs != 0)
10642 		  {
10643 		    /* Count regs $s2-$s8.  */
10644 		    int nsreg = 0;
10645 		    while (sregs & 1)
10646 		      {
10647 			sregs >>= 1;
10648 			nsreg++;
10649 		      }
10650 		    if (sregs != 0)
10651 		      as_bad (_("invalid static register list"));
10652 		    /* Encode $s2-$s8. */
10653 		    opcode |= nsreg << 24;
10654 		  }
10655 
10656 		/* Encode frame size.  */
10657 		if (!seen_framesz)
10658 		  as_bad (_("missing frame size"));
10659 		else if ((framesz & 7) != 0 || framesz < 0
10660 			 || framesz > 0xff * 8)
10661 		  as_bad (_("invalid frame size"));
10662 		else if (framesz != 128 || (opcode >> 16) != 0)
10663 		  {
10664 		    framesz /= 8;
10665 		    opcode |= (((framesz & 0xf0) << 16)
10666 			     | (framesz & 0x0f));
10667 		  }
10668 
10669 		/* Finally build the instruction.  */
10670 		if ((opcode >> 16) != 0 || framesz == 0)
10671 		  {
10672 		    ip->use_extend = TRUE;
10673 		    ip->extend = opcode >> 16;
10674 		  }
10675 		ip->insn_opcode |= opcode & 0x7f;
10676 	      }
10677 	    continue;
10678 
10679 	    case 'e':		/* extend code */
10680 	      my_getExpression (&imm_expr, s);
10681 	      check_absolute_expr (ip, &imm_expr);
10682 	      if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10683 		{
10684 		  as_warn (_("Invalid value for `%s' (%lu)"),
10685 			   ip->insn_mo->name,
10686 			   (unsigned long) imm_expr.X_add_number);
10687 		  imm_expr.X_add_number &= 0x7ff;
10688 		}
10689 	      ip->insn_opcode |= imm_expr.X_add_number;
10690 	      imm_expr.X_op = O_absent;
10691 	      s = expr_end;
10692 	      continue;
10693 
10694 	    default:
10695 	      internalError ();
10696 	    }
10697 	  break;
10698 	}
10699 
10700       /* Args don't match.  */
10701       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10702 	  strcmp (insn->name, insn[1].name) == 0)
10703 	{
10704 	  ++insn;
10705 	  s = argsstart;
10706 	  continue;
10707 	}
10708 
10709       insn_error = _("illegal operands");
10710 
10711       return;
10712     }
10713 }
10714 
10715 /* This structure holds information we know about a mips16 immediate
10716    argument type.  */
10717 
10718 struct mips16_immed_operand
10719 {
10720   /* The type code used in the argument string in the opcode table.  */
10721   int type;
10722   /* The number of bits in the short form of the opcode.  */
10723   int nbits;
10724   /* The number of bits in the extended form of the opcode.  */
10725   int extbits;
10726   /* The amount by which the short form is shifted when it is used;
10727      for example, the sw instruction has a shift count of 2.  */
10728   int shift;
10729   /* The amount by which the short form is shifted when it is stored
10730      into the instruction code.  */
10731   int op_shift;
10732   /* Non-zero if the short form is unsigned.  */
10733   int unsp;
10734   /* Non-zero if the extended form is unsigned.  */
10735   int extu;
10736   /* Non-zero if the value is PC relative.  */
10737   int pcrel;
10738 };
10739 
10740 /* The mips16 immediate operand types.  */
10741 
10742 static const struct mips16_immed_operand mips16_immed_operands[] =
10743 {
10744   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10745   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10746   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10747   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10748   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10749   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10750   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10751   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10752   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10753   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10754   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10755   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10756   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10757   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10758   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10759   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10760   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10761   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10762   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10763   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10764   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10765 };
10766 
10767 #define MIPS16_NUM_IMMED \
10768   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10769 
10770 /* Handle a mips16 instruction with an immediate value.  This or's the
10771    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10772    whether an extended value is needed; if one is needed, it sets
10773    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10774    If SMALL is true, an unextended opcode was explicitly requested.
10775    If EXT is true, an extended opcode was explicitly requested.  If
10776    WARN is true, warn if EXT does not match reality.  */
10777 
10778 static void
mips16_immed(char * file,unsigned int line,int type,offsetT val,bfd_boolean warn,bfd_boolean small,bfd_boolean ext,unsigned long * insn,bfd_boolean * use_extend,unsigned short * extend)10779 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10780 	      bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10781 	      unsigned long *insn, bfd_boolean *use_extend,
10782 	      unsigned short *extend)
10783 {
10784   const struct mips16_immed_operand *op;
10785   int mintiny, maxtiny;
10786   bfd_boolean needext;
10787 
10788   op = mips16_immed_operands;
10789   while (op->type != type)
10790     {
10791       ++op;
10792       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10793     }
10794 
10795   if (op->unsp)
10796     {
10797       if (type == '<' || type == '>' || type == '[' || type == ']')
10798 	{
10799 	  mintiny = 1;
10800 	  maxtiny = 1 << op->nbits;
10801 	}
10802       else
10803 	{
10804 	  mintiny = 0;
10805 	  maxtiny = (1 << op->nbits) - 1;
10806 	}
10807     }
10808   else
10809     {
10810       mintiny = - (1 << (op->nbits - 1));
10811       maxtiny = (1 << (op->nbits - 1)) - 1;
10812     }
10813 
10814   /* Branch offsets have an implicit 0 in the lowest bit.  */
10815   if (type == 'p' || type == 'q')
10816     val /= 2;
10817 
10818   if ((val & ((1 << op->shift) - 1)) != 0
10819       || val < (mintiny << op->shift)
10820       || val > (maxtiny << op->shift))
10821     needext = TRUE;
10822   else
10823     needext = FALSE;
10824 
10825   if (warn && ext && ! needext)
10826     as_warn_where (file, line,
10827 		   _("extended operand requested but not required"));
10828   if (small && needext)
10829     as_bad_where (file, line, _("invalid unextended operand value"));
10830 
10831   if (small || (! ext && ! needext))
10832     {
10833       int insnval;
10834 
10835       *use_extend = FALSE;
10836       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10837       insnval <<= op->op_shift;
10838       *insn |= insnval;
10839     }
10840   else
10841     {
10842       long minext, maxext;
10843       int extval;
10844 
10845       if (op->extu)
10846 	{
10847 	  minext = 0;
10848 	  maxext = (1 << op->extbits) - 1;
10849 	}
10850       else
10851 	{
10852 	  minext = - (1 << (op->extbits - 1));
10853 	  maxext = (1 << (op->extbits - 1)) - 1;
10854 	}
10855       if (val < minext || val > maxext)
10856 	as_bad_where (file, line,
10857 		      _("operand value out of range for instruction"));
10858 
10859       *use_extend = TRUE;
10860       if (op->extbits == 16)
10861 	{
10862 	  extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10863 	  val &= 0x1f;
10864 	}
10865       else if (op->extbits == 15)
10866 	{
10867 	  extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10868 	  val &= 0xf;
10869 	}
10870       else
10871 	{
10872 	  extval = ((val & 0x1f) << 6) | (val & 0x20);
10873 	  val = 0;
10874 	}
10875 
10876       *extend = (unsigned short) extval;
10877       *insn |= val;
10878     }
10879 }
10880 
10881 struct percent_op_match
10882 {
10883   const char *str;
10884   bfd_reloc_code_real_type reloc;
10885 };
10886 
10887 static const struct percent_op_match mips_percent_op[] =
10888 {
10889   {"%lo", BFD_RELOC_LO16},
10890 #ifdef OBJ_ELF
10891   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10892   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10893   {"%call16", BFD_RELOC_MIPS_CALL16},
10894   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10895   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10896   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10897   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10898   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10899   {"%got", BFD_RELOC_MIPS_GOT16},
10900   {"%gp_rel", BFD_RELOC_GPREL16},
10901   {"%half", BFD_RELOC_16},
10902   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10903   {"%higher", BFD_RELOC_MIPS_HIGHER},
10904   {"%neg", BFD_RELOC_MIPS_SUB},
10905   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10906   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10907   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10908   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10909   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10910   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10911   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10912 #endif
10913   {"%hi", BFD_RELOC_HI16_S}
10914 };
10915 
10916 static const struct percent_op_match mips16_percent_op[] =
10917 {
10918   {"%lo", BFD_RELOC_MIPS16_LO16},
10919   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10920   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10921 };
10922 
10923 
10924 /* Return true if *STR points to a relocation operator.  When returning true,
10925    move *STR over the operator and store its relocation code in *RELOC.
10926    Leave both *STR and *RELOC alone when returning false.  */
10927 
10928 static bfd_boolean
parse_relocation(char ** str,bfd_reloc_code_real_type * reloc)10929 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10930 {
10931   const struct percent_op_match *percent_op;
10932   size_t limit, i;
10933 
10934   if (mips_opts.mips16)
10935     {
10936       percent_op = mips16_percent_op;
10937       limit = ARRAY_SIZE (mips16_percent_op);
10938     }
10939   else
10940     {
10941       percent_op = mips_percent_op;
10942       limit = ARRAY_SIZE (mips_percent_op);
10943     }
10944 
10945   for (i = 0; i < limit; i++)
10946     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10947       {
10948 	int len = strlen (percent_op[i].str);
10949 
10950 	if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10951 	  continue;
10952 
10953 	*str += strlen (percent_op[i].str);
10954 	*reloc = percent_op[i].reloc;
10955 
10956 	/* Check whether the output BFD supports this relocation.
10957 	   If not, issue an error and fall back on something safe.  */
10958 	if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10959 	  {
10960 	    as_bad ("relocation %s isn't supported by the current ABI",
10961 		    percent_op[i].str);
10962 	    *reloc = BFD_RELOC_UNUSED;
10963 	  }
10964 	return TRUE;
10965       }
10966   return FALSE;
10967 }
10968 
10969 
10970 /* Parse string STR as a 16-bit relocatable operand.  Store the
10971    expression in *EP and the relocations in the array starting
10972    at RELOC.  Return the number of relocation operators used.
10973 
10974    On exit, EXPR_END points to the first character after the expression.  */
10975 
10976 static size_t
my_getSmallExpression(expressionS * ep,bfd_reloc_code_real_type * reloc,char * str)10977 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10978 		       char *str)
10979 {
10980   bfd_reloc_code_real_type reversed_reloc[3];
10981   size_t reloc_index, i;
10982   int crux_depth, str_depth;
10983   char *crux;
10984 
10985   /* Search for the start of the main expression, recoding relocations
10986      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10987      of the main expression and with CRUX_DEPTH containing the number
10988      of open brackets at that point.  */
10989   reloc_index = -1;
10990   str_depth = 0;
10991   do
10992     {
10993       reloc_index++;
10994       crux = str;
10995       crux_depth = str_depth;
10996 
10997       /* Skip over whitespace and brackets, keeping count of the number
10998 	 of brackets.  */
10999       while (*str == ' ' || *str == '\t' || *str == '(')
11000 	if (*str++ == '(')
11001 	  str_depth++;
11002     }
11003   while (*str == '%'
11004 	 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11005 	 && parse_relocation (&str, &reversed_reloc[reloc_index]));
11006 
11007   my_getExpression (ep, crux);
11008   str = expr_end;
11009 
11010   /* Match every open bracket.  */
11011   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11012     if (*str++ == ')')
11013       crux_depth--;
11014 
11015   if (crux_depth > 0)
11016     as_bad ("unclosed '('");
11017 
11018   expr_end = str;
11019 
11020   if (reloc_index != 0)
11021     {
11022       prev_reloc_op_frag = frag_now;
11023       for (i = 0; i < reloc_index; i++)
11024 	reloc[i] = reversed_reloc[reloc_index - 1 - i];
11025     }
11026 
11027   return reloc_index;
11028 }
11029 
11030 static void
my_getExpression(expressionS * ep,char * str)11031 my_getExpression (expressionS *ep, char *str)
11032 {
11033   char *save_in;
11034   valueT val;
11035 
11036   save_in = input_line_pointer;
11037   input_line_pointer = str;
11038   expression (ep);
11039   expr_end = input_line_pointer;
11040   input_line_pointer = save_in;
11041 
11042   /* If we are in mips16 mode, and this is an expression based on `.',
11043      then we bump the value of the symbol by 1 since that is how other
11044      text symbols are handled.  We don't bother to handle complex
11045      expressions, just `.' plus or minus a constant.  */
11046   if (mips_opts.mips16
11047       && ep->X_op == O_symbol
11048       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11049       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11050       && symbol_get_frag (ep->X_add_symbol) == frag_now
11051       && symbol_constant_p (ep->X_add_symbol)
11052       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11053     S_SET_VALUE (ep->X_add_symbol, val + 1);
11054 }
11055 
11056 /* Turn a string in input_line_pointer into a floating point constant
11057    of type TYPE, and store the appropriate bytes in *LITP.  The number
11058    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
11059    returned, or NULL on OK.  */
11060 
11061 char *
md_atof(int type,char * litP,int * sizeP)11062 md_atof (int type, char *litP, int *sizeP)
11063 {
11064   int prec;
11065   LITTLENUM_TYPE words[4];
11066   char *t;
11067   int i;
11068 
11069   switch (type)
11070     {
11071     case 'f':
11072       prec = 2;
11073       break;
11074 
11075     case 'd':
11076       prec = 4;
11077       break;
11078 
11079     default:
11080       *sizeP = 0;
11081       return _("bad call to md_atof");
11082     }
11083 
11084   t = atof_ieee (input_line_pointer, type, words);
11085   if (t)
11086     input_line_pointer = t;
11087 
11088   *sizeP = prec * 2;
11089 
11090   if (! target_big_endian)
11091     {
11092       for (i = prec - 1; i >= 0; i--)
11093 	{
11094 	  md_number_to_chars (litP, words[i], 2);
11095 	  litP += 2;
11096 	}
11097     }
11098   else
11099     {
11100       for (i = 0; i < prec; i++)
11101 	{
11102 	  md_number_to_chars (litP, words[i], 2);
11103 	  litP += 2;
11104 	}
11105     }
11106 
11107   return NULL;
11108 }
11109 
11110 void
md_number_to_chars(char * buf,valueT val,int n)11111 md_number_to_chars (char *buf, valueT val, int n)
11112 {
11113   if (target_big_endian)
11114     number_to_chars_bigendian (buf, val, n);
11115   else
11116     number_to_chars_littleendian (buf, val, n);
11117 }
11118 
11119 #ifdef OBJ_ELF
support_64bit_objects(void)11120 static int support_64bit_objects(void)
11121 {
11122   const char **list, **l;
11123   int yes;
11124 
11125   list = bfd_target_list ();
11126   for (l = list; *l != NULL; l++)
11127 #ifdef TE_TMIPS
11128     /* This is traditional mips */
11129     if (strcmp (*l, "elf64-tradbigmips") == 0
11130 	|| strcmp (*l, "elf64-tradlittlemips") == 0)
11131 #else
11132     if (strcmp (*l, "elf64-bigmips") == 0
11133 	|| strcmp (*l, "elf64-littlemips") == 0)
11134 #endif
11135       break;
11136   yes = (*l != NULL);
11137   free (list);
11138   return yes;
11139 }
11140 #endif /* OBJ_ELF */
11141 
11142 const char *md_shortopts = "O::g::G:";
11143 
11144 struct option md_longopts[] =
11145 {
11146   /* Options which specify architecture.  */
11147 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
11148 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
11149   {"march", required_argument, NULL, OPTION_MARCH},
11150 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
11151   {"mtune", required_argument, NULL, OPTION_MTUNE},
11152 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
11153   {"mips0", no_argument, NULL, OPTION_MIPS1},
11154   {"mips1", no_argument, NULL, OPTION_MIPS1},
11155 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
11156   {"mips2", no_argument, NULL, OPTION_MIPS2},
11157 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
11158   {"mips3", no_argument, NULL, OPTION_MIPS3},
11159 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
11160   {"mips4", no_argument, NULL, OPTION_MIPS4},
11161 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
11162   {"mips5", no_argument, NULL, OPTION_MIPS5},
11163 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
11164   {"mips32", no_argument, NULL, OPTION_MIPS32},
11165 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
11166   {"mips64", no_argument, NULL, OPTION_MIPS64},
11167 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
11168   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11169 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
11170   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11171 
11172   /* Options which specify Application Specific Extensions (ASEs).  */
11173 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
11174 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
11175   {"mips16", no_argument, NULL, OPTION_MIPS16},
11176 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
11177   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11178 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
11179   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11180 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
11181   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11182 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
11183   {"mdmx", no_argument, NULL, OPTION_MDMX},
11184 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
11185   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11186 #define OPTION_DSP (OPTION_ASE_BASE + 6)
11187   {"mdsp", no_argument, NULL, OPTION_DSP},
11188 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
11189   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11190 #define OPTION_MT (OPTION_ASE_BASE + 8)
11191   {"mmt", no_argument, NULL, OPTION_MT},
11192 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
11193   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11194 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
11195   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11196 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
11197   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11198 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
11199   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11200 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
11201   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11202 
11203   /* Old-style architecture options.  Don't add more of these.  */
11204 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
11205 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
11206   {"m4650", no_argument, NULL, OPTION_M4650},
11207 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
11208   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11209 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
11210   {"m4010", no_argument, NULL, OPTION_M4010},
11211 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
11212   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11213 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
11214   {"m4100", no_argument, NULL, OPTION_M4100},
11215 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
11216   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11217 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
11218   {"m3900", no_argument, NULL, OPTION_M3900},
11219 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
11220   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11221 
11222   /* Options which enable bug fixes.  */
11223 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
11224 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
11225   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11226 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
11227   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11228   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11229 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
11230 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
11231   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11232   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11233 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
11234 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
11235   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11236   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11237 
11238   /* Miscellaneous options.  */
11239 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
11240 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
11241   {"trap", no_argument, NULL, OPTION_TRAP},
11242   {"no-break", no_argument, NULL, OPTION_TRAP},
11243 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
11244   {"break", no_argument, NULL, OPTION_BREAK},
11245   {"no-trap", no_argument, NULL, OPTION_BREAK},
11246 #define OPTION_EB (OPTION_MISC_BASE + 2)
11247   {"EB", no_argument, NULL, OPTION_EB},
11248 #define OPTION_EL (OPTION_MISC_BASE + 3)
11249   {"EL", no_argument, NULL, OPTION_EL},
11250 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
11251   {"mfp32", no_argument, NULL, OPTION_FP32},
11252 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
11253   {"mgp32", no_argument, NULL, OPTION_GP32},
11254 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
11255   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11256 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
11257   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11258 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
11259   {"mfp64", no_argument, NULL, OPTION_FP64},
11260 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
11261   {"mgp64", no_argument, NULL, OPTION_GP64},
11262 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
11263 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
11264   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11265   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11266 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
11267 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
11268   {"mshared", no_argument, NULL, OPTION_MSHARED},
11269   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11270 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
11271 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
11272   {"msym32", no_argument, NULL, OPTION_MSYM32},
11273   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11274 
11275   /* ELF-specific options.  */
11276 #ifdef OBJ_ELF
11277 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
11278 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
11279   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11280   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11281 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
11282   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11283 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
11284   {"xgot",        no_argument, NULL, OPTION_XGOT},
11285 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
11286   {"mabi", required_argument, NULL, OPTION_MABI},
11287 #define OPTION_32 	   (OPTION_ELF_BASE + 4)
11288   {"32",          no_argument, NULL, OPTION_32},
11289 #define OPTION_N32 	   (OPTION_ELF_BASE + 5)
11290   {"n32",         no_argument, NULL, OPTION_N32},
11291 #define OPTION_64          (OPTION_ELF_BASE + 6)
11292   {"64",          no_argument, NULL, OPTION_64},
11293 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
11294   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11295 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
11296   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11297 #define OPTION_PDR	   (OPTION_ELF_BASE + 9)
11298   {"mpdr", no_argument, NULL, OPTION_PDR},
11299 #define OPTION_NO_PDR	   (OPTION_ELF_BASE + 10)
11300   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11301 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
11302   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11303 #endif /* OBJ_ELF */
11304 
11305 #define OPTION_MOCTEON_UNSUPPORTED (OPTION_MISC_BASE + 28)
11306 #define OPTION_NO_MOCTEON_UNSUPPORTED (OPTION_MISC_BASE + 29)
11307   {"mocteon-unsupported", no_argument, NULL, OPTION_MOCTEON_UNSUPPORTED},
11308   {"mno-octeon-unsupported", no_argument, NULL, OPTION_NO_MOCTEON_UNSUPPORTED},
11309 
11310 #define OPTION_MOCTEON_USEUN (OPTION_MISC_BASE + 30)
11311 #define OPTION_NO_MOCTEON_USEUN (OPTION_MISC_BASE + 31)
11312   {"mocteon-useun", no_argument, NULL, OPTION_MOCTEON_USEUN},
11313   {"mno-octeon-useun", no_argument, NULL, OPTION_NO_MOCTEON_USEUN},
11314 
11315   {NULL, no_argument, NULL, 0}
11316 };
11317 size_t md_longopts_size = sizeof (md_longopts);
11318 
11319 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11320    NEW_VALUE.  Warn if another value was already specified.  Note:
11321    we have to defer parsing the -march and -mtune arguments in order
11322    to handle 'from-abi' correctly, since the ABI might be specified
11323    in a later argument.  */
11324 
11325 static void
mips_set_option_string(const char ** string_ptr,const char * new_value)11326 mips_set_option_string (const char **string_ptr, const char *new_value)
11327 {
11328   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11329     as_warn (_("A different %s was already specified, is now %s"),
11330 	     string_ptr == &mips_arch_string ? "-march" : "-mtune",
11331 	     new_value);
11332 
11333   *string_ptr = new_value;
11334 }
11335 
11336 int
md_parse_option(int c,char * arg)11337 md_parse_option (int c, char *arg)
11338 {
11339   switch (c)
11340     {
11341     case OPTION_CONSTRUCT_FLOATS:
11342       mips_disable_float_construction = 0;
11343       break;
11344 
11345     case OPTION_NO_CONSTRUCT_FLOATS:
11346       mips_disable_float_construction = 1;
11347       break;
11348 
11349     case OPTION_TRAP:
11350       mips_trap = 1;
11351       break;
11352 
11353     case OPTION_BREAK:
11354       mips_trap = 0;
11355       break;
11356 
11357     case OPTION_EB:
11358       target_big_endian = 1;
11359       break;
11360 
11361     case OPTION_EL:
11362       target_big_endian = 0;
11363       break;
11364 
11365     case OPTION_MOCTEON_UNSUPPORTED:
11366       octeon_error_on_unsupported = 1;
11367       break;
11368 
11369     case OPTION_NO_MOCTEON_UNSUPPORTED:
11370       octeon_error_on_unsupported = 0;
11371       break;
11372 
11373     case OPTION_MOCTEON_USEUN:
11374       octeon_use_unalign = 1;
11375       break;
11376 
11377     case OPTION_NO_MOCTEON_USEUN:
11378       octeon_use_unalign = 0;
11379       break;
11380 
11381     case 'O':
11382       if (arg && arg[0] == '0')
11383 	mips_optimize = 1;
11384       else
11385 	mips_optimize = 2;
11386       break;
11387 
11388     case 'g':
11389       if (arg == NULL)
11390 	mips_debug = 2;
11391       else
11392 	mips_debug = atoi (arg);
11393       break;
11394 
11395     case OPTION_MIPS1:
11396       file_mips_isa = ISA_MIPS1;
11397       break;
11398 
11399     case OPTION_MIPS2:
11400       file_mips_isa = ISA_MIPS2;
11401       break;
11402 
11403     case OPTION_MIPS3:
11404       file_mips_isa = ISA_MIPS3;
11405       break;
11406 
11407     case OPTION_MIPS4:
11408       file_mips_isa = ISA_MIPS4;
11409       break;
11410 
11411     case OPTION_MIPS5:
11412       file_mips_isa = ISA_MIPS5;
11413       break;
11414 
11415     case OPTION_MIPS32:
11416       file_mips_isa = ISA_MIPS32;
11417       break;
11418 
11419     case OPTION_MIPS32R2:
11420       file_mips_isa = ISA_MIPS32R2;
11421       break;
11422 
11423     case OPTION_MIPS64R2:
11424       file_mips_isa = ISA_MIPS64R2;
11425       break;
11426 
11427     case OPTION_MIPS64:
11428       file_mips_isa = ISA_MIPS64;
11429       break;
11430 
11431     case OPTION_MTUNE:
11432       mips_set_option_string (&mips_tune_string, arg);
11433       break;
11434 
11435     case OPTION_MARCH:
11436       mips_set_option_string (&mips_arch_string, arg);
11437       break;
11438 
11439     case OPTION_M4650:
11440       mips_set_option_string (&mips_arch_string, "4650");
11441       mips_set_option_string (&mips_tune_string, "4650");
11442       break;
11443 
11444     case OPTION_NO_M4650:
11445       break;
11446 
11447     case OPTION_M4010:
11448       mips_set_option_string (&mips_arch_string, "4010");
11449       mips_set_option_string (&mips_tune_string, "4010");
11450       break;
11451 
11452     case OPTION_NO_M4010:
11453       break;
11454 
11455     case OPTION_M4100:
11456       mips_set_option_string (&mips_arch_string, "4100");
11457       mips_set_option_string (&mips_tune_string, "4100");
11458       break;
11459 
11460     case OPTION_NO_M4100:
11461       break;
11462 
11463     case OPTION_M3900:
11464       mips_set_option_string (&mips_arch_string, "3900");
11465       mips_set_option_string (&mips_tune_string, "3900");
11466       break;
11467 
11468     case OPTION_NO_M3900:
11469       break;
11470 
11471     case OPTION_MDMX:
11472       mips_opts.ase_mdmx = 1;
11473       break;
11474 
11475     case OPTION_NO_MDMX:
11476       mips_opts.ase_mdmx = 0;
11477       break;
11478 
11479     case OPTION_DSP:
11480       mips_opts.ase_dsp = 1;
11481       mips_opts.ase_dspr2 = 0;
11482       break;
11483 
11484     case OPTION_NO_DSP:
11485       mips_opts.ase_dsp = 0;
11486       mips_opts.ase_dspr2 = 0;
11487       break;
11488 
11489     case OPTION_DSPR2:
11490       mips_opts.ase_dspr2 = 1;
11491       mips_opts.ase_dsp = 1;
11492       break;
11493 
11494     case OPTION_NO_DSPR2:
11495       mips_opts.ase_dspr2 = 0;
11496       mips_opts.ase_dsp = 0;
11497       break;
11498 
11499     case OPTION_MT:
11500       mips_opts.ase_mt = 1;
11501       break;
11502 
11503     case OPTION_NO_MT:
11504       mips_opts.ase_mt = 0;
11505       break;
11506 
11507     case OPTION_MIPS16:
11508       mips_opts.mips16 = 1;
11509       mips_no_prev_insn ();
11510       break;
11511 
11512     case OPTION_NO_MIPS16:
11513       mips_opts.mips16 = 0;
11514       mips_no_prev_insn ();
11515       break;
11516 
11517     case OPTION_MIPS3D:
11518       mips_opts.ase_mips3d = 1;
11519       break;
11520 
11521     case OPTION_NO_MIPS3D:
11522       mips_opts.ase_mips3d = 0;
11523       break;
11524 
11525     case OPTION_SMARTMIPS:
11526       mips_opts.ase_smartmips = 1;
11527       break;
11528 
11529     case OPTION_NO_SMARTMIPS:
11530       mips_opts.ase_smartmips = 0;
11531       break;
11532 
11533     case OPTION_FIX_VR4120:
11534       mips_fix_vr4120 = 1;
11535       break;
11536 
11537     case OPTION_NO_FIX_VR4120:
11538       mips_fix_vr4120 = 0;
11539       break;
11540 
11541     case OPTION_FIX_VR4130:
11542       mips_fix_vr4130 = 1;
11543       break;
11544 
11545     case OPTION_NO_FIX_VR4130:
11546       mips_fix_vr4130 = 0;
11547       break;
11548 
11549     case OPTION_RELAX_BRANCH:
11550       mips_relax_branch = 1;
11551       break;
11552 
11553     case OPTION_NO_RELAX_BRANCH:
11554       mips_relax_branch = 0;
11555       break;
11556 
11557     case OPTION_MSHARED:
11558       mips_in_shared = TRUE;
11559       break;
11560 
11561     case OPTION_MNO_SHARED:
11562       mips_in_shared = FALSE;
11563       break;
11564 
11565     case OPTION_MSYM32:
11566       mips_opts.sym32 = TRUE;
11567       break;
11568 
11569     case OPTION_MNO_SYM32:
11570       mips_opts.sym32 = FALSE;
11571       break;
11572 
11573 #ifdef OBJ_ELF
11574       /* When generating ELF code, we permit -KPIC and -call_shared to
11575 	 select SVR4_PIC, and -non_shared to select no PIC.  This is
11576 	 intended to be compatible with Irix 5.  */
11577     case OPTION_CALL_SHARED:
11578       if (!IS_ELF)
11579 	{
11580 	  as_bad (_("-call_shared is supported only for ELF format"));
11581 	  return 0;
11582 	}
11583       mips_pic = SVR4_PIC;
11584       mips_abicalls = TRUE;
11585       break;
11586 
11587     case OPTION_NON_SHARED:
11588       if (!IS_ELF)
11589 	{
11590 	  as_bad (_("-non_shared is supported only for ELF format"));
11591 	  return 0;
11592 	}
11593       mips_pic = NO_PIC;
11594       mips_abicalls = FALSE;
11595       break;
11596 
11597       /* The -xgot option tells the assembler to use 32 bit offsets
11598          when accessing the got in SVR4_PIC mode.  It is for Irix
11599          compatibility.  */
11600     case OPTION_XGOT:
11601       mips_big_got = 1;
11602       break;
11603 #endif /* OBJ_ELF */
11604 
11605     case 'G':
11606       g_switch_value = atoi (arg);
11607       g_switch_seen = 1;
11608       break;
11609 
11610 #ifdef OBJ_ELF
11611       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11612 	 and -mabi=64.  */
11613     case OPTION_32:
11614       if (!IS_ELF)
11615 	{
11616 	  as_bad (_("-32 is supported for ELF format only"));
11617 	  return 0;
11618 	}
11619       mips_abi = O32_ABI;
11620       break;
11621 
11622     case OPTION_N32:
11623       if (!IS_ELF)
11624 	{
11625 	  as_bad (_("-n32 is supported for ELF format only"));
11626 	  return 0;
11627 	}
11628       mips_abi = N32_ABI;
11629       break;
11630 
11631     case OPTION_64:
11632       if (!IS_ELF)
11633 	{
11634 	  as_bad (_("-64 is supported for ELF format only"));
11635 	  return 0;
11636 	}
11637       mips_abi = N64_ABI;
11638       if (!support_64bit_objects())
11639 	as_fatal (_("No compiled in support for 64 bit object file format"));
11640       break;
11641 #endif /* OBJ_ELF */
11642 
11643     case OPTION_GP32:
11644       file_mips_gp32 = 1;
11645       break;
11646 
11647     case OPTION_GP64:
11648       file_mips_gp32 = 0;
11649       break;
11650 
11651     case OPTION_FP32:
11652       file_mips_fp32 = 1;
11653       break;
11654 
11655     case OPTION_FP64:
11656       file_mips_fp32 = 0;
11657       break;
11658 
11659 #ifdef OBJ_ELF
11660     case OPTION_MABI:
11661       if (!IS_ELF)
11662 	{
11663 	  as_bad (_("-mabi is supported for ELF format only"));
11664 	  return 0;
11665 	}
11666       if (strcmp (arg, "32") == 0)
11667 	mips_abi = O32_ABI;
11668       else if (strcmp (arg, "o64") == 0)
11669 	mips_abi = O64_ABI;
11670       else if (strcmp (arg, "n32") == 0)
11671 	mips_abi = N32_ABI;
11672       else if (strcmp (arg, "64") == 0)
11673 	{
11674 	  mips_abi = N64_ABI;
11675 	  if (! support_64bit_objects())
11676 	    as_fatal (_("No compiled in support for 64 bit object file "
11677 			"format"));
11678 	}
11679       else if (strcmp (arg, "eabi") == 0)
11680 	mips_abi = EABI_ABI;
11681       else
11682 	{
11683 	  as_fatal (_("invalid abi -mabi=%s"), arg);
11684 	  return 0;
11685 	}
11686       break;
11687 #endif /* OBJ_ELF */
11688 
11689     case OPTION_M7000_HILO_FIX:
11690       mips_7000_hilo_fix = TRUE;
11691       break;
11692 
11693     case OPTION_MNO_7000_HILO_FIX:
11694       mips_7000_hilo_fix = FALSE;
11695       break;
11696 
11697 #ifdef OBJ_ELF
11698     case OPTION_MDEBUG:
11699       mips_flag_mdebug = TRUE;
11700       break;
11701 
11702     case OPTION_NO_MDEBUG:
11703       mips_flag_mdebug = FALSE;
11704       break;
11705 
11706     case OPTION_PDR:
11707       mips_flag_pdr = TRUE;
11708       break;
11709 
11710     case OPTION_NO_PDR:
11711       mips_flag_pdr = FALSE;
11712       break;
11713 
11714     case OPTION_MVXWORKS_PIC:
11715       mips_pic = VXWORKS_PIC;
11716       break;
11717 #endif /* OBJ_ELF */
11718 
11719     default:
11720       return 0;
11721     }
11722 
11723   return 1;
11724 }
11725 
11726 /* Set up globals to generate code for the ISA or processor
11727    described by INFO.  */
11728 
11729 static void
mips_set_architecture(const struct mips_cpu_info * info)11730 mips_set_architecture (const struct mips_cpu_info *info)
11731 {
11732   if (info != 0)
11733     {
11734       file_mips_arch = info->cpu;
11735       mips_opts.arch = info->cpu;
11736       mips_opts.isa = info->isa;
11737     }
11738 }
11739 
11740 
11741 /* Likewise for tuning.  */
11742 
11743 static void
mips_set_tune(const struct mips_cpu_info * info)11744 mips_set_tune (const struct mips_cpu_info *info)
11745 {
11746   if (info != 0)
11747     mips_tune = info->cpu;
11748 }
11749 
11750 
11751 void
mips_after_parse_args(void)11752 mips_after_parse_args (void)
11753 {
11754   const struct mips_cpu_info *arch_info = 0;
11755   const struct mips_cpu_info *tune_info = 0;
11756 
11757   /* GP relative stuff not working for PE */
11758   if (strncmp (TARGET_OS, "pe", 2) == 0)
11759     {
11760       if (g_switch_seen && g_switch_value != 0)
11761 	as_bad (_("-G not supported in this configuration."));
11762       g_switch_value = 0;
11763     }
11764 
11765   if (mips_abi == NO_ABI)
11766     mips_abi = MIPS_DEFAULT_ABI;
11767 
11768   /* The following code determines the architecture and register size.
11769      Similar code was added to GCC 3.3 (see override_options() in
11770      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11771      as much as possible.  */
11772 
11773   if (mips_arch_string != 0)
11774     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11775 
11776   if (file_mips_isa != ISA_UNKNOWN)
11777     {
11778       /* Handle -mipsN.  At this point, file_mips_isa contains the
11779 	 ISA level specified by -mipsN, while arch_info->isa contains
11780 	 the -march selection (if any).  */
11781       if (arch_info != 0)
11782 	{
11783 	  /* -march takes precedence over -mipsN, since it is more descriptive.
11784 	     There's no harm in specifying both as long as the ISA levels
11785 	     are the same.  */
11786 	  if (file_mips_isa != arch_info->isa)
11787 	    as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11788 		    mips_cpu_info_from_isa (file_mips_isa)->name,
11789 		    mips_cpu_info_from_isa (arch_info->isa)->name);
11790 	}
11791       else
11792 	arch_info = mips_cpu_info_from_isa (file_mips_isa);
11793     }
11794 
11795   if (arch_info == 0)
11796     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11797 
11798   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11799     as_bad ("-march=%s is not compatible with the selected ABI",
11800 	    arch_info->name);
11801 
11802   mips_set_architecture (arch_info);
11803 
11804   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11805   if (mips_tune_string != 0)
11806     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11807 
11808   if (tune_info == 0)
11809     mips_set_tune (arch_info);
11810   else
11811     mips_set_tune (tune_info);
11812 
11813   if (file_mips_gp32 >= 0)
11814     {
11815       /* The user specified the size of the integer registers.  Make sure
11816 	 it agrees with the ABI and ISA.  */
11817       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11818 	as_bad (_("-mgp64 used with a 32-bit processor"));
11819       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11820 	as_bad (_("-mgp32 used with a 64-bit ABI"));
11821       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11822 	as_bad (_("-mgp64 used with a 32-bit ABI"));
11823     }
11824   else
11825     {
11826       /* Infer the integer register size from the ABI and processor.
11827 	 Restrict ourselves to 32-bit registers if that's all the
11828 	 processor has, or if the ABI cannot handle 64-bit registers.  */
11829       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11830 			|| !ISA_HAS_64BIT_REGS (mips_opts.isa));
11831     }
11832 
11833   switch (file_mips_fp32)
11834     {
11835     default:
11836     case -1:
11837       /* No user specified float register size.
11838 	 ??? GAS treats single-float processors as though they had 64-bit
11839 	 float registers (although it complains when double-precision
11840 	 instructions are used).  As things stand, saying they have 32-bit
11841 	 registers would lead to spurious "register must be even" messages.
11842 	 So here we assume float registers are never smaller than the
11843 	 integer ones.  */
11844       if (file_mips_gp32 == 0)
11845 	/* 64-bit integer registers implies 64-bit float registers.  */
11846 	file_mips_fp32 = 0;
11847       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11848 	       && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11849 	/* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11850 	file_mips_fp32 = 0;
11851       else
11852 	/* 32-bit float registers.  */
11853 	file_mips_fp32 = 1;
11854       break;
11855 
11856     /* The user specified the size of the float registers.  Check if it
11857        agrees with the ABI and ISA.  */
11858     case 0:
11859       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11860 	as_bad (_("-mfp64 used with a 32-bit fpu"));
11861       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11862 	       && !ISA_HAS_MXHC1 (mips_opts.isa))
11863 	as_warn (_("-mfp64 used with a 32-bit ABI"));
11864       break;
11865     case 1:
11866       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11867 	as_warn (_("-mfp32 used with a 64-bit ABI"));
11868       break;
11869     }
11870 
11871   /* End of GCC-shared inference code.  */
11872 
11873   /* This flag is set when we have a 64-bit capable CPU but use only
11874      32-bit wide registers.  Note that EABI does not use it.  */
11875   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11876       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11877 	  || mips_abi == O32_ABI))
11878     mips_32bitmode = 1;
11879 
11880   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11881     as_bad (_("trap exception not supported at ISA 1"));
11882 
11883   /* If the selected architecture includes support for ASEs, enable
11884      generation of code for them.  */
11885   if (mips_opts.mips16 == -1)
11886     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11887   if (mips_opts.ase_mips3d == -1)
11888     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11889 			    && file_mips_fp32 == 0) ? 1 : 0;
11890   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11891     as_bad (_("-mfp32 used with -mips3d"));
11892 
11893   if (mips_opts.ase_mdmx == -1)
11894     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11895 			  && file_mips_fp32 == 0) ? 1 : 0;
11896   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11897     as_bad (_("-mfp32 used with -mdmx"));
11898 
11899   if (mips_opts.ase_smartmips == -1)
11900     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11901   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11902       as_warn ("%s ISA does not support SmartMIPS",
11903 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11904 
11905   if (mips_opts.ase_dsp == -1)
11906     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11907   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11908       as_warn ("%s ISA does not support DSP ASE",
11909 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11910 
11911   if (mips_opts.ase_dspr2 == -1)
11912     {
11913       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11914       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11915     }
11916   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11917       as_warn ("%s ISA does not support DSP R2 ASE",
11918 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11919 
11920   if (mips_opts.ase_mt == -1)
11921     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11922   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11923       as_warn ("%s ISA does not support MT ASE",
11924 	       mips_cpu_info_from_isa (mips_opts.isa)->name);
11925 
11926   file_mips_isa = mips_opts.isa;
11927   file_ase_mips16 = mips_opts.mips16;
11928   file_ase_mips3d = mips_opts.ase_mips3d;
11929   file_ase_mdmx = mips_opts.ase_mdmx;
11930   file_ase_smartmips = mips_opts.ase_smartmips;
11931   file_ase_dsp = mips_opts.ase_dsp;
11932   file_ase_dspr2 = mips_opts.ase_dspr2;
11933   file_ase_mt = mips_opts.ase_mt;
11934   mips_opts.gp32 = file_mips_gp32;
11935   mips_opts.fp32 = file_mips_fp32;
11936 
11937   if (mips_flag_mdebug < 0)
11938     {
11939 #ifdef OBJ_MAYBE_ECOFF
11940       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11941 	mips_flag_mdebug = 1;
11942       else
11943 #endif /* OBJ_MAYBE_ECOFF */
11944 	mips_flag_mdebug = 0;
11945     }
11946 }
11947 
11948 void
mips_init_after_args(void)11949 mips_init_after_args (void)
11950 {
11951   /* initialize opcodes */
11952   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11953   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11954 }
11955 
11956 long
md_pcrel_from(fixS * fixP)11957 md_pcrel_from (fixS *fixP)
11958 {
11959   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11960   switch (fixP->fx_r_type)
11961     {
11962     case BFD_RELOC_16_PCREL_S2:
11963     case BFD_RELOC_MIPS_JMP:
11964       /* Return the address of the delay slot.  */
11965       return addr + 4;
11966     default:
11967       /* We have no relocation type for PC relative MIPS16 instructions.  */
11968       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11969 	as_bad_where (fixP->fx_file, fixP->fx_line,
11970 		      _("PC relative MIPS16 instruction references a different section"));
11971       return addr;
11972     }
11973 }
11974 
11975 /* This is called before the symbol table is processed.  In order to
11976    work with gcc when using mips-tfile, we must keep all local labels.
11977    However, in other cases, we want to discard them.  If we were
11978    called with -g, but we didn't see any debugging information, it may
11979    mean that gcc is smuggling debugging information through to
11980    mips-tfile, in which case we must generate all local labels.  */
11981 
11982 void
mips_frob_file_before_adjust(void)11983 mips_frob_file_before_adjust (void)
11984 {
11985 #ifndef NO_ECOFF_DEBUGGING
11986   if (ECOFF_DEBUGGING
11987       && mips_debug != 0
11988       && ! ecoff_debugging_seen)
11989     flag_keep_locals = 1;
11990 #endif
11991 }
11992 
11993 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11994    the corresponding LO16 reloc.  This is called before md_apply_fix and
11995    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11996    relocation operators.
11997 
11998    For our purposes, a %lo() expression matches a %got() or %hi()
11999    expression if:
12000 
12001       (a) it refers to the same symbol; and
12002       (b) the offset applied in the %lo() expression is no lower than
12003 	  the offset applied in the %got() or %hi().
12004 
12005    (b) allows us to cope with code like:
12006 
12007 	lui	$4,%hi(foo)
12008 	lh	$4,%lo(foo+2)($4)
12009 
12010    ...which is legal on RELA targets, and has a well-defined behaviour
12011    if the user knows that adding 2 to "foo" will not induce a carry to
12012    the high 16 bits.
12013 
12014    When several %lo()s match a particular %got() or %hi(), we use the
12015    following rules to distinguish them:
12016 
12017      (1) %lo()s with smaller offsets are a better match than %lo()s with
12018          higher offsets.
12019 
12020      (2) %lo()s with no matching %got() or %hi() are better than those
12021          that already have a matching %got() or %hi().
12022 
12023      (3) later %lo()s are better than earlier %lo()s.
12024 
12025    These rules are applied in order.
12026 
12027    (1) means, among other things, that %lo()s with identical offsets are
12028    chosen if they exist.
12029 
12030    (2) means that we won't associate several high-part relocations with
12031    the same low-part relocation unless there's no alternative.  Having
12032    several high parts for the same low part is a GNU extension; this rule
12033    allows careful users to avoid it.
12034 
12035    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12036    with the last high-part relocation being at the front of the list.
12037    It therefore makes sense to choose the last matching low-part
12038    relocation, all other things being equal.  It's also easier
12039    to code that way.  */
12040 
12041 void
mips_frob_file(void)12042 mips_frob_file (void)
12043 {
12044   struct mips_hi_fixup *l;
12045 
12046   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12047     {
12048       segment_info_type *seginfo;
12049       bfd_boolean matched_lo_p;
12050       fixS **hi_pos, **lo_pos, **pos;
12051 
12052       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12053 
12054       /* If a GOT16 relocation turns out to be against a global symbol,
12055 	 there isn't supposed to be a matching LO.  */
12056       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
12057 	  && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12058 	continue;
12059 
12060       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12061       if (fixup_has_matching_lo_p (l->fixp))
12062 	continue;
12063 
12064       seginfo = seg_info (l->seg);
12065 
12066       /* Set HI_POS to the position of this relocation in the chain.
12067 	 Set LO_POS to the position of the chosen low-part relocation.
12068 	 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12069 	 relocation that matches an immediately-preceding high-part
12070 	 relocation.  */
12071       hi_pos = NULL;
12072       lo_pos = NULL;
12073       matched_lo_p = FALSE;
12074       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12075 	{
12076 	  if (*pos == l->fixp)
12077 	    hi_pos = pos;
12078 
12079 	  if (((*pos)->fx_r_type == BFD_RELOC_LO16
12080 	       || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
12081 	      && (*pos)->fx_addsy == l->fixp->fx_addsy
12082 	      && (*pos)->fx_offset >= l->fixp->fx_offset
12083 	      && (lo_pos == NULL
12084 		  || (*pos)->fx_offset < (*lo_pos)->fx_offset
12085 		  || (!matched_lo_p
12086 		      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12087 	    lo_pos = pos;
12088 
12089 	  matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12090 			  && fixup_has_matching_lo_p (*pos));
12091 	}
12092 
12093       /* If we found a match, remove the high-part relocation from its
12094 	 current position and insert it before the low-part relocation.
12095 	 Make the offsets match so that fixup_has_matching_lo_p()
12096 	 will return true.
12097 
12098 	 We don't warn about unmatched high-part relocations since some
12099 	 versions of gcc have been known to emit dead "lui ...%hi(...)"
12100 	 instructions.  */
12101       if (lo_pos != NULL)
12102 	{
12103 	  l->fixp->fx_offset = (*lo_pos)->fx_offset;
12104 	  if (l->fixp->fx_next != *lo_pos)
12105 	    {
12106 	      *hi_pos = l->fixp->fx_next;
12107 	      l->fixp->fx_next = *lo_pos;
12108 	      *lo_pos = l->fixp;
12109 	    }
12110 	}
12111     }
12112 }
12113 
12114 /* We may have combined relocations without symbols in the N32/N64 ABI.
12115    We have to prevent gas from dropping them.  */
12116 
12117 int
mips_force_relocation(fixS * fixp)12118 mips_force_relocation (fixS *fixp)
12119 {
12120   if (generic_force_reloc (fixp))
12121     return 1;
12122 
12123   if (HAVE_NEWABI
12124       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12125       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12126 	  || fixp->fx_r_type == BFD_RELOC_HI16_S
12127 	  || fixp->fx_r_type == BFD_RELOC_LO16))
12128     return 1;
12129 
12130   return 0;
12131 }
12132 
12133 /* Apply a fixup to the object file.  */
12134 
12135 void
md_apply_fix(fixS * fixP,valueT * valP,segT seg ATTRIBUTE_UNUSED)12136 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12137 {
12138   bfd_byte *buf;
12139   long insn;
12140   reloc_howto_type *howto;
12141 
12142   /* We ignore generic BFD relocations we don't know about.  */
12143   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12144   if (! howto)
12145     return;
12146 
12147   assert (fixP->fx_size == 4
12148 	  || fixP->fx_r_type == BFD_RELOC_16
12149 	  || fixP->fx_r_type == BFD_RELOC_64
12150 	  || fixP->fx_r_type == BFD_RELOC_CTOR
12151 	  || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12152 	  || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12153 	  || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12154 	  || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12155 
12156   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12157 
12158   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12159 
12160   /* Don't treat parts of a composite relocation as done.  There are two
12161      reasons for this:
12162 
12163      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12164 	 should nevertheless be emitted if the first part is.
12165 
12166      (2) In normal usage, composite relocations are never assembly-time
12167 	 constants.  The easiest way of dealing with the pathological
12168 	 exceptions is to generate a relocation against STN_UNDEF and
12169 	 leave everything up to the linker.  */
12170   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12171     fixP->fx_done = 1;
12172 
12173   switch (fixP->fx_r_type)
12174     {
12175     case BFD_RELOC_MIPS_TLS_GD:
12176     case BFD_RELOC_MIPS_TLS_LDM:
12177     case BFD_RELOC_MIPS_TLS_DTPREL32:
12178     case BFD_RELOC_MIPS_TLS_DTPREL64:
12179     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12180     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12181     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12182     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12183     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12184       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12185       /* fall through */
12186 
12187     case BFD_RELOC_MIPS_JMP:
12188     case BFD_RELOC_MIPS_SHIFT5:
12189     case BFD_RELOC_MIPS_SHIFT6:
12190     case BFD_RELOC_MIPS_GOT_DISP:
12191     case BFD_RELOC_MIPS_GOT_PAGE:
12192     case BFD_RELOC_MIPS_GOT_OFST:
12193     case BFD_RELOC_MIPS_SUB:
12194     case BFD_RELOC_MIPS_INSERT_A:
12195     case BFD_RELOC_MIPS_INSERT_B:
12196     case BFD_RELOC_MIPS_DELETE:
12197     case BFD_RELOC_MIPS_HIGHEST:
12198     case BFD_RELOC_MIPS_HIGHER:
12199     case BFD_RELOC_MIPS_SCN_DISP:
12200     case BFD_RELOC_MIPS_REL16:
12201     case BFD_RELOC_MIPS_RELGOT:
12202     case BFD_RELOC_MIPS_JALR:
12203     case BFD_RELOC_HI16:
12204     case BFD_RELOC_HI16_S:
12205     case BFD_RELOC_GPREL16:
12206     case BFD_RELOC_MIPS_LITERAL:
12207     case BFD_RELOC_MIPS_CALL16:
12208     case BFD_RELOC_MIPS_GOT16:
12209     case BFD_RELOC_GPREL32:
12210     case BFD_RELOC_MIPS_GOT_HI16:
12211     case BFD_RELOC_MIPS_GOT_LO16:
12212     case BFD_RELOC_MIPS_CALL_HI16:
12213     case BFD_RELOC_MIPS_CALL_LO16:
12214     case BFD_RELOC_MIPS16_GPREL:
12215     case BFD_RELOC_MIPS16_HI16:
12216     case BFD_RELOC_MIPS16_HI16_S:
12217     case BFD_RELOC_MIPS16_JMP:
12218       /* Nothing needed to do.  The value comes from the reloc entry.  */
12219       break;
12220 
12221     case BFD_RELOC_64:
12222       /* This is handled like BFD_RELOC_32, but we output a sign
12223          extended value if we are only 32 bits.  */
12224       if (fixP->fx_done)
12225 	{
12226 	  if (8 <= sizeof (valueT))
12227 	    md_number_to_chars ((char *) buf, *valP, 8);
12228 	  else
12229 	    {
12230 	      valueT hiv;
12231 
12232 	      if ((*valP & 0x80000000) != 0)
12233 		hiv = 0xffffffff;
12234 	      else
12235 		hiv = 0;
12236 	      md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12237 				  *valP, 4);
12238 	      md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12239 				  hiv, 4);
12240 	    }
12241 	}
12242       break;
12243 
12244     case BFD_RELOC_RVA:
12245     case BFD_RELOC_32:
12246     case BFD_RELOC_16:
12247       /* If we are deleting this reloc entry, we must fill in the
12248 	 value now.  This can happen if we have a .word which is not
12249 	 resolved when it appears but is later defined.  */
12250       if (fixP->fx_done)
12251 	md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12252       break;
12253 
12254     case BFD_RELOC_LO16:
12255     case BFD_RELOC_MIPS16_LO16:
12256       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12257 	 may be safe to remove, but if so it's not obvious.  */
12258       /* When handling an embedded PIC switch statement, we can wind
12259 	 up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12260       if (fixP->fx_done)
12261 	{
12262 	  if (*valP + 0x8000 > 0xffff)
12263 	    as_bad_where (fixP->fx_file, fixP->fx_line,
12264 			  _("relocation overflow"));
12265 	  if (target_big_endian)
12266 	    buf += 2;
12267 	  md_number_to_chars ((char *) buf, *valP, 2);
12268 	}
12269       break;
12270 
12271     case BFD_RELOC_16_PCREL_S2:
12272       if ((*valP & 0x3) != 0)
12273 	as_bad_where (fixP->fx_file, fixP->fx_line,
12274 		      _("Branch to misaligned address (%lx)"), (long) *valP);
12275 
12276       /* We need to save the bits in the instruction since fixup_segment()
12277 	 might be deleting the relocation entry (i.e., a branch within
12278 	 the current segment).  */
12279       if (! fixP->fx_done)
12280 	break;
12281 
12282       /* Update old instruction data.  */
12283       if (target_big_endian)
12284 	insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12285       else
12286 	insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12287 
12288       if (*valP + 0x20000 <= 0x3ffff)
12289 	{
12290 	  insn |= (*valP >> 2) & 0xffff;
12291 	  md_number_to_chars ((char *) buf, insn, 4);
12292 	}
12293       else if (mips_pic == NO_PIC
12294 	       && fixP->fx_done
12295 	       && fixP->fx_frag->fr_address >= text_section->vma
12296 	       && (fixP->fx_frag->fr_address
12297 		   < text_section->vma + bfd_get_section_size (text_section))
12298 	       && ((insn & 0xffff0000) == 0x10000000	 /* beq $0,$0 */
12299 		   || (insn & 0xffff0000) == 0x04010000	 /* bgez $0 */
12300 		   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12301 	{
12302 	  /* The branch offset is too large.  If this is an
12303              unconditional branch, and we are not generating PIC code,
12304              we can convert it to an absolute jump instruction.  */
12305 	  if ((insn & 0xffff0000) == 0x04110000)	 /* bgezal $0 */
12306 	    insn = 0x0c000000;	/* jal */
12307 	  else
12308 	    insn = 0x08000000;	/* j */
12309 	  fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12310 	  fixP->fx_done = 0;
12311 	  fixP->fx_addsy = section_symbol (text_section);
12312 	  *valP += md_pcrel_from (fixP);
12313 	  md_number_to_chars ((char *) buf, insn, 4);
12314 	}
12315       else
12316 	{
12317 	  /* If we got here, we have branch-relaxation disabled,
12318 	     and there's nothing we can do to fix this instruction
12319 	     without turning it into a longer sequence.  */
12320 	  as_bad_where (fixP->fx_file, fixP->fx_line,
12321 			_("Branch out of range"));
12322 	}
12323       break;
12324 
12325     case BFD_RELOC_VTABLE_INHERIT:
12326       fixP->fx_done = 0;
12327       if (fixP->fx_addsy
12328           && !S_IS_DEFINED (fixP->fx_addsy)
12329           && !S_IS_WEAK (fixP->fx_addsy))
12330         S_SET_WEAK (fixP->fx_addsy);
12331       break;
12332 
12333     case BFD_RELOC_VTABLE_ENTRY:
12334       fixP->fx_done = 0;
12335       break;
12336 
12337     default:
12338       internalError ();
12339     }
12340 
12341   /* Remember value for tc_gen_reloc.  */
12342   fixP->fx_addnumber = *valP;
12343 }
12344 
12345 static symbolS *
get_symbol(void)12346 get_symbol (void)
12347 {
12348   int c;
12349   char *name;
12350   symbolS *p;
12351 
12352   name = input_line_pointer;
12353   c = get_symbol_end ();
12354   p = (symbolS *) symbol_find_or_make (name);
12355   *input_line_pointer = c;
12356   return p;
12357 }
12358 
12359 /* Align the current frag to a given power of two.  The MIPS assembler
12360    also automatically adjusts any preceding label.  */
12361 
12362 static void
mips_align(int to,int fill,symbolS * label)12363 mips_align (int to, int fill, symbolS *label)
12364 {
12365   mips_emit_delays ();
12366   frag_align (to, fill, 0);
12367   record_alignment (now_seg, to);
12368   if (label != NULL)
12369     {
12370       assert (S_GET_SEGMENT (label) == now_seg);
12371       symbol_set_frag (label, frag_now);
12372       S_SET_VALUE (label, (valueT) frag_now_fix ());
12373     }
12374 }
12375 
12376 /* Align to a given power of two.  .align 0 turns off the automatic
12377    alignment used by the data creating pseudo-ops.  */
12378 
12379 static void
s_align(int x ATTRIBUTE_UNUSED)12380 s_align (int x ATTRIBUTE_UNUSED)
12381 {
12382   int temp;
12383   long temp_fill;
12384   long max_alignment = 15;
12385 
12386   /* o Note that the assembler pulls down any immediately preceding label
12387        to the aligned address.
12388      o It's not documented but auto alignment is reinstated by
12389        a .align pseudo instruction.
12390      o Note also that after auto alignment is turned off the mips assembler
12391        issues an error on attempt to assemble an improperly aligned data item.
12392        We don't.  */
12393 
12394   temp = get_absolute_expression ();
12395   if (temp > max_alignment)
12396     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12397   else if (temp < 0)
12398     {
12399       as_warn (_("Alignment negative: 0 assumed."));
12400       temp = 0;
12401     }
12402   if (*input_line_pointer == ',')
12403     {
12404       ++input_line_pointer;
12405       temp_fill = get_absolute_expression ();
12406     }
12407   else
12408     temp_fill = 0;
12409   if (temp)
12410     {
12411       segment_info_type *si = seg_info (now_seg);
12412       struct insn_label_list *l = si->label_list;
12413       /* Auto alignment should be switched on by next section change.  */
12414       auto_align = 1;
12415       mips_align (temp, (int) temp_fill, l != NULL ? l->label : NULL);
12416     }
12417   else
12418     {
12419       auto_align = 0;
12420     }
12421 
12422   demand_empty_rest_of_line ();
12423 }
12424 
12425 static void
s_change_sec(int sec)12426 s_change_sec (int sec)
12427 {
12428   segT seg;
12429 
12430 #ifdef OBJ_ELF
12431   /* The ELF backend needs to know that we are changing sections, so
12432      that .previous works correctly.  We could do something like check
12433      for an obj_section_change_hook macro, but that might be confusing
12434      as it would not be appropriate to use it in the section changing
12435      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12436      This should be cleaner, somehow.  */
12437   if (IS_ELF)
12438     obj_elf_section_change_hook ();
12439 #endif
12440 
12441   mips_emit_delays ();
12442   switch (sec)
12443     {
12444     case 't':
12445       s_text (0);
12446       break;
12447     case 'd':
12448       s_data (0);
12449       break;
12450     case 'b':
12451       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12452       demand_empty_rest_of_line ();
12453       break;
12454 
12455     case 'r':
12456       seg = subseg_new (RDATA_SECTION_NAME,
12457 			(subsegT) get_absolute_expression ());
12458       if (IS_ELF)
12459 	{
12460 	  bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12461 						  | SEC_READONLY | SEC_RELOC
12462 						  | SEC_DATA));
12463 	  if (strcmp (TARGET_OS, "elf") != 0)
12464 	    record_alignment (seg, 4);
12465 	}
12466       demand_empty_rest_of_line ();
12467       break;
12468 
12469     case 's':
12470       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12471       if (IS_ELF)
12472 	{
12473 	  bfd_set_section_flags (stdoutput, seg,
12474 				 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12475 	  if (strcmp (TARGET_OS, "elf") != 0)
12476 	    record_alignment (seg, 4);
12477 	}
12478       demand_empty_rest_of_line ();
12479       break;
12480     }
12481 
12482   auto_align = 1;
12483 }
12484 
12485 void
s_change_section(int ignore ATTRIBUTE_UNUSED)12486 s_change_section (int ignore ATTRIBUTE_UNUSED)
12487 {
12488 #ifdef OBJ_ELF
12489   char *section_name;
12490   char c;
12491   char next_c = 0;
12492   int section_type;
12493   int section_flag;
12494   int section_entry_size;
12495   int section_alignment;
12496 
12497   if (!IS_ELF)
12498     return;
12499 
12500   section_name = input_line_pointer;
12501   c = get_symbol_end ();
12502   if (c)
12503     next_c = *(input_line_pointer + 1);
12504 
12505   /* Do we have .section Name<,"flags">?  */
12506   if (c != ',' || (c == ',' && next_c == '"'))
12507     {
12508       /* just after name is now '\0'.  */
12509       *input_line_pointer = c;
12510       input_line_pointer = section_name;
12511       obj_elf_section (ignore);
12512       return;
12513     }
12514   input_line_pointer++;
12515 
12516   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12517   if (c == ',')
12518     section_type = get_absolute_expression ();
12519   else
12520     section_type = 0;
12521   if (*input_line_pointer++ == ',')
12522     section_flag = get_absolute_expression ();
12523   else
12524     section_flag = 0;
12525   if (*input_line_pointer++ == ',')
12526     section_entry_size = get_absolute_expression ();
12527   else
12528     section_entry_size = 0;
12529   if (*input_line_pointer++ == ',')
12530     section_alignment = get_absolute_expression ();
12531   else
12532     section_alignment = 0;
12533 
12534   section_name = xstrdup (section_name);
12535 
12536   /* When using the generic form of .section (as implemented by obj-elf.c),
12537      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12538      traditionally had to fall back on the more common @progbits instead.
12539 
12540      There's nothing really harmful in this, since bfd will correct
12541      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12542      means that, for backwards compatibility, the special_section entries
12543      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12544 
12545      Even so, we shouldn't force users of the MIPS .section syntax to
12546      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12547      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12548      generic type-checking code.  */
12549   if (section_type == SHT_MIPS_DWARF)
12550     section_type = SHT_PROGBITS;
12551 
12552   obj_elf_change_section (section_name, section_type, section_flag,
12553 			  section_entry_size, 0, 0, 0);
12554 
12555   if (now_seg->name != section_name)
12556     free (section_name);
12557 #endif /* OBJ_ELF */
12558 }
12559 
12560 void
mips_enable_auto_align(void)12561 mips_enable_auto_align (void)
12562 {
12563   auto_align = 1;
12564 }
12565 
12566 static void
s_cons(int log_size)12567 s_cons (int log_size)
12568 {
12569   segment_info_type *si = seg_info (now_seg);
12570   struct insn_label_list *l = si->label_list;
12571   symbolS *label;
12572 
12573   label = l != NULL ? l->label : NULL;
12574   mips_emit_delays ();
12575   if (log_size > 0 && auto_align)
12576     mips_align (log_size, 0, label);
12577   mips_clear_insn_labels ();
12578   cons (1 << log_size);
12579 }
12580 
12581 static void
s_float_cons(int type)12582 s_float_cons (int type)
12583 {
12584   segment_info_type *si = seg_info (now_seg);
12585   struct insn_label_list *l = si->label_list;
12586   symbolS *label;
12587 
12588   label = l != NULL ? l->label : NULL;
12589 
12590   mips_emit_delays ();
12591 
12592   if (auto_align)
12593     {
12594       if (type == 'd')
12595 	mips_align (3, 0, label);
12596       else
12597 	mips_align (2, 0, label);
12598     }
12599 
12600   mips_clear_insn_labels ();
12601 
12602   float_cons (type);
12603 }
12604 
12605 /* Handle .globl.  We need to override it because on Irix 5 you are
12606    permitted to say
12607        .globl foo .text
12608    where foo is an undefined symbol, to mean that foo should be
12609    considered to be the address of a function.  */
12610 
12611 static void
s_mips_globl(int x ATTRIBUTE_UNUSED)12612 s_mips_globl (int x ATTRIBUTE_UNUSED)
12613 {
12614   char *name;
12615   int c;
12616   symbolS *symbolP;
12617   flagword flag;
12618 
12619   do
12620     {
12621       name = input_line_pointer;
12622       c = get_symbol_end ();
12623       symbolP = symbol_find_or_make (name);
12624       S_SET_EXTERNAL (symbolP);
12625 
12626       *input_line_pointer = c;
12627       SKIP_WHITESPACE ();
12628 
12629       /* On Irix 5, every global symbol that is not explicitly labelled as
12630          being a function is apparently labelled as being an object.  */
12631       flag = BSF_OBJECT;
12632 
12633       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12634 	  && (*input_line_pointer != ','))
12635 	{
12636 	  char *secname;
12637 	  asection *sec;
12638 
12639 	  secname = input_line_pointer;
12640 	  c = get_symbol_end ();
12641 	  sec = bfd_get_section_by_name (stdoutput, secname);
12642 	  if (sec == NULL)
12643 	    as_bad (_("%s: no such section"), secname);
12644 	  *input_line_pointer = c;
12645 
12646 	  if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12647 	    flag = BSF_FUNCTION;
12648 	}
12649 
12650       symbol_get_bfdsym (symbolP)->flags |= flag;
12651 
12652       c = *input_line_pointer;
12653       if (c == ',')
12654 	{
12655 	  input_line_pointer++;
12656 	  SKIP_WHITESPACE ();
12657 	  if (is_end_of_line[(unsigned char) *input_line_pointer])
12658 	    c = '\n';
12659 	}
12660     }
12661   while (c == ',');
12662 
12663   demand_empty_rest_of_line ();
12664 }
12665 
12666 static void
s_option(int x ATTRIBUTE_UNUSED)12667 s_option (int x ATTRIBUTE_UNUSED)
12668 {
12669   char *opt;
12670   char c;
12671 
12672   opt = input_line_pointer;
12673   c = get_symbol_end ();
12674 
12675   if (*opt == 'O')
12676     {
12677       /* FIXME: What does this mean?  */
12678     }
12679   else if (strncmp (opt, "pic", 3) == 0)
12680     {
12681       int i;
12682 
12683       i = atoi (opt + 3);
12684       if (i == 0)
12685 	mips_pic = NO_PIC;
12686       else if (i == 2)
12687 	{
12688 	mips_pic = SVR4_PIC;
12689 	  mips_abicalls = TRUE;
12690 	}
12691       else
12692 	as_bad (_(".option pic%d not supported"), i);
12693 
12694       if (mips_pic == SVR4_PIC)
12695 	{
12696 	  if (g_switch_seen && g_switch_value != 0)
12697 	    as_warn (_("-G may not be used with SVR4 PIC code"));
12698 	  g_switch_value = 0;
12699 	  bfd_set_gp_size (stdoutput, 0);
12700 	}
12701     }
12702   else
12703     as_warn (_("Unrecognized option \"%s\""), opt);
12704 
12705   *input_line_pointer = c;
12706   demand_empty_rest_of_line ();
12707 }
12708 
12709 /* This structure is used to hold a stack of .set values.  */
12710 
12711 struct mips_option_stack
12712 {
12713   struct mips_option_stack *next;
12714   struct mips_set_options options;
12715 };
12716 
12717 static struct mips_option_stack *mips_opts_stack;
12718 
12719 /* Handle the .set pseudo-op.  */
12720 
12721 static void
s_mipsset(int x ATTRIBUTE_UNUSED)12722 s_mipsset (int x ATTRIBUTE_UNUSED)
12723 {
12724   char *name = input_line_pointer, ch;
12725 
12726   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12727     ++input_line_pointer;
12728   ch = *input_line_pointer;
12729   *input_line_pointer = '\0';
12730 
12731   if (strcmp (name, "reorder") == 0)
12732     {
12733       if (mips_opts.noreorder)
12734 	end_noreorder ();
12735     }
12736   else if (strcmp (name, "noreorder") == 0)
12737     {
12738       if (!mips_opts.noreorder)
12739 	start_noreorder ();
12740     }
12741   else if (strcmp (name, "at") == 0)
12742     {
12743       mips_opts.noat = 0;
12744     }
12745   else if (strcmp (name, "noat") == 0)
12746     {
12747       mips_opts.noat = 1;
12748     }
12749   else if (strcmp (name, "macro") == 0)
12750     {
12751       mips_opts.warn_about_macros = 0;
12752     }
12753   else if (strcmp (name, "nomacro") == 0)
12754     {
12755       if (mips_opts.noreorder == 0)
12756 	as_bad (_("`noreorder' must be set before `nomacro'"));
12757       mips_opts.warn_about_macros = 1;
12758     }
12759   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12760     {
12761       mips_opts.nomove = 0;
12762     }
12763   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12764     {
12765       mips_opts.nomove = 1;
12766     }
12767   else if (strcmp (name, "bopt") == 0)
12768     {
12769       mips_opts.nobopt = 0;
12770     }
12771   else if (strcmp (name, "nobopt") == 0)
12772     {
12773       mips_opts.nobopt = 1;
12774     }
12775   else if (strcmp (name, "gp=default") == 0)
12776     mips_opts.gp32 = file_mips_gp32;
12777   else if (strcmp (name, "gp=32") == 0)
12778     mips_opts.gp32 = 1;
12779   else if (strcmp (name, "gp=64") == 0)
12780     {
12781       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12782 	as_warn ("%s isa does not support 64-bit registers",
12783 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12784       mips_opts.gp32 = 0;
12785     }
12786   else if (strcmp (name, "fp=default") == 0)
12787     mips_opts.fp32 = file_mips_fp32;
12788   else if (strcmp (name, "fp=32") == 0)
12789     mips_opts.fp32 = 1;
12790   else if (strcmp (name, "fp=64") == 0)
12791     {
12792       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12793 	as_warn ("%s isa does not support 64-bit floating point registers",
12794 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12795       mips_opts.fp32 = 0;
12796     }
12797   else if (strcmp (name, "mips16") == 0
12798 	   || strcmp (name, "MIPS-16") == 0)
12799     mips_opts.mips16 = 1;
12800   else if (strcmp (name, "nomips16") == 0
12801 	   || strcmp (name, "noMIPS-16") == 0)
12802     mips_opts.mips16 = 0;
12803   else if (strcmp (name, "smartmips") == 0)
12804     {
12805       if (!ISA_SUPPORTS_SMARTMIPS)
12806 	as_warn ("%s ISA does not support SmartMIPS ASE",
12807 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12808       mips_opts.ase_smartmips = 1;
12809     }
12810   else if (strcmp (name, "nosmartmips") == 0)
12811     mips_opts.ase_smartmips = 0;
12812   else if (strcmp (name, "mips3d") == 0)
12813     mips_opts.ase_mips3d = 1;
12814   else if (strcmp (name, "nomips3d") == 0)
12815     mips_opts.ase_mips3d = 0;
12816   else if (strcmp (name, "mdmx") == 0)
12817     mips_opts.ase_mdmx = 1;
12818   else if (strcmp (name, "nomdmx") == 0)
12819     mips_opts.ase_mdmx = 0;
12820   else if (strcmp (name, "dsp") == 0)
12821     {
12822       if (!ISA_SUPPORTS_DSP_ASE)
12823 	as_warn ("%s ISA does not support DSP ASE",
12824 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12825       mips_opts.ase_dsp = 1;
12826       mips_opts.ase_dspr2 = 0;
12827     }
12828   else if (strcmp (name, "nodsp") == 0)
12829     {
12830       mips_opts.ase_dsp = 0;
12831       mips_opts.ase_dspr2 = 0;
12832     }
12833   else if (strcmp (name, "dspr2") == 0)
12834     {
12835       if (!ISA_SUPPORTS_DSPR2_ASE)
12836 	as_warn ("%s ISA does not support DSP R2 ASE",
12837 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12838       mips_opts.ase_dspr2 = 1;
12839       mips_opts.ase_dsp = 1;
12840     }
12841   else if (strcmp (name, "nodspr2") == 0)
12842     {
12843       mips_opts.ase_dspr2 = 0;
12844       mips_opts.ase_dsp = 0;
12845     }
12846   else if (strcmp (name, "mt") == 0)
12847     {
12848       if (!ISA_SUPPORTS_MT_ASE)
12849 	as_warn ("%s ISA does not support MT ASE",
12850 		 mips_cpu_info_from_isa (mips_opts.isa)->name);
12851       mips_opts.ase_mt = 1;
12852     }
12853   else if (strcmp (name, "nomt") == 0)
12854     mips_opts.ase_mt = 0;
12855   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12856     {
12857       int reset = 0;
12858 
12859       /* Permit the user to change the ISA and architecture on the fly.
12860 	 Needless to say, misuse can cause serious problems.  */
12861       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12862 	{
12863 	  reset = 1;
12864 	  mips_opts.isa = file_mips_isa;
12865 	  mips_opts.arch = file_mips_arch;
12866 	}
12867       else if (strncmp (name, "arch=", 5) == 0)
12868 	{
12869 	  const struct mips_cpu_info *p;
12870 
12871 	  p = mips_parse_cpu("internal use", name + 5);
12872 	  if (!p)
12873 	    as_bad (_("unknown architecture %s"), name + 5);
12874 	  else
12875 	    {
12876 	      mips_opts.arch = p->cpu;
12877 	      mips_opts.isa = p->isa;
12878 	    }
12879 	}
12880       else if (strncmp (name, "mips", 4) == 0)
12881 	{
12882 	  const struct mips_cpu_info *p;
12883 
12884 	  p = mips_parse_cpu("internal use", name);
12885 	  if (!p)
12886 	    as_bad (_("unknown ISA level %s"), name + 4);
12887 	  else
12888 	    {
12889 	      mips_opts.arch = p->cpu;
12890 	      mips_opts.isa = p->isa;
12891 	    }
12892 	}
12893       else
12894 	as_bad (_("unknown ISA or architecture %s"), name);
12895 
12896       switch (mips_opts.isa)
12897 	{
12898 	case  0:
12899 	  break;
12900 	case ISA_MIPS1:
12901 	case ISA_MIPS2:
12902 	case ISA_MIPS32:
12903 	case ISA_MIPS32R2:
12904 	  mips_opts.gp32 = 1;
12905 	  mips_opts.fp32 = 1;
12906 	  break;
12907 	case ISA_MIPS3:
12908 	case ISA_MIPS4:
12909 	case ISA_MIPS5:
12910 	case ISA_MIPS64:
12911 	case ISA_MIPS64R2:
12912 	  mips_opts.gp32 = 0;
12913 	  mips_opts.fp32 = 0;
12914 	  break;
12915 	default:
12916 	  as_bad (_("unknown ISA level %s"), name + 4);
12917 	  break;
12918 	}
12919       if (reset)
12920 	{
12921 	  mips_opts.gp32 = file_mips_gp32;
12922 	  mips_opts.fp32 = file_mips_fp32;
12923 	}
12924     }
12925   else if (strcmp (name, "autoextend") == 0)
12926     mips_opts.noautoextend = 0;
12927   else if (strcmp (name, "noautoextend") == 0)
12928     mips_opts.noautoextend = 1;
12929   else if (strcmp (name, "push") == 0)
12930     {
12931       struct mips_option_stack *s;
12932 
12933       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12934       s->next = mips_opts_stack;
12935       s->options = mips_opts;
12936       mips_opts_stack = s;
12937     }
12938   else if (strcmp (name, "pop") == 0)
12939     {
12940       struct mips_option_stack *s;
12941 
12942       s = mips_opts_stack;
12943       if (s == NULL)
12944 	as_bad (_(".set pop with no .set push"));
12945       else
12946 	{
12947 	  /* If we're changing the reorder mode we need to handle
12948              delay slots correctly.  */
12949 	  if (s->options.noreorder && ! mips_opts.noreorder)
12950 	    start_noreorder ();
12951 	  else if (! s->options.noreorder && mips_opts.noreorder)
12952 	    end_noreorder ();
12953 
12954 	  mips_opts = s->options;
12955 	  mips_opts_stack = s->next;
12956 	  free (s);
12957 	}
12958     }
12959   else if (strcmp (name, "sym32") == 0)
12960     mips_opts.sym32 = TRUE;
12961   else if (strcmp (name, "nosym32") == 0)
12962     mips_opts.sym32 = FALSE;
12963   else if (strchr (name, ','))
12964     {
12965       /* Generic ".set" directive; use the generic handler.  */
12966       *input_line_pointer = ch;
12967       input_line_pointer = name;
12968       s_set (0);
12969       return;
12970     }
12971   else
12972     {
12973       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12974     }
12975   *input_line_pointer = ch;
12976   demand_empty_rest_of_line ();
12977 }
12978 
12979 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12980    .option pic2.  It means to generate SVR4 PIC calls.  */
12981 
12982 static void
s_abicalls(int ignore ATTRIBUTE_UNUSED)12983 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12984 {
12985   mips_pic = SVR4_PIC;
12986   mips_abicalls = TRUE;
12987 
12988   if (g_switch_seen && g_switch_value != 0)
12989     as_warn (_("-G may not be used with SVR4 PIC code"));
12990   g_switch_value = 0;
12991 
12992   bfd_set_gp_size (stdoutput, 0);
12993   demand_empty_rest_of_line ();
12994 }
12995 
12996 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12997    PIC code.  It sets the $gp register for the function based on the
12998    function address, which is in the register named in the argument.
12999    This uses a relocation against _gp_disp, which is handled specially
13000    by the linker.  The result is:
13001 	lui	$gp,%hi(_gp_disp)
13002 	addiu	$gp,$gp,%lo(_gp_disp)
13003 	addu	$gp,$gp,.cpload argument
13004    The .cpload argument is normally $25 == $t9.
13005 
13006    The -mno-shared option changes this to:
13007 	lui	$gp,%hi(__gnu_local_gp)
13008 	addiu	$gp,$gp,%lo(__gnu_local_gp)
13009    and the argument is ignored.  This saves an instruction, but the
13010    resulting code is not position independent; it uses an absolute
13011    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13012    can go into an ordinary executable, but not into a shared library.  */
13013 
13014 static void
s_cpload(int ignore ATTRIBUTE_UNUSED)13015 s_cpload (int ignore ATTRIBUTE_UNUSED)
13016 {
13017   expressionS ex;
13018   int reg;
13019   int in_shared;
13020 
13021   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13022      .cpload is ignored.  */
13023   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13024     {
13025       s_ignore (0);
13026       return;
13027     }
13028 
13029   /* .cpload should be in a .set noreorder section.  */
13030   if (mips_opts.noreorder == 0)
13031     as_warn (_(".cpload not in noreorder section"));
13032 
13033   reg = tc_get_register (0);
13034 
13035   /* If we need to produce a 64-bit address, we are better off using
13036      the default instruction sequence.  */
13037   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13038 
13039   ex.X_op = O_symbol;
13040   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13041                                          "__gnu_local_gp");
13042   ex.X_op_symbol = NULL;
13043   ex.X_add_number = 0;
13044 
13045   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13046   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13047 
13048   macro_start ();
13049   macro_build_lui (&ex, mips_gp_register);
13050   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13051 	       mips_gp_register, BFD_RELOC_LO16);
13052   if (in_shared)
13053     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13054 		 mips_gp_register, reg);
13055   macro_end ();
13056 
13057   demand_empty_rest_of_line ();
13058 }
13059 
13060 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13061      .cpsetup $reg1, offset|$reg2, label
13062 
13063    If offset is given, this results in:
13064      sd		$gp, offset($sp)
13065      lui	$gp, %hi(%neg(%gp_rel(label)))
13066      addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
13067      daddu	$gp, $gp, $reg1
13068 
13069    If $reg2 is given, this results in:
13070      daddu	$reg2, $gp, $0
13071      lui	$gp, %hi(%neg(%gp_rel(label)))
13072      addiu	$gp, $gp, %lo(%neg(%gp_rel(label)))
13073      daddu	$gp, $gp, $reg1
13074    $reg1 is normally $25 == $t9.
13075 
13076    The -mno-shared option replaces the last three instructions with
13077 	lui	$gp,%hi(_gp)
13078 	addiu	$gp,$gp,%lo(_gp)  */
13079 
13080 static void
s_cpsetup(int ignore ATTRIBUTE_UNUSED)13081 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13082 {
13083   expressionS ex_off;
13084   expressionS ex_sym;
13085   int reg1;
13086 
13087   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13088      We also need NewABI support.  */
13089   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13090     {
13091       s_ignore (0);
13092       return;
13093     }
13094 
13095   reg1 = tc_get_register (0);
13096   SKIP_WHITESPACE ();
13097   if (*input_line_pointer != ',')
13098     {
13099       as_bad (_("missing argument separator ',' for .cpsetup"));
13100       return;
13101     }
13102   else
13103     ++input_line_pointer;
13104   SKIP_WHITESPACE ();
13105   if (*input_line_pointer == '$')
13106     {
13107       mips_cpreturn_register = tc_get_register (0);
13108       mips_cpreturn_offset = -1;
13109     }
13110   else
13111     {
13112       mips_cpreturn_offset = get_absolute_expression ();
13113       mips_cpreturn_register = -1;
13114     }
13115   SKIP_WHITESPACE ();
13116   if (*input_line_pointer != ',')
13117     {
13118       as_bad (_("missing argument separator ',' for .cpsetup"));
13119       return;
13120     }
13121   else
13122     ++input_line_pointer;
13123   SKIP_WHITESPACE ();
13124   expression (&ex_sym);
13125 
13126   macro_start ();
13127   if (mips_cpreturn_register == -1)
13128     {
13129       ex_off.X_op = O_constant;
13130       ex_off.X_add_symbol = NULL;
13131       ex_off.X_op_symbol = NULL;
13132       ex_off.X_add_number = mips_cpreturn_offset;
13133 
13134       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13135 		   BFD_RELOC_LO16, SP);
13136     }
13137   else
13138     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13139 		 mips_gp_register, 0);
13140 
13141   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13142     {
13143       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13144 		   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13145 		   BFD_RELOC_HI16_S);
13146 
13147       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13148 		   mips_gp_register, -1, BFD_RELOC_GPREL16,
13149 		   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13150 
13151       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13152 		   mips_gp_register, reg1);
13153     }
13154   else
13155     {
13156       expressionS ex;
13157 
13158       ex.X_op = O_symbol;
13159       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13160       ex.X_op_symbol = NULL;
13161       ex.X_add_number = 0;
13162 
13163       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13164       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13165 
13166       macro_build_lui (&ex, mips_gp_register);
13167       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13168 		   mips_gp_register, BFD_RELOC_LO16);
13169     }
13170 
13171   macro_end ();
13172 
13173   demand_empty_rest_of_line ();
13174 }
13175 
13176 static void
s_cplocal(int ignore ATTRIBUTE_UNUSED)13177 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13178 {
13179   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13180      .cplocal is ignored.  */
13181   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13182     {
13183       s_ignore (0);
13184       return;
13185     }
13186 
13187   mips_gp_register = tc_get_register (0);
13188   demand_empty_rest_of_line ();
13189 }
13190 
13191 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13192    offset from $sp.  The offset is remembered, and after making a PIC
13193    call $gp is restored from that location.  */
13194 
13195 static void
s_cprestore(int ignore ATTRIBUTE_UNUSED)13196 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13197 {
13198   expressionS ex;
13199 
13200   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13201      .cprestore is ignored.  */
13202   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13203     {
13204       s_ignore (0);
13205       return;
13206     }
13207 
13208   mips_cprestore_offset = get_absolute_expression ();
13209   mips_cprestore_valid = 1;
13210 
13211   ex.X_op = O_constant;
13212   ex.X_add_symbol = NULL;
13213   ex.X_op_symbol = NULL;
13214   ex.X_add_number = mips_cprestore_offset;
13215 
13216   macro_start ();
13217   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13218 				SP, HAVE_64BIT_ADDRESSES);
13219   macro_end ();
13220 
13221   demand_empty_rest_of_line ();
13222 }
13223 
13224 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13225    was given in the preceding .cpsetup, it results in:
13226      ld		$gp, offset($sp)
13227 
13228    If a register $reg2 was given there, it results in:
13229      daddu	$gp, $reg2, $0  */
13230 
13231 static void
s_cpreturn(int ignore ATTRIBUTE_UNUSED)13232 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13233 {
13234   expressionS ex;
13235 
13236   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13237      We also need NewABI support.  */
13238   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13239     {
13240       s_ignore (0);
13241       return;
13242     }
13243 
13244   macro_start ();
13245   if (mips_cpreturn_register == -1)
13246     {
13247       ex.X_op = O_constant;
13248       ex.X_add_symbol = NULL;
13249       ex.X_op_symbol = NULL;
13250       ex.X_add_number = mips_cpreturn_offset;
13251 
13252       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13253     }
13254   else
13255     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13256 		 mips_cpreturn_register, 0);
13257   macro_end ();
13258 
13259   demand_empty_rest_of_line ();
13260 }
13261 
13262 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13263    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13264    use in DWARF debug information.  */
13265 
13266 static void
s_dtprel_internal(size_t bytes)13267 s_dtprel_internal (size_t bytes)
13268 {
13269   expressionS ex;
13270   char *p;
13271 
13272   expression (&ex);
13273 
13274   if (ex.X_op != O_symbol)
13275     {
13276       as_bad (_("Unsupported use of %s"), (bytes == 8
13277 					   ? ".dtpreldword"
13278 					   : ".dtprelword"));
13279       ignore_rest_of_line ();
13280     }
13281 
13282   p = frag_more (bytes);
13283   md_number_to_chars (p, 0, bytes);
13284   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13285 	       (bytes == 8
13286 		? BFD_RELOC_MIPS_TLS_DTPREL64
13287 		: BFD_RELOC_MIPS_TLS_DTPREL32));
13288 
13289   demand_empty_rest_of_line ();
13290 }
13291 
13292 /* Handle .dtprelword.  */
13293 
13294 static void
s_dtprelword(int ignore ATTRIBUTE_UNUSED)13295 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13296 {
13297   s_dtprel_internal (4);
13298 }
13299 
13300 /* Handle .dtpreldword.  */
13301 
13302 static void
s_dtpreldword(int ignore ATTRIBUTE_UNUSED)13303 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13304 {
13305   s_dtprel_internal (8);
13306 }
13307 
13308 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13309    code.  It sets the offset to use in gp_rel relocations.  */
13310 
13311 static void
s_gpvalue(int ignore ATTRIBUTE_UNUSED)13312 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13313 {
13314   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13315      We also need NewABI support.  */
13316   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13317     {
13318       s_ignore (0);
13319       return;
13320     }
13321 
13322   mips_gprel_offset = get_absolute_expression ();
13323 
13324   demand_empty_rest_of_line ();
13325 }
13326 
13327 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13328    code.  It generates a 32 bit GP relative reloc.  */
13329 
13330 static void
s_gpword(int ignore ATTRIBUTE_UNUSED)13331 s_gpword (int ignore ATTRIBUTE_UNUSED)
13332 {
13333   segment_info_type *si;
13334   struct insn_label_list *l;
13335   symbolS *label;
13336   expressionS ex;
13337   char *p;
13338 
13339   /* When not generating PIC code, this is treated as .word.  */
13340   if (mips_pic != SVR4_PIC)
13341     {
13342       s_cons (2);
13343       return;
13344     }
13345 
13346   si = seg_info (now_seg);
13347   l = si->label_list;
13348   label = l != NULL ? l->label : NULL;
13349   mips_emit_delays ();
13350   if (auto_align)
13351     mips_align (2, 0, label);
13352   mips_clear_insn_labels ();
13353 
13354   expression (&ex);
13355 
13356   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13357     {
13358       as_bad (_("Unsupported use of .gpword"));
13359       ignore_rest_of_line ();
13360     }
13361 
13362   p = frag_more (4);
13363   md_number_to_chars (p, 0, 4);
13364   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13365 	       BFD_RELOC_GPREL32);
13366 
13367   demand_empty_rest_of_line ();
13368 }
13369 
13370 static void
s_gpdword(int ignore ATTRIBUTE_UNUSED)13371 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13372 {
13373   segment_info_type *si;
13374   struct insn_label_list *l;
13375   symbolS *label;
13376   expressionS ex;
13377   char *p;
13378 
13379   /* When not generating PIC code, this is treated as .dword.  */
13380   if (mips_pic != SVR4_PIC)
13381     {
13382       s_cons (3);
13383       return;
13384     }
13385 
13386   si = seg_info (now_seg);
13387   l = si->label_list;
13388   label = l != NULL ? l->label : NULL;
13389   mips_emit_delays ();
13390   if (auto_align)
13391     mips_align (3, 0, label);
13392   mips_clear_insn_labels ();
13393 
13394   expression (&ex);
13395 
13396   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13397     {
13398       as_bad (_("Unsupported use of .gpdword"));
13399       ignore_rest_of_line ();
13400     }
13401 
13402   p = frag_more (8);
13403   md_number_to_chars (p, 0, 8);
13404   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13405 	       BFD_RELOC_GPREL32)->fx_tcbit = 1;
13406 
13407   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13408   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13409 	   FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13410 
13411   demand_empty_rest_of_line ();
13412 }
13413 
13414 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13415    tables in SVR4 PIC code.  */
13416 
13417 static void
s_cpadd(int ignore ATTRIBUTE_UNUSED)13418 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13419 {
13420   int reg;
13421 
13422   /* This is ignored when not generating SVR4 PIC code.  */
13423   if (mips_pic != SVR4_PIC)
13424     {
13425       s_ignore (0);
13426       return;
13427     }
13428 
13429   /* Add $gp to the register named as an argument.  */
13430   macro_start ();
13431   reg = tc_get_register (0);
13432   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13433   macro_end ();
13434 
13435   demand_empty_rest_of_line ();
13436 }
13437 
13438 /* Handle the .insn pseudo-op.  This marks instruction labels in
13439    mips16 mode.  This permits the linker to handle them specially,
13440    such as generating jalx instructions when needed.  We also make
13441    them odd for the duration of the assembly, in order to generate the
13442    right sort of code.  We will make them even in the adjust_symtab
13443    routine, while leaving them marked.  This is convenient for the
13444    debugger and the disassembler.  The linker knows to make them odd
13445    again.  */
13446 
13447 static void
s_insn(int ignore ATTRIBUTE_UNUSED)13448 s_insn (int ignore ATTRIBUTE_UNUSED)
13449 {
13450   mips16_mark_labels ();
13451 
13452   demand_empty_rest_of_line ();
13453 }
13454 
13455 /* Handle a .stabn directive.  We need these in order to mark a label
13456    as being a mips16 text label correctly.  Sometimes the compiler
13457    will emit a label, followed by a .stabn, and then switch sections.
13458    If the label and .stabn are in mips16 mode, then the label is
13459    really a mips16 text label.  */
13460 
13461 static void
s_mips_stab(int type)13462 s_mips_stab (int type)
13463 {
13464   if (type == 'n')
13465     mips16_mark_labels ();
13466 
13467   s_stab (type);
13468 }
13469 
13470 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13471 
13472 static void
s_mips_weakext(int ignore ATTRIBUTE_UNUSED)13473 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13474 {
13475   char *name;
13476   int c;
13477   symbolS *symbolP;
13478   expressionS exp;
13479 
13480   name = input_line_pointer;
13481   c = get_symbol_end ();
13482   symbolP = symbol_find_or_make (name);
13483   S_SET_WEAK (symbolP);
13484   *input_line_pointer = c;
13485 
13486   SKIP_WHITESPACE ();
13487 
13488   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13489     {
13490       if (S_IS_DEFINED (symbolP))
13491 	{
13492 	  as_bad ("ignoring attempt to redefine symbol %s",
13493 		  S_GET_NAME (symbolP));
13494 	  ignore_rest_of_line ();
13495 	  return;
13496 	}
13497 
13498       if (*input_line_pointer == ',')
13499 	{
13500 	  ++input_line_pointer;
13501 	  SKIP_WHITESPACE ();
13502 	}
13503 
13504       expression (&exp);
13505       if (exp.X_op != O_symbol)
13506 	{
13507 	  as_bad ("bad .weakext directive");
13508 	  ignore_rest_of_line ();
13509 	  return;
13510 	}
13511       symbol_set_value_expression (symbolP, &exp);
13512     }
13513 
13514   demand_empty_rest_of_line ();
13515 }
13516 
13517 /* Parse a register string into a number.  Called from the ECOFF code
13518    to parse .frame.  The argument is non-zero if this is the frame
13519    register, so that we can record it in mips_frame_reg.  */
13520 
13521 int
tc_get_register(int frame)13522 tc_get_register (int frame)
13523 {
13524   unsigned int reg;
13525 
13526   SKIP_WHITESPACE ();
13527   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13528     reg = 0;
13529   if (frame)
13530     {
13531       mips_frame_reg = reg != 0 ? reg : SP;
13532       mips_frame_reg_valid = 1;
13533       mips_cprestore_valid = 0;
13534     }
13535   return reg;
13536 }
13537 
13538 valueT
md_section_align(asection * seg,valueT addr)13539 md_section_align (asection *seg, valueT addr)
13540 {
13541   int align = bfd_get_section_alignment (stdoutput, seg);
13542 
13543   if (IS_ELF)
13544     {
13545       /* We don't need to align ELF sections to the full alignment.
13546 	 However, Irix 5 may prefer that we align them at least to a 16
13547 	 byte boundary.  We don't bother to align the sections if we
13548 	 are targeted for an embedded system.  */
13549       if (strcmp (TARGET_OS, "elf") == 0)
13550         return addr;
13551       if (align > 4)
13552         align = 4;
13553     }
13554 
13555   return ((addr + (1 << align) - 1) & (-1 << align));
13556 }
13557 
13558 /* Utility routine, called from above as well.  If called while the
13559    input file is still being read, it's only an approximation.  (For
13560    example, a symbol may later become defined which appeared to be
13561    undefined earlier.)  */
13562 
13563 static int
nopic_need_relax(symbolS * sym,int before_relaxing)13564 nopic_need_relax (symbolS *sym, int before_relaxing)
13565 {
13566   if (sym == 0)
13567     return 0;
13568 
13569   if (g_switch_value > 0)
13570     {
13571       const char *symname;
13572       int change;
13573 
13574       /* Find out whether this symbol can be referenced off the $gp
13575 	 register.  It can be if it is smaller than the -G size or if
13576 	 it is in the .sdata or .sbss section.  Certain symbols can
13577 	 not be referenced off the $gp, although it appears as though
13578 	 they can.  */
13579       symname = S_GET_NAME (sym);
13580       if (symname != (const char *) NULL
13581 	  && (strcmp (symname, "eprol") == 0
13582 	      || strcmp (symname, "etext") == 0
13583 	      || strcmp (symname, "_gp") == 0
13584 	      || strcmp (symname, "edata") == 0
13585 	      || strcmp (symname, "_fbss") == 0
13586 	      || strcmp (symname, "_fdata") == 0
13587 	      || strcmp (symname, "_ftext") == 0
13588 	      || strcmp (symname, "end") == 0
13589 	      || strcmp (symname, "_gp_disp") == 0))
13590 	change = 1;
13591       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13592 	       && (0
13593 #ifndef NO_ECOFF_DEBUGGING
13594 		   || (symbol_get_obj (sym)->ecoff_extern_size != 0
13595 		       && (symbol_get_obj (sym)->ecoff_extern_size
13596 			   <= g_switch_value))
13597 #endif
13598 		   /* We must defer this decision until after the whole
13599 		      file has been read, since there might be a .extern
13600 		      after the first use of this symbol.  */
13601 		   || (before_relaxing
13602 #ifndef NO_ECOFF_DEBUGGING
13603 		       && symbol_get_obj (sym)->ecoff_extern_size == 0
13604 #endif
13605 		       && S_GET_VALUE (sym) == 0)
13606 		   || (S_GET_VALUE (sym) != 0
13607 		       && S_GET_VALUE (sym) <= g_switch_value)))
13608 	change = 0;
13609       else
13610 	{
13611 	  const char *segname;
13612 
13613 	  segname = segment_name (S_GET_SEGMENT (sym));
13614 	  assert (strcmp (segname, ".lit8") != 0
13615 		  && strcmp (segname, ".lit4") != 0);
13616 	  change = (strcmp (segname, ".sdata") != 0
13617 		    && strcmp (segname, ".sbss") != 0
13618 		    && strncmp (segname, ".sdata.", 7) != 0
13619 		    && strncmp (segname, ".sbss.", 6) != 0
13620 		    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13621 		    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13622 	}
13623       return change;
13624     }
13625   else
13626     /* We are not optimizing for the $gp register.  */
13627     return 1;
13628 }
13629 
13630 
13631 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13632 
13633 static bfd_boolean
pic_need_relax(symbolS * sym,asection * segtype)13634 pic_need_relax (symbolS *sym, asection *segtype)
13635 {
13636   asection *symsec;
13637 
13638   /* Handle the case of a symbol equated to another symbol.  */
13639   while (symbol_equated_reloc_p (sym))
13640     {
13641       symbolS *n;
13642 
13643       /* It's possible to get a loop here in a badly written program.  */
13644       n = symbol_get_value_expression (sym)->X_add_symbol;
13645       if (n == sym)
13646 	break;
13647       sym = n;
13648     }
13649 
13650   if (symbol_section_p (sym))
13651     return TRUE;
13652 
13653   symsec = S_GET_SEGMENT (sym);
13654 
13655   /* This must duplicate the test in adjust_reloc_syms.  */
13656   return (symsec != &bfd_und_section
13657 	  && symsec != &bfd_abs_section
13658 	  && !bfd_is_com_section (symsec)
13659 	  && !s_is_linkonce (sym, segtype)
13660 #ifdef OBJ_ELF
13661 	  /* A global or weak symbol is treated as external.  */
13662 	  && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13663 #endif
13664 	  );
13665 }
13666 
13667 
13668 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13669    extended opcode.  SEC is the section the frag is in.  */
13670 
13671 static int
mips16_extended_frag(fragS * fragp,asection * sec,long stretch)13672 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13673 {
13674   int type;
13675   const struct mips16_immed_operand *op;
13676   offsetT val;
13677   int mintiny, maxtiny;
13678   segT symsec;
13679   fragS *sym_frag;
13680 
13681   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13682     return 0;
13683   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13684     return 1;
13685 
13686   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13687   op = mips16_immed_operands;
13688   while (op->type != type)
13689     {
13690       ++op;
13691       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13692     }
13693 
13694   if (op->unsp)
13695     {
13696       if (type == '<' || type == '>' || type == '[' || type == ']')
13697 	{
13698 	  mintiny = 1;
13699 	  maxtiny = 1 << op->nbits;
13700 	}
13701       else
13702 	{
13703 	  mintiny = 0;
13704 	  maxtiny = (1 << op->nbits) - 1;
13705 	}
13706     }
13707   else
13708     {
13709       mintiny = - (1 << (op->nbits - 1));
13710       maxtiny = (1 << (op->nbits - 1)) - 1;
13711     }
13712 
13713   sym_frag = symbol_get_frag (fragp->fr_symbol);
13714   val = S_GET_VALUE (fragp->fr_symbol);
13715   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13716 
13717   if (op->pcrel)
13718     {
13719       addressT addr;
13720 
13721       /* We won't have the section when we are called from
13722          mips_relax_frag.  However, we will always have been called
13723          from md_estimate_size_before_relax first.  If this is a
13724          branch to a different section, we mark it as such.  If SEC is
13725          NULL, and the frag is not marked, then it must be a branch to
13726          the same section.  */
13727       if (sec == NULL)
13728 	{
13729 	  if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13730 	    return 1;
13731 	}
13732       else
13733 	{
13734 	  /* Must have been called from md_estimate_size_before_relax.  */
13735 	  if (symsec != sec)
13736 	    {
13737 	      fragp->fr_subtype =
13738 		RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13739 
13740 	      /* FIXME: We should support this, and let the linker
13741                  catch branches and loads that are out of range.  */
13742 	      as_bad_where (fragp->fr_file, fragp->fr_line,
13743 			    _("unsupported PC relative reference to different section"));
13744 
13745 	      return 1;
13746 	    }
13747 	  if (fragp != sym_frag && sym_frag->fr_address == 0)
13748 	    /* Assume non-extended on the first relaxation pass.
13749 	       The address we have calculated will be bogus if this is
13750 	       a forward branch to another frag, as the forward frag
13751 	       will have fr_address == 0.  */
13752 	    return 0;
13753 	}
13754 
13755       /* In this case, we know for sure that the symbol fragment is in
13756 	 the same section.  If the relax_marker of the symbol fragment
13757 	 differs from the relax_marker of this fragment, we have not
13758 	 yet adjusted the symbol fragment fr_address.  We want to add
13759 	 in STRETCH in order to get a better estimate of the address.
13760 	 This particularly matters because of the shift bits.  */
13761       if (stretch != 0
13762 	  && sym_frag->relax_marker != fragp->relax_marker)
13763 	{
13764 	  fragS *f;
13765 
13766 	  /* Adjust stretch for any alignment frag.  Note that if have
13767              been expanding the earlier code, the symbol may be
13768              defined in what appears to be an earlier frag.  FIXME:
13769              This doesn't handle the fr_subtype field, which specifies
13770              a maximum number of bytes to skip when doing an
13771              alignment.  */
13772 	  for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13773 	    {
13774 	      if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13775 		{
13776 		  if (stretch < 0)
13777 		    stretch = - ((- stretch)
13778 				 & ~ ((1 << (int) f->fr_offset) - 1));
13779 		  else
13780 		    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13781 		  if (stretch == 0)
13782 		    break;
13783 		}
13784 	    }
13785 	  if (f != NULL)
13786 	    val += stretch;
13787 	}
13788 
13789       addr = fragp->fr_address + fragp->fr_fix;
13790 
13791       /* The base address rules are complicated.  The base address of
13792          a branch is the following instruction.  The base address of a
13793          PC relative load or add is the instruction itself, but if it
13794          is in a delay slot (in which case it can not be extended) use
13795          the address of the instruction whose delay slot it is in.  */
13796       if (type == 'p' || type == 'q')
13797 	{
13798 	  addr += 2;
13799 
13800 	  /* If we are currently assuming that this frag should be
13801 	     extended, then, the current address is two bytes
13802 	     higher.  */
13803 	  if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13804 	    addr += 2;
13805 
13806 	  /* Ignore the low bit in the target, since it will be set
13807              for a text label.  */
13808 	  if ((val & 1) != 0)
13809 	    --val;
13810 	}
13811       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13812 	addr -= 4;
13813       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13814 	addr -= 2;
13815 
13816       val -= addr & ~ ((1 << op->shift) - 1);
13817 
13818       /* Branch offsets have an implicit 0 in the lowest bit.  */
13819       if (type == 'p' || type == 'q')
13820 	val /= 2;
13821 
13822       /* If any of the shifted bits are set, we must use an extended
13823          opcode.  If the address depends on the size of this
13824          instruction, this can lead to a loop, so we arrange to always
13825          use an extended opcode.  We only check this when we are in
13826          the main relaxation loop, when SEC is NULL.  */
13827       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13828 	{
13829 	  fragp->fr_subtype =
13830 	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13831 	  return 1;
13832 	}
13833 
13834       /* If we are about to mark a frag as extended because the value
13835          is precisely maxtiny + 1, then there is a chance of an
13836          infinite loop as in the following code:
13837 	     la	$4,foo
13838 	     .skip	1020
13839 	     .align	2
13840 	   foo:
13841 	 In this case when the la is extended, foo is 0x3fc bytes
13842 	 away, so the la can be shrunk, but then foo is 0x400 away, so
13843 	 the la must be extended.  To avoid this loop, we mark the
13844 	 frag as extended if it was small, and is about to become
13845 	 extended with a value of maxtiny + 1.  */
13846       if (val == ((maxtiny + 1) << op->shift)
13847 	  && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13848 	  && sec == NULL)
13849 	{
13850 	  fragp->fr_subtype =
13851 	    RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13852 	  return 1;
13853 	}
13854     }
13855   else if (symsec != absolute_section && sec != NULL)
13856     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13857 
13858   if ((val & ((1 << op->shift) - 1)) != 0
13859       || val < (mintiny << op->shift)
13860       || val > (maxtiny << op->shift))
13861     return 1;
13862   else
13863     return 0;
13864 }
13865 
13866 /* Compute the length of a branch sequence, and adjust the
13867    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13868    worst-case length is computed, with UPDATE being used to indicate
13869    whether an unconditional (-1), branch-likely (+1) or regular (0)
13870    branch is to be computed.  */
13871 static int
relaxed_branch_length(fragS * fragp,asection * sec,int update)13872 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13873 {
13874   bfd_boolean toofar;
13875   int length;
13876 
13877   if (fragp
13878       && S_IS_DEFINED (fragp->fr_symbol)
13879       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13880     {
13881       addressT addr;
13882       offsetT val;
13883 
13884       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13885 
13886       addr = fragp->fr_address + fragp->fr_fix + 4;
13887 
13888       val -= addr;
13889 
13890       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13891     }
13892   else if (fragp)
13893     /* If the symbol is not defined or it's in a different segment,
13894        assume the user knows what's going on and emit a short
13895        branch.  */
13896     toofar = FALSE;
13897   else
13898     toofar = TRUE;
13899 
13900   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13901     fragp->fr_subtype
13902       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13903 			     RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13904 			     RELAX_BRANCH_LINK (fragp->fr_subtype),
13905 			     toofar);
13906 
13907   length = 4;
13908   if (toofar)
13909     {
13910       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13911 	length += 8;
13912 
13913       if (mips_pic != NO_PIC)
13914 	{
13915 	  /* Additional space for PIC loading of target address.  */
13916 	  length += 8;
13917 	  if (mips_opts.isa == ISA_MIPS1)
13918 	    /* Additional space for $at-stabilizing nop.  */
13919 	    length += 4;
13920 	}
13921 
13922       /* If branch is conditional.  */
13923       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13924 	length += 8;
13925     }
13926 
13927   return length;
13928 }
13929 
13930 /* Estimate the size of a frag before relaxing.  Unless this is the
13931    mips16, we are not really relaxing here, and the final size is
13932    encoded in the subtype information.  For the mips16, we have to
13933    decide whether we are using an extended opcode or not.  */
13934 
13935 int
md_estimate_size_before_relax(fragS * fragp,asection * segtype)13936 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13937 {
13938   int change;
13939 
13940   if (RELAX_BRANCH_P (fragp->fr_subtype))
13941     {
13942 
13943       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13944 
13945       return fragp->fr_var;
13946     }
13947 
13948   if (RELAX_MIPS16_P (fragp->fr_subtype))
13949     /* We don't want to modify the EXTENDED bit here; it might get us
13950        into infinite loops.  We change it only in mips_relax_frag().  */
13951     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13952 
13953   if (mips_pic == NO_PIC)
13954     change = nopic_need_relax (fragp->fr_symbol, 0);
13955   else if (mips_pic == SVR4_PIC)
13956     change = pic_need_relax (fragp->fr_symbol, segtype);
13957   else if (mips_pic == VXWORKS_PIC)
13958     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13959     change = 0;
13960   else
13961     abort ();
13962 
13963   if (change)
13964     {
13965       fragp->fr_subtype |= RELAX_USE_SECOND;
13966       return -RELAX_FIRST (fragp->fr_subtype);
13967     }
13968   else
13969     return -RELAX_SECOND (fragp->fr_subtype);
13970 }
13971 
13972 /* This is called to see whether a reloc against a defined symbol
13973    should be converted into a reloc against a section.  */
13974 
13975 int
mips_fix_adjustable(fixS * fixp)13976 mips_fix_adjustable (fixS *fixp)
13977 {
13978   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13979       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13980     return 0;
13981 
13982   if (fixp->fx_addsy == NULL)
13983     return 1;
13984 
13985   /* If symbol SYM is in a mergeable section, relocations of the form
13986      SYM + 0 can usually be made section-relative.  The mergeable data
13987      is then identified by the section offset rather than by the symbol.
13988 
13989      However, if we're generating REL LO16 relocations, the offset is split
13990      between the LO16 and parterning high part relocation.  The linker will
13991      need to recalculate the complete offset in order to correctly identify
13992      the merge data.
13993 
13994      The linker has traditionally not looked for the parterning high part
13995      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13996      placed anywhere.  Rather than break backwards compatibility by changing
13997      this, it seems better not to force the issue, and instead keep the
13998      original symbol.  This will work with either linker behavior.  */
13999   if ((fixp->fx_r_type == BFD_RELOC_LO16
14000        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
14001        || reloc_needs_lo_p (fixp->fx_r_type))
14002       && HAVE_IN_PLACE_ADDENDS
14003       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14004     return 0;
14005 
14006 #ifdef OBJ_ELF
14007   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14008      to a floating-point stub.  The same is true for non-R_MIPS16_26
14009      relocations against MIPS16 functions; in this case, the stub becomes
14010      the function's canonical address.
14011 
14012      Floating-point stubs are stored in unique .mips16.call.* or
14013      .mips16.fn.* sections.  If a stub T for function F is in section S,
14014      the first relocation in section S must be against F; this is how the
14015      linker determines the target function.  All relocations that might
14016      resolve to T must also be against F.  We therefore have the following
14017      restrictions, which are given in an intentionally-redundant way:
14018 
14019        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14020 	  symbols.
14021 
14022        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14023 	  if that stub might be used.
14024 
14025        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14026 	  symbols.
14027 
14028        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14029 	  that stub might be used.
14030 
14031      There is a further restriction:
14032 
14033        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14034 	  on targets with in-place addends; the relocation field cannot
14035 	  encode the low bit.
14036 
14037      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14038      against a MIPS16 symbol.
14039 
14040      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14041      relocation against some symbol R, no relocation against R may be
14042      reduced.  (Note that this deals with (2) as well as (1) because
14043      relocations against global symbols will never be reduced on ELF
14044      targets.)  This approach is a little simpler than trying to detect
14045      stub sections, and gives the "all or nothing" per-symbol consistency
14046      that we have for MIPS16 symbols.  */
14047   if (IS_ELF
14048       && fixp->fx_subsy == NULL
14049       && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
14050 	  || *symbol_get_tc (fixp->fx_addsy)))
14051     return 0;
14052 #endif
14053 
14054   return 1;
14055 }
14056 
14057 /* Translate internal representation of relocation info to BFD target
14058    format.  */
14059 
14060 arelent **
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixp)14061 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14062 {
14063   static arelent *retval[4];
14064   arelent *reloc;
14065   bfd_reloc_code_real_type code;
14066 
14067   memset (retval, 0, sizeof(retval));
14068   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14069   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14070   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14071   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14072 
14073   if (fixp->fx_pcrel)
14074     {
14075       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14076 
14077       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14078 	 Relocations want only the symbol offset.  */
14079       reloc->addend = fixp->fx_addnumber + reloc->address;
14080       if (!IS_ELF)
14081 	{
14082 	  /* A gruesome hack which is a result of the gruesome gas
14083 	     reloc handling.  What's worse, for COFF (as opposed to
14084 	     ECOFF), we might need yet another copy of reloc->address.
14085 	     See bfd_install_relocation.  */
14086 	  reloc->addend += reloc->address;
14087 	}
14088     }
14089   else
14090     reloc->addend = fixp->fx_addnumber;
14091 
14092   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14093      entry to be used in the relocation's section offset.  */
14094   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14095     {
14096       reloc->address = reloc->addend;
14097       reloc->addend = 0;
14098     }
14099 
14100   code = fixp->fx_r_type;
14101 
14102   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14103   if (reloc->howto == NULL)
14104     {
14105       as_bad_where (fixp->fx_file, fixp->fx_line,
14106 		    _("Can not represent %s relocation in this object file format"),
14107 		    bfd_get_reloc_code_name (code));
14108       retval[0] = NULL;
14109     }
14110 
14111   return retval;
14112 }
14113 
14114 /* Relax a machine dependent frag.  This returns the amount by which
14115    the current size of the frag should change.  */
14116 
14117 int
mips_relax_frag(asection * sec,fragS * fragp,long stretch)14118 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14119 {
14120   if (RELAX_BRANCH_P (fragp->fr_subtype))
14121     {
14122       offsetT old_var = fragp->fr_var;
14123 
14124       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14125 
14126       return fragp->fr_var - old_var;
14127     }
14128 
14129   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14130     return 0;
14131 
14132   if (mips16_extended_frag (fragp, NULL, stretch))
14133     {
14134       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14135 	return 0;
14136       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14137       return 2;
14138     }
14139   else
14140     {
14141       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14142 	return 0;
14143       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14144       return -2;
14145     }
14146 
14147   return 0;
14148 }
14149 
14150 /* Convert a machine dependent frag.  */
14151 
14152 void
md_convert_frag(bfd * abfd ATTRIBUTE_UNUSED,segT asec,fragS * fragp)14153 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14154 {
14155   if (RELAX_BRANCH_P (fragp->fr_subtype))
14156     {
14157       bfd_byte *buf;
14158       unsigned long insn;
14159       expressionS exp;
14160       fixS *fixp;
14161 
14162       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14163 
14164       if (target_big_endian)
14165 	insn = bfd_getb32 (buf);
14166       else
14167 	insn = bfd_getl32 (buf);
14168 
14169       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14170 	{
14171 	  /* We generate a fixup instead of applying it right now
14172 	     because, if there are linker relaxations, we're going to
14173 	     need the relocations.  */
14174 	  exp.X_op = O_symbol;
14175 	  exp.X_add_symbol = fragp->fr_symbol;
14176 	  exp.X_add_number = fragp->fr_offset;
14177 
14178 	  fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14179 			      4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14180 	  fixp->fx_file = fragp->fr_file;
14181 	  fixp->fx_line = fragp->fr_line;
14182 
14183 	  md_number_to_chars ((char *) buf, insn, 4);
14184 	  buf += 4;
14185 	}
14186       else
14187 	{
14188 	  int i;
14189 
14190 	  as_warn_where (fragp->fr_file, fragp->fr_line,
14191 			 _("relaxed out-of-range branch into a jump"));
14192 
14193 	  if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14194 	    goto uncond;
14195 
14196 	  if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14197 	    {
14198 	      /* Reverse the branch.  */
14199 	      switch ((insn >> 28) & 0xf)
14200 		{
14201 		case 4:
14202 		  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14203 		     have the condition reversed by tweaking a single
14204 		     bit, and their opcodes all have 0x4???????.  */
14205 		  assert ((insn & 0xf1000000) == 0x41000000);
14206 		  insn ^= 0x00010000;
14207 		  break;
14208 
14209 		case 0:
14210 		  /* bltz	0x04000000	bgez	0x04010000
14211 		     bltzal	0x04100000	bgezal	0x04110000  */
14212 		  assert ((insn & 0xfc0e0000) == 0x04000000);
14213 		  insn ^= 0x00010000;
14214 		  break;
14215 
14216 		case 1:
14217 		  /* beq	0x10000000	bne	0x14000000
14218 		     blez	0x18000000	bgtz	0x1c000000  */
14219 		  insn ^= 0x04000000;
14220 		  break;
14221 
14222 		default:
14223 		  abort ();
14224 		}
14225 	    }
14226 
14227 	  if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14228 	    {
14229 	      /* Clear the and-link bit.  */
14230 	      assert ((insn & 0xfc1c0000) == 0x04100000);
14231 
14232 	      /* bltzal		0x04100000	bgezal	0x04110000
14233 		 bltzall	0x04120000	bgezall	0x04130000  */
14234 	      insn &= ~0x00100000;
14235 	    }
14236 
14237 	  /* Branch over the branch (if the branch was likely) or the
14238 	     full jump (not likely case).  Compute the offset from the
14239 	     current instruction to branch to.  */
14240 	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14241 	    i = 16;
14242 	  else
14243 	    {
14244 	      /* How many bytes in instructions we've already emitted?  */
14245 	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14246 	      /* How many bytes in instructions from here to the end?  */
14247 	      i = fragp->fr_var - i;
14248 	    }
14249 	  /* Convert to instruction count.  */
14250 	  i >>= 2;
14251 	  /* Branch counts from the next instruction.  */
14252 	  i--;
14253 	  insn |= i;
14254 	  /* Branch over the jump.  */
14255 	  md_number_to_chars ((char *) buf, insn, 4);
14256 	  buf += 4;
14257 
14258 	  /* nop */
14259 	  md_number_to_chars ((char *) buf, 0, 4);
14260 	  buf += 4;
14261 
14262 	  if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14263 	    {
14264 	      /* beql $0, $0, 2f */
14265 	      insn = 0x50000000;
14266 	      /* Compute the PC offset from the current instruction to
14267 		 the end of the variable frag.  */
14268 	      /* How many bytes in instructions we've already emitted?  */
14269 	      i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14270 	      /* How many bytes in instructions from here to the end?  */
14271 	      i = fragp->fr_var - i;
14272 	      /* Convert to instruction count.  */
14273 	      i >>= 2;
14274 	      /* Don't decrement i, because we want to branch over the
14275 		 delay slot.  */
14276 
14277 	      insn |= i;
14278 	      md_number_to_chars ((char *) buf, insn, 4);
14279 	      buf += 4;
14280 
14281 	      md_number_to_chars ((char *) buf, 0, 4);
14282 	      buf += 4;
14283 	    }
14284 
14285 	uncond:
14286 	  if (mips_pic == NO_PIC)
14287 	    {
14288 	      /* j or jal.  */
14289 	      insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14290 		      ? 0x0c000000 : 0x08000000);
14291 	      exp.X_op = O_symbol;
14292 	      exp.X_add_symbol = fragp->fr_symbol;
14293 	      exp.X_add_number = fragp->fr_offset;
14294 
14295 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14296 				  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14297 	      fixp->fx_file = fragp->fr_file;
14298 	      fixp->fx_line = fragp->fr_line;
14299 
14300 	      md_number_to_chars ((char *) buf, insn, 4);
14301 	      buf += 4;
14302 	    }
14303 	  else
14304 	    {
14305 	      /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14306 	      insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14307 	      exp.X_op = O_symbol;
14308 	      exp.X_add_symbol = fragp->fr_symbol;
14309 	      exp.X_add_number = fragp->fr_offset;
14310 
14311 	      if (fragp->fr_offset)
14312 		{
14313 		  exp.X_add_symbol = make_expr_symbol (&exp);
14314 		  exp.X_add_number = 0;
14315 		}
14316 
14317 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14318 				  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14319 	      fixp->fx_file = fragp->fr_file;
14320 	      fixp->fx_line = fragp->fr_line;
14321 
14322 	      md_number_to_chars ((char *) buf, insn, 4);
14323 	      buf += 4;
14324 
14325 	      if (mips_opts.isa == ISA_MIPS1)
14326 		{
14327 		  /* nop */
14328 		  md_number_to_chars ((char *) buf, 0, 4);
14329 		  buf += 4;
14330 		}
14331 
14332 	      /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14333 	      insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14334 
14335 	      fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14336 				  4, &exp, FALSE, BFD_RELOC_LO16);
14337 	      fixp->fx_file = fragp->fr_file;
14338 	      fixp->fx_line = fragp->fr_line;
14339 
14340 	      md_number_to_chars ((char *) buf, insn, 4);
14341 	      buf += 4;
14342 
14343 	      /* j(al)r $at.  */
14344 	      if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14345 		insn = 0x0020f809;
14346 	      else
14347 		insn = 0x00200008;
14348 
14349 	      md_number_to_chars ((char *) buf, insn, 4);
14350 	      buf += 4;
14351 	    }
14352 	}
14353 
14354       assert (buf == (bfd_byte *)fragp->fr_literal
14355 	      + fragp->fr_fix + fragp->fr_var);
14356 
14357       fragp->fr_fix += fragp->fr_var;
14358 
14359       return;
14360     }
14361 
14362   if (RELAX_MIPS16_P (fragp->fr_subtype))
14363     {
14364       int type;
14365       const struct mips16_immed_operand *op;
14366       bfd_boolean small, ext;
14367       offsetT val;
14368       bfd_byte *buf;
14369       unsigned long insn;
14370       bfd_boolean use_extend;
14371       unsigned short extend;
14372 
14373       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14374       op = mips16_immed_operands;
14375       while (op->type != type)
14376 	++op;
14377 
14378       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14379 	{
14380 	  small = FALSE;
14381 	  ext = TRUE;
14382 	}
14383       else
14384 	{
14385 	  small = TRUE;
14386 	  ext = FALSE;
14387 	}
14388 
14389       resolve_symbol_value (fragp->fr_symbol);
14390       val = S_GET_VALUE (fragp->fr_symbol);
14391       if (op->pcrel)
14392 	{
14393 	  addressT addr;
14394 
14395 	  addr = fragp->fr_address + fragp->fr_fix;
14396 
14397 	  /* The rules for the base address of a PC relative reloc are
14398              complicated; see mips16_extended_frag.  */
14399 	  if (type == 'p' || type == 'q')
14400 	    {
14401 	      addr += 2;
14402 	      if (ext)
14403 		addr += 2;
14404 	      /* Ignore the low bit in the target, since it will be
14405                  set for a text label.  */
14406 	      if ((val & 1) != 0)
14407 		--val;
14408 	    }
14409 	  else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14410 	    addr -= 4;
14411 	  else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14412 	    addr -= 2;
14413 
14414 	  addr &= ~ (addressT) ((1 << op->shift) - 1);
14415 	  val -= addr;
14416 
14417 	  /* Make sure the section winds up with the alignment we have
14418              assumed.  */
14419 	  if (op->shift > 0)
14420 	    record_alignment (asec, op->shift);
14421 	}
14422 
14423       if (ext
14424 	  && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14425 	      || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14426 	as_warn_where (fragp->fr_file, fragp->fr_line,
14427 		       _("extended instruction in delay slot"));
14428 
14429       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14430 
14431       if (target_big_endian)
14432 	insn = bfd_getb16 (buf);
14433       else
14434 	insn = bfd_getl16 (buf);
14435 
14436       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14437 		    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14438 		    small, ext, &insn, &use_extend, &extend);
14439 
14440       if (use_extend)
14441 	{
14442 	  md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14443 	  fragp->fr_fix += 2;
14444 	  buf += 2;
14445 	}
14446 
14447       md_number_to_chars ((char *) buf, insn, 2);
14448       fragp->fr_fix += 2;
14449       buf += 2;
14450     }
14451   else
14452     {
14453       int first, second;
14454       fixS *fixp;
14455 
14456       first = RELAX_FIRST (fragp->fr_subtype);
14457       second = RELAX_SECOND (fragp->fr_subtype);
14458       fixp = (fixS *) fragp->fr_opcode;
14459 
14460       /* Possibly emit a warning if we've chosen the longer option.  */
14461       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14462 	  == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14463 	{
14464 	  const char *msg = macro_warning (fragp->fr_subtype);
14465 	  if (msg != 0)
14466 	    as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14467 	}
14468 
14469       /* Go through all the fixups for the first sequence.  Disable them
14470 	 (by marking them as done) if we're going to use the second
14471 	 sequence instead.  */
14472       while (fixp
14473 	     && fixp->fx_frag == fragp
14474 	     && fixp->fx_where < fragp->fr_fix - second)
14475 	{
14476 	  if (fragp->fr_subtype & RELAX_USE_SECOND)
14477 	    fixp->fx_done = 1;
14478 	  fixp = fixp->fx_next;
14479 	}
14480 
14481       /* Go through the fixups for the second sequence.  Disable them if
14482 	 we're going to use the first sequence, otherwise adjust their
14483 	 addresses to account for the relaxation.  */
14484       while (fixp && fixp->fx_frag == fragp)
14485 	{
14486 	  if (fragp->fr_subtype & RELAX_USE_SECOND)
14487 	    fixp->fx_where -= first;
14488 	  else
14489 	    fixp->fx_done = 1;
14490 	  fixp = fixp->fx_next;
14491 	}
14492 
14493       /* Now modify the frag contents.  */
14494       if (fragp->fr_subtype & RELAX_USE_SECOND)
14495 	{
14496 	  char *start;
14497 
14498 	  start = fragp->fr_literal + fragp->fr_fix - first - second;
14499 	  memmove (start, start + first, second);
14500 	  fragp->fr_fix -= first;
14501 	}
14502       else
14503 	fragp->fr_fix -= second;
14504     }
14505 }
14506 
14507 #ifdef OBJ_ELF
14508 
14509 /* This function is called after the relocs have been generated.
14510    We've been storing mips16 text labels as odd.  Here we convert them
14511    back to even for the convenience of the debugger.  */
14512 
14513 void
mips_frob_file_after_relocs(void)14514 mips_frob_file_after_relocs (void)
14515 {
14516   asymbol **syms;
14517   unsigned int count, i;
14518 
14519   if (!IS_ELF)
14520     return;
14521 
14522   syms = bfd_get_outsymbols (stdoutput);
14523   count = bfd_get_symcount (stdoutput);
14524   for (i = 0; i < count; i++, syms++)
14525     {
14526       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14527 	  && ((*syms)->value & 1) != 0)
14528 	{
14529 	  (*syms)->value &= ~1;
14530 	  /* If the symbol has an odd size, it was probably computed
14531 	     incorrectly, so adjust that as well.  */
14532 	  if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14533 	    ++elf_symbol (*syms)->internal_elf_sym.st_size;
14534 	}
14535     }
14536 }
14537 
14538 #endif
14539 
14540 /* This function is called whenever a label is defined.  It is used
14541    when handling branch delays; if a branch has a label, we assume we
14542    can not move it.  */
14543 
14544 void
mips_define_label(symbolS * sym)14545 mips_define_label (symbolS *sym)
14546 {
14547   segment_info_type *si = seg_info (now_seg);
14548   struct insn_label_list *l;
14549 
14550   if (free_insn_labels == NULL)
14551     l = (struct insn_label_list *) xmalloc (sizeof *l);
14552   else
14553     {
14554       l = free_insn_labels;
14555       free_insn_labels = l->next;
14556     }
14557 
14558   l->label = sym;
14559   l->next = si->label_list;
14560   si->label_list = l;
14561 
14562 #ifdef OBJ_ELF
14563   dwarf2_emit_label (sym);
14564 #endif
14565 }
14566 
14567 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14568 
14569 /* Some special processing for a MIPS ELF file.  */
14570 
14571 void
mips_elf_final_processing(void)14572 mips_elf_final_processing (void)
14573 {
14574   /* Write out the register information.  */
14575   if (mips_abi != N64_ABI)
14576     {
14577       Elf32_RegInfo s;
14578 
14579       s.ri_gprmask = mips_gprmask;
14580       s.ri_cprmask[0] = mips_cprmask[0];
14581       s.ri_cprmask[1] = mips_cprmask[1];
14582       s.ri_cprmask[2] = mips_cprmask[2];
14583       s.ri_cprmask[3] = mips_cprmask[3];
14584       /* The gp_value field is set by the MIPS ELF backend.  */
14585 
14586       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14587 				       ((Elf32_External_RegInfo *)
14588 					mips_regmask_frag));
14589     }
14590   else
14591     {
14592       Elf64_Internal_RegInfo s;
14593 
14594       s.ri_gprmask = mips_gprmask;
14595       s.ri_pad = 0;
14596       s.ri_cprmask[0] = mips_cprmask[0];
14597       s.ri_cprmask[1] = mips_cprmask[1];
14598       s.ri_cprmask[2] = mips_cprmask[2];
14599       s.ri_cprmask[3] = mips_cprmask[3];
14600       /* The gp_value field is set by the MIPS ELF backend.  */
14601 
14602       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14603 				       ((Elf64_External_RegInfo *)
14604 					mips_regmask_frag));
14605     }
14606 
14607   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14608      sort of BFD interface for this.  */
14609   if (mips_any_noreorder)
14610     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14611   if (mips_pic != NO_PIC)
14612     {
14613     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14614       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14615     }
14616   if (mips_abicalls)
14617     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14618 
14619   /* Set MIPS ELF flags for ASEs.  */
14620   /* We may need to define a new flag for DSP ASE, and set this flag when
14621      file_ase_dsp is true.  */
14622   /* Same for DSP R2.  */
14623   /* We may need to define a new flag for MT ASE, and set this flag when
14624      file_ase_mt is true.  */
14625   if (file_ase_mips16)
14626     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14627 #if 0 /* XXX FIXME */
14628   if (file_ase_mips3d)
14629     elf_elfheader (stdoutput)->e_flags |= ???;
14630 #endif
14631   if (file_ase_mdmx)
14632     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14633 
14634   /* Set the MIPS ELF ABI flags.  */
14635   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14636     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14637   else if (mips_abi == O64_ABI)
14638     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14639   else if (mips_abi == EABI_ABI)
14640     {
14641       if (!file_mips_gp32)
14642 	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14643       else
14644 	elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14645     }
14646   else if (mips_abi == N32_ABI)
14647     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14648 
14649   /* Nothing to do for N64_ABI.  */
14650 
14651   if (mips_32bitmode)
14652     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14653 
14654 #if 0 /* XXX FIXME */
14655   /* 32 bit code with 64 bit FP registers.  */
14656   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14657     elf_elfheader (stdoutput)->e_flags |= ???;
14658 #endif
14659 }
14660 
14661 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14662 
14663 typedef struct proc {
14664   symbolS *func_sym;
14665   symbolS *func_end_sym;
14666   unsigned long reg_mask;
14667   unsigned long reg_offset;
14668   unsigned long fpreg_mask;
14669   unsigned long fpreg_offset;
14670   unsigned long frame_offset;
14671   unsigned long frame_reg;
14672   unsigned long pc_reg;
14673 } procS;
14674 
14675 static procS cur_proc;
14676 static procS *cur_proc_ptr;
14677 static int numprocs;
14678 
14679 /* Fill in an rs_align_code fragment.  */
14680 
14681 void
mips_handle_align(fragS * fragp)14682 mips_handle_align (fragS *fragp)
14683 {
14684   if (fragp->fr_type != rs_align_code)
14685     return;
14686 
14687   if (mips_opts.mips16)
14688     {
14689       static const unsigned char be_nop[] = { 0x65, 0x00 };
14690       static const unsigned char le_nop[] = { 0x00, 0x65 };
14691 
14692       int bytes;
14693       char *p;
14694 
14695       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14696       p = fragp->fr_literal + fragp->fr_fix;
14697 
14698       if (bytes & 1)
14699 	{
14700 	  *p++ = 0;
14701 	  fragp->fr_fix++;
14702 	}
14703 
14704       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14705       fragp->fr_var = 2;
14706     }
14707 
14708   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
14709 }
14710 
14711 static void
md_obj_begin(void)14712 md_obj_begin (void)
14713 {
14714 }
14715 
14716 static void
md_obj_end(void)14717 md_obj_end (void)
14718 {
14719   /* Check for premature end, nesting errors, etc.  */
14720   if (cur_proc_ptr)
14721     as_warn (_("missing .end at end of assembly"));
14722 }
14723 
14724 static long
get_number(void)14725 get_number (void)
14726 {
14727   int negative = 0;
14728   long val = 0;
14729 
14730   if (*input_line_pointer == '-')
14731     {
14732       ++input_line_pointer;
14733       negative = 1;
14734     }
14735   if (!ISDIGIT (*input_line_pointer))
14736     as_bad (_("expected simple number"));
14737   if (input_line_pointer[0] == '0')
14738     {
14739       if (input_line_pointer[1] == 'x')
14740 	{
14741 	  input_line_pointer += 2;
14742 	  while (ISXDIGIT (*input_line_pointer))
14743 	    {
14744 	      val <<= 4;
14745 	      val |= hex_value (*input_line_pointer++);
14746 	    }
14747 	  return negative ? -val : val;
14748 	}
14749       else
14750 	{
14751 	  ++input_line_pointer;
14752 	  while (ISDIGIT (*input_line_pointer))
14753 	    {
14754 	      val <<= 3;
14755 	      val |= *input_line_pointer++ - '0';
14756 	    }
14757 	  return negative ? -val : val;
14758 	}
14759     }
14760   if (!ISDIGIT (*input_line_pointer))
14761     {
14762       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14763 	      *input_line_pointer, *input_line_pointer);
14764       as_warn (_("invalid number"));
14765       return -1;
14766     }
14767   while (ISDIGIT (*input_line_pointer))
14768     {
14769       val *= 10;
14770       val += *input_line_pointer++ - '0';
14771     }
14772   return negative ? -val : val;
14773 }
14774 
14775 /* The .file directive; just like the usual .file directive, but there
14776    is an initial number which is the ECOFF file index.  In the non-ECOFF
14777    case .file implies DWARF-2.  */
14778 
14779 static void
s_mips_file(int x ATTRIBUTE_UNUSED)14780 s_mips_file (int x ATTRIBUTE_UNUSED)
14781 {
14782   static int first_file_directive = 0;
14783 
14784   if (ECOFF_DEBUGGING)
14785     {
14786       get_number ();
14787       s_app_file (0);
14788     }
14789   else
14790     {
14791       char *filename;
14792 
14793       filename = dwarf2_directive_file (0);
14794 
14795       /* Versions of GCC up to 3.1 start files with a ".file"
14796 	 directive even for stabs output.  Make sure that this
14797 	 ".file" is handled.  Note that you need a version of GCC
14798          after 3.1 in order to support DWARF-2 on MIPS.  */
14799       if (filename != NULL && ! first_file_directive)
14800 	{
14801 	  (void) new_logical_line (filename, -1);
14802 	  s_app_file_string (filename, 0);
14803 	}
14804       first_file_directive = 1;
14805     }
14806 }
14807 
14808 /* The .loc directive, implying DWARF-2.  */
14809 
14810 static void
s_mips_loc(int x ATTRIBUTE_UNUSED)14811 s_mips_loc (int x ATTRIBUTE_UNUSED)
14812 {
14813   if (!ECOFF_DEBUGGING)
14814     dwarf2_directive_loc (0);
14815 }
14816 
14817 /* The .end directive.  */
14818 
14819 static void
s_mips_end(int x ATTRIBUTE_UNUSED)14820 s_mips_end (int x ATTRIBUTE_UNUSED)
14821 {
14822   symbolS *p;
14823 
14824   /* Following functions need their own .frame and .cprestore directives.  */
14825   mips_frame_reg_valid = 0;
14826   mips_cprestore_valid = 0;
14827 
14828   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14829     {
14830       p = get_symbol ();
14831       demand_empty_rest_of_line ();
14832     }
14833   else
14834     p = NULL;
14835 
14836   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14837     as_warn (_(".end not in text section"));
14838 
14839   if (!cur_proc_ptr)
14840     {
14841       as_warn (_(".end directive without a preceding .ent directive."));
14842       demand_empty_rest_of_line ();
14843       return;
14844     }
14845 
14846   if (p != NULL)
14847     {
14848       assert (S_GET_NAME (p));
14849       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14850 	as_warn (_(".end symbol does not match .ent symbol."));
14851 
14852       if (debug_type == DEBUG_STABS)
14853 	stabs_generate_asm_endfunc (S_GET_NAME (p),
14854 				    S_GET_NAME (p));
14855     }
14856   else
14857     as_warn (_(".end directive missing or unknown symbol"));
14858 
14859 #ifdef OBJ_ELF
14860   /* Create an expression to calculate the size of the function.  */
14861   if (p && cur_proc_ptr)
14862     {
14863       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14864       expressionS *exp = xmalloc (sizeof (expressionS));
14865 
14866       obj->size = exp;
14867       exp->X_op = O_subtract;
14868       exp->X_add_symbol = symbol_temp_new_now ();
14869       exp->X_op_symbol = p;
14870       exp->X_add_number = 0;
14871 
14872       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14873     }
14874 
14875   /* Generate a .pdr section.  */
14876   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14877     {
14878       segT saved_seg = now_seg;
14879       subsegT saved_subseg = now_subseg;
14880       valueT dot;
14881       expressionS exp;
14882       char *fragp;
14883 
14884       dot = frag_now_fix ();
14885 
14886 #ifdef md_flush_pending_output
14887       md_flush_pending_output ();
14888 #endif
14889 
14890       assert (pdr_seg);
14891       subseg_set (pdr_seg, 0);
14892 
14893       /* Write the symbol.  */
14894       exp.X_op = O_symbol;
14895       exp.X_add_symbol = p;
14896       exp.X_add_number = 0;
14897       emit_expr (&exp, 4);
14898 
14899       fragp = frag_more (7 * 4);
14900 
14901       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14902       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14903       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14904       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14905       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14906       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14907       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14908 
14909       subseg_set (saved_seg, saved_subseg);
14910     }
14911 #endif /* OBJ_ELF */
14912 
14913   cur_proc_ptr = NULL;
14914 }
14915 
14916 /* The .aent and .ent directives.  */
14917 
14918 static void
s_mips_ent(int aent)14919 s_mips_ent (int aent)
14920 {
14921   symbolS *symbolP;
14922 
14923   symbolP = get_symbol ();
14924   if (*input_line_pointer == ',')
14925     ++input_line_pointer;
14926   SKIP_WHITESPACE ();
14927   if (ISDIGIT (*input_line_pointer)
14928       || *input_line_pointer == '-')
14929     get_number ();
14930 
14931   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14932     as_warn (_(".ent or .aent not in text section."));
14933 
14934   if (!aent && cur_proc_ptr)
14935     as_warn (_("missing .end"));
14936 
14937   if (!aent)
14938     {
14939       /* This function needs its own .frame and .cprestore directives.  */
14940       mips_frame_reg_valid = 0;
14941       mips_cprestore_valid = 0;
14942 
14943       cur_proc_ptr = &cur_proc;
14944       memset (cur_proc_ptr, '\0', sizeof (procS));
14945 
14946       cur_proc_ptr->func_sym = symbolP;
14947 
14948       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14949 
14950       ++numprocs;
14951 
14952       if (debug_type == DEBUG_STABS)
14953         stabs_generate_asm_func (S_GET_NAME (symbolP),
14954 				 S_GET_NAME (symbolP));
14955     }
14956 
14957   demand_empty_rest_of_line ();
14958 }
14959 
14960 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14961    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14962    s_mips_frame is used so that we can set the PDR information correctly.
14963    We can't use the ecoff routines because they make reference to the ecoff
14964    symbol table (in the mdebug section).  */
14965 
14966 static void
s_mips_frame(int ignore ATTRIBUTE_UNUSED)14967 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14968 {
14969 #ifdef OBJ_ELF
14970   if (IS_ELF && !ECOFF_DEBUGGING)
14971     {
14972       long val;
14973 
14974       if (cur_proc_ptr == (procS *) NULL)
14975 	{
14976 	  as_warn (_(".frame outside of .ent"));
14977 	  demand_empty_rest_of_line ();
14978 	  return;
14979 	}
14980 
14981       cur_proc_ptr->frame_reg = tc_get_register (1);
14982 
14983       SKIP_WHITESPACE ();
14984       if (*input_line_pointer++ != ','
14985 	  || get_absolute_expression_and_terminator (&val) != ',')
14986 	{
14987 	  as_warn (_("Bad .frame directive"));
14988 	  --input_line_pointer;
14989 	  demand_empty_rest_of_line ();
14990 	  return;
14991 	}
14992 
14993       cur_proc_ptr->frame_offset = val;
14994       cur_proc_ptr->pc_reg = tc_get_register (0);
14995 
14996       demand_empty_rest_of_line ();
14997     }
14998   else
14999 #endif /* OBJ_ELF */
15000     s_ignore (ignore);
15001 }
15002 
15003 /* The .fmask and .mask directives. If the mdebug section is present
15004    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15005    embedded targets, s_mips_mask is used so that we can set the PDR
15006    information correctly. We can't use the ecoff routines because they
15007    make reference to the ecoff symbol table (in the mdebug section).  */
15008 
15009 static void
s_mips_mask(int reg_type)15010 s_mips_mask (int reg_type)
15011 {
15012 #ifdef OBJ_ELF
15013   if (IS_ELF && !ECOFF_DEBUGGING)
15014     {
15015       long mask, off;
15016 
15017       if (cur_proc_ptr == (procS *) NULL)
15018 	{
15019 	  as_warn (_(".mask/.fmask outside of .ent"));
15020 	  demand_empty_rest_of_line ();
15021 	  return;
15022 	}
15023 
15024       if (get_absolute_expression_and_terminator (&mask) != ',')
15025 	{
15026 	  as_warn (_("Bad .mask/.fmask directive"));
15027 	  --input_line_pointer;
15028 	  demand_empty_rest_of_line ();
15029 	  return;
15030 	}
15031 
15032       off = get_absolute_expression ();
15033 
15034       if (reg_type == 'F')
15035 	{
15036 	  cur_proc_ptr->fpreg_mask = mask;
15037 	  cur_proc_ptr->fpreg_offset = off;
15038 	}
15039       else
15040 	{
15041 	  cur_proc_ptr->reg_mask = mask;
15042 	  cur_proc_ptr->reg_offset = off;
15043 	}
15044 
15045       demand_empty_rest_of_line ();
15046     }
15047   else
15048 #endif /* OBJ_ELF */
15049     s_ignore (reg_type);
15050 }
15051 
15052 /* A table describing all the processors gas knows about.  Names are
15053    matched in the order listed.
15054 
15055    To ease comparison, please keep this table in the same order as
15056    gcc's mips_cpu_info_table[].  */
15057 static const struct mips_cpu_info mips_cpu_info_table[] =
15058 {
15059   /* Entries for generic ISAs */
15060   { "mips1",          MIPS_CPU_IS_ISA,		ISA_MIPS1,      CPU_R3000 },
15061   { "mips2",          MIPS_CPU_IS_ISA,		ISA_MIPS2,      CPU_R6000 },
15062   { "mips3",          MIPS_CPU_IS_ISA,		ISA_MIPS3,      CPU_R4000 },
15063   { "mips4",          MIPS_CPU_IS_ISA,		ISA_MIPS4,      CPU_R8000 },
15064   { "mips5",          MIPS_CPU_IS_ISA,		ISA_MIPS5,      CPU_MIPS5 },
15065   { "mips32",         MIPS_CPU_IS_ISA,		ISA_MIPS32,     CPU_MIPS32 },
15066   { "mips32r2",       MIPS_CPU_IS_ISA,		ISA_MIPS32R2,   CPU_MIPS32R2 },
15067   { "mips64",         MIPS_CPU_IS_ISA,		ISA_MIPS64,     CPU_MIPS64 },
15068   { "mips64r2",       MIPS_CPU_IS_ISA,		ISA_MIPS64R2,   CPU_MIPS64R2 },
15069 
15070   /* MIPS I */
15071   { "r3000",          0,			ISA_MIPS1,      CPU_R3000 },
15072   { "r2000",          0,			ISA_MIPS1,      CPU_R3000 },
15073   { "r3900",          0,			ISA_MIPS1,      CPU_R3900 },
15074 
15075   /* MIPS II */
15076   { "r6000",          0,			ISA_MIPS2,      CPU_R6000 },
15077 
15078   /* MIPS III */
15079   { "r4000",          0,			ISA_MIPS3,      CPU_R4000 },
15080   { "r4010",          0,			ISA_MIPS2,      CPU_R4010 },
15081   { "vr4100",         0,			ISA_MIPS3,      CPU_VR4100 },
15082   { "vr4111",         0,			ISA_MIPS3,      CPU_R4111 },
15083   { "vr4120",         0,			ISA_MIPS3,      CPU_VR4120 },
15084   { "vr4130",         0,			ISA_MIPS3,      CPU_VR4120 },
15085   { "vr4181",         0,			ISA_MIPS3,      CPU_R4111 },
15086   { "vr4300",         0,			ISA_MIPS3,      CPU_R4300 },
15087   { "r4400",          0,			ISA_MIPS3,      CPU_R4400 },
15088   { "r4600",          0,			ISA_MIPS3,      CPU_R4600 },
15089   { "orion",          0,			ISA_MIPS3,      CPU_R4600 },
15090   { "r4650",          0,			ISA_MIPS3,      CPU_R4650 },
15091 
15092   /* MIPS IV */
15093   { "r8000",          0,			ISA_MIPS4,      CPU_R8000 },
15094   { "r10000",         0,			ISA_MIPS4,      CPU_R10000 },
15095   { "r12000",         0,			ISA_MIPS4,      CPU_R12000 },
15096   { "vr5000",         0,			ISA_MIPS4,      CPU_R5000 },
15097   { "vr5400",         0,			ISA_MIPS4,      CPU_VR5400 },
15098   { "vr5500",         0,			ISA_MIPS4,      CPU_VR5500 },
15099   { "rm5200",         0,			ISA_MIPS4,      CPU_R5000 },
15100   { "rm5230",         0,			ISA_MIPS4,      CPU_R5000 },
15101   { "rm5231",         0,			ISA_MIPS4,      CPU_R5000 },
15102   { "rm5261",         0,			ISA_MIPS4,      CPU_R5000 },
15103   { "rm5721",         0,			ISA_MIPS4,      CPU_R5000 },
15104   { "rm7000",         0,			ISA_MIPS4,      CPU_RM7000 },
15105   { "rm9000",         0,			ISA_MIPS4,      CPU_RM9000 },
15106 
15107   /* MIPS 32 */
15108   { "4kc",            0,			ISA_MIPS32,	CPU_MIPS32 },
15109   { "4km",            0,			ISA_MIPS32,	CPU_MIPS32 },
15110   { "4kp",            0,			ISA_MIPS32,	CPU_MIPS32 },
15111   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,	ISA_MIPS32,	CPU_MIPS32 },
15112 
15113   /* MIPS 32 Release 2 */
15114   { "4kec",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15115   { "4kem",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15116   { "4kep",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15117   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,	ISA_MIPS32R2,   CPU_MIPS32R2 },
15118   { "m4k",            0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15119   { "m4kp",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15120   { "24kc",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15121   { "24kf",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15122   { "24kx",           0,			ISA_MIPS32R2,   CPU_MIPS32R2 },
15123   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15124   { "24kec",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15125   { "24kef",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15126   { "24kex",          MIPS_CPU_ASE_DSP,		ISA_MIPS32R2,	CPU_MIPS32R2 },
15127   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15128   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15129 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15130   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15131 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15132   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15133 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15134   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15135   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15136 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15137   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15138 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15139   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15140 						ISA_MIPS32R2,	CPU_MIPS32R2 },
15141 
15142   /* MIPS 64 */
15143   { "5kc",            0,			ISA_MIPS64,	CPU_MIPS64 },
15144   { "5kf",            0,			ISA_MIPS64,	CPU_MIPS64 },
15145   { "20kc",           MIPS_CPU_ASE_MIPS3D,	ISA_MIPS64,	CPU_MIPS64 },
15146   { "25kf",           MIPS_CPU_ASE_MIPS3D,	ISA_MIPS64,     CPU_MIPS64 },
15147 
15148   /* MIPS 64 Release 2 */
15149 
15150   /* Broadcom SB-1 CPU core */
15151   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15152 						ISA_MIPS64,	CPU_SB1 },
15153   /* Broadcom SB-1A CPU core */
15154   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15155 						ISA_MIPS64,	CPU_SB1 },
15156 
15157   /* Cavium Networks Octeon CPU core */
15158   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15159   { "octeon+",        0,      ISA_MIPS64R2,   CPU_OCTEON },
15160 
15161   /* End marker */
15162   { NULL, 0, 0, 0 }
15163 };
15164 
15165 
15166 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15167    with a final "000" replaced by "k".  Ignore case.
15168 
15169    Note: this function is shared between GCC and GAS.  */
15170 
15171 static bfd_boolean
mips_strict_matching_cpu_name_p(const char * canonical,const char * given)15172 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15173 {
15174   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15175     given++, canonical++;
15176 
15177   return ((*given == 0 && *canonical == 0)
15178 	  || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15179 }
15180 
15181 
15182 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15183    CPU name.  We've traditionally allowed a lot of variation here.
15184 
15185    Note: this function is shared between GCC and GAS.  */
15186 
15187 static bfd_boolean
mips_matching_cpu_name_p(const char * canonical,const char * given)15188 mips_matching_cpu_name_p (const char *canonical, const char *given)
15189 {
15190   /* First see if the name matches exactly, or with a final "000"
15191      turned into "k".  */
15192   if (mips_strict_matching_cpu_name_p (canonical, given))
15193     return TRUE;
15194 
15195   /* If not, try comparing based on numerical designation alone.
15196      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15197   if (TOLOWER (*given) == 'r')
15198     given++;
15199   if (!ISDIGIT (*given))
15200     return FALSE;
15201 
15202   /* Skip over some well-known prefixes in the canonical name,
15203      hoping to find a number there too.  */
15204   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15205     canonical += 2;
15206   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15207     canonical += 2;
15208   else if (TOLOWER (canonical[0]) == 'r')
15209     canonical += 1;
15210 
15211   return mips_strict_matching_cpu_name_p (canonical, given);
15212 }
15213 
15214 
15215 /* Parse an option that takes the name of a processor as its argument.
15216    OPTION is the name of the option and CPU_STRING is the argument.
15217    Return the corresponding processor enumeration if the CPU_STRING is
15218    recognized, otherwise report an error and return null.
15219 
15220    A similar function exists in GCC.  */
15221 
15222 static const struct mips_cpu_info *
mips_parse_cpu(const char * option,const char * cpu_string)15223 mips_parse_cpu (const char *option, const char *cpu_string)
15224 {
15225   const struct mips_cpu_info *p;
15226 
15227   /* 'from-abi' selects the most compatible architecture for the given
15228      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15229      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15230      version.  Look first at the -mgp options, if given, otherwise base
15231      the choice on MIPS_DEFAULT_64BIT.
15232 
15233      Treat NO_ABI like the EABIs.  One reason to do this is that the
15234      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15235      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15236      'mips64', just as we did in the days before 'from-abi'.  */
15237   if (strcasecmp (cpu_string, "from-abi") == 0)
15238     {
15239       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15240 	return mips_cpu_info_from_isa (ISA_MIPS1);
15241 
15242       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15243 	return mips_cpu_info_from_isa (ISA_MIPS3);
15244 
15245       if (file_mips_gp32 >= 0)
15246 	return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15247 
15248       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15249 				     ? ISA_MIPS3
15250 				     : ISA_MIPS1);
15251     }
15252 
15253   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15254   if (strcasecmp (cpu_string, "default") == 0)
15255     return 0;
15256 
15257   for (p = mips_cpu_info_table; p->name != 0; p++)
15258     if (mips_matching_cpu_name_p (p->name, cpu_string))
15259       return p;
15260 
15261   as_bad ("Bad value (%s) for %s", cpu_string, option);
15262   return 0;
15263 }
15264 
15265 /* Return the canonical processor information for ISA (a member of the
15266    ISA_MIPS* enumeration).  */
15267 
15268 static const struct mips_cpu_info *
mips_cpu_info_from_isa(int isa)15269 mips_cpu_info_from_isa (int isa)
15270 {
15271   int i;
15272 
15273   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15274     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15275 	&& isa == mips_cpu_info_table[i].isa)
15276       return (&mips_cpu_info_table[i]);
15277 
15278   return NULL;
15279 }
15280 
15281 static const struct mips_cpu_info *
mips_cpu_info_from_arch(int arch)15282 mips_cpu_info_from_arch (int arch)
15283 {
15284   int i;
15285 
15286   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15287     if (arch == mips_cpu_info_table[i].cpu)
15288       return (&mips_cpu_info_table[i]);
15289 
15290   return NULL;
15291 }
15292 
15293 static void
show(FILE * stream,const char * string,int * col_p,int * first_p)15294 show (FILE *stream, const char *string, int *col_p, int *first_p)
15295 {
15296   if (*first_p)
15297     {
15298       fprintf (stream, "%24s", "");
15299       *col_p = 24;
15300     }
15301   else
15302     {
15303       fprintf (stream, ", ");
15304       *col_p += 2;
15305     }
15306 
15307   if (*col_p + strlen (string) > 72)
15308     {
15309       fprintf (stream, "\n%24s", "");
15310       *col_p = 24;
15311     }
15312 
15313   fprintf (stream, "%s", string);
15314   *col_p += strlen (string);
15315 
15316   *first_p = 0;
15317 }
15318 
15319 void
md_show_usage(FILE * stream)15320 md_show_usage (FILE *stream)
15321 {
15322   int column, first;
15323   size_t i;
15324 
15325   fprintf (stream, _("\
15326 MIPS options:\n\
15327 -EB			generate big endian output\n\
15328 -EL			generate little endian output\n\
15329 -g, -g2			do not remove unneeded NOPs or swap branches\n\
15330 -G NUM			allow referencing objects up to NUM bytes\n\
15331 			implicitly with the gp register [default 8]\n"));
15332   fprintf (stream, _("\
15333 -mips1			generate MIPS ISA I instructions\n\
15334 -mips2			generate MIPS ISA II instructions\n\
15335 -mips3			generate MIPS ISA III instructions\n\
15336 -mips4			generate MIPS ISA IV instructions\n\
15337 -mips5                  generate MIPS ISA V instructions\n\
15338 -mips32                 generate MIPS32 ISA instructions\n\
15339 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15340 -mips64                 generate MIPS64 ISA instructions\n\
15341 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15342 -march=CPU/-mtune=CPU	generate code/schedule for CPU, where CPU is one of:\n"));
15343 
15344   first = 1;
15345 
15346   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15347     show (stream, mips_cpu_info_table[i].name, &column, &first);
15348   show (stream, "from-abi", &column, &first);
15349   fputc ('\n', stream);
15350 
15351   fprintf (stream, _("\
15352 -mCPU			equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15353 -no-mCPU		don't generate code specific to CPU.\n\
15354 			For -mCPU and -no-mCPU, CPU must be one of:\n"));
15355 
15356   first = 1;
15357 
15358   show (stream, "3900", &column, &first);
15359   show (stream, "4010", &column, &first);
15360   show (stream, "4100", &column, &first);
15361   show (stream, "4650", &column, &first);
15362   fputc ('\n', stream);
15363 
15364   fprintf (stream, _("\
15365 -mips16			generate mips16 instructions\n\
15366 -no-mips16		do not generate mips16 instructions\n"));
15367   fprintf (stream, _("\
15368 -msmartmips		generate smartmips instructions\n\
15369 -mno-smartmips		do not generate smartmips instructions\n"));
15370   fprintf (stream, _("\
15371 -mdsp			generate DSP instructions\n\
15372 -mno-dsp		do not generate DSP instructions\n"));
15373   fprintf (stream, _("\
15374 -mdspr2			generate DSP R2 instructions\n\
15375 -mno-dspr2		do not generate DSP R2 instructions\n"));
15376   fprintf (stream, _("\
15377 -mmt			generate MT instructions\n\
15378 -mno-mt			do not generate MT instructions\n"));
15379   fprintf (stream, _("\
15380 -mfix-vr4120		work around certain VR4120 errata\n\
15381 -mfix-vr4130		work around VR4130 mflo/mfhi errata\n\
15382 -mgp32			use 32-bit GPRs, regardless of the chosen ISA\n\
15383 -mfp32			use 32-bit FPRs, regardless of the chosen ISA\n\
15384 -msym32			assume all symbols have 32-bit values\n\
15385 -O0			remove unneeded NOPs, do not swap branches\n\
15386 -O			remove unneeded NOPs and swap branches\n\
15387 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15388 --trap, --no-break	trap exception on div by 0 and mult overflow\n\
15389 --break, --no-trap	break exception on div by 0 and mult overflow\n"));
15390 #ifdef OBJ_ELF
15391   fprintf (stream, _("\
15392 -KPIC, -call_shared	generate SVR4 position independent code\n\
15393 -mvxworks-pic		generate VxWorks position independent code\n\
15394 -non_shared		do not generate position independent code\n\
15395 -xgot			assume a 32 bit GOT\n\
15396 -mpdr, -mno-pdr		enable/disable creation of .pdr sections\n\
15397 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15398                         position dependent (non shared) code\n\
15399 -mabi=ABI		create ABI conformant object file for:\n"));
15400 
15401   first = 1;
15402 
15403   show (stream, "32", &column, &first);
15404   show (stream, "o64", &column, &first);
15405   show (stream, "n32", &column, &first);
15406   show (stream, "64", &column, &first);
15407   show (stream, "eabi", &column, &first);
15408 
15409   fputc ('\n', stream);
15410 
15411   fprintf (stream, _("\
15412 -32			create o32 ABI object file (default)\n\
15413 -n32			create n32 ABI object file\n\
15414 -64			create 64 ABI object file\n"));
15415 #endif
15416   fprintf (stream, _("\
15417 -mocteon-unsupported    error on unsupported Octeon instructions\n\
15418 -mno-octeon-unsupported do not error on unsupported Octeon instructions\n"));
15419   fprintf (stream, _("\
15420 -mocteon-useun    generate Octeon unaligned load/store instructions\n\
15421 -mno-octeon-useun generate MIPS unaligned load/store instructions\n"));
15422 }
15423 
15424 int
mips_dwarf2_addr_size(void)15425 mips_dwarf2_addr_size (void)
15426 {
15427   if (HAVE_64BIT_SYMBOLS)
15428     return 8;
15429   else
15430     return 4;
15431 }
15432 
15433 /* Standard calling conventions leave the CFA at SP on entry.  */
15434 void
mips_cfi_frame_initial_instructions(void)15435 mips_cfi_frame_initial_instructions (void)
15436 {
15437   cfi_add_CFA_def_cfa_register (SP);
15438 }
15439 
15440 int
tc_mips_regname_to_dw2regnum(char * regname)15441 tc_mips_regname_to_dw2regnum (char *regname)
15442 {
15443   unsigned int regnum = -1;
15444   unsigned int reg;
15445 
15446   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15447     regnum = reg;
15448 
15449   return regnum;
15450 }
15451