2003-05-07 Eric Christopher <echristo@redhat.com>
[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, 2003
3 Free Software Foundation, Inc.
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 02111-1307, USA. */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #ifdef USE_STDARG
32 #include <stdarg.h>
33 #endif
34 #ifdef USE_VARARGS
35 #include <varargs.h>
36 #endif
37
38 #include "opcode/mips.h"
39 #include "itbl-ops.h"
40 #include "dwarf2dbg.h"
41
42 #ifdef DEBUG
43 #define DBG(x) printf x
44 #else
45 #define DBG(x)
46 #endif
47
48 #ifdef OBJ_MAYBE_ELF
49 /* Clean up namespace so we can include obj-elf.h too. */
50 static int mips_output_flavor PARAMS ((void));
51 static int mips_output_flavor () { return OUTPUT_FLAVOR; }
52 #undef OBJ_PROCESS_STAB
53 #undef OUTPUT_FLAVOR
54 #undef S_GET_ALIGN
55 #undef S_GET_SIZE
56 #undef S_SET_ALIGN
57 #undef S_SET_SIZE
58 #undef obj_frob_file
59 #undef obj_frob_file_after_relocs
60 #undef obj_frob_symbol
61 #undef obj_pop_insert
62 #undef obj_sec_sym_ok_for_reloc
63 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
64
65 #include "obj-elf.h"
66 /* Fix any of them that we actually care about. */
67 #undef OUTPUT_FLAVOR
68 #define OUTPUT_FLAVOR mips_output_flavor()
69 #endif
70
71 #if defined (OBJ_ELF)
72 #include "elf/mips.h"
73 #endif
74
75 #ifndef ECOFF_DEBUGGING
76 #define NO_ECOFF_DEBUGGING
77 #define ECOFF_DEBUGGING 0
78 #endif
79
80 int mips_flag_mdebug = -1;
81
82 #include "ecoff.h"
83
84 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
85 static char *mips_regmask_frag;
86 #endif
87
88 #define ZERO 0
89 #define AT 1
90 #define TREG 24
91 #define PIC_CALL_REG 25
92 #define KT0 26
93 #define KT1 27
94 #define GP 28
95 #define SP 29
96 #define FP 30
97 #define RA 31
98
99 #define ILLEGAL_REG (32)
100
101 /* Allow override of standard little-endian ECOFF format. */
102
103 #ifndef ECOFF_LITTLE_FORMAT
104 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
105 #endif
106
107 extern int target_big_endian;
108
109 /* The name of the readonly data section. */
110 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
111 ? ".data" \
112 : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
113 ? ".rdata" \
114 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
115 ? ".rdata" \
116 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
117 ? ".rodata" \
118 : (abort (), ""))
119
120 /* The ABI to use. */
121 enum mips_abi_level
122 {
123 NO_ABI = 0,
124 O32_ABI,
125 O64_ABI,
126 N32_ABI,
127 N64_ABI,
128 EABI_ABI
129 };
130
131 /* MIPS ABI we are using for this output file. */
132 static enum mips_abi_level mips_abi = NO_ABI;
133
134 /* Whether or not we have code that can call pic code. */
135 int mips_abicalls = FALSE;
136
137 /* This is the set of options which may be modified by the .set
138 pseudo-op. We use a struct so that .set push and .set pop are more
139 reliable. */
140
141 struct mips_set_options
142 {
143 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
144 if it has not been initialized. Changed by `.set mipsN', and the
145 -mipsN command line option, and the default CPU. */
146 int isa;
147 /* Enabled Application Specific Extensions (ASEs). These are set to -1
148 if they have not been initialized. Changed by `.set <asename>', by
149 command line options, and based on the default architecture. */
150 int ase_mips3d;
151 int ase_mdmx;
152 /* Whether we are assembling for the mips16 processor. 0 if we are
153 not, 1 if we are, and -1 if the value has not been initialized.
154 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
155 -nomips16 command line options, and the default CPU. */
156 int mips16;
157 /* Non-zero if we should not reorder instructions. Changed by `.set
158 reorder' and `.set noreorder'. */
159 int noreorder;
160 /* Non-zero if we should not permit the $at ($1) register to be used
161 in instructions. Changed by `.set at' and `.set noat'. */
162 int noat;
163 /* Non-zero if we should warn when a macro instruction expands into
164 more than one machine instruction. Changed by `.set nomacro' and
165 `.set macro'. */
166 int warn_about_macros;
167 /* Non-zero if we should not move instructions. Changed by `.set
168 move', `.set volatile', `.set nomove', and `.set novolatile'. */
169 int nomove;
170 /* Non-zero if we should not optimize branches by moving the target
171 of the branch into the delay slot. Actually, we don't perform
172 this optimization anyhow. Changed by `.set bopt' and `.set
173 nobopt'. */
174 int nobopt;
175 /* Non-zero if we should not autoextend mips16 instructions.
176 Changed by `.set autoextend' and `.set noautoextend'. */
177 int noautoextend;
178 /* Restrict general purpose registers and floating point registers
179 to 32 bit. This is initially determined when -mgp32 or -mfp32
180 is passed but can changed if the assembler code uses .set mipsN. */
181 int gp32;
182 int fp32;
183 };
184
185 /* True if -mgp32 was passed. */
186 static int file_mips_gp32 = -1;
187
188 /* True if -mfp32 was passed. */
189 static int file_mips_fp32 = -1;
190
191 /* This is the struct we use to hold the current set of options. Note
192 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
193 -1 to indicate that they have not been initialized. */
194
195 static struct mips_set_options mips_opts =
196 {
197 ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0
198 };
199
200 /* These variables are filled in with the masks of registers used.
201 The object format code reads them and puts them in the appropriate
202 place. */
203 unsigned long mips_gprmask;
204 unsigned long mips_cprmask[4];
205
206 /* MIPS ISA we are using for this output file. */
207 static int file_mips_isa = ISA_UNKNOWN;
208
209 /* True if -mips16 was passed or implied by arguments passed on the
210 command line (e.g., by -march). */
211 static int file_ase_mips16;
212
213 /* True if -mips3d was passed or implied by arguments passed on the
214 command line (e.g., by -march). */
215 static int file_ase_mips3d;
216
217 /* True if -mdmx was passed or implied by arguments passed on the
218 command line (e.g., by -march). */
219 static int file_ase_mdmx;
220
221 /* The argument of the -march= flag. The architecture we are assembling. */
222 static int mips_arch = CPU_UNKNOWN;
223 static const char *mips_arch_string;
224 static const struct mips_cpu_info *mips_arch_info;
225
226 /* The argument of the -mtune= flag. The architecture for which we
227 are optimizing. */
228 static int mips_tune = CPU_UNKNOWN;
229 static const char *mips_tune_string;
230 static const struct mips_cpu_info *mips_tune_info;
231
232 /* True when generating 32-bit code for a 64-bit processor. */
233 static int mips_32bitmode = 0;
234
235 /* Some ISA's have delay slots for instructions which read or write
236 from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
237 Return true if instructions marked INSN_LOAD_COPROC_DELAY,
238 INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
239 delay slot in this ISA. The uses of this macro assume that any
240 ISA that has delay slots for one of these, has them for all. They
241 also assume that ISAs which don't have delays for these insns, don't
242 have delays for the INSN_LOAD_MEMORY_DELAY instructions either. */
243 #define ISA_HAS_COPROC_DELAYS(ISA) ( \
244 (ISA) == ISA_MIPS1 \
245 || (ISA) == ISA_MIPS2 \
246 || (ISA) == ISA_MIPS3 \
247 )
248
249 /* True if the given ABI requires 32-bit registers. */
250 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
251
252 /* Likewise 64-bit registers. */
253 #define ABI_NEEDS_64BIT_REGS(ABI) \
254 ((ABI) == N32_ABI \
255 || (ABI) == N64_ABI \
256 || (ABI) == O64_ABI)
257
258 /* Return true if ISA supports 64 bit gp register instructions. */
259 #define ISA_HAS_64BIT_REGS(ISA) ( \
260 (ISA) == ISA_MIPS3 \
261 || (ISA) == ISA_MIPS4 \
262 || (ISA) == ISA_MIPS5 \
263 || (ISA) == ISA_MIPS64 \
264 )
265
266 /* Return true if ISA supports 64-bit right rotate (dror et al.)
267 instructions. */
268 #define ISA_HAS_DROR(ISA) ( \
269 0 \
270 )
271
272 /* Return true if ISA supports 32-bit right rotate (ror et al.)
273 instructions. */
274 #define ISA_HAS_ROR(ISA) ( \
275 (ISA) == ISA_MIPS32R2 \
276 )
277
278 #define HAVE_32BIT_GPRS \
279 (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
280
281 #define HAVE_32BIT_FPRS \
282 (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
283
284 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
285 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
286
287 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
288
289 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
290
291 /* We can only have 64bit addresses if the object file format
292 supports it. */
293 #define HAVE_32BIT_ADDRESSES \
294 (HAVE_32BIT_GPRS \
295 || ((bfd_arch_bits_per_address (stdoutput) == 32 \
296 || ! HAVE_64BIT_OBJECTS) \
297 && mips_pic != EMBEDDED_PIC))
298
299 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
300 #define HAVE_64BIT_ADDRESS_CONSTANTS (HAVE_64BIT_ADDRESSES \
301 || HAVE_64BIT_GPRS)
302
303 /* Return true if the given CPU supports the MIPS16 ASE. */
304 #define CPU_HAS_MIPS16(cpu) \
305 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
306 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
307
308 /* Return true if the given CPU supports the MIPS3D ASE. */
309 #define CPU_HAS_MIPS3D(cpu) ((cpu) == CPU_SB1 \
310 )
311
312 /* Return true if the given CPU supports the MDMX ASE. */
313 #define CPU_HAS_MDMX(cpu) (FALSE \
314 )
315
316 /* True if CPU has a dror instruction. */
317 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
318
319 /* True if CPU has a ror instruction. */
320 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
321
322 /* Whether the processor uses hardware interlocks to protect
323 reads from the HI and LO registers, and thus does not
324 require nops to be inserted. */
325
326 #define hilo_interlocks (mips_arch == CPU_R4010 \
327 || mips_arch == CPU_VR5500 \
328 || mips_arch == CPU_SB1 \
329 )
330
331 /* Whether the processor uses hardware interlocks to protect reads
332 from the GPRs, and thus does not require nops to be inserted. */
333 #define gpr_interlocks \
334 (mips_opts.isa != ISA_MIPS1 \
335 || mips_arch == CPU_VR5400 \
336 || mips_arch == CPU_VR5500 \
337 || mips_arch == CPU_R3900)
338
339 /* As with other "interlocks" this is used by hardware that has FP
340 (co-processor) interlocks. */
341 /* Itbl support may require additional care here. */
342 #define cop_interlocks (mips_arch == CPU_R4300 \
343 || mips_arch == CPU_VR5400 \
344 || mips_arch == CPU_VR5500 \
345 || mips_arch == CPU_SB1 \
346 )
347
348 /* Is this a mfhi or mflo instruction? */
349 #define MF_HILO_INSN(PINFO) \
350 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
351
352 /* MIPS PIC level. */
353
354 enum mips_pic_level mips_pic;
355
356 /* Warn about all NOPS that the assembler generates. */
357 static int warn_nops = 0;
358
359 /* 1 if we should generate 32 bit offsets from the $gp register in
360 SVR4_PIC mode. Currently has no meaning in other modes. */
361 static int mips_big_got = 0;
362
363 /* 1 if trap instructions should used for overflow rather than break
364 instructions. */
365 static int mips_trap = 0;
366
367 /* 1 if double width floating point constants should not be constructed
368 by assembling two single width halves into two single width floating
369 point registers which just happen to alias the double width destination
370 register. On some architectures this aliasing can be disabled by a bit
371 in the status register, and the setting of this bit cannot be determined
372 automatically at assemble time. */
373 static int mips_disable_float_construction;
374
375 /* Non-zero if any .set noreorder directives were used. */
376
377 static int mips_any_noreorder;
378
379 /* Non-zero if nops should be inserted when the register referenced in
380 an mfhi/mflo instruction is read in the next two instructions. */
381 static int mips_7000_hilo_fix;
382
383 /* The size of the small data section. */
384 static unsigned int g_switch_value = 8;
385 /* Whether the -G option was used. */
386 static int g_switch_seen = 0;
387
388 #define N_RMASK 0xc4
389 #define N_VFP 0xd4
390
391 /* If we can determine in advance that GP optimization won't be
392 possible, we can skip the relaxation stuff that tries to produce
393 GP-relative references. This makes delay slot optimization work
394 better.
395
396 This function can only provide a guess, but it seems to work for
397 gcc output. It needs to guess right for gcc, otherwise gcc
398 will put what it thinks is a GP-relative instruction in a branch
399 delay slot.
400
401 I don't know if a fix is needed for the SVR4_PIC mode. I've only
402 fixed it for the non-PIC mode. KR 95/04/07 */
403 static int nopic_need_relax PARAMS ((symbolS *, int));
404
405 /* handle of the OPCODE hash table */
406 static struct hash_control *op_hash = NULL;
407
408 /* The opcode hash table we use for the mips16. */
409 static struct hash_control *mips16_op_hash = NULL;
410
411 /* This array holds the chars that always start a comment. If the
412 pre-processor is disabled, these aren't very useful */
413 const char comment_chars[] = "#";
414
415 /* This array holds the chars that only start a comment at the beginning of
416 a line. If the line seems to have the form '# 123 filename'
417 .line and .file directives will appear in the pre-processed output */
418 /* Note that input_file.c hand checks for '#' at the beginning of the
419 first line of the input file. This is because the compiler outputs
420 #NO_APP at the beginning of its output. */
421 /* Also note that C style comments are always supported. */
422 const char line_comment_chars[] = "#";
423
424 /* This array holds machine specific line separator characters. */
425 const char line_separator_chars[] = ";";
426
427 /* Chars that can be used to separate mant from exp in floating point nums */
428 const char EXP_CHARS[] = "eE";
429
430 /* Chars that mean this number is a floating point constant */
431 /* As in 0f12.456 */
432 /* or 0d1.2345e12 */
433 const char FLT_CHARS[] = "rRsSfFdDxXpP";
434
435 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
436 changed in read.c . Ideally it shouldn't have to know about it at all,
437 but nothing is ideal around here.
438 */
439
440 static char *insn_error;
441
442 static int auto_align = 1;
443
444 /* When outputting SVR4 PIC code, the assembler needs to know the
445 offset in the stack frame from which to restore the $gp register.
446 This is set by the .cprestore pseudo-op, and saved in this
447 variable. */
448 static offsetT mips_cprestore_offset = -1;
449
450 /* Similiar for NewABI PIC code, where $gp is callee-saved. NewABI has some
451 more optimizations, it can use a register value instead of a memory-saved
452 offset and even an other register than $gp as global pointer. */
453 static offsetT mips_cpreturn_offset = -1;
454 static int mips_cpreturn_register = -1;
455 static int mips_gp_register = GP;
456 static int mips_gprel_offset = 0;
457
458 /* Whether mips_cprestore_offset has been set in the current function
459 (or whether it has already been warned about, if not). */
460 static int mips_cprestore_valid = 0;
461
462 /* This is the register which holds the stack frame, as set by the
463 .frame pseudo-op. This is needed to implement .cprestore. */
464 static int mips_frame_reg = SP;
465
466 /* Whether mips_frame_reg has been set in the current function
467 (or whether it has already been warned about, if not). */
468 static int mips_frame_reg_valid = 0;
469
470 /* To output NOP instructions correctly, we need to keep information
471 about the previous two instructions. */
472
473 /* Whether we are optimizing. The default value of 2 means to remove
474 unneeded NOPs and swap branch instructions when possible. A value
475 of 1 means to not swap branches. A value of 0 means to always
476 insert NOPs. */
477 static int mips_optimize = 2;
478
479 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
480 equivalent to seeing no -g option at all. */
481 static int mips_debug = 0;
482
483 /* The previous instruction. */
484 static struct mips_cl_insn prev_insn;
485
486 /* The instruction before prev_insn. */
487 static struct mips_cl_insn prev_prev_insn;
488
489 /* If we don't want information for prev_insn or prev_prev_insn, we
490 point the insn_mo field at this dummy integer. */
491 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
492
493 /* Non-zero if prev_insn is valid. */
494 static int prev_insn_valid;
495
496 /* The frag for the previous instruction. */
497 static struct frag *prev_insn_frag;
498
499 /* The offset into prev_insn_frag for the previous instruction. */
500 static long prev_insn_where;
501
502 /* The reloc type for the previous instruction, if any. */
503 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
504
505 /* The reloc for the previous instruction, if any. */
506 static fixS *prev_insn_fixp[3];
507
508 /* Non-zero if the previous instruction was in a delay slot. */
509 static int prev_insn_is_delay_slot;
510
511 /* Non-zero if the previous instruction was in a .set noreorder. */
512 static int prev_insn_unreordered;
513
514 /* Non-zero if the previous instruction uses an extend opcode (if
515 mips16). */
516 static int prev_insn_extended;
517
518 /* Non-zero if the previous previous instruction was in a .set
519 noreorder. */
520 static int prev_prev_insn_unreordered;
521
522 /* If this is set, it points to a frag holding nop instructions which
523 were inserted before the start of a noreorder section. If those
524 nops turn out to be unnecessary, the size of the frag can be
525 decreased. */
526 static fragS *prev_nop_frag;
527
528 /* The number of nop instructions we created in prev_nop_frag. */
529 static int prev_nop_frag_holds;
530
531 /* The number of nop instructions that we know we need in
532 prev_nop_frag. */
533 static int prev_nop_frag_required;
534
535 /* The number of instructions we've seen since prev_nop_frag. */
536 static int prev_nop_frag_since;
537
538 /* For ECOFF and ELF, relocations against symbols are done in two
539 parts, with a HI relocation and a LO relocation. Each relocation
540 has only 16 bits of space to store an addend. This means that in
541 order for the linker to handle carries correctly, it must be able
542 to locate both the HI and the LO relocation. This means that the
543 relocations must appear in order in the relocation table.
544
545 In order to implement this, we keep track of each unmatched HI
546 relocation. We then sort them so that they immediately precede the
547 corresponding LO relocation. */
548
549 struct mips_hi_fixup
550 {
551 /* Next HI fixup. */
552 struct mips_hi_fixup *next;
553 /* This fixup. */
554 fixS *fixp;
555 /* The section this fixup is in. */
556 segT seg;
557 };
558
559 /* The list of unmatched HI relocs. */
560
561 static struct mips_hi_fixup *mips_hi_fixup_list;
562
563 /* The frag containing the last explicit relocation operator.
564 Null if explicit relocations have not been used. */
565
566 static fragS *prev_reloc_op_frag;
567
568 /* Map normal MIPS register numbers to mips16 register numbers. */
569
570 #define X ILLEGAL_REG
571 static const int mips32_to_16_reg_map[] =
572 {
573 X, X, 2, 3, 4, 5, 6, 7,
574 X, X, X, X, X, X, X, X,
575 0, 1, X, X, X, X, X, X,
576 X, X, X, X, X, X, X, X
577 };
578 #undef X
579
580 /* Map mips16 register numbers to normal MIPS register numbers. */
581
582 static const unsigned int mips16_to_32_reg_map[] =
583 {
584 16, 17, 2, 3, 4, 5, 6, 7
585 };
586
587 static int mips_fix_4122_bugs;
588
589 /* We don't relax branches by default, since this causes us to expand
590 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
591 fail to compute the offset before expanding the macro to the most
592 efficient expansion. */
593
594 static int mips_relax_branch;
595 \f
596 /* Since the MIPS does not have multiple forms of PC relative
597 instructions, we do not have to do relaxing as is done on other
598 platforms. However, we do have to handle GP relative addressing
599 correctly, which turns out to be a similar problem.
600
601 Every macro that refers to a symbol can occur in (at least) two
602 forms, one with GP relative addressing and one without. For
603 example, loading a global variable into a register generally uses
604 a macro instruction like this:
605 lw $4,i
606 If i can be addressed off the GP register (this is true if it is in
607 the .sbss or .sdata section, or if it is known to be smaller than
608 the -G argument) this will generate the following instruction:
609 lw $4,i($gp)
610 This instruction will use a GPREL reloc. If i can not be addressed
611 off the GP register, the following instruction sequence will be used:
612 lui $at,i
613 lw $4,i($at)
614 In this case the first instruction will have a HI16 reloc, and the
615 second reloc will have a LO16 reloc. Both relocs will be against
616 the symbol i.
617
618 The issue here is that we may not know whether i is GP addressable
619 until after we see the instruction that uses it. Therefore, we
620 want to be able to choose the final instruction sequence only at
621 the end of the assembly. This is similar to the way other
622 platforms choose the size of a PC relative instruction only at the
623 end of assembly.
624
625 When generating position independent code we do not use GP
626 addressing in quite the same way, but the issue still arises as
627 external symbols and local symbols must be handled differently.
628
629 We handle these issues by actually generating both possible
630 instruction sequences. The longer one is put in a frag_var with
631 type rs_machine_dependent. We encode what to do with the frag in
632 the subtype field. We encode (1) the number of existing bytes to
633 replace, (2) the number of new bytes to use, (3) the offset from
634 the start of the existing bytes to the first reloc we must generate
635 (that is, the offset is applied from the start of the existing
636 bytes after they are replaced by the new bytes, if any), (4) the
637 offset from the start of the existing bytes to the second reloc,
638 (5) whether a third reloc is needed (the third reloc is always four
639 bytes after the second reloc), and (6) whether to warn if this
640 variant is used (this is sometimes needed if .set nomacro or .set
641 noat is in effect). All these numbers are reasonably small.
642
643 Generating two instruction sequences must be handled carefully to
644 ensure that delay slots are handled correctly. Fortunately, there
645 are a limited number of cases. When the second instruction
646 sequence is generated, append_insn is directed to maintain the
647 existing delay slot information, so it continues to apply to any
648 code after the second instruction sequence. This means that the
649 second instruction sequence must not impose any requirements not
650 required by the first instruction sequence.
651
652 These variant frags are then handled in functions called by the
653 machine independent code. md_estimate_size_before_relax returns
654 the final size of the frag. md_convert_frag sets up the final form
655 of the frag. tc_gen_reloc adjust the first reloc and adds a second
656 one if needed. */
657 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
658 ((relax_substateT) \
659 (((old) << 23) \
660 | ((new) << 16) \
661 | (((reloc1) + 64) << 9) \
662 | (((reloc2) + 64) << 2) \
663 | ((reloc3) ? (1 << 1) : 0) \
664 | ((warn) ? 1 : 0)))
665 #define RELAX_OLD(i) (((i) >> 23) & 0x7f)
666 #define RELAX_NEW(i) (((i) >> 16) & 0x7f)
667 #define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
668 #define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
669 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
670 #define RELAX_WARN(i) ((i) & 1)
671
672 /* Branch without likely bit. If label is out of range, we turn:
673
674 beq reg1, reg2, label
675 delay slot
676
677 into
678
679 bne reg1, reg2, 0f
680 nop
681 j label
682 0: delay slot
683
684 with the following opcode replacements:
685
686 beq <-> bne
687 blez <-> bgtz
688 bltz <-> bgez
689 bc1f <-> bc1t
690
691 bltzal <-> bgezal (with jal label instead of j label)
692
693 Even though keeping the delay slot instruction in the delay slot of
694 the branch would be more efficient, it would be very tricky to do
695 correctly, because we'd have to introduce a variable frag *after*
696 the delay slot instruction, and expand that instead. Let's do it
697 the easy way for now, even if the branch-not-taken case now costs
698 one additional instruction. Out-of-range branches are not supposed
699 to be common, anyway.
700
701 Branch likely. If label is out of range, we turn:
702
703 beql reg1, reg2, label
704 delay slot (annulled if branch not taken)
705
706 into
707
708 beql reg1, reg2, 1f
709 nop
710 beql $0, $0, 2f
711 nop
712 1: j[al] label
713 delay slot (executed only if branch taken)
714 2:
715
716 It would be possible to generate a shorter sequence by losing the
717 likely bit, generating something like:
718
719 bne reg1, reg2, 0f
720 nop
721 j[al] label
722 delay slot (executed only if branch taken)
723 0:
724
725 beql -> bne
726 bnel -> beq
727 blezl -> bgtz
728 bgtzl -> blez
729 bltzl -> bgez
730 bgezl -> bltz
731 bc1fl -> bc1t
732 bc1tl -> bc1f
733
734 bltzall -> bgezal (with jal label instead of j label)
735 bgezall -> bltzal (ditto)
736
737
738 but it's not clear that it would actually improve performance. */
739 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
740 ((relax_substateT) \
741 (0xc0000000 \
742 | ((toofar) ? 1 : 0) \
743 | ((link) ? 2 : 0) \
744 | ((likely) ? 4 : 0) \
745 | ((uncond) ? 8 : 0)))
746 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
747 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
748 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
749 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
750 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
751
752 /* For mips16 code, we use an entirely different form of relaxation.
753 mips16 supports two versions of most instructions which take
754 immediate values: a small one which takes some small value, and a
755 larger one which takes a 16 bit value. Since branches also follow
756 this pattern, relaxing these values is required.
757
758 We can assemble both mips16 and normal MIPS code in a single
759 object. Therefore, we need to support this type of relaxation at
760 the same time that we support the relaxation described above. We
761 use the high bit of the subtype field to distinguish these cases.
762
763 The information we store for this type of relaxation is the
764 argument code found in the opcode file for this relocation, whether
765 the user explicitly requested a small or extended form, and whether
766 the relocation is in a jump or jal delay slot. That tells us the
767 size of the value, and how it should be stored. We also store
768 whether the fragment is considered to be extended or not. We also
769 store whether this is known to be a branch to a different section,
770 whether we have tried to relax this frag yet, and whether we have
771 ever extended a PC relative fragment because of a shift count. */
772 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
773 (0x80000000 \
774 | ((type) & 0xff) \
775 | ((small) ? 0x100 : 0) \
776 | ((ext) ? 0x200 : 0) \
777 | ((dslot) ? 0x400 : 0) \
778 | ((jal_dslot) ? 0x800 : 0))
779 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
780 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
781 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
782 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
783 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
784 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
785 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
786 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
787 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
788 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
789 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
790 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
791
792 /* Is the given value a sign-extended 32-bit value? */
793 #define IS_SEXT_32BIT_NUM(x) \
794 (((x) &~ (offsetT) 0x7fffffff) == 0 \
795 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
796
797 /* Is the given value a sign-extended 16-bit value? */
798 #define IS_SEXT_16BIT_NUM(x) \
799 (((x) &~ (offsetT) 0x7fff) == 0 \
800 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
801
802 \f
803 /* Prototypes for static functions. */
804
805 #ifdef __STDC__
806 #define internalError() \
807 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
808 #else
809 #define internalError() as_fatal (_("MIPS internal Error"));
810 #endif
811
812 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
813
814 static inline bfd_boolean reloc_needs_lo_p
815 PARAMS ((bfd_reloc_code_real_type));
816 static inline bfd_boolean fixup_has_matching_lo_p
817 PARAMS ((fixS *));
818 static int insn_uses_reg
819 PARAMS ((struct mips_cl_insn *ip, unsigned int reg,
820 enum mips_regclass class));
821 static int reg_needs_delay
822 PARAMS ((unsigned int));
823 static void mips16_mark_labels
824 PARAMS ((void));
825 static void append_insn
826 PARAMS ((char *place, struct mips_cl_insn * ip, expressionS * p,
827 bfd_reloc_code_real_type *r));
828 static void mips_no_prev_insn
829 PARAMS ((int));
830 static void mips_emit_delays
831 PARAMS ((bfd_boolean));
832 #ifdef USE_STDARG
833 static void macro_build
834 PARAMS ((char *place, int *counter, expressionS * ep, const char *name,
835 const char *fmt, ...));
836 #else
837 static void macro_build ();
838 #endif
839 static void mips16_macro_build
840 PARAMS ((char *, int *, expressionS *, const char *, const char *, va_list));
841 static void macro_build_jalr
842 PARAMS ((int, expressionS *));
843 static void macro_build_lui
844 PARAMS ((char *place, int *counter, expressionS * ep, int regnum));
845 static void macro_build_ldst_constoffset
846 PARAMS ((char *place, int *counter, expressionS * ep, const char *op,
847 int valreg, int breg));
848 static void set_at
849 PARAMS ((int *counter, int reg, int unsignedp));
850 static void check_absolute_expr
851 PARAMS ((struct mips_cl_insn * ip, expressionS *));
852 static void load_register
853 PARAMS ((int *, int, expressionS *, int));
854 static void load_address
855 PARAMS ((int *, int, expressionS *, int *));
856 static void move_register
857 PARAMS ((int *, int, int));
858 static void macro
859 PARAMS ((struct mips_cl_insn * ip));
860 static void mips16_macro
861 PARAMS ((struct mips_cl_insn * ip));
862 #ifdef LOSING_COMPILER
863 static void macro2
864 PARAMS ((struct mips_cl_insn * ip));
865 #endif
866 static void mips_ip
867 PARAMS ((char *str, struct mips_cl_insn * ip));
868 static void mips16_ip
869 PARAMS ((char *str, struct mips_cl_insn * ip));
870 static void mips16_immed
871 PARAMS ((char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean,
872 bfd_boolean, unsigned long *, bfd_boolean *, unsigned short *));
873 static bfd_boolean parse_relocation
874 PARAMS ((char **, bfd_reloc_code_real_type *));
875 static size_t my_getSmallExpression
876 PARAMS ((expressionS *, bfd_reloc_code_real_type *, char *));
877 static void my_getExpression
878 PARAMS ((expressionS *, char *));
879 #ifdef OBJ_ELF
880 static int support_64bit_objects
881 PARAMS((void));
882 #endif
883 static void mips_set_option_string
884 PARAMS ((const char **, const char *));
885 static symbolS *get_symbol
886 PARAMS ((void));
887 static void mips_align
888 PARAMS ((int to, int fill, symbolS *label));
889 static void s_align
890 PARAMS ((int));
891 static void s_change_sec
892 PARAMS ((int));
893 static void s_change_section
894 PARAMS ((int));
895 static void s_cons
896 PARAMS ((int));
897 static void s_float_cons
898 PARAMS ((int));
899 static void s_mips_globl
900 PARAMS ((int));
901 static void s_option
902 PARAMS ((int));
903 static void s_mipsset
904 PARAMS ((int));
905 static void s_abicalls
906 PARAMS ((int));
907 static void s_cpload
908 PARAMS ((int));
909 static void s_cpsetup
910 PARAMS ((int));
911 static void s_cplocal
912 PARAMS ((int));
913 static void s_cprestore
914 PARAMS ((int));
915 static void s_cpreturn
916 PARAMS ((int));
917 static void s_gpvalue
918 PARAMS ((int));
919 static void s_gpword
920 PARAMS ((int));
921 static void s_gpdword
922 PARAMS ((int));
923 static void s_cpadd
924 PARAMS ((int));
925 static void s_insn
926 PARAMS ((int));
927 static void md_obj_begin
928 PARAMS ((void));
929 static void md_obj_end
930 PARAMS ((void));
931 static long get_number
932 PARAMS ((void));
933 static void s_mips_ent
934 PARAMS ((int));
935 static void s_mips_end
936 PARAMS ((int));
937 static void s_mips_frame
938 PARAMS ((int));
939 static void s_mips_mask
940 PARAMS ((int));
941 static void s_mips_stab
942 PARAMS ((int));
943 static void s_mips_weakext
944 PARAMS ((int));
945 static void s_mips_file
946 PARAMS ((int));
947 static void s_mips_loc
948 PARAMS ((int));
949 static bfd_boolean pic_need_relax
950 PARAMS ((symbolS *, asection *));
951 static int mips16_extended_frag
952 PARAMS ((fragS *, asection *, long));
953 static int relaxed_branch_length (fragS *, asection *, int);
954 static int validate_mips_insn
955 PARAMS ((const struct mips_opcode *));
956 static void show
957 PARAMS ((FILE *, const char *, int *, int *));
958 #ifdef OBJ_ELF
959 static int mips_need_elf_addend_fixup
960 PARAMS ((fixS *));
961 #endif
962
963 /* Table and functions used to map between CPU/ISA names, and
964 ISA levels, and CPU numbers. */
965
966 struct mips_cpu_info
967 {
968 const char *name; /* CPU or ISA name. */
969 int is_isa; /* Is this an ISA? (If 0, a CPU.) */
970 int isa; /* ISA level. */
971 int cpu; /* CPU number (default CPU if ISA). */
972 };
973
974 static void mips_set_architecture
975 PARAMS ((const struct mips_cpu_info *));
976 static void mips_set_tune
977 PARAMS ((const struct mips_cpu_info *));
978 static bfd_boolean mips_strict_matching_cpu_name_p
979 PARAMS ((const char *, const char *));
980 static bfd_boolean mips_matching_cpu_name_p
981 PARAMS ((const char *, const char *));
982 static const struct mips_cpu_info *mips_parse_cpu
983 PARAMS ((const char *, const char *));
984 static const struct mips_cpu_info *mips_cpu_info_from_isa
985 PARAMS ((int));
986 \f
987 /* Pseudo-op table.
988
989 The following pseudo-ops from the Kane and Heinrich MIPS book
990 should be defined here, but are currently unsupported: .alias,
991 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
992
993 The following pseudo-ops from the Kane and Heinrich MIPS book are
994 specific to the type of debugging information being generated, and
995 should be defined by the object format: .aent, .begin, .bend,
996 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
997 .vreg.
998
999 The following pseudo-ops from the Kane and Heinrich MIPS book are
1000 not MIPS CPU specific, but are also not specific to the object file
1001 format. This file is probably the best place to define them, but
1002 they are not currently supported: .asm0, .endr, .lab, .repeat,
1003 .struct. */
1004
1005 static const pseudo_typeS mips_pseudo_table[] =
1006 {
1007 /* MIPS specific pseudo-ops. */
1008 {"option", s_option, 0},
1009 {"set", s_mipsset, 0},
1010 {"rdata", s_change_sec, 'r'},
1011 {"sdata", s_change_sec, 's'},
1012 {"livereg", s_ignore, 0},
1013 {"abicalls", s_abicalls, 0},
1014 {"cpload", s_cpload, 0},
1015 {"cpsetup", s_cpsetup, 0},
1016 {"cplocal", s_cplocal, 0},
1017 {"cprestore", s_cprestore, 0},
1018 {"cpreturn", s_cpreturn, 0},
1019 {"gpvalue", s_gpvalue, 0},
1020 {"gpword", s_gpword, 0},
1021 {"gpdword", s_gpdword, 0},
1022 {"cpadd", s_cpadd, 0},
1023 {"insn", s_insn, 0},
1024
1025 /* Relatively generic pseudo-ops that happen to be used on MIPS
1026 chips. */
1027 {"asciiz", stringer, 1},
1028 {"bss", s_change_sec, 'b'},
1029 {"err", s_err, 0},
1030 {"half", s_cons, 1},
1031 {"dword", s_cons, 3},
1032 {"weakext", s_mips_weakext, 0},
1033
1034 /* These pseudo-ops are defined in read.c, but must be overridden
1035 here for one reason or another. */
1036 {"align", s_align, 0},
1037 {"byte", s_cons, 0},
1038 {"data", s_change_sec, 'd'},
1039 {"double", s_float_cons, 'd'},
1040 {"float", s_float_cons, 'f'},
1041 {"globl", s_mips_globl, 0},
1042 {"global", s_mips_globl, 0},
1043 {"hword", s_cons, 1},
1044 {"int", s_cons, 2},
1045 {"long", s_cons, 2},
1046 {"octa", s_cons, 4},
1047 {"quad", s_cons, 3},
1048 {"section", s_change_section, 0},
1049 {"short", s_cons, 1},
1050 {"single", s_float_cons, 'f'},
1051 {"stabn", s_mips_stab, 'n'},
1052 {"text", s_change_sec, 't'},
1053 {"word", s_cons, 2},
1054
1055 { "extern", ecoff_directive_extern, 0},
1056
1057 { NULL, NULL, 0 },
1058 };
1059
1060 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1061 {
1062 /* These pseudo-ops should be defined by the object file format.
1063 However, a.out doesn't support them, so we have versions here. */
1064 {"aent", s_mips_ent, 1},
1065 {"bgnb", s_ignore, 0},
1066 {"end", s_mips_end, 0},
1067 {"endb", s_ignore, 0},
1068 {"ent", s_mips_ent, 0},
1069 {"file", s_mips_file, 0},
1070 {"fmask", s_mips_mask, 'F'},
1071 {"frame", s_mips_frame, 0},
1072 {"loc", s_mips_loc, 0},
1073 {"mask", s_mips_mask, 'R'},
1074 {"verstamp", s_ignore, 0},
1075 { NULL, NULL, 0 },
1076 };
1077
1078 extern void pop_insert PARAMS ((const pseudo_typeS *));
1079
1080 void
1081 mips_pop_insert ()
1082 {
1083 pop_insert (mips_pseudo_table);
1084 if (! ECOFF_DEBUGGING)
1085 pop_insert (mips_nonecoff_pseudo_table);
1086 }
1087 \f
1088 /* Symbols labelling the current insn. */
1089
1090 struct insn_label_list
1091 {
1092 struct insn_label_list *next;
1093 symbolS *label;
1094 };
1095
1096 static struct insn_label_list *insn_labels;
1097 static struct insn_label_list *free_insn_labels;
1098
1099 static void mips_clear_insn_labels PARAMS ((void));
1100
1101 static inline void
1102 mips_clear_insn_labels ()
1103 {
1104 register struct insn_label_list **pl;
1105
1106 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1107 ;
1108 *pl = insn_labels;
1109 insn_labels = NULL;
1110 }
1111 \f
1112 static char *expr_end;
1113
1114 /* Expressions which appear in instructions. These are set by
1115 mips_ip. */
1116
1117 static expressionS imm_expr;
1118 static expressionS offset_expr;
1119
1120 /* Relocs associated with imm_expr and offset_expr. */
1121
1122 static bfd_reloc_code_real_type imm_reloc[3]
1123 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1124 static bfd_reloc_code_real_type offset_reloc[3]
1125 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1126
1127 /* These are set by mips16_ip if an explicit extension is used. */
1128
1129 static bfd_boolean mips16_small, mips16_ext;
1130
1131 #ifdef OBJ_ELF
1132 /* The pdr segment for per procedure frame/regmask info. Not used for
1133 ECOFF debugging. */
1134
1135 static segT pdr_seg;
1136 #endif
1137
1138 /* The default target format to use. */
1139
1140 const char *
1141 mips_target_format ()
1142 {
1143 switch (OUTPUT_FLAVOR)
1144 {
1145 case bfd_target_aout_flavour:
1146 return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1147 case bfd_target_ecoff_flavour:
1148 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1149 case bfd_target_coff_flavour:
1150 return "pe-mips";
1151 case bfd_target_elf_flavour:
1152 #ifdef TE_TMIPS
1153 /* This is traditional mips. */
1154 return (target_big_endian
1155 ? (HAVE_64BIT_OBJECTS
1156 ? "elf64-tradbigmips"
1157 : (HAVE_NEWABI
1158 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1159 : (HAVE_64BIT_OBJECTS
1160 ? "elf64-tradlittlemips"
1161 : (HAVE_NEWABI
1162 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1163 #else
1164 return (target_big_endian
1165 ? (HAVE_64BIT_OBJECTS
1166 ? "elf64-bigmips"
1167 : (HAVE_NEWABI
1168 ? "elf32-nbigmips" : "elf32-bigmips"))
1169 : (HAVE_64BIT_OBJECTS
1170 ? "elf64-littlemips"
1171 : (HAVE_NEWABI
1172 ? "elf32-nlittlemips" : "elf32-littlemips")));
1173 #endif
1174 default:
1175 abort ();
1176 return NULL;
1177 }
1178 }
1179
1180 /* This function is called once, at assembler startup time. It should
1181 set up all the tables, etc. that the MD part of the assembler will need. */
1182
1183 void
1184 md_begin ()
1185 {
1186 register const char *retval = NULL;
1187 int i = 0;
1188 int broken = 0;
1189
1190 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
1191 as_warn (_("Could not set architecture and machine"));
1192
1193 op_hash = hash_new ();
1194
1195 for (i = 0; i < NUMOPCODES;)
1196 {
1197 const char *name = mips_opcodes[i].name;
1198
1199 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1200 if (retval != NULL)
1201 {
1202 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1203 mips_opcodes[i].name, retval);
1204 /* Probably a memory allocation problem? Give up now. */
1205 as_fatal (_("Broken assembler. No assembly attempted."));
1206 }
1207 do
1208 {
1209 if (mips_opcodes[i].pinfo != INSN_MACRO)
1210 {
1211 if (!validate_mips_insn (&mips_opcodes[i]))
1212 broken = 1;
1213 }
1214 ++i;
1215 }
1216 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1217 }
1218
1219 mips16_op_hash = hash_new ();
1220
1221 i = 0;
1222 while (i < bfd_mips16_num_opcodes)
1223 {
1224 const char *name = mips16_opcodes[i].name;
1225
1226 retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1227 if (retval != NULL)
1228 as_fatal (_("internal: can't hash `%s': %s"),
1229 mips16_opcodes[i].name, retval);
1230 do
1231 {
1232 if (mips16_opcodes[i].pinfo != INSN_MACRO
1233 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1234 != mips16_opcodes[i].match))
1235 {
1236 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1237 mips16_opcodes[i].name, mips16_opcodes[i].args);
1238 broken = 1;
1239 }
1240 ++i;
1241 }
1242 while (i < bfd_mips16_num_opcodes
1243 && strcmp (mips16_opcodes[i].name, name) == 0);
1244 }
1245
1246 if (broken)
1247 as_fatal (_("Broken assembler. No assembly attempted."));
1248
1249 /* We add all the general register names to the symbol table. This
1250 helps us detect invalid uses of them. */
1251 for (i = 0; i < 32; i++)
1252 {
1253 char buf[5];
1254
1255 sprintf (buf, "$%d", i);
1256 symbol_table_insert (symbol_new (buf, reg_section, i,
1257 &zero_address_frag));
1258 }
1259 symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1260 &zero_address_frag));
1261 symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1262 &zero_address_frag));
1263 symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1264 &zero_address_frag));
1265 symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1266 &zero_address_frag));
1267 symbol_table_insert (symbol_new ("$at", reg_section, AT,
1268 &zero_address_frag));
1269 symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1270 &zero_address_frag));
1271 symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1272 &zero_address_frag));
1273 symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1274 &zero_address_frag));
1275 symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1276 &zero_address_frag));
1277
1278 /* If we don't add these register names to the symbol table, they
1279 may end up being added as regular symbols by operand(), and then
1280 make it to the object file as undefined in case they're not
1281 regarded as local symbols. They're local in o32, since `$' is a
1282 local symbol prefix, but not in n32 or n64. */
1283 for (i = 0; i < 8; i++)
1284 {
1285 char buf[6];
1286
1287 sprintf (buf, "$fcc%i", i);
1288 symbol_table_insert (symbol_new (buf, reg_section, -1,
1289 &zero_address_frag));
1290 }
1291
1292 mips_no_prev_insn (FALSE);
1293
1294 mips_gprmask = 0;
1295 mips_cprmask[0] = 0;
1296 mips_cprmask[1] = 0;
1297 mips_cprmask[2] = 0;
1298 mips_cprmask[3] = 0;
1299
1300 /* set the default alignment for the text section (2**2) */
1301 record_alignment (text_section, 2);
1302
1303 if (USE_GLOBAL_POINTER_OPT)
1304 bfd_set_gp_size (stdoutput, g_switch_value);
1305
1306 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1307 {
1308 /* On a native system, sections must be aligned to 16 byte
1309 boundaries. When configured for an embedded ELF target, we
1310 don't bother. */
1311 if (strcmp (TARGET_OS, "elf") != 0)
1312 {
1313 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1314 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1315 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1316 }
1317
1318 /* Create a .reginfo section for register masks and a .mdebug
1319 section for debugging information. */
1320 {
1321 segT seg;
1322 subsegT subseg;
1323 flagword flags;
1324 segT sec;
1325
1326 seg = now_seg;
1327 subseg = now_subseg;
1328
1329 /* The ABI says this section should be loaded so that the
1330 running program can access it. However, we don't load it
1331 if we are configured for an embedded target */
1332 flags = SEC_READONLY | SEC_DATA;
1333 if (strcmp (TARGET_OS, "elf") != 0)
1334 flags |= SEC_ALLOC | SEC_LOAD;
1335
1336 if (mips_abi != N64_ABI)
1337 {
1338 sec = subseg_new (".reginfo", (subsegT) 0);
1339
1340 bfd_set_section_flags (stdoutput, sec, flags);
1341 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1342
1343 #ifdef OBJ_ELF
1344 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1345 #endif
1346 }
1347 else
1348 {
1349 /* The 64-bit ABI uses a .MIPS.options section rather than
1350 .reginfo section. */
1351 sec = subseg_new (".MIPS.options", (subsegT) 0);
1352 bfd_set_section_flags (stdoutput, sec, flags);
1353 bfd_set_section_alignment (stdoutput, sec, 3);
1354
1355 #ifdef OBJ_ELF
1356 /* Set up the option header. */
1357 {
1358 Elf_Internal_Options opthdr;
1359 char *f;
1360
1361 opthdr.kind = ODK_REGINFO;
1362 opthdr.size = (sizeof (Elf_External_Options)
1363 + sizeof (Elf64_External_RegInfo));
1364 opthdr.section = 0;
1365 opthdr.info = 0;
1366 f = frag_more (sizeof (Elf_External_Options));
1367 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1368 (Elf_External_Options *) f);
1369
1370 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1371 }
1372 #endif
1373 }
1374
1375 if (ECOFF_DEBUGGING)
1376 {
1377 sec = subseg_new (".mdebug", (subsegT) 0);
1378 (void) bfd_set_section_flags (stdoutput, sec,
1379 SEC_HAS_CONTENTS | SEC_READONLY);
1380 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1381 }
1382 #ifdef OBJ_ELF
1383 else if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1384 {
1385 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1386 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1387 SEC_READONLY | SEC_RELOC
1388 | SEC_DEBUGGING);
1389 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1390 }
1391 #endif
1392
1393 subseg_set (seg, subseg);
1394 }
1395 }
1396
1397 if (! ECOFF_DEBUGGING)
1398 md_obj_begin ();
1399 }
1400
1401 void
1402 md_mips_end ()
1403 {
1404 if (! ECOFF_DEBUGGING)
1405 md_obj_end ();
1406 }
1407
1408 void
1409 md_assemble (str)
1410 char *str;
1411 {
1412 struct mips_cl_insn insn;
1413 bfd_reloc_code_real_type unused_reloc[3]
1414 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1415
1416 imm_expr.X_op = O_absent;
1417 offset_expr.X_op = O_absent;
1418 imm_reloc[0] = BFD_RELOC_UNUSED;
1419 imm_reloc[1] = BFD_RELOC_UNUSED;
1420 imm_reloc[2] = BFD_RELOC_UNUSED;
1421 offset_reloc[0] = BFD_RELOC_UNUSED;
1422 offset_reloc[1] = BFD_RELOC_UNUSED;
1423 offset_reloc[2] = BFD_RELOC_UNUSED;
1424
1425 if (mips_opts.mips16)
1426 mips16_ip (str, &insn);
1427 else
1428 {
1429 mips_ip (str, &insn);
1430 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1431 str, insn.insn_opcode));
1432 }
1433
1434 if (insn_error)
1435 {
1436 as_bad ("%s `%s'", insn_error, str);
1437 return;
1438 }
1439
1440 if (insn.insn_mo->pinfo == INSN_MACRO)
1441 {
1442 if (mips_opts.mips16)
1443 mips16_macro (&insn);
1444 else
1445 macro (&insn);
1446 }
1447 else
1448 {
1449 if (imm_expr.X_op != O_absent)
1450 append_insn (NULL, &insn, &imm_expr, imm_reloc);
1451 else if (offset_expr.X_op != O_absent)
1452 append_insn (NULL, &insn, &offset_expr, offset_reloc);
1453 else
1454 append_insn (NULL, &insn, NULL, unused_reloc);
1455 }
1456 }
1457
1458 /* Return true if the given relocation might need a matching %lo().
1459 Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1460 applied to local symbols. */
1461
1462 static inline bfd_boolean
1463 reloc_needs_lo_p (reloc)
1464 bfd_reloc_code_real_type reloc;
1465 {
1466 return (reloc == BFD_RELOC_HI16_S
1467 || reloc == BFD_RELOC_MIPS_GOT16);
1468 }
1469
1470 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1471 relocation. */
1472
1473 static inline bfd_boolean
1474 fixup_has_matching_lo_p (fixp)
1475 fixS *fixp;
1476 {
1477 return (fixp->fx_next != NULL
1478 && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1479 && fixp->fx_addsy == fixp->fx_next->fx_addsy
1480 && fixp->fx_offset == fixp->fx_next->fx_offset);
1481 }
1482
1483 /* See whether instruction IP reads register REG. CLASS is the type
1484 of register. */
1485
1486 static int
1487 insn_uses_reg (ip, reg, class)
1488 struct mips_cl_insn *ip;
1489 unsigned int reg;
1490 enum mips_regclass class;
1491 {
1492 if (class == MIPS16_REG)
1493 {
1494 assert (mips_opts.mips16);
1495 reg = mips16_to_32_reg_map[reg];
1496 class = MIPS_GR_REG;
1497 }
1498
1499 /* Don't report on general register ZERO, since it never changes. */
1500 if (class == MIPS_GR_REG && reg == ZERO)
1501 return 0;
1502
1503 if (class == MIPS_FP_REG)
1504 {
1505 assert (! mips_opts.mips16);
1506 /* If we are called with either $f0 or $f1, we must check $f0.
1507 This is not optimal, because it will introduce an unnecessary
1508 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
1509 need to distinguish reading both $f0 and $f1 or just one of
1510 them. Note that we don't have to check the other way,
1511 because there is no instruction that sets both $f0 and $f1
1512 and requires a delay. */
1513 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1514 && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1515 == (reg &~ (unsigned) 1)))
1516 return 1;
1517 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1518 && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1519 == (reg &~ (unsigned) 1)))
1520 return 1;
1521 }
1522 else if (! mips_opts.mips16)
1523 {
1524 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1525 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1526 return 1;
1527 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1528 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1529 return 1;
1530 }
1531 else
1532 {
1533 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1534 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1535 & MIPS16OP_MASK_RX)]
1536 == reg))
1537 return 1;
1538 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1539 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1540 & MIPS16OP_MASK_RY)]
1541 == reg))
1542 return 1;
1543 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1544 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1545 & MIPS16OP_MASK_MOVE32Z)]
1546 == reg))
1547 return 1;
1548 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1549 return 1;
1550 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1551 return 1;
1552 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1553 return 1;
1554 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1555 && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1556 & MIPS16OP_MASK_REGR32) == reg)
1557 return 1;
1558 }
1559
1560 return 0;
1561 }
1562
1563 /* This function returns true if modifying a register requires a
1564 delay. */
1565
1566 static int
1567 reg_needs_delay (reg)
1568 unsigned int reg;
1569 {
1570 unsigned long prev_pinfo;
1571
1572 prev_pinfo = prev_insn.insn_mo->pinfo;
1573 if (! mips_opts.noreorder
1574 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1575 && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1576 || (! gpr_interlocks
1577 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1578 {
1579 /* A load from a coprocessor or from memory. All load
1580 delays delay the use of general register rt for one
1581 instruction on the r3000. The r6000 and r4000 use
1582 interlocks. */
1583 /* Itbl support may require additional care here. */
1584 know (prev_pinfo & INSN_WRITE_GPR_T);
1585 if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1586 return 1;
1587 }
1588
1589 return 0;
1590 }
1591
1592 /* Mark instruction labels in mips16 mode. This permits the linker to
1593 handle them specially, such as generating jalx instructions when
1594 needed. We also make them odd for the duration of the assembly, in
1595 order to generate the right sort of code. We will make them even
1596 in the adjust_symtab routine, while leaving them marked. This is
1597 convenient for the debugger and the disassembler. The linker knows
1598 to make them odd again. */
1599
1600 static void
1601 mips16_mark_labels ()
1602 {
1603 if (mips_opts.mips16)
1604 {
1605 struct insn_label_list *l;
1606 valueT val;
1607
1608 for (l = insn_labels; l != NULL; l = l->next)
1609 {
1610 #ifdef OBJ_ELF
1611 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1612 S_SET_OTHER (l->label, STO_MIPS16);
1613 #endif
1614 val = S_GET_VALUE (l->label);
1615 if ((val & 1) == 0)
1616 S_SET_VALUE (l->label, val + 1);
1617 }
1618 }
1619 }
1620
1621 /* Output an instruction. PLACE is where to put the instruction; if
1622 it is NULL, this uses frag_more to get room. IP is the instruction
1623 information. ADDRESS_EXPR is an operand of the instruction to be
1624 used with RELOC_TYPE. */
1625
1626 static void
1627 append_insn (place, ip, address_expr, reloc_type)
1628 char *place;
1629 struct mips_cl_insn *ip;
1630 expressionS *address_expr;
1631 bfd_reloc_code_real_type *reloc_type;
1632 {
1633 register unsigned long prev_pinfo, pinfo;
1634 char *f;
1635 fixS *fixp[3];
1636 int nops = 0;
1637 bfd_boolean force_new_frag = FALSE;
1638
1639 /* Mark instruction labels in mips16 mode. */
1640 mips16_mark_labels ();
1641
1642 prev_pinfo = prev_insn.insn_mo->pinfo;
1643 pinfo = ip->insn_mo->pinfo;
1644
1645 if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1646 {
1647 int prev_prev_nop;
1648
1649 /* If the previous insn required any delay slots, see if we need
1650 to insert a NOP or two. There are eight kinds of possible
1651 hazards, of which an instruction can have at most one type.
1652 (1) a load from memory delay
1653 (2) a load from a coprocessor delay
1654 (3) an unconditional branch delay
1655 (4) a conditional branch delay
1656 (5) a move to coprocessor register delay
1657 (6) a load coprocessor register from memory delay
1658 (7) a coprocessor condition code delay
1659 (8) a HI/LO special register delay
1660
1661 There are a lot of optimizations we could do that we don't.
1662 In particular, we do not, in general, reorder instructions.
1663 If you use gcc with optimization, it will reorder
1664 instructions and generally do much more optimization then we
1665 do here; repeating all that work in the assembler would only
1666 benefit hand written assembly code, and does not seem worth
1667 it. */
1668
1669 /* This is how a NOP is emitted. */
1670 #define emit_nop() \
1671 (mips_opts.mips16 \
1672 ? md_number_to_chars (frag_more (2), 0x6500, 2) \
1673 : md_number_to_chars (frag_more (4), 0, 4))
1674
1675 /* The previous insn might require a delay slot, depending upon
1676 the contents of the current insn. */
1677 if (! mips_opts.mips16
1678 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1679 && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1680 && ! cop_interlocks)
1681 || (! gpr_interlocks
1682 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1683 {
1684 /* A load from a coprocessor or from memory. All load
1685 delays delay the use of general register rt for one
1686 instruction on the r3000. The r6000 and r4000 use
1687 interlocks. */
1688 /* Itbl support may require additional care here. */
1689 know (prev_pinfo & INSN_WRITE_GPR_T);
1690 if (mips_optimize == 0
1691 || insn_uses_reg (ip,
1692 ((prev_insn.insn_opcode >> OP_SH_RT)
1693 & OP_MASK_RT),
1694 MIPS_GR_REG))
1695 ++nops;
1696 }
1697 else if (! mips_opts.mips16
1698 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1699 && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1700 && ! cop_interlocks)
1701 || (mips_opts.isa == ISA_MIPS1
1702 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1703 {
1704 /* A generic coprocessor delay. The previous instruction
1705 modified a coprocessor general or control register. If
1706 it modified a control register, we need to avoid any
1707 coprocessor instruction (this is probably not always
1708 required, but it sometimes is). If it modified a general
1709 register, we avoid using that register.
1710
1711 On the r6000 and r4000 loading a coprocessor register
1712 from memory is interlocked, and does not require a delay.
1713
1714 This case is not handled very well. There is no special
1715 knowledge of CP0 handling, and the coprocessors other
1716 than the floating point unit are not distinguished at
1717 all. */
1718 /* Itbl support may require additional care here. FIXME!
1719 Need to modify this to include knowledge about
1720 user specified delays! */
1721 if (prev_pinfo & INSN_WRITE_FPR_T)
1722 {
1723 if (mips_optimize == 0
1724 || insn_uses_reg (ip,
1725 ((prev_insn.insn_opcode >> OP_SH_FT)
1726 & OP_MASK_FT),
1727 MIPS_FP_REG))
1728 ++nops;
1729 }
1730 else if (prev_pinfo & INSN_WRITE_FPR_S)
1731 {
1732 if (mips_optimize == 0
1733 || insn_uses_reg (ip,
1734 ((prev_insn.insn_opcode >> OP_SH_FS)
1735 & OP_MASK_FS),
1736 MIPS_FP_REG))
1737 ++nops;
1738 }
1739 else
1740 {
1741 /* We don't know exactly what the previous instruction
1742 does. If the current instruction uses a coprocessor
1743 register, we must insert a NOP. If previous
1744 instruction may set the condition codes, and the
1745 current instruction uses them, we must insert two
1746 NOPS. */
1747 /* Itbl support may require additional care here. */
1748 if (mips_optimize == 0
1749 || ((prev_pinfo & INSN_WRITE_COND_CODE)
1750 && (pinfo & INSN_READ_COND_CODE)))
1751 nops += 2;
1752 else if (pinfo & INSN_COP)
1753 ++nops;
1754 }
1755 }
1756 else if (! mips_opts.mips16
1757 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1758 && (prev_pinfo & INSN_WRITE_COND_CODE)
1759 && ! cop_interlocks)
1760 {
1761 /* The previous instruction sets the coprocessor condition
1762 codes, but does not require a general coprocessor delay
1763 (this means it is a floating point comparison
1764 instruction). If this instruction uses the condition
1765 codes, we need to insert a single NOP. */
1766 /* Itbl support may require additional care here. */
1767 if (mips_optimize == 0
1768 || (pinfo & INSN_READ_COND_CODE))
1769 ++nops;
1770 }
1771
1772 /* If we're fixing up mfhi/mflo for the r7000 and the
1773 previous insn was an mfhi/mflo and the current insn
1774 reads the register that the mfhi/mflo wrote to, then
1775 insert two nops. */
1776
1777 else if (mips_7000_hilo_fix
1778 && MF_HILO_INSN (prev_pinfo)
1779 && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1780 & OP_MASK_RD),
1781 MIPS_GR_REG))
1782 {
1783 nops += 2;
1784 }
1785
1786 /* If we're fixing up mfhi/mflo for the r7000 and the
1787 2nd previous insn was an mfhi/mflo and the current insn
1788 reads the register that the mfhi/mflo wrote to, then
1789 insert one nop. */
1790
1791 else if (mips_7000_hilo_fix
1792 && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1793 && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1794 & OP_MASK_RD),
1795 MIPS_GR_REG))
1796
1797 {
1798 ++nops;
1799 }
1800
1801 else if (prev_pinfo & INSN_READ_LO)
1802 {
1803 /* The previous instruction reads the LO register; if the
1804 current instruction writes to the LO register, we must
1805 insert two NOPS. Some newer processors have interlocks.
1806 Also the tx39's multiply instructions can be exectuted
1807 immediatly after a read from HI/LO (without the delay),
1808 though the tx39's divide insns still do require the
1809 delay. */
1810 if (! (hilo_interlocks
1811 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1812 && (mips_optimize == 0
1813 || (pinfo & INSN_WRITE_LO)))
1814 nops += 2;
1815 /* Most mips16 branch insns don't have a delay slot.
1816 If a read from LO is immediately followed by a branch
1817 to a write to LO we have a read followed by a write
1818 less than 2 insns away. We assume the target of
1819 a branch might be a write to LO, and insert a nop
1820 between a read and an immediately following branch. */
1821 else if (mips_opts.mips16
1822 && (mips_optimize == 0
1823 || (pinfo & MIPS16_INSN_BRANCH)))
1824 ++nops;
1825 }
1826 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1827 {
1828 /* The previous instruction reads the HI register; if the
1829 current instruction writes to the HI register, we must
1830 insert a NOP. Some newer processors have interlocks.
1831 Also the note tx39's multiply above. */
1832 if (! (hilo_interlocks
1833 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1834 && (mips_optimize == 0
1835 || (pinfo & INSN_WRITE_HI)))
1836 nops += 2;
1837 /* Most mips16 branch insns don't have a delay slot.
1838 If a read from HI is immediately followed by a branch
1839 to a write to HI we have a read followed by a write
1840 less than 2 insns away. We assume the target of
1841 a branch might be a write to HI, and insert a nop
1842 between a read and an immediately following branch. */
1843 else if (mips_opts.mips16
1844 && (mips_optimize == 0
1845 || (pinfo & MIPS16_INSN_BRANCH)))
1846 ++nops;
1847 }
1848
1849 /* If the previous instruction was in a noreorder section, then
1850 we don't want to insert the nop after all. */
1851 /* Itbl support may require additional care here. */
1852 if (prev_insn_unreordered)
1853 nops = 0;
1854
1855 /* There are two cases which require two intervening
1856 instructions: 1) setting the condition codes using a move to
1857 coprocessor instruction which requires a general coprocessor
1858 delay and then reading the condition codes 2) reading the HI
1859 or LO register and then writing to it (except on processors
1860 which have interlocks). If we are not already emitting a NOP
1861 instruction, we must check for these cases compared to the
1862 instruction previous to the previous instruction. */
1863 if ((! mips_opts.mips16
1864 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1865 && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1866 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1867 && (pinfo & INSN_READ_COND_CODE)
1868 && ! cop_interlocks)
1869 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1870 && (pinfo & INSN_WRITE_LO)
1871 && ! (hilo_interlocks
1872 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
1873 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1874 && (pinfo & INSN_WRITE_HI)
1875 && ! (hilo_interlocks
1876 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
1877 prev_prev_nop = 1;
1878 else
1879 prev_prev_nop = 0;
1880
1881 if (prev_prev_insn_unreordered)
1882 prev_prev_nop = 0;
1883
1884 if (prev_prev_nop && nops == 0)
1885 ++nops;
1886
1887 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
1888 {
1889 /* We're out of bits in pinfo, so we must resort to string
1890 ops here. Shortcuts are selected based on opcodes being
1891 limited to the VR4122 instruction set. */
1892 int min_nops = 0;
1893 const char *pn = prev_insn.insn_mo->name;
1894 const char *tn = ip->insn_mo->name;
1895 if (strncmp(pn, "macc", 4) == 0
1896 || strncmp(pn, "dmacc", 5) == 0)
1897 {
1898 /* Errata 21 - [D]DIV[U] after [D]MACC */
1899 if (strstr (tn, "div"))
1900 {
1901 min_nops = 1;
1902 }
1903
1904 /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1905 if (pn[0] == 'd' /* dmacc */
1906 && (strncmp(tn, "dmult", 5) == 0
1907 || strncmp(tn, "dmacc", 5) == 0))
1908 {
1909 min_nops = 1;
1910 }
1911
1912 /* Errata 24 - MT{LO,HI} after [D]MACC */
1913 if (strcmp (tn, "mtlo") == 0
1914 || strcmp (tn, "mthi") == 0)
1915 {
1916 min_nops = 1;
1917 }
1918
1919 }
1920 else if (strncmp(pn, "dmult", 5) == 0
1921 && (strncmp(tn, "dmult", 5) == 0
1922 || strncmp(tn, "dmacc", 5) == 0))
1923 {
1924 /* Here is the rest of errata 23. */
1925 min_nops = 1;
1926 }
1927 if (nops < min_nops)
1928 nops = min_nops;
1929 }
1930
1931 /* If we are being given a nop instruction, don't bother with
1932 one of the nops we would otherwise output. This will only
1933 happen when a nop instruction is used with mips_optimize set
1934 to 0. */
1935 if (nops > 0
1936 && ! mips_opts.noreorder
1937 && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1938 --nops;
1939
1940 /* Now emit the right number of NOP instructions. */
1941 if (nops > 0 && ! mips_opts.noreorder)
1942 {
1943 fragS *old_frag;
1944 unsigned long old_frag_offset;
1945 int i;
1946 struct insn_label_list *l;
1947
1948 old_frag = frag_now;
1949 old_frag_offset = frag_now_fix ();
1950
1951 for (i = 0; i < nops; i++)
1952 emit_nop ();
1953
1954 if (listing)
1955 {
1956 listing_prev_line ();
1957 /* We may be at the start of a variant frag. In case we
1958 are, make sure there is enough space for the frag
1959 after the frags created by listing_prev_line. The
1960 argument to frag_grow here must be at least as large
1961 as the argument to all other calls to frag_grow in
1962 this file. We don't have to worry about being in the
1963 middle of a variant frag, because the variants insert
1964 all needed nop instructions themselves. */
1965 frag_grow (40);
1966 }
1967
1968 for (l = insn_labels; l != NULL; l = l->next)
1969 {
1970 valueT val;
1971
1972 assert (S_GET_SEGMENT (l->label) == now_seg);
1973 symbol_set_frag (l->label, frag_now);
1974 val = (valueT) frag_now_fix ();
1975 /* mips16 text labels are stored as odd. */
1976 if (mips_opts.mips16)
1977 ++val;
1978 S_SET_VALUE (l->label, val);
1979 }
1980
1981 #ifndef NO_ECOFF_DEBUGGING
1982 if (ECOFF_DEBUGGING)
1983 ecoff_fix_loc (old_frag, old_frag_offset);
1984 #endif
1985 }
1986 else if (prev_nop_frag != NULL)
1987 {
1988 /* We have a frag holding nops we may be able to remove. If
1989 we don't need any nops, we can decrease the size of
1990 prev_nop_frag by the size of one instruction. If we do
1991 need some nops, we count them in prev_nops_required. */
1992 if (prev_nop_frag_since == 0)
1993 {
1994 if (nops == 0)
1995 {
1996 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1997 --prev_nop_frag_holds;
1998 }
1999 else
2000 prev_nop_frag_required += nops;
2001 }
2002 else
2003 {
2004 if (prev_prev_nop == 0)
2005 {
2006 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2007 --prev_nop_frag_holds;
2008 }
2009 else
2010 ++prev_nop_frag_required;
2011 }
2012
2013 if (prev_nop_frag_holds <= prev_nop_frag_required)
2014 prev_nop_frag = NULL;
2015
2016 ++prev_nop_frag_since;
2017
2018 /* Sanity check: by the time we reach the second instruction
2019 after prev_nop_frag, we should have used up all the nops
2020 one way or another. */
2021 assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2022 }
2023 }
2024
2025 if (place == NULL
2026 && address_expr
2027 && *reloc_type == BFD_RELOC_16_PCREL_S2
2028 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2029 || pinfo & INSN_COND_BRANCH_LIKELY)
2030 && mips_relax_branch
2031 /* Don't try branch relaxation within .set nomacro, or within
2032 .set noat if we use $at for PIC computations. If it turns
2033 out that the branch was out-of-range, we'll get an error. */
2034 && !mips_opts.warn_about_macros
2035 && !(mips_opts.noat && mips_pic != NO_PIC)
2036 && !mips_opts.mips16)
2037 {
2038 f = frag_var (rs_machine_dependent,
2039 relaxed_branch_length
2040 (NULL, NULL,
2041 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2042 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2043 RELAX_BRANCH_ENCODE
2044 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2045 pinfo & INSN_COND_BRANCH_LIKELY,
2046 pinfo & INSN_WRITE_GPR_31,
2047 0),
2048 address_expr->X_add_symbol,
2049 address_expr->X_add_number,
2050 0);
2051 *reloc_type = BFD_RELOC_UNUSED;
2052 }
2053 else if (*reloc_type > BFD_RELOC_UNUSED)
2054 {
2055 /* We need to set up a variant frag. */
2056 assert (mips_opts.mips16 && address_expr != NULL);
2057 f = frag_var (rs_machine_dependent, 4, 0,
2058 RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2059 mips16_small, mips16_ext,
2060 (prev_pinfo
2061 & INSN_UNCOND_BRANCH_DELAY),
2062 (*prev_insn_reloc_type
2063 == BFD_RELOC_MIPS16_JMP)),
2064 make_expr_symbol (address_expr), 0, NULL);
2065 }
2066 else if (place != NULL)
2067 f = place;
2068 else if (mips_opts.mips16
2069 && ! ip->use_extend
2070 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2071 {
2072 /* Make sure there is enough room to swap this instruction with
2073 a following jump instruction. */
2074 frag_grow (6);
2075 f = frag_more (2);
2076 }
2077 else
2078 {
2079 if (mips_opts.mips16
2080 && mips_opts.noreorder
2081 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2082 as_warn (_("extended instruction in delay slot"));
2083
2084 f = frag_more (4);
2085 }
2086
2087 fixp[0] = fixp[1] = fixp[2] = NULL;
2088 if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2089 {
2090 if (address_expr->X_op == O_constant)
2091 {
2092 valueT tmp;
2093
2094 switch (*reloc_type)
2095 {
2096 case BFD_RELOC_32:
2097 ip->insn_opcode |= address_expr->X_add_number;
2098 break;
2099
2100 case BFD_RELOC_MIPS_HIGHEST:
2101 tmp = (address_expr->X_add_number + 0x800080008000) >> 16;
2102 tmp >>= 16;
2103 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2104 break;
2105
2106 case BFD_RELOC_MIPS_HIGHER:
2107 tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2108 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2109 break;
2110
2111 case BFD_RELOC_HI16_S:
2112 ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2113 >> 16) & 0xffff;
2114 break;
2115
2116 case BFD_RELOC_HI16:
2117 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2118 break;
2119
2120 case BFD_RELOC_LO16:
2121 case BFD_RELOC_MIPS_GOT_DISP:
2122 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2123 break;
2124
2125 case BFD_RELOC_MIPS_JMP:
2126 if ((address_expr->X_add_number & 3) != 0)
2127 as_bad (_("jump to misaligned address (0x%lx)"),
2128 (unsigned long) address_expr->X_add_number);
2129 if (address_expr->X_add_number & ~0xfffffff)
2130 as_bad (_("jump address range overflow (0x%lx)"),
2131 (unsigned long) address_expr->X_add_number);
2132 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2133 break;
2134
2135 case BFD_RELOC_MIPS16_JMP:
2136 if ((address_expr->X_add_number & 3) != 0)
2137 as_bad (_("jump to misaligned address (0x%lx)"),
2138 (unsigned long) address_expr->X_add_number);
2139 if (address_expr->X_add_number & ~0xfffffff)
2140 as_bad (_("jump address range overflow (0x%lx)"),
2141 (unsigned long) address_expr->X_add_number);
2142 ip->insn_opcode |=
2143 (((address_expr->X_add_number & 0x7c0000) << 3)
2144 | ((address_expr->X_add_number & 0xf800000) >> 7)
2145 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2146 break;
2147
2148 case BFD_RELOC_16_PCREL_S2:
2149 goto need_reloc;
2150
2151 default:
2152 internalError ();
2153 }
2154 }
2155 else
2156 {
2157 need_reloc:
2158 /* Don't generate a reloc if we are writing into a variant frag. */
2159 if (place == NULL)
2160 {
2161 fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2162 address_expr,
2163 *reloc_type == BFD_RELOC_16_PCREL_S2,
2164 reloc_type[0]);
2165
2166 /* These relocations can have an addend that won't fit in
2167 4 octets for 64bit assembly. */
2168 if (HAVE_64BIT_GPRS &&
2169 (*reloc_type == BFD_RELOC_16
2170 || *reloc_type == BFD_RELOC_32
2171 || *reloc_type == BFD_RELOC_MIPS_JMP
2172 || *reloc_type == BFD_RELOC_HI16_S
2173 || *reloc_type == BFD_RELOC_LO16
2174 || *reloc_type == BFD_RELOC_GPREL16
2175 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2176 || *reloc_type == BFD_RELOC_GPREL32
2177 || *reloc_type == BFD_RELOC_64
2178 || *reloc_type == BFD_RELOC_CTOR
2179 || *reloc_type == BFD_RELOC_MIPS_SUB
2180 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2181 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2182 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2183 || *reloc_type == BFD_RELOC_MIPS_REL16
2184 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2185 fixp[0]->fx_no_overflow = 1;
2186
2187 if (reloc_needs_lo_p (*reloc_type))
2188 {
2189 struct mips_hi_fixup *hi_fixup;
2190
2191 /* Reuse the last entry if it already has a matching %lo. */
2192 hi_fixup = mips_hi_fixup_list;
2193 if (hi_fixup == 0
2194 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2195 {
2196 hi_fixup = ((struct mips_hi_fixup *)
2197 xmalloc (sizeof (struct mips_hi_fixup)));
2198 hi_fixup->next = mips_hi_fixup_list;
2199 mips_hi_fixup_list = hi_fixup;
2200 }
2201 hi_fixup->fixp = fixp[0];
2202 hi_fixup->seg = now_seg;
2203 }
2204
2205 if (reloc_type[1] != BFD_RELOC_UNUSED)
2206 {
2207 /* FIXME: This symbol can be one of
2208 RSS_UNDEF, RSS_GP, RSS_GP0, RSS_LOC. */
2209 address_expr->X_op = O_absent;
2210 address_expr->X_add_symbol = 0;
2211 address_expr->X_add_number = 0;
2212
2213 fixp[1] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2214 4, address_expr, FALSE,
2215 reloc_type[1]);
2216
2217 /* These relocations can have an addend that won't fit in
2218 4 octets for 64bit assembly. */
2219 if (HAVE_64BIT_GPRS &&
2220 (*reloc_type == BFD_RELOC_16
2221 || *reloc_type == BFD_RELOC_32
2222 || *reloc_type == BFD_RELOC_MIPS_JMP
2223 || *reloc_type == BFD_RELOC_HI16_S
2224 || *reloc_type == BFD_RELOC_LO16
2225 || *reloc_type == BFD_RELOC_GPREL16
2226 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2227 || *reloc_type == BFD_RELOC_GPREL32
2228 || *reloc_type == BFD_RELOC_64
2229 || *reloc_type == BFD_RELOC_CTOR
2230 || *reloc_type == BFD_RELOC_MIPS_SUB
2231 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2232 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2233 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2234 || *reloc_type == BFD_RELOC_MIPS_REL16
2235 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2236 fixp[1]->fx_no_overflow = 1;
2237
2238 if (reloc_type[2] != BFD_RELOC_UNUSED)
2239 {
2240 address_expr->X_op = O_absent;
2241 address_expr->X_add_symbol = 0;
2242 address_expr->X_add_number = 0;
2243
2244 fixp[2] = fix_new_exp (frag_now,
2245 f - frag_now->fr_literal, 4,
2246 address_expr, FALSE,
2247 reloc_type[2]);
2248
2249 /* These relocations can have an addend that won't fit in
2250 4 octets for 64bit assembly. */
2251 if (HAVE_64BIT_GPRS &&
2252 (*reloc_type == BFD_RELOC_16
2253 || *reloc_type == BFD_RELOC_32
2254 || *reloc_type == BFD_RELOC_MIPS_JMP
2255 || *reloc_type == BFD_RELOC_HI16_S
2256 || *reloc_type == BFD_RELOC_LO16
2257 || *reloc_type == BFD_RELOC_GPREL16
2258 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2259 || *reloc_type == BFD_RELOC_GPREL32
2260 || *reloc_type == BFD_RELOC_64
2261 || *reloc_type == BFD_RELOC_CTOR
2262 || *reloc_type == BFD_RELOC_MIPS_SUB
2263 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2264 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2265 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2266 || *reloc_type == BFD_RELOC_MIPS_REL16
2267 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2268 fixp[2]->fx_no_overflow = 1;
2269 }
2270 }
2271 }
2272 }
2273 }
2274
2275 if (! mips_opts.mips16)
2276 {
2277 md_number_to_chars (f, ip->insn_opcode, 4);
2278 #ifdef OBJ_ELF
2279 dwarf2_emit_insn (4);
2280 #endif
2281 }
2282 else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2283 {
2284 md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2285 md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2286 #ifdef OBJ_ELF
2287 dwarf2_emit_insn (4);
2288 #endif
2289 }
2290 else
2291 {
2292 if (ip->use_extend)
2293 {
2294 md_number_to_chars (f, 0xf000 | ip->extend, 2);
2295 f += 2;
2296 }
2297 md_number_to_chars (f, ip->insn_opcode, 2);
2298 #ifdef OBJ_ELF
2299 dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2300 #endif
2301 }
2302
2303 /* Update the register mask information. */
2304 if (! mips_opts.mips16)
2305 {
2306 if (pinfo & INSN_WRITE_GPR_D)
2307 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2308 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2309 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2310 if (pinfo & INSN_READ_GPR_S)
2311 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2312 if (pinfo & INSN_WRITE_GPR_31)
2313 mips_gprmask |= 1 << RA;
2314 if (pinfo & INSN_WRITE_FPR_D)
2315 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2316 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2317 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2318 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2319 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2320 if ((pinfo & INSN_READ_FPR_R) != 0)
2321 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2322 if (pinfo & INSN_COP)
2323 {
2324 /* We don't keep enough information to sort these cases out.
2325 The itbl support does keep this information however, although
2326 we currently don't support itbl fprmats as part of the cop
2327 instruction. May want to add this support in the future. */
2328 }
2329 /* Never set the bit for $0, which is always zero. */
2330 mips_gprmask &= ~1 << 0;
2331 }
2332 else
2333 {
2334 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2335 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2336 & MIPS16OP_MASK_RX);
2337 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2338 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2339 & MIPS16OP_MASK_RY);
2340 if (pinfo & MIPS16_INSN_WRITE_Z)
2341 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2342 & MIPS16OP_MASK_RZ);
2343 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2344 mips_gprmask |= 1 << TREG;
2345 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2346 mips_gprmask |= 1 << SP;
2347 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2348 mips_gprmask |= 1 << RA;
2349 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2350 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2351 if (pinfo & MIPS16_INSN_READ_Z)
2352 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2353 & MIPS16OP_MASK_MOVE32Z);
2354 if (pinfo & MIPS16_INSN_READ_GPR_X)
2355 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2356 & MIPS16OP_MASK_REGR32);
2357 }
2358
2359 if (place == NULL && ! mips_opts.noreorder)
2360 {
2361 /* Filling the branch delay slot is more complex. We try to
2362 switch the branch with the previous instruction, which we can
2363 do if the previous instruction does not set up a condition
2364 that the branch tests and if the branch is not itself the
2365 target of any branch. */
2366 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2367 || (pinfo & INSN_COND_BRANCH_DELAY))
2368 {
2369 if (mips_optimize < 2
2370 /* If we have seen .set volatile or .set nomove, don't
2371 optimize. */
2372 || mips_opts.nomove != 0
2373 /* If we had to emit any NOP instructions, then we
2374 already know we can not swap. */
2375 || nops != 0
2376 /* If we don't even know the previous insn, we can not
2377 swap. */
2378 || ! prev_insn_valid
2379 /* If the previous insn is already in a branch delay
2380 slot, then we can not swap. */
2381 || prev_insn_is_delay_slot
2382 /* If the previous previous insn was in a .set
2383 noreorder, we can't swap. Actually, the MIPS
2384 assembler will swap in this situation. However, gcc
2385 configured -with-gnu-as will generate code like
2386 .set noreorder
2387 lw $4,XXX
2388 .set reorder
2389 INSN
2390 bne $4,$0,foo
2391 in which we can not swap the bne and INSN. If gcc is
2392 not configured -with-gnu-as, it does not output the
2393 .set pseudo-ops. We don't have to check
2394 prev_insn_unreordered, because prev_insn_valid will
2395 be 0 in that case. We don't want to use
2396 prev_prev_insn_valid, because we do want to be able
2397 to swap at the start of a function. */
2398 || prev_prev_insn_unreordered
2399 /* If the branch is itself the target of a branch, we
2400 can not swap. We cheat on this; all we check for is
2401 whether there is a label on this instruction. If
2402 there are any branches to anything other than a
2403 label, users must use .set noreorder. */
2404 || insn_labels != NULL
2405 /* If the previous instruction is in a variant frag, we
2406 can not do the swap. This does not apply to the
2407 mips16, which uses variant frags for different
2408 purposes. */
2409 || (! mips_opts.mips16
2410 && prev_insn_frag->fr_type == rs_machine_dependent)
2411 /* If the branch reads the condition codes, we don't
2412 even try to swap, because in the sequence
2413 ctc1 $X,$31
2414 INSN
2415 INSN
2416 bc1t LABEL
2417 we can not swap, and I don't feel like handling that
2418 case. */
2419 || (! mips_opts.mips16
2420 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2421 && (pinfo & INSN_READ_COND_CODE))
2422 /* We can not swap with an instruction that requires a
2423 delay slot, becase the target of the branch might
2424 interfere with that instruction. */
2425 || (! mips_opts.mips16
2426 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2427 && (prev_pinfo
2428 /* Itbl support may require additional care here. */
2429 & (INSN_LOAD_COPROC_DELAY
2430 | INSN_COPROC_MOVE_DELAY
2431 | INSN_WRITE_COND_CODE)))
2432 || (! (hilo_interlocks
2433 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
2434 && (prev_pinfo
2435 & (INSN_READ_LO
2436 | INSN_READ_HI)))
2437 || (! mips_opts.mips16
2438 && ! gpr_interlocks
2439 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2440 || (! mips_opts.mips16
2441 && mips_opts.isa == ISA_MIPS1
2442 /* Itbl support may require additional care here. */
2443 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2444 /* We can not swap with a branch instruction. */
2445 || (prev_pinfo
2446 & (INSN_UNCOND_BRANCH_DELAY
2447 | INSN_COND_BRANCH_DELAY
2448 | INSN_COND_BRANCH_LIKELY))
2449 /* We do not swap with a trap instruction, since it
2450 complicates trap handlers to have the trap
2451 instruction be in a delay slot. */
2452 || (prev_pinfo & INSN_TRAP)
2453 /* If the branch reads a register that the previous
2454 instruction sets, we can not swap. */
2455 || (! mips_opts.mips16
2456 && (prev_pinfo & INSN_WRITE_GPR_T)
2457 && insn_uses_reg (ip,
2458 ((prev_insn.insn_opcode >> OP_SH_RT)
2459 & OP_MASK_RT),
2460 MIPS_GR_REG))
2461 || (! mips_opts.mips16
2462 && (prev_pinfo & INSN_WRITE_GPR_D)
2463 && insn_uses_reg (ip,
2464 ((prev_insn.insn_opcode >> OP_SH_RD)
2465 & OP_MASK_RD),
2466 MIPS_GR_REG))
2467 || (mips_opts.mips16
2468 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2469 && insn_uses_reg (ip,
2470 ((prev_insn.insn_opcode
2471 >> MIPS16OP_SH_RX)
2472 & MIPS16OP_MASK_RX),
2473 MIPS16_REG))
2474 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2475 && insn_uses_reg (ip,
2476 ((prev_insn.insn_opcode
2477 >> MIPS16OP_SH_RY)
2478 & MIPS16OP_MASK_RY),
2479 MIPS16_REG))
2480 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2481 && insn_uses_reg (ip,
2482 ((prev_insn.insn_opcode
2483 >> MIPS16OP_SH_RZ)
2484 & MIPS16OP_MASK_RZ),
2485 MIPS16_REG))
2486 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2487 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2488 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2489 && insn_uses_reg (ip, RA, MIPS_GR_REG))
2490 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2491 && insn_uses_reg (ip,
2492 MIPS16OP_EXTRACT_REG32R (prev_insn.
2493 insn_opcode),
2494 MIPS_GR_REG))))
2495 /* If the branch writes a register that the previous
2496 instruction sets, we can not swap (we know that
2497 branches write only to RD or to $31). */
2498 || (! mips_opts.mips16
2499 && (prev_pinfo & INSN_WRITE_GPR_T)
2500 && (((pinfo & INSN_WRITE_GPR_D)
2501 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2502 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2503 || ((pinfo & INSN_WRITE_GPR_31)
2504 && (((prev_insn.insn_opcode >> OP_SH_RT)
2505 & OP_MASK_RT)
2506 == RA))))
2507 || (! mips_opts.mips16
2508 && (prev_pinfo & INSN_WRITE_GPR_D)
2509 && (((pinfo & INSN_WRITE_GPR_D)
2510 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2511 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2512 || ((pinfo & INSN_WRITE_GPR_31)
2513 && (((prev_insn.insn_opcode >> OP_SH_RD)
2514 & OP_MASK_RD)
2515 == RA))))
2516 || (mips_opts.mips16
2517 && (pinfo & MIPS16_INSN_WRITE_31)
2518 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2519 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2520 && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2521 == RA))))
2522 /* If the branch writes a register that the previous
2523 instruction reads, we can not swap (we know that
2524 branches only write to RD or to $31). */
2525 || (! mips_opts.mips16
2526 && (pinfo & INSN_WRITE_GPR_D)
2527 && insn_uses_reg (&prev_insn,
2528 ((ip->insn_opcode >> OP_SH_RD)
2529 & OP_MASK_RD),
2530 MIPS_GR_REG))
2531 || (! mips_opts.mips16
2532 && (pinfo & INSN_WRITE_GPR_31)
2533 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2534 || (mips_opts.mips16
2535 && (pinfo & MIPS16_INSN_WRITE_31)
2536 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2537 /* If we are generating embedded PIC code, the branch
2538 might be expanded into a sequence which uses $at, so
2539 we can't swap with an instruction which reads it. */
2540 || (mips_pic == EMBEDDED_PIC
2541 && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2542 /* If the previous previous instruction has a load
2543 delay, and sets a register that the branch reads, we
2544 can not swap. */
2545 || (! mips_opts.mips16
2546 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2547 /* Itbl support may require additional care here. */
2548 && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2549 || (! gpr_interlocks
2550 && (prev_prev_insn.insn_mo->pinfo
2551 & INSN_LOAD_MEMORY_DELAY)))
2552 && insn_uses_reg (ip,
2553 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2554 & OP_MASK_RT),
2555 MIPS_GR_REG))
2556 /* If one instruction sets a condition code and the
2557 other one uses a condition code, we can not swap. */
2558 || ((pinfo & INSN_READ_COND_CODE)
2559 && (prev_pinfo & INSN_WRITE_COND_CODE))
2560 || ((pinfo & INSN_WRITE_COND_CODE)
2561 && (prev_pinfo & INSN_READ_COND_CODE))
2562 /* If the previous instruction uses the PC, we can not
2563 swap. */
2564 || (mips_opts.mips16
2565 && (prev_pinfo & MIPS16_INSN_READ_PC))
2566 /* If the previous instruction was extended, we can not
2567 swap. */
2568 || (mips_opts.mips16 && prev_insn_extended)
2569 /* If the previous instruction had a fixup in mips16
2570 mode, we can not swap. This normally means that the
2571 previous instruction was a 4 byte branch anyhow. */
2572 || (mips_opts.mips16 && prev_insn_fixp[0])
2573 /* If the previous instruction is a sync, sync.l, or
2574 sync.p, we can not swap. */
2575 || (prev_pinfo & INSN_SYNC))
2576 {
2577 /* We could do even better for unconditional branches to
2578 portions of this object file; we could pick up the
2579 instruction at the destination, put it in the delay
2580 slot, and bump the destination address. */
2581 emit_nop ();
2582 /* Update the previous insn information. */
2583 prev_prev_insn = *ip;
2584 prev_insn.insn_mo = &dummy_opcode;
2585 }
2586 else
2587 {
2588 /* It looks like we can actually do the swap. */
2589 if (! mips_opts.mips16)
2590 {
2591 char *prev_f;
2592 char temp[4];
2593
2594 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2595 memcpy (temp, prev_f, 4);
2596 memcpy (prev_f, f, 4);
2597 memcpy (f, temp, 4);
2598 if (prev_insn_fixp[0])
2599 {
2600 prev_insn_fixp[0]->fx_frag = frag_now;
2601 prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2602 }
2603 if (prev_insn_fixp[1])
2604 {
2605 prev_insn_fixp[1]->fx_frag = frag_now;
2606 prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2607 }
2608 if (prev_insn_fixp[2])
2609 {
2610 prev_insn_fixp[2]->fx_frag = frag_now;
2611 prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2612 }
2613 if (prev_insn_fixp[0] && HAVE_NEWABI
2614 && prev_insn_frag != frag_now
2615 && (prev_insn_fixp[0]->fx_r_type
2616 == BFD_RELOC_MIPS_GOT_DISP
2617 || (prev_insn_fixp[0]->fx_r_type
2618 == BFD_RELOC_MIPS_CALL16)))
2619 {
2620 /* To avoid confusion in tc_gen_reloc, we must
2621 ensure that this does not become a variant
2622 frag. */
2623 force_new_frag = TRUE;
2624 }
2625 if (fixp[0])
2626 {
2627 fixp[0]->fx_frag = prev_insn_frag;
2628 fixp[0]->fx_where = prev_insn_where;
2629 }
2630 if (fixp[1])
2631 {
2632 fixp[1]->fx_frag = prev_insn_frag;
2633 fixp[1]->fx_where = prev_insn_where;
2634 }
2635 if (fixp[2])
2636 {
2637 fixp[2]->fx_frag = prev_insn_frag;
2638 fixp[2]->fx_where = prev_insn_where;
2639 }
2640 }
2641 else
2642 {
2643 char *prev_f;
2644 char temp[2];
2645
2646 assert (prev_insn_fixp[0] == NULL);
2647 assert (prev_insn_fixp[1] == NULL);
2648 assert (prev_insn_fixp[2] == NULL);
2649 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2650 memcpy (temp, prev_f, 2);
2651 memcpy (prev_f, f, 2);
2652 if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2653 {
2654 assert (*reloc_type == BFD_RELOC_UNUSED);
2655 memcpy (f, temp, 2);
2656 }
2657 else
2658 {
2659 memcpy (f, f + 2, 2);
2660 memcpy (f + 2, temp, 2);
2661 }
2662 if (fixp[0])
2663 {
2664 fixp[0]->fx_frag = prev_insn_frag;
2665 fixp[0]->fx_where = prev_insn_where;
2666 }
2667 if (fixp[1])
2668 {
2669 fixp[1]->fx_frag = prev_insn_frag;
2670 fixp[1]->fx_where = prev_insn_where;
2671 }
2672 if (fixp[2])
2673 {
2674 fixp[2]->fx_frag = prev_insn_frag;
2675 fixp[2]->fx_where = prev_insn_where;
2676 }
2677 }
2678
2679 /* Update the previous insn information; leave prev_insn
2680 unchanged. */
2681 prev_prev_insn = *ip;
2682 }
2683 prev_insn_is_delay_slot = 1;
2684
2685 /* If that was an unconditional branch, forget the previous
2686 insn information. */
2687 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2688 {
2689 prev_prev_insn.insn_mo = &dummy_opcode;
2690 prev_insn.insn_mo = &dummy_opcode;
2691 }
2692
2693 prev_insn_fixp[0] = NULL;
2694 prev_insn_fixp[1] = NULL;
2695 prev_insn_fixp[2] = NULL;
2696 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2697 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2698 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2699 prev_insn_extended = 0;
2700 }
2701 else if (pinfo & INSN_COND_BRANCH_LIKELY)
2702 {
2703 /* We don't yet optimize a branch likely. What we should do
2704 is look at the target, copy the instruction found there
2705 into the delay slot, and increment the branch to jump to
2706 the next instruction. */
2707 emit_nop ();
2708 /* Update the previous insn information. */
2709 prev_prev_insn = *ip;
2710 prev_insn.insn_mo = &dummy_opcode;
2711 prev_insn_fixp[0] = NULL;
2712 prev_insn_fixp[1] = NULL;
2713 prev_insn_fixp[2] = NULL;
2714 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2715 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2716 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2717 prev_insn_extended = 0;
2718 }
2719 else
2720 {
2721 /* Update the previous insn information. */
2722 if (nops > 0)
2723 prev_prev_insn.insn_mo = &dummy_opcode;
2724 else
2725 prev_prev_insn = prev_insn;
2726 prev_insn = *ip;
2727
2728 /* Any time we see a branch, we always fill the delay slot
2729 immediately; since this insn is not a branch, we know it
2730 is not in a delay slot. */
2731 prev_insn_is_delay_slot = 0;
2732
2733 prev_insn_fixp[0] = fixp[0];
2734 prev_insn_fixp[1] = fixp[1];
2735 prev_insn_fixp[2] = fixp[2];
2736 prev_insn_reloc_type[0] = reloc_type[0];
2737 prev_insn_reloc_type[1] = reloc_type[1];
2738 prev_insn_reloc_type[2] = reloc_type[2];
2739 if (mips_opts.mips16)
2740 prev_insn_extended = (ip->use_extend
2741 || *reloc_type > BFD_RELOC_UNUSED);
2742 }
2743
2744 prev_prev_insn_unreordered = prev_insn_unreordered;
2745 prev_insn_unreordered = 0;
2746 prev_insn_frag = frag_now;
2747 prev_insn_where = f - frag_now->fr_literal;
2748 prev_insn_valid = 1;
2749 }
2750 else if (place == NULL)
2751 {
2752 /* We need to record a bit of information even when we are not
2753 reordering, in order to determine the base address for mips16
2754 PC relative relocs. */
2755 prev_prev_insn = prev_insn;
2756 prev_insn = *ip;
2757 prev_insn_reloc_type[0] = reloc_type[0];
2758 prev_insn_reloc_type[1] = reloc_type[1];
2759 prev_insn_reloc_type[2] = reloc_type[2];
2760 prev_prev_insn_unreordered = prev_insn_unreordered;
2761 prev_insn_unreordered = 1;
2762 }
2763
2764 /* We just output an insn, so the next one doesn't have a label. */
2765 mips_clear_insn_labels ();
2766
2767 /* We must ensure that the frag to which an instruction that was
2768 moved from a non-variant frag doesn't become a variant frag,
2769 otherwise tc_gen_reloc may get confused. */
2770 if (force_new_frag)
2771 {
2772 frag_wane (frag_now);
2773 frag_new (0);
2774 }
2775 }
2776
2777 /* This function forgets that there was any previous instruction or
2778 label. If PRESERVE is non-zero, it remembers enough information to
2779 know whether nops are needed before a noreorder section. */
2780
2781 static void
2782 mips_no_prev_insn (preserve)
2783 int preserve;
2784 {
2785 if (! preserve)
2786 {
2787 prev_insn.insn_mo = &dummy_opcode;
2788 prev_prev_insn.insn_mo = &dummy_opcode;
2789 prev_nop_frag = NULL;
2790 prev_nop_frag_holds = 0;
2791 prev_nop_frag_required = 0;
2792 prev_nop_frag_since = 0;
2793 }
2794 prev_insn_valid = 0;
2795 prev_insn_is_delay_slot = 0;
2796 prev_insn_unreordered = 0;
2797 prev_insn_extended = 0;
2798 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2799 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2800 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2801 prev_prev_insn_unreordered = 0;
2802 mips_clear_insn_labels ();
2803 }
2804
2805 /* This function must be called whenever we turn on noreorder or emit
2806 something other than instructions. It inserts any NOPS which might
2807 be needed by the previous instruction, and clears the information
2808 kept for the previous instructions. The INSNS parameter is true if
2809 instructions are to follow. */
2810
2811 static void
2812 mips_emit_delays (insns)
2813 bfd_boolean insns;
2814 {
2815 if (! mips_opts.noreorder)
2816 {
2817 int nops;
2818
2819 nops = 0;
2820 if ((! mips_opts.mips16
2821 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2822 && (! cop_interlocks
2823 && (prev_insn.insn_mo->pinfo
2824 & (INSN_LOAD_COPROC_DELAY
2825 | INSN_COPROC_MOVE_DELAY
2826 | INSN_WRITE_COND_CODE))))
2827 || (! hilo_interlocks
2828 && (prev_insn.insn_mo->pinfo
2829 & (INSN_READ_LO
2830 | INSN_READ_HI)))
2831 || (! mips_opts.mips16
2832 && ! gpr_interlocks
2833 && (prev_insn.insn_mo->pinfo
2834 & INSN_LOAD_MEMORY_DELAY))
2835 || (! mips_opts.mips16
2836 && mips_opts.isa == ISA_MIPS1
2837 && (prev_insn.insn_mo->pinfo
2838 & INSN_COPROC_MEMORY_DELAY)))
2839 {
2840 /* Itbl support may require additional care here. */
2841 ++nops;
2842 if ((! mips_opts.mips16
2843 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2844 && (! cop_interlocks
2845 && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2846 || (! hilo_interlocks
2847 && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2848 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2849 ++nops;
2850
2851 if (prev_insn_unreordered)
2852 nops = 0;
2853 }
2854 else if ((! mips_opts.mips16
2855 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2856 && (! cop_interlocks
2857 && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2858 || (! hilo_interlocks
2859 && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2860 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2861 {
2862 /* Itbl support may require additional care here. */
2863 if (! prev_prev_insn_unreordered)
2864 ++nops;
2865 }
2866
2867 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
2868 {
2869 int min_nops = 0;
2870 const char *pn = prev_insn.insn_mo->name;
2871 if (strncmp(pn, "macc", 4) == 0
2872 || strncmp(pn, "dmacc", 5) == 0
2873 || strncmp(pn, "dmult", 5) == 0)
2874 {
2875 min_nops = 1;
2876 }
2877 if (nops < min_nops)
2878 nops = min_nops;
2879 }
2880
2881 if (nops > 0)
2882 {
2883 struct insn_label_list *l;
2884
2885 if (insns)
2886 {
2887 /* Record the frag which holds the nop instructions, so
2888 that we can remove them if we don't need them. */
2889 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2890 prev_nop_frag = frag_now;
2891 prev_nop_frag_holds = nops;
2892 prev_nop_frag_required = 0;
2893 prev_nop_frag_since = 0;
2894 }
2895
2896 for (; nops > 0; --nops)
2897 emit_nop ();
2898
2899 if (insns)
2900 {
2901 /* Move on to a new frag, so that it is safe to simply
2902 decrease the size of prev_nop_frag. */
2903 frag_wane (frag_now);
2904 frag_new (0);
2905 }
2906
2907 for (l = insn_labels; l != NULL; l = l->next)
2908 {
2909 valueT val;
2910
2911 assert (S_GET_SEGMENT (l->label) == now_seg);
2912 symbol_set_frag (l->label, frag_now);
2913 val = (valueT) frag_now_fix ();
2914 /* mips16 text labels are stored as odd. */
2915 if (mips_opts.mips16)
2916 ++val;
2917 S_SET_VALUE (l->label, val);
2918 }
2919 }
2920 }
2921
2922 /* Mark instruction labels in mips16 mode. */
2923 if (insns)
2924 mips16_mark_labels ();
2925
2926 mips_no_prev_insn (insns);
2927 }
2928
2929 /* Build an instruction created by a macro expansion. This is passed
2930 a pointer to the count of instructions created so far, an
2931 expression, the name of the instruction to build, an operand format
2932 string, and corresponding arguments. */
2933
2934 #ifdef USE_STDARG
2935 static void
2936 macro_build (char *place,
2937 int *counter,
2938 expressionS * ep,
2939 const char *name,
2940 const char *fmt,
2941 ...)
2942 #else
2943 static void
2944 macro_build (place, counter, ep, name, fmt, va_alist)
2945 char *place;
2946 int *counter;
2947 expressionS *ep;
2948 const char *name;
2949 const char *fmt;
2950 va_dcl
2951 #endif
2952 {
2953 struct mips_cl_insn insn;
2954 bfd_reloc_code_real_type r[3];
2955 va_list args;
2956
2957 #ifdef USE_STDARG
2958 va_start (args, fmt);
2959 #else
2960 va_start (args);
2961 #endif
2962
2963 /*
2964 * If the macro is about to expand into a second instruction,
2965 * print a warning if needed. We need to pass ip as a parameter
2966 * to generate a better warning message here...
2967 */
2968 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2969 as_warn (_("Macro instruction expanded into multiple instructions"));
2970
2971 /*
2972 * If the macro is about to expand into a second instruction,
2973 * and it is in a delay slot, print a warning.
2974 */
2975 if (place == NULL
2976 && *counter == 1
2977 && mips_opts.noreorder
2978 && (prev_prev_insn.insn_mo->pinfo
2979 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY
2980 | INSN_COND_BRANCH_LIKELY)) != 0)
2981 as_warn (_("Macro instruction expanded into multiple instructions in a branch delay slot"));
2982
2983 if (place == NULL)
2984 ++*counter; /* bump instruction counter */
2985
2986 if (mips_opts.mips16)
2987 {
2988 mips16_macro_build (place, counter, ep, name, fmt, args);
2989 va_end (args);
2990 return;
2991 }
2992
2993 r[0] = BFD_RELOC_UNUSED;
2994 r[1] = BFD_RELOC_UNUSED;
2995 r[2] = BFD_RELOC_UNUSED;
2996 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2997 assert (insn.insn_mo);
2998 assert (strcmp (name, insn.insn_mo->name) == 0);
2999
3000 /* Search until we get a match for NAME. */
3001 while (1)
3002 {
3003 /* It is assumed here that macros will never generate
3004 MDMX or MIPS-3D instructions. */
3005 if (strcmp (fmt, insn.insn_mo->args) == 0
3006 && insn.insn_mo->pinfo != INSN_MACRO
3007 && OPCODE_IS_MEMBER (insn.insn_mo,
3008 (mips_opts.isa
3009 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3010 mips_arch)
3011 && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
3012 break;
3013
3014 ++insn.insn_mo;
3015 assert (insn.insn_mo->name);
3016 assert (strcmp (name, insn.insn_mo->name) == 0);
3017 }
3018
3019 insn.insn_opcode = insn.insn_mo->match;
3020 for (;;)
3021 {
3022 switch (*fmt++)
3023 {
3024 case '\0':
3025 break;
3026
3027 case ',':
3028 case '(':
3029 case ')':
3030 continue;
3031
3032 case 't':
3033 case 'w':
3034 case 'E':
3035 insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3036 continue;
3037
3038 case 'c':
3039 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3040 continue;
3041
3042 case 'T':
3043 case 'W':
3044 insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3045 continue;
3046
3047 case 'd':
3048 case 'G':
3049 case 'K':
3050 insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3051 continue;
3052
3053 case 'U':
3054 {
3055 int tmp = va_arg (args, int);
3056
3057 insn.insn_opcode |= tmp << OP_SH_RT;
3058 insn.insn_opcode |= tmp << OP_SH_RD;
3059 continue;
3060 }
3061
3062 case 'V':
3063 case 'S':
3064 insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3065 continue;
3066
3067 case 'z':
3068 continue;
3069
3070 case '<':
3071 insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3072 continue;
3073
3074 case 'D':
3075 insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3076 continue;
3077
3078 case 'B':
3079 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3080 continue;
3081
3082 case 'J':
3083 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3084 continue;
3085
3086 case 'q':
3087 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3088 continue;
3089
3090 case 'b':
3091 case 's':
3092 case 'r':
3093 case 'v':
3094 insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3095 continue;
3096
3097 case 'i':
3098 case 'j':
3099 case 'o':
3100 *r = (bfd_reloc_code_real_type) va_arg (args, int);
3101 assert (*r == BFD_RELOC_GPREL16
3102 || *r == BFD_RELOC_MIPS_LITERAL
3103 || *r == BFD_RELOC_MIPS_HIGHER
3104 || *r == BFD_RELOC_HI16_S
3105 || *r == BFD_RELOC_LO16
3106 || *r == BFD_RELOC_MIPS_GOT16
3107 || *r == BFD_RELOC_MIPS_CALL16
3108 || *r == BFD_RELOC_MIPS_GOT_DISP
3109 || *r == BFD_RELOC_MIPS_GOT_PAGE
3110 || *r == BFD_RELOC_MIPS_GOT_OFST
3111 || *r == BFD_RELOC_MIPS_GOT_LO16
3112 || *r == BFD_RELOC_MIPS_CALL_LO16
3113 || (ep->X_op == O_subtract
3114 && *r == BFD_RELOC_PCREL_LO16));
3115 continue;
3116
3117 case 'u':
3118 *r = (bfd_reloc_code_real_type) va_arg (args, int);
3119 assert (ep != NULL
3120 && (ep->X_op == O_constant
3121 || (ep->X_op == O_symbol
3122 && (*r == BFD_RELOC_MIPS_HIGHEST
3123 || *r == BFD_RELOC_HI16_S
3124 || *r == BFD_RELOC_HI16
3125 || *r == BFD_RELOC_GPREL16
3126 || *r == BFD_RELOC_MIPS_GOT_HI16
3127 || *r == BFD_RELOC_MIPS_CALL_HI16))
3128 || (ep->X_op == O_subtract
3129 && *r == BFD_RELOC_PCREL_HI16_S)));
3130 continue;
3131
3132 case 'p':
3133 assert (ep != NULL);
3134 /*
3135 * This allows macro() to pass an immediate expression for
3136 * creating short branches without creating a symbol.
3137 * Note that the expression still might come from the assembly
3138 * input, in which case the value is not checked for range nor
3139 * is a relocation entry generated (yuck).
3140 */
3141 if (ep->X_op == O_constant)
3142 {
3143 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3144 ep = NULL;
3145 }
3146 else
3147 *r = BFD_RELOC_16_PCREL_S2;
3148 continue;
3149
3150 case 'a':
3151 assert (ep != NULL);
3152 *r = BFD_RELOC_MIPS_JMP;
3153 continue;
3154
3155 case 'C':
3156 insn.insn_opcode |= va_arg (args, unsigned long);
3157 continue;
3158
3159 default:
3160 internalError ();
3161 }
3162 break;
3163 }
3164 va_end (args);
3165 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3166
3167 append_insn (place, &insn, ep, r);
3168 }
3169
3170 static void
3171 mips16_macro_build (place, counter, ep, name, fmt, args)
3172 char *place;
3173 int *counter ATTRIBUTE_UNUSED;
3174 expressionS *ep;
3175 const char *name;
3176 const char *fmt;
3177 va_list args;
3178 {
3179 struct mips_cl_insn insn;
3180 bfd_reloc_code_real_type r[3]
3181 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3182
3183 insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3184 assert (insn.insn_mo);
3185 assert (strcmp (name, insn.insn_mo->name) == 0);
3186
3187 while (strcmp (fmt, insn.insn_mo->args) != 0
3188 || insn.insn_mo->pinfo == INSN_MACRO)
3189 {
3190 ++insn.insn_mo;
3191 assert (insn.insn_mo->name);
3192 assert (strcmp (name, insn.insn_mo->name) == 0);
3193 }
3194
3195 insn.insn_opcode = insn.insn_mo->match;
3196 insn.use_extend = FALSE;
3197
3198 for (;;)
3199 {
3200 int c;
3201
3202 c = *fmt++;
3203 switch (c)
3204 {
3205 case '\0':
3206 break;
3207
3208 case ',':
3209 case '(':
3210 case ')':
3211 continue;
3212
3213 case 'y':
3214 case 'w':
3215 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3216 continue;
3217
3218 case 'x':
3219 case 'v':
3220 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3221 continue;
3222
3223 case 'z':
3224 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3225 continue;
3226
3227 case 'Z':
3228 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3229 continue;
3230
3231 case '0':
3232 case 'S':
3233 case 'P':
3234 case 'R':
3235 continue;
3236
3237 case 'X':
3238 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3239 continue;
3240
3241 case 'Y':
3242 {
3243 int regno;
3244
3245 regno = va_arg (args, int);
3246 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3247 insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3248 }
3249 continue;
3250
3251 case '<':
3252 case '>':
3253 case '4':
3254 case '5':
3255 case 'H':
3256 case 'W':
3257 case 'D':
3258 case 'j':
3259 case '8':
3260 case 'V':
3261 case 'C':
3262 case 'U':
3263 case 'k':
3264 case 'K':
3265 case 'p':
3266 case 'q':
3267 {
3268 assert (ep != NULL);
3269
3270 if (ep->X_op != O_constant)
3271 *r = (int) BFD_RELOC_UNUSED + c;
3272 else
3273 {
3274 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3275 FALSE, &insn.insn_opcode, &insn.use_extend,
3276 &insn.extend);
3277 ep = NULL;
3278 *r = BFD_RELOC_UNUSED;
3279 }
3280 }
3281 continue;
3282
3283 case '6':
3284 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3285 continue;
3286 }
3287
3288 break;
3289 }
3290
3291 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3292
3293 append_insn (place, &insn, ep, r);
3294 }
3295
3296 /*
3297 * Generate a "jalr" instruction with a relocation hint to the called
3298 * function. This occurs in NewABI PIC code.
3299 */
3300 static void
3301 macro_build_jalr (icnt, ep)
3302 int icnt;
3303 expressionS *ep;
3304 {
3305 char *f;
3306
3307 if (HAVE_NEWABI)
3308 {
3309 frag_grow (4);
3310 f = frag_more (0);
3311 }
3312 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr", "d,s",
3313 RA, PIC_CALL_REG);
3314 if (HAVE_NEWABI)
3315 fix_new_exp (frag_now, f - frag_now->fr_literal,
3316 0, ep, FALSE, BFD_RELOC_MIPS_JALR);
3317 }
3318
3319 /*
3320 * Generate a "lui" instruction.
3321 */
3322 static void
3323 macro_build_lui (place, counter, ep, regnum)
3324 char *place;
3325 int *counter;
3326 expressionS *ep;
3327 int regnum;
3328 {
3329 expressionS high_expr;
3330 struct mips_cl_insn insn;
3331 bfd_reloc_code_real_type r[3]
3332 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3333 const char *name = "lui";
3334 const char *fmt = "t,u";
3335
3336 assert (! mips_opts.mips16);
3337
3338 if (place == NULL)
3339 high_expr = *ep;
3340 else
3341 {
3342 high_expr.X_op = O_constant;
3343 high_expr.X_add_number = ep->X_add_number;
3344 }
3345
3346 if (high_expr.X_op == O_constant)
3347 {
3348 /* we can compute the instruction now without a relocation entry */
3349 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3350 >> 16) & 0xffff;
3351 *r = BFD_RELOC_UNUSED;
3352 }
3353 else
3354 {
3355 assert (ep->X_op == O_symbol);
3356 /* _gp_disp is a special case, used from s_cpload. */
3357 assert (mips_pic == NO_PIC
3358 || (! HAVE_NEWABI
3359 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3360 *r = BFD_RELOC_HI16_S;
3361 }
3362
3363 /*
3364 * If the macro is about to expand into a second instruction,
3365 * print a warning if needed. We need to pass ip as a parameter
3366 * to generate a better warning message here...
3367 */
3368 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
3369 as_warn (_("Macro instruction expanded into multiple instructions"));
3370
3371 if (place == NULL)
3372 ++*counter; /* bump instruction counter */
3373
3374 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3375 assert (insn.insn_mo);
3376 assert (strcmp (name, insn.insn_mo->name) == 0);
3377 assert (strcmp (fmt, insn.insn_mo->args) == 0);
3378
3379 insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3380 if (*r == BFD_RELOC_UNUSED)
3381 {
3382 insn.insn_opcode |= high_expr.X_add_number;
3383 append_insn (place, &insn, NULL, r);
3384 }
3385 else
3386 append_insn (place, &insn, &high_expr, r);
3387 }
3388
3389 /* Generate a sequence of instructions to do a load or store from a constant
3390 offset off of a base register (breg) into/from a target register (treg),
3391 using AT if necessary. */
3392 static void
3393 macro_build_ldst_constoffset (place, counter, ep, op, treg, breg)
3394 char *place;
3395 int *counter;
3396 expressionS *ep;
3397 const char *op;
3398 int treg, breg;
3399 {
3400 assert (ep->X_op == O_constant);
3401
3402 /* Right now, this routine can only handle signed 32-bit contants. */
3403 if (! IS_SEXT_32BIT_NUM(ep->X_add_number))
3404 as_warn (_("operand overflow"));
3405
3406 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3407 {
3408 /* Signed 16-bit offset will fit in the op. Easy! */
3409 macro_build (place, counter, ep, op, "t,o(b)", treg,
3410 (int) BFD_RELOC_LO16, breg);
3411 }
3412 else
3413 {
3414 /* 32-bit offset, need multiple instructions and AT, like:
3415 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3416 addu $tempreg,$tempreg,$breg
3417 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3418 to handle the complete offset. */
3419 macro_build_lui (place, counter, ep, AT);
3420 if (place != NULL)
3421 place += 4;
3422 macro_build (place, counter, (expressionS *) NULL,
3423 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3424 ? "add" : "addu" : "daddu",
3425 "d,v,t", AT, AT, breg);
3426 if (place != NULL)
3427 place += 4;
3428 macro_build (place, counter, ep, op, "t,o(b)", treg,
3429 (int) BFD_RELOC_LO16, AT);
3430
3431 if (mips_opts.noat)
3432 as_warn (_("Macro used $at after \".set noat\""));
3433 }
3434 }
3435
3436 /* set_at()
3437 * Generates code to set the $at register to true (one)
3438 * if reg is less than the immediate expression.
3439 */
3440 static void
3441 set_at (counter, reg, unsignedp)
3442 int *counter;
3443 int reg;
3444 int unsignedp;
3445 {
3446 if (imm_expr.X_op == O_constant
3447 && imm_expr.X_add_number >= -0x8000
3448 && imm_expr.X_add_number < 0x8000)
3449 macro_build ((char *) NULL, counter, &imm_expr,
3450 unsignedp ? "sltiu" : "slti",
3451 "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
3452 else
3453 {
3454 load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
3455 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3456 unsignedp ? "sltu" : "slt",
3457 "d,v,t", AT, reg, AT);
3458 }
3459 }
3460
3461 /* Warn if an expression is not a constant. */
3462
3463 static void
3464 check_absolute_expr (ip, ex)
3465 struct mips_cl_insn *ip;
3466 expressionS *ex;
3467 {
3468 if (ex->X_op == O_big)
3469 as_bad (_("unsupported large constant"));
3470 else if (ex->X_op != O_constant)
3471 as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3472 }
3473
3474 /* Count the leading zeroes by performing a binary chop. This is a
3475 bulky bit of source, but performance is a LOT better for the
3476 majority of values than a simple loop to count the bits:
3477 for (lcnt = 0; (lcnt < 32); lcnt++)
3478 if ((v) & (1 << (31 - lcnt)))
3479 break;
3480 However it is not code size friendly, and the gain will drop a bit
3481 on certain cached systems.
3482 */
3483 #define COUNT_TOP_ZEROES(v) \
3484 (((v) & ~0xffff) == 0 \
3485 ? ((v) & ~0xff) == 0 \
3486 ? ((v) & ~0xf) == 0 \
3487 ? ((v) & ~0x3) == 0 \
3488 ? ((v) & ~0x1) == 0 \
3489 ? !(v) \
3490 ? 32 \
3491 : 31 \
3492 : 30 \
3493 : ((v) & ~0x7) == 0 \
3494 ? 29 \
3495 : 28 \
3496 : ((v) & ~0x3f) == 0 \
3497 ? ((v) & ~0x1f) == 0 \
3498 ? 27 \
3499 : 26 \
3500 : ((v) & ~0x7f) == 0 \
3501 ? 25 \
3502 : 24 \
3503 : ((v) & ~0xfff) == 0 \
3504 ? ((v) & ~0x3ff) == 0 \
3505 ? ((v) & ~0x1ff) == 0 \
3506 ? 23 \
3507 : 22 \
3508 : ((v) & ~0x7ff) == 0 \
3509 ? 21 \
3510 : 20 \
3511 : ((v) & ~0x3fff) == 0 \
3512 ? ((v) & ~0x1fff) == 0 \
3513 ? 19 \
3514 : 18 \
3515 : ((v) & ~0x7fff) == 0 \
3516 ? 17 \
3517 : 16 \
3518 : ((v) & ~0xffffff) == 0 \
3519 ? ((v) & ~0xfffff) == 0 \
3520 ? ((v) & ~0x3ffff) == 0 \
3521 ? ((v) & ~0x1ffff) == 0 \
3522 ? 15 \
3523 : 14 \
3524 : ((v) & ~0x7ffff) == 0 \
3525 ? 13 \
3526 : 12 \
3527 : ((v) & ~0x3fffff) == 0 \
3528 ? ((v) & ~0x1fffff) == 0 \
3529 ? 11 \
3530 : 10 \
3531 : ((v) & ~0x7fffff) == 0 \
3532 ? 9 \
3533 : 8 \
3534 : ((v) & ~0xfffffff) == 0 \
3535 ? ((v) & ~0x3ffffff) == 0 \
3536 ? ((v) & ~0x1ffffff) == 0 \
3537 ? 7 \
3538 : 6 \
3539 : ((v) & ~0x7ffffff) == 0 \
3540 ? 5 \
3541 : 4 \
3542 : ((v) & ~0x3fffffff) == 0 \
3543 ? ((v) & ~0x1fffffff) == 0 \
3544 ? 3 \
3545 : 2 \
3546 : ((v) & ~0x7fffffff) == 0 \
3547 ? 1 \
3548 : 0)
3549
3550 /* load_register()
3551 * This routine generates the least number of instructions neccessary to load
3552 * an absolute expression value into a register.
3553 */
3554 static void
3555 load_register (counter, reg, ep, dbl)
3556 int *counter;
3557 int reg;
3558 expressionS *ep;
3559 int dbl;
3560 {
3561 int freg;
3562 expressionS hi32, lo32;
3563
3564 if (ep->X_op != O_big)
3565 {
3566 assert (ep->X_op == O_constant);
3567 if (ep->X_add_number < 0x8000
3568 && (ep->X_add_number >= 0
3569 || (ep->X_add_number >= -0x8000
3570 && (! dbl
3571 || ! ep->X_unsigned
3572 || sizeof (ep->X_add_number) > 4))))
3573 {
3574 /* We can handle 16 bit signed values with an addiu to
3575 $zero. No need to ever use daddiu here, since $zero and
3576 the result are always correct in 32 bit mode. */
3577 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3578 (int) BFD_RELOC_LO16);
3579 return;
3580 }
3581 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3582 {
3583 /* We can handle 16 bit unsigned values with an ori to
3584 $zero. */
3585 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3586 (int) BFD_RELOC_LO16);
3587 return;
3588 }
3589 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)
3590 && (! dbl
3591 || ! ep->X_unsigned
3592 || sizeof (ep->X_add_number) > 4
3593 || (ep->X_add_number & 0x80000000) == 0))
3594 || ((HAVE_32BIT_GPRS || ! dbl)
3595 && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
3596 || (HAVE_32BIT_GPRS
3597 && ! dbl
3598 && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3599 == ~ (offsetT) 0xffffffff)))
3600 {
3601 /* 32 bit values require an lui. */
3602 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3603 (int) BFD_RELOC_HI16);
3604 if ((ep->X_add_number & 0xffff) != 0)
3605 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3606 (int) BFD_RELOC_LO16);
3607 return;
3608 }
3609 }
3610
3611 /* The value is larger than 32 bits. */
3612
3613 if (HAVE_32BIT_GPRS)
3614 {
3615 as_bad (_("Number (0x%lx) larger than 32 bits"),
3616 (unsigned long) ep->X_add_number);
3617 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3618 (int) BFD_RELOC_LO16);
3619 return;
3620 }
3621
3622 if (ep->X_op != O_big)
3623 {
3624 hi32 = *ep;
3625 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3626 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3627 hi32.X_add_number &= 0xffffffff;
3628 lo32 = *ep;
3629 lo32.X_add_number &= 0xffffffff;
3630 }
3631 else
3632 {
3633 assert (ep->X_add_number > 2);
3634 if (ep->X_add_number == 3)
3635 generic_bignum[3] = 0;
3636 else if (ep->X_add_number > 4)
3637 as_bad (_("Number larger than 64 bits"));
3638 lo32.X_op = O_constant;
3639 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3640 hi32.X_op = O_constant;
3641 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3642 }
3643
3644 if (hi32.X_add_number == 0)
3645 freg = 0;
3646 else
3647 {
3648 int shift, bit;
3649 unsigned long hi, lo;
3650
3651 if (hi32.X_add_number == (offsetT) 0xffffffff)
3652 {
3653 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3654 {
3655 macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
3656 reg, 0, (int) BFD_RELOC_LO16);
3657 return;
3658 }
3659 if (lo32.X_add_number & 0x80000000)
3660 {
3661 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3662 (int) BFD_RELOC_HI16);
3663 if (lo32.X_add_number & 0xffff)
3664 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3665 reg, reg, (int) BFD_RELOC_LO16);
3666 return;
3667 }
3668 }
3669
3670 /* Check for 16bit shifted constant. We know that hi32 is
3671 non-zero, so start the mask on the first bit of the hi32
3672 value. */
3673 shift = 17;
3674 do
3675 {
3676 unsigned long himask, lomask;
3677
3678 if (shift < 32)
3679 {
3680 himask = 0xffff >> (32 - shift);
3681 lomask = (0xffff << shift) & 0xffffffff;
3682 }
3683 else
3684 {
3685 himask = 0xffff << (shift - 32);
3686 lomask = 0;
3687 }
3688 if ((hi32.X_add_number & ~(offsetT) himask) == 0
3689 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3690 {
3691 expressionS tmp;
3692
3693 tmp.X_op = O_constant;
3694 if (shift < 32)
3695 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3696 | (lo32.X_add_number >> shift));
3697 else
3698 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3699 macro_build ((char *) NULL, counter, &tmp,
3700 "ori", "t,r,i", reg, 0,
3701 (int) BFD_RELOC_LO16);
3702 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3703 (shift >= 32) ? "dsll32" : "dsll",
3704 "d,w,<", reg, reg,
3705 (shift >= 32) ? shift - 32 : shift);
3706 return;
3707 }
3708 ++shift;
3709 }
3710 while (shift <= (64 - 16));
3711
3712 /* Find the bit number of the lowest one bit, and store the
3713 shifted value in hi/lo. */
3714 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3715 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3716 if (lo != 0)
3717 {
3718 bit = 0;
3719 while ((lo & 1) == 0)
3720 {
3721 lo >>= 1;
3722 ++bit;
3723 }
3724 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3725 hi >>= bit;
3726 }
3727 else
3728 {
3729 bit = 32;
3730 while ((hi & 1) == 0)
3731 {
3732 hi >>= 1;
3733 ++bit;
3734 }
3735 lo = hi;
3736 hi = 0;
3737 }
3738
3739 /* Optimize if the shifted value is a (power of 2) - 1. */
3740 if ((hi == 0 && ((lo + 1) & lo) == 0)
3741 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3742 {
3743 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3744 if (shift != 0)
3745 {
3746 expressionS tmp;
3747
3748 /* This instruction will set the register to be all
3749 ones. */
3750 tmp.X_op = O_constant;
3751 tmp.X_add_number = (offsetT) -1;
3752 macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
3753 reg, 0, (int) BFD_RELOC_LO16);
3754 if (bit != 0)
3755 {
3756 bit += shift;
3757 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3758 (bit >= 32) ? "dsll32" : "dsll",
3759 "d,w,<", reg, reg,
3760 (bit >= 32) ? bit - 32 : bit);
3761 }
3762 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3763 (shift >= 32) ? "dsrl32" : "dsrl",
3764 "d,w,<", reg, reg,
3765 (shift >= 32) ? shift - 32 : shift);
3766 return;
3767 }
3768 }
3769
3770 /* Sign extend hi32 before calling load_register, because we can
3771 generally get better code when we load a sign extended value. */
3772 if ((hi32.X_add_number & 0x80000000) != 0)
3773 hi32.X_add_number |= ~(offsetT) 0xffffffff;
3774 load_register (counter, reg, &hi32, 0);
3775 freg = reg;
3776 }
3777 if ((lo32.X_add_number & 0xffff0000) == 0)
3778 {
3779 if (freg != 0)
3780 {
3781 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3782 "dsll32", "d,w,<", reg, freg, 0);
3783 freg = reg;
3784 }
3785 }
3786 else
3787 {
3788 expressionS mid16;
3789
3790 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3791 {
3792 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3793 (int) BFD_RELOC_HI16);
3794 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3795 "dsrl32", "d,w,<", reg, reg, 0);
3796 return;
3797 }
3798
3799 if (freg != 0)
3800 {
3801 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3802 "d,w,<", reg, freg, 16);
3803 freg = reg;
3804 }
3805 mid16 = lo32;
3806 mid16.X_add_number >>= 16;
3807 macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3808 freg, (int) BFD_RELOC_LO16);
3809 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3810 "d,w,<", reg, reg, 16);
3811 freg = reg;
3812 }
3813 if ((lo32.X_add_number & 0xffff) != 0)
3814 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3815 (int) BFD_RELOC_LO16);
3816 }
3817
3818 /* Load an address into a register. */
3819
3820 static void
3821 load_address (counter, reg, ep, used_at)
3822 int *counter;
3823 int reg;
3824 expressionS *ep;
3825 int *used_at;
3826 {
3827 char *p = NULL;
3828
3829 if (ep->X_op != O_constant
3830 && ep->X_op != O_symbol)
3831 {
3832 as_bad (_("expression too complex"));
3833 ep->X_op = O_constant;
3834 }
3835
3836 if (ep->X_op == O_constant)
3837 {
3838 load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
3839 return;
3840 }
3841
3842 if (mips_pic == NO_PIC)
3843 {
3844 /* If this is a reference to a GP relative symbol, we want
3845 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
3846 Otherwise we want
3847 lui $reg,<sym> (BFD_RELOC_HI16_S)
3848 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3849 If we have an addend, we always use the latter form.
3850
3851 With 64bit address space and a usable $at we want
3852 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3853 lui $at,<sym> (BFD_RELOC_HI16_S)
3854 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3855 daddiu $at,<sym> (BFD_RELOC_LO16)
3856 dsll32 $reg,0
3857 daddu $reg,$reg,$at
3858
3859 If $at is already in use, we use a path which is suboptimal
3860 on superscalar processors.
3861 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3862 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3863 dsll $reg,16
3864 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
3865 dsll $reg,16
3866 daddiu $reg,<sym> (BFD_RELOC_LO16)
3867 */
3868 if (HAVE_64BIT_ADDRESSES)
3869 {
3870 /* We don't do GP optimization for now because RELAX_ENCODE can't
3871 hold the data for such large chunks. */
3872
3873 if (*used_at == 0 && ! mips_opts.noat)
3874 {
3875 macro_build (p, counter, ep, "lui", "t,u",
3876 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3877 macro_build (p, counter, ep, "lui", "t,u",
3878 AT, (int) BFD_RELOC_HI16_S);
3879 macro_build (p, counter, ep, "daddiu", "t,r,j",
3880 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3881 macro_build (p, counter, ep, "daddiu", "t,r,j",
3882 AT, AT, (int) BFD_RELOC_LO16);
3883 macro_build (p, counter, (expressionS *) NULL, "dsll32",
3884 "d,w,<", reg, reg, 0);
3885 macro_build (p, counter, (expressionS *) NULL, "daddu",
3886 "d,v,t", reg, reg, AT);
3887 *used_at = 1;
3888 }
3889 else
3890 {
3891 macro_build (p, counter, ep, "lui", "t,u",
3892 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3893 macro_build (p, counter, ep, "daddiu", "t,r,j",
3894 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3895 macro_build (p, counter, (expressionS *) NULL, "dsll",
3896 "d,w,<", reg, reg, 16);
3897 macro_build (p, counter, ep, "daddiu", "t,r,j",
3898 reg, reg, (int) BFD_RELOC_HI16_S);
3899 macro_build (p, counter, (expressionS *) NULL, "dsll",
3900 "d,w,<", reg, reg, 16);
3901 macro_build (p, counter, ep, "daddiu", "t,r,j",
3902 reg, reg, (int) BFD_RELOC_LO16);
3903 }
3904 }
3905 else
3906 {
3907 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3908 && ! nopic_need_relax (ep->X_add_symbol, 1))
3909 {
3910 frag_grow (20);
3911 macro_build ((char *) NULL, counter, ep,
3912 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3913 ? "addi" : "addiu" : "daddiu", "t,r,j",
3914 reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
3915 p = frag_var (rs_machine_dependent, 8, 0,
3916 RELAX_ENCODE (4, 8, 0, 4, 0,
3917 mips_opts.warn_about_macros),
3918 ep->X_add_symbol, 0, NULL);
3919 }
3920 macro_build_lui (p, counter, ep, reg);
3921 if (p != NULL)
3922 p += 4;
3923 macro_build (p, counter, ep,
3924 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3925 ? "addi" : "addiu" : "daddiu",
3926 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3927 }
3928 }
3929 else if (mips_pic == SVR4_PIC && ! mips_big_got)
3930 {
3931 expressionS ex;
3932
3933 /* If this is a reference to an external symbol, we want
3934 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3935 Otherwise we want
3936 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3937 nop
3938 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3939 If there is a constant, it must be added in after.
3940
3941 If we have NewABI, we want
3942 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
3943 unless we're referencing a global symbol with a non-zero
3944 offset, in which case cst must be added separately. */
3945 if (HAVE_NEWABI)
3946 {
3947 frag_grow (12);
3948
3949 if (ep->X_add_number)
3950 {
3951 frag_now->tc_frag_data.tc_fr_offset =
3952 ex.X_add_number = ep->X_add_number;
3953 ep->X_add_number = 0;
3954 macro_build ((char *) NULL, counter, ep,
3955 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3956 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3957 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3958 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3959 ex.X_op = O_constant;
3960 macro_build ((char *) NULL, counter, &ex,
3961 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
3962 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3963 p = frag_var (rs_machine_dependent, 8, 0,
3964 RELAX_ENCODE (8, 4, 0, 0, 0,
3965 mips_opts.warn_about_macros),
3966 ep->X_add_symbol, 0, (char *) NULL);
3967 ep->X_add_number = ex.X_add_number;
3968 }
3969
3970 macro_build (p, counter, ep,
3971 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3972 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3973
3974 if (! p)
3975 {
3976 /* To avoid confusion in tc_gen_reloc, we must ensure
3977 that this does not become a variant frag. */
3978 frag_wane (frag_now);
3979 frag_new (0);
3980 }
3981 }
3982 else
3983 {
3984 ex.X_add_number = ep->X_add_number;
3985 ep->X_add_number = 0;
3986 frag_grow (20);
3987 macro_build ((char *) NULL, counter, ep,
3988 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
3989 reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
3990 macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3991 p = frag_var (rs_machine_dependent, 4, 0,
3992 RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3993 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3994 macro_build (p, counter, ep,
3995 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3996 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3997
3998 if (ex.X_add_number != 0)
3999 {
4000 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4001 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4002 ex.X_op = O_constant;
4003 macro_build ((char *) NULL, counter, &ex,
4004 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4005 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4006 }
4007 }
4008 }
4009 else if (mips_pic == SVR4_PIC)
4010 {
4011 expressionS ex;
4012 int off;
4013
4014 /* This is the large GOT case. If this is a reference to an
4015 external symbol, we want
4016 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4017 addu $reg,$reg,$gp
4018 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4019
4020 Otherwise, for a reference to a local symbol in old ABI, we want
4021 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4022 nop
4023 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4024 If there is a constant, it must be added in after.
4025
4026 In the NewABI, for local symbols, with or without offsets, we want:
4027 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4028 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4029 */
4030 if (HAVE_NEWABI)
4031 {
4032 frag_grow (24);
4033
4034 frag_now->tc_frag_data.tc_fr_offset =
4035 ex.X_add_number = ep->X_add_number;
4036 ep->X_add_number = 0;
4037 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
4038 (int) BFD_RELOC_MIPS_GOT_HI16);
4039 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4040 HAVE_32BIT_ADDRESSES ? "add" : "daddu", "d,v,t", reg,
4041 reg, mips_gp_register);
4042 macro_build ((char *) NULL, counter, ep,
4043 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4044 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
4045 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4046 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4047 else if (ex.X_add_number)
4048 {
4049 ex.X_op = O_constant;
4050 macro_build ((char *) NULL, counter, &ex,
4051 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
4052 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4053 }
4054
4055 ep->X_add_number = ex.X_add_number;
4056 p = frag_var (rs_machine_dependent, 8, 0,
4057 RELAX_ENCODE (ex.X_add_number ? 16 : 12, 8, 0, 4, 0,
4058 mips_opts.warn_about_macros),
4059 ep->X_add_symbol, 0, (char *) NULL);
4060 macro_build (p, counter, ep,
4061 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
4062 (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4063 macro_build (p + 4, counter, ep,
4064 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu", "t,r,j",
4065 reg, reg, (int) BFD_RELOC_MIPS_GOT_OFST);
4066 }
4067 else
4068 {
4069 ex.X_add_number = ep->X_add_number;
4070 ep->X_add_number = 0;
4071 if (reg_needs_delay (mips_gp_register))
4072 off = 4;
4073 else
4074 off = 0;
4075 frag_grow (32);
4076 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
4077 (int) BFD_RELOC_MIPS_GOT_HI16);
4078 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4079 HAVE_32BIT_ADDRESSES ? "addu" : "daddu", "d,v,t", reg,
4080 reg, mips_gp_register);
4081 macro_build ((char *) NULL, counter, ep,
4082 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4083 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
4084 p = frag_var (rs_machine_dependent, 12 + off, 0,
4085 RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
4086 mips_opts.warn_about_macros),
4087 ep->X_add_symbol, 0, NULL);
4088 if (off > 0)
4089 {
4090 /* We need a nop before loading from $gp. This special
4091 check is required because the lui which starts the main
4092 instruction stream does not refer to $gp, and so will not
4093 insert the nop which may be required. */
4094 macro_build (p, counter, (expressionS *) NULL, "nop", "");
4095 p += 4;
4096 }
4097 macro_build (p, counter, ep,
4098 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
4099 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
4100 p += 4;
4101 macro_build (p, counter, (expressionS *) NULL, "nop", "");
4102 p += 4;
4103 macro_build (p, counter, ep,
4104 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4105 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4106
4107 if (ex.X_add_number != 0)
4108 {
4109 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4110 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4111 ex.X_op = O_constant;
4112 macro_build ((char *) NULL, counter, &ex,
4113 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4114 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4115 }
4116 }
4117 }
4118 else if (mips_pic == EMBEDDED_PIC)
4119 {
4120 /* We always do
4121 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4122 */
4123 macro_build ((char *) NULL, counter, ep,
4124 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4125 "t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
4126 }
4127 else
4128 abort ();
4129 }
4130
4131 /* Move the contents of register SOURCE into register DEST. */
4132
4133 static void
4134 move_register (counter, dest, source)
4135 int *counter;
4136 int dest;
4137 int source;
4138 {
4139 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4140 HAVE_32BIT_GPRS ? "addu" : "daddu",
4141 "d,v,t", dest, source, 0);
4142 }
4143
4144 /*
4145 * Build macros
4146 * This routine implements the seemingly endless macro or synthesized
4147 * instructions and addressing modes in the mips assembly language. Many
4148 * of these macros are simple and are similar to each other. These could
4149 * probably be handled by some kind of table or grammer aproach instead of
4150 * this verbose method. Others are not simple macros but are more like
4151 * optimizing code generation.
4152 * One interesting optimization is when several store macros appear
4153 * consecutivly that would load AT with the upper half of the same address.
4154 * The ensuing load upper instructions are ommited. This implies some kind
4155 * of global optimization. We currently only optimize within a single macro.
4156 * For many of the load and store macros if the address is specified as a
4157 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4158 * first load register 'at' with zero and use it as the base register. The
4159 * mips assembler simply uses register $zero. Just one tiny optimization
4160 * we're missing.
4161 */
4162 static void
4163 macro (ip)
4164 struct mips_cl_insn *ip;
4165 {
4166 register int treg, sreg, dreg, breg;
4167 int tempreg;
4168 int mask;
4169 int icnt = 0;
4170 int used_at = 0;
4171 expressionS expr1;
4172 const char *s;
4173 const char *s2;
4174 const char *fmt;
4175 int likely = 0;
4176 int dbl = 0;
4177 int coproc = 0;
4178 int lr = 0;
4179 int imm = 0;
4180 offsetT maxnum;
4181 int off;
4182 bfd_reloc_code_real_type r;
4183 int hold_mips_optimize;
4184
4185 assert (! mips_opts.mips16);
4186
4187 treg = (ip->insn_opcode >> 16) & 0x1f;
4188 dreg = (ip->insn_opcode >> 11) & 0x1f;
4189 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4190 mask = ip->insn_mo->mask;
4191
4192 expr1.X_op = O_constant;
4193 expr1.X_op_symbol = NULL;
4194 expr1.X_add_symbol = NULL;
4195 expr1.X_add_number = 1;
4196
4197 /* Umatched fixups should not be put in the same frag as a relaxable
4198 macro. For example, suppose we have:
4199
4200 lui $4,%hi(l1) # 1
4201 la $5,l2 # 2
4202 addiu $4,$4,%lo(l1) # 3
4203
4204 If instructions 1 and 2 were put in the same frag, md_frob_file would
4205 move the fixup for #1 after the fixups for the "unrelaxed" version of
4206 #2. This would confuse tc_gen_reloc, which expects the relocations
4207 for #2 to be the last for that frag.
4208
4209 Also, if tc_gen_reloc sees certain relocations in a variant frag,
4210 it assumes that they belong to a relaxable macro. We mustn't put
4211 other uses of such relocations into a variant frag.
4212
4213 To avoid both problems, finish the current frag it contains a
4214 %reloc() operator. The macro then goes into a new frag. */
4215 if (prev_reloc_op_frag == frag_now)
4216 {
4217 frag_wane (frag_now);
4218 frag_new (0);
4219 }
4220
4221 switch (mask)
4222 {
4223 case M_DABS:
4224 dbl = 1;
4225 case M_ABS:
4226 /* bgez $a0,.+12
4227 move v0,$a0
4228 sub v0,$zero,$a0
4229 */
4230
4231 mips_emit_delays (TRUE);
4232 ++mips_opts.noreorder;
4233 mips_any_noreorder = 1;
4234
4235 expr1.X_add_number = 8;
4236 macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
4237 if (dreg == sreg)
4238 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4239 0);
4240 else
4241 move_register (&icnt, dreg, sreg);
4242 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4243 dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4244
4245 --mips_opts.noreorder;
4246 return;
4247
4248 case M_ADD_I:
4249 s = "addi";
4250 s2 = "add";
4251 goto do_addi;
4252 case M_ADDU_I:
4253 s = "addiu";
4254 s2 = "addu";
4255 goto do_addi;
4256 case M_DADD_I:
4257 dbl = 1;
4258 s = "daddi";
4259 s2 = "dadd";
4260 goto do_addi;
4261 case M_DADDU_I:
4262 dbl = 1;
4263 s = "daddiu";
4264 s2 = "daddu";
4265 do_addi:
4266 if (imm_expr.X_op == O_constant
4267 && imm_expr.X_add_number >= -0x8000
4268 && imm_expr.X_add_number < 0x8000)
4269 {
4270 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
4271 (int) BFD_RELOC_LO16);
4272 return;
4273 }
4274 load_register (&icnt, AT, &imm_expr, dbl);
4275 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4276 treg, sreg, AT);
4277 break;
4278
4279 case M_AND_I:
4280 s = "andi";
4281 s2 = "and";
4282 goto do_bit;
4283 case M_OR_I:
4284 s = "ori";
4285 s2 = "or";
4286 goto do_bit;
4287 case M_NOR_I:
4288 s = "";
4289 s2 = "nor";
4290 goto do_bit;
4291 case M_XOR_I:
4292 s = "xori";
4293 s2 = "xor";
4294 do_bit:
4295 if (imm_expr.X_op == O_constant
4296 && imm_expr.X_add_number >= 0
4297 && imm_expr.X_add_number < 0x10000)
4298 {
4299 if (mask != M_NOR_I)
4300 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
4301 sreg, (int) BFD_RELOC_LO16);
4302 else
4303 {
4304 macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
4305 treg, sreg, (int) BFD_RELOC_LO16);
4306 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nor",
4307 "d,v,t", treg, treg, 0);
4308 }
4309 return;
4310 }
4311
4312 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4313 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4314 treg, sreg, AT);
4315 break;
4316
4317 case M_BEQ_I:
4318 s = "beq";
4319 goto beq_i;
4320 case M_BEQL_I:
4321 s = "beql";
4322 likely = 1;
4323 goto beq_i;
4324 case M_BNE_I:
4325 s = "bne";
4326 goto beq_i;
4327 case M_BNEL_I:
4328 s = "bnel";
4329 likely = 1;
4330 beq_i:
4331 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4332 {
4333 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
4334 0);
4335 return;
4336 }
4337 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4338 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
4339 break;
4340
4341 case M_BGEL:
4342 likely = 1;
4343 case M_BGE:
4344 if (treg == 0)
4345 {
4346 macro_build ((char *) NULL, &icnt, &offset_expr,
4347 likely ? "bgezl" : "bgez", "s,p", sreg);
4348 return;
4349 }
4350 if (sreg == 0)
4351 {
4352 macro_build ((char *) NULL, &icnt, &offset_expr,
4353 likely ? "blezl" : "blez", "s,p", treg);
4354 return;
4355 }
4356 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4357 AT, sreg, treg);
4358 macro_build ((char *) NULL, &icnt, &offset_expr,
4359 likely ? "beql" : "beq", "s,t,p", AT, 0);
4360 break;
4361
4362 case M_BGTL_I:
4363 likely = 1;
4364 case M_BGT_I:
4365 /* check for > max integer */
4366 maxnum = 0x7fffffff;
4367 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4368 {
4369 maxnum <<= 16;
4370 maxnum |= 0xffff;
4371 maxnum <<= 16;
4372 maxnum |= 0xffff;
4373 }
4374 if (imm_expr.X_op == O_constant
4375 && imm_expr.X_add_number >= maxnum
4376 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4377 {
4378 do_false:
4379 /* result is always false */
4380 if (! likely)
4381 {
4382 if (warn_nops)
4383 as_warn (_("Branch %s is always false (nop)"),
4384 ip->insn_mo->name);
4385 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop",
4386 "", 0);
4387 }
4388 else
4389 {
4390 if (warn_nops)
4391 as_warn (_("Branch likely %s is always false"),
4392 ip->insn_mo->name);
4393 macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
4394 "s,t,p", 0, 0);
4395 }
4396 return;
4397 }
4398 if (imm_expr.X_op != O_constant)
4399 as_bad (_("Unsupported large constant"));
4400 ++imm_expr.X_add_number;
4401 /* FALLTHROUGH */
4402 case M_BGE_I:
4403 case M_BGEL_I:
4404 if (mask == M_BGEL_I)
4405 likely = 1;
4406 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4407 {
4408 macro_build ((char *) NULL, &icnt, &offset_expr,
4409 likely ? "bgezl" : "bgez", "s,p", sreg);
4410 return;
4411 }
4412 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4413 {
4414 macro_build ((char *) NULL, &icnt, &offset_expr,
4415 likely ? "bgtzl" : "bgtz", "s,p", sreg);
4416 return;
4417 }
4418 maxnum = 0x7fffffff;
4419 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4420 {
4421 maxnum <<= 16;
4422 maxnum |= 0xffff;
4423 maxnum <<= 16;
4424 maxnum |= 0xffff;
4425 }
4426 maxnum = - maxnum - 1;
4427 if (imm_expr.X_op == O_constant
4428 && imm_expr.X_add_number <= maxnum
4429 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4430 {
4431 do_true:
4432 /* result is always true */
4433 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4434 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4435 return;
4436 }
4437 set_at (&icnt, sreg, 0);
4438 macro_build ((char *) NULL, &icnt, &offset_expr,
4439 likely ? "beql" : "beq", "s,t,p", AT, 0);
4440 break;
4441
4442 case M_BGEUL:
4443 likely = 1;
4444 case M_BGEU:
4445 if (treg == 0)
4446 goto do_true;
4447 if (sreg == 0)
4448 {
4449 macro_build ((char *) NULL, &icnt, &offset_expr,
4450 likely ? "beql" : "beq", "s,t,p", 0, treg);
4451 return;
4452 }
4453 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4454 "d,v,t", AT, sreg, treg);
4455 macro_build ((char *) NULL, &icnt, &offset_expr,
4456 likely ? "beql" : "beq", "s,t,p", AT, 0);
4457 break;
4458
4459 case M_BGTUL_I:
4460 likely = 1;
4461 case M_BGTU_I:
4462 if (sreg == 0
4463 || (HAVE_32BIT_GPRS
4464 && imm_expr.X_op == O_constant
4465 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4466 goto do_false;
4467 if (imm_expr.X_op != O_constant)
4468 as_bad (_("Unsupported large constant"));
4469 ++imm_expr.X_add_number;
4470 /* FALLTHROUGH */
4471 case M_BGEU_I:
4472 case M_BGEUL_I:
4473 if (mask == M_BGEUL_I)
4474 likely = 1;
4475 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4476 goto do_true;
4477 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4478 {
4479 macro_build ((char *) NULL, &icnt, &offset_expr,
4480 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4481 return;
4482 }
4483 set_at (&icnt, sreg, 1);
4484 macro_build ((char *) NULL, &icnt, &offset_expr,
4485 likely ? "beql" : "beq", "s,t,p", AT, 0);
4486 break;
4487
4488 case M_BGTL:
4489 likely = 1;
4490 case M_BGT:
4491 if (treg == 0)
4492 {
4493 macro_build ((char *) NULL, &icnt, &offset_expr,
4494 likely ? "bgtzl" : "bgtz", "s,p", sreg);
4495 return;
4496 }
4497 if (sreg == 0)
4498 {
4499 macro_build ((char *) NULL, &icnt, &offset_expr,
4500 likely ? "bltzl" : "bltz", "s,p", treg);
4501 return;
4502 }
4503 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4504 AT, treg, sreg);
4505 macro_build ((char *) NULL, &icnt, &offset_expr,
4506 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4507 break;
4508
4509 case M_BGTUL:
4510 likely = 1;
4511 case M_BGTU:
4512 if (treg == 0)
4513 {
4514 macro_build ((char *) NULL, &icnt, &offset_expr,
4515 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4516 return;
4517 }
4518 if (sreg == 0)
4519 goto do_false;
4520 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4521 "d,v,t", AT, treg, sreg);
4522 macro_build ((char *) NULL, &icnt, &offset_expr,
4523 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4524 break;
4525
4526 case M_BLEL:
4527 likely = 1;
4528 case M_BLE:
4529 if (treg == 0)
4530 {
4531 macro_build ((char *) NULL, &icnt, &offset_expr,
4532 likely ? "blezl" : "blez", "s,p", sreg);
4533 return;
4534 }
4535 if (sreg == 0)
4536 {
4537 macro_build ((char *) NULL, &icnt, &offset_expr,
4538 likely ? "bgezl" : "bgez", "s,p", treg);
4539 return;
4540 }
4541 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4542 AT, treg, sreg);
4543 macro_build ((char *) NULL, &icnt, &offset_expr,
4544 likely ? "beql" : "beq", "s,t,p", AT, 0);
4545 break;
4546
4547 case M_BLEL_I:
4548 likely = 1;
4549 case M_BLE_I:
4550 maxnum = 0x7fffffff;
4551 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4552 {
4553 maxnum <<= 16;
4554 maxnum |= 0xffff;
4555 maxnum <<= 16;
4556 maxnum |= 0xffff;
4557 }
4558 if (imm_expr.X_op == O_constant
4559 && imm_expr.X_add_number >= maxnum
4560 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4561 goto do_true;
4562 if (imm_expr.X_op != O_constant)
4563 as_bad (_("Unsupported large constant"));
4564 ++imm_expr.X_add_number;
4565 /* FALLTHROUGH */
4566 case M_BLT_I:
4567 case M_BLTL_I:
4568 if (mask == M_BLTL_I)
4569 likely = 1;
4570 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4571 {
4572 macro_build ((char *) NULL, &icnt, &offset_expr,
4573 likely ? "bltzl" : "bltz", "s,p", sreg);
4574 return;
4575 }
4576 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4577 {
4578 macro_build ((char *) NULL, &icnt, &offset_expr,
4579 likely ? "blezl" : "blez", "s,p", sreg);
4580 return;
4581 }
4582 set_at (&icnt, sreg, 0);
4583 macro_build ((char *) NULL, &icnt, &offset_expr,
4584 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4585 break;
4586
4587 case M_BLEUL:
4588 likely = 1;
4589 case M_BLEU:
4590 if (treg == 0)
4591 {
4592 macro_build ((char *) NULL, &icnt, &offset_expr,
4593 likely ? "beql" : "beq", "s,t,p", sreg, 0);
4594 return;
4595 }
4596 if (sreg == 0)
4597 goto do_true;
4598 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4599 "d,v,t", AT, treg, sreg);
4600 macro_build ((char *) NULL, &icnt, &offset_expr,
4601 likely ? "beql" : "beq", "s,t,p", AT, 0);
4602 break;
4603
4604 case M_BLEUL_I:
4605 likely = 1;
4606 case M_BLEU_I:
4607 if (sreg == 0
4608 || (HAVE_32BIT_GPRS
4609 && imm_expr.X_op == O_constant
4610 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4611 goto do_true;
4612 if (imm_expr.X_op != O_constant)
4613 as_bad (_("Unsupported large constant"));
4614 ++imm_expr.X_add_number;
4615 /* FALLTHROUGH */
4616 case M_BLTU_I:
4617 case M_BLTUL_I:
4618 if (mask == M_BLTUL_I)
4619 likely = 1;
4620 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4621 goto do_false;
4622 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4623 {
4624 macro_build ((char *) NULL, &icnt, &offset_expr,
4625 likely ? "beql" : "beq",
4626 "s,t,p", sreg, 0);
4627 return;
4628 }
4629 set_at (&icnt, sreg, 1);
4630 macro_build ((char *) NULL, &icnt, &offset_expr,
4631 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4632 break;
4633
4634 case M_BLTL:
4635 likely = 1;
4636 case M_BLT:
4637 if (treg == 0)
4638 {
4639 macro_build ((char *) NULL, &icnt, &offset_expr,
4640 likely ? "bltzl" : "bltz", "s,p", sreg);
4641 return;
4642 }
4643 if (sreg == 0)
4644 {
4645 macro_build ((char *) NULL, &icnt, &offset_expr,
4646 likely ? "bgtzl" : "bgtz", "s,p", treg);
4647 return;
4648 }
4649 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4650 AT, sreg, treg);
4651 macro_build ((char *) NULL, &icnt, &offset_expr,
4652 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4653 break;
4654
4655 case M_BLTUL:
4656 likely = 1;
4657 case M_BLTU:
4658 if (treg == 0)
4659 goto do_false;
4660 if (sreg == 0)
4661 {
4662 macro_build ((char *) NULL, &icnt, &offset_expr,
4663 likely ? "bnel" : "bne", "s,t,p", 0, treg);
4664 return;
4665 }
4666 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4667 "d,v,t", AT, sreg,
4668 treg);
4669 macro_build ((char *) NULL, &icnt, &offset_expr,
4670 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4671 break;
4672
4673 case M_DDIV_3:
4674 dbl = 1;
4675 case M_DIV_3:
4676 s = "mflo";
4677 goto do_div3;
4678 case M_DREM_3:
4679 dbl = 1;
4680 case M_REM_3:
4681 s = "mfhi";
4682 do_div3:
4683 if (treg == 0)
4684 {
4685 as_warn (_("Divide by zero."));
4686 if (mips_trap)
4687 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4688 "s,t,q", 0, 0, 7);
4689 else
4690 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4691 "c", 7);
4692 return;
4693 }
4694
4695 mips_emit_delays (TRUE);
4696 ++mips_opts.noreorder;
4697 mips_any_noreorder = 1;
4698 if (mips_trap)
4699 {
4700 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4701 "s,t,q", treg, 0, 7);
4702 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4703 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4704 }
4705 else
4706 {
4707 expr1.X_add_number = 8;
4708 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4709 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4710 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4711 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4712 "c", 7);
4713 }
4714 expr1.X_add_number = -1;
4715 macro_build ((char *) NULL, &icnt, &expr1,
4716 dbl ? "daddiu" : "addiu",
4717 "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4718 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4719 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4720 if (dbl)
4721 {
4722 expr1.X_add_number = 1;
4723 macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4724 (int) BFD_RELOC_LO16);
4725 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsll32",
4726 "d,w,<", AT, AT, 31);
4727 }
4728 else
4729 {
4730 expr1.X_add_number = 0x80000000;
4731 macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4732 (int) BFD_RELOC_HI16);
4733 }
4734 if (mips_trap)
4735 {
4736 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4737 "s,t,q", sreg, AT, 6);
4738 /* We want to close the noreorder block as soon as possible, so
4739 that later insns are available for delay slot filling. */
4740 --mips_opts.noreorder;
4741 }
4742 else
4743 {
4744 expr1.X_add_number = 8;
4745 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
4746 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4747 0);
4748
4749 /* We want to close the noreorder block as soon as possible, so
4750 that later insns are available for delay slot filling. */
4751 --mips_opts.noreorder;
4752
4753 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4754 "c", 6);
4755 }
4756 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d", dreg);
4757 break;
4758
4759 case M_DIV_3I:
4760 s = "div";
4761 s2 = "mflo";
4762 goto do_divi;
4763 case M_DIVU_3I:
4764 s = "divu";
4765 s2 = "mflo";
4766 goto do_divi;
4767 case M_REM_3I:
4768 s = "div";
4769 s2 = "mfhi";
4770 goto do_divi;
4771 case M_REMU_3I:
4772 s = "divu";
4773 s2 = "mfhi";
4774 goto do_divi;
4775 case M_DDIV_3I:
4776 dbl = 1;
4777 s = "ddiv";
4778 s2 = "mflo";
4779 goto do_divi;
4780 case M_DDIVU_3I:
4781 dbl = 1;
4782 s = "ddivu";
4783 s2 = "mflo";
4784 goto do_divi;
4785 case M_DREM_3I:
4786 dbl = 1;
4787 s = "ddiv";
4788 s2 = "mfhi";
4789 goto do_divi;
4790 case M_DREMU_3I:
4791 dbl = 1;
4792 s = "ddivu";
4793 s2 = "mfhi";
4794 do_divi:
4795 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4796 {
4797 as_warn (_("Divide by zero."));
4798 if (mips_trap)
4799 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4800 "s,t,q", 0, 0, 7);
4801 else
4802 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4803 "c", 7);
4804 return;
4805 }
4806 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4807 {
4808 if (strcmp (s2, "mflo") == 0)
4809 move_register (&icnt, dreg, sreg);
4810 else
4811 move_register (&icnt, dreg, 0);
4812 return;
4813 }
4814 if (imm_expr.X_op == O_constant
4815 && imm_expr.X_add_number == -1
4816 && s[strlen (s) - 1] != 'u')
4817 {
4818 if (strcmp (s2, "mflo") == 0)
4819 {
4820 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4821 dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4822 }
4823 else
4824 move_register (&icnt, dreg, 0);
4825 return;
4826 }
4827
4828 load_register (&icnt, AT, &imm_expr, dbl);
4829 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4830 sreg, AT);
4831 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4832 break;
4833
4834 case M_DIVU_3:
4835 s = "divu";
4836 s2 = "mflo";
4837 goto do_divu3;
4838 case M_REMU_3:
4839 s = "divu";
4840 s2 = "mfhi";
4841 goto do_divu3;
4842 case M_DDIVU_3:
4843 s = "ddivu";
4844 s2 = "mflo";
4845 goto do_divu3;
4846 case M_DREMU_3:
4847 s = "ddivu";
4848 s2 = "mfhi";
4849 do_divu3:
4850 mips_emit_delays (TRUE);
4851 ++mips_opts.noreorder;
4852 mips_any_noreorder = 1;
4853 if (mips_trap)
4854 {
4855 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4856 "s,t,q", treg, 0, 7);
4857 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4858 sreg, treg);
4859 /* We want to close the noreorder block as soon as possible, so
4860 that later insns are available for delay slot filling. */
4861 --mips_opts.noreorder;
4862 }
4863 else
4864 {
4865 expr1.X_add_number = 8;
4866 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4867 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4868 sreg, treg);
4869
4870 /* We want to close the noreorder block as soon as possible, so
4871 that later insns are available for delay slot filling. */
4872 --mips_opts.noreorder;
4873 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4874 "c", 7);
4875 }
4876 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4877 return;
4878
4879 case M_DLA_AB:
4880 dbl = 1;
4881 case M_LA_AB:
4882 /* Load the address of a symbol into a register. If breg is not
4883 zero, we then add a base register to it. */
4884
4885 if (dbl && HAVE_32BIT_GPRS)
4886 as_warn (_("dla used to load 32-bit register"));
4887
4888 if (! dbl && HAVE_64BIT_OBJECTS)
4889 as_warn (_("la used to load 64-bit address"));
4890
4891 if (offset_expr.X_op == O_constant
4892 && offset_expr.X_add_number >= -0x8000
4893 && offset_expr.X_add_number < 0x8000)
4894 {
4895 macro_build ((char *) NULL, &icnt, &offset_expr,
4896 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" :
4897 HAVE_NEWABI ? "addi" : "addiu",
4898 "t,r,j", treg, sreg, (int) BFD_RELOC_LO16);
4899 return;
4900 }
4901
4902 if (treg == breg)
4903 {
4904 tempreg = AT;
4905 used_at = 1;
4906 }
4907 else
4908 {
4909 tempreg = treg;
4910 used_at = 0;
4911 }
4912
4913 /* When generating embedded PIC code, we permit expressions of
4914 the form
4915 la $treg,foo-bar
4916 la $treg,foo-bar($breg)
4917 where bar is an address in the current section. These are used
4918 when getting the addresses of functions. We don't permit
4919 X_add_number to be non-zero, because if the symbol is
4920 external the relaxing code needs to know that any addend is
4921 purely the offset to X_op_symbol. */
4922 if (mips_pic == EMBEDDED_PIC
4923 && offset_expr.X_op == O_subtract
4924 && (symbol_constant_p (offset_expr.X_op_symbol)
4925 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4926 : (symbol_equated_p (offset_expr.X_op_symbol)
4927 && (S_GET_SEGMENT
4928 (symbol_get_value_expression (offset_expr.X_op_symbol)
4929 ->X_add_symbol)
4930 == now_seg)))
4931 && (offset_expr.X_add_number == 0
4932 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4933 {
4934 if (breg == 0)
4935 {
4936 tempreg = treg;
4937 used_at = 0;
4938 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4939 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4940 }
4941 else
4942 {
4943 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4944 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4945 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4946 (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4947 "d,v,t", tempreg, tempreg, breg);
4948 }
4949 macro_build ((char *) NULL, &icnt, &offset_expr,
4950 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4951 "t,r,j", treg, tempreg, (int) BFD_RELOC_PCREL_LO16);
4952 if (! used_at)
4953 return;
4954 break;
4955 }
4956
4957 if (offset_expr.X_op != O_symbol
4958 && offset_expr.X_op != O_constant)
4959 {
4960 as_bad (_("expression too complex"));
4961 offset_expr.X_op = O_constant;
4962 }
4963
4964 if (offset_expr.X_op == O_constant)
4965 load_register (&icnt, tempreg, &offset_expr,
4966 ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4967 ? (dbl || HAVE_64BIT_ADDRESSES)
4968 : HAVE_64BIT_ADDRESSES));
4969 else if (mips_pic == NO_PIC)
4970 {
4971 /* If this is a reference to a GP relative symbol, we want
4972 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
4973 Otherwise we want
4974 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4975 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4976 If we have a constant, we need two instructions anyhow,
4977 so we may as well always use the latter form.
4978
4979 With 64bit address space and a usable $at we want
4980 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4981 lui $at,<sym> (BFD_RELOC_HI16_S)
4982 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4983 daddiu $at,<sym> (BFD_RELOC_LO16)
4984 dsll32 $tempreg,0
4985 daddu $tempreg,$tempreg,$at
4986
4987 If $at is already in use, we use a path which is suboptimal
4988 on superscalar processors.
4989 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4990 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4991 dsll $tempreg,16
4992 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
4993 dsll $tempreg,16
4994 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
4995 */
4996 char *p = NULL;
4997 if (HAVE_64BIT_ADDRESSES)
4998 {
4999 /* We don't do GP optimization for now because RELAX_ENCODE can't
5000 hold the data for such large chunks. */
5001
5002 if (used_at == 0 && ! mips_opts.noat)
5003 {
5004 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5005 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5006 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5007 AT, (int) BFD_RELOC_HI16_S);
5008 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5009 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5010 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5011 AT, AT, (int) BFD_RELOC_LO16);
5012 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
5013 "d,w,<", tempreg, tempreg, 0);
5014 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5015 "d,v,t", tempreg, tempreg, AT);
5016 used_at = 1;
5017 }
5018 else
5019 {
5020 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5021 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5022 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5023 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5024 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
5025 tempreg, tempreg, 16);
5026 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5027 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
5028 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
5029 tempreg, tempreg, 16);
5030 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5031 tempreg, tempreg, (int) BFD_RELOC_LO16);
5032 }
5033 }
5034 else
5035 {
5036 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5037 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
5038 {
5039 frag_grow (20);
5040 macro_build ((char *) NULL, &icnt, &offset_expr,
5041 HAVE_NEWABI ? "addi" : "addiu",
5042 "t,r,j", tempreg, mips_gp_register,
5043 (int) BFD_RELOC_GPREL16);
5044 p = frag_var (rs_machine_dependent, 8, 0,
5045 RELAX_ENCODE (4, 8, 0, 4, 0,
5046 mips_opts.warn_about_macros),
5047 offset_expr.X_add_symbol, 0, NULL);
5048 }
5049 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5050 if (p != NULL)
5051 p += 4;
5052 macro_build (p, &icnt, &offset_expr,
5053 HAVE_NEWABI ? "addi" : "addiu",
5054 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5055 }
5056 }
5057 else if (mips_pic == SVR4_PIC && ! mips_big_got && ! HAVE_NEWABI)
5058 {
5059 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5060
5061 /* If this is a reference to an external symbol, and there
5062 is no constant, we want
5063 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5064 or if tempreg is PIC_CALL_REG
5065 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5066 For a local symbol, we want
5067 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5068 nop
5069 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5070
5071 If we have a small constant, and this is a reference to
5072 an external symbol, we want
5073 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5074 nop
5075 addiu $tempreg,$tempreg,<constant>
5076 For a local symbol, we want the same instruction
5077 sequence, but we output a BFD_RELOC_LO16 reloc on the
5078 addiu instruction.
5079
5080 If we have a large constant, and this is a reference to
5081 an external symbol, we want
5082 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5083 lui $at,<hiconstant>
5084 addiu $at,$at,<loconstant>
5085 addu $tempreg,$tempreg,$at
5086 For a local symbol, we want the same instruction
5087 sequence, but we output a BFD_RELOC_LO16 reloc on the
5088 addiu instruction.
5089 */
5090
5091 expr1.X_add_number = offset_expr.X_add_number;
5092 offset_expr.X_add_number = 0;
5093 frag_grow (32);
5094 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5095 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5096 macro_build ((char *) NULL, &icnt, &offset_expr,
5097 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5098 "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
5099 if (expr1.X_add_number == 0)
5100 {
5101 int off;
5102 char *p;
5103
5104 if (breg == 0)
5105 off = 0;
5106 else
5107 {
5108 /* We're going to put in an addu instruction using
5109 tempreg, so we may as well insert the nop right
5110 now. */
5111 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5112 "nop", "");
5113 off = 4;
5114 }
5115 p = frag_var (rs_machine_dependent, 8 - off, 0,
5116 RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
5117 (breg == 0
5118 ? mips_opts.warn_about_macros
5119 : 0)),
5120 offset_expr.X_add_symbol, 0, NULL);
5121 if (breg == 0)
5122 {
5123 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5124 p += 4;
5125 }
5126 macro_build (p, &icnt, &expr1,
5127 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5128 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5129 /* FIXME: If breg == 0, and the next instruction uses
5130 $tempreg, then if this variant case is used an extra
5131 nop will be generated. */
5132 }
5133 else if (expr1.X_add_number >= -0x8000
5134 && expr1.X_add_number < 0x8000)
5135 {
5136 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5137 "nop", "");
5138 macro_build ((char *) NULL, &icnt, &expr1,
5139 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5140 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5141 frag_var (rs_machine_dependent, 0, 0,
5142 RELAX_ENCODE (0, 0, -12, -4, 0, 0),
5143 offset_expr.X_add_symbol, 0, NULL);
5144 }
5145 else
5146 {
5147 int off1;
5148
5149 /* If we are going to add in a base register, and the
5150 target register and the base register are the same,
5151 then we are using AT as a temporary register. Since
5152 we want to load the constant into AT, we add our
5153 current AT (from the global offset table) and the
5154 register into the register now, and pretend we were
5155 not using a base register. */
5156 if (breg != treg)
5157 off1 = 0;
5158 else
5159 {
5160 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5161 "nop", "");
5162 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5163 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5164 "d,v,t", treg, AT, breg);
5165 breg = 0;
5166 tempreg = treg;
5167 off1 = -8;
5168 }
5169
5170 /* Set mips_optimize around the lui instruction to avoid
5171 inserting an unnecessary nop after the lw. */
5172 hold_mips_optimize = mips_optimize;
5173 mips_optimize = 2;
5174 macro_build_lui (NULL, &icnt, &expr1, AT);
5175 mips_optimize = hold_mips_optimize;
5176
5177 macro_build ((char *) NULL, &icnt, &expr1,
5178 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5179 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5180 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5181 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5182 "d,v,t", tempreg, tempreg, AT);
5183 frag_var (rs_machine_dependent, 0, 0,
5184 RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
5185 offset_expr.X_add_symbol, 0, NULL);
5186 used_at = 1;
5187 }
5188 }
5189 else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
5190 {
5191 char *p = NULL;
5192 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
5193 int adj = 0;
5194
5195 /* If this is a reference to an external, and there is no
5196 constant, or local symbol (*), with or without a
5197 constant, we want
5198 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5199 or if tempreg is PIC_CALL_REG
5200 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5201
5202 If we have a small constant, and this is a reference to
5203 an external symbol, we want
5204 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5205 addiu $tempreg,$tempreg,<constant>
5206
5207 If we have a large constant, and this is a reference to
5208 an external symbol, we want
5209 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5210 lui $at,<hiconstant>
5211 addiu $at,$at,<loconstant>
5212 addu $tempreg,$tempreg,$at
5213
5214 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5215 local symbols, even though it introduces an additional
5216 instruction. */
5217
5218 frag_grow (28);
5219 if (offset_expr.X_add_number == 0 && tempreg == PIC_CALL_REG)
5220 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5221 if (offset_expr.X_add_number)
5222 {
5223 frag_now->tc_frag_data.tc_fr_offset =
5224 expr1.X_add_number = offset_expr.X_add_number;
5225 offset_expr.X_add_number = 0;
5226
5227 macro_build ((char *) NULL, &icnt, &offset_expr,
5228 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5229 "t,o(b)", tempreg, lw_reloc_type,
5230 mips_gp_register);
5231
5232 if (expr1.X_add_number >= -0x8000
5233 && expr1.X_add_number < 0x8000)
5234 {
5235 macro_build ((char *) NULL, &icnt, &expr1,
5236 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5237 "t,r,j", tempreg, tempreg,
5238 (int) BFD_RELOC_LO16);
5239 p = frag_var (rs_machine_dependent, 4, 0,
5240 RELAX_ENCODE (8, 4, 0, 0, 0, 0),
5241 offset_expr.X_add_symbol, 0, NULL);
5242 }
5243 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number))
5244 {
5245 int dreg;
5246
5247 /* If we are going to add in a base register, and the
5248 target register and the base register are the same,
5249 then we are using AT as a temporary register. Since
5250 we want to load the constant into AT, we add our
5251 current AT (from the global offset table) and the
5252 register into the register now, and pretend we were
5253 not using a base register. */
5254 if (breg != treg)
5255 dreg = tempreg;
5256 else
5257 {
5258 assert (tempreg == AT);
5259 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5260 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5261 "d,v,t", treg, AT, breg);
5262 dreg = treg;
5263 adj = 4;
5264 }
5265
5266 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
5267 macro_build ((char *) NULL, &icnt, &expr1,
5268 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5269 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5270 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5271 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5272 "d,v,t", dreg, dreg, AT);
5273
5274 p = frag_var (rs_machine_dependent, 4 + adj, 0,
5275 RELAX_ENCODE (16 + adj, 4 + adj,
5276 0, 0, 0, 0),
5277 offset_expr.X_add_symbol, 0, NULL);
5278
5279 used_at = 1;
5280 }
5281 else
5282 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5283
5284 offset_expr.X_add_number = expr1.X_add_number;
5285
5286 macro_build (p, &icnt, &offset_expr,
5287 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5288 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_DISP,
5289 mips_gp_register);
5290 if (adj)
5291 {
5292 macro_build (p + 4, &icnt, (expressionS *) NULL,
5293 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5294 "d,v,t", treg, tempreg, breg);
5295 breg = 0;
5296 tempreg = treg;
5297 }
5298 }
5299 else
5300 {
5301 macro_build ((char *) NULL, &icnt, &offset_expr,
5302 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5303 "t,o(b)", tempreg, lw_reloc_type,
5304 mips_gp_register);
5305 if (lw_reloc_type != BFD_RELOC_MIPS_GOT_DISP)
5306 p = frag_var (rs_machine_dependent, 0, 0,
5307 RELAX_ENCODE (0, 0, -4, 0, 0, 0),
5308 offset_expr.X_add_symbol, 0, NULL);
5309 }
5310
5311 if (! p)
5312 {
5313 /* To avoid confusion in tc_gen_reloc, we must ensure
5314 that this does not become a variant frag. */
5315 frag_wane (frag_now);
5316 frag_new (0);
5317 }
5318 }
5319 else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
5320 {
5321 int gpdel;
5322 char *p;
5323 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5324 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5325 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5326
5327 /* This is the large GOT case. If this is a reference to an
5328 external symbol, and there is no constant, we want
5329 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5330 addu $tempreg,$tempreg,$gp
5331 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5332 or if tempreg is PIC_CALL_REG
5333 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5334 addu $tempreg,$tempreg,$gp
5335 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5336 For a local symbol, we want
5337 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5338 nop
5339 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5340
5341 If we have a small constant, and this is a reference to
5342 an external symbol, we want
5343 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5344 addu $tempreg,$tempreg,$gp
5345 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5346 nop
5347 addiu $tempreg,$tempreg,<constant>
5348 For a local symbol, we want
5349 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5350 nop
5351 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5352
5353 If we have a large constant, and this is a reference to
5354 an external symbol, we want
5355 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5356 addu $tempreg,$tempreg,$gp
5357 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5358 lui $at,<hiconstant>
5359 addiu $at,$at,<loconstant>
5360 addu $tempreg,$tempreg,$at
5361 For a local symbol, we want
5362 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5363 lui $at,<hiconstant>
5364 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5365 addu $tempreg,$tempreg,$at
5366 */
5367
5368 expr1.X_add_number = offset_expr.X_add_number;
5369 offset_expr.X_add_number = 0;
5370 frag_grow (52);
5371 if (reg_needs_delay (mips_gp_register))
5372 gpdel = 4;
5373 else
5374 gpdel = 0;
5375 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5376 {
5377 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5378 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5379 }
5380 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5381 tempreg, lui_reloc_type);
5382 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5383 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5384 "d,v,t", tempreg, tempreg, mips_gp_register);
5385 macro_build ((char *) NULL, &icnt, &offset_expr,
5386 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5387 "t,o(b)", tempreg, lw_reloc_type, tempreg);
5388 if (expr1.X_add_number == 0)
5389 {
5390 int off;
5391
5392 if (breg == 0)
5393 off = 0;
5394 else
5395 {
5396 /* We're going to put in an addu instruction using
5397 tempreg, so we may as well insert the nop right
5398 now. */
5399 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5400 "nop", "");
5401 off = 4;
5402 }
5403
5404 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5405 RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
5406 8 + gpdel, 0,
5407 (breg == 0
5408 ? mips_opts.warn_about_macros
5409 : 0)),
5410 offset_expr.X_add_symbol, 0, NULL);
5411 }
5412 else if (expr1.X_add_number >= -0x8000
5413 && expr1.X_add_number < 0x8000)
5414 {
5415 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5416 "nop", "");
5417 macro_build ((char *) NULL, &icnt, &expr1,
5418 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5419 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5420
5421 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5422 RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
5423 (breg == 0
5424 ? mips_opts.warn_about_macros
5425 : 0)),
5426 offset_expr.X_add_symbol, 0, NULL);
5427 }
5428 else
5429 {
5430 int adj, dreg;
5431
5432 /* If we are going to add in a base register, and the
5433 target register and the base register are the same,
5434 then we are using AT as a temporary register. Since
5435 we want to load the constant into AT, we add our
5436 current AT (from the global offset table) and the
5437 register into the register now, and pretend we were
5438 not using a base register. */
5439 if (breg != treg)
5440 {
5441 adj = 0;
5442 dreg = tempreg;
5443 }
5444 else
5445 {
5446 assert (tempreg == AT);
5447 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5448 "nop", "");
5449 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5450 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5451 "d,v,t", treg, AT, breg);
5452 dreg = treg;
5453 adj = 8;
5454 }
5455
5456 /* Set mips_optimize around the lui instruction to avoid
5457 inserting an unnecessary nop after the lw. */
5458 hold_mips_optimize = mips_optimize;
5459 mips_optimize = 2;
5460 macro_build_lui (NULL, &icnt, &expr1, AT);
5461 mips_optimize = hold_mips_optimize;
5462
5463 macro_build ((char *) NULL, &icnt, &expr1,
5464 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5465 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5466 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5467 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5468 "d,v,t", dreg, dreg, AT);
5469
5470 p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
5471 RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
5472 8 + gpdel, 0,
5473 (breg == 0
5474 ? mips_opts.warn_about_macros
5475 : 0)),
5476 offset_expr.X_add_symbol, 0, NULL);
5477
5478 used_at = 1;
5479 }
5480
5481 if (gpdel > 0)
5482 {
5483 /* This is needed because this instruction uses $gp, but
5484 the first instruction on the main stream does not. */
5485 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5486 p += 4;
5487 }
5488
5489 macro_build (p, &icnt, &offset_expr,
5490 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5491 "t,o(b)", tempreg,
5492 local_reloc_type,
5493 mips_gp_register);
5494 p += 4;
5495 if (expr1.X_add_number >= -0x8000
5496 && expr1.X_add_number < 0x8000)
5497 {
5498 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5499 p += 4;
5500 macro_build (p, &icnt, &expr1,
5501 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5502 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5503 /* FIXME: If add_number is 0, and there was no base
5504 register, the external symbol case ended with a load,
5505 so if the symbol turns out to not be external, and
5506 the next instruction uses tempreg, an unnecessary nop
5507 will be inserted. */
5508 }
5509 else
5510 {
5511 if (breg == treg)
5512 {
5513 /* We must add in the base register now, as in the
5514 external symbol case. */
5515 assert (tempreg == AT);
5516 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5517 p += 4;
5518 macro_build (p, &icnt, (expressionS *) NULL,
5519 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5520 "d,v,t", treg, AT, breg);
5521 p += 4;
5522 tempreg = treg;
5523 /* We set breg to 0 because we have arranged to add
5524 it in in both cases. */
5525 breg = 0;
5526 }
5527
5528 macro_build_lui (p, &icnt, &expr1, AT);
5529 p += 4;
5530 macro_build (p, &icnt, &expr1,
5531 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5532 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5533 p += 4;
5534 macro_build (p, &icnt, (expressionS *) NULL,
5535 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5536 "d,v,t", tempreg, tempreg, AT);
5537 p += 4;
5538 }
5539 }
5540 else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
5541 {
5542 char *p = NULL;
5543 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5544 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5545 int adj = 0;
5546
5547 /* This is the large GOT case. If this is a reference to an
5548 external symbol, and there is no constant, we want
5549 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5550 add $tempreg,$tempreg,$gp
5551 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5552 or if tempreg is PIC_CALL_REG
5553 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5554 add $tempreg,$tempreg,$gp
5555 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5556
5557 If we have a small constant, and this is a reference to
5558 an external symbol, we want
5559 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5560 add $tempreg,$tempreg,$gp
5561 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5562 addi $tempreg,$tempreg,<constant>
5563
5564 If we have a large constant, and this is a reference to
5565 an external symbol, we want
5566 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5567 addu $tempreg,$tempreg,$gp
5568 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5569 lui $at,<hiconstant>
5570 addi $at,$at,<loconstant>
5571 add $tempreg,$tempreg,$at
5572
5573 If we have NewABI, and we know it's a local symbol, we want
5574 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5575 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5576 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5577
5578 frag_grow (40);
5579
5580 frag_now->tc_frag_data.tc_fr_offset =
5581 expr1.X_add_number = offset_expr.X_add_number;
5582 offset_expr.X_add_number = 0;
5583
5584 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5585 {
5586 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5587 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5588 }
5589 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5590 tempreg, lui_reloc_type);
5591 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5592 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5593 "d,v,t", tempreg, tempreg, mips_gp_register);
5594 macro_build ((char *) NULL, &icnt, &offset_expr,
5595 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5596 "t,o(b)", tempreg, lw_reloc_type, tempreg);
5597
5598 if (expr1.X_add_number == 0)
5599 {
5600 p = frag_var (rs_machine_dependent, 8, 0,
5601 RELAX_ENCODE (12, 8, 0, 4, 0,
5602 mips_opts.warn_about_macros),
5603 offset_expr.X_add_symbol, 0, NULL);
5604 }
5605 else if (expr1.X_add_number >= -0x8000
5606 && expr1.X_add_number < 0x8000)
5607 {
5608 macro_build ((char *) NULL, &icnt, &expr1,
5609 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5610 "t,r,j", tempreg, tempreg,
5611 (int) BFD_RELOC_LO16);
5612 p = frag_var (rs_machine_dependent, 8, 0,
5613 RELAX_ENCODE (16, 8, 0, 4, 0,
5614 mips_opts.warn_about_macros),
5615 offset_expr.X_add_symbol, 0, NULL);
5616 }
5617 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number))
5618 {
5619 int dreg;
5620
5621 /* If we are going to add in a base register, and the
5622 target register and the base register are the same,
5623 then we are using AT as a temporary register. Since
5624 we want to load the constant into AT, we add our
5625 current AT (from the global offset table) and the
5626 register into the register now, and pretend we were
5627 not using a base register. */
5628 if (breg != treg)
5629 dreg = tempreg;
5630 else
5631 {
5632 assert (tempreg == AT);
5633 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5634 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5635 "d,v,t", treg, AT, breg);
5636 dreg = treg;
5637 adj = 4;
5638 }
5639
5640 /* Set mips_optimize around the lui instruction to avoid
5641 inserting an unnecessary nop after the lw. */
5642 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
5643 macro_build ((char *) NULL, &icnt, &expr1,
5644 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5645 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5646 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5647 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5648 "d,v,t", dreg, dreg, AT);
5649
5650 p = frag_var (rs_machine_dependent, 8 + adj, 0,
5651 RELAX_ENCODE (24 + adj, 8 + adj,
5652 0, 4, 0,
5653 (breg == 0
5654 ? mips_opts.warn_about_macros
5655 : 0)),
5656 offset_expr.X_add_symbol, 0, NULL);
5657
5658 used_at = 1;
5659 }
5660 else
5661 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5662
5663 offset_expr.X_add_number = expr1.X_add_number;
5664 macro_build (p, &icnt, &offset_expr,
5665 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5666 tempreg,
5667 (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5668 macro_build (p + 4, &icnt, &offset_expr,
5669 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu", "t,r,j",
5670 tempreg, tempreg, (int) BFD_RELOC_MIPS_GOT_OFST);
5671 if (adj)
5672 {
5673 macro_build (p + 8, &icnt, (expressionS *) NULL,
5674 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5675 "d,v,t", treg, tempreg, breg);
5676 breg = 0;
5677 tempreg = treg;
5678 }
5679 }
5680 else if (mips_pic == EMBEDDED_PIC)
5681 {
5682 /* We use
5683 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5684 */
5685 macro_build ((char *) NULL, &icnt, &offset_expr,
5686 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
5687 tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
5688 }
5689 else
5690 abort ();
5691
5692 if (breg != 0)
5693 {
5694 char *s;
5695
5696 if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5697 s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" :
5698 HAVE_NEWABI ? "add" : "addu";
5699 else
5700 s = HAVE_64BIT_ADDRESSES ? "daddu" : HAVE_NEWABI ? "add" : "addu";
5701
5702 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
5703 "d,v,t", treg, tempreg, breg);
5704 }
5705
5706 if (! used_at)
5707 return;
5708
5709 break;
5710
5711 case M_J_A:
5712 /* The j instruction may not be used in PIC code, since it
5713 requires an absolute address. We convert it to a b
5714 instruction. */
5715 if (mips_pic == NO_PIC)
5716 macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
5717 else
5718 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
5719 return;
5720
5721 /* The jal instructions must be handled as macros because when
5722 generating PIC code they expand to multi-instruction
5723 sequences. Normally they are simple instructions. */
5724 case M_JAL_1:
5725 dreg = RA;
5726 /* Fall through. */
5727 case M_JAL_2:
5728 if (mips_pic == NO_PIC
5729 || mips_pic == EMBEDDED_PIC)
5730 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5731 "d,s", dreg, sreg);
5732 else if (mips_pic == SVR4_PIC)
5733 {
5734 if (sreg != PIC_CALL_REG)
5735 as_warn (_("MIPS PIC call to register other than $25"));
5736
5737 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5738 "d,s", dreg, sreg);
5739 if (! HAVE_NEWABI)
5740 {
5741 if (mips_cprestore_offset < 0)
5742 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5743 else
5744 {
5745 if (! mips_frame_reg_valid)
5746 {
5747 as_warn (_("No .frame pseudo-op used in PIC code"));
5748 /* Quiet this warning. */
5749 mips_frame_reg_valid = 1;
5750 }
5751 if (! mips_cprestore_valid)
5752 {
5753 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5754 /* Quiet this warning. */
5755 mips_cprestore_valid = 1;
5756 }
5757 expr1.X_add_number = mips_cprestore_offset;
5758 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5759 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5760 mips_gp_register, mips_frame_reg);
5761 }
5762 }
5763 }
5764 else
5765 abort ();
5766
5767 return;
5768
5769 case M_JAL_A:
5770 if (mips_pic == NO_PIC)
5771 macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
5772 else if (mips_pic == SVR4_PIC)
5773 {
5774 char *p;
5775
5776 /* If this is a reference to an external symbol, and we are
5777 using a small GOT, we want
5778 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5779 nop
5780 jalr $ra,$25
5781 nop
5782 lw $gp,cprestore($sp)
5783 The cprestore value is set using the .cprestore
5784 pseudo-op. If we are using a big GOT, we want
5785 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5786 addu $25,$25,$gp
5787 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5788 nop
5789 jalr $ra,$25
5790 nop
5791 lw $gp,cprestore($sp)
5792 If the symbol is not external, we want
5793 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5794 nop
5795 addiu $25,$25,<sym> (BFD_RELOC_LO16)
5796 jalr $ra,$25
5797 nop
5798 lw $gp,cprestore($sp)
5799
5800 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5801 sequences above, minus nops, unless the symbol is local,
5802 which enables us to use GOT_PAGE/GOT_OFST (big got) or
5803 GOT_DISP. */
5804 if (HAVE_NEWABI)
5805 {
5806 if (! mips_big_got)
5807 {
5808 frag_grow (4);
5809 macro_build ((char *) NULL, &icnt, &offset_expr,
5810 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5811 "t,o(b)", PIC_CALL_REG,
5812 (int) BFD_RELOC_MIPS_CALL16,
5813 mips_gp_register);
5814 frag_var (rs_machine_dependent, 0, 0,
5815 RELAX_ENCODE (0, 0, -4, 0, 0, 0),
5816 offset_expr.X_add_symbol, 0, NULL);
5817 }
5818 else
5819 {
5820 frag_grow (20);
5821 macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5822 "t,u", PIC_CALL_REG,
5823 (int) BFD_RELOC_MIPS_CALL_HI16);
5824 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5825 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5826 "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5827 mips_gp_register);
5828 macro_build ((char *) NULL, &icnt, &offset_expr,
5829 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5830 "t,o(b)", PIC_CALL_REG,
5831 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5832 p = frag_var (rs_machine_dependent, 8, 0,
5833 RELAX_ENCODE (12, 8, 0, 4, 0, 0),
5834 offset_expr.X_add_symbol, 0, NULL);
5835 macro_build (p, &icnt, &offset_expr,
5836 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5837 tempreg, (int) BFD_RELOC_MIPS_GOT_PAGE,
5838 mips_gp_register);
5839 macro_build (p + 4, &icnt, &offset_expr,
5840 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5841 "t,r,j", tempreg, tempreg,
5842 (int) BFD_RELOC_MIPS_GOT_OFST);
5843 }
5844
5845 macro_build_jalr (icnt, &offset_expr);
5846 }
5847 else
5848 {
5849 frag_grow (40);
5850 if (! mips_big_got)
5851 {
5852 macro_build ((char *) NULL, &icnt, &offset_expr,
5853 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5854 "t,o(b)", PIC_CALL_REG,
5855 (int) BFD_RELOC_MIPS_CALL16, mips_gp_register);
5856 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5857 "nop", "");
5858 p = frag_var (rs_machine_dependent, 4, 0,
5859 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5860 offset_expr.X_add_symbol, 0, NULL);
5861 }
5862 else
5863 {
5864 int gpdel;
5865
5866 if (reg_needs_delay (mips_gp_register))
5867 gpdel = 4;
5868 else
5869 gpdel = 0;
5870 macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5871 "t,u", PIC_CALL_REG,
5872 (int) BFD_RELOC_MIPS_CALL_HI16);
5873 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5874 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5875 "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5876 mips_gp_register);
5877 macro_build ((char *) NULL, &icnt, &offset_expr,
5878 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5879 "t,o(b)", PIC_CALL_REG,
5880 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5881 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5882 "nop", "");
5883 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5884 RELAX_ENCODE (16, 12 + gpdel, gpdel,
5885 8 + gpdel, 0, 0),
5886 offset_expr.X_add_symbol, 0, NULL);
5887 if (gpdel > 0)
5888 {
5889 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5890 p += 4;
5891 }
5892 macro_build (p, &icnt, &offset_expr,
5893 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5894 "t,o(b)", PIC_CALL_REG,
5895 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
5896 p += 4;
5897 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5898 p += 4;
5899 }
5900 macro_build (p, &icnt, &offset_expr,
5901 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5902 "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
5903 (int) BFD_RELOC_LO16);
5904 macro_build_jalr (icnt, &offset_expr);
5905
5906 if (mips_cprestore_offset < 0)
5907 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5908 else
5909 {
5910 if (! mips_frame_reg_valid)
5911 {
5912 as_warn (_("No .frame pseudo-op used in PIC code"));
5913 /* Quiet this warning. */
5914 mips_frame_reg_valid = 1;
5915 }
5916 if (! mips_cprestore_valid)
5917 {
5918 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5919 /* Quiet this warning. */
5920 mips_cprestore_valid = 1;
5921 }
5922 if (mips_opts.noreorder)
5923 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5924 "nop", "");
5925 expr1.X_add_number = mips_cprestore_offset;
5926 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5927 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5928 mips_gp_register, mips_frame_reg);
5929 }
5930 }
5931 }
5932 else if (mips_pic == EMBEDDED_PIC)
5933 {
5934 macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
5935 /* The linker may expand the call to a longer sequence which
5936 uses $at, so we must break rather than return. */
5937 break;
5938 }
5939 else
5940 abort ();
5941
5942 return;
5943
5944 case M_LB_AB:
5945 s = "lb";
5946 goto ld;
5947 case M_LBU_AB:
5948 s = "lbu";
5949 goto ld;
5950 case M_LH_AB:
5951 s = "lh";
5952 goto ld;
5953 case M_LHU_AB:
5954 s = "lhu";
5955 goto ld;
5956 case M_LW_AB:
5957 s = "lw";
5958 goto ld;
5959 case M_LWC0_AB:
5960 s = "lwc0";
5961 /* Itbl support may require additional care here. */
5962 coproc = 1;
5963 goto ld;
5964 case M_LWC1_AB:
5965 s = "lwc1";
5966 /* Itbl support may require additional care here. */
5967 coproc = 1;
5968 goto ld;
5969 case M_LWC2_AB:
5970 s = "lwc2";
5971 /* Itbl support may require additional care here. */
5972 coproc = 1;
5973 goto ld;
5974 case M_LWC3_AB:
5975 s = "lwc3";
5976 /* Itbl support may require additional care here. */
5977 coproc = 1;
5978 goto ld;
5979 case M_LWL_AB:
5980 s = "lwl";
5981 lr = 1;
5982 goto ld;
5983 case M_LWR_AB:
5984 s = "lwr";
5985 lr = 1;
5986 goto ld;
5987 case M_LDC1_AB:
5988 if (mips_arch == CPU_R4650)
5989 {
5990 as_bad (_("opcode not supported on this processor"));
5991 return;
5992 }
5993 s = "ldc1";
5994 /* Itbl support may require additional care here. */
5995 coproc = 1;
5996 goto ld;
5997 case M_LDC2_AB:
5998 s = "ldc2";
5999 /* Itbl support may require additional care here. */
6000 coproc = 1;
6001 goto ld;
6002 case M_LDC3_AB:
6003 s = "ldc3";
6004 /* Itbl support may require additional care here. */
6005 coproc = 1;
6006 goto ld;
6007 case M_LDL_AB:
6008 s = "ldl";
6009 lr = 1;
6010 goto ld;
6011 case M_LDR_AB:
6012 s = "ldr";
6013 lr = 1;
6014 goto ld;
6015 case M_LL_AB:
6016 s = "ll";
6017 goto ld;
6018 case M_LLD_AB:
6019 s = "lld";
6020 goto ld;
6021 case M_LWU_AB:
6022 s = "lwu";
6023 ld:
6024 if (breg == treg || coproc || lr)
6025 {
6026 tempreg = AT;
6027 used_at = 1;
6028 }
6029 else
6030 {
6031 tempreg = treg;
6032 used_at = 0;
6033 }
6034 goto ld_st;
6035 case M_SB_AB:
6036 s = "sb";
6037 goto st;
6038 case M_SH_AB:
6039 s = "sh";
6040 goto st;
6041 case M_SW_AB:
6042 s = "sw";
6043 goto st;
6044 case M_SWC0_AB:
6045 s = "swc0";
6046 /* Itbl support may require additional care here. */
6047 coproc = 1;
6048 goto st;
6049 case M_SWC1_AB:
6050 s = "swc1";
6051 /* Itbl support may require additional care here. */
6052 coproc = 1;
6053 goto st;
6054 case M_SWC2_AB:
6055 s = "swc2";
6056 /* Itbl support may require additional care here. */
6057 coproc = 1;
6058 goto st;
6059 case M_SWC3_AB:
6060 s = "swc3";
6061 /* Itbl support may require additional care here. */
6062 coproc = 1;
6063 goto st;
6064 case M_SWL_AB:
6065 s = "swl";
6066 goto st;
6067 case M_SWR_AB:
6068 s = "swr";
6069 goto st;
6070 case M_SC_AB:
6071 s = "sc";
6072 goto st;
6073 case M_SCD_AB:
6074 s = "scd";
6075 goto st;
6076 case M_SDC1_AB:
6077 if (mips_arch == CPU_R4650)
6078 {
6079 as_bad (_("opcode not supported on this processor"));
6080 return;
6081 }
6082 s = "sdc1";
6083 coproc = 1;
6084 /* Itbl support may require additional care here. */
6085 goto st;
6086 case M_SDC2_AB:
6087 s = "sdc2";
6088 /* Itbl support may require additional care here. */
6089 coproc = 1;
6090 goto st;
6091 case M_SDC3_AB:
6092 s = "sdc3";
6093 /* Itbl support may require additional care here. */
6094 coproc = 1;
6095 goto st;
6096 case M_SDL_AB:
6097 s = "sdl";
6098 goto st;
6099 case M_SDR_AB:
6100 s = "sdr";
6101 st:
6102 tempreg = AT;
6103 used_at = 1;
6104 ld_st:
6105 /* Itbl support may require additional care here. */
6106 if (mask == M_LWC1_AB
6107 || mask == M_SWC1_AB
6108 || mask == M_LDC1_AB
6109 || mask == M_SDC1_AB
6110 || mask == M_L_DAB
6111 || mask == M_S_DAB)
6112 fmt = "T,o(b)";
6113 else if (coproc)
6114 fmt = "E,o(b)";
6115 else
6116 fmt = "t,o(b)";
6117
6118 /* For embedded PIC, we allow loads where the offset is calculated
6119 by subtracting a symbol in the current segment from an unknown
6120 symbol, relative to a base register, e.g.:
6121 <op> $treg, <sym>-<localsym>($breg)
6122 This is used by the compiler for switch statements. */
6123 if (mips_pic == EMBEDDED_PIC
6124 && offset_expr.X_op == O_subtract
6125 && (symbol_constant_p (offset_expr.X_op_symbol)
6126 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
6127 : (symbol_equated_p (offset_expr.X_op_symbol)
6128 && (S_GET_SEGMENT
6129 (symbol_get_value_expression (offset_expr.X_op_symbol)
6130 ->X_add_symbol)
6131 == now_seg)))
6132 && breg != 0
6133 && (offset_expr.X_add_number == 0
6134 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
6135 {
6136 /* For this case, we output the instructions:
6137 lui $tempreg,<sym> (BFD_RELOC_PCREL_HI16_S)
6138 addiu $tempreg,$tempreg,$breg
6139 <op> $treg,<sym>($tempreg) (BFD_RELOC_PCREL_LO16)
6140 If the relocation would fit entirely in 16 bits, it would be
6141 nice to emit:
6142 <op> $treg,<sym>($breg) (BFD_RELOC_PCREL_LO16)
6143 instead, but that seems quite difficult. */
6144 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6145 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
6146 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6147 ((bfd_arch_bits_per_address (stdoutput) == 32
6148 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
6149 ? HAVE_NEWABI ? "add" : "addu" : "daddu"),
6150 "d,v,t", tempreg, tempreg, breg);
6151 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
6152 (int) BFD_RELOC_PCREL_LO16, tempreg);
6153 if (! used_at)
6154 return;
6155 break;
6156 }
6157
6158 if (offset_expr.X_op != O_constant
6159 && offset_expr.X_op != O_symbol)
6160 {
6161 as_bad (_("expression too complex"));
6162 offset_expr.X_op = O_constant;
6163 }
6164
6165 /* A constant expression in PIC code can be handled just as it
6166 is in non PIC code. */
6167 if (mips_pic == NO_PIC
6168 || offset_expr.X_op == O_constant)
6169 {
6170 char *p;
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 If we have 64-bit addresses, as an optimization, for
6226 addresses which are 32-bit constants (e.g. kseg0/kseg1
6227 addresses) we fall back to the 32-bit address generation
6228 mechanism since it is more efficient. Note that due to
6229 the signed offset used by memory operations, the 32-bit
6230 range is shifted down by 32768 here. This code should
6231 probably attempt to generate 64-bit constants more
6232 efficiently in general.
6233
6234 As an extension for architectures with 64-bit registers,
6235 we don't truncate 64-bit addresses given as literal
6236 constants down to 32 bits, to support existing practice
6237 in the mips64 Linux (the kernel), that compiles source
6238 files with -mabi=64, assembling them as o32 or n32 (with
6239 -Wa,-32 or -Wa,-n32). This is not beautiful, but since
6240 the whole kernel is loaded into a memory region that is
6241 addressible with sign-extended 32-bit addresses, it is
6242 wasteful to compute the upper 32 bits of every
6243 non-literal address, that takes more space and time.
6244 Some day this should probably be implemented as an
6245 assembler option, such that the kernel doesn't have to
6246 use such ugly hacks, even though it will still have to
6247 end up converting the binary to ELF32 for a number of
6248 platforms whose boot loaders don't support ELF64
6249 binaries. */
6250 if ((offset_expr.X_op != O_constant && HAVE_64BIT_ADDRESSES)
6251 || (offset_expr.X_op == O_constant
6252 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)
6253 && HAVE_64BIT_ADDRESS_CONSTANTS))
6254 {
6255 p = NULL;
6256
6257 /* We don't do GP optimization for now because RELAX_ENCODE can't
6258 hold the data for such large chunks. */
6259
6260 if (used_at == 0 && ! mips_opts.noat)
6261 {
6262 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6263 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
6264 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6265 AT, (int) BFD_RELOC_HI16_S);
6266 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6267 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
6268 if (breg != 0)
6269 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6270 "d,v,t", AT, AT, breg);
6271 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
6272 "d,w,<", tempreg, tempreg, 0);
6273 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6274 "d,v,t", tempreg, tempreg, AT);
6275 macro_build (p, &icnt, &offset_expr, s,
6276 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
6277 used_at = 1;
6278 }
6279 else
6280 {
6281 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6282 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
6283 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6284 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
6285 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
6286 "d,w,<", tempreg, tempreg, 16);
6287 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6288 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
6289 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
6290 "d,w,<", tempreg, tempreg, 16);
6291 if (breg != 0)
6292 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6293 "d,v,t", tempreg, tempreg, breg);
6294 macro_build (p, &icnt, &offset_expr, s,
6295 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
6296 }
6297
6298 return;
6299 }
6300 else if (offset_expr.X_op == O_constant
6301 && !HAVE_64BIT_ADDRESS_CONSTANTS
6302 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6303 as_bad (_("load/store address overflow (max 32 bits)"));
6304
6305 if (breg == 0)
6306 {
6307 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6308 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6309 p = NULL;
6310 else
6311 {
6312 frag_grow (20);
6313 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6314 treg, (int) BFD_RELOC_GPREL16,
6315 mips_gp_register);
6316 p = frag_var (rs_machine_dependent, 8, 0,
6317 RELAX_ENCODE (4, 8, 0, 4, 0,
6318 (mips_opts.warn_about_macros
6319 || (used_at
6320 && mips_opts.noat))),
6321 offset_expr.X_add_symbol, 0, NULL);
6322 used_at = 0;
6323 }
6324 macro_build_lui (p, &icnt, &offset_expr, tempreg);
6325 if (p != NULL)
6326 p += 4;
6327 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
6328 (int) BFD_RELOC_LO16, tempreg);
6329 }
6330 else
6331 {
6332 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6333 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6334 p = NULL;
6335 else
6336 {
6337 frag_grow (28);
6338 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6339 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6340 ? "add" : "addu" : "daddu",
6341 "d,v,t", tempreg, breg, mips_gp_register);
6342 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6343 treg, (int) BFD_RELOC_GPREL16, tempreg);
6344 p = frag_var (rs_machine_dependent, 12, 0,
6345 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
6346 offset_expr.X_add_symbol, 0, NULL);
6347 }
6348 macro_build_lui (p, &icnt, &offset_expr, tempreg);
6349 if (p != NULL)
6350 p += 4;
6351 macro_build (p, &icnt, (expressionS *) NULL,
6352 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6353 ? "add" : "addu" : "daddu",
6354 "d,v,t", tempreg, tempreg, breg);
6355 if (p != NULL)
6356 p += 4;
6357 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
6358 (int) BFD_RELOC_LO16, tempreg);
6359 }
6360 }
6361 else if (mips_pic == SVR4_PIC && ! mips_big_got)
6362 {
6363 char *p;
6364 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6365
6366 /* If this is a reference to an external symbol, we want
6367 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6368 nop
6369 <op> $treg,0($tempreg)
6370 Otherwise we want
6371 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6372 nop
6373 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6374 <op> $treg,0($tempreg)
6375
6376 For NewABI, we want
6377 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6378 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6379
6380 If there is a base register, we add it to $tempreg before
6381 the <op>. If there is a constant, we stick it in the
6382 <op> instruction. We don't handle constants larger than
6383 16 bits, because we have no way to load the upper 16 bits
6384 (actually, we could handle them for the subset of cases
6385 in which we are not using $at). */
6386 assert (offset_expr.X_op == O_symbol);
6387 if (HAVE_NEWABI)
6388 {
6389 macro_build ((char *) NULL, &icnt, &offset_expr,
6390 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6391 "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_PAGE,
6392 mips_gp_register);
6393 if (breg != 0)
6394 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6395 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6396 "d,v,t", tempreg, tempreg, breg);
6397 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
6398 (int) BFD_RELOC_MIPS_GOT_OFST, tempreg);
6399
6400 if (! used_at)
6401 return;
6402
6403 break;
6404 }
6405 expr1.X_add_number = offset_expr.X_add_number;
6406 offset_expr.X_add_number = 0;
6407 if (expr1.X_add_number < -0x8000
6408 || expr1.X_add_number >= 0x8000)
6409 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6410 frag_grow (20);
6411 macro_build ((char *) NULL, &icnt, &offset_expr,
6412 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
6413 (int) lw_reloc_type, mips_gp_register);
6414 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6415 p = frag_var (rs_machine_dependent, 4, 0,
6416 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
6417 offset_expr.X_add_symbol, 0, NULL);
6418 macro_build (p, &icnt, &offset_expr,
6419 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6420 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6421 if (breg != 0)
6422 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6423 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6424 "d,v,t", tempreg, tempreg, breg);
6425 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6426 (int) BFD_RELOC_LO16, tempreg);
6427 }
6428 else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
6429 {
6430 int gpdel;
6431 char *p;
6432
6433 /* If this is a reference to an external symbol, we want
6434 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6435 addu $tempreg,$tempreg,$gp
6436 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6437 <op> $treg,0($tempreg)
6438 Otherwise we want
6439 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6440 nop
6441 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6442 <op> $treg,0($tempreg)
6443 If there is a base register, we add it to $tempreg before
6444 the <op>. If there is a constant, we stick it in the
6445 <op> instruction. We don't handle constants larger than
6446 16 bits, because we have no way to load the upper 16 bits
6447 (actually, we could handle them for the subset of cases
6448 in which we are not using $at). */
6449 assert (offset_expr.X_op == O_symbol);
6450 expr1.X_add_number = offset_expr.X_add_number;
6451 offset_expr.X_add_number = 0;
6452 if (expr1.X_add_number < -0x8000
6453 || expr1.X_add_number >= 0x8000)
6454 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6455 if (reg_needs_delay (mips_gp_register))
6456 gpdel = 4;
6457 else
6458 gpdel = 0;
6459 frag_grow (36);
6460 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6461 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6462 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6463 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6464 "d,v,t", tempreg, tempreg, mips_gp_register);
6465 macro_build ((char *) NULL, &icnt, &offset_expr,
6466 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6467 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6468 tempreg);
6469 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
6470 RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
6471 offset_expr.X_add_symbol, 0, NULL);
6472 if (gpdel > 0)
6473 {
6474 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6475 p += 4;
6476 }
6477 macro_build (p, &icnt, &offset_expr,
6478 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6479 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
6480 mips_gp_register);
6481 p += 4;
6482 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6483 p += 4;
6484 macro_build (p, &icnt, &offset_expr,
6485 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6486 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6487 if (breg != 0)
6488 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6489 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6490 "d,v,t", tempreg, tempreg, breg);
6491 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6492 (int) BFD_RELOC_LO16, tempreg);
6493 }
6494 else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
6495 {
6496 char *p;
6497 int bregsz = breg != 0 ? 4 : 0;
6498
6499 /* If this is a reference to an external symbol, we want
6500 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6501 add $tempreg,$tempreg,$gp
6502 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6503 <op> $treg,<ofst>($tempreg)
6504 Otherwise, for local symbols, we want:
6505 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6506 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6507 assert (offset_expr.X_op == O_symbol);
6508 frag_now->tc_frag_data.tc_fr_offset =
6509 expr1.X_add_number = offset_expr.X_add_number;
6510 offset_expr.X_add_number = 0;
6511 if (expr1.X_add_number < -0x8000
6512 || expr1.X_add_number >= 0x8000)
6513 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6514 frag_grow (36);
6515 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6516 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6517 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6518 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6519 "d,v,t", tempreg, tempreg, mips_gp_register);
6520 macro_build ((char *) NULL, &icnt, &offset_expr,
6521 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6522 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6523 tempreg);
6524 if (breg != 0)
6525 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6526 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6527 "d,v,t", tempreg, tempreg, breg);
6528 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6529 (int) BFD_RELOC_LO16, tempreg);
6530
6531 offset_expr.X_add_number = expr1.X_add_number;
6532 p = frag_var (rs_machine_dependent, 12 + bregsz, 0,
6533 RELAX_ENCODE (16 + bregsz, 8 + bregsz,
6534 0, 4 + bregsz, 0, 0),
6535 offset_expr.X_add_symbol, 0, NULL);
6536 macro_build (p, &icnt, &offset_expr,
6537 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6538 "t,o(b)", tempreg,
6539 (int) BFD_RELOC_MIPS_GOT_PAGE,
6540 mips_gp_register);
6541 if (breg != 0)
6542 macro_build (p + 4, &icnt, (expressionS *) NULL,
6543 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6544 "d,v,t", tempreg, tempreg, breg);
6545 macro_build (p + 4 + bregsz, &icnt, &offset_expr, s, fmt, treg,
6546 (int) BFD_RELOC_MIPS_GOT_OFST, tempreg);
6547 }
6548 else if (mips_pic == EMBEDDED_PIC)
6549 {
6550 /* If there is no base register, we want
6551 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6552 If there is a base register, we want
6553 addu $tempreg,$breg,$gp
6554 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6555 */
6556 assert (offset_expr.X_op == O_symbol);
6557 if (breg == 0)
6558 {
6559 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6560 treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
6561 used_at = 0;
6562 }
6563 else
6564 {
6565 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6566 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6567 "d,v,t", tempreg, breg, mips_gp_register);
6568 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6569 treg, (int) BFD_RELOC_GPREL16, tempreg);
6570 }
6571 }
6572 else
6573 abort ();
6574
6575 if (! used_at)
6576 return;
6577
6578 break;
6579
6580 case M_LI:
6581 case M_LI_S:
6582 load_register (&icnt, treg, &imm_expr, 0);
6583 return;
6584
6585 case M_DLI:
6586 load_register (&icnt, treg, &imm_expr, 1);
6587 return;
6588
6589 case M_LI_SS:
6590 if (imm_expr.X_op == O_constant)
6591 {
6592 load_register (&icnt, AT, &imm_expr, 0);
6593 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6594 "mtc1", "t,G", AT, treg);
6595 break;
6596 }
6597 else
6598 {
6599 assert (offset_expr.X_op == O_symbol
6600 && strcmp (segment_name (S_GET_SEGMENT
6601 (offset_expr.X_add_symbol)),
6602 ".lit4") == 0
6603 && offset_expr.X_add_number == 0);
6604 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6605 treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6606 return;
6607 }
6608
6609 case M_LI_D:
6610 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6611 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6612 order 32 bits of the value and the low order 32 bits are either
6613 zero or in OFFSET_EXPR. */
6614 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6615 {
6616 if (HAVE_64BIT_GPRS)
6617 load_register (&icnt, treg, &imm_expr, 1);
6618 else
6619 {
6620 int hreg, lreg;
6621
6622 if (target_big_endian)
6623 {
6624 hreg = treg;
6625 lreg = treg + 1;
6626 }
6627 else
6628 {
6629 hreg = treg + 1;
6630 lreg = treg;
6631 }
6632
6633 if (hreg <= 31)
6634 load_register (&icnt, hreg, &imm_expr, 0);
6635 if (lreg <= 31)
6636 {
6637 if (offset_expr.X_op == O_absent)
6638 move_register (&icnt, lreg, 0);
6639 else
6640 {
6641 assert (offset_expr.X_op == O_constant);
6642 load_register (&icnt, lreg, &offset_expr, 0);
6643 }
6644 }
6645 }
6646 return;
6647 }
6648
6649 /* We know that sym is in the .rdata section. First we get the
6650 upper 16 bits of the address. */
6651 if (mips_pic == NO_PIC)
6652 {
6653 macro_build_lui (NULL, &icnt, &offset_expr, AT);
6654 }
6655 else if (mips_pic == SVR4_PIC)
6656 {
6657 macro_build ((char *) NULL, &icnt, &offset_expr,
6658 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6659 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6660 mips_gp_register);
6661 }
6662 else if (mips_pic == EMBEDDED_PIC)
6663 {
6664 /* For embedded PIC we pick up the entire address off $gp in
6665 a single instruction. */
6666 macro_build ((char *) NULL, &icnt, &offset_expr,
6667 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
6668 mips_gp_register, (int) BFD_RELOC_GPREL16);
6669 offset_expr.X_op = O_constant;
6670 offset_expr.X_add_number = 0;
6671 }
6672 else
6673 abort ();
6674
6675 /* Now we load the register(s). */
6676 if (HAVE_64BIT_GPRS)
6677 macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
6678 treg, (int) BFD_RELOC_LO16, AT);
6679 else
6680 {
6681 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6682 treg, (int) BFD_RELOC_LO16, AT);
6683 if (treg != RA)
6684 {
6685 /* FIXME: How in the world do we deal with the possible
6686 overflow here? */
6687 offset_expr.X_add_number += 4;
6688 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6689 treg + 1, (int) BFD_RELOC_LO16, AT);
6690 }
6691 }
6692
6693 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6694 does not become a variant frag. */
6695 frag_wane (frag_now);
6696 frag_new (0);
6697
6698 break;
6699
6700 case M_LI_DD:
6701 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6702 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6703 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6704 the value and the low order 32 bits are either zero or in
6705 OFFSET_EXPR. */
6706 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6707 {
6708 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
6709 if (HAVE_64BIT_FPRS)
6710 {
6711 assert (HAVE_64BIT_GPRS);
6712 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6713 "dmtc1", "t,S", AT, treg);
6714 }
6715 else
6716 {
6717 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6718 "mtc1", "t,G", AT, treg + 1);
6719 if (offset_expr.X_op == O_absent)
6720 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6721 "mtc1", "t,G", 0, treg);
6722 else
6723 {
6724 assert (offset_expr.X_op == O_constant);
6725 load_register (&icnt, AT, &offset_expr, 0);
6726 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6727 "mtc1", "t,G", AT, treg);
6728 }
6729 }
6730 break;
6731 }
6732
6733 assert (offset_expr.X_op == O_symbol
6734 && offset_expr.X_add_number == 0);
6735 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6736 if (strcmp (s, ".lit8") == 0)
6737 {
6738 if (mips_opts.isa != ISA_MIPS1)
6739 {
6740 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6741 "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
6742 mips_gp_register);
6743 return;
6744 }
6745 breg = mips_gp_register;
6746 r = BFD_RELOC_MIPS_LITERAL;
6747 goto dob;
6748 }
6749 else
6750 {
6751 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6752 if (mips_pic == SVR4_PIC)
6753 macro_build ((char *) NULL, &icnt, &offset_expr,
6754 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6755 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6756 mips_gp_register);
6757 else
6758 {
6759 /* FIXME: This won't work for a 64 bit address. */
6760 macro_build_lui (NULL, &icnt, &offset_expr, AT);
6761 }
6762
6763 if (mips_opts.isa != ISA_MIPS1)
6764 {
6765 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6766 "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
6767
6768 /* To avoid confusion in tc_gen_reloc, we must ensure
6769 that this does not become a variant frag. */
6770 frag_wane (frag_now);
6771 frag_new (0);
6772
6773 break;
6774 }
6775 breg = AT;
6776 r = BFD_RELOC_LO16;
6777 goto dob;
6778 }
6779
6780 case M_L_DOB:
6781 if (mips_arch == CPU_R4650)
6782 {
6783 as_bad (_("opcode not supported on this processor"));
6784 return;
6785 }
6786 /* Even on a big endian machine $fn comes before $fn+1. We have
6787 to adjust when loading from memory. */
6788 r = BFD_RELOC_LO16;
6789 dob:
6790 assert (mips_opts.isa == ISA_MIPS1);
6791 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6792 target_big_endian ? treg + 1 : treg,
6793 (int) r, breg);
6794 /* FIXME: A possible overflow which I don't know how to deal
6795 with. */
6796 offset_expr.X_add_number += 4;
6797 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6798 target_big_endian ? treg : treg + 1,
6799 (int) r, breg);
6800
6801 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6802 does not become a variant frag. */
6803 frag_wane (frag_now);
6804 frag_new (0);
6805
6806 if (breg != AT)
6807 return;
6808 break;
6809
6810 case M_L_DAB:
6811 /*
6812 * The MIPS assembler seems to check for X_add_number not
6813 * being double aligned and generating:
6814 * lui at,%hi(foo+1)
6815 * addu at,at,v1
6816 * addiu at,at,%lo(foo+1)
6817 * lwc1 f2,0(at)
6818 * lwc1 f3,4(at)
6819 * But, the resulting address is the same after relocation so why
6820 * generate the extra instruction?
6821 */
6822 if (mips_arch == CPU_R4650)
6823 {
6824 as_bad (_("opcode not supported on this processor"));
6825 return;
6826 }
6827 /* Itbl support may require additional care here. */
6828 coproc = 1;
6829 if (mips_opts.isa != ISA_MIPS1)
6830 {
6831 s = "ldc1";
6832 goto ld;
6833 }
6834
6835 s = "lwc1";
6836 fmt = "T,o(b)";
6837 goto ldd_std;
6838
6839 case M_S_DAB:
6840 if (mips_arch == CPU_R4650)
6841 {
6842 as_bad (_("opcode not supported on this processor"));
6843 return;
6844 }
6845
6846 if (mips_opts.isa != ISA_MIPS1)
6847 {
6848 s = "sdc1";
6849 goto st;
6850 }
6851
6852 s = "swc1";
6853 fmt = "T,o(b)";
6854 /* Itbl support may require additional care here. */
6855 coproc = 1;
6856 goto ldd_std;
6857
6858 case M_LD_AB:
6859 if (HAVE_64BIT_GPRS)
6860 {
6861 s = "ld";
6862 goto ld;
6863 }
6864
6865 s = "lw";
6866 fmt = "t,o(b)";
6867 goto ldd_std;
6868
6869 case M_SD_AB:
6870 if (HAVE_64BIT_GPRS)
6871 {
6872 s = "sd";
6873 goto st;
6874 }
6875
6876 s = "sw";
6877 fmt = "t,o(b)";
6878
6879 ldd_std:
6880 /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6881 loads for the case of doing a pair of loads to simulate an 'ld'.
6882 This is not currently done by the compiler, and assembly coders
6883 writing embedded-pic code can cope. */
6884
6885 if (offset_expr.X_op != O_symbol
6886 && offset_expr.X_op != O_constant)
6887 {
6888 as_bad (_("expression too complex"));
6889 offset_expr.X_op = O_constant;
6890 }
6891
6892 /* Even on a big endian machine $fn comes before $fn+1. We have
6893 to adjust when loading from memory. We set coproc if we must
6894 load $fn+1 first. */
6895 /* Itbl support may require additional care here. */
6896 if (! target_big_endian)
6897 coproc = 0;
6898
6899 if (mips_pic == NO_PIC
6900 || offset_expr.X_op == O_constant)
6901 {
6902 char *p;
6903
6904 /* If this is a reference to a GP relative symbol, we want
6905 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6906 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6907 If we have a base register, we use this
6908 addu $at,$breg,$gp
6909 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6910 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6911 If this is not a GP relative symbol, we want
6912 lui $at,<sym> (BFD_RELOC_HI16_S)
6913 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6914 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6915 If there is a base register, we add it to $at after the
6916 lui instruction. If there is a constant, we always use
6917 the last case. */
6918 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6919 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6920 {
6921 p = NULL;
6922 used_at = 1;
6923 }
6924 else
6925 {
6926 int off;
6927
6928 if (breg == 0)
6929 {
6930 frag_grow (28);
6931 tempreg = mips_gp_register;
6932 off = 0;
6933 used_at = 0;
6934 }
6935 else
6936 {
6937 frag_grow (36);
6938 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6939 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6940 ? "add" : "addu" : "daddu",
6941 "d,v,t", AT, breg, mips_gp_register);
6942 tempreg = AT;
6943 off = 4;
6944 used_at = 1;
6945 }
6946
6947 /* Itbl support may require additional care here. */
6948 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6949 coproc ? treg + 1 : treg,
6950 (int) BFD_RELOC_GPREL16, tempreg);
6951 offset_expr.X_add_number += 4;
6952
6953 /* Set mips_optimize to 2 to avoid inserting an
6954 undesired nop. */
6955 hold_mips_optimize = mips_optimize;
6956 mips_optimize = 2;
6957 /* Itbl support may require additional care here. */
6958 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6959 coproc ? treg : treg + 1,
6960 (int) BFD_RELOC_GPREL16, tempreg);
6961 mips_optimize = hold_mips_optimize;
6962
6963 p = frag_var (rs_machine_dependent, 12 + off, 0,
6964 RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
6965 used_at && mips_opts.noat),
6966 offset_expr.X_add_symbol, 0, NULL);
6967
6968 /* We just generated two relocs. When tc_gen_reloc
6969 handles this case, it will skip the first reloc and
6970 handle the second. The second reloc already has an
6971 extra addend of 4, which we added above. We must
6972 subtract it out, and then subtract another 4 to make
6973 the first reloc come out right. The second reloc
6974 will come out right because we are going to add 4 to
6975 offset_expr when we build its instruction below.
6976
6977 If we have a symbol, then we don't want to include
6978 the offset, because it will wind up being included
6979 when we generate the reloc. */
6980
6981 if (offset_expr.X_op == O_constant)
6982 offset_expr.X_add_number -= 8;
6983 else
6984 {
6985 offset_expr.X_add_number = -4;
6986 offset_expr.X_op = O_constant;
6987 }
6988 }
6989 macro_build_lui (p, &icnt, &offset_expr, AT);
6990 if (p != NULL)
6991 p += 4;
6992 if (breg != 0)
6993 {
6994 macro_build (p, &icnt, (expressionS *) NULL,
6995 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6996 ? "add" : "addu" : "daddu",
6997 "d,v,t", AT, breg, AT);
6998 if (p != NULL)
6999 p += 4;
7000 }
7001 /* Itbl support may require additional care here. */
7002 macro_build (p, &icnt, &offset_expr, s, fmt,
7003 coproc ? treg + 1 : treg,
7004 (int) BFD_RELOC_LO16, AT);
7005 if (p != NULL)
7006 p += 4;
7007 /* FIXME: How do we handle overflow here? */
7008 offset_expr.X_add_number += 4;
7009 /* Itbl support may require additional care here. */
7010 macro_build (p, &icnt, &offset_expr, s, fmt,
7011 coproc ? treg : treg + 1,
7012 (int) BFD_RELOC_LO16, AT);
7013 }
7014 else if (mips_pic == SVR4_PIC && ! mips_big_got)
7015 {
7016 int off;
7017
7018 /* If this is a reference to an external symbol, we want
7019 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7020 nop
7021 <op> $treg,0($at)
7022 <op> $treg+1,4($at)
7023 Otherwise we want
7024 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7025 nop
7026 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7027 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7028 If there is a base register we add it to $at before the
7029 lwc1 instructions. If there is a constant we include it
7030 in the lwc1 instructions. */
7031 used_at = 1;
7032 expr1.X_add_number = offset_expr.X_add_number;
7033 offset_expr.X_add_number = 0;
7034 if (expr1.X_add_number < -0x8000
7035 || expr1.X_add_number >= 0x8000 - 4)
7036 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7037 if (breg == 0)
7038 off = 0;
7039 else
7040 off = 4;
7041 frag_grow (24 + off);
7042 macro_build ((char *) NULL, &icnt, &offset_expr,
7043 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
7044 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
7045 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7046 if (breg != 0)
7047 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7048 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7049 ? "add" : "addu" : "daddu",
7050 "d,v,t", AT, breg, AT);
7051 /* Itbl support may require additional care here. */
7052 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7053 coproc ? treg + 1 : treg,
7054 (int) BFD_RELOC_LO16, AT);
7055 expr1.X_add_number += 4;
7056
7057 /* Set mips_optimize to 2 to avoid inserting an undesired
7058 nop. */
7059 hold_mips_optimize = mips_optimize;
7060 mips_optimize = 2;
7061 /* Itbl support may require additional care here. */
7062 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7063 coproc ? treg : treg + 1,
7064 (int) BFD_RELOC_LO16, AT);
7065 mips_optimize = hold_mips_optimize;
7066
7067 (void) frag_var (rs_machine_dependent, 0, 0,
7068 RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
7069 offset_expr.X_add_symbol, 0, NULL);
7070 }
7071 else if (mips_pic == SVR4_PIC)
7072 {
7073 int gpdel, off;
7074 char *p;
7075
7076 /* If this is a reference to an external symbol, we want
7077 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7078 addu $at,$at,$gp
7079 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7080 nop
7081 <op> $treg,0($at)
7082 <op> $treg+1,4($at)
7083 Otherwise we want
7084 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7085 nop
7086 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7087 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7088 If there is a base register we add it to $at before the
7089 lwc1 instructions. If there is a constant we include it
7090 in the lwc1 instructions. */
7091 used_at = 1;
7092 expr1.X_add_number = offset_expr.X_add_number;
7093 offset_expr.X_add_number = 0;
7094 if (expr1.X_add_number < -0x8000
7095 || expr1.X_add_number >= 0x8000 - 4)
7096 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7097 if (reg_needs_delay (mips_gp_register))
7098 gpdel = 4;
7099 else
7100 gpdel = 0;
7101 if (breg == 0)
7102 off = 0;
7103 else
7104 off = 4;
7105 frag_grow (56);
7106 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
7107 AT, (int) BFD_RELOC_MIPS_GOT_HI16);
7108 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7109 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7110 ? "add" : "addu" : "daddu",
7111 "d,v,t", AT, AT, mips_gp_register);
7112 macro_build ((char *) NULL, &icnt, &offset_expr,
7113 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
7114 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
7115 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7116 if (breg != 0)
7117 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7118 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7119 ? "add" : "addu" : "daddu",
7120 "d,v,t", AT, breg, AT);
7121 /* Itbl support may require additional care here. */
7122 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7123 coproc ? treg + 1 : treg,
7124 (int) BFD_RELOC_LO16, AT);
7125 expr1.X_add_number += 4;
7126
7127 /* Set mips_optimize to 2 to avoid inserting an undesired
7128 nop. */
7129 hold_mips_optimize = mips_optimize;
7130 mips_optimize = 2;
7131 /* Itbl support may require additional care here. */
7132 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7133 coproc ? treg : treg + 1,
7134 (int) BFD_RELOC_LO16, AT);
7135 mips_optimize = hold_mips_optimize;
7136 expr1.X_add_number -= 4;
7137
7138 p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
7139 RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
7140 8 + gpdel + off, 1, 0),
7141 offset_expr.X_add_symbol, 0, NULL);
7142 if (gpdel > 0)
7143 {
7144 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
7145 p += 4;
7146 }
7147 macro_build (p, &icnt, &offset_expr,
7148 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
7149 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
7150 mips_gp_register);
7151 p += 4;
7152 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
7153 p += 4;
7154 if (breg != 0)
7155 {
7156 macro_build (p, &icnt, (expressionS *) NULL,
7157 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7158 ? "add" : "addu" : "daddu",
7159 "d,v,t", AT, breg, AT);
7160 p += 4;
7161 }
7162 /* Itbl support may require additional care here. */
7163 macro_build (p, &icnt, &expr1, s, fmt,
7164 coproc ? treg + 1 : treg,
7165 (int) BFD_RELOC_LO16, AT);
7166 p += 4;
7167 expr1.X_add_number += 4;
7168
7169 /* Set mips_optimize to 2 to avoid inserting an undesired
7170 nop. */
7171 hold_mips_optimize = mips_optimize;
7172 mips_optimize = 2;
7173 /* Itbl support may require additional care here. */
7174 macro_build (p, &icnt, &expr1, s, fmt,
7175 coproc ? treg : treg + 1,
7176 (int) BFD_RELOC_LO16, AT);
7177 mips_optimize = hold_mips_optimize;
7178 }
7179 else if (mips_pic == EMBEDDED_PIC)
7180 {
7181 /* If there is no base register, we use
7182 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7183 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
7184 If we have a base register, we use
7185 addu $at,$breg,$gp
7186 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7187 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
7188 */
7189 if (breg == 0)
7190 {
7191 tempreg = mips_gp_register;
7192 used_at = 0;
7193 }
7194 else
7195 {
7196 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7197 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7198 "d,v,t", AT, breg, mips_gp_register);
7199 tempreg = AT;
7200 used_at = 1;
7201 }
7202
7203 /* Itbl support may require additional care here. */
7204 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
7205 coproc ? treg + 1 : treg,
7206 (int) BFD_RELOC_GPREL16, tempreg);
7207 offset_expr.X_add_number += 4;
7208 /* Itbl support may require additional care here. */
7209 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
7210 coproc ? treg : treg + 1,
7211 (int) BFD_RELOC_GPREL16, tempreg);
7212 }
7213 else
7214 abort ();
7215
7216 if (! used_at)
7217 return;
7218
7219 break;
7220
7221 case M_LD_OB:
7222 s = "lw";
7223 goto sd_ob;
7224 case M_SD_OB:
7225 s = "sw";
7226 sd_ob:
7227 assert (HAVE_32BIT_ADDRESSES);
7228 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7229 (int) BFD_RELOC_LO16, breg);
7230 offset_expr.X_add_number += 4;
7231 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
7232 (int) BFD_RELOC_LO16, breg);
7233 return;
7234
7235 /* New code added to support COPZ instructions.
7236 This code builds table entries out of the macros in mip_opcodes.
7237 R4000 uses interlocks to handle coproc delays.
7238 Other chips (like the R3000) require nops to be inserted for delays.
7239
7240 FIXME: Currently, we require that the user handle delays.
7241 In order to fill delay slots for non-interlocked chips,
7242 we must have a way to specify delays based on the coprocessor.
7243 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7244 What are the side-effects of the cop instruction?
7245 What cache support might we have and what are its effects?
7246 Both coprocessor & memory require delays. how long???
7247 What registers are read/set/modified?
7248
7249 If an itbl is provided to interpret cop instructions,
7250 this knowledge can be encoded in the itbl spec. */
7251
7252 case M_COP0:
7253 s = "c0";
7254 goto copz;
7255 case M_COP1:
7256 s = "c1";
7257 goto copz;
7258 case M_COP2:
7259 s = "c2";
7260 goto copz;
7261 case M_COP3:
7262 s = "c3";
7263 copz:
7264 /* For now we just do C (same as Cz). The parameter will be
7265 stored in insn_opcode by mips_ip. */
7266 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
7267 ip->insn_opcode);
7268 return;
7269
7270 case M_MOVE:
7271 move_register (&icnt, dreg, sreg);
7272 return;
7273
7274 #ifdef LOSING_COMPILER
7275 default:
7276 /* Try and see if this is a new itbl instruction.
7277 This code builds table entries out of the macros in mip_opcodes.
7278 FIXME: For now we just assemble the expression and pass it's
7279 value along as a 32-bit immediate.
7280 We may want to have the assembler assemble this value,
7281 so that we gain the assembler's knowledge of delay slots,
7282 symbols, etc.
7283 Would it be more efficient to use mask (id) here? */
7284 if (itbl_have_entries
7285 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7286 {
7287 s = ip->insn_mo->name;
7288 s2 = "cop3";
7289 coproc = ITBL_DECODE_PNUM (immed_expr);;
7290 macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
7291 return;
7292 }
7293 macro2 (ip);
7294 return;
7295 }
7296 if (mips_opts.noat)
7297 as_warn (_("Macro used $at after \".set noat\""));
7298 }
7299
7300 static void
7301 macro2 (ip)
7302 struct mips_cl_insn *ip;
7303 {
7304 register int treg, sreg, dreg, breg;
7305 int tempreg;
7306 int mask;
7307 int icnt = 0;
7308 int used_at;
7309 expressionS expr1;
7310 const char *s;
7311 const char *s2;
7312 const char *fmt;
7313 int likely = 0;
7314 int dbl = 0;
7315 int coproc = 0;
7316 int lr = 0;
7317 int imm = 0;
7318 int off;
7319 offsetT maxnum;
7320 bfd_reloc_code_real_type r;
7321 char *p;
7322
7323 treg = (ip->insn_opcode >> 16) & 0x1f;
7324 dreg = (ip->insn_opcode >> 11) & 0x1f;
7325 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7326 mask = ip->insn_mo->mask;
7327
7328 expr1.X_op = O_constant;
7329 expr1.X_op_symbol = NULL;
7330 expr1.X_add_symbol = NULL;
7331 expr1.X_add_number = 1;
7332
7333 switch (mask)
7334 {
7335 #endif /* LOSING_COMPILER */
7336
7337 case M_DMUL:
7338 dbl = 1;
7339 case M_MUL:
7340 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7341 dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7342 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7343 dreg);
7344 return;
7345
7346 case M_DMUL_I:
7347 dbl = 1;
7348 case M_MUL_I:
7349 /* The MIPS assembler some times generates shifts and adds. I'm
7350 not trying to be that fancy. GCC should do this for us
7351 anyway. */
7352 load_register (&icnt, AT, &imm_expr, dbl);
7353 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7354 dbl ? "dmult" : "mult", "s,t", sreg, AT);
7355 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7356 dreg);
7357 break;
7358
7359 case M_DMULO_I:
7360 dbl = 1;
7361 case M_MULO_I:
7362 imm = 1;
7363 goto do_mulo;
7364
7365 case M_DMULO:
7366 dbl = 1;
7367 case M_MULO:
7368 do_mulo:
7369 mips_emit_delays (TRUE);
7370 ++mips_opts.noreorder;
7371 mips_any_noreorder = 1;
7372 if (imm)
7373 load_register (&icnt, AT, &imm_expr, dbl);
7374 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7375 dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7376 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7377 dreg);
7378 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7379 dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7380 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
7381 AT);
7382 if (mips_trap)
7383 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
7384 "s,t,q", dreg, AT, 6);
7385 else
7386 {
7387 expr1.X_add_number = 8;
7388 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg,
7389 AT);
7390 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
7391 0);
7392 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7393 "c", 6);
7394 }
7395 --mips_opts.noreorder;
7396 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d", dreg);
7397 break;
7398
7399 case M_DMULOU_I:
7400 dbl = 1;
7401 case M_MULOU_I:
7402 imm = 1;
7403 goto do_mulou;
7404
7405 case M_DMULOU:
7406 dbl = 1;
7407 case M_MULOU:
7408 do_mulou:
7409 mips_emit_delays (TRUE);
7410 ++mips_opts.noreorder;
7411 mips_any_noreorder = 1;
7412 if (imm)
7413 load_register (&icnt, AT, &imm_expr, dbl);
7414 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7415 dbl ? "dmultu" : "multu",
7416 "s,t", sreg, imm ? AT : treg);
7417 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
7418 AT);
7419 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7420 dreg);
7421 if (mips_trap)
7422 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
7423 "s,t,q", AT, 0, 6);
7424 else
7425 {
7426 expr1.X_add_number = 8;
7427 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
7428 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
7429 0);
7430 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7431 "c", 6);
7432 }
7433 --mips_opts.noreorder;
7434 break;
7435
7436 case M_DROL:
7437 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7438 {
7439 if (dreg == sreg)
7440 {
7441 tempreg = AT;
7442 used_at = 1;
7443 }
7444 else
7445 {
7446 tempreg = dreg;
7447 used_at = 0;
7448 }
7449 macro_build ((char *) NULL, &icnt, NULL, "dnegu",
7450 "d,w", tempreg, treg);
7451 macro_build ((char *) NULL, &icnt, NULL, "drorv",
7452 "d,t,s", dreg, sreg, tempreg);
7453 if (used_at)
7454 break;
7455 return;
7456 }
7457 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7458 "d,v,t", AT, 0, treg);
7459 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7460 "d,t,s", AT, sreg, AT);
7461 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7462 "d,t,s", dreg, sreg, treg);
7463 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7464 "d,v,t", dreg, dreg, AT);
7465 break;
7466
7467 case M_ROL:
7468 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7469 {
7470 if (dreg == sreg)
7471 {
7472 tempreg = AT;
7473 used_at = 1;
7474 }
7475 else
7476 {
7477 tempreg = dreg;
7478 used_at = 0;
7479 }
7480 macro_build ((char *) NULL, &icnt, NULL, "negu",
7481 "d,w", tempreg, treg);
7482 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7483 "d,t,s", dreg, sreg, tempreg);
7484 if (used_at)
7485 break;
7486 return;
7487 }
7488 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7489 "d,v,t", AT, 0, treg);
7490 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7491 "d,t,s", AT, sreg, AT);
7492 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7493 "d,t,s", dreg, sreg, treg);
7494 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7495 "d,v,t", dreg, dreg, AT);
7496 break;
7497
7498 case M_DROL_I:
7499 {
7500 unsigned int rot;
7501 char *l, *r;
7502
7503 if (imm_expr.X_op != O_constant)
7504 as_bad (_("Improper rotate count"));
7505 rot = imm_expr.X_add_number & 0x3f;
7506 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7507 {
7508 rot = (64 - rot) & 0x3f;
7509 if (rot >= 32)
7510 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7511 "d,w,<", dreg, sreg, rot - 32);
7512 else
7513 macro_build ((char *) NULL, &icnt, NULL, "dror",
7514 "d,w,<", dreg, sreg, rot);
7515 return;
7516 }
7517 if (rot == 0)
7518 {
7519 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7520 "d,w,<", dreg, sreg, 0);
7521 return;
7522 }
7523 l = (rot < 0x20) ? "dsll" : "dsll32";
7524 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7525 rot &= 0x1f;
7526 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7527 "d,w,<", AT, sreg, rot);
7528 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7529 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7530 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7531 "d,v,t", dreg, dreg, AT);
7532 }
7533 break;
7534
7535 case M_ROL_I:
7536 {
7537 unsigned int rot;
7538
7539 if (imm_expr.X_op != O_constant)
7540 as_bad (_("Improper rotate count"));
7541 rot = imm_expr.X_add_number & 0x1f;
7542 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7543 {
7544 macro_build ((char *) NULL, &icnt, NULL, "ror",
7545 "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7546 return;
7547 }
7548 if (rot == 0)
7549 {
7550 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7551 "d,w,<", dreg, sreg, 0);
7552 return;
7553 }
7554 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7555 "d,w,<", AT, sreg, rot);
7556 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7557 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7558 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7559 "d,v,t", dreg, dreg, AT);
7560 }
7561 break;
7562
7563 case M_DROR:
7564 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7565 {
7566 macro_build ((char *) NULL, &icnt, NULL, "drorv",
7567 "d,t,s", dreg, sreg, treg);
7568 return;
7569 }
7570 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7571 "d,v,t", AT, 0, treg);
7572 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7573 "d,t,s", AT, sreg, AT);
7574 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7575 "d,t,s", dreg, sreg, treg);
7576 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7577 "d,v,t", dreg, dreg, AT);
7578 break;
7579
7580 case M_ROR:
7581 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7582 {
7583 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7584 "d,t,s", dreg, sreg, treg);
7585 return;
7586 }
7587 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7588 "d,v,t", AT, 0, treg);
7589 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7590 "d,t,s", AT, sreg, AT);
7591 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7592 "d,t,s", dreg, sreg, treg);
7593 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7594 "d,v,t", dreg, dreg, AT);
7595 break;
7596
7597 case M_DROR_I:
7598 {
7599 unsigned int rot;
7600 char *l, *r;
7601
7602 if (imm_expr.X_op != O_constant)
7603 as_bad (_("Improper rotate count"));
7604 rot = imm_expr.X_add_number & 0x3f;
7605 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7606 {
7607 if (rot >= 32)
7608 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7609 "d,w,<", dreg, sreg, rot - 32);
7610 else
7611 macro_build ((char *) NULL, &icnt, NULL, "dror",
7612 "d,w,<", dreg, sreg, rot);
7613 return;
7614 }
7615 if (rot == 0)
7616 {
7617 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7618 "d,w,<", dreg, sreg, 0);
7619 return;
7620 }
7621 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7622 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7623 rot &= 0x1f;
7624 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7625 "d,w,<", AT, sreg, rot);
7626 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7627 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7628 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7629 "d,v,t", dreg, dreg, AT);
7630 }
7631 break;
7632
7633 case M_ROR_I:
7634 {
7635 unsigned int rot;
7636
7637 if (imm_expr.X_op != O_constant)
7638 as_bad (_("Improper rotate count"));
7639 rot = imm_expr.X_add_number & 0x1f;
7640 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7641 {
7642 macro_build ((char *) NULL, &icnt, NULL, "ror",
7643 "d,w,<", dreg, sreg, rot);
7644 return;
7645 }
7646 if (rot == 0)
7647 {
7648 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7649 "d,w,<", dreg, sreg, 0);
7650 return;
7651 }
7652 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7653 "d,w,<", AT, sreg, rot);
7654 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7655 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7656 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7657 "d,v,t", dreg, dreg, AT);
7658 }
7659 break;
7660
7661 case M_S_DOB:
7662 if (mips_arch == CPU_R4650)
7663 {
7664 as_bad (_("opcode not supported on this processor"));
7665 return;
7666 }
7667 assert (mips_opts.isa == ISA_MIPS1);
7668 /* Even on a big endian machine $fn comes before $fn+1. We have
7669 to adjust when storing to memory. */
7670 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7671 target_big_endian ? treg + 1 : treg,
7672 (int) BFD_RELOC_LO16, breg);
7673 offset_expr.X_add_number += 4;
7674 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7675 target_big_endian ? treg : treg + 1,
7676 (int) BFD_RELOC_LO16, breg);
7677 return;
7678
7679 case M_SEQ:
7680 if (sreg == 0)
7681 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7682 treg, (int) BFD_RELOC_LO16);
7683 else if (treg == 0)
7684 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7685 sreg, (int) BFD_RELOC_LO16);
7686 else
7687 {
7688 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7689 "d,v,t", dreg, sreg, treg);
7690 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7691 dreg, (int) BFD_RELOC_LO16);
7692 }
7693 return;
7694
7695 case M_SEQ_I:
7696 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7697 {
7698 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7699 sreg, (int) BFD_RELOC_LO16);
7700 return;
7701 }
7702 if (sreg == 0)
7703 {
7704 as_warn (_("Instruction %s: result is always false"),
7705 ip->insn_mo->name);
7706 move_register (&icnt, dreg, 0);
7707 return;
7708 }
7709 if (imm_expr.X_op == O_constant
7710 && imm_expr.X_add_number >= 0
7711 && imm_expr.X_add_number < 0x10000)
7712 {
7713 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
7714 sreg, (int) BFD_RELOC_LO16);
7715 used_at = 0;
7716 }
7717 else if (imm_expr.X_op == O_constant
7718 && imm_expr.X_add_number > -0x8000
7719 && imm_expr.X_add_number < 0)
7720 {
7721 imm_expr.X_add_number = -imm_expr.X_add_number;
7722 macro_build ((char *) NULL, &icnt, &imm_expr,
7723 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7724 "t,r,j", dreg, sreg,
7725 (int) BFD_RELOC_LO16);
7726 used_at = 0;
7727 }
7728 else
7729 {
7730 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7731 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7732 "d,v,t", dreg, sreg, AT);
7733 used_at = 1;
7734 }
7735 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
7736 (int) BFD_RELOC_LO16);
7737 if (used_at)
7738 break;
7739 return;
7740
7741 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7742 s = "slt";
7743 goto sge;
7744 case M_SGEU:
7745 s = "sltu";
7746 sge:
7747 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7748 dreg, sreg, treg);
7749 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7750 (int) BFD_RELOC_LO16);
7751 return;
7752
7753 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7754 case M_SGEU_I:
7755 if (imm_expr.X_op == O_constant
7756 && imm_expr.X_add_number >= -0x8000
7757 && imm_expr.X_add_number < 0x8000)
7758 {
7759 macro_build ((char *) NULL, &icnt, &imm_expr,
7760 mask == M_SGE_I ? "slti" : "sltiu",
7761 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7762 used_at = 0;
7763 }
7764 else
7765 {
7766 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7767 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7768 mask == M_SGE_I ? "slt" : "sltu", "d,v,t", dreg, sreg,
7769 AT);
7770 used_at = 1;
7771 }
7772 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7773 (int) BFD_RELOC_LO16);
7774 if (used_at)
7775 break;
7776 return;
7777
7778 case M_SGT: /* sreg > treg <==> treg < sreg */
7779 s = "slt";
7780 goto sgt;
7781 case M_SGTU:
7782 s = "sltu";
7783 sgt:
7784 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7785 dreg, treg, sreg);
7786 return;
7787
7788 case M_SGT_I: /* sreg > I <==> I < sreg */
7789 s = "slt";
7790 goto sgti;
7791 case M_SGTU_I:
7792 s = "sltu";
7793 sgti:
7794 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7795 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7796 dreg, AT, sreg);
7797 break;
7798
7799 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7800 s = "slt";
7801 goto sle;
7802 case M_SLEU:
7803 s = "sltu";
7804 sle:
7805 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7806 dreg, treg, sreg);
7807 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7808 (int) BFD_RELOC_LO16);
7809 return;
7810
7811 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7812 s = "slt";
7813 goto slei;
7814 case M_SLEU_I:
7815 s = "sltu";
7816 slei:
7817 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7818 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7819 dreg, AT, sreg);
7820 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7821 (int) BFD_RELOC_LO16);
7822 break;
7823
7824 case M_SLT_I:
7825 if (imm_expr.X_op == O_constant
7826 && imm_expr.X_add_number >= -0x8000
7827 && imm_expr.X_add_number < 0x8000)
7828 {
7829 macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
7830 dreg, sreg, (int) BFD_RELOC_LO16);
7831 return;
7832 }
7833 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7834 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
7835 dreg, sreg, AT);
7836 break;
7837
7838 case M_SLTU_I:
7839 if (imm_expr.X_op == O_constant
7840 && imm_expr.X_add_number >= -0x8000
7841 && imm_expr.X_add_number < 0x8000)
7842 {
7843 macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
7844 dreg, sreg, (int) BFD_RELOC_LO16);
7845 return;
7846 }
7847 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7848 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7849 "d,v,t", dreg, sreg, AT);
7850 break;
7851
7852 case M_SNE:
7853 if (sreg == 0)
7854 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7855 "d,v,t", dreg, 0, treg);
7856 else if (treg == 0)
7857 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7858 "d,v,t", dreg, 0, sreg);
7859 else
7860 {
7861 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7862 "d,v,t", dreg, sreg, treg);
7863 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7864 "d,v,t", dreg, 0, dreg);
7865 }
7866 return;
7867
7868 case M_SNE_I:
7869 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7870 {
7871 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7872 "d,v,t", dreg, 0, sreg);
7873 return;
7874 }
7875 if (sreg == 0)
7876 {
7877 as_warn (_("Instruction %s: result is always true"),
7878 ip->insn_mo->name);
7879 macro_build ((char *) NULL, &icnt, &expr1,
7880 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7881 "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
7882 return;
7883 }
7884 if (imm_expr.X_op == O_constant
7885 && imm_expr.X_add_number >= 0
7886 && imm_expr.X_add_number < 0x10000)
7887 {
7888 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
7889 dreg, sreg, (int) BFD_RELOC_LO16);
7890 used_at = 0;
7891 }
7892 else if (imm_expr.X_op == O_constant
7893 && imm_expr.X_add_number > -0x8000
7894 && imm_expr.X_add_number < 0)
7895 {
7896 imm_expr.X_add_number = -imm_expr.X_add_number;
7897 macro_build ((char *) NULL, &icnt, &imm_expr,
7898 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7899 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7900 used_at = 0;
7901 }
7902 else
7903 {
7904 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7905 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7906 "d,v,t", dreg, sreg, AT);
7907 used_at = 1;
7908 }
7909 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7910 "d,v,t", dreg, 0, dreg);
7911 if (used_at)
7912 break;
7913 return;
7914
7915 case M_DSUB_I:
7916 dbl = 1;
7917 case M_SUB_I:
7918 if (imm_expr.X_op == O_constant
7919 && imm_expr.X_add_number > -0x8000
7920 && imm_expr.X_add_number <= 0x8000)
7921 {
7922 imm_expr.X_add_number = -imm_expr.X_add_number;
7923 macro_build ((char *) NULL, &icnt, &imm_expr,
7924 dbl ? "daddi" : "addi",
7925 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7926 return;
7927 }
7928 load_register (&icnt, AT, &imm_expr, dbl);
7929 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7930 dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7931 break;
7932
7933 case M_DSUBU_I:
7934 dbl = 1;
7935 case M_SUBU_I:
7936 if (imm_expr.X_op == O_constant
7937 && imm_expr.X_add_number > -0x8000
7938 && imm_expr.X_add_number <= 0x8000)
7939 {
7940 imm_expr.X_add_number = -imm_expr.X_add_number;
7941 macro_build ((char *) NULL, &icnt, &imm_expr,
7942 dbl ? "daddiu" : "addiu",
7943 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7944 return;
7945 }
7946 load_register (&icnt, AT, &imm_expr, dbl);
7947 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7948 dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7949 break;
7950
7951 case M_TEQ_I:
7952 s = "teq";
7953 goto trap;
7954 case M_TGE_I:
7955 s = "tge";
7956 goto trap;
7957 case M_TGEU_I:
7958 s = "tgeu";
7959 goto trap;
7960 case M_TLT_I:
7961 s = "tlt";
7962 goto trap;
7963 case M_TLTU_I:
7964 s = "tltu";
7965 goto trap;
7966 case M_TNE_I:
7967 s = "tne";
7968 trap:
7969 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7970 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "s,t", sreg,
7971 AT);
7972 break;
7973
7974 case M_TRUNCWS:
7975 case M_TRUNCWD:
7976 assert (mips_opts.isa == ISA_MIPS1);
7977 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7978 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7979
7980 /*
7981 * Is the double cfc1 instruction a bug in the mips assembler;
7982 * or is there a reason for it?
7983 */
7984 mips_emit_delays (TRUE);
7985 ++mips_opts.noreorder;
7986 mips_any_noreorder = 1;
7987 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7988 treg, RA);
7989 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7990 treg, RA);
7991 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7992 expr1.X_add_number = 3;
7993 macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
7994 (int) BFD_RELOC_LO16);
7995 expr1.X_add_number = 2;
7996 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
7997 (int) BFD_RELOC_LO16);
7998 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7999 AT, RA);
8000 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
8001 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8002 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
8003 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
8004 treg, RA);
8005 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
8006 --mips_opts.noreorder;
8007 break;
8008
8009 case M_ULH:
8010 s = "lb";
8011 goto ulh;
8012 case M_ULHU:
8013 s = "lbu";
8014 ulh:
8015 if (offset_expr.X_add_number >= 0x7fff)
8016 as_bad (_("operand overflow"));
8017 if (! target_big_endian)
8018 ++offset_expr.X_add_number;
8019 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", AT,
8020 (int) BFD_RELOC_LO16, breg);
8021 if (! target_big_endian)
8022 --offset_expr.X_add_number;
8023 else
8024 ++offset_expr.X_add_number;
8025 macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", treg,
8026 (int) BFD_RELOC_LO16, breg);
8027 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8028 AT, AT, 8);
8029 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8030 treg, treg, AT);
8031 break;
8032
8033 case M_ULD:
8034 s = "ldl";
8035 s2 = "ldr";
8036 off = 7;
8037 goto ulw;
8038 case M_ULW:
8039 s = "lwl";
8040 s2 = "lwr";
8041 off = 3;
8042 ulw:
8043 if (offset_expr.X_add_number >= 0x8000 - off)
8044 as_bad (_("operand overflow"));
8045 if (treg != breg)
8046 tempreg = treg;
8047 else
8048 tempreg = AT;
8049 if (! target_big_endian)
8050 offset_expr.X_add_number += off;
8051 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", tempreg,
8052 (int) BFD_RELOC_LO16, breg);
8053 if (! target_big_endian)
8054 offset_expr.X_add_number -= off;
8055 else
8056 offset_expr.X_add_number += off;
8057 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", tempreg,
8058 (int) BFD_RELOC_LO16, breg);
8059
8060 /* If necessary, move the result in tempreg the final destination. */
8061 if (treg == tempreg)
8062 return;
8063 /* Protect second load's delay slot. */
8064 if (!gpr_interlocks)
8065 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
8066 move_register (&icnt, treg, tempreg);
8067 break;
8068
8069 case M_ULD_A:
8070 s = "ldl";
8071 s2 = "ldr";
8072 off = 7;
8073 goto ulwa;
8074 case M_ULW_A:
8075 s = "lwl";
8076 s2 = "lwr";
8077 off = 3;
8078 ulwa:
8079 used_at = 1;
8080 load_address (&icnt, AT, &offset_expr, &used_at);
8081 if (breg != 0)
8082 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8083 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8084 ? "add" : "addu" : "daddu",
8085 "d,v,t", AT, AT, breg);
8086 if (! target_big_endian)
8087 expr1.X_add_number = off;
8088 else
8089 expr1.X_add_number = 0;
8090 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
8091 (int) BFD_RELOC_LO16, AT);
8092 if (! target_big_endian)
8093 expr1.X_add_number = 0;
8094 else
8095 expr1.X_add_number = off;
8096 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
8097 (int) BFD_RELOC_LO16, AT);
8098 break;
8099
8100 case M_ULH_A:
8101 case M_ULHU_A:
8102 used_at = 1;
8103 load_address (&icnt, AT, &offset_expr, &used_at);
8104 if (breg != 0)
8105 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8106 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8107 ? "add" : "addu" : "daddu",
8108 "d,v,t", AT, AT, breg);
8109 if (target_big_endian)
8110 expr1.X_add_number = 0;
8111 macro_build ((char *) NULL, &icnt, &expr1,
8112 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
8113 (int) BFD_RELOC_LO16, AT);
8114 if (target_big_endian)
8115 expr1.X_add_number = 1;
8116 else
8117 expr1.X_add_number = 0;
8118 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
8119 (int) BFD_RELOC_LO16, AT);
8120 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8121 treg, treg, 8);
8122 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8123 treg, treg, AT);
8124 break;
8125
8126 case M_USH:
8127 if (offset_expr.X_add_number >= 0x7fff)
8128 as_bad (_("operand overflow"));
8129 if (target_big_endian)
8130 ++offset_expr.X_add_number;
8131 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
8132 (int) BFD_RELOC_LO16, breg);
8133 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
8134 AT, treg, 8);
8135 if (target_big_endian)
8136 --offset_expr.X_add_number;
8137 else
8138 ++offset_expr.X_add_number;
8139 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
8140 (int) BFD_RELOC_LO16, breg);
8141 break;
8142
8143 case M_USD:
8144 s = "sdl";
8145 s2 = "sdr";
8146 off = 7;
8147 goto usw;
8148 case M_USW:
8149 s = "swl";
8150 s2 = "swr";
8151 off = 3;
8152 usw:
8153 if (offset_expr.X_add_number >= 0x8000 - off)
8154 as_bad (_("operand overflow"));
8155 if (! target_big_endian)
8156 offset_expr.X_add_number += off;
8157 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
8158 (int) BFD_RELOC_LO16, breg);
8159 if (! target_big_endian)
8160 offset_expr.X_add_number -= off;
8161 else
8162 offset_expr.X_add_number += off;
8163 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
8164 (int) BFD_RELOC_LO16, breg);
8165 return;
8166
8167 case M_USD_A:
8168 s = "sdl";
8169 s2 = "sdr";
8170 off = 7;
8171 goto uswa;
8172 case M_USW_A:
8173 s = "swl";
8174 s2 = "swr";
8175 off = 3;
8176 uswa:
8177 used_at = 1;
8178 load_address (&icnt, AT, &offset_expr, &used_at);
8179 if (breg != 0)
8180 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8181 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8182 ? "add" : "addu" : "daddu",
8183 "d,v,t", AT, AT, breg);
8184 if (! target_big_endian)
8185 expr1.X_add_number = off;
8186 else
8187 expr1.X_add_number = 0;
8188 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
8189 (int) BFD_RELOC_LO16, AT);
8190 if (! target_big_endian)
8191 expr1.X_add_number = 0;
8192 else
8193 expr1.X_add_number = off;
8194 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
8195 (int) BFD_RELOC_LO16, AT);
8196 break;
8197
8198 case M_USH_A:
8199 used_at = 1;
8200 load_address (&icnt, AT, &offset_expr, &used_at);
8201 if (breg != 0)
8202 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8203 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8204 ? "add" : "addu" : "daddu",
8205 "d,v,t", AT, AT, breg);
8206 if (! target_big_endian)
8207 expr1.X_add_number = 0;
8208 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
8209 (int) BFD_RELOC_LO16, AT);
8210 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
8211 treg, treg, 8);
8212 if (! target_big_endian)
8213 expr1.X_add_number = 1;
8214 else
8215 expr1.X_add_number = 0;
8216 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
8217 (int) BFD_RELOC_LO16, AT);
8218 if (! target_big_endian)
8219 expr1.X_add_number = 0;
8220 else
8221 expr1.X_add_number = 1;
8222 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
8223 (int) BFD_RELOC_LO16, AT);
8224 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8225 treg, treg, 8);
8226 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8227 treg, treg, AT);
8228 break;
8229
8230 default:
8231 /* FIXME: Check if this is one of the itbl macros, since they
8232 are added dynamically. */
8233 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8234 break;
8235 }
8236 if (mips_opts.noat)
8237 as_warn (_("Macro used $at after \".set noat\""));
8238 }
8239
8240 /* Implement macros in mips16 mode. */
8241
8242 static void
8243 mips16_macro (ip)
8244 struct mips_cl_insn *ip;
8245 {
8246 int mask;
8247 int xreg, yreg, zreg, tmp;
8248 int icnt;
8249 expressionS expr1;
8250 int dbl;
8251 const char *s, *s2, *s3;
8252
8253 mask = ip->insn_mo->mask;
8254
8255 xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
8256 yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
8257 zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
8258
8259 icnt = 0;
8260
8261 expr1.X_op = O_constant;
8262 expr1.X_op_symbol = NULL;
8263 expr1.X_add_symbol = NULL;
8264 expr1.X_add_number = 1;
8265
8266 dbl = 0;
8267
8268 switch (mask)
8269 {
8270 default:
8271 internalError ();
8272
8273 case M_DDIV_3:
8274 dbl = 1;
8275 case M_DIV_3:
8276 s = "mflo";
8277 goto do_div3;
8278 case M_DREM_3:
8279 dbl = 1;
8280 case M_REM_3:
8281 s = "mfhi";
8282 do_div3:
8283 mips_emit_delays (TRUE);
8284 ++mips_opts.noreorder;
8285 mips_any_noreorder = 1;
8286 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8287 dbl ? "ddiv" : "div",
8288 "0,x,y", xreg, yreg);
8289 expr1.X_add_number = 2;
8290 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
8291 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break", "6",
8292 7);
8293
8294 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8295 since that causes an overflow. We should do that as well,
8296 but I don't see how to do the comparisons without a temporary
8297 register. */
8298 --mips_opts.noreorder;
8299 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x", zreg);
8300 break;
8301
8302 case M_DIVU_3:
8303 s = "divu";
8304 s2 = "mflo";
8305 goto do_divu3;
8306 case M_REMU_3:
8307 s = "divu";
8308 s2 = "mfhi";
8309 goto do_divu3;
8310 case M_DDIVU_3:
8311 s = "ddivu";
8312 s2 = "mflo";
8313 goto do_divu3;
8314 case M_DREMU_3:
8315 s = "ddivu";
8316 s2 = "mfhi";
8317 do_divu3:
8318 mips_emit_delays (TRUE);
8319 ++mips_opts.noreorder;
8320 mips_any_noreorder = 1;
8321 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "0,x,y",
8322 xreg, yreg);
8323 expr1.X_add_number = 2;
8324 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
8325 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
8326 "6", 7);
8327 --mips_opts.noreorder;
8328 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "x", zreg);
8329 break;
8330
8331 case M_DMUL:
8332 dbl = 1;
8333 case M_MUL:
8334 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8335 dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8336 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "x",
8337 zreg);
8338 return;
8339
8340 case M_DSUBU_I:
8341 dbl = 1;
8342 goto do_subu;
8343 case M_SUBU_I:
8344 do_subu:
8345 if (imm_expr.X_op != O_constant)
8346 as_bad (_("Unsupported large constant"));
8347 imm_expr.X_add_number = -imm_expr.X_add_number;
8348 macro_build ((char *) NULL, &icnt, &imm_expr,
8349 dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8350 break;
8351
8352 case M_SUBU_I_2:
8353 if (imm_expr.X_op != O_constant)
8354 as_bad (_("Unsupported large constant"));
8355 imm_expr.X_add_number = -imm_expr.X_add_number;
8356 macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
8357 "x,k", xreg);
8358 break;
8359
8360 case M_DSUBU_I_2:
8361 if (imm_expr.X_op != O_constant)
8362 as_bad (_("Unsupported large constant"));
8363 imm_expr.X_add_number = -imm_expr.X_add_number;
8364 macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
8365 "y,j", yreg);
8366 break;
8367
8368 case M_BEQ:
8369 s = "cmp";
8370 s2 = "bteqz";
8371 goto do_branch;
8372 case M_BNE:
8373 s = "cmp";
8374 s2 = "btnez";
8375 goto do_branch;
8376 case M_BLT:
8377 s = "slt";
8378 s2 = "btnez";
8379 goto do_branch;
8380 case M_BLTU:
8381 s = "sltu";
8382 s2 = "btnez";
8383 goto do_branch;
8384 case M_BLE:
8385 s = "slt";
8386 s2 = "bteqz";
8387 goto do_reverse_branch;
8388 case M_BLEU:
8389 s = "sltu";
8390 s2 = "bteqz";
8391 goto do_reverse_branch;
8392 case M_BGE:
8393 s = "slt";
8394 s2 = "bteqz";
8395 goto do_branch;
8396 case M_BGEU:
8397 s = "sltu";
8398 s2 = "bteqz";
8399 goto do_branch;
8400 case M_BGT:
8401 s = "slt";
8402 s2 = "btnez";
8403 goto do_reverse_branch;
8404 case M_BGTU:
8405 s = "sltu";
8406 s2 = "btnez";
8407
8408 do_reverse_branch:
8409 tmp = xreg;
8410 xreg = yreg;
8411 yreg = tmp;
8412
8413 do_branch:
8414 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
8415 xreg, yreg);
8416 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
8417 break;
8418
8419 case M_BEQ_I:
8420 s = "cmpi";
8421 s2 = "bteqz";
8422 s3 = "x,U";
8423 goto do_branch_i;
8424 case M_BNE_I:
8425 s = "cmpi";
8426 s2 = "btnez";
8427 s3 = "x,U";
8428 goto do_branch_i;
8429 case M_BLT_I:
8430 s = "slti";
8431 s2 = "btnez";
8432 s3 = "x,8";
8433 goto do_branch_i;
8434 case M_BLTU_I:
8435 s = "sltiu";
8436 s2 = "btnez";
8437 s3 = "x,8";
8438 goto do_branch_i;
8439 case M_BLE_I:
8440 s = "slti";
8441 s2 = "btnez";
8442 s3 = "x,8";
8443 goto do_addone_branch_i;
8444 case M_BLEU_I:
8445 s = "sltiu";
8446 s2 = "btnez";
8447 s3 = "x,8";
8448 goto do_addone_branch_i;
8449 case M_BGE_I:
8450 s = "slti";
8451 s2 = "bteqz";
8452 s3 = "x,8";
8453 goto do_branch_i;
8454 case M_BGEU_I:
8455 s = "sltiu";
8456 s2 = "bteqz";
8457 s3 = "x,8";
8458 goto do_branch_i;
8459 case M_BGT_I:
8460 s = "slti";
8461 s2 = "bteqz";
8462 s3 = "x,8";
8463 goto do_addone_branch_i;
8464 case M_BGTU_I:
8465 s = "sltiu";
8466 s2 = "bteqz";
8467 s3 = "x,8";
8468
8469 do_addone_branch_i:
8470 if (imm_expr.X_op != O_constant)
8471 as_bad (_("Unsupported large constant"));
8472 ++imm_expr.X_add_number;
8473
8474 do_branch_i:
8475 macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
8476 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
8477 break;
8478
8479 case M_ABS:
8480 expr1.X_add_number = 0;
8481 macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8", yreg);
8482 if (xreg != yreg)
8483 move_register (&icnt, xreg, yreg);
8484 expr1.X_add_number = 2;
8485 macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
8486 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8487 "neg", "x,w", xreg, xreg);
8488 }
8489 }
8490
8491 /* For consistency checking, verify that all bits are specified either
8492 by the match/mask part of the instruction definition, or by the
8493 operand list. */
8494 static int
8495 validate_mips_insn (opc)
8496 const struct mips_opcode *opc;
8497 {
8498 const char *p = opc->args;
8499 char c;
8500 unsigned long used_bits = opc->mask;
8501
8502 if ((used_bits & opc->match) != opc->match)
8503 {
8504 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8505 opc->name, opc->args);
8506 return 0;
8507 }
8508 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8509 while (*p)
8510 switch (c = *p++)
8511 {
8512 case ',': break;
8513 case '(': break;
8514 case ')': break;
8515 case '+':
8516 switch (c = *p++)
8517 {
8518 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8519 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8520 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8521 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8522 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8523 default:
8524 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8525 c, opc->name, opc->args);
8526 return 0;
8527 }
8528 break;
8529 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8530 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8531 case 'A': break;
8532 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8533 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8534 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8535 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8536 case 'F': break;
8537 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8538 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8539 case 'I': break;
8540 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8541 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8542 case 'L': break;
8543 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8544 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8545 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8546 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8547 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8548 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8549 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8550 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8551 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8552 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8553 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8554 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8555 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8556 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8557 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8558 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8559 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8560 case 'f': break;
8561 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8562 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8563 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8564 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8565 case 'l': break;
8566 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8567 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8568 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8569 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8570 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8571 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8572 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8573 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8574 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8575 case 'x': break;
8576 case 'z': break;
8577 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8578 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8579 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8580 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8581 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8582 case '[': break;
8583 case ']': break;
8584 default:
8585 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8586 c, opc->name, opc->args);
8587 return 0;
8588 }
8589 #undef USE_BITS
8590 if (used_bits != 0xffffffff)
8591 {
8592 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8593 ~used_bits & 0xffffffff, opc->name, opc->args);
8594 return 0;
8595 }
8596 return 1;
8597 }
8598
8599 /* This routine assembles an instruction into its binary format. As a
8600 side effect, it sets one of the global variables imm_reloc or
8601 offset_reloc to the type of relocation to do if one of the operands
8602 is an address expression. */
8603
8604 static void
8605 mips_ip (str, ip)
8606 char *str;
8607 struct mips_cl_insn *ip;
8608 {
8609 char *s;
8610 const char *args;
8611 char c = 0;
8612 struct mips_opcode *insn;
8613 char *argsStart;
8614 unsigned int regno;
8615 unsigned int lastregno = 0;
8616 unsigned int lastpos = 0;
8617 unsigned int limlo, limhi;
8618 char *s_reset;
8619 char save_c = 0;
8620
8621 insn_error = NULL;
8622
8623 /* If the instruction contains a '.', we first try to match an instruction
8624 including the '.'. Then we try again without the '.'. */
8625 insn = NULL;
8626 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8627 continue;
8628
8629 /* If we stopped on whitespace, then replace the whitespace with null for
8630 the call to hash_find. Save the character we replaced just in case we
8631 have to re-parse the instruction. */
8632 if (ISSPACE (*s))
8633 {
8634 save_c = *s;
8635 *s++ = '\0';
8636 }
8637
8638 insn = (struct mips_opcode *) hash_find (op_hash, str);
8639
8640 /* If we didn't find the instruction in the opcode table, try again, but
8641 this time with just the instruction up to, but not including the
8642 first '.'. */
8643 if (insn == NULL)
8644 {
8645 /* Restore the character we overwrite above (if any). */
8646 if (save_c)
8647 *(--s) = save_c;
8648
8649 /* Scan up to the first '.' or whitespace. */
8650 for (s = str;
8651 *s != '\0' && *s != '.' && !ISSPACE (*s);
8652 ++s)
8653 continue;
8654
8655 /* If we did not find a '.', then we can quit now. */
8656 if (*s != '.')
8657 {
8658 insn_error = "unrecognized opcode";
8659 return;
8660 }
8661
8662 /* Lookup the instruction in the hash table. */
8663 *s++ = '\0';
8664 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8665 {
8666 insn_error = "unrecognized opcode";
8667 return;
8668 }
8669 }
8670
8671 argsStart = s;
8672 for (;;)
8673 {
8674 bfd_boolean ok;
8675
8676 assert (strcmp (insn->name, str) == 0);
8677
8678 if (OPCODE_IS_MEMBER (insn,
8679 (mips_opts.isa
8680 | (file_ase_mips16 ? INSN_MIPS16 : 0)
8681 | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8682 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8683 mips_arch))
8684 ok = TRUE;
8685 else
8686 ok = FALSE;
8687
8688 if (insn->pinfo != INSN_MACRO)
8689 {
8690 if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8691 ok = FALSE;
8692 }
8693
8694 if (! ok)
8695 {
8696 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8697 && strcmp (insn->name, insn[1].name) == 0)
8698 {
8699 ++insn;
8700 continue;
8701 }
8702 else
8703 {
8704 if (!insn_error)
8705 {
8706 static char buf[100];
8707 if (mips_arch_info->is_isa)
8708 sprintf (buf,
8709 _("opcode not supported at this ISA level (%s)"),
8710 mips_cpu_info_from_isa (mips_opts.isa)->name);
8711 else
8712 sprintf (buf,
8713 _("opcode not supported on this processor: %s (%s)"),
8714 mips_arch_info->name,
8715 mips_cpu_info_from_isa (mips_opts.isa)->name);
8716 insn_error = buf;
8717 }
8718 if (save_c)
8719 *(--s) = save_c;
8720 return;
8721 }
8722 }
8723
8724 ip->insn_mo = insn;
8725 ip->insn_opcode = insn->match;
8726 insn_error = NULL;
8727 for (args = insn->args;; ++args)
8728 {
8729 int is_mdmx;
8730
8731 s += strspn (s, " \t");
8732 is_mdmx = 0;
8733 switch (*args)
8734 {
8735 case '\0': /* end of args */
8736 if (*s == '\0')
8737 return;
8738 break;
8739
8740 case ',':
8741 if (*s++ == *args)
8742 continue;
8743 s--;
8744 switch (*++args)
8745 {
8746 case 'r':
8747 case 'v':
8748 ip->insn_opcode |= lastregno << OP_SH_RS;
8749 continue;
8750
8751 case 'w':
8752 ip->insn_opcode |= lastregno << OP_SH_RT;
8753 continue;
8754
8755 case 'W':
8756 ip->insn_opcode |= lastregno << OP_SH_FT;
8757 continue;
8758
8759 case 'V':
8760 ip->insn_opcode |= lastregno << OP_SH_FS;
8761 continue;
8762 }
8763 break;
8764
8765 case '(':
8766 /* Handle optional base register.
8767 Either the base register is omitted or
8768 we must have a left paren. */
8769 /* This is dependent on the next operand specifier
8770 is a base register specification. */
8771 assert (args[1] == 'b' || args[1] == '5'
8772 || args[1] == '-' || args[1] == '4');
8773 if (*s == '\0')
8774 return;
8775
8776 case ')': /* these must match exactly */
8777 case '[':
8778 case ']':
8779 if (*s++ == *args)
8780 continue;
8781 break;
8782
8783 case '+': /* Opcode extension character. */
8784 switch (*++args)
8785 {
8786 case 'A': /* ins/ext position, becomes LSB. */
8787 limlo = 0;
8788 limhi = 31;
8789 my_getExpression (&imm_expr, s);
8790 check_absolute_expr (ip, &imm_expr);
8791 if ((unsigned long) imm_expr.X_add_number < limlo
8792 || (unsigned long) imm_expr.X_add_number > limhi)
8793 {
8794 as_bad (_("Improper position (%lu)"),
8795 (unsigned long) imm_expr.X_add_number);
8796 imm_expr.X_add_number = limlo;
8797 }
8798 lastpos = imm_expr.X_add_number;
8799 ip->insn_opcode |= (imm_expr.X_add_number
8800 & OP_MASK_SHAMT) << OP_SH_SHAMT;
8801 imm_expr.X_op = O_absent;
8802 s = expr_end;
8803 continue;
8804
8805 case 'B': /* ins size, becomes MSB. */
8806 limlo = 1;
8807 limhi = 32;
8808 my_getExpression (&imm_expr, s);
8809 check_absolute_expr (ip, &imm_expr);
8810 /* Check for negative input so that small negative numbers
8811 will not succeed incorrectly. The checks against
8812 (pos+size) transitively check "size" itself,
8813 assuming that "pos" is reasonable. */
8814 if ((long) imm_expr.X_add_number < 0
8815 || ((unsigned long) imm_expr.X_add_number
8816 + lastpos) < limlo
8817 || ((unsigned long) imm_expr.X_add_number
8818 + lastpos) > limhi)
8819 {
8820 as_bad (_("Improper insert size (%lu, position %lu)"),
8821 (unsigned long) imm_expr.X_add_number,
8822 (unsigned long) lastpos);
8823 imm_expr.X_add_number = limlo - lastpos;
8824 }
8825 ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8826 & OP_MASK_INSMSB) << OP_SH_INSMSB;
8827 imm_expr.X_op = O_absent;
8828 s = expr_end;
8829 continue;
8830
8831 case 'C': /* ext size, becomes MSBD. */
8832 limlo = 1;
8833 limhi = 32;
8834 my_getExpression (&imm_expr, s);
8835 check_absolute_expr (ip, &imm_expr);
8836 /* Check for negative input so that small negative numbers
8837 will not succeed incorrectly. The checks against
8838 (pos+size) transitively check "size" itself,
8839 assuming that "pos" is reasonable. */
8840 if ((long) imm_expr.X_add_number < 0
8841 || ((unsigned long) imm_expr.X_add_number
8842 + lastpos) < limlo
8843 || ((unsigned long) imm_expr.X_add_number
8844 + lastpos) > limhi)
8845 {
8846 as_bad (_("Improper extract size (%lu, position %lu)"),
8847 (unsigned long) imm_expr.X_add_number,
8848 (unsigned long) lastpos);
8849 imm_expr.X_add_number = limlo - lastpos;
8850 }
8851 ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8852 & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8853 imm_expr.X_op = O_absent;
8854 s = expr_end;
8855 continue;
8856
8857 case 'D':
8858 /* +D is for disassembly only; never match. */
8859 break;
8860
8861 default:
8862 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8863 *args, insn->name, insn->args);
8864 /* Further processing is fruitless. */
8865 return;
8866 }
8867 break;
8868
8869 case '<': /* must be at least one digit */
8870 /*
8871 * According to the manual, if the shift amount is greater
8872 * than 31 or less than 0, then the shift amount should be
8873 * mod 32. In reality the mips assembler issues an error.
8874 * We issue a warning and mask out all but the low 5 bits.
8875 */
8876 my_getExpression (&imm_expr, s);
8877 check_absolute_expr (ip, &imm_expr);
8878 if ((unsigned long) imm_expr.X_add_number > 31)
8879 {
8880 as_warn (_("Improper shift amount (%lu)"),
8881 (unsigned long) imm_expr.X_add_number);
8882 imm_expr.X_add_number &= OP_MASK_SHAMT;
8883 }
8884 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8885 imm_expr.X_op = O_absent;
8886 s = expr_end;
8887 continue;
8888
8889 case '>': /* shift amount minus 32 */
8890 my_getExpression (&imm_expr, s);
8891 check_absolute_expr (ip, &imm_expr);
8892 if ((unsigned long) imm_expr.X_add_number < 32
8893 || (unsigned long) imm_expr.X_add_number > 63)
8894 break;
8895 ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8896 imm_expr.X_op = O_absent;
8897 s = expr_end;
8898 continue;
8899
8900 case 'k': /* cache code */
8901 case 'h': /* prefx code */
8902 my_getExpression (&imm_expr, s);
8903 check_absolute_expr (ip, &imm_expr);
8904 if ((unsigned long) imm_expr.X_add_number > 31)
8905 {
8906 as_warn (_("Invalid value for `%s' (%lu)"),
8907 ip->insn_mo->name,
8908 (unsigned long) imm_expr.X_add_number);
8909 imm_expr.X_add_number &= 0x1f;
8910 }
8911 if (*args == 'k')
8912 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8913 else
8914 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8915 imm_expr.X_op = O_absent;
8916 s = expr_end;
8917 continue;
8918
8919 case 'c': /* break code */
8920 my_getExpression (&imm_expr, s);
8921 check_absolute_expr (ip, &imm_expr);
8922 if ((unsigned long) imm_expr.X_add_number > 1023)
8923 {
8924 as_warn (_("Illegal break code (%lu)"),
8925 (unsigned long) imm_expr.X_add_number);
8926 imm_expr.X_add_number &= OP_MASK_CODE;
8927 }
8928 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8929 imm_expr.X_op = O_absent;
8930 s = expr_end;
8931 continue;
8932
8933 case 'q': /* lower break code */
8934 my_getExpression (&imm_expr, s);
8935 check_absolute_expr (ip, &imm_expr);
8936 if ((unsigned long) imm_expr.X_add_number > 1023)
8937 {
8938 as_warn (_("Illegal lower break code (%lu)"),
8939 (unsigned long) imm_expr.X_add_number);
8940 imm_expr.X_add_number &= OP_MASK_CODE2;
8941 }
8942 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8943 imm_expr.X_op = O_absent;
8944 s = expr_end;
8945 continue;
8946
8947 case 'B': /* 20-bit syscall/break code. */
8948 my_getExpression (&imm_expr, s);
8949 check_absolute_expr (ip, &imm_expr);
8950 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8951 as_warn (_("Illegal 20-bit code (%lu)"),
8952 (unsigned long) imm_expr.X_add_number);
8953 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8954 imm_expr.X_op = O_absent;
8955 s = expr_end;
8956 continue;
8957
8958 case 'C': /* Coprocessor code */
8959 my_getExpression (&imm_expr, s);
8960 check_absolute_expr (ip, &imm_expr);
8961 if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8962 {
8963 as_warn (_("Coproccesor code > 25 bits (%lu)"),
8964 (unsigned long) imm_expr.X_add_number);
8965 imm_expr.X_add_number &= ((1 << 25) - 1);
8966 }
8967 ip->insn_opcode |= imm_expr.X_add_number;
8968 imm_expr.X_op = O_absent;
8969 s = expr_end;
8970 continue;
8971
8972 case 'J': /* 19-bit wait code. */
8973 my_getExpression (&imm_expr, s);
8974 check_absolute_expr (ip, &imm_expr);
8975 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8976 as_warn (_("Illegal 19-bit code (%lu)"),
8977 (unsigned long) imm_expr.X_add_number);
8978 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8979 imm_expr.X_op = O_absent;
8980 s = expr_end;
8981 continue;
8982
8983 case 'P': /* Performance register */
8984 my_getExpression (&imm_expr, s);
8985 check_absolute_expr (ip, &imm_expr);
8986 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8987 {
8988 as_warn (_("Invalid performance register (%lu)"),
8989 (unsigned long) imm_expr.X_add_number);
8990 imm_expr.X_add_number &= OP_MASK_PERFREG;
8991 }
8992 ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8993 imm_expr.X_op = O_absent;
8994 s = expr_end;
8995 continue;
8996
8997 case 'b': /* base register */
8998 case 'd': /* destination register */
8999 case 's': /* source register */
9000 case 't': /* target register */
9001 case 'r': /* both target and source */
9002 case 'v': /* both dest and source */
9003 case 'w': /* both dest and target */
9004 case 'E': /* coprocessor target register */
9005 case 'G': /* coprocessor destination register */
9006 case 'K': /* 'rdhwr' destination register */
9007 case 'x': /* ignore register name */
9008 case 'z': /* must be zero register */
9009 case 'U': /* destination register (clo/clz). */
9010 s_reset = s;
9011 if (s[0] == '$')
9012 {
9013
9014 if (ISDIGIT (s[1]))
9015 {
9016 ++s;
9017 regno = 0;
9018 do
9019 {
9020 regno *= 10;
9021 regno += *s - '0';
9022 ++s;
9023 }
9024 while (ISDIGIT (*s));
9025 if (regno > 31)
9026 as_bad (_("Invalid register number (%d)"), regno);
9027 }
9028 else if (*args == 'E' || *args == 'G' || *args == 'K')
9029 goto notreg;
9030 else
9031 {
9032 if (s[1] == 'r' && s[2] == 'a')
9033 {
9034 s += 3;
9035 regno = RA;
9036 }
9037 else if (s[1] == 'f' && s[2] == 'p')
9038 {
9039 s += 3;
9040 regno = FP;
9041 }
9042 else if (s[1] == 's' && s[2] == 'p')
9043 {
9044 s += 3;
9045 regno = SP;
9046 }
9047 else if (s[1] == 'g' && s[2] == 'p')
9048 {
9049 s += 3;
9050 regno = GP;
9051 }
9052 else if (s[1] == 'a' && s[2] == 't')
9053 {
9054 s += 3;
9055 regno = AT;
9056 }
9057 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9058 {
9059 s += 4;
9060 regno = KT0;
9061 }
9062 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9063 {
9064 s += 4;
9065 regno = KT1;
9066 }
9067 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9068 {
9069 s += 5;
9070 regno = ZERO;
9071 }
9072 else if (itbl_have_entries)
9073 {
9074 char *p, *n;
9075 unsigned long r;
9076
9077 p = s + 1; /* advance past '$' */
9078 n = itbl_get_field (&p); /* n is name */
9079
9080 /* See if this is a register defined in an
9081 itbl entry. */
9082 if (itbl_get_reg_val (n, &r))
9083 {
9084 /* Get_field advances to the start of
9085 the next field, so we need to back
9086 rack to the end of the last field. */
9087 if (p)
9088 s = p - 1;
9089 else
9090 s = strchr (s, '\0');
9091 regno = r;
9092 }
9093 else
9094 goto notreg;
9095 }
9096 else
9097 goto notreg;
9098 }
9099 if (regno == AT
9100 && ! mips_opts.noat
9101 && *args != 'E'
9102 && *args != 'G'
9103 && *args != 'K')
9104 as_warn (_("Used $at without \".set noat\""));
9105 c = *args;
9106 if (*s == ' ')
9107 ++s;
9108 if (args[1] != *s)
9109 {
9110 if (c == 'r' || c == 'v' || c == 'w')
9111 {
9112 regno = lastregno;
9113 s = s_reset;
9114 ++args;
9115 }
9116 }
9117 /* 'z' only matches $0. */
9118 if (c == 'z' && regno != 0)
9119 break;
9120
9121 /* Now that we have assembled one operand, we use the args string
9122 * to figure out where it goes in the instruction. */
9123 switch (c)
9124 {
9125 case 'r':
9126 case 's':
9127 case 'v':
9128 case 'b':
9129 ip->insn_opcode |= regno << OP_SH_RS;
9130 break;
9131 case 'd':
9132 case 'G':
9133 case 'K':
9134 ip->insn_opcode |= regno << OP_SH_RD;
9135 break;
9136 case 'U':
9137 ip->insn_opcode |= regno << OP_SH_RD;
9138 ip->insn_opcode |= regno << OP_SH_RT;
9139 break;
9140 case 'w':
9141 case 't':
9142 case 'E':
9143 ip->insn_opcode |= regno << OP_SH_RT;
9144 break;
9145 case 'x':
9146 /* This case exists because on the r3000 trunc
9147 expands into a macro which requires a gp
9148 register. On the r6000 or r4000 it is
9149 assembled into a single instruction which
9150 ignores the register. Thus the insn version
9151 is MIPS_ISA2 and uses 'x', and the macro
9152 version is MIPS_ISA1 and uses 't'. */
9153 break;
9154 case 'z':
9155 /* This case is for the div instruction, which
9156 acts differently if the destination argument
9157 is $0. This only matches $0, and is checked
9158 outside the switch. */
9159 break;
9160 case 'D':
9161 /* Itbl operand; not yet implemented. FIXME ?? */
9162 break;
9163 /* What about all other operands like 'i', which
9164 can be specified in the opcode table? */
9165 }
9166 lastregno = regno;
9167 continue;
9168 }
9169 notreg:
9170 switch (*args++)
9171 {
9172 case 'r':
9173 case 'v':
9174 ip->insn_opcode |= lastregno << OP_SH_RS;
9175 continue;
9176 case 'w':
9177 ip->insn_opcode |= lastregno << OP_SH_RT;
9178 continue;
9179 }
9180 break;
9181
9182 case 'O': /* MDMX alignment immediate constant. */
9183 my_getExpression (&imm_expr, s);
9184 check_absolute_expr (ip, &imm_expr);
9185 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9186 {
9187 as_warn ("Improper align amount (%ld), using low bits",
9188 (long) imm_expr.X_add_number);
9189 imm_expr.X_add_number &= OP_MASK_ALN;
9190 }
9191 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
9192 imm_expr.X_op = O_absent;
9193 s = expr_end;
9194 continue;
9195
9196 case 'Q': /* MDMX vector, element sel, or const. */
9197 if (s[0] != '$')
9198 {
9199 /* MDMX Immediate. */
9200 my_getExpression (&imm_expr, s);
9201 check_absolute_expr (ip, &imm_expr);
9202 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9203 {
9204 as_warn (_("Invalid MDMX Immediate (%ld)"),
9205 (long) imm_expr.X_add_number);
9206 imm_expr.X_add_number &= OP_MASK_FT;
9207 }
9208 imm_expr.X_add_number &= OP_MASK_FT;
9209 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9210 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9211 else
9212 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9213 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
9214 imm_expr.X_op = O_absent;
9215 s = expr_end;
9216 continue;
9217 }
9218 /* Not MDMX Immediate. Fall through. */
9219 case 'X': /* MDMX destination register. */
9220 case 'Y': /* MDMX source register. */
9221 case 'Z': /* MDMX target register. */
9222 is_mdmx = 1;
9223 case 'D': /* floating point destination register */
9224 case 'S': /* floating point source register */
9225 case 'T': /* floating point target register */
9226 case 'R': /* floating point source register */
9227 case 'V':
9228 case 'W':
9229 s_reset = s;
9230 /* Accept $fN for FP and MDMX register numbers, and in
9231 addition accept $vN for MDMX register numbers. */
9232 if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
9233 || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
9234 && ISDIGIT (s[2])))
9235 {
9236 s += 2;
9237 regno = 0;
9238 do
9239 {
9240 regno *= 10;
9241 regno += *s - '0';
9242 ++s;
9243 }
9244 while (ISDIGIT (*s));
9245
9246 if (regno > 31)
9247 as_bad (_("Invalid float register number (%d)"), regno);
9248
9249 if ((regno & 1) != 0
9250 && HAVE_32BIT_FPRS
9251 && ! (strcmp (str, "mtc1") == 0
9252 || strcmp (str, "mfc1") == 0
9253 || strcmp (str, "lwc1") == 0
9254 || strcmp (str, "swc1") == 0
9255 || strcmp (str, "l.s") == 0
9256 || strcmp (str, "s.s") == 0))
9257 as_warn (_("Float register should be even, was %d"),
9258 regno);
9259
9260 c = *args;
9261 if (*s == ' ')
9262 ++s;
9263 if (args[1] != *s)
9264 {
9265 if (c == 'V' || c == 'W')
9266 {
9267 regno = lastregno;
9268 s = s_reset;
9269 ++args;
9270 }
9271 }
9272 switch (c)
9273 {
9274 case 'D':
9275 case 'X':
9276 ip->insn_opcode |= regno << OP_SH_FD;
9277 break;
9278 case 'V':
9279 case 'S':
9280 case 'Y':
9281 ip->insn_opcode |= regno << OP_SH_FS;
9282 break;
9283 case 'Q':
9284 /* This is like 'Z', but also needs to fix the MDMX
9285 vector/scalar select bits. Note that the
9286 scalar immediate case is handled above. */
9287 if (*s == '[')
9288 {
9289 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9290 int max_el = (is_qh ? 3 : 7);
9291 s++;
9292 my_getExpression(&imm_expr, s);
9293 check_absolute_expr (ip, &imm_expr);
9294 s = expr_end;
9295 if (imm_expr.X_add_number > max_el)
9296 as_bad(_("Bad element selector %ld"),
9297 (long) imm_expr.X_add_number);
9298 imm_expr.X_add_number &= max_el;
9299 ip->insn_opcode |= (imm_expr.X_add_number
9300 << (OP_SH_VSEL +
9301 (is_qh ? 2 : 1)));
9302 if (*s != ']')
9303 as_warn(_("Expecting ']' found '%s'"), s);
9304 else
9305 s++;
9306 }
9307 else
9308 {
9309 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9310 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9311 << OP_SH_VSEL);
9312 else
9313 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9314 OP_SH_VSEL);
9315 }
9316 /* Fall through */
9317 case 'W':
9318 case 'T':
9319 case 'Z':
9320 ip->insn_opcode |= regno << OP_SH_FT;
9321 break;
9322 case 'R':
9323 ip->insn_opcode |= regno << OP_SH_FR;
9324 break;
9325 }
9326 lastregno = regno;
9327 continue;
9328 }
9329
9330 switch (*args++)
9331 {
9332 case 'V':
9333 ip->insn_opcode |= lastregno << OP_SH_FS;
9334 continue;
9335 case 'W':
9336 ip->insn_opcode |= lastregno << OP_SH_FT;
9337 continue;
9338 }
9339 break;
9340
9341 case 'I':
9342 my_getExpression (&imm_expr, s);
9343 if (imm_expr.X_op != O_big
9344 && imm_expr.X_op != O_constant)
9345 insn_error = _("absolute expression required");
9346 s = expr_end;
9347 continue;
9348
9349 case 'A':
9350 my_getExpression (&offset_expr, s);
9351 *imm_reloc = BFD_RELOC_32;
9352 s = expr_end;
9353 continue;
9354
9355 case 'F':
9356 case 'L':
9357 case 'f':
9358 case 'l':
9359 {
9360 int f64;
9361 int using_gprs;
9362 char *save_in;
9363 char *err;
9364 unsigned char temp[8];
9365 int len;
9366 unsigned int length;
9367 segT seg;
9368 subsegT subseg;
9369 char *p;
9370
9371 /* These only appear as the last operand in an
9372 instruction, and every instruction that accepts
9373 them in any variant accepts them in all variants.
9374 This means we don't have to worry about backing out
9375 any changes if the instruction does not match.
9376
9377 The difference between them is the size of the
9378 floating point constant and where it goes. For 'F'
9379 and 'L' the constant is 64 bits; for 'f' and 'l' it
9380 is 32 bits. Where the constant is placed is based
9381 on how the MIPS assembler does things:
9382 F -- .rdata
9383 L -- .lit8
9384 f -- immediate value
9385 l -- .lit4
9386
9387 The .lit4 and .lit8 sections are only used if
9388 permitted by the -G argument.
9389
9390 When generating embedded PIC code, we use the
9391 .lit8 section but not the .lit4 section (we can do
9392 .lit4 inline easily; we need to put .lit8
9393 somewhere in the data segment, and using .lit8
9394 permits the linker to eventually combine identical
9395 .lit8 entries).
9396
9397 The code below needs to know whether the target register
9398 is 32 or 64 bits wide. It relies on the fact 'f' and
9399 'F' are used with GPR-based instructions and 'l' and
9400 'L' are used with FPR-based instructions. */
9401
9402 f64 = *args == 'F' || *args == 'L';
9403 using_gprs = *args == 'F' || *args == 'f';
9404
9405 save_in = input_line_pointer;
9406 input_line_pointer = s;
9407 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9408 length = len;
9409 s = input_line_pointer;
9410 input_line_pointer = save_in;
9411 if (err != NULL && *err != '\0')
9412 {
9413 as_bad (_("Bad floating point constant: %s"), err);
9414 memset (temp, '\0', sizeof temp);
9415 length = f64 ? 8 : 4;
9416 }
9417
9418 assert (length == (unsigned) (f64 ? 8 : 4));
9419
9420 if (*args == 'f'
9421 || (*args == 'l'
9422 && (! USE_GLOBAL_POINTER_OPT
9423 || mips_pic == EMBEDDED_PIC
9424 || g_switch_value < 4
9425 || (temp[0] == 0 && temp[1] == 0)
9426 || (temp[2] == 0 && temp[3] == 0))))
9427 {
9428 imm_expr.X_op = O_constant;
9429 if (! target_big_endian)
9430 imm_expr.X_add_number = bfd_getl32 (temp);
9431 else
9432 imm_expr.X_add_number = bfd_getb32 (temp);
9433 }
9434 else if (length > 4
9435 && ! mips_disable_float_construction
9436 /* Constants can only be constructed in GPRs and
9437 copied to FPRs if the GPRs are at least as wide
9438 as the FPRs. Force the constant into memory if
9439 we are using 64-bit FPRs but the GPRs are only
9440 32 bits wide. */
9441 && (using_gprs
9442 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9443 && ((temp[0] == 0 && temp[1] == 0)
9444 || (temp[2] == 0 && temp[3] == 0))
9445 && ((temp[4] == 0 && temp[5] == 0)
9446 || (temp[6] == 0 && temp[7] == 0)))
9447 {
9448 /* The value is simple enough to load with a couple of
9449 instructions. If using 32-bit registers, set
9450 imm_expr to the high order 32 bits and offset_expr to
9451 the low order 32 bits. Otherwise, set imm_expr to
9452 the entire 64 bit constant. */
9453 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9454 {
9455 imm_expr.X_op = O_constant;
9456 offset_expr.X_op = O_constant;
9457 if (! target_big_endian)
9458 {
9459 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9460 offset_expr.X_add_number = bfd_getl32 (temp);
9461 }
9462 else
9463 {
9464 imm_expr.X_add_number = bfd_getb32 (temp);
9465 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9466 }
9467 if (offset_expr.X_add_number == 0)
9468 offset_expr.X_op = O_absent;
9469 }
9470 else if (sizeof (imm_expr.X_add_number) > 4)
9471 {
9472 imm_expr.X_op = O_constant;
9473 if (! target_big_endian)
9474 imm_expr.X_add_number = bfd_getl64 (temp);
9475 else
9476 imm_expr.X_add_number = bfd_getb64 (temp);
9477 }
9478 else
9479 {
9480 imm_expr.X_op = O_big;
9481 imm_expr.X_add_number = 4;
9482 if (! target_big_endian)
9483 {
9484 generic_bignum[0] = bfd_getl16 (temp);
9485 generic_bignum[1] = bfd_getl16 (temp + 2);
9486 generic_bignum[2] = bfd_getl16 (temp + 4);
9487 generic_bignum[3] = bfd_getl16 (temp + 6);
9488 }
9489 else
9490 {
9491 generic_bignum[0] = bfd_getb16 (temp + 6);
9492 generic_bignum[1] = bfd_getb16 (temp + 4);
9493 generic_bignum[2] = bfd_getb16 (temp + 2);
9494 generic_bignum[3] = bfd_getb16 (temp);
9495 }
9496 }
9497 }
9498 else
9499 {
9500 const char *newname;
9501 segT new_seg;
9502
9503 /* Switch to the right section. */
9504 seg = now_seg;
9505 subseg = now_subseg;
9506 switch (*args)
9507 {
9508 default: /* unused default case avoids warnings. */
9509 case 'L':
9510 newname = RDATA_SECTION_NAME;
9511 if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
9512 || mips_pic == EMBEDDED_PIC)
9513 newname = ".lit8";
9514 break;
9515 case 'F':
9516 if (mips_pic == EMBEDDED_PIC)
9517 newname = ".lit8";
9518 else
9519 newname = RDATA_SECTION_NAME;
9520 break;
9521 case 'l':
9522 assert (!USE_GLOBAL_POINTER_OPT
9523 || g_switch_value >= 4);
9524 newname = ".lit4";
9525 break;
9526 }
9527 new_seg = subseg_new (newname, (subsegT) 0);
9528 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9529 bfd_set_section_flags (stdoutput, new_seg,
9530 (SEC_ALLOC
9531 | SEC_LOAD
9532 | SEC_READONLY
9533 | SEC_DATA));
9534 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9535 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9536 && strcmp (TARGET_OS, "elf") != 0)
9537 record_alignment (new_seg, 4);
9538 else
9539 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9540 if (seg == now_seg)
9541 as_bad (_("Can't use floating point insn in this section"));
9542
9543 /* Set the argument to the current address in the
9544 section. */
9545 offset_expr.X_op = O_symbol;
9546 offset_expr.X_add_symbol =
9547 symbol_new ("L0\001", now_seg,
9548 (valueT) frag_now_fix (), frag_now);
9549 offset_expr.X_add_number = 0;
9550
9551 /* Put the floating point number into the section. */
9552 p = frag_more ((int) length);
9553 memcpy (p, temp, length);
9554
9555 /* Switch back to the original section. */
9556 subseg_set (seg, subseg);
9557 }
9558 }
9559 continue;
9560
9561 case 'i': /* 16 bit unsigned immediate */
9562 case 'j': /* 16 bit signed immediate */
9563 *imm_reloc = BFD_RELOC_LO16;
9564 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9565 {
9566 int more;
9567 offsetT minval, maxval;
9568
9569 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9570 && strcmp (insn->name, insn[1].name) == 0);
9571
9572 /* If the expression was written as an unsigned number,
9573 only treat it as signed if there are no more
9574 alternatives. */
9575 if (more
9576 && *args == 'j'
9577 && sizeof (imm_expr.X_add_number) <= 4
9578 && imm_expr.X_op == O_constant
9579 && imm_expr.X_add_number < 0
9580 && imm_expr.X_unsigned
9581 && HAVE_64BIT_GPRS)
9582 break;
9583
9584 /* For compatibility with older assemblers, we accept
9585 0x8000-0xffff as signed 16-bit numbers when only
9586 signed numbers are allowed. */
9587 if (*args == 'i')
9588 minval = 0, maxval = 0xffff;
9589 else if (more)
9590 minval = -0x8000, maxval = 0x7fff;
9591 else
9592 minval = -0x8000, maxval = 0xffff;
9593
9594 if (imm_expr.X_op != O_constant
9595 || imm_expr.X_add_number < minval
9596 || imm_expr.X_add_number > maxval)
9597 {
9598 if (more)
9599 break;
9600 if (imm_expr.X_op == O_constant
9601 || imm_expr.X_op == O_big)
9602 as_bad (_("expression out of range"));
9603 }
9604 }
9605 s = expr_end;
9606 continue;
9607
9608 case 'o': /* 16 bit offset */
9609 /* Check whether there is only a single bracketed expression
9610 left. If so, it must be the base register and the
9611 constant must be zero. */
9612 if (*s == '(' && strchr (s + 1, '(') == 0)
9613 {
9614 offset_expr.X_op = O_constant;
9615 offset_expr.X_add_number = 0;
9616 continue;
9617 }
9618
9619 /* If this value won't fit into a 16 bit offset, then go
9620 find a macro that will generate the 32 bit offset
9621 code pattern. */
9622 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9623 && (offset_expr.X_op != O_constant
9624 || offset_expr.X_add_number >= 0x8000
9625 || offset_expr.X_add_number < -0x8000))
9626 break;
9627
9628 s = expr_end;
9629 continue;
9630
9631 case 'p': /* pc relative offset */
9632 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9633 my_getExpression (&offset_expr, s);
9634 s = expr_end;
9635 continue;
9636
9637 case 'u': /* upper 16 bits */
9638 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9639 && imm_expr.X_op == O_constant
9640 && (imm_expr.X_add_number < 0
9641 || imm_expr.X_add_number >= 0x10000))
9642 as_bad (_("lui expression not in range 0..65535"));
9643 s = expr_end;
9644 continue;
9645
9646 case 'a': /* 26 bit address */
9647 my_getExpression (&offset_expr, s);
9648 s = expr_end;
9649 *offset_reloc = BFD_RELOC_MIPS_JMP;
9650 continue;
9651
9652 case 'N': /* 3 bit branch condition code */
9653 case 'M': /* 3 bit compare condition code */
9654 if (strncmp (s, "$fcc", 4) != 0)
9655 break;
9656 s += 4;
9657 regno = 0;
9658 do
9659 {
9660 regno *= 10;
9661 regno += *s - '0';
9662 ++s;
9663 }
9664 while (ISDIGIT (*s));
9665 if (regno > 7)
9666 as_bad (_("invalid condition code register $fcc%d"), regno);
9667 if (*args == 'N')
9668 ip->insn_opcode |= regno << OP_SH_BCC;
9669 else
9670 ip->insn_opcode |= regno << OP_SH_CCC;
9671 continue;
9672
9673 case 'H':
9674 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9675 s += 2;
9676 if (ISDIGIT (*s))
9677 {
9678 c = 0;
9679 do
9680 {
9681 c *= 10;
9682 c += *s - '0';
9683 ++s;
9684 }
9685 while (ISDIGIT (*s));
9686 }
9687 else
9688 c = 8; /* Invalid sel value. */
9689
9690 if (c > 7)
9691 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9692 ip->insn_opcode |= c;
9693 continue;
9694
9695 case 'e':
9696 /* Must be at least one digit. */
9697 my_getExpression (&imm_expr, s);
9698 check_absolute_expr (ip, &imm_expr);
9699
9700 if ((unsigned long) imm_expr.X_add_number
9701 > (unsigned long) OP_MASK_VECBYTE)
9702 {
9703 as_bad (_("bad byte vector index (%ld)"),
9704 (long) imm_expr.X_add_number);
9705 imm_expr.X_add_number = 0;
9706 }
9707
9708 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9709 imm_expr.X_op = O_absent;
9710 s = expr_end;
9711 continue;
9712
9713 case '%':
9714 my_getExpression (&imm_expr, s);
9715 check_absolute_expr (ip, &imm_expr);
9716
9717 if ((unsigned long) imm_expr.X_add_number
9718 > (unsigned long) OP_MASK_VECALIGN)
9719 {
9720 as_bad (_("bad byte vector index (%ld)"),
9721 (long) imm_expr.X_add_number);
9722 imm_expr.X_add_number = 0;
9723 }
9724
9725 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9726 imm_expr.X_op = O_absent;
9727 s = expr_end;
9728 continue;
9729
9730 default:
9731 as_bad (_("bad char = '%c'\n"), *args);
9732 internalError ();
9733 }
9734 break;
9735 }
9736 /* Args don't match. */
9737 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9738 !strcmp (insn->name, insn[1].name))
9739 {
9740 ++insn;
9741 s = argsStart;
9742 insn_error = _("illegal operands");
9743 continue;
9744 }
9745 if (save_c)
9746 *(--s) = save_c;
9747 insn_error = _("illegal operands");
9748 return;
9749 }
9750 }
9751
9752 /* This routine assembles an instruction into its binary format when
9753 assembling for the mips16. As a side effect, it sets one of the
9754 global variables imm_reloc or offset_reloc to the type of
9755 relocation to do if one of the operands is an address expression.
9756 It also sets mips16_small and mips16_ext if the user explicitly
9757 requested a small or extended instruction. */
9758
9759 static void
9760 mips16_ip (str, ip)
9761 char *str;
9762 struct mips_cl_insn *ip;
9763 {
9764 char *s;
9765 const char *args;
9766 struct mips_opcode *insn;
9767 char *argsstart;
9768 unsigned int regno;
9769 unsigned int lastregno = 0;
9770 char *s_reset;
9771
9772 insn_error = NULL;
9773
9774 mips16_small = FALSE;
9775 mips16_ext = FALSE;
9776
9777 for (s = str; ISLOWER (*s); ++s)
9778 ;
9779 switch (*s)
9780 {
9781 case '\0':
9782 break;
9783
9784 case ' ':
9785 *s++ = '\0';
9786 break;
9787
9788 case '.':
9789 if (s[1] == 't' && s[2] == ' ')
9790 {
9791 *s = '\0';
9792 mips16_small = TRUE;
9793 s += 3;
9794 break;
9795 }
9796 else if (s[1] == 'e' && s[2] == ' ')
9797 {
9798 *s = '\0';
9799 mips16_ext = TRUE;
9800 s += 3;
9801 break;
9802 }
9803 /* Fall through. */
9804 default:
9805 insn_error = _("unknown opcode");
9806 return;
9807 }
9808
9809 if (mips_opts.noautoextend && ! mips16_ext)
9810 mips16_small = TRUE;
9811
9812 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9813 {
9814 insn_error = _("unrecognized opcode");
9815 return;
9816 }
9817
9818 argsstart = s;
9819 for (;;)
9820 {
9821 assert (strcmp (insn->name, str) == 0);
9822
9823 ip->insn_mo = insn;
9824 ip->insn_opcode = insn->match;
9825 ip->use_extend = FALSE;
9826 imm_expr.X_op = O_absent;
9827 imm_reloc[0] = BFD_RELOC_UNUSED;
9828 imm_reloc[1] = BFD_RELOC_UNUSED;
9829 imm_reloc[2] = BFD_RELOC_UNUSED;
9830 offset_expr.X_op = O_absent;
9831 offset_reloc[0] = BFD_RELOC_UNUSED;
9832 offset_reloc[1] = BFD_RELOC_UNUSED;
9833 offset_reloc[2] = BFD_RELOC_UNUSED;
9834 for (args = insn->args; 1; ++args)
9835 {
9836 int c;
9837
9838 if (*s == ' ')
9839 ++s;
9840
9841 /* In this switch statement we call break if we did not find
9842 a match, continue if we did find a match, or return if we
9843 are done. */
9844
9845 c = *args;
9846 switch (c)
9847 {
9848 case '\0':
9849 if (*s == '\0')
9850 {
9851 /* Stuff the immediate value in now, if we can. */
9852 if (imm_expr.X_op == O_constant
9853 && *imm_reloc > BFD_RELOC_UNUSED
9854 && insn->pinfo != INSN_MACRO)
9855 {
9856 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9857 imm_expr.X_add_number, TRUE, mips16_small,
9858 mips16_ext, &ip->insn_opcode,
9859 &ip->use_extend, &ip->extend);
9860 imm_expr.X_op = O_absent;
9861 *imm_reloc = BFD_RELOC_UNUSED;
9862 }
9863
9864 return;
9865 }
9866 break;
9867
9868 case ',':
9869 if (*s++ == c)
9870 continue;
9871 s--;
9872 switch (*++args)
9873 {
9874 case 'v':
9875 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9876 continue;
9877 case 'w':
9878 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9879 continue;
9880 }
9881 break;
9882
9883 case '(':
9884 case ')':
9885 if (*s++ == c)
9886 continue;
9887 break;
9888
9889 case 'v':
9890 case 'w':
9891 if (s[0] != '$')
9892 {
9893 if (c == 'v')
9894 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9895 else
9896 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9897 ++args;
9898 continue;
9899 }
9900 /* Fall through. */
9901 case 'x':
9902 case 'y':
9903 case 'z':
9904 case 'Z':
9905 case '0':
9906 case 'S':
9907 case 'R':
9908 case 'X':
9909 case 'Y':
9910 if (s[0] != '$')
9911 break;
9912 s_reset = s;
9913 if (ISDIGIT (s[1]))
9914 {
9915 ++s;
9916 regno = 0;
9917 do
9918 {
9919 regno *= 10;
9920 regno += *s - '0';
9921 ++s;
9922 }
9923 while (ISDIGIT (*s));
9924 if (regno > 31)
9925 {
9926 as_bad (_("invalid register number (%d)"), regno);
9927 regno = 2;
9928 }
9929 }
9930 else
9931 {
9932 if (s[1] == 'r' && s[2] == 'a')
9933 {
9934 s += 3;
9935 regno = RA;
9936 }
9937 else if (s[1] == 'f' && s[2] == 'p')
9938 {
9939 s += 3;
9940 regno = FP;
9941 }
9942 else if (s[1] == 's' && s[2] == 'p')
9943 {
9944 s += 3;
9945 regno = SP;
9946 }
9947 else if (s[1] == 'g' && s[2] == 'p')
9948 {
9949 s += 3;
9950 regno = GP;
9951 }
9952 else if (s[1] == 'a' && s[2] == 't')
9953 {
9954 s += 3;
9955 regno = AT;
9956 }
9957 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9958 {
9959 s += 4;
9960 regno = KT0;
9961 }
9962 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9963 {
9964 s += 4;
9965 regno = KT1;
9966 }
9967 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9968 {
9969 s += 5;
9970 regno = ZERO;
9971 }
9972 else
9973 break;
9974 }
9975
9976 if (*s == ' ')
9977 ++s;
9978 if (args[1] != *s)
9979 {
9980 if (c == 'v' || c == 'w')
9981 {
9982 regno = mips16_to_32_reg_map[lastregno];
9983 s = s_reset;
9984 ++args;
9985 }
9986 }
9987
9988 switch (c)
9989 {
9990 case 'x':
9991 case 'y':
9992 case 'z':
9993 case 'v':
9994 case 'w':
9995 case 'Z':
9996 regno = mips32_to_16_reg_map[regno];
9997 break;
9998
9999 case '0':
10000 if (regno != 0)
10001 regno = ILLEGAL_REG;
10002 break;
10003
10004 case 'S':
10005 if (regno != SP)
10006 regno = ILLEGAL_REG;
10007 break;
10008
10009 case 'R':
10010 if (regno != RA)
10011 regno = ILLEGAL_REG;
10012 break;
10013
10014 case 'X':
10015 case 'Y':
10016 if (regno == AT && ! mips_opts.noat)
10017 as_warn (_("used $at without \".set noat\""));
10018 break;
10019
10020 default:
10021 internalError ();
10022 }
10023
10024 if (regno == ILLEGAL_REG)
10025 break;
10026
10027 switch (c)
10028 {
10029 case 'x':
10030 case 'v':
10031 ip->insn_opcode |= regno << MIPS16OP_SH_RX;
10032 break;
10033 case 'y':
10034 case 'w':
10035 ip->insn_opcode |= regno << MIPS16OP_SH_RY;
10036 break;
10037 case 'z':
10038 ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
10039 break;
10040 case 'Z':
10041 ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
10042 case '0':
10043 case 'S':
10044 case 'R':
10045 break;
10046 case 'X':
10047 ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
10048 break;
10049 case 'Y':
10050 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10051 ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
10052 break;
10053 default:
10054 internalError ();
10055 }
10056
10057 lastregno = regno;
10058 continue;
10059
10060 case 'P':
10061 if (strncmp (s, "$pc", 3) == 0)
10062 {
10063 s += 3;
10064 continue;
10065 }
10066 break;
10067
10068 case '<':
10069 case '>':
10070 case '[':
10071 case ']':
10072 case '4':
10073 case '5':
10074 case 'H':
10075 case 'W':
10076 case 'D':
10077 case 'j':
10078 case '8':
10079 case 'V':
10080 case 'C':
10081 case 'U':
10082 case 'k':
10083 case 'K':
10084 if (s[0] == '%'
10085 && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
10086 {
10087 /* This is %gprel(SYMBOL). We need to read SYMBOL,
10088 and generate the appropriate reloc. If the text
10089 inside %gprel is not a symbol name with an
10090 optional offset, then we generate a normal reloc
10091 and will probably fail later. */
10092 my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
10093 if (imm_expr.X_op == O_symbol)
10094 {
10095 mips16_ext = TRUE;
10096 *imm_reloc = BFD_RELOC_MIPS16_GPREL;
10097 s = expr_end;
10098 ip->use_extend = TRUE;
10099 ip->extend = 0;
10100 continue;
10101 }
10102 }
10103 else
10104 {
10105 /* Just pick up a normal expression. */
10106 my_getExpression (&imm_expr, s);
10107 }
10108
10109 if (imm_expr.X_op == O_register)
10110 {
10111 /* What we thought was an expression turned out to
10112 be a register. */
10113
10114 if (s[0] == '(' && args[1] == '(')
10115 {
10116 /* It looks like the expression was omitted
10117 before a register indirection, which means
10118 that the expression is implicitly zero. We
10119 still set up imm_expr, so that we handle
10120 explicit extensions correctly. */
10121 imm_expr.X_op = O_constant;
10122 imm_expr.X_add_number = 0;
10123 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10124 continue;
10125 }
10126
10127 break;
10128 }
10129
10130 /* We need to relax this instruction. */
10131 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10132 s = expr_end;
10133 continue;
10134
10135 case 'p':
10136 case 'q':
10137 case 'A':
10138 case 'B':
10139 case 'E':
10140 /* We use offset_reloc rather than imm_reloc for the PC
10141 relative operands. This lets macros with both
10142 immediate and address operands work correctly. */
10143 my_getExpression (&offset_expr, s);
10144
10145 if (offset_expr.X_op == O_register)
10146 break;
10147
10148 /* We need to relax this instruction. */
10149 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10150 s = expr_end;
10151 continue;
10152
10153 case '6': /* break code */
10154 my_getExpression (&imm_expr, s);
10155 check_absolute_expr (ip, &imm_expr);
10156 if ((unsigned long) imm_expr.X_add_number > 63)
10157 {
10158 as_warn (_("Invalid value for `%s' (%lu)"),
10159 ip->insn_mo->name,
10160 (unsigned long) imm_expr.X_add_number);
10161 imm_expr.X_add_number &= 0x3f;
10162 }
10163 ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
10164 imm_expr.X_op = O_absent;
10165 s = expr_end;
10166 continue;
10167
10168 case 'a': /* 26 bit address */
10169 my_getExpression (&offset_expr, s);
10170 s = expr_end;
10171 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10172 ip->insn_opcode <<= 16;
10173 continue;
10174
10175 case 'l': /* register list for entry macro */
10176 case 'L': /* register list for exit macro */
10177 {
10178 int mask;
10179
10180 if (c == 'l')
10181 mask = 0;
10182 else
10183 mask = 7 << 3;
10184 while (*s != '\0')
10185 {
10186 int freg, reg1, reg2;
10187
10188 while (*s == ' ' || *s == ',')
10189 ++s;
10190 if (*s != '$')
10191 {
10192 as_bad (_("can't parse register list"));
10193 break;
10194 }
10195 ++s;
10196 if (*s != 'f')
10197 freg = 0;
10198 else
10199 {
10200 freg = 1;
10201 ++s;
10202 }
10203 reg1 = 0;
10204 while (ISDIGIT (*s))
10205 {
10206 reg1 *= 10;
10207 reg1 += *s - '0';
10208 ++s;
10209 }
10210 if (*s == ' ')
10211 ++s;
10212 if (*s != '-')
10213 reg2 = reg1;
10214 else
10215 {
10216 ++s;
10217 if (*s != '$')
10218 break;
10219 ++s;
10220 if (freg)
10221 {
10222 if (*s == 'f')
10223 ++s;
10224 else
10225 {
10226 as_bad (_("invalid register list"));
10227 break;
10228 }
10229 }
10230 reg2 = 0;
10231 while (ISDIGIT (*s))
10232 {
10233 reg2 *= 10;
10234 reg2 += *s - '0';
10235 ++s;
10236 }
10237 }
10238 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10239 {
10240 mask &= ~ (7 << 3);
10241 mask |= 5 << 3;
10242 }
10243 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10244 {
10245 mask &= ~ (7 << 3);
10246 mask |= 6 << 3;
10247 }
10248 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10249 mask |= (reg2 - 3) << 3;
10250 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10251 mask |= (reg2 - 15) << 1;
10252 else if (reg1 == RA && reg2 == RA)
10253 mask |= 1;
10254 else
10255 {
10256 as_bad (_("invalid register list"));
10257 break;
10258 }
10259 }
10260 /* The mask is filled in in the opcode table for the
10261 benefit of the disassembler. We remove it before
10262 applying the actual mask. */
10263 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10264 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10265 }
10266 continue;
10267
10268 case 'e': /* extend code */
10269 my_getExpression (&imm_expr, s);
10270 check_absolute_expr (ip, &imm_expr);
10271 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10272 {
10273 as_warn (_("Invalid value for `%s' (%lu)"),
10274 ip->insn_mo->name,
10275 (unsigned long) imm_expr.X_add_number);
10276 imm_expr.X_add_number &= 0x7ff;
10277 }
10278 ip->insn_opcode |= imm_expr.X_add_number;
10279 imm_expr.X_op = O_absent;
10280 s = expr_end;
10281 continue;
10282
10283 default:
10284 internalError ();
10285 }
10286 break;
10287 }
10288
10289 /* Args don't match. */
10290 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10291 strcmp (insn->name, insn[1].name) == 0)
10292 {
10293 ++insn;
10294 s = argsstart;
10295 continue;
10296 }
10297
10298 insn_error = _("illegal operands");
10299
10300 return;
10301 }
10302 }
10303
10304 /* This structure holds information we know about a mips16 immediate
10305 argument type. */
10306
10307 struct mips16_immed_operand
10308 {
10309 /* The type code used in the argument string in the opcode table. */
10310 int type;
10311 /* The number of bits in the short form of the opcode. */
10312 int nbits;
10313 /* The number of bits in the extended form of the opcode. */
10314 int extbits;
10315 /* The amount by which the short form is shifted when it is used;
10316 for example, the sw instruction has a shift count of 2. */
10317 int shift;
10318 /* The amount by which the short form is shifted when it is stored
10319 into the instruction code. */
10320 int op_shift;
10321 /* Non-zero if the short form is unsigned. */
10322 int unsp;
10323 /* Non-zero if the extended form is unsigned. */
10324 int extu;
10325 /* Non-zero if the value is PC relative. */
10326 int pcrel;
10327 };
10328
10329 /* The mips16 immediate operand types. */
10330
10331 static const struct mips16_immed_operand mips16_immed_operands[] =
10332 {
10333 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10334 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10335 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10336 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10337 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10338 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10339 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10340 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10341 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10342 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10343 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10344 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10345 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10346 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10347 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10348 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10349 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10350 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10351 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10352 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10353 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10354 };
10355
10356 #define MIPS16_NUM_IMMED \
10357 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10358
10359 /* Handle a mips16 instruction with an immediate value. This or's the
10360 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10361 whether an extended value is needed; if one is needed, it sets
10362 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10363 If SMALL is true, an unextended opcode was explicitly requested.
10364 If EXT is true, an extended opcode was explicitly requested. If
10365 WARN is true, warn if EXT does not match reality. */
10366
10367 static void
10368 mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
10369 extend)
10370 char *file;
10371 unsigned int line;
10372 int type;
10373 offsetT val;
10374 bfd_boolean warn;
10375 bfd_boolean small;
10376 bfd_boolean ext;
10377 unsigned long *insn;
10378 bfd_boolean *use_extend;
10379 unsigned short *extend;
10380 {
10381 register const struct mips16_immed_operand *op;
10382 int mintiny, maxtiny;
10383 bfd_boolean needext;
10384
10385 op = mips16_immed_operands;
10386 while (op->type != type)
10387 {
10388 ++op;
10389 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10390 }
10391
10392 if (op->unsp)
10393 {
10394 if (type == '<' || type == '>' || type == '[' || type == ']')
10395 {
10396 mintiny = 1;
10397 maxtiny = 1 << op->nbits;
10398 }
10399 else
10400 {
10401 mintiny = 0;
10402 maxtiny = (1 << op->nbits) - 1;
10403 }
10404 }
10405 else
10406 {
10407 mintiny = - (1 << (op->nbits - 1));
10408 maxtiny = (1 << (op->nbits - 1)) - 1;
10409 }
10410
10411 /* Branch offsets have an implicit 0 in the lowest bit. */
10412 if (type == 'p' || type == 'q')
10413 val /= 2;
10414
10415 if ((val & ((1 << op->shift) - 1)) != 0
10416 || val < (mintiny << op->shift)
10417 || val > (maxtiny << op->shift))
10418 needext = TRUE;
10419 else
10420 needext = FALSE;
10421
10422 if (warn && ext && ! needext)
10423 as_warn_where (file, line,
10424 _("extended operand requested but not required"));
10425 if (small && needext)
10426 as_bad_where (file, line, _("invalid unextended operand value"));
10427
10428 if (small || (! ext && ! needext))
10429 {
10430 int insnval;
10431
10432 *use_extend = FALSE;
10433 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10434 insnval <<= op->op_shift;
10435 *insn |= insnval;
10436 }
10437 else
10438 {
10439 long minext, maxext;
10440 int extval;
10441
10442 if (op->extu)
10443 {
10444 minext = 0;
10445 maxext = (1 << op->extbits) - 1;
10446 }
10447 else
10448 {
10449 minext = - (1 << (op->extbits - 1));
10450 maxext = (1 << (op->extbits - 1)) - 1;
10451 }
10452 if (val < minext || val > maxext)
10453 as_bad_where (file, line,
10454 _("operand value out of range for instruction"));
10455
10456 *use_extend = TRUE;
10457 if (op->extbits == 16)
10458 {
10459 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10460 val &= 0x1f;
10461 }
10462 else if (op->extbits == 15)
10463 {
10464 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10465 val &= 0xf;
10466 }
10467 else
10468 {
10469 extval = ((val & 0x1f) << 6) | (val & 0x20);
10470 val = 0;
10471 }
10472
10473 *extend = (unsigned short) extval;
10474 *insn |= val;
10475 }
10476 }
10477 \f
10478 static const struct percent_op_match
10479 {
10480 const char *str;
10481 bfd_reloc_code_real_type reloc;
10482 } percent_op[] =
10483 {
10484 {"%lo", BFD_RELOC_LO16},
10485 #ifdef OBJ_ELF
10486 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10487 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10488 {"%call16", BFD_RELOC_MIPS_CALL16},
10489 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10490 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10491 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10492 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10493 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10494 {"%got", BFD_RELOC_MIPS_GOT16},
10495 {"%gp_rel", BFD_RELOC_GPREL16},
10496 {"%half", BFD_RELOC_16},
10497 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10498 {"%higher", BFD_RELOC_MIPS_HIGHER},
10499 {"%neg", BFD_RELOC_MIPS_SUB},
10500 #endif
10501 {"%hi", BFD_RELOC_HI16_S}
10502 };
10503
10504
10505 /* Return true if *STR points to a relocation operator. When returning true,
10506 move *STR over the operator and store its relocation code in *RELOC.
10507 Leave both *STR and *RELOC alone when returning false. */
10508
10509 static bfd_boolean
10510 parse_relocation (str, reloc)
10511 char **str;
10512 bfd_reloc_code_real_type *reloc;
10513 {
10514 size_t i;
10515
10516 for (i = 0; i < ARRAY_SIZE (percent_op); i++)
10517 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10518 {
10519 *str += strlen (percent_op[i].str);
10520 *reloc = percent_op[i].reloc;
10521
10522 /* Check whether the output BFD supports this relocation.
10523 If not, issue an error and fall back on something safe. */
10524 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10525 {
10526 as_bad ("relocation %s isn't supported by the current ABI",
10527 percent_op[i].str);
10528 *reloc = BFD_RELOC_LO16;
10529 }
10530 return TRUE;
10531 }
10532 return FALSE;
10533 }
10534
10535
10536 /* Parse string STR as a 16-bit relocatable operand. Store the
10537 expression in *EP and the relocations in the array starting
10538 at RELOC. Return the number of relocation operators used.
10539
10540 On exit, EXPR_END points to the first character after the expression.
10541 If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16. */
10542
10543 static size_t
10544 my_getSmallExpression (ep, reloc, str)
10545 expressionS *ep;
10546 bfd_reloc_code_real_type *reloc;
10547 char *str;
10548 {
10549 bfd_reloc_code_real_type reversed_reloc[3];
10550 size_t reloc_index, i;
10551 int crux_depth, str_depth;
10552 char *crux;
10553
10554 /* Search for the start of the main expression, recoding relocations
10555 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10556 of the main expression and with CRUX_DEPTH containing the number
10557 of open brackets at that point. */
10558 reloc_index = -1;
10559 str_depth = 0;
10560 do
10561 {
10562 reloc_index++;
10563 crux = str;
10564 crux_depth = str_depth;
10565
10566 /* Skip over whitespace and brackets, keeping count of the number
10567 of brackets. */
10568 while (*str == ' ' || *str == '\t' || *str == '(')
10569 if (*str++ == '(')
10570 str_depth++;
10571 }
10572 while (*str == '%'
10573 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10574 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10575
10576 my_getExpression (ep, crux);
10577 str = expr_end;
10578
10579 /* Match every open bracket. */
10580 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10581 if (*str++ == ')')
10582 crux_depth--;
10583
10584 if (crux_depth > 0)
10585 as_bad ("unclosed '('");
10586
10587 expr_end = str;
10588
10589 if (reloc_index == 0)
10590 reloc[0] = BFD_RELOC_LO16;
10591 else
10592 {
10593 prev_reloc_op_frag = frag_now;
10594 for (i = 0; i < reloc_index; i++)
10595 reloc[i] = reversed_reloc[reloc_index - 1 - i];
10596 }
10597
10598 return reloc_index;
10599 }
10600
10601 static void
10602 my_getExpression (ep, str)
10603 expressionS *ep;
10604 char *str;
10605 {
10606 char *save_in;
10607 valueT val;
10608
10609 save_in = input_line_pointer;
10610 input_line_pointer = str;
10611 expression (ep);
10612 expr_end = input_line_pointer;
10613 input_line_pointer = save_in;
10614
10615 /* If we are in mips16 mode, and this is an expression based on `.',
10616 then we bump the value of the symbol by 1 since that is how other
10617 text symbols are handled. We don't bother to handle complex
10618 expressions, just `.' plus or minus a constant. */
10619 if (mips_opts.mips16
10620 && ep->X_op == O_symbol
10621 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10622 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10623 && symbol_get_frag (ep->X_add_symbol) == frag_now
10624 && symbol_constant_p (ep->X_add_symbol)
10625 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10626 S_SET_VALUE (ep->X_add_symbol, val + 1);
10627 }
10628
10629 /* Turn a string in input_line_pointer into a floating point constant
10630 of type TYPE, and store the appropriate bytes in *LITP. The number
10631 of LITTLENUMS emitted is stored in *SIZEP. An error message is
10632 returned, or NULL on OK. */
10633
10634 char *
10635 md_atof (type, litP, sizeP)
10636 int type;
10637 char *litP;
10638 int *sizeP;
10639 {
10640 int prec;
10641 LITTLENUM_TYPE words[4];
10642 char *t;
10643 int i;
10644
10645 switch (type)
10646 {
10647 case 'f':
10648 prec = 2;
10649 break;
10650
10651 case 'd':
10652 prec = 4;
10653 break;
10654
10655 default:
10656 *sizeP = 0;
10657 return _("bad call to md_atof");
10658 }
10659
10660 t = atof_ieee (input_line_pointer, type, words);
10661 if (t)
10662 input_line_pointer = t;
10663
10664 *sizeP = prec * 2;
10665
10666 if (! target_big_endian)
10667 {
10668 for (i = prec - 1; i >= 0; i--)
10669 {
10670 md_number_to_chars (litP, (valueT) words[i], 2);
10671 litP += 2;
10672 }
10673 }
10674 else
10675 {
10676 for (i = 0; i < prec; i++)
10677 {
10678 md_number_to_chars (litP, (valueT) words[i], 2);
10679 litP += 2;
10680 }
10681 }
10682
10683 return NULL;
10684 }
10685
10686 void
10687 md_number_to_chars (buf, val, n)
10688 char *buf;
10689 valueT val;
10690 int n;
10691 {
10692 if (target_big_endian)
10693 number_to_chars_bigendian (buf, val, n);
10694 else
10695 number_to_chars_littleendian (buf, val, n);
10696 }
10697 \f
10698 #ifdef OBJ_ELF
10699 static int support_64bit_objects(void)
10700 {
10701 const char **list, **l;
10702 int yes;
10703
10704 list = bfd_target_list ();
10705 for (l = list; *l != NULL; l++)
10706 #ifdef TE_TMIPS
10707 /* This is traditional mips */
10708 if (strcmp (*l, "elf64-tradbigmips") == 0
10709 || strcmp (*l, "elf64-tradlittlemips") == 0)
10710 #else
10711 if (strcmp (*l, "elf64-bigmips") == 0
10712 || strcmp (*l, "elf64-littlemips") == 0)
10713 #endif
10714 break;
10715 yes = (*l != NULL);
10716 free (list);
10717 return yes;
10718 }
10719 #endif /* OBJ_ELF */
10720
10721 const char *md_shortopts = "nO::g::G:";
10722
10723 struct option md_longopts[] =
10724 {
10725 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
10726 {"mips0", no_argument, NULL, OPTION_MIPS1},
10727 {"mips1", no_argument, NULL, OPTION_MIPS1},
10728 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
10729 {"mips2", no_argument, NULL, OPTION_MIPS2},
10730 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
10731 {"mips3", no_argument, NULL, OPTION_MIPS3},
10732 #define OPTION_MIPS4 (OPTION_MD_BASE + 4)
10733 {"mips4", no_argument, NULL, OPTION_MIPS4},
10734 #define OPTION_MIPS5 (OPTION_MD_BASE + 5)
10735 {"mips5", no_argument, NULL, OPTION_MIPS5},
10736 #define OPTION_MIPS32 (OPTION_MD_BASE + 6)
10737 {"mips32", no_argument, NULL, OPTION_MIPS32},
10738 #define OPTION_MIPS64 (OPTION_MD_BASE + 7)
10739 {"mips64", no_argument, NULL, OPTION_MIPS64},
10740 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 8)
10741 {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
10742 #define OPTION_TRAP (OPTION_MD_BASE + 9)
10743 {"trap", no_argument, NULL, OPTION_TRAP},
10744 {"no-break", no_argument, NULL, OPTION_TRAP},
10745 #define OPTION_BREAK (OPTION_MD_BASE + 10)
10746 {"break", no_argument, NULL, OPTION_BREAK},
10747 {"no-trap", no_argument, NULL, OPTION_BREAK},
10748 #define OPTION_EB (OPTION_MD_BASE + 11)
10749 {"EB", no_argument, NULL, OPTION_EB},
10750 #define OPTION_EL (OPTION_MD_BASE + 12)
10751 {"EL", no_argument, NULL, OPTION_EL},
10752 #define OPTION_MIPS16 (OPTION_MD_BASE + 13)
10753 {"mips16", no_argument, NULL, OPTION_MIPS16},
10754 #define OPTION_NO_MIPS16 (OPTION_MD_BASE + 14)
10755 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10756 #define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 15)
10757 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10758 #define OPTION_MNO_7000_HILO_FIX (OPTION_MD_BASE + 16)
10759 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10760 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10761 #define OPTION_FP32 (OPTION_MD_BASE + 17)
10762 {"mfp32", no_argument, NULL, OPTION_FP32},
10763 #define OPTION_GP32 (OPTION_MD_BASE + 18)
10764 {"mgp32", no_argument, NULL, OPTION_GP32},
10765 #define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 19)
10766 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10767 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 20)
10768 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10769 #define OPTION_MARCH (OPTION_MD_BASE + 21)
10770 {"march", required_argument, NULL, OPTION_MARCH},
10771 #define OPTION_MTUNE (OPTION_MD_BASE + 22)
10772 {"mtune", required_argument, NULL, OPTION_MTUNE},
10773 #define OPTION_FP64 (OPTION_MD_BASE + 23)
10774 {"mfp64", no_argument, NULL, OPTION_FP64},
10775 #define OPTION_M4650 (OPTION_MD_BASE + 24)
10776 {"m4650", no_argument, NULL, OPTION_M4650},
10777 #define OPTION_NO_M4650 (OPTION_MD_BASE + 25)
10778 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10779 #define OPTION_M4010 (OPTION_MD_BASE + 26)
10780 {"m4010", no_argument, NULL, OPTION_M4010},
10781 #define OPTION_NO_M4010 (OPTION_MD_BASE + 27)
10782 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10783 #define OPTION_M4100 (OPTION_MD_BASE + 28)
10784 {"m4100", no_argument, NULL, OPTION_M4100},
10785 #define OPTION_NO_M4100 (OPTION_MD_BASE + 29)
10786 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10787 #define OPTION_M3900 (OPTION_MD_BASE + 30)
10788 {"m3900", no_argument, NULL, OPTION_M3900},
10789 #define OPTION_NO_M3900 (OPTION_MD_BASE + 31)
10790 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10791 #define OPTION_GP64 (OPTION_MD_BASE + 32)
10792 {"mgp64", no_argument, NULL, OPTION_GP64},
10793 #define OPTION_MIPS3D (OPTION_MD_BASE + 33)
10794 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10795 #define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
10796 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10797 #define OPTION_MDMX (OPTION_MD_BASE + 35)
10798 {"mdmx", no_argument, NULL, OPTION_MDMX},
10799 #define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
10800 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10801 #define OPTION_FIX_VR4122 (OPTION_MD_BASE + 37)
10802 #define OPTION_NO_FIX_VR4122 (OPTION_MD_BASE + 38)
10803 {"mfix-vr4122-bugs", no_argument, NULL, OPTION_FIX_VR4122},
10804 {"no-mfix-vr4122-bugs", no_argument, NULL, OPTION_NO_FIX_VR4122},
10805 #define OPTION_RELAX_BRANCH (OPTION_MD_BASE + 39)
10806 #define OPTION_NO_RELAX_BRANCH (OPTION_MD_BASE + 40)
10807 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10808 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10809 #define OPTION_MIPS32R2 (OPTION_MD_BASE + 41)
10810 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10811 #ifdef OBJ_ELF
10812 #define OPTION_ELF_BASE (OPTION_MD_BASE + 42)
10813 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10814 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
10815 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10816 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
10817 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
10818 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
10819 {"xgot", no_argument, NULL, OPTION_XGOT},
10820 #define OPTION_MABI (OPTION_ELF_BASE + 3)
10821 {"mabi", required_argument, NULL, OPTION_MABI},
10822 #define OPTION_32 (OPTION_ELF_BASE + 4)
10823 {"32", no_argument, NULL, OPTION_32},
10824 #define OPTION_N32 (OPTION_ELF_BASE + 5)
10825 {"n32", no_argument, NULL, OPTION_N32},
10826 #define OPTION_64 (OPTION_ELF_BASE + 6)
10827 {"64", no_argument, NULL, OPTION_64},
10828 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10829 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10830 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10831 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10832 #endif /* OBJ_ELF */
10833 {NULL, no_argument, NULL, 0}
10834 };
10835 size_t md_longopts_size = sizeof (md_longopts);
10836
10837 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10838 NEW_VALUE. Warn if another value was already specified. Note:
10839 we have to defer parsing the -march and -mtune arguments in order
10840 to handle 'from-abi' correctly, since the ABI might be specified
10841 in a later argument. */
10842
10843 static void
10844 mips_set_option_string (string_ptr, new_value)
10845 const char **string_ptr, *new_value;
10846 {
10847 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10848 as_warn (_("A different %s was already specified, is now %s"),
10849 string_ptr == &mips_arch_string ? "-march" : "-mtune",
10850 new_value);
10851
10852 *string_ptr = new_value;
10853 }
10854
10855 int
10856 md_parse_option (c, arg)
10857 int c;
10858 char *arg;
10859 {
10860 switch (c)
10861 {
10862 case OPTION_CONSTRUCT_FLOATS:
10863 mips_disable_float_construction = 0;
10864 break;
10865
10866 case OPTION_NO_CONSTRUCT_FLOATS:
10867 mips_disable_float_construction = 1;
10868 break;
10869
10870 case OPTION_TRAP:
10871 mips_trap = 1;
10872 break;
10873
10874 case OPTION_BREAK:
10875 mips_trap = 0;
10876 break;
10877
10878 case OPTION_EB:
10879 target_big_endian = 1;
10880 break;
10881
10882 case OPTION_EL:
10883 target_big_endian = 0;
10884 break;
10885
10886 case 'n':
10887 warn_nops = 1;
10888 break;
10889
10890 case 'O':
10891 if (arg && arg[1] == '0')
10892 mips_optimize = 1;
10893 else
10894 mips_optimize = 2;
10895 break;
10896
10897 case 'g':
10898 if (arg == NULL)
10899 mips_debug = 2;
10900 else
10901 mips_debug = atoi (arg);
10902 /* When the MIPS assembler sees -g or -g2, it does not do
10903 optimizations which limit full symbolic debugging. We take
10904 that to be equivalent to -O0. */
10905 if (mips_debug == 2)
10906 mips_optimize = 1;
10907 break;
10908
10909 case OPTION_MIPS1:
10910 file_mips_isa = ISA_MIPS1;
10911 break;
10912
10913 case OPTION_MIPS2:
10914 file_mips_isa = ISA_MIPS2;
10915 break;
10916
10917 case OPTION_MIPS3:
10918 file_mips_isa = ISA_MIPS3;
10919 break;
10920
10921 case OPTION_MIPS4:
10922 file_mips_isa = ISA_MIPS4;
10923 break;
10924
10925 case OPTION_MIPS5:
10926 file_mips_isa = ISA_MIPS5;
10927 break;
10928
10929 case OPTION_MIPS32:
10930 file_mips_isa = ISA_MIPS32;
10931 break;
10932
10933 case OPTION_MIPS32R2:
10934 file_mips_isa = ISA_MIPS32R2;
10935 break;
10936
10937 case OPTION_MIPS64:
10938 file_mips_isa = ISA_MIPS64;
10939 break;
10940
10941 case OPTION_MTUNE:
10942 mips_set_option_string (&mips_tune_string, arg);
10943 break;
10944
10945 case OPTION_MARCH:
10946 mips_set_option_string (&mips_arch_string, arg);
10947 break;
10948
10949 case OPTION_M4650:
10950 mips_set_option_string (&mips_arch_string, "4650");
10951 mips_set_option_string (&mips_tune_string, "4650");
10952 break;
10953
10954 case OPTION_NO_M4650:
10955 break;
10956
10957 case OPTION_M4010:
10958 mips_set_option_string (&mips_arch_string, "4010");
10959 mips_set_option_string (&mips_tune_string, "4010");
10960 break;
10961
10962 case OPTION_NO_M4010:
10963 break;
10964
10965 case OPTION_M4100:
10966 mips_set_option_string (&mips_arch_string, "4100");
10967 mips_set_option_string (&mips_tune_string, "4100");
10968 break;
10969
10970 case OPTION_NO_M4100:
10971 break;
10972
10973 case OPTION_M3900:
10974 mips_set_option_string (&mips_arch_string, "3900");
10975 mips_set_option_string (&mips_tune_string, "3900");
10976 break;
10977
10978 case OPTION_NO_M3900:
10979 break;
10980
10981 case OPTION_MDMX:
10982 mips_opts.ase_mdmx = 1;
10983 break;
10984
10985 case OPTION_NO_MDMX:
10986 mips_opts.ase_mdmx = 0;
10987 break;
10988
10989 case OPTION_MIPS16:
10990 mips_opts.mips16 = 1;
10991 mips_no_prev_insn (FALSE);
10992 break;
10993
10994 case OPTION_NO_MIPS16:
10995 mips_opts.mips16 = 0;
10996 mips_no_prev_insn (FALSE);
10997 break;
10998
10999 case OPTION_MIPS3D:
11000 mips_opts.ase_mips3d = 1;
11001 break;
11002
11003 case OPTION_NO_MIPS3D:
11004 mips_opts.ase_mips3d = 0;
11005 break;
11006
11007 case OPTION_MEMBEDDED_PIC:
11008 mips_pic = EMBEDDED_PIC;
11009 if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
11010 {
11011 as_bad (_("-G may not be used with embedded PIC code"));
11012 return 0;
11013 }
11014 g_switch_value = 0x7fffffff;
11015 break;
11016
11017 case OPTION_FIX_VR4122:
11018 mips_fix_4122_bugs = 1;
11019 break;
11020
11021 case OPTION_NO_FIX_VR4122:
11022 mips_fix_4122_bugs = 0;
11023 break;
11024
11025 case OPTION_RELAX_BRANCH:
11026 mips_relax_branch = 1;
11027 break;
11028
11029 case OPTION_NO_RELAX_BRANCH:
11030 mips_relax_branch = 0;
11031 break;
11032
11033 #ifdef OBJ_ELF
11034 /* When generating ELF code, we permit -KPIC and -call_shared to
11035 select SVR4_PIC, and -non_shared to select no PIC. This is
11036 intended to be compatible with Irix 5. */
11037 case OPTION_CALL_SHARED:
11038 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11039 {
11040 as_bad (_("-call_shared is supported only for ELF format"));
11041 return 0;
11042 }
11043 mips_pic = SVR4_PIC;
11044 mips_abicalls = TRUE;
11045 if (g_switch_seen && g_switch_value != 0)
11046 {
11047 as_bad (_("-G may not be used with SVR4 PIC code"));
11048 return 0;
11049 }
11050 g_switch_value = 0;
11051 break;
11052
11053 case OPTION_NON_SHARED:
11054 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11055 {
11056 as_bad (_("-non_shared is supported only for ELF format"));
11057 return 0;
11058 }
11059 mips_pic = NO_PIC;
11060 mips_abicalls = FALSE;
11061 break;
11062
11063 /* The -xgot option tells the assembler to use 32 offsets when
11064 accessing the got in SVR4_PIC mode. It is for Irix
11065 compatibility. */
11066 case OPTION_XGOT:
11067 mips_big_got = 1;
11068 break;
11069 #endif /* OBJ_ELF */
11070
11071 case 'G':
11072 if (! USE_GLOBAL_POINTER_OPT)
11073 {
11074 as_bad (_("-G is not supported for this configuration"));
11075 return 0;
11076 }
11077 else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
11078 {
11079 as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
11080 return 0;
11081 }
11082 else
11083 g_switch_value = atoi (arg);
11084 g_switch_seen = 1;
11085 break;
11086
11087 #ifdef OBJ_ELF
11088 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11089 and -mabi=64. */
11090 case OPTION_32:
11091 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11092 {
11093 as_bad (_("-32 is supported for ELF format only"));
11094 return 0;
11095 }
11096 mips_abi = O32_ABI;
11097 break;
11098
11099 case OPTION_N32:
11100 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11101 {
11102 as_bad (_("-n32 is supported for ELF format only"));
11103 return 0;
11104 }
11105 mips_abi = N32_ABI;
11106 break;
11107
11108 case OPTION_64:
11109 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11110 {
11111 as_bad (_("-64 is supported for ELF format only"));
11112 return 0;
11113 }
11114 mips_abi = N64_ABI;
11115 if (! support_64bit_objects())
11116 as_fatal (_("No compiled in support for 64 bit object file format"));
11117 break;
11118 #endif /* OBJ_ELF */
11119
11120 case OPTION_GP32:
11121 file_mips_gp32 = 1;
11122 break;
11123
11124 case OPTION_GP64:
11125 file_mips_gp32 = 0;
11126 break;
11127
11128 case OPTION_FP32:
11129 file_mips_fp32 = 1;
11130 break;
11131
11132 case OPTION_FP64:
11133 file_mips_fp32 = 0;
11134 break;
11135
11136 #ifdef OBJ_ELF
11137 case OPTION_MABI:
11138 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11139 {
11140 as_bad (_("-mabi is supported for ELF format only"));
11141 return 0;
11142 }
11143 if (strcmp (arg, "32") == 0)
11144 mips_abi = O32_ABI;
11145 else if (strcmp (arg, "o64") == 0)
11146 mips_abi = O64_ABI;
11147 else if (strcmp (arg, "n32") == 0)
11148 mips_abi = N32_ABI;
11149 else if (strcmp (arg, "64") == 0)
11150 {
11151 mips_abi = N64_ABI;
11152 if (! support_64bit_objects())
11153 as_fatal (_("No compiled in support for 64 bit object file "
11154 "format"));
11155 }
11156 else if (strcmp (arg, "eabi") == 0)
11157 mips_abi = EABI_ABI;
11158 else
11159 {
11160 as_fatal (_("invalid abi -mabi=%s"), arg);
11161 return 0;
11162 }
11163 break;
11164 #endif /* OBJ_ELF */
11165
11166 case OPTION_M7000_HILO_FIX:
11167 mips_7000_hilo_fix = TRUE;
11168 break;
11169
11170 case OPTION_MNO_7000_HILO_FIX:
11171 mips_7000_hilo_fix = FALSE;
11172 break;
11173
11174 #ifdef OBJ_ELF
11175 case OPTION_MDEBUG:
11176 mips_flag_mdebug = TRUE;
11177 break;
11178
11179 case OPTION_NO_MDEBUG:
11180 mips_flag_mdebug = FALSE;
11181 break;
11182 #endif /* OBJ_ELF */
11183
11184 default:
11185 return 0;
11186 }
11187
11188 return 1;
11189 }
11190 \f
11191 /* Set up globals to generate code for the ISA or processor
11192 described by INFO. */
11193
11194 static void
11195 mips_set_architecture (info)
11196 const struct mips_cpu_info *info;
11197 {
11198 if (info != 0)
11199 {
11200 mips_arch_info = info;
11201 mips_arch = info->cpu;
11202 mips_opts.isa = info->isa;
11203 }
11204 }
11205
11206
11207 /* Likewise for tuning. */
11208
11209 static void
11210 mips_set_tune (info)
11211 const struct mips_cpu_info *info;
11212 {
11213 if (info != 0)
11214 {
11215 mips_tune_info = info;
11216 mips_tune = info->cpu;
11217 }
11218 }
11219
11220
11221 void
11222 mips_after_parse_args ()
11223 {
11224 /* GP relative stuff not working for PE */
11225 if (strncmp (TARGET_OS, "pe", 2) == 0
11226 && g_switch_value != 0)
11227 {
11228 if (g_switch_seen)
11229 as_bad (_("-G not supported in this configuration."));
11230 g_switch_value = 0;
11231 }
11232
11233 if (mips_abi == NO_ABI)
11234 mips_abi = MIPS_DEFAULT_ABI;
11235
11236 /* The following code determines the architecture and register size.
11237 Similar code was added to GCC 3.3 (see override_options() in
11238 config/mips/mips.c). The GAS and GCC code should be kept in sync
11239 as much as possible. */
11240
11241 if (mips_arch_string != 0)
11242 mips_set_architecture (mips_parse_cpu ("-march", mips_arch_string));
11243
11244 if (mips_tune_string != 0)
11245 mips_set_tune (mips_parse_cpu ("-mtune", mips_tune_string));
11246
11247 if (file_mips_isa != ISA_UNKNOWN)
11248 {
11249 /* Handle -mipsN. At this point, file_mips_isa contains the
11250 ISA level specified by -mipsN, while mips_opts.isa contains
11251 the -march selection (if any). */
11252 if (mips_arch_info != 0)
11253 {
11254 /* -march takes precedence over -mipsN, since it is more descriptive.
11255 There's no harm in specifying both as long as the ISA levels
11256 are the same. */
11257 if (file_mips_isa != mips_opts.isa)
11258 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11259 mips_cpu_info_from_isa (file_mips_isa)->name,
11260 mips_cpu_info_from_isa (mips_opts.isa)->name);
11261 }
11262 else
11263 mips_set_architecture (mips_cpu_info_from_isa (file_mips_isa));
11264 }
11265
11266 if (mips_arch_info == 0)
11267 mips_set_architecture (mips_parse_cpu ("default CPU",
11268 MIPS_CPU_STRING_DEFAULT));
11269
11270 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11271 as_bad ("-march=%s is not compatible with the selected ABI",
11272 mips_arch_info->name);
11273
11274 /* Optimize for mips_arch, unless -mtune selects a different processor. */
11275 if (mips_tune_info == 0)
11276 mips_set_tune (mips_arch_info);
11277
11278 if (file_mips_gp32 >= 0)
11279 {
11280 /* The user specified the size of the integer registers. Make sure
11281 it agrees with the ABI and ISA. */
11282 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11283 as_bad (_("-mgp64 used with a 32-bit processor"));
11284 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11285 as_bad (_("-mgp32 used with a 64-bit ABI"));
11286 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11287 as_bad (_("-mgp64 used with a 32-bit ABI"));
11288 }
11289 else
11290 {
11291 /* Infer the integer register size from the ABI and processor.
11292 Restrict ourselves to 32-bit registers if that's all the
11293 processor has, or if the ABI cannot handle 64-bit registers. */
11294 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11295 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11296 }
11297
11298 /* ??? GAS treats single-float processors as though they had 64-bit
11299 float registers (although it complains when double-precision
11300 instructions are used). As things stand, saying they have 32-bit
11301 registers would lead to spurious "register must be even" messages.
11302 So here we assume float registers are always the same size as
11303 integer ones, unless the user says otherwise. */
11304 if (file_mips_fp32 < 0)
11305 file_mips_fp32 = file_mips_gp32;
11306
11307 /* End of GCC-shared inference code. */
11308
11309 /* ??? When do we want this flag to be set? Who uses it? */
11310 if (file_mips_gp32 == 1
11311 && mips_abi == NO_ABI
11312 && ISA_HAS_64BIT_REGS (mips_opts.isa))
11313 mips_32bitmode = 1;
11314
11315 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11316 as_bad (_("trap exception not supported at ISA 1"));
11317
11318 /* If the selected architecture includes support for ASEs, enable
11319 generation of code for them. */
11320 if (mips_opts.mips16 == -1)
11321 mips_opts.mips16 = (CPU_HAS_MIPS16 (mips_arch)) ? 1 : 0;
11322 if (mips_opts.ase_mips3d == -1)
11323 mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (mips_arch)) ? 1 : 0;
11324 if (mips_opts.ase_mdmx == -1)
11325 mips_opts.ase_mdmx = (CPU_HAS_MDMX (mips_arch)) ? 1 : 0;
11326
11327 file_mips_isa = mips_opts.isa;
11328 file_ase_mips16 = mips_opts.mips16;
11329 file_ase_mips3d = mips_opts.ase_mips3d;
11330 file_ase_mdmx = mips_opts.ase_mdmx;
11331 mips_opts.gp32 = file_mips_gp32;
11332 mips_opts.fp32 = file_mips_fp32;
11333
11334 if (mips_flag_mdebug < 0)
11335 {
11336 #ifdef OBJ_MAYBE_ECOFF
11337 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11338 mips_flag_mdebug = 1;
11339 else
11340 #endif /* OBJ_MAYBE_ECOFF */
11341 mips_flag_mdebug = 0;
11342 }
11343 }
11344 \f
11345 void
11346 mips_init_after_args ()
11347 {
11348 /* initialize opcodes */
11349 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11350 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11351 }
11352
11353 long
11354 md_pcrel_from (fixP)
11355 fixS *fixP;
11356 {
11357 if (OUTPUT_FLAVOR != bfd_target_aout_flavour
11358 && fixP->fx_addsy != (symbolS *) NULL
11359 && ! S_IS_DEFINED (fixP->fx_addsy))
11360 return 4;
11361
11362 /* Return the address of the delay slot. */
11363 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11364 }
11365
11366 /* This is called before the symbol table is processed. In order to
11367 work with gcc when using mips-tfile, we must keep all local labels.
11368 However, in other cases, we want to discard them. If we were
11369 called with -g, but we didn't see any debugging information, it may
11370 mean that gcc is smuggling debugging information through to
11371 mips-tfile, in which case we must generate all local labels. */
11372
11373 void
11374 mips_frob_file_before_adjust ()
11375 {
11376 #ifndef NO_ECOFF_DEBUGGING
11377 if (ECOFF_DEBUGGING
11378 && mips_debug != 0
11379 && ! ecoff_debugging_seen)
11380 flag_keep_locals = 1;
11381 #endif
11382 }
11383
11384 /* Sort any unmatched HI16_S relocs so that they immediately precede
11385 the corresponding LO reloc. This is called before md_apply_fix3 and
11386 tc_gen_reloc. Unmatched HI16_S relocs can only be generated by
11387 explicit use of the %hi modifier. */
11388
11389 void
11390 mips_frob_file ()
11391 {
11392 struct mips_hi_fixup *l;
11393
11394 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11395 {
11396 segment_info_type *seginfo;
11397 int pass;
11398
11399 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11400
11401 /* If a GOT16 relocation turns out to be against a global symbol,
11402 there isn't supposed to be a matching LO. */
11403 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11404 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11405 continue;
11406
11407 /* Check quickly whether the next fixup happens to be a matching %lo. */
11408 if (fixup_has_matching_lo_p (l->fixp))
11409 continue;
11410
11411 /* Look through the fixups for this segment for a matching %lo.
11412 When we find one, move the %hi just in front of it. We do
11413 this in two passes. In the first pass, we try to find a
11414 unique %lo. In the second pass, we permit multiple %hi
11415 relocs for a single %lo (this is a GNU extension). */
11416 seginfo = seg_info (l->seg);
11417 for (pass = 0; pass < 2; pass++)
11418 {
11419 fixS *f, *prev;
11420
11421 prev = NULL;
11422 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
11423 {
11424 /* Check whether this is a %lo fixup which matches l->fixp. */
11425 if (f->fx_r_type == BFD_RELOC_LO16
11426 && f->fx_addsy == l->fixp->fx_addsy
11427 && f->fx_offset == l->fixp->fx_offset
11428 && (pass == 1
11429 || prev == NULL
11430 || !reloc_needs_lo_p (prev->fx_r_type)
11431 || !fixup_has_matching_lo_p (prev)))
11432 {
11433 fixS **pf;
11434
11435 /* Move l->fixp before f. */
11436 for (pf = &seginfo->fix_root;
11437 *pf != l->fixp;
11438 pf = &(*pf)->fx_next)
11439 assert (*pf != NULL);
11440
11441 *pf = l->fixp->fx_next;
11442
11443 l->fixp->fx_next = f;
11444 if (prev == NULL)
11445 seginfo->fix_root = l->fixp;
11446 else
11447 prev->fx_next = l->fixp;
11448
11449 break;
11450 }
11451
11452 prev = f;
11453 }
11454
11455 if (f != NULL)
11456 break;
11457
11458 #if 0 /* GCC code motion plus incomplete dead code elimination
11459 can leave a %hi without a %lo. */
11460 if (pass == 1)
11461 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
11462 _("Unmatched %%hi reloc"));
11463 #endif
11464 }
11465 }
11466 }
11467
11468 /* When generating embedded PIC code we need to use a special
11469 relocation to represent the difference of two symbols in the .text
11470 section (switch tables use a difference of this sort). See
11471 include/coff/mips.h for details. This macro checks whether this
11472 fixup requires the special reloc. */
11473 #define SWITCH_TABLE(fixp) \
11474 ((fixp)->fx_r_type == BFD_RELOC_32 \
11475 && OUTPUT_FLAVOR != bfd_target_elf_flavour \
11476 && (fixp)->fx_addsy != NULL \
11477 && (fixp)->fx_subsy != NULL \
11478 && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
11479 && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
11480
11481 /* When generating embedded PIC code we must keep all PC relative
11482 relocations, in case the linker has to relax a call. We also need
11483 to keep relocations for switch table entries.
11484
11485 We may have combined relocations without symbols in the N32/N64 ABI.
11486 We have to prevent gas from dropping them. */
11487
11488 int
11489 mips_force_relocation (fixp)
11490 fixS *fixp;
11491 {
11492 if (generic_force_reloc (fixp))
11493 return 1;
11494
11495 if (HAVE_NEWABI
11496 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11497 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11498 || fixp->fx_r_type == BFD_RELOC_HI16_S
11499 || fixp->fx_r_type == BFD_RELOC_LO16))
11500 return 1;
11501
11502 return (mips_pic == EMBEDDED_PIC
11503 && (fixp->fx_pcrel
11504 || SWITCH_TABLE (fixp)
11505 || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11506 || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11507 }
11508
11509 /* This hook is called before a fix is simplified. We don't really
11510 decide whether to skip a fix here. Rather, we turn global symbols
11511 used as branch targets into local symbols, such that they undergo
11512 simplification. We can only do this if the symbol is defined and
11513 it is in the same section as the branch. If this doesn't hold, we
11514 emit a better error message than just saying the relocation is not
11515 valid for the selected object format.
11516
11517 FIXP is the fix-up we're going to try to simplify, SEG is the
11518 segment in which the fix up occurs. The return value should be
11519 non-zero to indicate the fix-up is valid for further
11520 simplifications. */
11521
11522 int
11523 mips_validate_fix (fixP, seg)
11524 struct fix *fixP;
11525 asection *seg;
11526 {
11527 /* There's a lot of discussion on whether it should be possible to
11528 use R_MIPS_PC16 to represent branch relocations. The outcome
11529 seems to be that it can, but gas/bfd are very broken in creating
11530 RELA relocations for this, so for now we only accept branches to
11531 symbols in the same section. Anything else is of dubious value,
11532 since there's no guarantee that at link time the symbol would be
11533 in range. Even for branches to local symbols this is arguably
11534 wrong, since it we assume the symbol is not going to be
11535 overridden, which should be possible per ELF library semantics,
11536 but then, there isn't a dynamic relocation that could be used to
11537 this effect, and the target would likely be out of range as well.
11538
11539 Unfortunately, it seems that there is too much code out there
11540 that relies on branches to symbols that are global to be resolved
11541 as if they were local, like the IRIX tools do, so we do it as
11542 well, but with a warning so that people are reminded to fix their
11543 code. If we ever get back to using R_MIPS_PC16 for branch
11544 targets, this entire block should go away (and probably the
11545 whole function). */
11546
11547 if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
11548 && (((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11549 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11550 && mips_pic != EMBEDDED_PIC)
11551 || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
11552 && fixP->fx_addsy)
11553 {
11554 if (! S_IS_DEFINED (fixP->fx_addsy))
11555 {
11556 as_bad_where (fixP->fx_file, fixP->fx_line,
11557 _("Cannot branch to undefined symbol."));
11558 /* Avoid any further errors about this fixup. */
11559 fixP->fx_done = 1;
11560 }
11561 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
11562 {
11563 as_bad_where (fixP->fx_file, fixP->fx_line,
11564 _("Cannot branch to symbol in another section."));
11565 fixP->fx_done = 1;
11566 }
11567 else if (S_IS_EXTERNAL (fixP->fx_addsy))
11568 {
11569 symbolS *sym = fixP->fx_addsy;
11570
11571 as_warn_where (fixP->fx_file, fixP->fx_line,
11572 _("Pretending global symbol used as branch target is local."));
11573
11574 fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
11575 S_GET_SEGMENT (sym),
11576 S_GET_VALUE (sym),
11577 symbol_get_frag (sym));
11578 copy_symbol_attributes (fixP->fx_addsy, sym);
11579 S_CLEAR_EXTERNAL (fixP->fx_addsy);
11580 assert (symbol_resolved_p (sym));
11581 symbol_mark_resolved (fixP->fx_addsy);
11582 }
11583 }
11584
11585 return 1;
11586 }
11587
11588 #ifdef OBJ_ELF
11589 static int
11590 mips_need_elf_addend_fixup (fixP)
11591 fixS *fixP;
11592 {
11593 if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
11594 return 1;
11595 if (mips_pic == EMBEDDED_PIC
11596 && S_IS_WEAK (fixP->fx_addsy))
11597 return 1;
11598 if (mips_pic != EMBEDDED_PIC
11599 && (S_IS_WEAK (fixP->fx_addsy)
11600 || S_IS_EXTERNAL (fixP->fx_addsy))
11601 && !S_IS_COMMON (fixP->fx_addsy))
11602 return 1;
11603 if (((bfd_get_section_flags (stdoutput,
11604 S_GET_SEGMENT (fixP->fx_addsy))
11605 & (SEC_LINK_ONCE | SEC_MERGE)) != 0)
11606 || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
11607 ".gnu.linkonce",
11608 sizeof (".gnu.linkonce") - 1))
11609 return 1;
11610 return 0;
11611 }
11612 #endif
11613
11614 /* Apply a fixup to the object file. */
11615
11616 void
11617 md_apply_fix3 (fixP, valP, seg)
11618 fixS *fixP;
11619 valueT *valP;
11620 segT seg ATTRIBUTE_UNUSED;
11621 {
11622 bfd_byte *buf;
11623 long insn;
11624 valueT value;
11625 static int previous_fx_r_type = 0;
11626
11627 /* FIXME: Maybe just return for all reloc types not listed below?
11628 Eric Christopher says: "This is stupid, please rewrite md_apply_fix3. */
11629 if (fixP->fx_r_type == BFD_RELOC_8)
11630 return;
11631
11632 assert (fixP->fx_size == 4
11633 || fixP->fx_r_type == BFD_RELOC_16
11634 || fixP->fx_r_type == BFD_RELOC_32
11635 || fixP->fx_r_type == BFD_RELOC_MIPS_JMP
11636 || fixP->fx_r_type == BFD_RELOC_HI16_S
11637 || fixP->fx_r_type == BFD_RELOC_LO16
11638 || fixP->fx_r_type == BFD_RELOC_GPREL16
11639 || fixP->fx_r_type == BFD_RELOC_MIPS_LITERAL
11640 || fixP->fx_r_type == BFD_RELOC_GPREL32
11641 || fixP->fx_r_type == BFD_RELOC_64
11642 || fixP->fx_r_type == BFD_RELOC_CTOR
11643 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11644 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHEST
11645 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHER
11646 || fixP->fx_r_type == BFD_RELOC_MIPS_SCN_DISP
11647 || fixP->fx_r_type == BFD_RELOC_MIPS_REL16
11648 || fixP->fx_r_type == BFD_RELOC_MIPS_RELGOT
11649 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11650 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11651 || fixP->fx_r_type == BFD_RELOC_MIPS_JALR);
11652
11653 value = *valP;
11654
11655 /* If we aren't adjusting this fixup to be against the section
11656 symbol, we need to adjust the value. */
11657 #ifdef OBJ_ELF
11658 if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
11659 {
11660 if (mips_need_elf_addend_fixup (fixP))
11661 {
11662 reloc_howto_type *howto;
11663 valueT symval = S_GET_VALUE (fixP->fx_addsy);
11664
11665 value -= symval;
11666
11667 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11668 if (value != 0 && howto && howto->partial_inplace)
11669 {
11670 /* In this case, the bfd_install_relocation routine will
11671 incorrectly add the symbol value back in. We just want
11672 the addend to appear in the object file.
11673
11674 The condition above used to include
11675 "&& (! fixP->fx_pcrel || howto->pcrel_offset)".
11676
11677 However, howto can't be trusted here, because we
11678 might change the reloc type in tc_gen_reloc. We can
11679 check howto->partial_inplace because that conversion
11680 happens to preserve howto->partial_inplace; but it
11681 does not preserve howto->pcrel_offset. I've just
11682 eliminated the check, because all MIPS PC-relative
11683 relocations are marked howto->pcrel_offset.
11684
11685 howto->pcrel_offset was originally added for
11686 R_MIPS_PC16, which is generated for code like
11687
11688 globl g1 .text
11689 .text
11690 .space 20
11691 g1:
11692 x:
11693 bal g1
11694 */
11695 value -= symval;
11696
11697 /* Make sure the addend is still non-zero. If it became zero
11698 after the last operation, set it to a spurious value and
11699 subtract the same value from the object file's contents. */
11700 if (value == 0)
11701 {
11702 value = 8;
11703
11704 /* The in-place addends for LO16 relocations are signed;
11705 leave the matching HI16 in-place addends as zero. */
11706 if (fixP->fx_r_type != BFD_RELOC_HI16_S)
11707 {
11708 bfd_vma contents, mask, field;
11709
11710 contents = bfd_get_bits (fixP->fx_frag->fr_literal
11711 + fixP->fx_where,
11712 fixP->fx_size * 8,
11713 target_big_endian);
11714
11715 /* MASK has bits set where the relocation should go.
11716 FIELD is -value, shifted into the appropriate place
11717 for this relocation. */
11718 mask = 1 << (howto->bitsize - 1);
11719 mask = (((mask - 1) << 1) | 1) << howto->bitpos;
11720 field = (-value >> howto->rightshift) << howto->bitpos;
11721
11722 bfd_put_bits ((field & mask) | (contents & ~mask),
11723 fixP->fx_frag->fr_literal + fixP->fx_where,
11724 fixP->fx_size * 8,
11725 target_big_endian);
11726 }
11727 }
11728 }
11729 }
11730
11731 /* This code was generated using trial and error and so is
11732 fragile and not trustworthy. If you change it, you should
11733 rerun the elf-rel, elf-rel2, and empic testcases and ensure
11734 they still pass. */
11735 if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
11736 {
11737 value += fixP->fx_frag->fr_address + fixP->fx_where;
11738
11739 /* BFD's REL handling, for MIPS, is _very_ weird.
11740 This gives the right results, but it can't possibly
11741 be the way things are supposed to work. */
11742 if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11743 || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
11744 value += fixP->fx_frag->fr_address + fixP->fx_where;
11745 }
11746 }
11747 #endif
11748
11749 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc. */
11750
11751 /* We are not done if this is a composite relocation to set up gp. */
11752 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11753 && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11754 || (fixP->fx_r_type == BFD_RELOC_64
11755 && (previous_fx_r_type == BFD_RELOC_GPREL32
11756 || previous_fx_r_type == BFD_RELOC_GPREL16))
11757 || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11758 && (fixP->fx_r_type == BFD_RELOC_HI16_S
11759 || fixP->fx_r_type == BFD_RELOC_LO16))))
11760 fixP->fx_done = 1;
11761 previous_fx_r_type = fixP->fx_r_type;
11762
11763 switch (fixP->fx_r_type)
11764 {
11765 case BFD_RELOC_MIPS_JMP:
11766 case BFD_RELOC_MIPS_SHIFT5:
11767 case BFD_RELOC_MIPS_SHIFT6:
11768 case BFD_RELOC_MIPS_GOT_DISP:
11769 case BFD_RELOC_MIPS_GOT_PAGE:
11770 case BFD_RELOC_MIPS_GOT_OFST:
11771 case BFD_RELOC_MIPS_SUB:
11772 case BFD_RELOC_MIPS_INSERT_A:
11773 case BFD_RELOC_MIPS_INSERT_B:
11774 case BFD_RELOC_MIPS_DELETE:
11775 case BFD_RELOC_MIPS_HIGHEST:
11776 case BFD_RELOC_MIPS_HIGHER:
11777 case BFD_RELOC_MIPS_SCN_DISP:
11778 case BFD_RELOC_MIPS_REL16:
11779 case BFD_RELOC_MIPS_RELGOT:
11780 case BFD_RELOC_MIPS_JALR:
11781 case BFD_RELOC_HI16:
11782 case BFD_RELOC_HI16_S:
11783 case BFD_RELOC_GPREL16:
11784 case BFD_RELOC_MIPS_LITERAL:
11785 case BFD_RELOC_MIPS_CALL16:
11786 case BFD_RELOC_MIPS_GOT16:
11787 case BFD_RELOC_GPREL32:
11788 case BFD_RELOC_MIPS_GOT_HI16:
11789 case BFD_RELOC_MIPS_GOT_LO16:
11790 case BFD_RELOC_MIPS_CALL_HI16:
11791 case BFD_RELOC_MIPS_CALL_LO16:
11792 case BFD_RELOC_MIPS16_GPREL:
11793 if (fixP->fx_pcrel)
11794 as_bad_where (fixP->fx_file, fixP->fx_line,
11795 _("Invalid PC relative reloc"));
11796 /* Nothing needed to do. The value comes from the reloc entry */
11797 break;
11798
11799 case BFD_RELOC_MIPS16_JMP:
11800 /* We currently always generate a reloc against a symbol, which
11801 means that we don't want an addend even if the symbol is
11802 defined. */
11803 fixP->fx_addnumber = 0;
11804 break;
11805
11806 case BFD_RELOC_PCREL_HI16_S:
11807 /* The addend for this is tricky if it is internal, so we just
11808 do everything here rather than in bfd_install_relocation. */
11809 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11810 && !fixP->fx_done
11811 && value != 0)
11812 break;
11813 if (fixP->fx_addsy
11814 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11815 {
11816 /* For an external symbol adjust by the address to make it
11817 pcrel_offset. We use the address of the RELLO reloc
11818 which follows this one. */
11819 value += (fixP->fx_next->fx_frag->fr_address
11820 + fixP->fx_next->fx_where);
11821 }
11822 value = ((value + 0x8000) >> 16) & 0xffff;
11823 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11824 if (target_big_endian)
11825 buf += 2;
11826 md_number_to_chars ((char *) buf, value, 2);
11827 break;
11828
11829 case BFD_RELOC_PCREL_LO16:
11830 /* The addend for this is tricky if it is internal, so we just
11831 do everything here rather than in bfd_install_relocation. */
11832 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11833 && !fixP->fx_done
11834 && value != 0)
11835 break;
11836 if (fixP->fx_addsy
11837 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11838 value += fixP->fx_frag->fr_address + fixP->fx_where;
11839 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11840 if (target_big_endian)
11841 buf += 2;
11842 md_number_to_chars ((char *) buf, value, 2);
11843 break;
11844
11845 case BFD_RELOC_64:
11846 /* This is handled like BFD_RELOC_32, but we output a sign
11847 extended value if we are only 32 bits. */
11848 if (fixP->fx_done
11849 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11850 {
11851 if (8 <= sizeof (valueT))
11852 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11853 value, 8);
11854 else
11855 {
11856 long w1, w2;
11857 long hiv;
11858
11859 w1 = w2 = fixP->fx_where;
11860 if (target_big_endian)
11861 w1 += 4;
11862 else
11863 w2 += 4;
11864 md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
11865 if ((value & 0x80000000) != 0)
11866 hiv = 0xffffffff;
11867 else
11868 hiv = 0;
11869 md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
11870 }
11871 }
11872 break;
11873
11874 case BFD_RELOC_RVA:
11875 case BFD_RELOC_32:
11876 /* If we are deleting this reloc entry, we must fill in the
11877 value now. This can happen if we have a .word which is not
11878 resolved when it appears but is later defined. We also need
11879 to fill in the value if this is an embedded PIC switch table
11880 entry. */
11881 if (fixP->fx_done
11882 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11883 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11884 value, 4);
11885 break;
11886
11887 case BFD_RELOC_16:
11888 /* If we are deleting this reloc entry, we must fill in the
11889 value now. */
11890 assert (fixP->fx_size == 2);
11891 if (fixP->fx_done)
11892 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11893 value, 2);
11894 break;
11895
11896 case BFD_RELOC_LO16:
11897 /* When handling an embedded PIC switch statement, we can wind
11898 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11899 if (fixP->fx_done)
11900 {
11901 if (value + 0x8000 > 0xffff)
11902 as_bad_where (fixP->fx_file, fixP->fx_line,
11903 _("relocation overflow"));
11904 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11905 if (target_big_endian)
11906 buf += 2;
11907 md_number_to_chars ((char *) buf, value, 2);
11908 }
11909 break;
11910
11911 case BFD_RELOC_16_PCREL_S2:
11912 if ((value & 0x3) != 0)
11913 as_bad_where (fixP->fx_file, fixP->fx_line,
11914 _("Branch to odd address (%lx)"), (long) value);
11915
11916 /*
11917 * We need to save the bits in the instruction since fixup_segment()
11918 * might be deleting the relocation entry (i.e., a branch within
11919 * the current segment).
11920 */
11921 if (!fixP->fx_done && (value != 0 || HAVE_NEWABI))
11922 break;
11923 /* If 'value' is zero, the remaining reloc code won't actually
11924 do the store, so it must be done here. This is probably
11925 a bug somewhere. */
11926 if (!fixP->fx_done
11927 && (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11928 || fixP->fx_addsy == NULL /* ??? */
11929 || ! S_IS_DEFINED (fixP->fx_addsy)))
11930 value -= fixP->fx_frag->fr_address + fixP->fx_where;
11931
11932 value = (offsetT) value >> 2;
11933
11934 /* update old instruction data */
11935 buf = (bfd_byte *) (fixP->fx_where + fixP->fx_frag->fr_literal);
11936 if (target_big_endian)
11937 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11938 else
11939 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11940
11941 if (value + 0x8000 <= 0xffff)
11942 insn |= value & 0xffff;
11943 else
11944 {
11945 /* The branch offset is too large. If this is an
11946 unconditional branch, and we are not generating PIC code,
11947 we can convert it to an absolute jump instruction. */
11948 if (mips_pic == NO_PIC
11949 && fixP->fx_done
11950 && fixP->fx_frag->fr_address >= text_section->vma
11951 && (fixP->fx_frag->fr_address
11952 < text_section->vma + text_section->_raw_size)
11953 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
11954 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
11955 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11956 {
11957 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
11958 insn = 0x0c000000; /* jal */
11959 else
11960 insn = 0x08000000; /* j */
11961 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11962 fixP->fx_done = 0;
11963 fixP->fx_addsy = section_symbol (text_section);
11964 fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
11965 }
11966 else
11967 {
11968 /* If we got here, we have branch-relaxation disabled,
11969 and there's nothing we can do to fix this instruction
11970 without turning it into a longer sequence. */
11971 as_bad_where (fixP->fx_file, fixP->fx_line,
11972 _("Branch out of range"));
11973 }
11974 }
11975
11976 md_number_to_chars ((char *) buf, (valueT) insn, 4);
11977 break;
11978
11979 case BFD_RELOC_VTABLE_INHERIT:
11980 fixP->fx_done = 0;
11981 if (fixP->fx_addsy
11982 && !S_IS_DEFINED (fixP->fx_addsy)
11983 && !S_IS_WEAK (fixP->fx_addsy))
11984 S_SET_WEAK (fixP->fx_addsy);
11985 break;
11986
11987 case BFD_RELOC_VTABLE_ENTRY:
11988 fixP->fx_done = 0;
11989 break;
11990
11991 default:
11992 internalError ();
11993 }
11994 }
11995
11996 #if 0
11997 void
11998 printInsn (oc)
11999 unsigned long oc;
12000 {
12001 const struct mips_opcode *p;
12002 int treg, sreg, dreg, shamt;
12003 short imm;
12004 const char *args;
12005 int i;
12006
12007 for (i = 0; i < NUMOPCODES; ++i)
12008 {
12009 p = &mips_opcodes[i];
12010 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
12011 {
12012 printf ("%08lx %s\t", oc, p->name);
12013 treg = (oc >> 16) & 0x1f;
12014 sreg = (oc >> 21) & 0x1f;
12015 dreg = (oc >> 11) & 0x1f;
12016 shamt = (oc >> 6) & 0x1f;
12017 imm = oc;
12018 for (args = p->args;; ++args)
12019 {
12020 switch (*args)
12021 {
12022 case '\0':
12023 printf ("\n");
12024 break;
12025
12026 case ',':
12027 case '(':
12028 case ')':
12029 printf ("%c", *args);
12030 continue;
12031
12032 case 'r':
12033 assert (treg == sreg);
12034 printf ("$%d,$%d", treg, sreg);
12035 continue;
12036
12037 case 'd':
12038 case 'G':
12039 printf ("$%d", dreg);
12040 continue;
12041
12042 case 't':
12043 case 'E':
12044 printf ("$%d", treg);
12045 continue;
12046
12047 case 'k':
12048 printf ("0x%x", treg);
12049 continue;
12050
12051 case 'b':
12052 case 's':
12053 printf ("$%d", sreg);
12054 continue;
12055
12056 case 'a':
12057 printf ("0x%08lx", oc & 0x1ffffff);
12058 continue;
12059
12060 case 'i':
12061 case 'j':
12062 case 'o':
12063 case 'u':
12064 printf ("%d", imm);
12065 continue;
12066
12067 case '<':
12068 case '>':
12069 printf ("$%d", shamt);
12070 continue;
12071
12072 default:
12073 internalError ();
12074 }
12075 break;
12076 }
12077 return;
12078 }
12079 }
12080 printf (_("%08lx UNDEFINED\n"), oc);
12081 }
12082 #endif
12083
12084 static symbolS *
12085 get_symbol ()
12086 {
12087 int c;
12088 char *name;
12089 symbolS *p;
12090
12091 name = input_line_pointer;
12092 c = get_symbol_end ();
12093 p = (symbolS *) symbol_find_or_make (name);
12094 *input_line_pointer = c;
12095 return p;
12096 }
12097
12098 /* Align the current frag to a given power of two. The MIPS assembler
12099 also automatically adjusts any preceding label. */
12100
12101 static void
12102 mips_align (to, fill, label)
12103 int to;
12104 int fill;
12105 symbolS *label;
12106 {
12107 mips_emit_delays (FALSE);
12108 frag_align (to, fill, 0);
12109 record_alignment (now_seg, to);
12110 if (label != NULL)
12111 {
12112 assert (S_GET_SEGMENT (label) == now_seg);
12113 symbol_set_frag (label, frag_now);
12114 S_SET_VALUE (label, (valueT) frag_now_fix ());
12115 }
12116 }
12117
12118 /* Align to a given power of two. .align 0 turns off the automatic
12119 alignment used by the data creating pseudo-ops. */
12120
12121 static void
12122 s_align (x)
12123 int x ATTRIBUTE_UNUSED;
12124 {
12125 register int temp;
12126 register long temp_fill;
12127 long max_alignment = 15;
12128
12129 /*
12130
12131 o Note that the assembler pulls down any immediately preceeding label
12132 to the aligned address.
12133 o It's not documented but auto alignment is reinstated by
12134 a .align pseudo instruction.
12135 o Note also that after auto alignment is turned off the mips assembler
12136 issues an error on attempt to assemble an improperly aligned data item.
12137 We don't.
12138
12139 */
12140
12141 temp = get_absolute_expression ();
12142 if (temp > max_alignment)
12143 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12144 else if (temp < 0)
12145 {
12146 as_warn (_("Alignment negative: 0 assumed."));
12147 temp = 0;
12148 }
12149 if (*input_line_pointer == ',')
12150 {
12151 ++input_line_pointer;
12152 temp_fill = get_absolute_expression ();
12153 }
12154 else
12155 temp_fill = 0;
12156 if (temp)
12157 {
12158 auto_align = 1;
12159 mips_align (temp, (int) temp_fill,
12160 insn_labels != NULL ? insn_labels->label : NULL);
12161 }
12162 else
12163 {
12164 auto_align = 0;
12165 }
12166
12167 demand_empty_rest_of_line ();
12168 }
12169
12170 void
12171 mips_flush_pending_output ()
12172 {
12173 mips_emit_delays (FALSE);
12174 mips_clear_insn_labels ();
12175 }
12176
12177 static void
12178 s_change_sec (sec)
12179 int sec;
12180 {
12181 segT seg;
12182
12183 /* When generating embedded PIC code, we only use the .text, .lit8,
12184 .sdata and .sbss sections. We change the .data and .rdata
12185 pseudo-ops to use .sdata. */
12186 if (mips_pic == EMBEDDED_PIC
12187 && (sec == 'd' || sec == 'r'))
12188 sec = 's';
12189
12190 #ifdef OBJ_ELF
12191 /* The ELF backend needs to know that we are changing sections, so
12192 that .previous works correctly. We could do something like check
12193 for an obj_section_change_hook macro, but that might be confusing
12194 as it would not be appropriate to use it in the section changing
12195 functions in read.c, since obj-elf.c intercepts those. FIXME:
12196 This should be cleaner, somehow. */
12197 obj_elf_section_change_hook ();
12198 #endif
12199
12200 mips_emit_delays (FALSE);
12201 switch (sec)
12202 {
12203 case 't':
12204 s_text (0);
12205 break;
12206 case 'd':
12207 s_data (0);
12208 break;
12209 case 'b':
12210 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12211 demand_empty_rest_of_line ();
12212 break;
12213
12214 case 'r':
12215 if (USE_GLOBAL_POINTER_OPT)
12216 {
12217 seg = subseg_new (RDATA_SECTION_NAME,
12218 (subsegT) get_absolute_expression ());
12219 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12220 {
12221 bfd_set_section_flags (stdoutput, seg,
12222 (SEC_ALLOC
12223 | SEC_LOAD
12224 | SEC_READONLY
12225 | SEC_RELOC
12226 | SEC_DATA));
12227 if (strcmp (TARGET_OS, "elf") != 0)
12228 record_alignment (seg, 4);
12229 }
12230 demand_empty_rest_of_line ();
12231 }
12232 else
12233 {
12234 as_bad (_("No read only data section in this object file format"));
12235 demand_empty_rest_of_line ();
12236 return;
12237 }
12238 break;
12239
12240 case 's':
12241 if (USE_GLOBAL_POINTER_OPT)
12242 {
12243 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12244 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12245 {
12246 bfd_set_section_flags (stdoutput, seg,
12247 SEC_ALLOC | SEC_LOAD | SEC_RELOC
12248 | SEC_DATA);
12249 if (strcmp (TARGET_OS, "elf") != 0)
12250 record_alignment (seg, 4);
12251 }
12252 demand_empty_rest_of_line ();
12253 break;
12254 }
12255 else
12256 {
12257 as_bad (_("Global pointers not supported; recompile -G 0"));
12258 demand_empty_rest_of_line ();
12259 return;
12260 }
12261 }
12262
12263 auto_align = 1;
12264 }
12265
12266 void
12267 s_change_section (ignore)
12268 int ignore ATTRIBUTE_UNUSED;
12269 {
12270 #ifdef OBJ_ELF
12271 char *section_name;
12272 char c;
12273 char next_c = 0;
12274 int section_type;
12275 int section_flag;
12276 int section_entry_size;
12277 int section_alignment;
12278
12279 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
12280 return;
12281
12282 section_name = input_line_pointer;
12283 c = get_symbol_end ();
12284 if (c)
12285 next_c = *(input_line_pointer + 1);
12286
12287 /* Do we have .section Name<,"flags">? */
12288 if (c != ',' || (c == ',' && next_c == '"'))
12289 {
12290 /* just after name is now '\0'. */
12291 *input_line_pointer = c;
12292 input_line_pointer = section_name;
12293 obj_elf_section (ignore);
12294 return;
12295 }
12296 input_line_pointer++;
12297
12298 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12299 if (c == ',')
12300 section_type = get_absolute_expression ();
12301 else
12302 section_type = 0;
12303 if (*input_line_pointer++ == ',')
12304 section_flag = get_absolute_expression ();
12305 else
12306 section_flag = 0;
12307 if (*input_line_pointer++ == ',')
12308 section_entry_size = get_absolute_expression ();
12309 else
12310 section_entry_size = 0;
12311 if (*input_line_pointer++ == ',')
12312 section_alignment = get_absolute_expression ();
12313 else
12314 section_alignment = 0;
12315
12316 section_name = xstrdup (section_name);
12317
12318 obj_elf_change_section (section_name, section_type, section_flag,
12319 section_entry_size, 0, 0, 0);
12320
12321 if (now_seg->name != section_name)
12322 free (section_name);
12323 #endif /* OBJ_ELF */
12324 }
12325
12326 void
12327 mips_enable_auto_align ()
12328 {
12329 auto_align = 1;
12330 }
12331
12332 static void
12333 s_cons (log_size)
12334 int log_size;
12335 {
12336 symbolS *label;
12337
12338 label = insn_labels != NULL ? insn_labels->label : NULL;
12339 mips_emit_delays (FALSE);
12340 if (log_size > 0 && auto_align)
12341 mips_align (log_size, 0, label);
12342 mips_clear_insn_labels ();
12343 cons (1 << log_size);
12344 }
12345
12346 static void
12347 s_float_cons (type)
12348 int type;
12349 {
12350 symbolS *label;
12351
12352 label = insn_labels != NULL ? insn_labels->label : NULL;
12353
12354 mips_emit_delays (FALSE);
12355
12356 if (auto_align)
12357 {
12358 if (type == 'd')
12359 mips_align (3, 0, label);
12360 else
12361 mips_align (2, 0, label);
12362 }
12363
12364 mips_clear_insn_labels ();
12365
12366 float_cons (type);
12367 }
12368
12369 /* Handle .globl. We need to override it because on Irix 5 you are
12370 permitted to say
12371 .globl foo .text
12372 where foo is an undefined symbol, to mean that foo should be
12373 considered to be the address of a function. */
12374
12375 static void
12376 s_mips_globl (x)
12377 int x ATTRIBUTE_UNUSED;
12378 {
12379 char *name;
12380 int c;
12381 symbolS *symbolP;
12382 flagword flag;
12383
12384 name = input_line_pointer;
12385 c = get_symbol_end ();
12386 symbolP = symbol_find_or_make (name);
12387 *input_line_pointer = c;
12388 SKIP_WHITESPACE ();
12389
12390 /* On Irix 5, every global symbol that is not explicitly labelled as
12391 being a function is apparently labelled as being an object. */
12392 flag = BSF_OBJECT;
12393
12394 if (! is_end_of_line[(unsigned char) *input_line_pointer])
12395 {
12396 char *secname;
12397 asection *sec;
12398
12399 secname = input_line_pointer;
12400 c = get_symbol_end ();
12401 sec = bfd_get_section_by_name (stdoutput, secname);
12402 if (sec == NULL)
12403 as_bad (_("%s: no such section"), secname);
12404 *input_line_pointer = c;
12405
12406 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12407 flag = BSF_FUNCTION;
12408 }
12409
12410 symbol_get_bfdsym (symbolP)->flags |= flag;
12411
12412 S_SET_EXTERNAL (symbolP);
12413 demand_empty_rest_of_line ();
12414 }
12415
12416 static void
12417 s_option (x)
12418 int x ATTRIBUTE_UNUSED;
12419 {
12420 char *opt;
12421 char c;
12422
12423 opt = input_line_pointer;
12424 c = get_symbol_end ();
12425
12426 if (*opt == 'O')
12427 {
12428 /* FIXME: What does this mean? */
12429 }
12430 else if (strncmp (opt, "pic", 3) == 0)
12431 {
12432 int i;
12433
12434 i = atoi (opt + 3);
12435 if (i == 0)
12436 mips_pic = NO_PIC;
12437 else if (i == 2)
12438 {
12439 mips_pic = SVR4_PIC;
12440 mips_abicalls = TRUE;
12441 }
12442 else
12443 as_bad (_(".option pic%d not supported"), i);
12444
12445 if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
12446 {
12447 if (g_switch_seen && g_switch_value != 0)
12448 as_warn (_("-G may not be used with SVR4 PIC code"));
12449 g_switch_value = 0;
12450 bfd_set_gp_size (stdoutput, 0);
12451 }
12452 }
12453 else
12454 as_warn (_("Unrecognized option \"%s\""), opt);
12455
12456 *input_line_pointer = c;
12457 demand_empty_rest_of_line ();
12458 }
12459
12460 /* This structure is used to hold a stack of .set values. */
12461
12462 struct mips_option_stack
12463 {
12464 struct mips_option_stack *next;
12465 struct mips_set_options options;
12466 };
12467
12468 static struct mips_option_stack *mips_opts_stack;
12469
12470 /* Handle the .set pseudo-op. */
12471
12472 static void
12473 s_mipsset (x)
12474 int x ATTRIBUTE_UNUSED;
12475 {
12476 char *name = input_line_pointer, ch;
12477
12478 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12479 ++input_line_pointer;
12480 ch = *input_line_pointer;
12481 *input_line_pointer = '\0';
12482
12483 if (strcmp (name, "reorder") == 0)
12484 {
12485 if (mips_opts.noreorder && prev_nop_frag != NULL)
12486 {
12487 /* If we still have pending nops, we can discard them. The
12488 usual nop handling will insert any that are still
12489 needed. */
12490 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12491 * (mips_opts.mips16 ? 2 : 4));
12492 prev_nop_frag = NULL;
12493 }
12494 mips_opts.noreorder = 0;
12495 }
12496 else if (strcmp (name, "noreorder") == 0)
12497 {
12498 mips_emit_delays (TRUE);
12499 mips_opts.noreorder = 1;
12500 mips_any_noreorder = 1;
12501 }
12502 else if (strcmp (name, "at") == 0)
12503 {
12504 mips_opts.noat = 0;
12505 }
12506 else if (strcmp (name, "noat") == 0)
12507 {
12508 mips_opts.noat = 1;
12509 }
12510 else if (strcmp (name, "macro") == 0)
12511 {
12512 mips_opts.warn_about_macros = 0;
12513 }
12514 else if (strcmp (name, "nomacro") == 0)
12515 {
12516 if (mips_opts.noreorder == 0)
12517 as_bad (_("`noreorder' must be set before `nomacro'"));
12518 mips_opts.warn_about_macros = 1;
12519 }
12520 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12521 {
12522 mips_opts.nomove = 0;
12523 }
12524 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12525 {
12526 mips_opts.nomove = 1;
12527 }
12528 else if (strcmp (name, "bopt") == 0)
12529 {
12530 mips_opts.nobopt = 0;
12531 }
12532 else if (strcmp (name, "nobopt") == 0)
12533 {
12534 mips_opts.nobopt = 1;
12535 }
12536 else if (strcmp (name, "mips16") == 0
12537 || strcmp (name, "MIPS-16") == 0)
12538 mips_opts.mips16 = 1;
12539 else if (strcmp (name, "nomips16") == 0
12540 || strcmp (name, "noMIPS-16") == 0)
12541 mips_opts.mips16 = 0;
12542 else if (strcmp (name, "mips3d") == 0)
12543 mips_opts.ase_mips3d = 1;
12544 else if (strcmp (name, "nomips3d") == 0)
12545 mips_opts.ase_mips3d = 0;
12546 else if (strcmp (name, "mdmx") == 0)
12547 mips_opts.ase_mdmx = 1;
12548 else if (strcmp (name, "nomdmx") == 0)
12549 mips_opts.ase_mdmx = 0;
12550 else if (strncmp (name, "mips", 4) == 0)
12551 {
12552 int reset = 0;
12553
12554 /* Permit the user to change the ISA on the fly. Needless to
12555 say, misuse can cause serious problems. */
12556 if (strcmp (name, "mips0") == 0)
12557 {
12558 reset = 1;
12559 mips_opts.isa = file_mips_isa;
12560 }
12561 else if (strcmp (name, "mips1") == 0)
12562 mips_opts.isa = ISA_MIPS1;
12563 else if (strcmp (name, "mips2") == 0)
12564 mips_opts.isa = ISA_MIPS2;
12565 else if (strcmp (name, "mips3") == 0)
12566 mips_opts.isa = ISA_MIPS3;
12567 else if (strcmp (name, "mips4") == 0)
12568 mips_opts.isa = ISA_MIPS4;
12569 else if (strcmp (name, "mips5") == 0)
12570 mips_opts.isa = ISA_MIPS5;
12571 else if (strcmp (name, "mips32") == 0)
12572 mips_opts.isa = ISA_MIPS32;
12573 else if (strcmp (name, "mips32r2") == 0)
12574 mips_opts.isa = ISA_MIPS32R2;
12575 else if (strcmp (name, "mips64") == 0)
12576 mips_opts.isa = ISA_MIPS64;
12577 else
12578 as_bad (_("unknown ISA level %s"), name + 4);
12579
12580 switch (mips_opts.isa)
12581 {
12582 case 0:
12583 break;
12584 case ISA_MIPS1:
12585 case ISA_MIPS2:
12586 case ISA_MIPS32:
12587 case ISA_MIPS32R2:
12588 mips_opts.gp32 = 1;
12589 mips_opts.fp32 = 1;
12590 break;
12591 case ISA_MIPS3:
12592 case ISA_MIPS4:
12593 case ISA_MIPS5:
12594 case ISA_MIPS64:
12595 mips_opts.gp32 = 0;
12596 mips_opts.fp32 = 0;
12597 break;
12598 default:
12599 as_bad (_("unknown ISA level %s"), name + 4);
12600 break;
12601 }
12602 if (reset)
12603 {
12604 mips_opts.gp32 = file_mips_gp32;
12605 mips_opts.fp32 = file_mips_fp32;
12606 }
12607 }
12608 else if (strcmp (name, "autoextend") == 0)
12609 mips_opts.noautoextend = 0;
12610 else if (strcmp (name, "noautoextend") == 0)
12611 mips_opts.noautoextend = 1;
12612 else if (strcmp (name, "push") == 0)
12613 {
12614 struct mips_option_stack *s;
12615
12616 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12617 s->next = mips_opts_stack;
12618 s->options = mips_opts;
12619 mips_opts_stack = s;
12620 }
12621 else if (strcmp (name, "pop") == 0)
12622 {
12623 struct mips_option_stack *s;
12624
12625 s = mips_opts_stack;
12626 if (s == NULL)
12627 as_bad (_(".set pop with no .set push"));
12628 else
12629 {
12630 /* If we're changing the reorder mode we need to handle
12631 delay slots correctly. */
12632 if (s->options.noreorder && ! mips_opts.noreorder)
12633 mips_emit_delays (TRUE);
12634 else if (! s->options.noreorder && mips_opts.noreorder)
12635 {
12636 if (prev_nop_frag != NULL)
12637 {
12638 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12639 * (mips_opts.mips16 ? 2 : 4));
12640 prev_nop_frag = NULL;
12641 }
12642 }
12643
12644 mips_opts = s->options;
12645 mips_opts_stack = s->next;
12646 free (s);
12647 }
12648 }
12649 else
12650 {
12651 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12652 }
12653 *input_line_pointer = ch;
12654 demand_empty_rest_of_line ();
12655 }
12656
12657 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12658 .option pic2. It means to generate SVR4 PIC calls. */
12659
12660 static void
12661 s_abicalls (ignore)
12662 int ignore ATTRIBUTE_UNUSED;
12663 {
12664 mips_pic = SVR4_PIC;
12665 mips_abicalls = TRUE;
12666 if (USE_GLOBAL_POINTER_OPT)
12667 {
12668 if (g_switch_seen && g_switch_value != 0)
12669 as_warn (_("-G may not be used with SVR4 PIC code"));
12670 g_switch_value = 0;
12671 }
12672 bfd_set_gp_size (stdoutput, 0);
12673 demand_empty_rest_of_line ();
12674 }
12675
12676 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12677 PIC code. It sets the $gp register for the function based on the
12678 function address, which is in the register named in the argument.
12679 This uses a relocation against _gp_disp, which is handled specially
12680 by the linker. The result is:
12681 lui $gp,%hi(_gp_disp)
12682 addiu $gp,$gp,%lo(_gp_disp)
12683 addu $gp,$gp,.cpload argument
12684 The .cpload argument is normally $25 == $t9. */
12685
12686 static void
12687 s_cpload (ignore)
12688 int ignore ATTRIBUTE_UNUSED;
12689 {
12690 expressionS ex;
12691 int icnt = 0;
12692
12693 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12694 .cpload is ignored. */
12695 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12696 {
12697 s_ignore (0);
12698 return;
12699 }
12700
12701 /* .cpload should be in a .set noreorder section. */
12702 if (mips_opts.noreorder == 0)
12703 as_warn (_(".cpload not in noreorder section"));
12704
12705 ex.X_op = O_symbol;
12706 ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12707 ex.X_op_symbol = NULL;
12708 ex.X_add_number = 0;
12709
12710 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12711 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12712
12713 macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
12714 macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
12715 mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
12716
12717 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
12718 mips_gp_register, mips_gp_register, tc_get_register (0));
12719
12720 demand_empty_rest_of_line ();
12721 }
12722
12723 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12724 .cpsetup $reg1, offset|$reg2, label
12725
12726 If offset is given, this results in:
12727 sd $gp, offset($sp)
12728 lui $gp, %hi(%neg(%gp_rel(label)))
12729 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12730 daddu $gp, $gp, $reg1
12731
12732 If $reg2 is given, this results in:
12733 daddu $reg2, $gp, $0
12734 lui $gp, %hi(%neg(%gp_rel(label)))
12735 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12736 daddu $gp, $gp, $reg1
12737 $reg1 is normally $25 == $t9. */
12738 static void
12739 s_cpsetup (ignore)
12740 int ignore ATTRIBUTE_UNUSED;
12741 {
12742 expressionS ex_off;
12743 expressionS ex_sym;
12744 int reg1;
12745 int icnt = 0;
12746 char *f;
12747
12748 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12749 We also need NewABI support. */
12750 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12751 {
12752 s_ignore (0);
12753 return;
12754 }
12755
12756 reg1 = tc_get_register (0);
12757 SKIP_WHITESPACE ();
12758 if (*input_line_pointer != ',')
12759 {
12760 as_bad (_("missing argument separator ',' for .cpsetup"));
12761 return;
12762 }
12763 else
12764 ++input_line_pointer;
12765 SKIP_WHITESPACE ();
12766 if (*input_line_pointer == '$')
12767 {
12768 mips_cpreturn_register = tc_get_register (0);
12769 mips_cpreturn_offset = -1;
12770 }
12771 else
12772 {
12773 mips_cpreturn_offset = get_absolute_expression ();
12774 mips_cpreturn_register = -1;
12775 }
12776 SKIP_WHITESPACE ();
12777 if (*input_line_pointer != ',')
12778 {
12779 as_bad (_("missing argument separator ',' for .cpsetup"));
12780 return;
12781 }
12782 else
12783 ++input_line_pointer;
12784 SKIP_WHITESPACE ();
12785 expression (&ex_sym);
12786
12787 if (mips_cpreturn_register == -1)
12788 {
12789 ex_off.X_op = O_constant;
12790 ex_off.X_add_symbol = NULL;
12791 ex_off.X_op_symbol = NULL;
12792 ex_off.X_add_number = mips_cpreturn_offset;
12793
12794 macro_build ((char *) NULL, &icnt, &ex_off, "sd", "t,o(b)",
12795 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12796 }
12797 else
12798 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12799 "d,v,t", mips_cpreturn_register, mips_gp_register, 0);
12800
12801 /* Ensure there's room for the next two instructions, so that `f'
12802 doesn't end up with an address in the wrong frag. */
12803 frag_grow (8);
12804 f = frag_more (0);
12805 macro_build ((char *) NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
12806 (int) BFD_RELOC_GPREL16);
12807 fix_new (frag_now, f - frag_now->fr_literal,
12808 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12809 fix_new (frag_now, f - frag_now->fr_literal,
12810 0, NULL, 0, 0, BFD_RELOC_HI16_S);
12811
12812 f = frag_more (0);
12813 macro_build ((char *) NULL, &icnt, &ex_sym, "addiu", "t,r,j",
12814 mips_gp_register, mips_gp_register, (int) BFD_RELOC_GPREL16);
12815 fix_new (frag_now, f - frag_now->fr_literal,
12816 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12817 fix_new (frag_now, f - frag_now->fr_literal,
12818 0, NULL, 0, 0, BFD_RELOC_LO16);
12819
12820 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
12821 HAVE_64BIT_ADDRESSES ? "daddu" : "add", "d,v,t",
12822 mips_gp_register, mips_gp_register, reg1);
12823
12824 demand_empty_rest_of_line ();
12825 }
12826
12827 static void
12828 s_cplocal (ignore)
12829 int ignore ATTRIBUTE_UNUSED;
12830 {
12831 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12832 .cplocal is ignored. */
12833 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12834 {
12835 s_ignore (0);
12836 return;
12837 }
12838
12839 mips_gp_register = tc_get_register (0);
12840 demand_empty_rest_of_line ();
12841 }
12842
12843 /* Handle the .cprestore pseudo-op. This stores $gp into a given
12844 offset from $sp. The offset is remembered, and after making a PIC
12845 call $gp is restored from that location. */
12846
12847 static void
12848 s_cprestore (ignore)
12849 int ignore ATTRIBUTE_UNUSED;
12850 {
12851 expressionS ex;
12852 int icnt = 0;
12853
12854 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12855 .cprestore is ignored. */
12856 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12857 {
12858 s_ignore (0);
12859 return;
12860 }
12861
12862 mips_cprestore_offset = get_absolute_expression ();
12863 mips_cprestore_valid = 1;
12864
12865 ex.X_op = O_constant;
12866 ex.X_add_symbol = NULL;
12867 ex.X_op_symbol = NULL;
12868 ex.X_add_number = mips_cprestore_offset;
12869
12870 macro_build_ldst_constoffset ((char *) NULL, &icnt, &ex,
12871 HAVE_32BIT_ADDRESSES ? "sw" : "sd",
12872 mips_gp_register, SP);
12873
12874 demand_empty_rest_of_line ();
12875 }
12876
12877 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12878 was given in the preceeding .gpsetup, it results in:
12879 ld $gp, offset($sp)
12880
12881 If a register $reg2 was given there, it results in:
12882 daddiu $gp, $gp, $reg2
12883 */
12884 static void
12885 s_cpreturn (ignore)
12886 int ignore ATTRIBUTE_UNUSED;
12887 {
12888 expressionS ex;
12889 int icnt = 0;
12890
12891 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12892 We also need NewABI support. */
12893 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12894 {
12895 s_ignore (0);
12896 return;
12897 }
12898
12899 if (mips_cpreturn_register == -1)
12900 {
12901 ex.X_op = O_constant;
12902 ex.X_add_symbol = NULL;
12903 ex.X_op_symbol = NULL;
12904 ex.X_add_number = mips_cpreturn_offset;
12905
12906 macro_build ((char *) NULL, &icnt, &ex, "ld", "t,o(b)",
12907 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12908 }
12909 else
12910 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12911 "d,v,t", mips_gp_register, mips_cpreturn_register, 0);
12912
12913 demand_empty_rest_of_line ();
12914 }
12915
12916 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12917 code. It sets the offset to use in gp_rel relocations. */
12918
12919 static void
12920 s_gpvalue (ignore)
12921 int ignore ATTRIBUTE_UNUSED;
12922 {
12923 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12924 We also need NewABI support. */
12925 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12926 {
12927 s_ignore (0);
12928 return;
12929 }
12930
12931 mips_gprel_offset = get_absolute_expression ();
12932
12933 demand_empty_rest_of_line ();
12934 }
12935
12936 /* Handle the .gpword pseudo-op. This is used when generating PIC
12937 code. It generates a 32 bit GP relative reloc. */
12938
12939 static void
12940 s_gpword (ignore)
12941 int ignore ATTRIBUTE_UNUSED;
12942 {
12943 symbolS *label;
12944 expressionS ex;
12945 char *p;
12946
12947 /* When not generating PIC code, this is treated as .word. */
12948 if (mips_pic != SVR4_PIC)
12949 {
12950 s_cons (2);
12951 return;
12952 }
12953
12954 label = insn_labels != NULL ? insn_labels->label : NULL;
12955 mips_emit_delays (TRUE);
12956 if (auto_align)
12957 mips_align (2, 0, label);
12958 mips_clear_insn_labels ();
12959
12960 expression (&ex);
12961
12962 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12963 {
12964 as_bad (_("Unsupported use of .gpword"));
12965 ignore_rest_of_line ();
12966 }
12967
12968 p = frag_more (4);
12969 md_number_to_chars (p, (valueT) 0, 4);
12970 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12971 BFD_RELOC_GPREL32);
12972
12973 demand_empty_rest_of_line ();
12974 }
12975
12976 static void
12977 s_gpdword (ignore)
12978 int ignore ATTRIBUTE_UNUSED;
12979 {
12980 symbolS *label;
12981 expressionS ex;
12982 char *p;
12983
12984 /* When not generating PIC code, this is treated as .dword. */
12985 if (mips_pic != SVR4_PIC)
12986 {
12987 s_cons (3);
12988 return;
12989 }
12990
12991 label = insn_labels != NULL ? insn_labels->label : NULL;
12992 mips_emit_delays (TRUE);
12993 if (auto_align)
12994 mips_align (3, 0, label);
12995 mips_clear_insn_labels ();
12996
12997 expression (&ex);
12998
12999 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13000 {
13001 as_bad (_("Unsupported use of .gpdword"));
13002 ignore_rest_of_line ();
13003 }
13004
13005 p = frag_more (8);
13006 md_number_to_chars (p, (valueT) 0, 8);
13007 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
13008 BFD_RELOC_GPREL32);
13009
13010 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13011 ex.X_op = O_absent;
13012 ex.X_add_symbol = 0;
13013 ex.X_add_number = 0;
13014 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
13015 BFD_RELOC_64);
13016
13017 demand_empty_rest_of_line ();
13018 }
13019
13020 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13021 tables in SVR4 PIC code. */
13022
13023 static void
13024 s_cpadd (ignore)
13025 int ignore ATTRIBUTE_UNUSED;
13026 {
13027 int icnt = 0;
13028 int reg;
13029
13030 /* This is ignored when not generating SVR4 PIC code. */
13031 if (mips_pic != SVR4_PIC)
13032 {
13033 s_ignore (0);
13034 return;
13035 }
13036
13037 /* Add $gp to the register named as an argument. */
13038 reg = tc_get_register (0);
13039 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
13040 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI ? "add" : "addu" : "daddu",
13041 "d,v,t", reg, reg, mips_gp_register);
13042
13043 demand_empty_rest_of_line ();
13044 }
13045
13046 /* Handle the .insn pseudo-op. This marks instruction labels in
13047 mips16 mode. This permits the linker to handle them specially,
13048 such as generating jalx instructions when needed. We also make
13049 them odd for the duration of the assembly, in order to generate the
13050 right sort of code. We will make them even in the adjust_symtab
13051 routine, while leaving them marked. This is convenient for the
13052 debugger and the disassembler. The linker knows to make them odd
13053 again. */
13054
13055 static void
13056 s_insn (ignore)
13057 int ignore ATTRIBUTE_UNUSED;
13058 {
13059 mips16_mark_labels ();
13060
13061 demand_empty_rest_of_line ();
13062 }
13063
13064 /* Handle a .stabn directive. We need these in order to mark a label
13065 as being a mips16 text label correctly. Sometimes the compiler
13066 will emit a label, followed by a .stabn, and then switch sections.
13067 If the label and .stabn are in mips16 mode, then the label is
13068 really a mips16 text label. */
13069
13070 static void
13071 s_mips_stab (type)
13072 int type;
13073 {
13074 if (type == 'n')
13075 mips16_mark_labels ();
13076
13077 s_stab (type);
13078 }
13079
13080 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
13081 */
13082
13083 static void
13084 s_mips_weakext (ignore)
13085 int ignore ATTRIBUTE_UNUSED;
13086 {
13087 char *name;
13088 int c;
13089 symbolS *symbolP;
13090 expressionS exp;
13091
13092 name = input_line_pointer;
13093 c = get_symbol_end ();
13094 symbolP = symbol_find_or_make (name);
13095 S_SET_WEAK (symbolP);
13096 *input_line_pointer = c;
13097
13098 SKIP_WHITESPACE ();
13099
13100 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13101 {
13102 if (S_IS_DEFINED (symbolP))
13103 {
13104 as_bad ("ignoring attempt to redefine symbol %s",
13105 S_GET_NAME (symbolP));
13106 ignore_rest_of_line ();
13107 return;
13108 }
13109
13110 if (*input_line_pointer == ',')
13111 {
13112 ++input_line_pointer;
13113 SKIP_WHITESPACE ();
13114 }
13115
13116 expression (&exp);
13117 if (exp.X_op != O_symbol)
13118 {
13119 as_bad ("bad .weakext directive");
13120 ignore_rest_of_line ();
13121 return;
13122 }
13123 symbol_set_value_expression (symbolP, &exp);
13124 }
13125
13126 demand_empty_rest_of_line ();
13127 }
13128
13129 /* Parse a register string into a number. Called from the ECOFF code
13130 to parse .frame. The argument is non-zero if this is the frame
13131 register, so that we can record it in mips_frame_reg. */
13132
13133 int
13134 tc_get_register (frame)
13135 int frame;
13136 {
13137 int reg;
13138
13139 SKIP_WHITESPACE ();
13140 if (*input_line_pointer++ != '$')
13141 {
13142 as_warn (_("expected `$'"));
13143 reg = ZERO;
13144 }
13145 else if (ISDIGIT (*input_line_pointer))
13146 {
13147 reg = get_absolute_expression ();
13148 if (reg < 0 || reg >= 32)
13149 {
13150 as_warn (_("Bad register number"));
13151 reg = ZERO;
13152 }
13153 }
13154 else
13155 {
13156 if (strncmp (input_line_pointer, "ra", 2) == 0)
13157 {
13158 reg = RA;
13159 input_line_pointer += 2;
13160 }
13161 else if (strncmp (input_line_pointer, "fp", 2) == 0)
13162 {
13163 reg = FP;
13164 input_line_pointer += 2;
13165 }
13166 else if (strncmp (input_line_pointer, "sp", 2) == 0)
13167 {
13168 reg = SP;
13169 input_line_pointer += 2;
13170 }
13171 else if (strncmp (input_line_pointer, "gp", 2) == 0)
13172 {
13173 reg = GP;
13174 input_line_pointer += 2;
13175 }
13176 else if (strncmp (input_line_pointer, "at", 2) == 0)
13177 {
13178 reg = AT;
13179 input_line_pointer += 2;
13180 }
13181 else if (strncmp (input_line_pointer, "kt0", 3) == 0)
13182 {
13183 reg = KT0;
13184 input_line_pointer += 3;
13185 }
13186 else if (strncmp (input_line_pointer, "kt1", 3) == 0)
13187 {
13188 reg = KT1;
13189 input_line_pointer += 3;
13190 }
13191 else if (strncmp (input_line_pointer, "zero", 4) == 0)
13192 {
13193 reg = ZERO;
13194 input_line_pointer += 4;
13195 }
13196 else
13197 {
13198 as_warn (_("Unrecognized register name"));
13199 reg = ZERO;
13200 while (ISALNUM(*input_line_pointer))
13201 input_line_pointer++;
13202 }
13203 }
13204 if (frame)
13205 {
13206 mips_frame_reg = reg != 0 ? reg : SP;
13207 mips_frame_reg_valid = 1;
13208 mips_cprestore_valid = 0;
13209 }
13210 return reg;
13211 }
13212
13213 valueT
13214 md_section_align (seg, addr)
13215 asection *seg;
13216 valueT addr;
13217 {
13218 int align = bfd_get_section_alignment (stdoutput, seg);
13219
13220 #ifdef OBJ_ELF
13221 /* We don't need to align ELF sections to the full alignment.
13222 However, Irix 5 may prefer that we align them at least to a 16
13223 byte boundary. We don't bother to align the sections if we are
13224 targeted for an embedded system. */
13225 if (strcmp (TARGET_OS, "elf") == 0)
13226 return addr;
13227 if (align > 4)
13228 align = 4;
13229 #endif
13230
13231 return ((addr + (1 << align) - 1) & (-1 << align));
13232 }
13233
13234 /* Utility routine, called from above as well. If called while the
13235 input file is still being read, it's only an approximation. (For
13236 example, a symbol may later become defined which appeared to be
13237 undefined earlier.) */
13238
13239 static int
13240 nopic_need_relax (sym, before_relaxing)
13241 symbolS *sym;
13242 int before_relaxing;
13243 {
13244 if (sym == 0)
13245 return 0;
13246
13247 if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
13248 {
13249 const char *symname;
13250 int change;
13251
13252 /* Find out whether this symbol can be referenced off the $gp
13253 register. It can be if it is smaller than the -G size or if
13254 it is in the .sdata or .sbss section. Certain symbols can
13255 not be referenced off the $gp, although it appears as though
13256 they can. */
13257 symname = S_GET_NAME (sym);
13258 if (symname != (const char *) NULL
13259 && (strcmp (symname, "eprol") == 0
13260 || strcmp (symname, "etext") == 0
13261 || strcmp (symname, "_gp") == 0
13262 || strcmp (symname, "edata") == 0
13263 || strcmp (symname, "_fbss") == 0
13264 || strcmp (symname, "_fdata") == 0
13265 || strcmp (symname, "_ftext") == 0
13266 || strcmp (symname, "end") == 0
13267 || strcmp (symname, "_gp_disp") == 0))
13268 change = 1;
13269 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13270 && (0
13271 #ifndef NO_ECOFF_DEBUGGING
13272 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13273 && (symbol_get_obj (sym)->ecoff_extern_size
13274 <= g_switch_value))
13275 #endif
13276 /* We must defer this decision until after the whole
13277 file has been read, since there might be a .extern
13278 after the first use of this symbol. */
13279 || (before_relaxing
13280 #ifndef NO_ECOFF_DEBUGGING
13281 && symbol_get_obj (sym)->ecoff_extern_size == 0
13282 #endif
13283 && S_GET_VALUE (sym) == 0)
13284 || (S_GET_VALUE (sym) != 0
13285 && S_GET_VALUE (sym) <= g_switch_value)))
13286 change = 0;
13287 else
13288 {
13289 const char *segname;
13290
13291 segname = segment_name (S_GET_SEGMENT (sym));
13292 assert (strcmp (segname, ".lit8") != 0
13293 && strcmp (segname, ".lit4") != 0);
13294 change = (strcmp (segname, ".sdata") != 0
13295 && strcmp (segname, ".sbss") != 0
13296 && strncmp (segname, ".sdata.", 7) != 0
13297 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13298 }
13299 return change;
13300 }
13301 else
13302 /* We are not optimizing for the $gp register. */
13303 return 1;
13304 }
13305
13306
13307 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13308
13309 static bfd_boolean
13310 pic_need_relax (sym, segtype)
13311 symbolS *sym;
13312 asection *segtype;
13313 {
13314 asection *symsec;
13315 bfd_boolean linkonce;
13316
13317 /* Handle the case of a symbol equated to another symbol. */
13318 while (symbol_equated_reloc_p (sym))
13319 {
13320 symbolS *n;
13321
13322 /* It's possible to get a loop here in a badly written
13323 program. */
13324 n = symbol_get_value_expression (sym)->X_add_symbol;
13325 if (n == sym)
13326 break;
13327 sym = n;
13328 }
13329
13330 symsec = S_GET_SEGMENT (sym);
13331
13332 /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
13333 linkonce = FALSE;
13334 if (symsec != segtype && ! S_IS_LOCAL (sym))
13335 {
13336 if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
13337 != 0)
13338 linkonce = TRUE;
13339
13340 /* The GNU toolchain uses an extension for ELF: a section
13341 beginning with the magic string .gnu.linkonce is a linkonce
13342 section. */
13343 if (strncmp (segment_name (symsec), ".gnu.linkonce",
13344 sizeof ".gnu.linkonce" - 1) == 0)
13345 linkonce = TRUE;
13346 }
13347
13348 /* This must duplicate the test in adjust_reloc_syms. */
13349 return (symsec != &bfd_und_section
13350 && symsec != &bfd_abs_section
13351 && ! bfd_is_com_section (symsec)
13352 && !linkonce
13353 #ifdef OBJ_ELF
13354 /* A global or weak symbol is treated as external. */
13355 && (OUTPUT_FLAVOR != bfd_target_elf_flavour
13356 || (! S_IS_WEAK (sym)
13357 && (! S_IS_EXTERNAL (sym)
13358 || mips_pic == EMBEDDED_PIC)))
13359 #endif
13360 );
13361 }
13362
13363
13364 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13365 extended opcode. SEC is the section the frag is in. */
13366
13367 static int
13368 mips16_extended_frag (fragp, sec, stretch)
13369 fragS *fragp;
13370 asection *sec;
13371 long stretch;
13372 {
13373 int type;
13374 register const struct mips16_immed_operand *op;
13375 offsetT val;
13376 int mintiny, maxtiny;
13377 segT symsec;
13378 fragS *sym_frag;
13379
13380 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13381 return 0;
13382 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13383 return 1;
13384
13385 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13386 op = mips16_immed_operands;
13387 while (op->type != type)
13388 {
13389 ++op;
13390 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13391 }
13392
13393 if (op->unsp)
13394 {
13395 if (type == '<' || type == '>' || type == '[' || type == ']')
13396 {
13397 mintiny = 1;
13398 maxtiny = 1 << op->nbits;
13399 }
13400 else
13401 {
13402 mintiny = 0;
13403 maxtiny = (1 << op->nbits) - 1;
13404 }
13405 }
13406 else
13407 {
13408 mintiny = - (1 << (op->nbits - 1));
13409 maxtiny = (1 << (op->nbits - 1)) - 1;
13410 }
13411
13412 sym_frag = symbol_get_frag (fragp->fr_symbol);
13413 val = S_GET_VALUE (fragp->fr_symbol);
13414 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13415
13416 if (op->pcrel)
13417 {
13418 addressT addr;
13419
13420 /* We won't have the section when we are called from
13421 mips_relax_frag. However, we will always have been called
13422 from md_estimate_size_before_relax first. If this is a
13423 branch to a different section, we mark it as such. If SEC is
13424 NULL, and the frag is not marked, then it must be a branch to
13425 the same section. */
13426 if (sec == NULL)
13427 {
13428 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13429 return 1;
13430 }
13431 else
13432 {
13433 /* Must have been called from md_estimate_size_before_relax. */
13434 if (symsec != sec)
13435 {
13436 fragp->fr_subtype =
13437 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13438
13439 /* FIXME: We should support this, and let the linker
13440 catch branches and loads that are out of range. */
13441 as_bad_where (fragp->fr_file, fragp->fr_line,
13442 _("unsupported PC relative reference to different section"));
13443
13444 return 1;
13445 }
13446 if (fragp != sym_frag && sym_frag->fr_address == 0)
13447 /* Assume non-extended on the first relaxation pass.
13448 The address we have calculated will be bogus if this is
13449 a forward branch to another frag, as the forward frag
13450 will have fr_address == 0. */
13451 return 0;
13452 }
13453
13454 /* In this case, we know for sure that the symbol fragment is in
13455 the same section. If the relax_marker of the symbol fragment
13456 differs from the relax_marker of this fragment, we have not
13457 yet adjusted the symbol fragment fr_address. We want to add
13458 in STRETCH in order to get a better estimate of the address.
13459 This particularly matters because of the shift bits. */
13460 if (stretch != 0
13461 && sym_frag->relax_marker != fragp->relax_marker)
13462 {
13463 fragS *f;
13464
13465 /* Adjust stretch for any alignment frag. Note that if have
13466 been expanding the earlier code, the symbol may be
13467 defined in what appears to be an earlier frag. FIXME:
13468 This doesn't handle the fr_subtype field, which specifies
13469 a maximum number of bytes to skip when doing an
13470 alignment. */
13471 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13472 {
13473 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13474 {
13475 if (stretch < 0)
13476 stretch = - ((- stretch)
13477 & ~ ((1 << (int) f->fr_offset) - 1));
13478 else
13479 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13480 if (stretch == 0)
13481 break;
13482 }
13483 }
13484 if (f != NULL)
13485 val += stretch;
13486 }
13487
13488 addr = fragp->fr_address + fragp->fr_fix;
13489
13490 /* The base address rules are complicated. The base address of
13491 a branch is the following instruction. The base address of a
13492 PC relative load or add is the instruction itself, but if it
13493 is in a delay slot (in which case it can not be extended) use
13494 the address of the instruction whose delay slot it is in. */
13495 if (type == 'p' || type == 'q')
13496 {
13497 addr += 2;
13498
13499 /* If we are currently assuming that this frag should be
13500 extended, then, the current address is two bytes
13501 higher. */
13502 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13503 addr += 2;
13504
13505 /* Ignore the low bit in the target, since it will be set
13506 for a text label. */
13507 if ((val & 1) != 0)
13508 --val;
13509 }
13510 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13511 addr -= 4;
13512 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13513 addr -= 2;
13514
13515 val -= addr & ~ ((1 << op->shift) - 1);
13516
13517 /* Branch offsets have an implicit 0 in the lowest bit. */
13518 if (type == 'p' || type == 'q')
13519 val /= 2;
13520
13521 /* If any of the shifted bits are set, we must use an extended
13522 opcode. If the address depends on the size of this
13523 instruction, this can lead to a loop, so we arrange to always
13524 use an extended opcode. We only check this when we are in
13525 the main relaxation loop, when SEC is NULL. */
13526 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13527 {
13528 fragp->fr_subtype =
13529 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13530 return 1;
13531 }
13532
13533 /* If we are about to mark a frag as extended because the value
13534 is precisely maxtiny + 1, then there is a chance of an
13535 infinite loop as in the following code:
13536 la $4,foo
13537 .skip 1020
13538 .align 2
13539 foo:
13540 In this case when the la is extended, foo is 0x3fc bytes
13541 away, so the la can be shrunk, but then foo is 0x400 away, so
13542 the la must be extended. To avoid this loop, we mark the
13543 frag as extended if it was small, and is about to become
13544 extended with a value of maxtiny + 1. */
13545 if (val == ((maxtiny + 1) << op->shift)
13546 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13547 && sec == NULL)
13548 {
13549 fragp->fr_subtype =
13550 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13551 return 1;
13552 }
13553 }
13554 else if (symsec != absolute_section && sec != NULL)
13555 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13556
13557 if ((val & ((1 << op->shift) - 1)) != 0
13558 || val < (mintiny << op->shift)
13559 || val > (maxtiny << op->shift))
13560 return 1;
13561 else
13562 return 0;
13563 }
13564
13565 /* Compute the length of a branch sequence, and adjust the
13566 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13567 worst-case length is computed, with UPDATE being used to indicate
13568 whether an unconditional (-1), branch-likely (+1) or regular (0)
13569 branch is to be computed. */
13570 static int
13571 relaxed_branch_length (fragp, sec, update)
13572 fragS *fragp;
13573 asection *sec;
13574 int update;
13575 {
13576 bfd_boolean toofar;
13577 int length;
13578
13579 if (fragp
13580 && S_IS_DEFINED (fragp->fr_symbol)
13581 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13582 {
13583 addressT addr;
13584 offsetT val;
13585
13586 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13587
13588 addr = fragp->fr_address + fragp->fr_fix + 4;
13589
13590 val -= addr;
13591
13592 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13593 }
13594 else if (fragp)
13595 /* If the symbol is not defined or it's in a different segment,
13596 assume the user knows what's going on and emit a short
13597 branch. */
13598 toofar = FALSE;
13599 else
13600 toofar = TRUE;
13601
13602 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13603 fragp->fr_subtype
13604 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13605 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13606 RELAX_BRANCH_LINK (fragp->fr_subtype),
13607 toofar);
13608
13609 length = 4;
13610 if (toofar)
13611 {
13612 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13613 length += 8;
13614
13615 if (mips_pic != NO_PIC)
13616 {
13617 /* Additional space for PIC loading of target address. */
13618 length += 8;
13619 if (mips_opts.isa == ISA_MIPS1)
13620 /* Additional space for $at-stabilizing nop. */
13621 length += 4;
13622 }
13623
13624 /* If branch is conditional. */
13625 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13626 length += 8;
13627 }
13628
13629 return length;
13630 }
13631
13632 /* Estimate the size of a frag before relaxing. Unless this is the
13633 mips16, we are not really relaxing here, and the final size is
13634 encoded in the subtype information. For the mips16, we have to
13635 decide whether we are using an extended opcode or not. */
13636
13637 int
13638 md_estimate_size_before_relax (fragp, segtype)
13639 fragS *fragp;
13640 asection *segtype;
13641 {
13642 int change;
13643
13644 if (RELAX_BRANCH_P (fragp->fr_subtype))
13645 {
13646
13647 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13648
13649 return fragp->fr_var;
13650 }
13651
13652 if (RELAX_MIPS16_P (fragp->fr_subtype))
13653 /* We don't want to modify the EXTENDED bit here; it might get us
13654 into infinite loops. We change it only in mips_relax_frag(). */
13655 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13656
13657 if (mips_pic == NO_PIC)
13658 change = nopic_need_relax (fragp->fr_symbol, 0);
13659 else if (mips_pic == SVR4_PIC)
13660 change = pic_need_relax (fragp->fr_symbol, segtype);
13661 else
13662 abort ();
13663
13664 if (change)
13665 {
13666 /* Record the offset to the first reloc in the fr_opcode field.
13667 This lets md_convert_frag and tc_gen_reloc know that the code
13668 must be expanded. */
13669 fragp->fr_opcode = (fragp->fr_literal
13670 + fragp->fr_fix
13671 - RELAX_OLD (fragp->fr_subtype)
13672 + RELAX_RELOC1 (fragp->fr_subtype));
13673 /* FIXME: This really needs as_warn_where. */
13674 if (RELAX_WARN (fragp->fr_subtype))
13675 as_warn (_("AT used after \".set noat\" or macro used after "
13676 "\".set nomacro\""));
13677
13678 return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
13679 }
13680
13681 return 0;
13682 }
13683
13684 /* This is called to see whether a reloc against a defined symbol
13685 should be converted into a reloc against a section. Don't adjust
13686 MIPS16 jump relocations, so we don't have to worry about the format
13687 of the offset in the .o file. Don't adjust relocations against
13688 mips16 symbols, so that the linker can find them if it needs to set
13689 up a stub. */
13690
13691 int
13692 mips_fix_adjustable (fixp)
13693 fixS *fixp;
13694 {
13695 if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13696 return 0;
13697
13698 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13699 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13700 return 0;
13701
13702 if (fixp->fx_addsy == NULL)
13703 return 1;
13704
13705 #ifdef OBJ_ELF
13706 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13707 && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13708 && fixp->fx_subsy == NULL)
13709 return 0;
13710 #endif
13711
13712 return 1;
13713 }
13714
13715 /* Translate internal representation of relocation info to BFD target
13716 format. */
13717
13718 arelent **
13719 tc_gen_reloc (section, fixp)
13720 asection *section ATTRIBUTE_UNUSED;
13721 fixS *fixp;
13722 {
13723 static arelent *retval[4];
13724 arelent *reloc;
13725 bfd_reloc_code_real_type code;
13726
13727 reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
13728 retval[1] = NULL;
13729
13730 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13731 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13732 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13733
13734 if (mips_pic == EMBEDDED_PIC
13735 && SWITCH_TABLE (fixp))
13736 {
13737 /* For a switch table entry we use a special reloc. The addend
13738 is actually the difference between the reloc address and the
13739 subtrahend. */
13740 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13741 if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13742 as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13743 fixp->fx_r_type = BFD_RELOC_GPREL32;
13744 }
13745 else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
13746 {
13747 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13748 reloc->addend = fixp->fx_addnumber;
13749 else
13750 {
13751 /* We use a special addend for an internal RELLO reloc. */
13752 if (symbol_section_p (fixp->fx_addsy))
13753 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13754 else
13755 reloc->addend = fixp->fx_addnumber + reloc->address;
13756 }
13757 }
13758 else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13759 {
13760 assert (fixp->fx_next != NULL
13761 && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
13762
13763 /* The reloc is relative to the RELLO; adjust the addend
13764 accordingly. */
13765 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13766 reloc->addend = fixp->fx_next->fx_addnumber;
13767 else
13768 {
13769 /* We use a special addend for an internal RELHI reloc. */
13770 if (symbol_section_p (fixp->fx_addsy))
13771 reloc->addend = (fixp->fx_next->fx_frag->fr_address
13772 + fixp->fx_next->fx_where
13773 - S_GET_VALUE (fixp->fx_subsy));
13774 else
13775 reloc->addend = (fixp->fx_addnumber
13776 + fixp->fx_next->fx_frag->fr_address
13777 + fixp->fx_next->fx_where);
13778 }
13779 }
13780 else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13781 reloc->addend = fixp->fx_addnumber;
13782 else
13783 {
13784 if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13785 /* A gruesome hack which is a result of the gruesome gas reloc
13786 handling. */
13787 reloc->addend = reloc->address;
13788 else
13789 reloc->addend = -reloc->address;
13790 }
13791
13792 /* If this is a variant frag, we may need to adjust the existing
13793 reloc and generate a new one. */
13794 if (fixp->fx_frag->fr_opcode != NULL
13795 && ((fixp->fx_r_type == BFD_RELOC_GPREL16
13796 && ! HAVE_NEWABI)
13797 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_DISP
13798 && HAVE_NEWABI)
13799 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
13800 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
13801 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13802 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
13803 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13804 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16)
13805 )
13806 {
13807 arelent *reloc2;
13808
13809 assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
13810
13811 /* If this is not the last reloc in this frag, then we have two
13812 GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
13813 CALL_HI16/CALL_LO16, both of which are being replaced. Let
13814 the second one handle all of them. */
13815 if (fixp->fx_next != NULL
13816 && fixp->fx_frag == fixp->fx_next->fx_frag)
13817 {
13818 assert ((fixp->fx_r_type == BFD_RELOC_GPREL16
13819 && fixp->fx_next->fx_r_type == BFD_RELOC_GPREL16)
13820 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13821 && (fixp->fx_next->fx_r_type
13822 == BFD_RELOC_MIPS_GOT_LO16))
13823 || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13824 && (fixp->fx_next->fx_r_type
13825 == BFD_RELOC_MIPS_CALL_LO16)));
13826 retval[0] = NULL;
13827 return retval;
13828 }
13829
13830 fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
13831 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13832 reloc->addend += fixp->fx_frag->tc_frag_data.tc_fr_offset;
13833 reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
13834 retval[2] = NULL;
13835 reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13836 *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13837 reloc2->address = (reloc->address
13838 + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
13839 - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
13840 reloc2->addend = fixp->fx_addnumber
13841 + fixp->fx_frag->tc_frag_data.tc_fr_offset;
13842 reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
13843 assert (reloc2->howto != NULL);
13844
13845 if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
13846 {
13847 arelent *reloc3;
13848
13849 reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
13850 retval[3] = NULL;
13851 *reloc3 = *reloc2;
13852 reloc3->address += 4;
13853 }
13854
13855 if (mips_pic == NO_PIC)
13856 {
13857 assert (fixp->fx_r_type == BFD_RELOC_GPREL16);
13858 fixp->fx_r_type = BFD_RELOC_HI16_S;
13859 }
13860 else if (mips_pic == SVR4_PIC)
13861 {
13862 switch (fixp->fx_r_type)
13863 {
13864 default:
13865 abort ();
13866 case BFD_RELOC_MIPS_GOT16:
13867 break;
13868 case BFD_RELOC_MIPS_GOT_LO16:
13869 case BFD_RELOC_MIPS_CALL_LO16:
13870 if (HAVE_NEWABI)
13871 {
13872 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_PAGE;
13873 reloc2->howto = bfd_reloc_type_lookup
13874 (stdoutput, BFD_RELOC_MIPS_GOT_OFST);
13875 }
13876 else
13877 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13878 break;
13879 case BFD_RELOC_MIPS_CALL16:
13880 case BFD_RELOC_MIPS_GOT_OFST:
13881 case BFD_RELOC_MIPS_GOT_DISP:
13882 if (HAVE_NEWABI)
13883 {
13884 /* It may seem nonsensical to relax GOT_DISP to
13885 GOT_DISP, but we're actually turning a GOT_DISP
13886 without offset into a GOT_DISP with an offset,
13887 getting rid of the separate addition, which we can
13888 do when the symbol is found to be local. */
13889 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_DISP;
13890 retval[1] = NULL;
13891 }
13892 else
13893 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13894 break;
13895 }
13896 }
13897 else
13898 abort ();
13899 }
13900
13901 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13902 entry to be used in the relocation's section offset. */
13903 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13904 {
13905 reloc->address = reloc->addend;
13906 reloc->addend = 0;
13907 }
13908
13909 /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13910 fixup_segment converted a non-PC relative reloc into a PC
13911 relative reloc. In such a case, we need to convert the reloc
13912 code. */
13913 code = fixp->fx_r_type;
13914 if (fixp->fx_pcrel)
13915 {
13916 switch (code)
13917 {
13918 case BFD_RELOC_8:
13919 code = BFD_RELOC_8_PCREL;
13920 break;
13921 case BFD_RELOC_16:
13922 code = BFD_RELOC_16_PCREL;
13923 break;
13924 case BFD_RELOC_32:
13925 code = BFD_RELOC_32_PCREL;
13926 break;
13927 case BFD_RELOC_64:
13928 code = BFD_RELOC_64_PCREL;
13929 break;
13930 case BFD_RELOC_8_PCREL:
13931 case BFD_RELOC_16_PCREL:
13932 case BFD_RELOC_32_PCREL:
13933 case BFD_RELOC_64_PCREL:
13934 case BFD_RELOC_16_PCREL_S2:
13935 case BFD_RELOC_PCREL_HI16_S:
13936 case BFD_RELOC_PCREL_LO16:
13937 break;
13938 default:
13939 as_bad_where (fixp->fx_file, fixp->fx_line,
13940 _("Cannot make %s relocation PC relative"),
13941 bfd_get_reloc_code_name (code));
13942 }
13943 }
13944
13945 #ifdef OBJ_ELF
13946 /* md_apply_fix3 has a double-subtraction hack to get
13947 bfd_install_relocation to behave nicely. GPREL relocations are
13948 handled correctly without this hack, so undo it here. We can't
13949 stop md_apply_fix3 from subtracting twice in the first place since
13950 the fake addend is required for variant frags above. */
13951 if (fixp->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour
13952 && (code == BFD_RELOC_GPREL16 || code == BFD_RELOC_MIPS16_GPREL)
13953 && reloc->addend != 0
13954 && mips_need_elf_addend_fixup (fixp))
13955 {
13956 /* If howto->partial_inplace is false, md_apply_fix3 will only
13957 subtract it once. */
13958 reloc_howto_type *howto;
13959
13960 howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
13961 if (howto->partial_inplace)
13962 reloc->addend += S_GET_VALUE (fixp->fx_addsy);
13963 }
13964 #endif
13965
13966 /* To support a PC relative reloc when generating embedded PIC code
13967 for ECOFF, we use a Cygnus extension. We check for that here to
13968 make sure that we don't let such a reloc escape normally. */
13969 if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13970 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13971 && code == BFD_RELOC_16_PCREL_S2
13972 && mips_pic != EMBEDDED_PIC)
13973 reloc->howto = NULL;
13974 else
13975 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13976
13977 if (reloc->howto == NULL)
13978 {
13979 as_bad_where (fixp->fx_file, fixp->fx_line,
13980 _("Can not represent %s relocation in this object file format"),
13981 bfd_get_reloc_code_name (code));
13982 retval[0] = NULL;
13983 }
13984
13985 return retval;
13986 }
13987
13988 /* Relax a machine dependent frag. This returns the amount by which
13989 the current size of the frag should change. */
13990
13991 int
13992 mips_relax_frag (sec, fragp, stretch)
13993 asection *sec;
13994 fragS *fragp;
13995 long stretch;
13996 {
13997 if (RELAX_BRANCH_P (fragp->fr_subtype))
13998 {
13999 offsetT old_var = fragp->fr_var;
14000
14001 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14002
14003 return fragp->fr_var - old_var;
14004 }
14005
14006 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14007 return 0;
14008
14009 if (mips16_extended_frag (fragp, NULL, stretch))
14010 {
14011 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14012 return 0;
14013 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14014 return 2;
14015 }
14016 else
14017 {
14018 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14019 return 0;
14020 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14021 return -2;
14022 }
14023
14024 return 0;
14025 }
14026
14027 /* Convert a machine dependent frag. */
14028
14029 void
14030 md_convert_frag (abfd, asec, fragp)
14031 bfd *abfd ATTRIBUTE_UNUSED;
14032 segT asec;
14033 fragS *fragp;
14034 {
14035 int old, new;
14036 char *fixptr;
14037
14038 if (RELAX_BRANCH_P (fragp->fr_subtype))
14039 {
14040 bfd_byte *buf;
14041 unsigned long insn;
14042 expressionS exp;
14043 fixS *fixp;
14044
14045 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14046
14047 if (target_big_endian)
14048 insn = bfd_getb32 (buf);
14049 else
14050 insn = bfd_getl32 (buf);
14051
14052 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14053 {
14054 /* We generate a fixup instead of applying it right now
14055 because, if there are linker relaxations, we're going to
14056 need the relocations. */
14057 exp.X_op = O_symbol;
14058 exp.X_add_symbol = fragp->fr_symbol;
14059 exp.X_add_number = fragp->fr_offset;
14060
14061 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14062 4, &exp, 1,
14063 BFD_RELOC_16_PCREL_S2);
14064 fixp->fx_file = fragp->fr_file;
14065 fixp->fx_line = fragp->fr_line;
14066
14067 md_number_to_chars ((char *)buf, insn, 4);
14068 buf += 4;
14069 }
14070 else
14071 {
14072 int i;
14073
14074 as_warn_where (fragp->fr_file, fragp->fr_line,
14075 _("relaxed out-of-range branch into a jump"));
14076
14077 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14078 goto uncond;
14079
14080 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14081 {
14082 /* Reverse the branch. */
14083 switch ((insn >> 28) & 0xf)
14084 {
14085 case 4:
14086 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14087 have the condition reversed by tweaking a single
14088 bit, and their opcodes all have 0x4???????. */
14089 assert ((insn & 0xf1000000) == 0x41000000);
14090 insn ^= 0x00010000;
14091 break;
14092
14093 case 0:
14094 /* bltz 0x04000000 bgez 0x04010000
14095 bltzal 0x04100000 bgezal 0x04110000 */
14096 assert ((insn & 0xfc0e0000) == 0x04000000);
14097 insn ^= 0x00010000;
14098 break;
14099
14100 case 1:
14101 /* beq 0x10000000 bne 0x14000000
14102 blez 0x18000000 bgtz 0x1c000000 */
14103 insn ^= 0x04000000;
14104 break;
14105
14106 default:
14107 abort ();
14108 }
14109 }
14110
14111 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14112 {
14113 /* Clear the and-link bit. */
14114 assert ((insn & 0xfc1c0000) == 0x04100000);
14115
14116 /* bltzal 0x04100000 bgezal 0x04110000
14117 bltzall 0x04120000 bgezall 0x04130000 */
14118 insn &= ~0x00100000;
14119 }
14120
14121 /* Branch over the branch (if the branch was likely) or the
14122 full jump (not likely case). Compute the offset from the
14123 current instruction to branch to. */
14124 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14125 i = 16;
14126 else
14127 {
14128 /* How many bytes in instructions we've already emitted? */
14129 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14130 /* How many bytes in instructions from here to the end? */
14131 i = fragp->fr_var - i;
14132 }
14133 /* Convert to instruction count. */
14134 i >>= 2;
14135 /* Branch counts from the next instruction. */
14136 i--;
14137 insn |= i;
14138 /* Branch over the jump. */
14139 md_number_to_chars ((char *)buf, insn, 4);
14140 buf += 4;
14141
14142 /* Nop */
14143 md_number_to_chars ((char*)buf, 0, 4);
14144 buf += 4;
14145
14146 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14147 {
14148 /* beql $0, $0, 2f */
14149 insn = 0x50000000;
14150 /* Compute the PC offset from the current instruction to
14151 the end of the variable frag. */
14152 /* How many bytes in instructions we've already emitted? */
14153 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14154 /* How many bytes in instructions from here to the end? */
14155 i = fragp->fr_var - i;
14156 /* Convert to instruction count. */
14157 i >>= 2;
14158 /* Don't decrement i, because we want to branch over the
14159 delay slot. */
14160
14161 insn |= i;
14162 md_number_to_chars ((char *)buf, insn, 4);
14163 buf += 4;
14164
14165 md_number_to_chars ((char *)buf, 0, 4);
14166 buf += 4;
14167 }
14168
14169 uncond:
14170 if (mips_pic == NO_PIC)
14171 {
14172 /* j or jal. */
14173 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14174 ? 0x0c000000 : 0x08000000);
14175 exp.X_op = O_symbol;
14176 exp.X_add_symbol = fragp->fr_symbol;
14177 exp.X_add_number = fragp->fr_offset;
14178
14179 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14180 4, &exp, 0, BFD_RELOC_MIPS_JMP);
14181 fixp->fx_file = fragp->fr_file;
14182 fixp->fx_line = fragp->fr_line;
14183
14184 md_number_to_chars ((char*)buf, insn, 4);
14185 buf += 4;
14186 }
14187 else
14188 {
14189 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14190 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14191 exp.X_op = O_symbol;
14192 exp.X_add_symbol = fragp->fr_symbol;
14193 exp.X_add_number = fragp->fr_offset;
14194
14195 if (fragp->fr_offset)
14196 {
14197 exp.X_add_symbol = make_expr_symbol (&exp);
14198 exp.X_add_number = 0;
14199 }
14200
14201 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14202 4, &exp, 0, BFD_RELOC_MIPS_GOT16);
14203 fixp->fx_file = fragp->fr_file;
14204 fixp->fx_line = fragp->fr_line;
14205
14206 md_number_to_chars ((char*)buf, insn, 4);
14207 buf += 4;
14208
14209 if (mips_opts.isa == ISA_MIPS1)
14210 {
14211 /* nop */
14212 md_number_to_chars ((char*)buf, 0, 4);
14213 buf += 4;
14214 }
14215
14216 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14217 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14218
14219 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14220 4, &exp, 0, BFD_RELOC_LO16);
14221 fixp->fx_file = fragp->fr_file;
14222 fixp->fx_line = fragp->fr_line;
14223
14224 md_number_to_chars ((char*)buf, insn, 4);
14225 buf += 4;
14226
14227 /* j(al)r $at. */
14228 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14229 insn = 0x0020f809;
14230 else
14231 insn = 0x00200008;
14232
14233 md_number_to_chars ((char*)buf, insn, 4);
14234 buf += 4;
14235 }
14236 }
14237
14238 assert (buf == (bfd_byte *)fragp->fr_literal
14239 + fragp->fr_fix + fragp->fr_var);
14240
14241 fragp->fr_fix += fragp->fr_var;
14242
14243 return;
14244 }
14245
14246 if (RELAX_MIPS16_P (fragp->fr_subtype))
14247 {
14248 int type;
14249 register const struct mips16_immed_operand *op;
14250 bfd_boolean small, ext;
14251 offsetT val;
14252 bfd_byte *buf;
14253 unsigned long insn;
14254 bfd_boolean use_extend;
14255 unsigned short extend;
14256
14257 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14258 op = mips16_immed_operands;
14259 while (op->type != type)
14260 ++op;
14261
14262 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14263 {
14264 small = FALSE;
14265 ext = TRUE;
14266 }
14267 else
14268 {
14269 small = TRUE;
14270 ext = FALSE;
14271 }
14272
14273 resolve_symbol_value (fragp->fr_symbol);
14274 val = S_GET_VALUE (fragp->fr_symbol);
14275 if (op->pcrel)
14276 {
14277 addressT addr;
14278
14279 addr = fragp->fr_address + fragp->fr_fix;
14280
14281 /* The rules for the base address of a PC relative reloc are
14282 complicated; see mips16_extended_frag. */
14283 if (type == 'p' || type == 'q')
14284 {
14285 addr += 2;
14286 if (ext)
14287 addr += 2;
14288 /* Ignore the low bit in the target, since it will be
14289 set for a text label. */
14290 if ((val & 1) != 0)
14291 --val;
14292 }
14293 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14294 addr -= 4;
14295 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14296 addr -= 2;
14297
14298 addr &= ~ (addressT) ((1 << op->shift) - 1);
14299 val -= addr;
14300
14301 /* Make sure the section winds up with the alignment we have
14302 assumed. */
14303 if (op->shift > 0)
14304 record_alignment (asec, op->shift);
14305 }
14306
14307 if (ext
14308 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14309 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14310 as_warn_where (fragp->fr_file, fragp->fr_line,
14311 _("extended instruction in delay slot"));
14312
14313 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14314
14315 if (target_big_endian)
14316 insn = bfd_getb16 (buf);
14317 else
14318 insn = bfd_getl16 (buf);
14319
14320 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14321 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14322 small, ext, &insn, &use_extend, &extend);
14323
14324 if (use_extend)
14325 {
14326 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14327 fragp->fr_fix += 2;
14328 buf += 2;
14329 }
14330
14331 md_number_to_chars ((char *) buf, insn, 2);
14332 fragp->fr_fix += 2;
14333 buf += 2;
14334 }
14335 else
14336 {
14337 if (fragp->fr_opcode == NULL)
14338 return;
14339
14340 old = RELAX_OLD (fragp->fr_subtype);
14341 new = RELAX_NEW (fragp->fr_subtype);
14342 fixptr = fragp->fr_literal + fragp->fr_fix;
14343
14344 if (new > 0)
14345 memmove (fixptr - old, fixptr, new);
14346
14347 fragp->fr_fix += new - old;
14348 }
14349 }
14350
14351 #ifdef OBJ_ELF
14352
14353 /* This function is called after the relocs have been generated.
14354 We've been storing mips16 text labels as odd. Here we convert them
14355 back to even for the convenience of the debugger. */
14356
14357 void
14358 mips_frob_file_after_relocs ()
14359 {
14360 asymbol **syms;
14361 unsigned int count, i;
14362
14363 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
14364 return;
14365
14366 syms = bfd_get_outsymbols (stdoutput);
14367 count = bfd_get_symcount (stdoutput);
14368 for (i = 0; i < count; i++, syms++)
14369 {
14370 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14371 && ((*syms)->value & 1) != 0)
14372 {
14373 (*syms)->value &= ~1;
14374 /* If the symbol has an odd size, it was probably computed
14375 incorrectly, so adjust that as well. */
14376 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14377 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14378 }
14379 }
14380 }
14381
14382 #endif
14383
14384 /* This function is called whenever a label is defined. It is used
14385 when handling branch delays; if a branch has a label, we assume we
14386 can not move it. */
14387
14388 void
14389 mips_define_label (sym)
14390 symbolS *sym;
14391 {
14392 struct insn_label_list *l;
14393
14394 if (free_insn_labels == NULL)
14395 l = (struct insn_label_list *) xmalloc (sizeof *l);
14396 else
14397 {
14398 l = free_insn_labels;
14399 free_insn_labels = l->next;
14400 }
14401
14402 l->label = sym;
14403 l->next = insn_labels;
14404 insn_labels = l;
14405 }
14406 \f
14407 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14408
14409 /* Some special processing for a MIPS ELF file. */
14410
14411 void
14412 mips_elf_final_processing ()
14413 {
14414 /* Write out the register information. */
14415 if (mips_abi != N64_ABI)
14416 {
14417 Elf32_RegInfo s;
14418
14419 s.ri_gprmask = mips_gprmask;
14420 s.ri_cprmask[0] = mips_cprmask[0];
14421 s.ri_cprmask[1] = mips_cprmask[1];
14422 s.ri_cprmask[2] = mips_cprmask[2];
14423 s.ri_cprmask[3] = mips_cprmask[3];
14424 /* The gp_value field is set by the MIPS ELF backend. */
14425
14426 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14427 ((Elf32_External_RegInfo *)
14428 mips_regmask_frag));
14429 }
14430 else
14431 {
14432 Elf64_Internal_RegInfo s;
14433
14434 s.ri_gprmask = mips_gprmask;
14435 s.ri_pad = 0;
14436 s.ri_cprmask[0] = mips_cprmask[0];
14437 s.ri_cprmask[1] = mips_cprmask[1];
14438 s.ri_cprmask[2] = mips_cprmask[2];
14439 s.ri_cprmask[3] = mips_cprmask[3];
14440 /* The gp_value field is set by the MIPS ELF backend. */
14441
14442 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14443 ((Elf64_External_RegInfo *)
14444 mips_regmask_frag));
14445 }
14446
14447 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14448 sort of BFD interface for this. */
14449 if (mips_any_noreorder)
14450 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14451 if (mips_pic != NO_PIC)
14452 {
14453 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14454 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14455 }
14456 if (mips_abicalls)
14457 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14458
14459 /* Set MIPS ELF flags for ASEs. */
14460 if (file_ase_mips16)
14461 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14462 #if 0 /* XXX FIXME */
14463 if (file_ase_mips3d)
14464 elf_elfheader (stdoutput)->e_flags |= ???;
14465 #endif
14466 if (file_ase_mdmx)
14467 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14468
14469 /* Set the MIPS ELF ABI flags. */
14470 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14471 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14472 else if (mips_abi == O64_ABI)
14473 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14474 else if (mips_abi == EABI_ABI)
14475 {
14476 if (!file_mips_gp32)
14477 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14478 else
14479 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14480 }
14481 else if (mips_abi == N32_ABI)
14482 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14483
14484 /* Nothing to do for N64_ABI. */
14485
14486 if (mips_32bitmode)
14487 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14488 }
14489
14490 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14491 \f
14492 typedef struct proc {
14493 symbolS *isym;
14494 unsigned long reg_mask;
14495 unsigned long reg_offset;
14496 unsigned long fpreg_mask;
14497 unsigned long fpreg_offset;
14498 unsigned long frame_offset;
14499 unsigned long frame_reg;
14500 unsigned long pc_reg;
14501 } procS;
14502
14503 static procS cur_proc;
14504 static procS *cur_proc_ptr;
14505 static int numprocs;
14506
14507 /* Fill in an rs_align_code fragment. */
14508
14509 void
14510 mips_handle_align (fragp)
14511 fragS *fragp;
14512 {
14513 if (fragp->fr_type != rs_align_code)
14514 return;
14515
14516 if (mips_opts.mips16)
14517 {
14518 static const unsigned char be_nop[] = { 0x65, 0x00 };
14519 static const unsigned char le_nop[] = { 0x00, 0x65 };
14520
14521 int bytes;
14522 char *p;
14523
14524 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14525 p = fragp->fr_literal + fragp->fr_fix;
14526
14527 if (bytes & 1)
14528 {
14529 *p++ = 0;
14530 fragp->fr_fix++;
14531 }
14532
14533 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14534 fragp->fr_var = 2;
14535 }
14536
14537 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
14538 }
14539
14540 static void
14541 md_obj_begin ()
14542 {
14543 }
14544
14545 static void
14546 md_obj_end ()
14547 {
14548 /* check for premature end, nesting errors, etc */
14549 if (cur_proc_ptr)
14550 as_warn (_("missing .end at end of assembly"));
14551 }
14552
14553 static long
14554 get_number ()
14555 {
14556 int negative = 0;
14557 long val = 0;
14558
14559 if (*input_line_pointer == '-')
14560 {
14561 ++input_line_pointer;
14562 negative = 1;
14563 }
14564 if (!ISDIGIT (*input_line_pointer))
14565 as_bad (_("expected simple number"));
14566 if (input_line_pointer[0] == '0')
14567 {
14568 if (input_line_pointer[1] == 'x')
14569 {
14570 input_line_pointer += 2;
14571 while (ISXDIGIT (*input_line_pointer))
14572 {
14573 val <<= 4;
14574 val |= hex_value (*input_line_pointer++);
14575 }
14576 return negative ? -val : val;
14577 }
14578 else
14579 {
14580 ++input_line_pointer;
14581 while (ISDIGIT (*input_line_pointer))
14582 {
14583 val <<= 3;
14584 val |= *input_line_pointer++ - '0';
14585 }
14586 return negative ? -val : val;
14587 }
14588 }
14589 if (!ISDIGIT (*input_line_pointer))
14590 {
14591 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14592 *input_line_pointer, *input_line_pointer);
14593 as_warn (_("invalid number"));
14594 return -1;
14595 }
14596 while (ISDIGIT (*input_line_pointer))
14597 {
14598 val *= 10;
14599 val += *input_line_pointer++ - '0';
14600 }
14601 return negative ? -val : val;
14602 }
14603
14604 /* The .file directive; just like the usual .file directive, but there
14605 is an initial number which is the ECOFF file index. In the non-ECOFF
14606 case .file implies DWARF-2. */
14607
14608 static void
14609 s_mips_file (x)
14610 int x ATTRIBUTE_UNUSED;
14611 {
14612 static int first_file_directive = 0;
14613
14614 if (ECOFF_DEBUGGING)
14615 {
14616 get_number ();
14617 s_app_file (0);
14618 }
14619 else
14620 {
14621 char *filename;
14622
14623 filename = dwarf2_directive_file (0);
14624
14625 /* Versions of GCC up to 3.1 start files with a ".file"
14626 directive even for stabs output. Make sure that this
14627 ".file" is handled. Note that you need a version of GCC
14628 after 3.1 in order to support DWARF-2 on MIPS. */
14629 if (filename != NULL && ! first_file_directive)
14630 {
14631 (void) new_logical_line (filename, -1);
14632 s_app_file_string (filename);
14633 }
14634 first_file_directive = 1;
14635 }
14636 }
14637
14638 /* The .loc directive, implying DWARF-2. */
14639
14640 static void
14641 s_mips_loc (x)
14642 int x ATTRIBUTE_UNUSED;
14643 {
14644 if (!ECOFF_DEBUGGING)
14645 dwarf2_directive_loc (0);
14646 }
14647
14648 /* The .end directive. */
14649
14650 static void
14651 s_mips_end (x)
14652 int x ATTRIBUTE_UNUSED;
14653 {
14654 symbolS *p;
14655
14656 /* Following functions need their own .frame and .cprestore directives. */
14657 mips_frame_reg_valid = 0;
14658 mips_cprestore_valid = 0;
14659
14660 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14661 {
14662 p = get_symbol ();
14663 demand_empty_rest_of_line ();
14664 }
14665 else
14666 p = NULL;
14667
14668 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14669 as_warn (_(".end not in text section"));
14670
14671 if (!cur_proc_ptr)
14672 {
14673 as_warn (_(".end directive without a preceding .ent directive."));
14674 demand_empty_rest_of_line ();
14675 return;
14676 }
14677
14678 if (p != NULL)
14679 {
14680 assert (S_GET_NAME (p));
14681 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
14682 as_warn (_(".end symbol does not match .ent symbol."));
14683
14684 if (debug_type == DEBUG_STABS)
14685 stabs_generate_asm_endfunc (S_GET_NAME (p),
14686 S_GET_NAME (p));
14687 }
14688 else
14689 as_warn (_(".end directive missing or unknown symbol"));
14690
14691 #ifdef OBJ_ELF
14692 /* Generate a .pdr section. */
14693 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14694 {
14695 segT saved_seg = now_seg;
14696 subsegT saved_subseg = now_subseg;
14697 valueT dot;
14698 expressionS exp;
14699 char *fragp;
14700
14701 dot = frag_now_fix ();
14702
14703 #ifdef md_flush_pending_output
14704 md_flush_pending_output ();
14705 #endif
14706
14707 assert (pdr_seg);
14708 subseg_set (pdr_seg, 0);
14709
14710 /* Write the symbol. */
14711 exp.X_op = O_symbol;
14712 exp.X_add_symbol = p;
14713 exp.X_add_number = 0;
14714 emit_expr (&exp, 4);
14715
14716 fragp = frag_more (7 * 4);
14717
14718 md_number_to_chars (fragp, (valueT) cur_proc_ptr->reg_mask, 4);
14719 md_number_to_chars (fragp + 4, (valueT) cur_proc_ptr->reg_offset, 4);
14720 md_number_to_chars (fragp + 8, (valueT) cur_proc_ptr->fpreg_mask, 4);
14721 md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
14722 md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
14723 md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
14724 md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
14725
14726 subseg_set (saved_seg, saved_subseg);
14727 }
14728 #endif /* OBJ_ELF */
14729
14730 cur_proc_ptr = NULL;
14731 }
14732
14733 /* The .aent and .ent directives. */
14734
14735 static void
14736 s_mips_ent (aent)
14737 int aent;
14738 {
14739 symbolS *symbolP;
14740
14741 symbolP = get_symbol ();
14742 if (*input_line_pointer == ',')
14743 ++input_line_pointer;
14744 SKIP_WHITESPACE ();
14745 if (ISDIGIT (*input_line_pointer)
14746 || *input_line_pointer == '-')
14747 get_number ();
14748
14749 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14750 as_warn (_(".ent or .aent not in text section."));
14751
14752 if (!aent && cur_proc_ptr)
14753 as_warn (_("missing .end"));
14754
14755 if (!aent)
14756 {
14757 /* This function needs its own .frame and .cprestore directives. */
14758 mips_frame_reg_valid = 0;
14759 mips_cprestore_valid = 0;
14760
14761 cur_proc_ptr = &cur_proc;
14762 memset (cur_proc_ptr, '\0', sizeof (procS));
14763
14764 cur_proc_ptr->isym = symbolP;
14765
14766 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14767
14768 ++numprocs;
14769
14770 if (debug_type == DEBUG_STABS)
14771 stabs_generate_asm_func (S_GET_NAME (symbolP),
14772 S_GET_NAME (symbolP));
14773 }
14774
14775 demand_empty_rest_of_line ();
14776 }
14777
14778 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14779 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14780 s_mips_frame is used so that we can set the PDR information correctly.
14781 We can't use the ecoff routines because they make reference to the ecoff
14782 symbol table (in the mdebug section). */
14783
14784 static void
14785 s_mips_frame (ignore)
14786 int ignore ATTRIBUTE_UNUSED;
14787 {
14788 #ifdef OBJ_ELF
14789 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14790 {
14791 long val;
14792
14793 if (cur_proc_ptr == (procS *) NULL)
14794 {
14795 as_warn (_(".frame outside of .ent"));
14796 demand_empty_rest_of_line ();
14797 return;
14798 }
14799
14800 cur_proc_ptr->frame_reg = tc_get_register (1);
14801
14802 SKIP_WHITESPACE ();
14803 if (*input_line_pointer++ != ','
14804 || get_absolute_expression_and_terminator (&val) != ',')
14805 {
14806 as_warn (_("Bad .frame directive"));
14807 --input_line_pointer;
14808 demand_empty_rest_of_line ();
14809 return;
14810 }
14811
14812 cur_proc_ptr->frame_offset = val;
14813 cur_proc_ptr->pc_reg = tc_get_register (0);
14814
14815 demand_empty_rest_of_line ();
14816 }
14817 else
14818 #endif /* OBJ_ELF */
14819 s_ignore (ignore);
14820 }
14821
14822 /* The .fmask and .mask directives. If the mdebug section is present
14823 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14824 embedded targets, s_mips_mask is used so that we can set the PDR
14825 information correctly. We can't use the ecoff routines because they
14826 make reference to the ecoff symbol table (in the mdebug section). */
14827
14828 static void
14829 s_mips_mask (reg_type)
14830 char reg_type;
14831 {
14832 #ifdef OBJ_ELF
14833 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14834 {
14835 long mask, off;
14836
14837 if (cur_proc_ptr == (procS *) NULL)
14838 {
14839 as_warn (_(".mask/.fmask outside of .ent"));
14840 demand_empty_rest_of_line ();
14841 return;
14842 }
14843
14844 if (get_absolute_expression_and_terminator (&mask) != ',')
14845 {
14846 as_warn (_("Bad .mask/.fmask directive"));
14847 --input_line_pointer;
14848 demand_empty_rest_of_line ();
14849 return;
14850 }
14851
14852 off = get_absolute_expression ();
14853
14854 if (reg_type == 'F')
14855 {
14856 cur_proc_ptr->fpreg_mask = mask;
14857 cur_proc_ptr->fpreg_offset = off;
14858 }
14859 else
14860 {
14861 cur_proc_ptr->reg_mask = mask;
14862 cur_proc_ptr->reg_offset = off;
14863 }
14864
14865 demand_empty_rest_of_line ();
14866 }
14867 else
14868 #endif /* OBJ_ELF */
14869 s_ignore (reg_type);
14870 }
14871
14872 /* The .loc directive. */
14873
14874 #if 0
14875 static void
14876 s_loc (x)
14877 int x;
14878 {
14879 symbolS *symbolP;
14880 int lineno;
14881 int addroff;
14882
14883 assert (now_seg == text_section);
14884
14885 lineno = get_number ();
14886 addroff = frag_now_fix ();
14887
14888 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14889 S_SET_TYPE (symbolP, N_SLINE);
14890 S_SET_OTHER (symbolP, 0);
14891 S_SET_DESC (symbolP, lineno);
14892 symbolP->sy_segment = now_seg;
14893 }
14894 #endif
14895
14896 /* A table describing all the processors gas knows about. Names are
14897 matched in the order listed.
14898
14899 To ease comparison, please keep this table in the same order as
14900 gcc's mips_cpu_info_table[]. */
14901 static const struct mips_cpu_info mips_cpu_info_table[] =
14902 {
14903 /* Entries for generic ISAs */
14904 { "mips1", 1, ISA_MIPS1, CPU_R3000 },
14905 { "mips2", 1, ISA_MIPS2, CPU_R6000 },
14906 { "mips3", 1, ISA_MIPS3, CPU_R4000 },
14907 { "mips4", 1, ISA_MIPS4, CPU_R8000 },
14908 { "mips5", 1, ISA_MIPS5, CPU_MIPS5 },
14909 { "mips32", 1, ISA_MIPS32, CPU_MIPS32 },
14910 { "mips32r2", 1, ISA_MIPS32R2, CPU_MIPS32R2 },
14911 { "mips64", 1, ISA_MIPS64, CPU_MIPS64 },
14912
14913 /* MIPS I */
14914 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14915 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14916 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14917
14918 /* MIPS II */
14919 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14920
14921 /* MIPS III */
14922 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
14923 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
14924 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
14925 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
14926 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
14927 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
14928 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
14929 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
14930 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
14931 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
14932 { "orion", 0, ISA_MIPS3, CPU_R4600 },
14933 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
14934
14935 /* MIPS IV */
14936 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
14937 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
14938 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
14939 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
14940 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
14941 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
14942 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
14943 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
14944 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
14945 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
14946 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
14947 { "r7000", 0, ISA_MIPS4, CPU_R5000 },
14948
14949 /* MIPS 32 */
14950 { "4kc", 0, ISA_MIPS32, CPU_MIPS32, },
14951 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
14952 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
14953
14954 /* MIPS 64 */
14955 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
14956 { "20kc", 0, ISA_MIPS64, CPU_MIPS64 },
14957
14958 /* Broadcom SB-1 CPU core */
14959 { "sb1", 0, ISA_MIPS64, CPU_SB1 },
14960
14961 /* End marker */
14962 { NULL, 0, 0, 0 }
14963 };
14964
14965
14966 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14967 with a final "000" replaced by "k". Ignore case.
14968
14969 Note: this function is shared between GCC and GAS. */
14970
14971 static bfd_boolean
14972 mips_strict_matching_cpu_name_p (canonical, given)
14973 const char *canonical, *given;
14974 {
14975 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14976 given++, canonical++;
14977
14978 return ((*given == 0 && *canonical == 0)
14979 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14980 }
14981
14982
14983 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14984 CPU name. We've traditionally allowed a lot of variation here.
14985
14986 Note: this function is shared between GCC and GAS. */
14987
14988 static bfd_boolean
14989 mips_matching_cpu_name_p (canonical, given)
14990 const char *canonical, *given;
14991 {
14992 /* First see if the name matches exactly, or with a final "000"
14993 turned into "k". */
14994 if (mips_strict_matching_cpu_name_p (canonical, given))
14995 return TRUE;
14996
14997 /* If not, try comparing based on numerical designation alone.
14998 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14999 if (TOLOWER (*given) == 'r')
15000 given++;
15001 if (!ISDIGIT (*given))
15002 return FALSE;
15003
15004 /* Skip over some well-known prefixes in the canonical name,
15005 hoping to find a number there too. */
15006 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15007 canonical += 2;
15008 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15009 canonical += 2;
15010 else if (TOLOWER (canonical[0]) == 'r')
15011 canonical += 1;
15012
15013 return mips_strict_matching_cpu_name_p (canonical, given);
15014 }
15015
15016
15017 /* Parse an option that takes the name of a processor as its argument.
15018 OPTION is the name of the option and CPU_STRING is the argument.
15019 Return the corresponding processor enumeration if the CPU_STRING is
15020 recognized, otherwise report an error and return null.
15021
15022 A similar function exists in GCC. */
15023
15024 static const struct mips_cpu_info *
15025 mips_parse_cpu (option, cpu_string)
15026 const char *option, *cpu_string;
15027 {
15028 const struct mips_cpu_info *p;
15029
15030 /* 'from-abi' selects the most compatible architecture for the given
15031 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15032 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15033 version. Look first at the -mgp options, if given, otherwise base
15034 the choice on MIPS_DEFAULT_64BIT.
15035
15036 Treat NO_ABI like the EABIs. One reason to do this is that the
15037 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15038 architecture. This code picks MIPS I for 'mips' and MIPS III for
15039 'mips64', just as we did in the days before 'from-abi'. */
15040 if (strcasecmp (cpu_string, "from-abi") == 0)
15041 {
15042 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15043 return mips_cpu_info_from_isa (ISA_MIPS1);
15044
15045 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15046 return mips_cpu_info_from_isa (ISA_MIPS3);
15047
15048 if (file_mips_gp32 >= 0)
15049 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15050
15051 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15052 ? ISA_MIPS3
15053 : ISA_MIPS1);
15054 }
15055
15056 /* 'default' has traditionally been a no-op. Probably not very useful. */
15057 if (strcasecmp (cpu_string, "default") == 0)
15058 return 0;
15059
15060 for (p = mips_cpu_info_table; p->name != 0; p++)
15061 if (mips_matching_cpu_name_p (p->name, cpu_string))
15062 return p;
15063
15064 as_bad ("Bad value (%s) for %s", cpu_string, option);
15065 return 0;
15066 }
15067
15068 /* Return the canonical processor information for ISA (a member of the
15069 ISA_MIPS* enumeration). */
15070
15071 static const struct mips_cpu_info *
15072 mips_cpu_info_from_isa (isa)
15073 int isa;
15074 {
15075 int i;
15076
15077 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15078 if (mips_cpu_info_table[i].is_isa
15079 && isa == mips_cpu_info_table[i].isa)
15080 return (&mips_cpu_info_table[i]);
15081
15082 return NULL;
15083 }
15084 \f
15085 static void
15086 show (stream, string, col_p, first_p)
15087 FILE *stream;
15088 const char *string;
15089 int *col_p;
15090 int *first_p;
15091 {
15092 if (*first_p)
15093 {
15094 fprintf (stream, "%24s", "");
15095 *col_p = 24;
15096 }
15097 else
15098 {
15099 fprintf (stream, ", ");
15100 *col_p += 2;
15101 }
15102
15103 if (*col_p + strlen (string) > 72)
15104 {
15105 fprintf (stream, "\n%24s", "");
15106 *col_p = 24;
15107 }
15108
15109 fprintf (stream, "%s", string);
15110 *col_p += strlen (string);
15111
15112 *first_p = 0;
15113 }
15114
15115 void
15116 md_show_usage (stream)
15117 FILE *stream;
15118 {
15119 int column, first;
15120 size_t i;
15121
15122 fprintf (stream, _("\
15123 MIPS options:\n\
15124 -membedded-pic generate embedded position independent code\n\
15125 -EB generate big endian output\n\
15126 -EL generate little endian output\n\
15127 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15128 -G NUM allow referencing objects up to NUM bytes\n\
15129 implicitly with the gp register [default 8]\n"));
15130 fprintf (stream, _("\
15131 -mips1 generate MIPS ISA I instructions\n\
15132 -mips2 generate MIPS ISA II instructions\n\
15133 -mips3 generate MIPS ISA III instructions\n\
15134 -mips4 generate MIPS ISA IV instructions\n\
15135 -mips5 generate MIPS ISA V instructions\n\
15136 -mips32 generate MIPS32 ISA instructions\n\
15137 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15138 -mips64 generate MIPS64 ISA instructions\n\
15139 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15140
15141 first = 1;
15142
15143 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15144 show (stream, mips_cpu_info_table[i].name, &column, &first);
15145 show (stream, "from-abi", &column, &first);
15146 fputc ('\n', stream);
15147
15148 fprintf (stream, _("\
15149 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15150 -no-mCPU don't generate code specific to CPU.\n\
15151 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15152
15153 first = 1;
15154
15155 show (stream, "3900", &column, &first);
15156 show (stream, "4010", &column, &first);
15157 show (stream, "4100", &column, &first);
15158 show (stream, "4650", &column, &first);
15159 fputc ('\n', stream);
15160
15161 fprintf (stream, _("\
15162 -mips16 generate mips16 instructions\n\
15163 -no-mips16 do not generate mips16 instructions\n"));
15164 fprintf (stream, _("\
15165 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15166 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15167 -O0 remove unneeded NOPs, do not swap branches\n\
15168 -O remove unneeded NOPs and swap branches\n\
15169 -n warn about NOPs generated from macros\n\
15170 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15171 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15172 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15173 #ifdef OBJ_ELF
15174 fprintf (stream, _("\
15175 -KPIC, -call_shared generate SVR4 position independent code\n\
15176 -non_shared do not generate position independent code\n\
15177 -xgot assume a 32 bit GOT\n\
15178 -mabi=ABI create ABI conformant object file for:\n"));
15179
15180 first = 1;
15181
15182 show (stream, "32", &column, &first);
15183 show (stream, "o64", &column, &first);
15184 show (stream, "n32", &column, &first);
15185 show (stream, "64", &column, &first);
15186 show (stream, "eabi", &column, &first);
15187
15188 fputc ('\n', stream);
15189
15190 fprintf (stream, _("\
15191 -32 create o32 ABI object file (default)\n\
15192 -n32 create n32 ABI object file\n\
15193 -64 create 64 ABI object file\n"));
15194 #endif
15195 }
15196
15197 enum dwarf2_format
15198 mips_dwarf2_format ()
15199 {
15200 if (mips_abi == N64_ABI)
15201 {
15202 #ifdef TE_IRIX
15203 return dwarf2_format_64bit_irix;
15204 #else
15205 return dwarf2_format_64bit;
15206 #endif
15207 }
15208 else
15209 return dwarf2_format_32bit;
15210 }
This page took 0.353546 seconds and 5 git commands to generate.