* elf32-i386.c: Add missing prototypes.
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
CommitLineData
252b5132 1/* tc-mips.c -- assemble code for a MIPS chip.
f7e42eb4 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
82efde3a 3 Free Software Foundation, Inc.
252b5132
RH
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 02111-1307, USA. */
25
26#include "as.h"
27#include "config.h"
28#include "subsegs.h"
29
30#include <ctype.h>
31
32#ifdef USE_STDARG
33#include <stdarg.h>
34#endif
35#ifdef USE_VARARGS
36#include <varargs.h>
37#endif
38
39#include "opcode/mips.h"
40#include "itbl-ops.h"
41
42#ifdef DEBUG
43#define DBG(x) printf x
44#else
45#define DBG(x)
46#endif
47
48#ifdef OBJ_MAYBE_ELF
49/* Clean up namespace so we can include obj-elf.h too. */
50static int mips_output_flavor PARAMS ((void));
51static int mips_output_flavor () { return OUTPUT_FLAVOR; }
52#undef OBJ_PROCESS_STAB
53#undef OUTPUT_FLAVOR
54#undef S_GET_ALIGN
55#undef S_GET_SIZE
56#undef S_SET_ALIGN
57#undef S_SET_SIZE
252b5132
RH
58#undef obj_frob_file
59#undef obj_frob_file_after_relocs
60#undef obj_frob_symbol
61#undef obj_pop_insert
62#undef obj_sec_sym_ok_for_reloc
63#undef OBJ_COPY_SYMBOL_ATTRIBUTES
64
65#include "obj-elf.h"
66/* Fix any of them that we actually care about. */
67#undef OUTPUT_FLAVOR
68#define OUTPUT_FLAVOR mips_output_flavor()
69#endif
70
71#if defined (OBJ_ELF)
72#include "elf/mips.h"
73#endif
74
75#ifndef ECOFF_DEBUGGING
76#define NO_ECOFF_DEBUGGING
77#define ECOFF_DEBUGGING 0
78#endif
79
80#include "ecoff.h"
81
82#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
83static char *mips_regmask_frag;
84#endif
85
86#define AT 1
87#define TREG 24
88#define PIC_CALL_REG 25
89#define KT0 26
90#define KT1 27
91#define GP 28
92#define SP 29
93#define FP 30
94#define RA 31
95
96#define ILLEGAL_REG (32)
97
98/* Allow override of standard little-endian ECOFF format. */
99
100#ifndef ECOFF_LITTLE_FORMAT
101#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
102#endif
103
104extern int target_big_endian;
105
106/* 1 is we should use the 64 bit MIPS ELF ABI, 0 if we should use the
107 32 bit ABI. This has no meaning for ECOFF.
108 Note that the default is always 32 bit, even if "configured" for
109 64 bit [e.g. --target=mips64-elf]. */
110static int mips_64;
111
112/* The default target format to use. */
beae10d5 113
252b5132
RH
114const char *
115mips_target_format ()
116{
117 switch (OUTPUT_FLAVOR)
118 {
119 case bfd_target_aout_flavour:
120 return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
121 case bfd_target_ecoff_flavour:
122 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
056350c6
NC
123 case bfd_target_coff_flavour:
124 return "pe-mips";
252b5132 125 case bfd_target_elf_flavour:
8614eeee
UC
126#ifdef TE_TMIPS
127 /* This is traditional mips */
128 return (target_big_endian
af9539e4
L
129 ? (mips_64 ? "elf64-tradbigmips" : "elf32-tradbigmips")
130 : (mips_64 ? "elf64-tradlittlemips" : "elf32-tradlittlemips"));
8614eeee 131#else
252b5132
RH
132 return (target_big_endian
133 ? (mips_64 ? "elf64-bigmips" : "elf32-bigmips")
134 : (mips_64 ? "elf64-littlemips" : "elf32-littlemips"));
8614eeee 135#endif
252b5132
RH
136 default:
137 abort ();
138 return NULL;
139 }
140}
141
142/* The name of the readonly data section. */
143#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
144 ? ".data" \
145 : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
146 ? ".rdata" \
056350c6
NC
147 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
148 ? ".rdata" \
252b5132
RH
149 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
150 ? ".rodata" \
151 : (abort (), ""))
152
153/* This is the set of options which may be modified by the .set
154 pseudo-op. We use a struct so that .set push and .set pop are more
155 reliable. */
156
e972090a
NC
157struct mips_set_options
158{
252b5132
RH
159 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
160 if it has not been initialized. Changed by `.set mipsN', and the
161 -mipsN command line option, and the default CPU. */
162 int isa;
163 /* Whether we are assembling for the mips16 processor. 0 if we are
164 not, 1 if we are, and -1 if the value has not been initialized.
165 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
166 -nomips16 command line options, and the default CPU. */
167 int mips16;
168 /* Non-zero if we should not reorder instructions. Changed by `.set
169 reorder' and `.set noreorder'. */
170 int noreorder;
171 /* Non-zero if we should not permit the $at ($1) register to be used
172 in instructions. Changed by `.set at' and `.set noat'. */
173 int noat;
174 /* Non-zero if we should warn when a macro instruction expands into
175 more than one machine instruction. Changed by `.set nomacro' and
176 `.set macro'. */
177 int warn_about_macros;
178 /* Non-zero if we should not move instructions. Changed by `.set
179 move', `.set volatile', `.set nomove', and `.set novolatile'. */
180 int nomove;
181 /* Non-zero if we should not optimize branches by moving the target
182 of the branch into the delay slot. Actually, we don't perform
183 this optimization anyhow. Changed by `.set bopt' and `.set
184 nobopt'. */
185 int nobopt;
186 /* Non-zero if we should not autoextend mips16 instructions.
187 Changed by `.set autoextend' and `.set noautoextend'. */
188 int noautoextend;
189};
190
191/* This is the struct we use to hold the current set of options. Note
e7af610e
NC
192 that we must set the isa field to ISA_UNKNOWN and the mips16 field to
193 -1 to indicate that they have not been initialized. */
252b5132 194
e972090a
NC
195static struct mips_set_options mips_opts =
196{
e7af610e
NC
197 ISA_UNKNOWN, -1, 0, 0, 0, 0, 0, 0
198};
252b5132
RH
199
200/* These variables are filled in with the masks of registers used.
201 The object format code reads them and puts them in the appropriate
202 place. */
203unsigned long mips_gprmask;
204unsigned long mips_cprmask[4];
205
206/* MIPS ISA we are using for this output file. */
e7af610e 207static int file_mips_isa = ISA_UNKNOWN;
252b5132 208
ec68c924 209/* The argument of the -mcpu= flag. Historical for code generation. */
e7af610e 210static int mips_cpu = CPU_UNKNOWN;
252b5132 211
ec68c924
EC
212/* The argument of the -march= flag. The architecture we are assembling. */
213static int mips_arch = CPU_UNKNOWN;
214
215/* The argument of the -mtune= flag. The architecture for which we
216 are optimizing. */
217static int mips_tune = CPU_UNKNOWN;
218
bdaaa2e1 219/* The argument of the -mabi= flag. */
9a41af64 220static char * mips_abi_string = NULL;
252b5132 221
2f4dcb11 222/* Whether we should mark the file EABI64 or EABI32. */
252b5132
RH
223static int mips_eabi64 = 0;
224
225/* If they asked for mips1 or mips2 and a cpu that is
bdaaa2e1 226 mips3 or greater, then mark the object file 32BITMODE. */
252b5132
RH
227static int mips_32bitmode = 0;
228
bdaaa2e1 229/* True if -mgp32 was passed. */
c97ef257
AH
230static int mips_gp32 = 0;
231
ca4e0257
RS
232/* True if -mfp32 was passed. */
233static int mips_fp32 = 0;
234
235/* True if the selected ABI is defined for 32-bit registers only. */
236static int mips_32bit_abi = 0;
237
9ce8a5dd
GRK
238/* Some ISA's have delay slots for instructions which read or write
239 from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
bdaaa2e1 240 Return true if instructions marked INSN_LOAD_COPROC_DELAY,
9ce8a5dd
GRK
241 INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
242 delay slot in this ISA. The uses of this macro assume that any
243 ISA that has delay slots for one of these, has them for all. They
244 also assume that ISAs which don't have delays for these insns, don't
bdaaa2e1 245 have delays for the INSN_LOAD_MEMORY_DELAY instructions either. */
9ce8a5dd 246#define ISA_HAS_COPROC_DELAYS(ISA) ( \
e7af610e
NC
247 (ISA) == ISA_MIPS1 \
248 || (ISA) == ISA_MIPS2 \
249 || (ISA) == ISA_MIPS3 \
9ce8a5dd
GRK
250 )
251
bdaaa2e1 252/* Return true if ISA supports 64 bit gp register instructions. */
9ce8a5dd 253#define ISA_HAS_64BIT_REGS(ISA) ( \
e7af610e
NC
254 (ISA) == ISA_MIPS3 \
255 || (ISA) == ISA_MIPS4 \
84ea6cf2 256 || (ISA) == ISA_MIPS5 \
d1cf510e 257 || (ISA) == ISA_MIPS64 \
9ce8a5dd
GRK
258 )
259
ca4e0257
RS
260#define HAVE_32BIT_GPRS \
261 (mips_gp32 \
262 || mips_32bit_abi \
263 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
264
265#define HAVE_32BIT_FPRS \
266 (mips_fp32 \
267 || mips_32bit_abi \
268 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
269
270#define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
271#define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
272
273#define HAVE_32BIT_ADDRESSES \
274 (HAVE_32BIT_GPRS \
275 || bfd_arch_bits_per_address (stdoutput) == 32)
276
bdaaa2e1 277/* Whether the processor uses hardware interlocks to protect
252b5132 278 reads from the HI and LO registers, and thus does not
ec68c924 279 require nops to be inserted. */
252b5132 280
ec68c924 281#define hilo_interlocks (mips_arch == CPU_R4010 \
252b5132
RH
282 )
283
284/* Whether the processor uses hardware interlocks to protect reads
285 from the GPRs, and thus does not require nops to be inserted. */
286#define gpr_interlocks \
e7af610e 287 (mips_opts.isa != ISA_MIPS1 \
ec68c924 288 || mips_arch == CPU_R3900)
252b5132
RH
289
290/* As with other "interlocks" this is used by hardware that has FP
291 (co-processor) interlocks. */
bdaaa2e1 292/* Itbl support may require additional care here. */
ec68c924 293#define cop_interlocks (mips_arch == CPU_R4300 \
252b5132
RH
294 )
295
6b76fefe
CM
296/* Is this a mfhi or mflo instruction? */
297#define MF_HILO_INSN(PINFO) \
298 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
299
252b5132
RH
300/* MIPS PIC level. */
301
e972090a
NC
302enum mips_pic_level
303{
252b5132
RH
304 /* Do not generate PIC code. */
305 NO_PIC,
306
307 /* Generate PIC code as in Irix 4. This is not implemented, and I'm
308 not sure what it is supposed to do. */
309 IRIX4_PIC,
310
311 /* Generate PIC code as in the SVR4 MIPS ABI. */
312 SVR4_PIC,
313
314 /* Generate PIC code without using a global offset table: the data
315 segment has a maximum size of 64K, all data references are off
316 the $gp register, and all text references are PC relative. This
317 is used on some embedded systems. */
318 EMBEDDED_PIC
319};
320
321static enum mips_pic_level mips_pic;
322
39c0a331
L
323/* Warn about all NOPS that the assembler generates. */
324static int warn_nops = 0;
325
252b5132
RH
326/* 1 if we should generate 32 bit offsets from the GP register in
327 SVR4_PIC mode. Currently has no meaning in other modes. */
328static int mips_big_got;
329
330/* 1 if trap instructions should used for overflow rather than break
331 instructions. */
332static int mips_trap;
333
119d663a
NC
334/* 1 if double width floating point constants should not be constructed
335 by a assembling two single width halves into two single width floating
336 point registers which just happen to alias the double width destination
337 register. On some architectures this aliasing can be disabled by a bit
d547a75e 338 in the status register, and the setting of this bit cannot be determined
119d663a
NC
339 automatically at assemble time. */
340static int mips_disable_float_construction;
341
252b5132
RH
342/* Non-zero if any .set noreorder directives were used. */
343
344static int mips_any_noreorder;
345
6b76fefe
CM
346/* Non-zero if nops should be inserted when the register referenced in
347 an mfhi/mflo instruction is read in the next two instructions. */
348static int mips_7000_hilo_fix;
349
252b5132 350/* The size of the small data section. */
156c2f8b 351static unsigned int g_switch_value = 8;
252b5132
RH
352/* Whether the -G option was used. */
353static int g_switch_seen = 0;
354
355#define N_RMASK 0xc4
356#define N_VFP 0xd4
357
358/* If we can determine in advance that GP optimization won't be
359 possible, we can skip the relaxation stuff that tries to produce
360 GP-relative references. This makes delay slot optimization work
361 better.
362
363 This function can only provide a guess, but it seems to work for
fba2b7f9
GK
364 gcc output. It needs to guess right for gcc, otherwise gcc
365 will put what it thinks is a GP-relative instruction in a branch
366 delay slot.
252b5132
RH
367
368 I don't know if a fix is needed for the SVR4_PIC mode. I've only
369 fixed it for the non-PIC mode. KR 95/04/07 */
370static int nopic_need_relax PARAMS ((symbolS *, int));
371
372/* handle of the OPCODE hash table */
373static struct hash_control *op_hash = NULL;
374
375/* The opcode hash table we use for the mips16. */
376static struct hash_control *mips16_op_hash = NULL;
377
378/* This array holds the chars that always start a comment. If the
379 pre-processor is disabled, these aren't very useful */
380const char comment_chars[] = "#";
381
382/* This array holds the chars that only start a comment at the beginning of
383 a line. If the line seems to have the form '# 123 filename'
384 .line and .file directives will appear in the pre-processed output */
385/* Note that input_file.c hand checks for '#' at the beginning of the
386 first line of the input file. This is because the compiler outputs
bdaaa2e1 387 #NO_APP at the beginning of its output. */
252b5132
RH
388/* Also note that C style comments are always supported. */
389const char line_comment_chars[] = "#";
390
bdaaa2e1 391/* This array holds machine specific line separator characters. */
63a0b638 392const char line_separator_chars[] = ";";
252b5132
RH
393
394/* Chars that can be used to separate mant from exp in floating point nums */
395const char EXP_CHARS[] = "eE";
396
397/* Chars that mean this number is a floating point constant */
398/* As in 0f12.456 */
399/* or 0d1.2345e12 */
400const char FLT_CHARS[] = "rRsSfFdDxXpP";
401
402/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
403 changed in read.c . Ideally it shouldn't have to know about it at all,
404 but nothing is ideal around here.
405 */
406
407static char *insn_error;
408
409static int auto_align = 1;
410
411/* When outputting SVR4 PIC code, the assembler needs to know the
412 offset in the stack frame from which to restore the $gp register.
413 This is set by the .cprestore pseudo-op, and saved in this
414 variable. */
415static offsetT mips_cprestore_offset = -1;
416
417/* This is the register which holds the stack frame, as set by the
418 .frame pseudo-op. This is needed to implement .cprestore. */
419static int mips_frame_reg = SP;
420
421/* To output NOP instructions correctly, we need to keep information
422 about the previous two instructions. */
423
424/* Whether we are optimizing. The default value of 2 means to remove
425 unneeded NOPs and swap branch instructions when possible. A value
426 of 1 means to not swap branches. A value of 0 means to always
427 insert NOPs. */
428static int mips_optimize = 2;
429
430/* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
431 equivalent to seeing no -g option at all. */
432static int mips_debug = 0;
433
434/* The previous instruction. */
435static struct mips_cl_insn prev_insn;
436
437/* The instruction before prev_insn. */
438static struct mips_cl_insn prev_prev_insn;
439
440/* If we don't want information for prev_insn or prev_prev_insn, we
441 point the insn_mo field at this dummy integer. */
43841e91 442static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
252b5132
RH
443
444/* Non-zero if prev_insn is valid. */
445static int prev_insn_valid;
446
447/* The frag for the previous instruction. */
448static struct frag *prev_insn_frag;
449
450/* The offset into prev_insn_frag for the previous instruction. */
451static long prev_insn_where;
452
453/* The reloc type for the previous instruction, if any. */
454static bfd_reloc_code_real_type prev_insn_reloc_type;
455
456/* The reloc for the previous instruction, if any. */
457static fixS *prev_insn_fixp;
458
459/* Non-zero if the previous instruction was in a delay slot. */
460static int prev_insn_is_delay_slot;
461
462/* Non-zero if the previous instruction was in a .set noreorder. */
463static int prev_insn_unreordered;
464
465/* Non-zero if the previous instruction uses an extend opcode (if
466 mips16). */
467static int prev_insn_extended;
468
469/* Non-zero if the previous previous instruction was in a .set
470 noreorder. */
471static int prev_prev_insn_unreordered;
472
473/* If this is set, it points to a frag holding nop instructions which
474 were inserted before the start of a noreorder section. If those
475 nops turn out to be unnecessary, the size of the frag can be
476 decreased. */
477static fragS *prev_nop_frag;
478
479/* The number of nop instructions we created in prev_nop_frag. */
480static int prev_nop_frag_holds;
481
482/* The number of nop instructions that we know we need in
bdaaa2e1 483 prev_nop_frag. */
252b5132
RH
484static int prev_nop_frag_required;
485
486/* The number of instructions we've seen since prev_nop_frag. */
487static int prev_nop_frag_since;
488
489/* For ECOFF and ELF, relocations against symbols are done in two
490 parts, with a HI relocation and a LO relocation. Each relocation
491 has only 16 bits of space to store an addend. This means that in
492 order for the linker to handle carries correctly, it must be able
493 to locate both the HI and the LO relocation. This means that the
494 relocations must appear in order in the relocation table.
495
496 In order to implement this, we keep track of each unmatched HI
497 relocation. We then sort them so that they immediately precede the
bdaaa2e1 498 corresponding LO relocation. */
252b5132 499
e972090a
NC
500struct mips_hi_fixup
501{
252b5132
RH
502 /* Next HI fixup. */
503 struct mips_hi_fixup *next;
504 /* This fixup. */
505 fixS *fixp;
506 /* The section this fixup is in. */
507 segT seg;
508};
509
510/* The list of unmatched HI relocs. */
511
512static struct mips_hi_fixup *mips_hi_fixup_list;
513
514/* Map normal MIPS register numbers to mips16 register numbers. */
515
516#define X ILLEGAL_REG
e972090a
NC
517static const int mips32_to_16_reg_map[] =
518{
252b5132
RH
519 X, X, 2, 3, 4, 5, 6, 7,
520 X, X, X, X, X, X, X, X,
521 0, 1, X, X, X, X, X, X,
522 X, X, X, X, X, X, X, X
523};
524#undef X
525
526/* Map mips16 register numbers to normal MIPS register numbers. */
527
e972090a
NC
528static const unsigned int mips16_to_32_reg_map[] =
529{
252b5132
RH
530 16, 17, 2, 3, 4, 5, 6, 7
531};
532\f
533/* Since the MIPS does not have multiple forms of PC relative
534 instructions, we do not have to do relaxing as is done on other
535 platforms. However, we do have to handle GP relative addressing
536 correctly, which turns out to be a similar problem.
537
538 Every macro that refers to a symbol can occur in (at least) two
539 forms, one with GP relative addressing and one without. For
540 example, loading a global variable into a register generally uses
541 a macro instruction like this:
542 lw $4,i
543 If i can be addressed off the GP register (this is true if it is in
544 the .sbss or .sdata section, or if it is known to be smaller than
545 the -G argument) this will generate the following instruction:
546 lw $4,i($gp)
547 This instruction will use a GPREL reloc. If i can not be addressed
548 off the GP register, the following instruction sequence will be used:
549 lui $at,i
550 lw $4,i($at)
551 In this case the first instruction will have a HI16 reloc, and the
552 second reloc will have a LO16 reloc. Both relocs will be against
553 the symbol i.
554
555 The issue here is that we may not know whether i is GP addressable
556 until after we see the instruction that uses it. Therefore, we
557 want to be able to choose the final instruction sequence only at
558 the end of the assembly. This is similar to the way other
559 platforms choose the size of a PC relative instruction only at the
560 end of assembly.
561
562 When generating position independent code we do not use GP
563 addressing in quite the same way, but the issue still arises as
564 external symbols and local symbols must be handled differently.
565
566 We handle these issues by actually generating both possible
567 instruction sequences. The longer one is put in a frag_var with
568 type rs_machine_dependent. We encode what to do with the frag in
569 the subtype field. We encode (1) the number of existing bytes to
570 replace, (2) the number of new bytes to use, (3) the offset from
571 the start of the existing bytes to the first reloc we must generate
572 (that is, the offset is applied from the start of the existing
573 bytes after they are replaced by the new bytes, if any), (4) the
574 offset from the start of the existing bytes to the second reloc,
575 (5) whether a third reloc is needed (the third reloc is always four
576 bytes after the second reloc), and (6) whether to warn if this
577 variant is used (this is sometimes needed if .set nomacro or .set
578 noat is in effect). All these numbers are reasonably small.
579
580 Generating two instruction sequences must be handled carefully to
581 ensure that delay slots are handled correctly. Fortunately, there
582 are a limited number of cases. When the second instruction
583 sequence is generated, append_insn is directed to maintain the
584 existing delay slot information, so it continues to apply to any
585 code after the second instruction sequence. This means that the
586 second instruction sequence must not impose any requirements not
587 required by the first instruction sequence.
588
589 These variant frags are then handled in functions called by the
590 machine independent code. md_estimate_size_before_relax returns
591 the final size of the frag. md_convert_frag sets up the final form
592 of the frag. tc_gen_reloc adjust the first reloc and adds a second
593 one if needed. */
594#define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
595 ((relax_substateT) \
596 (((old) << 23) \
597 | ((new) << 16) \
598 | (((reloc1) + 64) << 9) \
599 | (((reloc2) + 64) << 2) \
600 | ((reloc3) ? (1 << 1) : 0) \
601 | ((warn) ? 1 : 0)))
602#define RELAX_OLD(i) (((i) >> 23) & 0x7f)
603#define RELAX_NEW(i) (((i) >> 16) & 0x7f)
9a41af64
TS
604#define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
605#define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
252b5132
RH
606#define RELAX_RELOC3(i) (((i) >> 1) & 1)
607#define RELAX_WARN(i) ((i) & 1)
608
609/* For mips16 code, we use an entirely different form of relaxation.
610 mips16 supports two versions of most instructions which take
611 immediate values: a small one which takes some small value, and a
612 larger one which takes a 16 bit value. Since branches also follow
613 this pattern, relaxing these values is required.
614
615 We can assemble both mips16 and normal MIPS code in a single
616 object. Therefore, we need to support this type of relaxation at
617 the same time that we support the relaxation described above. We
618 use the high bit of the subtype field to distinguish these cases.
619
620 The information we store for this type of relaxation is the
621 argument code found in the opcode file for this relocation, whether
622 the user explicitly requested a small or extended form, and whether
623 the relocation is in a jump or jal delay slot. That tells us the
624 size of the value, and how it should be stored. We also store
625 whether the fragment is considered to be extended or not. We also
626 store whether this is known to be a branch to a different section,
627 whether we have tried to relax this frag yet, and whether we have
628 ever extended a PC relative fragment because of a shift count. */
629#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
630 (0x80000000 \
631 | ((type) & 0xff) \
632 | ((small) ? 0x100 : 0) \
633 | ((ext) ? 0x200 : 0) \
634 | ((dslot) ? 0x400 : 0) \
635 | ((jal_dslot) ? 0x800 : 0))
636#define RELAX_MIPS16_P(i) (((i) & 0x80000000) != 0)
637#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
638#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
639#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
640#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
641#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
642#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
643#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
644#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
645#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
646#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
647#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
648\f
649/* Prototypes for static functions. */
650
651#ifdef __STDC__
652#define internalError() \
653 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
654#else
655#define internalError() as_fatal (_("MIPS internal Error"));
656#endif
657
658enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
659
660static int insn_uses_reg PARAMS ((struct mips_cl_insn *ip,
661 unsigned int reg, enum mips_regclass class));
156c2f8b 662static int reg_needs_delay PARAMS ((unsigned int));
252b5132
RH
663static void mips16_mark_labels PARAMS ((void));
664static void append_insn PARAMS ((char *place,
665 struct mips_cl_insn * ip,
666 expressionS * p,
667 bfd_reloc_code_real_type r,
668 boolean));
669static void mips_no_prev_insn PARAMS ((int));
670static void mips_emit_delays PARAMS ((boolean));
671#ifdef USE_STDARG
672static void macro_build PARAMS ((char *place, int *counter, expressionS * ep,
673 const char *name, const char *fmt,
674 ...));
675#else
676static void macro_build ();
677#endif
678static void mips16_macro_build PARAMS ((char *, int *, expressionS *,
679 const char *, const char *,
680 va_list));
681static void macro_build_lui PARAMS ((char *place, int *counter,
682 expressionS * ep, int regnum));
683static void set_at PARAMS ((int *counter, int reg, int unsignedp));
684static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
685 expressionS *));
686static void load_register PARAMS ((int *, int, expressionS *, int));
687static void load_address PARAMS ((int *counter, int reg, expressionS *ep));
ea1fb5dc 688static void move_register PARAMS ((int *, int, int));
252b5132
RH
689static void macro PARAMS ((struct mips_cl_insn * ip));
690static void mips16_macro PARAMS ((struct mips_cl_insn * ip));
691#ifdef LOSING_COMPILER
692static void macro2 PARAMS ((struct mips_cl_insn * ip));
693#endif
694static void mips_ip PARAMS ((char *str, struct mips_cl_insn * ip));
695static void mips16_ip PARAMS ((char *str, struct mips_cl_insn * ip));
696static void mips16_immed PARAMS ((char *, unsigned int, int, offsetT, boolean,
697 boolean, boolean, unsigned long *,
698 boolean *, unsigned short *));
699static int my_getSmallExpression PARAMS ((expressionS * ep, char *str));
700static void my_getExpression PARAMS ((expressionS * ep, char *str));
701static symbolS *get_symbol PARAMS ((void));
702static void mips_align PARAMS ((int to, int fill, symbolS *label));
703static void s_align PARAMS ((int));
704static void s_change_sec PARAMS ((int));
705static void s_cons PARAMS ((int));
706static void s_float_cons PARAMS ((int));
707static void s_mips_globl PARAMS ((int));
708static void s_option PARAMS ((int));
709static void s_mipsset PARAMS ((int));
710static void s_abicalls PARAMS ((int));
711static void s_cpload PARAMS ((int));
712static void s_cprestore PARAMS ((int));
713static void s_gpword PARAMS ((int));
714static void s_cpadd PARAMS ((int));
715static void s_insn PARAMS ((int));
716static void md_obj_begin PARAMS ((void));
717static void md_obj_end PARAMS ((void));
718static long get_number PARAMS ((void));
719static void s_mips_ent PARAMS ((int));
720static void s_mips_end PARAMS ((int));
721static void s_mips_frame PARAMS ((int));
722static void s_mips_mask PARAMS ((int));
723static void s_mips_stab PARAMS ((int));
724static void s_mips_weakext PARAMS ((int));
725static void s_file PARAMS ((int));
726static int mips16_extended_frag PARAMS ((fragS *, asection *, long));
e7af610e
NC
727static const char *mips_isa_to_str PARAMS ((int));
728static const char *mips_cpu_to_str PARAMS ((int));
252b5132 729static int validate_mips_insn PARAMS ((const struct mips_opcode *));
e87a0284 730static void show PARAMS ((FILE *, char *, int *, int *));
e7af610e 731
fb1b3232
TS
732/* Return values of my_getSmallExpression() */
733
734enum
735{
736 S_EX_NONE = 0,
737 S_EX_LO,
738 S_EX_HI,
739 S_EX_HIGHER,
740 S_EX_HIGHEST,
741 S_EX_GPREL,
742 S_EX_NEG
743};
744
e7af610e
NC
745/* Table and functions used to map between CPU/ISA names, and
746 ISA levels, and CPU numbers. */
747
e972090a
NC
748struct mips_cpu_info
749{
e7af610e
NC
750 const char *name; /* CPU or ISA name. */
751 int is_isa; /* Is this an ISA? (If 0, a CPU.) */
752 int isa; /* ISA level. */
753 int cpu; /* CPU number (default CPU if ISA). */
754};
755
756static const struct mips_cpu_info *mips_cpu_info_from_name PARAMS ((const char *));
757static const struct mips_cpu_info *mips_cpu_info_from_isa PARAMS ((int));
758static const struct mips_cpu_info *mips_cpu_info_from_cpu PARAMS ((int));
252b5132
RH
759\f
760/* Pseudo-op table.
761
762 The following pseudo-ops from the Kane and Heinrich MIPS book
763 should be defined here, but are currently unsupported: .alias,
764 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
765
766 The following pseudo-ops from the Kane and Heinrich MIPS book are
767 specific to the type of debugging information being generated, and
768 should be defined by the object format: .aent, .begin, .bend,
769 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
770 .vreg.
771
772 The following pseudo-ops from the Kane and Heinrich MIPS book are
773 not MIPS CPU specific, but are also not specific to the object file
774 format. This file is probably the best place to define them, but
775 they are not currently supported: .asm0, .endr, .lab, .repeat,
776 .struct. */
777
e972090a
NC
778static const pseudo_typeS mips_pseudo_table[] =
779{
beae10d5 780 /* MIPS specific pseudo-ops. */
252b5132
RH
781 {"option", s_option, 0},
782 {"set", s_mipsset, 0},
783 {"rdata", s_change_sec, 'r'},
784 {"sdata", s_change_sec, 's'},
785 {"livereg", s_ignore, 0},
786 {"abicalls", s_abicalls, 0},
787 {"cpload", s_cpload, 0},
788 {"cprestore", s_cprestore, 0},
789 {"gpword", s_gpword, 0},
790 {"cpadd", s_cpadd, 0},
791 {"insn", s_insn, 0},
792
beae10d5 793 /* Relatively generic pseudo-ops that happen to be used on MIPS
252b5132
RH
794 chips. */
795 {"asciiz", stringer, 1},
796 {"bss", s_change_sec, 'b'},
797 {"err", s_err, 0},
798 {"half", s_cons, 1},
799 {"dword", s_cons, 3},
800 {"weakext", s_mips_weakext, 0},
801
beae10d5 802 /* These pseudo-ops are defined in read.c, but must be overridden
252b5132
RH
803 here for one reason or another. */
804 {"align", s_align, 0},
805 {"byte", s_cons, 0},
806 {"data", s_change_sec, 'd'},
807 {"double", s_float_cons, 'd'},
808 {"float", s_float_cons, 'f'},
809 {"globl", s_mips_globl, 0},
810 {"global", s_mips_globl, 0},
811 {"hword", s_cons, 1},
812 {"int", s_cons, 2},
813 {"long", s_cons, 2},
814 {"octa", s_cons, 4},
815 {"quad", s_cons, 3},
816 {"short", s_cons, 1},
817 {"single", s_float_cons, 'f'},
818 {"stabn", s_mips_stab, 'n'},
819 {"text", s_change_sec, 't'},
820 {"word", s_cons, 2},
add56521
L
821
822#ifdef MIPS_STABS_ELF
823 { "extern", ecoff_directive_extern, 0},
824#endif
825
43841e91 826 { NULL, NULL, 0 },
252b5132
RH
827};
828
e972090a
NC
829static const pseudo_typeS mips_nonecoff_pseudo_table[] =
830{
beae10d5
KH
831 /* These pseudo-ops should be defined by the object file format.
832 However, a.out doesn't support them, so we have versions here. */
252b5132
RH
833 {"aent", s_mips_ent, 1},
834 {"bgnb", s_ignore, 0},
835 {"end", s_mips_end, 0},
836 {"endb", s_ignore, 0},
837 {"ent", s_mips_ent, 0},
838 {"file", s_file, 0},
839 {"fmask", s_mips_mask, 'F'},
840 {"frame", s_mips_frame, 0},
841 {"loc", s_ignore, 0},
842 {"mask", s_mips_mask, 'R'},
843 {"verstamp", s_ignore, 0},
43841e91 844 { NULL, NULL, 0 },
252b5132
RH
845};
846
847extern void pop_insert PARAMS ((const pseudo_typeS *));
848
849void
850mips_pop_insert ()
851{
852 pop_insert (mips_pseudo_table);
853 if (! ECOFF_DEBUGGING)
854 pop_insert (mips_nonecoff_pseudo_table);
855}
856\f
857/* Symbols labelling the current insn. */
858
e972090a
NC
859struct insn_label_list
860{
252b5132
RH
861 struct insn_label_list *next;
862 symbolS *label;
863};
864
865static struct insn_label_list *insn_labels;
866static struct insn_label_list *free_insn_labels;
867
868static void mips_clear_insn_labels PARAMS ((void));
869
870static inline void
871mips_clear_insn_labels ()
872{
873 register struct insn_label_list **pl;
874
875 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
876 ;
877 *pl = insn_labels;
878 insn_labels = NULL;
879}
880\f
881static char *expr_end;
882
883/* Expressions which appear in instructions. These are set by
884 mips_ip. */
885
886static expressionS imm_expr;
887static expressionS offset_expr;
888
889/* Relocs associated with imm_expr and offset_expr. */
890
891static bfd_reloc_code_real_type imm_reloc;
892static bfd_reloc_code_real_type offset_reloc;
893
894/* This is set by mips_ip if imm_reloc is an unmatched HI16_S reloc. */
895
896static boolean imm_unmatched_hi;
897
898/* These are set by mips16_ip if an explicit extension is used. */
899
900static boolean mips16_small, mips16_ext;
901
902#ifdef MIPS_STABS_ELF
903/* The pdr segment for per procedure frame/regmask info */
904
905static segT pdr_seg;
906#endif
907
e7af610e
NC
908static const char *
909mips_isa_to_str (isa)
910 int isa;
911{
912 const struct mips_cpu_info *ci;
913 static char s[20];
914
915 ci = mips_cpu_info_from_isa (isa);
916 if (ci != NULL)
917 return (ci->name);
918
919 sprintf (s, "ISA#%d", isa);
920 return s;
921}
922
923static const char *
156c2f8b
NC
924mips_cpu_to_str (cpu)
925 int cpu;
926{
e7af610e 927 const struct mips_cpu_info *ci;
156c2f8b 928 static char s[16];
e7af610e
NC
929
930 ci = mips_cpu_info_from_cpu (cpu);
931 if (ci != NULL)
932 return (ci->name);
933
934 sprintf (s, "CPU#%d", cpu);
935 return s;
156c2f8b
NC
936}
937
938/* This function is called once, at assembler startup time. It should
939 set up all the tables, etc. that the MD part of the assembler will need. */
940
252b5132
RH
941void
942md_begin ()
943{
252b5132 944 register const char *retval = NULL;
156c2f8b 945 int i = 0;
252b5132
RH
946 const char *cpu;
947 char *a = NULL;
948 int broken = 0;
949 int mips_isa_from_cpu;
e7af610e
NC
950 int target_cpu_had_mips16 = 0;
951 const struct mips_cpu_info *ci;
252b5132 952
056350c6
NC
953 /* GP relative stuff not working for PE */
954 if (strncmp (TARGET_OS, "pe", 2) == 0
955 && g_switch_value != 0)
956 {
957 if (g_switch_seen)
958 as_bad (_("-G not supported in this configuration."));
959 g_switch_value = 0;
960 }
961
252b5132
RH
962 cpu = TARGET_CPU;
963 if (strcmp (cpu + (sizeof TARGET_CPU) - 3, "el") == 0)
964 {
965 a = xmalloc (sizeof TARGET_CPU);
966 strcpy (a, TARGET_CPU);
967 a[(sizeof TARGET_CPU) - 3] = '\0';
968 cpu = a;
969 }
970
e7af610e 971 if (strncmp (cpu, "mips16", sizeof "mips16" - 1) == 0)
252b5132 972 {
e7af610e
NC
973 target_cpu_had_mips16 = 1;
974 cpu += sizeof "mips16" - 1;
252b5132
RH
975 }
976
e7af610e
NC
977 if (mips_opts.mips16 < 0)
978 mips_opts.mips16 = target_cpu_had_mips16;
252b5132 979
6dce9e24
TS
980 /* Backward compatibility for historic -mcpu= option. Check for
981 incompatible options, warn if -mcpu is used. */
982 if (mips_cpu != CPU_UNKNOWN
983 && mips_arch != CPU_UNKNOWN
984 && mips_cpu != mips_arch)
985 {
986 as_fatal (_("The -mcpu option can't be used together with -march. "
987 "Use -mtune instead of -mcpu."));
988 }
989
990 if (mips_cpu != CPU_UNKNOWN
991 && mips_tune != CPU_UNKNOWN
992 && mips_cpu != mips_tune)
993 {
994 as_fatal (_("The -mcpu option can't be used together with -mtune. "
995 "Use -march instead of -mcpu."));
996 }
997
998 if (mips_arch == CPU_UNKNOWN && mips_cpu != CPU_UNKNOWN)
999 {
1000 ci = mips_cpu_info_from_cpu (mips_cpu);
1001 assert (ci != NULL);
1002 mips_arch = ci->cpu;
1003 as_warn (_("The -mcpu option is deprecated. Please use -march and "
1004 "-mtune instead."));
1005 }
1006
ec68c924 1007 /* At this point, mips_arch will either be CPU_UNKNOWN if no ARCH was
e7af610e
NC
1008 specified on the command line, or some other value if one was.
1009 Similarly, mips_opts.isa will be ISA_UNKNOWN if not specified on
1010 the command line, or will be set otherwise if one was. */
ec68c924 1011 if (mips_arch != CPU_UNKNOWN && mips_opts.isa != ISA_UNKNOWN)
252b5132 1012 {
1ff54a84
TS
1013 /* We have to check if the isa is the default isa of arch. Otherwise
1014 we'll get invalid object file headers. */
1015 ci = mips_cpu_info_from_cpu (mips_arch);
1016 assert (ci != NULL);
1017 if (mips_opts.isa != ci->isa)
1018 {
1019 /* This really should be an error instead of a warning, but old
1020 compilers only have -mcpu which sets both arch and tune. For
1021 now, we discard arch and preserve tune. */
1022 as_warn (_("The -march option is incompatible to -mipsN and "
1023 "therefore ignored."));
1024 if (mips_tune == CPU_UNKNOWN)
1025 mips_tune = mips_arch;
1026 ci = mips_cpu_info_from_isa (mips_opts.isa);
1027 assert (ci != NULL);
1028 mips_arch = ci->cpu;
1029 }
252b5132 1030 }
ec68c924 1031 else if (mips_arch != CPU_UNKNOWN && mips_opts.isa == ISA_UNKNOWN)
252b5132 1032 {
ec68c924
EC
1033 /* We have ARCH, we need ISA. */
1034 ci = mips_cpu_info_from_cpu (mips_arch);
e7af610e
NC
1035 assert (ci != NULL);
1036 mips_opts.isa = ci->isa;
1037 }
ec68c924 1038 else if (mips_arch == CPU_UNKNOWN && mips_opts.isa != ISA_UNKNOWN)
e7af610e 1039 {
ec68c924 1040 /* We have ISA, we need default ARCH. */
e7af610e
NC
1041 ci = mips_cpu_info_from_isa (mips_opts.isa);
1042 assert (ci != NULL);
ec68c924
EC
1043 mips_arch = ci->cpu;
1044 }
e7af610e
NC
1045 else
1046 {
ec68c924 1047 /* We need to set both ISA and ARCH from target cpu. */
e7af610e
NC
1048 ci = mips_cpu_info_from_name (cpu);
1049 if (ci == NULL)
beae10d5 1050 ci = mips_cpu_info_from_cpu (CPU_R3000);
e7af610e
NC
1051 assert (ci != NULL);
1052 mips_opts.isa = ci->isa;
ec68c924 1053 mips_arch = ci->cpu;
252b5132
RH
1054 }
1055
ec68c924
EC
1056 if (mips_tune == CPU_UNKNOWN)
1057 mips_tune = mips_arch;
1058
1059 ci = mips_cpu_info_from_cpu (mips_arch);
e7af610e
NC
1060 assert (ci != NULL);
1061 mips_isa_from_cpu = ci->isa;
1062
252b5132 1063 /* End of TARGET_CPU processing, get rid of malloced memory
bdaaa2e1 1064 if necessary. */
252b5132
RH
1065 cpu = NULL;
1066 if (a != NULL)
1067 {
156c2f8b
NC
1068 free (a);
1069 a = NULL;
252b5132
RH
1070 }
1071
e7af610e 1072 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
252b5132
RH
1073 as_bad (_("trap exception not supported at ISA 1"));
1074
1075 /* Set the EABI kind based on the ISA before the user gets
1076 to change the ISA with directives. This isn't really
bdaaa2e1 1077 the best, but then neither is basing the abi on the isa. */
9ce8a5dd 1078 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
252b5132 1079 && mips_abi_string
beae10d5 1080 && 0 == strcmp (mips_abi_string, "eabi"))
252b5132
RH
1081 mips_eabi64 = 1;
1082
e7af610e
NC
1083 /* If they asked for mips1 or mips2 and a cpu that is
1084 mips3 or greater, then mark the object file 32BITMODE. */
1085 if (mips_isa_from_cpu != ISA_UNKNOWN
1086 && ! ISA_HAS_64BIT_REGS (mips_opts.isa)
1087 && ISA_HAS_64BIT_REGS (mips_isa_from_cpu))
1088 mips_32bitmode = 1;
252b5132 1089
ec68c924 1090 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
252b5132
RH
1091 as_warn (_("Could not set architecture and machine"));
1092
1093 file_mips_isa = mips_opts.isa;
1094
1095 op_hash = hash_new ();
1096
1097 for (i = 0; i < NUMOPCODES;)
1098 {
1099 const char *name = mips_opcodes[i].name;
1100
1101 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1102 if (retval != NULL)
1103 {
1104 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1105 mips_opcodes[i].name, retval);
1106 /* Probably a memory allocation problem? Give up now. */
1107 as_fatal (_("Broken assembler. No assembly attempted."));
1108 }
1109 do
1110 {
1111 if (mips_opcodes[i].pinfo != INSN_MACRO)
1112 {
1113 if (!validate_mips_insn (&mips_opcodes[i]))
1114 broken = 1;
1115 }
1116 ++i;
1117 }
1118 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1119 }
1120
1121 mips16_op_hash = hash_new ();
1122
1123 i = 0;
1124 while (i < bfd_mips16_num_opcodes)
1125 {
1126 const char *name = mips16_opcodes[i].name;
1127
1128 retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1129 if (retval != NULL)
1130 as_fatal (_("internal: can't hash `%s': %s"),
1131 mips16_opcodes[i].name, retval);
1132 do
1133 {
1134 if (mips16_opcodes[i].pinfo != INSN_MACRO
1135 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1136 != mips16_opcodes[i].match))
1137 {
1138 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1139 mips16_opcodes[i].name, mips16_opcodes[i].args);
1140 broken = 1;
1141 }
1142 ++i;
1143 }
1144 while (i < bfd_mips16_num_opcodes
1145 && strcmp (mips16_opcodes[i].name, name) == 0);
1146 }
1147
1148 if (broken)
1149 as_fatal (_("Broken assembler. No assembly attempted."));
1150
1151 /* We add all the general register names to the symbol table. This
1152 helps us detect invalid uses of them. */
1153 for (i = 0; i < 32; i++)
1154 {
1155 char buf[5];
1156
1157 sprintf (buf, "$%d", i);
1158 symbol_table_insert (symbol_new (buf, reg_section, i,
1159 &zero_address_frag));
1160 }
1161 symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1162 &zero_address_frag));
1163 symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1164 &zero_address_frag));
1165 symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1166 &zero_address_frag));
1167 symbol_table_insert (symbol_new ("$at", reg_section, AT,
1168 &zero_address_frag));
1169 symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1170 &zero_address_frag));
1171 symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1172 &zero_address_frag));
1173 symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1174 &zero_address_frag));
1175
1176 mips_no_prev_insn (false);
1177
1178 mips_gprmask = 0;
1179 mips_cprmask[0] = 0;
1180 mips_cprmask[1] = 0;
1181 mips_cprmask[2] = 0;
1182 mips_cprmask[3] = 0;
1183
1184 /* set the default alignment for the text section (2**2) */
1185 record_alignment (text_section, 2);
1186
1187 if (USE_GLOBAL_POINTER_OPT)
1188 bfd_set_gp_size (stdoutput, g_switch_value);
1189
1190 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1191 {
1192 /* On a native system, sections must be aligned to 16 byte
1193 boundaries. When configured for an embedded ELF target, we
1194 don't bother. */
1195 if (strcmp (TARGET_OS, "elf") != 0)
1196 {
1197 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1198 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1199 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1200 }
1201
1202 /* Create a .reginfo section for register masks and a .mdebug
1203 section for debugging information. */
1204 {
1205 segT seg;
1206 subsegT subseg;
1207 flagword flags;
1208 segT sec;
1209
1210 seg = now_seg;
1211 subseg = now_subseg;
1212
1213 /* The ABI says this section should be loaded so that the
1214 running program can access it. However, we don't load it
1215 if we are configured for an embedded target */
1216 flags = SEC_READONLY | SEC_DATA;
1217 if (strcmp (TARGET_OS, "elf") != 0)
1218 flags |= SEC_ALLOC | SEC_LOAD;
1219
1220 if (! mips_64)
1221 {
1222 sec = subseg_new (".reginfo", (subsegT) 0);
1223
252b5132
RH
1224 (void) bfd_set_section_flags (stdoutput, sec, flags);
1225 (void) bfd_set_section_alignment (stdoutput, sec, 2);
bdaaa2e1 1226
252b5132
RH
1227#ifdef OBJ_ELF
1228 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1229#endif
1230 }
1231 else
1232 {
1233 /* The 64-bit ABI uses a .MIPS.options section rather than
1234 .reginfo section. */
1235 sec = subseg_new (".MIPS.options", (subsegT) 0);
1236 (void) bfd_set_section_flags (stdoutput, sec, flags);
1237 (void) bfd_set_section_alignment (stdoutput, sec, 3);
1238
1239#ifdef OBJ_ELF
1240 /* Set up the option header. */
1241 {
1242 Elf_Internal_Options opthdr;
1243 char *f;
1244
1245 opthdr.kind = ODK_REGINFO;
1246 opthdr.size = (sizeof (Elf_External_Options)
1247 + sizeof (Elf64_External_RegInfo));
1248 opthdr.section = 0;
1249 opthdr.info = 0;
1250 f = frag_more (sizeof (Elf_External_Options));
1251 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1252 (Elf_External_Options *) f);
1253
1254 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1255 }
1256#endif
1257 }
1258
1259 if (ECOFF_DEBUGGING)
1260 {
1261 sec = subseg_new (".mdebug", (subsegT) 0);
1262 (void) bfd_set_section_flags (stdoutput, sec,
1263 SEC_HAS_CONTENTS | SEC_READONLY);
1264 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1265 }
1266
1267#ifdef MIPS_STABS_ELF
1268 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1269 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1270 SEC_READONLY | SEC_RELOC | SEC_DEBUGGING);
1271 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1272#endif
1273
1274 subseg_set (seg, subseg);
1275 }
1276 }
1277
1278 if (! ECOFF_DEBUGGING)
1279 md_obj_begin ();
1280}
1281
1282void
1283md_mips_end ()
1284{
1285 if (! ECOFF_DEBUGGING)
1286 md_obj_end ();
1287}
1288
1289void
1290md_assemble (str)
1291 char *str;
1292{
1293 struct mips_cl_insn insn;
1294
1295 imm_expr.X_op = O_absent;
1296 imm_reloc = BFD_RELOC_UNUSED;
1297 imm_unmatched_hi = false;
1298 offset_expr.X_op = O_absent;
1299 offset_reloc = BFD_RELOC_UNUSED;
1300
1301 if (mips_opts.mips16)
1302 mips16_ip (str, &insn);
1303 else
1304 {
1305 mips_ip (str, &insn);
beae10d5
KH
1306 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1307 str, insn.insn_opcode));
252b5132
RH
1308 }
1309
1310 if (insn_error)
1311 {
1312 as_bad ("%s `%s'", insn_error, str);
1313 return;
1314 }
1315
1316 if (insn.insn_mo->pinfo == INSN_MACRO)
1317 {
1318 if (mips_opts.mips16)
1319 mips16_macro (&insn);
1320 else
1321 macro (&insn);
1322 }
1323 else
1324 {
1325 if (imm_expr.X_op != O_absent)
1326 append_insn ((char *) NULL, &insn, &imm_expr, imm_reloc,
1327 imm_unmatched_hi);
1328 else if (offset_expr.X_op != O_absent)
1329 append_insn ((char *) NULL, &insn, &offset_expr, offset_reloc, false);
1330 else
1331 append_insn ((char *) NULL, &insn, NULL, BFD_RELOC_UNUSED, false);
1332 }
1333}
1334
1335/* See whether instruction IP reads register REG. CLASS is the type
1336 of register. */
1337
1338static int
1339insn_uses_reg (ip, reg, class)
1340 struct mips_cl_insn *ip;
1341 unsigned int reg;
1342 enum mips_regclass class;
1343{
1344 if (class == MIPS16_REG)
1345 {
1346 assert (mips_opts.mips16);
1347 reg = mips16_to_32_reg_map[reg];
1348 class = MIPS_GR_REG;
1349 }
1350
1351 /* Don't report on general register 0, since it never changes. */
1352 if (class == MIPS_GR_REG && reg == 0)
1353 return 0;
1354
1355 if (class == MIPS_FP_REG)
1356 {
1357 assert (! mips_opts.mips16);
1358 /* If we are called with either $f0 or $f1, we must check $f0.
1359 This is not optimal, because it will introduce an unnecessary
1360 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
1361 need to distinguish reading both $f0 and $f1 or just one of
1362 them. Note that we don't have to check the other way,
1363 because there is no instruction that sets both $f0 and $f1
1364 and requires a delay. */
1365 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1366 && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1367 == (reg &~ (unsigned) 1)))
1368 return 1;
1369 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1370 && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1371 == (reg &~ (unsigned) 1)))
1372 return 1;
1373 }
1374 else if (! mips_opts.mips16)
1375 {
1376 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1377 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1378 return 1;
1379 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1380 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1381 return 1;
1382 }
1383 else
1384 {
1385 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1386 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1387 & MIPS16OP_MASK_RX)]
1388 == reg))
1389 return 1;
1390 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1391 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1392 & MIPS16OP_MASK_RY)]
1393 == reg))
1394 return 1;
1395 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1396 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1397 & MIPS16OP_MASK_MOVE32Z)]
1398 == reg))
1399 return 1;
1400 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1401 return 1;
1402 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1403 return 1;
1404 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1405 return 1;
1406 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1407 && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1408 & MIPS16OP_MASK_REGR32) == reg)
1409 return 1;
1410 }
1411
1412 return 0;
1413}
1414
1415/* This function returns true if modifying a register requires a
1416 delay. */
1417
1418static int
1419reg_needs_delay (reg)
156c2f8b 1420 unsigned int reg;
252b5132
RH
1421{
1422 unsigned long prev_pinfo;
1423
1424 prev_pinfo = prev_insn.insn_mo->pinfo;
1425 if (! mips_opts.noreorder
9ce8a5dd 1426 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1427 && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1428 || (! gpr_interlocks
1429 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1430 {
1431 /* A load from a coprocessor or from memory. All load
1432 delays delay the use of general register rt for one
1433 instruction on the r3000. The r6000 and r4000 use
1434 interlocks. */
bdaaa2e1 1435 /* Itbl support may require additional care here. */
252b5132
RH
1436 know (prev_pinfo & INSN_WRITE_GPR_T);
1437 if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1438 return 1;
1439 }
1440
1441 return 0;
1442}
1443
1444/* Mark instruction labels in mips16 mode. This permits the linker to
1445 handle them specially, such as generating jalx instructions when
1446 needed. We also make them odd for the duration of the assembly, in
1447 order to generate the right sort of code. We will make them even
1448 in the adjust_symtab routine, while leaving them marked. This is
1449 convenient for the debugger and the disassembler. The linker knows
1450 to make them odd again. */
1451
1452static void
1453mips16_mark_labels ()
1454{
1455 if (mips_opts.mips16)
1456 {
1457 struct insn_label_list *l;
98aa84af 1458 valueT val;
252b5132
RH
1459
1460 for (l = insn_labels; l != NULL; l = l->next)
1461 {
1462#ifdef OBJ_ELF
1463 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1464 S_SET_OTHER (l->label, STO_MIPS16);
1465#endif
98aa84af
AM
1466 val = S_GET_VALUE (l->label);
1467 if ((val & 1) == 0)
1468 S_SET_VALUE (l->label, val + 1);
252b5132
RH
1469 }
1470 }
1471}
1472
1473/* Output an instruction. PLACE is where to put the instruction; if
1474 it is NULL, this uses frag_more to get room. IP is the instruction
1475 information. ADDRESS_EXPR is an operand of the instruction to be
1476 used with RELOC_TYPE. */
1477
1478static void
1479append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
1480 char *place;
1481 struct mips_cl_insn *ip;
1482 expressionS *address_expr;
1483 bfd_reloc_code_real_type reloc_type;
1484 boolean unmatched_hi;
1485{
1486 register unsigned long prev_pinfo, pinfo;
1487 char *f;
1488 fixS *fixp;
1489 int nops = 0;
1490
1491 /* Mark instruction labels in mips16 mode. */
1492 if (mips_opts.mips16)
1493 mips16_mark_labels ();
1494
1495 prev_pinfo = prev_insn.insn_mo->pinfo;
1496 pinfo = ip->insn_mo->pinfo;
1497
1498 if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1499 {
1500 int prev_prev_nop;
1501
1502 /* If the previous insn required any delay slots, see if we need
1503 to insert a NOP or two. There are eight kinds of possible
1504 hazards, of which an instruction can have at most one type.
1505 (1) a load from memory delay
1506 (2) a load from a coprocessor delay
1507 (3) an unconditional branch delay
1508 (4) a conditional branch delay
1509 (5) a move to coprocessor register delay
1510 (6) a load coprocessor register from memory delay
1511 (7) a coprocessor condition code delay
1512 (8) a HI/LO special register delay
1513
1514 There are a lot of optimizations we could do that we don't.
1515 In particular, we do not, in general, reorder instructions.
1516 If you use gcc with optimization, it will reorder
1517 instructions and generally do much more optimization then we
1518 do here; repeating all that work in the assembler would only
1519 benefit hand written assembly code, and does not seem worth
1520 it. */
1521
1522 /* This is how a NOP is emitted. */
1523#define emit_nop() \
1524 (mips_opts.mips16 \
1525 ? md_number_to_chars (frag_more (2), 0x6500, 2) \
1526 : md_number_to_chars (frag_more (4), 0, 4))
1527
1528 /* The previous insn might require a delay slot, depending upon
1529 the contents of the current insn. */
1530 if (! mips_opts.mips16
9ce8a5dd 1531 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1532 && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1533 && ! cop_interlocks)
1534 || (! gpr_interlocks
1535 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1536 {
1537 /* A load from a coprocessor or from memory. All load
1538 delays delay the use of general register rt for one
1539 instruction on the r3000. The r6000 and r4000 use
1540 interlocks. */
beae10d5 1541 /* Itbl support may require additional care here. */
252b5132
RH
1542 know (prev_pinfo & INSN_WRITE_GPR_T);
1543 if (mips_optimize == 0
1544 || insn_uses_reg (ip,
1545 ((prev_insn.insn_opcode >> OP_SH_RT)
1546 & OP_MASK_RT),
1547 MIPS_GR_REG))
1548 ++nops;
1549 }
1550 else if (! mips_opts.mips16
9ce8a5dd 1551 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132 1552 && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
beae10d5 1553 && ! cop_interlocks)
e7af610e 1554 || (mips_opts.isa == ISA_MIPS1
252b5132
RH
1555 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1556 {
1557 /* A generic coprocessor delay. The previous instruction
1558 modified a coprocessor general or control register. If
1559 it modified a control register, we need to avoid any
1560 coprocessor instruction (this is probably not always
1561 required, but it sometimes is). If it modified a general
1562 register, we avoid using that register.
1563
1564 On the r6000 and r4000 loading a coprocessor register
1565 from memory is interlocked, and does not require a delay.
1566
1567 This case is not handled very well. There is no special
1568 knowledge of CP0 handling, and the coprocessors other
1569 than the floating point unit are not distinguished at
1570 all. */
1571 /* Itbl support may require additional care here. FIXME!
bdaaa2e1 1572 Need to modify this to include knowledge about
252b5132
RH
1573 user specified delays! */
1574 if (prev_pinfo & INSN_WRITE_FPR_T)
1575 {
1576 if (mips_optimize == 0
1577 || insn_uses_reg (ip,
1578 ((prev_insn.insn_opcode >> OP_SH_FT)
1579 & OP_MASK_FT),
1580 MIPS_FP_REG))
1581 ++nops;
1582 }
1583 else if (prev_pinfo & INSN_WRITE_FPR_S)
1584 {
1585 if (mips_optimize == 0
1586 || insn_uses_reg (ip,
1587 ((prev_insn.insn_opcode >> OP_SH_FS)
1588 & OP_MASK_FS),
1589 MIPS_FP_REG))
1590 ++nops;
1591 }
1592 else
1593 {
1594 /* We don't know exactly what the previous instruction
1595 does. If the current instruction uses a coprocessor
1596 register, we must insert a NOP. If previous
1597 instruction may set the condition codes, and the
1598 current instruction uses them, we must insert two
1599 NOPS. */
bdaaa2e1 1600 /* Itbl support may require additional care here. */
252b5132
RH
1601 if (mips_optimize == 0
1602 || ((prev_pinfo & INSN_WRITE_COND_CODE)
1603 && (pinfo & INSN_READ_COND_CODE)))
1604 nops += 2;
1605 else if (pinfo & INSN_COP)
1606 ++nops;
1607 }
1608 }
1609 else if (! mips_opts.mips16
9ce8a5dd 1610 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1611 && (prev_pinfo & INSN_WRITE_COND_CODE)
1612 && ! cop_interlocks)
1613 {
1614 /* The previous instruction sets the coprocessor condition
1615 codes, but does not require a general coprocessor delay
1616 (this means it is a floating point comparison
1617 instruction). If this instruction uses the condition
1618 codes, we need to insert a single NOP. */
beae10d5 1619 /* Itbl support may require additional care here. */
252b5132
RH
1620 if (mips_optimize == 0
1621 || (pinfo & INSN_READ_COND_CODE))
1622 ++nops;
1623 }
6b76fefe
CM
1624
1625 /* If we're fixing up mfhi/mflo for the r7000 and the
1626 previous insn was an mfhi/mflo and the current insn
1627 reads the register that the mfhi/mflo wrote to, then
1628 insert two nops. */
1629
1630 else if (mips_7000_hilo_fix
1631 && MF_HILO_INSN (prev_pinfo)
1632 && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
beae10d5
KH
1633 & OP_MASK_RD),
1634 MIPS_GR_REG))
6b76fefe
CM
1635 {
1636 nops += 2;
1637 }
1638
1639 /* If we're fixing up mfhi/mflo for the r7000 and the
1640 2nd previous insn was an mfhi/mflo and the current insn
1641 reads the register that the mfhi/mflo wrote to, then
1642 insert one nop. */
1643
1644 else if (mips_7000_hilo_fix
1645 && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1646 && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1647 & OP_MASK_RD),
1648 MIPS_GR_REG))
bdaaa2e1 1649
6b76fefe
CM
1650 {
1651 nops += 1;
1652 }
bdaaa2e1 1653
252b5132
RH
1654 else if (prev_pinfo & INSN_READ_LO)
1655 {
1656 /* The previous instruction reads the LO register; if the
1657 current instruction writes to the LO register, we must
bdaaa2e1
KH
1658 insert two NOPS. Some newer processors have interlocks.
1659 Also the tx39's multiply instructions can be exectuted
252b5132 1660 immediatly after a read from HI/LO (without the delay),
bdaaa2e1
KH
1661 though the tx39's divide insns still do require the
1662 delay. */
252b5132 1663 if (! (hilo_interlocks
ec68c924 1664 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
1665 && (mips_optimize == 0
1666 || (pinfo & INSN_WRITE_LO)))
1667 nops += 2;
1668 /* Most mips16 branch insns don't have a delay slot.
1669 If a read from LO is immediately followed by a branch
1670 to a write to LO we have a read followed by a write
1671 less than 2 insns away. We assume the target of
1672 a branch might be a write to LO, and insert a nop
bdaaa2e1 1673 between a read and an immediately following branch. */
252b5132
RH
1674 else if (mips_opts.mips16
1675 && (mips_optimize == 0
1676 || (pinfo & MIPS16_INSN_BRANCH)))
1677 nops += 1;
1678 }
1679 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1680 {
1681 /* The previous instruction reads the HI register; if the
1682 current instruction writes to the HI register, we must
1683 insert a NOP. Some newer processors have interlocks.
bdaaa2e1 1684 Also the note tx39's multiply above. */
252b5132 1685 if (! (hilo_interlocks
ec68c924 1686 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
1687 && (mips_optimize == 0
1688 || (pinfo & INSN_WRITE_HI)))
1689 nops += 2;
1690 /* Most mips16 branch insns don't have a delay slot.
1691 If a read from HI is immediately followed by a branch
1692 to a write to HI we have a read followed by a write
1693 less than 2 insns away. We assume the target of
1694 a branch might be a write to HI, and insert a nop
bdaaa2e1 1695 between a read and an immediately following branch. */
252b5132
RH
1696 else if (mips_opts.mips16
1697 && (mips_optimize == 0
1698 || (pinfo & MIPS16_INSN_BRANCH)))
1699 nops += 1;
1700 }
1701
1702 /* If the previous instruction was in a noreorder section, then
1703 we don't want to insert the nop after all. */
bdaaa2e1 1704 /* Itbl support may require additional care here. */
252b5132
RH
1705 if (prev_insn_unreordered)
1706 nops = 0;
1707
1708 /* There are two cases which require two intervening
1709 instructions: 1) setting the condition codes using a move to
1710 coprocessor instruction which requires a general coprocessor
1711 delay and then reading the condition codes 2) reading the HI
1712 or LO register and then writing to it (except on processors
1713 which have interlocks). If we are not already emitting a NOP
1714 instruction, we must check for these cases compared to the
1715 instruction previous to the previous instruction. */
1716 if ((! mips_opts.mips16
9ce8a5dd 1717 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1718 && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1719 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1720 && (pinfo & INSN_READ_COND_CODE)
1721 && ! cop_interlocks)
1722 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1723 && (pinfo & INSN_WRITE_LO)
1724 && ! (hilo_interlocks
ec68c924 1725 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
252b5132
RH
1726 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1727 && (pinfo & INSN_WRITE_HI)
1728 && ! (hilo_interlocks
ec68c924 1729 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
252b5132
RH
1730 prev_prev_nop = 1;
1731 else
1732 prev_prev_nop = 0;
1733
1734 if (prev_prev_insn_unreordered)
1735 prev_prev_nop = 0;
1736
1737 if (prev_prev_nop && nops == 0)
1738 ++nops;
1739
1740 /* If we are being given a nop instruction, don't bother with
1741 one of the nops we would otherwise output. This will only
1742 happen when a nop instruction is used with mips_optimize set
1743 to 0. */
1744 if (nops > 0
1745 && ! mips_opts.noreorder
156c2f8b 1746 && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
252b5132
RH
1747 --nops;
1748
1749 /* Now emit the right number of NOP instructions. */
1750 if (nops > 0 && ! mips_opts.noreorder)
1751 {
1752 fragS *old_frag;
1753 unsigned long old_frag_offset;
1754 int i;
1755 struct insn_label_list *l;
1756
1757 old_frag = frag_now;
1758 old_frag_offset = frag_now_fix ();
1759
1760 for (i = 0; i < nops; i++)
1761 emit_nop ();
1762
1763 if (listing)
1764 {
1765 listing_prev_line ();
1766 /* We may be at the start of a variant frag. In case we
1767 are, make sure there is enough space for the frag
1768 after the frags created by listing_prev_line. The
1769 argument to frag_grow here must be at least as large
1770 as the argument to all other calls to frag_grow in
1771 this file. We don't have to worry about being in the
1772 middle of a variant frag, because the variants insert
1773 all needed nop instructions themselves. */
1774 frag_grow (40);
1775 }
1776
1777 for (l = insn_labels; l != NULL; l = l->next)
1778 {
98aa84af
AM
1779 valueT val;
1780
252b5132 1781 assert (S_GET_SEGMENT (l->label) == now_seg);
49309057 1782 symbol_set_frag (l->label, frag_now);
98aa84af 1783 val = (valueT) frag_now_fix ();
252b5132
RH
1784 /* mips16 text labels are stored as odd. */
1785 if (mips_opts.mips16)
98aa84af
AM
1786 val += 1;
1787 S_SET_VALUE (l->label, val);
252b5132
RH
1788 }
1789
1790#ifndef NO_ECOFF_DEBUGGING
1791 if (ECOFF_DEBUGGING)
1792 ecoff_fix_loc (old_frag, old_frag_offset);
1793#endif
1794 }
1795 else if (prev_nop_frag != NULL)
1796 {
1797 /* We have a frag holding nops we may be able to remove. If
1798 we don't need any nops, we can decrease the size of
1799 prev_nop_frag by the size of one instruction. If we do
bdaaa2e1 1800 need some nops, we count them in prev_nops_required. */
252b5132
RH
1801 if (prev_nop_frag_since == 0)
1802 {
1803 if (nops == 0)
1804 {
1805 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1806 --prev_nop_frag_holds;
1807 }
1808 else
1809 prev_nop_frag_required += nops;
1810 }
1811 else
1812 {
1813 if (prev_prev_nop == 0)
1814 {
1815 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1816 --prev_nop_frag_holds;
1817 }
1818 else
1819 ++prev_nop_frag_required;
1820 }
1821
1822 if (prev_nop_frag_holds <= prev_nop_frag_required)
1823 prev_nop_frag = NULL;
1824
1825 ++prev_nop_frag_since;
1826
1827 /* Sanity check: by the time we reach the second instruction
1828 after prev_nop_frag, we should have used up all the nops
1829 one way or another. */
1830 assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
1831 }
1832 }
1833
1834 if (reloc_type > BFD_RELOC_UNUSED)
1835 {
1836 /* We need to set up a variant frag. */
1837 assert (mips_opts.mips16 && address_expr != NULL);
1838 f = frag_var (rs_machine_dependent, 4, 0,
1839 RELAX_MIPS16_ENCODE (reloc_type - BFD_RELOC_UNUSED,
1840 mips16_small, mips16_ext,
1841 (prev_pinfo
1842 & INSN_UNCOND_BRANCH_DELAY),
1843 (prev_insn_reloc_type
1844 == BFD_RELOC_MIPS16_JMP)),
1845 make_expr_symbol (address_expr), (offsetT) 0,
1846 (char *) NULL);
1847 }
1848 else if (place != NULL)
1849 f = place;
1850 else if (mips_opts.mips16
1851 && ! ip->use_extend
1852 && reloc_type != BFD_RELOC_MIPS16_JMP)
1853 {
1854 /* Make sure there is enough room to swap this instruction with
1855 a following jump instruction. */
1856 frag_grow (6);
1857 f = frag_more (2);
1858 }
1859 else
1860 {
1861 if (mips_opts.mips16
1862 && mips_opts.noreorder
1863 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
1864 as_warn (_("extended instruction in delay slot"));
1865
1866 f = frag_more (4);
1867 }
1868
1869 fixp = NULL;
1870 if (address_expr != NULL && reloc_type < BFD_RELOC_UNUSED)
1871 {
1872 if (address_expr->X_op == O_constant)
1873 {
1874 switch (reloc_type)
1875 {
1876 case BFD_RELOC_32:
1877 ip->insn_opcode |= address_expr->X_add_number;
1878 break;
1879
1880 case BFD_RELOC_LO16:
1881 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
1882 break;
1883
1884 case BFD_RELOC_MIPS_JMP:
1885 if ((address_expr->X_add_number & 3) != 0)
1886 as_bad (_("jump to misaligned address (0x%lx)"),
1887 (unsigned long) address_expr->X_add_number);
1888 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
1889 break;
1890
1891 case BFD_RELOC_MIPS16_JMP:
1892 if ((address_expr->X_add_number & 3) != 0)
1893 as_bad (_("jump to misaligned address (0x%lx)"),
1894 (unsigned long) address_expr->X_add_number);
1895 ip->insn_opcode |=
1896 (((address_expr->X_add_number & 0x7c0000) << 3)
1897 | ((address_expr->X_add_number & 0xf800000) >> 7)
1898 | ((address_expr->X_add_number & 0x3fffc) >> 2));
1899 break;
1900
252b5132
RH
1901 case BFD_RELOC_16_PCREL_S2:
1902 goto need_reloc;
1903
1904 default:
1905 internalError ();
1906 }
1907 }
1908 else
1909 {
1910 need_reloc:
1911 /* Don't generate a reloc if we are writing into a variant
1912 frag. */
1913 if (place == NULL)
1914 {
1915 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1916 address_expr,
1917 reloc_type == BFD_RELOC_16_PCREL_S2,
1918 reloc_type);
1919 if (unmatched_hi)
1920 {
1921 struct mips_hi_fixup *hi_fixup;
1922
1923 assert (reloc_type == BFD_RELOC_HI16_S);
1924 hi_fixup = ((struct mips_hi_fixup *)
1925 xmalloc (sizeof (struct mips_hi_fixup)));
1926 hi_fixup->fixp = fixp;
1927 hi_fixup->seg = now_seg;
1928 hi_fixup->next = mips_hi_fixup_list;
1929 mips_hi_fixup_list = hi_fixup;
1930 }
1931 }
1932 }
1933 }
1934
1935 if (! mips_opts.mips16)
1936 md_number_to_chars (f, ip->insn_opcode, 4);
1937 else if (reloc_type == BFD_RELOC_MIPS16_JMP)
1938 {
1939 md_number_to_chars (f, ip->insn_opcode >> 16, 2);
1940 md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
1941 }
1942 else
1943 {
1944 if (ip->use_extend)
1945 {
1946 md_number_to_chars (f, 0xf000 | ip->extend, 2);
1947 f += 2;
1948 }
1949 md_number_to_chars (f, ip->insn_opcode, 2);
1950 }
1951
1952 /* Update the register mask information. */
1953 if (! mips_opts.mips16)
1954 {
1955 if (pinfo & INSN_WRITE_GPR_D)
1956 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
1957 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
1958 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
1959 if (pinfo & INSN_READ_GPR_S)
1960 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
1961 if (pinfo & INSN_WRITE_GPR_31)
1962 mips_gprmask |= 1 << 31;
1963 if (pinfo & INSN_WRITE_FPR_D)
1964 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
1965 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
1966 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
1967 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
1968 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
1969 if ((pinfo & INSN_READ_FPR_R) != 0)
1970 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
1971 if (pinfo & INSN_COP)
1972 {
bdaaa2e1
KH
1973 /* We don't keep enough information to sort these cases out.
1974 The itbl support does keep this information however, although
1975 we currently don't support itbl fprmats as part of the cop
1976 instruction. May want to add this support in the future. */
252b5132
RH
1977 }
1978 /* Never set the bit for $0, which is always zero. */
beae10d5 1979 mips_gprmask &= ~1 << 0;
252b5132
RH
1980 }
1981 else
1982 {
1983 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
1984 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
1985 & MIPS16OP_MASK_RX);
1986 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
1987 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
1988 & MIPS16OP_MASK_RY);
1989 if (pinfo & MIPS16_INSN_WRITE_Z)
1990 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
1991 & MIPS16OP_MASK_RZ);
1992 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
1993 mips_gprmask |= 1 << TREG;
1994 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
1995 mips_gprmask |= 1 << SP;
1996 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
1997 mips_gprmask |= 1 << RA;
1998 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
1999 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2000 if (pinfo & MIPS16_INSN_READ_Z)
2001 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2002 & MIPS16OP_MASK_MOVE32Z);
2003 if (pinfo & MIPS16_INSN_READ_GPR_X)
2004 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2005 & MIPS16OP_MASK_REGR32);
2006 }
2007
2008 if (place == NULL && ! mips_opts.noreorder)
2009 {
2010 /* Filling the branch delay slot is more complex. We try to
2011 switch the branch with the previous instruction, which we can
2012 do if the previous instruction does not set up a condition
2013 that the branch tests and if the branch is not itself the
2014 target of any branch. */
2015 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2016 || (pinfo & INSN_COND_BRANCH_DELAY))
2017 {
2018 if (mips_optimize < 2
2019 /* If we have seen .set volatile or .set nomove, don't
2020 optimize. */
2021 || mips_opts.nomove != 0
2022 /* If we had to emit any NOP instructions, then we
2023 already know we can not swap. */
2024 || nops != 0
2025 /* If we don't even know the previous insn, we can not
bdaaa2e1 2026 swap. */
252b5132
RH
2027 || ! prev_insn_valid
2028 /* If the previous insn is already in a branch delay
2029 slot, then we can not swap. */
2030 || prev_insn_is_delay_slot
2031 /* If the previous previous insn was in a .set
2032 noreorder, we can't swap. Actually, the MIPS
2033 assembler will swap in this situation. However, gcc
2034 configured -with-gnu-as will generate code like
2035 .set noreorder
2036 lw $4,XXX
2037 .set reorder
2038 INSN
2039 bne $4,$0,foo
2040 in which we can not swap the bne and INSN. If gcc is
2041 not configured -with-gnu-as, it does not output the
2042 .set pseudo-ops. We don't have to check
2043 prev_insn_unreordered, because prev_insn_valid will
2044 be 0 in that case. We don't want to use
2045 prev_prev_insn_valid, because we do want to be able
2046 to swap at the start of a function. */
2047 || prev_prev_insn_unreordered
2048 /* If the branch is itself the target of a branch, we
2049 can not swap. We cheat on this; all we check for is
2050 whether there is a label on this instruction. If
2051 there are any branches to anything other than a
2052 label, users must use .set noreorder. */
2053 || insn_labels != NULL
2054 /* If the previous instruction is in a variant frag, we
2055 can not do the swap. This does not apply to the
2056 mips16, which uses variant frags for different
2057 purposes. */
2058 || (! mips_opts.mips16
2059 && prev_insn_frag->fr_type == rs_machine_dependent)
2060 /* If the branch reads the condition codes, we don't
2061 even try to swap, because in the sequence
2062 ctc1 $X,$31
2063 INSN
2064 INSN
2065 bc1t LABEL
2066 we can not swap, and I don't feel like handling that
2067 case. */
2068 || (! mips_opts.mips16
9ce8a5dd 2069 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2070 && (pinfo & INSN_READ_COND_CODE))
2071 /* We can not swap with an instruction that requires a
2072 delay slot, becase the target of the branch might
2073 interfere with that instruction. */
2074 || (! mips_opts.mips16
9ce8a5dd 2075 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132 2076 && (prev_pinfo
bdaaa2e1 2077 /* Itbl support may require additional care here. */
252b5132
RH
2078 & (INSN_LOAD_COPROC_DELAY
2079 | INSN_COPROC_MOVE_DELAY
2080 | INSN_WRITE_COND_CODE)))
2081 || (! (hilo_interlocks
ec68c924 2082 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
2083 && (prev_pinfo
2084 & (INSN_READ_LO
2085 | INSN_READ_HI)))
2086 || (! mips_opts.mips16
2087 && ! gpr_interlocks
2088 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2089 || (! mips_opts.mips16
e7af610e 2090 && mips_opts.isa == ISA_MIPS1
bdaaa2e1 2091 /* Itbl support may require additional care here. */
252b5132
RH
2092 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2093 /* We can not swap with a branch instruction. */
2094 || (prev_pinfo
2095 & (INSN_UNCOND_BRANCH_DELAY
2096 | INSN_COND_BRANCH_DELAY
2097 | INSN_COND_BRANCH_LIKELY))
2098 /* We do not swap with a trap instruction, since it
2099 complicates trap handlers to have the trap
2100 instruction be in a delay slot. */
2101 || (prev_pinfo & INSN_TRAP)
2102 /* If the branch reads a register that the previous
2103 instruction sets, we can not swap. */
2104 || (! mips_opts.mips16
2105 && (prev_pinfo & INSN_WRITE_GPR_T)
2106 && insn_uses_reg (ip,
2107 ((prev_insn.insn_opcode >> OP_SH_RT)
2108 & OP_MASK_RT),
2109 MIPS_GR_REG))
2110 || (! mips_opts.mips16
2111 && (prev_pinfo & INSN_WRITE_GPR_D)
2112 && insn_uses_reg (ip,
2113 ((prev_insn.insn_opcode >> OP_SH_RD)
2114 & OP_MASK_RD),
2115 MIPS_GR_REG))
2116 || (mips_opts.mips16
2117 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2118 && insn_uses_reg (ip,
2119 ((prev_insn.insn_opcode
2120 >> MIPS16OP_SH_RX)
2121 & MIPS16OP_MASK_RX),
2122 MIPS16_REG))
2123 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2124 && insn_uses_reg (ip,
2125 ((prev_insn.insn_opcode
2126 >> MIPS16OP_SH_RY)
2127 & MIPS16OP_MASK_RY),
2128 MIPS16_REG))
2129 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2130 && insn_uses_reg (ip,
2131 ((prev_insn.insn_opcode
2132 >> MIPS16OP_SH_RZ)
2133 & MIPS16OP_MASK_RZ),
2134 MIPS16_REG))
2135 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2136 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2137 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2138 && insn_uses_reg (ip, RA, MIPS_GR_REG))
2139 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2140 && insn_uses_reg (ip,
2141 MIPS16OP_EXTRACT_REG32R (prev_insn.
2142 insn_opcode),
2143 MIPS_GR_REG))))
2144 /* If the branch writes a register that the previous
2145 instruction sets, we can not swap (we know that
2146 branches write only to RD or to $31). */
2147 || (! mips_opts.mips16
2148 && (prev_pinfo & INSN_WRITE_GPR_T)
2149 && (((pinfo & INSN_WRITE_GPR_D)
2150 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2151 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2152 || ((pinfo & INSN_WRITE_GPR_31)
2153 && (((prev_insn.insn_opcode >> OP_SH_RT)
2154 & OP_MASK_RT)
2155 == 31))))
2156 || (! mips_opts.mips16
2157 && (prev_pinfo & INSN_WRITE_GPR_D)
2158 && (((pinfo & INSN_WRITE_GPR_D)
2159 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2160 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2161 || ((pinfo & INSN_WRITE_GPR_31)
2162 && (((prev_insn.insn_opcode >> OP_SH_RD)
2163 & OP_MASK_RD)
2164 == 31))))
2165 || (mips_opts.mips16
2166 && (pinfo & MIPS16_INSN_WRITE_31)
2167 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2168 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2169 && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2170 == RA))))
2171 /* If the branch writes a register that the previous
2172 instruction reads, we can not swap (we know that
2173 branches only write to RD or to $31). */
2174 || (! mips_opts.mips16
2175 && (pinfo & INSN_WRITE_GPR_D)
2176 && insn_uses_reg (&prev_insn,
2177 ((ip->insn_opcode >> OP_SH_RD)
2178 & OP_MASK_RD),
2179 MIPS_GR_REG))
2180 || (! mips_opts.mips16
2181 && (pinfo & INSN_WRITE_GPR_31)
2182 && insn_uses_reg (&prev_insn, 31, MIPS_GR_REG))
2183 || (mips_opts.mips16
2184 && (pinfo & MIPS16_INSN_WRITE_31)
2185 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2186 /* If we are generating embedded PIC code, the branch
2187 might be expanded into a sequence which uses $at, so
2188 we can't swap with an instruction which reads it. */
2189 || (mips_pic == EMBEDDED_PIC
2190 && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2191 /* If the previous previous instruction has a load
2192 delay, and sets a register that the branch reads, we
2193 can not swap. */
2194 || (! mips_opts.mips16
9ce8a5dd 2195 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
bdaaa2e1 2196 /* Itbl support may require additional care here. */
252b5132
RH
2197 && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2198 || (! gpr_interlocks
2199 && (prev_prev_insn.insn_mo->pinfo
2200 & INSN_LOAD_MEMORY_DELAY)))
2201 && insn_uses_reg (ip,
2202 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2203 & OP_MASK_RT),
2204 MIPS_GR_REG))
2205 /* If one instruction sets a condition code and the
2206 other one uses a condition code, we can not swap. */
2207 || ((pinfo & INSN_READ_COND_CODE)
2208 && (prev_pinfo & INSN_WRITE_COND_CODE))
2209 || ((pinfo & INSN_WRITE_COND_CODE)
2210 && (prev_pinfo & INSN_READ_COND_CODE))
2211 /* If the previous instruction uses the PC, we can not
2212 swap. */
2213 || (mips_opts.mips16
2214 && (prev_pinfo & MIPS16_INSN_READ_PC))
2215 /* If the previous instruction was extended, we can not
2216 swap. */
2217 || (mips_opts.mips16 && prev_insn_extended)
2218 /* If the previous instruction had a fixup in mips16
2219 mode, we can not swap. This normally means that the
2220 previous instruction was a 4 byte branch anyhow. */
2221 || (mips_opts.mips16 && prev_insn_fixp)
bdaaa2e1
KH
2222 /* If the previous instruction is a sync, sync.l, or
2223 sync.p, we can not swap. */
f173e82e 2224 || (prev_pinfo & INSN_SYNC))
252b5132
RH
2225 {
2226 /* We could do even better for unconditional branches to
2227 portions of this object file; we could pick up the
2228 instruction at the destination, put it in the delay
2229 slot, and bump the destination address. */
2230 emit_nop ();
2231 /* Update the previous insn information. */
2232 prev_prev_insn = *ip;
2233 prev_insn.insn_mo = &dummy_opcode;
2234 }
2235 else
2236 {
2237 /* It looks like we can actually do the swap. */
2238 if (! mips_opts.mips16)
2239 {
2240 char *prev_f;
2241 char temp[4];
2242
2243 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2244 memcpy (temp, prev_f, 4);
2245 memcpy (prev_f, f, 4);
2246 memcpy (f, temp, 4);
2247 if (prev_insn_fixp)
2248 {
2249 prev_insn_fixp->fx_frag = frag_now;
2250 prev_insn_fixp->fx_where = f - frag_now->fr_literal;
2251 }
2252 if (fixp)
2253 {
2254 fixp->fx_frag = prev_insn_frag;
2255 fixp->fx_where = prev_insn_where;
2256 }
2257 }
2258 else
2259 {
2260 char *prev_f;
2261 char temp[2];
2262
2263 assert (prev_insn_fixp == NULL);
2264 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2265 memcpy (temp, prev_f, 2);
2266 memcpy (prev_f, f, 2);
2267 if (reloc_type != BFD_RELOC_MIPS16_JMP)
2268 {
2269 assert (reloc_type == BFD_RELOC_UNUSED);
2270 memcpy (f, temp, 2);
2271 }
2272 else
2273 {
2274 memcpy (f, f + 2, 2);
2275 memcpy (f + 2, temp, 2);
2276 }
2277 if (fixp)
2278 {
2279 fixp->fx_frag = prev_insn_frag;
2280 fixp->fx_where = prev_insn_where;
2281 }
2282 }
2283
2284 /* Update the previous insn information; leave prev_insn
2285 unchanged. */
2286 prev_prev_insn = *ip;
2287 }
2288 prev_insn_is_delay_slot = 1;
2289
2290 /* If that was an unconditional branch, forget the previous
2291 insn information. */
2292 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2293 {
2294 prev_prev_insn.insn_mo = &dummy_opcode;
2295 prev_insn.insn_mo = &dummy_opcode;
2296 }
2297
2298 prev_insn_fixp = NULL;
2299 prev_insn_reloc_type = BFD_RELOC_UNUSED;
2300 prev_insn_extended = 0;
2301 }
2302 else if (pinfo & INSN_COND_BRANCH_LIKELY)
2303 {
2304 /* We don't yet optimize a branch likely. What we should do
2305 is look at the target, copy the instruction found there
2306 into the delay slot, and increment the branch to jump to
2307 the next instruction. */
2308 emit_nop ();
2309 /* Update the previous insn information. */
2310 prev_prev_insn = *ip;
2311 prev_insn.insn_mo = &dummy_opcode;
2312 prev_insn_fixp = NULL;
2313 prev_insn_reloc_type = BFD_RELOC_UNUSED;
2314 prev_insn_extended = 0;
2315 }
2316 else
2317 {
2318 /* Update the previous insn information. */
2319 if (nops > 0)
2320 prev_prev_insn.insn_mo = &dummy_opcode;
2321 else
2322 prev_prev_insn = prev_insn;
2323 prev_insn = *ip;
2324
2325 /* Any time we see a branch, we always fill the delay slot
2326 immediately; since this insn is not a branch, we know it
2327 is not in a delay slot. */
2328 prev_insn_is_delay_slot = 0;
2329
2330 prev_insn_fixp = fixp;
2331 prev_insn_reloc_type = reloc_type;
2332 if (mips_opts.mips16)
2333 prev_insn_extended = (ip->use_extend
2334 || reloc_type > BFD_RELOC_UNUSED);
2335 }
2336
2337 prev_prev_insn_unreordered = prev_insn_unreordered;
2338 prev_insn_unreordered = 0;
2339 prev_insn_frag = frag_now;
2340 prev_insn_where = f - frag_now->fr_literal;
2341 prev_insn_valid = 1;
2342 }
2343 else if (place == NULL)
2344 {
2345 /* We need to record a bit of information even when we are not
2346 reordering, in order to determine the base address for mips16
2347 PC relative relocs. */
2348 prev_prev_insn = prev_insn;
2349 prev_insn = *ip;
2350 prev_insn_reloc_type = reloc_type;
2351 prev_prev_insn_unreordered = prev_insn_unreordered;
2352 prev_insn_unreordered = 1;
2353 }
2354
2355 /* We just output an insn, so the next one doesn't have a label. */
2356 mips_clear_insn_labels ();
2357
2358 /* We must ensure that a fixup associated with an unmatched %hi
2359 reloc does not become a variant frag. Otherwise, the
2360 rearrangement of %hi relocs in frob_file may confuse
2361 tc_gen_reloc. */
2362 if (unmatched_hi)
2363 {
2364 frag_wane (frag_now);
2365 frag_new (0);
2366 }
2367}
2368
2369/* This function forgets that there was any previous instruction or
2370 label. If PRESERVE is non-zero, it remembers enough information to
bdaaa2e1 2371 know whether nops are needed before a noreorder section. */
252b5132
RH
2372
2373static void
2374mips_no_prev_insn (preserve)
2375 int preserve;
2376{
2377 if (! preserve)
2378 {
2379 prev_insn.insn_mo = &dummy_opcode;
2380 prev_prev_insn.insn_mo = &dummy_opcode;
2381 prev_nop_frag = NULL;
2382 prev_nop_frag_holds = 0;
2383 prev_nop_frag_required = 0;
2384 prev_nop_frag_since = 0;
2385 }
2386 prev_insn_valid = 0;
2387 prev_insn_is_delay_slot = 0;
2388 prev_insn_unreordered = 0;
2389 prev_insn_extended = 0;
2390 prev_insn_reloc_type = BFD_RELOC_UNUSED;
2391 prev_prev_insn_unreordered = 0;
2392 mips_clear_insn_labels ();
2393}
2394
2395/* This function must be called whenever we turn on noreorder or emit
2396 something other than instructions. It inserts any NOPS which might
2397 be needed by the previous instruction, and clears the information
2398 kept for the previous instructions. The INSNS parameter is true if
bdaaa2e1 2399 instructions are to follow. */
252b5132
RH
2400
2401static void
2402mips_emit_delays (insns)
2403 boolean insns;
2404{
2405 if (! mips_opts.noreorder)
2406 {
2407 int nops;
2408
2409 nops = 0;
2410 if ((! mips_opts.mips16
9ce8a5dd 2411 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2412 && (! cop_interlocks
2413 && (prev_insn.insn_mo->pinfo
2414 & (INSN_LOAD_COPROC_DELAY
2415 | INSN_COPROC_MOVE_DELAY
2416 | INSN_WRITE_COND_CODE))))
2417 || (! hilo_interlocks
2418 && (prev_insn.insn_mo->pinfo
2419 & (INSN_READ_LO
2420 | INSN_READ_HI)))
2421 || (! mips_opts.mips16
2422 && ! gpr_interlocks
bdaaa2e1 2423 && (prev_insn.insn_mo->pinfo
252b5132
RH
2424 & INSN_LOAD_MEMORY_DELAY))
2425 || (! mips_opts.mips16
e7af610e 2426 && mips_opts.isa == ISA_MIPS1
252b5132
RH
2427 && (prev_insn.insn_mo->pinfo
2428 & INSN_COPROC_MEMORY_DELAY)))
2429 {
beae10d5 2430 /* Itbl support may require additional care here. */
252b5132
RH
2431 ++nops;
2432 if ((! mips_opts.mips16
9ce8a5dd 2433 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2434 && (! cop_interlocks
2435 && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2436 || (! hilo_interlocks
2437 && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2438 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2439 ++nops;
2440
2441 if (prev_insn_unreordered)
2442 nops = 0;
2443 }
2444 else if ((! mips_opts.mips16
9ce8a5dd 2445 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2446 && (! cop_interlocks
2447 && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2448 || (! hilo_interlocks
2449 && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2450 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2451 {
beae10d5 2452 /* Itbl support may require additional care here. */
252b5132
RH
2453 if (! prev_prev_insn_unreordered)
2454 ++nops;
2455 }
2456
2457 if (nops > 0)
2458 {
2459 struct insn_label_list *l;
2460
2461 if (insns)
2462 {
2463 /* Record the frag which holds the nop instructions, so
2464 that we can remove them if we don't need them. */
2465 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2466 prev_nop_frag = frag_now;
2467 prev_nop_frag_holds = nops;
2468 prev_nop_frag_required = 0;
2469 prev_nop_frag_since = 0;
2470 }
2471
2472 for (; nops > 0; --nops)
2473 emit_nop ();
2474
2475 if (insns)
2476 {
2477 /* Move on to a new frag, so that it is safe to simply
bdaaa2e1 2478 decrease the size of prev_nop_frag. */
252b5132
RH
2479 frag_wane (frag_now);
2480 frag_new (0);
2481 }
2482
2483 for (l = insn_labels; l != NULL; l = l->next)
2484 {
98aa84af
AM
2485 valueT val;
2486
252b5132 2487 assert (S_GET_SEGMENT (l->label) == now_seg);
49309057 2488 symbol_set_frag (l->label, frag_now);
98aa84af 2489 val = (valueT) frag_now_fix ();
252b5132
RH
2490 /* mips16 text labels are stored as odd. */
2491 if (mips_opts.mips16)
98aa84af
AM
2492 val += 1;
2493 S_SET_VALUE (l->label, val);
252b5132
RH
2494 }
2495 }
2496 }
2497
2498 /* Mark instruction labels in mips16 mode. */
2499 if (mips_opts.mips16 && insns)
2500 mips16_mark_labels ();
2501
2502 mips_no_prev_insn (insns);
2503}
2504
2505/* Build an instruction created by a macro expansion. This is passed
2506 a pointer to the count of instructions created so far, an
2507 expression, the name of the instruction to build, an operand format
2508 string, and corresponding arguments. */
2509
2510#ifdef USE_STDARG
2511static void
2512macro_build (char *place,
2513 int *counter,
2514 expressionS * ep,
2515 const char *name,
2516 const char *fmt,
2517 ...)
2518#else
2519static void
2520macro_build (place, counter, ep, name, fmt, va_alist)
2521 char *place;
2522 int *counter;
2523 expressionS *ep;
2524 const char *name;
2525 const char *fmt;
2526 va_dcl
2527#endif
2528{
2529 struct mips_cl_insn insn;
2530 bfd_reloc_code_real_type r;
2531 va_list args;
252b5132
RH
2532
2533#ifdef USE_STDARG
2534 va_start (args, fmt);
2535#else
2536 va_start (args);
2537#endif
2538
2539 /*
2540 * If the macro is about to expand into a second instruction,
2541 * print a warning if needed. We need to pass ip as a parameter
2542 * to generate a better warning message here...
2543 */
2544 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2545 as_warn (_("Macro instruction expanded into multiple instructions"));
2546
2547 if (place == NULL)
2548 *counter += 1; /* bump instruction counter */
2549
2550 if (mips_opts.mips16)
2551 {
2552 mips16_macro_build (place, counter, ep, name, fmt, args);
2553 va_end (args);
2554 return;
2555 }
2556
2557 r = BFD_RELOC_UNUSED;
2558 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2559 assert (insn.insn_mo);
2560 assert (strcmp (name, insn.insn_mo->name) == 0);
2561
2562 /* Search until we get a match for NAME. */
2563 while (1)
2564 {
252b5132
RH
2565 if (strcmp (fmt, insn.insn_mo->args) == 0
2566 && insn.insn_mo->pinfo != INSN_MACRO
ea1fb5dc 2567 && OPCODE_IS_MEMBER (insn.insn_mo, mips_opts.isa, mips_arch)
ec68c924 2568 && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
252b5132
RH
2569 break;
2570
2571 ++insn.insn_mo;
2572 assert (insn.insn_mo->name);
2573 assert (strcmp (name, insn.insn_mo->name) == 0);
2574 }
2575
2576 insn.insn_opcode = insn.insn_mo->match;
2577 for (;;)
2578 {
2579 switch (*fmt++)
2580 {
2581 case '\0':
2582 break;
2583
2584 case ',':
2585 case '(':
2586 case ')':
2587 continue;
2588
2589 case 't':
2590 case 'w':
2591 case 'E':
38487616 2592 insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
252b5132
RH
2593 continue;
2594
2595 case 'c':
38487616
TS
2596 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
2597 continue;
2598
252b5132
RH
2599 case 'T':
2600 case 'W':
38487616 2601 insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
252b5132
RH
2602 continue;
2603
2604 case 'd':
2605 case 'G':
38487616 2606 insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
252b5132
RH
2607 continue;
2608
4372b673
NC
2609 case 'U':
2610 {
2611 int tmp = va_arg (args, int);
2612
38487616
TS
2613 insn.insn_opcode |= tmp << OP_SH_RT;
2614 insn.insn_opcode |= tmp << OP_SH_RD;
beae10d5 2615 continue;
4372b673
NC
2616 }
2617
252b5132
RH
2618 case 'V':
2619 case 'S':
38487616 2620 insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
252b5132
RH
2621 continue;
2622
2623 case 'z':
2624 continue;
2625
2626 case '<':
38487616 2627 insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
252b5132
RH
2628 continue;
2629
2630 case 'D':
38487616 2631 insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
252b5132
RH
2632 continue;
2633
2634 case 'B':
38487616 2635 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
252b5132
RH
2636 continue;
2637
4372b673 2638 case 'J':
38487616 2639 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
4372b673
NC
2640 continue;
2641
252b5132 2642 case 'q':
38487616 2643 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
252b5132
RH
2644 continue;
2645
2646 case 'b':
2647 case 's':
2648 case 'r':
2649 case 'v':
38487616 2650 insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
252b5132
RH
2651 continue;
2652
2653 case 'i':
2654 case 'j':
2655 case 'o':
2656 r = (bfd_reloc_code_real_type) va_arg (args, int);
2657 assert (r == BFD_RELOC_MIPS_GPREL
2658 || r == BFD_RELOC_MIPS_LITERAL
2659 || r == BFD_RELOC_LO16
2660 || r == BFD_RELOC_MIPS_GOT16
2661 || r == BFD_RELOC_MIPS_CALL16
2662 || r == BFD_RELOC_MIPS_GOT_LO16
2663 || r == BFD_RELOC_MIPS_CALL_LO16
2664 || (ep->X_op == O_subtract
252b5132
RH
2665 && r == BFD_RELOC_PCREL_LO16));
2666 continue;
2667
2668 case 'u':
2669 r = (bfd_reloc_code_real_type) va_arg (args, int);
2670 assert (ep != NULL
2671 && (ep->X_op == O_constant
2672 || (ep->X_op == O_symbol
2673 && (r == BFD_RELOC_HI16_S
2674 || r == BFD_RELOC_HI16
2675 || r == BFD_RELOC_MIPS_GOT_HI16
2676 || r == BFD_RELOC_MIPS_CALL_HI16))
2677 || (ep->X_op == O_subtract
252b5132
RH
2678 && r == BFD_RELOC_PCREL_HI16_S)));
2679 if (ep->X_op == O_constant)
2680 {
2681 insn.insn_opcode |= (ep->X_add_number >> 16) & 0xffff;
2682 ep = NULL;
2683 r = BFD_RELOC_UNUSED;
2684 }
2685 continue;
2686
2687 case 'p':
2688 assert (ep != NULL);
2689 /*
2690 * This allows macro() to pass an immediate expression for
2691 * creating short branches without creating a symbol.
2692 * Note that the expression still might come from the assembly
2693 * input, in which case the value is not checked for range nor
2694 * is a relocation entry generated (yuck).
2695 */
2696 if (ep->X_op == O_constant)
2697 {
2698 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
2699 ep = NULL;
2700 }
2701 else
2702 r = BFD_RELOC_16_PCREL_S2;
2703 continue;
2704
2705 case 'a':
2706 assert (ep != NULL);
2707 r = BFD_RELOC_MIPS_JMP;
2708 continue;
2709
2710 case 'C':
2711 insn.insn_opcode |= va_arg (args, unsigned long);
2712 continue;
2713
2714 default:
2715 internalError ();
2716 }
2717 break;
2718 }
2719 va_end (args);
2720 assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
2721
2722 append_insn (place, &insn, ep, r, false);
2723}
2724
2725static void
2726mips16_macro_build (place, counter, ep, name, fmt, args)
2727 char *place;
43841e91 2728 int *counter ATTRIBUTE_UNUSED;
252b5132
RH
2729 expressionS *ep;
2730 const char *name;
2731 const char *fmt;
2732 va_list args;
2733{
2734 struct mips_cl_insn insn;
2735 bfd_reloc_code_real_type r;
2736
2737 r = BFD_RELOC_UNUSED;
2738 insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
2739 assert (insn.insn_mo);
2740 assert (strcmp (name, insn.insn_mo->name) == 0);
2741
2742 while (strcmp (fmt, insn.insn_mo->args) != 0
2743 || insn.insn_mo->pinfo == INSN_MACRO)
2744 {
2745 ++insn.insn_mo;
2746 assert (insn.insn_mo->name);
2747 assert (strcmp (name, insn.insn_mo->name) == 0);
2748 }
2749
2750 insn.insn_opcode = insn.insn_mo->match;
2751 insn.use_extend = false;
2752
2753 for (;;)
2754 {
2755 int c;
2756
2757 c = *fmt++;
2758 switch (c)
2759 {
2760 case '\0':
2761 break;
2762
2763 case ',':
2764 case '(':
2765 case ')':
2766 continue;
2767
2768 case 'y':
2769 case 'w':
2770 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
2771 continue;
2772
2773 case 'x':
2774 case 'v':
2775 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
2776 continue;
2777
2778 case 'z':
2779 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
2780 continue;
2781
2782 case 'Z':
2783 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
2784 continue;
2785
2786 case '0':
2787 case 'S':
2788 case 'P':
2789 case 'R':
2790 continue;
2791
2792 case 'X':
2793 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
2794 continue;
2795
2796 case 'Y':
2797 {
2798 int regno;
2799
2800 regno = va_arg (args, int);
2801 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
2802 insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
2803 }
2804 continue;
2805
2806 case '<':
2807 case '>':
2808 case '4':
2809 case '5':
2810 case 'H':
2811 case 'W':
2812 case 'D':
2813 case 'j':
2814 case '8':
2815 case 'V':
2816 case 'C':
2817 case 'U':
2818 case 'k':
2819 case 'K':
2820 case 'p':
2821 case 'q':
2822 {
2823 assert (ep != NULL);
2824
2825 if (ep->X_op != O_constant)
2826 r = BFD_RELOC_UNUSED + c;
2827 else
2828 {
2829 mips16_immed ((char *) NULL, 0, c, ep->X_add_number, false,
2830 false, false, &insn.insn_opcode,
2831 &insn.use_extend, &insn.extend);
2832 ep = NULL;
2833 r = BFD_RELOC_UNUSED;
2834 }
2835 }
2836 continue;
2837
2838 case '6':
2839 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
2840 continue;
2841 }
2842
2843 break;
2844 }
2845
2846 assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
2847
2848 append_insn (place, &insn, ep, r, false);
2849}
2850
2851/*
2852 * Generate a "lui" instruction.
2853 */
2854static void
2855macro_build_lui (place, counter, ep, regnum)
2856 char *place;
2857 int *counter;
2858 expressionS *ep;
2859 int regnum;
2860{
2861 expressionS high_expr;
2862 struct mips_cl_insn insn;
2863 bfd_reloc_code_real_type r;
2864 CONST char *name = "lui";
2865 CONST char *fmt = "t,u";
2866
2867 assert (! mips_opts.mips16);
2868
2869 if (place == NULL)
2870 high_expr = *ep;
2871 else
2872 {
2873 high_expr.X_op = O_constant;
2874 high_expr.X_add_number = ep->X_add_number;
2875 }
2876
2877 if (high_expr.X_op == O_constant)
2878 {
2879 /* we can compute the instruction now without a relocation entry */
e7d556df
TS
2880 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
2881 >> 16) & 0xffff;
252b5132
RH
2882 r = BFD_RELOC_UNUSED;
2883 }
2884 else
2885 {
2886 assert (ep->X_op == O_symbol);
2887 /* _gp_disp is a special case, used from s_cpload. */
2888 assert (mips_pic == NO_PIC
2889 || strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0);
2890 r = BFD_RELOC_HI16_S;
2891 }
2892
2893 /*
2894 * If the macro is about to expand into a second instruction,
2895 * print a warning if needed. We need to pass ip as a parameter
2896 * to generate a better warning message here...
2897 */
2898 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2899 as_warn (_("Macro instruction expanded into multiple instructions"));
2900
2901 if (place == NULL)
2902 *counter += 1; /* bump instruction counter */
2903
2904 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2905 assert (insn.insn_mo);
2906 assert (strcmp (name, insn.insn_mo->name) == 0);
2907 assert (strcmp (fmt, insn.insn_mo->args) == 0);
2908
2909 insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
2910 if (r == BFD_RELOC_UNUSED)
2911 {
2912 insn.insn_opcode |= high_expr.X_add_number;
2913 append_insn (place, &insn, NULL, r, false);
2914 }
2915 else
2916 append_insn (place, &insn, &high_expr, r, false);
2917}
2918
2919/* set_at()
2920 * Generates code to set the $at register to true (one)
2921 * if reg is less than the immediate expression.
2922 */
2923static void
2924set_at (counter, reg, unsignedp)
2925 int *counter;
2926 int reg;
2927 int unsignedp;
2928{
2929 if (imm_expr.X_op == O_constant
2930 && imm_expr.X_add_number >= -0x8000
2931 && imm_expr.X_add_number < 0x8000)
2932 macro_build ((char *) NULL, counter, &imm_expr,
2933 unsignedp ? "sltiu" : "slti",
2934 "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
2935 else
2936 {
2937 load_register (counter, AT, &imm_expr, 0);
2938 macro_build ((char *) NULL, counter, NULL,
2939 unsignedp ? "sltu" : "slt",
2940 "d,v,t", AT, reg, AT);
2941 }
2942}
2943
2944/* Warn if an expression is not a constant. */
2945
2946static void
2947check_absolute_expr (ip, ex)
2948 struct mips_cl_insn *ip;
2949 expressionS *ex;
2950{
2951 if (ex->X_op == O_big)
2952 as_bad (_("unsupported large constant"));
2953 else if (ex->X_op != O_constant)
2954 as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
2955}
2956
2957/* Count the leading zeroes by performing a binary chop. This is a
2958 bulky bit of source, but performance is a LOT better for the
2959 majority of values than a simple loop to count the bits:
2960 for (lcnt = 0; (lcnt < 32); lcnt++)
2961 if ((v) & (1 << (31 - lcnt)))
2962 break;
2963 However it is not code size friendly, and the gain will drop a bit
2964 on certain cached systems.
2965*/
2966#define COUNT_TOP_ZEROES(v) \
2967 (((v) & ~0xffff) == 0 \
2968 ? ((v) & ~0xff) == 0 \
2969 ? ((v) & ~0xf) == 0 \
2970 ? ((v) & ~0x3) == 0 \
2971 ? ((v) & ~0x1) == 0 \
2972 ? !(v) \
2973 ? 32 \
2974 : 31 \
2975 : 30 \
2976 : ((v) & ~0x7) == 0 \
2977 ? 29 \
2978 : 28 \
2979 : ((v) & ~0x3f) == 0 \
2980 ? ((v) & ~0x1f) == 0 \
2981 ? 27 \
2982 : 26 \
2983 : ((v) & ~0x7f) == 0 \
2984 ? 25 \
2985 : 24 \
2986 : ((v) & ~0xfff) == 0 \
2987 ? ((v) & ~0x3ff) == 0 \
2988 ? ((v) & ~0x1ff) == 0 \
2989 ? 23 \
2990 : 22 \
2991 : ((v) & ~0x7ff) == 0 \
2992 ? 21 \
2993 : 20 \
2994 : ((v) & ~0x3fff) == 0 \
2995 ? ((v) & ~0x1fff) == 0 \
2996 ? 19 \
2997 : 18 \
2998 : ((v) & ~0x7fff) == 0 \
2999 ? 17 \
3000 : 16 \
3001 : ((v) & ~0xffffff) == 0 \
3002 ? ((v) & ~0xfffff) == 0 \
3003 ? ((v) & ~0x3ffff) == 0 \
3004 ? ((v) & ~0x1ffff) == 0 \
3005 ? 15 \
3006 : 14 \
3007 : ((v) & ~0x7ffff) == 0 \
3008 ? 13 \
3009 : 12 \
3010 : ((v) & ~0x3fffff) == 0 \
3011 ? ((v) & ~0x1fffff) == 0 \
3012 ? 11 \
3013 : 10 \
3014 : ((v) & ~0x7fffff) == 0 \
3015 ? 9 \
3016 : 8 \
3017 : ((v) & ~0xfffffff) == 0 \
3018 ? ((v) & ~0x3ffffff) == 0 \
3019 ? ((v) & ~0x1ffffff) == 0 \
3020 ? 7 \
3021 : 6 \
3022 : ((v) & ~0x7ffffff) == 0 \
3023 ? 5 \
3024 : 4 \
3025 : ((v) & ~0x3fffffff) == 0 \
3026 ? ((v) & ~0x1fffffff) == 0 \
3027 ? 3 \
3028 : 2 \
3029 : ((v) & ~0x7fffffff) == 0 \
3030 ? 1 \
3031 : 0)
3032
3033/* load_register()
3034 * This routine generates the least number of instructions neccessary to load
3035 * an absolute expression value into a register.
3036 */
3037static void
3038load_register (counter, reg, ep, dbl)
3039 int *counter;
3040 int reg;
3041 expressionS *ep;
3042 int dbl;
3043{
3044 int freg;
3045 expressionS hi32, lo32;
3046
3047 if (ep->X_op != O_big)
3048 {
3049 assert (ep->X_op == O_constant);
3050 if (ep->X_add_number < 0x8000
3051 && (ep->X_add_number >= 0
3052 || (ep->X_add_number >= -0x8000
3053 && (! dbl
3054 || ! ep->X_unsigned
3055 || sizeof (ep->X_add_number) > 4))))
3056 {
3057 /* We can handle 16 bit signed values with an addiu to
3058 $zero. No need to ever use daddiu here, since $zero and
3059 the result are always correct in 32 bit mode. */
3060 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3061 (int) BFD_RELOC_LO16);
3062 return;
3063 }
3064 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3065 {
3066 /* We can handle 16 bit unsigned values with an ori to
3067 $zero. */
3068 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3069 (int) BFD_RELOC_LO16);
3070 return;
3071 }
3072 else if ((((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0
3073 || ((ep->X_add_number &~ (offsetT) 0x7fffffff)
3074 == ~ (offsetT) 0x7fffffff))
3075 && (! dbl
3076 || ! ep->X_unsigned
3077 || sizeof (ep->X_add_number) > 4
3078 || (ep->X_add_number & 0x80000000) == 0))
ca4e0257 3079 || ((HAVE_32BIT_GPRS || ! dbl)
252b5132 3080 && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
ca4e0257 3081 || (HAVE_32BIT_GPRS
252b5132
RH
3082 && ! dbl
3083 && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3084 == ~ (offsetT) 0xffffffff)))
3085 {
3086 /* 32 bit values require an lui. */
3087 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3088 (int) BFD_RELOC_HI16);
3089 if ((ep->X_add_number & 0xffff) != 0)
3090 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3091 (int) BFD_RELOC_LO16);
3092 return;
3093 }
3094 }
3095
3096 /* The value is larger than 32 bits. */
3097
ca4e0257 3098 if (HAVE_32BIT_GPRS)
252b5132
RH
3099 {
3100 as_bad (_("Number larger than 32 bits"));
3101 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3102 (int) BFD_RELOC_LO16);
3103 return;
3104 }
3105
3106 if (ep->X_op != O_big)
3107 {
3108 hi32 = *ep;
3109 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3110 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3111 hi32.X_add_number &= 0xffffffff;
3112 lo32 = *ep;
3113 lo32.X_add_number &= 0xffffffff;
3114 }
3115 else
3116 {
3117 assert (ep->X_add_number > 2);
3118 if (ep->X_add_number == 3)
3119 generic_bignum[3] = 0;
3120 else if (ep->X_add_number > 4)
3121 as_bad (_("Number larger than 64 bits"));
3122 lo32.X_op = O_constant;
3123 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3124 hi32.X_op = O_constant;
3125 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3126 }
3127
3128 if (hi32.X_add_number == 0)
3129 freg = 0;
3130 else
3131 {
3132 int shift, bit;
3133 unsigned long hi, lo;
3134
3135 if (hi32.X_add_number == 0xffffffff)
beae10d5
KH
3136 {
3137 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3138 {
3139 macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
252b5132 3140 reg, 0, (int) BFD_RELOC_LO16);
beae10d5
KH
3141 return;
3142 }
3143 if (lo32.X_add_number & 0x80000000)
3144 {
3145 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3146 (int) BFD_RELOC_HI16);
252b5132
RH
3147 if (lo32.X_add_number & 0xffff)
3148 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3149 reg, reg, (int) BFD_RELOC_LO16);
beae10d5
KH
3150 return;
3151 }
3152 }
252b5132
RH
3153
3154 /* Check for 16bit shifted constant. We know that hi32 is
3155 non-zero, so start the mask on the first bit of the hi32
3156 value. */
3157 shift = 17;
3158 do
beae10d5
KH
3159 {
3160 unsigned long himask, lomask;
3161
3162 if (shift < 32)
3163 {
3164 himask = 0xffff >> (32 - shift);
3165 lomask = (0xffff << shift) & 0xffffffff;
3166 }
3167 else
3168 {
3169 himask = 0xffff << (shift - 32);
3170 lomask = 0;
3171 }
3172 if ((hi32.X_add_number & ~(offsetT) himask) == 0
3173 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3174 {
3175 expressionS tmp;
3176
3177 tmp.X_op = O_constant;
3178 if (shift < 32)
3179 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3180 | (lo32.X_add_number >> shift));
3181 else
3182 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3183 macro_build ((char *) NULL, counter, &tmp,
3184 "ori", "t,r,i", reg, 0,
3185 (int) BFD_RELOC_LO16);
3186 macro_build ((char *) NULL, counter, NULL,
3187 (shift >= 32) ? "dsll32" : "dsll",
3188 "d,w,<", reg, reg,
3189 (shift >= 32) ? shift - 32 : shift);
3190 return;
3191 }
3192 shift++;
3193 }
3194 while (shift <= (64 - 16));
252b5132
RH
3195
3196 /* Find the bit number of the lowest one bit, and store the
3197 shifted value in hi/lo. */
3198 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3199 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3200 if (lo != 0)
3201 {
3202 bit = 0;
3203 while ((lo & 1) == 0)
3204 {
3205 lo >>= 1;
3206 ++bit;
3207 }
3208 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3209 hi >>= bit;
3210 }
3211 else
3212 {
3213 bit = 32;
3214 while ((hi & 1) == 0)
3215 {
3216 hi >>= 1;
3217 ++bit;
3218 }
3219 lo = hi;
3220 hi = 0;
3221 }
3222
3223 /* Optimize if the shifted value is a (power of 2) - 1. */
3224 if ((hi == 0 && ((lo + 1) & lo) == 0)
3225 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
beae10d5
KH
3226 {
3227 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
252b5132 3228 if (shift != 0)
beae10d5 3229 {
252b5132
RH
3230 expressionS tmp;
3231
3232 /* This instruction will set the register to be all
3233 ones. */
beae10d5
KH
3234 tmp.X_op = O_constant;
3235 tmp.X_add_number = (offsetT) -1;
3236 macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
252b5132 3237 reg, 0, (int) BFD_RELOC_LO16);
beae10d5
KH
3238 if (bit != 0)
3239 {
3240 bit += shift;
3241 macro_build ((char *) NULL, counter, NULL,
3242 (bit >= 32) ? "dsll32" : "dsll",
3243 "d,w,<", reg, reg,
3244 (bit >= 32) ? bit - 32 : bit);
3245 }
3246 macro_build ((char *) NULL, counter, NULL,
252b5132 3247 (shift >= 32) ? "dsrl32" : "dsrl",
beae10d5 3248 "d,w,<", reg, reg,
252b5132 3249 (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
3250 return;
3251 }
3252 }
252b5132
RH
3253
3254 /* Sign extend hi32 before calling load_register, because we can
3255 generally get better code when we load a sign extended value. */
3256 if ((hi32.X_add_number & 0x80000000) != 0)
beae10d5 3257 hi32.X_add_number |= ~(offsetT) 0xffffffff;
252b5132
RH
3258 load_register (counter, reg, &hi32, 0);
3259 freg = reg;
3260 }
3261 if ((lo32.X_add_number & 0xffff0000) == 0)
3262 {
3263 if (freg != 0)
3264 {
3265 macro_build ((char *) NULL, counter, NULL, "dsll32", "d,w,<", reg,
3266 freg, 0);
3267 freg = reg;
3268 }
3269 }
3270 else
3271 {
3272 expressionS mid16;
3273
3274 if ((freg == 0) && (lo32.X_add_number == 0xffffffff))
beae10d5 3275 {
252b5132
RH
3276 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3277 (int) BFD_RELOC_HI16);
beae10d5
KH
3278 macro_build ((char *) NULL, counter, NULL, "dsrl32", "d,w,<", reg,
3279 reg, 0);
3280 return;
3281 }
252b5132
RH
3282
3283 if (freg != 0)
3284 {
3285 macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
3286 freg, 16);
3287 freg = reg;
3288 }
3289 mid16 = lo32;
3290 mid16.X_add_number >>= 16;
3291 macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3292 freg, (int) BFD_RELOC_LO16);
3293 macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
3294 reg, 16);
3295 freg = reg;
3296 }
3297 if ((lo32.X_add_number & 0xffff) != 0)
3298 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3299 (int) BFD_RELOC_LO16);
3300}
3301
3302/* Load an address into a register. */
3303
3304static void
3305load_address (counter, reg, ep)
3306 int *counter;
3307 int reg;
3308 expressionS *ep;
3309{
3310 char *p;
3311
3312 if (ep->X_op != O_constant
3313 && ep->X_op != O_symbol)
3314 {
3315 as_bad (_("expression too complex"));
3316 ep->X_op = O_constant;
3317 }
3318
3319 if (ep->X_op == O_constant)
3320 {
3321 load_register (counter, reg, ep, 0);
3322 return;
3323 }
3324
3325 if (mips_pic == NO_PIC)
3326 {
3327 /* If this is a reference to a GP relative symbol, we want
3328 addiu $reg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
3329 Otherwise we want
3330 lui $reg,<sym> (BFD_RELOC_HI16_S)
3331 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3332 If we have an addend, we always use the latter form. */
3333 if ((valueT) ep->X_add_number >= MAX_GPREL_OFFSET
beae10d5 3334 || nopic_need_relax (ep->X_add_symbol, 1))
252b5132
RH
3335 p = NULL;
3336 else
3337 {
3338 frag_grow (20);
3339 macro_build ((char *) NULL, counter, ep,
ca4e0257 3340 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3341 "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
3342 p = frag_var (rs_machine_dependent, 8, 0,
3343 RELAX_ENCODE (4, 8, 0, 4, 0,
3344 mips_opts.warn_about_macros),
3345 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3346 }
3347 macro_build_lui (p, counter, ep, reg);
3348 if (p != NULL)
3349 p += 4;
3350 macro_build (p, counter, ep,
ca4e0257 3351 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3352 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3353 }
3354 else if (mips_pic == SVR4_PIC && ! mips_big_got)
3355 {
3356 expressionS ex;
3357
3358 /* If this is a reference to an external symbol, we want
3359 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3360 Otherwise we want
3361 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3362 nop
3363 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3364 If there is a constant, it must be added in after. */
3365 ex.X_add_number = ep->X_add_number;
3366 ep->X_add_number = 0;
3367 frag_grow (20);
3368 macro_build ((char *) NULL, counter, ep,
ca4e0257 3369 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
3370 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
3371 macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3372 p = frag_var (rs_machine_dependent, 4, 0,
3373 RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3374 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3375 macro_build (p, counter, ep,
ca4e0257 3376 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3377 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3378 if (ex.X_add_number != 0)
3379 {
3380 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3381 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3382 ex.X_op = O_constant;
3383 macro_build ((char *) NULL, counter, &ex,
ca4e0257 3384 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3385 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3386 }
3387 }
3388 else if (mips_pic == SVR4_PIC)
3389 {
3390 expressionS ex;
3391 int off;
3392
3393 /* This is the large GOT case. If this is a reference to an
3394 external symbol, we want
3395 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
3396 addu $reg,$reg,$gp
3397 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
3398 Otherwise, for a reference to a local symbol, we want
3399 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3400 nop
3401 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3402 If there is a constant, it must be added in after. */
3403 ex.X_add_number = ep->X_add_number;
3404 ep->X_add_number = 0;
3405 if (reg_needs_delay (GP))
3406 off = 4;
3407 else
3408 off = 0;
3409 frag_grow (32);
3410 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3411 (int) BFD_RELOC_MIPS_GOT_HI16);
3412 macro_build ((char *) NULL, counter, (expressionS *) NULL,
ca4e0257 3413 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
3414 "d,v,t", reg, reg, GP);
3415 macro_build ((char *) NULL, counter, ep,
ca4e0257 3416 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
3417 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
3418 p = frag_var (rs_machine_dependent, 12 + off, 0,
3419 RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
3420 mips_opts.warn_about_macros),
3421 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3422 if (off > 0)
3423 {
3424 /* We need a nop before loading from $gp. This special
3425 check is required because the lui which starts the main
3426 instruction stream does not refer to $gp, and so will not
3427 insert the nop which may be required. */
3428 macro_build (p, counter, (expressionS *) NULL, "nop", "");
3429 p += 4;
3430 }
9a41af64 3431 macro_build (p, counter, ep, HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
3432 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
3433 p += 4;
3434 macro_build (p, counter, (expressionS *) NULL, "nop", "");
3435 p += 4;
9a41af64 3436 macro_build (p, counter, ep, HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3437 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3438 if (ex.X_add_number != 0)
3439 {
3440 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3441 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3442 ex.X_op = O_constant;
3443 macro_build ((char *) NULL, counter, &ex,
ca4e0257 3444 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3445 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3446 }
3447 }
3448 else if (mips_pic == EMBEDDED_PIC)
3449 {
3450 /* We always do
3451 addiu $reg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
3452 */
3453 macro_build ((char *) NULL, counter, ep,
ca4e0257 3454 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3455 "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
3456 }
3457 else
3458 abort ();
3459}
3460
ea1fb5dc
RS
3461/* Move the contents of register SOURCE into register DEST. */
3462
3463static void
3464move_register (counter, dest, source)
3465 int *counter;
3466 int dest;
3467 int source;
3468{
3469 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3470 HAVE_32BIT_GPRS ? "addu" : "daddu",
3471 "d,v,t", dest, source, 0);
3472}
3473
252b5132
RH
3474/*
3475 * Build macros
3476 * This routine implements the seemingly endless macro or synthesized
3477 * instructions and addressing modes in the mips assembly language. Many
3478 * of these macros are simple and are similar to each other. These could
3479 * probably be handled by some kind of table or grammer aproach instead of
3480 * this verbose method. Others are not simple macros but are more like
3481 * optimizing code generation.
3482 * One interesting optimization is when several store macros appear
3483 * consecutivly that would load AT with the upper half of the same address.
3484 * The ensuing load upper instructions are ommited. This implies some kind
3485 * of global optimization. We currently only optimize within a single macro.
3486 * For many of the load and store macros if the address is specified as a
3487 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
3488 * first load register 'at' with zero and use it as the base register. The
3489 * mips assembler simply uses register $zero. Just one tiny optimization
3490 * we're missing.
3491 */
3492static void
3493macro (ip)
3494 struct mips_cl_insn *ip;
3495{
3496 register int treg, sreg, dreg, breg;
3497 int tempreg;
3498 int mask;
3499 int icnt = 0;
43841e91 3500 int used_at = 0;
252b5132
RH
3501 expressionS expr1;
3502 const char *s;
3503 const char *s2;
3504 const char *fmt;
3505 int likely = 0;
3506 int dbl = 0;
3507 int coproc = 0;
3508 int lr = 0;
3509 int imm = 0;
3510 offsetT maxnum;
3511 int off;
3512 bfd_reloc_code_real_type r;
3513 char *p;
3514 int hold_mips_optimize;
3515
3516 assert (! mips_opts.mips16);
3517
3518 treg = (ip->insn_opcode >> 16) & 0x1f;
3519 dreg = (ip->insn_opcode >> 11) & 0x1f;
3520 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
3521 mask = ip->insn_mo->mask;
3522
3523 expr1.X_op = O_constant;
3524 expr1.X_op_symbol = NULL;
3525 expr1.X_add_symbol = NULL;
3526 expr1.X_add_number = 1;
3527
3528 switch (mask)
3529 {
3530 case M_DABS:
3531 dbl = 1;
3532 case M_ABS:
3533 /* bgez $a0,.+12
3534 move v0,$a0
3535 sub v0,$zero,$a0
3536 */
3537
3538 mips_emit_delays (true);
3539 ++mips_opts.noreorder;
3540 mips_any_noreorder = 1;
3541
3542 expr1.X_add_number = 8;
3543 macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
3544 if (dreg == sreg)
3545 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3546 else
ea1fb5dc 3547 move_register (&icnt, dreg, sreg);
252b5132 3548 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 3549 dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
252b5132
RH
3550
3551 --mips_opts.noreorder;
3552 return;
3553
3554 case M_ADD_I:
3555 s = "addi";
3556 s2 = "add";
3557 goto do_addi;
3558 case M_ADDU_I:
3559 s = "addiu";
3560 s2 = "addu";
3561 goto do_addi;
3562 case M_DADD_I:
3563 dbl = 1;
3564 s = "daddi";
3565 s2 = "dadd";
3566 goto do_addi;
3567 case M_DADDU_I:
3568 dbl = 1;
3569 s = "daddiu";
3570 s2 = "daddu";
3571 do_addi:
3572 if (imm_expr.X_op == O_constant
3573 && imm_expr.X_add_number >= -0x8000
3574 && imm_expr.X_add_number < 0x8000)
3575 {
3576 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
3577 (int) BFD_RELOC_LO16);
3578 return;
3579 }
3580 load_register (&icnt, AT, &imm_expr, dbl);
3581 macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
3582 break;
3583
3584 case M_AND_I:
3585 s = "andi";
3586 s2 = "and";
3587 goto do_bit;
3588 case M_OR_I:
3589 s = "ori";
3590 s2 = "or";
3591 goto do_bit;
3592 case M_NOR_I:
3593 s = "";
3594 s2 = "nor";
3595 goto do_bit;
3596 case M_XOR_I:
3597 s = "xori";
3598 s2 = "xor";
3599 do_bit:
3600 if (imm_expr.X_op == O_constant
3601 && imm_expr.X_add_number >= 0
3602 && imm_expr.X_add_number < 0x10000)
3603 {
3604 if (mask != M_NOR_I)
3605 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
3606 sreg, (int) BFD_RELOC_LO16);
3607 else
3608 {
3609 macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
3610 treg, sreg, (int) BFD_RELOC_LO16);
3611 macro_build ((char *) NULL, &icnt, NULL, "nor", "d,v,t",
3612 treg, treg, 0);
3613 }
3614 return;
3615 }
3616
3617 load_register (&icnt, AT, &imm_expr, 0);
3618 macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
3619 break;
3620
3621 case M_BEQ_I:
3622 s = "beq";
3623 goto beq_i;
3624 case M_BEQL_I:
3625 s = "beql";
3626 likely = 1;
3627 goto beq_i;
3628 case M_BNE_I:
3629 s = "bne";
3630 goto beq_i;
3631 case M_BNEL_I:
3632 s = "bnel";
3633 likely = 1;
3634 beq_i:
3635 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
3636 {
3637 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
3638 0);
3639 return;
3640 }
3641 load_register (&icnt, AT, &imm_expr, 0);
3642 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
3643 break;
3644
3645 case M_BGEL:
3646 likely = 1;
3647 case M_BGE:
3648 if (treg == 0)
3649 {
3650 macro_build ((char *) NULL, &icnt, &offset_expr,
3651 likely ? "bgezl" : "bgez",
3652 "s,p", sreg);
3653 return;
3654 }
3655 if (sreg == 0)
3656 {
3657 macro_build ((char *) NULL, &icnt, &offset_expr,
3658 likely ? "blezl" : "blez",
3659 "s,p", treg);
3660 return;
3661 }
3662 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
3663 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3664 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3665 break;
3666
3667 case M_BGTL_I:
3668 likely = 1;
3669 case M_BGT_I:
3670 /* check for > max integer */
3671 maxnum = 0x7fffffff;
ca4e0257 3672 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
3673 {
3674 maxnum <<= 16;
3675 maxnum |= 0xffff;
3676 maxnum <<= 16;
3677 maxnum |= 0xffff;
3678 }
3679 if (imm_expr.X_op == O_constant
3680 && imm_expr.X_add_number >= maxnum
ca4e0257 3681 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
3682 {
3683 do_false:
3684 /* result is always false */
3685 if (! likely)
3686 {
39c0a331
L
3687 if (warn_nops)
3688 as_warn (_("Branch %s is always false (nop)"),
3689 ip->insn_mo->name);
252b5132
RH
3690 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3691 }
3692 else
3693 {
39c0a331
L
3694 if (warn_nops)
3695 as_warn (_("Branch likely %s is always false"),
3696 ip->insn_mo->name);
252b5132
RH
3697 macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
3698 "s,t,p", 0, 0);
3699 }
3700 return;
3701 }
3702 if (imm_expr.X_op != O_constant)
3703 as_bad (_("Unsupported large constant"));
3704 imm_expr.X_add_number++;
3705 /* FALLTHROUGH */
3706 case M_BGE_I:
3707 case M_BGEL_I:
3708 if (mask == M_BGEL_I)
3709 likely = 1;
3710 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
3711 {
3712 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3713 likely ? "bgezl" : "bgez", "s,p", sreg);
252b5132
RH
3714 return;
3715 }
3716 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
3717 {
3718 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3719 likely ? "bgtzl" : "bgtz", "s,p", sreg);
252b5132
RH
3720 return;
3721 }
3722 maxnum = 0x7fffffff;
ca4e0257 3723 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
3724 {
3725 maxnum <<= 16;
3726 maxnum |= 0xffff;
3727 maxnum <<= 16;
3728 maxnum |= 0xffff;
3729 }
3730 maxnum = - maxnum - 1;
3731 if (imm_expr.X_op == O_constant
3732 && imm_expr.X_add_number <= maxnum
ca4e0257 3733 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
3734 {
3735 do_true:
3736 /* result is always true */
3737 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
3738 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
3739 return;
3740 }
3741 set_at (&icnt, sreg, 0);
3742 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3743 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3744 break;
3745
3746 case M_BGEUL:
3747 likely = 1;
3748 case M_BGEU:
3749 if (treg == 0)
3750 goto do_true;
3751 if (sreg == 0)
3752 {
3753 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3754 likely ? "beql" : "beq", "s,t,p", 0, treg);
252b5132
RH
3755 return;
3756 }
3757 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
3758 treg);
3759 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3760 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3761 break;
3762
3763 case M_BGTUL_I:
3764 likely = 1;
3765 case M_BGTU_I:
3766 if (sreg == 0
ca4e0257 3767 || (HAVE_32BIT_GPRS
252b5132
RH
3768 && imm_expr.X_op == O_constant
3769 && imm_expr.X_add_number == 0xffffffff))
3770 goto do_false;
3771 if (imm_expr.X_op != O_constant)
3772 as_bad (_("Unsupported large constant"));
3773 imm_expr.X_add_number++;
3774 /* FALLTHROUGH */
3775 case M_BGEU_I:
3776 case M_BGEUL_I:
3777 if (mask == M_BGEUL_I)
3778 likely = 1;
3779 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
3780 goto do_true;
3781 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
3782 {
3783 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3784 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
252b5132
RH
3785 return;
3786 }
3787 set_at (&icnt, sreg, 1);
3788 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3789 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3790 break;
3791
3792 case M_BGTL:
3793 likely = 1;
3794 case M_BGT:
3795 if (treg == 0)
3796 {
3797 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3798 likely ? "bgtzl" : "bgtz", "s,p", sreg);
252b5132
RH
3799 return;
3800 }
3801 if (sreg == 0)
3802 {
3803 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3804 likely ? "bltzl" : "bltz", "s,p", treg);
252b5132
RH
3805 return;
3806 }
3807 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
3808 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3809 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3810 break;
3811
3812 case M_BGTUL:
3813 likely = 1;
3814 case M_BGTU:
3815 if (treg == 0)
3816 {
3817 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3818 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
252b5132
RH
3819 return;
3820 }
3821 if (sreg == 0)
3822 goto do_false;
3823 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
3824 sreg);
3825 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3826 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3827 break;
3828
3829 case M_BLEL:
3830 likely = 1;
3831 case M_BLE:
3832 if (treg == 0)
3833 {
3834 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3835 likely ? "blezl" : "blez", "s,p", sreg);
252b5132
RH
3836 return;
3837 }
3838 if (sreg == 0)
3839 {
3840 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3841 likely ? "bgezl" : "bgez", "s,p", treg);
252b5132
RH
3842 return;
3843 }
3844 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
3845 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3846 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3847 break;
3848
3849 case M_BLEL_I:
3850 likely = 1;
3851 case M_BLE_I:
3852 maxnum = 0x7fffffff;
ca4e0257 3853 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
3854 {
3855 maxnum <<= 16;
3856 maxnum |= 0xffff;
3857 maxnum <<= 16;
3858 maxnum |= 0xffff;
3859 }
3860 if (imm_expr.X_op == O_constant
3861 && imm_expr.X_add_number >= maxnum
ca4e0257 3862 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
3863 goto do_true;
3864 if (imm_expr.X_op != O_constant)
3865 as_bad (_("Unsupported large constant"));
3866 imm_expr.X_add_number++;
3867 /* FALLTHROUGH */
3868 case M_BLT_I:
3869 case M_BLTL_I:
3870 if (mask == M_BLTL_I)
3871 likely = 1;
3872 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
3873 {
3874 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3875 likely ? "bltzl" : "bltz", "s,p", sreg);
252b5132
RH
3876 return;
3877 }
3878 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
3879 {
3880 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3881 likely ? "blezl" : "blez", "s,p", sreg);
252b5132
RH
3882 return;
3883 }
3884 set_at (&icnt, sreg, 0);
3885 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3886 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3887 break;
3888
3889 case M_BLEUL:
3890 likely = 1;
3891 case M_BLEU:
3892 if (treg == 0)
3893 {
3894 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3895 likely ? "beql" : "beq", "s,t,p", sreg, 0);
252b5132
RH
3896 return;
3897 }
3898 if (sreg == 0)
3899 goto do_true;
3900 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
3901 sreg);
3902 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3903 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
3904 break;
3905
3906 case M_BLEUL_I:
3907 likely = 1;
3908 case M_BLEU_I:
3909 if (sreg == 0
ca4e0257 3910 || (HAVE_32BIT_GPRS
252b5132
RH
3911 && imm_expr.X_op == O_constant
3912 && imm_expr.X_add_number == 0xffffffff))
3913 goto do_true;
3914 if (imm_expr.X_op != O_constant)
3915 as_bad (_("Unsupported large constant"));
3916 imm_expr.X_add_number++;
3917 /* FALLTHROUGH */
3918 case M_BLTU_I:
3919 case M_BLTUL_I:
3920 if (mask == M_BLTUL_I)
3921 likely = 1;
3922 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
3923 goto do_false;
3924 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
3925 {
3926 macro_build ((char *) NULL, &icnt, &offset_expr,
3927 likely ? "beql" : "beq",
3928 "s,t,p", sreg, 0);
3929 return;
3930 }
3931 set_at (&icnt, sreg, 1);
3932 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3933 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3934 break;
3935
3936 case M_BLTL:
3937 likely = 1;
3938 case M_BLT:
3939 if (treg == 0)
3940 {
3941 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3942 likely ? "bltzl" : "bltz", "s,p", sreg);
252b5132
RH
3943 return;
3944 }
3945 if (sreg == 0)
3946 {
3947 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3948 likely ? "bgtzl" : "bgtz", "s,p", treg);
252b5132
RH
3949 return;
3950 }
3951 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
3952 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3953 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3954 break;
3955
3956 case M_BLTUL:
3957 likely = 1;
3958 case M_BLTU:
3959 if (treg == 0)
3960 goto do_false;
3961 if (sreg == 0)
3962 {
3963 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3964 likely ? "bnel" : "bne", "s,t,p", 0, treg);
252b5132
RH
3965 return;
3966 }
3967 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
3968 treg);
3969 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 3970 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
3971 break;
3972
3973 case M_DDIV_3:
3974 dbl = 1;
3975 case M_DIV_3:
3976 s = "mflo";
3977 goto do_div3;
3978 case M_DREM_3:
3979 dbl = 1;
3980 case M_REM_3:
3981 s = "mfhi";
3982 do_div3:
3983 if (treg == 0)
3984 {
3985 as_warn (_("Divide by zero."));
3986 if (mips_trap)
3987 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
3988 else
9117d219 3989 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
252b5132
RH
3990 return;
3991 }
3992
3993 mips_emit_delays (true);
3994 ++mips_opts.noreorder;
3995 mips_any_noreorder = 1;
3996 if (mips_trap)
3997 {
3998 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
3999 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 4000 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
252b5132
RH
4001 }
4002 else
4003 {
4004 expr1.X_add_number = 8;
4005 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4006 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 4007 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
9117d219 4008 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
252b5132
RH
4009 }
4010 expr1.X_add_number = -1;
4011 macro_build ((char *) NULL, &icnt, &expr1,
4012 dbl ? "daddiu" : "addiu",
4013 "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4014 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4015 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4016 if (dbl)
4017 {
4018 expr1.X_add_number = 1;
4019 macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4020 (int) BFD_RELOC_LO16);
4021 macro_build ((char *) NULL, &icnt, NULL, "dsll32", "d,w,<", AT, AT,
4022 31);
4023 }
4024 else
4025 {
4026 expr1.X_add_number = 0x80000000;
4027 macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4028 (int) BFD_RELOC_HI16);
4029 }
4030 if (mips_trap)
4031 {
4032 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", sreg, AT);
4033 /* We want to close the noreorder block as soon as possible, so
4034 that later insns are available for delay slot filling. */
4035 --mips_opts.noreorder;
4036 }
4037 else
4038 {
4039 expr1.X_add_number = 8;
4040 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
4041 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
4042
4043 /* We want to close the noreorder block as soon as possible, so
4044 that later insns are available for delay slot filling. */
4045 --mips_opts.noreorder;
4046
9117d219 4047 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
252b5132
RH
4048 }
4049 macro_build ((char *) NULL, &icnt, NULL, s, "d", dreg);
4050 break;
4051
4052 case M_DIV_3I:
4053 s = "div";
4054 s2 = "mflo";
4055 goto do_divi;
4056 case M_DIVU_3I:
4057 s = "divu";
4058 s2 = "mflo";
4059 goto do_divi;
4060 case M_REM_3I:
4061 s = "div";
4062 s2 = "mfhi";
4063 goto do_divi;
4064 case M_REMU_3I:
4065 s = "divu";
4066 s2 = "mfhi";
4067 goto do_divi;
4068 case M_DDIV_3I:
4069 dbl = 1;
4070 s = "ddiv";
4071 s2 = "mflo";
4072 goto do_divi;
4073 case M_DDIVU_3I:
4074 dbl = 1;
4075 s = "ddivu";
4076 s2 = "mflo";
4077 goto do_divi;
4078 case M_DREM_3I:
4079 dbl = 1;
4080 s = "ddiv";
4081 s2 = "mfhi";
4082 goto do_divi;
4083 case M_DREMU_3I:
4084 dbl = 1;
4085 s = "ddivu";
4086 s2 = "mfhi";
4087 do_divi:
4088 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4089 {
4090 as_warn (_("Divide by zero."));
4091 if (mips_trap)
4092 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
4093 else
beae10d5 4094 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
252b5132
RH
4095 return;
4096 }
4097 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4098 {
4099 if (strcmp (s2, "mflo") == 0)
ea1fb5dc 4100 move_register (&icnt, dreg, sreg);
252b5132 4101 else
ea1fb5dc 4102 move_register (&icnt, dreg, 0);
252b5132
RH
4103 return;
4104 }
4105 if (imm_expr.X_op == O_constant
4106 && imm_expr.X_add_number == -1
4107 && s[strlen (s) - 1] != 'u')
4108 {
4109 if (strcmp (s2, "mflo") == 0)
4110 {
9a41af64
TS
4111 macro_build ((char *) NULL, &icnt, NULL, dbl ? "dneg" : "neg",
4112 "d,w", dreg, sreg);
252b5132
RH
4113 }
4114 else
ea1fb5dc 4115 move_register (&icnt, dreg, 0);
252b5132
RH
4116 return;
4117 }
4118
4119 load_register (&icnt, AT, &imm_expr, dbl);
4120 macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, AT);
4121 macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
4122 break;
4123
4124 case M_DIVU_3:
4125 s = "divu";
4126 s2 = "mflo";
4127 goto do_divu3;
4128 case M_REMU_3:
4129 s = "divu";
4130 s2 = "mfhi";
4131 goto do_divu3;
4132 case M_DDIVU_3:
4133 s = "ddivu";
4134 s2 = "mflo";
4135 goto do_divu3;
4136 case M_DREMU_3:
4137 s = "ddivu";
4138 s2 = "mfhi";
4139 do_divu3:
4140 mips_emit_delays (true);
4141 ++mips_opts.noreorder;
4142 mips_any_noreorder = 1;
4143 if (mips_trap)
4144 {
4145 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
4146 macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
4147 /* We want to close the noreorder block as soon as possible, so
4148 that later insns are available for delay slot filling. */
4149 --mips_opts.noreorder;
4150 }
4151 else
4152 {
4153 expr1.X_add_number = 8;
4154 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4155 macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
4156
4157 /* We want to close the noreorder block as soon as possible, so
4158 that later insns are available for delay slot filling. */
4159 --mips_opts.noreorder;
beae10d5 4160 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
252b5132
RH
4161 }
4162 macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
4163 return;
4164
4165 case M_DLA_AB:
4166 dbl = 1;
4167 case M_LA_AB:
4168 /* Load the address of a symbol into a register. If breg is not
4169 zero, we then add a base register to it. */
4170
4171 /* When generating embedded PIC code, we permit expressions of
4172 the form
4173 la $4,foo-bar
bb2d6cd7 4174 where bar is an address in the current section. These are used
252b5132
RH
4175 when getting the addresses of functions. We don't permit
4176 X_add_number to be non-zero, because if the symbol is
4177 external the relaxing code needs to know that any addend is
4178 purely the offset to X_op_symbol. */
4179 if (mips_pic == EMBEDDED_PIC
4180 && offset_expr.X_op == O_subtract
49309057 4181 && (symbol_constant_p (offset_expr.X_op_symbol)
bb2d6cd7 4182 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
49309057
ILT
4183 : (symbol_equated_p (offset_expr.X_op_symbol)
4184 && (S_GET_SEGMENT
4185 (symbol_get_value_expression (offset_expr.X_op_symbol)
4186 ->X_add_symbol)
bb2d6cd7 4187 == now_seg)))
252b5132 4188 && breg == 0
bb2d6cd7
GK
4189 && (offset_expr.X_add_number == 0
4190 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
252b5132
RH
4191 {
4192 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4193 treg, (int) BFD_RELOC_PCREL_HI16_S);
4194 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 4195 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4196 "t,r,j", treg, treg, (int) BFD_RELOC_PCREL_LO16);
4197 return;
4198 }
4199
4200 if (offset_expr.X_op != O_symbol
4201 && offset_expr.X_op != O_constant)
4202 {
4203 as_bad (_("expression too complex"));
4204 offset_expr.X_op = O_constant;
4205 }
4206
4207 if (treg == breg)
4208 {
4209 tempreg = AT;
4210 used_at = 1;
4211 }
4212 else
4213 {
4214 tempreg = treg;
4215 used_at = 0;
4216 }
4217
4218 if (offset_expr.X_op == O_constant)
4219 load_register (&icnt, tempreg, &offset_expr, dbl);
4220 else if (mips_pic == NO_PIC)
4221 {
4222 /* If this is a reference to an GP relative symbol, we want
4223 addiu $tempreg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
4224 Otherwise we want
4225 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4226 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4227 If we have a constant, we need two instructions anyhow,
4228 so we may as well always use the latter form. */
4229 if ((valueT) offset_expr.X_add_number >= MAX_GPREL_OFFSET
4230 || nopic_need_relax (offset_expr.X_add_symbol, 1))
4231 p = NULL;
4232 else
4233 {
4234 frag_grow (20);
4235 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 4236 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4237 "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
4238 p = frag_var (rs_machine_dependent, 8, 0,
4239 RELAX_ENCODE (4, 8, 0, 4, 0,
4240 mips_opts.warn_about_macros),
4241 offset_expr.X_add_symbol, (offsetT) 0,
4242 (char *) NULL);
4243 }
4244 macro_build_lui (p, &icnt, &offset_expr, tempreg);
4245 if (p != NULL)
4246 p += 4;
4247 macro_build (p, &icnt, &offset_expr,
ca4e0257 4248 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4249 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4250 }
4251 else if (mips_pic == SVR4_PIC && ! mips_big_got)
4252 {
9117d219
NC
4253 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
4254
252b5132
RH
4255 /* If this is a reference to an external symbol, and there
4256 is no constant, we want
4257 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9117d219
NC
4258 or if tempreg is PIC_CALL_REG
4259 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
252b5132
RH
4260 For a local symbol, we want
4261 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4262 nop
4263 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4264
4265 If we have a small constant, and this is a reference to
4266 an external symbol, we want
4267 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4268 nop
4269 addiu $tempreg,$tempreg,<constant>
4270 For a local symbol, we want the same instruction
4271 sequence, but we output a BFD_RELOC_LO16 reloc on the
4272 addiu instruction.
4273
4274 If we have a large constant, and this is a reference to
4275 an external symbol, we want
4276 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4277 lui $at,<hiconstant>
4278 addiu $at,$at,<loconstant>
4279 addu $tempreg,$tempreg,$at
4280 For a local symbol, we want the same instruction
4281 sequence, but we output a BFD_RELOC_LO16 reloc on the
4282 addiu instruction. */
4283 expr1.X_add_number = offset_expr.X_add_number;
4284 offset_expr.X_add_number = 0;
4285 frag_grow (32);
9117d219
NC
4286 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
4287 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
252b5132
RH
4288 macro_build ((char *) NULL, &icnt, &offset_expr,
4289 dbl ? "ld" : "lw",
9117d219 4290 "t,o(b)", tempreg, lw_reloc_type, GP);
252b5132
RH
4291 if (expr1.X_add_number == 0)
4292 {
4293 int off;
4294
4295 if (breg == 0)
4296 off = 0;
4297 else
4298 {
4299 /* We're going to put in an addu instruction using
4300 tempreg, so we may as well insert the nop right
4301 now. */
4302 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4303 "nop", "");
4304 off = 4;
4305 }
4306 p = frag_var (rs_machine_dependent, 8 - off, 0,
4307 RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
4308 (breg == 0
4309 ? mips_opts.warn_about_macros
4310 : 0)),
4311 offset_expr.X_add_symbol, (offsetT) 0,
4312 (char *) NULL);
4313 if (breg == 0)
4314 {
4315 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4316 p += 4;
4317 }
4318 macro_build (p, &icnt, &expr1,
ca4e0257 4319 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4320 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4321 /* FIXME: If breg == 0, and the next instruction uses
4322 $tempreg, then if this variant case is used an extra
4323 nop will be generated. */
4324 }
4325 else if (expr1.X_add_number >= -0x8000
4326 && expr1.X_add_number < 0x8000)
4327 {
4328 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4329 "nop", "");
4330 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4331 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4332 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4333 (void) frag_var (rs_machine_dependent, 0, 0,
4334 RELAX_ENCODE (0, 0, -12, -4, 0, 0),
4335 offset_expr.X_add_symbol, (offsetT) 0,
4336 (char *) NULL);
4337 }
4338 else
4339 {
4340 int off1;
4341
4342 /* If we are going to add in a base register, and the
4343 target register and the base register are the same,
4344 then we are using AT as a temporary register. Since
4345 we want to load the constant into AT, we add our
4346 current AT (from the global offset table) and the
4347 register into the register now, and pretend we were
4348 not using a base register. */
4349 if (breg != treg)
4350 off1 = 0;
4351 else
4352 {
4353 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4354 "nop", "");
4355 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4356 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4357 "d,v,t", treg, AT, breg);
4358 breg = 0;
4359 tempreg = treg;
4360 off1 = -8;
4361 }
4362
4363 /* Set mips_optimize around the lui instruction to avoid
4364 inserting an unnecessary nop after the lw. */
4365 hold_mips_optimize = mips_optimize;
4366 mips_optimize = 2;
4367 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
4368 mips_optimize = hold_mips_optimize;
4369
4370 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4371 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4372 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
4373 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4374 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4375 "d,v,t", tempreg, tempreg, AT);
4376 (void) frag_var (rs_machine_dependent, 0, 0,
4377 RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
4378 offset_expr.X_add_symbol, (offsetT) 0,
4379 (char *) NULL);
4380 used_at = 1;
4381 }
4382 }
4383 else if (mips_pic == SVR4_PIC)
4384 {
4385 int gpdel;
9117d219
NC
4386 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
4387 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
252b5132
RH
4388
4389 /* This is the large GOT case. If this is a reference to an
4390 external symbol, and there is no constant, we want
4391 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4392 addu $tempreg,$tempreg,$gp
4393 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9117d219
NC
4394 or if tempreg is PIC_CALL_REG
4395 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
4396 addu $tempreg,$tempreg,$gp
4397 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
252b5132
RH
4398 For a local symbol, we want
4399 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4400 nop
4401 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4402
4403 If we have a small constant, and this is a reference to
4404 an external symbol, we want
4405 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4406 addu $tempreg,$tempreg,$gp
4407 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
4408 nop
4409 addiu $tempreg,$tempreg,<constant>
4410 For a local symbol, we want
4411 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4412 nop
4413 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
4414
4415 If we have a large constant, and this is a reference to
4416 an external symbol, we want
4417 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4418 addu $tempreg,$tempreg,$gp
4419 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
4420 lui $at,<hiconstant>
4421 addiu $at,$at,<loconstant>
4422 addu $tempreg,$tempreg,$at
4423 For a local symbol, we want
4424 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4425 lui $at,<hiconstant>
4426 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
4427 addu $tempreg,$tempreg,$at
4428 */
4429 expr1.X_add_number = offset_expr.X_add_number;
4430 offset_expr.X_add_number = 0;
4431 frag_grow (52);
4432 if (reg_needs_delay (GP))
4433 gpdel = 4;
4434 else
4435 gpdel = 0;
9117d219
NC
4436 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
4437 {
4438 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
4439 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
4440 }
252b5132 4441 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
9117d219 4442 tempreg, lui_reloc_type);
252b5132 4443 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4444 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4445 "d,v,t", tempreg, tempreg, GP);
4446 macro_build ((char *) NULL, &icnt, &offset_expr,
4447 dbl ? "ld" : "lw",
9117d219 4448 "t,o(b)", tempreg, lw_reloc_type, tempreg);
252b5132
RH
4449 if (expr1.X_add_number == 0)
4450 {
4451 int off;
4452
4453 if (breg == 0)
4454 off = 0;
4455 else
4456 {
4457 /* We're going to put in an addu instruction using
4458 tempreg, so we may as well insert the nop right
4459 now. */
4460 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4461 "nop", "");
4462 off = 4;
4463 }
4464
4465 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
4466 RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
4467 8 + gpdel, 0,
4468 (breg == 0
4469 ? mips_opts.warn_about_macros
4470 : 0)),
4471 offset_expr.X_add_symbol, (offsetT) 0,
4472 (char *) NULL);
4473 }
4474 else if (expr1.X_add_number >= -0x8000
4475 && expr1.X_add_number < 0x8000)
4476 {
4477 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4478 "nop", "");
4479 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4480 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4481 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4482
4483 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
4484 RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
4485 (breg == 0
4486 ? mips_opts.warn_about_macros
4487 : 0)),
4488 offset_expr.X_add_symbol, (offsetT) 0,
4489 (char *) NULL);
4490 }
4491 else
4492 {
4493 int adj, dreg;
4494
4495 /* If we are going to add in a base register, and the
4496 target register and the base register are the same,
4497 then we are using AT as a temporary register. Since
4498 we want to load the constant into AT, we add our
4499 current AT (from the global offset table) and the
4500 register into the register now, and pretend we were
4501 not using a base register. */
4502 if (breg != treg)
4503 {
4504 adj = 0;
4505 dreg = tempreg;
4506 }
4507 else
4508 {
4509 assert (tempreg == AT);
4510 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4511 "nop", "");
4512 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4513 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4514 "d,v,t", treg, AT, breg);
4515 dreg = treg;
4516 adj = 8;
4517 }
4518
4519 /* Set mips_optimize around the lui instruction to avoid
4520 inserting an unnecessary nop after the lw. */
4521 hold_mips_optimize = mips_optimize;
4522 mips_optimize = 2;
4523 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
4524 mips_optimize = hold_mips_optimize;
4525
4526 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4527 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4528 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
4529 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4530 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4531 "d,v,t", dreg, dreg, AT);
4532
4533 p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
4534 RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
4535 8 + gpdel, 0,
4536 (breg == 0
4537 ? mips_opts.warn_about_macros
4538 : 0)),
4539 offset_expr.X_add_symbol, (offsetT) 0,
4540 (char *) NULL);
4541
4542 used_at = 1;
4543 }
4544
4545 if (gpdel > 0)
4546 {
4547 /* This is needed because this instruction uses $gp, but
4548 the first instruction on the main stream does not. */
4549 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4550 p += 4;
4551 }
4552 macro_build (p, &icnt, &offset_expr,
4553 dbl ? "ld" : "lw",
4554 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
4555 p += 4;
4556 if (expr1.X_add_number >= -0x8000
4557 && expr1.X_add_number < 0x8000)
4558 {
4559 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4560 p += 4;
4561 macro_build (p, &icnt, &expr1,
ca4e0257 4562 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4563 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4564 /* FIXME: If add_number is 0, and there was no base
4565 register, the external symbol case ended with a load,
4566 so if the symbol turns out to not be external, and
4567 the next instruction uses tempreg, an unnecessary nop
4568 will be inserted. */
4569 }
4570 else
4571 {
4572 if (breg == treg)
4573 {
4574 /* We must add in the base register now, as in the
4575 external symbol case. */
4576 assert (tempreg == AT);
4577 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4578 p += 4;
4579 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 4580 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4581 "d,v,t", treg, AT, breg);
4582 p += 4;
4583 tempreg = treg;
4584 /* We set breg to 0 because we have arranged to add
4585 it in in both cases. */
4586 breg = 0;
4587 }
4588
4589 macro_build_lui (p, &icnt, &expr1, AT);
4590 p += 4;
4591 macro_build (p, &icnt, &expr1,
ca4e0257 4592 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4593 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
4594 p += 4;
4595 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 4596 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4597 "d,v,t", tempreg, tempreg, AT);
4598 p += 4;
4599 }
4600 }
4601 else if (mips_pic == EMBEDDED_PIC)
4602 {
4603 /* We use
4604 addiu $tempreg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
4605 */
4606 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 4607 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4608 "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
4609 }
4610 else
4611 abort ();
4612
4613 if (breg != 0)
4614 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4615 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4616 "d,v,t", treg, tempreg, breg);
4617
4618 if (! used_at)
4619 return;
4620
4621 break;
4622
4623 case M_J_A:
4624 /* The j instruction may not be used in PIC code, since it
4625 requires an absolute address. We convert it to a b
4626 instruction. */
4627 if (mips_pic == NO_PIC)
4628 macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
4629 else
4630 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4631 return;
4632
4633 /* The jal instructions must be handled as macros because when
4634 generating PIC code they expand to multi-instruction
4635 sequences. Normally they are simple instructions. */
4636 case M_JAL_1:
4637 dreg = RA;
4638 /* Fall through. */
4639 case M_JAL_2:
4640 if (mips_pic == NO_PIC
4641 || mips_pic == EMBEDDED_PIC)
4642 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
4643 "d,s", dreg, sreg);
4644 else if (mips_pic == SVR4_PIC)
4645 {
4646 if (sreg != PIC_CALL_REG)
4647 as_warn (_("MIPS PIC call to register other than $25"));
bdaaa2e1 4648
252b5132
RH
4649 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
4650 "d,s", dreg, sreg);
4651 if (mips_cprestore_offset < 0)
4652 as_warn (_("No .cprestore pseudo-op used in PIC code"));
4653 else
4654 {
4655 expr1.X_add_number = mips_cprestore_offset;
4656 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4657 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
4658 "t,o(b)", GP, (int) BFD_RELOC_LO16, mips_frame_reg);
4659 }
4660 }
4661 else
4662 abort ();
4663
4664 return;
4665
4666 case M_JAL_A:
4667 if (mips_pic == NO_PIC)
4668 macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
4669 else if (mips_pic == SVR4_PIC)
4670 {
4671 /* If this is a reference to an external symbol, and we are
4672 using a small GOT, we want
4673 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
4674 nop
4675 jalr $25
4676 nop
4677 lw $gp,cprestore($sp)
4678 The cprestore value is set using the .cprestore
4679 pseudo-op. If we are using a big GOT, we want
4680 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
4681 addu $25,$25,$gp
4682 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
4683 nop
4684 jalr $25
4685 nop
4686 lw $gp,cprestore($sp)
4687 If the symbol is not external, we want
4688 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4689 nop
4690 addiu $25,$25,<sym> (BFD_RELOC_LO16)
4691 jalr $25
4692 nop
4693 lw $gp,cprestore($sp) */
4694 frag_grow (40);
4695 if (! mips_big_got)
4696 {
4697 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 4698 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
4699 "t,o(b)", PIC_CALL_REG,
4700 (int) BFD_RELOC_MIPS_CALL16, GP);
4701 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4702 "nop", "");
4703 p = frag_var (rs_machine_dependent, 4, 0,
4704 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
4705 offset_expr.X_add_symbol, (offsetT) 0,
4706 (char *) NULL);
4707 }
4708 else
4709 {
4710 int gpdel;
4711
4712 if (reg_needs_delay (GP))
4713 gpdel = 4;
4714 else
4715 gpdel = 0;
4716 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4717 PIC_CALL_REG, (int) BFD_RELOC_MIPS_CALL_HI16);
4718 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 4719 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
4720 "d,v,t", PIC_CALL_REG, PIC_CALL_REG, GP);
4721 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 4722 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
4723 "t,o(b)", PIC_CALL_REG,
4724 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
4725 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4726 "nop", "");
4727 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
4728 RELAX_ENCODE (16, 12 + gpdel, gpdel, 8 + gpdel,
4729 0, 0),
4730 offset_expr.X_add_symbol, (offsetT) 0,
4731 (char *) NULL);
4732 if (gpdel > 0)
4733 {
4734 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4735 p += 4;
4736 }
4737 macro_build (p, &icnt, &offset_expr,
ca4e0257 4738 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
4739 "t,o(b)", PIC_CALL_REG,
4740 (int) BFD_RELOC_MIPS_GOT16, GP);
4741 p += 4;
4742 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4743 p += 4;
bdaaa2e1 4744 }
252b5132 4745 macro_build (p, &icnt, &offset_expr,
ca4e0257 4746 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4747 "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
4748 (int) BFD_RELOC_LO16);
4749 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4750 "jalr", "s", PIC_CALL_REG);
4751 if (mips_cprestore_offset < 0)
4752 as_warn (_("No .cprestore pseudo-op used in PIC code"));
4753 else
4754 {
4755 if (mips_opts.noreorder)
4756 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4757 "nop", "");
4758 expr1.X_add_number = mips_cprestore_offset;
4759 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 4760 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
4761 "t,o(b)", GP, (int) BFD_RELOC_LO16,
4762 mips_frame_reg);
4763 }
4764 }
4765 else if (mips_pic == EMBEDDED_PIC)
4766 {
4767 macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
4768 /* The linker may expand the call to a longer sequence which
4769 uses $at, so we must break rather than return. */
4770 break;
4771 }
4772 else
4773 abort ();
4774
4775 return;
4776
4777 case M_LB_AB:
4778 s = "lb";
4779 goto ld;
4780 case M_LBU_AB:
4781 s = "lbu";
4782 goto ld;
4783 case M_LH_AB:
4784 s = "lh";
4785 goto ld;
4786 case M_LHU_AB:
4787 s = "lhu";
4788 goto ld;
4789 case M_LW_AB:
4790 s = "lw";
4791 goto ld;
4792 case M_LWC0_AB:
4793 s = "lwc0";
bdaaa2e1 4794 /* Itbl support may require additional care here. */
252b5132
RH
4795 coproc = 1;
4796 goto ld;
4797 case M_LWC1_AB:
4798 s = "lwc1";
bdaaa2e1 4799 /* Itbl support may require additional care here. */
252b5132
RH
4800 coproc = 1;
4801 goto ld;
4802 case M_LWC2_AB:
4803 s = "lwc2";
bdaaa2e1 4804 /* Itbl support may require additional care here. */
252b5132
RH
4805 coproc = 1;
4806 goto ld;
4807 case M_LWC3_AB:
4808 s = "lwc3";
bdaaa2e1 4809 /* Itbl support may require additional care here. */
252b5132
RH
4810 coproc = 1;
4811 goto ld;
4812 case M_LWL_AB:
4813 s = "lwl";
4814 lr = 1;
4815 goto ld;
4816 case M_LWR_AB:
4817 s = "lwr";
4818 lr = 1;
4819 goto ld;
4820 case M_LDC1_AB:
ec68c924 4821 if (mips_arch == CPU_R4650)
252b5132
RH
4822 {
4823 as_bad (_("opcode not supported on this processor"));
4824 return;
4825 }
4826 s = "ldc1";
bdaaa2e1 4827 /* Itbl support may require additional care here. */
252b5132
RH
4828 coproc = 1;
4829 goto ld;
4830 case M_LDC2_AB:
4831 s = "ldc2";
bdaaa2e1 4832 /* Itbl support may require additional care here. */
252b5132
RH
4833 coproc = 1;
4834 goto ld;
4835 case M_LDC3_AB:
4836 s = "ldc3";
bdaaa2e1 4837 /* Itbl support may require additional care here. */
252b5132
RH
4838 coproc = 1;
4839 goto ld;
4840 case M_LDL_AB:
4841 s = "ldl";
4842 lr = 1;
4843 goto ld;
4844 case M_LDR_AB:
4845 s = "ldr";
4846 lr = 1;
4847 goto ld;
4848 case M_LL_AB:
4849 s = "ll";
4850 goto ld;
4851 case M_LLD_AB:
4852 s = "lld";
4853 goto ld;
4854 case M_LWU_AB:
4855 s = "lwu";
4856 ld:
4857 if (breg == treg || coproc || lr)
4858 {
4859 tempreg = AT;
4860 used_at = 1;
4861 }
4862 else
4863 {
4864 tempreg = treg;
4865 used_at = 0;
4866 }
4867 goto ld_st;
4868 case M_SB_AB:
4869 s = "sb";
4870 goto st;
4871 case M_SH_AB:
4872 s = "sh";
4873 goto st;
4874 case M_SW_AB:
4875 s = "sw";
4876 goto st;
4877 case M_SWC0_AB:
4878 s = "swc0";
bdaaa2e1 4879 /* Itbl support may require additional care here. */
252b5132
RH
4880 coproc = 1;
4881 goto st;
4882 case M_SWC1_AB:
4883 s = "swc1";
bdaaa2e1 4884 /* Itbl support may require additional care here. */
252b5132
RH
4885 coproc = 1;
4886 goto st;
4887 case M_SWC2_AB:
4888 s = "swc2";
bdaaa2e1 4889 /* Itbl support may require additional care here. */
252b5132
RH
4890 coproc = 1;
4891 goto st;
4892 case M_SWC3_AB:
4893 s = "swc3";
bdaaa2e1 4894 /* Itbl support may require additional care here. */
252b5132
RH
4895 coproc = 1;
4896 goto st;
4897 case M_SWL_AB:
4898 s = "swl";
4899 goto st;
4900 case M_SWR_AB:
4901 s = "swr";
4902 goto st;
4903 case M_SC_AB:
4904 s = "sc";
4905 goto st;
4906 case M_SCD_AB:
4907 s = "scd";
4908 goto st;
4909 case M_SDC1_AB:
ec68c924 4910 if (mips_arch == CPU_R4650)
252b5132
RH
4911 {
4912 as_bad (_("opcode not supported on this processor"));
4913 return;
4914 }
4915 s = "sdc1";
4916 coproc = 1;
bdaaa2e1 4917 /* Itbl support may require additional care here. */
252b5132
RH
4918 goto st;
4919 case M_SDC2_AB:
4920 s = "sdc2";
bdaaa2e1 4921 /* Itbl support may require additional care here. */
252b5132
RH
4922 coproc = 1;
4923 goto st;
4924 case M_SDC3_AB:
4925 s = "sdc3";
bdaaa2e1 4926 /* Itbl support may require additional care here. */
252b5132
RH
4927 coproc = 1;
4928 goto st;
4929 case M_SDL_AB:
4930 s = "sdl";
4931 goto st;
4932 case M_SDR_AB:
4933 s = "sdr";
4934 st:
4935 tempreg = AT;
4936 used_at = 1;
4937 ld_st:
bdaaa2e1 4938 /* Itbl support may require additional care here. */
252b5132
RH
4939 if (mask == M_LWC1_AB
4940 || mask == M_SWC1_AB
4941 || mask == M_LDC1_AB
4942 || mask == M_SDC1_AB
4943 || mask == M_L_DAB
4944 || mask == M_S_DAB)
4945 fmt = "T,o(b)";
4946 else if (coproc)
4947 fmt = "E,o(b)";
4948 else
4949 fmt = "t,o(b)";
4950
4951 if (offset_expr.X_op != O_constant
4952 && offset_expr.X_op != O_symbol)
4953 {
4954 as_bad (_("expression too complex"));
4955 offset_expr.X_op = O_constant;
4956 }
4957
4958 /* A constant expression in PIC code can be handled just as it
4959 is in non PIC code. */
4960 if (mips_pic == NO_PIC
4961 || offset_expr.X_op == O_constant)
4962 {
4963 /* If this is a reference to a GP relative symbol, and there
4964 is no base register, we want
4965 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
4966 Otherwise, if there is no base register, we want
4967 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4968 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
4969 If we have a constant, we need two instructions anyhow,
4970 so we always use the latter form.
4971
4972 If we have a base register, and this is a reference to a
4973 GP relative symbol, we want
4974 addu $tempreg,$breg,$gp
4975 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GPREL)
4976 Otherwise we want
4977 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4978 addu $tempreg,$tempreg,$breg
4979 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
4980 With a constant we always use the latter case. */
4981 if (breg == 0)
4982 {
e7d556df 4983 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
4984 || nopic_need_relax (offset_expr.X_add_symbol, 1))
4985 p = NULL;
4986 else
4987 {
4988 frag_grow (20);
4989 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
4990 treg, (int) BFD_RELOC_MIPS_GPREL, GP);
4991 p = frag_var (rs_machine_dependent, 8, 0,
4992 RELAX_ENCODE (4, 8, 0, 4, 0,
4993 (mips_opts.warn_about_macros
4994 || (used_at
4995 && mips_opts.noat))),
4996 offset_expr.X_add_symbol, (offsetT) 0,
4997 (char *) NULL);
4998 used_at = 0;
4999 }
5000 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5001 if (p != NULL)
5002 p += 4;
5003 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5004 (int) BFD_RELOC_LO16, tempreg);
5005 }
5006 else
5007 {
e7d556df 5008 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
5009 || nopic_need_relax (offset_expr.X_add_symbol, 1))
5010 p = NULL;
5011 else
5012 {
5013 frag_grow (28);
5014 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5015 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5016 "d,v,t", tempreg, breg, GP);
5017 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5018 treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
5019 p = frag_var (rs_machine_dependent, 12, 0,
5020 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
5021 offset_expr.X_add_symbol, (offsetT) 0,
5022 (char *) NULL);
5023 }
5024 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5025 if (p != NULL)
5026 p += 4;
5027 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5028 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5029 "d,v,t", tempreg, tempreg, breg);
5030 if (p != NULL)
5031 p += 4;
5032 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5033 (int) BFD_RELOC_LO16, tempreg);
5034 }
5035 }
5036 else if (mips_pic == SVR4_PIC && ! mips_big_got)
5037 {
5038 /* If this is a reference to an external symbol, we want
5039 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5040 nop
5041 <op> $treg,0($tempreg)
5042 Otherwise we want
5043 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5044 nop
5045 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5046 <op> $treg,0($tempreg)
5047 If there is a base register, we add it to $tempreg before
5048 the <op>. If there is a constant, we stick it in the
5049 <op> instruction. We don't handle constants larger than
5050 16 bits, because we have no way to load the upper 16 bits
5051 (actually, we could handle them for the subset of cases
5052 in which we are not using $at). */
5053 assert (offset_expr.X_op == O_symbol);
5054 expr1.X_add_number = offset_expr.X_add_number;
5055 offset_expr.X_add_number = 0;
5056 if (expr1.X_add_number < -0x8000
5057 || expr1.X_add_number >= 0x8000)
5058 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5059 frag_grow (20);
5060 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5061 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5062 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
5063 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
bdaaa2e1 5064 p = frag_var (rs_machine_dependent, 4, 0,
252b5132
RH
5065 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5066 offset_expr.X_add_symbol, (offsetT) 0,
5067 (char *) NULL);
5068 macro_build (p, &icnt, &offset_expr,
ca4e0257 5069 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5070 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5071 if (breg != 0)
5072 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5073 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5074 "d,v,t", tempreg, tempreg, breg);
5075 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
5076 (int) BFD_RELOC_LO16, tempreg);
5077 }
5078 else if (mips_pic == SVR4_PIC)
5079 {
5080 int gpdel;
5081
5082 /* If this is a reference to an external symbol, we want
5083 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5084 addu $tempreg,$tempreg,$gp
5085 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5086 <op> $treg,0($tempreg)
5087 Otherwise we want
5088 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5089 nop
5090 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5091 <op> $treg,0($tempreg)
5092 If there is a base register, we add it to $tempreg before
5093 the <op>. If there is a constant, we stick it in the
5094 <op> instruction. We don't handle constants larger than
5095 16 bits, because we have no way to load the upper 16 bits
5096 (actually, we could handle them for the subset of cases
5097 in which we are not using $at). */
5098 assert (offset_expr.X_op == O_symbol);
5099 expr1.X_add_number = offset_expr.X_add_number;
5100 offset_expr.X_add_number = 0;
5101 if (expr1.X_add_number < -0x8000
5102 || expr1.X_add_number >= 0x8000)
5103 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5104 if (reg_needs_delay (GP))
5105 gpdel = 4;
5106 else
5107 gpdel = 0;
5108 frag_grow (36);
5109 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5110 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
5111 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5112 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5113 "d,v,t", tempreg, tempreg, GP);
5114 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5115 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5116 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
5117 tempreg);
5118 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5119 RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
5120 offset_expr.X_add_symbol, (offsetT) 0, (char *) NULL);
5121 if (gpdel > 0)
5122 {
5123 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5124 p += 4;
5125 }
5126 macro_build (p, &icnt, &offset_expr,
ca4e0257 5127 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5128 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
5129 p += 4;
5130 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5131 p += 4;
5132 macro_build (p, &icnt, &offset_expr,
ca4e0257 5133 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5134 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5135 if (breg != 0)
5136 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5137 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5138 "d,v,t", tempreg, tempreg, breg);
5139 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
5140 (int) BFD_RELOC_LO16, tempreg);
5141 }
5142 else if (mips_pic == EMBEDDED_PIC)
5143 {
5144 /* If there is no base register, we want
5145 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
5146 If there is a base register, we want
5147 addu $tempreg,$breg,$gp
5148 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GPREL)
5149 */
5150 assert (offset_expr.X_op == O_symbol);
5151 if (breg == 0)
5152 {
5153 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5154 treg, (int) BFD_RELOC_MIPS_GPREL, GP);
5155 used_at = 0;
5156 }
5157 else
5158 {
5159 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5160 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5161 "d,v,t", tempreg, breg, GP);
5162 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5163 treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
5164 }
5165 }
5166 else
5167 abort ();
5168
5169 if (! used_at)
5170 return;
5171
5172 break;
5173
5174 case M_LI:
5175 case M_LI_S:
5176 load_register (&icnt, treg, &imm_expr, 0);
5177 return;
5178
5179 case M_DLI:
5180 load_register (&icnt, treg, &imm_expr, 1);
5181 return;
5182
5183 case M_LI_SS:
5184 if (imm_expr.X_op == O_constant)
5185 {
5186 load_register (&icnt, AT, &imm_expr, 0);
5187 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5188 "mtc1", "t,G", AT, treg);
5189 break;
5190 }
5191 else
5192 {
5193 assert (offset_expr.X_op == O_symbol
5194 && strcmp (segment_name (S_GET_SEGMENT
5195 (offset_expr.X_add_symbol)),
5196 ".lit4") == 0
5197 && offset_expr.X_add_number == 0);
5198 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
5199 treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
5200 return;
5201 }
5202
5203 case M_LI_D:
ca4e0257
RS
5204 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
5205 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
5206 order 32 bits of the value and the low order 32 bits are either
5207 zero or in OFFSET_EXPR. */
252b5132
RH
5208 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
5209 {
ca4e0257 5210 if (HAVE_64BIT_GPRS)
252b5132
RH
5211 load_register (&icnt, treg, &imm_expr, 1);
5212 else
5213 {
5214 int hreg, lreg;
5215
5216 if (target_big_endian)
5217 {
5218 hreg = treg;
5219 lreg = treg + 1;
5220 }
5221 else
5222 {
5223 hreg = treg + 1;
5224 lreg = treg;
5225 }
5226
5227 if (hreg <= 31)
5228 load_register (&icnt, hreg, &imm_expr, 0);
5229 if (lreg <= 31)
5230 {
5231 if (offset_expr.X_op == O_absent)
ea1fb5dc 5232 move_register (&icnt, lreg, 0);
252b5132
RH
5233 else
5234 {
5235 assert (offset_expr.X_op == O_constant);
5236 load_register (&icnt, lreg, &offset_expr, 0);
5237 }
5238 }
5239 }
5240 return;
5241 }
5242
5243 /* We know that sym is in the .rdata section. First we get the
5244 upper 16 bits of the address. */
5245 if (mips_pic == NO_PIC)
5246 {
5247 /* FIXME: This won't work for a 64 bit address. */
5248 macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT);
5249 }
5250 else if (mips_pic == SVR4_PIC)
5251 {
5252 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5253 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5254 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
5255 }
5256 else if (mips_pic == EMBEDDED_PIC)
5257 {
5258 /* For embedded PIC we pick up the entire address off $gp in
5259 a single instruction. */
5260 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5261 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5262 "t,r,j", AT, GP, (int) BFD_RELOC_MIPS_GPREL);
5263 offset_expr.X_op = O_constant;
5264 offset_expr.X_add_number = 0;
5265 }
5266 else
5267 abort ();
bdaaa2e1 5268
252b5132 5269 /* Now we load the register(s). */
ca4e0257 5270 if (HAVE_64BIT_GPRS)
252b5132
RH
5271 macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
5272 treg, (int) BFD_RELOC_LO16, AT);
5273 else
5274 {
5275 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
5276 treg, (int) BFD_RELOC_LO16, AT);
5277 if (treg != 31)
5278 {
5279 /* FIXME: How in the world do we deal with the possible
5280 overflow here? */
5281 offset_expr.X_add_number += 4;
5282 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
5283 treg + 1, (int) BFD_RELOC_LO16, AT);
5284 }
5285 }
5286
5287 /* To avoid confusion in tc_gen_reloc, we must ensure that this
5288 does not become a variant frag. */
5289 frag_wane (frag_now);
5290 frag_new (0);
5291
5292 break;
5293
5294 case M_LI_DD:
ca4e0257
RS
5295 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
5296 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
5297 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
5298 the value and the low order 32 bits are either zero or in
5299 OFFSET_EXPR. */
252b5132
RH
5300 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
5301 {
ca4e0257
RS
5302 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
5303 if (HAVE_64BIT_FPRS)
5304 {
5305 assert (HAVE_64BIT_GPRS);
5306 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5307 "dmtc1", "t,S", AT, treg);
5308 }
252b5132
RH
5309 else
5310 {
5311 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5312 "mtc1", "t,G", AT, treg + 1);
5313 if (offset_expr.X_op == O_absent)
5314 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5315 "mtc1", "t,G", 0, treg);
5316 else
5317 {
5318 assert (offset_expr.X_op == O_constant);
5319 load_register (&icnt, AT, &offset_expr, 0);
5320 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5321 "mtc1", "t,G", AT, treg);
5322 }
5323 }
5324 break;
5325 }
5326
5327 assert (offset_expr.X_op == O_symbol
5328 && offset_expr.X_add_number == 0);
5329 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
5330 if (strcmp (s, ".lit8") == 0)
5331 {
e7af610e 5332 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
5333 {
5334 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
5335 "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
5336 return;
5337 }
5338 breg = GP;
5339 r = BFD_RELOC_MIPS_LITERAL;
5340 goto dob;
5341 }
5342 else
5343 {
5344 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
5345 if (mips_pic == SVR4_PIC)
5346 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5347 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5348 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
5349 else
5350 {
5351 /* FIXME: This won't work for a 64 bit address. */
5352 macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT);
5353 }
bdaaa2e1 5354
e7af610e 5355 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
5356 {
5357 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
5358 "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
5359
5360 /* To avoid confusion in tc_gen_reloc, we must ensure
5361 that this does not become a variant frag. */
5362 frag_wane (frag_now);
5363 frag_new (0);
5364
5365 break;
5366 }
5367 breg = AT;
5368 r = BFD_RELOC_LO16;
5369 goto dob;
5370 }
5371
5372 case M_L_DOB:
ec68c924 5373 if (mips_arch == CPU_R4650)
252b5132
RH
5374 {
5375 as_bad (_("opcode not supported on this processor"));
5376 return;
5377 }
5378 /* Even on a big endian machine $fn comes before $fn+1. We have
5379 to adjust when loading from memory. */
5380 r = BFD_RELOC_LO16;
5381 dob:
e7af610e 5382 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
5383 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
5384 target_big_endian ? treg + 1 : treg,
5385 (int) r, breg);
5386 /* FIXME: A possible overflow which I don't know how to deal
5387 with. */
5388 offset_expr.X_add_number += 4;
5389 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
5390 target_big_endian ? treg : treg + 1,
5391 (int) r, breg);
5392
5393 /* To avoid confusion in tc_gen_reloc, we must ensure that this
5394 does not become a variant frag. */
5395 frag_wane (frag_now);
5396 frag_new (0);
5397
5398 if (breg != AT)
5399 return;
5400 break;
5401
5402 case M_L_DAB:
5403 /*
5404 * The MIPS assembler seems to check for X_add_number not
5405 * being double aligned and generating:
5406 * lui at,%hi(foo+1)
5407 * addu at,at,v1
5408 * addiu at,at,%lo(foo+1)
5409 * lwc1 f2,0(at)
5410 * lwc1 f3,4(at)
5411 * But, the resulting address is the same after relocation so why
5412 * generate the extra instruction?
5413 */
ec68c924 5414 if (mips_arch == CPU_R4650)
252b5132
RH
5415 {
5416 as_bad (_("opcode not supported on this processor"));
5417 return;
5418 }
bdaaa2e1 5419 /* Itbl support may require additional care here. */
252b5132 5420 coproc = 1;
e7af610e 5421 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
5422 {
5423 s = "ldc1";
5424 goto ld;
5425 }
5426
5427 s = "lwc1";
5428 fmt = "T,o(b)";
5429 goto ldd_std;
5430
5431 case M_S_DAB:
ec68c924 5432 if (mips_arch == CPU_R4650)
252b5132
RH
5433 {
5434 as_bad (_("opcode not supported on this processor"));
5435 return;
5436 }
5437
e7af610e 5438 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
5439 {
5440 s = "sdc1";
5441 goto st;
5442 }
5443
5444 s = "swc1";
5445 fmt = "T,o(b)";
bdaaa2e1 5446 /* Itbl support may require additional care here. */
252b5132
RH
5447 coproc = 1;
5448 goto ldd_std;
5449
5450 case M_LD_AB:
ca4e0257 5451 if (HAVE_64BIT_GPRS)
252b5132
RH
5452 {
5453 s = "ld";
5454 goto ld;
5455 }
5456
5457 s = "lw";
5458 fmt = "t,o(b)";
5459 goto ldd_std;
5460
5461 case M_SD_AB:
ca4e0257 5462 if (HAVE_64BIT_GPRS)
252b5132
RH
5463 {
5464 s = "sd";
5465 goto st;
5466 }
5467
5468 s = "sw";
5469 fmt = "t,o(b)";
5470
5471 ldd_std:
5472 if (offset_expr.X_op != O_symbol
5473 && offset_expr.X_op != O_constant)
5474 {
5475 as_bad (_("expression too complex"));
5476 offset_expr.X_op = O_constant;
5477 }
5478
5479 /* Even on a big endian machine $fn comes before $fn+1. We have
5480 to adjust when loading from memory. We set coproc if we must
5481 load $fn+1 first. */
bdaaa2e1 5482 /* Itbl support may require additional care here. */
252b5132
RH
5483 if (! target_big_endian)
5484 coproc = 0;
5485
5486 if (mips_pic == NO_PIC
5487 || offset_expr.X_op == O_constant)
5488 {
5489 /* If this is a reference to a GP relative symbol, we want
5490 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
5491 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_MIPS_GPREL)
5492 If we have a base register, we use this
5493 addu $at,$breg,$gp
5494 <op> $treg,<sym>($at) (BFD_RELOC_MIPS_GPREL)
5495 <op> $treg+1,<sym>+4($at) (BFD_RELOC_MIPS_GPREL)
5496 If this is not a GP relative symbol, we want
5497 lui $at,<sym> (BFD_RELOC_HI16_S)
5498 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
5499 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
5500 If there is a base register, we add it to $at after the
5501 lui instruction. If there is a constant, we always use
5502 the last case. */
e7d556df 5503 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
5504 || nopic_need_relax (offset_expr.X_add_symbol, 1))
5505 {
5506 p = NULL;
5507 used_at = 1;
5508 }
5509 else
5510 {
5511 int off;
5512
5513 if (breg == 0)
5514 {
5515 frag_grow (28);
5516 tempreg = GP;
5517 off = 0;
5518 used_at = 0;
5519 }
5520 else
5521 {
5522 frag_grow (36);
5523 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5524 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5525 "d,v,t", AT, breg, GP);
5526 tempreg = AT;
5527 off = 4;
5528 used_at = 1;
5529 }
5530
beae10d5 5531 /* Itbl support may require additional care here. */
252b5132
RH
5532 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5533 coproc ? treg + 1 : treg,
5534 (int) BFD_RELOC_MIPS_GPREL, tempreg);
5535 offset_expr.X_add_number += 4;
5536
5537 /* Set mips_optimize to 2 to avoid inserting an
5538 undesired nop. */
5539 hold_mips_optimize = mips_optimize;
5540 mips_optimize = 2;
beae10d5 5541 /* Itbl support may require additional care here. */
252b5132
RH
5542 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5543 coproc ? treg : treg + 1,
5544 (int) BFD_RELOC_MIPS_GPREL, tempreg);
5545 mips_optimize = hold_mips_optimize;
5546
5547 p = frag_var (rs_machine_dependent, 12 + off, 0,
5548 RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
5549 used_at && mips_opts.noat),
5550 offset_expr.X_add_symbol, (offsetT) 0,
5551 (char *) NULL);
5552
5553 /* We just generated two relocs. When tc_gen_reloc
5554 handles this case, it will skip the first reloc and
5555 handle the second. The second reloc already has an
5556 extra addend of 4, which we added above. We must
5557 subtract it out, and then subtract another 4 to make
5558 the first reloc come out right. The second reloc
5559 will come out right because we are going to add 4 to
5560 offset_expr when we build its instruction below.
5561
5562 If we have a symbol, then we don't want to include
5563 the offset, because it will wind up being included
5564 when we generate the reloc. */
5565
5566 if (offset_expr.X_op == O_constant)
5567 offset_expr.X_add_number -= 8;
5568 else
5569 {
5570 offset_expr.X_add_number = -4;
5571 offset_expr.X_op = O_constant;
5572 }
5573 }
5574 macro_build_lui (p, &icnt, &offset_expr, AT);
5575 if (p != NULL)
5576 p += 4;
5577 if (breg != 0)
5578 {
5579 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5580 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5581 "d,v,t", AT, breg, AT);
5582 if (p != NULL)
5583 p += 4;
5584 }
beae10d5 5585 /* Itbl support may require additional care here. */
252b5132
RH
5586 macro_build (p, &icnt, &offset_expr, s, fmt,
5587 coproc ? treg + 1 : treg,
5588 (int) BFD_RELOC_LO16, AT);
5589 if (p != NULL)
5590 p += 4;
5591 /* FIXME: How do we handle overflow here? */
5592 offset_expr.X_add_number += 4;
beae10d5 5593 /* Itbl support may require additional care here. */
252b5132
RH
5594 macro_build (p, &icnt, &offset_expr, s, fmt,
5595 coproc ? treg : treg + 1,
5596 (int) BFD_RELOC_LO16, AT);
bdaaa2e1 5597 }
252b5132
RH
5598 else if (mips_pic == SVR4_PIC && ! mips_big_got)
5599 {
5600 int off;
5601
5602 /* If this is a reference to an external symbol, we want
5603 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5604 nop
5605 <op> $treg,0($at)
5606 <op> $treg+1,4($at)
5607 Otherwise we want
5608 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5609 nop
5610 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
5611 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
5612 If there is a base register we add it to $at before the
5613 lwc1 instructions. If there is a constant we include it
5614 in the lwc1 instructions. */
5615 used_at = 1;
5616 expr1.X_add_number = offset_expr.X_add_number;
5617 offset_expr.X_add_number = 0;
5618 if (expr1.X_add_number < -0x8000
5619 || expr1.X_add_number >= 0x8000 - 4)
5620 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5621 if (breg == 0)
5622 off = 0;
5623 else
5624 off = 4;
5625 frag_grow (24 + off);
5626 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5627 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5628 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
5629 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
5630 if (breg != 0)
5631 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5632 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132 5633 "d,v,t", AT, breg, AT);
beae10d5 5634 /* Itbl support may require additional care here. */
252b5132
RH
5635 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
5636 coproc ? treg + 1 : treg,
5637 (int) BFD_RELOC_LO16, AT);
5638 expr1.X_add_number += 4;
5639
5640 /* Set mips_optimize to 2 to avoid inserting an undesired
5641 nop. */
5642 hold_mips_optimize = mips_optimize;
5643 mips_optimize = 2;
beae10d5 5644 /* Itbl support may require additional care here. */
252b5132
RH
5645 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
5646 coproc ? treg : treg + 1,
5647 (int) BFD_RELOC_LO16, AT);
5648 mips_optimize = hold_mips_optimize;
5649
5650 (void) frag_var (rs_machine_dependent, 0, 0,
5651 RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
5652 offset_expr.X_add_symbol, (offsetT) 0,
5653 (char *) NULL);
5654 }
5655 else if (mips_pic == SVR4_PIC)
5656 {
5657 int gpdel, off;
5658
5659 /* If this is a reference to an external symbol, we want
5660 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5661 addu $at,$at,$gp
5662 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
5663 nop
5664 <op> $treg,0($at)
5665 <op> $treg+1,4($at)
5666 Otherwise we want
5667 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5668 nop
5669 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
5670 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
5671 If there is a base register we add it to $at before the
5672 lwc1 instructions. If there is a constant we include it
5673 in the lwc1 instructions. */
5674 used_at = 1;
5675 expr1.X_add_number = offset_expr.X_add_number;
5676 offset_expr.X_add_number = 0;
5677 if (expr1.X_add_number < -0x8000
5678 || expr1.X_add_number >= 0x8000 - 4)
5679 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5680 if (reg_needs_delay (GP))
5681 gpdel = 4;
5682 else
5683 gpdel = 0;
5684 if (breg == 0)
5685 off = 0;
5686 else
5687 off = 4;
5688 frag_grow (56);
5689 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5690 AT, (int) BFD_RELOC_MIPS_GOT_HI16);
5691 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5692 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5693 "d,v,t", AT, AT, GP);
5694 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5695 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5696 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
5697 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
5698 if (breg != 0)
5699 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5700 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132 5701 "d,v,t", AT, breg, AT);
beae10d5 5702 /* Itbl support may require additional care here. */
252b5132
RH
5703 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
5704 coproc ? treg + 1 : treg,
5705 (int) BFD_RELOC_LO16, AT);
5706 expr1.X_add_number += 4;
5707
5708 /* Set mips_optimize to 2 to avoid inserting an undesired
5709 nop. */
5710 hold_mips_optimize = mips_optimize;
5711 mips_optimize = 2;
beae10d5 5712 /* Itbl support may require additional care here. */
252b5132
RH
5713 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
5714 coproc ? treg : treg + 1,
5715 (int) BFD_RELOC_LO16, AT);
5716 mips_optimize = hold_mips_optimize;
5717 expr1.X_add_number -= 4;
5718
5719 p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
5720 RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
5721 8 + gpdel + off, 1, 0),
5722 offset_expr.X_add_symbol, (offsetT) 0,
5723 (char *) NULL);
5724 if (gpdel > 0)
5725 {
5726 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5727 p += 4;
5728 }
5729 macro_build (p, &icnt, &offset_expr,
ca4e0257 5730 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
5731 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
5732 p += 4;
5733 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5734 p += 4;
5735 if (breg != 0)
5736 {
5737 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5738 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5739 "d,v,t", AT, breg, AT);
5740 p += 4;
5741 }
beae10d5 5742 /* Itbl support may require additional care here. */
252b5132
RH
5743 macro_build (p, &icnt, &expr1, s, fmt,
5744 coproc ? treg + 1 : treg,
5745 (int) BFD_RELOC_LO16, AT);
5746 p += 4;
5747 expr1.X_add_number += 4;
5748
5749 /* Set mips_optimize to 2 to avoid inserting an undesired
5750 nop. */
5751 hold_mips_optimize = mips_optimize;
5752 mips_optimize = 2;
beae10d5 5753 /* Itbl support may require additional care here. */
252b5132
RH
5754 macro_build (p, &icnt, &expr1, s, fmt,
5755 coproc ? treg : treg + 1,
5756 (int) BFD_RELOC_LO16, AT);
5757 mips_optimize = hold_mips_optimize;
5758 }
5759 else if (mips_pic == EMBEDDED_PIC)
5760 {
5761 /* If there is no base register, we use
5762 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
5763 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_MIPS_GPREL)
5764 If we have a base register, we use
5765 addu $at,$breg,$gp
5766 <op> $treg,<sym>($at) (BFD_RELOC_MIPS_GPREL)
5767 <op> $treg+1,<sym>+4($at) (BFD_RELOC_MIPS_GPREL)
5768 */
5769 if (breg == 0)
5770 {
5771 tempreg = GP;
5772 used_at = 0;
5773 }
5774 else
5775 {
5776 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5777 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5778 "d,v,t", AT, breg, GP);
5779 tempreg = AT;
5780 used_at = 1;
5781 }
5782
beae10d5 5783 /* Itbl support may require additional care here. */
252b5132
RH
5784 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5785 coproc ? treg + 1 : treg,
5786 (int) BFD_RELOC_MIPS_GPREL, tempreg);
5787 offset_expr.X_add_number += 4;
beae10d5 5788 /* Itbl support may require additional care here. */
252b5132
RH
5789 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5790 coproc ? treg : treg + 1,
5791 (int) BFD_RELOC_MIPS_GPREL, tempreg);
5792 }
5793 else
5794 abort ();
5795
5796 if (! used_at)
5797 return;
5798
5799 break;
5800
5801 case M_LD_OB:
5802 s = "lw";
5803 goto sd_ob;
5804 case M_SD_OB:
5805 s = "sw";
5806 sd_ob:
ca4e0257 5807 assert (HAVE_32BIT_ADDRESSES);
252b5132
RH
5808 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
5809 (int) BFD_RELOC_LO16, breg);
5810 offset_expr.X_add_number += 4;
5811 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
5812 (int) BFD_RELOC_LO16, breg);
5813 return;
5814
5815 /* New code added to support COPZ instructions.
5816 This code builds table entries out of the macros in mip_opcodes.
5817 R4000 uses interlocks to handle coproc delays.
5818 Other chips (like the R3000) require nops to be inserted for delays.
5819
f72c8c98 5820 FIXME: Currently, we require that the user handle delays.
252b5132
RH
5821 In order to fill delay slots for non-interlocked chips,
5822 we must have a way to specify delays based on the coprocessor.
5823 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
5824 What are the side-effects of the cop instruction?
5825 What cache support might we have and what are its effects?
5826 Both coprocessor & memory require delays. how long???
bdaaa2e1 5827 What registers are read/set/modified?
252b5132
RH
5828
5829 If an itbl is provided to interpret cop instructions,
bdaaa2e1 5830 this knowledge can be encoded in the itbl spec. */
252b5132
RH
5831
5832 case M_COP0:
5833 s = "c0";
5834 goto copz;
5835 case M_COP1:
5836 s = "c1";
5837 goto copz;
5838 case M_COP2:
5839 s = "c2";
5840 goto copz;
5841 case M_COP3:
5842 s = "c3";
5843 copz:
5844 /* For now we just do C (same as Cz). The parameter will be
5845 stored in insn_opcode by mips_ip. */
5846 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
5847 ip->insn_opcode);
5848 return;
5849
ea1fb5dc
RS
5850 case M_MOVE:
5851 move_register (&icnt, dreg, sreg);
5852 return;
5853
252b5132
RH
5854#ifdef LOSING_COMPILER
5855 default:
5856 /* Try and see if this is a new itbl instruction.
5857 This code builds table entries out of the macros in mip_opcodes.
5858 FIXME: For now we just assemble the expression and pass it's
5859 value along as a 32-bit immediate.
bdaaa2e1 5860 We may want to have the assembler assemble this value,
252b5132
RH
5861 so that we gain the assembler's knowledge of delay slots,
5862 symbols, etc.
5863 Would it be more efficient to use mask (id) here? */
bdaaa2e1 5864 if (itbl_have_entries
252b5132 5865 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
beae10d5 5866 {
252b5132
RH
5867 s = ip->insn_mo->name;
5868 s2 = "cop3";
5869 coproc = ITBL_DECODE_PNUM (immed_expr);;
5870 macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
5871 return;
beae10d5 5872 }
252b5132
RH
5873 macro2 (ip);
5874 return;
5875 }
5876 if (mips_opts.noat)
5877 as_warn (_("Macro used $at after \".set noat\""));
5878}
bdaaa2e1 5879
252b5132
RH
5880static void
5881macro2 (ip)
5882 struct mips_cl_insn *ip;
5883{
5884 register int treg, sreg, dreg, breg;
5885 int tempreg;
5886 int mask;
5887 int icnt = 0;
5888 int used_at;
5889 expressionS expr1;
5890 const char *s;
5891 const char *s2;
5892 const char *fmt;
5893 int likely = 0;
5894 int dbl = 0;
5895 int coproc = 0;
5896 int lr = 0;
5897 int imm = 0;
5898 int off;
5899 offsetT maxnum;
5900 bfd_reloc_code_real_type r;
5901 char *p;
bdaaa2e1 5902
252b5132
RH
5903 treg = (ip->insn_opcode >> 16) & 0x1f;
5904 dreg = (ip->insn_opcode >> 11) & 0x1f;
5905 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
5906 mask = ip->insn_mo->mask;
bdaaa2e1 5907
252b5132
RH
5908 expr1.X_op = O_constant;
5909 expr1.X_op_symbol = NULL;
5910 expr1.X_add_symbol = NULL;
5911 expr1.X_add_number = 1;
bdaaa2e1 5912
252b5132
RH
5913 switch (mask)
5914 {
5915#endif /* LOSING_COMPILER */
5916
5917 case M_DMUL:
5918 dbl = 1;
5919 case M_MUL:
5920 macro_build ((char *) NULL, &icnt, NULL,
5921 dbl ? "dmultu" : "multu",
5922 "s,t", sreg, treg);
5923 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
5924 return;
5925
5926 case M_DMUL_I:
5927 dbl = 1;
5928 case M_MUL_I:
5929 /* The MIPS assembler some times generates shifts and adds. I'm
5930 not trying to be that fancy. GCC should do this for us
5931 anyway. */
5932 load_register (&icnt, AT, &imm_expr, dbl);
5933 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 5934 dbl ? "dmult" : "mult", "s,t", sreg, AT);
252b5132
RH
5935 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
5936 break;
5937
5938 case M_DMULO_I:
5939 dbl = 1;
5940 case M_MULO_I:
5941 imm = 1;
5942 goto do_mulo;
5943
5944 case M_DMULO:
5945 dbl = 1;
5946 case M_MULO:
5947 do_mulo:
5948 mips_emit_delays (true);
5949 ++mips_opts.noreorder;
5950 mips_any_noreorder = 1;
5951 if (imm)
5952 load_register (&icnt, AT, &imm_expr, dbl);
5953 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 5954 dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
252b5132
RH
5955 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
5956 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 5957 dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, 31);
252b5132
RH
5958 macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
5959 if (mips_trap)
5960 macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", dreg, AT);
5961 else
5962 {
5963 expr1.X_add_number = 8;
5964 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg, AT);
5965 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
beae10d5 5966 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
252b5132
RH
5967 }
5968 --mips_opts.noreorder;
5969 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
5970 break;
5971
5972 case M_DMULOU_I:
5973 dbl = 1;
5974 case M_MULOU_I:
5975 imm = 1;
5976 goto do_mulou;
5977
5978 case M_DMULOU:
5979 dbl = 1;
5980 case M_MULOU:
5981 do_mulou:
5982 mips_emit_delays (true);
5983 ++mips_opts.noreorder;
5984 mips_any_noreorder = 1;
5985 if (imm)
5986 load_register (&icnt, AT, &imm_expr, dbl);
5987 macro_build ((char *) NULL, &icnt, NULL,
5988 dbl ? "dmultu" : "multu",
5989 "s,t", sreg, imm ? AT : treg);
5990 macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
5991 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
5992 if (mips_trap)
5993 macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", AT, 0);
5994 else
5995 {
5996 expr1.X_add_number = 8;
5997 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
5998 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
beae10d5 5999 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
252b5132
RH
6000 }
6001 --mips_opts.noreorder;
6002 break;
6003
6004 case M_ROL:
6005 macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
6006 macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", AT, sreg, AT);
6007 macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", dreg, sreg,
6008 treg);
6009 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
6010 break;
6011
6012 case M_ROL_I:
6013 if (imm_expr.X_op != O_constant)
6014 as_bad (_("rotate count too large"));
6015 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", AT, sreg,
6016 (int) (imm_expr.X_add_number & 0x1f));
6017 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg,
6018 (int) ((0 - imm_expr.X_add_number) & 0x1f));
6019 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
6020 break;
6021
6022 case M_ROR:
6023 macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
6024 macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", AT, sreg, AT);
6025 macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", dreg, sreg,
6026 treg);
6027 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
6028 break;
6029
6030 case M_ROR_I:
6031 if (imm_expr.X_op != O_constant)
6032 as_bad (_("rotate count too large"));
6033 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, sreg,
6034 (int) (imm_expr.X_add_number & 0x1f));
6035 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", dreg, sreg,
6036 (int) ((0 - imm_expr.X_add_number) & 0x1f));
6037 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
6038 break;
6039
6040 case M_S_DOB:
ec68c924 6041 if (mips_arch == CPU_R4650)
252b5132
RH
6042 {
6043 as_bad (_("opcode not supported on this processor"));
6044 return;
6045 }
e7af610e 6046 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
6047 /* Even on a big endian machine $fn comes before $fn+1. We have
6048 to adjust when storing to memory. */
6049 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
6050 target_big_endian ? treg + 1 : treg,
6051 (int) BFD_RELOC_LO16, breg);
6052 offset_expr.X_add_number += 4;
6053 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
6054 target_big_endian ? treg : treg + 1,
6055 (int) BFD_RELOC_LO16, breg);
6056 return;
6057
6058 case M_SEQ:
6059 if (sreg == 0)
6060 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6061 treg, (int) BFD_RELOC_LO16);
6062 else if (treg == 0)
6063 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6064 sreg, (int) BFD_RELOC_LO16);
6065 else
6066 {
6067 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
6068 sreg, treg);
6069 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6070 dreg, (int) BFD_RELOC_LO16);
6071 }
6072 return;
6073
6074 case M_SEQ_I:
6075 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6076 {
6077 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6078 sreg, (int) BFD_RELOC_LO16);
6079 return;
6080 }
6081 if (sreg == 0)
6082 {
6083 as_warn (_("Instruction %s: result is always false"),
6084 ip->insn_mo->name);
ea1fb5dc 6085 move_register (&icnt, dreg, 0);
252b5132
RH
6086 return;
6087 }
6088 if (imm_expr.X_op == O_constant
6089 && imm_expr.X_add_number >= 0
6090 && imm_expr.X_add_number < 0x10000)
6091 {
6092 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
6093 sreg, (int) BFD_RELOC_LO16);
6094 used_at = 0;
6095 }
6096 else if (imm_expr.X_op == O_constant
6097 && imm_expr.X_add_number > -0x8000
6098 && imm_expr.X_add_number < 0)
6099 {
6100 imm_expr.X_add_number = -imm_expr.X_add_number;
6101 macro_build ((char *) NULL, &icnt, &imm_expr,
ca4e0257 6102 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
6103 "t,r,j", dreg, sreg,
6104 (int) BFD_RELOC_LO16);
6105 used_at = 0;
6106 }
6107 else
6108 {
6109 load_register (&icnt, AT, &imm_expr, 0);
6110 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
6111 sreg, AT);
6112 used_at = 1;
6113 }
6114 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
6115 (int) BFD_RELOC_LO16);
6116 if (used_at)
6117 break;
6118 return;
6119
6120 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
6121 s = "slt";
6122 goto sge;
6123 case M_SGEU:
6124 s = "sltu";
6125 sge:
6126 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, sreg, treg);
6127 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6128 (int) BFD_RELOC_LO16);
6129 return;
6130
6131 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
6132 case M_SGEU_I:
6133 if (imm_expr.X_op == O_constant
6134 && imm_expr.X_add_number >= -0x8000
6135 && imm_expr.X_add_number < 0x8000)
6136 {
6137 macro_build ((char *) NULL, &icnt, &imm_expr,
6138 mask == M_SGE_I ? "slti" : "sltiu",
6139 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6140 used_at = 0;
6141 }
6142 else
6143 {
6144 load_register (&icnt, AT, &imm_expr, 0);
6145 macro_build ((char *) NULL, &icnt, NULL,
6146 mask == M_SGE_I ? "slt" : "sltu",
6147 "d,v,t", dreg, sreg, AT);
6148 used_at = 1;
6149 }
6150 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6151 (int) BFD_RELOC_LO16);
6152 if (used_at)
6153 break;
6154 return;
6155
6156 case M_SGT: /* sreg > treg <==> treg < sreg */
6157 s = "slt";
6158 goto sgt;
6159 case M_SGTU:
6160 s = "sltu";
6161 sgt:
6162 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
6163 return;
6164
6165 case M_SGT_I: /* sreg > I <==> I < sreg */
6166 s = "slt";
6167 goto sgti;
6168 case M_SGTU_I:
6169 s = "sltu";
6170 sgti:
6171 load_register (&icnt, AT, &imm_expr, 0);
6172 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
6173 break;
6174
6175 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
6176 s = "slt";
6177 goto sle;
6178 case M_SLEU:
6179 s = "sltu";
6180 sle:
6181 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
6182 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6183 (int) BFD_RELOC_LO16);
6184 return;
6185
6186 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
6187 s = "slt";
6188 goto slei;
6189 case M_SLEU_I:
6190 s = "sltu";
6191 slei:
6192 load_register (&icnt, AT, &imm_expr, 0);
6193 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
6194 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6195 (int) BFD_RELOC_LO16);
6196 break;
6197
6198 case M_SLT_I:
6199 if (imm_expr.X_op == O_constant
6200 && imm_expr.X_add_number >= -0x8000
6201 && imm_expr.X_add_number < 0x8000)
6202 {
6203 macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
6204 dreg, sreg, (int) BFD_RELOC_LO16);
6205 return;
6206 }
6207 load_register (&icnt, AT, &imm_expr, 0);
6208 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", dreg, sreg, AT);
6209 break;
6210
6211 case M_SLTU_I:
6212 if (imm_expr.X_op == O_constant
6213 && imm_expr.X_add_number >= -0x8000
6214 && imm_expr.X_add_number < 0x8000)
6215 {
6216 macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
6217 dreg, sreg, (int) BFD_RELOC_LO16);
6218 return;
6219 }
6220 load_register (&icnt, AT, &imm_expr, 0);
6221 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, sreg,
6222 AT);
6223 break;
6224
6225 case M_SNE:
6226 if (sreg == 0)
6227 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
6228 treg);
6229 else if (treg == 0)
6230 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
6231 sreg);
6232 else
6233 {
6234 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
6235 sreg, treg);
6236 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
6237 dreg);
6238 }
6239 return;
6240
6241 case M_SNE_I:
6242 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6243 {
6244 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
6245 sreg);
6246 return;
6247 }
6248 if (sreg == 0)
6249 {
6250 as_warn (_("Instruction %s: result is always true"),
6251 ip->insn_mo->name);
6252 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 6253 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
6254 "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
6255 return;
6256 }
6257 if (imm_expr.X_op == O_constant
6258 && imm_expr.X_add_number >= 0
6259 && imm_expr.X_add_number < 0x10000)
6260 {
6261 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
6262 dreg, sreg, (int) BFD_RELOC_LO16);
6263 used_at = 0;
6264 }
6265 else if (imm_expr.X_op == O_constant
6266 && imm_expr.X_add_number > -0x8000
6267 && imm_expr.X_add_number < 0)
6268 {
6269 imm_expr.X_add_number = -imm_expr.X_add_number;
6270 macro_build ((char *) NULL, &icnt, &imm_expr,
ca4e0257 6271 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
6272 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6273 used_at = 0;
6274 }
6275 else
6276 {
6277 load_register (&icnt, AT, &imm_expr, 0);
6278 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
6279 sreg, AT);
6280 used_at = 1;
6281 }
6282 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
6283 if (used_at)
6284 break;
6285 return;
6286
6287 case M_DSUB_I:
6288 dbl = 1;
6289 case M_SUB_I:
6290 if (imm_expr.X_op == O_constant
6291 && imm_expr.X_add_number > -0x8000
6292 && imm_expr.X_add_number <= 0x8000)
6293 {
6294 imm_expr.X_add_number = -imm_expr.X_add_number;
6295 macro_build ((char *) NULL, &icnt, &imm_expr,
6296 dbl ? "daddi" : "addi",
6297 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6298 return;
6299 }
6300 load_register (&icnt, AT, &imm_expr, dbl);
6301 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 6302 dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
252b5132
RH
6303 break;
6304
6305 case M_DSUBU_I:
6306 dbl = 1;
6307 case M_SUBU_I:
6308 if (imm_expr.X_op == O_constant
6309 && imm_expr.X_add_number > -0x8000
6310 && imm_expr.X_add_number <= 0x8000)
6311 {
6312 imm_expr.X_add_number = -imm_expr.X_add_number;
6313 macro_build ((char *) NULL, &icnt, &imm_expr,
6314 dbl ? "daddiu" : "addiu",
6315 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6316 return;
6317 }
6318 load_register (&icnt, AT, &imm_expr, dbl);
6319 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 6320 dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
252b5132
RH
6321 break;
6322
6323 case M_TEQ_I:
6324 s = "teq";
6325 goto trap;
6326 case M_TGE_I:
6327 s = "tge";
6328 goto trap;
6329 case M_TGEU_I:
6330 s = "tgeu";
6331 goto trap;
6332 case M_TLT_I:
6333 s = "tlt";
6334 goto trap;
6335 case M_TLTU_I:
6336 s = "tltu";
6337 goto trap;
6338 case M_TNE_I:
6339 s = "tne";
6340 trap:
6341 load_register (&icnt, AT, &imm_expr, 0);
6342 macro_build ((char *) NULL, &icnt, NULL, s, "s,t", sreg, AT);
6343 break;
6344
252b5132 6345 case M_TRUNCWS:
43841e91 6346 case M_TRUNCWD:
e7af610e 6347 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
6348 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
6349 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
6350
6351 /*
6352 * Is the double cfc1 instruction a bug in the mips assembler;
6353 * or is there a reason for it?
6354 */
6355 mips_emit_delays (true);
6356 ++mips_opts.noreorder;
6357 mips_any_noreorder = 1;
6358 macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
6359 macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
6360 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
6361 expr1.X_add_number = 3;
6362 macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
6363 (int) BFD_RELOC_LO16);
6364 expr1.X_add_number = 2;
6365 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
6366 (int) BFD_RELOC_LO16);
6367 macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", AT, 31);
6368 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
6369 macro_build ((char *) NULL, &icnt, NULL,
6370 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
6371 macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", treg, 31);
6372 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
6373 --mips_opts.noreorder;
6374 break;
6375
6376 case M_ULH:
6377 s = "lb";
6378 goto ulh;
6379 case M_ULHU:
6380 s = "lbu";
6381 ulh:
6382 if (offset_expr.X_add_number >= 0x7fff)
6383 as_bad (_("operand overflow"));
6384 /* avoid load delay */
6385 if (! target_big_endian)
6386 offset_expr.X_add_number += 1;
6387 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6388 (int) BFD_RELOC_LO16, breg);
6389 if (! target_big_endian)
6390 offset_expr.X_add_number -= 1;
6391 else
6392 offset_expr.X_add_number += 1;
6393 macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
6394 (int) BFD_RELOC_LO16, breg);
6395 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg, treg, 8);
6396 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
6397 break;
6398
6399 case M_ULD:
6400 s = "ldl";
6401 s2 = "ldr";
6402 off = 7;
6403 goto ulw;
6404 case M_ULW:
6405 s = "lwl";
6406 s2 = "lwr";
6407 off = 3;
6408 ulw:
6409 if (offset_expr.X_add_number >= 0x8000 - off)
6410 as_bad (_("operand overflow"));
6411 if (! target_big_endian)
6412 offset_expr.X_add_number += off;
6413 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6414 (int) BFD_RELOC_LO16, breg);
6415 if (! target_big_endian)
6416 offset_expr.X_add_number -= off;
6417 else
6418 offset_expr.X_add_number += off;
6419 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
6420 (int) BFD_RELOC_LO16, breg);
6421 return;
6422
6423 case M_ULD_A:
6424 s = "ldl";
6425 s2 = "ldr";
6426 off = 7;
6427 goto ulwa;
6428 case M_ULW_A:
6429 s = "lwl";
6430 s2 = "lwr";
6431 off = 3;
6432 ulwa:
6433 load_address (&icnt, AT, &offset_expr);
6434 if (breg != 0)
6435 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6436 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6437 "d,v,t", AT, AT, breg);
6438 if (! target_big_endian)
6439 expr1.X_add_number = off;
6440 else
6441 expr1.X_add_number = 0;
6442 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
6443 (int) BFD_RELOC_LO16, AT);
6444 if (! target_big_endian)
6445 expr1.X_add_number = 0;
6446 else
6447 expr1.X_add_number = off;
6448 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
6449 (int) BFD_RELOC_LO16, AT);
6450 break;
6451
6452 case M_ULH_A:
6453 case M_ULHU_A:
6454 load_address (&icnt, AT, &offset_expr);
6455 if (breg != 0)
6456 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6457 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6458 "d,v,t", AT, AT, breg);
6459 if (target_big_endian)
6460 expr1.X_add_number = 0;
6461 macro_build ((char *) NULL, &icnt, &expr1,
6462 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
6463 (int) BFD_RELOC_LO16, AT);
6464 if (target_big_endian)
6465 expr1.X_add_number = 1;
6466 else
6467 expr1.X_add_number = 0;
6468 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
6469 (int) BFD_RELOC_LO16, AT);
6470 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
6471 treg, 8);
6472 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
6473 treg, AT);
6474 break;
6475
6476 case M_USH:
6477 if (offset_expr.X_add_number >= 0x7fff)
6478 as_bad (_("operand overflow"));
6479 if (target_big_endian)
6480 offset_expr.X_add_number += 1;
6481 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
6482 (int) BFD_RELOC_LO16, breg);
6483 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, treg, 8);
6484 if (target_big_endian)
6485 offset_expr.X_add_number -= 1;
6486 else
6487 offset_expr.X_add_number += 1;
6488 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
6489 (int) BFD_RELOC_LO16, breg);
6490 break;
6491
6492 case M_USD:
6493 s = "sdl";
6494 s2 = "sdr";
6495 off = 7;
6496 goto usw;
6497 case M_USW:
6498 s = "swl";
6499 s2 = "swr";
6500 off = 3;
6501 usw:
6502 if (offset_expr.X_add_number >= 0x8000 - off)
6503 as_bad (_("operand overflow"));
6504 if (! target_big_endian)
6505 offset_expr.X_add_number += off;
6506 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6507 (int) BFD_RELOC_LO16, breg);
6508 if (! target_big_endian)
6509 offset_expr.X_add_number -= off;
6510 else
6511 offset_expr.X_add_number += off;
6512 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
6513 (int) BFD_RELOC_LO16, breg);
6514 return;
6515
6516 case M_USD_A:
6517 s = "sdl";
6518 s2 = "sdr";
6519 off = 7;
6520 goto uswa;
6521 case M_USW_A:
6522 s = "swl";
6523 s2 = "swr";
6524 off = 3;
6525 uswa:
6526 load_address (&icnt, AT, &offset_expr);
6527 if (breg != 0)
6528 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6529 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6530 "d,v,t", AT, AT, breg);
6531 if (! target_big_endian)
6532 expr1.X_add_number = off;
6533 else
6534 expr1.X_add_number = 0;
6535 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
6536 (int) BFD_RELOC_LO16, AT);
6537 if (! target_big_endian)
6538 expr1.X_add_number = 0;
6539 else
6540 expr1.X_add_number = off;
6541 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
6542 (int) BFD_RELOC_LO16, AT);
6543 break;
6544
6545 case M_USH_A:
6546 load_address (&icnt, AT, &offset_expr);
6547 if (breg != 0)
6548 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6549 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6550 "d,v,t", AT, AT, breg);
6551 if (! target_big_endian)
6552 expr1.X_add_number = 0;
6553 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
6554 (int) BFD_RELOC_LO16, AT);
6555 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", treg,
6556 treg, 8);
6557 if (! target_big_endian)
6558 expr1.X_add_number = 1;
6559 else
6560 expr1.X_add_number = 0;
6561 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
6562 (int) BFD_RELOC_LO16, AT);
6563 if (! target_big_endian)
6564 expr1.X_add_number = 0;
6565 else
6566 expr1.X_add_number = 1;
6567 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
6568 (int) BFD_RELOC_LO16, AT);
6569 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
6570 treg, 8);
6571 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
6572 treg, AT);
6573 break;
6574
6575 default:
6576 /* FIXME: Check if this is one of the itbl macros, since they
bdaaa2e1 6577 are added dynamically. */
252b5132
RH
6578 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
6579 break;
6580 }
6581 if (mips_opts.noat)
6582 as_warn (_("Macro used $at after \".set noat\""));
6583}
6584
6585/* Implement macros in mips16 mode. */
6586
6587static void
6588mips16_macro (ip)
6589 struct mips_cl_insn *ip;
6590{
6591 int mask;
6592 int xreg, yreg, zreg, tmp;
6593 int icnt;
6594 expressionS expr1;
6595 int dbl;
6596 const char *s, *s2, *s3;
6597
6598 mask = ip->insn_mo->mask;
6599
6600 xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
6601 yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
6602 zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
6603
6604 icnt = 0;
6605
6606 expr1.X_op = O_constant;
6607 expr1.X_op_symbol = NULL;
6608 expr1.X_add_symbol = NULL;
6609 expr1.X_add_number = 1;
6610
6611 dbl = 0;
6612
6613 switch (mask)
6614 {
6615 default:
6616 internalError ();
6617
6618 case M_DDIV_3:
6619 dbl = 1;
6620 case M_DIV_3:
6621 s = "mflo";
6622 goto do_div3;
6623 case M_DREM_3:
6624 dbl = 1;
6625 case M_REM_3:
6626 s = "mfhi";
6627 do_div3:
6628 mips_emit_delays (true);
6629 ++mips_opts.noreorder;
6630 mips_any_noreorder = 1;
6631 macro_build ((char *) NULL, &icnt, NULL,
6632 dbl ? "ddiv" : "div",
6633 "0,x,y", xreg, yreg);
6634 expr1.X_add_number = 2;
6635 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
beae10d5 6636 macro_build ((char *) NULL, &icnt, NULL, "break", "6", 7);
bdaaa2e1 6637
252b5132
RH
6638 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
6639 since that causes an overflow. We should do that as well,
6640 but I don't see how to do the comparisons without a temporary
6641 register. */
6642 --mips_opts.noreorder;
6643 macro_build ((char *) NULL, &icnt, NULL, s, "x", zreg);
6644 break;
6645
6646 case M_DIVU_3:
6647 s = "divu";
6648 s2 = "mflo";
6649 goto do_divu3;
6650 case M_REMU_3:
6651 s = "divu";
6652 s2 = "mfhi";
6653 goto do_divu3;
6654 case M_DDIVU_3:
6655 s = "ddivu";
6656 s2 = "mflo";
6657 goto do_divu3;
6658 case M_DREMU_3:
6659 s = "ddivu";
6660 s2 = "mfhi";
6661 do_divu3:
6662 mips_emit_delays (true);
6663 ++mips_opts.noreorder;
6664 mips_any_noreorder = 1;
6665 macro_build ((char *) NULL, &icnt, NULL, s, "0,x,y", xreg, yreg);
6666 expr1.X_add_number = 2;
6667 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
6668 macro_build ((char *) NULL, &icnt, NULL, "break", "6", 7);
6669 --mips_opts.noreorder;
6670 macro_build ((char *) NULL, &icnt, NULL, s2, "x", zreg);
6671 break;
6672
6673 case M_DMUL:
6674 dbl = 1;
6675 case M_MUL:
6676 macro_build ((char *) NULL, &icnt, NULL,
9a41af64 6677 dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
252b5132
RH
6678 macro_build ((char *) NULL, &icnt, NULL, "mflo", "x", zreg);
6679 return;
6680
6681 case M_DSUBU_I:
6682 dbl = 1;
6683 goto do_subu;
6684 case M_SUBU_I:
6685 do_subu:
6686 if (imm_expr.X_op != O_constant)
6687 as_bad (_("Unsupported large constant"));
6688 imm_expr.X_add_number = -imm_expr.X_add_number;
6689 macro_build ((char *) NULL, &icnt, &imm_expr,
9a41af64 6690 dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
252b5132
RH
6691 break;
6692
6693 case M_SUBU_I_2:
6694 if (imm_expr.X_op != O_constant)
6695 as_bad (_("Unsupported large constant"));
6696 imm_expr.X_add_number = -imm_expr.X_add_number;
6697 macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
6698 "x,k", xreg);
6699 break;
6700
6701 case M_DSUBU_I_2:
6702 if (imm_expr.X_op != O_constant)
6703 as_bad (_("Unsupported large constant"));
6704 imm_expr.X_add_number = -imm_expr.X_add_number;
6705 macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
6706 "y,j", yreg);
6707 break;
6708
6709 case M_BEQ:
6710 s = "cmp";
6711 s2 = "bteqz";
6712 goto do_branch;
6713 case M_BNE:
6714 s = "cmp";
6715 s2 = "btnez";
6716 goto do_branch;
6717 case M_BLT:
6718 s = "slt";
6719 s2 = "btnez";
6720 goto do_branch;
6721 case M_BLTU:
6722 s = "sltu";
6723 s2 = "btnez";
6724 goto do_branch;
6725 case M_BLE:
6726 s = "slt";
6727 s2 = "bteqz";
6728 goto do_reverse_branch;
6729 case M_BLEU:
6730 s = "sltu";
6731 s2 = "bteqz";
6732 goto do_reverse_branch;
6733 case M_BGE:
6734 s = "slt";
6735 s2 = "bteqz";
6736 goto do_branch;
6737 case M_BGEU:
6738 s = "sltu";
6739 s2 = "bteqz";
6740 goto do_branch;
6741 case M_BGT:
6742 s = "slt";
6743 s2 = "btnez";
6744 goto do_reverse_branch;
6745 case M_BGTU:
6746 s = "sltu";
6747 s2 = "btnez";
6748
6749 do_reverse_branch:
6750 tmp = xreg;
6751 xreg = yreg;
6752 yreg = tmp;
6753
6754 do_branch:
6755 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
6756 xreg, yreg);
6757 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
6758 break;
6759
6760 case M_BEQ_I:
6761 s = "cmpi";
6762 s2 = "bteqz";
6763 s3 = "x,U";
6764 goto do_branch_i;
6765 case M_BNE_I:
6766 s = "cmpi";
6767 s2 = "btnez";
6768 s3 = "x,U";
6769 goto do_branch_i;
6770 case M_BLT_I:
6771 s = "slti";
6772 s2 = "btnez";
6773 s3 = "x,8";
6774 goto do_branch_i;
6775 case M_BLTU_I:
6776 s = "sltiu";
6777 s2 = "btnez";
6778 s3 = "x,8";
6779 goto do_branch_i;
6780 case M_BLE_I:
6781 s = "slti";
6782 s2 = "btnez";
6783 s3 = "x,8";
6784 goto do_addone_branch_i;
6785 case M_BLEU_I:
6786 s = "sltiu";
6787 s2 = "btnez";
6788 s3 = "x,8";
6789 goto do_addone_branch_i;
6790 case M_BGE_I:
6791 s = "slti";
6792 s2 = "bteqz";
6793 s3 = "x,8";
6794 goto do_branch_i;
6795 case M_BGEU_I:
6796 s = "sltiu";
6797 s2 = "bteqz";
6798 s3 = "x,8";
6799 goto do_branch_i;
6800 case M_BGT_I:
6801 s = "slti";
6802 s2 = "bteqz";
6803 s3 = "x,8";
6804 goto do_addone_branch_i;
6805 case M_BGTU_I:
6806 s = "sltiu";
6807 s2 = "bteqz";
6808 s3 = "x,8";
6809
6810 do_addone_branch_i:
6811 if (imm_expr.X_op != O_constant)
6812 as_bad (_("Unsupported large constant"));
6813 ++imm_expr.X_add_number;
6814
6815 do_branch_i:
6816 macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
6817 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
6818 break;
6819
6820 case M_ABS:
6821 expr1.X_add_number = 0;
6822 macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8", yreg);
6823 if (xreg != yreg)
ea1fb5dc 6824 move_register (&icnt, xreg, yreg);
252b5132
RH
6825 expr1.X_add_number = 2;
6826 macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
6827 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6828 "neg", "x,w", xreg, xreg);
6829 }
6830}
6831
6832/* For consistency checking, verify that all bits are specified either
6833 by the match/mask part of the instruction definition, or by the
6834 operand list. */
6835static int
6836validate_mips_insn (opc)
6837 const struct mips_opcode *opc;
6838{
6839 const char *p = opc->args;
6840 char c;
6841 unsigned long used_bits = opc->mask;
6842
6843 if ((used_bits & opc->match) != opc->match)
6844 {
6845 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
6846 opc->name, opc->args);
6847 return 0;
6848 }
6849#define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
6850 while (*p)
6851 switch (c = *p++)
6852 {
6853 case ',': break;
6854 case '(': break;
6855 case ')': break;
6856 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
6857 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
6858 case 'A': break;
4372b673 6859 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
252b5132
RH
6860 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
6861 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
6862 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
6863 case 'F': break;
6864 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
156c2f8b 6865 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
252b5132 6866 case 'I': break;
e972090a 6867 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
252b5132
RH
6868 case 'L': break;
6869 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
6870 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
6871 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
6872 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
6873 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
6874 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
6875 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
6876 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
6877 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
6878 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
6879 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
6880 case 'f': break;
6881 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
6882 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
6883 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
6884 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
6885 case 'l': break;
6886 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
6887 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
6888 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
6889 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
6890 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
6891 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
6892 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
6893 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
6894 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
6895 case 'x': break;
6896 case 'z': break;
6897 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
4372b673
NC
6898 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
6899 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
252b5132
RH
6900 default:
6901 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
6902 c, opc->name, opc->args);
6903 return 0;
6904 }
6905#undef USE_BITS
6906 if (used_bits != 0xffffffff)
6907 {
6908 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
6909 ~used_bits & 0xffffffff, opc->name, opc->args);
6910 return 0;
6911 }
6912 return 1;
6913}
6914
6915/* This routine assembles an instruction into its binary format. As a
6916 side effect, it sets one of the global variables imm_reloc or
6917 offset_reloc to the type of relocation to do if one of the operands
6918 is an address expression. */
6919
6920static void
6921mips_ip (str, ip)
6922 char *str;
6923 struct mips_cl_insn *ip;
6924{
6925 char *s;
6926 const char *args;
43841e91 6927 char c = 0;
252b5132
RH
6928 struct mips_opcode *insn;
6929 char *argsStart;
6930 unsigned int regno;
6931 unsigned int lastregno = 0;
6932 char *s_reset;
6933 char save_c = 0;
6934 int full_opcode_match = 1;
6935
6936 insn_error = NULL;
6937
6938 /* If the instruction contains a '.', we first try to match an instruction
6939 including the '.'. Then we try again without the '.'. */
6940 insn = NULL;
d9a62219 6941 for (s = str; *s != '\0' && !isspace ((unsigned char) *s); ++s)
252b5132
RH
6942 continue;
6943
6944 /* If we stopped on whitespace, then replace the whitespace with null for
6945 the call to hash_find. Save the character we replaced just in case we
6946 have to re-parse the instruction. */
d9a62219 6947 if (isspace ((unsigned char) *s))
252b5132
RH
6948 {
6949 save_c = *s;
6950 *s++ = '\0';
6951 }
bdaaa2e1 6952
252b5132
RH
6953 insn = (struct mips_opcode *) hash_find (op_hash, str);
6954
6955 /* If we didn't find the instruction in the opcode table, try again, but
6956 this time with just the instruction up to, but not including the
6957 first '.'. */
6958 if (insn == NULL)
6959 {
bdaaa2e1 6960 /* Restore the character we overwrite above (if any). */
252b5132
RH
6961 if (save_c)
6962 *(--s) = save_c;
6963
6964 /* Scan up to the first '.' or whitespace. */
d9a62219 6965 for (s = str; *s != '\0' && *s != '.' && !isspace ((unsigned char) *s); ++s)
252b5132
RH
6966 continue;
6967
6968 /* If we did not find a '.', then we can quit now. */
6969 if (*s != '.')
6970 {
6971 insn_error = "unrecognized opcode";
6972 return;
6973 }
6974
6975 /* Lookup the instruction in the hash table. */
6976 *s++ = '\0';
6977 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
6978 {
6979 insn_error = "unrecognized opcode";
6980 return;
6981 }
6982
6983 full_opcode_match = 0;
6984 }
6985
6986 argsStart = s;
6987 for (;;)
6988 {
252b5132
RH
6989 boolean ok;
6990
6991 assert (strcmp (insn->name, str) == 0);
6992
ea1fb5dc 6993 if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_arch))
252b5132 6994 ok = true;
bdaaa2e1 6995 else
252b5132 6996 ok = false;
bdaaa2e1 6997
252b5132
RH
6998 if (insn->pinfo != INSN_MACRO)
6999 {
ec68c924 7000 if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
252b5132
RH
7001 ok = false;
7002 }
7003
7004 if (! ok)
7005 {
7006 if (insn + 1 < &mips_opcodes[NUMOPCODES]
7007 && strcmp (insn->name, insn[1].name) == 0)
7008 {
7009 ++insn;
7010 continue;
7011 }
252b5132 7012 else
beae10d5 7013 {
268f6bed
L
7014 if (!insn_error)
7015 {
7016 static char buf[100];
7017 sprintf (buf,
7018 _("opcode not supported on this processor: %s (%s)"),
ec68c924 7019 mips_cpu_to_str (mips_arch),
268f6bed 7020 mips_isa_to_str (mips_opts.isa));
bdaaa2e1 7021
268f6bed
L
7022 insn_error = buf;
7023 }
7024 if (save_c)
7025 *(--s) = save_c;
2bd7f1f3 7026 return;
252b5132 7027 }
252b5132
RH
7028 }
7029
7030 ip->insn_mo = insn;
7031 ip->insn_opcode = insn->match;
268f6bed 7032 insn_error = NULL;
252b5132
RH
7033 for (args = insn->args;; ++args)
7034 {
7035 if (*s == ' ')
7036 ++s;
7037 switch (*args)
7038 {
7039 case '\0': /* end of args */
7040 if (*s == '\0')
7041 return;
7042 break;
7043
7044 case ',':
7045 if (*s++ == *args)
7046 continue;
7047 s--;
7048 switch (*++args)
7049 {
7050 case 'r':
7051 case 'v':
38487616 7052 ip->insn_opcode |= lastregno << OP_SH_RS;
252b5132
RH
7053 continue;
7054
7055 case 'w':
38487616
TS
7056 ip->insn_opcode |= lastregno << OP_SH_RT;
7057 continue;
7058
252b5132 7059 case 'W':
38487616 7060 ip->insn_opcode |= lastregno << OP_SH_FT;
252b5132
RH
7061 continue;
7062
7063 case 'V':
38487616 7064 ip->insn_opcode |= lastregno << OP_SH_FS;
252b5132
RH
7065 continue;
7066 }
7067 break;
7068
7069 case '(':
7070 /* Handle optional base register.
7071 Either the base register is omitted or
bdaaa2e1 7072 we must have a left paren. */
252b5132
RH
7073 /* This is dependent on the next operand specifier
7074 is a base register specification. */
7075 assert (args[1] == 'b' || args[1] == '5'
7076 || args[1] == '-' || args[1] == '4');
7077 if (*s == '\0')
7078 return;
7079
7080 case ')': /* these must match exactly */
7081 if (*s++ == *args)
7082 continue;
7083 break;
7084
7085 case '<': /* must be at least one digit */
7086 /*
7087 * According to the manual, if the shift amount is greater
7088 * than 31 or less than 0 the the shift amount should be
7089 * mod 32. In reality the mips assembler issues an error.
7090 * We issue a warning and mask out all but the low 5 bits.
7091 */
7092 my_getExpression (&imm_expr, s);
7093 check_absolute_expr (ip, &imm_expr);
7094 if ((unsigned long) imm_expr.X_add_number > 31)
7095 {
7096 as_warn (_("Improper shift amount (%ld)"),
7097 (long) imm_expr.X_add_number);
38487616 7098 imm_expr.X_add_number &= OP_MASK_SHAMT;
252b5132 7099 }
38487616 7100 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
252b5132
RH
7101 imm_expr.X_op = O_absent;
7102 s = expr_end;
7103 continue;
7104
7105 case '>': /* shift amount minus 32 */
7106 my_getExpression (&imm_expr, s);
7107 check_absolute_expr (ip, &imm_expr);
7108 if ((unsigned long) imm_expr.X_add_number < 32
7109 || (unsigned long) imm_expr.X_add_number > 63)
7110 break;
38487616 7111 ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
252b5132
RH
7112 imm_expr.X_op = O_absent;
7113 s = expr_end;
7114 continue;
7115
252b5132
RH
7116 case 'k': /* cache code */
7117 case 'h': /* prefx code */
7118 my_getExpression (&imm_expr, s);
7119 check_absolute_expr (ip, &imm_expr);
7120 if ((unsigned long) imm_expr.X_add_number > 31)
7121 {
7122 as_warn (_("Invalid value for `%s' (%lu)"),
7123 ip->insn_mo->name,
7124 (unsigned long) imm_expr.X_add_number);
7125 imm_expr.X_add_number &= 0x1f;
7126 }
7127 if (*args == 'k')
7128 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
7129 else
7130 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
7131 imm_expr.X_op = O_absent;
7132 s = expr_end;
7133 continue;
7134
7135 case 'c': /* break code */
7136 my_getExpression (&imm_expr, s);
7137 check_absolute_expr (ip, &imm_expr);
7138 if ((unsigned) imm_expr.X_add_number > 1023)
7139 {
7140 as_warn (_("Illegal break code (%ld)"),
7141 (long) imm_expr.X_add_number);
38487616 7142 imm_expr.X_add_number &= OP_MASK_CODE;
252b5132 7143 }
38487616 7144 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
252b5132
RH
7145 imm_expr.X_op = O_absent;
7146 s = expr_end;
7147 continue;
7148
7149 case 'q': /* lower break code */
7150 my_getExpression (&imm_expr, s);
7151 check_absolute_expr (ip, &imm_expr);
7152 if ((unsigned) imm_expr.X_add_number > 1023)
7153 {
7154 as_warn (_("Illegal lower break code (%ld)"),
7155 (long) imm_expr.X_add_number);
38487616 7156 imm_expr.X_add_number &= OP_MASK_CODE2;
252b5132 7157 }
38487616 7158 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
252b5132
RH
7159 imm_expr.X_op = O_absent;
7160 s = expr_end;
7161 continue;
7162
4372b673 7163 case 'B': /* 20-bit syscall/break code. */
156c2f8b 7164 my_getExpression (&imm_expr, s);
156c2f8b 7165 check_absolute_expr (ip, &imm_expr);
38487616 7166 if ((unsigned) imm_expr.X_add_number > OP_MASK_CODE20)
4372b673 7167 as_warn (_("Illegal 20-bit code (%ld)"),
252b5132 7168 (long) imm_expr.X_add_number);
38487616 7169 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
252b5132
RH
7170 imm_expr.X_op = O_absent;
7171 s = expr_end;
7172 continue;
7173
7174 case 'C': /* Coprocessor code */
beae10d5 7175 my_getExpression (&imm_expr, s);
252b5132 7176 check_absolute_expr (ip, &imm_expr);
beae10d5 7177 if ((unsigned long) imm_expr.X_add_number >= (1<<25))
252b5132 7178 {
beae10d5 7179 as_warn (_("Coproccesor code > 25 bits (%ld)"),
252b5132 7180 (long) imm_expr.X_add_number);
beae10d5 7181 imm_expr.X_add_number &= ((1<<25) - 1);
252b5132 7182 }
beae10d5
KH
7183 ip->insn_opcode |= imm_expr.X_add_number;
7184 imm_expr.X_op = O_absent;
7185 s = expr_end;
7186 continue;
252b5132 7187
4372b673
NC
7188 case 'J': /* 19-bit wait code. */
7189 my_getExpression (&imm_expr, s);
7190 check_absolute_expr (ip, &imm_expr);
38487616 7191 if ((unsigned) imm_expr.X_add_number > OP_MASK_CODE19)
4372b673
NC
7192 as_warn (_("Illegal 19-bit code (%ld)"),
7193 (long) imm_expr.X_add_number);
38487616 7194 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
4372b673
NC
7195 imm_expr.X_op = O_absent;
7196 s = expr_end;
7197 continue;
7198
252b5132 7199 case 'P': /* Performance register */
beae10d5 7200 my_getExpression (&imm_expr, s);
252b5132 7201 check_absolute_expr (ip, &imm_expr);
beae10d5 7202 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
252b5132 7203 {
38487616 7204 as_warn (_("Invalid performance register (%ld)"),
252b5132 7205 (long) imm_expr.X_add_number);
38487616 7206 imm_expr.X_add_number &= OP_MASK_PERFREG;
252b5132 7207 }
38487616 7208 ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
beae10d5
KH
7209 imm_expr.X_op = O_absent;
7210 s = expr_end;
7211 continue;
252b5132
RH
7212
7213 case 'b': /* base register */
7214 case 'd': /* destination register */
7215 case 's': /* source register */
7216 case 't': /* target register */
7217 case 'r': /* both target and source */
7218 case 'v': /* both dest and source */
7219 case 'w': /* both dest and target */
7220 case 'E': /* coprocessor target register */
7221 case 'G': /* coprocessor destination register */
7222 case 'x': /* ignore register name */
7223 case 'z': /* must be zero register */
4372b673 7224 case 'U': /* destination register (clo/clz). */
252b5132
RH
7225 s_reset = s;
7226 if (s[0] == '$')
7227 {
7228
d9a62219 7229 if (isdigit ((unsigned char) s[1]))
252b5132
RH
7230 {
7231 ++s;
7232 regno = 0;
7233 do
7234 {
7235 regno *= 10;
7236 regno += *s - '0';
7237 ++s;
7238 }
d9a62219 7239 while (isdigit ((unsigned char) *s));
252b5132
RH
7240 if (regno > 31)
7241 as_bad (_("Invalid register number (%d)"), regno);
7242 }
7243 else if (*args == 'E' || *args == 'G')
7244 goto notreg;
7245 else
7246 {
7247 if (s[1] == 'f' && s[2] == 'p')
7248 {
7249 s += 3;
7250 regno = FP;
7251 }
7252 else if (s[1] == 's' && s[2] == 'p')
7253 {
7254 s += 3;
7255 regno = SP;
7256 }
7257 else if (s[1] == 'g' && s[2] == 'p')
7258 {
7259 s += 3;
7260 regno = GP;
7261 }
7262 else if (s[1] == 'a' && s[2] == 't')
7263 {
7264 s += 3;
7265 regno = AT;
7266 }
7267 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
7268 {
7269 s += 4;
7270 regno = KT0;
7271 }
7272 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
7273 {
7274 s += 4;
7275 regno = KT1;
7276 }
7277 else if (itbl_have_entries)
7278 {
7279 char *p, *n;
d7ba4a77 7280 unsigned long r;
252b5132 7281
d7ba4a77 7282 p = s + 1; /* advance past '$' */
252b5132
RH
7283 n = itbl_get_field (&p); /* n is name */
7284
d7ba4a77
ILT
7285 /* See if this is a register defined in an
7286 itbl entry. */
7287 if (itbl_get_reg_val (n, &r))
252b5132
RH
7288 {
7289 /* Get_field advances to the start of
7290 the next field, so we need to back
d7ba4a77 7291 rack to the end of the last field. */
bdaaa2e1 7292 if (p)
252b5132 7293 s = p - 1;
bdaaa2e1 7294 else
d7ba4a77 7295 s = strchr (s, '\0');
252b5132
RH
7296 regno = r;
7297 }
7298 else
7299 goto notreg;
beae10d5 7300 }
252b5132
RH
7301 else
7302 goto notreg;
7303 }
7304 if (regno == AT
7305 && ! mips_opts.noat
7306 && *args != 'E'
7307 && *args != 'G')
7308 as_warn (_("Used $at without \".set noat\""));
7309 c = *args;
7310 if (*s == ' ')
7311 s++;
7312 if (args[1] != *s)
7313 {
7314 if (c == 'r' || c == 'v' || c == 'w')
7315 {
7316 regno = lastregno;
7317 s = s_reset;
7318 args++;
7319 }
7320 }
7321 /* 'z' only matches $0. */
7322 if (c == 'z' && regno != 0)
7323 break;
7324
bdaaa2e1
KH
7325 /* Now that we have assembled one operand, we use the args string
7326 * to figure out where it goes in the instruction. */
252b5132
RH
7327 switch (c)
7328 {
7329 case 'r':
7330 case 's':
7331 case 'v':
7332 case 'b':
38487616 7333 ip->insn_opcode |= regno << OP_SH_RS;
252b5132
RH
7334 break;
7335 case 'd':
7336 case 'G':
38487616 7337 ip->insn_opcode |= regno << OP_SH_RD;
252b5132 7338 break;
4372b673 7339 case 'U':
38487616
TS
7340 ip->insn_opcode |= regno << OP_SH_RD;
7341 ip->insn_opcode |= regno << OP_SH_RT;
4372b673 7342 break;
252b5132
RH
7343 case 'w':
7344 case 't':
7345 case 'E':
38487616 7346 ip->insn_opcode |= regno << OP_SH_RT;
252b5132
RH
7347 break;
7348 case 'x':
7349 /* This case exists because on the r3000 trunc
7350 expands into a macro which requires a gp
7351 register. On the r6000 or r4000 it is
7352 assembled into a single instruction which
7353 ignores the register. Thus the insn version
7354 is MIPS_ISA2 and uses 'x', and the macro
7355 version is MIPS_ISA1 and uses 't'. */
7356 break;
7357 case 'z':
7358 /* This case is for the div instruction, which
7359 acts differently if the destination argument
7360 is $0. This only matches $0, and is checked
7361 outside the switch. */
7362 break;
7363 case 'D':
7364 /* Itbl operand; not yet implemented. FIXME ?? */
7365 break;
7366 /* What about all other operands like 'i', which
7367 can be specified in the opcode table? */
7368 }
7369 lastregno = regno;
7370 continue;
7371 }
7372 notreg:
7373 switch (*args++)
7374 {
7375 case 'r':
7376 case 'v':
38487616 7377 ip->insn_opcode |= lastregno << OP_SH_RS;
252b5132
RH
7378 continue;
7379 case 'w':
38487616 7380 ip->insn_opcode |= lastregno << OP_SH_RT;
252b5132
RH
7381 continue;
7382 }
7383 break;
7384
7385 case 'D': /* floating point destination register */
7386 case 'S': /* floating point source register */
7387 case 'T': /* floating point target register */
7388 case 'R': /* floating point source register */
7389 case 'V':
7390 case 'W':
7391 s_reset = s;
d9a62219 7392 if (s[0] == '$' && s[1] == 'f' && isdigit ((unsigned char) s[2]))
252b5132
RH
7393 {
7394 s += 2;
7395 regno = 0;
7396 do
7397 {
7398 regno *= 10;
7399 regno += *s - '0';
7400 ++s;
7401 }
d9a62219 7402 while (isdigit ((unsigned char) *s));
252b5132
RH
7403
7404 if (regno > 31)
7405 as_bad (_("Invalid float register number (%d)"), regno);
7406
7407 if ((regno & 1) != 0
ca4e0257 7408 && HAVE_32BIT_FPRS
252b5132
RH
7409 && ! (strcmp (str, "mtc1") == 0
7410 || strcmp (str, "mfc1") == 0
7411 || strcmp (str, "lwc1") == 0
7412 || strcmp (str, "swc1") == 0
7413 || strcmp (str, "l.s") == 0
7414 || strcmp (str, "s.s") == 0))
7415 as_warn (_("Float register should be even, was %d"),
7416 regno);
7417
7418 c = *args;
7419 if (*s == ' ')
7420 s++;
7421 if (args[1] != *s)
7422 {
7423 if (c == 'V' || c == 'W')
7424 {
7425 regno = lastregno;
7426 s = s_reset;
7427 args++;
7428 }
7429 }
7430 switch (c)
7431 {
7432 case 'D':
38487616 7433 ip->insn_opcode |= regno << OP_SH_FD;
252b5132
RH
7434 break;
7435 case 'V':
7436 case 'S':
38487616 7437 ip->insn_opcode |= regno << OP_SH_FS;
252b5132
RH
7438 break;
7439 case 'W':
7440 case 'T':
38487616 7441 ip->insn_opcode |= regno << OP_SH_FT;
252b5132
RH
7442 break;
7443 case 'R':
38487616 7444 ip->insn_opcode |= regno << OP_SH_FR;
252b5132
RH
7445 break;
7446 }
7447 lastregno = regno;
7448 continue;
7449 }
7450
252b5132
RH
7451 switch (*args++)
7452 {
7453 case 'V':
38487616 7454 ip->insn_opcode |= lastregno << OP_SH_FS;
252b5132
RH
7455 continue;
7456 case 'W':
38487616 7457 ip->insn_opcode |= lastregno << OP_SH_FT;
252b5132
RH
7458 continue;
7459 }
7460 break;
7461
7462 case 'I':
7463 my_getExpression (&imm_expr, s);
7464 if (imm_expr.X_op != O_big
7465 && imm_expr.X_op != O_constant)
7466 insn_error = _("absolute expression required");
7467 s = expr_end;
7468 continue;
7469
7470 case 'A':
7471 my_getExpression (&offset_expr, s);
7472 imm_reloc = BFD_RELOC_32;
7473 s = expr_end;
7474 continue;
7475
7476 case 'F':
7477 case 'L':
7478 case 'f':
7479 case 'l':
7480 {
7481 int f64;
ca4e0257 7482 int using_gprs;
252b5132
RH
7483 char *save_in;
7484 char *err;
7485 unsigned char temp[8];
7486 int len;
7487 unsigned int length;
7488 segT seg;
7489 subsegT subseg;
7490 char *p;
7491
7492 /* These only appear as the last operand in an
7493 instruction, and every instruction that accepts
7494 them in any variant accepts them in all variants.
7495 This means we don't have to worry about backing out
7496 any changes if the instruction does not match.
7497
7498 The difference between them is the size of the
7499 floating point constant and where it goes. For 'F'
7500 and 'L' the constant is 64 bits; for 'f' and 'l' it
7501 is 32 bits. Where the constant is placed is based
7502 on how the MIPS assembler does things:
7503 F -- .rdata
7504 L -- .lit8
7505 f -- immediate value
7506 l -- .lit4
7507
7508 The .lit4 and .lit8 sections are only used if
7509 permitted by the -G argument.
7510
7511 When generating embedded PIC code, we use the
7512 .lit8 section but not the .lit4 section (we can do
7513 .lit4 inline easily; we need to put .lit8
7514 somewhere in the data segment, and using .lit8
7515 permits the linker to eventually combine identical
ca4e0257
RS
7516 .lit8 entries).
7517
7518 The code below needs to know whether the target register
7519 is 32 or 64 bits wide. It relies on the fact 'f' and
7520 'F' are used with GPR-based instructions and 'l' and
7521 'L' are used with FPR-based instructions. */
252b5132
RH
7522
7523 f64 = *args == 'F' || *args == 'L';
ca4e0257 7524 using_gprs = *args == 'F' || *args == 'f';
252b5132
RH
7525
7526 save_in = input_line_pointer;
7527 input_line_pointer = s;
7528 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
7529 length = len;
7530 s = input_line_pointer;
7531 input_line_pointer = save_in;
7532 if (err != NULL && *err != '\0')
7533 {
7534 as_bad (_("Bad floating point constant: %s"), err);
7535 memset (temp, '\0', sizeof temp);
7536 length = f64 ? 8 : 4;
7537 }
7538
156c2f8b 7539 assert (length == (unsigned) (f64 ? 8 : 4));
252b5132
RH
7540
7541 if (*args == 'f'
7542 || (*args == 'l'
7543 && (! USE_GLOBAL_POINTER_OPT
7544 || mips_pic == EMBEDDED_PIC
7545 || g_switch_value < 4
7546 || (temp[0] == 0 && temp[1] == 0)
7547 || (temp[2] == 0 && temp[3] == 0))))
7548 {
7549 imm_expr.X_op = O_constant;
7550 if (! target_big_endian)
7551 imm_expr.X_add_number = bfd_getl32 (temp);
7552 else
7553 imm_expr.X_add_number = bfd_getb32 (temp);
7554 }
7555 else if (length > 4
119d663a 7556 && ! mips_disable_float_construction
ca4e0257
RS
7557 /* Constants can only be constructed in GPRs and
7558 copied to FPRs if the GPRs are at least as wide
7559 as the FPRs. Force the constant into memory if
7560 we are using 64-bit FPRs but the GPRs are only
7561 32 bits wide. */
7562 && (using_gprs
7563 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
252b5132
RH
7564 && ((temp[0] == 0 && temp[1] == 0)
7565 || (temp[2] == 0 && temp[3] == 0))
7566 && ((temp[4] == 0 && temp[5] == 0)
7567 || (temp[6] == 0 && temp[7] == 0)))
7568 {
ca4e0257
RS
7569 /* The value is simple enough to load with a couple of
7570 instructions. If using 32-bit registers, set
7571 imm_expr to the high order 32 bits and offset_expr to
7572 the low order 32 bits. Otherwise, set imm_expr to
7573 the entire 64 bit constant. */
7574 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
252b5132
RH
7575 {
7576 imm_expr.X_op = O_constant;
7577 offset_expr.X_op = O_constant;
7578 if (! target_big_endian)
7579 {
7580 imm_expr.X_add_number = bfd_getl32 (temp + 4);
7581 offset_expr.X_add_number = bfd_getl32 (temp);
7582 }
7583 else
7584 {
7585 imm_expr.X_add_number = bfd_getb32 (temp);
7586 offset_expr.X_add_number = bfd_getb32 (temp + 4);
7587 }
7588 if (offset_expr.X_add_number == 0)
7589 offset_expr.X_op = O_absent;
7590 }
7591 else if (sizeof (imm_expr.X_add_number) > 4)
7592 {
7593 imm_expr.X_op = O_constant;
7594 if (! target_big_endian)
7595 imm_expr.X_add_number = bfd_getl64 (temp);
7596 else
7597 imm_expr.X_add_number = bfd_getb64 (temp);
7598 }
7599 else
7600 {
7601 imm_expr.X_op = O_big;
7602 imm_expr.X_add_number = 4;
7603 if (! target_big_endian)
7604 {
7605 generic_bignum[0] = bfd_getl16 (temp);
7606 generic_bignum[1] = bfd_getl16 (temp + 2);
7607 generic_bignum[2] = bfd_getl16 (temp + 4);
7608 generic_bignum[3] = bfd_getl16 (temp + 6);
7609 }
7610 else
7611 {
7612 generic_bignum[0] = bfd_getb16 (temp + 6);
7613 generic_bignum[1] = bfd_getb16 (temp + 4);
7614 generic_bignum[2] = bfd_getb16 (temp + 2);
7615 generic_bignum[3] = bfd_getb16 (temp);
7616 }
7617 }
7618 }
7619 else
7620 {
7621 const char *newname;
7622 segT new_seg;
7623
7624 /* Switch to the right section. */
7625 seg = now_seg;
7626 subseg = now_subseg;
7627 switch (*args)
7628 {
7629 default: /* unused default case avoids warnings. */
7630 case 'L':
7631 newname = RDATA_SECTION_NAME;
bb2d6cd7
GK
7632 if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
7633 || mips_pic == EMBEDDED_PIC)
252b5132
RH
7634 newname = ".lit8";
7635 break;
7636 case 'F':
bb2d6cd7
GK
7637 if (mips_pic == EMBEDDED_PIC)
7638 newname = ".lit8";
7639 else
7640 newname = RDATA_SECTION_NAME;
252b5132
RH
7641 break;
7642 case 'l':
7643 assert (!USE_GLOBAL_POINTER_OPT
7644 || g_switch_value >= 4);
7645 newname = ".lit4";
7646 break;
7647 }
7648 new_seg = subseg_new (newname, (subsegT) 0);
7649 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
7650 bfd_set_section_flags (stdoutput, new_seg,
7651 (SEC_ALLOC
7652 | SEC_LOAD
7653 | SEC_READONLY
7654 | SEC_DATA));
7655 frag_align (*args == 'l' ? 2 : 3, 0, 0);
7656 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
7657 && strcmp (TARGET_OS, "elf") != 0)
7658 record_alignment (new_seg, 4);
7659 else
7660 record_alignment (new_seg, *args == 'l' ? 2 : 3);
7661 if (seg == now_seg)
7662 as_bad (_("Can't use floating point insn in this section"));
7663
7664 /* Set the argument to the current address in the
7665 section. */
7666 offset_expr.X_op = O_symbol;
7667 offset_expr.X_add_symbol =
7668 symbol_new ("L0\001", now_seg,
7669 (valueT) frag_now_fix (), frag_now);
7670 offset_expr.X_add_number = 0;
7671
7672 /* Put the floating point number into the section. */
7673 p = frag_more ((int) length);
7674 memcpy (p, temp, length);
7675
7676 /* Switch back to the original section. */
7677 subseg_set (seg, subseg);
7678 }
7679 }
7680 continue;
7681
7682 case 'i': /* 16 bit unsigned immediate */
7683 case 'j': /* 16 bit signed immediate */
7684 imm_reloc = BFD_RELOC_LO16;
7685 c = my_getSmallExpression (&imm_expr, s);
fb1b3232 7686 if (c != S_EX_NONE)
252b5132 7687 {
fb1b3232 7688 if (c != S_EX_LO)
252b5132
RH
7689 {
7690 if (imm_expr.X_op == O_constant)
7691 imm_expr.X_add_number =
7692 (imm_expr.X_add_number >> 16) & 0xffff;
fb1b3232
TS
7693 else if (c == S_EX_HIGHEST)
7694 imm_reloc = BFD_RELOC_MIPS_HIGHEST;
7695 else if (c == S_EX_HIGHER)
7696 imm_reloc = BFD_RELOC_MIPS_HIGHER;
7697 else if (c == S_EX_HI)
252b5132
RH
7698 {
7699 imm_reloc = BFD_RELOC_HI16_S;
7700 imm_unmatched_hi = true;
7701 }
7702 else
7703 imm_reloc = BFD_RELOC_HI16;
7704 }
7705 else if (imm_expr.X_op == O_constant)
7706 imm_expr.X_add_number &= 0xffff;
7707 }
7708 if (*args == 'i')
7709 {
fb1b3232 7710 if ((c == S_EX_NONE && imm_expr.X_op != O_constant)
252b5132 7711 || ((imm_expr.X_add_number < 0
beae10d5
KH
7712 || imm_expr.X_add_number >= 0x10000)
7713 && imm_expr.X_op == O_constant))
252b5132
RH
7714 {
7715 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
7716 !strcmp (insn->name, insn[1].name))
7717 break;
2ae7e77b
AH
7718 if (imm_expr.X_op == O_constant
7719 || imm_expr.X_op == O_big)
252b5132
RH
7720 as_bad (_("16 bit expression not in range 0..65535"));
7721 }
7722 }
7723 else
7724 {
7725 int more;
7726 offsetT max;
7727
7728 /* The upper bound should be 0x8000, but
7729 unfortunately the MIPS assembler accepts numbers
7730 from 0x8000 to 0xffff and sign extends them, and
7731 we want to be compatible. We only permit this
7732 extended range for an instruction which does not
7733 provide any further alternates, since those
7734 alternates may handle other cases. People should
7735 use the numbers they mean, rather than relying on
7736 a mysterious sign extension. */
7737 more = (insn + 1 < &mips_opcodes[NUMOPCODES] &&
7738 strcmp (insn->name, insn[1].name) == 0);
7739 if (more)
7740 max = 0x8000;
7741 else
7742 max = 0x10000;
fb1b3232 7743 if ((c == S_EX_NONE && imm_expr.X_op != O_constant)
252b5132 7744 || ((imm_expr.X_add_number < -0x8000
beae10d5
KH
7745 || imm_expr.X_add_number >= max)
7746 && imm_expr.X_op == O_constant)
252b5132
RH
7747 || (more
7748 && imm_expr.X_add_number < 0
ca4e0257 7749 && HAVE_64BIT_GPRS
252b5132
RH
7750 && imm_expr.X_unsigned
7751 && sizeof (imm_expr.X_add_number) <= 4))
7752 {
7753 if (more)
7754 break;
2ae7e77b
AH
7755 if (imm_expr.X_op == O_constant
7756 || imm_expr.X_op == O_big)
252b5132
RH
7757 as_bad (_("16 bit expression not in range -32768..32767"));
7758 }
7759 }
7760 s = expr_end;
7761 continue;
7762
7763 case 'o': /* 16 bit offset */
7764 c = my_getSmallExpression (&offset_expr, s);
7765
7766 /* If this value won't fit into a 16 bit offset, then go
7767 find a macro that will generate the 32 bit offset
7768 code pattern. As a special hack, we accept the
7769 difference of two local symbols as a constant. This
7770 is required to suppose embedded PIC switches, which
7771 use an instruction which looks like
7772 lw $4,$L12-$LS12($4)
7773 The problem with handling this in a more general
7774 fashion is that the macro function doesn't expect to
7775 see anything which can be handled in a single
7776 constant instruction. */
fb1b3232 7777 if (c == S_EX_NONE
252b5132
RH
7778 && (offset_expr.X_op != O_constant
7779 || offset_expr.X_add_number >= 0x8000
7780 || offset_expr.X_add_number < -0x8000)
7781 && (mips_pic != EMBEDDED_PIC
7782 || offset_expr.X_op != O_subtract
3dacdf2e
NC
7783 || (S_GET_SEGMENT (offset_expr.X_add_symbol)
7784 != S_GET_SEGMENT (offset_expr.X_op_symbol))))
252b5132
RH
7785 break;
7786
fb1b3232 7787 if (c == S_EX_HI)
252b5132
RH
7788 {
7789 if (offset_expr.X_op != O_constant)
7790 break;
7791 offset_expr.X_add_number =
7792 (offset_expr.X_add_number >> 16) & 0xffff;
7793 }
7794 offset_reloc = BFD_RELOC_LO16;
7795 s = expr_end;
7796 continue;
7797
7798 case 'p': /* pc relative offset */
7799 offset_reloc = BFD_RELOC_16_PCREL_S2;
7800 my_getExpression (&offset_expr, s);
7801 s = expr_end;
7802 continue;
7803
7804 case 'u': /* upper 16 bits */
7805 c = my_getSmallExpression (&imm_expr, s);
7806 imm_reloc = BFD_RELOC_LO16;
e7d556df 7807 if (c != S_EX_NONE)
252b5132 7808 {
fb1b3232 7809 if (c != S_EX_LO)
252b5132
RH
7810 {
7811 if (imm_expr.X_op == O_constant)
7812 imm_expr.X_add_number =
7813 (imm_expr.X_add_number >> 16) & 0xffff;
fb1b3232
TS
7814 else if (c == S_EX_HIGHEST)
7815 imm_reloc = BFD_RELOC_MIPS_HIGHEST;
7816 else if (c == S_EX_HI)
252b5132
RH
7817 {
7818 imm_reloc = BFD_RELOC_HI16_S;
7819 imm_unmatched_hi = true;
7820 }
7821 else
7822 imm_reloc = BFD_RELOC_HI16;
7823 }
7824 else if (imm_expr.X_op == O_constant)
7825 imm_expr.X_add_number &= 0xffff;
7826 }
7827 if (imm_expr.X_op == O_constant
7828 && (imm_expr.X_add_number < 0
7829 || imm_expr.X_add_number >= 0x10000))
7830 as_bad (_("lui expression not in range 0..65535"));
7831 s = expr_end;
7832 continue;
7833
7834 case 'a': /* 26 bit address */
7835 my_getExpression (&offset_expr, s);
7836 s = expr_end;
7837 offset_reloc = BFD_RELOC_MIPS_JMP;
7838 continue;
7839
7840 case 'N': /* 3 bit branch condition code */
7841 case 'M': /* 3 bit compare condition code */
7842 if (strncmp (s, "$fcc", 4) != 0)
7843 break;
7844 s += 4;
7845 regno = 0;
7846 do
7847 {
7848 regno *= 10;
7849 regno += *s - '0';
7850 ++s;
7851 }
d9a62219 7852 while (isdigit ((unsigned char) *s));
252b5132
RH
7853 if (regno > 7)
7854 as_bad (_("invalid condition code register $fcc%d"), regno);
7855 if (*args == 'N')
7856 ip->insn_opcode |= regno << OP_SH_BCC;
7857 else
7858 ip->insn_opcode |= regno << OP_SH_CCC;
beae10d5 7859 continue;
252b5132 7860
156c2f8b
NC
7861 case 'H':
7862 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
7863 s += 2;
7864 if (isdigit ((unsigned char) *s))
7865 {
7866 c = 0;
7867 do
7868 {
7869 c *= 10;
7870 c += *s - '0';
7871 ++s;
7872 }
7873 while (isdigit ((unsigned char) *s));
7874 }
7875 else
7876 c = 8; /* Invalid sel value. */
7877
7878 if (c > 7)
7879 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
7880 ip->insn_opcode |= c;
7881 continue;
7882
252b5132
RH
7883 default:
7884 as_bad (_("bad char = '%c'\n"), *args);
7885 internalError ();
7886 }
7887 break;
7888 }
7889 /* Args don't match. */
7890 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
7891 !strcmp (insn->name, insn[1].name))
7892 {
7893 ++insn;
7894 s = argsStart;
268f6bed 7895 insn_error = _("illegal operands");
252b5132
RH
7896 continue;
7897 }
268f6bed
L
7898 if (save_c)
7899 *(--s) = save_c;
252b5132
RH
7900 insn_error = _("illegal operands");
7901 return;
7902 }
7903}
7904
7905/* This routine assembles an instruction into its binary format when
7906 assembling for the mips16. As a side effect, it sets one of the
7907 global variables imm_reloc or offset_reloc to the type of
7908 relocation to do if one of the operands is an address expression.
7909 It also sets mips16_small and mips16_ext if the user explicitly
7910 requested a small or extended instruction. */
7911
7912static void
7913mips16_ip (str, ip)
7914 char *str;
7915 struct mips_cl_insn *ip;
7916{
7917 char *s;
7918 const char *args;
7919 struct mips_opcode *insn;
7920 char *argsstart;
7921 unsigned int regno;
7922 unsigned int lastregno = 0;
7923 char *s_reset;
7924
7925 insn_error = NULL;
7926
7927 mips16_small = false;
7928 mips16_ext = false;
7929
d9a62219 7930 for (s = str; islower ((unsigned char) *s); ++s)
252b5132
RH
7931 ;
7932 switch (*s)
7933 {
7934 case '\0':
7935 break;
7936
7937 case ' ':
7938 *s++ = '\0';
7939 break;
7940
7941 case '.':
7942 if (s[1] == 't' && s[2] == ' ')
7943 {
7944 *s = '\0';
7945 mips16_small = true;
7946 s += 3;
7947 break;
7948 }
7949 else if (s[1] == 'e' && s[2] == ' ')
7950 {
7951 *s = '\0';
7952 mips16_ext = true;
7953 s += 3;
7954 break;
7955 }
7956 /* Fall through. */
7957 default:
7958 insn_error = _("unknown opcode");
7959 return;
7960 }
7961
7962 if (mips_opts.noautoextend && ! mips16_ext)
7963 mips16_small = true;
7964
7965 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
7966 {
7967 insn_error = _("unrecognized opcode");
7968 return;
7969 }
7970
7971 argsstart = s;
7972 for (;;)
7973 {
7974 assert (strcmp (insn->name, str) == 0);
7975
7976 ip->insn_mo = insn;
7977 ip->insn_opcode = insn->match;
7978 ip->use_extend = false;
7979 imm_expr.X_op = O_absent;
7980 imm_reloc = BFD_RELOC_UNUSED;
7981 offset_expr.X_op = O_absent;
7982 offset_reloc = BFD_RELOC_UNUSED;
7983 for (args = insn->args; 1; ++args)
7984 {
7985 int c;
7986
7987 if (*s == ' ')
7988 ++s;
7989
7990 /* In this switch statement we call break if we did not find
7991 a match, continue if we did find a match, or return if we
7992 are done. */
7993
7994 c = *args;
7995 switch (c)
7996 {
7997 case '\0':
7998 if (*s == '\0')
7999 {
8000 /* Stuff the immediate value in now, if we can. */
8001 if (imm_expr.X_op == O_constant
8002 && imm_reloc > BFD_RELOC_UNUSED
8003 && insn->pinfo != INSN_MACRO)
8004 {
8005 mips16_immed ((char *) NULL, 0,
8006 imm_reloc - BFD_RELOC_UNUSED,
8007 imm_expr.X_add_number, true, mips16_small,
8008 mips16_ext, &ip->insn_opcode,
8009 &ip->use_extend, &ip->extend);
8010 imm_expr.X_op = O_absent;
8011 imm_reloc = BFD_RELOC_UNUSED;
8012 }
8013
8014 return;
8015 }
8016 break;
8017
8018 case ',':
8019 if (*s++ == c)
8020 continue;
8021 s--;
8022 switch (*++args)
8023 {
8024 case 'v':
8025 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
8026 continue;
8027 case 'w':
8028 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
8029 continue;
8030 }
8031 break;
8032
8033 case '(':
8034 case ')':
8035 if (*s++ == c)
8036 continue;
8037 break;
8038
8039 case 'v':
8040 case 'w':
8041 if (s[0] != '$')
8042 {
8043 if (c == 'v')
8044 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
8045 else
8046 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
8047 ++args;
8048 continue;
8049 }
8050 /* Fall through. */
8051 case 'x':
8052 case 'y':
8053 case 'z':
8054 case 'Z':
8055 case '0':
8056 case 'S':
8057 case 'R':
8058 case 'X':
8059 case 'Y':
8060 if (s[0] != '$')
8061 break;
8062 s_reset = s;
d9a62219 8063 if (isdigit ((unsigned char) s[1]))
252b5132
RH
8064 {
8065 ++s;
8066 regno = 0;
8067 do
8068 {
8069 regno *= 10;
8070 regno += *s - '0';
8071 ++s;
8072 }
d9a62219 8073 while (isdigit ((unsigned char) *s));
252b5132
RH
8074 if (regno > 31)
8075 {
8076 as_bad (_("invalid register number (%d)"), regno);
8077 regno = 2;
8078 }
8079 }
8080 else
8081 {
8082 if (s[1] == 'f' && s[2] == 'p')
8083 {
8084 s += 3;
8085 regno = FP;
8086 }
8087 else if (s[1] == 's' && s[2] == 'p')
8088 {
8089 s += 3;
8090 regno = SP;
8091 }
8092 else if (s[1] == 'g' && s[2] == 'p')
8093 {
8094 s += 3;
8095 regno = GP;
8096 }
8097 else if (s[1] == 'a' && s[2] == 't')
8098 {
8099 s += 3;
8100 regno = AT;
8101 }
8102 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8103 {
8104 s += 4;
8105 regno = KT0;
8106 }
8107 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8108 {
8109 s += 4;
8110 regno = KT1;
8111 }
8112 else
8113 break;
8114 }
8115
8116 if (*s == ' ')
8117 ++s;
8118 if (args[1] != *s)
8119 {
8120 if (c == 'v' || c == 'w')
8121 {
8122 regno = mips16_to_32_reg_map[lastregno];
8123 s = s_reset;
8124 args++;
8125 }
8126 }
8127
8128 switch (c)
8129 {
8130 case 'x':
8131 case 'y':
8132 case 'z':
8133 case 'v':
8134 case 'w':
8135 case 'Z':
8136 regno = mips32_to_16_reg_map[regno];
8137 break;
8138
8139 case '0':
8140 if (regno != 0)
8141 regno = ILLEGAL_REG;
8142 break;
8143
8144 case 'S':
8145 if (regno != SP)
8146 regno = ILLEGAL_REG;
8147 break;
8148
8149 case 'R':
8150 if (regno != RA)
8151 regno = ILLEGAL_REG;
8152 break;
8153
8154 case 'X':
8155 case 'Y':
8156 if (regno == AT && ! mips_opts.noat)
8157 as_warn (_("used $at without \".set noat\""));
8158 break;
8159
8160 default:
8161 internalError ();
8162 }
8163
8164 if (regno == ILLEGAL_REG)
8165 break;
8166
8167 switch (c)
8168 {
8169 case 'x':
8170 case 'v':
8171 ip->insn_opcode |= regno << MIPS16OP_SH_RX;
8172 break;
8173 case 'y':
8174 case 'w':
8175 ip->insn_opcode |= regno << MIPS16OP_SH_RY;
8176 break;
8177 case 'z':
8178 ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
8179 break;
8180 case 'Z':
8181 ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
8182 case '0':
8183 case 'S':
8184 case 'R':
8185 break;
8186 case 'X':
8187 ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
8188 break;
8189 case 'Y':
8190 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
8191 ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
8192 break;
8193 default:
8194 internalError ();
8195 }
8196
8197 lastregno = regno;
8198 continue;
8199
8200 case 'P':
8201 if (strncmp (s, "$pc", 3) == 0)
8202 {
8203 s += 3;
8204 continue;
8205 }
8206 break;
8207
8208 case '<':
8209 case '>':
8210 case '[':
8211 case ']':
8212 case '4':
8213 case '5':
8214 case 'H':
8215 case 'W':
8216 case 'D':
8217 case 'j':
8218 case '8':
8219 case 'V':
8220 case 'C':
8221 case 'U':
8222 case 'k':
8223 case 'K':
8224 if (s[0] == '%'
8225 && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
8226 {
8227 /* This is %gprel(SYMBOL). We need to read SYMBOL,
8228 and generate the appropriate reloc. If the text
8229 inside %gprel is not a symbol name with an
8230 optional offset, then we generate a normal reloc
8231 and will probably fail later. */
8232 my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
8233 if (imm_expr.X_op == O_symbol)
8234 {
8235 mips16_ext = true;
8236 imm_reloc = BFD_RELOC_MIPS16_GPREL;
8237 s = expr_end;
8238 ip->use_extend = true;
8239 ip->extend = 0;
8240 continue;
8241 }
8242 }
8243 else
8244 {
8245 /* Just pick up a normal expression. */
8246 my_getExpression (&imm_expr, s);
8247 }
8248
8249 if (imm_expr.X_op == O_register)
8250 {
8251 /* What we thought was an expression turned out to
8252 be a register. */
8253
8254 if (s[0] == '(' && args[1] == '(')
8255 {
8256 /* It looks like the expression was omitted
8257 before a register indirection, which means
8258 that the expression is implicitly zero. We
8259 still set up imm_expr, so that we handle
8260 explicit extensions correctly. */
8261 imm_expr.X_op = O_constant;
8262 imm_expr.X_add_number = 0;
8263 imm_reloc = (int) BFD_RELOC_UNUSED + c;
8264 continue;
8265 }
8266
8267 break;
8268 }
8269
8270 /* We need to relax this instruction. */
8271 imm_reloc = (int) BFD_RELOC_UNUSED + c;
8272 s = expr_end;
8273 continue;
8274
8275 case 'p':
8276 case 'q':
8277 case 'A':
8278 case 'B':
8279 case 'E':
8280 /* We use offset_reloc rather than imm_reloc for the PC
8281 relative operands. This lets macros with both
8282 immediate and address operands work correctly. */
8283 my_getExpression (&offset_expr, s);
8284
8285 if (offset_expr.X_op == O_register)
8286 break;
8287
8288 /* We need to relax this instruction. */
8289 offset_reloc = (int) BFD_RELOC_UNUSED + c;
8290 s = expr_end;
8291 continue;
8292
8293 case '6': /* break code */
8294 my_getExpression (&imm_expr, s);
8295 check_absolute_expr (ip, &imm_expr);
8296 if ((unsigned long) imm_expr.X_add_number > 63)
8297 {
8298 as_warn (_("Invalid value for `%s' (%lu)"),
8299 ip->insn_mo->name,
8300 (unsigned long) imm_expr.X_add_number);
8301 imm_expr.X_add_number &= 0x3f;
8302 }
8303 ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
8304 imm_expr.X_op = O_absent;
8305 s = expr_end;
8306 continue;
8307
8308 case 'a': /* 26 bit address */
8309 my_getExpression (&offset_expr, s);
8310 s = expr_end;
8311 offset_reloc = BFD_RELOC_MIPS16_JMP;
8312 ip->insn_opcode <<= 16;
8313 continue;
8314
8315 case 'l': /* register list for entry macro */
8316 case 'L': /* register list for exit macro */
8317 {
8318 int mask;
8319
8320 if (c == 'l')
8321 mask = 0;
8322 else
8323 mask = 7 << 3;
8324 while (*s != '\0')
8325 {
8326 int freg, reg1, reg2;
8327
8328 while (*s == ' ' || *s == ',')
8329 ++s;
8330 if (*s != '$')
8331 {
8332 as_bad (_("can't parse register list"));
8333 break;
8334 }
8335 ++s;
8336 if (*s != 'f')
8337 freg = 0;
8338 else
8339 {
8340 freg = 1;
8341 ++s;
8342 }
8343 reg1 = 0;
d9a62219 8344 while (isdigit ((unsigned char) *s))
252b5132
RH
8345 {
8346 reg1 *= 10;
8347 reg1 += *s - '0';
8348 ++s;
8349 }
8350 if (*s == ' ')
8351 ++s;
8352 if (*s != '-')
8353 reg2 = reg1;
8354 else
8355 {
8356 ++s;
8357 if (*s != '$')
8358 break;
8359 ++s;
8360 if (freg)
8361 {
8362 if (*s == 'f')
8363 ++s;
8364 else
8365 {
8366 as_bad (_("invalid register list"));
8367 break;
8368 }
8369 }
8370 reg2 = 0;
d9a62219 8371 while (isdigit ((unsigned char) *s))
252b5132
RH
8372 {
8373 reg2 *= 10;
8374 reg2 += *s - '0';
8375 ++s;
8376 }
8377 }
8378 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
8379 {
8380 mask &= ~ (7 << 3);
8381 mask |= 5 << 3;
8382 }
8383 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
8384 {
8385 mask &= ~ (7 << 3);
8386 mask |= 6 << 3;
8387 }
8388 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
8389 mask |= (reg2 - 3) << 3;
8390 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
8391 mask |= (reg2 - 15) << 1;
8392 else if (reg1 == 31 && reg2 == 31)
8393 mask |= 1;
8394 else
8395 {
8396 as_bad (_("invalid register list"));
8397 break;
8398 }
8399 }
8400 /* The mask is filled in in the opcode table for the
8401 benefit of the disassembler. We remove it before
8402 applying the actual mask. */
8403 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
8404 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
8405 }
8406 continue;
8407
8408 case 'e': /* extend code */
8409 my_getExpression (&imm_expr, s);
8410 check_absolute_expr (ip, &imm_expr);
8411 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
8412 {
8413 as_warn (_("Invalid value for `%s' (%lu)"),
8414 ip->insn_mo->name,
8415 (unsigned long) imm_expr.X_add_number);
8416 imm_expr.X_add_number &= 0x7ff;
8417 }
8418 ip->insn_opcode |= imm_expr.X_add_number;
8419 imm_expr.X_op = O_absent;
8420 s = expr_end;
8421 continue;
8422
8423 default:
8424 internalError ();
8425 }
8426 break;
8427 }
8428
8429 /* Args don't match. */
8430 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
8431 strcmp (insn->name, insn[1].name) == 0)
8432 {
8433 ++insn;
8434 s = argsstart;
8435 continue;
8436 }
8437
8438 insn_error = _("illegal operands");
8439
8440 return;
8441 }
8442}
8443
8444/* This structure holds information we know about a mips16 immediate
8445 argument type. */
8446
e972090a
NC
8447struct mips16_immed_operand
8448{
252b5132
RH
8449 /* The type code used in the argument string in the opcode table. */
8450 int type;
8451 /* The number of bits in the short form of the opcode. */
8452 int nbits;
8453 /* The number of bits in the extended form of the opcode. */
8454 int extbits;
8455 /* The amount by which the short form is shifted when it is used;
8456 for example, the sw instruction has a shift count of 2. */
8457 int shift;
8458 /* The amount by which the short form is shifted when it is stored
8459 into the instruction code. */
8460 int op_shift;
8461 /* Non-zero if the short form is unsigned. */
8462 int unsp;
8463 /* Non-zero if the extended form is unsigned. */
8464 int extu;
8465 /* Non-zero if the value is PC relative. */
8466 int pcrel;
8467};
8468
8469/* The mips16 immediate operand types. */
8470
8471static const struct mips16_immed_operand mips16_immed_operands[] =
8472{
8473 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
8474 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
8475 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
8476 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
8477 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
8478 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
8479 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
8480 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
8481 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
8482 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
8483 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
8484 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
8485 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
8486 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
8487 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
8488 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
8489 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
8490 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
8491 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
8492 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
8493 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
8494};
8495
8496#define MIPS16_NUM_IMMED \
8497 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
8498
8499/* Handle a mips16 instruction with an immediate value. This or's the
8500 small immediate value into *INSN. It sets *USE_EXTEND to indicate
8501 whether an extended value is needed; if one is needed, it sets
8502 *EXTEND to the value. The argument type is TYPE. The value is VAL.
8503 If SMALL is true, an unextended opcode was explicitly requested.
8504 If EXT is true, an extended opcode was explicitly requested. If
8505 WARN is true, warn if EXT does not match reality. */
8506
8507static void
8508mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
8509 extend)
8510 char *file;
8511 unsigned int line;
8512 int type;
8513 offsetT val;
8514 boolean warn;
8515 boolean small;
8516 boolean ext;
8517 unsigned long *insn;
8518 boolean *use_extend;
8519 unsigned short *extend;
8520{
8521 register const struct mips16_immed_operand *op;
8522 int mintiny, maxtiny;
8523 boolean needext;
8524
8525 op = mips16_immed_operands;
8526 while (op->type != type)
8527 {
8528 ++op;
8529 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
8530 }
8531
8532 if (op->unsp)
8533 {
8534 if (type == '<' || type == '>' || type == '[' || type == ']')
8535 {
8536 mintiny = 1;
8537 maxtiny = 1 << op->nbits;
8538 }
8539 else
8540 {
8541 mintiny = 0;
8542 maxtiny = (1 << op->nbits) - 1;
8543 }
8544 }
8545 else
8546 {
8547 mintiny = - (1 << (op->nbits - 1));
8548 maxtiny = (1 << (op->nbits - 1)) - 1;
8549 }
8550
8551 /* Branch offsets have an implicit 0 in the lowest bit. */
8552 if (type == 'p' || type == 'q')
8553 val /= 2;
8554
8555 if ((val & ((1 << op->shift) - 1)) != 0
8556 || val < (mintiny << op->shift)
8557 || val > (maxtiny << op->shift))
8558 needext = true;
8559 else
8560 needext = false;
8561
8562 if (warn && ext && ! needext)
beae10d5
KH
8563 as_warn_where (file, line,
8564 _("extended operand requested but not required"));
252b5132
RH
8565 if (small && needext)
8566 as_bad_where (file, line, _("invalid unextended operand value"));
8567
8568 if (small || (! ext && ! needext))
8569 {
8570 int insnval;
8571
8572 *use_extend = false;
8573 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
8574 insnval <<= op->op_shift;
8575 *insn |= insnval;
8576 }
8577 else
8578 {
8579 long minext, maxext;
8580 int extval;
8581
8582 if (op->extu)
8583 {
8584 minext = 0;
8585 maxext = (1 << op->extbits) - 1;
8586 }
8587 else
8588 {
8589 minext = - (1 << (op->extbits - 1));
8590 maxext = (1 << (op->extbits - 1)) - 1;
8591 }
8592 if (val < minext || val > maxext)
8593 as_bad_where (file, line,
8594 _("operand value out of range for instruction"));
8595
8596 *use_extend = true;
8597 if (op->extbits == 16)
8598 {
8599 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
8600 val &= 0x1f;
8601 }
8602 else if (op->extbits == 15)
8603 {
8604 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
8605 val &= 0xf;
8606 }
8607 else
8608 {
8609 extval = ((val & 0x1f) << 6) | (val & 0x20);
8610 val = 0;
8611 }
8612
8613 *extend = (unsigned short) extval;
8614 *insn |= val;
8615 }
8616}
8617\f
252b5132
RH
8618
8619static int
8620my_getSmallExpression (ep, str)
8621 expressionS *ep;
8622 char *str;
8623{
8624 char *sp;
fb1b3232
TS
8625 char *oldstr = str;
8626 int c = S_EX_NONE;
252b5132
RH
8627
8628 if (*str == ' ')
8629 str++;
fb1b3232
TS
8630 if (*str == '(')
8631 c = S_EX_NONE;
8632 else if (str[0] == '%'
8633 && tolower(str[1]) == 'l'
8634 && tolower(str[2]) == 'o'
8635 && str[3] == '(')
252b5132 8636 {
fb1b3232
TS
8637 c = S_EX_LO;
8638 str += sizeof ("%lo(") - 2;
8639 }
8640 else if (str[0] == '%'
8641 && tolower(str[1]) == 'h'
8642 && tolower(str[2]) == 'i'
8643 && str[3] == '(')
8644 {
8645 c = S_EX_HI;
8646 str += sizeof ("%hi(") - 2;
8647 }
8648 else if (str[0] == '%'
8649 && tolower(str[1]) == 'h'
8650 && tolower(str[2]) == 'i'
8651 && tolower(str[3]) == 'g'
8652 && tolower(str[4]) == 'h'
8653 && tolower(str[5]) == 'e'
8654 && tolower(str[6]) == 'r'
8655 && str[7] == '(')
8656 {
8657 c = S_EX_HIGHER;
8658 str += sizeof ("%higher(") - 2;
8659 }
8660 else if (str[0] == '%'
8661 && tolower(str[1]) == 'h'
8662 && tolower(str[2]) == 'i'
8663 && tolower(str[3]) == 'g'
8664 && tolower(str[4]) == 'h'
8665 && tolower(str[5]) == 'e'
8666 && tolower(str[6]) == 's'
8667 && tolower(str[7]) == 't'
8668 && str[8] == '(')
8669 {
8670 c = S_EX_HIGHEST;
8671 str += sizeof ("%highest(") - 2;
8672 }
8673/* currently unsupported */
8674#if 0
8675 else if (str[0] == '%'
8676 && tolower(str[1]) == 'g'
8677 && tolower(str[2]) == 'p'
e7d556df
TS
8678 && tolower(str[3]) == '_'
8679 && tolower(str[4]) == 'r'
8680 && tolower(str[5]) == 'e'
8681 && tolower(str[6]) == 'l'
8682 && str[7] == '(')
fb1b3232
TS
8683 {
8684 c = S_EX_GPREL;
e7d556df 8685 str += sizeof ("%gp_rel(") - 2;
fb1b3232
TS
8686 }
8687 else if (str[0] == '%'
8688 && tolower(str[1]) == 'n'
8689 && tolower(str[2]) == 'e'
8690 && tolower(str[3]) == 'g'
8691 && str[4] == '(')
8692 {
8693 c = S_EX_NEG;
8694 str += sizeof ("%neg(") - 2;
8695 }
8696#endif
8697 else
8698 {
8699 my_getExpression (ep, str);
8700 return c;
8701 }
252b5132 8702
fb1b3232
TS
8703 /*
8704 * A small expression may be followed by a base register.
8705 * Scan to the end of this operand, and then back over a possible
8706 * base register. Then scan the small expression up to that
8707 * point. (Based on code in sparc.c...)
8708 */
8709 for (sp = str; *sp && *sp != ','; sp++)
8710 ;
8711 if (sp - 4 >= str && sp[-1] == ')')
8712 {
8713 if (isdigit ((unsigned char) sp[-2]))
252b5132 8714 {
fb1b3232
TS
8715 for (sp -= 3; sp >= str && isdigit ((unsigned char) *sp); sp--)
8716 ;
8717 if (*sp == '$' && sp > str && sp[-1] == '(')
252b5132 8718 {
fb1b3232
TS
8719 sp--;
8720 goto do_it;
252b5132 8721 }
fb1b3232
TS
8722 }
8723 else if (sp - 5 >= str
8724 && sp[-5] == '('
8725 && sp[-4] == '$'
8726 && ((sp[-3] == 'f' && sp[-2] == 'p')
8727 || (sp[-3] == 's' && sp[-2] == 'p')
8728 || (sp[-3] == 'g' && sp[-2] == 'p')
8729 || (sp[-3] == 'a' && sp[-2] == 't')))
8730 {
8731 sp -= 5;
8732 do_it:
8733 if (sp == str)
252b5132 8734 {
fb1b3232
TS
8735 /* no expression means zero offset */
8736 if (c != S_EX_NONE)
252b5132 8737 {
fb1b3232
TS
8738 /* %xx(reg) is an error */
8739 ep->X_op = O_absent;
8740 expr_end = oldstr;
252b5132
RH
8741 }
8742 else
8743 {
fb1b3232
TS
8744 ep->X_op = O_constant;
8745 expr_end = sp;
252b5132 8746 }
fb1b3232
TS
8747 ep->X_add_symbol = NULL;
8748 ep->X_op_symbol = NULL;
8749 ep->X_add_number = 0;
252b5132 8750 }
fb1b3232
TS
8751 else
8752 {
8753 *sp = '\0';
8754 my_getExpression (ep, str);
8755 *sp = '(';
8756 }
8757 return c;
252b5132
RH
8758 }
8759 }
8760 my_getExpression (ep, str);
fb1b3232
TS
8761
8762 /* => %highest, %higher, %hi, %lo, %gprel, %neg encountered */
8763 return c;
252b5132
RH
8764}
8765
8766static void
8767my_getExpression (ep, str)
8768 expressionS *ep;
8769 char *str;
8770{
8771 char *save_in;
98aa84af 8772 valueT val;
252b5132
RH
8773
8774 save_in = input_line_pointer;
8775 input_line_pointer = str;
8776 expression (ep);
8777 expr_end = input_line_pointer;
8778 input_line_pointer = save_in;
8779
8780 /* If we are in mips16 mode, and this is an expression based on `.',
8781 then we bump the value of the symbol by 1 since that is how other
8782 text symbols are handled. We don't bother to handle complex
8783 expressions, just `.' plus or minus a constant. */
8784 if (mips_opts.mips16
8785 && ep->X_op == O_symbol
8786 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
8787 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
49309057
ILT
8788 && symbol_get_frag (ep->X_add_symbol) == frag_now
8789 && symbol_constant_p (ep->X_add_symbol)
98aa84af
AM
8790 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
8791 S_SET_VALUE (ep->X_add_symbol, val + 1);
252b5132
RH
8792}
8793
8794/* Turn a string in input_line_pointer into a floating point constant
bc0d738a
NC
8795 of type TYPE, and store the appropriate bytes in *LITP. The number
8796 of LITTLENUMS emitted is stored in *SIZEP. An error message is
252b5132
RH
8797 returned, or NULL on OK. */
8798
8799char *
8800md_atof (type, litP, sizeP)
8801 int type;
8802 char *litP;
8803 int *sizeP;
8804{
8805 int prec;
8806 LITTLENUM_TYPE words[4];
8807 char *t;
8808 int i;
8809
8810 switch (type)
8811 {
8812 case 'f':
8813 prec = 2;
8814 break;
8815
8816 case 'd':
8817 prec = 4;
8818 break;
8819
8820 default:
8821 *sizeP = 0;
8822 return _("bad call to md_atof");
8823 }
8824
8825 t = atof_ieee (input_line_pointer, type, words);
8826 if (t)
8827 input_line_pointer = t;
8828
8829 *sizeP = prec * 2;
8830
8831 if (! target_big_endian)
8832 {
8833 for (i = prec - 1; i >= 0; i--)
8834 {
8835 md_number_to_chars (litP, (valueT) words[i], 2);
8836 litP += 2;
8837 }
8838 }
8839 else
8840 {
8841 for (i = 0; i < prec; i++)
8842 {
8843 md_number_to_chars (litP, (valueT) words[i], 2);
8844 litP += 2;
8845 }
8846 }
bdaaa2e1 8847
252b5132
RH
8848 return NULL;
8849}
8850
8851void
8852md_number_to_chars (buf, val, n)
8853 char *buf;
8854 valueT val;
8855 int n;
8856{
8857 if (target_big_endian)
8858 number_to_chars_bigendian (buf, val, n);
8859 else
8860 number_to_chars_littleendian (buf, val, n);
8861}
8862\f
39c0a331 8863CONST char *md_shortopts = "nO::g::G:";
252b5132 8864
e972090a
NC
8865struct option md_longopts[] =
8866{
252b5132
RH
8867#define OPTION_MIPS1 (OPTION_MD_BASE + 1)
8868 {"mips0", no_argument, NULL, OPTION_MIPS1},
8869 {"mips1", no_argument, NULL, OPTION_MIPS1},
8870#define OPTION_MIPS2 (OPTION_MD_BASE + 2)
8871 {"mips2", no_argument, NULL, OPTION_MIPS2},
8872#define OPTION_MIPS3 (OPTION_MD_BASE + 3)
8873 {"mips3", no_argument, NULL, OPTION_MIPS3},
8874#define OPTION_MIPS4 (OPTION_MD_BASE + 4)
8875 {"mips4", no_argument, NULL, OPTION_MIPS4},
8876#define OPTION_MCPU (OPTION_MD_BASE + 5)
8877 {"mcpu", required_argument, NULL, OPTION_MCPU},
8878#define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 6)
8879 {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
156c2f8b 8880#define OPTION_TRAP (OPTION_MD_BASE + 7)
252b5132
RH
8881 {"trap", no_argument, NULL, OPTION_TRAP},
8882 {"no-break", no_argument, NULL, OPTION_TRAP},
156c2f8b 8883#define OPTION_BREAK (OPTION_MD_BASE + 8)
252b5132
RH
8884 {"break", no_argument, NULL, OPTION_BREAK},
8885 {"no-trap", no_argument, NULL, OPTION_BREAK},
156c2f8b 8886#define OPTION_EB (OPTION_MD_BASE + 9)
252b5132 8887 {"EB", no_argument, NULL, OPTION_EB},
156c2f8b 8888#define OPTION_EL (OPTION_MD_BASE + 10)
252b5132 8889 {"EL", no_argument, NULL, OPTION_EL},
156c2f8b 8890#define OPTION_M4650 (OPTION_MD_BASE + 11)
252b5132 8891 {"m4650", no_argument, NULL, OPTION_M4650},
156c2f8b 8892#define OPTION_NO_M4650 (OPTION_MD_BASE + 12)
252b5132 8893 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
156c2f8b 8894#define OPTION_M4010 (OPTION_MD_BASE + 13)
252b5132 8895 {"m4010", no_argument, NULL, OPTION_M4010},
156c2f8b 8896#define OPTION_NO_M4010 (OPTION_MD_BASE + 14)
252b5132 8897 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
156c2f8b 8898#define OPTION_M4100 (OPTION_MD_BASE + 15)
252b5132 8899 {"m4100", no_argument, NULL, OPTION_M4100},
156c2f8b 8900#define OPTION_NO_M4100 (OPTION_MD_BASE + 16)
252b5132 8901 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
156c2f8b 8902#define OPTION_MIPS16 (OPTION_MD_BASE + 17)
252b5132 8903 {"mips16", no_argument, NULL, OPTION_MIPS16},
156c2f8b 8904#define OPTION_NO_MIPS16 (OPTION_MD_BASE + 18)
252b5132 8905 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
156c2f8b 8906#define OPTION_M3900 (OPTION_MD_BASE + 19)
252b5132 8907 {"m3900", no_argument, NULL, OPTION_M3900},
156c2f8b 8908#define OPTION_NO_M3900 (OPTION_MD_BASE + 20)
252b5132 8909 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
156c2f8b 8910#define OPTION_MABI (OPTION_MD_BASE + 21)
252b5132 8911 {"mabi", required_argument, NULL, OPTION_MABI},
156c2f8b 8912#define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 22)
6b76fefe 8913 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
156c2f8b 8914#define OPTION_NO_M7000_HILO_FIX (OPTION_MD_BASE + 23)
6b76fefe 8915 {"no-fix-7000", no_argument, NULL, OPTION_NO_M7000_HILO_FIX},
156c2f8b 8916#define OPTION_GP32 (OPTION_MD_BASE + 24)
c97ef257 8917 {"mgp32", no_argument, NULL, OPTION_GP32},
156c2f8b 8918#define OPTION_GP64 (OPTION_MD_BASE + 25)
c97ef257 8919 {"mgp64", no_argument, NULL, OPTION_GP64},
156c2f8b 8920#define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 26)
119d663a 8921 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
156c2f8b 8922#define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 27)
119d663a 8923 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
156c2f8b
NC
8924#define OPTION_MIPS32 (OPTION_MD_BASE + 28)
8925 {"mips32", no_argument, NULL, OPTION_MIPS32},
84ea6cf2
NC
8926#define OPTION_MIPS5 (OPTION_MD_BASE + 29)
8927 {"mips5", no_argument, NULL, OPTION_MIPS5},
8928#define OPTION_MIPS64 (OPTION_MD_BASE + 30)
8929 {"mips64", no_argument, NULL, OPTION_MIPS64},
ec68c924
EC
8930#define OPTION_MARCH (OPTION_MD_BASE + 31)
8931 {"march", required_argument, NULL, OPTION_MARCH},
8932#define OPTION_MTUNE (OPTION_MD_BASE + 32)
8933 {"mtune", required_argument, NULL, OPTION_MTUNE},
ca4e0257
RS
8934#define OPTION_FP32 (OPTION_MD_BASE + 33)
8935 {"mfp32", no_argument, NULL, OPTION_FP32},
156c2f8b
NC
8936#ifdef OBJ_ELF
8937#define OPTION_ELF_BASE (OPTION_MD_BASE + 35)
8938#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
8939#define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
8940#define OPTION_XGOT (OPTION_ELF_BASE + 2)
8941#define OPTION_32 (OPTION_ELF_BASE + 3)
8942#define OPTION_64 (OPTION_ELF_BASE + 4)
8943 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
8944 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
8945 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
8946 {"xgot", no_argument, NULL, OPTION_XGOT},
8947 {"32", no_argument, NULL, OPTION_32},
8948 {"64", no_argument, NULL, OPTION_64},
8949#endif
119d663a 8950
252b5132
RH
8951 {NULL, no_argument, NULL, 0}
8952};
156c2f8b 8953size_t md_longopts_size = sizeof (md_longopts);
252b5132
RH
8954
8955int
8956md_parse_option (c, arg)
8957 int c;
8958 char *arg;
8959{
8960 switch (c)
8961 {
119d663a
NC
8962 case OPTION_CONSTRUCT_FLOATS:
8963 mips_disable_float_construction = 0;
8964 break;
bdaaa2e1 8965
119d663a
NC
8966 case OPTION_NO_CONSTRUCT_FLOATS:
8967 mips_disable_float_construction = 1;
8968 break;
bdaaa2e1 8969
252b5132
RH
8970 case OPTION_TRAP:
8971 mips_trap = 1;
8972 break;
8973
8974 case OPTION_BREAK:
8975 mips_trap = 0;
8976 break;
8977
8978 case OPTION_EB:
8979 target_big_endian = 1;
8980 break;
8981
8982 case OPTION_EL:
8983 target_big_endian = 0;
8984 break;
8985
39c0a331
L
8986 case 'n':
8987 warn_nops = 1;
8988 break;
8989
252b5132
RH
8990 case 'O':
8991 if (arg && arg[1] == '0')
8992 mips_optimize = 1;
8993 else
8994 mips_optimize = 2;
8995 break;
8996
8997 case 'g':
8998 if (arg == NULL)
8999 mips_debug = 2;
9000 else
9001 mips_debug = atoi (arg);
9002 /* When the MIPS assembler sees -g or -g2, it does not do
9003 optimizations which limit full symbolic debugging. We take
9004 that to be equivalent to -O0. */
9005 if (mips_debug == 2)
9006 mips_optimize = 1;
9007 break;
9008
9009 case OPTION_MIPS1:
e7af610e 9010 mips_opts.isa = ISA_MIPS1;
252b5132
RH
9011 break;
9012
9013 case OPTION_MIPS2:
e7af610e 9014 mips_opts.isa = ISA_MIPS2;
252b5132
RH
9015 break;
9016
9017 case OPTION_MIPS3:
e7af610e 9018 mips_opts.isa = ISA_MIPS3;
252b5132
RH
9019 break;
9020
9021 case OPTION_MIPS4:
e7af610e
NC
9022 mips_opts.isa = ISA_MIPS4;
9023 break;
9024
84ea6cf2
NC
9025 case OPTION_MIPS5:
9026 mips_opts.isa = ISA_MIPS5;
9027 break;
9028
e7af610e
NC
9029 case OPTION_MIPS32:
9030 mips_opts.isa = ISA_MIPS32;
252b5132
RH
9031 break;
9032
84ea6cf2
NC
9033 case OPTION_MIPS64:
9034 mips_opts.isa = ISA_MIPS64;
9035 break;
9036
ec68c924
EC
9037 case OPTION_MTUNE:
9038 case OPTION_MARCH:
252b5132
RH
9039 case OPTION_MCPU:
9040 {
ec68c924
EC
9041 int cpu = CPU_UNKNOWN;
9042
e7af610e 9043 /* Identify the processor type. */
ec68c924 9044 if (strcasecmp (arg, "default") != 0)
252b5132 9045 {
e7af610e 9046 const struct mips_cpu_info *ci;
252b5132 9047
e7af610e
NC
9048 ci = mips_cpu_info_from_name (arg);
9049 if (ci == NULL || ci->is_isa)
ec68c924
EC
9050 {
9051 switch (c)
9052 {
9053 case OPTION_MTUNE:
9054 as_fatal (_("invalid architecture -mtune=%s"), arg);
9055 break;
9056 case OPTION_MARCH:
9057 as_fatal (_("invalid architecture -march=%s"), arg);
9058 break;
9059 case OPTION_MCPU:
9060 as_fatal (_("invalid architecture -mcpu=%s"), arg);
9061 break;
9062 }
9063 }
e7af610e 9064 else
ec68c924
EC
9065 cpu = ci->cpu;
9066 }
9067
9068 switch (c)
9069 {
9070 case OPTION_MTUNE:
6dce9e24
TS
9071 if (mips_tune != CPU_UNKNOWN && mips_tune != cpu)
9072 as_warn(_("A different -mtune= was already specified, is now "
9073 "-mtune=%s"), arg);
ec68c924
EC
9074 mips_tune = cpu;
9075 break;
9076 case OPTION_MARCH:
6dce9e24
TS
9077 if (mips_arch != CPU_UNKNOWN && mips_arch != cpu)
9078 as_warn(_("A different -march= was already specified, is now "
9079 "-march=%s"), arg);
ec68c924
EC
9080 mips_arch = cpu;
9081 break;
9082 case OPTION_MCPU:
6dce9e24
TS
9083 if (mips_cpu != CPU_UNKNOWN && mips_cpu != cpu)
9084 as_warn(_("A different -mcpu= was already specified, is now "
9085 "-mcpu=%s"), arg);
ec68c924 9086 mips_cpu = cpu;
252b5132
RH
9087 }
9088 }
9089 break;
9090
9091 case OPTION_M4650:
6dce9e24
TS
9092 if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R4650)
9093 || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R4650))
9094 as_warn(_("A different -march= or -mtune= was already specified, "
9095 "is now -m4650"));
ec68c924
EC
9096 mips_arch = CPU_R4650;
9097 mips_tune = CPU_R4650;
252b5132
RH
9098 break;
9099
9100 case OPTION_NO_M4650:
9101 break;
9102
9103 case OPTION_M4010:
6dce9e24
TS
9104 if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R4010)
9105 || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R4010))
9106 as_warn(_("A different -march= or -mtune= was already specified, "
9107 "is now -m4010"));
ec68c924
EC
9108 mips_arch = CPU_R4010;
9109 mips_tune = CPU_R4010;
252b5132
RH
9110 break;
9111
9112 case OPTION_NO_M4010:
9113 break;
9114
9115 case OPTION_M4100:
6dce9e24
TS
9116 if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_VR4100)
9117 || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_VR4100))
9118 as_warn(_("A different -march= or -mtune= was already specified, "
9119 "is now -m4100"));
ec68c924
EC
9120 mips_arch = CPU_VR4100;
9121 mips_tune = CPU_VR4100;
252b5132
RH
9122 break;
9123
9124 case OPTION_NO_M4100:
9125 break;
9126
252b5132 9127 case OPTION_M3900:
6dce9e24
TS
9128 if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R3900)
9129 || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R3900))
9130 as_warn(_("A different -march= or -mtune= was already specified, "
9131 "is now -m3900"));
ec68c924
EC
9132 mips_arch = CPU_R3900;
9133 mips_tune = CPU_R3900;
252b5132 9134 break;
bdaaa2e1 9135
252b5132
RH
9136 case OPTION_NO_M3900:
9137 break;
9138
9139 case OPTION_MIPS16:
9140 mips_opts.mips16 = 1;
9141 mips_no_prev_insn (false);
9142 break;
9143
9144 case OPTION_NO_MIPS16:
9145 mips_opts.mips16 = 0;
9146 mips_no_prev_insn (false);
9147 break;
9148
9149 case OPTION_MEMBEDDED_PIC:
9150 mips_pic = EMBEDDED_PIC;
9151 if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
9152 {
9153 as_bad (_("-G may not be used with embedded PIC code"));
9154 return 0;
9155 }
9156 g_switch_value = 0x7fffffff;
9157 break;
9158
0f074f60 9159#ifdef OBJ_ELF
252b5132
RH
9160 /* When generating ELF code, we permit -KPIC and -call_shared to
9161 select SVR4_PIC, and -non_shared to select no PIC. This is
9162 intended to be compatible with Irix 5. */
9163 case OPTION_CALL_SHARED:
9164 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
9165 {
9166 as_bad (_("-call_shared is supported only for ELF format"));
9167 return 0;
9168 }
9169 mips_pic = SVR4_PIC;
9170 if (g_switch_seen && g_switch_value != 0)
9171 {
9172 as_bad (_("-G may not be used with SVR4 PIC code"));
9173 return 0;
9174 }
9175 g_switch_value = 0;
9176 break;
9177
9178 case OPTION_NON_SHARED:
9179 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
9180 {
9181 as_bad (_("-non_shared is supported only for ELF format"));
9182 return 0;
9183 }
9184 mips_pic = NO_PIC;
9185 break;
9186
9187 /* The -xgot option tells the assembler to use 32 offsets when
9188 accessing the got in SVR4_PIC mode. It is for Irix
9189 compatibility. */
9190 case OPTION_XGOT:
9191 mips_big_got = 1;
9192 break;
0f074f60 9193#endif /* OBJ_ELF */
252b5132
RH
9194
9195 case 'G':
9196 if (! USE_GLOBAL_POINTER_OPT)
9197 {
9198 as_bad (_("-G is not supported for this configuration"));
9199 return 0;
9200 }
9201 else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
9202 {
9203 as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
9204 return 0;
9205 }
9206 else
9207 g_switch_value = atoi (arg);
9208 g_switch_seen = 1;
9209 break;
9210
0f074f60 9211#ifdef OBJ_ELF
252b5132
RH
9212 /* The -32 and -64 options tell the assembler to output the 32
9213 bit or the 64 bit MIPS ELF format. */
9214 case OPTION_32:
9215 mips_64 = 0;
9216 break;
9217
9218 case OPTION_64:
9219 {
9220 const char **list, **l;
9221
9222 list = bfd_target_list ();
9223 for (l = list; *l != NULL; l++)
a6bacc80
TS
9224#ifdef TE_TMIPS
9225 /* This is traditional mips */
9226 if (strcmp (*l, "elf64-tradbigmips") == 0
f4ddc5e6 9227 || strcmp (*l, "elf64-tradlittlemips") == 0)
a6bacc80
TS
9228#else
9229 if (strcmp (*l, "elf64-bigmips") == 0
9230 || strcmp (*l, "elf64-littlemips") == 0)
9231#endif
252b5132
RH
9232 break;
9233 if (*l == NULL)
9234 as_fatal (_("No compiled in support for 64 bit object file format"));
9235 free (list);
9236 mips_64 = 1;
9237 }
9238 break;
0f074f60 9239#endif /* OBJ_ELF */
252b5132 9240
c97ef257
AH
9241 case OPTION_GP32:
9242 mips_gp32 = 1;
9243 mips_64 = 0;
9244
9245 /* We deliberately don't allow "-gp32" to set the MIPS_32BITMODE
9246 flag in object files because to do so would make it
9247 impossible to link with libraries compiled without "-gp32".
bdaaa2e1 9248 This is unnecessarily restrictive.
c97ef257
AH
9249
9250 We could solve this problem by adding "-gp32" multilibs to
9251 gcc, but to set this flag before gcc is built with such
bdaaa2e1 9252 multilibs will break too many systems. */
c97ef257 9253
beae10d5
KH
9254#if 0
9255 mips_32bitmode = 1;
9256#endif
c97ef257
AH
9257 break;
9258
9259 case OPTION_GP64:
9260 mips_gp32 = 0;
9261 mips_64 = 1;
beae10d5
KH
9262#if 0
9263 mips_32bitmode = 0;
9264#endif
c97ef257 9265 break;
252b5132 9266
ca4e0257
RS
9267 case OPTION_FP32:
9268 mips_fp32 = 1;
9269 break;
9270
252b5132 9271 case OPTION_MABI:
beae10d5
KH
9272 if (strcmp (arg, "32") == 0
9273 || strcmp (arg, "n32") == 0
9274 || strcmp (arg, "64") == 0
9275 || strcmp (arg, "o64") == 0
9276 || strcmp (arg, "eabi") == 0)
ca4e0257
RS
9277 {
9278 mips_abi_string = arg;
9279 mips_32bit_abi = (strcmp (arg, "32") == 0);
9280 }
252b5132
RH
9281 break;
9282
6b76fefe
CM
9283 case OPTION_M7000_HILO_FIX:
9284 mips_7000_hilo_fix = true;
9285 break;
9286
9287 case OPTION_NO_M7000_HILO_FIX:
9288 mips_7000_hilo_fix = false;
9289 break;
9290
252b5132
RH
9291 default:
9292 return 0;
9293 }
9294
9295 return 1;
9296}
9297
252b5132
RH
9298static void
9299show (stream, string, col_p, first_p)
9300 FILE *stream;
9301 char *string;
9302 int *col_p;
9303 int *first_p;
9304{
9305 if (*first_p)
9306 {
9307 fprintf (stream, "%24s", "");
9308 *col_p = 24;
9309 }
9310 else
9311 {
9312 fprintf (stream, ", ");
9313 *col_p += 2;
9314 }
9315
9316 if (*col_p + strlen (string) > 72)
9317 {
9318 fprintf (stream, "\n%24s", "");
9319 *col_p = 24;
9320 }
9321
9322 fprintf (stream, "%s", string);
9323 *col_p += strlen (string);
9324
9325 *first_p = 0;
9326}
9327
252b5132
RH
9328void
9329md_show_usage (stream)
9330 FILE *stream;
9331{
9332 int column, first;
9333
beae10d5 9334 fprintf (stream, _("\
252b5132
RH
9335MIPS options:\n\
9336-membedded-pic generate embedded position independent code\n\
9337-EB generate big endian output\n\
9338-EL generate little endian output\n\
9a41af64 9339-g, -g2 do not remove unneeded NOPs or swap branches\n\
252b5132
RH
9340-G NUM allow referencing objects up to NUM bytes\n\
9341 implicitly with the gp register [default 8]\n"));
beae10d5 9342 fprintf (stream, _("\
252b5132
RH
9343-mips1 generate MIPS ISA I instructions\n\
9344-mips2 generate MIPS ISA II instructions\n\
9345-mips3 generate MIPS ISA III instructions\n\
9346-mips4 generate MIPS ISA IV instructions\n\
84ea6cf2 9347-mips5 generate MIPS ISA V instructions\n\
e7af610e 9348-mips32 generate MIPS32 ISA instructions\n\
84ea6cf2 9349-mips64 generate MIPS64 ISA instructions\n\
ec68c924 9350-march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
252b5132
RH
9351
9352 first = 1;
9353
9354 show (stream, "2000", &column, &first);
9355 show (stream, "3000", &column, &first);
9356 show (stream, "3900", &column, &first);
9357 show (stream, "4000", &column, &first);
9358 show (stream, "4010", &column, &first);
9359 show (stream, "4100", &column, &first);
9360 show (stream, "4111", &column, &first);
9361 show (stream, "4300", &column, &first);
9362 show (stream, "4400", &column, &first);
9363 show (stream, "4600", &column, &first);
9364 show (stream, "4650", &column, &first);
9365 show (stream, "5000", &column, &first);
18ae5d72
EC
9366 show (stream, "5200", &column, &first);
9367 show (stream, "5230", &column, &first);
9368 show (stream, "5231", &column, &first);
9369 show (stream, "5261", &column, &first);
9370 show (stream, "5721", &column, &first);
252b5132
RH
9371 show (stream, "6000", &column, &first);
9372 show (stream, "8000", &column, &first);
9373 show (stream, "10000", &column, &first);
d1cf510e 9374 show (stream, "12000", &column, &first);
e7af610e 9375 show (stream, "mips32-4k", &column, &first);
c6c98b38 9376 show (stream, "sb-1", &column, &first);
252b5132
RH
9377 fputc ('\n', stream);
9378
9379 fprintf (stream, _("\
ec68c924 9380-mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
252b5132
RH
9381-no-mCPU don't generate code specific to CPU.\n\
9382 For -mCPU and -no-mCPU, CPU must be one of:\n"));
9383
9384 first = 1;
9385
9386 show (stream, "3900", &column, &first);
9387 show (stream, "4010", &column, &first);
9388 show (stream, "4100", &column, &first);
9389 show (stream, "4650", &column, &first);
9390 fputc ('\n', stream);
9391
beae10d5 9392 fprintf (stream, _("\
252b5132
RH
9393-mips16 generate mips16 instructions\n\
9394-no-mips16 do not generate mips16 instructions\n"));
beae10d5 9395 fprintf (stream, _("\
ca4e0257
RS
9396-mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
9397-mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
252b5132
RH
9398-O0 remove unneeded NOPs, do not swap branches\n\
9399-O remove unneeded NOPs and swap branches\n\
63486801 9400-n warn about NOPs generated from macros\n\
119d663a 9401--[no-]construct-floats [dis]allow floating point values to be constructed\n\
252b5132
RH
9402--trap, --no-break trap exception on div by 0 and mult overflow\n\
9403--break, --no-trap break exception on div by 0 and mult overflow\n"));
9404#ifdef OBJ_ELF
beae10d5 9405 fprintf (stream, _("\
252b5132
RH
9406-KPIC, -call_shared generate SVR4 position independent code\n\
9407-non_shared do not generate position independent code\n\
9408-xgot assume a 32 bit GOT\n\
9409-32 create 32 bit object file (default)\n\
9410-64 create 64 bit object file\n"));
9411#endif
9412}
9413\f
9414void
9415mips_init_after_args ()
9416{
9417 /* initialize opcodes */
9418 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
beae10d5 9419 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
252b5132
RH
9420}
9421
9422long
9423md_pcrel_from (fixP)
9424 fixS *fixP;
9425{
9426 if (OUTPUT_FLAVOR != bfd_target_aout_flavour
9427 && fixP->fx_addsy != (symbolS *) NULL
9428 && ! S_IS_DEFINED (fixP->fx_addsy))
9429 {
9430 /* This makes a branch to an undefined symbol be a branch to the
9431 current location. */
9432 return 4;
9433 }
9434
9435 /* return the address of the delay slot */
9436 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
9437}
9438
252b5132
RH
9439/* This is called before the symbol table is processed. In order to
9440 work with gcc when using mips-tfile, we must keep all local labels.
9441 However, in other cases, we want to discard them. If we were
9442 called with -g, but we didn't see any debugging information, it may
9443 mean that gcc is smuggling debugging information through to
9444 mips-tfile, in which case we must generate all local labels. */
9445
9446void
9447mips_frob_file_before_adjust ()
9448{
9449#ifndef NO_ECOFF_DEBUGGING
9450 if (ECOFF_DEBUGGING
9451 && mips_debug != 0
9452 && ! ecoff_debugging_seen)
9453 flag_keep_locals = 1;
9454#endif
9455}
9456
9457/* Sort any unmatched HI16_S relocs so that they immediately precede
9458 the corresponding LO reloc. This is called before md_apply_fix and
9459 tc_gen_reloc. Unmatched HI16_S relocs can only be generated by
9460 explicit use of the %hi modifier. */
9461
9462void
9463mips_frob_file ()
9464{
9465 struct mips_hi_fixup *l;
9466
9467 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
9468 {
9469 segment_info_type *seginfo;
9470 int pass;
9471
9472 assert (l->fixp->fx_r_type == BFD_RELOC_HI16_S);
9473
9474 /* Check quickly whether the next fixup happens to be a matching
9475 %lo. */
9476 if (l->fixp->fx_next != NULL
9477 && l->fixp->fx_next->fx_r_type == BFD_RELOC_LO16
9478 && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
9479 && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
9480 continue;
9481
9482 /* Look through the fixups for this segment for a matching %lo.
9483 When we find one, move the %hi just in front of it. We do
9484 this in two passes. In the first pass, we try to find a
9485 unique %lo. In the second pass, we permit multiple %hi
9486 relocs for a single %lo (this is a GNU extension). */
9487 seginfo = seg_info (l->seg);
9488 for (pass = 0; pass < 2; pass++)
9489 {
9490 fixS *f, *prev;
9491
9492 prev = NULL;
9493 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
9494 {
9495 /* Check whether this is a %lo fixup which matches l->fixp. */
9496 if (f->fx_r_type == BFD_RELOC_LO16
9497 && f->fx_addsy == l->fixp->fx_addsy
9498 && f->fx_offset == l->fixp->fx_offset
9499 && (pass == 1
9500 || prev == NULL
9501 || prev->fx_r_type != BFD_RELOC_HI16_S
9502 || prev->fx_addsy != f->fx_addsy
9503 || prev->fx_offset != f->fx_offset))
9504 {
9505 fixS **pf;
9506
9507 /* Move l->fixp before f. */
9508 for (pf = &seginfo->fix_root;
9509 *pf != l->fixp;
9510 pf = &(*pf)->fx_next)
9511 assert (*pf != NULL);
9512
9513 *pf = l->fixp->fx_next;
9514
9515 l->fixp->fx_next = f;
9516 if (prev == NULL)
9517 seginfo->fix_root = l->fixp;
9518 else
9519 prev->fx_next = l->fixp;
9520
9521 break;
9522 }
9523
9524 prev = f;
9525 }
9526
9527 if (f != NULL)
9528 break;
9529
9530#if 0 /* GCC code motion plus incomplete dead code elimination
9531 can leave a %hi without a %lo. */
9532 if (pass == 1)
9533 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
9534 _("Unmatched %%hi reloc"));
9535#endif
9536 }
9537 }
9538}
9539
9540/* When generating embedded PIC code we need to use a special
9541 relocation to represent the difference of two symbols in the .text
9542 section (switch tables use a difference of this sort). See
9543 include/coff/mips.h for details. This macro checks whether this
9544 fixup requires the special reloc. */
9545#define SWITCH_TABLE(fixp) \
9546 ((fixp)->fx_r_type == BFD_RELOC_32 \
bb2d6cd7 9547 && OUTPUT_FLAVOR != bfd_target_elf_flavour \
252b5132
RH
9548 && (fixp)->fx_addsy != NULL \
9549 && (fixp)->fx_subsy != NULL \
9550 && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
9551 && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
9552
9553/* When generating embedded PIC code we must keep all PC relative
9554 relocations, in case the linker has to relax a call. We also need
9555 to keep relocations for switch table entries. */
9556
252b5132
RH
9557int
9558mips_force_relocation (fixp)
9559 fixS *fixp;
9560{
9561 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
9562 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
9563 return 1;
9564
9565 return (mips_pic == EMBEDDED_PIC
9566 && (fixp->fx_pcrel
9567 || SWITCH_TABLE (fixp)
9568 || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
9569 || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
9570}
9571
9572/* Apply a fixup to the object file. */
9573
9574int
9575md_apply_fix (fixP, valueP)
9576 fixS *fixP;
9577 valueT *valueP;
9578{
9579 unsigned char *buf;
98aa84af
AM
9580 long insn;
9581 valueT value;
252b5132
RH
9582
9583 assert (fixP->fx_size == 4
9584 || fixP->fx_r_type == BFD_RELOC_16
9585 || fixP->fx_r_type == BFD_RELOC_64
9586 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
9587 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
9588
9589 value = *valueP;
9590
9591 /* If we aren't adjusting this fixup to be against the section
9592 symbol, we need to adjust the value. */
9593#ifdef OBJ_ELF
9594 if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
bb2d6cd7 9595 {
98aa84af 9596 if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16
ea4ff978
L
9597 || ((S_IS_WEAK (fixP->fx_addsy)
9598 || S_IS_EXTERN (fixP->fx_addsy))
9599 && !S_IS_COMMON (fixP->fx_addsy))
98aa84af
AM
9600 || (symbol_used_in_reloc_p (fixP->fx_addsy)
9601 && (((bfd_get_section_flags (stdoutput,
9602 S_GET_SEGMENT (fixP->fx_addsy))
9603 & SEC_LINK_ONCE) != 0)
9604 || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
9605 ".gnu.linkonce",
9606 sizeof (".gnu.linkonce") - 1))))
252b5132 9607
98aa84af
AM
9608 {
9609 valueT symval = S_GET_VALUE (fixP->fx_addsy);
9610 value -= symval;
236bd878
RS
9611 if (value != 0
9612 && ! fixP->fx_pcrel
9613 && fixP->fx_r_type != BFD_RELOC_MIPS_GPREL)
98aa84af
AM
9614 {
9615 /* In this case, the bfd_install_relocation routine will
9616 incorrectly add the symbol value back in. We just want
7461da6e 9617 the addend to appear in the object file. */
98aa84af 9618 value -= symval;
7461da6e
RS
9619
9620 /* Make sure the addend is still non-zero. If it became zero
9621 after the last operation, set it to a spurious value and
9622 subtract the same value from the object file's contents. */
9623 if (value == 0)
9624 {
9625 value = 8;
9626
9627 /* The in-place addends for LO16 relocations are signed;
9628 leave the matching HI16 in-place addends as zero. */
9629 if (fixP->fx_r_type != BFD_RELOC_HI16_S)
9630 {
9631 reloc_howto_type *howto;
9632 bfd_vma contents, mask, field;
9633
9634 howto = bfd_reloc_type_lookup (stdoutput,
9635 fixP->fx_r_type);
9636
9637 contents = bfd_get_bits (fixP->fx_frag->fr_literal
9638 + fixP->fx_where,
9639 fixP->fx_size * 8,
9640 target_big_endian);
9641
9642 /* MASK has bits set where the relocation should go.
9643 FIELD is -value, shifted into the appropriate place
9644 for this relocation. */
9645 mask = 1 << (howto->bitsize - 1);
9646 mask = (((mask - 1) << 1) | 1) << howto->bitpos;
9647 field = (-value >> howto->rightshift) << howto->bitpos;
9648
9649 bfd_put_bits ((field & mask) | (contents & ~mask),
9650 fixP->fx_frag->fr_literal + fixP->fx_where,
9651 fixP->fx_size * 8,
9652 target_big_endian);
9653 }
9654 }
98aa84af
AM
9655 }
9656 }
252b5132 9657
bb2d6cd7
GK
9658 /* This code was generated using trial and error and so is
9659 fragile and not trustworthy. If you change it, you should
9660 rerun the elf-rel, elf-rel2, and empic testcases and ensure
9661 they still pass. */
9662 if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
9663 {
9664 value += fixP->fx_frag->fr_address + fixP->fx_where;
9665
9666 /* BFD's REL handling, for MIPS, is _very_ weird.
9667 This gives the right results, but it can't possibly
9668 be the way things are supposed to work. */
9669 if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
9670 || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
9671 value += fixP->fx_frag->fr_address + fixP->fx_where;
9672 }
9673 }
9674#endif
252b5132
RH
9675
9676 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc */
9677
9678 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel)
9679 fixP->fx_done = 1;
9680
9681 switch (fixP->fx_r_type)
9682 {
9683 case BFD_RELOC_MIPS_JMP:
9684 case BFD_RELOC_HI16:
9685 case BFD_RELOC_HI16_S:
9686 case BFD_RELOC_MIPS_GPREL:
9687 case BFD_RELOC_MIPS_LITERAL:
9688 case BFD_RELOC_MIPS_CALL16:
9689 case BFD_RELOC_MIPS_GOT16:
9690 case BFD_RELOC_MIPS_GPREL32:
9691 case BFD_RELOC_MIPS_GOT_HI16:
9692 case BFD_RELOC_MIPS_GOT_LO16:
9693 case BFD_RELOC_MIPS_CALL_HI16:
9694 case BFD_RELOC_MIPS_CALL_LO16:
9695 case BFD_RELOC_MIPS16_GPREL:
9696 if (fixP->fx_pcrel)
9697 as_bad_where (fixP->fx_file, fixP->fx_line,
9698 _("Invalid PC relative reloc"));
9699 /* Nothing needed to do. The value comes from the reloc entry */
9700 break;
9701
9702 case BFD_RELOC_MIPS16_JMP:
9703 /* We currently always generate a reloc against a symbol, which
9704 means that we don't want an addend even if the symbol is
9705 defined. */
9706 fixP->fx_addnumber = 0;
9707 break;
9708
9709 case BFD_RELOC_PCREL_HI16_S:
9710 /* The addend for this is tricky if it is internal, so we just
9711 do everything here rather than in bfd_install_relocation. */
bdaaa2e1 9712 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
bb2d6cd7
GK
9713 && !fixP->fx_done
9714 && value != 0)
9715 break;
9716 if (fixP->fx_addsy
9717 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
252b5132
RH
9718 {
9719 /* For an external symbol adjust by the address to make it
9720 pcrel_offset. We use the address of the RELLO reloc
9721 which follows this one. */
9722 value += (fixP->fx_next->fx_frag->fr_address
9723 + fixP->fx_next->fx_where);
9724 }
e7d556df 9725 value = ((value + 0x8000) >> 16) & 0xffff;
252b5132
RH
9726 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
9727 if (target_big_endian)
9728 buf += 2;
9729 md_number_to_chars (buf, value, 2);
9730 break;
9731
9732 case BFD_RELOC_PCREL_LO16:
9733 /* The addend for this is tricky if it is internal, so we just
9734 do everything here rather than in bfd_install_relocation. */
bdaaa2e1 9735 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
bb2d6cd7
GK
9736 && !fixP->fx_done
9737 && value != 0)
9738 break;
9739 if (fixP->fx_addsy
9740 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
252b5132
RH
9741 value += fixP->fx_frag->fr_address + fixP->fx_where;
9742 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
9743 if (target_big_endian)
9744 buf += 2;
9745 md_number_to_chars (buf, value, 2);
9746 break;
9747
9748 case BFD_RELOC_64:
9749 /* This is handled like BFD_RELOC_32, but we output a sign
9750 extended value if we are only 32 bits. */
9751 if (fixP->fx_done
9752 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
9753 {
9754 if (8 <= sizeof (valueT))
9755 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
9756 value, 8);
9757 else
9758 {
9759 long w1, w2;
9760 long hiv;
9761
9762 w1 = w2 = fixP->fx_where;
9763 if (target_big_endian)
9764 w1 += 4;
9765 else
9766 w2 += 4;
9767 md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
9768 if ((value & 0x80000000) != 0)
9769 hiv = 0xffffffff;
9770 else
9771 hiv = 0;
9772 md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
9773 }
9774 }
9775 break;
9776
056350c6 9777 case BFD_RELOC_RVA:
252b5132
RH
9778 case BFD_RELOC_32:
9779 /* If we are deleting this reloc entry, we must fill in the
9780 value now. This can happen if we have a .word which is not
9781 resolved when it appears but is later defined. We also need
9782 to fill in the value if this is an embedded PIC switch table
9783 entry. */
9784 if (fixP->fx_done
9785 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
9786 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
9787 value, 4);
9788 break;
9789
9790 case BFD_RELOC_16:
9791 /* If we are deleting this reloc entry, we must fill in the
9792 value now. */
9793 assert (fixP->fx_size == 2);
9794 if (fixP->fx_done)
9795 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
9796 value, 2);
9797 break;
9798
9799 case BFD_RELOC_LO16:
9800 /* When handling an embedded PIC switch statement, we can wind
9801 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
9802 if (fixP->fx_done)
9803 {
98aa84af 9804 if (value + 0x8000 > 0xffff)
252b5132
RH
9805 as_bad_where (fixP->fx_file, fixP->fx_line,
9806 _("relocation overflow"));
9807 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
9808 if (target_big_endian)
9809 buf += 2;
9810 md_number_to_chars (buf, value, 2);
9811 }
9812 break;
9813
9814 case BFD_RELOC_16_PCREL_S2:
9815 /*
9816 * We need to save the bits in the instruction since fixup_segment()
9817 * might be deleting the relocation entry (i.e., a branch within
9818 * the current segment).
9819 */
9820 if ((value & 0x3) != 0)
9821 as_bad_where (fixP->fx_file, fixP->fx_line,
98aa84af 9822 _("Branch to odd address (%lx)"), (long) value);
bb2d6cd7
GK
9823
9824 if (!fixP->fx_done && value != 0)
9825 break;
9826 /* If 'value' is zero, the remaining reloc code won't actually
9827 do the store, so it must be done here. This is probably
9828 a bug somewhere. */
9829 if (!fixP->fx_done)
9830 value -= fixP->fx_frag->fr_address + fixP->fx_where;
bdaaa2e1 9831
98aa84af 9832 value = (offsetT) value >> 2;
252b5132
RH
9833
9834 /* update old instruction data */
9835 buf = (unsigned char *) (fixP->fx_where + fixP->fx_frag->fr_literal);
9836 if (target_big_endian)
9837 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
9838 else
9839 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
9840
98aa84af 9841 if (value + 0x8000 <= 0xffff)
252b5132
RH
9842 insn |= value & 0xffff;
9843 else
9844 {
9845 /* The branch offset is too large. If this is an
9846 unconditional branch, and we are not generating PIC code,
9847 we can convert it to an absolute jump instruction. */
9848 if (mips_pic == NO_PIC
9849 && fixP->fx_done
9850 && fixP->fx_frag->fr_address >= text_section->vma
9851 && (fixP->fx_frag->fr_address
9852 < text_section->vma + text_section->_raw_size)
9853 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
9854 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
9855 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
9856 {
9857 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
9858 insn = 0x0c000000; /* jal */
9859 else
9860 insn = 0x08000000; /* j */
9861 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
9862 fixP->fx_done = 0;
9863 fixP->fx_addsy = section_symbol (text_section);
9864 fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
9865 }
9866 else
9867 {
9868 /* FIXME. It would be possible in principle to handle
9869 conditional branches which overflow. They could be
9870 transformed into a branch around a jump. This would
9871 require setting up variant frags for each different
9872 branch type. The native MIPS assembler attempts to
9873 handle these cases, but it appears to do it
9874 incorrectly. */
9875 as_bad_where (fixP->fx_file, fixP->fx_line,
9876 _("Branch out of range"));
9877 }
9878 }
9879
9880 md_number_to_chars ((char *) buf, (valueT) insn, 4);
9881 break;
9882
9883 case BFD_RELOC_VTABLE_INHERIT:
9884 fixP->fx_done = 0;
9885 if (fixP->fx_addsy
9886 && !S_IS_DEFINED (fixP->fx_addsy)
9887 && !S_IS_WEAK (fixP->fx_addsy))
9888 S_SET_WEAK (fixP->fx_addsy);
9889 break;
9890
9891 case BFD_RELOC_VTABLE_ENTRY:
9892 fixP->fx_done = 0;
9893 break;
9894
9895 default:
9896 internalError ();
9897 }
9898
9899 return 1;
9900}
9901
9902#if 0
9903void
9904printInsn (oc)
9905 unsigned long oc;
9906{
9907 const struct mips_opcode *p;
9908 int treg, sreg, dreg, shamt;
9909 short imm;
9910 const char *args;
9911 int i;
9912
9913 for (i = 0; i < NUMOPCODES; ++i)
9914 {
9915 p = &mips_opcodes[i];
9916 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
9917 {
9918 printf ("%08lx %s\t", oc, p->name);
9919 treg = (oc >> 16) & 0x1f;
9920 sreg = (oc >> 21) & 0x1f;
9921 dreg = (oc >> 11) & 0x1f;
9922 shamt = (oc >> 6) & 0x1f;
9923 imm = oc;
9924 for (args = p->args;; ++args)
9925 {
9926 switch (*args)
9927 {
9928 case '\0':
9929 printf ("\n");
9930 break;
9931
9932 case ',':
9933 case '(':
9934 case ')':
9935 printf ("%c", *args);
9936 continue;
9937
9938 case 'r':
9939 assert (treg == sreg);
9940 printf ("$%d,$%d", treg, sreg);
9941 continue;
9942
9943 case 'd':
9944 case 'G':
9945 printf ("$%d", dreg);
9946 continue;
9947
9948 case 't':
9949 case 'E':
9950 printf ("$%d", treg);
9951 continue;
9952
9953 case 'k':
9954 printf ("0x%x", treg);
9955 continue;
9956
9957 case 'b':
9958 case 's':
9959 printf ("$%d", sreg);
9960 continue;
9961
9962 case 'a':
9963 printf ("0x%08lx", oc & 0x1ffffff);
9964 continue;
9965
9966 case 'i':
9967 case 'j':
9968 case 'o':
9969 case 'u':
9970 printf ("%d", imm);
9971 continue;
9972
9973 case '<':
9974 case '>':
9975 printf ("$%d", shamt);
9976 continue;
9977
9978 default:
9979 internalError ();
9980 }
9981 break;
9982 }
9983 return;
9984 }
9985 }
9986 printf (_("%08lx UNDEFINED\n"), oc);
9987}
9988#endif
9989
9990static symbolS *
9991get_symbol ()
9992{
9993 int c;
9994 char *name;
9995 symbolS *p;
9996
9997 name = input_line_pointer;
9998 c = get_symbol_end ();
9999 p = (symbolS *) symbol_find_or_make (name);
10000 *input_line_pointer = c;
10001 return p;
10002}
10003
10004/* Align the current frag to a given power of two. The MIPS assembler
10005 also automatically adjusts any preceding label. */
10006
10007static void
10008mips_align (to, fill, label)
10009 int to;
10010 int fill;
10011 symbolS *label;
10012{
10013 mips_emit_delays (false);
10014 frag_align (to, fill, 0);
10015 record_alignment (now_seg, to);
10016 if (label != NULL)
10017 {
10018 assert (S_GET_SEGMENT (label) == now_seg);
49309057 10019 symbol_set_frag (label, frag_now);
252b5132
RH
10020 S_SET_VALUE (label, (valueT) frag_now_fix ());
10021 }
10022}
10023
10024/* Align to a given power of two. .align 0 turns off the automatic
10025 alignment used by the data creating pseudo-ops. */
10026
10027static void
10028s_align (x)
43841e91 10029 int x ATTRIBUTE_UNUSED;
252b5132
RH
10030{
10031 register int temp;
10032 register long temp_fill;
10033 long max_alignment = 15;
10034
10035 /*
10036
10037 o Note that the assembler pulls down any immediately preceeding label
10038 to the aligned address.
10039 o It's not documented but auto alignment is reinstated by
10040 a .align pseudo instruction.
10041 o Note also that after auto alignment is turned off the mips assembler
10042 issues an error on attempt to assemble an improperly aligned data item.
10043 We don't.
10044
10045 */
10046
10047 temp = get_absolute_expression ();
10048 if (temp > max_alignment)
10049 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
10050 else if (temp < 0)
10051 {
10052 as_warn (_("Alignment negative: 0 assumed."));
10053 temp = 0;
10054 }
10055 if (*input_line_pointer == ',')
10056 {
10057 input_line_pointer++;
10058 temp_fill = get_absolute_expression ();
10059 }
10060 else
10061 temp_fill = 0;
10062 if (temp)
10063 {
10064 auto_align = 1;
10065 mips_align (temp, (int) temp_fill,
10066 insn_labels != NULL ? insn_labels->label : NULL);
10067 }
10068 else
10069 {
10070 auto_align = 0;
10071 }
10072
10073 demand_empty_rest_of_line ();
10074}
10075
10076void
10077mips_flush_pending_output ()
10078{
10079 mips_emit_delays (false);
10080 mips_clear_insn_labels ();
10081}
10082
10083static void
10084s_change_sec (sec)
10085 int sec;
10086{
10087 segT seg;
10088
10089 /* When generating embedded PIC code, we only use the .text, .lit8,
10090 .sdata and .sbss sections. We change the .data and .rdata
10091 pseudo-ops to use .sdata. */
10092 if (mips_pic == EMBEDDED_PIC
10093 && (sec == 'd' || sec == 'r'))
10094 sec = 's';
10095
10096#ifdef OBJ_ELF
10097 /* The ELF backend needs to know that we are changing sections, so
10098 that .previous works correctly. We could do something like check
10099 for a obj_section_change_hook macro, but that might be confusing
10100 as it would not be appropriate to use it in the section changing
10101 functions in read.c, since obj-elf.c intercepts those. FIXME:
10102 This should be cleaner, somehow. */
10103 obj_elf_section_change_hook ();
10104#endif
10105
10106 mips_emit_delays (false);
10107 switch (sec)
10108 {
10109 case 't':
10110 s_text (0);
10111 break;
10112 case 'd':
10113 s_data (0);
10114 break;
10115 case 'b':
10116 subseg_set (bss_section, (subsegT) get_absolute_expression ());
10117 demand_empty_rest_of_line ();
10118 break;
10119
10120 case 'r':
10121 if (USE_GLOBAL_POINTER_OPT)
10122 {
10123 seg = subseg_new (RDATA_SECTION_NAME,
10124 (subsegT) get_absolute_expression ());
10125 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
10126 {
10127 bfd_set_section_flags (stdoutput, seg,
10128 (SEC_ALLOC
10129 | SEC_LOAD
10130 | SEC_READONLY
10131 | SEC_RELOC
10132 | SEC_DATA));
10133 if (strcmp (TARGET_OS, "elf") != 0)
e799a695 10134 record_alignment (seg, 4);
252b5132
RH
10135 }
10136 demand_empty_rest_of_line ();
10137 }
10138 else
10139 {
10140 as_bad (_("No read only data section in this object file format"));
10141 demand_empty_rest_of_line ();
10142 return;
10143 }
10144 break;
10145
10146 case 's':
10147 if (USE_GLOBAL_POINTER_OPT)
10148 {
10149 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
10150 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
10151 {
10152 bfd_set_section_flags (stdoutput, seg,
10153 SEC_ALLOC | SEC_LOAD | SEC_RELOC
10154 | SEC_DATA);
10155 if (strcmp (TARGET_OS, "elf") != 0)
e799a695 10156 record_alignment (seg, 4);
252b5132
RH
10157 }
10158 demand_empty_rest_of_line ();
10159 break;
10160 }
10161 else
10162 {
10163 as_bad (_("Global pointers not supported; recompile -G 0"));
10164 demand_empty_rest_of_line ();
10165 return;
10166 }
10167 }
10168
10169 auto_align = 1;
10170}
10171
10172void
10173mips_enable_auto_align ()
10174{
10175 auto_align = 1;
10176}
10177
10178static void
10179s_cons (log_size)
10180 int log_size;
10181{
10182 symbolS *label;
10183
10184 label = insn_labels != NULL ? insn_labels->label : NULL;
10185 mips_emit_delays (false);
10186 if (log_size > 0 && auto_align)
10187 mips_align (log_size, 0, label);
10188 mips_clear_insn_labels ();
10189 cons (1 << log_size);
10190}
10191
10192static void
10193s_float_cons (type)
10194 int type;
10195{
10196 symbolS *label;
10197
10198 label = insn_labels != NULL ? insn_labels->label : NULL;
10199
10200 mips_emit_delays (false);
10201
10202 if (auto_align)
49309057
ILT
10203 {
10204 if (type == 'd')
10205 mips_align (3, 0, label);
10206 else
10207 mips_align (2, 0, label);
10208 }
252b5132
RH
10209
10210 mips_clear_insn_labels ();
10211
10212 float_cons (type);
10213}
10214
10215/* Handle .globl. We need to override it because on Irix 5 you are
10216 permitted to say
10217 .globl foo .text
10218 where foo is an undefined symbol, to mean that foo should be
10219 considered to be the address of a function. */
10220
10221static void
10222s_mips_globl (x)
43841e91 10223 int x ATTRIBUTE_UNUSED;
252b5132
RH
10224{
10225 char *name;
10226 int c;
10227 symbolS *symbolP;
10228 flagword flag;
10229
10230 name = input_line_pointer;
10231 c = get_symbol_end ();
10232 symbolP = symbol_find_or_make (name);
10233 *input_line_pointer = c;
10234 SKIP_WHITESPACE ();
10235
10236 /* On Irix 5, every global symbol that is not explicitly labelled as
10237 being a function is apparently labelled as being an object. */
10238 flag = BSF_OBJECT;
10239
10240 if (! is_end_of_line[(unsigned char) *input_line_pointer])
10241 {
10242 char *secname;
10243 asection *sec;
10244
10245 secname = input_line_pointer;
10246 c = get_symbol_end ();
10247 sec = bfd_get_section_by_name (stdoutput, secname);
10248 if (sec == NULL)
10249 as_bad (_("%s: no such section"), secname);
10250 *input_line_pointer = c;
10251
10252 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
10253 flag = BSF_FUNCTION;
10254 }
10255
49309057 10256 symbol_get_bfdsym (symbolP)->flags |= flag;
252b5132
RH
10257
10258 S_SET_EXTERNAL (symbolP);
10259 demand_empty_rest_of_line ();
10260}
10261
10262static void
10263s_option (x)
43841e91 10264 int x ATTRIBUTE_UNUSED;
252b5132
RH
10265{
10266 char *opt;
10267 char c;
10268
10269 opt = input_line_pointer;
10270 c = get_symbol_end ();
10271
10272 if (*opt == 'O')
10273 {
10274 /* FIXME: What does this mean? */
10275 }
10276 else if (strncmp (opt, "pic", 3) == 0)
10277 {
10278 int i;
10279
10280 i = atoi (opt + 3);
10281 if (i == 0)
10282 mips_pic = NO_PIC;
10283 else if (i == 2)
10284 mips_pic = SVR4_PIC;
10285 else
10286 as_bad (_(".option pic%d not supported"), i);
10287
10288 if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
10289 {
10290 if (g_switch_seen && g_switch_value != 0)
10291 as_warn (_("-G may not be used with SVR4 PIC code"));
10292 g_switch_value = 0;
10293 bfd_set_gp_size (stdoutput, 0);
10294 }
10295 }
10296 else
10297 as_warn (_("Unrecognized option \"%s\""), opt);
10298
10299 *input_line_pointer = c;
10300 demand_empty_rest_of_line ();
10301}
10302
10303/* This structure is used to hold a stack of .set values. */
10304
e972090a
NC
10305struct mips_option_stack
10306{
252b5132
RH
10307 struct mips_option_stack *next;
10308 struct mips_set_options options;
10309};
10310
10311static struct mips_option_stack *mips_opts_stack;
10312
10313/* Handle the .set pseudo-op. */
10314
10315static void
10316s_mipsset (x)
43841e91 10317 int x ATTRIBUTE_UNUSED;
252b5132
RH
10318{
10319 char *name = input_line_pointer, ch;
10320
10321 while (!is_end_of_line[(unsigned char) *input_line_pointer])
10322 input_line_pointer++;
10323 ch = *input_line_pointer;
10324 *input_line_pointer = '\0';
10325
10326 if (strcmp (name, "reorder") == 0)
10327 {
10328 if (mips_opts.noreorder && prev_nop_frag != NULL)
10329 {
10330 /* If we still have pending nops, we can discard them. The
10331 usual nop handling will insert any that are still
bdaaa2e1 10332 needed. */
252b5132
RH
10333 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
10334 * (mips_opts.mips16 ? 2 : 4));
10335 prev_nop_frag = NULL;
10336 }
10337 mips_opts.noreorder = 0;
10338 }
10339 else if (strcmp (name, "noreorder") == 0)
10340 {
10341 mips_emit_delays (true);
10342 mips_opts.noreorder = 1;
10343 mips_any_noreorder = 1;
10344 }
10345 else if (strcmp (name, "at") == 0)
10346 {
10347 mips_opts.noat = 0;
10348 }
10349 else if (strcmp (name, "noat") == 0)
10350 {
10351 mips_opts.noat = 1;
10352 }
10353 else if (strcmp (name, "macro") == 0)
10354 {
10355 mips_opts.warn_about_macros = 0;
10356 }
10357 else if (strcmp (name, "nomacro") == 0)
10358 {
10359 if (mips_opts.noreorder == 0)
10360 as_bad (_("`noreorder' must be set before `nomacro'"));
10361 mips_opts.warn_about_macros = 1;
10362 }
10363 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
10364 {
10365 mips_opts.nomove = 0;
10366 }
10367 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
10368 {
10369 mips_opts.nomove = 1;
10370 }
10371 else if (strcmp (name, "bopt") == 0)
10372 {
10373 mips_opts.nobopt = 0;
10374 }
10375 else if (strcmp (name, "nobopt") == 0)
10376 {
10377 mips_opts.nobopt = 1;
10378 }
10379 else if (strcmp (name, "mips16") == 0
10380 || strcmp (name, "MIPS-16") == 0)
10381 mips_opts.mips16 = 1;
10382 else if (strcmp (name, "nomips16") == 0
10383 || strcmp (name, "noMIPS-16") == 0)
10384 mips_opts.mips16 = 0;
10385 else if (strncmp (name, "mips", 4) == 0)
10386 {
10387 int isa;
10388
10389 /* Permit the user to change the ISA on the fly. Needless to
10390 say, misuse can cause serious problems. */
10391 isa = atoi (name + 4);
e7af610e
NC
10392 switch (isa)
10393 {
84ea6cf2
NC
10394 case 0: mips_opts.isa = file_mips_isa; break;
10395 case 1: mips_opts.isa = ISA_MIPS1; break;
10396 case 2: mips_opts.isa = ISA_MIPS2; break;
10397 case 3: mips_opts.isa = ISA_MIPS3; break;
84ea6cf2 10398 case 4: mips_opts.isa = ISA_MIPS4; break;
9a41af64 10399 case 5: mips_opts.isa = ISA_MIPS5; break;
84ea6cf2
NC
10400 case 32: mips_opts.isa = ISA_MIPS32; break;
10401 case 64: mips_opts.isa = ISA_MIPS64; break;
10402 default: as_bad (_("unknown ISA level")); break;
e7af610e 10403 }
252b5132
RH
10404 }
10405 else if (strcmp (name, "autoextend") == 0)
10406 mips_opts.noautoextend = 0;
10407 else if (strcmp (name, "noautoextend") == 0)
10408 mips_opts.noautoextend = 1;
10409 else if (strcmp (name, "push") == 0)
10410 {
10411 struct mips_option_stack *s;
10412
10413 s = (struct mips_option_stack *) xmalloc (sizeof *s);
10414 s->next = mips_opts_stack;
10415 s->options = mips_opts;
10416 mips_opts_stack = s;
10417 }
10418 else if (strcmp (name, "pop") == 0)
10419 {
10420 struct mips_option_stack *s;
10421
10422 s = mips_opts_stack;
10423 if (s == NULL)
10424 as_bad (_(".set pop with no .set push"));
10425 else
10426 {
10427 /* If we're changing the reorder mode we need to handle
10428 delay slots correctly. */
10429 if (s->options.noreorder && ! mips_opts.noreorder)
10430 mips_emit_delays (true);
10431 else if (! s->options.noreorder && mips_opts.noreorder)
10432 {
10433 if (prev_nop_frag != NULL)
10434 {
10435 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
10436 * (mips_opts.mips16 ? 2 : 4));
10437 prev_nop_frag = NULL;
10438 }
10439 }
10440
10441 mips_opts = s->options;
10442 mips_opts_stack = s->next;
10443 free (s);
10444 }
10445 }
10446 else
10447 {
10448 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
10449 }
10450 *input_line_pointer = ch;
10451 demand_empty_rest_of_line ();
10452}
10453
10454/* Handle the .abicalls pseudo-op. I believe this is equivalent to
10455 .option pic2. It means to generate SVR4 PIC calls. */
10456
10457static void
10458s_abicalls (ignore)
43841e91 10459 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10460{
10461 mips_pic = SVR4_PIC;
10462 if (USE_GLOBAL_POINTER_OPT)
10463 {
10464 if (g_switch_seen && g_switch_value != 0)
10465 as_warn (_("-G may not be used with SVR4 PIC code"));
10466 g_switch_value = 0;
10467 }
10468 bfd_set_gp_size (stdoutput, 0);
10469 demand_empty_rest_of_line ();
10470}
10471
10472/* Handle the .cpload pseudo-op. This is used when generating SVR4
10473 PIC code. It sets the $gp register for the function based on the
10474 function address, which is in the register named in the argument.
10475 This uses a relocation against _gp_disp, which is handled specially
10476 by the linker. The result is:
10477 lui $gp,%hi(_gp_disp)
10478 addiu $gp,$gp,%lo(_gp_disp)
10479 addu $gp,$gp,.cpload argument
10480 The .cpload argument is normally $25 == $t9. */
10481
10482static void
10483s_cpload (ignore)
43841e91 10484 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10485{
10486 expressionS ex;
10487 int icnt = 0;
10488
10489 /* If we are not generating SVR4 PIC code, .cpload is ignored. */
10490 if (mips_pic != SVR4_PIC)
10491 {
10492 s_ignore (0);
10493 return;
10494 }
10495
10496 /* .cpload should be a in .set noreorder section. */
10497 if (mips_opts.noreorder == 0)
10498 as_warn (_(".cpload not in noreorder section"));
10499
10500 ex.X_op = O_symbol;
10501 ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
10502 ex.X_op_symbol = NULL;
10503 ex.X_add_number = 0;
10504
10505 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
49309057 10506 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
252b5132
RH
10507
10508 macro_build_lui ((char *) NULL, &icnt, &ex, GP);
10509 macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP,
10510 (int) BFD_RELOC_LO16);
10511
10512 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
10513 GP, GP, tc_get_register (0));
10514
10515 demand_empty_rest_of_line ();
10516}
10517
10518/* Handle the .cprestore pseudo-op. This stores $gp into a given
10519 offset from $sp. The offset is remembered, and after making a PIC
10520 call $gp is restored from that location. */
10521
10522static void
10523s_cprestore (ignore)
43841e91 10524 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10525{
10526 expressionS ex;
10527 int icnt = 0;
10528
10529 /* If we are not generating SVR4 PIC code, .cprestore is ignored. */
10530 if (mips_pic != SVR4_PIC)
10531 {
10532 s_ignore (0);
10533 return;
10534 }
10535
10536 mips_cprestore_offset = get_absolute_expression ();
10537
10538 ex.X_op = O_constant;
10539 ex.X_add_symbol = NULL;
10540 ex.X_op_symbol = NULL;
10541 ex.X_add_number = mips_cprestore_offset;
10542
10543 macro_build ((char *) NULL, &icnt, &ex,
ca4e0257 10544 HAVE_32BIT_ADDRESSES ? "sw" : "sd",
252b5132
RH
10545 "t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
10546
10547 demand_empty_rest_of_line ();
10548}
10549
10550/* Handle the .gpword pseudo-op. This is used when generating PIC
10551 code. It generates a 32 bit GP relative reloc. */
10552
10553static void
10554s_gpword (ignore)
43841e91 10555 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10556{
10557 symbolS *label;
10558 expressionS ex;
10559 char *p;
10560
10561 /* When not generating PIC code, this is treated as .word. */
10562 if (mips_pic != SVR4_PIC)
10563 {
10564 s_cons (2);
10565 return;
10566 }
10567
10568 label = insn_labels != NULL ? insn_labels->label : NULL;
10569 mips_emit_delays (true);
10570 if (auto_align)
10571 mips_align (2, 0, label);
10572 mips_clear_insn_labels ();
10573
10574 expression (&ex);
10575
10576 if (ex.X_op != O_symbol || ex.X_add_number != 0)
10577 {
10578 as_bad (_("Unsupported use of .gpword"));
10579 ignore_rest_of_line ();
10580 }
10581
10582 p = frag_more (4);
10583 md_number_to_chars (p, (valueT) 0, 4);
10584 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0,
10585 BFD_RELOC_MIPS_GPREL32);
10586
10587 demand_empty_rest_of_line ();
10588}
10589
10590/* Handle the .cpadd pseudo-op. This is used when dealing with switch
10591 tables in SVR4 PIC code. */
10592
10593static void
10594s_cpadd (ignore)
43841e91 10595 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10596{
10597 int icnt = 0;
10598 int reg;
10599
10600 /* This is ignored when not generating SVR4 PIC code. */
10601 if (mips_pic != SVR4_PIC)
10602 {
10603 s_ignore (0);
10604 return;
10605 }
10606
10607 /* Add $gp to the register named as an argument. */
10608 reg = tc_get_register (0);
10609 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 10610 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
10611 "d,v,t", reg, reg, GP);
10612
bdaaa2e1 10613 demand_empty_rest_of_line ();
252b5132
RH
10614}
10615
10616/* Handle the .insn pseudo-op. This marks instruction labels in
10617 mips16 mode. This permits the linker to handle them specially,
10618 such as generating jalx instructions when needed. We also make
10619 them odd for the duration of the assembly, in order to generate the
10620 right sort of code. We will make them even in the adjust_symtab
10621 routine, while leaving them marked. This is convenient for the
10622 debugger and the disassembler. The linker knows to make them odd
10623 again. */
10624
10625static void
10626s_insn (ignore)
43841e91 10627 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10628{
10629 if (mips_opts.mips16)
10630 mips16_mark_labels ();
10631
10632 demand_empty_rest_of_line ();
10633}
10634
10635/* Handle a .stabn directive. We need these in order to mark a label
10636 as being a mips16 text label correctly. Sometimes the compiler
10637 will emit a label, followed by a .stabn, and then switch sections.
10638 If the label and .stabn are in mips16 mode, then the label is
10639 really a mips16 text label. */
10640
10641static void
10642s_mips_stab (type)
10643 int type;
10644{
10645 if (type == 'n' && mips_opts.mips16)
10646 mips16_mark_labels ();
10647
10648 s_stab (type);
10649}
10650
10651/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
10652 */
10653
10654static void
10655s_mips_weakext (ignore)
43841e91 10656 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
10657{
10658 char *name;
10659 int c;
10660 symbolS *symbolP;
10661 expressionS exp;
10662
10663 name = input_line_pointer;
10664 c = get_symbol_end ();
10665 symbolP = symbol_find_or_make (name);
10666 S_SET_WEAK (symbolP);
10667 *input_line_pointer = c;
10668
10669 SKIP_WHITESPACE ();
10670
10671 if (! is_end_of_line[(unsigned char) *input_line_pointer])
10672 {
10673 if (S_IS_DEFINED (symbolP))
10674 {
10675 as_bad ("Ignoring attempt to redefine symbol `%s'.",
10676 S_GET_NAME (symbolP));
10677 ignore_rest_of_line ();
10678 return;
10679 }
bdaaa2e1 10680
252b5132
RH
10681 if (*input_line_pointer == ',')
10682 {
10683 ++input_line_pointer;
10684 SKIP_WHITESPACE ();
10685 }
bdaaa2e1 10686
252b5132
RH
10687 expression (&exp);
10688 if (exp.X_op != O_symbol)
10689 {
10690 as_bad ("bad .weakext directive");
10691 ignore_rest_of_line();
10692 return;
10693 }
49309057 10694 symbol_set_value_expression (symbolP, &exp);
252b5132
RH
10695 }
10696
10697 demand_empty_rest_of_line ();
10698}
10699
10700/* Parse a register string into a number. Called from the ECOFF code
10701 to parse .frame. The argument is non-zero if this is the frame
10702 register, so that we can record it in mips_frame_reg. */
10703
10704int
10705tc_get_register (frame)
10706 int frame;
10707{
10708 int reg;
10709
10710 SKIP_WHITESPACE ();
10711 if (*input_line_pointer++ != '$')
10712 {
10713 as_warn (_("expected `$'"));
10714 reg = 0;
10715 }
10716 else if (isdigit ((unsigned char) *input_line_pointer))
10717 {
10718 reg = get_absolute_expression ();
10719 if (reg < 0 || reg >= 32)
10720 {
10721 as_warn (_("Bad register number"));
10722 reg = 0;
10723 }
10724 }
10725 else
10726 {
10727 if (strncmp (input_line_pointer, "fp", 2) == 0)
10728 reg = FP;
10729 else if (strncmp (input_line_pointer, "sp", 2) == 0)
10730 reg = SP;
10731 else if (strncmp (input_line_pointer, "gp", 2) == 0)
10732 reg = GP;
10733 else if (strncmp (input_line_pointer, "at", 2) == 0)
10734 reg = AT;
10735 else
10736 {
10737 as_warn (_("Unrecognized register name"));
10738 reg = 0;
10739 }
10740 input_line_pointer += 2;
10741 }
10742 if (frame)
10743 mips_frame_reg = reg != 0 ? reg : SP;
10744 return reg;
10745}
10746
10747valueT
10748md_section_align (seg, addr)
10749 asection *seg;
10750 valueT addr;
10751{
10752 int align = bfd_get_section_alignment (stdoutput, seg);
10753
10754#ifdef OBJ_ELF
10755 /* We don't need to align ELF sections to the full alignment.
10756 However, Irix 5 may prefer that we align them at least to a 16
10757 byte boundary. We don't bother to align the sections if we are
10758 targeted for an embedded system. */
10759 if (strcmp (TARGET_OS, "elf") == 0)
10760 return addr;
10761 if (align > 4)
10762 align = 4;
10763#endif
10764
10765 return ((addr + (1 << align) - 1) & (-1 << align));
10766}
10767
10768/* Utility routine, called from above as well. If called while the
10769 input file is still being read, it's only an approximation. (For
10770 example, a symbol may later become defined which appeared to be
10771 undefined earlier.) */
10772
10773static int
10774nopic_need_relax (sym, before_relaxing)
10775 symbolS *sym;
10776 int before_relaxing;
10777{
10778 if (sym == 0)
10779 return 0;
10780
10781 if (USE_GLOBAL_POINTER_OPT)
10782 {
10783 const char *symname;
10784 int change;
10785
10786 /* Find out whether this symbol can be referenced off the GP
10787 register. It can be if it is smaller than the -G size or if
10788 it is in the .sdata or .sbss section. Certain symbols can
10789 not be referenced off the GP, although it appears as though
10790 they can. */
10791 symname = S_GET_NAME (sym);
10792 if (symname != (const char *) NULL
10793 && (strcmp (symname, "eprol") == 0
10794 || strcmp (symname, "etext") == 0
10795 || strcmp (symname, "_gp") == 0
10796 || strcmp (symname, "edata") == 0
10797 || strcmp (symname, "_fbss") == 0
10798 || strcmp (symname, "_fdata") == 0
10799 || strcmp (symname, "_ftext") == 0
10800 || strcmp (symname, "end") == 0
10801 || strcmp (symname, "_gp_disp") == 0))
10802 change = 1;
10803 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
10804 && (0
10805#ifndef NO_ECOFF_DEBUGGING
49309057
ILT
10806 || (symbol_get_obj (sym)->ecoff_extern_size != 0
10807 && (symbol_get_obj (sym)->ecoff_extern_size
10808 <= g_switch_value))
252b5132
RH
10809#endif
10810 /* We must defer this decision until after the whole
10811 file has been read, since there might be a .extern
10812 after the first use of this symbol. */
10813 || (before_relaxing
10814#ifndef NO_ECOFF_DEBUGGING
49309057 10815 && symbol_get_obj (sym)->ecoff_extern_size == 0
252b5132
RH
10816#endif
10817 && S_GET_VALUE (sym) == 0)
10818 || (S_GET_VALUE (sym) != 0
10819 && S_GET_VALUE (sym) <= g_switch_value)))
10820 change = 0;
10821 else
10822 {
10823 const char *segname;
10824
10825 segname = segment_name (S_GET_SEGMENT (sym));
10826 assert (strcmp (segname, ".lit8") != 0
10827 && strcmp (segname, ".lit4") != 0);
10828 change = (strcmp (segname, ".sdata") != 0
fba2b7f9
GK
10829 && strcmp (segname, ".sbss") != 0
10830 && strncmp (segname, ".sdata.", 7) != 0
10831 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
252b5132
RH
10832 }
10833 return change;
10834 }
10835 else
10836 /* We are not optimizing for the GP register. */
10837 return 1;
10838}
10839
10840/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
10841 extended opcode. SEC is the section the frag is in. */
10842
10843static int
10844mips16_extended_frag (fragp, sec, stretch)
10845 fragS *fragp;
10846 asection *sec;
10847 long stretch;
10848{
10849 int type;
10850 register const struct mips16_immed_operand *op;
10851 offsetT val;
10852 int mintiny, maxtiny;
10853 segT symsec;
98aa84af 10854 fragS *sym_frag;
252b5132
RH
10855
10856 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
10857 return 0;
10858 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
10859 return 1;
10860
10861 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
10862 op = mips16_immed_operands;
10863 while (op->type != type)
10864 {
10865 ++op;
10866 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10867 }
10868
10869 if (op->unsp)
10870 {
10871 if (type == '<' || type == '>' || type == '[' || type == ']')
10872 {
10873 mintiny = 1;
10874 maxtiny = 1 << op->nbits;
10875 }
10876 else
10877 {
10878 mintiny = 0;
10879 maxtiny = (1 << op->nbits) - 1;
10880 }
10881 }
10882 else
10883 {
10884 mintiny = - (1 << (op->nbits - 1));
10885 maxtiny = (1 << (op->nbits - 1)) - 1;
10886 }
10887
98aa84af 10888 sym_frag = symbol_get_frag (fragp->fr_symbol);
ac62c346 10889 val = S_GET_VALUE (fragp->fr_symbol);
98aa84af 10890 symsec = S_GET_SEGMENT (fragp->fr_symbol);
252b5132
RH
10891
10892 if (op->pcrel)
10893 {
10894 addressT addr;
10895
10896 /* We won't have the section when we are called from
10897 mips_relax_frag. However, we will always have been called
10898 from md_estimate_size_before_relax first. If this is a
10899 branch to a different section, we mark it as such. If SEC is
10900 NULL, and the frag is not marked, then it must be a branch to
10901 the same section. */
10902 if (sec == NULL)
10903 {
10904 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
10905 return 1;
10906 }
10907 else
10908 {
98aa84af 10909 /* Must have been called from md_estimate_size_before_relax. */
252b5132
RH
10910 if (symsec != sec)
10911 {
10912 fragp->fr_subtype =
10913 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
10914
10915 /* FIXME: We should support this, and let the linker
10916 catch branches and loads that are out of range. */
10917 as_bad_where (fragp->fr_file, fragp->fr_line,
10918 _("unsupported PC relative reference to different section"));
10919
10920 return 1;
10921 }
98aa84af
AM
10922 if (fragp != sym_frag && sym_frag->fr_address == 0)
10923 /* Assume non-extended on the first relaxation pass.
10924 The address we have calculated will be bogus if this is
10925 a forward branch to another frag, as the forward frag
10926 will have fr_address == 0. */
10927 return 0;
252b5132
RH
10928 }
10929
10930 /* In this case, we know for sure that the symbol fragment is in
98aa84af
AM
10931 the same section. If the relax_marker of the symbol fragment
10932 differs from the relax_marker of this fragment, we have not
10933 yet adjusted the symbol fragment fr_address. We want to add
252b5132
RH
10934 in STRETCH in order to get a better estimate of the address.
10935 This particularly matters because of the shift bits. */
10936 if (stretch != 0
98aa84af 10937 && sym_frag->relax_marker != fragp->relax_marker)
252b5132
RH
10938 {
10939 fragS *f;
10940
10941 /* Adjust stretch for any alignment frag. Note that if have
10942 been expanding the earlier code, the symbol may be
10943 defined in what appears to be an earlier frag. FIXME:
10944 This doesn't handle the fr_subtype field, which specifies
10945 a maximum number of bytes to skip when doing an
10946 alignment. */
98aa84af 10947 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
252b5132
RH
10948 {
10949 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
10950 {
10951 if (stretch < 0)
10952 stretch = - ((- stretch)
10953 & ~ ((1 << (int) f->fr_offset) - 1));
10954 else
10955 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
10956 if (stretch == 0)
10957 break;
10958 }
10959 }
10960 if (f != NULL)
10961 val += stretch;
10962 }
10963
10964 addr = fragp->fr_address + fragp->fr_fix;
10965
10966 /* The base address rules are complicated. The base address of
10967 a branch is the following instruction. The base address of a
10968 PC relative load or add is the instruction itself, but if it
10969 is in a delay slot (in which case it can not be extended) use
10970 the address of the instruction whose delay slot it is in. */
10971 if (type == 'p' || type == 'q')
10972 {
10973 addr += 2;
10974
10975 /* If we are currently assuming that this frag should be
10976 extended, then, the current address is two bytes
bdaaa2e1 10977 higher. */
252b5132
RH
10978 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
10979 addr += 2;
10980
10981 /* Ignore the low bit in the target, since it will be set
10982 for a text label. */
10983 if ((val & 1) != 0)
10984 --val;
10985 }
10986 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
10987 addr -= 4;
10988 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
10989 addr -= 2;
10990
10991 val -= addr & ~ ((1 << op->shift) - 1);
10992
10993 /* Branch offsets have an implicit 0 in the lowest bit. */
10994 if (type == 'p' || type == 'q')
10995 val /= 2;
10996
10997 /* If any of the shifted bits are set, we must use an extended
10998 opcode. If the address depends on the size of this
10999 instruction, this can lead to a loop, so we arrange to always
11000 use an extended opcode. We only check this when we are in
11001 the main relaxation loop, when SEC is NULL. */
11002 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
11003 {
11004 fragp->fr_subtype =
11005 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
11006 return 1;
11007 }
11008
11009 /* If we are about to mark a frag as extended because the value
11010 is precisely maxtiny + 1, then there is a chance of an
11011 infinite loop as in the following code:
11012 la $4,foo
11013 .skip 1020
11014 .align 2
11015 foo:
11016 In this case when the la is extended, foo is 0x3fc bytes
11017 away, so the la can be shrunk, but then foo is 0x400 away, so
11018 the la must be extended. To avoid this loop, we mark the
11019 frag as extended if it was small, and is about to become
11020 extended with a value of maxtiny + 1. */
11021 if (val == ((maxtiny + 1) << op->shift)
11022 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
11023 && sec == NULL)
11024 {
11025 fragp->fr_subtype =
11026 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
11027 return 1;
11028 }
11029 }
11030 else if (symsec != absolute_section && sec != NULL)
11031 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
11032
11033 if ((val & ((1 << op->shift) - 1)) != 0
11034 || val < (mintiny << op->shift)
11035 || val > (maxtiny << op->shift))
11036 return 1;
11037 else
11038 return 0;
11039}
11040
11041/* Estimate the size of a frag before relaxing. Unless this is the
11042 mips16, we are not really relaxing here, and the final size is
11043 encoded in the subtype information. For the mips16, we have to
11044 decide whether we are using an extended opcode or not. */
11045
252b5132
RH
11046int
11047md_estimate_size_before_relax (fragp, segtype)
11048 fragS *fragp;
11049 asection *segtype;
11050{
43841e91 11051 int change = 0;
8614eeee 11052 boolean linkonce = false;
252b5132
RH
11053
11054 if (RELAX_MIPS16_P (fragp->fr_subtype))
11055 {
11056 if (mips16_extended_frag (fragp, segtype, 0))
11057 {
11058 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
11059 return 4;
11060 }
11061 else
11062 {
11063 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
11064 return 2;
11065 }
11066 }
11067
11068 if (mips_pic == NO_PIC)
11069 {
11070 change = nopic_need_relax (fragp->fr_symbol, 0);
11071 }
11072 else if (mips_pic == SVR4_PIC)
11073 {
11074 symbolS *sym;
11075 asection *symsec;
11076
11077 sym = fragp->fr_symbol;
11078
11079 /* Handle the case of a symbol equated to another symbol. */
49309057 11080 while (symbol_equated_p (sym)
252b5132
RH
11081 && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
11082 {
11083 symbolS *n;
11084
11085 /* It's possible to get a loop here in a badly written
11086 program. */
49309057 11087 n = symbol_get_value_expression (sym)->X_add_symbol;
252b5132
RH
11088 if (n == sym)
11089 break;
11090 sym = n;
11091 }
11092
11093 symsec = S_GET_SEGMENT (sym);
11094
8614eeee
UC
11095 /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
11096 if (symsec != segtype && ! S_IS_LOCAL (sym))
beae10d5
KH
11097 {
11098 if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
11099 != 0)
11100 linkonce = true;
11101
11102 /* The GNU toolchain uses an extension for ELF: a section
11103 beginning with the magic string .gnu.linkonce is a linkonce
11104 section. */
11105 if (strncmp (segment_name (symsec), ".gnu.linkonce",
11106 sizeof ".gnu.linkonce" - 1) == 0)
11107 linkonce = true;
11108 }
8614eeee 11109
252b5132
RH
11110 /* This must duplicate the test in adjust_reloc_syms. */
11111 change = (symsec != &bfd_und_section
11112 && symsec != &bfd_abs_section
426b0403 11113 && ! bfd_is_com_section (symsec)
8614eeee 11114 && !linkonce
426b0403 11115#ifdef OBJ_ELF
ea4ff978 11116 /* A global or weak symbol is treated as external. */
46bac6de
L
11117 && (OUTPUT_FLAVOR == bfd_target_elf_flavour
11118 && ! (S_IS_EXTERN (sym) || S_IS_WEAK (sym)))
426b0403
AM
11119#endif
11120 );
252b5132
RH
11121 }
11122 else
11123 abort ();
11124
11125 if (change)
11126 {
11127 /* Record the offset to the first reloc in the fr_opcode field.
11128 This lets md_convert_frag and tc_gen_reloc know that the code
11129 must be expanded. */
11130 fragp->fr_opcode = (fragp->fr_literal
11131 + fragp->fr_fix
11132 - RELAX_OLD (fragp->fr_subtype)
11133 + RELAX_RELOC1 (fragp->fr_subtype));
11134 /* FIXME: This really needs as_warn_where. */
11135 if (RELAX_WARN (fragp->fr_subtype))
9a41af64
TS
11136 as_warn (_("AT used after \".set noat\" or macro used after "
11137 "\".set nomacro\""));
11138
11139 return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
252b5132
RH
11140 }
11141
9a41af64 11142 return 0;
252b5132
RH
11143}
11144
11145/* This is called to see whether a reloc against a defined symbol
11146 should be converted into a reloc against a section. Don't adjust
11147 MIPS16 jump relocations, so we don't have to worry about the format
11148 of the offset in the .o file. Don't adjust relocations against
11149 mips16 symbols, so that the linker can find them if it needs to set
11150 up a stub. */
11151
11152int
11153mips_fix_adjustable (fixp)
11154 fixS *fixp;
11155{
ea4ff978
L
11156#ifdef OBJ_ELF
11157 /* Prevent all adjustments to global symbols. */
46bac6de
L
11158 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11159 && (S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
ea4ff978
L
11160 return 0;
11161#endif
252b5132
RH
11162 if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
11163 return 0;
11164 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11165 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11166 return 0;
11167 if (fixp->fx_addsy == NULL)
11168 return 1;
11169#ifdef OBJ_ELF
11170 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11171 && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
11172 && fixp->fx_subsy == NULL)
11173 return 0;
11174#endif
11175 return 1;
11176}
11177
11178/* Translate internal representation of relocation info to BFD target
11179 format. */
11180
11181arelent **
11182tc_gen_reloc (section, fixp)
43841e91 11183 asection *section ATTRIBUTE_UNUSED;
252b5132
RH
11184 fixS *fixp;
11185{
11186 static arelent *retval[4];
11187 arelent *reloc;
11188 bfd_reloc_code_real_type code;
11189
11190 reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
11191 retval[1] = NULL;
11192
49309057
ILT
11193 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
11194 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
11195 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11196
11197 if (mips_pic == EMBEDDED_PIC
11198 && SWITCH_TABLE (fixp))
11199 {
11200 /* For a switch table entry we use a special reloc. The addend
11201 is actually the difference between the reloc address and the
11202 subtrahend. */
11203 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
11204 if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
11205 as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
11206 fixp->fx_r_type = BFD_RELOC_GPREL32;
11207 }
bb2d6cd7
GK
11208 else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11209 reloc->addend = fixp->fx_addnumber;
252b5132
RH
11210 else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
11211 {
11212 /* We use a special addend for an internal RELLO reloc. */
49309057 11213 if (symbol_section_p (fixp->fx_addsy))
252b5132
RH
11214 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
11215 else
11216 reloc->addend = fixp->fx_addnumber + reloc->address;
11217 }
11218 else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
11219 {
11220 assert (fixp->fx_next != NULL
11221 && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
11222 /* We use a special addend for an internal RELHI reloc. The
11223 reloc is relative to the RELLO; adjust the addend
11224 accordingly. */
49309057 11225 if (symbol_section_p (fixp->fx_addsy))
252b5132
RH
11226 reloc->addend = (fixp->fx_next->fx_frag->fr_address
11227 + fixp->fx_next->fx_where
11228 - S_GET_VALUE (fixp->fx_subsy));
11229 else
11230 reloc->addend = (fixp->fx_addnumber
11231 + fixp->fx_next->fx_frag->fr_address
11232 + fixp->fx_next->fx_where);
11233 }
252b5132
RH
11234 else
11235 {
11236 if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
11237 /* A gruesome hack which is a result of the gruesome gas reloc
11238 handling. */
11239 reloc->addend = reloc->address;
11240 else
11241 reloc->addend = -reloc->address;
11242 }
11243
11244 /* If this is a variant frag, we may need to adjust the existing
11245 reloc and generate a new one. */
11246 if (fixp->fx_frag->fr_opcode != NULL
11247 && (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
11248 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11249 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
11250 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
11251 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
11252 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
11253 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16))
11254 {
11255 arelent *reloc2;
11256
11257 assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
11258
11259 /* If this is not the last reloc in this frag, then we have two
11260 GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
11261 CALL_HI16/CALL_LO16, both of which are being replaced. Let
11262 the second one handle all of them. */
11263 if (fixp->fx_next != NULL
11264 && fixp->fx_frag == fixp->fx_next->fx_frag)
11265 {
11266 assert ((fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
11267 && fixp->fx_next->fx_r_type == BFD_RELOC_MIPS_GPREL)
11268 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
11269 && (fixp->fx_next->fx_r_type
11270 == BFD_RELOC_MIPS_GOT_LO16))
11271 || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
11272 && (fixp->fx_next->fx_r_type
11273 == BFD_RELOC_MIPS_CALL_LO16)));
11274 retval[0] = NULL;
11275 return retval;
11276 }
11277
11278 fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
11279 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11280 reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
11281 retval[2] = NULL;
49309057
ILT
11282 reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
11283 *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
11284 reloc2->address = (reloc->address
11285 + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
11286 - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
11287 reloc2->addend = fixp->fx_addnumber;
11288 reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
11289 assert (reloc2->howto != NULL);
11290
11291 if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
11292 {
11293 arelent *reloc3;
11294
11295 reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
11296 retval[3] = NULL;
11297 *reloc3 = *reloc2;
11298 reloc3->address += 4;
11299 }
11300
11301 if (mips_pic == NO_PIC)
11302 {
11303 assert (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL);
11304 fixp->fx_r_type = BFD_RELOC_HI16_S;
11305 }
11306 else if (mips_pic == SVR4_PIC)
11307 {
11308 switch (fixp->fx_r_type)
11309 {
11310 default:
11311 abort ();
11312 case BFD_RELOC_MIPS_GOT16:
11313 break;
11314 case BFD_RELOC_MIPS_CALL16:
11315 case BFD_RELOC_MIPS_GOT_LO16:
11316 case BFD_RELOC_MIPS_CALL_LO16:
11317 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
11318 break;
11319 }
11320 }
11321 else
11322 abort ();
11323 }
11324
11325 /* Since MIPS ELF uses Rel instead of Rela, encode the vtable entry
11326 to be used in the relocation's section offset. */
11327 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11328 {
11329 reloc->address = reloc->addend;
11330 reloc->addend = 0;
11331 }
11332
11333 /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
11334 fixup_segment converted a non-PC relative reloc into a PC
11335 relative reloc. In such a case, we need to convert the reloc
11336 code. */
11337 code = fixp->fx_r_type;
11338 if (fixp->fx_pcrel)
11339 {
11340 switch (code)
11341 {
11342 case BFD_RELOC_8:
11343 code = BFD_RELOC_8_PCREL;
11344 break;
11345 case BFD_RELOC_16:
11346 code = BFD_RELOC_16_PCREL;
11347 break;
11348 case BFD_RELOC_32:
11349 code = BFD_RELOC_32_PCREL;
11350 break;
11351 case BFD_RELOC_64:
11352 code = BFD_RELOC_64_PCREL;
11353 break;
11354 case BFD_RELOC_8_PCREL:
11355 case BFD_RELOC_16_PCREL:
11356 case BFD_RELOC_32_PCREL:
11357 case BFD_RELOC_64_PCREL:
11358 case BFD_RELOC_16_PCREL_S2:
11359 case BFD_RELOC_PCREL_HI16_S:
11360 case BFD_RELOC_PCREL_LO16:
11361 break;
11362 default:
11363 as_bad_where (fixp->fx_file, fixp->fx_line,
11364 _("Cannot make %s relocation PC relative"),
11365 bfd_get_reloc_code_name (code));
11366 }
11367 }
11368
11369 /* To support a PC relative reloc when generating embedded PIC code
11370 for ECOFF, we use a Cygnus extension. We check for that here to
11371 make sure that we don't let such a reloc escape normally. */
bb2d6cd7
GK
11372 if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11373 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
252b5132
RH
11374 && code == BFD_RELOC_16_PCREL_S2
11375 && mips_pic != EMBEDDED_PIC)
11376 reloc->howto = NULL;
11377 else
11378 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
11379
11380 if (reloc->howto == NULL)
11381 {
11382 as_bad_where (fixp->fx_file, fixp->fx_line,
11383 _("Can not represent %s relocation in this object file format"),
11384 bfd_get_reloc_code_name (code));
11385 retval[0] = NULL;
11386 }
11387
11388 return retval;
11389}
11390
11391/* Relax a machine dependent frag. This returns the amount by which
11392 the current size of the frag should change. */
11393
11394int
11395mips_relax_frag (fragp, stretch)
11396 fragS *fragp;
11397 long stretch;
11398{
11399 if (! RELAX_MIPS16_P (fragp->fr_subtype))
11400 return 0;
11401
11402 if (mips16_extended_frag (fragp, (asection *) NULL, stretch))
11403 {
11404 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
11405 return 0;
11406 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
11407 return 2;
11408 }
11409 else
11410 {
11411 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
11412 return 0;
11413 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
11414 return -2;
11415 }
11416
11417 return 0;
11418}
11419
11420/* Convert a machine dependent frag. */
11421
11422void
11423md_convert_frag (abfd, asec, fragp)
43841e91 11424 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
11425 segT asec;
11426 fragS *fragp;
11427{
11428 int old, new;
11429 char *fixptr;
11430
11431 if (RELAX_MIPS16_P (fragp->fr_subtype))
11432 {
11433 int type;
11434 register const struct mips16_immed_operand *op;
11435 boolean small, ext;
11436 offsetT val;
11437 bfd_byte *buf;
11438 unsigned long insn;
11439 boolean use_extend;
11440 unsigned short extend;
11441
11442 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
11443 op = mips16_immed_operands;
11444 while (op->type != type)
11445 ++op;
11446
11447 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
11448 {
11449 small = false;
11450 ext = true;
11451 }
11452 else
11453 {
11454 small = true;
11455 ext = false;
11456 }
11457
6386f3a7 11458 resolve_symbol_value (fragp->fr_symbol);
252b5132
RH
11459 val = S_GET_VALUE (fragp->fr_symbol);
11460 if (op->pcrel)
11461 {
11462 addressT addr;
11463
11464 addr = fragp->fr_address + fragp->fr_fix;
11465
11466 /* The rules for the base address of a PC relative reloc are
11467 complicated; see mips16_extended_frag. */
11468 if (type == 'p' || type == 'q')
11469 {
11470 addr += 2;
11471 if (ext)
11472 addr += 2;
11473 /* Ignore the low bit in the target, since it will be
11474 set for a text label. */
11475 if ((val & 1) != 0)
11476 --val;
11477 }
11478 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
11479 addr -= 4;
11480 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
11481 addr -= 2;
11482
11483 addr &= ~ (addressT) ((1 << op->shift) - 1);
11484 val -= addr;
11485
11486 /* Make sure the section winds up with the alignment we have
11487 assumed. */
11488 if (op->shift > 0)
11489 record_alignment (asec, op->shift);
11490 }
11491
11492 if (ext
11493 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
11494 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
11495 as_warn_where (fragp->fr_file, fragp->fr_line,
11496 _("extended instruction in delay slot"));
11497
11498 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
11499
11500 if (target_big_endian)
11501 insn = bfd_getb16 (buf);
11502 else
11503 insn = bfd_getl16 (buf);
11504
11505 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
11506 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
11507 small, ext, &insn, &use_extend, &extend);
11508
11509 if (use_extend)
11510 {
11511 md_number_to_chars (buf, 0xf000 | extend, 2);
11512 fragp->fr_fix += 2;
11513 buf += 2;
11514 }
11515
11516 md_number_to_chars (buf, insn, 2);
11517 fragp->fr_fix += 2;
11518 buf += 2;
11519 }
11520 else
11521 {
11522 if (fragp->fr_opcode == NULL)
11523 return;
11524
11525 old = RELAX_OLD (fragp->fr_subtype);
11526 new = RELAX_NEW (fragp->fr_subtype);
11527 fixptr = fragp->fr_literal + fragp->fr_fix;
11528
11529 if (new > 0)
11530 memcpy (fixptr - old, fixptr, new);
11531
11532 fragp->fr_fix += new - old;
11533 }
11534}
11535
11536#ifdef OBJ_ELF
11537
11538/* This function is called after the relocs have been generated.
11539 We've been storing mips16 text labels as odd. Here we convert them
11540 back to even for the convenience of the debugger. */
11541
11542void
11543mips_frob_file_after_relocs ()
11544{
11545 asymbol **syms;
11546 unsigned int count, i;
11547
11548 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11549 return;
11550
11551 syms = bfd_get_outsymbols (stdoutput);
11552 count = bfd_get_symcount (stdoutput);
11553 for (i = 0; i < count; i++, syms++)
11554 {
11555 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
11556 && ((*syms)->value & 1) != 0)
11557 {
11558 (*syms)->value &= ~1;
11559 /* If the symbol has an odd size, it was probably computed
11560 incorrectly, so adjust that as well. */
11561 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
11562 ++elf_symbol (*syms)->internal_elf_sym.st_size;
11563 }
11564 }
11565}
11566
11567#endif
11568
11569/* This function is called whenever a label is defined. It is used
11570 when handling branch delays; if a branch has a label, we assume we
11571 can not move it. */
11572
11573void
11574mips_define_label (sym)
11575 symbolS *sym;
11576{
11577 struct insn_label_list *l;
11578
11579 if (free_insn_labels == NULL)
11580 l = (struct insn_label_list *) xmalloc (sizeof *l);
11581 else
11582 {
11583 l = free_insn_labels;
11584 free_insn_labels = l->next;
11585 }
11586
11587 l->label = sym;
11588 l->next = insn_labels;
11589 insn_labels = l;
11590}
11591\f
11592#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11593
11594/* Some special processing for a MIPS ELF file. */
11595
11596void
11597mips_elf_final_processing ()
11598{
11599 /* Write out the register information. */
11600 if (! mips_64)
11601 {
11602 Elf32_RegInfo s;
11603
11604 s.ri_gprmask = mips_gprmask;
11605 s.ri_cprmask[0] = mips_cprmask[0];
11606 s.ri_cprmask[1] = mips_cprmask[1];
11607 s.ri_cprmask[2] = mips_cprmask[2];
11608 s.ri_cprmask[3] = mips_cprmask[3];
11609 /* The gp_value field is set by the MIPS ELF backend. */
11610
11611 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
11612 ((Elf32_External_RegInfo *)
11613 mips_regmask_frag));
11614 }
11615 else
11616 {
11617 Elf64_Internal_RegInfo s;
11618
11619 s.ri_gprmask = mips_gprmask;
11620 s.ri_pad = 0;
11621 s.ri_cprmask[0] = mips_cprmask[0];
11622 s.ri_cprmask[1] = mips_cprmask[1];
11623 s.ri_cprmask[2] = mips_cprmask[2];
11624 s.ri_cprmask[3] = mips_cprmask[3];
11625 /* The gp_value field is set by the MIPS ELF backend. */
11626
11627 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
11628 ((Elf64_External_RegInfo *)
11629 mips_regmask_frag));
11630 }
11631
11632 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
11633 sort of BFD interface for this. */
11634 if (mips_any_noreorder)
11635 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
11636 if (mips_pic != NO_PIC)
11637 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
11638
bdaaa2e1 11639 /* Set the MIPS ELF ABI flags. */
9a41af64 11640 if (mips_abi_string == NULL)
252b5132 11641 ;
beae10d5 11642 else if (strcmp (mips_abi_string, "32") == 0)
252b5132 11643 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
beae10d5 11644 else if (strcmp (mips_abi_string, "o64") == 0)
252b5132 11645 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
beae10d5 11646 else if (strcmp (mips_abi_string, "eabi") == 0)
252b5132
RH
11647 {
11648 if (mips_eabi64)
11649 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
11650 else
11651 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
11652 }
be00bddd
TS
11653 else if (strcmp (mips_abi_string, "n32") == 0)
11654 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
11655
11656 /* Nothing to do for "64". */
252b5132
RH
11657
11658 if (mips_32bitmode)
11659 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
11660}
11661
11662#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
11663\f
beae10d5
KH
11664typedef struct proc {
11665 symbolS *isym;
11666 unsigned long reg_mask;
11667 unsigned long reg_offset;
11668 unsigned long fpreg_mask;
11669 unsigned long fpreg_offset;
11670 unsigned long frame_offset;
11671 unsigned long frame_reg;
11672 unsigned long pc_reg;
11673} procS;
252b5132
RH
11674
11675static procS cur_proc;
11676static procS *cur_proc_ptr;
11677static int numprocs;
11678
0a9ef439 11679/* Fill in an rs_align_code fragment. */
a19d8eb0 11680
0a9ef439
RH
11681void
11682mips_handle_align (fragp)
11683 fragS *fragp;
a19d8eb0 11684{
0a9ef439
RH
11685 if (fragp->fr_type != rs_align_code)
11686 return;
11687
11688 if (mips_opts.mips16)
a19d8eb0
CP
11689 {
11690 static const unsigned char be_nop[] = { 0x65, 0x00 };
11691 static const unsigned char le_nop[] = { 0x00, 0x65 };
11692
0a9ef439
RH
11693 int bytes;
11694 char *p;
a19d8eb0 11695
0a9ef439
RH
11696 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
11697 p = fragp->fr_literal + fragp->fr_fix;
11698
11699 if (bytes & 1)
11700 {
11701 *p++ = 0;
11702 fragp->fr_fix += 1;
11703 }
11704
11705 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
11706 fragp->fr_var = 2;
a19d8eb0
CP
11707 }
11708
0a9ef439 11709 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
a19d8eb0
CP
11710}
11711
252b5132
RH
11712static void
11713md_obj_begin ()
11714{
11715}
11716
11717static void
11718md_obj_end ()
11719{
11720 /* check for premature end, nesting errors, etc */
11721 if (cur_proc_ptr)
9a41af64 11722 as_warn (_("missing .end at end of assembly"));
252b5132
RH
11723}
11724
11725static long
11726get_number ()
11727{
11728 int negative = 0;
11729 long val = 0;
11730
11731 if (*input_line_pointer == '-')
11732 {
11733 ++input_line_pointer;
11734 negative = 1;
11735 }
d9a62219 11736 if (!isdigit ((unsigned char) *input_line_pointer))
252b5132
RH
11737 as_bad (_("Expected simple number."));
11738 if (input_line_pointer[0] == '0')
11739 {
11740 if (input_line_pointer[1] == 'x')
11741 {
11742 input_line_pointer += 2;
d9a62219 11743 while (isxdigit ((unsigned char) *input_line_pointer))
252b5132
RH
11744 {
11745 val <<= 4;
11746 val |= hex_value (*input_line_pointer++);
11747 }
11748 return negative ? -val : val;
11749 }
11750 else
11751 {
11752 ++input_line_pointer;
d9a62219 11753 while (isdigit ((unsigned char) *input_line_pointer))
252b5132
RH
11754 {
11755 val <<= 3;
11756 val |= *input_line_pointer++ - '0';
11757 }
11758 return negative ? -val : val;
11759 }
11760 }
d9a62219 11761 if (!isdigit ((unsigned char) *input_line_pointer))
252b5132
RH
11762 {
11763 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
11764 *input_line_pointer, *input_line_pointer);
11765 as_warn (_("Invalid number"));
11766 return -1;
11767 }
d9a62219 11768 while (isdigit ((unsigned char) *input_line_pointer))
252b5132
RH
11769 {
11770 val *= 10;
11771 val += *input_line_pointer++ - '0';
11772 }
11773 return negative ? -val : val;
11774}
11775
11776/* The .file directive; just like the usual .file directive, but there
11777 is an initial number which is the ECOFF file index. */
11778
11779static void
11780s_file (x)
43841e91 11781 int x ATTRIBUTE_UNUSED;
252b5132
RH
11782{
11783 int line;
11784
11785 line = get_number ();
11786 s_app_file (0);
11787}
11788
252b5132
RH
11789/* The .end directive. */
11790
11791static void
11792s_mips_end (x)
43841e91 11793 int x ATTRIBUTE_UNUSED;
252b5132
RH
11794{
11795 symbolS *p;
11796 int maybe_text;
11797
11798 if (!is_end_of_line[(unsigned char) *input_line_pointer])
11799 {
11800 p = get_symbol ();
11801 demand_empty_rest_of_line ();
11802 }
11803 else
11804 p = NULL;
11805
11806#ifdef BFD_ASSEMBLER
11807 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
11808 maybe_text = 1;
11809 else
11810 maybe_text = 0;
11811#else
11812 if (now_seg != data_section && now_seg != bss_section)
11813 maybe_text = 1;
11814 else
11815 maybe_text = 0;
11816#endif
11817
11818 if (!maybe_text)
11819 as_warn (_(".end not in text section"));
11820
11821 if (!cur_proc_ptr)
11822 {
11823 as_warn (_(".end directive without a preceding .ent directive."));
11824 demand_empty_rest_of_line ();
11825 return;
11826 }
11827
11828 if (p != NULL)
11829 {
11830 assert (S_GET_NAME (p));
11831 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
11832 as_warn (_(".end symbol does not match .ent symbol."));
11833 }
11834 else
11835 as_warn (_(".end directive missing or unknown symbol"));
11836
11837#ifdef MIPS_STABS_ELF
11838 {
11839 segT saved_seg = now_seg;
11840 subsegT saved_subseg = now_subseg;
252b5132 11841 valueT dot;
252b5132
RH
11842 expressionS exp;
11843 char *fragp;
11844
11845 dot = frag_now_fix ();
11846
11847#ifdef md_flush_pending_output
11848 md_flush_pending_output ();
11849#endif
11850
11851 assert (pdr_seg);
11852 subseg_set (pdr_seg, 0);
11853
beae10d5 11854 /* Write the symbol. */
252b5132
RH
11855 exp.X_op = O_symbol;
11856 exp.X_add_symbol = p;
11857 exp.X_add_number = 0;
11858 emit_expr (&exp, 4);
11859
beae10d5 11860 fragp = frag_more (7 * 4);
252b5132 11861
beae10d5
KH
11862 md_number_to_chars (fragp, (valueT) cur_proc_ptr->reg_mask, 4);
11863 md_number_to_chars (fragp + 4, (valueT) cur_proc_ptr->reg_offset, 4);
11864 md_number_to_chars (fragp + 8, (valueT) cur_proc_ptr->fpreg_mask, 4);
11865 md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
11866 md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
11867 md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
11868 md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
252b5132
RH
11869
11870 subseg_set (saved_seg, saved_subseg);
11871 }
11872#endif
11873
11874 cur_proc_ptr = NULL;
11875}
11876
11877/* The .aent and .ent directives. */
11878
11879static void
11880s_mips_ent (aent)
11881 int aent;
11882{
11883 int number = 0;
11884 symbolS *symbolP;
11885 int maybe_text;
11886
11887 symbolP = get_symbol ();
11888 if (*input_line_pointer == ',')
11889 input_line_pointer++;
11890 SKIP_WHITESPACE ();
d9a62219
DE
11891 if (isdigit ((unsigned char) *input_line_pointer)
11892 || *input_line_pointer == '-')
252b5132
RH
11893 number = get_number ();
11894
11895#ifdef BFD_ASSEMBLER
11896 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
11897 maybe_text = 1;
11898 else
11899 maybe_text = 0;
11900#else
11901 if (now_seg != data_section && now_seg != bss_section)
11902 maybe_text = 1;
11903 else
11904 maybe_text = 0;
11905#endif
11906
11907 if (!maybe_text)
11908 as_warn (_(".ent or .aent not in text section."));
11909
11910 if (!aent && cur_proc_ptr)
9a41af64 11911 as_warn (_("missing .end"));
252b5132
RH
11912
11913 if (!aent)
11914 {
11915 cur_proc_ptr = &cur_proc;
11916 memset (cur_proc_ptr, '\0', sizeof (procS));
11917
11918 cur_proc_ptr->isym = symbolP;
11919
49309057 11920 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
252b5132
RH
11921
11922 numprocs++;
11923 }
11924
11925 demand_empty_rest_of_line ();
11926}
11927
11928/* The .frame directive. If the mdebug section is present (IRIX 5 native)
bdaaa2e1 11929 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
252b5132 11930 s_mips_frame is used so that we can set the PDR information correctly.
bdaaa2e1 11931 We can't use the ecoff routines because they make reference to the ecoff
252b5132
RH
11932 symbol table (in the mdebug section). */
11933
11934static void
11935s_mips_frame (ignore)
2b3c5a5d 11936 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
11937{
11938#ifdef MIPS_STABS_ELF
11939
11940 long val;
11941
beae10d5 11942 if (cur_proc_ptr == (procS *) NULL)
252b5132
RH
11943 {
11944 as_warn (_(".frame outside of .ent"));
11945 demand_empty_rest_of_line ();
11946 return;
11947 }
11948
11949 cur_proc_ptr->frame_reg = tc_get_register (1);
11950
11951 SKIP_WHITESPACE ();
11952 if (*input_line_pointer++ != ','
11953 || get_absolute_expression_and_terminator (&val) != ',')
11954 {
11955 as_warn (_("Bad .frame directive"));
11956 --input_line_pointer;
11957 demand_empty_rest_of_line ();
11958 return;
11959 }
11960
11961 cur_proc_ptr->frame_offset = val;
11962 cur_proc_ptr->pc_reg = tc_get_register (0);
11963
11964 demand_empty_rest_of_line ();
11965#else
11966 s_ignore (ignore);
11967#endif /* MIPS_STABS_ELF */
11968}
11969
bdaaa2e1
KH
11970/* The .fmask and .mask directives. If the mdebug section is present
11971 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
252b5132 11972 embedded targets, s_mips_mask is used so that we can set the PDR
bdaaa2e1 11973 information correctly. We can't use the ecoff routines because they
252b5132
RH
11974 make reference to the ecoff symbol table (in the mdebug section). */
11975
11976static void
11977s_mips_mask (reg_type)
11978 char reg_type;
11979{
11980#ifdef MIPS_STABS_ELF
11981 long mask, off;
bdaaa2e1 11982
252b5132
RH
11983 if (cur_proc_ptr == (procS *) NULL)
11984 {
11985 as_warn (_(".mask/.fmask outside of .ent"));
11986 demand_empty_rest_of_line ();
11987 return;
11988 }
11989
11990 if (get_absolute_expression_and_terminator (&mask) != ',')
11991 {
11992 as_warn (_("Bad .mask/.fmask directive"));
11993 --input_line_pointer;
11994 demand_empty_rest_of_line ();
11995 return;
11996 }
11997
11998 off = get_absolute_expression ();
11999
12000 if (reg_type == 'F')
12001 {
12002 cur_proc_ptr->fpreg_mask = mask;
12003 cur_proc_ptr->fpreg_offset = off;
12004 }
12005 else
12006 {
12007 cur_proc_ptr->reg_mask = mask;
12008 cur_proc_ptr->reg_offset = off;
12009 }
12010
12011 demand_empty_rest_of_line ();
12012#else
12013 s_ignore (reg_type);
12014#endif /* MIPS_STABS_ELF */
12015}
12016
12017/* The .loc directive. */
12018
12019#if 0
12020static void
12021s_loc (x)
12022 int x;
12023{
12024 symbolS *symbolP;
12025 int lineno;
12026 int addroff;
12027
12028 assert (now_seg == text_section);
12029
12030 lineno = get_number ();
12031 addroff = frag_now_fix ();
12032
12033 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
12034 S_SET_TYPE (symbolP, N_SLINE);
12035 S_SET_OTHER (symbolP, 0);
12036 S_SET_DESC (symbolP, lineno);
12037 symbolP->sy_segment = now_seg;
12038}
12039#endif
e7af610e
NC
12040
12041/* CPU name/ISA/number mapping table.
12042
12043 Entries are grouped by type. The first matching CPU or ISA entry
12044 gets chosen by CPU or ISA, so it should be the 'canonical' name
12045 for that type. Entries after that within the type are sorted
12046 alphabetically.
12047
12048 Case is ignored in comparison, so put the canonical entry in the
12049 appropriate case but everything else in lower case to ease eye pain. */
e972090a
NC
12050static const struct mips_cpu_info mips_cpu_info_table[] =
12051{
e7af610e
NC
12052 /* MIPS1 ISA */
12053 { "MIPS1", 1, ISA_MIPS1, CPU_R3000, },
12054 { "mips", 1, ISA_MIPS1, CPU_R3000, },
12055
12056 /* MIPS2 ISA */
12057 { "MIPS2", 1, ISA_MIPS2, CPU_R6000, },
12058
12059 /* MIPS3 ISA */
12060 { "MIPS3", 1, ISA_MIPS3, CPU_R4000, },
12061
12062 /* MIPS4 ISA */
12063 { "MIPS4", 1, ISA_MIPS4, CPU_R8000, },
12064
84ea6cf2
NC
12065 /* MIPS5 ISA */
12066 { "MIPS5", 1, ISA_MIPS5, CPU_MIPS5, },
12067 { "Generic-MIPS5", 0, ISA_MIPS5, CPU_MIPS5, },
12068
e7af610e
NC
12069 /* MIPS32 ISA */
12070 { "MIPS32", 1, ISA_MIPS32, CPU_MIPS32, },
12071 { "Generic-MIPS32", 0, ISA_MIPS32, CPU_MIPS32, },
12072
84ea6cf2 12073#if 1
e7af610e
NC
12074 /* XXX for now, MIPS64 -> MIPS3 because of history */
12075 { "MIPS64", 1, ISA_MIPS3, CPU_R4000 }, /* XXX! */
84ea6cf2
NC
12076#else
12077 /* MIPS64 ISA */
12078 { "MIPS64", 1, ISA_MIPS64, CPU_MIPS64 },
12079#endif
12080 { "mips64isa", 1, ISA_MIPS64, CPU_MIPS64 },
12081 { "Generic-MIPS64", 0, ISA_MIPS64, CPU_MIPS64, },
e7af610e
NC
12082
12083 /* R2000 CPU */
12084 { "R2000", 0, ISA_MIPS1, CPU_R2000, },
12085 { "2000", 0, ISA_MIPS1, CPU_R2000, },
12086 { "2k", 0, ISA_MIPS1, CPU_R2000, },
12087 { "r2k", 0, ISA_MIPS1, CPU_R2000, },
12088
12089 /* R3000 CPU */
12090 { "R3000", 0, ISA_MIPS1, CPU_R3000, },
12091 { "3000", 0, ISA_MIPS1, CPU_R3000, },
12092 { "3k", 0, ISA_MIPS1, CPU_R3000, },
12093 { "r3k", 0, ISA_MIPS1, CPU_R3000, },
12094
12095 /* TX3900 CPU */
12096 { "R3900", 0, ISA_MIPS1, CPU_R3900, },
12097 { "3900", 0, ISA_MIPS1, CPU_R3900, },
e972090a 12098 { "mipstx39", 0, ISA_MIPS1, CPU_R3900, },
e7af610e
NC
12099
12100 /* R4000 CPU */
12101 { "R4000", 0, ISA_MIPS3, CPU_R4000, },
12102 { "4000", 0, ISA_MIPS3, CPU_R4000, },
12103 { "4k", 0, ISA_MIPS3, CPU_R4000, }, /* beware */
12104 { "r4k", 0, ISA_MIPS3, CPU_R4000, },
12105
12106 /* R4010 CPU */
12107 { "R4010", 0, ISA_MIPS2, CPU_R4010, },
12108 { "4010", 0, ISA_MIPS2, CPU_R4010, },
12109
12110 /* R4400 CPU */
12111 { "R4400", 0, ISA_MIPS3, CPU_R4400, },
12112 { "4400", 0, ISA_MIPS3, CPU_R4400, },
12113
12114 /* R4600 CPU */
12115 { "R4600", 0, ISA_MIPS3, CPU_R4600, },
12116 { "4600", 0, ISA_MIPS3, CPU_R4600, },
12117 { "mips64orion", 0, ISA_MIPS3, CPU_R4600, },
12118 { "orion", 0, ISA_MIPS3, CPU_R4600, },
12119
12120 /* R4650 CPU */
12121 { "R4650", 0, ISA_MIPS3, CPU_R4650, },
12122 { "4650", 0, ISA_MIPS3, CPU_R4650, },
12123
12124 /* R6000 CPU */
12125 { "R6000", 0, ISA_MIPS2, CPU_R6000, },
12126 { "6000", 0, ISA_MIPS2, CPU_R6000, },
12127 { "6k", 0, ISA_MIPS2, CPU_R6000, },
12128 { "r6k", 0, ISA_MIPS2, CPU_R6000, },
12129
12130 /* R8000 CPU */
12131 { "R8000", 0, ISA_MIPS4, CPU_R8000, },
12132 { "8000", 0, ISA_MIPS4, CPU_R8000, },
12133 { "8k", 0, ISA_MIPS4, CPU_R8000, },
12134 { "r8k", 0, ISA_MIPS4, CPU_R8000, },
12135
12136 /* R10000 CPU */
12137 { "R10000", 0, ISA_MIPS4, CPU_R10000, },
12138 { "10000", 0, ISA_MIPS4, CPU_R10000, },
12139 { "10k", 0, ISA_MIPS4, CPU_R10000, },
12140 { "r10k", 0, ISA_MIPS4, CPU_R10000, },
12141
d1cf510e
NC
12142 /* R12000 CPU */
12143 { "R12000", 0, ISA_MIPS4, CPU_R12000, },
12144 { "12000", 0, ISA_MIPS4, CPU_R12000, },
12145 { "12k", 0, ISA_MIPS4, CPU_R12000, },
12146 { "r12k", 0, ISA_MIPS4, CPU_R12000, },
12147
e7af610e
NC
12148 /* VR4100 CPU */
12149 { "VR4100", 0, ISA_MIPS3, CPU_VR4100, },
12150 { "4100", 0, ISA_MIPS3, CPU_VR4100, },
12151 { "mips64vr4100", 0, ISA_MIPS3, CPU_VR4100, },
12152 { "r4100", 0, ISA_MIPS3, CPU_VR4100, },
12153
12154 /* VR4111 CPU */
12155 { "VR4111", 0, ISA_MIPS3, CPU_R4111, },
12156 { "4111", 0, ISA_MIPS3, CPU_R4111, },
12157 { "mips64vr4111", 0, ISA_MIPS3, CPU_R4111, },
12158 { "r4111", 0, ISA_MIPS3, CPU_R4111, },
12159
12160 /* VR4300 CPU */
12161 { "VR4300", 0, ISA_MIPS3, CPU_R4300, },
12162 { "4300", 0, ISA_MIPS3, CPU_R4300, },
12163 { "mips64vr4300", 0, ISA_MIPS3, CPU_R4300, },
12164 { "r4300", 0, ISA_MIPS3, CPU_R4300, },
12165
12166 /* VR5000 CPU */
12167 { "VR5000", 0, ISA_MIPS4, CPU_R5000, },
12168 { "5000", 0, ISA_MIPS4, CPU_R5000, },
12169 { "5k", 0, ISA_MIPS4, CPU_R5000, },
12170 { "mips64vr5000", 0, ISA_MIPS4, CPU_R5000, },
12171 { "r5000", 0, ISA_MIPS4, CPU_R5000, },
12172 { "r5200", 0, ISA_MIPS4, CPU_R5000, },
18ae5d72 12173 { "rm5200", 0, ISA_MIPS4, CPU_R5000, },
e7af610e 12174 { "r5230", 0, ISA_MIPS4, CPU_R5000, },
18ae5d72 12175 { "rm5230", 0, ISA_MIPS4, CPU_R5000, },
e7af610e 12176 { "r5231", 0, ISA_MIPS4, CPU_R5000, },
18ae5d72 12177 { "rm5231", 0, ISA_MIPS4, CPU_R5000, },
e7af610e 12178 { "r5261", 0, ISA_MIPS4, CPU_R5000, },
18ae5d72 12179 { "rm5261", 0, ISA_MIPS4, CPU_R5000, },
e7af610e 12180 { "r5721", 0, ISA_MIPS4, CPU_R5000, },
18ae5d72 12181 { "rm5721", 0, ISA_MIPS4, CPU_R5000, },
e7af610e
NC
12182 { "r5k", 0, ISA_MIPS4, CPU_R5000, },
12183 { "r7000", 0, ISA_MIPS4, CPU_R5000, },
12184
12185 /* MIPS32 4K CPU */
12186 { "MIPS32-4K", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12187 { "4kc", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12188 { "4km", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12189 { "4kp", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12190 { "mips32-4kc", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12191 { "mips32-4km", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12192 { "mips32-4kp", 0, ISA_MIPS32, CPU_MIPS32_4K, },
12193
c6c98b38
NC
12194 /* SiByte SB-1 CPU */
12195 { "SB-1", 0, ISA_MIPS64, CPU_SB1, },
e972090a 12196 { "sb-1250", 0, ISA_MIPS64, CPU_SB1, },
c6c98b38
NC
12197 { "sb1", 0, ISA_MIPS64, CPU_SB1, },
12198 { "sb1250", 0, ISA_MIPS64, CPU_SB1, },
12199
beae10d5 12200 /* End marker. */
e7af610e
NC
12201 { NULL, 0, 0, 0, },
12202};
12203
12204static const struct mips_cpu_info *
12205mips_cpu_info_from_name (name)
12206 const char *name;
12207{
12208 int i;
12209
12210 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
beae10d5 12211 if (strcasecmp (name, mips_cpu_info_table[i].name) == 0)
e7af610e
NC
12212 return (&mips_cpu_info_table[i]);
12213
e972090a 12214 return NULL;
e7af610e
NC
12215}
12216
12217static const struct mips_cpu_info *
12218mips_cpu_info_from_isa (isa)
12219 int isa;
12220{
12221 int i;
12222
12223 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
12224 if (mips_cpu_info_table[i].is_isa
12225 && isa == mips_cpu_info_table[i].isa)
12226 return (&mips_cpu_info_table[i]);
12227
e972090a 12228 return NULL;
e7af610e
NC
12229}
12230
12231static const struct mips_cpu_info *
12232mips_cpu_info_from_cpu (cpu)
12233 int cpu;
12234{
12235 int i;
12236
12237 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
12238 if (!mips_cpu_info_table[i].is_isa
12239 && cpu == mips_cpu_info_table[i].cpu)
12240 return (&mips_cpu_info_table[i]);
12241
e972090a 12242 return NULL;
e7af610e 12243}
This page took 0.708717 seconds and 4 git commands to generate.