* config/tc-mipc.c (ISA_HAS_ODD_SINGLE_FPR): New define.
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005 Free Software Foundation, Inc.
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include <stdarg.h>
32
33 #include "opcode/mips.h"
34 #include "itbl-ops.h"
35 #include "dwarf2dbg.h"
36 #include "dw2gencfi.h"
37
38 #ifdef DEBUG
39 #define DBG(x) printf x
40 #else
41 #define DBG(x)
42 #endif
43
44 #ifdef OBJ_MAYBE_ELF
45 /* Clean up namespace so we can include obj-elf.h too. */
46 static int mips_output_flavor (void);
47 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
48 #undef OBJ_PROCESS_STAB
49 #undef OUTPUT_FLAVOR
50 #undef S_GET_ALIGN
51 #undef S_GET_SIZE
52 #undef S_SET_ALIGN
53 #undef S_SET_SIZE
54 #undef obj_frob_file
55 #undef obj_frob_file_after_relocs
56 #undef obj_frob_symbol
57 #undef obj_pop_insert
58 #undef obj_sec_sym_ok_for_reloc
59 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
60
61 #include "obj-elf.h"
62 /* Fix any of them that we actually care about. */
63 #undef OUTPUT_FLAVOR
64 #define OUTPUT_FLAVOR mips_output_flavor()
65 #endif
66
67 #if defined (OBJ_ELF)
68 #include "elf/mips.h"
69 #endif
70
71 #ifndef ECOFF_DEBUGGING
72 #define NO_ECOFF_DEBUGGING
73 #define ECOFF_DEBUGGING 0
74 #endif
75
76 int mips_flag_mdebug = -1;
77
78 /* Control generation of .pdr sections. Off by default on IRIX: the native
79 linker doesn't know about and discards them, but relocations against them
80 remain, leading to rld crashes. */
81 #ifdef TE_IRIX
82 int mips_flag_pdr = FALSE;
83 #else
84 int mips_flag_pdr = TRUE;
85 #endif
86
87 #include "ecoff.h"
88
89 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
90 static char *mips_regmask_frag;
91 #endif
92
93 #define ZERO 0
94 #define AT 1
95 #define TREG 24
96 #define PIC_CALL_REG 25
97 #define KT0 26
98 #define KT1 27
99 #define GP 28
100 #define SP 29
101 #define FP 30
102 #define RA 31
103
104 #define ILLEGAL_REG (32)
105
106 /* Allow override of standard little-endian ECOFF format. */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section. */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116 ? ".rdata" \
117 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118 ? ".rdata" \
119 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120 ? ".rodata" \
121 : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124 and fixups. */
125 struct mips_cl_insn
126 {
127 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
128 const struct mips_opcode *insn_mo;
129
130 /* True if this is a mips16 instruction and if we want the extended
131 form of INSN_MO. */
132 bfd_boolean use_extend;
133
134 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
135 unsigned short extend;
136
137 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
138 a copy of INSN_MO->match with the operands filled in. */
139 unsigned long insn_opcode;
140
141 /* The frag that contains the instruction. */
142 struct frag *frag;
143
144 /* The offset into FRAG of the first instruction byte. */
145 long where;
146
147 /* The relocs associated with the instruction, if any. */
148 fixS *fixp[3];
149
150 /* True if this entry cannot be moved from its current position. */
151 unsigned int fixed_p : 1;
152
153 /* True if this instruction occurred in a .set noreorder block. */
154 unsigned int noreorder_p : 1;
155
156 /* True for mips16 instructions that jump to an absolute address. */
157 unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use. */
161 enum mips_abi_level
162 {
163 NO_ABI = 0,
164 O32_ABI,
165 O64_ABI,
166 N32_ABI,
167 N64_ABI,
168 EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file. */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code. */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178 library. */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182 pseudo-op. We use a struct so that .set push and .set pop are more
183 reliable. */
184
185 struct mips_set_options
186 {
187 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
188 if it has not been initialized. Changed by `.set mipsN', and the
189 -mipsN command line option, and the default CPU. */
190 int isa;
191 /* Enabled Application Specific Extensions (ASEs). These are set to -1
192 if they have not been initialized. Changed by `.set <asename>', by
193 command line options, and based on the default architecture. */
194 int ase_mips3d;
195 int ase_mdmx;
196 int ase_smartmips;
197 int ase_dsp;
198 int ase_mt;
199 /* Whether we are assembling for the mips16 processor. 0 if we are
200 not, 1 if we are, and -1 if the value has not been initialized.
201 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
202 -nomips16 command line options, and the default CPU. */
203 int mips16;
204 /* Non-zero if we should not reorder instructions. Changed by `.set
205 reorder' and `.set noreorder'. */
206 int noreorder;
207 /* Non-zero if we should not permit the $at ($1) register to be used
208 in instructions. Changed by `.set at' and `.set noat'. */
209 int noat;
210 /* Non-zero if we should warn when a macro instruction expands into
211 more than one machine instruction. Changed by `.set nomacro' and
212 `.set macro'. */
213 int warn_about_macros;
214 /* Non-zero if we should not move instructions. Changed by `.set
215 move', `.set volatile', `.set nomove', and `.set novolatile'. */
216 int nomove;
217 /* Non-zero if we should not optimize branches by moving the target
218 of the branch into the delay slot. Actually, we don't perform
219 this optimization anyhow. Changed by `.set bopt' and `.set
220 nobopt'. */
221 int nobopt;
222 /* Non-zero if we should not autoextend mips16 instructions.
223 Changed by `.set autoextend' and `.set noautoextend'. */
224 int noautoextend;
225 /* Restrict general purpose registers and floating point registers
226 to 32 bit. This is initially determined when -mgp32 or -mfp32
227 is passed but can changed if the assembler code uses .set mipsN. */
228 int gp32;
229 int fp32;
230 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
231 command line option, and the default CPU. */
232 int arch;
233 /* True if ".set sym32" is in effect. */
234 bfd_boolean sym32;
235 };
236
237 /* True if -mgp32 was passed. */
238 static int file_mips_gp32 = -1;
239
240 /* True if -mfp32 was passed. */
241 static int file_mips_fp32 = -1;
242
243 /* This is the struct we use to hold the current set of options. Note
244 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
245 -1 to indicate that they have not been initialized. */
246
247 static struct mips_set_options mips_opts =
248 {
249 ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
250 };
251
252 /* These variables are filled in with the masks of registers used.
253 The object format code reads them and puts them in the appropriate
254 place. */
255 unsigned long mips_gprmask;
256 unsigned long mips_cprmask[4];
257
258 /* MIPS ISA we are using for this output file. */
259 static int file_mips_isa = ISA_UNKNOWN;
260
261 /* True if -mips16 was passed or implied by arguments passed on the
262 command line (e.g., by -march). */
263 static int file_ase_mips16;
264
265 /* True if -mips3d was passed or implied by arguments passed on the
266 command line (e.g., by -march). */
267 static int file_ase_mips3d;
268
269 /* True if -mdmx was passed or implied by arguments passed on the
270 command line (e.g., by -march). */
271 static int file_ase_mdmx;
272
273 /* True if -msmartmips was passed or implied by arguments passed on the
274 command line (e.g., by -march). */
275 static int file_ase_smartmips;
276
277 #define ISA_SUPPORT_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
278 || mips_opts.isa == ISA_MIPS32R2)
279
280 /* True if -mdsp was passed or implied by arguments passed on the
281 command line (e.g., by -march). */
282 static int file_ase_dsp;
283
284 /* True if -mmt was passed or implied by arguments passed on the
285 command line (e.g., by -march). */
286 static int file_ase_mt;
287
288 /* The argument of the -march= flag. The architecture we are assembling. */
289 static int file_mips_arch = CPU_UNKNOWN;
290 static const char *mips_arch_string;
291
292 /* The argument of the -mtune= flag. The architecture for which we
293 are optimizing. */
294 static int mips_tune = CPU_UNKNOWN;
295 static const char *mips_tune_string;
296
297 /* True when generating 32-bit code for a 64-bit processor. */
298 static int mips_32bitmode = 0;
299
300 /* True if the given ABI requires 32-bit registers. */
301 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
302
303 /* Likewise 64-bit registers. */
304 #define ABI_NEEDS_64BIT_REGS(ABI) \
305 ((ABI) == N32_ABI \
306 || (ABI) == N64_ABI \
307 || (ABI) == O64_ABI)
308
309 /* Return true if ISA supports 64 bit gp register instructions. */
310 #define ISA_HAS_64BIT_REGS(ISA) \
311 ((ISA) == ISA_MIPS3 \
312 || (ISA) == ISA_MIPS4 \
313 || (ISA) == ISA_MIPS5 \
314 || (ISA) == ISA_MIPS64 \
315 || (ISA) == ISA_MIPS64R2)
316
317 /* Return true if ISA supports 64-bit right rotate (dror et al.)
318 instructions. */
319 #define ISA_HAS_DROR(ISA) \
320 ((ISA) == ISA_MIPS64R2)
321
322 /* Return true if ISA supports 32-bit right rotate (ror et al.)
323 instructions. */
324 #define ISA_HAS_ROR(ISA) \
325 ((ISA) == ISA_MIPS32R2 \
326 || (ISA) == ISA_MIPS64R2 \
327 || mips_opts.ase_smartmips)
328
329 /* Return true if ISA supports single-precision floats in odd registers. */
330 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
331 ((ISA) == ISA_MIPS32 \
332 || (ISA) == ISA_MIPS32R2 \
333 || (ISA) == ISA_MIPS64 \
334 || (ISA) == ISA_MIPS64R2)
335
336 #define HAVE_32BIT_GPRS \
337 (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
338
339 #define HAVE_32BIT_FPRS \
340 (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
341
342 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
343 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
344
345 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
346
347 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
348
349 /* True if relocations are stored in-place. */
350 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
351
352 /* The ABI-derived address size. */
353 #define HAVE_64BIT_ADDRESSES \
354 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
355 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
356
357 /* The size of symbolic constants (i.e., expressions of the form
358 "SYMBOL" or "SYMBOL + OFFSET"). */
359 #define HAVE_32BIT_SYMBOLS \
360 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
361 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
362
363 /* Addresses are loaded in different ways, depending on the address size
364 in use. The n32 ABI Documentation also mandates the use of additions
365 with overflow checking, but existing implementations don't follow it. */
366 #define ADDRESS_ADD_INSN \
367 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
368
369 #define ADDRESS_ADDI_INSN \
370 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
371
372 #define ADDRESS_LOAD_INSN \
373 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
374
375 #define ADDRESS_STORE_INSN \
376 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
377
378 /* Return true if the given CPU supports the MIPS16 ASE. */
379 #define CPU_HAS_MIPS16(cpu) \
380 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
381 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
382
383 /* Return true if the given CPU supports the MIPS3D ASE. */
384 #define CPU_HAS_MIPS3D(cpu) ((cpu) == CPU_SB1 \
385 )
386
387 /* Return true if the given CPU supports the MDMX ASE. */
388 #define CPU_HAS_MDMX(cpu) (FALSE \
389 )
390
391 /* Return true if the given CPU supports the DSP ASE. */
392 #define CPU_HAS_DSP(cpu) (FALSE \
393 )
394
395 /* Return true if the given CPU supports the MT ASE. */
396 #define CPU_HAS_MT(cpu) (FALSE \
397 )
398
399 /* True if CPU has a dror instruction. */
400 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
401
402 /* True if CPU has a ror instruction. */
403 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
404
405 /* True if mflo and mfhi can be immediately followed by instructions
406 which write to the HI and LO registers.
407
408 According to MIPS specifications, MIPS ISAs I, II, and III need
409 (at least) two instructions between the reads of HI/LO and
410 instructions which write them, and later ISAs do not. Contradicting
411 the MIPS specifications, some MIPS IV processor user manuals (e.g.
412 the UM for the NEC Vr5000) document needing the instructions between
413 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
414 MIPS64 and later ISAs to have the interlocks, plus any specific
415 earlier-ISA CPUs for which CPU documentation declares that the
416 instructions are really interlocked. */
417 #define hilo_interlocks \
418 (mips_opts.isa == ISA_MIPS32 \
419 || mips_opts.isa == ISA_MIPS32R2 \
420 || mips_opts.isa == ISA_MIPS64 \
421 || mips_opts.isa == ISA_MIPS64R2 \
422 || mips_opts.arch == CPU_R4010 \
423 || mips_opts.arch == CPU_R10000 \
424 || mips_opts.arch == CPU_R12000 \
425 || mips_opts.arch == CPU_RM7000 \
426 || mips_opts.arch == CPU_VR5500 \
427 )
428
429 /* Whether the processor uses hardware interlocks to protect reads
430 from the GPRs after they are loaded from memory, and thus does not
431 require nops to be inserted. This applies to instructions marked
432 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
433 level I. */
434 #define gpr_interlocks \
435 (mips_opts.isa != ISA_MIPS1 \
436 || mips_opts.arch == CPU_R3900)
437
438 /* Whether the processor uses hardware interlocks to avoid delays
439 required by coprocessor instructions, and thus does not require
440 nops to be inserted. This applies to instructions marked
441 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
442 between instructions marked INSN_WRITE_COND_CODE and ones marked
443 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
444 levels I, II, and III. */
445 /* Itbl support may require additional care here. */
446 #define cop_interlocks \
447 ((mips_opts.isa != ISA_MIPS1 \
448 && mips_opts.isa != ISA_MIPS2 \
449 && mips_opts.isa != ISA_MIPS3) \
450 || mips_opts.arch == CPU_R4300 \
451 )
452
453 /* Whether the processor uses hardware interlocks to protect reads
454 from coprocessor registers after they are loaded from memory, and
455 thus does not require nops to be inserted. This applies to
456 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
457 requires at MIPS ISA level I. */
458 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
459
460 /* Is this a mfhi or mflo instruction? */
461 #define MF_HILO_INSN(PINFO) \
462 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
463
464 /* MIPS PIC level. */
465
466 enum mips_pic_level mips_pic;
467
468 /* 1 if we should generate 32 bit offsets from the $gp register in
469 SVR4_PIC mode. Currently has no meaning in other modes. */
470 static int mips_big_got = 0;
471
472 /* 1 if trap instructions should used for overflow rather than break
473 instructions. */
474 static int mips_trap = 0;
475
476 /* 1 if double width floating point constants should not be constructed
477 by assembling two single width halves into two single width floating
478 point registers which just happen to alias the double width destination
479 register. On some architectures this aliasing can be disabled by a bit
480 in the status register, and the setting of this bit cannot be determined
481 automatically at assemble time. */
482 static int mips_disable_float_construction;
483
484 /* Non-zero if any .set noreorder directives were used. */
485
486 static int mips_any_noreorder;
487
488 /* Non-zero if nops should be inserted when the register referenced in
489 an mfhi/mflo instruction is read in the next two instructions. */
490 static int mips_7000_hilo_fix;
491
492 /* The size of the small data section. */
493 static unsigned int g_switch_value = 8;
494 /* Whether the -G option was used. */
495 static int g_switch_seen = 0;
496
497 #define N_RMASK 0xc4
498 #define N_VFP 0xd4
499
500 /* If we can determine in advance that GP optimization won't be
501 possible, we can skip the relaxation stuff that tries to produce
502 GP-relative references. This makes delay slot optimization work
503 better.
504
505 This function can only provide a guess, but it seems to work for
506 gcc output. It needs to guess right for gcc, otherwise gcc
507 will put what it thinks is a GP-relative instruction in a branch
508 delay slot.
509
510 I don't know if a fix is needed for the SVR4_PIC mode. I've only
511 fixed it for the non-PIC mode. KR 95/04/07 */
512 static int nopic_need_relax (symbolS *, int);
513
514 /* handle of the OPCODE hash table */
515 static struct hash_control *op_hash = NULL;
516
517 /* The opcode hash table we use for the mips16. */
518 static struct hash_control *mips16_op_hash = NULL;
519
520 /* This array holds the chars that always start a comment. If the
521 pre-processor is disabled, these aren't very useful */
522 const char comment_chars[] = "#";
523
524 /* This array holds the chars that only start a comment at the beginning of
525 a line. If the line seems to have the form '# 123 filename'
526 .line and .file directives will appear in the pre-processed output */
527 /* Note that input_file.c hand checks for '#' at the beginning of the
528 first line of the input file. This is because the compiler outputs
529 #NO_APP at the beginning of its output. */
530 /* Also note that C style comments are always supported. */
531 const char line_comment_chars[] = "#";
532
533 /* This array holds machine specific line separator characters. */
534 const char line_separator_chars[] = ";";
535
536 /* Chars that can be used to separate mant from exp in floating point nums */
537 const char EXP_CHARS[] = "eE";
538
539 /* Chars that mean this number is a floating point constant */
540 /* As in 0f12.456 */
541 /* or 0d1.2345e12 */
542 const char FLT_CHARS[] = "rRsSfFdDxXpP";
543
544 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
545 changed in read.c . Ideally it shouldn't have to know about it at all,
546 but nothing is ideal around here.
547 */
548
549 static char *insn_error;
550
551 static int auto_align = 1;
552
553 /* When outputting SVR4 PIC code, the assembler needs to know the
554 offset in the stack frame from which to restore the $gp register.
555 This is set by the .cprestore pseudo-op, and saved in this
556 variable. */
557 static offsetT mips_cprestore_offset = -1;
558
559 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
560 more optimizations, it can use a register value instead of a memory-saved
561 offset and even an other register than $gp as global pointer. */
562 static offsetT mips_cpreturn_offset = -1;
563 static int mips_cpreturn_register = -1;
564 static int mips_gp_register = GP;
565 static int mips_gprel_offset = 0;
566
567 /* Whether mips_cprestore_offset has been set in the current function
568 (or whether it has already been warned about, if not). */
569 static int mips_cprestore_valid = 0;
570
571 /* This is the register which holds the stack frame, as set by the
572 .frame pseudo-op. This is needed to implement .cprestore. */
573 static int mips_frame_reg = SP;
574
575 /* Whether mips_frame_reg has been set in the current function
576 (or whether it has already been warned about, if not). */
577 static int mips_frame_reg_valid = 0;
578
579 /* To output NOP instructions correctly, we need to keep information
580 about the previous two instructions. */
581
582 /* Whether we are optimizing. The default value of 2 means to remove
583 unneeded NOPs and swap branch instructions when possible. A value
584 of 1 means to not swap branches. A value of 0 means to always
585 insert NOPs. */
586 static int mips_optimize = 2;
587
588 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
589 equivalent to seeing no -g option at all. */
590 static int mips_debug = 0;
591
592 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
593 #define MAX_VR4130_NOPS 4
594
595 /* The maximum number of NOPs needed to fill delay slots. */
596 #define MAX_DELAY_NOPS 2
597
598 /* The maximum number of NOPs needed for any purpose. */
599 #define MAX_NOPS 4
600
601 /* A list of previous instructions, with index 0 being the most recent.
602 We need to look back MAX_NOPS instructions when filling delay slots
603 or working around processor errata. We need to look back one
604 instruction further if we're thinking about using history[0] to
605 fill a branch delay slot. */
606 static struct mips_cl_insn history[1 + MAX_NOPS];
607
608 /* Nop instructions used by emit_nop. */
609 static struct mips_cl_insn nop_insn, mips16_nop_insn;
610
611 /* The appropriate nop for the current mode. */
612 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
613
614 /* If this is set, it points to a frag holding nop instructions which
615 were inserted before the start of a noreorder section. If those
616 nops turn out to be unnecessary, the size of the frag can be
617 decreased. */
618 static fragS *prev_nop_frag;
619
620 /* The number of nop instructions we created in prev_nop_frag. */
621 static int prev_nop_frag_holds;
622
623 /* The number of nop instructions that we know we need in
624 prev_nop_frag. */
625 static int prev_nop_frag_required;
626
627 /* The number of instructions we've seen since prev_nop_frag. */
628 static int prev_nop_frag_since;
629
630 /* For ECOFF and ELF, relocations against symbols are done in two
631 parts, with a HI relocation and a LO relocation. Each relocation
632 has only 16 bits of space to store an addend. This means that in
633 order for the linker to handle carries correctly, it must be able
634 to locate both the HI and the LO relocation. This means that the
635 relocations must appear in order in the relocation table.
636
637 In order to implement this, we keep track of each unmatched HI
638 relocation. We then sort them so that they immediately precede the
639 corresponding LO relocation. */
640
641 struct mips_hi_fixup
642 {
643 /* Next HI fixup. */
644 struct mips_hi_fixup *next;
645 /* This fixup. */
646 fixS *fixp;
647 /* The section this fixup is in. */
648 segT seg;
649 };
650
651 /* The list of unmatched HI relocs. */
652
653 static struct mips_hi_fixup *mips_hi_fixup_list;
654
655 /* The frag containing the last explicit relocation operator.
656 Null if explicit relocations have not been used. */
657
658 static fragS *prev_reloc_op_frag;
659
660 /* Map normal MIPS register numbers to mips16 register numbers. */
661
662 #define X ILLEGAL_REG
663 static const int mips32_to_16_reg_map[] =
664 {
665 X, X, 2, 3, 4, 5, 6, 7,
666 X, X, X, X, X, X, X, X,
667 0, 1, X, X, X, X, X, X,
668 X, X, X, X, X, X, X, X
669 };
670 #undef X
671
672 /* Map mips16 register numbers to normal MIPS register numbers. */
673
674 static const unsigned int mips16_to_32_reg_map[] =
675 {
676 16, 17, 2, 3, 4, 5, 6, 7
677 };
678
679 /* Classifies the kind of instructions we're interested in when
680 implementing -mfix-vr4120. */
681 enum fix_vr4120_class {
682 FIX_VR4120_MACC,
683 FIX_VR4120_DMACC,
684 FIX_VR4120_MULT,
685 FIX_VR4120_DMULT,
686 FIX_VR4120_DIV,
687 FIX_VR4120_MTHILO,
688 NUM_FIX_VR4120_CLASSES
689 };
690
691 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
692 there must be at least one other instruction between an instruction
693 of type X and an instruction of type Y. */
694 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
695
696 /* True if -mfix-vr4120 is in force. */
697 static int mips_fix_vr4120;
698
699 /* ...likewise -mfix-vr4130. */
700 static int mips_fix_vr4130;
701
702 /* We don't relax branches by default, since this causes us to expand
703 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
704 fail to compute the offset before expanding the macro to the most
705 efficient expansion. */
706
707 static int mips_relax_branch;
708 \f
709 /* The expansion of many macros depends on the type of symbol that
710 they refer to. For example, when generating position-dependent code,
711 a macro that refers to a symbol may have two different expansions,
712 one which uses GP-relative addresses and one which uses absolute
713 addresses. When generating SVR4-style PIC, a macro may have
714 different expansions for local and global symbols.
715
716 We handle these situations by generating both sequences and putting
717 them in variant frags. In position-dependent code, the first sequence
718 will be the GP-relative one and the second sequence will be the
719 absolute one. In SVR4 PIC, the first sequence will be for global
720 symbols and the second will be for local symbols.
721
722 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
723 SECOND are the lengths of the two sequences in bytes. These fields
724 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
725 the subtype has the following flags:
726
727 RELAX_USE_SECOND
728 Set if it has been decided that we should use the second
729 sequence instead of the first.
730
731 RELAX_SECOND_LONGER
732 Set in the first variant frag if the macro's second implementation
733 is longer than its first. This refers to the macro as a whole,
734 not an individual relaxation.
735
736 RELAX_NOMACRO
737 Set in the first variant frag if the macro appeared in a .set nomacro
738 block and if one alternative requires a warning but the other does not.
739
740 RELAX_DELAY_SLOT
741 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
742 delay slot.
743
744 The frag's "opcode" points to the first fixup for relaxable code.
745
746 Relaxable macros are generated using a sequence such as:
747
748 relax_start (SYMBOL);
749 ... generate first expansion ...
750 relax_switch ();
751 ... generate second expansion ...
752 relax_end ();
753
754 The code and fixups for the unwanted alternative are discarded
755 by md_convert_frag. */
756 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
757
758 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
759 #define RELAX_SECOND(X) ((X) & 0xff)
760 #define RELAX_USE_SECOND 0x10000
761 #define RELAX_SECOND_LONGER 0x20000
762 #define RELAX_NOMACRO 0x40000
763 #define RELAX_DELAY_SLOT 0x80000
764
765 /* Branch without likely bit. If label is out of range, we turn:
766
767 beq reg1, reg2, label
768 delay slot
769
770 into
771
772 bne reg1, reg2, 0f
773 nop
774 j label
775 0: delay slot
776
777 with the following opcode replacements:
778
779 beq <-> bne
780 blez <-> bgtz
781 bltz <-> bgez
782 bc1f <-> bc1t
783
784 bltzal <-> bgezal (with jal label instead of j label)
785
786 Even though keeping the delay slot instruction in the delay slot of
787 the branch would be more efficient, it would be very tricky to do
788 correctly, because we'd have to introduce a variable frag *after*
789 the delay slot instruction, and expand that instead. Let's do it
790 the easy way for now, even if the branch-not-taken case now costs
791 one additional instruction. Out-of-range branches are not supposed
792 to be common, anyway.
793
794 Branch likely. If label is out of range, we turn:
795
796 beql reg1, reg2, label
797 delay slot (annulled if branch not taken)
798
799 into
800
801 beql reg1, reg2, 1f
802 nop
803 beql $0, $0, 2f
804 nop
805 1: j[al] label
806 delay slot (executed only if branch taken)
807 2:
808
809 It would be possible to generate a shorter sequence by losing the
810 likely bit, generating something like:
811
812 bne reg1, reg2, 0f
813 nop
814 j[al] label
815 delay slot (executed only if branch taken)
816 0:
817
818 beql -> bne
819 bnel -> beq
820 blezl -> bgtz
821 bgtzl -> blez
822 bltzl -> bgez
823 bgezl -> bltz
824 bc1fl -> bc1t
825 bc1tl -> bc1f
826
827 bltzall -> bgezal (with jal label instead of j label)
828 bgezall -> bltzal (ditto)
829
830
831 but it's not clear that it would actually improve performance. */
832 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
833 ((relax_substateT) \
834 (0xc0000000 \
835 | ((toofar) ? 1 : 0) \
836 | ((link) ? 2 : 0) \
837 | ((likely) ? 4 : 0) \
838 | ((uncond) ? 8 : 0)))
839 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
840 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
841 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
842 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
843 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
844
845 /* For mips16 code, we use an entirely different form of relaxation.
846 mips16 supports two versions of most instructions which take
847 immediate values: a small one which takes some small value, and a
848 larger one which takes a 16 bit value. Since branches also follow
849 this pattern, relaxing these values is required.
850
851 We can assemble both mips16 and normal MIPS code in a single
852 object. Therefore, we need to support this type of relaxation at
853 the same time that we support the relaxation described above. We
854 use the high bit of the subtype field to distinguish these cases.
855
856 The information we store for this type of relaxation is the
857 argument code found in the opcode file for this relocation, whether
858 the user explicitly requested a small or extended form, and whether
859 the relocation is in a jump or jal delay slot. That tells us the
860 size of the value, and how it should be stored. We also store
861 whether the fragment is considered to be extended or not. We also
862 store whether this is known to be a branch to a different section,
863 whether we have tried to relax this frag yet, and whether we have
864 ever extended a PC relative fragment because of a shift count. */
865 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
866 (0x80000000 \
867 | ((type) & 0xff) \
868 | ((small) ? 0x100 : 0) \
869 | ((ext) ? 0x200 : 0) \
870 | ((dslot) ? 0x400 : 0) \
871 | ((jal_dslot) ? 0x800 : 0))
872 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
873 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
874 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
875 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
876 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
877 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
878 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
879 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
880 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
881 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
882 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
883 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
884
885 /* Is the given value a sign-extended 32-bit value? */
886 #define IS_SEXT_32BIT_NUM(x) \
887 (((x) &~ (offsetT) 0x7fffffff) == 0 \
888 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
889
890 /* Is the given value a sign-extended 16-bit value? */
891 #define IS_SEXT_16BIT_NUM(x) \
892 (((x) &~ (offsetT) 0x7fff) == 0 \
893 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
894
895 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
896 #define IS_ZEXT_32BIT_NUM(x) \
897 (((x) &~ (offsetT) 0xffffffff) == 0 \
898 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
899
900 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
901 VALUE << SHIFT. VALUE is evaluated exactly once. */
902 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
903 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
904 | (((VALUE) & (MASK)) << (SHIFT)))
905
906 /* Extract bits MASK << SHIFT from STRUCT and shift them right
907 SHIFT places. */
908 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
909 (((STRUCT) >> (SHIFT)) & (MASK))
910
911 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
912 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
913
914 include/opcode/mips.h specifies operand fields using the macros
915 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
916 with "MIPS16OP" instead of "OP". */
917 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
918 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
919 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
920 INSERT_BITS ((INSN).insn_opcode, VALUE, \
921 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
922
923 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
924 #define EXTRACT_OPERAND(FIELD, INSN) \
925 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
926 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
927 EXTRACT_BITS ((INSN).insn_opcode, \
928 MIPS16OP_MASK_##FIELD, \
929 MIPS16OP_SH_##FIELD)
930 \f
931 /* Global variables used when generating relaxable macros. See the
932 comment above RELAX_ENCODE for more details about how relaxation
933 is used. */
934 static struct {
935 /* 0 if we're not emitting a relaxable macro.
936 1 if we're emitting the first of the two relaxation alternatives.
937 2 if we're emitting the second alternative. */
938 int sequence;
939
940 /* The first relaxable fixup in the current frag. (In other words,
941 the first fixup that refers to relaxable code.) */
942 fixS *first_fixup;
943
944 /* sizes[0] says how many bytes of the first alternative are stored in
945 the current frag. Likewise sizes[1] for the second alternative. */
946 unsigned int sizes[2];
947
948 /* The symbol on which the choice of sequence depends. */
949 symbolS *symbol;
950 } mips_relax;
951 \f
952 /* Global variables used to decide whether a macro needs a warning. */
953 static struct {
954 /* True if the macro is in a branch delay slot. */
955 bfd_boolean delay_slot_p;
956
957 /* For relaxable macros, sizes[0] is the length of the first alternative
958 in bytes and sizes[1] is the length of the second alternative.
959 For non-relaxable macros, both elements give the length of the
960 macro in bytes. */
961 unsigned int sizes[2];
962
963 /* The first variant frag for this macro. */
964 fragS *first_frag;
965 } mips_macro_warning;
966 \f
967 /* Prototypes for static functions. */
968
969 #define internalError() \
970 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
971
972 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
973
974 static void append_insn
975 (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
976 static void mips_no_prev_insn (void);
977 static void mips16_macro_build
978 (expressionS *, const char *, const char *, va_list);
979 static void load_register (int, expressionS *, int);
980 static void macro_start (void);
981 static void macro_end (void);
982 static void macro (struct mips_cl_insn * ip);
983 static void mips16_macro (struct mips_cl_insn * ip);
984 #ifdef LOSING_COMPILER
985 static void macro2 (struct mips_cl_insn * ip);
986 #endif
987 static void mips_ip (char *str, struct mips_cl_insn * ip);
988 static void mips16_ip (char *str, struct mips_cl_insn * ip);
989 static void mips16_immed
990 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
991 unsigned long *, bfd_boolean *, unsigned short *);
992 static size_t my_getSmallExpression
993 (expressionS *, bfd_reloc_code_real_type *, char *);
994 static void my_getExpression (expressionS *, char *);
995 static void s_align (int);
996 static void s_change_sec (int);
997 static void s_change_section (int);
998 static void s_cons (int);
999 static void s_float_cons (int);
1000 static void s_mips_globl (int);
1001 static void s_option (int);
1002 static void s_mipsset (int);
1003 static void s_abicalls (int);
1004 static void s_cpload (int);
1005 static void s_cpsetup (int);
1006 static void s_cplocal (int);
1007 static void s_cprestore (int);
1008 static void s_cpreturn (int);
1009 static void s_gpvalue (int);
1010 static void s_gpword (int);
1011 static void s_gpdword (int);
1012 static void s_cpadd (int);
1013 static void s_insn (int);
1014 static void md_obj_begin (void);
1015 static void md_obj_end (void);
1016 static void s_mips_ent (int);
1017 static void s_mips_end (int);
1018 static void s_mips_frame (int);
1019 static void s_mips_mask (int reg_type);
1020 static void s_mips_stab (int);
1021 static void s_mips_weakext (int);
1022 static void s_mips_file (int);
1023 static void s_mips_loc (int);
1024 static bfd_boolean pic_need_relax (symbolS *, asection *);
1025 static int relaxed_branch_length (fragS *, asection *, int);
1026 static int validate_mips_insn (const struct mips_opcode *);
1027
1028 /* Table and functions used to map between CPU/ISA names, and
1029 ISA levels, and CPU numbers. */
1030
1031 struct mips_cpu_info
1032 {
1033 const char *name; /* CPU or ISA name. */
1034 int is_isa; /* Is this an ISA? (If 0, a CPU.) */
1035 int isa; /* ISA level. */
1036 int cpu; /* CPU number (default CPU if ISA). */
1037 };
1038
1039 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1040 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1041 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1042 \f
1043 /* Pseudo-op table.
1044
1045 The following pseudo-ops from the Kane and Heinrich MIPS book
1046 should be defined here, but are currently unsupported: .alias,
1047 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1048
1049 The following pseudo-ops from the Kane and Heinrich MIPS book are
1050 specific to the type of debugging information being generated, and
1051 should be defined by the object format: .aent, .begin, .bend,
1052 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1053 .vreg.
1054
1055 The following pseudo-ops from the Kane and Heinrich MIPS book are
1056 not MIPS CPU specific, but are also not specific to the object file
1057 format. This file is probably the best place to define them, but
1058 they are not currently supported: .asm0, .endr, .lab, .repeat,
1059 .struct. */
1060
1061 static const pseudo_typeS mips_pseudo_table[] =
1062 {
1063 /* MIPS specific pseudo-ops. */
1064 {"option", s_option, 0},
1065 {"set", s_mipsset, 0},
1066 {"rdata", s_change_sec, 'r'},
1067 {"sdata", s_change_sec, 's'},
1068 {"livereg", s_ignore, 0},
1069 {"abicalls", s_abicalls, 0},
1070 {"cpload", s_cpload, 0},
1071 {"cpsetup", s_cpsetup, 0},
1072 {"cplocal", s_cplocal, 0},
1073 {"cprestore", s_cprestore, 0},
1074 {"cpreturn", s_cpreturn, 0},
1075 {"gpvalue", s_gpvalue, 0},
1076 {"gpword", s_gpword, 0},
1077 {"gpdword", s_gpdword, 0},
1078 {"cpadd", s_cpadd, 0},
1079 {"insn", s_insn, 0},
1080
1081 /* Relatively generic pseudo-ops that happen to be used on MIPS
1082 chips. */
1083 {"asciiz", stringer, 1},
1084 {"bss", s_change_sec, 'b'},
1085 {"err", s_err, 0},
1086 {"half", s_cons, 1},
1087 {"dword", s_cons, 3},
1088 {"weakext", s_mips_weakext, 0},
1089
1090 /* These pseudo-ops are defined in read.c, but must be overridden
1091 here for one reason or another. */
1092 {"align", s_align, 0},
1093 {"byte", s_cons, 0},
1094 {"data", s_change_sec, 'd'},
1095 {"double", s_float_cons, 'd'},
1096 {"float", s_float_cons, 'f'},
1097 {"globl", s_mips_globl, 0},
1098 {"global", s_mips_globl, 0},
1099 {"hword", s_cons, 1},
1100 {"int", s_cons, 2},
1101 {"long", s_cons, 2},
1102 {"octa", s_cons, 4},
1103 {"quad", s_cons, 3},
1104 {"section", s_change_section, 0},
1105 {"short", s_cons, 1},
1106 {"single", s_float_cons, 'f'},
1107 {"stabn", s_mips_stab, 'n'},
1108 {"text", s_change_sec, 't'},
1109 {"word", s_cons, 2},
1110
1111 { "extern", ecoff_directive_extern, 0},
1112
1113 { NULL, NULL, 0 },
1114 };
1115
1116 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1117 {
1118 /* These pseudo-ops should be defined by the object file format.
1119 However, a.out doesn't support them, so we have versions here. */
1120 {"aent", s_mips_ent, 1},
1121 {"bgnb", s_ignore, 0},
1122 {"end", s_mips_end, 0},
1123 {"endb", s_ignore, 0},
1124 {"ent", s_mips_ent, 0},
1125 {"file", s_mips_file, 0},
1126 {"fmask", s_mips_mask, 'F'},
1127 {"frame", s_mips_frame, 0},
1128 {"loc", s_mips_loc, 0},
1129 {"mask", s_mips_mask, 'R'},
1130 {"verstamp", s_ignore, 0},
1131 { NULL, NULL, 0 },
1132 };
1133
1134 extern void pop_insert (const pseudo_typeS *);
1135
1136 void
1137 mips_pop_insert (void)
1138 {
1139 pop_insert (mips_pseudo_table);
1140 if (! ECOFF_DEBUGGING)
1141 pop_insert (mips_nonecoff_pseudo_table);
1142 }
1143 \f
1144 /* Symbols labelling the current insn. */
1145
1146 struct insn_label_list
1147 {
1148 struct insn_label_list *next;
1149 symbolS *label;
1150 };
1151
1152 static struct insn_label_list *insn_labels;
1153 static struct insn_label_list *free_insn_labels;
1154
1155 static void mips_clear_insn_labels (void);
1156
1157 static inline void
1158 mips_clear_insn_labels (void)
1159 {
1160 register struct insn_label_list **pl;
1161
1162 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1163 ;
1164 *pl = insn_labels;
1165 insn_labels = NULL;
1166 }
1167 \f
1168 static char *expr_end;
1169
1170 /* Expressions which appear in instructions. These are set by
1171 mips_ip. */
1172
1173 static expressionS imm_expr;
1174 static expressionS imm2_expr;
1175 static expressionS offset_expr;
1176
1177 /* Relocs associated with imm_expr and offset_expr. */
1178
1179 static bfd_reloc_code_real_type imm_reloc[3]
1180 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1181 static bfd_reloc_code_real_type offset_reloc[3]
1182 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1183
1184 /* These are set by mips16_ip if an explicit extension is used. */
1185
1186 static bfd_boolean mips16_small, mips16_ext;
1187
1188 #ifdef OBJ_ELF
1189 /* The pdr segment for per procedure frame/regmask info. Not used for
1190 ECOFF debugging. */
1191
1192 static segT pdr_seg;
1193 #endif
1194
1195 /* The default target format to use. */
1196
1197 const char *
1198 mips_target_format (void)
1199 {
1200 switch (OUTPUT_FLAVOR)
1201 {
1202 case bfd_target_ecoff_flavour:
1203 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1204 case bfd_target_coff_flavour:
1205 return "pe-mips";
1206 case bfd_target_elf_flavour:
1207 #ifdef TE_VXWORKS
1208 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1209 return (target_big_endian
1210 ? "elf32-bigmips-vxworks"
1211 : "elf32-littlemips-vxworks");
1212 #endif
1213 #ifdef TE_TMIPS
1214 /* This is traditional mips. */
1215 return (target_big_endian
1216 ? (HAVE_64BIT_OBJECTS
1217 ? "elf64-tradbigmips"
1218 : (HAVE_NEWABI
1219 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1220 : (HAVE_64BIT_OBJECTS
1221 ? "elf64-tradlittlemips"
1222 : (HAVE_NEWABI
1223 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1224 #else
1225 return (target_big_endian
1226 ? (HAVE_64BIT_OBJECTS
1227 ? "elf64-bigmips"
1228 : (HAVE_NEWABI
1229 ? "elf32-nbigmips" : "elf32-bigmips"))
1230 : (HAVE_64BIT_OBJECTS
1231 ? "elf64-littlemips"
1232 : (HAVE_NEWABI
1233 ? "elf32-nlittlemips" : "elf32-littlemips")));
1234 #endif
1235 default:
1236 abort ();
1237 return NULL;
1238 }
1239 }
1240
1241 /* Return the length of instruction INSN. */
1242
1243 static inline unsigned int
1244 insn_length (const struct mips_cl_insn *insn)
1245 {
1246 if (!mips_opts.mips16)
1247 return 4;
1248 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1249 }
1250
1251 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1252
1253 static void
1254 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1255 {
1256 size_t i;
1257
1258 insn->insn_mo = mo;
1259 insn->use_extend = FALSE;
1260 insn->extend = 0;
1261 insn->insn_opcode = mo->match;
1262 insn->frag = NULL;
1263 insn->where = 0;
1264 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1265 insn->fixp[i] = NULL;
1266 insn->fixed_p = (mips_opts.noreorder > 0);
1267 insn->noreorder_p = (mips_opts.noreorder > 0);
1268 insn->mips16_absolute_jump_p = 0;
1269 }
1270
1271 /* Install INSN at the location specified by its "frag" and "where" fields. */
1272
1273 static void
1274 install_insn (const struct mips_cl_insn *insn)
1275 {
1276 char *f = insn->frag->fr_literal + insn->where;
1277 if (!mips_opts.mips16)
1278 md_number_to_chars (f, insn->insn_opcode, 4);
1279 else if (insn->mips16_absolute_jump_p)
1280 {
1281 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1282 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1283 }
1284 else
1285 {
1286 if (insn->use_extend)
1287 {
1288 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1289 f += 2;
1290 }
1291 md_number_to_chars (f, insn->insn_opcode, 2);
1292 }
1293 }
1294
1295 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1296 and install the opcode in the new location. */
1297
1298 static void
1299 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1300 {
1301 size_t i;
1302
1303 insn->frag = frag;
1304 insn->where = where;
1305 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1306 if (insn->fixp[i] != NULL)
1307 {
1308 insn->fixp[i]->fx_frag = frag;
1309 insn->fixp[i]->fx_where = where;
1310 }
1311 install_insn (insn);
1312 }
1313
1314 /* Add INSN to the end of the output. */
1315
1316 static void
1317 add_fixed_insn (struct mips_cl_insn *insn)
1318 {
1319 char *f = frag_more (insn_length (insn));
1320 move_insn (insn, frag_now, f - frag_now->fr_literal);
1321 }
1322
1323 /* Start a variant frag and move INSN to the start of the variant part,
1324 marking it as fixed. The other arguments are as for frag_var. */
1325
1326 static void
1327 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1328 relax_substateT subtype, symbolS *symbol, offsetT offset)
1329 {
1330 frag_grow (max_chars);
1331 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1332 insn->fixed_p = 1;
1333 frag_var (rs_machine_dependent, max_chars, var,
1334 subtype, symbol, offset, NULL);
1335 }
1336
1337 /* Insert N copies of INSN into the history buffer, starting at
1338 position FIRST. Neither FIRST nor N need to be clipped. */
1339
1340 static void
1341 insert_into_history (unsigned int first, unsigned int n,
1342 const struct mips_cl_insn *insn)
1343 {
1344 if (mips_relax.sequence != 2)
1345 {
1346 unsigned int i;
1347
1348 for (i = ARRAY_SIZE (history); i-- > first;)
1349 if (i >= first + n)
1350 history[i] = history[i - n];
1351 else
1352 history[i] = *insn;
1353 }
1354 }
1355
1356 /* Emit a nop instruction, recording it in the history buffer. */
1357
1358 static void
1359 emit_nop (void)
1360 {
1361 add_fixed_insn (NOP_INSN);
1362 insert_into_history (0, 1, NOP_INSN);
1363 }
1364
1365 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1366 the idea is to make it obvious at a glance that each errata is
1367 included. */
1368
1369 static void
1370 init_vr4120_conflicts (void)
1371 {
1372 #define CONFLICT(FIRST, SECOND) \
1373 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1374
1375 /* Errata 21 - [D]DIV[U] after [D]MACC */
1376 CONFLICT (MACC, DIV);
1377 CONFLICT (DMACC, DIV);
1378
1379 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1380 CONFLICT (DMULT, DMULT);
1381 CONFLICT (DMULT, DMACC);
1382 CONFLICT (DMACC, DMULT);
1383 CONFLICT (DMACC, DMACC);
1384
1385 /* Errata 24 - MT{LO,HI} after [D]MACC */
1386 CONFLICT (MACC, MTHILO);
1387 CONFLICT (DMACC, MTHILO);
1388
1389 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1390 instruction is executed immediately after a MACC or DMACC
1391 instruction, the result of [either instruction] is incorrect." */
1392 CONFLICT (MACC, MULT);
1393 CONFLICT (MACC, DMULT);
1394 CONFLICT (DMACC, MULT);
1395 CONFLICT (DMACC, DMULT);
1396
1397 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1398 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1399 DDIV or DDIVU instruction, the result of the MACC or
1400 DMACC instruction is incorrect.". */
1401 CONFLICT (DMULT, MACC);
1402 CONFLICT (DMULT, DMACC);
1403 CONFLICT (DIV, MACC);
1404 CONFLICT (DIV, DMACC);
1405
1406 #undef CONFLICT
1407 }
1408
1409 struct regname {
1410 const char *name;
1411 unsigned int num;
1412 };
1413
1414 #define RTYPE_MASK 0x1ff00
1415 #define RTYPE_NUM 0x00100
1416 #define RTYPE_FPU 0x00200
1417 #define RTYPE_FCC 0x00400
1418 #define RTYPE_VEC 0x00800
1419 #define RTYPE_GP 0x01000
1420 #define RTYPE_CP0 0x02000
1421 #define RTYPE_PC 0x04000
1422 #define RTYPE_ACC 0x08000
1423 #define RTYPE_CCC 0x10000
1424 #define RNUM_MASK 0x000ff
1425 #define RWARN 0x80000
1426
1427 #define GENERIC_REGISTER_NUMBERS \
1428 {"$0", RTYPE_NUM | 0}, \
1429 {"$1", RTYPE_NUM | 1}, \
1430 {"$2", RTYPE_NUM | 2}, \
1431 {"$3", RTYPE_NUM | 3}, \
1432 {"$4", RTYPE_NUM | 4}, \
1433 {"$5", RTYPE_NUM | 5}, \
1434 {"$6", RTYPE_NUM | 6}, \
1435 {"$7", RTYPE_NUM | 7}, \
1436 {"$8", RTYPE_NUM | 8}, \
1437 {"$9", RTYPE_NUM | 9}, \
1438 {"$10", RTYPE_NUM | 10}, \
1439 {"$11", RTYPE_NUM | 11}, \
1440 {"$12", RTYPE_NUM | 12}, \
1441 {"$13", RTYPE_NUM | 13}, \
1442 {"$14", RTYPE_NUM | 14}, \
1443 {"$15", RTYPE_NUM | 15}, \
1444 {"$16", RTYPE_NUM | 16}, \
1445 {"$17", RTYPE_NUM | 17}, \
1446 {"$18", RTYPE_NUM | 18}, \
1447 {"$19", RTYPE_NUM | 19}, \
1448 {"$20", RTYPE_NUM | 20}, \
1449 {"$21", RTYPE_NUM | 21}, \
1450 {"$22", RTYPE_NUM | 22}, \
1451 {"$23", RTYPE_NUM | 23}, \
1452 {"$24", RTYPE_NUM | 24}, \
1453 {"$25", RTYPE_NUM | 25}, \
1454 {"$26", RTYPE_NUM | 26}, \
1455 {"$27", RTYPE_NUM | 27}, \
1456 {"$28", RTYPE_NUM | 28}, \
1457 {"$29", RTYPE_NUM | 29}, \
1458 {"$30", RTYPE_NUM | 30}, \
1459 {"$31", RTYPE_NUM | 31}
1460
1461 #define FPU_REGISTER_NAMES \
1462 {"$f0", RTYPE_FPU | 0}, \
1463 {"$f1", RTYPE_FPU | 1}, \
1464 {"$f2", RTYPE_FPU | 2}, \
1465 {"$f3", RTYPE_FPU | 3}, \
1466 {"$f4", RTYPE_FPU | 4}, \
1467 {"$f5", RTYPE_FPU | 5}, \
1468 {"$f6", RTYPE_FPU | 6}, \
1469 {"$f7", RTYPE_FPU | 7}, \
1470 {"$f8", RTYPE_FPU | 8}, \
1471 {"$f9", RTYPE_FPU | 9}, \
1472 {"$f10", RTYPE_FPU | 10}, \
1473 {"$f11", RTYPE_FPU | 11}, \
1474 {"$f12", RTYPE_FPU | 12}, \
1475 {"$f13", RTYPE_FPU | 13}, \
1476 {"$f14", RTYPE_FPU | 14}, \
1477 {"$f15", RTYPE_FPU | 15}, \
1478 {"$f16", RTYPE_FPU | 16}, \
1479 {"$f17", RTYPE_FPU | 17}, \
1480 {"$f18", RTYPE_FPU | 18}, \
1481 {"$f19", RTYPE_FPU | 19}, \
1482 {"$f20", RTYPE_FPU | 20}, \
1483 {"$f21", RTYPE_FPU | 21}, \
1484 {"$f22", RTYPE_FPU | 22}, \
1485 {"$f23", RTYPE_FPU | 23}, \
1486 {"$f24", RTYPE_FPU | 24}, \
1487 {"$f25", RTYPE_FPU | 25}, \
1488 {"$f26", RTYPE_FPU | 26}, \
1489 {"$f27", RTYPE_FPU | 27}, \
1490 {"$f28", RTYPE_FPU | 28}, \
1491 {"$f29", RTYPE_FPU | 29}, \
1492 {"$f30", RTYPE_FPU | 30}, \
1493 {"$f31", RTYPE_FPU | 31}
1494
1495 #define FPU_CONDITION_CODE_NAMES \
1496 {"$fcc0", RTYPE_FCC | 0}, \
1497 {"$fcc1", RTYPE_FCC | 1}, \
1498 {"$fcc2", RTYPE_FCC | 2}, \
1499 {"$fcc3", RTYPE_FCC | 3}, \
1500 {"$fcc4", RTYPE_FCC | 4}, \
1501 {"$fcc5", RTYPE_FCC | 5}, \
1502 {"$fcc6", RTYPE_FCC | 6}, \
1503 {"$fcc7", RTYPE_FCC | 7}
1504
1505 #define COPROC_CONDITION_CODE_NAMES \
1506 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1507 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1508 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1509 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1510 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1511 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1512 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1513 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1514
1515 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1516 {"$a4", RTYPE_GP | 8}, \
1517 {"$a5", RTYPE_GP | 9}, \
1518 {"$a6", RTYPE_GP | 10}, \
1519 {"$a7", RTYPE_GP | 11}, \
1520 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1521 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1522 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1523 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1524 {"$t0", RTYPE_GP | 12}, \
1525 {"$t1", RTYPE_GP | 13}, \
1526 {"$t2", RTYPE_GP | 14}, \
1527 {"$t3", RTYPE_GP | 15}
1528
1529 #define O32_SYMBOLIC_REGISTER_NAMES \
1530 {"$t0", RTYPE_GP | 8}, \
1531 {"$t1", RTYPE_GP | 9}, \
1532 {"$t2", RTYPE_GP | 10}, \
1533 {"$t3", RTYPE_GP | 11}, \
1534 {"$t4", RTYPE_GP | 12}, \
1535 {"$t5", RTYPE_GP | 13}, \
1536 {"$t6", RTYPE_GP | 14}, \
1537 {"$t7", RTYPE_GP | 15}, \
1538 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1539 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1540 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1541 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1542
1543 /* Remaining symbolic register names */
1544 #define SYMBOLIC_REGISTER_NAMES \
1545 {"$zero", RTYPE_GP | 0}, \
1546 {"$at", RTYPE_GP | 1}, \
1547 {"$AT", RTYPE_GP | 1}, \
1548 {"$v0", RTYPE_GP | 2}, \
1549 {"$v1", RTYPE_GP | 3}, \
1550 {"$a0", RTYPE_GP | 4}, \
1551 {"$a1", RTYPE_GP | 5}, \
1552 {"$a2", RTYPE_GP | 6}, \
1553 {"$a3", RTYPE_GP | 7}, \
1554 {"$s0", RTYPE_GP | 16}, \
1555 {"$s1", RTYPE_GP | 17}, \
1556 {"$s2", RTYPE_GP | 18}, \
1557 {"$s3", RTYPE_GP | 19}, \
1558 {"$s4", RTYPE_GP | 20}, \
1559 {"$s5", RTYPE_GP | 21}, \
1560 {"$s6", RTYPE_GP | 22}, \
1561 {"$s7", RTYPE_GP | 23}, \
1562 {"$t8", RTYPE_GP | 24}, \
1563 {"$t9", RTYPE_GP | 25}, \
1564 {"$k0", RTYPE_GP | 26}, \
1565 {"$kt0", RTYPE_GP | 26}, \
1566 {"$k1", RTYPE_GP | 27}, \
1567 {"$kt1", RTYPE_GP | 27}, \
1568 {"$gp", RTYPE_GP | 28}, \
1569 {"$sp", RTYPE_GP | 29}, \
1570 {"$s8", RTYPE_GP | 30}, \
1571 {"$fp", RTYPE_GP | 30}, \
1572 {"$ra", RTYPE_GP | 31}
1573
1574 #define MIPS16_SPECIAL_REGISTER_NAMES \
1575 {"$pc", RTYPE_PC | 0}
1576
1577 #define MDMX_VECTOR_REGISTER_NAMES \
1578 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1579 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1580 {"$v2", RTYPE_VEC | 2}, \
1581 {"$v3", RTYPE_VEC | 3}, \
1582 {"$v4", RTYPE_VEC | 4}, \
1583 {"$v5", RTYPE_VEC | 5}, \
1584 {"$v6", RTYPE_VEC | 6}, \
1585 {"$v7", RTYPE_VEC | 7}, \
1586 {"$v8", RTYPE_VEC | 8}, \
1587 {"$v9", RTYPE_VEC | 9}, \
1588 {"$v10", RTYPE_VEC | 10}, \
1589 {"$v11", RTYPE_VEC | 11}, \
1590 {"$v12", RTYPE_VEC | 12}, \
1591 {"$v13", RTYPE_VEC | 13}, \
1592 {"$v14", RTYPE_VEC | 14}, \
1593 {"$v15", RTYPE_VEC | 15}, \
1594 {"$v16", RTYPE_VEC | 16}, \
1595 {"$v17", RTYPE_VEC | 17}, \
1596 {"$v18", RTYPE_VEC | 18}, \
1597 {"$v19", RTYPE_VEC | 19}, \
1598 {"$v20", RTYPE_VEC | 20}, \
1599 {"$v21", RTYPE_VEC | 21}, \
1600 {"$v22", RTYPE_VEC | 22}, \
1601 {"$v23", RTYPE_VEC | 23}, \
1602 {"$v24", RTYPE_VEC | 24}, \
1603 {"$v25", RTYPE_VEC | 25}, \
1604 {"$v26", RTYPE_VEC | 26}, \
1605 {"$v27", RTYPE_VEC | 27}, \
1606 {"$v28", RTYPE_VEC | 28}, \
1607 {"$v29", RTYPE_VEC | 29}, \
1608 {"$v30", RTYPE_VEC | 30}, \
1609 {"$v31", RTYPE_VEC | 31}
1610
1611 #define MIPS_DSP_ACCUMULATOR_NAMES \
1612 {"$ac0", RTYPE_ACC | 0}, \
1613 {"$ac1", RTYPE_ACC | 1}, \
1614 {"$ac2", RTYPE_ACC | 2}, \
1615 {"$ac3", RTYPE_ACC | 3}
1616
1617 static const struct regname reg_names[] = {
1618 GENERIC_REGISTER_NUMBERS,
1619 FPU_REGISTER_NAMES,
1620 FPU_CONDITION_CODE_NAMES,
1621 COPROC_CONDITION_CODE_NAMES,
1622
1623 /* The $txx registers depends on the abi,
1624 these will be added later into the symbol table from
1625 one of the tables below once mips_abi is set after
1626 parsing of arguments from the command line. */
1627 SYMBOLIC_REGISTER_NAMES,
1628
1629 MIPS16_SPECIAL_REGISTER_NAMES,
1630 MDMX_VECTOR_REGISTER_NAMES,
1631 MIPS_DSP_ACCUMULATOR_NAMES,
1632 {0, 0}
1633 };
1634
1635 static const struct regname reg_names_o32[] = {
1636 O32_SYMBOLIC_REGISTER_NAMES,
1637 {0, 0}
1638 };
1639
1640 static const struct regname reg_names_n32n64[] = {
1641 N32N64_SYMBOLIC_REGISTER_NAMES,
1642 {0, 0}
1643 };
1644
1645 static int
1646 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1647 {
1648 symbolS *symbolP;
1649 char *e;
1650 char save_c;
1651 int reg = -1;
1652
1653 /* Find end of name. */
1654 e = *s;
1655 if (is_name_beginner (*e))
1656 ++e;
1657 while (is_part_of_name (*e))
1658 ++e;
1659
1660 /* Terminate name. */
1661 save_c = *e;
1662 *e = '\0';
1663
1664 /* Look for a register symbol. */
1665 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1666 {
1667 int r = S_GET_VALUE (symbolP);
1668 if (r & types)
1669 reg = r & RNUM_MASK;
1670 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1671 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1672 reg = (r & RNUM_MASK) - 2;
1673 }
1674 /* Else see if this is a register defined in an itbl entry. */
1675 else if ((types & RTYPE_GP) && itbl_have_entries)
1676 {
1677 char *n = *s;
1678 unsigned long r;
1679
1680 if (*n == '$')
1681 ++n;
1682 if (itbl_get_reg_val (n, &r))
1683 reg = r & RNUM_MASK;
1684 }
1685
1686 /* Advance to next token if a register was recognised. */
1687 if (reg >= 0)
1688 *s = e;
1689 else if (types & RWARN)
1690 as_warn ("Unrecognized register name `%s'", *s);
1691
1692 *e = save_c;
1693 if (regnop)
1694 *regnop = reg;
1695 return reg >= 0;
1696 }
1697
1698 /* This function is called once, at assembler startup time. It should set up
1699 all the tables, etc. that the MD part of the assembler will need. */
1700
1701 void
1702 md_begin (void)
1703 {
1704 register const char *retval = NULL;
1705 int i = 0;
1706 int broken = 0;
1707
1708 if (mips_pic != NO_PIC)
1709 {
1710 if (g_switch_seen && g_switch_value != 0)
1711 as_bad (_("-G may not be used in position-independent code"));
1712 g_switch_value = 0;
1713 }
1714
1715 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1716 as_warn (_("Could not set architecture and machine"));
1717
1718 op_hash = hash_new ();
1719
1720 for (i = 0; i < NUMOPCODES;)
1721 {
1722 const char *name = mips_opcodes[i].name;
1723
1724 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1725 if (retval != NULL)
1726 {
1727 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1728 mips_opcodes[i].name, retval);
1729 /* Probably a memory allocation problem? Give up now. */
1730 as_fatal (_("Broken assembler. No assembly attempted."));
1731 }
1732 do
1733 {
1734 if (mips_opcodes[i].pinfo != INSN_MACRO)
1735 {
1736 if (!validate_mips_insn (&mips_opcodes[i]))
1737 broken = 1;
1738 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1739 {
1740 create_insn (&nop_insn, mips_opcodes + i);
1741 nop_insn.fixed_p = 1;
1742 }
1743 }
1744 ++i;
1745 }
1746 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1747 }
1748
1749 mips16_op_hash = hash_new ();
1750
1751 i = 0;
1752 while (i < bfd_mips16_num_opcodes)
1753 {
1754 const char *name = mips16_opcodes[i].name;
1755
1756 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1757 if (retval != NULL)
1758 as_fatal (_("internal: can't hash `%s': %s"),
1759 mips16_opcodes[i].name, retval);
1760 do
1761 {
1762 if (mips16_opcodes[i].pinfo != INSN_MACRO
1763 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1764 != mips16_opcodes[i].match))
1765 {
1766 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1767 mips16_opcodes[i].name, mips16_opcodes[i].args);
1768 broken = 1;
1769 }
1770 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1771 {
1772 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1773 mips16_nop_insn.fixed_p = 1;
1774 }
1775 ++i;
1776 }
1777 while (i < bfd_mips16_num_opcodes
1778 && strcmp (mips16_opcodes[i].name, name) == 0);
1779 }
1780
1781 if (broken)
1782 as_fatal (_("Broken assembler. No assembly attempted."));
1783
1784 /* We add all the general register names to the symbol table. This
1785 helps us detect invalid uses of them. */
1786 for (i = 0; reg_names[i].name; i++)
1787 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1788 reg_names[i].num, // & RNUM_MASK,
1789 &zero_address_frag));
1790 if (HAVE_NEWABI)
1791 for (i = 0; reg_names_n32n64[i].name; i++)
1792 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1793 reg_names_n32n64[i].num, // & RNUM_MASK,
1794 &zero_address_frag));
1795 else
1796 for (i = 0; reg_names_o32[i].name; i++)
1797 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1798 reg_names_o32[i].num, // & RNUM_MASK,
1799 &zero_address_frag));
1800
1801 mips_no_prev_insn ();
1802
1803 mips_gprmask = 0;
1804 mips_cprmask[0] = 0;
1805 mips_cprmask[1] = 0;
1806 mips_cprmask[2] = 0;
1807 mips_cprmask[3] = 0;
1808
1809 /* set the default alignment for the text section (2**2) */
1810 record_alignment (text_section, 2);
1811
1812 bfd_set_gp_size (stdoutput, g_switch_value);
1813
1814 #ifdef OBJ_ELF
1815 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1816 {
1817 /* On a native system other than VxWorks, sections must be aligned
1818 to 16 byte boundaries. When configured for an embedded ELF
1819 target, we don't bother. */
1820 if (strcmp (TARGET_OS, "elf") != 0
1821 && strcmp (TARGET_OS, "vxworks") != 0)
1822 {
1823 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1824 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1825 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1826 }
1827
1828 /* Create a .reginfo section for register masks and a .mdebug
1829 section for debugging information. */
1830 {
1831 segT seg;
1832 subsegT subseg;
1833 flagword flags;
1834 segT sec;
1835
1836 seg = now_seg;
1837 subseg = now_subseg;
1838
1839 /* The ABI says this section should be loaded so that the
1840 running program can access it. However, we don't load it
1841 if we are configured for an embedded target */
1842 flags = SEC_READONLY | SEC_DATA;
1843 if (strcmp (TARGET_OS, "elf") != 0)
1844 flags |= SEC_ALLOC | SEC_LOAD;
1845
1846 if (mips_abi != N64_ABI)
1847 {
1848 sec = subseg_new (".reginfo", (subsegT) 0);
1849
1850 bfd_set_section_flags (stdoutput, sec, flags);
1851 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1852
1853 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1854 }
1855 else
1856 {
1857 /* The 64-bit ABI uses a .MIPS.options section rather than
1858 .reginfo section. */
1859 sec = subseg_new (".MIPS.options", (subsegT) 0);
1860 bfd_set_section_flags (stdoutput, sec, flags);
1861 bfd_set_section_alignment (stdoutput, sec, 3);
1862
1863 /* Set up the option header. */
1864 {
1865 Elf_Internal_Options opthdr;
1866 char *f;
1867
1868 opthdr.kind = ODK_REGINFO;
1869 opthdr.size = (sizeof (Elf_External_Options)
1870 + sizeof (Elf64_External_RegInfo));
1871 opthdr.section = 0;
1872 opthdr.info = 0;
1873 f = frag_more (sizeof (Elf_External_Options));
1874 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1875 (Elf_External_Options *) f);
1876
1877 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1878 }
1879 }
1880
1881 if (ECOFF_DEBUGGING)
1882 {
1883 sec = subseg_new (".mdebug", (subsegT) 0);
1884 (void) bfd_set_section_flags (stdoutput, sec,
1885 SEC_HAS_CONTENTS | SEC_READONLY);
1886 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1887 }
1888 else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1889 {
1890 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1891 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1892 SEC_READONLY | SEC_RELOC
1893 | SEC_DEBUGGING);
1894 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1895 }
1896
1897 subseg_set (seg, subseg);
1898 }
1899 }
1900 #endif /* OBJ_ELF */
1901
1902 if (! ECOFF_DEBUGGING)
1903 md_obj_begin ();
1904
1905 if (mips_fix_vr4120)
1906 init_vr4120_conflicts ();
1907 }
1908
1909 void
1910 md_mips_end (void)
1911 {
1912 if (! ECOFF_DEBUGGING)
1913 md_obj_end ();
1914 }
1915
1916 void
1917 md_assemble (char *str)
1918 {
1919 struct mips_cl_insn insn;
1920 bfd_reloc_code_real_type unused_reloc[3]
1921 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1922
1923 imm_expr.X_op = O_absent;
1924 imm2_expr.X_op = O_absent;
1925 offset_expr.X_op = O_absent;
1926 imm_reloc[0] = BFD_RELOC_UNUSED;
1927 imm_reloc[1] = BFD_RELOC_UNUSED;
1928 imm_reloc[2] = BFD_RELOC_UNUSED;
1929 offset_reloc[0] = BFD_RELOC_UNUSED;
1930 offset_reloc[1] = BFD_RELOC_UNUSED;
1931 offset_reloc[2] = BFD_RELOC_UNUSED;
1932
1933 if (mips_opts.mips16)
1934 mips16_ip (str, &insn);
1935 else
1936 {
1937 mips_ip (str, &insn);
1938 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1939 str, insn.insn_opcode));
1940 }
1941
1942 if (insn_error)
1943 {
1944 as_bad ("%s `%s'", insn_error, str);
1945 return;
1946 }
1947
1948 if (insn.insn_mo->pinfo == INSN_MACRO)
1949 {
1950 macro_start ();
1951 if (mips_opts.mips16)
1952 mips16_macro (&insn);
1953 else
1954 macro (&insn);
1955 macro_end ();
1956 }
1957 else
1958 {
1959 if (imm_expr.X_op != O_absent)
1960 append_insn (&insn, &imm_expr, imm_reloc);
1961 else if (offset_expr.X_op != O_absent)
1962 append_insn (&insn, &offset_expr, offset_reloc);
1963 else
1964 append_insn (&insn, NULL, unused_reloc);
1965 }
1966 }
1967
1968 /* Return true if the given relocation might need a matching %lo().
1969 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
1970 need a matching %lo() when applied to local symbols. */
1971
1972 static inline bfd_boolean
1973 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1974 {
1975 return (HAVE_IN_PLACE_ADDENDS
1976 && (reloc == BFD_RELOC_HI16_S
1977 || reloc == BFD_RELOC_MIPS16_HI16_S
1978 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
1979 all GOT16 relocations evaluate to "G". */
1980 || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
1981 }
1982
1983 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1984 relocation. */
1985
1986 static inline bfd_boolean
1987 fixup_has_matching_lo_p (fixS *fixp)
1988 {
1989 return (fixp->fx_next != NULL
1990 && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1991 || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
1992 && fixp->fx_addsy == fixp->fx_next->fx_addsy
1993 && fixp->fx_offset == fixp->fx_next->fx_offset);
1994 }
1995
1996 /* See whether instruction IP reads register REG. CLASS is the type
1997 of register. */
1998
1999 static int
2000 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2001 enum mips_regclass class)
2002 {
2003 if (class == MIPS16_REG)
2004 {
2005 assert (mips_opts.mips16);
2006 reg = mips16_to_32_reg_map[reg];
2007 class = MIPS_GR_REG;
2008 }
2009
2010 /* Don't report on general register ZERO, since it never changes. */
2011 if (class == MIPS_GR_REG && reg == ZERO)
2012 return 0;
2013
2014 if (class == MIPS_FP_REG)
2015 {
2016 assert (! mips_opts.mips16);
2017 /* If we are called with either $f0 or $f1, we must check $f0.
2018 This is not optimal, because it will introduce an unnecessary
2019 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2020 need to distinguish reading both $f0 and $f1 or just one of
2021 them. Note that we don't have to check the other way,
2022 because there is no instruction that sets both $f0 and $f1
2023 and requires a delay. */
2024 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2025 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2026 == (reg &~ (unsigned) 1)))
2027 return 1;
2028 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2029 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2030 == (reg &~ (unsigned) 1)))
2031 return 1;
2032 }
2033 else if (! mips_opts.mips16)
2034 {
2035 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2036 && EXTRACT_OPERAND (RS, *ip) == reg)
2037 return 1;
2038 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2039 && EXTRACT_OPERAND (RT, *ip) == reg)
2040 return 1;
2041 }
2042 else
2043 {
2044 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2045 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2046 return 1;
2047 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2048 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2049 return 1;
2050 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2051 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2052 == reg))
2053 return 1;
2054 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2055 return 1;
2056 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2057 return 1;
2058 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2059 return 1;
2060 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2061 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2062 return 1;
2063 }
2064
2065 return 0;
2066 }
2067
2068 /* This function returns true if modifying a register requires a
2069 delay. */
2070
2071 static int
2072 reg_needs_delay (unsigned int reg)
2073 {
2074 unsigned long prev_pinfo;
2075
2076 prev_pinfo = history[0].insn_mo->pinfo;
2077 if (! mips_opts.noreorder
2078 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2079 && ! gpr_interlocks)
2080 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2081 && ! cop_interlocks)))
2082 {
2083 /* A load from a coprocessor or from memory. All load delays
2084 delay the use of general register rt for one instruction. */
2085 /* Itbl support may require additional care here. */
2086 know (prev_pinfo & INSN_WRITE_GPR_T);
2087 if (reg == EXTRACT_OPERAND (RT, history[0]))
2088 return 1;
2089 }
2090
2091 return 0;
2092 }
2093
2094 /* Move all labels in insn_labels to the current insertion point. */
2095
2096 static void
2097 mips_move_labels (void)
2098 {
2099 struct insn_label_list *l;
2100 valueT val;
2101
2102 for (l = insn_labels; l != NULL; l = l->next)
2103 {
2104 assert (S_GET_SEGMENT (l->label) == now_seg);
2105 symbol_set_frag (l->label, frag_now);
2106 val = (valueT) frag_now_fix ();
2107 /* mips16 text labels are stored as odd. */
2108 if (mips_opts.mips16)
2109 ++val;
2110 S_SET_VALUE (l->label, val);
2111 }
2112 }
2113
2114 /* Mark instruction labels in mips16 mode. This permits the linker to
2115 handle them specially, such as generating jalx instructions when
2116 needed. We also make them odd for the duration of the assembly, in
2117 order to generate the right sort of code. We will make them even
2118 in the adjust_symtab routine, while leaving them marked. This is
2119 convenient for the debugger and the disassembler. The linker knows
2120 to make them odd again. */
2121
2122 static void
2123 mips16_mark_labels (void)
2124 {
2125 if (mips_opts.mips16)
2126 {
2127 struct insn_label_list *l;
2128 valueT val;
2129
2130 for (l = insn_labels; l != NULL; l = l->next)
2131 {
2132 #ifdef OBJ_ELF
2133 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
2134 S_SET_OTHER (l->label, STO_MIPS16);
2135 #endif
2136 val = S_GET_VALUE (l->label);
2137 if ((val & 1) == 0)
2138 S_SET_VALUE (l->label, val + 1);
2139 }
2140 }
2141 }
2142
2143 /* End the current frag. Make it a variant frag and record the
2144 relaxation info. */
2145
2146 static void
2147 relax_close_frag (void)
2148 {
2149 mips_macro_warning.first_frag = frag_now;
2150 frag_var (rs_machine_dependent, 0, 0,
2151 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2152 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2153
2154 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2155 mips_relax.first_fixup = 0;
2156 }
2157
2158 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2159 See the comment above RELAX_ENCODE for more details. */
2160
2161 static void
2162 relax_start (symbolS *symbol)
2163 {
2164 assert (mips_relax.sequence == 0);
2165 mips_relax.sequence = 1;
2166 mips_relax.symbol = symbol;
2167 }
2168
2169 /* Start generating the second version of a relaxable sequence.
2170 See the comment above RELAX_ENCODE for more details. */
2171
2172 static void
2173 relax_switch (void)
2174 {
2175 assert (mips_relax.sequence == 1);
2176 mips_relax.sequence = 2;
2177 }
2178
2179 /* End the current relaxable sequence. */
2180
2181 static void
2182 relax_end (void)
2183 {
2184 assert (mips_relax.sequence == 2);
2185 relax_close_frag ();
2186 mips_relax.sequence = 0;
2187 }
2188
2189 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2190 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2191 by VR4120 errata. */
2192
2193 static unsigned int
2194 classify_vr4120_insn (const char *name)
2195 {
2196 if (strncmp (name, "macc", 4) == 0)
2197 return FIX_VR4120_MACC;
2198 if (strncmp (name, "dmacc", 5) == 0)
2199 return FIX_VR4120_DMACC;
2200 if (strncmp (name, "mult", 4) == 0)
2201 return FIX_VR4120_MULT;
2202 if (strncmp (name, "dmult", 5) == 0)
2203 return FIX_VR4120_DMULT;
2204 if (strstr (name, "div"))
2205 return FIX_VR4120_DIV;
2206 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2207 return FIX_VR4120_MTHILO;
2208 return NUM_FIX_VR4120_CLASSES;
2209 }
2210
2211 /* Return the number of instructions that must separate INSN1 and INSN2,
2212 where INSN1 is the earlier instruction. Return the worst-case value
2213 for any INSN2 if INSN2 is null. */
2214
2215 static unsigned int
2216 insns_between (const struct mips_cl_insn *insn1,
2217 const struct mips_cl_insn *insn2)
2218 {
2219 unsigned long pinfo1, pinfo2;
2220
2221 /* This function needs to know which pinfo flags are set for INSN2
2222 and which registers INSN2 uses. The former is stored in PINFO2 and
2223 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2224 will have every flag set and INSN2_USES_REG will always return true. */
2225 pinfo1 = insn1->insn_mo->pinfo;
2226 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2227
2228 #define INSN2_USES_REG(REG, CLASS) \
2229 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2230
2231 /* For most targets, write-after-read dependencies on the HI and LO
2232 registers must be separated by at least two instructions. */
2233 if (!hilo_interlocks)
2234 {
2235 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2236 return 2;
2237 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2238 return 2;
2239 }
2240
2241 /* If we're working around r7000 errata, there must be two instructions
2242 between an mfhi or mflo and any instruction that uses the result. */
2243 if (mips_7000_hilo_fix
2244 && MF_HILO_INSN (pinfo1)
2245 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2246 return 2;
2247
2248 /* If working around VR4120 errata, check for combinations that need
2249 a single intervening instruction. */
2250 if (mips_fix_vr4120)
2251 {
2252 unsigned int class1, class2;
2253
2254 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2255 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2256 {
2257 if (insn2 == NULL)
2258 return 1;
2259 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2260 if (vr4120_conflicts[class1] & (1 << class2))
2261 return 1;
2262 }
2263 }
2264
2265 if (!mips_opts.mips16)
2266 {
2267 /* Check for GPR or coprocessor load delays. All such delays
2268 are on the RT register. */
2269 /* Itbl support may require additional care here. */
2270 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2271 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2272 {
2273 know (pinfo1 & INSN_WRITE_GPR_T);
2274 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2275 return 1;
2276 }
2277
2278 /* Check for generic coprocessor hazards.
2279
2280 This case is not handled very well. There is no special
2281 knowledge of CP0 handling, and the coprocessors other than
2282 the floating point unit are not distinguished at all. */
2283 /* Itbl support may require additional care here. FIXME!
2284 Need to modify this to include knowledge about
2285 user specified delays! */
2286 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2287 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2288 {
2289 /* Handle cases where INSN1 writes to a known general coprocessor
2290 register. There must be a one instruction delay before INSN2
2291 if INSN2 reads that register, otherwise no delay is needed. */
2292 if (pinfo1 & INSN_WRITE_FPR_T)
2293 {
2294 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2295 return 1;
2296 }
2297 else if (pinfo1 & INSN_WRITE_FPR_S)
2298 {
2299 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2300 return 1;
2301 }
2302 else
2303 {
2304 /* Read-after-write dependencies on the control registers
2305 require a two-instruction gap. */
2306 if ((pinfo1 & INSN_WRITE_COND_CODE)
2307 && (pinfo2 & INSN_READ_COND_CODE))
2308 return 2;
2309
2310 /* We don't know exactly what INSN1 does. If INSN2 is
2311 also a coprocessor instruction, assume there must be
2312 a one instruction gap. */
2313 if (pinfo2 & INSN_COP)
2314 return 1;
2315 }
2316 }
2317
2318 /* Check for read-after-write dependencies on the coprocessor
2319 control registers in cases where INSN1 does not need a general
2320 coprocessor delay. This means that INSN1 is a floating point
2321 comparison instruction. */
2322 /* Itbl support may require additional care here. */
2323 else if (!cop_interlocks
2324 && (pinfo1 & INSN_WRITE_COND_CODE)
2325 && (pinfo2 & INSN_READ_COND_CODE))
2326 return 1;
2327 }
2328
2329 #undef INSN2_USES_REG
2330
2331 return 0;
2332 }
2333
2334 /* Return the number of nops that would be needed to work around the
2335 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2336 the MAX_VR4130_NOPS instructions described by HISTORY. */
2337
2338 static int
2339 nops_for_vr4130 (const struct mips_cl_insn *history,
2340 const struct mips_cl_insn *insn)
2341 {
2342 int i, j, reg;
2343
2344 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2345 are not affected by the errata. */
2346 if (insn != 0
2347 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2348 || strcmp (insn->insn_mo->name, "mtlo") == 0
2349 || strcmp (insn->insn_mo->name, "mthi") == 0))
2350 return 0;
2351
2352 /* Search for the first MFLO or MFHI. */
2353 for (i = 0; i < MAX_VR4130_NOPS; i++)
2354 if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2355 {
2356 /* Extract the destination register. */
2357 if (mips_opts.mips16)
2358 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2359 else
2360 reg = EXTRACT_OPERAND (RD, history[i]);
2361
2362 /* No nops are needed if INSN reads that register. */
2363 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2364 return 0;
2365
2366 /* ...or if any of the intervening instructions do. */
2367 for (j = 0; j < i; j++)
2368 if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2369 return 0;
2370
2371 return MAX_VR4130_NOPS - i;
2372 }
2373 return 0;
2374 }
2375
2376 /* Return the number of nops that would be needed if instruction INSN
2377 immediately followed the MAX_NOPS instructions given by HISTORY,
2378 where HISTORY[0] is the most recent instruction. If INSN is null,
2379 return the worse-case number of nops for any instruction. */
2380
2381 static int
2382 nops_for_insn (const struct mips_cl_insn *history,
2383 const struct mips_cl_insn *insn)
2384 {
2385 int i, nops, tmp_nops;
2386
2387 nops = 0;
2388 for (i = 0; i < MAX_DELAY_NOPS; i++)
2389 if (!history[i].noreorder_p)
2390 {
2391 tmp_nops = insns_between (history + i, insn) - i;
2392 if (tmp_nops > nops)
2393 nops = tmp_nops;
2394 }
2395
2396 if (mips_fix_vr4130)
2397 {
2398 tmp_nops = nops_for_vr4130 (history, insn);
2399 if (tmp_nops > nops)
2400 nops = tmp_nops;
2401 }
2402
2403 return nops;
2404 }
2405
2406 /* The variable arguments provide NUM_INSNS extra instructions that
2407 might be added to HISTORY. Return the largest number of nops that
2408 would be needed after the extended sequence. */
2409
2410 static int
2411 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2412 {
2413 va_list args;
2414 struct mips_cl_insn buffer[MAX_NOPS];
2415 struct mips_cl_insn *cursor;
2416 int nops;
2417
2418 va_start (args, history);
2419 cursor = buffer + num_insns;
2420 memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2421 while (cursor > buffer)
2422 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2423
2424 nops = nops_for_insn (buffer, NULL);
2425 va_end (args);
2426 return nops;
2427 }
2428
2429 /* Like nops_for_insn, but if INSN is a branch, take into account the
2430 worst-case delay for the branch target. */
2431
2432 static int
2433 nops_for_insn_or_target (const struct mips_cl_insn *history,
2434 const struct mips_cl_insn *insn)
2435 {
2436 int nops, tmp_nops;
2437
2438 nops = nops_for_insn (history, insn);
2439 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2440 | INSN_COND_BRANCH_DELAY
2441 | INSN_COND_BRANCH_LIKELY))
2442 {
2443 tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2444 if (tmp_nops > nops)
2445 nops = tmp_nops;
2446 }
2447 else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2448 {
2449 tmp_nops = nops_for_sequence (1, history, insn);
2450 if (tmp_nops > nops)
2451 nops = tmp_nops;
2452 }
2453 return nops;
2454 }
2455
2456 /* Output an instruction. IP is the instruction information.
2457 ADDRESS_EXPR is an operand of the instruction to be used with
2458 RELOC_TYPE. */
2459
2460 static void
2461 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2462 bfd_reloc_code_real_type *reloc_type)
2463 {
2464 register unsigned long prev_pinfo, pinfo;
2465 relax_stateT prev_insn_frag_type = 0;
2466 bfd_boolean relaxed_branch = FALSE;
2467
2468 /* Mark instruction labels in mips16 mode. */
2469 mips16_mark_labels ();
2470
2471 prev_pinfo = history[0].insn_mo->pinfo;
2472 pinfo = ip->insn_mo->pinfo;
2473
2474 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2475 {
2476 /* There are a lot of optimizations we could do that we don't.
2477 In particular, we do not, in general, reorder instructions.
2478 If you use gcc with optimization, it will reorder
2479 instructions and generally do much more optimization then we
2480 do here; repeating all that work in the assembler would only
2481 benefit hand written assembly code, and does not seem worth
2482 it. */
2483 int nops = (mips_optimize == 0
2484 ? nops_for_insn (history, NULL)
2485 : nops_for_insn_or_target (history, ip));
2486 if (nops > 0)
2487 {
2488 fragS *old_frag;
2489 unsigned long old_frag_offset;
2490 int i;
2491
2492 old_frag = frag_now;
2493 old_frag_offset = frag_now_fix ();
2494
2495 for (i = 0; i < nops; i++)
2496 emit_nop ();
2497
2498 if (listing)
2499 {
2500 listing_prev_line ();
2501 /* We may be at the start of a variant frag. In case we
2502 are, make sure there is enough space for the frag
2503 after the frags created by listing_prev_line. The
2504 argument to frag_grow here must be at least as large
2505 as the argument to all other calls to frag_grow in
2506 this file. We don't have to worry about being in the
2507 middle of a variant frag, because the variants insert
2508 all needed nop instructions themselves. */
2509 frag_grow (40);
2510 }
2511
2512 mips_move_labels ();
2513
2514 #ifndef NO_ECOFF_DEBUGGING
2515 if (ECOFF_DEBUGGING)
2516 ecoff_fix_loc (old_frag, old_frag_offset);
2517 #endif
2518 }
2519 }
2520 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2521 {
2522 /* Work out how many nops in prev_nop_frag are needed by IP. */
2523 int nops = nops_for_insn_or_target (history, ip);
2524 assert (nops <= prev_nop_frag_holds);
2525
2526 /* Enforce NOPS as a minimum. */
2527 if (nops > prev_nop_frag_required)
2528 prev_nop_frag_required = nops;
2529
2530 if (prev_nop_frag_holds == prev_nop_frag_required)
2531 {
2532 /* Settle for the current number of nops. Update the history
2533 accordingly (for the benefit of any future .set reorder code). */
2534 prev_nop_frag = NULL;
2535 insert_into_history (prev_nop_frag_since,
2536 prev_nop_frag_holds, NOP_INSN);
2537 }
2538 else
2539 {
2540 /* Allow this instruction to replace one of the nops that was
2541 tentatively added to prev_nop_frag. */
2542 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2543 prev_nop_frag_holds--;
2544 prev_nop_frag_since++;
2545 }
2546 }
2547
2548 #ifdef OBJ_ELF
2549 /* The value passed to dwarf2_emit_insn is the distance between
2550 the beginning of the current instruction and the address that
2551 should be recorded in the debug tables. For MIPS16 debug info
2552 we want to use ISA-encoded addresses, so we pass -1 for an
2553 address higher by one than the current. */
2554 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2555 #endif
2556
2557 /* Record the frag type before frag_var. */
2558 if (history[0].frag)
2559 prev_insn_frag_type = history[0].frag->fr_type;
2560
2561 if (address_expr
2562 && *reloc_type == BFD_RELOC_16_PCREL_S2
2563 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2564 || pinfo & INSN_COND_BRANCH_LIKELY)
2565 && mips_relax_branch
2566 /* Don't try branch relaxation within .set nomacro, or within
2567 .set noat if we use $at for PIC computations. If it turns
2568 out that the branch was out-of-range, we'll get an error. */
2569 && !mips_opts.warn_about_macros
2570 && !(mips_opts.noat && mips_pic != NO_PIC)
2571 && !mips_opts.mips16)
2572 {
2573 relaxed_branch = TRUE;
2574 add_relaxed_insn (ip, (relaxed_branch_length
2575 (NULL, NULL,
2576 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2577 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2578 : 0)), 4,
2579 RELAX_BRANCH_ENCODE
2580 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2581 pinfo & INSN_COND_BRANCH_LIKELY,
2582 pinfo & INSN_WRITE_GPR_31,
2583 0),
2584 address_expr->X_add_symbol,
2585 address_expr->X_add_number);
2586 *reloc_type = BFD_RELOC_UNUSED;
2587 }
2588 else if (*reloc_type > BFD_RELOC_UNUSED)
2589 {
2590 /* We need to set up a variant frag. */
2591 assert (mips_opts.mips16 && address_expr != NULL);
2592 add_relaxed_insn (ip, 4, 0,
2593 RELAX_MIPS16_ENCODE
2594 (*reloc_type - BFD_RELOC_UNUSED,
2595 mips16_small, mips16_ext,
2596 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2597 history[0].mips16_absolute_jump_p),
2598 make_expr_symbol (address_expr), 0);
2599 }
2600 else if (mips_opts.mips16
2601 && ! ip->use_extend
2602 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2603 {
2604 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2605 /* Make sure there is enough room to swap this instruction with
2606 a following jump instruction. */
2607 frag_grow (6);
2608 add_fixed_insn (ip);
2609 }
2610 else
2611 {
2612 if (mips_opts.mips16
2613 && mips_opts.noreorder
2614 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2615 as_warn (_("extended instruction in delay slot"));
2616
2617 if (mips_relax.sequence)
2618 {
2619 /* If we've reached the end of this frag, turn it into a variant
2620 frag and record the information for the instructions we've
2621 written so far. */
2622 if (frag_room () < 4)
2623 relax_close_frag ();
2624 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2625 }
2626
2627 if (mips_relax.sequence != 2)
2628 mips_macro_warning.sizes[0] += 4;
2629 if (mips_relax.sequence != 1)
2630 mips_macro_warning.sizes[1] += 4;
2631
2632 if (mips_opts.mips16)
2633 {
2634 ip->fixed_p = 1;
2635 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2636 }
2637 add_fixed_insn (ip);
2638 }
2639
2640 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2641 {
2642 if (address_expr->X_op == O_constant)
2643 {
2644 unsigned int tmp;
2645
2646 switch (*reloc_type)
2647 {
2648 case BFD_RELOC_32:
2649 ip->insn_opcode |= address_expr->X_add_number;
2650 break;
2651
2652 case BFD_RELOC_MIPS_HIGHEST:
2653 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2654 ip->insn_opcode |= tmp & 0xffff;
2655 break;
2656
2657 case BFD_RELOC_MIPS_HIGHER:
2658 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2659 ip->insn_opcode |= tmp & 0xffff;
2660 break;
2661
2662 case BFD_RELOC_HI16_S:
2663 tmp = (address_expr->X_add_number + 0x8000) >> 16;
2664 ip->insn_opcode |= tmp & 0xffff;
2665 break;
2666
2667 case BFD_RELOC_HI16:
2668 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2669 break;
2670
2671 case BFD_RELOC_UNUSED:
2672 case BFD_RELOC_LO16:
2673 case BFD_RELOC_MIPS_GOT_DISP:
2674 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2675 break;
2676
2677 case BFD_RELOC_MIPS_JMP:
2678 if ((address_expr->X_add_number & 3) != 0)
2679 as_bad (_("jump to misaligned address (0x%lx)"),
2680 (unsigned long) address_expr->X_add_number);
2681 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2682 break;
2683
2684 case BFD_RELOC_MIPS16_JMP:
2685 if ((address_expr->X_add_number & 3) != 0)
2686 as_bad (_("jump to misaligned address (0x%lx)"),
2687 (unsigned long) address_expr->X_add_number);
2688 ip->insn_opcode |=
2689 (((address_expr->X_add_number & 0x7c0000) << 3)
2690 | ((address_expr->X_add_number & 0xf800000) >> 7)
2691 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2692 break;
2693
2694 case BFD_RELOC_16_PCREL_S2:
2695 if ((address_expr->X_add_number & 3) != 0)
2696 as_bad (_("branch to misaligned address (0x%lx)"),
2697 (unsigned long) address_expr->X_add_number);
2698 if (mips_relax_branch)
2699 goto need_reloc;
2700 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2701 as_bad (_("branch address range overflow (0x%lx)"),
2702 (unsigned long) address_expr->X_add_number);
2703 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2704 break;
2705
2706 default:
2707 internalError ();
2708 }
2709 }
2710 else if (*reloc_type < BFD_RELOC_UNUSED)
2711 need_reloc:
2712 {
2713 reloc_howto_type *howto;
2714 int i;
2715
2716 /* In a compound relocation, it is the final (outermost)
2717 operator that determines the relocated field. */
2718 for (i = 1; i < 3; i++)
2719 if (reloc_type[i] == BFD_RELOC_UNUSED)
2720 break;
2721
2722 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2723 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2724 bfd_get_reloc_size (howto),
2725 address_expr,
2726 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2727 reloc_type[0]);
2728
2729 /* These relocations can have an addend that won't fit in
2730 4 octets for 64bit assembly. */
2731 if (HAVE_64BIT_GPRS
2732 && ! howto->partial_inplace
2733 && (reloc_type[0] == BFD_RELOC_16
2734 || reloc_type[0] == BFD_RELOC_32
2735 || reloc_type[0] == BFD_RELOC_MIPS_JMP
2736 || reloc_type[0] == BFD_RELOC_HI16_S
2737 || reloc_type[0] == BFD_RELOC_LO16
2738 || reloc_type[0] == BFD_RELOC_GPREL16
2739 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2740 || reloc_type[0] == BFD_RELOC_GPREL32
2741 || reloc_type[0] == BFD_RELOC_64
2742 || reloc_type[0] == BFD_RELOC_CTOR
2743 || reloc_type[0] == BFD_RELOC_MIPS_SUB
2744 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2745 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2746 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2747 || reloc_type[0] == BFD_RELOC_MIPS_REL16
2748 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2749 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2750 || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2751 || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2752 ip->fixp[0]->fx_no_overflow = 1;
2753
2754 if (mips_relax.sequence)
2755 {
2756 if (mips_relax.first_fixup == 0)
2757 mips_relax.first_fixup = ip->fixp[0];
2758 }
2759 else if (reloc_needs_lo_p (*reloc_type))
2760 {
2761 struct mips_hi_fixup *hi_fixup;
2762
2763 /* Reuse the last entry if it already has a matching %lo. */
2764 hi_fixup = mips_hi_fixup_list;
2765 if (hi_fixup == 0
2766 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2767 {
2768 hi_fixup = ((struct mips_hi_fixup *)
2769 xmalloc (sizeof (struct mips_hi_fixup)));
2770 hi_fixup->next = mips_hi_fixup_list;
2771 mips_hi_fixup_list = hi_fixup;
2772 }
2773 hi_fixup->fixp = ip->fixp[0];
2774 hi_fixup->seg = now_seg;
2775 }
2776
2777 /* Add fixups for the second and third relocations, if given.
2778 Note that the ABI allows the second relocation to be
2779 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
2780 moment we only use RSS_UNDEF, but we could add support
2781 for the others if it ever becomes necessary. */
2782 for (i = 1; i < 3; i++)
2783 if (reloc_type[i] != BFD_RELOC_UNUSED)
2784 {
2785 ip->fixp[i] = fix_new (ip->frag, ip->where,
2786 ip->fixp[0]->fx_size, NULL, 0,
2787 FALSE, reloc_type[i]);
2788
2789 /* Use fx_tcbit to mark compound relocs. */
2790 ip->fixp[0]->fx_tcbit = 1;
2791 ip->fixp[i]->fx_tcbit = 1;
2792 }
2793 }
2794 }
2795 install_insn (ip);
2796
2797 /* Update the register mask information. */
2798 if (! mips_opts.mips16)
2799 {
2800 if (pinfo & INSN_WRITE_GPR_D)
2801 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2802 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2803 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2804 if (pinfo & INSN_READ_GPR_S)
2805 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2806 if (pinfo & INSN_WRITE_GPR_31)
2807 mips_gprmask |= 1 << RA;
2808 if (pinfo & INSN_WRITE_FPR_D)
2809 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2810 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2811 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2812 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2813 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2814 if ((pinfo & INSN_READ_FPR_R) != 0)
2815 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2816 if (pinfo & INSN_COP)
2817 {
2818 /* We don't keep enough information to sort these cases out.
2819 The itbl support does keep this information however, although
2820 we currently don't support itbl fprmats as part of the cop
2821 instruction. May want to add this support in the future. */
2822 }
2823 /* Never set the bit for $0, which is always zero. */
2824 mips_gprmask &= ~1 << 0;
2825 }
2826 else
2827 {
2828 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2829 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2830 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2831 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2832 if (pinfo & MIPS16_INSN_WRITE_Z)
2833 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2834 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2835 mips_gprmask |= 1 << TREG;
2836 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2837 mips_gprmask |= 1 << SP;
2838 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2839 mips_gprmask |= 1 << RA;
2840 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2841 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2842 if (pinfo & MIPS16_INSN_READ_Z)
2843 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2844 if (pinfo & MIPS16_INSN_READ_GPR_X)
2845 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2846 }
2847
2848 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2849 {
2850 /* Filling the branch delay slot is more complex. We try to
2851 switch the branch with the previous instruction, which we can
2852 do if the previous instruction does not set up a condition
2853 that the branch tests and if the branch is not itself the
2854 target of any branch. */
2855 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2856 || (pinfo & INSN_COND_BRANCH_DELAY))
2857 {
2858 if (mips_optimize < 2
2859 /* If we have seen .set volatile or .set nomove, don't
2860 optimize. */
2861 || mips_opts.nomove != 0
2862 /* We can't swap if the previous instruction's position
2863 is fixed. */
2864 || history[0].fixed_p
2865 /* If the previous previous insn was in a .set
2866 noreorder, we can't swap. Actually, the MIPS
2867 assembler will swap in this situation. However, gcc
2868 configured -with-gnu-as will generate code like
2869 .set noreorder
2870 lw $4,XXX
2871 .set reorder
2872 INSN
2873 bne $4,$0,foo
2874 in which we can not swap the bne and INSN. If gcc is
2875 not configured -with-gnu-as, it does not output the
2876 .set pseudo-ops. */
2877 || history[1].noreorder_p
2878 /* If the branch is itself the target of a branch, we
2879 can not swap. We cheat on this; all we check for is
2880 whether there is a label on this instruction. If
2881 there are any branches to anything other than a
2882 label, users must use .set noreorder. */
2883 || insn_labels != NULL
2884 /* If the previous instruction is in a variant frag
2885 other than this branch's one, we cannot do the swap.
2886 This does not apply to the mips16, which uses variant
2887 frags for different purposes. */
2888 || (! mips_opts.mips16
2889 && prev_insn_frag_type == rs_machine_dependent)
2890 /* Check for conflicts between the branch and the instructions
2891 before the candidate delay slot. */
2892 || nops_for_insn (history + 1, ip) > 0
2893 /* Check for conflicts between the swapped sequence and the
2894 target of the branch. */
2895 || nops_for_sequence (2, history + 1, ip, history) > 0
2896 /* We do not swap with a trap instruction, since it
2897 complicates trap handlers to have the trap
2898 instruction be in a delay slot. */
2899 || (prev_pinfo & INSN_TRAP)
2900 /* If the branch reads a register that the previous
2901 instruction sets, we can not swap. */
2902 || (! mips_opts.mips16
2903 && (prev_pinfo & INSN_WRITE_GPR_T)
2904 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2905 MIPS_GR_REG))
2906 || (! mips_opts.mips16
2907 && (prev_pinfo & INSN_WRITE_GPR_D)
2908 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
2909 MIPS_GR_REG))
2910 || (mips_opts.mips16
2911 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2912 && (insn_uses_reg
2913 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
2914 MIPS16_REG)))
2915 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2916 && (insn_uses_reg
2917 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
2918 MIPS16_REG)))
2919 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2920 && (insn_uses_reg
2921 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
2922 MIPS16_REG)))
2923 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2924 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2925 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2926 && insn_uses_reg (ip, RA, MIPS_GR_REG))
2927 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2928 && insn_uses_reg (ip,
2929 MIPS16OP_EXTRACT_REG32R
2930 (history[0].insn_opcode),
2931 MIPS_GR_REG))))
2932 /* If the branch writes a register that the previous
2933 instruction sets, we can not swap (we know that
2934 branches write only to RD or to $31). */
2935 || (! mips_opts.mips16
2936 && (prev_pinfo & INSN_WRITE_GPR_T)
2937 && (((pinfo & INSN_WRITE_GPR_D)
2938 && (EXTRACT_OPERAND (RT, history[0])
2939 == EXTRACT_OPERAND (RD, *ip)))
2940 || ((pinfo & INSN_WRITE_GPR_31)
2941 && EXTRACT_OPERAND (RT, history[0]) == RA)))
2942 || (! mips_opts.mips16
2943 && (prev_pinfo & INSN_WRITE_GPR_D)
2944 && (((pinfo & INSN_WRITE_GPR_D)
2945 && (EXTRACT_OPERAND (RD, history[0])
2946 == EXTRACT_OPERAND (RD, *ip)))
2947 || ((pinfo & INSN_WRITE_GPR_31)
2948 && EXTRACT_OPERAND (RD, history[0]) == RA)))
2949 || (mips_opts.mips16
2950 && (pinfo & MIPS16_INSN_WRITE_31)
2951 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2952 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2953 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
2954 == RA))))
2955 /* If the branch writes a register that the previous
2956 instruction reads, we can not swap (we know that
2957 branches only write to RD or to $31). */
2958 || (! mips_opts.mips16
2959 && (pinfo & INSN_WRITE_GPR_D)
2960 && insn_uses_reg (&history[0],
2961 EXTRACT_OPERAND (RD, *ip),
2962 MIPS_GR_REG))
2963 || (! mips_opts.mips16
2964 && (pinfo & INSN_WRITE_GPR_31)
2965 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2966 || (mips_opts.mips16
2967 && (pinfo & MIPS16_INSN_WRITE_31)
2968 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
2969 /* If one instruction sets a condition code and the
2970 other one uses a condition code, we can not swap. */
2971 || ((pinfo & INSN_READ_COND_CODE)
2972 && (prev_pinfo & INSN_WRITE_COND_CODE))
2973 || ((pinfo & INSN_WRITE_COND_CODE)
2974 && (prev_pinfo & INSN_READ_COND_CODE))
2975 /* If the previous instruction uses the PC, we can not
2976 swap. */
2977 || (mips_opts.mips16
2978 && (prev_pinfo & MIPS16_INSN_READ_PC))
2979 /* If the previous instruction had a fixup in mips16
2980 mode, we can not swap. This normally means that the
2981 previous instruction was a 4 byte branch anyhow. */
2982 || (mips_opts.mips16 && history[0].fixp[0])
2983 /* If the previous instruction is a sync, sync.l, or
2984 sync.p, we can not swap. */
2985 || (prev_pinfo & INSN_SYNC))
2986 {
2987 if (mips_opts.mips16
2988 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
2989 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
2990 && (mips_opts.isa == ISA_MIPS32
2991 || mips_opts.isa == ISA_MIPS32R2
2992 || mips_opts.isa == ISA_MIPS64
2993 || mips_opts.isa == ISA_MIPS64R2))
2994 {
2995 /* Convert MIPS16 jr/jalr into a "compact" jump. */
2996 ip->insn_opcode |= 0x0080;
2997 install_insn (ip);
2998 insert_into_history (0, 1, ip);
2999 }
3000 else
3001 {
3002 /* We could do even better for unconditional branches to
3003 portions of this object file; we could pick up the
3004 instruction at the destination, put it in the delay
3005 slot, and bump the destination address. */
3006 insert_into_history (0, 1, ip);
3007 emit_nop ();
3008 }
3009
3010 if (mips_relax.sequence)
3011 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3012 }
3013 else
3014 {
3015 /* It looks like we can actually do the swap. */
3016 struct mips_cl_insn delay = history[0];
3017 if (mips_opts.mips16)
3018 {
3019 know (delay.frag == ip->frag);
3020 move_insn (ip, delay.frag, delay.where);
3021 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3022 }
3023 else if (relaxed_branch)
3024 {
3025 /* Add the delay slot instruction to the end of the
3026 current frag and shrink the fixed part of the
3027 original frag. If the branch occupies the tail of
3028 the latter, move it backwards to cover the gap. */
3029 delay.frag->fr_fix -= 4;
3030 if (delay.frag == ip->frag)
3031 move_insn (ip, ip->frag, ip->where - 4);
3032 add_fixed_insn (&delay);
3033 }
3034 else
3035 {
3036 move_insn (&delay, ip->frag, ip->where);
3037 move_insn (ip, history[0].frag, history[0].where);
3038 }
3039 history[0] = *ip;
3040 delay.fixed_p = 1;
3041 insert_into_history (0, 1, &delay);
3042 }
3043
3044 /* If that was an unconditional branch, forget the previous
3045 insn information. */
3046 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3047 mips_no_prev_insn ();
3048 }
3049 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3050 {
3051 /* We don't yet optimize a branch likely. What we should do
3052 is look at the target, copy the instruction found there
3053 into the delay slot, and increment the branch to jump to
3054 the next instruction. */
3055 insert_into_history (0, 1, ip);
3056 emit_nop ();
3057 }
3058 else
3059 insert_into_history (0, 1, ip);
3060 }
3061 else
3062 insert_into_history (0, 1, ip);
3063
3064 /* We just output an insn, so the next one doesn't have a label. */
3065 mips_clear_insn_labels ();
3066 }
3067
3068 /* Forget that there was any previous instruction or label. */
3069
3070 static void
3071 mips_no_prev_insn (void)
3072 {
3073 prev_nop_frag = NULL;
3074 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3075 mips_clear_insn_labels ();
3076 }
3077
3078 /* This function must be called before we emit something other than
3079 instructions. It is like mips_no_prev_insn except that it inserts
3080 any NOPS that might be needed by previous instructions. */
3081
3082 void
3083 mips_emit_delays (void)
3084 {
3085 if (! mips_opts.noreorder)
3086 {
3087 int nops = nops_for_insn (history, NULL);
3088 if (nops > 0)
3089 {
3090 while (nops-- > 0)
3091 add_fixed_insn (NOP_INSN);
3092 mips_move_labels ();
3093 }
3094 }
3095 mips_no_prev_insn ();
3096 }
3097
3098 /* Start a (possibly nested) noreorder block. */
3099
3100 static void
3101 start_noreorder (void)
3102 {
3103 if (mips_opts.noreorder == 0)
3104 {
3105 unsigned int i;
3106 int nops;
3107
3108 /* None of the instructions before the .set noreorder can be moved. */
3109 for (i = 0; i < ARRAY_SIZE (history); i++)
3110 history[i].fixed_p = 1;
3111
3112 /* Insert any nops that might be needed between the .set noreorder
3113 block and the previous instructions. We will later remove any
3114 nops that turn out not to be needed. */
3115 nops = nops_for_insn (history, NULL);
3116 if (nops > 0)
3117 {
3118 if (mips_optimize != 0)
3119 {
3120 /* Record the frag which holds the nop instructions, so
3121 that we can remove them if we don't need them. */
3122 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3123 prev_nop_frag = frag_now;
3124 prev_nop_frag_holds = nops;
3125 prev_nop_frag_required = 0;
3126 prev_nop_frag_since = 0;
3127 }
3128
3129 for (; nops > 0; --nops)
3130 add_fixed_insn (NOP_INSN);
3131
3132 /* Move on to a new frag, so that it is safe to simply
3133 decrease the size of prev_nop_frag. */
3134 frag_wane (frag_now);
3135 frag_new (0);
3136 mips_move_labels ();
3137 }
3138 mips16_mark_labels ();
3139 mips_clear_insn_labels ();
3140 }
3141 mips_opts.noreorder++;
3142 mips_any_noreorder = 1;
3143 }
3144
3145 /* End a nested noreorder block. */
3146
3147 static void
3148 end_noreorder (void)
3149 {
3150 mips_opts.noreorder--;
3151 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3152 {
3153 /* Commit to inserting prev_nop_frag_required nops and go back to
3154 handling nop insertion the .set reorder way. */
3155 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3156 * (mips_opts.mips16 ? 2 : 4));
3157 insert_into_history (prev_nop_frag_since,
3158 prev_nop_frag_required, NOP_INSN);
3159 prev_nop_frag = NULL;
3160 }
3161 }
3162
3163 /* Set up global variables for the start of a new macro. */
3164
3165 static void
3166 macro_start (void)
3167 {
3168 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3169 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3170 && (history[0].insn_mo->pinfo
3171 & (INSN_UNCOND_BRANCH_DELAY
3172 | INSN_COND_BRANCH_DELAY
3173 | INSN_COND_BRANCH_LIKELY)) != 0);
3174 }
3175
3176 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3177 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3178 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3179
3180 static const char *
3181 macro_warning (relax_substateT subtype)
3182 {
3183 if (subtype & RELAX_DELAY_SLOT)
3184 return _("Macro instruction expanded into multiple instructions"
3185 " in a branch delay slot");
3186 else if (subtype & RELAX_NOMACRO)
3187 return _("Macro instruction expanded into multiple instructions");
3188 else
3189 return 0;
3190 }
3191
3192 /* Finish up a macro. Emit warnings as appropriate. */
3193
3194 static void
3195 macro_end (void)
3196 {
3197 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3198 {
3199 relax_substateT subtype;
3200
3201 /* Set up the relaxation warning flags. */
3202 subtype = 0;
3203 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3204 subtype |= RELAX_SECOND_LONGER;
3205 if (mips_opts.warn_about_macros)
3206 subtype |= RELAX_NOMACRO;
3207 if (mips_macro_warning.delay_slot_p)
3208 subtype |= RELAX_DELAY_SLOT;
3209
3210 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3211 {
3212 /* Either the macro has a single implementation or both
3213 implementations are longer than 4 bytes. Emit the
3214 warning now. */
3215 const char *msg = macro_warning (subtype);
3216 if (msg != 0)
3217 as_warn (msg);
3218 }
3219 else
3220 {
3221 /* One implementation might need a warning but the other
3222 definitely doesn't. */
3223 mips_macro_warning.first_frag->fr_subtype |= subtype;
3224 }
3225 }
3226 }
3227
3228 /* Read a macro's relocation codes from *ARGS and store them in *R.
3229 The first argument in *ARGS will be either the code for a single
3230 relocation or -1 followed by the three codes that make up a
3231 composite relocation. */
3232
3233 static void
3234 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3235 {
3236 int i, next;
3237
3238 next = va_arg (*args, int);
3239 if (next >= 0)
3240 r[0] = (bfd_reloc_code_real_type) next;
3241 else
3242 for (i = 0; i < 3; i++)
3243 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3244 }
3245
3246 /* Build an instruction created by a macro expansion. This is passed
3247 a pointer to the count of instructions created so far, an
3248 expression, the name of the instruction to build, an operand format
3249 string, and corresponding arguments. */
3250
3251 static void
3252 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3253 {
3254 const struct mips_opcode *mo;
3255 struct mips_cl_insn insn;
3256 bfd_reloc_code_real_type r[3];
3257 va_list args;
3258
3259 va_start (args, fmt);
3260
3261 if (mips_opts.mips16)
3262 {
3263 mips16_macro_build (ep, name, fmt, args);
3264 va_end (args);
3265 return;
3266 }
3267
3268 r[0] = BFD_RELOC_UNUSED;
3269 r[1] = BFD_RELOC_UNUSED;
3270 r[2] = BFD_RELOC_UNUSED;
3271 mo = (struct mips_opcode *) hash_find (op_hash, name);
3272 assert (mo);
3273 assert (strcmp (name, mo->name) == 0);
3274
3275 /* Search until we get a match for NAME. It is assumed here that
3276 macros will never generate MDMX or MIPS-3D instructions. */
3277 while (strcmp (fmt, mo->args) != 0
3278 || mo->pinfo == INSN_MACRO
3279 || !OPCODE_IS_MEMBER (mo,
3280 (mips_opts.isa
3281 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3282 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3283 mips_opts.arch)
3284 || (mips_opts.arch == CPU_R4650 && (mo->pinfo & FP_D) != 0))
3285 {
3286 ++mo;
3287 assert (mo->name);
3288 assert (strcmp (name, mo->name) == 0);
3289 }
3290
3291 create_insn (&insn, mo);
3292 for (;;)
3293 {
3294 switch (*fmt++)
3295 {
3296 case '\0':
3297 break;
3298
3299 case ',':
3300 case '(':
3301 case ')':
3302 continue;
3303
3304 case '+':
3305 switch (*fmt++)
3306 {
3307 case 'A':
3308 case 'E':
3309 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3310 continue;
3311
3312 case 'B':
3313 case 'F':
3314 /* Note that in the macro case, these arguments are already
3315 in MSB form. (When handling the instruction in the
3316 non-macro case, these arguments are sizes from which
3317 MSB values must be calculated.) */
3318 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3319 continue;
3320
3321 case 'C':
3322 case 'G':
3323 case 'H':
3324 /* Note that in the macro case, these arguments are already
3325 in MSBD form. (When handling the instruction in the
3326 non-macro case, these arguments are sizes from which
3327 MSBD values must be calculated.) */
3328 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3329 continue;
3330
3331 default:
3332 internalError ();
3333 }
3334 continue;
3335
3336 case 't':
3337 case 'w':
3338 case 'E':
3339 INSERT_OPERAND (RT, insn, va_arg (args, int));
3340 continue;
3341
3342 case 'c':
3343 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3344 continue;
3345
3346 case 'T':
3347 case 'W':
3348 INSERT_OPERAND (FT, insn, va_arg (args, int));
3349 continue;
3350
3351 case 'd':
3352 case 'G':
3353 case 'K':
3354 INSERT_OPERAND (RD, insn, va_arg (args, int));
3355 continue;
3356
3357 case 'U':
3358 {
3359 int tmp = va_arg (args, int);
3360
3361 INSERT_OPERAND (RT, insn, tmp);
3362 INSERT_OPERAND (RD, insn, tmp);
3363 continue;
3364 }
3365
3366 case 'V':
3367 case 'S':
3368 INSERT_OPERAND (FS, insn, va_arg (args, int));
3369 continue;
3370
3371 case 'z':
3372 continue;
3373
3374 case '<':
3375 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3376 continue;
3377
3378 case 'D':
3379 INSERT_OPERAND (FD, insn, va_arg (args, int));
3380 continue;
3381
3382 case 'B':
3383 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3384 continue;
3385
3386 case 'J':
3387 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3388 continue;
3389
3390 case 'q':
3391 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3392 continue;
3393
3394 case 'b':
3395 case 's':
3396 case 'r':
3397 case 'v':
3398 INSERT_OPERAND (RS, insn, va_arg (args, int));
3399 continue;
3400
3401 case 'i':
3402 case 'j':
3403 case 'o':
3404 macro_read_relocs (&args, r);
3405 assert (*r == BFD_RELOC_GPREL16
3406 || *r == BFD_RELOC_MIPS_LITERAL
3407 || *r == BFD_RELOC_MIPS_HIGHER
3408 || *r == BFD_RELOC_HI16_S
3409 || *r == BFD_RELOC_LO16
3410 || *r == BFD_RELOC_MIPS_GOT16
3411 || *r == BFD_RELOC_MIPS_CALL16
3412 || *r == BFD_RELOC_MIPS_GOT_DISP
3413 || *r == BFD_RELOC_MIPS_GOT_PAGE
3414 || *r == BFD_RELOC_MIPS_GOT_OFST
3415 || *r == BFD_RELOC_MIPS_GOT_LO16
3416 || *r == BFD_RELOC_MIPS_CALL_LO16);
3417 continue;
3418
3419 case 'u':
3420 macro_read_relocs (&args, r);
3421 assert (ep != NULL
3422 && (ep->X_op == O_constant
3423 || (ep->X_op == O_symbol
3424 && (*r == BFD_RELOC_MIPS_HIGHEST
3425 || *r == BFD_RELOC_HI16_S
3426 || *r == BFD_RELOC_HI16
3427 || *r == BFD_RELOC_GPREL16
3428 || *r == BFD_RELOC_MIPS_GOT_HI16
3429 || *r == BFD_RELOC_MIPS_CALL_HI16))));
3430 continue;
3431
3432 case 'p':
3433 assert (ep != NULL);
3434
3435 /*
3436 * This allows macro() to pass an immediate expression for
3437 * creating short branches without creating a symbol.
3438 *
3439 * We don't allow branch relaxation for these branches, as
3440 * they should only appear in ".set nomacro" anyway.
3441 */
3442 if (ep->X_op == O_constant)
3443 {
3444 if ((ep->X_add_number & 3) != 0)
3445 as_bad (_("branch to misaligned address (0x%lx)"),
3446 (unsigned long) ep->X_add_number);
3447 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3448 as_bad (_("branch address range overflow (0x%lx)"),
3449 (unsigned long) ep->X_add_number);
3450 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3451 ep = NULL;
3452 }
3453 else
3454 *r = BFD_RELOC_16_PCREL_S2;
3455 continue;
3456
3457 case 'a':
3458 assert (ep != NULL);
3459 *r = BFD_RELOC_MIPS_JMP;
3460 continue;
3461
3462 case 'C':
3463 insn.insn_opcode |= va_arg (args, unsigned long);
3464 continue;
3465
3466 case 'k':
3467 insn.insn_opcode |= va_arg (args, unsigned long) << OP_SH_CACHE;
3468 continue;
3469
3470 default:
3471 internalError ();
3472 }
3473 break;
3474 }
3475 va_end (args);
3476 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3477
3478 append_insn (&insn, ep, r);
3479 }
3480
3481 static void
3482 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3483 va_list args)
3484 {
3485 struct mips_opcode *mo;
3486 struct mips_cl_insn insn;
3487 bfd_reloc_code_real_type r[3]
3488 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3489
3490 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3491 assert (mo);
3492 assert (strcmp (name, mo->name) == 0);
3493
3494 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3495 {
3496 ++mo;
3497 assert (mo->name);
3498 assert (strcmp (name, mo->name) == 0);
3499 }
3500
3501 create_insn (&insn, mo);
3502 for (;;)
3503 {
3504 int c;
3505
3506 c = *fmt++;
3507 switch (c)
3508 {
3509 case '\0':
3510 break;
3511
3512 case ',':
3513 case '(':
3514 case ')':
3515 continue;
3516
3517 case 'y':
3518 case 'w':
3519 MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3520 continue;
3521
3522 case 'x':
3523 case 'v':
3524 MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3525 continue;
3526
3527 case 'z':
3528 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3529 continue;
3530
3531 case 'Z':
3532 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3533 continue;
3534
3535 case '0':
3536 case 'S':
3537 case 'P':
3538 case 'R':
3539 continue;
3540
3541 case 'X':
3542 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3543 continue;
3544
3545 case 'Y':
3546 {
3547 int regno;
3548
3549 regno = va_arg (args, int);
3550 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3551 insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3552 }
3553 continue;
3554
3555 case '<':
3556 case '>':
3557 case '4':
3558 case '5':
3559 case 'H':
3560 case 'W':
3561 case 'D':
3562 case 'j':
3563 case '8':
3564 case 'V':
3565 case 'C':
3566 case 'U':
3567 case 'k':
3568 case 'K':
3569 case 'p':
3570 case 'q':
3571 {
3572 assert (ep != NULL);
3573
3574 if (ep->X_op != O_constant)
3575 *r = (int) BFD_RELOC_UNUSED + c;
3576 else
3577 {
3578 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3579 FALSE, &insn.insn_opcode, &insn.use_extend,
3580 &insn.extend);
3581 ep = NULL;
3582 *r = BFD_RELOC_UNUSED;
3583 }
3584 }
3585 continue;
3586
3587 case '6':
3588 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3589 continue;
3590 }
3591
3592 break;
3593 }
3594
3595 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3596
3597 append_insn (&insn, ep, r);
3598 }
3599
3600 /*
3601 * Sign-extend 32-bit mode constants that have bit 31 set and all
3602 * higher bits unset.
3603 */
3604 static void
3605 normalize_constant_expr (expressionS *ex)
3606 {
3607 if (ex->X_op == O_constant
3608 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3609 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3610 - 0x80000000);
3611 }
3612
3613 /*
3614 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3615 * all higher bits unset.
3616 */
3617 static void
3618 normalize_address_expr (expressionS *ex)
3619 {
3620 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3621 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3622 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3623 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3624 - 0x80000000);
3625 }
3626
3627 /*
3628 * Generate a "jalr" instruction with a relocation hint to the called
3629 * function. This occurs in NewABI PIC code.
3630 */
3631 static void
3632 macro_build_jalr (expressionS *ep)
3633 {
3634 char *f = NULL;
3635
3636 if (HAVE_NEWABI)
3637 {
3638 frag_grow (8);
3639 f = frag_more (0);
3640 }
3641 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3642 if (HAVE_NEWABI)
3643 fix_new_exp (frag_now, f - frag_now->fr_literal,
3644 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3645 }
3646
3647 /*
3648 * Generate a "lui" instruction.
3649 */
3650 static void
3651 macro_build_lui (expressionS *ep, int regnum)
3652 {
3653 expressionS high_expr;
3654 const struct mips_opcode *mo;
3655 struct mips_cl_insn insn;
3656 bfd_reloc_code_real_type r[3]
3657 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3658 const char *name = "lui";
3659 const char *fmt = "t,u";
3660
3661 assert (! mips_opts.mips16);
3662
3663 high_expr = *ep;
3664
3665 if (high_expr.X_op == O_constant)
3666 {
3667 /* we can compute the instruction now without a relocation entry */
3668 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3669 >> 16) & 0xffff;
3670 *r = BFD_RELOC_UNUSED;
3671 }
3672 else
3673 {
3674 assert (ep->X_op == O_symbol);
3675 /* _gp_disp is a special case, used from s_cpload.
3676 __gnu_local_gp is used if mips_no_shared. */
3677 assert (mips_pic == NO_PIC
3678 || (! HAVE_NEWABI
3679 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3680 || (! mips_in_shared
3681 && strcmp (S_GET_NAME (ep->X_add_symbol),
3682 "__gnu_local_gp") == 0));
3683 *r = BFD_RELOC_HI16_S;
3684 }
3685
3686 mo = hash_find (op_hash, name);
3687 assert (strcmp (name, mo->name) == 0);
3688 assert (strcmp (fmt, mo->args) == 0);
3689 create_insn (&insn, mo);
3690
3691 insn.insn_opcode = insn.insn_mo->match;
3692 INSERT_OPERAND (RT, insn, regnum);
3693 if (*r == BFD_RELOC_UNUSED)
3694 {
3695 insn.insn_opcode |= high_expr.X_add_number;
3696 append_insn (&insn, NULL, r);
3697 }
3698 else
3699 append_insn (&insn, &high_expr, r);
3700 }
3701
3702 /* Generate a sequence of instructions to do a load or store from a constant
3703 offset off of a base register (breg) into/from a target register (treg),
3704 using AT if necessary. */
3705 static void
3706 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3707 int treg, int breg, int dbl)
3708 {
3709 assert (ep->X_op == O_constant);
3710
3711 /* Sign-extending 32-bit constants makes their handling easier. */
3712 if (!dbl)
3713 normalize_constant_expr (ep);
3714
3715 /* Right now, this routine can only handle signed 32-bit constants. */
3716 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3717 as_warn (_("operand overflow"));
3718
3719 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3720 {
3721 /* Signed 16-bit offset will fit in the op. Easy! */
3722 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3723 }
3724 else
3725 {
3726 /* 32-bit offset, need multiple instructions and AT, like:
3727 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3728 addu $tempreg,$tempreg,$breg
3729 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3730 to handle the complete offset. */
3731 macro_build_lui (ep, AT);
3732 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3733 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3734
3735 if (mips_opts.noat)
3736 as_bad (_("Macro used $at after \".set noat\""));
3737 }
3738 }
3739
3740 /* set_at()
3741 * Generates code to set the $at register to true (one)
3742 * if reg is less than the immediate expression.
3743 */
3744 static void
3745 set_at (int reg, int unsignedp)
3746 {
3747 if (imm_expr.X_op == O_constant
3748 && imm_expr.X_add_number >= -0x8000
3749 && imm_expr.X_add_number < 0x8000)
3750 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3751 AT, reg, BFD_RELOC_LO16);
3752 else
3753 {
3754 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3755 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3756 }
3757 }
3758
3759 /* Warn if an expression is not a constant. */
3760
3761 static void
3762 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3763 {
3764 if (ex->X_op == O_big)
3765 as_bad (_("unsupported large constant"));
3766 else if (ex->X_op != O_constant)
3767 as_bad (_("Instruction %s requires absolute expression"),
3768 ip->insn_mo->name);
3769
3770 if (HAVE_32BIT_GPRS)
3771 normalize_constant_expr (ex);
3772 }
3773
3774 /* Count the leading zeroes by performing a binary chop. This is a
3775 bulky bit of source, but performance is a LOT better for the
3776 majority of values than a simple loop to count the bits:
3777 for (lcnt = 0; (lcnt < 32); lcnt++)
3778 if ((v) & (1 << (31 - lcnt)))
3779 break;
3780 However it is not code size friendly, and the gain will drop a bit
3781 on certain cached systems.
3782 */
3783 #define COUNT_TOP_ZEROES(v) \
3784 (((v) & ~0xffff) == 0 \
3785 ? ((v) & ~0xff) == 0 \
3786 ? ((v) & ~0xf) == 0 \
3787 ? ((v) & ~0x3) == 0 \
3788 ? ((v) & ~0x1) == 0 \
3789 ? !(v) \
3790 ? 32 \
3791 : 31 \
3792 : 30 \
3793 : ((v) & ~0x7) == 0 \
3794 ? 29 \
3795 : 28 \
3796 : ((v) & ~0x3f) == 0 \
3797 ? ((v) & ~0x1f) == 0 \
3798 ? 27 \
3799 : 26 \
3800 : ((v) & ~0x7f) == 0 \
3801 ? 25 \
3802 : 24 \
3803 : ((v) & ~0xfff) == 0 \
3804 ? ((v) & ~0x3ff) == 0 \
3805 ? ((v) & ~0x1ff) == 0 \
3806 ? 23 \
3807 : 22 \
3808 : ((v) & ~0x7ff) == 0 \
3809 ? 21 \
3810 : 20 \
3811 : ((v) & ~0x3fff) == 0 \
3812 ? ((v) & ~0x1fff) == 0 \
3813 ? 19 \
3814 : 18 \
3815 : ((v) & ~0x7fff) == 0 \
3816 ? 17 \
3817 : 16 \
3818 : ((v) & ~0xffffff) == 0 \
3819 ? ((v) & ~0xfffff) == 0 \
3820 ? ((v) & ~0x3ffff) == 0 \
3821 ? ((v) & ~0x1ffff) == 0 \
3822 ? 15 \
3823 : 14 \
3824 : ((v) & ~0x7ffff) == 0 \
3825 ? 13 \
3826 : 12 \
3827 : ((v) & ~0x3fffff) == 0 \
3828 ? ((v) & ~0x1fffff) == 0 \
3829 ? 11 \
3830 : 10 \
3831 : ((v) & ~0x7fffff) == 0 \
3832 ? 9 \
3833 : 8 \
3834 : ((v) & ~0xfffffff) == 0 \
3835 ? ((v) & ~0x3ffffff) == 0 \
3836 ? ((v) & ~0x1ffffff) == 0 \
3837 ? 7 \
3838 : 6 \
3839 : ((v) & ~0x7ffffff) == 0 \
3840 ? 5 \
3841 : 4 \
3842 : ((v) & ~0x3fffffff) == 0 \
3843 ? ((v) & ~0x1fffffff) == 0 \
3844 ? 3 \
3845 : 2 \
3846 : ((v) & ~0x7fffffff) == 0 \
3847 ? 1 \
3848 : 0)
3849
3850 /* load_register()
3851 * This routine generates the least number of instructions necessary to load
3852 * an absolute expression value into a register.
3853 */
3854 static void
3855 load_register (int reg, expressionS *ep, int dbl)
3856 {
3857 int freg;
3858 expressionS hi32, lo32;
3859
3860 if (ep->X_op != O_big)
3861 {
3862 assert (ep->X_op == O_constant);
3863
3864 /* Sign-extending 32-bit constants makes their handling easier. */
3865 if (!dbl)
3866 normalize_constant_expr (ep);
3867
3868 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3869 {
3870 /* We can handle 16 bit signed values with an addiu to
3871 $zero. No need to ever use daddiu here, since $zero and
3872 the result are always correct in 32 bit mode. */
3873 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3874 return;
3875 }
3876 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3877 {
3878 /* We can handle 16 bit unsigned values with an ori to
3879 $zero. */
3880 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3881 return;
3882 }
3883 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3884 {
3885 /* 32 bit values require an lui. */
3886 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3887 if ((ep->X_add_number & 0xffff) != 0)
3888 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3889 return;
3890 }
3891 }
3892
3893 /* The value is larger than 32 bits. */
3894
3895 if (!dbl || HAVE_32BIT_GPRS)
3896 {
3897 char value[32];
3898
3899 sprintf_vma (value, ep->X_add_number);
3900 as_bad (_("Number (0x%s) larger than 32 bits"), value);
3901 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3902 return;
3903 }
3904
3905 if (ep->X_op != O_big)
3906 {
3907 hi32 = *ep;
3908 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3909 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3910 hi32.X_add_number &= 0xffffffff;
3911 lo32 = *ep;
3912 lo32.X_add_number &= 0xffffffff;
3913 }
3914 else
3915 {
3916 assert (ep->X_add_number > 2);
3917 if (ep->X_add_number == 3)
3918 generic_bignum[3] = 0;
3919 else if (ep->X_add_number > 4)
3920 as_bad (_("Number larger than 64 bits"));
3921 lo32.X_op = O_constant;
3922 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3923 hi32.X_op = O_constant;
3924 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3925 }
3926
3927 if (hi32.X_add_number == 0)
3928 freg = 0;
3929 else
3930 {
3931 int shift, bit;
3932 unsigned long hi, lo;
3933
3934 if (hi32.X_add_number == (offsetT) 0xffffffff)
3935 {
3936 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3937 {
3938 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3939 return;
3940 }
3941 if (lo32.X_add_number & 0x80000000)
3942 {
3943 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3944 if (lo32.X_add_number & 0xffff)
3945 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3946 return;
3947 }
3948 }
3949
3950 /* Check for 16bit shifted constant. We know that hi32 is
3951 non-zero, so start the mask on the first bit of the hi32
3952 value. */
3953 shift = 17;
3954 do
3955 {
3956 unsigned long himask, lomask;
3957
3958 if (shift < 32)
3959 {
3960 himask = 0xffff >> (32 - shift);
3961 lomask = (0xffff << shift) & 0xffffffff;
3962 }
3963 else
3964 {
3965 himask = 0xffff << (shift - 32);
3966 lomask = 0;
3967 }
3968 if ((hi32.X_add_number & ~(offsetT) himask) == 0
3969 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3970 {
3971 expressionS tmp;
3972
3973 tmp.X_op = O_constant;
3974 if (shift < 32)
3975 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3976 | (lo32.X_add_number >> shift));
3977 else
3978 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3979 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3980 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3981 reg, reg, (shift >= 32) ? shift - 32 : shift);
3982 return;
3983 }
3984 ++shift;
3985 }
3986 while (shift <= (64 - 16));
3987
3988 /* Find the bit number of the lowest one bit, and store the
3989 shifted value in hi/lo. */
3990 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3991 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3992 if (lo != 0)
3993 {
3994 bit = 0;
3995 while ((lo & 1) == 0)
3996 {
3997 lo >>= 1;
3998 ++bit;
3999 }
4000 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4001 hi >>= bit;
4002 }
4003 else
4004 {
4005 bit = 32;
4006 while ((hi & 1) == 0)
4007 {
4008 hi >>= 1;
4009 ++bit;
4010 }
4011 lo = hi;
4012 hi = 0;
4013 }
4014
4015 /* Optimize if the shifted value is a (power of 2) - 1. */
4016 if ((hi == 0 && ((lo + 1) & lo) == 0)
4017 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4018 {
4019 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4020 if (shift != 0)
4021 {
4022 expressionS tmp;
4023
4024 /* This instruction will set the register to be all
4025 ones. */
4026 tmp.X_op = O_constant;
4027 tmp.X_add_number = (offsetT) -1;
4028 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4029 if (bit != 0)
4030 {
4031 bit += shift;
4032 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4033 reg, reg, (bit >= 32) ? bit - 32 : bit);
4034 }
4035 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4036 reg, reg, (shift >= 32) ? shift - 32 : shift);
4037 return;
4038 }
4039 }
4040
4041 /* Sign extend hi32 before calling load_register, because we can
4042 generally get better code when we load a sign extended value. */
4043 if ((hi32.X_add_number & 0x80000000) != 0)
4044 hi32.X_add_number |= ~(offsetT) 0xffffffff;
4045 load_register (reg, &hi32, 0);
4046 freg = reg;
4047 }
4048 if ((lo32.X_add_number & 0xffff0000) == 0)
4049 {
4050 if (freg != 0)
4051 {
4052 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4053 freg = reg;
4054 }
4055 }
4056 else
4057 {
4058 expressionS mid16;
4059
4060 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4061 {
4062 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4063 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4064 return;
4065 }
4066
4067 if (freg != 0)
4068 {
4069 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4070 freg = reg;
4071 }
4072 mid16 = lo32;
4073 mid16.X_add_number >>= 16;
4074 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4075 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4076 freg = reg;
4077 }
4078 if ((lo32.X_add_number & 0xffff) != 0)
4079 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4080 }
4081
4082 static inline void
4083 load_delay_nop (void)
4084 {
4085 if (!gpr_interlocks)
4086 macro_build (NULL, "nop", "");
4087 }
4088
4089 /* Load an address into a register. */
4090
4091 static void
4092 load_address (int reg, expressionS *ep, int *used_at)
4093 {
4094 if (ep->X_op != O_constant
4095 && ep->X_op != O_symbol)
4096 {
4097 as_bad (_("expression too complex"));
4098 ep->X_op = O_constant;
4099 }
4100
4101 if (ep->X_op == O_constant)
4102 {
4103 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4104 return;
4105 }
4106
4107 if (mips_pic == NO_PIC)
4108 {
4109 /* If this is a reference to a GP relative symbol, we want
4110 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4111 Otherwise we want
4112 lui $reg,<sym> (BFD_RELOC_HI16_S)
4113 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4114 If we have an addend, we always use the latter form.
4115
4116 With 64bit address space and a usable $at we want
4117 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4118 lui $at,<sym> (BFD_RELOC_HI16_S)
4119 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4120 daddiu $at,<sym> (BFD_RELOC_LO16)
4121 dsll32 $reg,0
4122 daddu $reg,$reg,$at
4123
4124 If $at is already in use, we use a path which is suboptimal
4125 on superscalar processors.
4126 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4127 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4128 dsll $reg,16
4129 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4130 dsll $reg,16
4131 daddiu $reg,<sym> (BFD_RELOC_LO16)
4132
4133 For GP relative symbols in 64bit address space we can use
4134 the same sequence as in 32bit address space. */
4135 if (HAVE_64BIT_SYMBOLS)
4136 {
4137 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4138 && !nopic_need_relax (ep->X_add_symbol, 1))
4139 {
4140 relax_start (ep->X_add_symbol);
4141 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4142 mips_gp_register, BFD_RELOC_GPREL16);
4143 relax_switch ();
4144 }
4145
4146 if (*used_at == 0 && !mips_opts.noat)
4147 {
4148 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4149 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4150 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4151 BFD_RELOC_MIPS_HIGHER);
4152 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4153 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4154 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4155 *used_at = 1;
4156 }
4157 else
4158 {
4159 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4160 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4161 BFD_RELOC_MIPS_HIGHER);
4162 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4163 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4164 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4165 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4166 }
4167
4168 if (mips_relax.sequence)
4169 relax_end ();
4170 }
4171 else
4172 {
4173 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4174 && !nopic_need_relax (ep->X_add_symbol, 1))
4175 {
4176 relax_start (ep->X_add_symbol);
4177 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4178 mips_gp_register, BFD_RELOC_GPREL16);
4179 relax_switch ();
4180 }
4181 macro_build_lui (ep, reg);
4182 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4183 reg, reg, BFD_RELOC_LO16);
4184 if (mips_relax.sequence)
4185 relax_end ();
4186 }
4187 }
4188 else if (!mips_big_got)
4189 {
4190 expressionS ex;
4191
4192 /* If this is a reference to an external symbol, we want
4193 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4194 Otherwise we want
4195 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4196 nop
4197 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4198 If there is a constant, it must be added in after.
4199
4200 If we have NewABI, we want
4201 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4202 unless we're referencing a global symbol with a non-zero
4203 offset, in which case cst must be added separately. */
4204 if (HAVE_NEWABI)
4205 {
4206 if (ep->X_add_number)
4207 {
4208 ex.X_add_number = ep->X_add_number;
4209 ep->X_add_number = 0;
4210 relax_start (ep->X_add_symbol);
4211 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4212 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4213 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4214 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4215 ex.X_op = O_constant;
4216 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4217 reg, reg, BFD_RELOC_LO16);
4218 ep->X_add_number = ex.X_add_number;
4219 relax_switch ();
4220 }
4221 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4222 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4223 if (mips_relax.sequence)
4224 relax_end ();
4225 }
4226 else
4227 {
4228 ex.X_add_number = ep->X_add_number;
4229 ep->X_add_number = 0;
4230 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4231 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4232 load_delay_nop ();
4233 relax_start (ep->X_add_symbol);
4234 relax_switch ();
4235 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4236 BFD_RELOC_LO16);
4237 relax_end ();
4238
4239 if (ex.X_add_number != 0)
4240 {
4241 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4242 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4243 ex.X_op = O_constant;
4244 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4245 reg, reg, BFD_RELOC_LO16);
4246 }
4247 }
4248 }
4249 else if (mips_big_got)
4250 {
4251 expressionS ex;
4252
4253 /* This is the large GOT case. If this is a reference to an
4254 external symbol, we want
4255 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4256 addu $reg,$reg,$gp
4257 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4258
4259 Otherwise, for a reference to a local symbol in old ABI, we want
4260 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4261 nop
4262 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4263 If there is a constant, it must be added in after.
4264
4265 In the NewABI, for local symbols, with or without offsets, we want:
4266 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4267 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4268 */
4269 if (HAVE_NEWABI)
4270 {
4271 ex.X_add_number = ep->X_add_number;
4272 ep->X_add_number = 0;
4273 relax_start (ep->X_add_symbol);
4274 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4275 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4276 reg, reg, mips_gp_register);
4277 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4278 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4279 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4280 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4281 else if (ex.X_add_number)
4282 {
4283 ex.X_op = O_constant;
4284 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4285 BFD_RELOC_LO16);
4286 }
4287
4288 ep->X_add_number = ex.X_add_number;
4289 relax_switch ();
4290 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4291 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4292 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4293 BFD_RELOC_MIPS_GOT_OFST);
4294 relax_end ();
4295 }
4296 else
4297 {
4298 ex.X_add_number = ep->X_add_number;
4299 ep->X_add_number = 0;
4300 relax_start (ep->X_add_symbol);
4301 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4302 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4303 reg, reg, mips_gp_register);
4304 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4305 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4306 relax_switch ();
4307 if (reg_needs_delay (mips_gp_register))
4308 {
4309 /* We need a nop before loading from $gp. This special
4310 check is required because the lui which starts the main
4311 instruction stream does not refer to $gp, and so will not
4312 insert the nop which may be required. */
4313 macro_build (NULL, "nop", "");
4314 }
4315 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4316 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4317 load_delay_nop ();
4318 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4319 BFD_RELOC_LO16);
4320 relax_end ();
4321
4322 if (ex.X_add_number != 0)
4323 {
4324 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4325 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4326 ex.X_op = O_constant;
4327 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4328 BFD_RELOC_LO16);
4329 }
4330 }
4331 }
4332 else
4333 abort ();
4334
4335 if (mips_opts.noat && *used_at == 1)
4336 as_bad (_("Macro used $at after \".set noat\""));
4337 }
4338
4339 /* Move the contents of register SOURCE into register DEST. */
4340
4341 static void
4342 move_register (int dest, int source)
4343 {
4344 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4345 dest, source, 0);
4346 }
4347
4348 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4349 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4350 The two alternatives are:
4351
4352 Global symbol Local sybmol
4353 ------------- ------------
4354 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4355 ... ...
4356 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4357
4358 load_got_offset emits the first instruction and add_got_offset
4359 emits the second for a 16-bit offset or add_got_offset_hilo emits
4360 a sequence to add a 32-bit offset using a scratch register. */
4361
4362 static void
4363 load_got_offset (int dest, expressionS *local)
4364 {
4365 expressionS global;
4366
4367 global = *local;
4368 global.X_add_number = 0;
4369
4370 relax_start (local->X_add_symbol);
4371 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4372 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4373 relax_switch ();
4374 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4375 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4376 relax_end ();
4377 }
4378
4379 static void
4380 add_got_offset (int dest, expressionS *local)
4381 {
4382 expressionS global;
4383
4384 global.X_op = O_constant;
4385 global.X_op_symbol = NULL;
4386 global.X_add_symbol = NULL;
4387 global.X_add_number = local->X_add_number;
4388
4389 relax_start (local->X_add_symbol);
4390 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4391 dest, dest, BFD_RELOC_LO16);
4392 relax_switch ();
4393 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4394 relax_end ();
4395 }
4396
4397 static void
4398 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4399 {
4400 expressionS global;
4401 int hold_mips_optimize;
4402
4403 global.X_op = O_constant;
4404 global.X_op_symbol = NULL;
4405 global.X_add_symbol = NULL;
4406 global.X_add_number = local->X_add_number;
4407
4408 relax_start (local->X_add_symbol);
4409 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4410 relax_switch ();
4411 /* Set mips_optimize around the lui instruction to avoid
4412 inserting an unnecessary nop after the lw. */
4413 hold_mips_optimize = mips_optimize;
4414 mips_optimize = 2;
4415 macro_build_lui (&global, tmp);
4416 mips_optimize = hold_mips_optimize;
4417 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4418 relax_end ();
4419
4420 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4421 }
4422
4423 /*
4424 * Build macros
4425 * This routine implements the seemingly endless macro or synthesized
4426 * instructions and addressing modes in the mips assembly language. Many
4427 * of these macros are simple and are similar to each other. These could
4428 * probably be handled by some kind of table or grammar approach instead of
4429 * this verbose method. Others are not simple macros but are more like
4430 * optimizing code generation.
4431 * One interesting optimization is when several store macros appear
4432 * consecutively that would load AT with the upper half of the same address.
4433 * The ensuing load upper instructions are ommited. This implies some kind
4434 * of global optimization. We currently only optimize within a single macro.
4435 * For many of the load and store macros if the address is specified as a
4436 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4437 * first load register 'at' with zero and use it as the base register. The
4438 * mips assembler simply uses register $zero. Just one tiny optimization
4439 * we're missing.
4440 */
4441 static void
4442 macro (struct mips_cl_insn *ip)
4443 {
4444 register int treg, sreg, dreg, breg;
4445 int tempreg;
4446 int mask;
4447 int used_at = 0;
4448 expressionS expr1;
4449 const char *s;
4450 const char *s2;
4451 const char *fmt;
4452 int likely = 0;
4453 int dbl = 0;
4454 int coproc = 0;
4455 int lr = 0;
4456 int imm = 0;
4457 int call = 0;
4458 int off;
4459 offsetT maxnum;
4460 bfd_reloc_code_real_type r;
4461 int hold_mips_optimize;
4462
4463 assert (! mips_opts.mips16);
4464
4465 treg = (ip->insn_opcode >> 16) & 0x1f;
4466 dreg = (ip->insn_opcode >> 11) & 0x1f;
4467 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4468 mask = ip->insn_mo->mask;
4469
4470 expr1.X_op = O_constant;
4471 expr1.X_op_symbol = NULL;
4472 expr1.X_add_symbol = NULL;
4473 expr1.X_add_number = 1;
4474
4475 switch (mask)
4476 {
4477 case M_DABS:
4478 dbl = 1;
4479 case M_ABS:
4480 /* bgez $a0,.+12
4481 move v0,$a0
4482 sub v0,$zero,$a0
4483 */
4484
4485 start_noreorder ();
4486
4487 expr1.X_add_number = 8;
4488 macro_build (&expr1, "bgez", "s,p", sreg);
4489 if (dreg == sreg)
4490 macro_build (NULL, "nop", "", 0);
4491 else
4492 move_register (dreg, sreg);
4493 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4494
4495 end_noreorder ();
4496 break;
4497
4498 case M_ADD_I:
4499 s = "addi";
4500 s2 = "add";
4501 goto do_addi;
4502 case M_ADDU_I:
4503 s = "addiu";
4504 s2 = "addu";
4505 goto do_addi;
4506 case M_DADD_I:
4507 dbl = 1;
4508 s = "daddi";
4509 s2 = "dadd";
4510 goto do_addi;
4511 case M_DADDU_I:
4512 dbl = 1;
4513 s = "daddiu";
4514 s2 = "daddu";
4515 do_addi:
4516 if (imm_expr.X_op == O_constant
4517 && imm_expr.X_add_number >= -0x8000
4518 && imm_expr.X_add_number < 0x8000)
4519 {
4520 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4521 break;
4522 }
4523 used_at = 1;
4524 load_register (AT, &imm_expr, dbl);
4525 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4526 break;
4527
4528 case M_AND_I:
4529 s = "andi";
4530 s2 = "and";
4531 goto do_bit;
4532 case M_OR_I:
4533 s = "ori";
4534 s2 = "or";
4535 goto do_bit;
4536 case M_NOR_I:
4537 s = "";
4538 s2 = "nor";
4539 goto do_bit;
4540 case M_XOR_I:
4541 s = "xori";
4542 s2 = "xor";
4543 do_bit:
4544 if (imm_expr.X_op == O_constant
4545 && imm_expr.X_add_number >= 0
4546 && imm_expr.X_add_number < 0x10000)
4547 {
4548 if (mask != M_NOR_I)
4549 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4550 else
4551 {
4552 macro_build (&imm_expr, "ori", "t,r,i",
4553 treg, sreg, BFD_RELOC_LO16);
4554 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4555 }
4556 break;
4557 }
4558
4559 used_at = 1;
4560 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4561 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4562 break;
4563
4564 case M_BEQ_I:
4565 s = "beq";
4566 goto beq_i;
4567 case M_BEQL_I:
4568 s = "beql";
4569 likely = 1;
4570 goto beq_i;
4571 case M_BNE_I:
4572 s = "bne";
4573 goto beq_i;
4574 case M_BNEL_I:
4575 s = "bnel";
4576 likely = 1;
4577 beq_i:
4578 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4579 {
4580 macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4581 break;
4582 }
4583 used_at = 1;
4584 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4585 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4586 break;
4587
4588 case M_BGEL:
4589 likely = 1;
4590 case M_BGE:
4591 if (treg == 0)
4592 {
4593 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4594 break;
4595 }
4596 if (sreg == 0)
4597 {
4598 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4599 break;
4600 }
4601 used_at = 1;
4602 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4603 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4604 break;
4605
4606 case M_BGTL_I:
4607 likely = 1;
4608 case M_BGT_I:
4609 /* check for > max integer */
4610 maxnum = 0x7fffffff;
4611 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4612 {
4613 maxnum <<= 16;
4614 maxnum |= 0xffff;
4615 maxnum <<= 16;
4616 maxnum |= 0xffff;
4617 }
4618 if (imm_expr.X_op == O_constant
4619 && imm_expr.X_add_number >= maxnum
4620 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4621 {
4622 do_false:
4623 /* result is always false */
4624 if (! likely)
4625 macro_build (NULL, "nop", "", 0);
4626 else
4627 macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4628 break;
4629 }
4630 if (imm_expr.X_op != O_constant)
4631 as_bad (_("Unsupported large constant"));
4632 ++imm_expr.X_add_number;
4633 /* FALLTHROUGH */
4634 case M_BGE_I:
4635 case M_BGEL_I:
4636 if (mask == M_BGEL_I)
4637 likely = 1;
4638 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4639 {
4640 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4641 break;
4642 }
4643 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4644 {
4645 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4646 break;
4647 }
4648 maxnum = 0x7fffffff;
4649 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4650 {
4651 maxnum <<= 16;
4652 maxnum |= 0xffff;
4653 maxnum <<= 16;
4654 maxnum |= 0xffff;
4655 }
4656 maxnum = - maxnum - 1;
4657 if (imm_expr.X_op == O_constant
4658 && imm_expr.X_add_number <= maxnum
4659 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4660 {
4661 do_true:
4662 /* result is always true */
4663 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4664 macro_build (&offset_expr, "b", "p");
4665 break;
4666 }
4667 used_at = 1;
4668 set_at (sreg, 0);
4669 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4670 break;
4671
4672 case M_BGEUL:
4673 likely = 1;
4674 case M_BGEU:
4675 if (treg == 0)
4676 goto do_true;
4677 if (sreg == 0)
4678 {
4679 macro_build (&offset_expr, likely ? "beql" : "beq",
4680 "s,t,p", 0, treg);
4681 break;
4682 }
4683 used_at = 1;
4684 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4685 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4686 break;
4687
4688 case M_BGTUL_I:
4689 likely = 1;
4690 case M_BGTU_I:
4691 if (sreg == 0
4692 || (HAVE_32BIT_GPRS
4693 && imm_expr.X_op == O_constant
4694 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4695 goto do_false;
4696 if (imm_expr.X_op != O_constant)
4697 as_bad (_("Unsupported large constant"));
4698 ++imm_expr.X_add_number;
4699 /* FALLTHROUGH */
4700 case M_BGEU_I:
4701 case M_BGEUL_I:
4702 if (mask == M_BGEUL_I)
4703 likely = 1;
4704 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4705 goto do_true;
4706 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4707 {
4708 macro_build (&offset_expr, likely ? "bnel" : "bne",
4709 "s,t,p", sreg, 0);
4710 break;
4711 }
4712 used_at = 1;
4713 set_at (sreg, 1);
4714 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4715 break;
4716
4717 case M_BGTL:
4718 likely = 1;
4719 case M_BGT:
4720 if (treg == 0)
4721 {
4722 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4723 break;
4724 }
4725 if (sreg == 0)
4726 {
4727 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4728 break;
4729 }
4730 used_at = 1;
4731 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4732 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4733 break;
4734
4735 case M_BGTUL:
4736 likely = 1;
4737 case M_BGTU:
4738 if (treg == 0)
4739 {
4740 macro_build (&offset_expr, likely ? "bnel" : "bne",
4741 "s,t,p", sreg, 0);
4742 break;
4743 }
4744 if (sreg == 0)
4745 goto do_false;
4746 used_at = 1;
4747 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4748 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4749 break;
4750
4751 case M_BLEL:
4752 likely = 1;
4753 case M_BLE:
4754 if (treg == 0)
4755 {
4756 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4757 break;
4758 }
4759 if (sreg == 0)
4760 {
4761 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4762 break;
4763 }
4764 used_at = 1;
4765 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4766 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4767 break;
4768
4769 case M_BLEL_I:
4770 likely = 1;
4771 case M_BLE_I:
4772 maxnum = 0x7fffffff;
4773 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4774 {
4775 maxnum <<= 16;
4776 maxnum |= 0xffff;
4777 maxnum <<= 16;
4778 maxnum |= 0xffff;
4779 }
4780 if (imm_expr.X_op == O_constant
4781 && imm_expr.X_add_number >= maxnum
4782 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4783 goto do_true;
4784 if (imm_expr.X_op != O_constant)
4785 as_bad (_("Unsupported large constant"));
4786 ++imm_expr.X_add_number;
4787 /* FALLTHROUGH */
4788 case M_BLT_I:
4789 case M_BLTL_I:
4790 if (mask == M_BLTL_I)
4791 likely = 1;
4792 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4793 {
4794 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4795 break;
4796 }
4797 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4798 {
4799 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4800 break;
4801 }
4802 used_at = 1;
4803 set_at (sreg, 0);
4804 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4805 break;
4806
4807 case M_BLEUL:
4808 likely = 1;
4809 case M_BLEU:
4810 if (treg == 0)
4811 {
4812 macro_build (&offset_expr, likely ? "beql" : "beq",
4813 "s,t,p", sreg, 0);
4814 break;
4815 }
4816 if (sreg == 0)
4817 goto do_true;
4818 used_at = 1;
4819 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4820 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4821 break;
4822
4823 case M_BLEUL_I:
4824 likely = 1;
4825 case M_BLEU_I:
4826 if (sreg == 0
4827 || (HAVE_32BIT_GPRS
4828 && imm_expr.X_op == O_constant
4829 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4830 goto do_true;
4831 if (imm_expr.X_op != O_constant)
4832 as_bad (_("Unsupported large constant"));
4833 ++imm_expr.X_add_number;
4834 /* FALLTHROUGH */
4835 case M_BLTU_I:
4836 case M_BLTUL_I:
4837 if (mask == M_BLTUL_I)
4838 likely = 1;
4839 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4840 goto do_false;
4841 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4842 {
4843 macro_build (&offset_expr, likely ? "beql" : "beq",
4844 "s,t,p", sreg, 0);
4845 break;
4846 }
4847 used_at = 1;
4848 set_at (sreg, 1);
4849 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4850 break;
4851
4852 case M_BLTL:
4853 likely = 1;
4854 case M_BLT:
4855 if (treg == 0)
4856 {
4857 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4858 break;
4859 }
4860 if (sreg == 0)
4861 {
4862 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4863 break;
4864 }
4865 used_at = 1;
4866 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4867 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4868 break;
4869
4870 case M_BLTUL:
4871 likely = 1;
4872 case M_BLTU:
4873 if (treg == 0)
4874 goto do_false;
4875 if (sreg == 0)
4876 {
4877 macro_build (&offset_expr, likely ? "bnel" : "bne",
4878 "s,t,p", 0, treg);
4879 break;
4880 }
4881 used_at = 1;
4882 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4883 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4884 break;
4885
4886 case M_DEXT:
4887 {
4888 unsigned long pos;
4889 unsigned long size;
4890
4891 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4892 {
4893 as_bad (_("Unsupported large constant"));
4894 pos = size = 1;
4895 }
4896 else
4897 {
4898 pos = (unsigned long) imm_expr.X_add_number;
4899 size = (unsigned long) imm2_expr.X_add_number;
4900 }
4901
4902 if (pos > 63)
4903 {
4904 as_bad (_("Improper position (%lu)"), pos);
4905 pos = 1;
4906 }
4907 if (size == 0 || size > 64
4908 || (pos + size - 1) > 63)
4909 {
4910 as_bad (_("Improper extract size (%lu, position %lu)"),
4911 size, pos);
4912 size = 1;
4913 }
4914
4915 if (size <= 32 && pos < 32)
4916 {
4917 s = "dext";
4918 fmt = "t,r,+A,+C";
4919 }
4920 else if (size <= 32)
4921 {
4922 s = "dextu";
4923 fmt = "t,r,+E,+H";
4924 }
4925 else
4926 {
4927 s = "dextm";
4928 fmt = "t,r,+A,+G";
4929 }
4930 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4931 }
4932 break;
4933
4934 case M_DINS:
4935 {
4936 unsigned long pos;
4937 unsigned long size;
4938
4939 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4940 {
4941 as_bad (_("Unsupported large constant"));
4942 pos = size = 1;
4943 }
4944 else
4945 {
4946 pos = (unsigned long) imm_expr.X_add_number;
4947 size = (unsigned long) imm2_expr.X_add_number;
4948 }
4949
4950 if (pos > 63)
4951 {
4952 as_bad (_("Improper position (%lu)"), pos);
4953 pos = 1;
4954 }
4955 if (size == 0 || size > 64
4956 || (pos + size - 1) > 63)
4957 {
4958 as_bad (_("Improper insert size (%lu, position %lu)"),
4959 size, pos);
4960 size = 1;
4961 }
4962
4963 if (pos < 32 && (pos + size - 1) < 32)
4964 {
4965 s = "dins";
4966 fmt = "t,r,+A,+B";
4967 }
4968 else if (pos >= 32)
4969 {
4970 s = "dinsu";
4971 fmt = "t,r,+E,+F";
4972 }
4973 else
4974 {
4975 s = "dinsm";
4976 fmt = "t,r,+A,+F";
4977 }
4978 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4979 pos + size - 1);
4980 }
4981 break;
4982
4983 case M_DDIV_3:
4984 dbl = 1;
4985 case M_DIV_3:
4986 s = "mflo";
4987 goto do_div3;
4988 case M_DREM_3:
4989 dbl = 1;
4990 case M_REM_3:
4991 s = "mfhi";
4992 do_div3:
4993 if (treg == 0)
4994 {
4995 as_warn (_("Divide by zero."));
4996 if (mips_trap)
4997 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4998 else
4999 macro_build (NULL, "break", "c", 7);
5000 break;
5001 }
5002
5003 start_noreorder ();
5004 if (mips_trap)
5005 {
5006 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5007 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5008 }
5009 else
5010 {
5011 expr1.X_add_number = 8;
5012 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5013 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5014 macro_build (NULL, "break", "c", 7);
5015 }
5016 expr1.X_add_number = -1;
5017 used_at = 1;
5018 load_register (AT, &expr1, dbl);
5019 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5020 macro_build (&expr1, "bne", "s,t,p", treg, AT);
5021 if (dbl)
5022 {
5023 expr1.X_add_number = 1;
5024 load_register (AT, &expr1, dbl);
5025 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5026 }
5027 else
5028 {
5029 expr1.X_add_number = 0x80000000;
5030 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5031 }
5032 if (mips_trap)
5033 {
5034 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5035 /* We want to close the noreorder block as soon as possible, so
5036 that later insns are available for delay slot filling. */
5037 end_noreorder ();
5038 }
5039 else
5040 {
5041 expr1.X_add_number = 8;
5042 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5043 macro_build (NULL, "nop", "", 0);
5044
5045 /* We want to close the noreorder block as soon as possible, so
5046 that later insns are available for delay slot filling. */
5047 end_noreorder ();
5048
5049 macro_build (NULL, "break", "c", 6);
5050 }
5051 macro_build (NULL, s, "d", dreg);
5052 break;
5053
5054 case M_DIV_3I:
5055 s = "div";
5056 s2 = "mflo";
5057 goto do_divi;
5058 case M_DIVU_3I:
5059 s = "divu";
5060 s2 = "mflo";
5061 goto do_divi;
5062 case M_REM_3I:
5063 s = "div";
5064 s2 = "mfhi";
5065 goto do_divi;
5066 case M_REMU_3I:
5067 s = "divu";
5068 s2 = "mfhi";
5069 goto do_divi;
5070 case M_DDIV_3I:
5071 dbl = 1;
5072 s = "ddiv";
5073 s2 = "mflo";
5074 goto do_divi;
5075 case M_DDIVU_3I:
5076 dbl = 1;
5077 s = "ddivu";
5078 s2 = "mflo";
5079 goto do_divi;
5080 case M_DREM_3I:
5081 dbl = 1;
5082 s = "ddiv";
5083 s2 = "mfhi";
5084 goto do_divi;
5085 case M_DREMU_3I:
5086 dbl = 1;
5087 s = "ddivu";
5088 s2 = "mfhi";
5089 do_divi:
5090 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5091 {
5092 as_warn (_("Divide by zero."));
5093 if (mips_trap)
5094 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5095 else
5096 macro_build (NULL, "break", "c", 7);
5097 break;
5098 }
5099 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5100 {
5101 if (strcmp (s2, "mflo") == 0)
5102 move_register (dreg, sreg);
5103 else
5104 move_register (dreg, 0);
5105 break;
5106 }
5107 if (imm_expr.X_op == O_constant
5108 && imm_expr.X_add_number == -1
5109 && s[strlen (s) - 1] != 'u')
5110 {
5111 if (strcmp (s2, "mflo") == 0)
5112 {
5113 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5114 }
5115 else
5116 move_register (dreg, 0);
5117 break;
5118 }
5119
5120 used_at = 1;
5121 load_register (AT, &imm_expr, dbl);
5122 macro_build (NULL, s, "z,s,t", sreg, AT);
5123 macro_build (NULL, s2, "d", dreg);
5124 break;
5125
5126 case M_DIVU_3:
5127 s = "divu";
5128 s2 = "mflo";
5129 goto do_divu3;
5130 case M_REMU_3:
5131 s = "divu";
5132 s2 = "mfhi";
5133 goto do_divu3;
5134 case M_DDIVU_3:
5135 s = "ddivu";
5136 s2 = "mflo";
5137 goto do_divu3;
5138 case M_DREMU_3:
5139 s = "ddivu";
5140 s2 = "mfhi";
5141 do_divu3:
5142 start_noreorder ();
5143 if (mips_trap)
5144 {
5145 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5146 macro_build (NULL, s, "z,s,t", sreg, treg);
5147 /* We want to close the noreorder block as soon as possible, so
5148 that later insns are available for delay slot filling. */
5149 end_noreorder ();
5150 }
5151 else
5152 {
5153 expr1.X_add_number = 8;
5154 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5155 macro_build (NULL, s, "z,s,t", sreg, treg);
5156
5157 /* We want to close the noreorder block as soon as possible, so
5158 that later insns are available for delay slot filling. */
5159 end_noreorder ();
5160 macro_build (NULL, "break", "c", 7);
5161 }
5162 macro_build (NULL, s2, "d", dreg);
5163 break;
5164
5165 case M_DLCA_AB:
5166 dbl = 1;
5167 case M_LCA_AB:
5168 call = 1;
5169 goto do_la;
5170 case M_DLA_AB:
5171 dbl = 1;
5172 case M_LA_AB:
5173 do_la:
5174 /* Load the address of a symbol into a register. If breg is not
5175 zero, we then add a base register to it. */
5176
5177 if (dbl && HAVE_32BIT_GPRS)
5178 as_warn (_("dla used to load 32-bit register"));
5179
5180 if (! dbl && HAVE_64BIT_OBJECTS)
5181 as_warn (_("la used to load 64-bit address"));
5182
5183 if (offset_expr.X_op == O_constant
5184 && offset_expr.X_add_number >= -0x8000
5185 && offset_expr.X_add_number < 0x8000)
5186 {
5187 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5188 "t,r,j", treg, sreg, BFD_RELOC_LO16);
5189 break;
5190 }
5191
5192 if (!mips_opts.noat && (treg == breg))
5193 {
5194 tempreg = AT;
5195 used_at = 1;
5196 }
5197 else
5198 {
5199 tempreg = treg;
5200 }
5201
5202 if (offset_expr.X_op != O_symbol
5203 && offset_expr.X_op != O_constant)
5204 {
5205 as_bad (_("expression too complex"));
5206 offset_expr.X_op = O_constant;
5207 }
5208
5209 if (offset_expr.X_op == O_constant)
5210 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5211 else if (mips_pic == NO_PIC)
5212 {
5213 /* If this is a reference to a GP relative symbol, we want
5214 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5215 Otherwise we want
5216 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5217 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5218 If we have a constant, we need two instructions anyhow,
5219 so we may as well always use the latter form.
5220
5221 With 64bit address space and a usable $at we want
5222 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5223 lui $at,<sym> (BFD_RELOC_HI16_S)
5224 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5225 daddiu $at,<sym> (BFD_RELOC_LO16)
5226 dsll32 $tempreg,0
5227 daddu $tempreg,$tempreg,$at
5228
5229 If $at is already in use, we use a path which is suboptimal
5230 on superscalar processors.
5231 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5232 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5233 dsll $tempreg,16
5234 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5235 dsll $tempreg,16
5236 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5237
5238 For GP relative symbols in 64bit address space we can use
5239 the same sequence as in 32bit address space. */
5240 if (HAVE_64BIT_SYMBOLS)
5241 {
5242 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5243 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5244 {
5245 relax_start (offset_expr.X_add_symbol);
5246 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5247 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5248 relax_switch ();
5249 }
5250
5251 if (used_at == 0 && !mips_opts.noat)
5252 {
5253 macro_build (&offset_expr, "lui", "t,u",
5254 tempreg, BFD_RELOC_MIPS_HIGHEST);
5255 macro_build (&offset_expr, "lui", "t,u",
5256 AT, BFD_RELOC_HI16_S);
5257 macro_build (&offset_expr, "daddiu", "t,r,j",
5258 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5259 macro_build (&offset_expr, "daddiu", "t,r,j",
5260 AT, AT, BFD_RELOC_LO16);
5261 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5262 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5263 used_at = 1;
5264 }
5265 else
5266 {
5267 macro_build (&offset_expr, "lui", "t,u",
5268 tempreg, BFD_RELOC_MIPS_HIGHEST);
5269 macro_build (&offset_expr, "daddiu", "t,r,j",
5270 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5271 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5272 macro_build (&offset_expr, "daddiu", "t,r,j",
5273 tempreg, tempreg, BFD_RELOC_HI16_S);
5274 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5275 macro_build (&offset_expr, "daddiu", "t,r,j",
5276 tempreg, tempreg, BFD_RELOC_LO16);
5277 }
5278
5279 if (mips_relax.sequence)
5280 relax_end ();
5281 }
5282 else
5283 {
5284 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5285 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5286 {
5287 relax_start (offset_expr.X_add_symbol);
5288 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5289 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5290 relax_switch ();
5291 }
5292 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5293 as_bad (_("offset too large"));
5294 macro_build_lui (&offset_expr, tempreg);
5295 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5296 tempreg, tempreg, BFD_RELOC_LO16);
5297 if (mips_relax.sequence)
5298 relax_end ();
5299 }
5300 }
5301 else if (!mips_big_got && !HAVE_NEWABI)
5302 {
5303 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5304
5305 /* If this is a reference to an external symbol, and there
5306 is no constant, we want
5307 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5308 or for lca or if tempreg is PIC_CALL_REG
5309 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5310 For a local symbol, we want
5311 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5312 nop
5313 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5314
5315 If we have a small constant, and this is a reference to
5316 an external symbol, we want
5317 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5318 nop
5319 addiu $tempreg,$tempreg,<constant>
5320 For a local symbol, we want the same instruction
5321 sequence, but we output a BFD_RELOC_LO16 reloc on the
5322 addiu instruction.
5323
5324 If we have a large constant, and this is a reference to
5325 an external symbol, we want
5326 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5327 lui $at,<hiconstant>
5328 addiu $at,$at,<loconstant>
5329 addu $tempreg,$tempreg,$at
5330 For a local symbol, we want the same instruction
5331 sequence, but we output a BFD_RELOC_LO16 reloc on the
5332 addiu instruction.
5333 */
5334
5335 if (offset_expr.X_add_number == 0)
5336 {
5337 if (mips_pic == SVR4_PIC
5338 && breg == 0
5339 && (call || tempreg == PIC_CALL_REG))
5340 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5341
5342 relax_start (offset_expr.X_add_symbol);
5343 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5344 lw_reloc_type, mips_gp_register);
5345 if (breg != 0)
5346 {
5347 /* We're going to put in an addu instruction using
5348 tempreg, so we may as well insert the nop right
5349 now. */
5350 load_delay_nop ();
5351 }
5352 relax_switch ();
5353 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5354 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5355 load_delay_nop ();
5356 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5357 tempreg, tempreg, BFD_RELOC_LO16);
5358 relax_end ();
5359 /* FIXME: If breg == 0, and the next instruction uses
5360 $tempreg, then if this variant case is used an extra
5361 nop will be generated. */
5362 }
5363 else if (offset_expr.X_add_number >= -0x8000
5364 && offset_expr.X_add_number < 0x8000)
5365 {
5366 load_got_offset (tempreg, &offset_expr);
5367 load_delay_nop ();
5368 add_got_offset (tempreg, &offset_expr);
5369 }
5370 else
5371 {
5372 expr1.X_add_number = offset_expr.X_add_number;
5373 offset_expr.X_add_number =
5374 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5375 load_got_offset (tempreg, &offset_expr);
5376 offset_expr.X_add_number = expr1.X_add_number;
5377 /* If we are going to add in a base register, and the
5378 target register and the base register are the same,
5379 then we are using AT as a temporary register. Since
5380 we want to load the constant into AT, we add our
5381 current AT (from the global offset table) and the
5382 register into the register now, and pretend we were
5383 not using a base register. */
5384 if (breg == treg)
5385 {
5386 load_delay_nop ();
5387 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5388 treg, AT, breg);
5389 breg = 0;
5390 tempreg = treg;
5391 }
5392 add_got_offset_hilo (tempreg, &offset_expr, AT);
5393 used_at = 1;
5394 }
5395 }
5396 else if (!mips_big_got && HAVE_NEWABI)
5397 {
5398 int add_breg_early = 0;
5399
5400 /* If this is a reference to an external, and there is no
5401 constant, or local symbol (*), with or without a
5402 constant, we want
5403 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5404 or for lca or if tempreg is PIC_CALL_REG
5405 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5406
5407 If we have a small constant, and this is a reference to
5408 an external symbol, we want
5409 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5410 addiu $tempreg,$tempreg,<constant>
5411
5412 If we have a large constant, and this is a reference to
5413 an external symbol, we want
5414 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5415 lui $at,<hiconstant>
5416 addiu $at,$at,<loconstant>
5417 addu $tempreg,$tempreg,$at
5418
5419 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5420 local symbols, even though it introduces an additional
5421 instruction. */
5422
5423 if (offset_expr.X_add_number)
5424 {
5425 expr1.X_add_number = offset_expr.X_add_number;
5426 offset_expr.X_add_number = 0;
5427
5428 relax_start (offset_expr.X_add_symbol);
5429 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5430 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5431
5432 if (expr1.X_add_number >= -0x8000
5433 && expr1.X_add_number < 0x8000)
5434 {
5435 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5436 tempreg, tempreg, BFD_RELOC_LO16);
5437 }
5438 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5439 {
5440 int dreg;
5441
5442 /* If we are going to add in a base register, and the
5443 target register and the base register are the same,
5444 then we are using AT as a temporary register. Since
5445 we want to load the constant into AT, we add our
5446 current AT (from the global offset table) and the
5447 register into the register now, and pretend we were
5448 not using a base register. */
5449 if (breg != treg)
5450 dreg = tempreg;
5451 else
5452 {
5453 assert (tempreg == AT);
5454 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5455 treg, AT, breg);
5456 dreg = treg;
5457 add_breg_early = 1;
5458 }
5459
5460 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5461 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5462 dreg, dreg, AT);
5463
5464 used_at = 1;
5465 }
5466 else
5467 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5468
5469 relax_switch ();
5470 offset_expr.X_add_number = expr1.X_add_number;
5471
5472 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5473 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5474 if (add_breg_early)
5475 {
5476 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5477 treg, tempreg, breg);
5478 breg = 0;
5479 tempreg = treg;
5480 }
5481 relax_end ();
5482 }
5483 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5484 {
5485 relax_start (offset_expr.X_add_symbol);
5486 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5487 BFD_RELOC_MIPS_CALL16, mips_gp_register);
5488 relax_switch ();
5489 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5490 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5491 relax_end ();
5492 }
5493 else
5494 {
5495 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5496 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5497 }
5498 }
5499 else if (mips_big_got && !HAVE_NEWABI)
5500 {
5501 int gpdelay;
5502 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5503 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5504 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5505
5506 /* This is the large GOT case. If this is a reference to an
5507 external symbol, and there is no constant, we want
5508 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5509 addu $tempreg,$tempreg,$gp
5510 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5511 or for lca or if tempreg is PIC_CALL_REG
5512 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5513 addu $tempreg,$tempreg,$gp
5514 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5515 For a local symbol, we want
5516 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5517 nop
5518 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5519
5520 If we have a small constant, and this is a reference to
5521 an external symbol, we want
5522 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5523 addu $tempreg,$tempreg,$gp
5524 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5525 nop
5526 addiu $tempreg,$tempreg,<constant>
5527 For a local symbol, we want
5528 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5529 nop
5530 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5531
5532 If we have a large constant, and this is a reference to
5533 an external symbol, we want
5534 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5535 addu $tempreg,$tempreg,$gp
5536 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5537 lui $at,<hiconstant>
5538 addiu $at,$at,<loconstant>
5539 addu $tempreg,$tempreg,$at
5540 For a local symbol, we want
5541 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5542 lui $at,<hiconstant>
5543 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5544 addu $tempreg,$tempreg,$at
5545 */
5546
5547 expr1.X_add_number = offset_expr.X_add_number;
5548 offset_expr.X_add_number = 0;
5549 relax_start (offset_expr.X_add_symbol);
5550 gpdelay = reg_needs_delay (mips_gp_register);
5551 if (expr1.X_add_number == 0 && breg == 0
5552 && (call || tempreg == PIC_CALL_REG))
5553 {
5554 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5555 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5556 }
5557 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5558 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5559 tempreg, tempreg, mips_gp_register);
5560 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5561 tempreg, lw_reloc_type, tempreg);
5562 if (expr1.X_add_number == 0)
5563 {
5564 if (breg != 0)
5565 {
5566 /* We're going to put in an addu instruction using
5567 tempreg, so we may as well insert the nop right
5568 now. */
5569 load_delay_nop ();
5570 }
5571 }
5572 else if (expr1.X_add_number >= -0x8000
5573 && expr1.X_add_number < 0x8000)
5574 {
5575 load_delay_nop ();
5576 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5577 tempreg, tempreg, BFD_RELOC_LO16);
5578 }
5579 else
5580 {
5581 int dreg;
5582
5583 /* If we are going to add in a base register, and the
5584 target register and the base register are the same,
5585 then we are using AT as a temporary register. Since
5586 we want to load the constant into AT, we add our
5587 current AT (from the global offset table) and the
5588 register into the register now, and pretend we were
5589 not using a base register. */
5590 if (breg != treg)
5591 dreg = tempreg;
5592 else
5593 {
5594 assert (tempreg == AT);
5595 load_delay_nop ();
5596 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5597 treg, AT, breg);
5598 dreg = treg;
5599 }
5600
5601 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5602 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5603
5604 used_at = 1;
5605 }
5606 offset_expr.X_add_number =
5607 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5608 relax_switch ();
5609
5610 if (gpdelay)
5611 {
5612 /* This is needed because this instruction uses $gp, but
5613 the first instruction on the main stream does not. */
5614 macro_build (NULL, "nop", "");
5615 }
5616
5617 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5618 local_reloc_type, mips_gp_register);
5619 if (expr1.X_add_number >= -0x8000
5620 && expr1.X_add_number < 0x8000)
5621 {
5622 load_delay_nop ();
5623 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5624 tempreg, tempreg, BFD_RELOC_LO16);
5625 /* FIXME: If add_number is 0, and there was no base
5626 register, the external symbol case ended with a load,
5627 so if the symbol turns out to not be external, and
5628 the next instruction uses tempreg, an unnecessary nop
5629 will be inserted. */
5630 }
5631 else
5632 {
5633 if (breg == treg)
5634 {
5635 /* We must add in the base register now, as in the
5636 external symbol case. */
5637 assert (tempreg == AT);
5638 load_delay_nop ();
5639 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5640 treg, AT, breg);
5641 tempreg = treg;
5642 /* We set breg to 0 because we have arranged to add
5643 it in in both cases. */
5644 breg = 0;
5645 }
5646
5647 macro_build_lui (&expr1, AT);
5648 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5649 AT, AT, BFD_RELOC_LO16);
5650 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5651 tempreg, tempreg, AT);
5652 used_at = 1;
5653 }
5654 relax_end ();
5655 }
5656 else if (mips_big_got && HAVE_NEWABI)
5657 {
5658 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5659 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5660 int add_breg_early = 0;
5661
5662 /* This is the large GOT case. If this is a reference to an
5663 external symbol, and there is no constant, we want
5664 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5665 add $tempreg,$tempreg,$gp
5666 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5667 or for lca or if tempreg is PIC_CALL_REG
5668 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5669 add $tempreg,$tempreg,$gp
5670 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5671
5672 If we have a small constant, and this is a reference to
5673 an external symbol, we want
5674 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5675 add $tempreg,$tempreg,$gp
5676 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5677 addi $tempreg,$tempreg,<constant>
5678
5679 If we have a large constant, and this is a reference to
5680 an external symbol, we want
5681 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5682 addu $tempreg,$tempreg,$gp
5683 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5684 lui $at,<hiconstant>
5685 addi $at,$at,<loconstant>
5686 add $tempreg,$tempreg,$at
5687
5688 If we have NewABI, and we know it's a local symbol, we want
5689 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5690 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5691 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5692
5693 relax_start (offset_expr.X_add_symbol);
5694
5695 expr1.X_add_number = offset_expr.X_add_number;
5696 offset_expr.X_add_number = 0;
5697
5698 if (expr1.X_add_number == 0 && breg == 0
5699 && (call || tempreg == PIC_CALL_REG))
5700 {
5701 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5702 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5703 }
5704 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5705 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5706 tempreg, tempreg, mips_gp_register);
5707 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5708 tempreg, lw_reloc_type, tempreg);
5709
5710 if (expr1.X_add_number == 0)
5711 ;
5712 else if (expr1.X_add_number >= -0x8000
5713 && expr1.X_add_number < 0x8000)
5714 {
5715 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5716 tempreg, tempreg, BFD_RELOC_LO16);
5717 }
5718 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5719 {
5720 int dreg;
5721
5722 /* If we are going to add in a base register, and the
5723 target register and the base register are the same,
5724 then we are using AT as a temporary register. Since
5725 we want to load the constant into AT, we add our
5726 current AT (from the global offset table) and the
5727 register into the register now, and pretend we were
5728 not using a base register. */
5729 if (breg != treg)
5730 dreg = tempreg;
5731 else
5732 {
5733 assert (tempreg == AT);
5734 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5735 treg, AT, breg);
5736 dreg = treg;
5737 add_breg_early = 1;
5738 }
5739
5740 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5741 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5742
5743 used_at = 1;
5744 }
5745 else
5746 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5747
5748 relax_switch ();
5749 offset_expr.X_add_number = expr1.X_add_number;
5750 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5751 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5752 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5753 tempreg, BFD_RELOC_MIPS_GOT_OFST);
5754 if (add_breg_early)
5755 {
5756 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5757 treg, tempreg, breg);
5758 breg = 0;
5759 tempreg = treg;
5760 }
5761 relax_end ();
5762 }
5763 else
5764 abort ();
5765
5766 if (breg != 0)
5767 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5768 break;
5769
5770 case M_J_A:
5771 /* The j instruction may not be used in PIC code, since it
5772 requires an absolute address. We convert it to a b
5773 instruction. */
5774 if (mips_pic == NO_PIC)
5775 macro_build (&offset_expr, "j", "a");
5776 else
5777 macro_build (&offset_expr, "b", "p");
5778 break;
5779
5780 /* The jal instructions must be handled as macros because when
5781 generating PIC code they expand to multi-instruction
5782 sequences. Normally they are simple instructions. */
5783 case M_JAL_1:
5784 dreg = RA;
5785 /* Fall through. */
5786 case M_JAL_2:
5787 if (mips_pic == NO_PIC)
5788 macro_build (NULL, "jalr", "d,s", dreg, sreg);
5789 else
5790 {
5791 if (sreg != PIC_CALL_REG)
5792 as_warn (_("MIPS PIC call to register other than $25"));
5793
5794 macro_build (NULL, "jalr", "d,s", dreg, sreg);
5795 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5796 {
5797 if (mips_cprestore_offset < 0)
5798 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5799 else
5800 {
5801 if (! mips_frame_reg_valid)
5802 {
5803 as_warn (_("No .frame pseudo-op used in PIC code"));
5804 /* Quiet this warning. */
5805 mips_frame_reg_valid = 1;
5806 }
5807 if (! mips_cprestore_valid)
5808 {
5809 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5810 /* Quiet this warning. */
5811 mips_cprestore_valid = 1;
5812 }
5813 expr1.X_add_number = mips_cprestore_offset;
5814 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5815 mips_gp_register,
5816 mips_frame_reg,
5817 HAVE_64BIT_ADDRESSES);
5818 }
5819 }
5820 }
5821
5822 break;
5823
5824 case M_JAL_A:
5825 if (mips_pic == NO_PIC)
5826 macro_build (&offset_expr, "jal", "a");
5827 else if (mips_pic == SVR4_PIC)
5828 {
5829 /* If this is a reference to an external symbol, and we are
5830 using a small GOT, we want
5831 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5832 nop
5833 jalr $ra,$25
5834 nop
5835 lw $gp,cprestore($sp)
5836 The cprestore value is set using the .cprestore
5837 pseudo-op. If we are using a big GOT, we want
5838 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5839 addu $25,$25,$gp
5840 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5841 nop
5842 jalr $ra,$25
5843 nop
5844 lw $gp,cprestore($sp)
5845 If the symbol is not external, we want
5846 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5847 nop
5848 addiu $25,$25,<sym> (BFD_RELOC_LO16)
5849 jalr $ra,$25
5850 nop
5851 lw $gp,cprestore($sp)
5852
5853 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5854 sequences above, minus nops, unless the symbol is local,
5855 which enables us to use GOT_PAGE/GOT_OFST (big got) or
5856 GOT_DISP. */
5857 if (HAVE_NEWABI)
5858 {
5859 if (! mips_big_got)
5860 {
5861 relax_start (offset_expr.X_add_symbol);
5862 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5863 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5864 mips_gp_register);
5865 relax_switch ();
5866 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5867 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5868 mips_gp_register);
5869 relax_end ();
5870 }
5871 else
5872 {
5873 relax_start (offset_expr.X_add_symbol);
5874 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5875 BFD_RELOC_MIPS_CALL_HI16);
5876 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5877 PIC_CALL_REG, mips_gp_register);
5878 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5879 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5880 PIC_CALL_REG);
5881 relax_switch ();
5882 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5883 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5884 mips_gp_register);
5885 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5886 PIC_CALL_REG, PIC_CALL_REG,
5887 BFD_RELOC_MIPS_GOT_OFST);
5888 relax_end ();
5889 }
5890
5891 macro_build_jalr (&offset_expr);
5892 }
5893 else
5894 {
5895 relax_start (offset_expr.X_add_symbol);
5896 if (! mips_big_got)
5897 {
5898 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5899 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5900 mips_gp_register);
5901 load_delay_nop ();
5902 relax_switch ();
5903 }
5904 else
5905 {
5906 int gpdelay;
5907
5908 gpdelay = reg_needs_delay (mips_gp_register);
5909 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5910 BFD_RELOC_MIPS_CALL_HI16);
5911 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5912 PIC_CALL_REG, mips_gp_register);
5913 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5914 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5915 PIC_CALL_REG);
5916 load_delay_nop ();
5917 relax_switch ();
5918 if (gpdelay)
5919 macro_build (NULL, "nop", "");
5920 }
5921 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5922 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5923 mips_gp_register);
5924 load_delay_nop ();
5925 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5926 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5927 relax_end ();
5928 macro_build_jalr (&offset_expr);
5929
5930 if (mips_cprestore_offset < 0)
5931 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5932 else
5933 {
5934 if (! mips_frame_reg_valid)
5935 {
5936 as_warn (_("No .frame pseudo-op used in PIC code"));
5937 /* Quiet this warning. */
5938 mips_frame_reg_valid = 1;
5939 }
5940 if (! mips_cprestore_valid)
5941 {
5942 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5943 /* Quiet this warning. */
5944 mips_cprestore_valid = 1;
5945 }
5946 if (mips_opts.noreorder)
5947 macro_build (NULL, "nop", "");
5948 expr1.X_add_number = mips_cprestore_offset;
5949 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5950 mips_gp_register,
5951 mips_frame_reg,
5952 HAVE_64BIT_ADDRESSES);
5953 }
5954 }
5955 }
5956 else if (mips_pic == VXWORKS_PIC)
5957 as_bad (_("Non-PIC jump used in PIC library"));
5958 else
5959 abort ();
5960
5961 break;
5962
5963 case M_LB_AB:
5964 s = "lb";
5965 goto ld;
5966 case M_LBU_AB:
5967 s = "lbu";
5968 goto ld;
5969 case M_LH_AB:
5970 s = "lh";
5971 goto ld;
5972 case M_LHU_AB:
5973 s = "lhu";
5974 goto ld;
5975 case M_LW_AB:
5976 s = "lw";
5977 goto ld;
5978 case M_LWC0_AB:
5979 s = "lwc0";
5980 /* Itbl support may require additional care here. */
5981 coproc = 1;
5982 goto ld;
5983 case M_LWC1_AB:
5984 s = "lwc1";
5985 /* Itbl support may require additional care here. */
5986 coproc = 1;
5987 goto ld;
5988 case M_LWC2_AB:
5989 s = "lwc2";
5990 /* Itbl support may require additional care here. */
5991 coproc = 1;
5992 goto ld;
5993 case M_LWC3_AB:
5994 s = "lwc3";
5995 /* Itbl support may require additional care here. */
5996 coproc = 1;
5997 goto ld;
5998 case M_LWL_AB:
5999 s = "lwl";
6000 lr = 1;
6001 goto ld;
6002 case M_LWR_AB:
6003 s = "lwr";
6004 lr = 1;
6005 goto ld;
6006 case M_LDC1_AB:
6007 if (mips_opts.arch == CPU_R4650)
6008 {
6009 as_bad (_("opcode not supported on this processor"));
6010 break;
6011 }
6012 s = "ldc1";
6013 /* Itbl support may require additional care here. */
6014 coproc = 1;
6015 goto ld;
6016 case M_LDC2_AB:
6017 s = "ldc2";
6018 /* Itbl support may require additional care here. */
6019 coproc = 1;
6020 goto ld;
6021 case M_LDC3_AB:
6022 s = "ldc3";
6023 /* Itbl support may require additional care here. */
6024 coproc = 1;
6025 goto ld;
6026 case M_LDL_AB:
6027 s = "ldl";
6028 lr = 1;
6029 goto ld;
6030 case M_LDR_AB:
6031 s = "ldr";
6032 lr = 1;
6033 goto ld;
6034 case M_LL_AB:
6035 s = "ll";
6036 goto ld;
6037 case M_LLD_AB:
6038 s = "lld";
6039 goto ld;
6040 case M_LWU_AB:
6041 s = "lwu";
6042 ld:
6043 if (breg == treg || coproc || lr)
6044 {
6045 tempreg = AT;
6046 used_at = 1;
6047 }
6048 else
6049 {
6050 tempreg = treg;
6051 }
6052 goto ld_st;
6053 case M_SB_AB:
6054 s = "sb";
6055 goto st;
6056 case M_SH_AB:
6057 s = "sh";
6058 goto st;
6059 case M_SW_AB:
6060 s = "sw";
6061 goto st;
6062 case M_SWC0_AB:
6063 s = "swc0";
6064 /* Itbl support may require additional care here. */
6065 coproc = 1;
6066 goto st;
6067 case M_SWC1_AB:
6068 s = "swc1";
6069 /* Itbl support may require additional care here. */
6070 coproc = 1;
6071 goto st;
6072 case M_SWC2_AB:
6073 s = "swc2";
6074 /* Itbl support may require additional care here. */
6075 coproc = 1;
6076 goto st;
6077 case M_SWC3_AB:
6078 s = "swc3";
6079 /* Itbl support may require additional care here. */
6080 coproc = 1;
6081 goto st;
6082 case M_SWL_AB:
6083 s = "swl";
6084 goto st;
6085 case M_SWR_AB:
6086 s = "swr";
6087 goto st;
6088 case M_SC_AB:
6089 s = "sc";
6090 goto st;
6091 case M_SCD_AB:
6092 s = "scd";
6093 goto st;
6094 case M_CACHE_AB:
6095 s = "cache";
6096 goto st;
6097 case M_SDC1_AB:
6098 if (mips_opts.arch == CPU_R4650)
6099 {
6100 as_bad (_("opcode not supported on this processor"));
6101 break;
6102 }
6103 s = "sdc1";
6104 coproc = 1;
6105 /* Itbl support may require additional care here. */
6106 goto st;
6107 case M_SDC2_AB:
6108 s = "sdc2";
6109 /* Itbl support may require additional care here. */
6110 coproc = 1;
6111 goto st;
6112 case M_SDC3_AB:
6113 s = "sdc3";
6114 /* Itbl support may require additional care here. */
6115 coproc = 1;
6116 goto st;
6117 case M_SDL_AB:
6118 s = "sdl";
6119 goto st;
6120 case M_SDR_AB:
6121 s = "sdr";
6122 st:
6123 tempreg = AT;
6124 used_at = 1;
6125 ld_st:
6126 /* Itbl support may require additional care here. */
6127 if (mask == M_LWC1_AB
6128 || mask == M_SWC1_AB
6129 || mask == M_LDC1_AB
6130 || mask == M_SDC1_AB
6131 || mask == M_L_DAB
6132 || mask == M_S_DAB)
6133 fmt = "T,o(b)";
6134 else if (mask == M_CACHE_AB)
6135 fmt = "k,o(b)";
6136 else if (coproc)
6137 fmt = "E,o(b)";
6138 else
6139 fmt = "t,o(b)";
6140
6141 if (offset_expr.X_op != O_constant
6142 && offset_expr.X_op != O_symbol)
6143 {
6144 as_bad (_("expression too complex"));
6145 offset_expr.X_op = O_constant;
6146 }
6147
6148 if (HAVE_32BIT_ADDRESSES
6149 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6150 {
6151 char value [32];
6152
6153 sprintf_vma (value, offset_expr.X_add_number);
6154 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6155 }
6156
6157 /* A constant expression in PIC code can be handled just as it
6158 is in non PIC code. */
6159 if (offset_expr.X_op == O_constant)
6160 {
6161 expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6162 & ~(bfd_vma) 0xffff);
6163 normalize_address_expr (&expr1);
6164 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6165 if (breg != 0)
6166 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6167 tempreg, tempreg, breg);
6168 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6169 }
6170 else if (mips_pic == NO_PIC)
6171 {
6172 /* If this is a reference to a GP relative symbol, and there
6173 is no base register, we want
6174 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6175 Otherwise, if there is no base register, we want
6176 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6177 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6178 If we have a constant, we need two instructions anyhow,
6179 so we always use the latter form.
6180
6181 If we have a base register, and this is a reference to a
6182 GP relative symbol, we want
6183 addu $tempreg,$breg,$gp
6184 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6185 Otherwise we want
6186 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6187 addu $tempreg,$tempreg,$breg
6188 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6189 With a constant we always use the latter case.
6190
6191 With 64bit address space and no base register and $at usable,
6192 we want
6193 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6194 lui $at,<sym> (BFD_RELOC_HI16_S)
6195 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6196 dsll32 $tempreg,0
6197 daddu $tempreg,$at
6198 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6199 If we have a base register, we want
6200 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6201 lui $at,<sym> (BFD_RELOC_HI16_S)
6202 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6203 daddu $at,$breg
6204 dsll32 $tempreg,0
6205 daddu $tempreg,$at
6206 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6207
6208 Without $at we can't generate the optimal path for superscalar
6209 processors here since this would require two temporary registers.
6210 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6211 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6212 dsll $tempreg,16
6213 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6214 dsll $tempreg,16
6215 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6216 If we have a base register, we want
6217 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6218 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6219 dsll $tempreg,16
6220 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6221 dsll $tempreg,16
6222 daddu $tempreg,$tempreg,$breg
6223 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6224
6225 For GP relative symbols in 64bit address space we can use
6226 the same sequence as in 32bit address space. */
6227 if (HAVE_64BIT_SYMBOLS)
6228 {
6229 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6230 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6231 {
6232 relax_start (offset_expr.X_add_symbol);
6233 if (breg == 0)
6234 {
6235 macro_build (&offset_expr, s, fmt, treg,
6236 BFD_RELOC_GPREL16, mips_gp_register);
6237 }
6238 else
6239 {
6240 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6241 tempreg, breg, mips_gp_register);
6242 macro_build (&offset_expr, s, fmt, treg,
6243 BFD_RELOC_GPREL16, tempreg);
6244 }
6245 relax_switch ();
6246 }
6247
6248 if (used_at == 0 && !mips_opts.noat)
6249 {
6250 macro_build (&offset_expr, "lui", "t,u", tempreg,
6251 BFD_RELOC_MIPS_HIGHEST);
6252 macro_build (&offset_expr, "lui", "t,u", AT,
6253 BFD_RELOC_HI16_S);
6254 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6255 tempreg, BFD_RELOC_MIPS_HIGHER);
6256 if (breg != 0)
6257 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6258 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6259 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6260 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6261 tempreg);
6262 used_at = 1;
6263 }
6264 else
6265 {
6266 macro_build (&offset_expr, "lui", "t,u", tempreg,
6267 BFD_RELOC_MIPS_HIGHEST);
6268 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6269 tempreg, BFD_RELOC_MIPS_HIGHER);
6270 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6271 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6272 tempreg, BFD_RELOC_HI16_S);
6273 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6274 if (breg != 0)
6275 macro_build (NULL, "daddu", "d,v,t",
6276 tempreg, tempreg, breg);
6277 macro_build (&offset_expr, s, fmt, treg,
6278 BFD_RELOC_LO16, tempreg);
6279 }
6280
6281 if (mips_relax.sequence)
6282 relax_end ();
6283 break;
6284 }
6285
6286 if (breg == 0)
6287 {
6288 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6289 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6290 {
6291 relax_start (offset_expr.X_add_symbol);
6292 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6293 mips_gp_register);
6294 relax_switch ();
6295 }
6296 macro_build_lui (&offset_expr, tempreg);
6297 macro_build (&offset_expr, s, fmt, treg,
6298 BFD_RELOC_LO16, tempreg);
6299 if (mips_relax.sequence)
6300 relax_end ();
6301 }
6302 else
6303 {
6304 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6305 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6306 {
6307 relax_start (offset_expr.X_add_symbol);
6308 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6309 tempreg, breg, mips_gp_register);
6310 macro_build (&offset_expr, s, fmt, treg,
6311 BFD_RELOC_GPREL16, tempreg);
6312 relax_switch ();
6313 }
6314 macro_build_lui (&offset_expr, tempreg);
6315 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6316 tempreg, tempreg, breg);
6317 macro_build (&offset_expr, s, fmt, treg,
6318 BFD_RELOC_LO16, tempreg);
6319 if (mips_relax.sequence)
6320 relax_end ();
6321 }
6322 }
6323 else if (!mips_big_got)
6324 {
6325 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6326
6327 /* If this is a reference to an external symbol, we want
6328 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6329 nop
6330 <op> $treg,0($tempreg)
6331 Otherwise we want
6332 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6333 nop
6334 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6335 <op> $treg,0($tempreg)
6336
6337 For NewABI, we want
6338 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6339 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6340
6341 If there is a base register, we add it to $tempreg before
6342 the <op>. If there is a constant, we stick it in the
6343 <op> instruction. We don't handle constants larger than
6344 16 bits, because we have no way to load the upper 16 bits
6345 (actually, we could handle them for the subset of cases
6346 in which we are not using $at). */
6347 assert (offset_expr.X_op == O_symbol);
6348 if (HAVE_NEWABI)
6349 {
6350 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6351 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6352 if (breg != 0)
6353 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6354 tempreg, tempreg, breg);
6355 macro_build (&offset_expr, s, fmt, treg,
6356 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6357 break;
6358 }
6359 expr1.X_add_number = offset_expr.X_add_number;
6360 offset_expr.X_add_number = 0;
6361 if (expr1.X_add_number < -0x8000
6362 || expr1.X_add_number >= 0x8000)
6363 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6364 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6365 lw_reloc_type, mips_gp_register);
6366 load_delay_nop ();
6367 relax_start (offset_expr.X_add_symbol);
6368 relax_switch ();
6369 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6370 tempreg, BFD_RELOC_LO16);
6371 relax_end ();
6372 if (breg != 0)
6373 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6374 tempreg, tempreg, breg);
6375 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6376 }
6377 else if (mips_big_got && !HAVE_NEWABI)
6378 {
6379 int gpdelay;
6380
6381 /* If this is a reference to an external symbol, we want
6382 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6383 addu $tempreg,$tempreg,$gp
6384 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6385 <op> $treg,0($tempreg)
6386 Otherwise we want
6387 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6388 nop
6389 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6390 <op> $treg,0($tempreg)
6391 If there is a base register, we add it to $tempreg before
6392 the <op>. If there is a constant, we stick it in the
6393 <op> instruction. We don't handle constants larger than
6394 16 bits, because we have no way to load the upper 16 bits
6395 (actually, we could handle them for the subset of cases
6396 in which we are not using $at). */
6397 assert (offset_expr.X_op == O_symbol);
6398 expr1.X_add_number = offset_expr.X_add_number;
6399 offset_expr.X_add_number = 0;
6400 if (expr1.X_add_number < -0x8000
6401 || expr1.X_add_number >= 0x8000)
6402 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6403 gpdelay = reg_needs_delay (mips_gp_register);
6404 relax_start (offset_expr.X_add_symbol);
6405 macro_build (&offset_expr, "lui", "t,u", tempreg,
6406 BFD_RELOC_MIPS_GOT_HI16);
6407 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6408 mips_gp_register);
6409 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6410 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6411 relax_switch ();
6412 if (gpdelay)
6413 macro_build (NULL, "nop", "");
6414 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6415 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6416 load_delay_nop ();
6417 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6418 tempreg, BFD_RELOC_LO16);
6419 relax_end ();
6420
6421 if (breg != 0)
6422 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6423 tempreg, tempreg, breg);
6424 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6425 }
6426 else if (mips_big_got && HAVE_NEWABI)
6427 {
6428 /* If this is a reference to an external symbol, we want
6429 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6430 add $tempreg,$tempreg,$gp
6431 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6432 <op> $treg,<ofst>($tempreg)
6433 Otherwise, for local symbols, we want:
6434 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6435 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6436 assert (offset_expr.X_op == O_symbol);
6437 expr1.X_add_number = offset_expr.X_add_number;
6438 offset_expr.X_add_number = 0;
6439 if (expr1.X_add_number < -0x8000
6440 || expr1.X_add_number >= 0x8000)
6441 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6442 relax_start (offset_expr.X_add_symbol);
6443 macro_build (&offset_expr, "lui", "t,u", tempreg,
6444 BFD_RELOC_MIPS_GOT_HI16);
6445 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6446 mips_gp_register);
6447 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6448 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6449 if (breg != 0)
6450 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6451 tempreg, tempreg, breg);
6452 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6453
6454 relax_switch ();
6455 offset_expr.X_add_number = expr1.X_add_number;
6456 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6457 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6458 if (breg != 0)
6459 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6460 tempreg, tempreg, breg);
6461 macro_build (&offset_expr, s, fmt, treg,
6462 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6463 relax_end ();
6464 }
6465 else
6466 abort ();
6467
6468 break;
6469
6470 case M_LI:
6471 case M_LI_S:
6472 load_register (treg, &imm_expr, 0);
6473 break;
6474
6475 case M_DLI:
6476 load_register (treg, &imm_expr, 1);
6477 break;
6478
6479 case M_LI_SS:
6480 if (imm_expr.X_op == O_constant)
6481 {
6482 used_at = 1;
6483 load_register (AT, &imm_expr, 0);
6484 macro_build (NULL, "mtc1", "t,G", AT, treg);
6485 break;
6486 }
6487 else
6488 {
6489 assert (offset_expr.X_op == O_symbol
6490 && strcmp (segment_name (S_GET_SEGMENT
6491 (offset_expr.X_add_symbol)),
6492 ".lit4") == 0
6493 && offset_expr.X_add_number == 0);
6494 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6495 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6496 break;
6497 }
6498
6499 case M_LI_D:
6500 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6501 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6502 order 32 bits of the value and the low order 32 bits are either
6503 zero or in OFFSET_EXPR. */
6504 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6505 {
6506 if (HAVE_64BIT_GPRS)
6507 load_register (treg, &imm_expr, 1);
6508 else
6509 {
6510 int hreg, lreg;
6511
6512 if (target_big_endian)
6513 {
6514 hreg = treg;
6515 lreg = treg + 1;
6516 }
6517 else
6518 {
6519 hreg = treg + 1;
6520 lreg = treg;
6521 }
6522
6523 if (hreg <= 31)
6524 load_register (hreg, &imm_expr, 0);
6525 if (lreg <= 31)
6526 {
6527 if (offset_expr.X_op == O_absent)
6528 move_register (lreg, 0);
6529 else
6530 {
6531 assert (offset_expr.X_op == O_constant);
6532 load_register (lreg, &offset_expr, 0);
6533 }
6534 }
6535 }
6536 break;
6537 }
6538
6539 /* We know that sym is in the .rdata section. First we get the
6540 upper 16 bits of the address. */
6541 if (mips_pic == NO_PIC)
6542 {
6543 macro_build_lui (&offset_expr, AT);
6544 used_at = 1;
6545 }
6546 else
6547 {
6548 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6549 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6550 used_at = 1;
6551 }
6552
6553 /* Now we load the register(s). */
6554 if (HAVE_64BIT_GPRS)
6555 {
6556 used_at = 1;
6557 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6558 }
6559 else
6560 {
6561 used_at = 1;
6562 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6563 if (treg != RA)
6564 {
6565 /* FIXME: How in the world do we deal with the possible
6566 overflow here? */
6567 offset_expr.X_add_number += 4;
6568 macro_build (&offset_expr, "lw", "t,o(b)",
6569 treg + 1, BFD_RELOC_LO16, AT);
6570 }
6571 }
6572 break;
6573
6574 case M_LI_DD:
6575 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6576 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6577 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6578 the value and the low order 32 bits are either zero or in
6579 OFFSET_EXPR. */
6580 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6581 {
6582 used_at = 1;
6583 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6584 if (HAVE_64BIT_FPRS)
6585 {
6586 assert (HAVE_64BIT_GPRS);
6587 macro_build (NULL, "dmtc1", "t,S", AT, treg);
6588 }
6589 else
6590 {
6591 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6592 if (offset_expr.X_op == O_absent)
6593 macro_build (NULL, "mtc1", "t,G", 0, treg);
6594 else
6595 {
6596 assert (offset_expr.X_op == O_constant);
6597 load_register (AT, &offset_expr, 0);
6598 macro_build (NULL, "mtc1", "t,G", AT, treg);
6599 }
6600 }
6601 break;
6602 }
6603
6604 assert (offset_expr.X_op == O_symbol
6605 && offset_expr.X_add_number == 0);
6606 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6607 if (strcmp (s, ".lit8") == 0)
6608 {
6609 if (mips_opts.isa != ISA_MIPS1)
6610 {
6611 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6612 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6613 break;
6614 }
6615 breg = mips_gp_register;
6616 r = BFD_RELOC_MIPS_LITERAL;
6617 goto dob;
6618 }
6619 else
6620 {
6621 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6622 used_at = 1;
6623 if (mips_pic != NO_PIC)
6624 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6625 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6626 else
6627 {
6628 /* FIXME: This won't work for a 64 bit address. */
6629 macro_build_lui (&offset_expr, AT);
6630 }
6631
6632 if (mips_opts.isa != ISA_MIPS1)
6633 {
6634 macro_build (&offset_expr, "ldc1", "T,o(b)",
6635 treg, BFD_RELOC_LO16, AT);
6636 break;
6637 }
6638 breg = AT;
6639 r = BFD_RELOC_LO16;
6640 goto dob;
6641 }
6642
6643 case M_L_DOB:
6644 if (mips_opts.arch == CPU_R4650)
6645 {
6646 as_bad (_("opcode not supported on this processor"));
6647 break;
6648 }
6649 /* Even on a big endian machine $fn comes before $fn+1. We have
6650 to adjust when loading from memory. */
6651 r = BFD_RELOC_LO16;
6652 dob:
6653 assert (mips_opts.isa == ISA_MIPS1);
6654 macro_build (&offset_expr, "lwc1", "T,o(b)",
6655 target_big_endian ? treg + 1 : treg, r, breg);
6656 /* FIXME: A possible overflow which I don't know how to deal
6657 with. */
6658 offset_expr.X_add_number += 4;
6659 macro_build (&offset_expr, "lwc1", "T,o(b)",
6660 target_big_endian ? treg : treg + 1, r, breg);
6661 break;
6662
6663 case M_L_DAB:
6664 /*
6665 * The MIPS assembler seems to check for X_add_number not
6666 * being double aligned and generating:
6667 * lui at,%hi(foo+1)
6668 * addu at,at,v1
6669 * addiu at,at,%lo(foo+1)
6670 * lwc1 f2,0(at)
6671 * lwc1 f3,4(at)
6672 * But, the resulting address is the same after relocation so why
6673 * generate the extra instruction?
6674 */
6675 if (mips_opts.arch == CPU_R4650)
6676 {
6677 as_bad (_("opcode not supported on this processor"));
6678 break;
6679 }
6680 /* Itbl support may require additional care here. */
6681 coproc = 1;
6682 if (mips_opts.isa != ISA_MIPS1)
6683 {
6684 s = "ldc1";
6685 goto ld;
6686 }
6687
6688 s = "lwc1";
6689 fmt = "T,o(b)";
6690 goto ldd_std;
6691
6692 case M_S_DAB:
6693 if (mips_opts.arch == CPU_R4650)
6694 {
6695 as_bad (_("opcode not supported on this processor"));
6696 break;
6697 }
6698
6699 if (mips_opts.isa != ISA_MIPS1)
6700 {
6701 s = "sdc1";
6702 goto st;
6703 }
6704
6705 s = "swc1";
6706 fmt = "T,o(b)";
6707 /* Itbl support may require additional care here. */
6708 coproc = 1;
6709 goto ldd_std;
6710
6711 case M_LD_AB:
6712 if (HAVE_64BIT_GPRS)
6713 {
6714 s = "ld";
6715 goto ld;
6716 }
6717
6718 s = "lw";
6719 fmt = "t,o(b)";
6720 goto ldd_std;
6721
6722 case M_SD_AB:
6723 if (HAVE_64BIT_GPRS)
6724 {
6725 s = "sd";
6726 goto st;
6727 }
6728
6729 s = "sw";
6730 fmt = "t,o(b)";
6731
6732 ldd_std:
6733 if (offset_expr.X_op != O_symbol
6734 && offset_expr.X_op != O_constant)
6735 {
6736 as_bad (_("expression too complex"));
6737 offset_expr.X_op = O_constant;
6738 }
6739
6740 if (HAVE_32BIT_ADDRESSES
6741 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6742 {
6743 char value [32];
6744
6745 sprintf_vma (value, offset_expr.X_add_number);
6746 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6747 }
6748
6749 /* Even on a big endian machine $fn comes before $fn+1. We have
6750 to adjust when loading from memory. We set coproc if we must
6751 load $fn+1 first. */
6752 /* Itbl support may require additional care here. */
6753 if (! target_big_endian)
6754 coproc = 0;
6755
6756 if (mips_pic == NO_PIC
6757 || offset_expr.X_op == O_constant)
6758 {
6759 /* If this is a reference to a GP relative symbol, we want
6760 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6761 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6762 If we have a base register, we use this
6763 addu $at,$breg,$gp
6764 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6765 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6766 If this is not a GP relative symbol, we want
6767 lui $at,<sym> (BFD_RELOC_HI16_S)
6768 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6769 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6770 If there is a base register, we add it to $at after the
6771 lui instruction. If there is a constant, we always use
6772 the last case. */
6773 if (offset_expr.X_op == O_symbol
6774 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6775 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6776 {
6777 relax_start (offset_expr.X_add_symbol);
6778 if (breg == 0)
6779 {
6780 tempreg = mips_gp_register;
6781 }
6782 else
6783 {
6784 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6785 AT, breg, mips_gp_register);
6786 tempreg = AT;
6787 used_at = 1;
6788 }
6789
6790 /* Itbl support may require additional care here. */
6791 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6792 BFD_RELOC_GPREL16, tempreg);
6793 offset_expr.X_add_number += 4;
6794
6795 /* Set mips_optimize to 2 to avoid inserting an
6796 undesired nop. */
6797 hold_mips_optimize = mips_optimize;
6798 mips_optimize = 2;
6799 /* Itbl support may require additional care here. */
6800 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6801 BFD_RELOC_GPREL16, tempreg);
6802 mips_optimize = hold_mips_optimize;
6803
6804 relax_switch ();
6805
6806 /* We just generated two relocs. When tc_gen_reloc
6807 handles this case, it will skip the first reloc and
6808 handle the second. The second reloc already has an
6809 extra addend of 4, which we added above. We must
6810 subtract it out, and then subtract another 4 to make
6811 the first reloc come out right. The second reloc
6812 will come out right because we are going to add 4 to
6813 offset_expr when we build its instruction below.
6814
6815 If we have a symbol, then we don't want to include
6816 the offset, because it will wind up being included
6817 when we generate the reloc. */
6818
6819 if (offset_expr.X_op == O_constant)
6820 offset_expr.X_add_number -= 8;
6821 else
6822 {
6823 offset_expr.X_add_number = -4;
6824 offset_expr.X_op = O_constant;
6825 }
6826 }
6827 used_at = 1;
6828 macro_build_lui (&offset_expr, AT);
6829 if (breg != 0)
6830 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6831 /* Itbl support may require additional care here. */
6832 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6833 BFD_RELOC_LO16, AT);
6834 /* FIXME: How do we handle overflow here? */
6835 offset_expr.X_add_number += 4;
6836 /* Itbl support may require additional care here. */
6837 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6838 BFD_RELOC_LO16, AT);
6839 if (mips_relax.sequence)
6840 relax_end ();
6841 }
6842 else if (!mips_big_got)
6843 {
6844 /* If this is a reference to an external symbol, we want
6845 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6846 nop
6847 <op> $treg,0($at)
6848 <op> $treg+1,4($at)
6849 Otherwise we want
6850 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6851 nop
6852 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6853 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6854 If there is a base register we add it to $at before the
6855 lwc1 instructions. If there is a constant we include it
6856 in the lwc1 instructions. */
6857 used_at = 1;
6858 expr1.X_add_number = offset_expr.X_add_number;
6859 if (expr1.X_add_number < -0x8000
6860 || expr1.X_add_number >= 0x8000 - 4)
6861 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6862 load_got_offset (AT, &offset_expr);
6863 load_delay_nop ();
6864 if (breg != 0)
6865 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6866
6867 /* Set mips_optimize to 2 to avoid inserting an undesired
6868 nop. */
6869 hold_mips_optimize = mips_optimize;
6870 mips_optimize = 2;
6871
6872 /* Itbl support may require additional care here. */
6873 relax_start (offset_expr.X_add_symbol);
6874 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6875 BFD_RELOC_LO16, AT);
6876 expr1.X_add_number += 4;
6877 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6878 BFD_RELOC_LO16, AT);
6879 relax_switch ();
6880 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6881 BFD_RELOC_LO16, AT);
6882 offset_expr.X_add_number += 4;
6883 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6884 BFD_RELOC_LO16, AT);
6885 relax_end ();
6886
6887 mips_optimize = hold_mips_optimize;
6888 }
6889 else if (mips_big_got)
6890 {
6891 int gpdelay;
6892
6893 /* If this is a reference to an external symbol, we want
6894 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6895 addu $at,$at,$gp
6896 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
6897 nop
6898 <op> $treg,0($at)
6899 <op> $treg+1,4($at)
6900 Otherwise we want
6901 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6902 nop
6903 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6904 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6905 If there is a base register we add it to $at before the
6906 lwc1 instructions. If there is a constant we include it
6907 in the lwc1 instructions. */
6908 used_at = 1;
6909 expr1.X_add_number = offset_expr.X_add_number;
6910 offset_expr.X_add_number = 0;
6911 if (expr1.X_add_number < -0x8000
6912 || expr1.X_add_number >= 0x8000 - 4)
6913 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6914 gpdelay = reg_needs_delay (mips_gp_register);
6915 relax_start (offset_expr.X_add_symbol);
6916 macro_build (&offset_expr, "lui", "t,u",
6917 AT, BFD_RELOC_MIPS_GOT_HI16);
6918 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6919 AT, AT, mips_gp_register);
6920 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6921 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6922 load_delay_nop ();
6923 if (breg != 0)
6924 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6925 /* Itbl support may require additional care here. */
6926 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6927 BFD_RELOC_LO16, AT);
6928 expr1.X_add_number += 4;
6929
6930 /* Set mips_optimize to 2 to avoid inserting an undesired
6931 nop. */
6932 hold_mips_optimize = mips_optimize;
6933 mips_optimize = 2;
6934 /* Itbl support may require additional care here. */
6935 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6936 BFD_RELOC_LO16, AT);
6937 mips_optimize = hold_mips_optimize;
6938 expr1.X_add_number -= 4;
6939
6940 relax_switch ();
6941 offset_expr.X_add_number = expr1.X_add_number;
6942 if (gpdelay)
6943 macro_build (NULL, "nop", "");
6944 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6945 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6946 load_delay_nop ();
6947 if (breg != 0)
6948 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6949 /* Itbl support may require additional care here. */
6950 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6951 BFD_RELOC_LO16, AT);
6952 offset_expr.X_add_number += 4;
6953
6954 /* Set mips_optimize to 2 to avoid inserting an undesired
6955 nop. */
6956 hold_mips_optimize = mips_optimize;
6957 mips_optimize = 2;
6958 /* Itbl support may require additional care here. */
6959 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6960 BFD_RELOC_LO16, AT);
6961 mips_optimize = hold_mips_optimize;
6962 relax_end ();
6963 }
6964 else
6965 abort ();
6966
6967 break;
6968
6969 case M_LD_OB:
6970 s = "lw";
6971 goto sd_ob;
6972 case M_SD_OB:
6973 s = "sw";
6974 sd_ob:
6975 assert (HAVE_32BIT_ADDRESSES);
6976 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6977 offset_expr.X_add_number += 4;
6978 macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6979 break;
6980
6981 /* New code added to support COPZ instructions.
6982 This code builds table entries out of the macros in mip_opcodes.
6983 R4000 uses interlocks to handle coproc delays.
6984 Other chips (like the R3000) require nops to be inserted for delays.
6985
6986 FIXME: Currently, we require that the user handle delays.
6987 In order to fill delay slots for non-interlocked chips,
6988 we must have a way to specify delays based on the coprocessor.
6989 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6990 What are the side-effects of the cop instruction?
6991 What cache support might we have and what are its effects?
6992 Both coprocessor & memory require delays. how long???
6993 What registers are read/set/modified?
6994
6995 If an itbl is provided to interpret cop instructions,
6996 this knowledge can be encoded in the itbl spec. */
6997
6998 case M_COP0:
6999 s = "c0";
7000 goto copz;
7001 case M_COP1:
7002 s = "c1";
7003 goto copz;
7004 case M_COP2:
7005 s = "c2";
7006 goto copz;
7007 case M_COP3:
7008 s = "c3";
7009 copz:
7010 /* For now we just do C (same as Cz). The parameter will be
7011 stored in insn_opcode by mips_ip. */
7012 macro_build (NULL, s, "C", ip->insn_opcode);
7013 break;
7014
7015 case M_MOVE:
7016 move_register (dreg, sreg);
7017 break;
7018
7019 #ifdef LOSING_COMPILER
7020 default:
7021 /* Try and see if this is a new itbl instruction.
7022 This code builds table entries out of the macros in mip_opcodes.
7023 FIXME: For now we just assemble the expression and pass it's
7024 value along as a 32-bit immediate.
7025 We may want to have the assembler assemble this value,
7026 so that we gain the assembler's knowledge of delay slots,
7027 symbols, etc.
7028 Would it be more efficient to use mask (id) here? */
7029 if (itbl_have_entries
7030 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7031 {
7032 s = ip->insn_mo->name;
7033 s2 = "cop3";
7034 coproc = ITBL_DECODE_PNUM (immed_expr);;
7035 macro_build (&immed_expr, s, "C");
7036 break;
7037 }
7038 macro2 (ip);
7039 break;
7040 }
7041 if (mips_opts.noat && used_at)
7042 as_bad (_("Macro used $at after \".set noat\""));
7043 }
7044
7045 static void
7046 macro2 (struct mips_cl_insn *ip)
7047 {
7048 register int treg, sreg, dreg, breg;
7049 int tempreg;
7050 int mask;
7051 int used_at;
7052 expressionS expr1;
7053 const char *s;
7054 const char *s2;
7055 const char *fmt;
7056 int likely = 0;
7057 int dbl = 0;
7058 int coproc = 0;
7059 int lr = 0;
7060 int imm = 0;
7061 int off;
7062 offsetT maxnum;
7063 bfd_reloc_code_real_type r;
7064
7065 treg = (ip->insn_opcode >> 16) & 0x1f;
7066 dreg = (ip->insn_opcode >> 11) & 0x1f;
7067 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7068 mask = ip->insn_mo->mask;
7069
7070 expr1.X_op = O_constant;
7071 expr1.X_op_symbol = NULL;
7072 expr1.X_add_symbol = NULL;
7073 expr1.X_add_number = 1;
7074
7075 switch (mask)
7076 {
7077 #endif /* LOSING_COMPILER */
7078
7079 case M_DMUL:
7080 dbl = 1;
7081 case M_MUL:
7082 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7083 macro_build (NULL, "mflo", "d", dreg);
7084 break;
7085
7086 case M_DMUL_I:
7087 dbl = 1;
7088 case M_MUL_I:
7089 /* The MIPS assembler some times generates shifts and adds. I'm
7090 not trying to be that fancy. GCC should do this for us
7091 anyway. */
7092 used_at = 1;
7093 load_register (AT, &imm_expr, dbl);
7094 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7095 macro_build (NULL, "mflo", "d", dreg);
7096 break;
7097
7098 case M_DMULO_I:
7099 dbl = 1;
7100 case M_MULO_I:
7101 imm = 1;
7102 goto do_mulo;
7103
7104 case M_DMULO:
7105 dbl = 1;
7106 case M_MULO:
7107 do_mulo:
7108 start_noreorder ();
7109 used_at = 1;
7110 if (imm)
7111 load_register (AT, &imm_expr, dbl);
7112 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7113 macro_build (NULL, "mflo", "d", dreg);
7114 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7115 macro_build (NULL, "mfhi", "d", AT);
7116 if (mips_trap)
7117 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7118 else
7119 {
7120 expr1.X_add_number = 8;
7121 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7122 macro_build (NULL, "nop", "", 0);
7123 macro_build (NULL, "break", "c", 6);
7124 }
7125 end_noreorder ();
7126 macro_build (NULL, "mflo", "d", dreg);
7127 break;
7128
7129 case M_DMULOU_I:
7130 dbl = 1;
7131 case M_MULOU_I:
7132 imm = 1;
7133 goto do_mulou;
7134
7135 case M_DMULOU:
7136 dbl = 1;
7137 case M_MULOU:
7138 do_mulou:
7139 start_noreorder ();
7140 used_at = 1;
7141 if (imm)
7142 load_register (AT, &imm_expr, dbl);
7143 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7144 sreg, imm ? AT : treg);
7145 macro_build (NULL, "mfhi", "d", AT);
7146 macro_build (NULL, "mflo", "d", dreg);
7147 if (mips_trap)
7148 macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7149 else
7150 {
7151 expr1.X_add_number = 8;
7152 macro_build (&expr1, "beq", "s,t,p", AT, 0);
7153 macro_build (NULL, "nop", "", 0);
7154 macro_build (NULL, "break", "c", 6);
7155 }
7156 end_noreorder ();
7157 break;
7158
7159 case M_DROL:
7160 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7161 {
7162 if (dreg == sreg)
7163 {
7164 tempreg = AT;
7165 used_at = 1;
7166 }
7167 else
7168 {
7169 tempreg = dreg;
7170 }
7171 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7172 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7173 break;
7174 }
7175 used_at = 1;
7176 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7177 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7178 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7179 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7180 break;
7181
7182 case M_ROL:
7183 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7184 {
7185 if (dreg == sreg)
7186 {
7187 tempreg = AT;
7188 used_at = 1;
7189 }
7190 else
7191 {
7192 tempreg = dreg;
7193 }
7194 macro_build (NULL, "negu", "d,w", tempreg, treg);
7195 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7196 break;
7197 }
7198 used_at = 1;
7199 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7200 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7201 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7202 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7203 break;
7204
7205 case M_DROL_I:
7206 {
7207 unsigned int rot;
7208 char *l, *r;
7209
7210 if (imm_expr.X_op != O_constant)
7211 as_bad (_("Improper rotate count"));
7212 rot = imm_expr.X_add_number & 0x3f;
7213 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7214 {
7215 rot = (64 - rot) & 0x3f;
7216 if (rot >= 32)
7217 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7218 else
7219 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7220 break;
7221 }
7222 if (rot == 0)
7223 {
7224 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7225 break;
7226 }
7227 l = (rot < 0x20) ? "dsll" : "dsll32";
7228 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7229 rot &= 0x1f;
7230 used_at = 1;
7231 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7232 macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7233 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7234 }
7235 break;
7236
7237 case M_ROL_I:
7238 {
7239 unsigned int rot;
7240
7241 if (imm_expr.X_op != O_constant)
7242 as_bad (_("Improper rotate count"));
7243 rot = imm_expr.X_add_number & 0x1f;
7244 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7245 {
7246 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7247 break;
7248 }
7249 if (rot == 0)
7250 {
7251 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7252 break;
7253 }
7254 used_at = 1;
7255 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7256 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7257 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7258 }
7259 break;
7260
7261 case M_DROR:
7262 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7263 {
7264 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7265 break;
7266 }
7267 used_at = 1;
7268 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7269 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7270 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7271 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7272 break;
7273
7274 case M_ROR:
7275 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7276 {
7277 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7278 break;
7279 }
7280 used_at = 1;
7281 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7282 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7283 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7284 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7285 break;
7286
7287 case M_DROR_I:
7288 {
7289 unsigned int rot;
7290 char *l, *r;
7291
7292 if (imm_expr.X_op != O_constant)
7293 as_bad (_("Improper rotate count"));
7294 rot = imm_expr.X_add_number & 0x3f;
7295 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7296 {
7297 if (rot >= 32)
7298 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7299 else
7300 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7301 break;
7302 }
7303 if (rot == 0)
7304 {
7305 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7306 break;
7307 }
7308 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7309 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7310 rot &= 0x1f;
7311 used_at = 1;
7312 macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7313 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7314 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7315 }
7316 break;
7317
7318 case M_ROR_I:
7319 {
7320 unsigned int rot;
7321
7322 if (imm_expr.X_op != O_constant)
7323 as_bad (_("Improper rotate count"));
7324 rot = imm_expr.X_add_number & 0x1f;
7325 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7326 {
7327 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7328 break;
7329 }
7330 if (rot == 0)
7331 {
7332 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7333 break;
7334 }
7335 used_at = 1;
7336 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7337 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7338 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7339 }
7340 break;
7341
7342 case M_S_DOB:
7343 if (mips_opts.arch == CPU_R4650)
7344 {
7345 as_bad (_("opcode not supported on this processor"));
7346 break;
7347 }
7348 assert (mips_opts.isa == ISA_MIPS1);
7349 /* Even on a big endian machine $fn comes before $fn+1. We have
7350 to adjust when storing to memory. */
7351 macro_build (&offset_expr, "swc1", "T,o(b)",
7352 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7353 offset_expr.X_add_number += 4;
7354 macro_build (&offset_expr, "swc1", "T,o(b)",
7355 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7356 break;
7357
7358 case M_SEQ:
7359 if (sreg == 0)
7360 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7361 else if (treg == 0)
7362 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7363 else
7364 {
7365 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7366 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7367 }
7368 break;
7369
7370 case M_SEQ_I:
7371 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7372 {
7373 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7374 break;
7375 }
7376 if (sreg == 0)
7377 {
7378 as_warn (_("Instruction %s: result is always false"),
7379 ip->insn_mo->name);
7380 move_register (dreg, 0);
7381 break;
7382 }
7383 if (imm_expr.X_op == O_constant
7384 && imm_expr.X_add_number >= 0
7385 && imm_expr.X_add_number < 0x10000)
7386 {
7387 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7388 }
7389 else if (imm_expr.X_op == O_constant
7390 && imm_expr.X_add_number > -0x8000
7391 && imm_expr.X_add_number < 0)
7392 {
7393 imm_expr.X_add_number = -imm_expr.X_add_number;
7394 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7395 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7396 }
7397 else
7398 {
7399 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7400 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7401 used_at = 1;
7402 }
7403 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7404 break;
7405
7406 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7407 s = "slt";
7408 goto sge;
7409 case M_SGEU:
7410 s = "sltu";
7411 sge:
7412 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7413 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7414 break;
7415
7416 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7417 case M_SGEU_I:
7418 if (imm_expr.X_op == O_constant
7419 && imm_expr.X_add_number >= -0x8000
7420 && imm_expr.X_add_number < 0x8000)
7421 {
7422 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7423 dreg, sreg, BFD_RELOC_LO16);
7424 }
7425 else
7426 {
7427 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7428 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7429 dreg, sreg, AT);
7430 used_at = 1;
7431 }
7432 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7433 break;
7434
7435 case M_SGT: /* sreg > treg <==> treg < sreg */
7436 s = "slt";
7437 goto sgt;
7438 case M_SGTU:
7439 s = "sltu";
7440 sgt:
7441 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7442 break;
7443
7444 case M_SGT_I: /* sreg > I <==> I < sreg */
7445 s = "slt";
7446 goto sgti;
7447 case M_SGTU_I:
7448 s = "sltu";
7449 sgti:
7450 used_at = 1;
7451 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7452 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7453 break;
7454
7455 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7456 s = "slt";
7457 goto sle;
7458 case M_SLEU:
7459 s = "sltu";
7460 sle:
7461 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7462 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7463 break;
7464
7465 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7466 s = "slt";
7467 goto slei;
7468 case M_SLEU_I:
7469 s = "sltu";
7470 slei:
7471 used_at = 1;
7472 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7473 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7474 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7475 break;
7476
7477 case M_SLT_I:
7478 if (imm_expr.X_op == O_constant
7479 && imm_expr.X_add_number >= -0x8000
7480 && imm_expr.X_add_number < 0x8000)
7481 {
7482 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7483 break;
7484 }
7485 used_at = 1;
7486 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7487 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7488 break;
7489
7490 case M_SLTU_I:
7491 if (imm_expr.X_op == O_constant
7492 && imm_expr.X_add_number >= -0x8000
7493 && imm_expr.X_add_number < 0x8000)
7494 {
7495 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7496 BFD_RELOC_LO16);
7497 break;
7498 }
7499 used_at = 1;
7500 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7501 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7502 break;
7503
7504 case M_SNE:
7505 if (sreg == 0)
7506 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7507 else if (treg == 0)
7508 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7509 else
7510 {
7511 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7512 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7513 }
7514 break;
7515
7516 case M_SNE_I:
7517 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7518 {
7519 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7520 break;
7521 }
7522 if (sreg == 0)
7523 {
7524 as_warn (_("Instruction %s: result is always true"),
7525 ip->insn_mo->name);
7526 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7527 dreg, 0, BFD_RELOC_LO16);
7528 break;
7529 }
7530 if (imm_expr.X_op == O_constant
7531 && imm_expr.X_add_number >= 0
7532 && imm_expr.X_add_number < 0x10000)
7533 {
7534 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7535 }
7536 else if (imm_expr.X_op == O_constant
7537 && imm_expr.X_add_number > -0x8000
7538 && imm_expr.X_add_number < 0)
7539 {
7540 imm_expr.X_add_number = -imm_expr.X_add_number;
7541 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7542 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7543 }
7544 else
7545 {
7546 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7547 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7548 used_at = 1;
7549 }
7550 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7551 break;
7552
7553 case M_DSUB_I:
7554 dbl = 1;
7555 case M_SUB_I:
7556 if (imm_expr.X_op == O_constant
7557 && imm_expr.X_add_number > -0x8000
7558 && imm_expr.X_add_number <= 0x8000)
7559 {
7560 imm_expr.X_add_number = -imm_expr.X_add_number;
7561 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7562 dreg, sreg, BFD_RELOC_LO16);
7563 break;
7564 }
7565 used_at = 1;
7566 load_register (AT, &imm_expr, dbl);
7567 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7568 break;
7569
7570 case M_DSUBU_I:
7571 dbl = 1;
7572 case M_SUBU_I:
7573 if (imm_expr.X_op == O_constant
7574 && imm_expr.X_add_number > -0x8000
7575 && imm_expr.X_add_number <= 0x8000)
7576 {
7577 imm_expr.X_add_number = -imm_expr.X_add_number;
7578 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7579 dreg, sreg, BFD_RELOC_LO16);
7580 break;
7581 }
7582 used_at = 1;
7583 load_register (AT, &imm_expr, dbl);
7584 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7585 break;
7586
7587 case M_TEQ_I:
7588 s = "teq";
7589 goto trap;
7590 case M_TGE_I:
7591 s = "tge";
7592 goto trap;
7593 case M_TGEU_I:
7594 s = "tgeu";
7595 goto trap;
7596 case M_TLT_I:
7597 s = "tlt";
7598 goto trap;
7599 case M_TLTU_I:
7600 s = "tltu";
7601 goto trap;
7602 case M_TNE_I:
7603 s = "tne";
7604 trap:
7605 used_at = 1;
7606 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7607 macro_build (NULL, s, "s,t", sreg, AT);
7608 break;
7609
7610 case M_TRUNCWS:
7611 case M_TRUNCWD:
7612 assert (mips_opts.isa == ISA_MIPS1);
7613 used_at = 1;
7614 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7615 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7616
7617 /*
7618 * Is the double cfc1 instruction a bug in the mips assembler;
7619 * or is there a reason for it?
7620 */
7621 start_noreorder ();
7622 macro_build (NULL, "cfc1", "t,G", treg, RA);
7623 macro_build (NULL, "cfc1", "t,G", treg, RA);
7624 macro_build (NULL, "nop", "");
7625 expr1.X_add_number = 3;
7626 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7627 expr1.X_add_number = 2;
7628 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7629 macro_build (NULL, "ctc1", "t,G", AT, RA);
7630 macro_build (NULL, "nop", "");
7631 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7632 dreg, sreg);
7633 macro_build (NULL, "ctc1", "t,G", treg, RA);
7634 macro_build (NULL, "nop", "");
7635 end_noreorder ();
7636 break;
7637
7638 case M_ULH:
7639 s = "lb";
7640 goto ulh;
7641 case M_ULHU:
7642 s = "lbu";
7643 ulh:
7644 used_at = 1;
7645 if (offset_expr.X_add_number >= 0x7fff)
7646 as_bad (_("operand overflow"));
7647 if (! target_big_endian)
7648 ++offset_expr.X_add_number;
7649 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7650 if (! target_big_endian)
7651 --offset_expr.X_add_number;
7652 else
7653 ++offset_expr.X_add_number;
7654 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7655 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7656 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7657 break;
7658
7659 case M_ULD:
7660 s = "ldl";
7661 s2 = "ldr";
7662 off = 7;
7663 goto ulw;
7664 case M_ULW:
7665 s = "lwl";
7666 s2 = "lwr";
7667 off = 3;
7668 ulw:
7669 if (offset_expr.X_add_number >= 0x8000 - off)
7670 as_bad (_("operand overflow"));
7671 if (treg != breg)
7672 tempreg = treg;
7673 else
7674 {
7675 used_at = 1;
7676 tempreg = AT;
7677 }
7678 if (! target_big_endian)
7679 offset_expr.X_add_number += off;
7680 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7681 if (! target_big_endian)
7682 offset_expr.X_add_number -= off;
7683 else
7684 offset_expr.X_add_number += off;
7685 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7686
7687 /* If necessary, move the result in tempreg the final destination. */
7688 if (treg == tempreg)
7689 break;
7690 /* Protect second load's delay slot. */
7691 load_delay_nop ();
7692 move_register (treg, tempreg);
7693 break;
7694
7695 case M_ULD_A:
7696 s = "ldl";
7697 s2 = "ldr";
7698 off = 7;
7699 goto ulwa;
7700 case M_ULW_A:
7701 s = "lwl";
7702 s2 = "lwr";
7703 off = 3;
7704 ulwa:
7705 used_at = 1;
7706 load_address (AT, &offset_expr, &used_at);
7707 if (breg != 0)
7708 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7709 if (! target_big_endian)
7710 expr1.X_add_number = off;
7711 else
7712 expr1.X_add_number = 0;
7713 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7714 if (! target_big_endian)
7715 expr1.X_add_number = 0;
7716 else
7717 expr1.X_add_number = off;
7718 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7719 break;
7720
7721 case M_ULH_A:
7722 case M_ULHU_A:
7723 used_at = 1;
7724 load_address (AT, &offset_expr, &used_at);
7725 if (breg != 0)
7726 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7727 if (target_big_endian)
7728 expr1.X_add_number = 0;
7729 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7730 treg, BFD_RELOC_LO16, AT);
7731 if (target_big_endian)
7732 expr1.X_add_number = 1;
7733 else
7734 expr1.X_add_number = 0;
7735 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7736 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7737 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7738 break;
7739
7740 case M_USH:
7741 used_at = 1;
7742 if (offset_expr.X_add_number >= 0x7fff)
7743 as_bad (_("operand overflow"));
7744 if (target_big_endian)
7745 ++offset_expr.X_add_number;
7746 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7747 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7748 if (target_big_endian)
7749 --offset_expr.X_add_number;
7750 else
7751 ++offset_expr.X_add_number;
7752 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7753 break;
7754
7755 case M_USD:
7756 s = "sdl";
7757 s2 = "sdr";
7758 off = 7;
7759 goto usw;
7760 case M_USW:
7761 s = "swl";
7762 s2 = "swr";
7763 off = 3;
7764 usw:
7765 if (offset_expr.X_add_number >= 0x8000 - off)
7766 as_bad (_("operand overflow"));
7767 if (! target_big_endian)
7768 offset_expr.X_add_number += off;
7769 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7770 if (! target_big_endian)
7771 offset_expr.X_add_number -= off;
7772 else
7773 offset_expr.X_add_number += off;
7774 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7775 break;
7776
7777 case M_USD_A:
7778 s = "sdl";
7779 s2 = "sdr";
7780 off = 7;
7781 goto uswa;
7782 case M_USW_A:
7783 s = "swl";
7784 s2 = "swr";
7785 off = 3;
7786 uswa:
7787 used_at = 1;
7788 load_address (AT, &offset_expr, &used_at);
7789 if (breg != 0)
7790 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7791 if (! target_big_endian)
7792 expr1.X_add_number = off;
7793 else
7794 expr1.X_add_number = 0;
7795 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7796 if (! target_big_endian)
7797 expr1.X_add_number = 0;
7798 else
7799 expr1.X_add_number = off;
7800 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7801 break;
7802
7803 case M_USH_A:
7804 used_at = 1;
7805 load_address (AT, &offset_expr, &used_at);
7806 if (breg != 0)
7807 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7808 if (! target_big_endian)
7809 expr1.X_add_number = 0;
7810 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7811 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7812 if (! target_big_endian)
7813 expr1.X_add_number = 1;
7814 else
7815 expr1.X_add_number = 0;
7816 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7817 if (! target_big_endian)
7818 expr1.X_add_number = 0;
7819 else
7820 expr1.X_add_number = 1;
7821 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7822 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7823 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7824 break;
7825
7826 default:
7827 /* FIXME: Check if this is one of the itbl macros, since they
7828 are added dynamically. */
7829 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7830 break;
7831 }
7832 if (mips_opts.noat && used_at)
7833 as_bad (_("Macro used $at after \".set noat\""));
7834 }
7835
7836 /* Implement macros in mips16 mode. */
7837
7838 static void
7839 mips16_macro (struct mips_cl_insn *ip)
7840 {
7841 int mask;
7842 int xreg, yreg, zreg, tmp;
7843 expressionS expr1;
7844 int dbl;
7845 const char *s, *s2, *s3;
7846
7847 mask = ip->insn_mo->mask;
7848
7849 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7850 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7851 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7852
7853 expr1.X_op = O_constant;
7854 expr1.X_op_symbol = NULL;
7855 expr1.X_add_symbol = NULL;
7856 expr1.X_add_number = 1;
7857
7858 dbl = 0;
7859
7860 switch (mask)
7861 {
7862 default:
7863 internalError ();
7864
7865 case M_DDIV_3:
7866 dbl = 1;
7867 case M_DIV_3:
7868 s = "mflo";
7869 goto do_div3;
7870 case M_DREM_3:
7871 dbl = 1;
7872 case M_REM_3:
7873 s = "mfhi";
7874 do_div3:
7875 start_noreorder ();
7876 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7877 expr1.X_add_number = 2;
7878 macro_build (&expr1, "bnez", "x,p", yreg);
7879 macro_build (NULL, "break", "6", 7);
7880
7881 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7882 since that causes an overflow. We should do that as well,
7883 but I don't see how to do the comparisons without a temporary
7884 register. */
7885 end_noreorder ();
7886 macro_build (NULL, s, "x", zreg);
7887 break;
7888
7889 case M_DIVU_3:
7890 s = "divu";
7891 s2 = "mflo";
7892 goto do_divu3;
7893 case M_REMU_3:
7894 s = "divu";
7895 s2 = "mfhi";
7896 goto do_divu3;
7897 case M_DDIVU_3:
7898 s = "ddivu";
7899 s2 = "mflo";
7900 goto do_divu3;
7901 case M_DREMU_3:
7902 s = "ddivu";
7903 s2 = "mfhi";
7904 do_divu3:
7905 start_noreorder ();
7906 macro_build (NULL, s, "0,x,y", xreg, yreg);
7907 expr1.X_add_number = 2;
7908 macro_build (&expr1, "bnez", "x,p", yreg);
7909 macro_build (NULL, "break", "6", 7);
7910 end_noreorder ();
7911 macro_build (NULL, s2, "x", zreg);
7912 break;
7913
7914 case M_DMUL:
7915 dbl = 1;
7916 case M_MUL:
7917 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7918 macro_build (NULL, "mflo", "x", zreg);
7919 break;
7920
7921 case M_DSUBU_I:
7922 dbl = 1;
7923 goto do_subu;
7924 case M_SUBU_I:
7925 do_subu:
7926 if (imm_expr.X_op != O_constant)
7927 as_bad (_("Unsupported large constant"));
7928 imm_expr.X_add_number = -imm_expr.X_add_number;
7929 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7930 break;
7931
7932 case M_SUBU_I_2:
7933 if (imm_expr.X_op != O_constant)
7934 as_bad (_("Unsupported large constant"));
7935 imm_expr.X_add_number = -imm_expr.X_add_number;
7936 macro_build (&imm_expr, "addiu", "x,k", xreg);
7937 break;
7938
7939 case M_DSUBU_I_2:
7940 if (imm_expr.X_op != O_constant)
7941 as_bad (_("Unsupported large constant"));
7942 imm_expr.X_add_number = -imm_expr.X_add_number;
7943 macro_build (&imm_expr, "daddiu", "y,j", yreg);
7944 break;
7945
7946 case M_BEQ:
7947 s = "cmp";
7948 s2 = "bteqz";
7949 goto do_branch;
7950 case M_BNE:
7951 s = "cmp";
7952 s2 = "btnez";
7953 goto do_branch;
7954 case M_BLT:
7955 s = "slt";
7956 s2 = "btnez";
7957 goto do_branch;
7958 case M_BLTU:
7959 s = "sltu";
7960 s2 = "btnez";
7961 goto do_branch;
7962 case M_BLE:
7963 s = "slt";
7964 s2 = "bteqz";
7965 goto do_reverse_branch;
7966 case M_BLEU:
7967 s = "sltu";
7968 s2 = "bteqz";
7969 goto do_reverse_branch;
7970 case M_BGE:
7971 s = "slt";
7972 s2 = "bteqz";
7973 goto do_branch;
7974 case M_BGEU:
7975 s = "sltu";
7976 s2 = "bteqz";
7977 goto do_branch;
7978 case M_BGT:
7979 s = "slt";
7980 s2 = "btnez";
7981 goto do_reverse_branch;
7982 case M_BGTU:
7983 s = "sltu";
7984 s2 = "btnez";
7985
7986 do_reverse_branch:
7987 tmp = xreg;
7988 xreg = yreg;
7989 yreg = tmp;
7990
7991 do_branch:
7992 macro_build (NULL, s, "x,y", xreg, yreg);
7993 macro_build (&offset_expr, s2, "p");
7994 break;
7995
7996 case M_BEQ_I:
7997 s = "cmpi";
7998 s2 = "bteqz";
7999 s3 = "x,U";
8000 goto do_branch_i;
8001 case M_BNE_I:
8002 s = "cmpi";
8003 s2 = "btnez";
8004 s3 = "x,U";
8005 goto do_branch_i;
8006 case M_BLT_I:
8007 s = "slti";
8008 s2 = "btnez";
8009 s3 = "x,8";
8010 goto do_branch_i;
8011 case M_BLTU_I:
8012 s = "sltiu";
8013 s2 = "btnez";
8014 s3 = "x,8";
8015 goto do_branch_i;
8016 case M_BLE_I:
8017 s = "slti";
8018 s2 = "btnez";
8019 s3 = "x,8";
8020 goto do_addone_branch_i;
8021 case M_BLEU_I:
8022 s = "sltiu";
8023 s2 = "btnez";
8024 s3 = "x,8";
8025 goto do_addone_branch_i;
8026 case M_BGE_I:
8027 s = "slti";
8028 s2 = "bteqz";
8029 s3 = "x,8";
8030 goto do_branch_i;
8031 case M_BGEU_I:
8032 s = "sltiu";
8033 s2 = "bteqz";
8034 s3 = "x,8";
8035 goto do_branch_i;
8036 case M_BGT_I:
8037 s = "slti";
8038 s2 = "bteqz";
8039 s3 = "x,8";
8040 goto do_addone_branch_i;
8041 case M_BGTU_I:
8042 s = "sltiu";
8043 s2 = "bteqz";
8044 s3 = "x,8";
8045
8046 do_addone_branch_i:
8047 if (imm_expr.X_op != O_constant)
8048 as_bad (_("Unsupported large constant"));
8049 ++imm_expr.X_add_number;
8050
8051 do_branch_i:
8052 macro_build (&imm_expr, s, s3, xreg);
8053 macro_build (&offset_expr, s2, "p");
8054 break;
8055
8056 case M_ABS:
8057 expr1.X_add_number = 0;
8058 macro_build (&expr1, "slti", "x,8", yreg);
8059 if (xreg != yreg)
8060 move_register (xreg, yreg);
8061 expr1.X_add_number = 2;
8062 macro_build (&expr1, "bteqz", "p");
8063 macro_build (NULL, "neg", "x,w", xreg, xreg);
8064 }
8065 }
8066
8067 /* For consistency checking, verify that all bits are specified either
8068 by the match/mask part of the instruction definition, or by the
8069 operand list. */
8070 static int
8071 validate_mips_insn (const struct mips_opcode *opc)
8072 {
8073 const char *p = opc->args;
8074 char c;
8075 unsigned long used_bits = opc->mask;
8076
8077 if ((used_bits & opc->match) != opc->match)
8078 {
8079 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8080 opc->name, opc->args);
8081 return 0;
8082 }
8083 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8084 while (*p)
8085 switch (c = *p++)
8086 {
8087 case ',': break;
8088 case '(': break;
8089 case ')': break;
8090 case '+':
8091 switch (c = *p++)
8092 {
8093 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8094 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8095 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8096 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
8097 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8098 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8099 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8100 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8101 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8102 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8103 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8104 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8105 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8106 case 'I': break;
8107 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8108 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8109 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8110 default:
8111 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8112 c, opc->name, opc->args);
8113 return 0;
8114 }
8115 break;
8116 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8117 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8118 case 'A': break;
8119 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8120 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8121 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8122 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8123 case 'F': break;
8124 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8125 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8126 case 'I': break;
8127 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8128 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8129 case 'L': break;
8130 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8131 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8132 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8133 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8134 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8135 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8136 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8137 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8138 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8139 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8140 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8141 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8142 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8143 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8144 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8145 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8146 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8147 case 'f': break;
8148 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8149 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8150 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8151 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8152 case 'l': break;
8153 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8154 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8155 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8156 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8157 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8158 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8159 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8160 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8161 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8162 case 'x': break;
8163 case 'z': break;
8164 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8165 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8166 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8167 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8168 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8169 case '[': break;
8170 case ']': break;
8171 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8172 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8173 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8174 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8175 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8176 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8177 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8178 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8179 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8180 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8181 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
8182 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8183 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8184 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8185 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8186 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8187 default:
8188 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8189 c, opc->name, opc->args);
8190 return 0;
8191 }
8192 #undef USE_BITS
8193 if (used_bits != 0xffffffff)
8194 {
8195 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8196 ~used_bits & 0xffffffff, opc->name, opc->args);
8197 return 0;
8198 }
8199 return 1;
8200 }
8201
8202 /* UDI immediates. */
8203 struct mips_immed {
8204 char type;
8205 unsigned int shift;
8206 unsigned long mask;
8207 const char * desc;
8208 };
8209
8210 static const struct mips_immed mips_immed[] = {
8211 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8212 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8213 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8214 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8215 { 0,0,0,0 }
8216 };
8217
8218 /* Check whether an odd floating-point register is allowed. */
8219 static int
8220 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8221 {
8222 const char *s = insn->name;
8223
8224 if (insn->pinfo == INSN_MACRO)
8225 /* Let a macro pass, we'll catch it later when it is expanded. */
8226 return 1;
8227
8228 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8229 {
8230 /* Allow odd registers for single-precision ops. */
8231 switch (insn->pinfo & (FP_S | FP_D))
8232 {
8233 case FP_S:
8234 case 0:
8235 return 1; /* both single precision - ok */
8236 case FP_D:
8237 return 0; /* both double precision - fail */
8238 default:
8239 break;
8240 }
8241
8242 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8243 s = strchr (insn->name, '.');
8244 if (argnum == 2)
8245 s = s != NULL ? strchr (s + 1, '.') : NULL;
8246 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8247 }
8248
8249 /* Single-precision coprocessor loads and moves are OK too. */
8250 if ((insn->pinfo & FP_S)
8251 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8252 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8253 return 1;
8254
8255 return 0;
8256 }
8257
8258 /* This routine assembles an instruction into its binary format. As a
8259 side effect, it sets one of the global variables imm_reloc or
8260 offset_reloc to the type of relocation to do if one of the operands
8261 is an address expression. */
8262
8263 static void
8264 mips_ip (char *str, struct mips_cl_insn *ip)
8265 {
8266 char *s;
8267 const char *args;
8268 char c = 0;
8269 struct mips_opcode *insn;
8270 char *argsStart;
8271 unsigned int regno;
8272 unsigned int lastregno = 0;
8273 unsigned int lastpos = 0;
8274 unsigned int limlo, limhi;
8275 char *s_reset;
8276 char save_c = 0;
8277 offsetT min_range, max_range;
8278 int argnum;
8279 unsigned int rtype;
8280
8281 insn_error = NULL;
8282
8283 /* If the instruction contains a '.', we first try to match an instruction
8284 including the '.'. Then we try again without the '.'. */
8285 insn = NULL;
8286 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8287 continue;
8288
8289 /* If we stopped on whitespace, then replace the whitespace with null for
8290 the call to hash_find. Save the character we replaced just in case we
8291 have to re-parse the instruction. */
8292 if (ISSPACE (*s))
8293 {
8294 save_c = *s;
8295 *s++ = '\0';
8296 }
8297
8298 insn = (struct mips_opcode *) hash_find (op_hash, str);
8299
8300 /* If we didn't find the instruction in the opcode table, try again, but
8301 this time with just the instruction up to, but not including the
8302 first '.'. */
8303 if (insn == NULL)
8304 {
8305 /* Restore the character we overwrite above (if any). */
8306 if (save_c)
8307 *(--s) = save_c;
8308
8309 /* Scan up to the first '.' or whitespace. */
8310 for (s = str;
8311 *s != '\0' && *s != '.' && !ISSPACE (*s);
8312 ++s)
8313 continue;
8314
8315 /* If we did not find a '.', then we can quit now. */
8316 if (*s != '.')
8317 {
8318 insn_error = "unrecognized opcode";
8319 return;
8320 }
8321
8322 /* Lookup the instruction in the hash table. */
8323 *s++ = '\0';
8324 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8325 {
8326 insn_error = "unrecognized opcode";
8327 return;
8328 }
8329 }
8330
8331 argsStart = s;
8332 for (;;)
8333 {
8334 bfd_boolean ok;
8335
8336 assert (strcmp (insn->name, str) == 0);
8337
8338 if (OPCODE_IS_MEMBER (insn,
8339 (mips_opts.isa
8340 /* We don't check for mips_opts.mips16 here since
8341 we want to allow jalx if -mips16 was specified
8342 on the command line. */
8343 | (file_ase_mips16 ? INSN_MIPS16 : 0)
8344 | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8345 | (mips_opts.ase_dsp ? INSN_DSP : 0)
8346 | (mips_opts.ase_mt ? INSN_MT : 0)
8347 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8348 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8349 mips_opts.arch))
8350 ok = TRUE;
8351 else
8352 ok = FALSE;
8353
8354 if (insn->pinfo != INSN_MACRO)
8355 {
8356 if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8357 ok = FALSE;
8358 }
8359
8360 if (! ok)
8361 {
8362 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8363 && strcmp (insn->name, insn[1].name) == 0)
8364 {
8365 ++insn;
8366 continue;
8367 }
8368 else
8369 {
8370 if (!insn_error)
8371 {
8372 static char buf[100];
8373 sprintf (buf,
8374 _("opcode not supported on this processor: %s (%s)"),
8375 mips_cpu_info_from_arch (mips_opts.arch)->name,
8376 mips_cpu_info_from_isa (mips_opts.isa)->name);
8377 insn_error = buf;
8378 }
8379 if (save_c)
8380 *(--s) = save_c;
8381 return;
8382 }
8383 }
8384
8385 create_insn (ip, insn);
8386 insn_error = NULL;
8387 argnum = 1;
8388 for (args = insn->args;; ++args)
8389 {
8390 int is_mdmx;
8391
8392 s += strspn (s, " \t");
8393 is_mdmx = 0;
8394 switch (*args)
8395 {
8396 case '\0': /* end of args */
8397 if (*s == '\0')
8398 return;
8399 break;
8400
8401 case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8402 my_getExpression (&imm_expr, s);
8403 check_absolute_expr (ip, &imm_expr);
8404 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8405 {
8406 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8407 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8408 imm_expr.X_add_number &= OP_MASK_SA3;
8409 }
8410 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA3;
8411 imm_expr.X_op = O_absent;
8412 s = expr_end;
8413 continue;
8414
8415 case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8416 my_getExpression (&imm_expr, s);
8417 check_absolute_expr (ip, &imm_expr);
8418 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8419 {
8420 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8421 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8422 imm_expr.X_add_number &= OP_MASK_SA4;
8423 }
8424 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SA4;
8425 imm_expr.X_op = O_absent;
8426 s = expr_end;
8427 continue;
8428
8429 case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8430 my_getExpression (&imm_expr, s);
8431 check_absolute_expr (ip, &imm_expr);
8432 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8433 {
8434 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8435 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8436 imm_expr.X_add_number &= OP_MASK_IMM8;
8437 }
8438 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_IMM8;
8439 imm_expr.X_op = O_absent;
8440 s = expr_end;
8441 continue;
8442
8443 case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8444 my_getExpression (&imm_expr, s);
8445 check_absolute_expr (ip, &imm_expr);
8446 if (imm_expr.X_add_number & ~OP_MASK_RS)
8447 {
8448 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8449 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8450 imm_expr.X_add_number &= OP_MASK_RS;
8451 }
8452 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RS;
8453 imm_expr.X_op = O_absent;
8454 s = expr_end;
8455 continue;
8456
8457 case '7': /* four dsp accumulators in bits 11,12 */
8458 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8459 s[3] >= '0' && s[3] <= '3')
8460 {
8461 regno = s[3] - '0';
8462 s += 4;
8463 ip->insn_opcode |= regno << OP_SH_DSPACC;
8464 continue;
8465 }
8466 else
8467 as_bad (_("Invalid dsp acc register"));
8468 break;
8469
8470 case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8471 my_getExpression (&imm_expr, s);
8472 check_absolute_expr (ip, &imm_expr);
8473 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8474 {
8475 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8476 OP_MASK_WRDSP,
8477 (unsigned long) imm_expr.X_add_number);
8478 imm_expr.X_add_number &= OP_MASK_WRDSP;
8479 }
8480 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_WRDSP;
8481 imm_expr.X_op = O_absent;
8482 s = expr_end;
8483 continue;
8484
8485 case '9': /* four dsp accumulators in bits 21,22 */
8486 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8487 s[3] >= '0' && s[3] <= '3')
8488 {
8489 regno = s[3] - '0';
8490 s += 4;
8491 ip->insn_opcode |= regno << OP_SH_DSPACC_S;
8492 continue;
8493 }
8494 else
8495 as_bad (_("Invalid dsp acc register"));
8496 break;
8497
8498 case '0': /* dsp 6-bit signed immediate in bit 20 */
8499 my_getExpression (&imm_expr, s);
8500 check_absolute_expr (ip, &imm_expr);
8501 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8502 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8503 if (imm_expr.X_add_number < min_range ||
8504 imm_expr.X_add_number > max_range)
8505 {
8506 as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8507 (long) min_range, (long) max_range,
8508 (long) imm_expr.X_add_number);
8509 }
8510 imm_expr.X_add_number &= OP_MASK_DSPSFT;
8511 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8512 << OP_SH_DSPSFT);
8513 imm_expr.X_op = O_absent;
8514 s = expr_end;
8515 continue;
8516
8517 case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8518 my_getExpression (&imm_expr, s);
8519 check_absolute_expr (ip, &imm_expr);
8520 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8521 {
8522 as_warn (_("DSP immediate not in range 0..%d (%lu)"),
8523 OP_MASK_RDDSP,
8524 (unsigned long) imm_expr.X_add_number);
8525 imm_expr.X_add_number &= OP_MASK_RDDSP;
8526 }
8527 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_RDDSP;
8528 imm_expr.X_op = O_absent;
8529 s = expr_end;
8530 continue;
8531
8532 case ':': /* dsp 7-bit signed immediate in bit 19 */
8533 my_getExpression (&imm_expr, s);
8534 check_absolute_expr (ip, &imm_expr);
8535 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8536 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8537 if (imm_expr.X_add_number < min_range ||
8538 imm_expr.X_add_number > max_range)
8539 {
8540 as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8541 (long) min_range, (long) max_range,
8542 (long) imm_expr.X_add_number);
8543 }
8544 imm_expr.X_add_number &= OP_MASK_DSPSFT_7;
8545 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8546 << OP_SH_DSPSFT_7);
8547 imm_expr.X_op = O_absent;
8548 s = expr_end;
8549 continue;
8550
8551 case '@': /* dsp 10-bit signed immediate in bit 16 */
8552 my_getExpression (&imm_expr, s);
8553 check_absolute_expr (ip, &imm_expr);
8554 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8555 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8556 if (imm_expr.X_add_number < min_range ||
8557 imm_expr.X_add_number > max_range)
8558 {
8559 as_warn (_("DSP immediate not in range %ld..%ld (%ld)"),
8560 (long) min_range, (long) max_range,
8561 (long) imm_expr.X_add_number);
8562 }
8563 imm_expr.X_add_number &= OP_MASK_IMM10;
8564 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8565 << OP_SH_IMM10);
8566 imm_expr.X_op = O_absent;
8567 s = expr_end;
8568 continue;
8569
8570 case '!': /* mt 1-bit unsigned immediate in bit 5 */
8571 my_getExpression (&imm_expr, s);
8572 check_absolute_expr (ip, &imm_expr);
8573 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8574 {
8575 as_warn (_("MT immediate not in range 0..%d (%lu)"),
8576 OP_MASK_MT_U, (unsigned long) imm_expr.X_add_number);
8577 imm_expr.X_add_number &= OP_MASK_MT_U;
8578 }
8579 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_U;
8580 imm_expr.X_op = O_absent;
8581 s = expr_end;
8582 continue;
8583
8584 case '$': /* mt 1-bit unsigned immediate in bit 4 */
8585 my_getExpression (&imm_expr, s);
8586 check_absolute_expr (ip, &imm_expr);
8587 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8588 {
8589 as_warn (_("MT immediate not in range 0..%d (%lu)"),
8590 OP_MASK_MT_H, (unsigned long) imm_expr.X_add_number);
8591 imm_expr.X_add_number &= OP_MASK_MT_H;
8592 }
8593 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_MT_H;
8594 imm_expr.X_op = O_absent;
8595 s = expr_end;
8596 continue;
8597
8598 case '*': /* four dsp accumulators in bits 18,19 */
8599 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8600 s[3] >= '0' && s[3] <= '3')
8601 {
8602 regno = s[3] - '0';
8603 s += 4;
8604 ip->insn_opcode |= regno << OP_SH_MTACC_T;
8605 continue;
8606 }
8607 else
8608 as_bad (_("Invalid dsp/smartmips acc register"));
8609 break;
8610
8611 case '&': /* four dsp accumulators in bits 13,14 */
8612 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8613 s[3] >= '0' && s[3] <= '3')
8614 {
8615 regno = s[3] - '0';
8616 s += 4;
8617 ip->insn_opcode |= regno << OP_SH_MTACC_D;
8618 continue;
8619 }
8620 else
8621 as_bad (_("Invalid dsp/smartmips acc register"));
8622 break;
8623
8624 case ',':
8625 if (*s++ == *args)
8626 continue;
8627 s--;
8628 switch (*++args)
8629 {
8630 case 'r':
8631 case 'v':
8632 INSERT_OPERAND (RS, *ip, lastregno);
8633 continue;
8634
8635 case 'w':
8636 INSERT_OPERAND (RT, *ip, lastregno);
8637 continue;
8638
8639 case 'W':
8640 INSERT_OPERAND (FT, *ip, lastregno);
8641 continue;
8642
8643 case 'V':
8644 INSERT_OPERAND (FS, *ip, lastregno);
8645 continue;
8646 }
8647 break;
8648
8649 case '(':
8650 /* Handle optional base register.
8651 Either the base register is omitted or
8652 we must have a left paren. */
8653 /* This is dependent on the next operand specifier
8654 is a base register specification. */
8655 assert (args[1] == 'b' || args[1] == '5'
8656 || args[1] == '-' || args[1] == '4');
8657 if (*s == '\0')
8658 return;
8659
8660 case ')': /* these must match exactly */
8661 case '[':
8662 case ']':
8663 if (*s++ == *args)
8664 continue;
8665 break;
8666
8667 case '+': /* Opcode extension character. */
8668 switch (*++args)
8669 {
8670 case '1': /* UDI immediates. */
8671 case '2':
8672 case '3':
8673 case '4':
8674 {
8675 const struct mips_immed *imm = mips_immed;
8676
8677 while (imm->type && imm->type != *args)
8678 ++imm;
8679 if (! imm->type)
8680 internalError ();
8681 my_getExpression (&imm_expr, s);
8682 check_absolute_expr (ip, &imm_expr);
8683 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8684 {
8685 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8686 imm->desc ? imm->desc : ip->insn_mo->name,
8687 (unsigned long) imm_expr.X_add_number,
8688 (unsigned long) imm_expr.X_add_number);
8689 imm_expr.X_add_number &= imm->mask;
8690 }
8691 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8692 << imm->shift);
8693 imm_expr.X_op = O_absent;
8694 s = expr_end;
8695 }
8696 continue;
8697
8698 case 'A': /* ins/ext position, becomes LSB. */
8699 limlo = 0;
8700 limhi = 31;
8701 goto do_lsb;
8702 case 'E':
8703 limlo = 32;
8704 limhi = 63;
8705 goto do_lsb;
8706 do_lsb:
8707 my_getExpression (&imm_expr, s);
8708 check_absolute_expr (ip, &imm_expr);
8709 if ((unsigned long) imm_expr.X_add_number < limlo
8710 || (unsigned long) imm_expr.X_add_number > limhi)
8711 {
8712 as_bad (_("Improper position (%lu)"),
8713 (unsigned long) imm_expr.X_add_number);
8714 imm_expr.X_add_number = limlo;
8715 }
8716 lastpos = imm_expr.X_add_number;
8717 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8718 imm_expr.X_op = O_absent;
8719 s = expr_end;
8720 continue;
8721
8722 case 'B': /* ins size, becomes MSB. */
8723 limlo = 1;
8724 limhi = 32;
8725 goto do_msb;
8726 case 'F':
8727 limlo = 33;
8728 limhi = 64;
8729 goto do_msb;
8730 do_msb:
8731 my_getExpression (&imm_expr, s);
8732 check_absolute_expr (ip, &imm_expr);
8733 /* Check for negative input so that small negative numbers
8734 will not succeed incorrectly. The checks against
8735 (pos+size) transitively check "size" itself,
8736 assuming that "pos" is reasonable. */
8737 if ((long) imm_expr.X_add_number < 0
8738 || ((unsigned long) imm_expr.X_add_number
8739 + lastpos) < limlo
8740 || ((unsigned long) imm_expr.X_add_number
8741 + lastpos) > limhi)
8742 {
8743 as_bad (_("Improper insert size (%lu, position %lu)"),
8744 (unsigned long) imm_expr.X_add_number,
8745 (unsigned long) lastpos);
8746 imm_expr.X_add_number = limlo - lastpos;
8747 }
8748 INSERT_OPERAND (INSMSB, *ip,
8749 lastpos + imm_expr.X_add_number - 1);
8750 imm_expr.X_op = O_absent;
8751 s = expr_end;
8752 continue;
8753
8754 case 'C': /* ext size, becomes MSBD. */
8755 limlo = 1;
8756 limhi = 32;
8757 goto do_msbd;
8758 case 'G':
8759 limlo = 33;
8760 limhi = 64;
8761 goto do_msbd;
8762 case 'H':
8763 limlo = 33;
8764 limhi = 64;
8765 goto do_msbd;
8766 do_msbd:
8767 my_getExpression (&imm_expr, s);
8768 check_absolute_expr (ip, &imm_expr);
8769 /* Check for negative input so that small negative numbers
8770 will not succeed incorrectly. The checks against
8771 (pos+size) transitively check "size" itself,
8772 assuming that "pos" is reasonable. */
8773 if ((long) imm_expr.X_add_number < 0
8774 || ((unsigned long) imm_expr.X_add_number
8775 + lastpos) < limlo
8776 || ((unsigned long) imm_expr.X_add_number
8777 + lastpos) > limhi)
8778 {
8779 as_bad (_("Improper extract size (%lu, position %lu)"),
8780 (unsigned long) imm_expr.X_add_number,
8781 (unsigned long) lastpos);
8782 imm_expr.X_add_number = limlo - lastpos;
8783 }
8784 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8785 imm_expr.X_op = O_absent;
8786 s = expr_end;
8787 continue;
8788
8789 case 'D':
8790 /* +D is for disassembly only; never match. */
8791 break;
8792
8793 case 'I':
8794 /* "+I" is like "I", except that imm2_expr is used. */
8795 my_getExpression (&imm2_expr, s);
8796 if (imm2_expr.X_op != O_big
8797 && imm2_expr.X_op != O_constant)
8798 insn_error = _("absolute expression required");
8799 if (HAVE_32BIT_GPRS)
8800 normalize_constant_expr (&imm2_expr);
8801 s = expr_end;
8802 continue;
8803
8804 case 'T': /* Coprocessor register. */
8805 /* +T is for disassembly only; never match. */
8806 break;
8807
8808 case 't': /* Coprocessor register number. */
8809 if (s[0] == '$' && ISDIGIT (s[1]))
8810 {
8811 ++s;
8812 regno = 0;
8813 do
8814 {
8815 regno *= 10;
8816 regno += *s - '0';
8817 ++s;
8818 }
8819 while (ISDIGIT (*s));
8820 if (regno > 31)
8821 as_bad (_("Invalid register number (%d)"), regno);
8822 else
8823 {
8824 ip->insn_opcode |= regno << OP_SH_RT;
8825 continue;
8826 }
8827 }
8828 else
8829 as_bad (_("Invalid coprocessor 0 register number"));
8830 break;
8831
8832 default:
8833 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8834 *args, insn->name, insn->args);
8835 /* Further processing is fruitless. */
8836 return;
8837 }
8838 break;
8839
8840 case '<': /* must be at least one digit */
8841 /*
8842 * According to the manual, if the shift amount is greater
8843 * than 31 or less than 0, then the shift amount should be
8844 * mod 32. In reality the mips assembler issues an error.
8845 * We issue a warning and mask out all but the low 5 bits.
8846 */
8847 my_getExpression (&imm_expr, s);
8848 check_absolute_expr (ip, &imm_expr);
8849 if ((unsigned long) imm_expr.X_add_number > 31)
8850 as_warn (_("Improper shift amount (%lu)"),
8851 (unsigned long) imm_expr.X_add_number);
8852 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8853 imm_expr.X_op = O_absent;
8854 s = expr_end;
8855 continue;
8856
8857 case '>': /* shift amount minus 32 */
8858 my_getExpression (&imm_expr, s);
8859 check_absolute_expr (ip, &imm_expr);
8860 if ((unsigned long) imm_expr.X_add_number < 32
8861 || (unsigned long) imm_expr.X_add_number > 63)
8862 break;
8863 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8864 imm_expr.X_op = O_absent;
8865 s = expr_end;
8866 continue;
8867
8868 case 'k': /* cache code */
8869 case 'h': /* prefx code */
8870 my_getExpression (&imm_expr, s);
8871 check_absolute_expr (ip, &imm_expr);
8872 if ((unsigned long) imm_expr.X_add_number > 31)
8873 as_warn (_("Invalid value for `%s' (%lu)"),
8874 ip->insn_mo->name,
8875 (unsigned long) imm_expr.X_add_number);
8876 if (*args == 'k')
8877 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8878 else
8879 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8880 imm_expr.X_op = O_absent;
8881 s = expr_end;
8882 continue;
8883
8884 case 'c': /* break code */
8885 my_getExpression (&imm_expr, s);
8886 check_absolute_expr (ip, &imm_expr);
8887 if ((unsigned long) imm_expr.X_add_number > 1023)
8888 as_warn (_("Illegal break code (%lu)"),
8889 (unsigned long) imm_expr.X_add_number);
8890 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
8891 imm_expr.X_op = O_absent;
8892 s = expr_end;
8893 continue;
8894
8895 case 'q': /* lower break code */
8896 my_getExpression (&imm_expr, s);
8897 check_absolute_expr (ip, &imm_expr);
8898 if ((unsigned long) imm_expr.X_add_number > 1023)
8899 as_warn (_("Illegal lower break code (%lu)"),
8900 (unsigned long) imm_expr.X_add_number);
8901 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
8902 imm_expr.X_op = O_absent;
8903 s = expr_end;
8904 continue;
8905
8906 case 'B': /* 20-bit syscall/break code. */
8907 my_getExpression (&imm_expr, s);
8908 check_absolute_expr (ip, &imm_expr);
8909 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8910 as_warn (_("Illegal 20-bit code (%lu)"),
8911 (unsigned long) imm_expr.X_add_number);
8912 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
8913 imm_expr.X_op = O_absent;
8914 s = expr_end;
8915 continue;
8916
8917 case 'C': /* Coprocessor code */
8918 my_getExpression (&imm_expr, s);
8919 check_absolute_expr (ip, &imm_expr);
8920 if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8921 {
8922 as_warn (_("Coproccesor code > 25 bits (%lu)"),
8923 (unsigned long) imm_expr.X_add_number);
8924 imm_expr.X_add_number &= ((1 << 25) - 1);
8925 }
8926 ip->insn_opcode |= imm_expr.X_add_number;
8927 imm_expr.X_op = O_absent;
8928 s = expr_end;
8929 continue;
8930
8931 case 'J': /* 19-bit wait code. */
8932 my_getExpression (&imm_expr, s);
8933 check_absolute_expr (ip, &imm_expr);
8934 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8935 as_warn (_("Illegal 19-bit code (%lu)"),
8936 (unsigned long) imm_expr.X_add_number);
8937 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
8938 imm_expr.X_op = O_absent;
8939 s = expr_end;
8940 continue;
8941
8942 case 'P': /* Performance register. */
8943 my_getExpression (&imm_expr, s);
8944 check_absolute_expr (ip, &imm_expr);
8945 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8946 as_warn (_("Invalid performance register (%lu)"),
8947 (unsigned long) imm_expr.X_add_number);
8948 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
8949 imm_expr.X_op = O_absent;
8950 s = expr_end;
8951 continue;
8952
8953 case 'G': /* Coprocessor destination register. */
8954 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
8955 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
8956 else
8957 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
8958 ip->insn_opcode |= regno << OP_SH_RD;
8959 if (ok)
8960 {
8961 lastregno = regno;
8962 continue;
8963 }
8964 else
8965 break;
8966
8967 case 'b': /* base register */
8968 case 'd': /* destination register */
8969 case 's': /* source register */
8970 case 't': /* target register */
8971 case 'r': /* both target and source */
8972 case 'v': /* both dest and source */
8973 case 'w': /* both dest and target */
8974 case 'E': /* coprocessor target register */
8975 case 'K': /* 'rdhwr' destination register */
8976 case 'x': /* ignore register name */
8977 case 'z': /* must be zero register */
8978 case 'U': /* destination register (clo/clz). */
8979 case 'g': /* coprocessor destination register */
8980 s_reset = s;
8981 if (*args == 'E' || *args == 'K')
8982 ok = reg_lookup (&s, RTYPE_NUM, &regno);
8983 else
8984 {
8985 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
8986 if (regno == AT && ! mips_opts.noat)
8987 as_warn ("Used $at without \".set noat\"");
8988 }
8989 if (ok)
8990 {
8991 c = *args;
8992 if (*s == ' ')
8993 ++s;
8994 if (args[1] != *s)
8995 {
8996 if (c == 'r' || c == 'v' || c == 'w')
8997 {
8998 regno = lastregno;
8999 s = s_reset;
9000 ++args;
9001 }
9002 }
9003 /* 'z' only matches $0. */
9004 if (c == 'z' && regno != 0)
9005 break;
9006
9007 /* Now that we have assembled one operand, we use the args string
9008 * to figure out where it goes in the instruction. */
9009 switch (c)
9010 {
9011 case 'r':
9012 case 's':
9013 case 'v':
9014 case 'b':
9015 INSERT_OPERAND (RS, *ip, regno);
9016 break;
9017 case 'd':
9018 case 'G':
9019 case 'K':
9020 case 'g':
9021 INSERT_OPERAND (RD, *ip, regno);
9022 break;
9023 case 'U':
9024 INSERT_OPERAND (RD, *ip, regno);
9025 INSERT_OPERAND (RT, *ip, regno);
9026 break;
9027 case 'w':
9028 case 't':
9029 case 'E':
9030 INSERT_OPERAND (RT, *ip, regno);
9031 break;
9032 case 'x':
9033 /* This case exists because on the r3000 trunc
9034 expands into a macro which requires a gp
9035 register. On the r6000 or r4000 it is
9036 assembled into a single instruction which
9037 ignores the register. Thus the insn version
9038 is MIPS_ISA2 and uses 'x', and the macro
9039 version is MIPS_ISA1 and uses 't'. */
9040 break;
9041 case 'z':
9042 /* This case is for the div instruction, which
9043 acts differently if the destination argument
9044 is $0. This only matches $0, and is checked
9045 outside the switch. */
9046 break;
9047 case 'D':
9048 /* Itbl operand; not yet implemented. FIXME ?? */
9049 break;
9050 /* What about all other operands like 'i', which
9051 can be specified in the opcode table? */
9052 }
9053 lastregno = regno;
9054 continue;
9055 }
9056 switch (*args++)
9057 {
9058 case 'r':
9059 case 'v':
9060 INSERT_OPERAND (RS, *ip, lastregno);
9061 continue;
9062 case 'w':
9063 INSERT_OPERAND (RT, *ip, lastregno);
9064 continue;
9065 }
9066 break;
9067
9068 case 'O': /* MDMX alignment immediate constant. */
9069 my_getExpression (&imm_expr, s);
9070 check_absolute_expr (ip, &imm_expr);
9071 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9072 as_warn ("Improper align amount (%ld), using low bits",
9073 (long) imm_expr.X_add_number);
9074 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9075 imm_expr.X_op = O_absent;
9076 s = expr_end;
9077 continue;
9078
9079 case 'Q': /* MDMX vector, element sel, or const. */
9080 if (s[0] != '$')
9081 {
9082 /* MDMX Immediate. */
9083 my_getExpression (&imm_expr, s);
9084 check_absolute_expr (ip, &imm_expr);
9085 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9086 as_warn (_("Invalid MDMX Immediate (%ld)"),
9087 (long) imm_expr.X_add_number);
9088 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9089 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9090 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9091 else
9092 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9093 imm_expr.X_op = O_absent;
9094 s = expr_end;
9095 continue;
9096 }
9097 /* Not MDMX Immediate. Fall through. */
9098 case 'X': /* MDMX destination register. */
9099 case 'Y': /* MDMX source register. */
9100 case 'Z': /* MDMX target register. */
9101 is_mdmx = 1;
9102 case 'D': /* floating point destination register */
9103 case 'S': /* floating point source register */
9104 case 'T': /* floating point target register */
9105 case 'R': /* floating point source register */
9106 case 'V':
9107 case 'W':
9108 rtype = RTYPE_FPU;
9109 if (is_mdmx
9110 || (mips_opts.ase_mdmx
9111 && (ip->insn_mo->pinfo & FP_D)
9112 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9113 | INSN_COPROC_MEMORY_DELAY
9114 | INSN_LOAD_COPROC_DELAY
9115 | INSN_LOAD_MEMORY_DELAY
9116 | INSN_STORE_MEMORY))))
9117 rtype |= RTYPE_VEC;
9118 s_reset = s;
9119 if (reg_lookup (&s, rtype, &regno))
9120 {
9121 if ((regno & 1) != 0
9122 && HAVE_32BIT_FPRS
9123 && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9124 as_warn (_("Float register should be even, was %d"),
9125 regno);
9126
9127 c = *args;
9128 if (*s == ' ')
9129 ++s;
9130 if (args[1] != *s)
9131 {
9132 if (c == 'V' || c == 'W')
9133 {
9134 regno = lastregno;
9135 s = s_reset;
9136 ++args;
9137 }
9138 }
9139 switch (c)
9140 {
9141 case 'D':
9142 case 'X':
9143 INSERT_OPERAND (FD, *ip, regno);
9144 break;
9145 case 'V':
9146 case 'S':
9147 case 'Y':
9148 INSERT_OPERAND (FS, *ip, regno);
9149 break;
9150 case 'Q':
9151 /* This is like 'Z', but also needs to fix the MDMX
9152 vector/scalar select bits. Note that the
9153 scalar immediate case is handled above. */
9154 if (*s == '[')
9155 {
9156 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9157 int max_el = (is_qh ? 3 : 7);
9158 s++;
9159 my_getExpression(&imm_expr, s);
9160 check_absolute_expr (ip, &imm_expr);
9161 s = expr_end;
9162 if (imm_expr.X_add_number > max_el)
9163 as_bad(_("Bad element selector %ld"),
9164 (long) imm_expr.X_add_number);
9165 imm_expr.X_add_number &= max_el;
9166 ip->insn_opcode |= (imm_expr.X_add_number
9167 << (OP_SH_VSEL +
9168 (is_qh ? 2 : 1)));
9169 imm_expr.X_op = O_absent;
9170 if (*s != ']')
9171 as_warn(_("Expecting ']' found '%s'"), s);
9172 else
9173 s++;
9174 }
9175 else
9176 {
9177 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9178 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9179 << OP_SH_VSEL);
9180 else
9181 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9182 OP_SH_VSEL);
9183 }
9184 /* Fall through */
9185 case 'W':
9186 case 'T':
9187 case 'Z':
9188 INSERT_OPERAND (FT, *ip, regno);
9189 break;
9190 case 'R':
9191 INSERT_OPERAND (FR, *ip, regno);
9192 break;
9193 }
9194 lastregno = regno;
9195 continue;
9196 }
9197
9198 switch (*args++)
9199 {
9200 case 'V':
9201 INSERT_OPERAND (FS, *ip, lastregno);
9202 continue;
9203 case 'W':
9204 INSERT_OPERAND (FT, *ip, lastregno);
9205 continue;
9206 }
9207 break;
9208
9209 case 'I':
9210 my_getExpression (&imm_expr, s);
9211 if (imm_expr.X_op != O_big
9212 && imm_expr.X_op != O_constant)
9213 insn_error = _("absolute expression required");
9214 if (HAVE_32BIT_GPRS)
9215 normalize_constant_expr (&imm_expr);
9216 s = expr_end;
9217 continue;
9218
9219 case 'A':
9220 my_getExpression (&offset_expr, s);
9221 normalize_address_expr (&offset_expr);
9222 *imm_reloc = BFD_RELOC_32;
9223 s = expr_end;
9224 continue;
9225
9226 case 'F':
9227 case 'L':
9228 case 'f':
9229 case 'l':
9230 {
9231 int f64;
9232 int using_gprs;
9233 char *save_in;
9234 char *err;
9235 unsigned char temp[8];
9236 int len;
9237 unsigned int length;
9238 segT seg;
9239 subsegT subseg;
9240 char *p;
9241
9242 /* These only appear as the last operand in an
9243 instruction, and every instruction that accepts
9244 them in any variant accepts them in all variants.
9245 This means we don't have to worry about backing out
9246 any changes if the instruction does not match.
9247
9248 The difference between them is the size of the
9249 floating point constant and where it goes. For 'F'
9250 and 'L' the constant is 64 bits; for 'f' and 'l' it
9251 is 32 bits. Where the constant is placed is based
9252 on how the MIPS assembler does things:
9253 F -- .rdata
9254 L -- .lit8
9255 f -- immediate value
9256 l -- .lit4
9257
9258 The .lit4 and .lit8 sections are only used if
9259 permitted by the -G argument.
9260
9261 The code below needs to know whether the target register
9262 is 32 or 64 bits wide. It relies on the fact 'f' and
9263 'F' are used with GPR-based instructions and 'l' and
9264 'L' are used with FPR-based instructions. */
9265
9266 f64 = *args == 'F' || *args == 'L';
9267 using_gprs = *args == 'F' || *args == 'f';
9268
9269 save_in = input_line_pointer;
9270 input_line_pointer = s;
9271 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9272 length = len;
9273 s = input_line_pointer;
9274 input_line_pointer = save_in;
9275 if (err != NULL && *err != '\0')
9276 {
9277 as_bad (_("Bad floating point constant: %s"), err);
9278 memset (temp, '\0', sizeof temp);
9279 length = f64 ? 8 : 4;
9280 }
9281
9282 assert (length == (unsigned) (f64 ? 8 : 4));
9283
9284 if (*args == 'f'
9285 || (*args == 'l'
9286 && (g_switch_value < 4
9287 || (temp[0] == 0 && temp[1] == 0)
9288 || (temp[2] == 0 && temp[3] == 0))))
9289 {
9290 imm_expr.X_op = O_constant;
9291 if (! target_big_endian)
9292 imm_expr.X_add_number = bfd_getl32 (temp);
9293 else
9294 imm_expr.X_add_number = bfd_getb32 (temp);
9295 }
9296 else if (length > 4
9297 && ! mips_disable_float_construction
9298 /* Constants can only be constructed in GPRs and
9299 copied to FPRs if the GPRs are at least as wide
9300 as the FPRs. Force the constant into memory if
9301 we are using 64-bit FPRs but the GPRs are only
9302 32 bits wide. */
9303 && (using_gprs
9304 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9305 && ((temp[0] == 0 && temp[1] == 0)
9306 || (temp[2] == 0 && temp[3] == 0))
9307 && ((temp[4] == 0 && temp[5] == 0)
9308 || (temp[6] == 0 && temp[7] == 0)))
9309 {
9310 /* The value is simple enough to load with a couple of
9311 instructions. If using 32-bit registers, set
9312 imm_expr to the high order 32 bits and offset_expr to
9313 the low order 32 bits. Otherwise, set imm_expr to
9314 the entire 64 bit constant. */
9315 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9316 {
9317 imm_expr.X_op = O_constant;
9318 offset_expr.X_op = O_constant;
9319 if (! target_big_endian)
9320 {
9321 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9322 offset_expr.X_add_number = bfd_getl32 (temp);
9323 }
9324 else
9325 {
9326 imm_expr.X_add_number = bfd_getb32 (temp);
9327 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9328 }
9329 if (offset_expr.X_add_number == 0)
9330 offset_expr.X_op = O_absent;
9331 }
9332 else if (sizeof (imm_expr.X_add_number) > 4)
9333 {
9334 imm_expr.X_op = O_constant;
9335 if (! target_big_endian)
9336 imm_expr.X_add_number = bfd_getl64 (temp);
9337 else
9338 imm_expr.X_add_number = bfd_getb64 (temp);
9339 }
9340 else
9341 {
9342 imm_expr.X_op = O_big;
9343 imm_expr.X_add_number = 4;
9344 if (! target_big_endian)
9345 {
9346 generic_bignum[0] = bfd_getl16 (temp);
9347 generic_bignum[1] = bfd_getl16 (temp + 2);
9348 generic_bignum[2] = bfd_getl16 (temp + 4);
9349 generic_bignum[3] = bfd_getl16 (temp + 6);
9350 }
9351 else
9352 {
9353 generic_bignum[0] = bfd_getb16 (temp + 6);
9354 generic_bignum[1] = bfd_getb16 (temp + 4);
9355 generic_bignum[2] = bfd_getb16 (temp + 2);
9356 generic_bignum[3] = bfd_getb16 (temp);
9357 }
9358 }
9359 }
9360 else
9361 {
9362 const char *newname;
9363 segT new_seg;
9364
9365 /* Switch to the right section. */
9366 seg = now_seg;
9367 subseg = now_subseg;
9368 switch (*args)
9369 {
9370 default: /* unused default case avoids warnings. */
9371 case 'L':
9372 newname = RDATA_SECTION_NAME;
9373 if (g_switch_value >= 8)
9374 newname = ".lit8";
9375 break;
9376 case 'F':
9377 newname = RDATA_SECTION_NAME;
9378 break;
9379 case 'l':
9380 assert (g_switch_value >= 4);
9381 newname = ".lit4";
9382 break;
9383 }
9384 new_seg = subseg_new (newname, (subsegT) 0);
9385 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9386 bfd_set_section_flags (stdoutput, new_seg,
9387 (SEC_ALLOC
9388 | SEC_LOAD
9389 | SEC_READONLY
9390 | SEC_DATA));
9391 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9392 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9393 && strcmp (TARGET_OS, "elf") != 0)
9394 record_alignment (new_seg, 4);
9395 else
9396 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9397 if (seg == now_seg)
9398 as_bad (_("Can't use floating point insn in this section"));
9399
9400 /* Set the argument to the current address in the
9401 section. */
9402 offset_expr.X_op = O_symbol;
9403 offset_expr.X_add_symbol =
9404 symbol_new ("L0\001", now_seg,
9405 (valueT) frag_now_fix (), frag_now);
9406 offset_expr.X_add_number = 0;
9407
9408 /* Put the floating point number into the section. */
9409 p = frag_more ((int) length);
9410 memcpy (p, temp, length);
9411
9412 /* Switch back to the original section. */
9413 subseg_set (seg, subseg);
9414 }
9415 }
9416 continue;
9417
9418 case 'i': /* 16 bit unsigned immediate */
9419 case 'j': /* 16 bit signed immediate */
9420 *imm_reloc = BFD_RELOC_LO16;
9421 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9422 {
9423 int more;
9424 offsetT minval, maxval;
9425
9426 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9427 && strcmp (insn->name, insn[1].name) == 0);
9428
9429 /* If the expression was written as an unsigned number,
9430 only treat it as signed if there are no more
9431 alternatives. */
9432 if (more
9433 && *args == 'j'
9434 && sizeof (imm_expr.X_add_number) <= 4
9435 && imm_expr.X_op == O_constant
9436 && imm_expr.X_add_number < 0
9437 && imm_expr.X_unsigned
9438 && HAVE_64BIT_GPRS)
9439 break;
9440
9441 /* For compatibility with older assemblers, we accept
9442 0x8000-0xffff as signed 16-bit numbers when only
9443 signed numbers are allowed. */
9444 if (*args == 'i')
9445 minval = 0, maxval = 0xffff;
9446 else if (more)
9447 minval = -0x8000, maxval = 0x7fff;
9448 else
9449 minval = -0x8000, maxval = 0xffff;
9450
9451 if (imm_expr.X_op != O_constant
9452 || imm_expr.X_add_number < minval
9453 || imm_expr.X_add_number > maxval)
9454 {
9455 if (more)
9456 break;
9457 if (imm_expr.X_op == O_constant
9458 || imm_expr.X_op == O_big)
9459 as_bad (_("expression out of range"));
9460 }
9461 }
9462 s = expr_end;
9463 continue;
9464
9465 case 'o': /* 16 bit offset */
9466 /* Check whether there is only a single bracketed expression
9467 left. If so, it must be the base register and the
9468 constant must be zero. */
9469 if (*s == '(' && strchr (s + 1, '(') == 0)
9470 {
9471 offset_expr.X_op = O_constant;
9472 offset_expr.X_add_number = 0;
9473 continue;
9474 }
9475
9476 /* If this value won't fit into a 16 bit offset, then go
9477 find a macro that will generate the 32 bit offset
9478 code pattern. */
9479 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9480 && (offset_expr.X_op != O_constant
9481 || offset_expr.X_add_number >= 0x8000
9482 || offset_expr.X_add_number < -0x8000))
9483 break;
9484
9485 s = expr_end;
9486 continue;
9487
9488 case 'p': /* pc relative offset */
9489 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9490 my_getExpression (&offset_expr, s);
9491 s = expr_end;
9492 continue;
9493
9494 case 'u': /* upper 16 bits */
9495 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9496 && imm_expr.X_op == O_constant
9497 && (imm_expr.X_add_number < 0
9498 || imm_expr.X_add_number >= 0x10000))
9499 as_bad (_("lui expression not in range 0..65535"));
9500 s = expr_end;
9501 continue;
9502
9503 case 'a': /* 26 bit address */
9504 my_getExpression (&offset_expr, s);
9505 s = expr_end;
9506 *offset_reloc = BFD_RELOC_MIPS_JMP;
9507 continue;
9508
9509 case 'N': /* 3 bit branch condition code */
9510 case 'M': /* 3 bit compare condition code */
9511 rtype = RTYPE_CCC;
9512 if (ip->insn_mo->pinfo & (FP_D| FP_S))
9513 rtype |= RTYPE_FCC;
9514 if (!reg_lookup (&s, rtype, &regno))
9515 break;
9516 if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9517 || strcmp(str + strlen(str) - 5, "any2f") == 0
9518 || strcmp(str + strlen(str) - 5, "any2t") == 0)
9519 && (regno & 1) != 0)
9520 as_warn(_("Condition code register should be even for %s, was %d"),
9521 str, regno);
9522 if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9523 || strcmp(str + strlen(str) - 5, "any4t") == 0)
9524 && (regno & 3) != 0)
9525 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9526 str, regno);
9527 if (*args == 'N')
9528 INSERT_OPERAND (BCC, *ip, regno);
9529 else
9530 INSERT_OPERAND (CCC, *ip, regno);
9531 continue;
9532
9533 case 'H':
9534 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9535 s += 2;
9536 if (ISDIGIT (*s))
9537 {
9538 c = 0;
9539 do
9540 {
9541 c *= 10;
9542 c += *s - '0';
9543 ++s;
9544 }
9545 while (ISDIGIT (*s));
9546 }
9547 else
9548 c = 8; /* Invalid sel value. */
9549
9550 if (c > 7)
9551 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9552 ip->insn_opcode |= c;
9553 continue;
9554
9555 case 'e':
9556 /* Must be at least one digit. */
9557 my_getExpression (&imm_expr, s);
9558 check_absolute_expr (ip, &imm_expr);
9559
9560 if ((unsigned long) imm_expr.X_add_number
9561 > (unsigned long) OP_MASK_VECBYTE)
9562 {
9563 as_bad (_("bad byte vector index (%ld)"),
9564 (long) imm_expr.X_add_number);
9565 imm_expr.X_add_number = 0;
9566 }
9567
9568 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9569 imm_expr.X_op = O_absent;
9570 s = expr_end;
9571 continue;
9572
9573 case '%':
9574 my_getExpression (&imm_expr, s);
9575 check_absolute_expr (ip, &imm_expr);
9576
9577 if ((unsigned long) imm_expr.X_add_number
9578 > (unsigned long) OP_MASK_VECALIGN)
9579 {
9580 as_bad (_("bad byte vector index (%ld)"),
9581 (long) imm_expr.X_add_number);
9582 imm_expr.X_add_number = 0;
9583 }
9584
9585 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9586 imm_expr.X_op = O_absent;
9587 s = expr_end;
9588 continue;
9589
9590 default:
9591 as_bad (_("bad char = '%c'\n"), *args);
9592 internalError ();
9593 }
9594 break;
9595 }
9596 /* Args don't match. */
9597 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9598 !strcmp (insn->name, insn[1].name))
9599 {
9600 ++insn;
9601 s = argsStart;
9602 insn_error = _("illegal operands");
9603 continue;
9604 }
9605 if (save_c)
9606 *(--s) = save_c;
9607 insn_error = _("illegal operands");
9608 return;
9609 }
9610 }
9611
9612 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9613
9614 /* This routine assembles an instruction into its binary format when
9615 assembling for the mips16. As a side effect, it sets one of the
9616 global variables imm_reloc or offset_reloc to the type of
9617 relocation to do if one of the operands is an address expression.
9618 It also sets mips16_small and mips16_ext if the user explicitly
9619 requested a small or extended instruction. */
9620
9621 static void
9622 mips16_ip (char *str, struct mips_cl_insn *ip)
9623 {
9624 char *s;
9625 const char *args;
9626 struct mips_opcode *insn;
9627 char *argsstart;
9628 unsigned int regno;
9629 unsigned int lastregno = 0;
9630 char *s_reset;
9631 size_t i;
9632
9633 insn_error = NULL;
9634
9635 mips16_small = FALSE;
9636 mips16_ext = FALSE;
9637
9638 for (s = str; ISLOWER (*s); ++s)
9639 ;
9640 switch (*s)
9641 {
9642 case '\0':
9643 break;
9644
9645 case ' ':
9646 *s++ = '\0';
9647 break;
9648
9649 case '.':
9650 if (s[1] == 't' && s[2] == ' ')
9651 {
9652 *s = '\0';
9653 mips16_small = TRUE;
9654 s += 3;
9655 break;
9656 }
9657 else if (s[1] == 'e' && s[2] == ' ')
9658 {
9659 *s = '\0';
9660 mips16_ext = TRUE;
9661 s += 3;
9662 break;
9663 }
9664 /* Fall through. */
9665 default:
9666 insn_error = _("unknown opcode");
9667 return;
9668 }
9669
9670 if (mips_opts.noautoextend && ! mips16_ext)
9671 mips16_small = TRUE;
9672
9673 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9674 {
9675 insn_error = _("unrecognized opcode");
9676 return;
9677 }
9678
9679 argsstart = s;
9680 for (;;)
9681 {
9682 bfd_boolean ok;
9683
9684 assert (strcmp (insn->name, str) == 0);
9685
9686 if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9687 ok = TRUE;
9688 else
9689 ok = FALSE;
9690
9691 if (! ok)
9692 {
9693 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9694 && strcmp (insn->name, insn[1].name) == 0)
9695 {
9696 ++insn;
9697 continue;
9698 }
9699 else
9700 {
9701 if (!insn_error)
9702 {
9703 static char buf[100];
9704 sprintf (buf,
9705 _("opcode not supported on this processor: %s (%s)"),
9706 mips_cpu_info_from_arch (mips_opts.arch)->name,
9707 mips_cpu_info_from_isa (mips_opts.isa)->name);
9708 insn_error = buf;
9709 }
9710 return;
9711 }
9712 }
9713
9714 create_insn (ip, insn);
9715 imm_expr.X_op = O_absent;
9716 imm_reloc[0] = BFD_RELOC_UNUSED;
9717 imm_reloc[1] = BFD_RELOC_UNUSED;
9718 imm_reloc[2] = BFD_RELOC_UNUSED;
9719 imm2_expr.X_op = O_absent;
9720 offset_expr.X_op = O_absent;
9721 offset_reloc[0] = BFD_RELOC_UNUSED;
9722 offset_reloc[1] = BFD_RELOC_UNUSED;
9723 offset_reloc[2] = BFD_RELOC_UNUSED;
9724 for (args = insn->args; 1; ++args)
9725 {
9726 int c;
9727
9728 if (*s == ' ')
9729 ++s;
9730
9731 /* In this switch statement we call break if we did not find
9732 a match, continue if we did find a match, or return if we
9733 are done. */
9734
9735 c = *args;
9736 switch (c)
9737 {
9738 case '\0':
9739 if (*s == '\0')
9740 {
9741 /* Stuff the immediate value in now, if we can. */
9742 if (imm_expr.X_op == O_constant
9743 && *imm_reloc > BFD_RELOC_UNUSED
9744 && insn->pinfo != INSN_MACRO)
9745 {
9746 valueT tmp;
9747
9748 switch (*offset_reloc)
9749 {
9750 case BFD_RELOC_MIPS16_HI16_S:
9751 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9752 break;
9753
9754 case BFD_RELOC_MIPS16_HI16:
9755 tmp = imm_expr.X_add_number >> 16;
9756 break;
9757
9758 case BFD_RELOC_MIPS16_LO16:
9759 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9760 - 0x8000;
9761 break;
9762
9763 case BFD_RELOC_UNUSED:
9764 tmp = imm_expr.X_add_number;
9765 break;
9766
9767 default:
9768 internalError ();
9769 }
9770 *offset_reloc = BFD_RELOC_UNUSED;
9771
9772 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9773 tmp, TRUE, mips16_small,
9774 mips16_ext, &ip->insn_opcode,
9775 &ip->use_extend, &ip->extend);
9776 imm_expr.X_op = O_absent;
9777 *imm_reloc = BFD_RELOC_UNUSED;
9778 }
9779
9780 return;
9781 }
9782 break;
9783
9784 case ',':
9785 if (*s++ == c)
9786 continue;
9787 s--;
9788 switch (*++args)
9789 {
9790 case 'v':
9791 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9792 continue;
9793 case 'w':
9794 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9795 continue;
9796 }
9797 break;
9798
9799 case '(':
9800 case ')':
9801 if (*s++ == c)
9802 continue;
9803 break;
9804
9805 case 'v':
9806 case 'w':
9807 if (s[0] != '$')
9808 {
9809 if (c == 'v')
9810 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9811 else
9812 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9813 ++args;
9814 continue;
9815 }
9816 /* Fall through. */
9817 case 'x':
9818 case 'y':
9819 case 'z':
9820 case 'Z':
9821 case '0':
9822 case 'S':
9823 case 'R':
9824 case 'X':
9825 case 'Y':
9826 s_reset = s;
9827 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9828 {
9829 if (c == 'v' || c == 'w')
9830 {
9831 if (c == 'v')
9832 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9833 else
9834 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9835 ++args;
9836 continue;
9837 }
9838 break;
9839 }
9840
9841 if (*s == ' ')
9842 ++s;
9843 if (args[1] != *s)
9844 {
9845 if (c == 'v' || c == 'w')
9846 {
9847 regno = mips16_to_32_reg_map[lastregno];
9848 s = s_reset;
9849 ++args;
9850 }
9851 }
9852
9853 switch (c)
9854 {
9855 case 'x':
9856 case 'y':
9857 case 'z':
9858 case 'v':
9859 case 'w':
9860 case 'Z':
9861 regno = mips32_to_16_reg_map[regno];
9862 break;
9863
9864 case '0':
9865 if (regno != 0)
9866 regno = ILLEGAL_REG;
9867 break;
9868
9869 case 'S':
9870 if (regno != SP)
9871 regno = ILLEGAL_REG;
9872 break;
9873
9874 case 'R':
9875 if (regno != RA)
9876 regno = ILLEGAL_REG;
9877 break;
9878
9879 case 'X':
9880 case 'Y':
9881 if (regno == AT && ! mips_opts.noat)
9882 as_warn (_("used $at without \".set noat\""));
9883 break;
9884
9885 default:
9886 internalError ();
9887 }
9888
9889 if (regno == ILLEGAL_REG)
9890 break;
9891
9892 switch (c)
9893 {
9894 case 'x':
9895 case 'v':
9896 MIPS16_INSERT_OPERAND (RX, *ip, regno);
9897 break;
9898 case 'y':
9899 case 'w':
9900 MIPS16_INSERT_OPERAND (RY, *ip, regno);
9901 break;
9902 case 'z':
9903 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
9904 break;
9905 case 'Z':
9906 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
9907 case '0':
9908 case 'S':
9909 case 'R':
9910 break;
9911 case 'X':
9912 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
9913 break;
9914 case 'Y':
9915 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9916 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
9917 break;
9918 default:
9919 internalError ();
9920 }
9921
9922 lastregno = regno;
9923 continue;
9924
9925 case 'P':
9926 if (strncmp (s, "$pc", 3) == 0)
9927 {
9928 s += 3;
9929 continue;
9930 }
9931 break;
9932
9933 case '5':
9934 case 'H':
9935 case 'W':
9936 case 'D':
9937 case 'j':
9938 case 'V':
9939 case 'C':
9940 case 'U':
9941 case 'k':
9942 case 'K':
9943 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
9944 if (i > 0)
9945 {
9946 if (imm_expr.X_op != O_constant)
9947 {
9948 mips16_ext = TRUE;
9949 ip->use_extend = TRUE;
9950 ip->extend = 0;
9951 }
9952 else
9953 {
9954 /* We need to relax this instruction. */
9955 *offset_reloc = *imm_reloc;
9956 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9957 }
9958 s = expr_end;
9959 continue;
9960 }
9961 *imm_reloc = BFD_RELOC_UNUSED;
9962 /* Fall through. */
9963 case '<':
9964 case '>':
9965 case '[':
9966 case ']':
9967 case '4':
9968 case '8':
9969 my_getExpression (&imm_expr, s);
9970 if (imm_expr.X_op == O_register)
9971 {
9972 /* What we thought was an expression turned out to
9973 be a register. */
9974
9975 if (s[0] == '(' && args[1] == '(')
9976 {
9977 /* It looks like the expression was omitted
9978 before a register indirection, which means
9979 that the expression is implicitly zero. We
9980 still set up imm_expr, so that we handle
9981 explicit extensions correctly. */
9982 imm_expr.X_op = O_constant;
9983 imm_expr.X_add_number = 0;
9984 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9985 continue;
9986 }
9987
9988 break;
9989 }
9990
9991 /* We need to relax this instruction. */
9992 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9993 s = expr_end;
9994 continue;
9995
9996 case 'p':
9997 case 'q':
9998 case 'A':
9999 case 'B':
10000 case 'E':
10001 /* We use offset_reloc rather than imm_reloc for the PC
10002 relative operands. This lets macros with both
10003 immediate and address operands work correctly. */
10004 my_getExpression (&offset_expr, s);
10005
10006 if (offset_expr.X_op == O_register)
10007 break;
10008
10009 /* We need to relax this instruction. */
10010 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10011 s = expr_end;
10012 continue;
10013
10014 case '6': /* break code */
10015 my_getExpression (&imm_expr, s);
10016 check_absolute_expr (ip, &imm_expr);
10017 if ((unsigned long) imm_expr.X_add_number > 63)
10018 as_warn (_("Invalid value for `%s' (%lu)"),
10019 ip->insn_mo->name,
10020 (unsigned long) imm_expr.X_add_number);
10021 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10022 imm_expr.X_op = O_absent;
10023 s = expr_end;
10024 continue;
10025
10026 case 'a': /* 26 bit address */
10027 my_getExpression (&offset_expr, s);
10028 s = expr_end;
10029 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10030 ip->insn_opcode <<= 16;
10031 continue;
10032
10033 case 'l': /* register list for entry macro */
10034 case 'L': /* register list for exit macro */
10035 {
10036 int mask;
10037
10038 if (c == 'l')
10039 mask = 0;
10040 else
10041 mask = 7 << 3;
10042 while (*s != '\0')
10043 {
10044 unsigned int freg, reg1, reg2;
10045
10046 while (*s == ' ' || *s == ',')
10047 ++s;
10048 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10049 freg = 0;
10050 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10051 freg = 1;
10052 else
10053 {
10054 as_bad (_("can't parse register list"));
10055 break;
10056 }
10057 if (*s == ' ')
10058 ++s;
10059 if (*s != '-')
10060 reg2 = reg1;
10061 else
10062 {
10063 ++s;
10064 if (!reg_lookup (&s, freg ? RTYPE_FPU
10065 : (RTYPE_GP | RTYPE_NUM), &reg2))
10066 {
10067 as_bad (_("invalid register list"));
10068 break;
10069 }
10070 }
10071 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10072 {
10073 mask &= ~ (7 << 3);
10074 mask |= 5 << 3;
10075 }
10076 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10077 {
10078 mask &= ~ (7 << 3);
10079 mask |= 6 << 3;
10080 }
10081 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10082 mask |= (reg2 - 3) << 3;
10083 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10084 mask |= (reg2 - 15) << 1;
10085 else if (reg1 == RA && reg2 == RA)
10086 mask |= 1;
10087 else
10088 {
10089 as_bad (_("invalid register list"));
10090 break;
10091 }
10092 }
10093 /* The mask is filled in in the opcode table for the
10094 benefit of the disassembler. We remove it before
10095 applying the actual mask. */
10096 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10097 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10098 }
10099 continue;
10100
10101 case 'm': /* Register list for save insn. */
10102 case 'M': /* Register list for restore insn. */
10103 {
10104 int opcode = 0;
10105 int framesz = 0, seen_framesz = 0;
10106 int args = 0, statics = 0, sregs = 0;
10107
10108 while (*s != '\0')
10109 {
10110 unsigned int reg1, reg2;
10111
10112 SKIP_SPACE_TABS (s);
10113 while (*s == ',')
10114 ++s;
10115 SKIP_SPACE_TABS (s);
10116
10117 my_getExpression (&imm_expr, s);
10118 if (imm_expr.X_op == O_constant)
10119 {
10120 /* Handle the frame size. */
10121 if (seen_framesz)
10122 {
10123 as_bad (_("more than one frame size in list"));
10124 break;
10125 }
10126 seen_framesz = 1;
10127 framesz = imm_expr.X_add_number;
10128 imm_expr.X_op = O_absent;
10129 s = expr_end;
10130 continue;
10131 }
10132
10133 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10134 {
10135 as_bad (_("can't parse register list"));
10136 break;
10137 }
10138
10139 while (*s == ' ')
10140 ++s;
10141
10142 if (*s != '-')
10143 reg2 = reg1;
10144 else
10145 {
10146 ++s;
10147 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10148 || reg2 < reg1)
10149 {
10150 as_bad (_("can't parse register list"));
10151 break;
10152 }
10153 }
10154
10155 while (reg1 <= reg2)
10156 {
10157 if (reg1 >= 4 && reg1 <= 7)
10158 {
10159 if (c == 'm' && !seen_framesz)
10160 /* args $a0-$a3 */
10161 args |= 1 << (reg1 - 4);
10162 else
10163 /* statics $a0-$a3 */
10164 statics |= 1 << (reg1 - 4);
10165 }
10166 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10167 {
10168 /* $s0-$s8 */
10169 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10170 }
10171 else if (reg1 == 31)
10172 {
10173 /* Add $ra to insn. */
10174 opcode |= 0x40;
10175 }
10176 else
10177 {
10178 as_bad (_("unexpected register in list"));
10179 break;
10180 }
10181 if (++reg1 == 24)
10182 reg1 = 30;
10183 }
10184 }
10185
10186 /* Encode args/statics combination. */
10187 if (args & statics)
10188 as_bad (_("arg/static registers overlap"));
10189 else if (args == 0xf)
10190 /* All $a0-$a3 are args. */
10191 opcode |= MIPS16_ALL_ARGS << 16;
10192 else if (statics == 0xf)
10193 /* All $a0-$a3 are statics. */
10194 opcode |= MIPS16_ALL_STATICS << 16;
10195 else
10196 {
10197 int narg = 0, nstat = 0;
10198
10199 /* Count arg registers. */
10200 while (args & 0x1)
10201 {
10202 args >>= 1;
10203 narg++;
10204 }
10205 if (args != 0)
10206 as_bad (_("invalid arg register list"));
10207
10208 /* Count static registers. */
10209 while (statics & 0x8)
10210 {
10211 statics = (statics << 1) & 0xf;
10212 nstat++;
10213 }
10214 if (statics != 0)
10215 as_bad (_("invalid static register list"));
10216
10217 /* Encode args/statics. */
10218 opcode |= ((narg << 2) | nstat) << 16;
10219 }
10220
10221 /* Encode $s0/$s1. */
10222 if (sregs & (1 << 0)) /* $s0 */
10223 opcode |= 0x20;
10224 if (sregs & (1 << 1)) /* $s1 */
10225 opcode |= 0x10;
10226 sregs >>= 2;
10227
10228 if (sregs != 0)
10229 {
10230 /* Count regs $s2-$s8. */
10231 int nsreg = 0;
10232 while (sregs & 1)
10233 {
10234 sregs >>= 1;
10235 nsreg++;
10236 }
10237 if (sregs != 0)
10238 as_bad (_("invalid static register list"));
10239 /* Encode $s2-$s8. */
10240 opcode |= nsreg << 24;
10241 }
10242
10243 /* Encode frame size. */
10244 if (!seen_framesz)
10245 as_bad (_("missing frame size"));
10246 else if ((framesz & 7) != 0 || framesz < 0
10247 || framesz > 0xff * 8)
10248 as_bad (_("invalid frame size"));
10249 else if (framesz != 128 || (opcode >> 16) != 0)
10250 {
10251 framesz /= 8;
10252 opcode |= (((framesz & 0xf0) << 16)
10253 | (framesz & 0x0f));
10254 }
10255
10256 /* Finally build the instruction. */
10257 if ((opcode >> 16) != 0 || framesz == 0)
10258 {
10259 ip->use_extend = TRUE;
10260 ip->extend = opcode >> 16;
10261 }
10262 ip->insn_opcode |= opcode & 0x7f;
10263 }
10264 continue;
10265
10266 case 'e': /* extend code */
10267 my_getExpression (&imm_expr, s);
10268 check_absolute_expr (ip, &imm_expr);
10269 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10270 {
10271 as_warn (_("Invalid value for `%s' (%lu)"),
10272 ip->insn_mo->name,
10273 (unsigned long) imm_expr.X_add_number);
10274 imm_expr.X_add_number &= 0x7ff;
10275 }
10276 ip->insn_opcode |= imm_expr.X_add_number;
10277 imm_expr.X_op = O_absent;
10278 s = expr_end;
10279 continue;
10280
10281 default:
10282 internalError ();
10283 }
10284 break;
10285 }
10286
10287 /* Args don't match. */
10288 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10289 strcmp (insn->name, insn[1].name) == 0)
10290 {
10291 ++insn;
10292 s = argsstart;
10293 continue;
10294 }
10295
10296 insn_error = _("illegal operands");
10297
10298 return;
10299 }
10300 }
10301
10302 /* This structure holds information we know about a mips16 immediate
10303 argument type. */
10304
10305 struct mips16_immed_operand
10306 {
10307 /* The type code used in the argument string in the opcode table. */
10308 int type;
10309 /* The number of bits in the short form of the opcode. */
10310 int nbits;
10311 /* The number of bits in the extended form of the opcode. */
10312 int extbits;
10313 /* The amount by which the short form is shifted when it is used;
10314 for example, the sw instruction has a shift count of 2. */
10315 int shift;
10316 /* The amount by which the short form is shifted when it is stored
10317 into the instruction code. */
10318 int op_shift;
10319 /* Non-zero if the short form is unsigned. */
10320 int unsp;
10321 /* Non-zero if the extended form is unsigned. */
10322 int extu;
10323 /* Non-zero if the value is PC relative. */
10324 int pcrel;
10325 };
10326
10327 /* The mips16 immediate operand types. */
10328
10329 static const struct mips16_immed_operand mips16_immed_operands[] =
10330 {
10331 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10332 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10333 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10334 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10335 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10336 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10337 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10338 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10339 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10340 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10341 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10342 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10343 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10344 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10345 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10346 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10347 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10348 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10349 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10350 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10351 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10352 };
10353
10354 #define MIPS16_NUM_IMMED \
10355 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10356
10357 /* Handle a mips16 instruction with an immediate value. This or's the
10358 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10359 whether an extended value is needed; if one is needed, it sets
10360 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10361 If SMALL is true, an unextended opcode was explicitly requested.
10362 If EXT is true, an extended opcode was explicitly requested. If
10363 WARN is true, warn if EXT does not match reality. */
10364
10365 static void
10366 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10367 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10368 unsigned long *insn, bfd_boolean *use_extend,
10369 unsigned short *extend)
10370 {
10371 register const struct mips16_immed_operand *op;
10372 int mintiny, maxtiny;
10373 bfd_boolean needext;
10374
10375 op = mips16_immed_operands;
10376 while (op->type != type)
10377 {
10378 ++op;
10379 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10380 }
10381
10382 if (op->unsp)
10383 {
10384 if (type == '<' || type == '>' || type == '[' || type == ']')
10385 {
10386 mintiny = 1;
10387 maxtiny = 1 << op->nbits;
10388 }
10389 else
10390 {
10391 mintiny = 0;
10392 maxtiny = (1 << op->nbits) - 1;
10393 }
10394 }
10395 else
10396 {
10397 mintiny = - (1 << (op->nbits - 1));
10398 maxtiny = (1 << (op->nbits - 1)) - 1;
10399 }
10400
10401 /* Branch offsets have an implicit 0 in the lowest bit. */
10402 if (type == 'p' || type == 'q')
10403 val /= 2;
10404
10405 if ((val & ((1 << op->shift) - 1)) != 0
10406 || val < (mintiny << op->shift)
10407 || val > (maxtiny << op->shift))
10408 needext = TRUE;
10409 else
10410 needext = FALSE;
10411
10412 if (warn && ext && ! needext)
10413 as_warn_where (file, line,
10414 _("extended operand requested but not required"));
10415 if (small && needext)
10416 as_bad_where (file, line, _("invalid unextended operand value"));
10417
10418 if (small || (! ext && ! needext))
10419 {
10420 int insnval;
10421
10422 *use_extend = FALSE;
10423 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10424 insnval <<= op->op_shift;
10425 *insn |= insnval;
10426 }
10427 else
10428 {
10429 long minext, maxext;
10430 int extval;
10431
10432 if (op->extu)
10433 {
10434 minext = 0;
10435 maxext = (1 << op->extbits) - 1;
10436 }
10437 else
10438 {
10439 minext = - (1 << (op->extbits - 1));
10440 maxext = (1 << (op->extbits - 1)) - 1;
10441 }
10442 if (val < minext || val > maxext)
10443 as_bad_where (file, line,
10444 _("operand value out of range for instruction"));
10445
10446 *use_extend = TRUE;
10447 if (op->extbits == 16)
10448 {
10449 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10450 val &= 0x1f;
10451 }
10452 else if (op->extbits == 15)
10453 {
10454 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10455 val &= 0xf;
10456 }
10457 else
10458 {
10459 extval = ((val & 0x1f) << 6) | (val & 0x20);
10460 val = 0;
10461 }
10462
10463 *extend = (unsigned short) extval;
10464 *insn |= val;
10465 }
10466 }
10467 \f
10468 struct percent_op_match
10469 {
10470 const char *str;
10471 bfd_reloc_code_real_type reloc;
10472 };
10473
10474 static const struct percent_op_match mips_percent_op[] =
10475 {
10476 {"%lo", BFD_RELOC_LO16},
10477 #ifdef OBJ_ELF
10478 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10479 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10480 {"%call16", BFD_RELOC_MIPS_CALL16},
10481 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10482 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10483 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10484 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10485 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10486 {"%got", BFD_RELOC_MIPS_GOT16},
10487 {"%gp_rel", BFD_RELOC_GPREL16},
10488 {"%half", BFD_RELOC_16},
10489 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10490 {"%higher", BFD_RELOC_MIPS_HIGHER},
10491 {"%neg", BFD_RELOC_MIPS_SUB},
10492 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10493 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10494 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10495 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10496 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10497 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10498 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10499 #endif
10500 {"%hi", BFD_RELOC_HI16_S}
10501 };
10502
10503 static const struct percent_op_match mips16_percent_op[] =
10504 {
10505 {"%lo", BFD_RELOC_MIPS16_LO16},
10506 {"%gprel", BFD_RELOC_MIPS16_GPREL},
10507 {"%hi", BFD_RELOC_MIPS16_HI16_S}
10508 };
10509
10510
10511 /* Return true if *STR points to a relocation operator. When returning true,
10512 move *STR over the operator and store its relocation code in *RELOC.
10513 Leave both *STR and *RELOC alone when returning false. */
10514
10515 static bfd_boolean
10516 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10517 {
10518 const struct percent_op_match *percent_op;
10519 size_t limit, i;
10520
10521 if (mips_opts.mips16)
10522 {
10523 percent_op = mips16_percent_op;
10524 limit = ARRAY_SIZE (mips16_percent_op);
10525 }
10526 else
10527 {
10528 percent_op = mips_percent_op;
10529 limit = ARRAY_SIZE (mips_percent_op);
10530 }
10531
10532 for (i = 0; i < limit; i++)
10533 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10534 {
10535 int len = strlen (percent_op[i].str);
10536
10537 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10538 continue;
10539
10540 *str += strlen (percent_op[i].str);
10541 *reloc = percent_op[i].reloc;
10542
10543 /* Check whether the output BFD supports this relocation.
10544 If not, issue an error and fall back on something safe. */
10545 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10546 {
10547 as_bad ("relocation %s isn't supported by the current ABI",
10548 percent_op[i].str);
10549 *reloc = BFD_RELOC_UNUSED;
10550 }
10551 return TRUE;
10552 }
10553 return FALSE;
10554 }
10555
10556
10557 /* Parse string STR as a 16-bit relocatable operand. Store the
10558 expression in *EP and the relocations in the array starting
10559 at RELOC. Return the number of relocation operators used.
10560
10561 On exit, EXPR_END points to the first character after the expression. */
10562
10563 static size_t
10564 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10565 char *str)
10566 {
10567 bfd_reloc_code_real_type reversed_reloc[3];
10568 size_t reloc_index, i;
10569 int crux_depth, str_depth;
10570 char *crux;
10571
10572 /* Search for the start of the main expression, recoding relocations
10573 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10574 of the main expression and with CRUX_DEPTH containing the number
10575 of open brackets at that point. */
10576 reloc_index = -1;
10577 str_depth = 0;
10578 do
10579 {
10580 reloc_index++;
10581 crux = str;
10582 crux_depth = str_depth;
10583
10584 /* Skip over whitespace and brackets, keeping count of the number
10585 of brackets. */
10586 while (*str == ' ' || *str == '\t' || *str == '(')
10587 if (*str++ == '(')
10588 str_depth++;
10589 }
10590 while (*str == '%'
10591 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10592 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10593
10594 my_getExpression (ep, crux);
10595 str = expr_end;
10596
10597 /* Match every open bracket. */
10598 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10599 if (*str++ == ')')
10600 crux_depth--;
10601
10602 if (crux_depth > 0)
10603 as_bad ("unclosed '('");
10604
10605 expr_end = str;
10606
10607 if (reloc_index != 0)
10608 {
10609 prev_reloc_op_frag = frag_now;
10610 for (i = 0; i < reloc_index; i++)
10611 reloc[i] = reversed_reloc[reloc_index - 1 - i];
10612 }
10613
10614 return reloc_index;
10615 }
10616
10617 static void
10618 my_getExpression (expressionS *ep, char *str)
10619 {
10620 char *save_in;
10621 valueT val;
10622
10623 save_in = input_line_pointer;
10624 input_line_pointer = str;
10625 expression (ep);
10626 expr_end = input_line_pointer;
10627 input_line_pointer = save_in;
10628
10629 /* If we are in mips16 mode, and this is an expression based on `.',
10630 then we bump the value of the symbol by 1 since that is how other
10631 text symbols are handled. We don't bother to handle complex
10632 expressions, just `.' plus or minus a constant. */
10633 if (mips_opts.mips16
10634 && ep->X_op == O_symbol
10635 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10636 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10637 && symbol_get_frag (ep->X_add_symbol) == frag_now
10638 && symbol_constant_p (ep->X_add_symbol)
10639 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10640 S_SET_VALUE (ep->X_add_symbol, val + 1);
10641 }
10642
10643 /* Turn a string in input_line_pointer into a floating point constant
10644 of type TYPE, and store the appropriate bytes in *LITP. The number
10645 of LITTLENUMS emitted is stored in *SIZEP. An error message is
10646 returned, or NULL on OK. */
10647
10648 char *
10649 md_atof (int type, char *litP, int *sizeP)
10650 {
10651 int prec;
10652 LITTLENUM_TYPE words[4];
10653 char *t;
10654 int i;
10655
10656 switch (type)
10657 {
10658 case 'f':
10659 prec = 2;
10660 break;
10661
10662 case 'd':
10663 prec = 4;
10664 break;
10665
10666 default:
10667 *sizeP = 0;
10668 return _("bad call to md_atof");
10669 }
10670
10671 t = atof_ieee (input_line_pointer, type, words);
10672 if (t)
10673 input_line_pointer = t;
10674
10675 *sizeP = prec * 2;
10676
10677 if (! target_big_endian)
10678 {
10679 for (i = prec - 1; i >= 0; i--)
10680 {
10681 md_number_to_chars (litP, words[i], 2);
10682 litP += 2;
10683 }
10684 }
10685 else
10686 {
10687 for (i = 0; i < prec; i++)
10688 {
10689 md_number_to_chars (litP, words[i], 2);
10690 litP += 2;
10691 }
10692 }
10693
10694 return NULL;
10695 }
10696
10697 void
10698 md_number_to_chars (char *buf, valueT val, int n)
10699 {
10700 if (target_big_endian)
10701 number_to_chars_bigendian (buf, val, n);
10702 else
10703 number_to_chars_littleendian (buf, val, n);
10704 }
10705 \f
10706 #ifdef OBJ_ELF
10707 static int support_64bit_objects(void)
10708 {
10709 const char **list, **l;
10710 int yes;
10711
10712 list = bfd_target_list ();
10713 for (l = list; *l != NULL; l++)
10714 #ifdef TE_TMIPS
10715 /* This is traditional mips */
10716 if (strcmp (*l, "elf64-tradbigmips") == 0
10717 || strcmp (*l, "elf64-tradlittlemips") == 0)
10718 #else
10719 if (strcmp (*l, "elf64-bigmips") == 0
10720 || strcmp (*l, "elf64-littlemips") == 0)
10721 #endif
10722 break;
10723 yes = (*l != NULL);
10724 free (list);
10725 return yes;
10726 }
10727 #endif /* OBJ_ELF */
10728
10729 const char *md_shortopts = "O::g::G:";
10730
10731 struct option md_longopts[] =
10732 {
10733 /* Options which specify architecture. */
10734 #define OPTION_ARCH_BASE (OPTION_MD_BASE)
10735 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10736 {"march", required_argument, NULL, OPTION_MARCH},
10737 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10738 {"mtune", required_argument, NULL, OPTION_MTUNE},
10739 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10740 {"mips0", no_argument, NULL, OPTION_MIPS1},
10741 {"mips1", no_argument, NULL, OPTION_MIPS1},
10742 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10743 {"mips2", no_argument, NULL, OPTION_MIPS2},
10744 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10745 {"mips3", no_argument, NULL, OPTION_MIPS3},
10746 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10747 {"mips4", no_argument, NULL, OPTION_MIPS4},
10748 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10749 {"mips5", no_argument, NULL, OPTION_MIPS5},
10750 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10751 {"mips32", no_argument, NULL, OPTION_MIPS32},
10752 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10753 {"mips64", no_argument, NULL, OPTION_MIPS64},
10754 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10755 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10756 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10757 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10758
10759 /* Options which specify Application Specific Extensions (ASEs). */
10760 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10761 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10762 {"mips16", no_argument, NULL, OPTION_MIPS16},
10763 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10764 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10765 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10766 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10767 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10768 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10769 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10770 {"mdmx", no_argument, NULL, OPTION_MDMX},
10771 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10772 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10773 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10774 {"mdsp", no_argument, NULL, OPTION_DSP},
10775 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10776 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10777 #define OPTION_MT (OPTION_ASE_BASE + 8)
10778 {"mmt", no_argument, NULL, OPTION_MT},
10779 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10780 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10781 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10782 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10783 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10784 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10785
10786 /* Old-style architecture options. Don't add more of these. */
10787 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 12)
10788 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10789 {"m4650", no_argument, NULL, OPTION_M4650},
10790 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10791 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10792 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10793 {"m4010", no_argument, NULL, OPTION_M4010},
10794 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10795 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10796 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10797 {"m4100", no_argument, NULL, OPTION_M4100},
10798 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10799 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10800 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10801 {"m3900", no_argument, NULL, OPTION_M3900},
10802 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10803 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10804
10805 /* Options which enable bug fixes. */
10806 #define OPTION_FIX_BASE (OPTION_COMPAT_ARCH_BASE + 8)
10807 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10808 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10809 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10810 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10811 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10812 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10813 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10814 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
10815 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10816 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10817 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10818 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
10819 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10820
10821 /* Miscellaneous options. */
10822 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10823 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10824 {"trap", no_argument, NULL, OPTION_TRAP},
10825 {"no-break", no_argument, NULL, OPTION_TRAP},
10826 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10827 {"break", no_argument, NULL, OPTION_BREAK},
10828 {"no-trap", no_argument, NULL, OPTION_BREAK},
10829 #define OPTION_EB (OPTION_MISC_BASE + 2)
10830 {"EB", no_argument, NULL, OPTION_EB},
10831 #define OPTION_EL (OPTION_MISC_BASE + 3)
10832 {"EL", no_argument, NULL, OPTION_EL},
10833 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10834 {"mfp32", no_argument, NULL, OPTION_FP32},
10835 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10836 {"mgp32", no_argument, NULL, OPTION_GP32},
10837 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10838 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10839 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10840 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10841 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10842 {"mfp64", no_argument, NULL, OPTION_FP64},
10843 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10844 {"mgp64", no_argument, NULL, OPTION_GP64},
10845 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10846 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10847 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10848 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10849 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10850 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10851 {"mshared", no_argument, NULL, OPTION_MSHARED},
10852 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10853 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10854 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10855 {"msym32", no_argument, NULL, OPTION_MSYM32},
10856 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10857
10858 /* ELF-specific options. */
10859 #ifdef OBJ_ELF
10860 #define OPTION_ELF_BASE (OPTION_MISC_BASE + 16)
10861 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10862 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
10863 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10864 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
10865 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
10866 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
10867 {"xgot", no_argument, NULL, OPTION_XGOT},
10868 #define OPTION_MABI (OPTION_ELF_BASE + 3)
10869 {"mabi", required_argument, NULL, OPTION_MABI},
10870 #define OPTION_32 (OPTION_ELF_BASE + 4)
10871 {"32", no_argument, NULL, OPTION_32},
10872 #define OPTION_N32 (OPTION_ELF_BASE + 5)
10873 {"n32", no_argument, NULL, OPTION_N32},
10874 #define OPTION_64 (OPTION_ELF_BASE + 6)
10875 {"64", no_argument, NULL, OPTION_64},
10876 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10877 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10878 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10879 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10880 #define OPTION_PDR (OPTION_ELF_BASE + 9)
10881 {"mpdr", no_argument, NULL, OPTION_PDR},
10882 #define OPTION_NO_PDR (OPTION_ELF_BASE + 10)
10883 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10884 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10885 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10886 #endif /* OBJ_ELF */
10887
10888 {NULL, no_argument, NULL, 0}
10889 };
10890 size_t md_longopts_size = sizeof (md_longopts);
10891
10892 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10893 NEW_VALUE. Warn if another value was already specified. Note:
10894 we have to defer parsing the -march and -mtune arguments in order
10895 to handle 'from-abi' correctly, since the ABI might be specified
10896 in a later argument. */
10897
10898 static void
10899 mips_set_option_string (const char **string_ptr, const char *new_value)
10900 {
10901 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10902 as_warn (_("A different %s was already specified, is now %s"),
10903 string_ptr == &mips_arch_string ? "-march" : "-mtune",
10904 new_value);
10905
10906 *string_ptr = new_value;
10907 }
10908
10909 int
10910 md_parse_option (int c, char *arg)
10911 {
10912 switch (c)
10913 {
10914 case OPTION_CONSTRUCT_FLOATS:
10915 mips_disable_float_construction = 0;
10916 break;
10917
10918 case OPTION_NO_CONSTRUCT_FLOATS:
10919 mips_disable_float_construction = 1;
10920 break;
10921
10922 case OPTION_TRAP:
10923 mips_trap = 1;
10924 break;
10925
10926 case OPTION_BREAK:
10927 mips_trap = 0;
10928 break;
10929
10930 case OPTION_EB:
10931 target_big_endian = 1;
10932 break;
10933
10934 case OPTION_EL:
10935 target_big_endian = 0;
10936 break;
10937
10938 case 'O':
10939 if (arg && arg[1] == '0')
10940 mips_optimize = 1;
10941 else
10942 mips_optimize = 2;
10943 break;
10944
10945 case 'g':
10946 if (arg == NULL)
10947 mips_debug = 2;
10948 else
10949 mips_debug = atoi (arg);
10950 /* When the MIPS assembler sees -g or -g2, it does not do
10951 optimizations which limit full symbolic debugging. We take
10952 that to be equivalent to -O0. */
10953 if (mips_debug == 2)
10954 mips_optimize = 1;
10955 break;
10956
10957 case OPTION_MIPS1:
10958 file_mips_isa = ISA_MIPS1;
10959 break;
10960
10961 case OPTION_MIPS2:
10962 file_mips_isa = ISA_MIPS2;
10963 break;
10964
10965 case OPTION_MIPS3:
10966 file_mips_isa = ISA_MIPS3;
10967 break;
10968
10969 case OPTION_MIPS4:
10970 file_mips_isa = ISA_MIPS4;
10971 break;
10972
10973 case OPTION_MIPS5:
10974 file_mips_isa = ISA_MIPS5;
10975 break;
10976
10977 case OPTION_MIPS32:
10978 file_mips_isa = ISA_MIPS32;
10979 break;
10980
10981 case OPTION_MIPS32R2:
10982 file_mips_isa = ISA_MIPS32R2;
10983 break;
10984
10985 case OPTION_MIPS64R2:
10986 file_mips_isa = ISA_MIPS64R2;
10987 break;
10988
10989 case OPTION_MIPS64:
10990 file_mips_isa = ISA_MIPS64;
10991 break;
10992
10993 case OPTION_MTUNE:
10994 mips_set_option_string (&mips_tune_string, arg);
10995 break;
10996
10997 case OPTION_MARCH:
10998 mips_set_option_string (&mips_arch_string, arg);
10999 break;
11000
11001 case OPTION_M4650:
11002 mips_set_option_string (&mips_arch_string, "4650");
11003 mips_set_option_string (&mips_tune_string, "4650");
11004 break;
11005
11006 case OPTION_NO_M4650:
11007 break;
11008
11009 case OPTION_M4010:
11010 mips_set_option_string (&mips_arch_string, "4010");
11011 mips_set_option_string (&mips_tune_string, "4010");
11012 break;
11013
11014 case OPTION_NO_M4010:
11015 break;
11016
11017 case OPTION_M4100:
11018 mips_set_option_string (&mips_arch_string, "4100");
11019 mips_set_option_string (&mips_tune_string, "4100");
11020 break;
11021
11022 case OPTION_NO_M4100:
11023 break;
11024
11025 case OPTION_M3900:
11026 mips_set_option_string (&mips_arch_string, "3900");
11027 mips_set_option_string (&mips_tune_string, "3900");
11028 break;
11029
11030 case OPTION_NO_M3900:
11031 break;
11032
11033 case OPTION_MDMX:
11034 mips_opts.ase_mdmx = 1;
11035 break;
11036
11037 case OPTION_NO_MDMX:
11038 mips_opts.ase_mdmx = 0;
11039 break;
11040
11041 case OPTION_DSP:
11042 mips_opts.ase_dsp = 1;
11043 break;
11044
11045 case OPTION_NO_DSP:
11046 mips_opts.ase_dsp = 0;
11047 break;
11048
11049 case OPTION_MT:
11050 mips_opts.ase_mt = 1;
11051 break;
11052
11053 case OPTION_NO_MT:
11054 mips_opts.ase_mt = 0;
11055 break;
11056
11057 case OPTION_MIPS16:
11058 mips_opts.mips16 = 1;
11059 mips_no_prev_insn ();
11060 break;
11061
11062 case OPTION_NO_MIPS16:
11063 mips_opts.mips16 = 0;
11064 mips_no_prev_insn ();
11065 break;
11066
11067 case OPTION_MIPS3D:
11068 mips_opts.ase_mips3d = 1;
11069 break;
11070
11071 case OPTION_NO_MIPS3D:
11072 mips_opts.ase_mips3d = 0;
11073 break;
11074
11075 case OPTION_SMARTMIPS:
11076 mips_opts.ase_smartmips = 1;
11077 break;
11078
11079 case OPTION_NO_SMARTMIPS:
11080 mips_opts.ase_smartmips = 0;
11081 break;
11082
11083 case OPTION_FIX_VR4120:
11084 mips_fix_vr4120 = 1;
11085 break;
11086
11087 case OPTION_NO_FIX_VR4120:
11088 mips_fix_vr4120 = 0;
11089 break;
11090
11091 case OPTION_FIX_VR4130:
11092 mips_fix_vr4130 = 1;
11093 break;
11094
11095 case OPTION_NO_FIX_VR4130:
11096 mips_fix_vr4130 = 0;
11097 break;
11098
11099 case OPTION_RELAX_BRANCH:
11100 mips_relax_branch = 1;
11101 break;
11102
11103 case OPTION_NO_RELAX_BRANCH:
11104 mips_relax_branch = 0;
11105 break;
11106
11107 case OPTION_MSHARED:
11108 mips_in_shared = TRUE;
11109 break;
11110
11111 case OPTION_MNO_SHARED:
11112 mips_in_shared = FALSE;
11113 break;
11114
11115 case OPTION_MSYM32:
11116 mips_opts.sym32 = TRUE;
11117 break;
11118
11119 case OPTION_MNO_SYM32:
11120 mips_opts.sym32 = FALSE;
11121 break;
11122
11123 #ifdef OBJ_ELF
11124 /* When generating ELF code, we permit -KPIC and -call_shared to
11125 select SVR4_PIC, and -non_shared to select no PIC. This is
11126 intended to be compatible with Irix 5. */
11127 case OPTION_CALL_SHARED:
11128 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11129 {
11130 as_bad (_("-call_shared is supported only for ELF format"));
11131 return 0;
11132 }
11133 mips_pic = SVR4_PIC;
11134 mips_abicalls = TRUE;
11135 break;
11136
11137 case OPTION_NON_SHARED:
11138 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11139 {
11140 as_bad (_("-non_shared is supported only for ELF format"));
11141 return 0;
11142 }
11143 mips_pic = NO_PIC;
11144 mips_abicalls = FALSE;
11145 break;
11146
11147 /* The -xgot option tells the assembler to use 32 bit offsets
11148 when accessing the got in SVR4_PIC mode. It is for Irix
11149 compatibility. */
11150 case OPTION_XGOT:
11151 mips_big_got = 1;
11152 break;
11153 #endif /* OBJ_ELF */
11154
11155 case 'G':
11156 g_switch_value = atoi (arg);
11157 g_switch_seen = 1;
11158 break;
11159
11160 #ifdef OBJ_ELF
11161 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11162 and -mabi=64. */
11163 case OPTION_32:
11164 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11165 {
11166 as_bad (_("-32 is supported for ELF format only"));
11167 return 0;
11168 }
11169 mips_abi = O32_ABI;
11170 break;
11171
11172 case OPTION_N32:
11173 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11174 {
11175 as_bad (_("-n32 is supported for ELF format only"));
11176 return 0;
11177 }
11178 mips_abi = N32_ABI;
11179 break;
11180
11181 case OPTION_64:
11182 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11183 {
11184 as_bad (_("-64 is supported for ELF format only"));
11185 return 0;
11186 }
11187 mips_abi = N64_ABI;
11188 if (! support_64bit_objects())
11189 as_fatal (_("No compiled in support for 64 bit object file format"));
11190 break;
11191 #endif /* OBJ_ELF */
11192
11193 case OPTION_GP32:
11194 file_mips_gp32 = 1;
11195 break;
11196
11197 case OPTION_GP64:
11198 file_mips_gp32 = 0;
11199 break;
11200
11201 case OPTION_FP32:
11202 file_mips_fp32 = 1;
11203 break;
11204
11205 case OPTION_FP64:
11206 file_mips_fp32 = 0;
11207 break;
11208
11209 #ifdef OBJ_ELF
11210 case OPTION_MABI:
11211 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11212 {
11213 as_bad (_("-mabi is supported for ELF format only"));
11214 return 0;
11215 }
11216 if (strcmp (arg, "32") == 0)
11217 mips_abi = O32_ABI;
11218 else if (strcmp (arg, "o64") == 0)
11219 mips_abi = O64_ABI;
11220 else if (strcmp (arg, "n32") == 0)
11221 mips_abi = N32_ABI;
11222 else if (strcmp (arg, "64") == 0)
11223 {
11224 mips_abi = N64_ABI;
11225 if (! support_64bit_objects())
11226 as_fatal (_("No compiled in support for 64 bit object file "
11227 "format"));
11228 }
11229 else if (strcmp (arg, "eabi") == 0)
11230 mips_abi = EABI_ABI;
11231 else
11232 {
11233 as_fatal (_("invalid abi -mabi=%s"), arg);
11234 return 0;
11235 }
11236 break;
11237 #endif /* OBJ_ELF */
11238
11239 case OPTION_M7000_HILO_FIX:
11240 mips_7000_hilo_fix = TRUE;
11241 break;
11242
11243 case OPTION_MNO_7000_HILO_FIX:
11244 mips_7000_hilo_fix = FALSE;
11245 break;
11246
11247 #ifdef OBJ_ELF
11248 case OPTION_MDEBUG:
11249 mips_flag_mdebug = TRUE;
11250 break;
11251
11252 case OPTION_NO_MDEBUG:
11253 mips_flag_mdebug = FALSE;
11254 break;
11255
11256 case OPTION_PDR:
11257 mips_flag_pdr = TRUE;
11258 break;
11259
11260 case OPTION_NO_PDR:
11261 mips_flag_pdr = FALSE;
11262 break;
11263
11264 case OPTION_MVXWORKS_PIC:
11265 mips_pic = VXWORKS_PIC;
11266 break;
11267 #endif /* OBJ_ELF */
11268
11269 default:
11270 return 0;
11271 }
11272
11273 return 1;
11274 }
11275 \f
11276 /* Set up globals to generate code for the ISA or processor
11277 described by INFO. */
11278
11279 static void
11280 mips_set_architecture (const struct mips_cpu_info *info)
11281 {
11282 if (info != 0)
11283 {
11284 file_mips_arch = info->cpu;
11285 mips_opts.arch = info->cpu;
11286 mips_opts.isa = info->isa;
11287 }
11288 }
11289
11290
11291 /* Likewise for tuning. */
11292
11293 static void
11294 mips_set_tune (const struct mips_cpu_info *info)
11295 {
11296 if (info != 0)
11297 mips_tune = info->cpu;
11298 }
11299
11300
11301 void
11302 mips_after_parse_args (void)
11303 {
11304 const struct mips_cpu_info *arch_info = 0;
11305 const struct mips_cpu_info *tune_info = 0;
11306
11307 /* GP relative stuff not working for PE */
11308 if (strncmp (TARGET_OS, "pe", 2) == 0)
11309 {
11310 if (g_switch_seen && g_switch_value != 0)
11311 as_bad (_("-G not supported in this configuration."));
11312 g_switch_value = 0;
11313 }
11314
11315 if (mips_abi == NO_ABI)
11316 mips_abi = MIPS_DEFAULT_ABI;
11317
11318 /* The following code determines the architecture and register size.
11319 Similar code was added to GCC 3.3 (see override_options() in
11320 config/mips/mips.c). The GAS and GCC code should be kept in sync
11321 as much as possible. */
11322
11323 if (mips_arch_string != 0)
11324 arch_info = mips_parse_cpu ("-march", mips_arch_string);
11325
11326 if (file_mips_isa != ISA_UNKNOWN)
11327 {
11328 /* Handle -mipsN. At this point, file_mips_isa contains the
11329 ISA level specified by -mipsN, while arch_info->isa contains
11330 the -march selection (if any). */
11331 if (arch_info != 0)
11332 {
11333 /* -march takes precedence over -mipsN, since it is more descriptive.
11334 There's no harm in specifying both as long as the ISA levels
11335 are the same. */
11336 if (file_mips_isa != arch_info->isa)
11337 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11338 mips_cpu_info_from_isa (file_mips_isa)->name,
11339 mips_cpu_info_from_isa (arch_info->isa)->name);
11340 }
11341 else
11342 arch_info = mips_cpu_info_from_isa (file_mips_isa);
11343 }
11344
11345 if (arch_info == 0)
11346 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11347
11348 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11349 as_bad ("-march=%s is not compatible with the selected ABI",
11350 arch_info->name);
11351
11352 mips_set_architecture (arch_info);
11353
11354 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11355 if (mips_tune_string != 0)
11356 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11357
11358 if (tune_info == 0)
11359 mips_set_tune (arch_info);
11360 else
11361 mips_set_tune (tune_info);
11362
11363 if (file_mips_gp32 >= 0)
11364 {
11365 /* The user specified the size of the integer registers. Make sure
11366 it agrees with the ABI and ISA. */
11367 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11368 as_bad (_("-mgp64 used with a 32-bit processor"));
11369 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11370 as_bad (_("-mgp32 used with a 64-bit ABI"));
11371 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11372 as_bad (_("-mgp64 used with a 32-bit ABI"));
11373 }
11374 else
11375 {
11376 /* Infer the integer register size from the ABI and processor.
11377 Restrict ourselves to 32-bit registers if that's all the
11378 processor has, or if the ABI cannot handle 64-bit registers. */
11379 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11380 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11381 }
11382
11383 /* ??? GAS treats single-float processors as though they had 64-bit
11384 float registers (although it complains when double-precision
11385 instructions are used). As things stand, saying they have 32-bit
11386 registers would lead to spurious "register must be even" messages.
11387 So here we assume float registers are always the same size as
11388 integer ones, unless the user says otherwise. */
11389 if (file_mips_fp32 < 0)
11390 file_mips_fp32 = file_mips_gp32;
11391
11392 /* End of GCC-shared inference code. */
11393
11394 /* This flag is set when we have a 64-bit capable CPU but use only
11395 32-bit wide registers. Note that EABI does not use it. */
11396 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11397 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11398 || mips_abi == O32_ABI))
11399 mips_32bitmode = 1;
11400
11401 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11402 as_bad (_("trap exception not supported at ISA 1"));
11403
11404 /* If the selected architecture includes support for ASEs, enable
11405 generation of code for them. */
11406 if (mips_opts.mips16 == -1)
11407 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11408 if (mips_opts.ase_mips3d == -1)
11409 mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
11410 if (mips_opts.ase_mdmx == -1)
11411 mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
11412 if (mips_opts.ase_dsp == -1)
11413 mips_opts.ase_dsp = (CPU_HAS_DSP (file_mips_arch)) ? 1 : 0;
11414 if (mips_opts.ase_mt == -1)
11415 mips_opts.ase_mt = (CPU_HAS_MT (file_mips_arch)) ? 1 : 0;
11416
11417 file_mips_isa = mips_opts.isa;
11418 file_ase_mips16 = mips_opts.mips16;
11419 file_ase_mips3d = mips_opts.ase_mips3d;
11420 file_ase_mdmx = mips_opts.ase_mdmx;
11421 file_ase_smartmips = mips_opts.ase_smartmips;
11422 file_ase_dsp = mips_opts.ase_dsp;
11423 file_ase_mt = mips_opts.ase_mt;
11424 mips_opts.gp32 = file_mips_gp32;
11425 mips_opts.fp32 = file_mips_fp32;
11426
11427 if (mips_flag_mdebug < 0)
11428 {
11429 #ifdef OBJ_MAYBE_ECOFF
11430 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11431 mips_flag_mdebug = 1;
11432 else
11433 #endif /* OBJ_MAYBE_ECOFF */
11434 mips_flag_mdebug = 0;
11435 }
11436 }
11437 \f
11438 void
11439 mips_init_after_args (void)
11440 {
11441 /* initialize opcodes */
11442 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11443 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11444 }
11445
11446 long
11447 md_pcrel_from (fixS *fixP)
11448 {
11449 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11450 switch (fixP->fx_r_type)
11451 {
11452 case BFD_RELOC_16_PCREL_S2:
11453 case BFD_RELOC_MIPS_JMP:
11454 /* Return the address of the delay slot. */
11455 return addr + 4;
11456 default:
11457 return addr;
11458 }
11459 }
11460
11461 /* This is called before the symbol table is processed. In order to
11462 work with gcc when using mips-tfile, we must keep all local labels.
11463 However, in other cases, we want to discard them. If we were
11464 called with -g, but we didn't see any debugging information, it may
11465 mean that gcc is smuggling debugging information through to
11466 mips-tfile, in which case we must generate all local labels. */
11467
11468 void
11469 mips_frob_file_before_adjust (void)
11470 {
11471 #ifndef NO_ECOFF_DEBUGGING
11472 if (ECOFF_DEBUGGING
11473 && mips_debug != 0
11474 && ! ecoff_debugging_seen)
11475 flag_keep_locals = 1;
11476 #endif
11477 }
11478
11479 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11480 the corresponding LO16 reloc. This is called before md_apply_fix and
11481 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
11482 relocation operators.
11483
11484 For our purposes, a %lo() expression matches a %got() or %hi()
11485 expression if:
11486
11487 (a) it refers to the same symbol; and
11488 (b) the offset applied in the %lo() expression is no lower than
11489 the offset applied in the %got() or %hi().
11490
11491 (b) allows us to cope with code like:
11492
11493 lui $4,%hi(foo)
11494 lh $4,%lo(foo+2)($4)
11495
11496 ...which is legal on RELA targets, and has a well-defined behaviour
11497 if the user knows that adding 2 to "foo" will not induce a carry to
11498 the high 16 bits.
11499
11500 When several %lo()s match a particular %got() or %hi(), we use the
11501 following rules to distinguish them:
11502
11503 (1) %lo()s with smaller offsets are a better match than %lo()s with
11504 higher offsets.
11505
11506 (2) %lo()s with no matching %got() or %hi() are better than those
11507 that already have a matching %got() or %hi().
11508
11509 (3) later %lo()s are better than earlier %lo()s.
11510
11511 These rules are applied in order.
11512
11513 (1) means, among other things, that %lo()s with identical offsets are
11514 chosen if they exist.
11515
11516 (2) means that we won't associate several high-part relocations with
11517 the same low-part relocation unless there's no alternative. Having
11518 several high parts for the same low part is a GNU extension; this rule
11519 allows careful users to avoid it.
11520
11521 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
11522 with the last high-part relocation being at the front of the list.
11523 It therefore makes sense to choose the last matching low-part
11524 relocation, all other things being equal. It's also easier
11525 to code that way. */
11526
11527 void
11528 mips_frob_file (void)
11529 {
11530 struct mips_hi_fixup *l;
11531
11532 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11533 {
11534 segment_info_type *seginfo;
11535 bfd_boolean matched_lo_p;
11536 fixS **hi_pos, **lo_pos, **pos;
11537
11538 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11539
11540 /* If a GOT16 relocation turns out to be against a global symbol,
11541 there isn't supposed to be a matching LO. */
11542 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11543 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11544 continue;
11545
11546 /* Check quickly whether the next fixup happens to be a matching %lo. */
11547 if (fixup_has_matching_lo_p (l->fixp))
11548 continue;
11549
11550 seginfo = seg_info (l->seg);
11551
11552 /* Set HI_POS to the position of this relocation in the chain.
11553 Set LO_POS to the position of the chosen low-part relocation.
11554 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11555 relocation that matches an immediately-preceding high-part
11556 relocation. */
11557 hi_pos = NULL;
11558 lo_pos = NULL;
11559 matched_lo_p = FALSE;
11560 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11561 {
11562 if (*pos == l->fixp)
11563 hi_pos = pos;
11564
11565 if (((*pos)->fx_r_type == BFD_RELOC_LO16
11566 || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11567 && (*pos)->fx_addsy == l->fixp->fx_addsy
11568 && (*pos)->fx_offset >= l->fixp->fx_offset
11569 && (lo_pos == NULL
11570 || (*pos)->fx_offset < (*lo_pos)->fx_offset
11571 || (!matched_lo_p
11572 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11573 lo_pos = pos;
11574
11575 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11576 && fixup_has_matching_lo_p (*pos));
11577 }
11578
11579 /* If we found a match, remove the high-part relocation from its
11580 current position and insert it before the low-part relocation.
11581 Make the offsets match so that fixup_has_matching_lo_p()
11582 will return true.
11583
11584 We don't warn about unmatched high-part relocations since some
11585 versions of gcc have been known to emit dead "lui ...%hi(...)"
11586 instructions. */
11587 if (lo_pos != NULL)
11588 {
11589 l->fixp->fx_offset = (*lo_pos)->fx_offset;
11590 if (l->fixp->fx_next != *lo_pos)
11591 {
11592 *hi_pos = l->fixp->fx_next;
11593 l->fixp->fx_next = *lo_pos;
11594 *lo_pos = l->fixp;
11595 }
11596 }
11597 }
11598 }
11599
11600 /* We may have combined relocations without symbols in the N32/N64 ABI.
11601 We have to prevent gas from dropping them. */
11602
11603 int
11604 mips_force_relocation (fixS *fixp)
11605 {
11606 if (generic_force_reloc (fixp))
11607 return 1;
11608
11609 if (HAVE_NEWABI
11610 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11611 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11612 || fixp->fx_r_type == BFD_RELOC_HI16_S
11613 || fixp->fx_r_type == BFD_RELOC_LO16))
11614 return 1;
11615
11616 return 0;
11617 }
11618
11619 /* Apply a fixup to the object file. */
11620
11621 void
11622 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11623 {
11624 bfd_byte *buf;
11625 long insn;
11626 reloc_howto_type *howto;
11627
11628 /* We ignore generic BFD relocations we don't know about. */
11629 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11630 if (! howto)
11631 return;
11632
11633 assert (fixP->fx_size == 4
11634 || fixP->fx_r_type == BFD_RELOC_16
11635 || fixP->fx_r_type == BFD_RELOC_64
11636 || fixP->fx_r_type == BFD_RELOC_CTOR
11637 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11638 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11639 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
11640
11641 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11642
11643 assert (! fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11644
11645 /* Don't treat parts of a composite relocation as done. There are two
11646 reasons for this:
11647
11648 (1) The second and third parts will be against 0 (RSS_UNDEF) but
11649 should nevertheless be emitted if the first part is.
11650
11651 (2) In normal usage, composite relocations are never assembly-time
11652 constants. The easiest way of dealing with the pathological
11653 exceptions is to generate a relocation against STN_UNDEF and
11654 leave everything up to the linker. */
11655 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel && fixP->fx_tcbit == 0)
11656 fixP->fx_done = 1;
11657
11658 switch (fixP->fx_r_type)
11659 {
11660 case BFD_RELOC_MIPS_TLS_GD:
11661 case BFD_RELOC_MIPS_TLS_LDM:
11662 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11663 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11664 case BFD_RELOC_MIPS_TLS_GOTTPREL:
11665 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11666 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11667 S_SET_THREAD_LOCAL (fixP->fx_addsy);
11668 /* fall through */
11669
11670 case BFD_RELOC_MIPS_JMP:
11671 case BFD_RELOC_MIPS_SHIFT5:
11672 case BFD_RELOC_MIPS_SHIFT6:
11673 case BFD_RELOC_MIPS_GOT_DISP:
11674 case BFD_RELOC_MIPS_GOT_PAGE:
11675 case BFD_RELOC_MIPS_GOT_OFST:
11676 case BFD_RELOC_MIPS_SUB:
11677 case BFD_RELOC_MIPS_INSERT_A:
11678 case BFD_RELOC_MIPS_INSERT_B:
11679 case BFD_RELOC_MIPS_DELETE:
11680 case BFD_RELOC_MIPS_HIGHEST:
11681 case BFD_RELOC_MIPS_HIGHER:
11682 case BFD_RELOC_MIPS_SCN_DISP:
11683 case BFD_RELOC_MIPS_REL16:
11684 case BFD_RELOC_MIPS_RELGOT:
11685 case BFD_RELOC_MIPS_JALR:
11686 case BFD_RELOC_HI16:
11687 case BFD_RELOC_HI16_S:
11688 case BFD_RELOC_GPREL16:
11689 case BFD_RELOC_MIPS_LITERAL:
11690 case BFD_RELOC_MIPS_CALL16:
11691 case BFD_RELOC_MIPS_GOT16:
11692 case BFD_RELOC_GPREL32:
11693 case BFD_RELOC_MIPS_GOT_HI16:
11694 case BFD_RELOC_MIPS_GOT_LO16:
11695 case BFD_RELOC_MIPS_CALL_HI16:
11696 case BFD_RELOC_MIPS_CALL_LO16:
11697 case BFD_RELOC_MIPS16_GPREL:
11698 case BFD_RELOC_MIPS16_HI16:
11699 case BFD_RELOC_MIPS16_HI16_S:
11700 /* Nothing needed to do. The value comes from the reloc entry */
11701 break;
11702
11703 case BFD_RELOC_MIPS16_JMP:
11704 /* We currently always generate a reloc against a symbol, which
11705 means that we don't want an addend even if the symbol is
11706 defined. */
11707 *valP = 0;
11708 break;
11709
11710 case BFD_RELOC_64:
11711 /* This is handled like BFD_RELOC_32, but we output a sign
11712 extended value if we are only 32 bits. */
11713 if (fixP->fx_done)
11714 {
11715 if (8 <= sizeof (valueT))
11716 md_number_to_chars ((char *) buf, *valP, 8);
11717 else
11718 {
11719 valueT hiv;
11720
11721 if ((*valP & 0x80000000) != 0)
11722 hiv = 0xffffffff;
11723 else
11724 hiv = 0;
11725 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11726 *valP, 4);
11727 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11728 hiv, 4);
11729 }
11730 }
11731 break;
11732
11733 case BFD_RELOC_RVA:
11734 case BFD_RELOC_32:
11735 /* If we are deleting this reloc entry, we must fill in the
11736 value now. This can happen if we have a .word which is not
11737 resolved when it appears but is later defined. */
11738 if (fixP->fx_done)
11739 md_number_to_chars ((char *) buf, *valP, 4);
11740 break;
11741
11742 case BFD_RELOC_16:
11743 /* If we are deleting this reloc entry, we must fill in the
11744 value now. */
11745 if (fixP->fx_done)
11746 md_number_to_chars ((char *) buf, *valP, 2);
11747 break;
11748
11749 case BFD_RELOC_LO16:
11750 case BFD_RELOC_MIPS16_LO16:
11751 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11752 may be safe to remove, but if so it's not obvious. */
11753 /* When handling an embedded PIC switch statement, we can wind
11754 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11755 if (fixP->fx_done)
11756 {
11757 if (*valP + 0x8000 > 0xffff)
11758 as_bad_where (fixP->fx_file, fixP->fx_line,
11759 _("relocation overflow"));
11760 if (target_big_endian)
11761 buf += 2;
11762 md_number_to_chars ((char *) buf, *valP, 2);
11763 }
11764 break;
11765
11766 case BFD_RELOC_16_PCREL_S2:
11767 if ((*valP & 0x3) != 0)
11768 as_bad_where (fixP->fx_file, fixP->fx_line,
11769 _("Branch to misaligned address (%lx)"), (long) *valP);
11770
11771 /*
11772 * We need to save the bits in the instruction since fixup_segment()
11773 * might be deleting the relocation entry (i.e., a branch within
11774 * the current segment).
11775 */
11776 if (! fixP->fx_done)
11777 break;
11778
11779 /* update old instruction data */
11780 if (target_big_endian)
11781 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11782 else
11783 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11784
11785 if (*valP + 0x20000 <= 0x3ffff)
11786 {
11787 insn |= (*valP >> 2) & 0xffff;
11788 md_number_to_chars ((char *) buf, insn, 4);
11789 }
11790 else if (mips_pic == NO_PIC
11791 && fixP->fx_done
11792 && fixP->fx_frag->fr_address >= text_section->vma
11793 && (fixP->fx_frag->fr_address
11794 < text_section->vma + bfd_get_section_size (text_section))
11795 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
11796 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
11797 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11798 {
11799 /* The branch offset is too large. If this is an
11800 unconditional branch, and we are not generating PIC code,
11801 we can convert it to an absolute jump instruction. */
11802 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
11803 insn = 0x0c000000; /* jal */
11804 else
11805 insn = 0x08000000; /* j */
11806 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11807 fixP->fx_done = 0;
11808 fixP->fx_addsy = section_symbol (text_section);
11809 *valP += md_pcrel_from (fixP);
11810 md_number_to_chars ((char *) buf, insn, 4);
11811 }
11812 else
11813 {
11814 /* If we got here, we have branch-relaxation disabled,
11815 and there's nothing we can do to fix this instruction
11816 without turning it into a longer sequence. */
11817 as_bad_where (fixP->fx_file, fixP->fx_line,
11818 _("Branch out of range"));
11819 }
11820 break;
11821
11822 case BFD_RELOC_VTABLE_INHERIT:
11823 fixP->fx_done = 0;
11824 if (fixP->fx_addsy
11825 && !S_IS_DEFINED (fixP->fx_addsy)
11826 && !S_IS_WEAK (fixP->fx_addsy))
11827 S_SET_WEAK (fixP->fx_addsy);
11828 break;
11829
11830 case BFD_RELOC_VTABLE_ENTRY:
11831 fixP->fx_done = 0;
11832 break;
11833
11834 default:
11835 internalError ();
11836 }
11837
11838 /* Remember value for tc_gen_reloc. */
11839 fixP->fx_addnumber = *valP;
11840 }
11841
11842 static symbolS *
11843 get_symbol (void)
11844 {
11845 int c;
11846 char *name;
11847 symbolS *p;
11848
11849 name = input_line_pointer;
11850 c = get_symbol_end ();
11851 p = (symbolS *) symbol_find_or_make (name);
11852 *input_line_pointer = c;
11853 return p;
11854 }
11855
11856 /* Align the current frag to a given power of two. The MIPS assembler
11857 also automatically adjusts any preceding label. */
11858
11859 static void
11860 mips_align (int to, int fill, symbolS *label)
11861 {
11862 mips_emit_delays ();
11863 frag_align (to, fill, 0);
11864 record_alignment (now_seg, to);
11865 if (label != NULL)
11866 {
11867 assert (S_GET_SEGMENT (label) == now_seg);
11868 symbol_set_frag (label, frag_now);
11869 S_SET_VALUE (label, (valueT) frag_now_fix ());
11870 }
11871 }
11872
11873 /* Align to a given power of two. .align 0 turns off the automatic
11874 alignment used by the data creating pseudo-ops. */
11875
11876 static void
11877 s_align (int x ATTRIBUTE_UNUSED)
11878 {
11879 register int temp;
11880 register long temp_fill;
11881 long max_alignment = 15;
11882
11883 /*
11884
11885 o Note that the assembler pulls down any immediately preceding label
11886 to the aligned address.
11887 o It's not documented but auto alignment is reinstated by
11888 a .align pseudo instruction.
11889 o Note also that after auto alignment is turned off the mips assembler
11890 issues an error on attempt to assemble an improperly aligned data item.
11891 We don't.
11892
11893 */
11894
11895 temp = get_absolute_expression ();
11896 if (temp > max_alignment)
11897 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11898 else if (temp < 0)
11899 {
11900 as_warn (_("Alignment negative: 0 assumed."));
11901 temp = 0;
11902 }
11903 if (*input_line_pointer == ',')
11904 {
11905 ++input_line_pointer;
11906 temp_fill = get_absolute_expression ();
11907 }
11908 else
11909 temp_fill = 0;
11910 if (temp)
11911 {
11912 auto_align = 1;
11913 mips_align (temp, (int) temp_fill,
11914 insn_labels != NULL ? insn_labels->label : NULL);
11915 }
11916 else
11917 {
11918 auto_align = 0;
11919 }
11920
11921 demand_empty_rest_of_line ();
11922 }
11923
11924 static void
11925 s_change_sec (int sec)
11926 {
11927 segT seg;
11928
11929 #ifdef OBJ_ELF
11930 /* The ELF backend needs to know that we are changing sections, so
11931 that .previous works correctly. We could do something like check
11932 for an obj_section_change_hook macro, but that might be confusing
11933 as it would not be appropriate to use it in the section changing
11934 functions in read.c, since obj-elf.c intercepts those. FIXME:
11935 This should be cleaner, somehow. */
11936 obj_elf_section_change_hook ();
11937 #endif
11938
11939 mips_emit_delays ();
11940 switch (sec)
11941 {
11942 case 't':
11943 s_text (0);
11944 break;
11945 case 'd':
11946 s_data (0);
11947 break;
11948 case 'b':
11949 subseg_set (bss_section, (subsegT) get_absolute_expression ());
11950 demand_empty_rest_of_line ();
11951 break;
11952
11953 case 'r':
11954 seg = subseg_new (RDATA_SECTION_NAME,
11955 (subsegT) get_absolute_expression ());
11956 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11957 {
11958 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
11959 | SEC_READONLY | SEC_RELOC
11960 | SEC_DATA));
11961 if (strcmp (TARGET_OS, "elf") != 0)
11962 record_alignment (seg, 4);
11963 }
11964 demand_empty_rest_of_line ();
11965 break;
11966
11967 case 's':
11968 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11969 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11970 {
11971 bfd_set_section_flags (stdoutput, seg,
11972 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
11973 if (strcmp (TARGET_OS, "elf") != 0)
11974 record_alignment (seg, 4);
11975 }
11976 demand_empty_rest_of_line ();
11977 break;
11978 }
11979
11980 auto_align = 1;
11981 }
11982
11983 void
11984 s_change_section (int ignore ATTRIBUTE_UNUSED)
11985 {
11986 #ifdef OBJ_ELF
11987 char *section_name;
11988 char c;
11989 char next_c = 0;
11990 int section_type;
11991 int section_flag;
11992 int section_entry_size;
11993 int section_alignment;
11994
11995 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11996 return;
11997
11998 section_name = input_line_pointer;
11999 c = get_symbol_end ();
12000 if (c)
12001 next_c = *(input_line_pointer + 1);
12002
12003 /* Do we have .section Name<,"flags">? */
12004 if (c != ',' || (c == ',' && next_c == '"'))
12005 {
12006 /* just after name is now '\0'. */
12007 *input_line_pointer = c;
12008 input_line_pointer = section_name;
12009 obj_elf_section (ignore);
12010 return;
12011 }
12012 input_line_pointer++;
12013
12014 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12015 if (c == ',')
12016 section_type = get_absolute_expression ();
12017 else
12018 section_type = 0;
12019 if (*input_line_pointer++ == ',')
12020 section_flag = get_absolute_expression ();
12021 else
12022 section_flag = 0;
12023 if (*input_line_pointer++ == ',')
12024 section_entry_size = get_absolute_expression ();
12025 else
12026 section_entry_size = 0;
12027 if (*input_line_pointer++ == ',')
12028 section_alignment = get_absolute_expression ();
12029 else
12030 section_alignment = 0;
12031
12032 section_name = xstrdup (section_name);
12033
12034 /* When using the generic form of .section (as implemented by obj-elf.c),
12035 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12036 traditionally had to fall back on the more common @progbits instead.
12037
12038 There's nothing really harmful in this, since bfd will correct
12039 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
12040 means that, for backwards compatibility, the special_section entries
12041 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12042
12043 Even so, we shouldn't force users of the MIPS .section syntax to
12044 incorrectly label the sections as SHT_PROGBITS. The best compromise
12045 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12046 generic type-checking code. */
12047 if (section_type == SHT_MIPS_DWARF)
12048 section_type = SHT_PROGBITS;
12049
12050 obj_elf_change_section (section_name, section_type, section_flag,
12051 section_entry_size, 0, 0, 0);
12052
12053 if (now_seg->name != section_name)
12054 free (section_name);
12055 #endif /* OBJ_ELF */
12056 }
12057
12058 void
12059 mips_enable_auto_align (void)
12060 {
12061 auto_align = 1;
12062 }
12063
12064 static void
12065 s_cons (int log_size)
12066 {
12067 symbolS *label;
12068
12069 label = insn_labels != NULL ? insn_labels->label : NULL;
12070 mips_emit_delays ();
12071 if (log_size > 0 && auto_align)
12072 mips_align (log_size, 0, label);
12073 mips_clear_insn_labels ();
12074 cons (1 << log_size);
12075 }
12076
12077 static void
12078 s_float_cons (int type)
12079 {
12080 symbolS *label;
12081
12082 label = insn_labels != NULL ? insn_labels->label : NULL;
12083
12084 mips_emit_delays ();
12085
12086 if (auto_align)
12087 {
12088 if (type == 'd')
12089 mips_align (3, 0, label);
12090 else
12091 mips_align (2, 0, label);
12092 }
12093
12094 mips_clear_insn_labels ();
12095
12096 float_cons (type);
12097 }
12098
12099 /* Handle .globl. We need to override it because on Irix 5 you are
12100 permitted to say
12101 .globl foo .text
12102 where foo is an undefined symbol, to mean that foo should be
12103 considered to be the address of a function. */
12104
12105 static void
12106 s_mips_globl (int x ATTRIBUTE_UNUSED)
12107 {
12108 char *name;
12109 int c;
12110 symbolS *symbolP;
12111 flagword flag;
12112
12113 do
12114 {
12115 name = input_line_pointer;
12116 c = get_symbol_end ();
12117 symbolP = symbol_find_or_make (name);
12118 S_SET_EXTERNAL (symbolP);
12119
12120 *input_line_pointer = c;
12121 SKIP_WHITESPACE ();
12122
12123 /* On Irix 5, every global symbol that is not explicitly labelled as
12124 being a function is apparently labelled as being an object. */
12125 flag = BSF_OBJECT;
12126
12127 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12128 && (*input_line_pointer != ','))
12129 {
12130 char *secname;
12131 asection *sec;
12132
12133 secname = input_line_pointer;
12134 c = get_symbol_end ();
12135 sec = bfd_get_section_by_name (stdoutput, secname);
12136 if (sec == NULL)
12137 as_bad (_("%s: no such section"), secname);
12138 *input_line_pointer = c;
12139
12140 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12141 flag = BSF_FUNCTION;
12142 }
12143
12144 symbol_get_bfdsym (symbolP)->flags |= flag;
12145
12146 c = *input_line_pointer;
12147 if (c == ',')
12148 {
12149 input_line_pointer++;
12150 SKIP_WHITESPACE ();
12151 if (is_end_of_line[(unsigned char) *input_line_pointer])
12152 c = '\n';
12153 }
12154 }
12155 while (c == ',');
12156
12157 demand_empty_rest_of_line ();
12158 }
12159
12160 static void
12161 s_option (int x ATTRIBUTE_UNUSED)
12162 {
12163 char *opt;
12164 char c;
12165
12166 opt = input_line_pointer;
12167 c = get_symbol_end ();
12168
12169 if (*opt == 'O')
12170 {
12171 /* FIXME: What does this mean? */
12172 }
12173 else if (strncmp (opt, "pic", 3) == 0)
12174 {
12175 int i;
12176
12177 i = atoi (opt + 3);
12178 if (i == 0)
12179 mips_pic = NO_PIC;
12180 else if (i == 2)
12181 {
12182 mips_pic = SVR4_PIC;
12183 mips_abicalls = TRUE;
12184 }
12185 else
12186 as_bad (_(".option pic%d not supported"), i);
12187
12188 if (mips_pic == SVR4_PIC)
12189 {
12190 if (g_switch_seen && g_switch_value != 0)
12191 as_warn (_("-G may not be used with SVR4 PIC code"));
12192 g_switch_value = 0;
12193 bfd_set_gp_size (stdoutput, 0);
12194 }
12195 }
12196 else
12197 as_warn (_("Unrecognized option \"%s\""), opt);
12198
12199 *input_line_pointer = c;
12200 demand_empty_rest_of_line ();
12201 }
12202
12203 /* This structure is used to hold a stack of .set values. */
12204
12205 struct mips_option_stack
12206 {
12207 struct mips_option_stack *next;
12208 struct mips_set_options options;
12209 };
12210
12211 static struct mips_option_stack *mips_opts_stack;
12212
12213 /* Handle the .set pseudo-op. */
12214
12215 static void
12216 s_mipsset (int x ATTRIBUTE_UNUSED)
12217 {
12218 char *name = input_line_pointer, ch;
12219
12220 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12221 ++input_line_pointer;
12222 ch = *input_line_pointer;
12223 *input_line_pointer = '\0';
12224
12225 if (strcmp (name, "reorder") == 0)
12226 {
12227 if (mips_opts.noreorder)
12228 end_noreorder ();
12229 }
12230 else if (strcmp (name, "noreorder") == 0)
12231 {
12232 if (!mips_opts.noreorder)
12233 start_noreorder ();
12234 }
12235 else if (strcmp (name, "at") == 0)
12236 {
12237 mips_opts.noat = 0;
12238 }
12239 else if (strcmp (name, "noat") == 0)
12240 {
12241 mips_opts.noat = 1;
12242 }
12243 else if (strcmp (name, "macro") == 0)
12244 {
12245 mips_opts.warn_about_macros = 0;
12246 }
12247 else if (strcmp (name, "nomacro") == 0)
12248 {
12249 if (mips_opts.noreorder == 0)
12250 as_bad (_("`noreorder' must be set before `nomacro'"));
12251 mips_opts.warn_about_macros = 1;
12252 }
12253 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12254 {
12255 mips_opts.nomove = 0;
12256 }
12257 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12258 {
12259 mips_opts.nomove = 1;
12260 }
12261 else if (strcmp (name, "bopt") == 0)
12262 {
12263 mips_opts.nobopt = 0;
12264 }
12265 else if (strcmp (name, "nobopt") == 0)
12266 {
12267 mips_opts.nobopt = 1;
12268 }
12269 else if (strcmp (name, "mips16") == 0
12270 || strcmp (name, "MIPS-16") == 0)
12271 mips_opts.mips16 = 1;
12272 else if (strcmp (name, "nomips16") == 0
12273 || strcmp (name, "noMIPS-16") == 0)
12274 mips_opts.mips16 = 0;
12275 else if (strcmp (name, "smartmips") == 0)
12276 {
12277 if (!ISA_SUPPORT_SMARTMIPS)
12278 as_warn ("%s ISA does not support SmartMIPS ASE",
12279 mips_cpu_info_from_isa (mips_opts.isa)->name);
12280 mips_opts.ase_smartmips = 1;
12281 }
12282 else if (strcmp (name, "nosmartmips") == 0)
12283 mips_opts.ase_smartmips = 0;
12284 else if (strcmp (name, "mips3d") == 0)
12285 mips_opts.ase_mips3d = 1;
12286 else if (strcmp (name, "nomips3d") == 0)
12287 mips_opts.ase_mips3d = 0;
12288 else if (strcmp (name, "mdmx") == 0)
12289 mips_opts.ase_mdmx = 1;
12290 else if (strcmp (name, "nomdmx") == 0)
12291 mips_opts.ase_mdmx = 0;
12292 else if (strcmp (name, "dsp") == 0)
12293 mips_opts.ase_dsp = 1;
12294 else if (strcmp (name, "nodsp") == 0)
12295 mips_opts.ase_dsp = 0;
12296 else if (strcmp (name, "mt") == 0)
12297 mips_opts.ase_mt = 1;
12298 else if (strcmp (name, "nomt") == 0)
12299 mips_opts.ase_mt = 0;
12300 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12301 {
12302 int reset = 0;
12303
12304 /* Permit the user to change the ISA and architecture on the fly.
12305 Needless to say, misuse can cause serious problems. */
12306 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12307 {
12308 reset = 1;
12309 mips_opts.isa = file_mips_isa;
12310 mips_opts.arch = file_mips_arch;
12311 }
12312 else if (strncmp (name, "arch=", 5) == 0)
12313 {
12314 const struct mips_cpu_info *p;
12315
12316 p = mips_parse_cpu("internal use", name + 5);
12317 if (!p)
12318 as_bad (_("unknown architecture %s"), name + 5);
12319 else
12320 {
12321 mips_opts.arch = p->cpu;
12322 mips_opts.isa = p->isa;
12323 }
12324 }
12325 else if (strncmp (name, "mips", 4) == 0)
12326 {
12327 const struct mips_cpu_info *p;
12328
12329 p = mips_parse_cpu("internal use", name);
12330 if (!p)
12331 as_bad (_("unknown ISA level %s"), name + 4);
12332 else
12333 {
12334 mips_opts.arch = p->cpu;
12335 mips_opts.isa = p->isa;
12336 }
12337 }
12338 else
12339 as_bad (_("unknown ISA or architecture %s"), name);
12340
12341 switch (mips_opts.isa)
12342 {
12343 case 0:
12344 break;
12345 case ISA_MIPS1:
12346 case ISA_MIPS2:
12347 case ISA_MIPS32:
12348 case ISA_MIPS32R2:
12349 mips_opts.gp32 = 1;
12350 mips_opts.fp32 = 1;
12351 break;
12352 case ISA_MIPS3:
12353 case ISA_MIPS4:
12354 case ISA_MIPS5:
12355 case ISA_MIPS64:
12356 case ISA_MIPS64R2:
12357 mips_opts.gp32 = 0;
12358 mips_opts.fp32 = 0;
12359 break;
12360 default:
12361 as_bad (_("unknown ISA level %s"), name + 4);
12362 break;
12363 }
12364 if (reset)
12365 {
12366 mips_opts.gp32 = file_mips_gp32;
12367 mips_opts.fp32 = file_mips_fp32;
12368 }
12369 }
12370 else if (strcmp (name, "autoextend") == 0)
12371 mips_opts.noautoextend = 0;
12372 else if (strcmp (name, "noautoextend") == 0)
12373 mips_opts.noautoextend = 1;
12374 else if (strcmp (name, "push") == 0)
12375 {
12376 struct mips_option_stack *s;
12377
12378 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12379 s->next = mips_opts_stack;
12380 s->options = mips_opts;
12381 mips_opts_stack = s;
12382 }
12383 else if (strcmp (name, "pop") == 0)
12384 {
12385 struct mips_option_stack *s;
12386
12387 s = mips_opts_stack;
12388 if (s == NULL)
12389 as_bad (_(".set pop with no .set push"));
12390 else
12391 {
12392 /* If we're changing the reorder mode we need to handle
12393 delay slots correctly. */
12394 if (s->options.noreorder && ! mips_opts.noreorder)
12395 start_noreorder ();
12396 else if (! s->options.noreorder && mips_opts.noreorder)
12397 end_noreorder ();
12398
12399 mips_opts = s->options;
12400 mips_opts_stack = s->next;
12401 free (s);
12402 }
12403 }
12404 else if (strcmp (name, "sym32") == 0)
12405 mips_opts.sym32 = TRUE;
12406 else if (strcmp (name, "nosym32") == 0)
12407 mips_opts.sym32 = FALSE;
12408 else
12409 {
12410 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12411 }
12412 *input_line_pointer = ch;
12413 demand_empty_rest_of_line ();
12414 }
12415
12416 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12417 .option pic2. It means to generate SVR4 PIC calls. */
12418
12419 static void
12420 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12421 {
12422 mips_pic = SVR4_PIC;
12423 mips_abicalls = TRUE;
12424
12425 if (g_switch_seen && g_switch_value != 0)
12426 as_warn (_("-G may not be used with SVR4 PIC code"));
12427 g_switch_value = 0;
12428
12429 bfd_set_gp_size (stdoutput, 0);
12430 demand_empty_rest_of_line ();
12431 }
12432
12433 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12434 PIC code. It sets the $gp register for the function based on the
12435 function address, which is in the register named in the argument.
12436 This uses a relocation against _gp_disp, which is handled specially
12437 by the linker. The result is:
12438 lui $gp,%hi(_gp_disp)
12439 addiu $gp,$gp,%lo(_gp_disp)
12440 addu $gp,$gp,.cpload argument
12441 The .cpload argument is normally $25 == $t9.
12442
12443 The -mno-shared option changes this to:
12444 lui $gp,%hi(__gnu_local_gp)
12445 addiu $gp,$gp,%lo(__gnu_local_gp)
12446 and the argument is ignored. This saves an instruction, but the
12447 resulting code is not position independent; it uses an absolute
12448 address for __gnu_local_gp. Thus code assembled with -mno-shared
12449 can go into an ordinary executable, but not into a shared library. */
12450
12451 static void
12452 s_cpload (int ignore ATTRIBUTE_UNUSED)
12453 {
12454 expressionS ex;
12455 int reg;
12456 int in_shared;
12457
12458 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12459 .cpload is ignored. */
12460 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12461 {
12462 s_ignore (0);
12463 return;
12464 }
12465
12466 /* .cpload should be in a .set noreorder section. */
12467 if (mips_opts.noreorder == 0)
12468 as_warn (_(".cpload not in noreorder section"));
12469
12470 reg = tc_get_register (0);
12471
12472 /* If we need to produce a 64-bit address, we are better off using
12473 the default instruction sequence. */
12474 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12475
12476 ex.X_op = O_symbol;
12477 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12478 "__gnu_local_gp");
12479 ex.X_op_symbol = NULL;
12480 ex.X_add_number = 0;
12481
12482 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12483 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12484
12485 macro_start ();
12486 macro_build_lui (&ex, mips_gp_register);
12487 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12488 mips_gp_register, BFD_RELOC_LO16);
12489 if (in_shared)
12490 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12491 mips_gp_register, reg);
12492 macro_end ();
12493
12494 demand_empty_rest_of_line ();
12495 }
12496
12497 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12498 .cpsetup $reg1, offset|$reg2, label
12499
12500 If offset is given, this results in:
12501 sd $gp, offset($sp)
12502 lui $gp, %hi(%neg(%gp_rel(label)))
12503 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12504 daddu $gp, $gp, $reg1
12505
12506 If $reg2 is given, this results in:
12507 daddu $reg2, $gp, $0
12508 lui $gp, %hi(%neg(%gp_rel(label)))
12509 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12510 daddu $gp, $gp, $reg1
12511 $reg1 is normally $25 == $t9.
12512
12513 The -mno-shared option replaces the last three instructions with
12514 lui $gp,%hi(_gp)
12515 addiu $gp,$gp,%lo(_gp)
12516 */
12517
12518 static void
12519 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12520 {
12521 expressionS ex_off;
12522 expressionS ex_sym;
12523 int reg1;
12524
12525 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12526 We also need NewABI support. */
12527 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12528 {
12529 s_ignore (0);
12530 return;
12531 }
12532
12533 reg1 = tc_get_register (0);
12534 SKIP_WHITESPACE ();
12535 if (*input_line_pointer != ',')
12536 {
12537 as_bad (_("missing argument separator ',' for .cpsetup"));
12538 return;
12539 }
12540 else
12541 ++input_line_pointer;
12542 SKIP_WHITESPACE ();
12543 if (*input_line_pointer == '$')
12544 {
12545 mips_cpreturn_register = tc_get_register (0);
12546 mips_cpreturn_offset = -1;
12547 }
12548 else
12549 {
12550 mips_cpreturn_offset = get_absolute_expression ();
12551 mips_cpreturn_register = -1;
12552 }
12553 SKIP_WHITESPACE ();
12554 if (*input_line_pointer != ',')
12555 {
12556 as_bad (_("missing argument separator ',' for .cpsetup"));
12557 return;
12558 }
12559 else
12560 ++input_line_pointer;
12561 SKIP_WHITESPACE ();
12562 expression (&ex_sym);
12563
12564 macro_start ();
12565 if (mips_cpreturn_register == -1)
12566 {
12567 ex_off.X_op = O_constant;
12568 ex_off.X_add_symbol = NULL;
12569 ex_off.X_op_symbol = NULL;
12570 ex_off.X_add_number = mips_cpreturn_offset;
12571
12572 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12573 BFD_RELOC_LO16, SP);
12574 }
12575 else
12576 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12577 mips_gp_register, 0);
12578
12579 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12580 {
12581 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12582 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12583 BFD_RELOC_HI16_S);
12584
12585 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12586 mips_gp_register, -1, BFD_RELOC_GPREL16,
12587 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12588
12589 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12590 mips_gp_register, reg1);
12591 }
12592 else
12593 {
12594 expressionS ex;
12595
12596 ex.X_op = O_symbol;
12597 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12598 ex.X_op_symbol = NULL;
12599 ex.X_add_number = 0;
12600
12601 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12602 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12603
12604 macro_build_lui (&ex, mips_gp_register);
12605 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12606 mips_gp_register, BFD_RELOC_LO16);
12607 }
12608
12609 macro_end ();
12610
12611 demand_empty_rest_of_line ();
12612 }
12613
12614 static void
12615 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12616 {
12617 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12618 .cplocal is ignored. */
12619 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12620 {
12621 s_ignore (0);
12622 return;
12623 }
12624
12625 mips_gp_register = tc_get_register (0);
12626 demand_empty_rest_of_line ();
12627 }
12628
12629 /* Handle the .cprestore pseudo-op. This stores $gp into a given
12630 offset from $sp. The offset is remembered, and after making a PIC
12631 call $gp is restored from that location. */
12632
12633 static void
12634 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12635 {
12636 expressionS ex;
12637
12638 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12639 .cprestore is ignored. */
12640 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12641 {
12642 s_ignore (0);
12643 return;
12644 }
12645
12646 mips_cprestore_offset = get_absolute_expression ();
12647 mips_cprestore_valid = 1;
12648
12649 ex.X_op = O_constant;
12650 ex.X_add_symbol = NULL;
12651 ex.X_op_symbol = NULL;
12652 ex.X_add_number = mips_cprestore_offset;
12653
12654 macro_start ();
12655 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12656 SP, HAVE_64BIT_ADDRESSES);
12657 macro_end ();
12658
12659 demand_empty_rest_of_line ();
12660 }
12661
12662 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12663 was given in the preceding .cpsetup, it results in:
12664 ld $gp, offset($sp)
12665
12666 If a register $reg2 was given there, it results in:
12667 daddu $gp, $reg2, $0
12668 */
12669 static void
12670 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12671 {
12672 expressionS ex;
12673
12674 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12675 We also need NewABI support. */
12676 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12677 {
12678 s_ignore (0);
12679 return;
12680 }
12681
12682 macro_start ();
12683 if (mips_cpreturn_register == -1)
12684 {
12685 ex.X_op = O_constant;
12686 ex.X_add_symbol = NULL;
12687 ex.X_op_symbol = NULL;
12688 ex.X_add_number = mips_cpreturn_offset;
12689
12690 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12691 }
12692 else
12693 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12694 mips_cpreturn_register, 0);
12695 macro_end ();
12696
12697 demand_empty_rest_of_line ();
12698 }
12699
12700 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12701 code. It sets the offset to use in gp_rel relocations. */
12702
12703 static void
12704 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12705 {
12706 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12707 We also need NewABI support. */
12708 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12709 {
12710 s_ignore (0);
12711 return;
12712 }
12713
12714 mips_gprel_offset = get_absolute_expression ();
12715
12716 demand_empty_rest_of_line ();
12717 }
12718
12719 /* Handle the .gpword pseudo-op. This is used when generating PIC
12720 code. It generates a 32 bit GP relative reloc. */
12721
12722 static void
12723 s_gpword (int ignore ATTRIBUTE_UNUSED)
12724 {
12725 symbolS *label;
12726 expressionS ex;
12727 char *p;
12728
12729 /* When not generating PIC code, this is treated as .word. */
12730 if (mips_pic != SVR4_PIC)
12731 {
12732 s_cons (2);
12733 return;
12734 }
12735
12736 label = insn_labels != NULL ? insn_labels->label : NULL;
12737 mips_emit_delays ();
12738 if (auto_align)
12739 mips_align (2, 0, label);
12740 mips_clear_insn_labels ();
12741
12742 expression (&ex);
12743
12744 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12745 {
12746 as_bad (_("Unsupported use of .gpword"));
12747 ignore_rest_of_line ();
12748 }
12749
12750 p = frag_more (4);
12751 md_number_to_chars (p, 0, 4);
12752 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12753 BFD_RELOC_GPREL32);
12754
12755 demand_empty_rest_of_line ();
12756 }
12757
12758 static void
12759 s_gpdword (int ignore ATTRIBUTE_UNUSED)
12760 {
12761 symbolS *label;
12762 expressionS ex;
12763 char *p;
12764
12765 /* When not generating PIC code, this is treated as .dword. */
12766 if (mips_pic != SVR4_PIC)
12767 {
12768 s_cons (3);
12769 return;
12770 }
12771
12772 label = insn_labels != NULL ? insn_labels->label : NULL;
12773 mips_emit_delays ();
12774 if (auto_align)
12775 mips_align (3, 0, label);
12776 mips_clear_insn_labels ();
12777
12778 expression (&ex);
12779
12780 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12781 {
12782 as_bad (_("Unsupported use of .gpdword"));
12783 ignore_rest_of_line ();
12784 }
12785
12786 p = frag_more (8);
12787 md_number_to_chars (p, 0, 8);
12788 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12789 BFD_RELOC_GPREL32)->fx_tcbit = 1;
12790
12791 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
12792 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
12793 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
12794
12795 demand_empty_rest_of_line ();
12796 }
12797
12798 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
12799 tables in SVR4 PIC code. */
12800
12801 static void
12802 s_cpadd (int ignore ATTRIBUTE_UNUSED)
12803 {
12804 int reg;
12805
12806 /* This is ignored when not generating SVR4 PIC code. */
12807 if (mips_pic != SVR4_PIC)
12808 {
12809 s_ignore (0);
12810 return;
12811 }
12812
12813 /* Add $gp to the register named as an argument. */
12814 macro_start ();
12815 reg = tc_get_register (0);
12816 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12817 macro_end ();
12818
12819 demand_empty_rest_of_line ();
12820 }
12821
12822 /* Handle the .insn pseudo-op. This marks instruction labels in
12823 mips16 mode. This permits the linker to handle them specially,
12824 such as generating jalx instructions when needed. We also make
12825 them odd for the duration of the assembly, in order to generate the
12826 right sort of code. We will make them even in the adjust_symtab
12827 routine, while leaving them marked. This is convenient for the
12828 debugger and the disassembler. The linker knows to make them odd
12829 again. */
12830
12831 static void
12832 s_insn (int ignore ATTRIBUTE_UNUSED)
12833 {
12834 mips16_mark_labels ();
12835
12836 demand_empty_rest_of_line ();
12837 }
12838
12839 /* Handle a .stabn directive. We need these in order to mark a label
12840 as being a mips16 text label correctly. Sometimes the compiler
12841 will emit a label, followed by a .stabn, and then switch sections.
12842 If the label and .stabn are in mips16 mode, then the label is
12843 really a mips16 text label. */
12844
12845 static void
12846 s_mips_stab (int type)
12847 {
12848 if (type == 'n')
12849 mips16_mark_labels ();
12850
12851 s_stab (type);
12852 }
12853
12854 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12855 */
12856
12857 static void
12858 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12859 {
12860 char *name;
12861 int c;
12862 symbolS *symbolP;
12863 expressionS exp;
12864
12865 name = input_line_pointer;
12866 c = get_symbol_end ();
12867 symbolP = symbol_find_or_make (name);
12868 S_SET_WEAK (symbolP);
12869 *input_line_pointer = c;
12870
12871 SKIP_WHITESPACE ();
12872
12873 if (! is_end_of_line[(unsigned char) *input_line_pointer])
12874 {
12875 if (S_IS_DEFINED (symbolP))
12876 {
12877 as_bad ("ignoring attempt to redefine symbol %s",
12878 S_GET_NAME (symbolP));
12879 ignore_rest_of_line ();
12880 return;
12881 }
12882
12883 if (*input_line_pointer == ',')
12884 {
12885 ++input_line_pointer;
12886 SKIP_WHITESPACE ();
12887 }
12888
12889 expression (&exp);
12890 if (exp.X_op != O_symbol)
12891 {
12892 as_bad ("bad .weakext directive");
12893 ignore_rest_of_line ();
12894 return;
12895 }
12896 symbol_set_value_expression (symbolP, &exp);
12897 }
12898
12899 demand_empty_rest_of_line ();
12900 }
12901
12902 /* Parse a register string into a number. Called from the ECOFF code
12903 to parse .frame. The argument is non-zero if this is the frame
12904 register, so that we can record it in mips_frame_reg. */
12905
12906 int
12907 tc_get_register (int frame)
12908 {
12909 unsigned int reg;
12910
12911 SKIP_WHITESPACE ();
12912 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
12913 reg = 0;
12914 if (frame)
12915 {
12916 mips_frame_reg = reg != 0 ? reg : SP;
12917 mips_frame_reg_valid = 1;
12918 mips_cprestore_valid = 0;
12919 }
12920 return reg;
12921 }
12922
12923 valueT
12924 md_section_align (asection *seg, valueT addr)
12925 {
12926 int align = bfd_get_section_alignment (stdoutput, seg);
12927
12928 #ifdef OBJ_ELF
12929 /* We don't need to align ELF sections to the full alignment.
12930 However, Irix 5 may prefer that we align them at least to a 16
12931 byte boundary. We don't bother to align the sections if we are
12932 targeted for an embedded system. */
12933 if (strcmp (TARGET_OS, "elf") == 0)
12934 return addr;
12935 if (align > 4)
12936 align = 4;
12937 #endif
12938
12939 return ((addr + (1 << align) - 1) & (-1 << align));
12940 }
12941
12942 /* Utility routine, called from above as well. If called while the
12943 input file is still being read, it's only an approximation. (For
12944 example, a symbol may later become defined which appeared to be
12945 undefined earlier.) */
12946
12947 static int
12948 nopic_need_relax (symbolS *sym, int before_relaxing)
12949 {
12950 if (sym == 0)
12951 return 0;
12952
12953 if (g_switch_value > 0)
12954 {
12955 const char *symname;
12956 int change;
12957
12958 /* Find out whether this symbol can be referenced off the $gp
12959 register. It can be if it is smaller than the -G size or if
12960 it is in the .sdata or .sbss section. Certain symbols can
12961 not be referenced off the $gp, although it appears as though
12962 they can. */
12963 symname = S_GET_NAME (sym);
12964 if (symname != (const char *) NULL
12965 && (strcmp (symname, "eprol") == 0
12966 || strcmp (symname, "etext") == 0
12967 || strcmp (symname, "_gp") == 0
12968 || strcmp (symname, "edata") == 0
12969 || strcmp (symname, "_fbss") == 0
12970 || strcmp (symname, "_fdata") == 0
12971 || strcmp (symname, "_ftext") == 0
12972 || strcmp (symname, "end") == 0
12973 || strcmp (symname, "_gp_disp") == 0))
12974 change = 1;
12975 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12976 && (0
12977 #ifndef NO_ECOFF_DEBUGGING
12978 || (symbol_get_obj (sym)->ecoff_extern_size != 0
12979 && (symbol_get_obj (sym)->ecoff_extern_size
12980 <= g_switch_value))
12981 #endif
12982 /* We must defer this decision until after the whole
12983 file has been read, since there might be a .extern
12984 after the first use of this symbol. */
12985 || (before_relaxing
12986 #ifndef NO_ECOFF_DEBUGGING
12987 && symbol_get_obj (sym)->ecoff_extern_size == 0
12988 #endif
12989 && S_GET_VALUE (sym) == 0)
12990 || (S_GET_VALUE (sym) != 0
12991 && S_GET_VALUE (sym) <= g_switch_value)))
12992 change = 0;
12993 else
12994 {
12995 const char *segname;
12996
12997 segname = segment_name (S_GET_SEGMENT (sym));
12998 assert (strcmp (segname, ".lit8") != 0
12999 && strcmp (segname, ".lit4") != 0);
13000 change = (strcmp (segname, ".sdata") != 0
13001 && strcmp (segname, ".sbss") != 0
13002 && strncmp (segname, ".sdata.", 7) != 0
13003 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13004 }
13005 return change;
13006 }
13007 else
13008 /* We are not optimizing for the $gp register. */
13009 return 1;
13010 }
13011
13012
13013 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13014
13015 static bfd_boolean
13016 pic_need_relax (symbolS *sym, asection *segtype)
13017 {
13018 asection *symsec;
13019 bfd_boolean linkonce;
13020
13021 /* Handle the case of a symbol equated to another symbol. */
13022 while (symbol_equated_reloc_p (sym))
13023 {
13024 symbolS *n;
13025
13026 /* It's possible to get a loop here in a badly written
13027 program. */
13028 n = symbol_get_value_expression (sym)->X_add_symbol;
13029 if (n == sym)
13030 break;
13031 sym = n;
13032 }
13033
13034 symsec = S_GET_SEGMENT (sym);
13035
13036 /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
13037 linkonce = FALSE;
13038 if (symsec != segtype && ! S_IS_LOCAL (sym))
13039 {
13040 if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
13041 != 0)
13042 linkonce = TRUE;
13043
13044 /* The GNU toolchain uses an extension for ELF: a section
13045 beginning with the magic string .gnu.linkonce is a linkonce
13046 section. */
13047 if (strncmp (segment_name (symsec), ".gnu.linkonce",
13048 sizeof ".gnu.linkonce" - 1) == 0)
13049 linkonce = TRUE;
13050 }
13051
13052 /* This must duplicate the test in adjust_reloc_syms. */
13053 return (symsec != &bfd_und_section
13054 && symsec != &bfd_abs_section
13055 && ! bfd_is_com_section (symsec)
13056 && !linkonce
13057 #ifdef OBJ_ELF
13058 /* A global or weak symbol is treated as external. */
13059 && (OUTPUT_FLAVOR != bfd_target_elf_flavour
13060 || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13061 #endif
13062 );
13063 }
13064
13065
13066 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13067 extended opcode. SEC is the section the frag is in. */
13068
13069 static int
13070 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13071 {
13072 int type;
13073 register const struct mips16_immed_operand *op;
13074 offsetT val;
13075 int mintiny, maxtiny;
13076 segT symsec;
13077 fragS *sym_frag;
13078
13079 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13080 return 0;
13081 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13082 return 1;
13083
13084 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13085 op = mips16_immed_operands;
13086 while (op->type != type)
13087 {
13088 ++op;
13089 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13090 }
13091
13092 if (op->unsp)
13093 {
13094 if (type == '<' || type == '>' || type == '[' || type == ']')
13095 {
13096 mintiny = 1;
13097 maxtiny = 1 << op->nbits;
13098 }
13099 else
13100 {
13101 mintiny = 0;
13102 maxtiny = (1 << op->nbits) - 1;
13103 }
13104 }
13105 else
13106 {
13107 mintiny = - (1 << (op->nbits - 1));
13108 maxtiny = (1 << (op->nbits - 1)) - 1;
13109 }
13110
13111 sym_frag = symbol_get_frag (fragp->fr_symbol);
13112 val = S_GET_VALUE (fragp->fr_symbol);
13113 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13114
13115 if (op->pcrel)
13116 {
13117 addressT addr;
13118
13119 /* We won't have the section when we are called from
13120 mips_relax_frag. However, we will always have been called
13121 from md_estimate_size_before_relax first. If this is a
13122 branch to a different section, we mark it as such. If SEC is
13123 NULL, and the frag is not marked, then it must be a branch to
13124 the same section. */
13125 if (sec == NULL)
13126 {
13127 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13128 return 1;
13129 }
13130 else
13131 {
13132 /* Must have been called from md_estimate_size_before_relax. */
13133 if (symsec != sec)
13134 {
13135 fragp->fr_subtype =
13136 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13137
13138 /* FIXME: We should support this, and let the linker
13139 catch branches and loads that are out of range. */
13140 as_bad_where (fragp->fr_file, fragp->fr_line,
13141 _("unsupported PC relative reference to different section"));
13142
13143 return 1;
13144 }
13145 if (fragp != sym_frag && sym_frag->fr_address == 0)
13146 /* Assume non-extended on the first relaxation pass.
13147 The address we have calculated will be bogus if this is
13148 a forward branch to another frag, as the forward frag
13149 will have fr_address == 0. */
13150 return 0;
13151 }
13152
13153 /* In this case, we know for sure that the symbol fragment is in
13154 the same section. If the relax_marker of the symbol fragment
13155 differs from the relax_marker of this fragment, we have not
13156 yet adjusted the symbol fragment fr_address. We want to add
13157 in STRETCH in order to get a better estimate of the address.
13158 This particularly matters because of the shift bits. */
13159 if (stretch != 0
13160 && sym_frag->relax_marker != fragp->relax_marker)
13161 {
13162 fragS *f;
13163
13164 /* Adjust stretch for any alignment frag. Note that if have
13165 been expanding the earlier code, the symbol may be
13166 defined in what appears to be an earlier frag. FIXME:
13167 This doesn't handle the fr_subtype field, which specifies
13168 a maximum number of bytes to skip when doing an
13169 alignment. */
13170 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13171 {
13172 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13173 {
13174 if (stretch < 0)
13175 stretch = - ((- stretch)
13176 & ~ ((1 << (int) f->fr_offset) - 1));
13177 else
13178 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13179 if (stretch == 0)
13180 break;
13181 }
13182 }
13183 if (f != NULL)
13184 val += stretch;
13185 }
13186
13187 addr = fragp->fr_address + fragp->fr_fix;
13188
13189 /* The base address rules are complicated. The base address of
13190 a branch is the following instruction. The base address of a
13191 PC relative load or add is the instruction itself, but if it
13192 is in a delay slot (in which case it can not be extended) use
13193 the address of the instruction whose delay slot it is in. */
13194 if (type == 'p' || type == 'q')
13195 {
13196 addr += 2;
13197
13198 /* If we are currently assuming that this frag should be
13199 extended, then, the current address is two bytes
13200 higher. */
13201 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13202 addr += 2;
13203
13204 /* Ignore the low bit in the target, since it will be set
13205 for a text label. */
13206 if ((val & 1) != 0)
13207 --val;
13208 }
13209 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13210 addr -= 4;
13211 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13212 addr -= 2;
13213
13214 val -= addr & ~ ((1 << op->shift) - 1);
13215
13216 /* Branch offsets have an implicit 0 in the lowest bit. */
13217 if (type == 'p' || type == 'q')
13218 val /= 2;
13219
13220 /* If any of the shifted bits are set, we must use an extended
13221 opcode. If the address depends on the size of this
13222 instruction, this can lead to a loop, so we arrange to always
13223 use an extended opcode. We only check this when we are in
13224 the main relaxation loop, when SEC is NULL. */
13225 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13226 {
13227 fragp->fr_subtype =
13228 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13229 return 1;
13230 }
13231
13232 /* If we are about to mark a frag as extended because the value
13233 is precisely maxtiny + 1, then there is a chance of an
13234 infinite loop as in the following code:
13235 la $4,foo
13236 .skip 1020
13237 .align 2
13238 foo:
13239 In this case when the la is extended, foo is 0x3fc bytes
13240 away, so the la can be shrunk, but then foo is 0x400 away, so
13241 the la must be extended. To avoid this loop, we mark the
13242 frag as extended if it was small, and is about to become
13243 extended with a value of maxtiny + 1. */
13244 if (val == ((maxtiny + 1) << op->shift)
13245 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13246 && sec == NULL)
13247 {
13248 fragp->fr_subtype =
13249 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13250 return 1;
13251 }
13252 }
13253 else if (symsec != absolute_section && sec != NULL)
13254 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13255
13256 if ((val & ((1 << op->shift) - 1)) != 0
13257 || val < (mintiny << op->shift)
13258 || val > (maxtiny << op->shift))
13259 return 1;
13260 else
13261 return 0;
13262 }
13263
13264 /* Compute the length of a branch sequence, and adjust the
13265 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13266 worst-case length is computed, with UPDATE being used to indicate
13267 whether an unconditional (-1), branch-likely (+1) or regular (0)
13268 branch is to be computed. */
13269 static int
13270 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13271 {
13272 bfd_boolean toofar;
13273 int length;
13274
13275 if (fragp
13276 && S_IS_DEFINED (fragp->fr_symbol)
13277 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13278 {
13279 addressT addr;
13280 offsetT val;
13281
13282 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13283
13284 addr = fragp->fr_address + fragp->fr_fix + 4;
13285
13286 val -= addr;
13287
13288 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13289 }
13290 else if (fragp)
13291 /* If the symbol is not defined or it's in a different segment,
13292 assume the user knows what's going on and emit a short
13293 branch. */
13294 toofar = FALSE;
13295 else
13296 toofar = TRUE;
13297
13298 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13299 fragp->fr_subtype
13300 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13301 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13302 RELAX_BRANCH_LINK (fragp->fr_subtype),
13303 toofar);
13304
13305 length = 4;
13306 if (toofar)
13307 {
13308 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13309 length += 8;
13310
13311 if (mips_pic != NO_PIC)
13312 {
13313 /* Additional space for PIC loading of target address. */
13314 length += 8;
13315 if (mips_opts.isa == ISA_MIPS1)
13316 /* Additional space for $at-stabilizing nop. */
13317 length += 4;
13318 }
13319
13320 /* If branch is conditional. */
13321 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13322 length += 8;
13323 }
13324
13325 return length;
13326 }
13327
13328 /* Estimate the size of a frag before relaxing. Unless this is the
13329 mips16, we are not really relaxing here, and the final size is
13330 encoded in the subtype information. For the mips16, we have to
13331 decide whether we are using an extended opcode or not. */
13332
13333 int
13334 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13335 {
13336 int change;
13337
13338 if (RELAX_BRANCH_P (fragp->fr_subtype))
13339 {
13340
13341 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13342
13343 return fragp->fr_var;
13344 }
13345
13346 if (RELAX_MIPS16_P (fragp->fr_subtype))
13347 /* We don't want to modify the EXTENDED bit here; it might get us
13348 into infinite loops. We change it only in mips_relax_frag(). */
13349 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13350
13351 if (mips_pic == NO_PIC)
13352 change = nopic_need_relax (fragp->fr_symbol, 0);
13353 else if (mips_pic == SVR4_PIC)
13354 change = pic_need_relax (fragp->fr_symbol, segtype);
13355 else if (mips_pic == VXWORKS_PIC)
13356 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
13357 change = 0;
13358 else
13359 abort ();
13360
13361 if (change)
13362 {
13363 fragp->fr_subtype |= RELAX_USE_SECOND;
13364 return -RELAX_FIRST (fragp->fr_subtype);
13365 }
13366 else
13367 return -RELAX_SECOND (fragp->fr_subtype);
13368 }
13369
13370 /* This is called to see whether a reloc against a defined symbol
13371 should be converted into a reloc against a section. */
13372
13373 int
13374 mips_fix_adjustable (fixS *fixp)
13375 {
13376 /* Don't adjust MIPS16 jump relocations, so we don't have to worry
13377 about the format of the offset in the .o file. */
13378 if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13379 return 0;
13380
13381 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13382 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13383 return 0;
13384
13385 if (fixp->fx_addsy == NULL)
13386 return 1;
13387
13388 /* If symbol SYM is in a mergeable section, relocations of the form
13389 SYM + 0 can usually be made section-relative. The mergeable data
13390 is then identified by the section offset rather than by the symbol.
13391
13392 However, if we're generating REL LO16 relocations, the offset is split
13393 between the LO16 and parterning high part relocation. The linker will
13394 need to recalculate the complete offset in order to correctly identify
13395 the merge data.
13396
13397 The linker has traditionally not looked for the parterning high part
13398 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13399 placed anywhere. Rather than break backwards compatibility by changing
13400 this, it seems better not to force the issue, and instead keep the
13401 original symbol. This will work with either linker behavior. */
13402 if ((fixp->fx_r_type == BFD_RELOC_LO16
13403 || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13404 || reloc_needs_lo_p (fixp->fx_r_type))
13405 && HAVE_IN_PLACE_ADDENDS
13406 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13407 return 0;
13408
13409 #ifdef OBJ_ELF
13410 /* Don't adjust relocations against mips16 symbols, so that the linker
13411 can find them if it needs to set up a stub. */
13412 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13413 && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13414 && fixp->fx_subsy == NULL)
13415 return 0;
13416 #endif
13417
13418 return 1;
13419 }
13420
13421 /* Translate internal representation of relocation info to BFD target
13422 format. */
13423
13424 arelent **
13425 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13426 {
13427 static arelent *retval[4];
13428 arelent *reloc;
13429 bfd_reloc_code_real_type code;
13430
13431 memset (retval, 0, sizeof(retval));
13432 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13433 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13434 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13435 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13436
13437 if (fixp->fx_pcrel)
13438 {
13439 assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13440
13441 /* At this point, fx_addnumber is "symbol offset - pcrel address".
13442 Relocations want only the symbol offset. */
13443 reloc->addend = fixp->fx_addnumber + reloc->address;
13444 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13445 {
13446 /* A gruesome hack which is a result of the gruesome gas
13447 reloc handling. What's worse, for COFF (as opposed to
13448 ECOFF), we might need yet another copy of reloc->address.
13449 See bfd_install_relocation. */
13450 reloc->addend += reloc->address;
13451 }
13452 }
13453 else
13454 reloc->addend = fixp->fx_addnumber;
13455
13456 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13457 entry to be used in the relocation's section offset. */
13458 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13459 {
13460 reloc->address = reloc->addend;
13461 reloc->addend = 0;
13462 }
13463
13464 code = fixp->fx_r_type;
13465
13466 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13467 if (reloc->howto == NULL)
13468 {
13469 as_bad_where (fixp->fx_file, fixp->fx_line,
13470 _("Can not represent %s relocation in this object file format"),
13471 bfd_get_reloc_code_name (code));
13472 retval[0] = NULL;
13473 }
13474
13475 return retval;
13476 }
13477
13478 /* Relax a machine dependent frag. This returns the amount by which
13479 the current size of the frag should change. */
13480
13481 int
13482 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13483 {
13484 if (RELAX_BRANCH_P (fragp->fr_subtype))
13485 {
13486 offsetT old_var = fragp->fr_var;
13487
13488 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13489
13490 return fragp->fr_var - old_var;
13491 }
13492
13493 if (! RELAX_MIPS16_P (fragp->fr_subtype))
13494 return 0;
13495
13496 if (mips16_extended_frag (fragp, NULL, stretch))
13497 {
13498 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13499 return 0;
13500 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13501 return 2;
13502 }
13503 else
13504 {
13505 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13506 return 0;
13507 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13508 return -2;
13509 }
13510
13511 return 0;
13512 }
13513
13514 /* Convert a machine dependent frag. */
13515
13516 void
13517 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13518 {
13519 if (RELAX_BRANCH_P (fragp->fr_subtype))
13520 {
13521 bfd_byte *buf;
13522 unsigned long insn;
13523 expressionS exp;
13524 fixS *fixp;
13525
13526 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13527
13528 if (target_big_endian)
13529 insn = bfd_getb32 (buf);
13530 else
13531 insn = bfd_getl32 (buf);
13532
13533 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13534 {
13535 /* We generate a fixup instead of applying it right now
13536 because, if there are linker relaxations, we're going to
13537 need the relocations. */
13538 exp.X_op = O_symbol;
13539 exp.X_add_symbol = fragp->fr_symbol;
13540 exp.X_add_number = fragp->fr_offset;
13541
13542 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13543 4, &exp, 1, BFD_RELOC_16_PCREL_S2);
13544 fixp->fx_file = fragp->fr_file;
13545 fixp->fx_line = fragp->fr_line;
13546
13547 md_number_to_chars ((char *) buf, insn, 4);
13548 buf += 4;
13549 }
13550 else
13551 {
13552 int i;
13553
13554 as_warn_where (fragp->fr_file, fragp->fr_line,
13555 _("relaxed out-of-range branch into a jump"));
13556
13557 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13558 goto uncond;
13559
13560 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13561 {
13562 /* Reverse the branch. */
13563 switch ((insn >> 28) & 0xf)
13564 {
13565 case 4:
13566 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13567 have the condition reversed by tweaking a single
13568 bit, and their opcodes all have 0x4???????. */
13569 assert ((insn & 0xf1000000) == 0x41000000);
13570 insn ^= 0x00010000;
13571 break;
13572
13573 case 0:
13574 /* bltz 0x04000000 bgez 0x04010000
13575 bltzal 0x04100000 bgezal 0x04110000 */
13576 assert ((insn & 0xfc0e0000) == 0x04000000);
13577 insn ^= 0x00010000;
13578 break;
13579
13580 case 1:
13581 /* beq 0x10000000 bne 0x14000000
13582 blez 0x18000000 bgtz 0x1c000000 */
13583 insn ^= 0x04000000;
13584 break;
13585
13586 default:
13587 abort ();
13588 }
13589 }
13590
13591 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13592 {
13593 /* Clear the and-link bit. */
13594 assert ((insn & 0xfc1c0000) == 0x04100000);
13595
13596 /* bltzal 0x04100000 bgezal 0x04110000
13597 bltzall 0x04120000 bgezall 0x04130000 */
13598 insn &= ~0x00100000;
13599 }
13600
13601 /* Branch over the branch (if the branch was likely) or the
13602 full jump (not likely case). Compute the offset from the
13603 current instruction to branch to. */
13604 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13605 i = 16;
13606 else
13607 {
13608 /* How many bytes in instructions we've already emitted? */
13609 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13610 /* How many bytes in instructions from here to the end? */
13611 i = fragp->fr_var - i;
13612 }
13613 /* Convert to instruction count. */
13614 i >>= 2;
13615 /* Branch counts from the next instruction. */
13616 i--;
13617 insn |= i;
13618 /* Branch over the jump. */
13619 md_number_to_chars ((char *) buf, insn, 4);
13620 buf += 4;
13621
13622 /* Nop */
13623 md_number_to_chars ((char *) buf, 0, 4);
13624 buf += 4;
13625
13626 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13627 {
13628 /* beql $0, $0, 2f */
13629 insn = 0x50000000;
13630 /* Compute the PC offset from the current instruction to
13631 the end of the variable frag. */
13632 /* How many bytes in instructions we've already emitted? */
13633 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13634 /* How many bytes in instructions from here to the end? */
13635 i = fragp->fr_var - i;
13636 /* Convert to instruction count. */
13637 i >>= 2;
13638 /* Don't decrement i, because we want to branch over the
13639 delay slot. */
13640
13641 insn |= i;
13642 md_number_to_chars ((char *) buf, insn, 4);
13643 buf += 4;
13644
13645 md_number_to_chars ((char *) buf, 0, 4);
13646 buf += 4;
13647 }
13648
13649 uncond:
13650 if (mips_pic == NO_PIC)
13651 {
13652 /* j or jal. */
13653 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13654 ? 0x0c000000 : 0x08000000);
13655 exp.X_op = O_symbol;
13656 exp.X_add_symbol = fragp->fr_symbol;
13657 exp.X_add_number = fragp->fr_offset;
13658
13659 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13660 4, &exp, 0, BFD_RELOC_MIPS_JMP);
13661 fixp->fx_file = fragp->fr_file;
13662 fixp->fx_line = fragp->fr_line;
13663
13664 md_number_to_chars ((char *) buf, insn, 4);
13665 buf += 4;
13666 }
13667 else
13668 {
13669 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
13670 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13671 exp.X_op = O_symbol;
13672 exp.X_add_symbol = fragp->fr_symbol;
13673 exp.X_add_number = fragp->fr_offset;
13674
13675 if (fragp->fr_offset)
13676 {
13677 exp.X_add_symbol = make_expr_symbol (&exp);
13678 exp.X_add_number = 0;
13679 }
13680
13681 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13682 4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13683 fixp->fx_file = fragp->fr_file;
13684 fixp->fx_line = fragp->fr_line;
13685
13686 md_number_to_chars ((char *) buf, insn, 4);
13687 buf += 4;
13688
13689 if (mips_opts.isa == ISA_MIPS1)
13690 {
13691 /* nop */
13692 md_number_to_chars ((char *) buf, 0, 4);
13693 buf += 4;
13694 }
13695
13696 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
13697 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13698
13699 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13700 4, &exp, 0, BFD_RELOC_LO16);
13701 fixp->fx_file = fragp->fr_file;
13702 fixp->fx_line = fragp->fr_line;
13703
13704 md_number_to_chars ((char *) buf, insn, 4);
13705 buf += 4;
13706
13707 /* j(al)r $at. */
13708 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13709 insn = 0x0020f809;
13710 else
13711 insn = 0x00200008;
13712
13713 md_number_to_chars ((char *) buf, insn, 4);
13714 buf += 4;
13715 }
13716 }
13717
13718 assert (buf == (bfd_byte *)fragp->fr_literal
13719 + fragp->fr_fix + fragp->fr_var);
13720
13721 fragp->fr_fix += fragp->fr_var;
13722
13723 return;
13724 }
13725
13726 if (RELAX_MIPS16_P (fragp->fr_subtype))
13727 {
13728 int type;
13729 register const struct mips16_immed_operand *op;
13730 bfd_boolean small, ext;
13731 offsetT val;
13732 bfd_byte *buf;
13733 unsigned long insn;
13734 bfd_boolean use_extend;
13735 unsigned short extend;
13736
13737 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13738 op = mips16_immed_operands;
13739 while (op->type != type)
13740 ++op;
13741
13742 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13743 {
13744 small = FALSE;
13745 ext = TRUE;
13746 }
13747 else
13748 {
13749 small = TRUE;
13750 ext = FALSE;
13751 }
13752
13753 resolve_symbol_value (fragp->fr_symbol);
13754 val = S_GET_VALUE (fragp->fr_symbol);
13755 if (op->pcrel)
13756 {
13757 addressT addr;
13758
13759 addr = fragp->fr_address + fragp->fr_fix;
13760
13761 /* The rules for the base address of a PC relative reloc are
13762 complicated; see mips16_extended_frag. */
13763 if (type == 'p' || type == 'q')
13764 {
13765 addr += 2;
13766 if (ext)
13767 addr += 2;
13768 /* Ignore the low bit in the target, since it will be
13769 set for a text label. */
13770 if ((val & 1) != 0)
13771 --val;
13772 }
13773 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13774 addr -= 4;
13775 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13776 addr -= 2;
13777
13778 addr &= ~ (addressT) ((1 << op->shift) - 1);
13779 val -= addr;
13780
13781 /* Make sure the section winds up with the alignment we have
13782 assumed. */
13783 if (op->shift > 0)
13784 record_alignment (asec, op->shift);
13785 }
13786
13787 if (ext
13788 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13789 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13790 as_warn_where (fragp->fr_file, fragp->fr_line,
13791 _("extended instruction in delay slot"));
13792
13793 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13794
13795 if (target_big_endian)
13796 insn = bfd_getb16 (buf);
13797 else
13798 insn = bfd_getl16 (buf);
13799
13800 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13801 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13802 small, ext, &insn, &use_extend, &extend);
13803
13804 if (use_extend)
13805 {
13806 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
13807 fragp->fr_fix += 2;
13808 buf += 2;
13809 }
13810
13811 md_number_to_chars ((char *) buf, insn, 2);
13812 fragp->fr_fix += 2;
13813 buf += 2;
13814 }
13815 else
13816 {
13817 int first, second;
13818 fixS *fixp;
13819
13820 first = RELAX_FIRST (fragp->fr_subtype);
13821 second = RELAX_SECOND (fragp->fr_subtype);
13822 fixp = (fixS *) fragp->fr_opcode;
13823
13824 /* Possibly emit a warning if we've chosen the longer option. */
13825 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13826 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13827 {
13828 const char *msg = macro_warning (fragp->fr_subtype);
13829 if (msg != 0)
13830 as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13831 }
13832
13833 /* Go through all the fixups for the first sequence. Disable them
13834 (by marking them as done) if we're going to use the second
13835 sequence instead. */
13836 while (fixp
13837 && fixp->fx_frag == fragp
13838 && fixp->fx_where < fragp->fr_fix - second)
13839 {
13840 if (fragp->fr_subtype & RELAX_USE_SECOND)
13841 fixp->fx_done = 1;
13842 fixp = fixp->fx_next;
13843 }
13844
13845 /* Go through the fixups for the second sequence. Disable them if
13846 we're going to use the first sequence, otherwise adjust their
13847 addresses to account for the relaxation. */
13848 while (fixp && fixp->fx_frag == fragp)
13849 {
13850 if (fragp->fr_subtype & RELAX_USE_SECOND)
13851 fixp->fx_where -= first;
13852 else
13853 fixp->fx_done = 1;
13854 fixp = fixp->fx_next;
13855 }
13856
13857 /* Now modify the frag contents. */
13858 if (fragp->fr_subtype & RELAX_USE_SECOND)
13859 {
13860 char *start;
13861
13862 start = fragp->fr_literal + fragp->fr_fix - first - second;
13863 memmove (start, start + first, second);
13864 fragp->fr_fix -= first;
13865 }
13866 else
13867 fragp->fr_fix -= second;
13868 }
13869 }
13870
13871 #ifdef OBJ_ELF
13872
13873 /* This function is called after the relocs have been generated.
13874 We've been storing mips16 text labels as odd. Here we convert them
13875 back to even for the convenience of the debugger. */
13876
13877 void
13878 mips_frob_file_after_relocs (void)
13879 {
13880 asymbol **syms;
13881 unsigned int count, i;
13882
13883 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13884 return;
13885
13886 syms = bfd_get_outsymbols (stdoutput);
13887 count = bfd_get_symcount (stdoutput);
13888 for (i = 0; i < count; i++, syms++)
13889 {
13890 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13891 && ((*syms)->value & 1) != 0)
13892 {
13893 (*syms)->value &= ~1;
13894 /* If the symbol has an odd size, it was probably computed
13895 incorrectly, so adjust that as well. */
13896 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13897 ++elf_symbol (*syms)->internal_elf_sym.st_size;
13898 }
13899 }
13900 }
13901
13902 #endif
13903
13904 /* This function is called whenever a label is defined. It is used
13905 when handling branch delays; if a branch has a label, we assume we
13906 can not move it. */
13907
13908 void
13909 mips_define_label (symbolS *sym)
13910 {
13911 struct insn_label_list *l;
13912
13913 if (free_insn_labels == NULL)
13914 l = (struct insn_label_list *) xmalloc (sizeof *l);
13915 else
13916 {
13917 l = free_insn_labels;
13918 free_insn_labels = l->next;
13919 }
13920
13921 l->label = sym;
13922 l->next = insn_labels;
13923 insn_labels = l;
13924
13925 #ifdef OBJ_ELF
13926 dwarf2_emit_label (sym);
13927 #endif
13928 }
13929 \f
13930 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13931
13932 /* Some special processing for a MIPS ELF file. */
13933
13934 void
13935 mips_elf_final_processing (void)
13936 {
13937 /* Write out the register information. */
13938 if (mips_abi != N64_ABI)
13939 {
13940 Elf32_RegInfo s;
13941
13942 s.ri_gprmask = mips_gprmask;
13943 s.ri_cprmask[0] = mips_cprmask[0];
13944 s.ri_cprmask[1] = mips_cprmask[1];
13945 s.ri_cprmask[2] = mips_cprmask[2];
13946 s.ri_cprmask[3] = mips_cprmask[3];
13947 /* The gp_value field is set by the MIPS ELF backend. */
13948
13949 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13950 ((Elf32_External_RegInfo *)
13951 mips_regmask_frag));
13952 }
13953 else
13954 {
13955 Elf64_Internal_RegInfo s;
13956
13957 s.ri_gprmask = mips_gprmask;
13958 s.ri_pad = 0;
13959 s.ri_cprmask[0] = mips_cprmask[0];
13960 s.ri_cprmask[1] = mips_cprmask[1];
13961 s.ri_cprmask[2] = mips_cprmask[2];
13962 s.ri_cprmask[3] = mips_cprmask[3];
13963 /* The gp_value field is set by the MIPS ELF backend. */
13964
13965 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13966 ((Elf64_External_RegInfo *)
13967 mips_regmask_frag));
13968 }
13969
13970 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
13971 sort of BFD interface for this. */
13972 if (mips_any_noreorder)
13973 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13974 if (mips_pic != NO_PIC)
13975 {
13976 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13977 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13978 }
13979 if (mips_abicalls)
13980 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13981
13982 /* Set MIPS ELF flags for ASEs. */
13983 /* We may need to define a new flag for DSP ASE, and set this flag when
13984 file_ase_dsp is true. */
13985 /* We may need to define a new flag for MT ASE, and set this flag when
13986 file_ase_mt is true. */
13987 if (file_ase_mips16)
13988 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13989 #if 0 /* XXX FIXME */
13990 if (file_ase_mips3d)
13991 elf_elfheader (stdoutput)->e_flags |= ???;
13992 #endif
13993 if (file_ase_mdmx)
13994 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13995
13996 /* Set the MIPS ELF ABI flags. */
13997 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13998 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13999 else if (mips_abi == O64_ABI)
14000 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14001 else if (mips_abi == EABI_ABI)
14002 {
14003 if (!file_mips_gp32)
14004 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14005 else
14006 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14007 }
14008 else if (mips_abi == N32_ABI)
14009 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14010
14011 /* Nothing to do for N64_ABI. */
14012
14013 if (mips_32bitmode)
14014 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14015 }
14016
14017 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14018 \f
14019 typedef struct proc {
14020 symbolS *func_sym;
14021 symbolS *func_end_sym;
14022 unsigned long reg_mask;
14023 unsigned long reg_offset;
14024 unsigned long fpreg_mask;
14025 unsigned long fpreg_offset;
14026 unsigned long frame_offset;
14027 unsigned long frame_reg;
14028 unsigned long pc_reg;
14029 } procS;
14030
14031 static procS cur_proc;
14032 static procS *cur_proc_ptr;
14033 static int numprocs;
14034
14035 /* Fill in an rs_align_code fragment. */
14036
14037 void
14038 mips_handle_align (fragS *fragp)
14039 {
14040 if (fragp->fr_type != rs_align_code)
14041 return;
14042
14043 if (mips_opts.mips16)
14044 {
14045 static const unsigned char be_nop[] = { 0x65, 0x00 };
14046 static const unsigned char le_nop[] = { 0x00, 0x65 };
14047
14048 int bytes;
14049 char *p;
14050
14051 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14052 p = fragp->fr_literal + fragp->fr_fix;
14053
14054 if (bytes & 1)
14055 {
14056 *p++ = 0;
14057 fragp->fr_fix++;
14058 }
14059
14060 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14061 fragp->fr_var = 2;
14062 }
14063
14064 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
14065 }
14066
14067 static void
14068 md_obj_begin (void)
14069 {
14070 }
14071
14072 static void
14073 md_obj_end (void)
14074 {
14075 /* check for premature end, nesting errors, etc */
14076 if (cur_proc_ptr)
14077 as_warn (_("missing .end at end of assembly"));
14078 }
14079
14080 static long
14081 get_number (void)
14082 {
14083 int negative = 0;
14084 long val = 0;
14085
14086 if (*input_line_pointer == '-')
14087 {
14088 ++input_line_pointer;
14089 negative = 1;
14090 }
14091 if (!ISDIGIT (*input_line_pointer))
14092 as_bad (_("expected simple number"));
14093 if (input_line_pointer[0] == '0')
14094 {
14095 if (input_line_pointer[1] == 'x')
14096 {
14097 input_line_pointer += 2;
14098 while (ISXDIGIT (*input_line_pointer))
14099 {
14100 val <<= 4;
14101 val |= hex_value (*input_line_pointer++);
14102 }
14103 return negative ? -val : val;
14104 }
14105 else
14106 {
14107 ++input_line_pointer;
14108 while (ISDIGIT (*input_line_pointer))
14109 {
14110 val <<= 3;
14111 val |= *input_line_pointer++ - '0';
14112 }
14113 return negative ? -val : val;
14114 }
14115 }
14116 if (!ISDIGIT (*input_line_pointer))
14117 {
14118 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14119 *input_line_pointer, *input_line_pointer);
14120 as_warn (_("invalid number"));
14121 return -1;
14122 }
14123 while (ISDIGIT (*input_line_pointer))
14124 {
14125 val *= 10;
14126 val += *input_line_pointer++ - '0';
14127 }
14128 return negative ? -val : val;
14129 }
14130
14131 /* The .file directive; just like the usual .file directive, but there
14132 is an initial number which is the ECOFF file index. In the non-ECOFF
14133 case .file implies DWARF-2. */
14134
14135 static void
14136 s_mips_file (int x ATTRIBUTE_UNUSED)
14137 {
14138 static int first_file_directive = 0;
14139
14140 if (ECOFF_DEBUGGING)
14141 {
14142 get_number ();
14143 s_app_file (0);
14144 }
14145 else
14146 {
14147 char *filename;
14148
14149 filename = dwarf2_directive_file (0);
14150
14151 /* Versions of GCC up to 3.1 start files with a ".file"
14152 directive even for stabs output. Make sure that this
14153 ".file" is handled. Note that you need a version of GCC
14154 after 3.1 in order to support DWARF-2 on MIPS. */
14155 if (filename != NULL && ! first_file_directive)
14156 {
14157 (void) new_logical_line (filename, -1);
14158 s_app_file_string (filename, 0);
14159 }
14160 first_file_directive = 1;
14161 }
14162 }
14163
14164 /* The .loc directive, implying DWARF-2. */
14165
14166 static void
14167 s_mips_loc (int x ATTRIBUTE_UNUSED)
14168 {
14169 if (!ECOFF_DEBUGGING)
14170 dwarf2_directive_loc (0);
14171 }
14172
14173 /* The .end directive. */
14174
14175 static void
14176 s_mips_end (int x ATTRIBUTE_UNUSED)
14177 {
14178 symbolS *p;
14179
14180 /* Following functions need their own .frame and .cprestore directives. */
14181 mips_frame_reg_valid = 0;
14182 mips_cprestore_valid = 0;
14183
14184 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14185 {
14186 p = get_symbol ();
14187 demand_empty_rest_of_line ();
14188 }
14189 else
14190 p = NULL;
14191
14192 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14193 as_warn (_(".end not in text section"));
14194
14195 if (!cur_proc_ptr)
14196 {
14197 as_warn (_(".end directive without a preceding .ent directive."));
14198 demand_empty_rest_of_line ();
14199 return;
14200 }
14201
14202 if (p != NULL)
14203 {
14204 assert (S_GET_NAME (p));
14205 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14206 as_warn (_(".end symbol does not match .ent symbol."));
14207
14208 if (debug_type == DEBUG_STABS)
14209 stabs_generate_asm_endfunc (S_GET_NAME (p),
14210 S_GET_NAME (p));
14211 }
14212 else
14213 as_warn (_(".end directive missing or unknown symbol"));
14214
14215 #ifdef OBJ_ELF
14216 /* Create an expression to calculate the size of the function. */
14217 if (p && cur_proc_ptr)
14218 {
14219 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14220 expressionS *exp = xmalloc (sizeof (expressionS));
14221
14222 obj->size = exp;
14223 exp->X_op = O_subtract;
14224 exp->X_add_symbol = symbol_temp_new_now ();
14225 exp->X_op_symbol = p;
14226 exp->X_add_number = 0;
14227
14228 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14229 }
14230
14231 /* Generate a .pdr section. */
14232 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
14233 && mips_flag_pdr)
14234 {
14235 segT saved_seg = now_seg;
14236 subsegT saved_subseg = now_subseg;
14237 valueT dot;
14238 expressionS exp;
14239 char *fragp;
14240
14241 dot = frag_now_fix ();
14242
14243 #ifdef md_flush_pending_output
14244 md_flush_pending_output ();
14245 #endif
14246
14247 assert (pdr_seg);
14248 subseg_set (pdr_seg, 0);
14249
14250 /* Write the symbol. */
14251 exp.X_op = O_symbol;
14252 exp.X_add_symbol = p;
14253 exp.X_add_number = 0;
14254 emit_expr (&exp, 4);
14255
14256 fragp = frag_more (7 * 4);
14257
14258 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14259 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14260 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14261 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14262 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14263 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14264 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14265
14266 subseg_set (saved_seg, saved_subseg);
14267 }
14268 #endif /* OBJ_ELF */
14269
14270 cur_proc_ptr = NULL;
14271 }
14272
14273 /* The .aent and .ent directives. */
14274
14275 static void
14276 s_mips_ent (int aent)
14277 {
14278 symbolS *symbolP;
14279
14280 symbolP = get_symbol ();
14281 if (*input_line_pointer == ',')
14282 ++input_line_pointer;
14283 SKIP_WHITESPACE ();
14284 if (ISDIGIT (*input_line_pointer)
14285 || *input_line_pointer == '-')
14286 get_number ();
14287
14288 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14289 as_warn (_(".ent or .aent not in text section."));
14290
14291 if (!aent && cur_proc_ptr)
14292 as_warn (_("missing .end"));
14293
14294 if (!aent)
14295 {
14296 /* This function needs its own .frame and .cprestore directives. */
14297 mips_frame_reg_valid = 0;
14298 mips_cprestore_valid = 0;
14299
14300 cur_proc_ptr = &cur_proc;
14301 memset (cur_proc_ptr, '\0', sizeof (procS));
14302
14303 cur_proc_ptr->func_sym = symbolP;
14304
14305 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14306
14307 ++numprocs;
14308
14309 if (debug_type == DEBUG_STABS)
14310 stabs_generate_asm_func (S_GET_NAME (symbolP),
14311 S_GET_NAME (symbolP));
14312 }
14313
14314 demand_empty_rest_of_line ();
14315 }
14316
14317 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14318 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14319 s_mips_frame is used so that we can set the PDR information correctly.
14320 We can't use the ecoff routines because they make reference to the ecoff
14321 symbol table (in the mdebug section). */
14322
14323 static void
14324 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14325 {
14326 #ifdef OBJ_ELF
14327 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14328 {
14329 long val;
14330
14331 if (cur_proc_ptr == (procS *) NULL)
14332 {
14333 as_warn (_(".frame outside of .ent"));
14334 demand_empty_rest_of_line ();
14335 return;
14336 }
14337
14338 cur_proc_ptr->frame_reg = tc_get_register (1);
14339
14340 SKIP_WHITESPACE ();
14341 if (*input_line_pointer++ != ','
14342 || get_absolute_expression_and_terminator (&val) != ',')
14343 {
14344 as_warn (_("Bad .frame directive"));
14345 --input_line_pointer;
14346 demand_empty_rest_of_line ();
14347 return;
14348 }
14349
14350 cur_proc_ptr->frame_offset = val;
14351 cur_proc_ptr->pc_reg = tc_get_register (0);
14352
14353 demand_empty_rest_of_line ();
14354 }
14355 else
14356 #endif /* OBJ_ELF */
14357 s_ignore (ignore);
14358 }
14359
14360 /* The .fmask and .mask directives. If the mdebug section is present
14361 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14362 embedded targets, s_mips_mask is used so that we can set the PDR
14363 information correctly. We can't use the ecoff routines because they
14364 make reference to the ecoff symbol table (in the mdebug section). */
14365
14366 static void
14367 s_mips_mask (int reg_type)
14368 {
14369 #ifdef OBJ_ELF
14370 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14371 {
14372 long mask, off;
14373
14374 if (cur_proc_ptr == (procS *) NULL)
14375 {
14376 as_warn (_(".mask/.fmask outside of .ent"));
14377 demand_empty_rest_of_line ();
14378 return;
14379 }
14380
14381 if (get_absolute_expression_and_terminator (&mask) != ',')
14382 {
14383 as_warn (_("Bad .mask/.fmask directive"));
14384 --input_line_pointer;
14385 demand_empty_rest_of_line ();
14386 return;
14387 }
14388
14389 off = get_absolute_expression ();
14390
14391 if (reg_type == 'F')
14392 {
14393 cur_proc_ptr->fpreg_mask = mask;
14394 cur_proc_ptr->fpreg_offset = off;
14395 }
14396 else
14397 {
14398 cur_proc_ptr->reg_mask = mask;
14399 cur_proc_ptr->reg_offset = off;
14400 }
14401
14402 demand_empty_rest_of_line ();
14403 }
14404 else
14405 #endif /* OBJ_ELF */
14406 s_ignore (reg_type);
14407 }
14408
14409 /* A table describing all the processors gas knows about. Names are
14410 matched in the order listed.
14411
14412 To ease comparison, please keep this table in the same order as
14413 gcc's mips_cpu_info_table[]. */
14414 static const struct mips_cpu_info mips_cpu_info_table[] =
14415 {
14416 /* Entries for generic ISAs */
14417 { "mips1", 1, ISA_MIPS1, CPU_R3000 },
14418 { "mips2", 1, ISA_MIPS2, CPU_R6000 },
14419 { "mips3", 1, ISA_MIPS3, CPU_R4000 },
14420 { "mips4", 1, ISA_MIPS4, CPU_R8000 },
14421 { "mips5", 1, ISA_MIPS5, CPU_MIPS5 },
14422 { "mips32", 1, ISA_MIPS32, CPU_MIPS32 },
14423 { "mips32r2", 1, ISA_MIPS32R2, CPU_MIPS32R2 },
14424 { "mips64", 1, ISA_MIPS64, CPU_MIPS64 },
14425 { "mips64r2", 1, ISA_MIPS64R2, CPU_MIPS64R2 },
14426
14427 /* MIPS I */
14428 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14429 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14430 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14431
14432 /* MIPS II */
14433 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14434
14435 /* MIPS III */
14436 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
14437 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
14438 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
14439 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
14440 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
14441 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
14442 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
14443 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
14444 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
14445 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
14446 { "orion", 0, ISA_MIPS3, CPU_R4600 },
14447 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
14448
14449 /* MIPS IV */
14450 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
14451 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
14452 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
14453 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
14454 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
14455 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
14456 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
14457 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
14458 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
14459 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
14460 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
14461 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
14462 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
14463
14464 /* MIPS 32 */
14465 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
14466 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
14467 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
14468
14469 /* MIPS32 Release 2 */
14470 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14471 { "24k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14472 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14473 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14474 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14475
14476 /* MIPS 64 */
14477 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
14478 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
14479 { "20kc", 0, ISA_MIPS64, CPU_MIPS64 },
14480
14481 /* Broadcom SB-1 CPU core */
14482 { "sb1", 0, ISA_MIPS64, CPU_SB1 },
14483
14484 /* End marker */
14485 { NULL, 0, 0, 0 }
14486 };
14487
14488
14489 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14490 with a final "000" replaced by "k". Ignore case.
14491
14492 Note: this function is shared between GCC and GAS. */
14493
14494 static bfd_boolean
14495 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14496 {
14497 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14498 given++, canonical++;
14499
14500 return ((*given == 0 && *canonical == 0)
14501 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14502 }
14503
14504
14505 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14506 CPU name. We've traditionally allowed a lot of variation here.
14507
14508 Note: this function is shared between GCC and GAS. */
14509
14510 static bfd_boolean
14511 mips_matching_cpu_name_p (const char *canonical, const char *given)
14512 {
14513 /* First see if the name matches exactly, or with a final "000"
14514 turned into "k". */
14515 if (mips_strict_matching_cpu_name_p (canonical, given))
14516 return TRUE;
14517
14518 /* If not, try comparing based on numerical designation alone.
14519 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14520 if (TOLOWER (*given) == 'r')
14521 given++;
14522 if (!ISDIGIT (*given))
14523 return FALSE;
14524
14525 /* Skip over some well-known prefixes in the canonical name,
14526 hoping to find a number there too. */
14527 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14528 canonical += 2;
14529 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14530 canonical += 2;
14531 else if (TOLOWER (canonical[0]) == 'r')
14532 canonical += 1;
14533
14534 return mips_strict_matching_cpu_name_p (canonical, given);
14535 }
14536
14537
14538 /* Parse an option that takes the name of a processor as its argument.
14539 OPTION is the name of the option and CPU_STRING is the argument.
14540 Return the corresponding processor enumeration if the CPU_STRING is
14541 recognized, otherwise report an error and return null.
14542
14543 A similar function exists in GCC. */
14544
14545 static const struct mips_cpu_info *
14546 mips_parse_cpu (const char *option, const char *cpu_string)
14547 {
14548 const struct mips_cpu_info *p;
14549
14550 /* 'from-abi' selects the most compatible architecture for the given
14551 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
14552 EABIs, we have to decide whether we're using the 32-bit or 64-bit
14553 version. Look first at the -mgp options, if given, otherwise base
14554 the choice on MIPS_DEFAULT_64BIT.
14555
14556 Treat NO_ABI like the EABIs. One reason to do this is that the
14557 plain 'mips' and 'mips64' configs have 'from-abi' as their default
14558 architecture. This code picks MIPS I for 'mips' and MIPS III for
14559 'mips64', just as we did in the days before 'from-abi'. */
14560 if (strcasecmp (cpu_string, "from-abi") == 0)
14561 {
14562 if (ABI_NEEDS_32BIT_REGS (mips_abi))
14563 return mips_cpu_info_from_isa (ISA_MIPS1);
14564
14565 if (ABI_NEEDS_64BIT_REGS (mips_abi))
14566 return mips_cpu_info_from_isa (ISA_MIPS3);
14567
14568 if (file_mips_gp32 >= 0)
14569 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14570
14571 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14572 ? ISA_MIPS3
14573 : ISA_MIPS1);
14574 }
14575
14576 /* 'default' has traditionally been a no-op. Probably not very useful. */
14577 if (strcasecmp (cpu_string, "default") == 0)
14578 return 0;
14579
14580 for (p = mips_cpu_info_table; p->name != 0; p++)
14581 if (mips_matching_cpu_name_p (p->name, cpu_string))
14582 return p;
14583
14584 as_bad ("Bad value (%s) for %s", cpu_string, option);
14585 return 0;
14586 }
14587
14588 /* Return the canonical processor information for ISA (a member of the
14589 ISA_MIPS* enumeration). */
14590
14591 static const struct mips_cpu_info *
14592 mips_cpu_info_from_isa (int isa)
14593 {
14594 int i;
14595
14596 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14597 if (mips_cpu_info_table[i].is_isa
14598 && isa == mips_cpu_info_table[i].isa)
14599 return (&mips_cpu_info_table[i]);
14600
14601 return NULL;
14602 }
14603
14604 static const struct mips_cpu_info *
14605 mips_cpu_info_from_arch (int arch)
14606 {
14607 int i;
14608
14609 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14610 if (arch == mips_cpu_info_table[i].cpu)
14611 return (&mips_cpu_info_table[i]);
14612
14613 return NULL;
14614 }
14615 \f
14616 static void
14617 show (FILE *stream, const char *string, int *col_p, int *first_p)
14618 {
14619 if (*first_p)
14620 {
14621 fprintf (stream, "%24s", "");
14622 *col_p = 24;
14623 }
14624 else
14625 {
14626 fprintf (stream, ", ");
14627 *col_p += 2;
14628 }
14629
14630 if (*col_p + strlen (string) > 72)
14631 {
14632 fprintf (stream, "\n%24s", "");
14633 *col_p = 24;
14634 }
14635
14636 fprintf (stream, "%s", string);
14637 *col_p += strlen (string);
14638
14639 *first_p = 0;
14640 }
14641
14642 void
14643 md_show_usage (FILE *stream)
14644 {
14645 int column, first;
14646 size_t i;
14647
14648 fprintf (stream, _("\
14649 MIPS options:\n\
14650 -EB generate big endian output\n\
14651 -EL generate little endian output\n\
14652 -g, -g2 do not remove unneeded NOPs or swap branches\n\
14653 -G NUM allow referencing objects up to NUM bytes\n\
14654 implicitly with the gp register [default 8]\n"));
14655 fprintf (stream, _("\
14656 -mips1 generate MIPS ISA I instructions\n\
14657 -mips2 generate MIPS ISA II instructions\n\
14658 -mips3 generate MIPS ISA III instructions\n\
14659 -mips4 generate MIPS ISA IV instructions\n\
14660 -mips5 generate MIPS ISA V instructions\n\
14661 -mips32 generate MIPS32 ISA instructions\n\
14662 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
14663 -mips64 generate MIPS64 ISA instructions\n\
14664 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
14665 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
14666
14667 first = 1;
14668
14669 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14670 show (stream, mips_cpu_info_table[i].name, &column, &first);
14671 show (stream, "from-abi", &column, &first);
14672 fputc ('\n', stream);
14673
14674 fprintf (stream, _("\
14675 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14676 -no-mCPU don't generate code specific to CPU.\n\
14677 For -mCPU and -no-mCPU, CPU must be one of:\n"));
14678
14679 first = 1;
14680
14681 show (stream, "3900", &column, &first);
14682 show (stream, "4010", &column, &first);
14683 show (stream, "4100", &column, &first);
14684 show (stream, "4650", &column, &first);
14685 fputc ('\n', stream);
14686
14687 fprintf (stream, _("\
14688 -mips16 generate mips16 instructions\n\
14689 -no-mips16 do not generate mips16 instructions\n"));
14690 fprintf (stream, _("\
14691 -msmartmips generate smartmips instructions\n\
14692 -mno-smartmips do not generate smartmips instructions\n"));
14693 fprintf (stream, _("\
14694 -mdsp generate DSP instructions\n\
14695 -mno-dsp do not generate DSP instructions\n"));
14696 fprintf (stream, _("\
14697 -mmt generate MT instructions\n\
14698 -mno-mt do not generate MT instructions\n"));
14699 fprintf (stream, _("\
14700 -mfix-vr4120 work around certain VR4120 errata\n\
14701 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
14702 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
14703 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
14704 -mno-shared optimize output for executables\n\
14705 -msym32 assume all symbols have 32-bit values\n\
14706 -O0 remove unneeded NOPs, do not swap branches\n\
14707 -O remove unneeded NOPs and swap branches\n\
14708 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14709 --trap, --no-break trap exception on div by 0 and mult overflow\n\
14710 --break, --no-trap break exception on div by 0 and mult overflow\n"));
14711 #ifdef OBJ_ELF
14712 fprintf (stream, _("\
14713 -KPIC, -call_shared generate SVR4 position independent code\n\
14714 -non_shared do not generate position independent code\n\
14715 -xgot assume a 32 bit GOT\n\
14716 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
14717 -mshared, -mno-shared disable/enable .cpload optimization for\n\
14718 non-shared code\n\
14719 -mabi=ABI create ABI conformant object file for:\n"));
14720
14721 first = 1;
14722
14723 show (stream, "32", &column, &first);
14724 show (stream, "o64", &column, &first);
14725 show (stream, "n32", &column, &first);
14726 show (stream, "64", &column, &first);
14727 show (stream, "eabi", &column, &first);
14728
14729 fputc ('\n', stream);
14730
14731 fprintf (stream, _("\
14732 -32 create o32 ABI object file (default)\n\
14733 -n32 create n32 ABI object file\n\
14734 -64 create 64 ABI object file\n"));
14735 #endif
14736 }
14737
14738 enum dwarf2_format
14739 mips_dwarf2_format (void)
14740 {
14741 if (mips_abi == N64_ABI)
14742 {
14743 #ifdef TE_IRIX
14744 return dwarf2_format_64bit_irix;
14745 #else
14746 return dwarf2_format_64bit;
14747 #endif
14748 }
14749 else
14750 return dwarf2_format_32bit;
14751 }
14752
14753 int
14754 mips_dwarf2_addr_size (void)
14755 {
14756 if (mips_abi == N64_ABI)
14757 return 8;
14758 else
14759 return 4;
14760 }
14761
14762 /* Standard calling conventions leave the CFA at SP on entry. */
14763 void
14764 mips_cfi_frame_initial_instructions (void)
14765 {
14766 cfi_add_CFA_def_cfa_register (SP);
14767 }
14768
14769 int
14770 tc_mips_regname_to_dw2regnum (char *regname)
14771 {
14772 unsigned int regnum = -1;
14773 unsigned int reg;
14774
14775 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
14776 regnum = reg;
14777
14778 return regnum;
14779 }
This page took 0.38688 seconds and 5 git commands to generate.