* config/tc-mips.c (mips_need_elf_addend_fixup): Remove
[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 /* This is the set of options which may be modified by the .set
135 pseudo-op. We use a struct so that .set push and .set pop are more
136 reliable. */
137
138 struct mips_set_options
139 {
140 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
141 if it has not been initialized. Changed by `.set mipsN', and the
142 -mipsN command line option, and the default CPU. */
143 int isa;
144 /* Enabled Application Specific Extensions (ASEs). These are set to -1
145 if they have not been initialized. Changed by `.set <asename>', by
146 command line options, and based on the default architecture. */
147 int ase_mips3d;
148 int ase_mdmx;
149 /* Whether we are assembling for the mips16 processor. 0 if we are
150 not, 1 if we are, and -1 if the value has not been initialized.
151 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
152 -nomips16 command line options, and the default CPU. */
153 int mips16;
154 /* Non-zero if we should not reorder instructions. Changed by `.set
155 reorder' and `.set noreorder'. */
156 int noreorder;
157 /* Non-zero if we should not permit the $at ($1) register to be used
158 in instructions. Changed by `.set at' and `.set noat'. */
159 int noat;
160 /* Non-zero if we should warn when a macro instruction expands into
161 more than one machine instruction. Changed by `.set nomacro' and
162 `.set macro'. */
163 int warn_about_macros;
164 /* Non-zero if we should not move instructions. Changed by `.set
165 move', `.set volatile', `.set nomove', and `.set novolatile'. */
166 int nomove;
167 /* Non-zero if we should not optimize branches by moving the target
168 of the branch into the delay slot. Actually, we don't perform
169 this optimization anyhow. Changed by `.set bopt' and `.set
170 nobopt'. */
171 int nobopt;
172 /* Non-zero if we should not autoextend mips16 instructions.
173 Changed by `.set autoextend' and `.set noautoextend'. */
174 int noautoextend;
175 /* Restrict general purpose registers and floating point registers
176 to 32 bit. This is initially determined when -mgp32 or -mfp32
177 is passed but can changed if the assembler code uses .set mipsN. */
178 int gp32;
179 int fp32;
180 };
181
182 /* True if -mgp32 was passed. */
183 static int file_mips_gp32 = -1;
184
185 /* True if -mfp32 was passed. */
186 static int file_mips_fp32 = -1;
187
188 /* This is the struct we use to hold the current set of options. Note
189 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
190 -1 to indicate that they have not been initialized. */
191
192 static struct mips_set_options mips_opts =
193 {
194 ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0
195 };
196
197 /* These variables are filled in with the masks of registers used.
198 The object format code reads them and puts them in the appropriate
199 place. */
200 unsigned long mips_gprmask;
201 unsigned long mips_cprmask[4];
202
203 /* MIPS ISA we are using for this output file. */
204 static int file_mips_isa = ISA_UNKNOWN;
205
206 /* True if -mips16 was passed or implied by arguments passed on the
207 command line (e.g., by -march). */
208 static int file_ase_mips16;
209
210 /* True if -mips3d was passed or implied by arguments passed on the
211 command line (e.g., by -march). */
212 static int file_ase_mips3d;
213
214 /* True if -mdmx was passed or implied by arguments passed on the
215 command line (e.g., by -march). */
216 static int file_ase_mdmx;
217
218 /* The argument of the -march= flag. The architecture we are assembling. */
219 static int mips_arch = CPU_UNKNOWN;
220 static const char *mips_arch_string;
221 static const struct mips_cpu_info *mips_arch_info;
222
223 /* The argument of the -mtune= flag. The architecture for which we
224 are optimizing. */
225 static int mips_tune = CPU_UNKNOWN;
226 static const char *mips_tune_string;
227 static const struct mips_cpu_info *mips_tune_info;
228
229 /* True when generating 32-bit code for a 64-bit processor. */
230 static int mips_32bitmode = 0;
231
232 /* Some ISA's have delay slots for instructions which read or write
233 from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
234 Return true if instructions marked INSN_LOAD_COPROC_DELAY,
235 INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
236 delay slot in this ISA. The uses of this macro assume that any
237 ISA that has delay slots for one of these, has them for all. They
238 also assume that ISAs which don't have delays for these insns, don't
239 have delays for the INSN_LOAD_MEMORY_DELAY instructions either. */
240 #define ISA_HAS_COPROC_DELAYS(ISA) ( \
241 (ISA) == ISA_MIPS1 \
242 || (ISA) == ISA_MIPS2 \
243 || (ISA) == ISA_MIPS3 \
244 )
245
246 /* True if the given ABI requires 32-bit registers. */
247 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
248
249 /* Likewise 64-bit registers. */
250 #define ABI_NEEDS_64BIT_REGS(ABI) \
251 ((ABI) == N32_ABI \
252 || (ABI) == N64_ABI \
253 || (ABI) == O64_ABI)
254
255 /* Return true if ISA supports 64 bit gp register instructions. */
256 #define ISA_HAS_64BIT_REGS(ISA) ( \
257 (ISA) == ISA_MIPS3 \
258 || (ISA) == ISA_MIPS4 \
259 || (ISA) == ISA_MIPS5 \
260 || (ISA) == ISA_MIPS64 \
261 )
262
263 /* Return true if ISA supports 64-bit right rotate (dror et al.)
264 instructions. */
265 #define ISA_HAS_DROR(ISA) ( \
266 0 \
267 )
268
269 /* Return true if ISA supports 32-bit right rotate (ror et al.)
270 instructions. */
271 #define ISA_HAS_ROR(ISA) ( \
272 (ISA) == ISA_MIPS32R2 \
273 )
274
275 #define HAVE_32BIT_GPRS \
276 (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
277
278 #define HAVE_32BIT_FPRS \
279 (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
280
281 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
282 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
283
284 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
285
286 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
287
288 /* We can only have 64bit addresses if the object file format
289 supports it. */
290 #define HAVE_32BIT_ADDRESSES \
291 (HAVE_32BIT_GPRS \
292 || ((bfd_arch_bits_per_address (stdoutput) == 32 \
293 || ! HAVE_64BIT_OBJECTS) \
294 && mips_pic != EMBEDDED_PIC))
295
296 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
297 #define HAVE_64BIT_ADDRESS_CONSTANTS (HAVE_64BIT_ADDRESSES \
298 || HAVE_64BIT_GPRS)
299
300 /* Return true if the given CPU supports the MIPS16 ASE. */
301 #define CPU_HAS_MIPS16(cpu) \
302 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
303 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
304
305 /* Return true if the given CPU supports the MIPS3D ASE. */
306 #define CPU_HAS_MIPS3D(cpu) ((cpu) == CPU_SB1 \
307 )
308
309 /* Return true if the given CPU supports the MDMX ASE. */
310 #define CPU_HAS_MDMX(cpu) (FALSE \
311 )
312
313 /* True if CPU has a dror instruction. */
314 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
315
316 /* True if CPU has a ror instruction. */
317 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
318
319 /* Whether the processor uses hardware interlocks to protect
320 reads from the HI and LO registers, and thus does not
321 require nops to be inserted. */
322
323 #define hilo_interlocks (mips_arch == CPU_R4010 \
324 || mips_arch == CPU_VR5500 \
325 || mips_arch == CPU_SB1 \
326 )
327
328 /* Whether the processor uses hardware interlocks to protect reads
329 from the GPRs, and thus does not require nops to be inserted. */
330 #define gpr_interlocks \
331 (mips_opts.isa != ISA_MIPS1 \
332 || mips_arch == CPU_VR5400 \
333 || mips_arch == CPU_VR5500 \
334 || mips_arch == CPU_R3900)
335
336 /* As with other "interlocks" this is used by hardware that has FP
337 (co-processor) interlocks. */
338 /* Itbl support may require additional care here. */
339 #define cop_interlocks (mips_arch == CPU_R4300 \
340 || mips_arch == CPU_VR5400 \
341 || mips_arch == CPU_VR5500 \
342 || mips_arch == CPU_SB1 \
343 )
344
345 /* Is this a mfhi or mflo instruction? */
346 #define MF_HILO_INSN(PINFO) \
347 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
348
349 /* MIPS PIC level. */
350
351 enum mips_pic_level mips_pic;
352
353 /* Warn about all NOPS that the assembler generates. */
354 static int warn_nops = 0;
355
356 /* 1 if we should generate 32 bit offsets from the $gp register in
357 SVR4_PIC mode. Currently has no meaning in other modes. */
358 static int mips_big_got = 0;
359
360 /* 1 if trap instructions should used for overflow rather than break
361 instructions. */
362 static int mips_trap = 0;
363
364 /* 1 if double width floating point constants should not be constructed
365 by assembling two single width halves into two single width floating
366 point registers which just happen to alias the double width destination
367 register. On some architectures this aliasing can be disabled by a bit
368 in the status register, and the setting of this bit cannot be determined
369 automatically at assemble time. */
370 static int mips_disable_float_construction;
371
372 /* Non-zero if any .set noreorder directives were used. */
373
374 static int mips_any_noreorder;
375
376 /* Non-zero if nops should be inserted when the register referenced in
377 an mfhi/mflo instruction is read in the next two instructions. */
378 static int mips_7000_hilo_fix;
379
380 /* The size of the small data section. */
381 static unsigned int g_switch_value = 8;
382 /* Whether the -G option was used. */
383 static int g_switch_seen = 0;
384
385 #define N_RMASK 0xc4
386 #define N_VFP 0xd4
387
388 /* If we can determine in advance that GP optimization won't be
389 possible, we can skip the relaxation stuff that tries to produce
390 GP-relative references. This makes delay slot optimization work
391 better.
392
393 This function can only provide a guess, but it seems to work for
394 gcc output. It needs to guess right for gcc, otherwise gcc
395 will put what it thinks is a GP-relative instruction in a branch
396 delay slot.
397
398 I don't know if a fix is needed for the SVR4_PIC mode. I've only
399 fixed it for the non-PIC mode. KR 95/04/07 */
400 static int nopic_need_relax PARAMS ((symbolS *, int));
401
402 /* handle of the OPCODE hash table */
403 static struct hash_control *op_hash = NULL;
404
405 /* The opcode hash table we use for the mips16. */
406 static struct hash_control *mips16_op_hash = NULL;
407
408 /* This array holds the chars that always start a comment. If the
409 pre-processor is disabled, these aren't very useful */
410 const char comment_chars[] = "#";
411
412 /* This array holds the chars that only start a comment at the beginning of
413 a line. If the line seems to have the form '# 123 filename'
414 .line and .file directives will appear in the pre-processed output */
415 /* Note that input_file.c hand checks for '#' at the beginning of the
416 first line of the input file. This is because the compiler outputs
417 #NO_APP at the beginning of its output. */
418 /* Also note that C style comments are always supported. */
419 const char line_comment_chars[] = "#";
420
421 /* This array holds machine specific line separator characters. */
422 const char line_separator_chars[] = ";";
423
424 /* Chars that can be used to separate mant from exp in floating point nums */
425 const char EXP_CHARS[] = "eE";
426
427 /* Chars that mean this number is a floating point constant */
428 /* As in 0f12.456 */
429 /* or 0d1.2345e12 */
430 const char FLT_CHARS[] = "rRsSfFdDxXpP";
431
432 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
433 changed in read.c . Ideally it shouldn't have to know about it at all,
434 but nothing is ideal around here.
435 */
436
437 static char *insn_error;
438
439 static int auto_align = 1;
440
441 /* When outputting SVR4 PIC code, the assembler needs to know the
442 offset in the stack frame from which to restore the $gp register.
443 This is set by the .cprestore pseudo-op, and saved in this
444 variable. */
445 static offsetT mips_cprestore_offset = -1;
446
447 /* Similiar for NewABI PIC code, where $gp is callee-saved. NewABI has some
448 more optimizations, it can use a register value instead of a memory-saved
449 offset and even an other register than $gp as global pointer. */
450 static offsetT mips_cpreturn_offset = -1;
451 static int mips_cpreturn_register = -1;
452 static int mips_gp_register = GP;
453 static int mips_gprel_offset = 0;
454
455 /* Whether mips_cprestore_offset has been set in the current function
456 (or whether it has already been warned about, if not). */
457 static int mips_cprestore_valid = 0;
458
459 /* This is the register which holds the stack frame, as set by the
460 .frame pseudo-op. This is needed to implement .cprestore. */
461 static int mips_frame_reg = SP;
462
463 /* Whether mips_frame_reg has been set in the current function
464 (or whether it has already been warned about, if not). */
465 static int mips_frame_reg_valid = 0;
466
467 /* To output NOP instructions correctly, we need to keep information
468 about the previous two instructions. */
469
470 /* Whether we are optimizing. The default value of 2 means to remove
471 unneeded NOPs and swap branch instructions when possible. A value
472 of 1 means to not swap branches. A value of 0 means to always
473 insert NOPs. */
474 static int mips_optimize = 2;
475
476 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
477 equivalent to seeing no -g option at all. */
478 static int mips_debug = 0;
479
480 /* The previous instruction. */
481 static struct mips_cl_insn prev_insn;
482
483 /* The instruction before prev_insn. */
484 static struct mips_cl_insn prev_prev_insn;
485
486 /* If we don't want information for prev_insn or prev_prev_insn, we
487 point the insn_mo field at this dummy integer. */
488 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
489
490 /* Non-zero if prev_insn is valid. */
491 static int prev_insn_valid;
492
493 /* The frag for the previous instruction. */
494 static struct frag *prev_insn_frag;
495
496 /* The offset into prev_insn_frag for the previous instruction. */
497 static long prev_insn_where;
498
499 /* The reloc type for the previous instruction, if any. */
500 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
501
502 /* The reloc for the previous instruction, if any. */
503 static fixS *prev_insn_fixp[3];
504
505 /* Non-zero if the previous instruction was in a delay slot. */
506 static int prev_insn_is_delay_slot;
507
508 /* Non-zero if the previous instruction was in a .set noreorder. */
509 static int prev_insn_unreordered;
510
511 /* Non-zero if the previous instruction uses an extend opcode (if
512 mips16). */
513 static int prev_insn_extended;
514
515 /* Non-zero if the previous previous instruction was in a .set
516 noreorder. */
517 static int prev_prev_insn_unreordered;
518
519 /* If this is set, it points to a frag holding nop instructions which
520 were inserted before the start of a noreorder section. If those
521 nops turn out to be unnecessary, the size of the frag can be
522 decreased. */
523 static fragS *prev_nop_frag;
524
525 /* The number of nop instructions we created in prev_nop_frag. */
526 static int prev_nop_frag_holds;
527
528 /* The number of nop instructions that we know we need in
529 prev_nop_frag. */
530 static int prev_nop_frag_required;
531
532 /* The number of instructions we've seen since prev_nop_frag. */
533 static int prev_nop_frag_since;
534
535 /* For ECOFF and ELF, relocations against symbols are done in two
536 parts, with a HI relocation and a LO relocation. Each relocation
537 has only 16 bits of space to store an addend. This means that in
538 order for the linker to handle carries correctly, it must be able
539 to locate both the HI and the LO relocation. This means that the
540 relocations must appear in order in the relocation table.
541
542 In order to implement this, we keep track of each unmatched HI
543 relocation. We then sort them so that they immediately precede the
544 corresponding LO relocation. */
545
546 struct mips_hi_fixup
547 {
548 /* Next HI fixup. */
549 struct mips_hi_fixup *next;
550 /* This fixup. */
551 fixS *fixp;
552 /* The section this fixup is in. */
553 segT seg;
554 };
555
556 /* The list of unmatched HI relocs. */
557
558 static struct mips_hi_fixup *mips_hi_fixup_list;
559
560 /* The frag containing the last explicit relocation operator.
561 Null if explicit relocations have not been used. */
562
563 static fragS *prev_reloc_op_frag;
564
565 /* Map normal MIPS register numbers to mips16 register numbers. */
566
567 #define X ILLEGAL_REG
568 static const int mips32_to_16_reg_map[] =
569 {
570 X, X, 2, 3, 4, 5, 6, 7,
571 X, X, X, X, X, X, X, X,
572 0, 1, X, X, X, X, X, X,
573 X, X, X, X, X, X, X, X
574 };
575 #undef X
576
577 /* Map mips16 register numbers to normal MIPS register numbers. */
578
579 static const unsigned int mips16_to_32_reg_map[] =
580 {
581 16, 17, 2, 3, 4, 5, 6, 7
582 };
583
584 static int mips_fix_4122_bugs;
585
586 /* We don't relax branches by default, since this causes us to expand
587 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
588 fail to compute the offset before expanding the macro to the most
589 efficient expansion. */
590
591 static int mips_relax_branch;
592 \f
593 /* Since the MIPS does not have multiple forms of PC relative
594 instructions, we do not have to do relaxing as is done on other
595 platforms. However, we do have to handle GP relative addressing
596 correctly, which turns out to be a similar problem.
597
598 Every macro that refers to a symbol can occur in (at least) two
599 forms, one with GP relative addressing and one without. For
600 example, loading a global variable into a register generally uses
601 a macro instruction like this:
602 lw $4,i
603 If i can be addressed off the GP register (this is true if it is in
604 the .sbss or .sdata section, or if it is known to be smaller than
605 the -G argument) this will generate the following instruction:
606 lw $4,i($gp)
607 This instruction will use a GPREL reloc. If i can not be addressed
608 off the GP register, the following instruction sequence will be used:
609 lui $at,i
610 lw $4,i($at)
611 In this case the first instruction will have a HI16 reloc, and the
612 second reloc will have a LO16 reloc. Both relocs will be against
613 the symbol i.
614
615 The issue here is that we may not know whether i is GP addressable
616 until after we see the instruction that uses it. Therefore, we
617 want to be able to choose the final instruction sequence only at
618 the end of the assembly. This is similar to the way other
619 platforms choose the size of a PC relative instruction only at the
620 end of assembly.
621
622 When generating position independent code we do not use GP
623 addressing in quite the same way, but the issue still arises as
624 external symbols and local symbols must be handled differently.
625
626 We handle these issues by actually generating both possible
627 instruction sequences. The longer one is put in a frag_var with
628 type rs_machine_dependent. We encode what to do with the frag in
629 the subtype field. We encode (1) the number of existing bytes to
630 replace, (2) the number of new bytes to use, (3) the offset from
631 the start of the existing bytes to the first reloc we must generate
632 (that is, the offset is applied from the start of the existing
633 bytes after they are replaced by the new bytes, if any), (4) the
634 offset from the start of the existing bytes to the second reloc,
635 (5) whether a third reloc is needed (the third reloc is always four
636 bytes after the second reloc), and (6) whether to warn if this
637 variant is used (this is sometimes needed if .set nomacro or .set
638 noat is in effect). All these numbers are reasonably small.
639
640 Generating two instruction sequences must be handled carefully to
641 ensure that delay slots are handled correctly. Fortunately, there
642 are a limited number of cases. When the second instruction
643 sequence is generated, append_insn is directed to maintain the
644 existing delay slot information, so it continues to apply to any
645 code after the second instruction sequence. This means that the
646 second instruction sequence must not impose any requirements not
647 required by the first instruction sequence.
648
649 These variant frags are then handled in functions called by the
650 machine independent code. md_estimate_size_before_relax returns
651 the final size of the frag. md_convert_frag sets up the final form
652 of the frag. tc_gen_reloc adjust the first reloc and adds a second
653 one if needed. */
654 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
655 ((relax_substateT) \
656 (((old) << 23) \
657 | ((new) << 16) \
658 | (((reloc1) + 64) << 9) \
659 | (((reloc2) + 64) << 2) \
660 | ((reloc3) ? (1 << 1) : 0) \
661 | ((warn) ? 1 : 0)))
662 #define RELAX_OLD(i) (((i) >> 23) & 0x7f)
663 #define RELAX_NEW(i) (((i) >> 16) & 0x7f)
664 #define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
665 #define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
666 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
667 #define RELAX_WARN(i) ((i) & 1)
668
669 /* Branch without likely bit. If label is out of range, we turn:
670
671 beq reg1, reg2, label
672 delay slot
673
674 into
675
676 bne reg1, reg2, 0f
677 nop
678 j label
679 0: delay slot
680
681 with the following opcode replacements:
682
683 beq <-> bne
684 blez <-> bgtz
685 bltz <-> bgez
686 bc1f <-> bc1t
687
688 bltzal <-> bgezal (with jal label instead of j label)
689
690 Even though keeping the delay slot instruction in the delay slot of
691 the branch would be more efficient, it would be very tricky to do
692 correctly, because we'd have to introduce a variable frag *after*
693 the delay slot instruction, and expand that instead. Let's do it
694 the easy way for now, even if the branch-not-taken case now costs
695 one additional instruction. Out-of-range branches are not supposed
696 to be common, anyway.
697
698 Branch likely. If label is out of range, we turn:
699
700 beql reg1, reg2, label
701 delay slot (annulled if branch not taken)
702
703 into
704
705 beql reg1, reg2, 1f
706 nop
707 beql $0, $0, 2f
708 nop
709 1: j[al] label
710 delay slot (executed only if branch taken)
711 2:
712
713 It would be possible to generate a shorter sequence by losing the
714 likely bit, generating something like:
715
716 bne reg1, reg2, 0f
717 nop
718 j[al] label
719 delay slot (executed only if branch taken)
720 0:
721
722 beql -> bne
723 bnel -> beq
724 blezl -> bgtz
725 bgtzl -> blez
726 bltzl -> bgez
727 bgezl -> bltz
728 bc1fl -> bc1t
729 bc1tl -> bc1f
730
731 bltzall -> bgezal (with jal label instead of j label)
732 bgezall -> bltzal (ditto)
733
734
735 but it's not clear that it would actually improve performance. */
736 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
737 ((relax_substateT) \
738 (0xc0000000 \
739 | ((toofar) ? 1 : 0) \
740 | ((link) ? 2 : 0) \
741 | ((likely) ? 4 : 0) \
742 | ((uncond) ? 8 : 0)))
743 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
744 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
745 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
746 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
747 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
748
749 /* For mips16 code, we use an entirely different form of relaxation.
750 mips16 supports two versions of most instructions which take
751 immediate values: a small one which takes some small value, and a
752 larger one which takes a 16 bit value. Since branches also follow
753 this pattern, relaxing these values is required.
754
755 We can assemble both mips16 and normal MIPS code in a single
756 object. Therefore, we need to support this type of relaxation at
757 the same time that we support the relaxation described above. We
758 use the high bit of the subtype field to distinguish these cases.
759
760 The information we store for this type of relaxation is the
761 argument code found in the opcode file for this relocation, whether
762 the user explicitly requested a small or extended form, and whether
763 the relocation is in a jump or jal delay slot. That tells us the
764 size of the value, and how it should be stored. We also store
765 whether the fragment is considered to be extended or not. We also
766 store whether this is known to be a branch to a different section,
767 whether we have tried to relax this frag yet, and whether we have
768 ever extended a PC relative fragment because of a shift count. */
769 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
770 (0x80000000 \
771 | ((type) & 0xff) \
772 | ((small) ? 0x100 : 0) \
773 | ((ext) ? 0x200 : 0) \
774 | ((dslot) ? 0x400 : 0) \
775 | ((jal_dslot) ? 0x800 : 0))
776 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
777 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
778 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
779 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
780 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
781 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
782 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
783 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
784 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
785 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
786 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
787 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
788
789 /* Is the given value a sign-extended 32-bit value? */
790 #define IS_SEXT_32BIT_NUM(x) \
791 (((x) &~ (offsetT) 0x7fffffff) == 0 \
792 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
793
794 /* Is the given value a sign-extended 16-bit value? */
795 #define IS_SEXT_16BIT_NUM(x) \
796 (((x) &~ (offsetT) 0x7fff) == 0 \
797 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
798
799 \f
800 /* Prototypes for static functions. */
801
802 #ifdef __STDC__
803 #define internalError() \
804 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
805 #else
806 #define internalError() as_fatal (_("MIPS internal Error"));
807 #endif
808
809 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
810
811 static inline bfd_boolean reloc_needs_lo_p
812 PARAMS ((bfd_reloc_code_real_type));
813 static inline bfd_boolean fixup_has_matching_lo_p
814 PARAMS ((fixS *));
815 static int insn_uses_reg
816 PARAMS ((struct mips_cl_insn *ip, unsigned int reg,
817 enum mips_regclass class));
818 static int reg_needs_delay
819 PARAMS ((unsigned int));
820 static void mips16_mark_labels
821 PARAMS ((void));
822 static void append_insn
823 PARAMS ((char *place, struct mips_cl_insn * ip, expressionS * p,
824 bfd_reloc_code_real_type *r));
825 static void mips_no_prev_insn
826 PARAMS ((int));
827 static void mips_emit_delays
828 PARAMS ((bfd_boolean));
829 #ifdef USE_STDARG
830 static void macro_build
831 PARAMS ((char *place, int *counter, expressionS * ep, const char *name,
832 const char *fmt, ...));
833 #else
834 static void macro_build ();
835 #endif
836 static void mips16_macro_build
837 PARAMS ((char *, int *, expressionS *, const char *, const char *, va_list));
838 static void macro_build_jalr
839 PARAMS ((int, expressionS *));
840 static void macro_build_lui
841 PARAMS ((char *place, int *counter, expressionS * ep, int regnum));
842 static void macro_build_ldst_constoffset
843 PARAMS ((char *place, int *counter, expressionS * ep, const char *op,
844 int valreg, int breg));
845 static void set_at
846 PARAMS ((int *counter, int reg, int unsignedp));
847 static void check_absolute_expr
848 PARAMS ((struct mips_cl_insn * ip, expressionS *));
849 static void load_register
850 PARAMS ((int *, int, expressionS *, int));
851 static void load_address
852 PARAMS ((int *, int, expressionS *, int *));
853 static void move_register
854 PARAMS ((int *, int, int));
855 static void macro
856 PARAMS ((struct mips_cl_insn * ip));
857 static void mips16_macro
858 PARAMS ((struct mips_cl_insn * ip));
859 #ifdef LOSING_COMPILER
860 static void macro2
861 PARAMS ((struct mips_cl_insn * ip));
862 #endif
863 static void mips_ip
864 PARAMS ((char *str, struct mips_cl_insn * ip));
865 static void mips16_ip
866 PARAMS ((char *str, struct mips_cl_insn * ip));
867 static void mips16_immed
868 PARAMS ((char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean,
869 bfd_boolean, unsigned long *, bfd_boolean *, unsigned short *));
870 static bfd_boolean parse_relocation
871 PARAMS ((char **, bfd_reloc_code_real_type *));
872 static size_t my_getSmallExpression
873 PARAMS ((expressionS *, bfd_reloc_code_real_type *, char *));
874 static void my_getExpression
875 PARAMS ((expressionS *, char *));
876 #ifdef OBJ_ELF
877 static int support_64bit_objects
878 PARAMS((void));
879 #endif
880 static void mips_set_option_string
881 PARAMS ((const char **, const char *));
882 static symbolS *get_symbol
883 PARAMS ((void));
884 static void mips_align
885 PARAMS ((int to, int fill, symbolS *label));
886 static void s_align
887 PARAMS ((int));
888 static void s_change_sec
889 PARAMS ((int));
890 static void s_change_section
891 PARAMS ((int));
892 static void s_cons
893 PARAMS ((int));
894 static void s_float_cons
895 PARAMS ((int));
896 static void s_mips_globl
897 PARAMS ((int));
898 static void s_option
899 PARAMS ((int));
900 static void s_mipsset
901 PARAMS ((int));
902 static void s_abicalls
903 PARAMS ((int));
904 static void s_cpload
905 PARAMS ((int));
906 static void s_cpsetup
907 PARAMS ((int));
908 static void s_cplocal
909 PARAMS ((int));
910 static void s_cprestore
911 PARAMS ((int));
912 static void s_cpreturn
913 PARAMS ((int));
914 static void s_gpvalue
915 PARAMS ((int));
916 static void s_gpword
917 PARAMS ((int));
918 static void s_gpdword
919 PARAMS ((int));
920 static void s_cpadd
921 PARAMS ((int));
922 static void s_insn
923 PARAMS ((int));
924 static void md_obj_begin
925 PARAMS ((void));
926 static void md_obj_end
927 PARAMS ((void));
928 static long get_number
929 PARAMS ((void));
930 static void s_mips_ent
931 PARAMS ((int));
932 static void s_mips_end
933 PARAMS ((int));
934 static void s_mips_frame
935 PARAMS ((int));
936 static void s_mips_mask
937 PARAMS ((int));
938 static void s_mips_stab
939 PARAMS ((int));
940 static void s_mips_weakext
941 PARAMS ((int));
942 static void s_mips_file
943 PARAMS ((int));
944 static void s_mips_loc
945 PARAMS ((int));
946 static bfd_boolean pic_need_relax
947 PARAMS ((symbolS *, asection *));
948 static int mips16_extended_frag
949 PARAMS ((fragS *, asection *, long));
950 static int relaxed_branch_length (fragS *, asection *, int);
951 static int validate_mips_insn
952 PARAMS ((const struct mips_opcode *));
953 static void show
954 PARAMS ((FILE *, const char *, int *, int *));
955 #ifdef OBJ_ELF
956 static int mips_need_elf_addend_fixup
957 PARAMS ((fixS *));
958 #endif
959
960 /* Table and functions used to map between CPU/ISA names, and
961 ISA levels, and CPU numbers. */
962
963 struct mips_cpu_info
964 {
965 const char *name; /* CPU or ISA name. */
966 int is_isa; /* Is this an ISA? (If 0, a CPU.) */
967 int isa; /* ISA level. */
968 int cpu; /* CPU number (default CPU if ISA). */
969 };
970
971 static void mips_set_architecture
972 PARAMS ((const struct mips_cpu_info *));
973 static void mips_set_tune
974 PARAMS ((const struct mips_cpu_info *));
975 static bfd_boolean mips_strict_matching_cpu_name_p
976 PARAMS ((const char *, const char *));
977 static bfd_boolean mips_matching_cpu_name_p
978 PARAMS ((const char *, const char *));
979 static const struct mips_cpu_info *mips_parse_cpu
980 PARAMS ((const char *, const char *));
981 static const struct mips_cpu_info *mips_cpu_info_from_isa
982 PARAMS ((int));
983 \f
984 /* Pseudo-op table.
985
986 The following pseudo-ops from the Kane and Heinrich MIPS book
987 should be defined here, but are currently unsupported: .alias,
988 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
989
990 The following pseudo-ops from the Kane and Heinrich MIPS book are
991 specific to the type of debugging information being generated, and
992 should be defined by the object format: .aent, .begin, .bend,
993 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
994 .vreg.
995
996 The following pseudo-ops from the Kane and Heinrich MIPS book are
997 not MIPS CPU specific, but are also not specific to the object file
998 format. This file is probably the best place to define them, but
999 they are not currently supported: .asm0, .endr, .lab, .repeat,
1000 .struct. */
1001
1002 static const pseudo_typeS mips_pseudo_table[] =
1003 {
1004 /* MIPS specific pseudo-ops. */
1005 {"option", s_option, 0},
1006 {"set", s_mipsset, 0},
1007 {"rdata", s_change_sec, 'r'},
1008 {"sdata", s_change_sec, 's'},
1009 {"livereg", s_ignore, 0},
1010 {"abicalls", s_abicalls, 0},
1011 {"cpload", s_cpload, 0},
1012 {"cpsetup", s_cpsetup, 0},
1013 {"cplocal", s_cplocal, 0},
1014 {"cprestore", s_cprestore, 0},
1015 {"cpreturn", s_cpreturn, 0},
1016 {"gpvalue", s_gpvalue, 0},
1017 {"gpword", s_gpword, 0},
1018 {"gpdword", s_gpdword, 0},
1019 {"cpadd", s_cpadd, 0},
1020 {"insn", s_insn, 0},
1021
1022 /* Relatively generic pseudo-ops that happen to be used on MIPS
1023 chips. */
1024 {"asciiz", stringer, 1},
1025 {"bss", s_change_sec, 'b'},
1026 {"err", s_err, 0},
1027 {"half", s_cons, 1},
1028 {"dword", s_cons, 3},
1029 {"weakext", s_mips_weakext, 0},
1030
1031 /* These pseudo-ops are defined in read.c, but must be overridden
1032 here for one reason or another. */
1033 {"align", s_align, 0},
1034 {"byte", s_cons, 0},
1035 {"data", s_change_sec, 'd'},
1036 {"double", s_float_cons, 'd'},
1037 {"float", s_float_cons, 'f'},
1038 {"globl", s_mips_globl, 0},
1039 {"global", s_mips_globl, 0},
1040 {"hword", s_cons, 1},
1041 {"int", s_cons, 2},
1042 {"long", s_cons, 2},
1043 {"octa", s_cons, 4},
1044 {"quad", s_cons, 3},
1045 {"section", s_change_section, 0},
1046 {"short", s_cons, 1},
1047 {"single", s_float_cons, 'f'},
1048 {"stabn", s_mips_stab, 'n'},
1049 {"text", s_change_sec, 't'},
1050 {"word", s_cons, 2},
1051
1052 { "extern", ecoff_directive_extern, 0},
1053
1054 { NULL, NULL, 0 },
1055 };
1056
1057 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1058 {
1059 /* These pseudo-ops should be defined by the object file format.
1060 However, a.out doesn't support them, so we have versions here. */
1061 {"aent", s_mips_ent, 1},
1062 {"bgnb", s_ignore, 0},
1063 {"end", s_mips_end, 0},
1064 {"endb", s_ignore, 0},
1065 {"ent", s_mips_ent, 0},
1066 {"file", s_mips_file, 0},
1067 {"fmask", s_mips_mask, 'F'},
1068 {"frame", s_mips_frame, 0},
1069 {"loc", s_mips_loc, 0},
1070 {"mask", s_mips_mask, 'R'},
1071 {"verstamp", s_ignore, 0},
1072 { NULL, NULL, 0 },
1073 };
1074
1075 extern void pop_insert PARAMS ((const pseudo_typeS *));
1076
1077 void
1078 mips_pop_insert ()
1079 {
1080 pop_insert (mips_pseudo_table);
1081 if (! ECOFF_DEBUGGING)
1082 pop_insert (mips_nonecoff_pseudo_table);
1083 }
1084 \f
1085 /* Symbols labelling the current insn. */
1086
1087 struct insn_label_list
1088 {
1089 struct insn_label_list *next;
1090 symbolS *label;
1091 };
1092
1093 static struct insn_label_list *insn_labels;
1094 static struct insn_label_list *free_insn_labels;
1095
1096 static void mips_clear_insn_labels PARAMS ((void));
1097
1098 static inline void
1099 mips_clear_insn_labels ()
1100 {
1101 register struct insn_label_list **pl;
1102
1103 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1104 ;
1105 *pl = insn_labels;
1106 insn_labels = NULL;
1107 }
1108 \f
1109 static char *expr_end;
1110
1111 /* Expressions which appear in instructions. These are set by
1112 mips_ip. */
1113
1114 static expressionS imm_expr;
1115 static expressionS offset_expr;
1116
1117 /* Relocs associated with imm_expr and offset_expr. */
1118
1119 static bfd_reloc_code_real_type imm_reloc[3]
1120 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1121 static bfd_reloc_code_real_type offset_reloc[3]
1122 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1123
1124 /* These are set by mips16_ip if an explicit extension is used. */
1125
1126 static bfd_boolean mips16_small, mips16_ext;
1127
1128 #ifdef OBJ_ELF
1129 /* The pdr segment for per procedure frame/regmask info. Not used for
1130 ECOFF debugging. */
1131
1132 static segT pdr_seg;
1133 #endif
1134
1135 /* The default target format to use. */
1136
1137 const char *
1138 mips_target_format ()
1139 {
1140 switch (OUTPUT_FLAVOR)
1141 {
1142 case bfd_target_aout_flavour:
1143 return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1144 case bfd_target_ecoff_flavour:
1145 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1146 case bfd_target_coff_flavour:
1147 return "pe-mips";
1148 case bfd_target_elf_flavour:
1149 #ifdef TE_TMIPS
1150 /* This is traditional mips. */
1151 return (target_big_endian
1152 ? (HAVE_64BIT_OBJECTS
1153 ? "elf64-tradbigmips"
1154 : (HAVE_NEWABI
1155 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1156 : (HAVE_64BIT_OBJECTS
1157 ? "elf64-tradlittlemips"
1158 : (HAVE_NEWABI
1159 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1160 #else
1161 return (target_big_endian
1162 ? (HAVE_64BIT_OBJECTS
1163 ? "elf64-bigmips"
1164 : (HAVE_NEWABI
1165 ? "elf32-nbigmips" : "elf32-bigmips"))
1166 : (HAVE_64BIT_OBJECTS
1167 ? "elf64-littlemips"
1168 : (HAVE_NEWABI
1169 ? "elf32-nlittlemips" : "elf32-littlemips")));
1170 #endif
1171 default:
1172 abort ();
1173 return NULL;
1174 }
1175 }
1176
1177 /* This function is called once, at assembler startup time. It should
1178 set up all the tables, etc. that the MD part of the assembler will need. */
1179
1180 void
1181 md_begin ()
1182 {
1183 register const char *retval = NULL;
1184 int i = 0;
1185 int broken = 0;
1186
1187 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
1188 as_warn (_("Could not set architecture and machine"));
1189
1190 op_hash = hash_new ();
1191
1192 for (i = 0; i < NUMOPCODES;)
1193 {
1194 const char *name = mips_opcodes[i].name;
1195
1196 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1197 if (retval != NULL)
1198 {
1199 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1200 mips_opcodes[i].name, retval);
1201 /* Probably a memory allocation problem? Give up now. */
1202 as_fatal (_("Broken assembler. No assembly attempted."));
1203 }
1204 do
1205 {
1206 if (mips_opcodes[i].pinfo != INSN_MACRO)
1207 {
1208 if (!validate_mips_insn (&mips_opcodes[i]))
1209 broken = 1;
1210 }
1211 ++i;
1212 }
1213 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1214 }
1215
1216 mips16_op_hash = hash_new ();
1217
1218 i = 0;
1219 while (i < bfd_mips16_num_opcodes)
1220 {
1221 const char *name = mips16_opcodes[i].name;
1222
1223 retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1224 if (retval != NULL)
1225 as_fatal (_("internal: can't hash `%s': %s"),
1226 mips16_opcodes[i].name, retval);
1227 do
1228 {
1229 if (mips16_opcodes[i].pinfo != INSN_MACRO
1230 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1231 != mips16_opcodes[i].match))
1232 {
1233 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1234 mips16_opcodes[i].name, mips16_opcodes[i].args);
1235 broken = 1;
1236 }
1237 ++i;
1238 }
1239 while (i < bfd_mips16_num_opcodes
1240 && strcmp (mips16_opcodes[i].name, name) == 0);
1241 }
1242
1243 if (broken)
1244 as_fatal (_("Broken assembler. No assembly attempted."));
1245
1246 /* We add all the general register names to the symbol table. This
1247 helps us detect invalid uses of them. */
1248 for (i = 0; i < 32; i++)
1249 {
1250 char buf[5];
1251
1252 sprintf (buf, "$%d", i);
1253 symbol_table_insert (symbol_new (buf, reg_section, i,
1254 &zero_address_frag));
1255 }
1256 symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1257 &zero_address_frag));
1258 symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1259 &zero_address_frag));
1260 symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1261 &zero_address_frag));
1262 symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1263 &zero_address_frag));
1264 symbol_table_insert (symbol_new ("$at", reg_section, AT,
1265 &zero_address_frag));
1266 symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1267 &zero_address_frag));
1268 symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1269 &zero_address_frag));
1270 symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1271 &zero_address_frag));
1272 symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1273 &zero_address_frag));
1274
1275 /* If we don't add these register names to the symbol table, they
1276 may end up being added as regular symbols by operand(), and then
1277 make it to the object file as undefined in case they're not
1278 regarded as local symbols. They're local in o32, since `$' is a
1279 local symbol prefix, but not in n32 or n64. */
1280 for (i = 0; i < 8; i++)
1281 {
1282 char buf[6];
1283
1284 sprintf (buf, "$fcc%i", i);
1285 symbol_table_insert (symbol_new (buf, reg_section, -1,
1286 &zero_address_frag));
1287 }
1288
1289 mips_no_prev_insn (FALSE);
1290
1291 mips_gprmask = 0;
1292 mips_cprmask[0] = 0;
1293 mips_cprmask[1] = 0;
1294 mips_cprmask[2] = 0;
1295 mips_cprmask[3] = 0;
1296
1297 /* set the default alignment for the text section (2**2) */
1298 record_alignment (text_section, 2);
1299
1300 if (USE_GLOBAL_POINTER_OPT)
1301 bfd_set_gp_size (stdoutput, g_switch_value);
1302
1303 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1304 {
1305 /* On a native system, sections must be aligned to 16 byte
1306 boundaries. When configured for an embedded ELF target, we
1307 don't bother. */
1308 if (strcmp (TARGET_OS, "elf") != 0)
1309 {
1310 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1311 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1312 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1313 }
1314
1315 /* Create a .reginfo section for register masks and a .mdebug
1316 section for debugging information. */
1317 {
1318 segT seg;
1319 subsegT subseg;
1320 flagword flags;
1321 segT sec;
1322
1323 seg = now_seg;
1324 subseg = now_subseg;
1325
1326 /* The ABI says this section should be loaded so that the
1327 running program can access it. However, we don't load it
1328 if we are configured for an embedded target */
1329 flags = SEC_READONLY | SEC_DATA;
1330 if (strcmp (TARGET_OS, "elf") != 0)
1331 flags |= SEC_ALLOC | SEC_LOAD;
1332
1333 if (mips_abi != N64_ABI)
1334 {
1335 sec = subseg_new (".reginfo", (subsegT) 0);
1336
1337 bfd_set_section_flags (stdoutput, sec, flags);
1338 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1339
1340 #ifdef OBJ_ELF
1341 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1342 #endif
1343 }
1344 else
1345 {
1346 /* The 64-bit ABI uses a .MIPS.options section rather than
1347 .reginfo section. */
1348 sec = subseg_new (".MIPS.options", (subsegT) 0);
1349 bfd_set_section_flags (stdoutput, sec, flags);
1350 bfd_set_section_alignment (stdoutput, sec, 3);
1351
1352 #ifdef OBJ_ELF
1353 /* Set up the option header. */
1354 {
1355 Elf_Internal_Options opthdr;
1356 char *f;
1357
1358 opthdr.kind = ODK_REGINFO;
1359 opthdr.size = (sizeof (Elf_External_Options)
1360 + sizeof (Elf64_External_RegInfo));
1361 opthdr.section = 0;
1362 opthdr.info = 0;
1363 f = frag_more (sizeof (Elf_External_Options));
1364 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1365 (Elf_External_Options *) f);
1366
1367 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1368 }
1369 #endif
1370 }
1371
1372 if (ECOFF_DEBUGGING)
1373 {
1374 sec = subseg_new (".mdebug", (subsegT) 0);
1375 (void) bfd_set_section_flags (stdoutput, sec,
1376 SEC_HAS_CONTENTS | SEC_READONLY);
1377 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1378 }
1379 #ifdef OBJ_ELF
1380 else if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1381 {
1382 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1383 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1384 SEC_READONLY | SEC_RELOC
1385 | SEC_DEBUGGING);
1386 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1387 }
1388 #endif
1389
1390 subseg_set (seg, subseg);
1391 }
1392 }
1393
1394 if (! ECOFF_DEBUGGING)
1395 md_obj_begin ();
1396 }
1397
1398 void
1399 md_mips_end ()
1400 {
1401 if (! ECOFF_DEBUGGING)
1402 md_obj_end ();
1403 }
1404
1405 void
1406 md_assemble (str)
1407 char *str;
1408 {
1409 struct mips_cl_insn insn;
1410 bfd_reloc_code_real_type unused_reloc[3]
1411 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1412
1413 imm_expr.X_op = O_absent;
1414 offset_expr.X_op = O_absent;
1415 imm_reloc[0] = BFD_RELOC_UNUSED;
1416 imm_reloc[1] = BFD_RELOC_UNUSED;
1417 imm_reloc[2] = BFD_RELOC_UNUSED;
1418 offset_reloc[0] = BFD_RELOC_UNUSED;
1419 offset_reloc[1] = BFD_RELOC_UNUSED;
1420 offset_reloc[2] = BFD_RELOC_UNUSED;
1421
1422 if (mips_opts.mips16)
1423 mips16_ip (str, &insn);
1424 else
1425 {
1426 mips_ip (str, &insn);
1427 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1428 str, insn.insn_opcode));
1429 }
1430
1431 if (insn_error)
1432 {
1433 as_bad ("%s `%s'", insn_error, str);
1434 return;
1435 }
1436
1437 if (insn.insn_mo->pinfo == INSN_MACRO)
1438 {
1439 if (mips_opts.mips16)
1440 mips16_macro (&insn);
1441 else
1442 macro (&insn);
1443 }
1444 else
1445 {
1446 if (imm_expr.X_op != O_absent)
1447 append_insn (NULL, &insn, &imm_expr, imm_reloc);
1448 else if (offset_expr.X_op != O_absent)
1449 append_insn (NULL, &insn, &offset_expr, offset_reloc);
1450 else
1451 append_insn (NULL, &insn, NULL, unused_reloc);
1452 }
1453 }
1454
1455 /* Return true if the given relocation might need a matching %lo().
1456 Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1457 applied to local symbols. */
1458
1459 static inline bfd_boolean
1460 reloc_needs_lo_p (reloc)
1461 bfd_reloc_code_real_type reloc;
1462 {
1463 return (reloc == BFD_RELOC_HI16_S
1464 || reloc == BFD_RELOC_MIPS_GOT16);
1465 }
1466
1467 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1468 relocation. */
1469
1470 static inline bfd_boolean
1471 fixup_has_matching_lo_p (fixp)
1472 fixS *fixp;
1473 {
1474 return (fixp->fx_next != NULL
1475 && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1476 && fixp->fx_addsy == fixp->fx_next->fx_addsy
1477 && fixp->fx_offset == fixp->fx_next->fx_offset);
1478 }
1479
1480 /* See whether instruction IP reads register REG. CLASS is the type
1481 of register. */
1482
1483 static int
1484 insn_uses_reg (ip, reg, class)
1485 struct mips_cl_insn *ip;
1486 unsigned int reg;
1487 enum mips_regclass class;
1488 {
1489 if (class == MIPS16_REG)
1490 {
1491 assert (mips_opts.mips16);
1492 reg = mips16_to_32_reg_map[reg];
1493 class = MIPS_GR_REG;
1494 }
1495
1496 /* Don't report on general register ZERO, since it never changes. */
1497 if (class == MIPS_GR_REG && reg == ZERO)
1498 return 0;
1499
1500 if (class == MIPS_FP_REG)
1501 {
1502 assert (! mips_opts.mips16);
1503 /* If we are called with either $f0 or $f1, we must check $f0.
1504 This is not optimal, because it will introduce an unnecessary
1505 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
1506 need to distinguish reading both $f0 and $f1 or just one of
1507 them. Note that we don't have to check the other way,
1508 because there is no instruction that sets both $f0 and $f1
1509 and requires a delay. */
1510 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1511 && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1512 == (reg &~ (unsigned) 1)))
1513 return 1;
1514 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1515 && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1516 == (reg &~ (unsigned) 1)))
1517 return 1;
1518 }
1519 else if (! mips_opts.mips16)
1520 {
1521 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1522 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1523 return 1;
1524 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1525 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1526 return 1;
1527 }
1528 else
1529 {
1530 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1531 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1532 & MIPS16OP_MASK_RX)]
1533 == reg))
1534 return 1;
1535 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1536 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1537 & MIPS16OP_MASK_RY)]
1538 == reg))
1539 return 1;
1540 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1541 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1542 & MIPS16OP_MASK_MOVE32Z)]
1543 == reg))
1544 return 1;
1545 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1546 return 1;
1547 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1548 return 1;
1549 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1550 return 1;
1551 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1552 && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1553 & MIPS16OP_MASK_REGR32) == reg)
1554 return 1;
1555 }
1556
1557 return 0;
1558 }
1559
1560 /* This function returns true if modifying a register requires a
1561 delay. */
1562
1563 static int
1564 reg_needs_delay (reg)
1565 unsigned int reg;
1566 {
1567 unsigned long prev_pinfo;
1568
1569 prev_pinfo = prev_insn.insn_mo->pinfo;
1570 if (! mips_opts.noreorder
1571 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1572 && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1573 || (! gpr_interlocks
1574 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1575 {
1576 /* A load from a coprocessor or from memory. All load
1577 delays delay the use of general register rt for one
1578 instruction on the r3000. The r6000 and r4000 use
1579 interlocks. */
1580 /* Itbl support may require additional care here. */
1581 know (prev_pinfo & INSN_WRITE_GPR_T);
1582 if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1583 return 1;
1584 }
1585
1586 return 0;
1587 }
1588
1589 /* Mark instruction labels in mips16 mode. This permits the linker to
1590 handle them specially, such as generating jalx instructions when
1591 needed. We also make them odd for the duration of the assembly, in
1592 order to generate the right sort of code. We will make them even
1593 in the adjust_symtab routine, while leaving them marked. This is
1594 convenient for the debugger and the disassembler. The linker knows
1595 to make them odd again. */
1596
1597 static void
1598 mips16_mark_labels ()
1599 {
1600 if (mips_opts.mips16)
1601 {
1602 struct insn_label_list *l;
1603 valueT val;
1604
1605 for (l = insn_labels; l != NULL; l = l->next)
1606 {
1607 #ifdef OBJ_ELF
1608 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1609 S_SET_OTHER (l->label, STO_MIPS16);
1610 #endif
1611 val = S_GET_VALUE (l->label);
1612 if ((val & 1) == 0)
1613 S_SET_VALUE (l->label, val + 1);
1614 }
1615 }
1616 }
1617
1618 /* Output an instruction. PLACE is where to put the instruction; if
1619 it is NULL, this uses frag_more to get room. IP is the instruction
1620 information. ADDRESS_EXPR is an operand of the instruction to be
1621 used with RELOC_TYPE. */
1622
1623 static void
1624 append_insn (place, ip, address_expr, reloc_type)
1625 char *place;
1626 struct mips_cl_insn *ip;
1627 expressionS *address_expr;
1628 bfd_reloc_code_real_type *reloc_type;
1629 {
1630 register unsigned long prev_pinfo, pinfo;
1631 char *f;
1632 fixS *fixp[3];
1633 int nops = 0;
1634 bfd_boolean force_new_frag = FALSE;
1635
1636 /* Mark instruction labels in mips16 mode. */
1637 mips16_mark_labels ();
1638
1639 prev_pinfo = prev_insn.insn_mo->pinfo;
1640 pinfo = ip->insn_mo->pinfo;
1641
1642 if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1643 {
1644 int prev_prev_nop;
1645
1646 /* If the previous insn required any delay slots, see if we need
1647 to insert a NOP or two. There are eight kinds of possible
1648 hazards, of which an instruction can have at most one type.
1649 (1) a load from memory delay
1650 (2) a load from a coprocessor delay
1651 (3) an unconditional branch delay
1652 (4) a conditional branch delay
1653 (5) a move to coprocessor register delay
1654 (6) a load coprocessor register from memory delay
1655 (7) a coprocessor condition code delay
1656 (8) a HI/LO special register delay
1657
1658 There are a lot of optimizations we could do that we don't.
1659 In particular, we do not, in general, reorder instructions.
1660 If you use gcc with optimization, it will reorder
1661 instructions and generally do much more optimization then we
1662 do here; repeating all that work in the assembler would only
1663 benefit hand written assembly code, and does not seem worth
1664 it. */
1665
1666 /* This is how a NOP is emitted. */
1667 #define emit_nop() \
1668 (mips_opts.mips16 \
1669 ? md_number_to_chars (frag_more (2), 0x6500, 2) \
1670 : md_number_to_chars (frag_more (4), 0, 4))
1671
1672 /* The previous insn might require a delay slot, depending upon
1673 the contents of the current insn. */
1674 if (! mips_opts.mips16
1675 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1676 && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1677 && ! cop_interlocks)
1678 || (! gpr_interlocks
1679 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1680 {
1681 /* A load from a coprocessor or from memory. All load
1682 delays delay the use of general register rt for one
1683 instruction on the r3000. The r6000 and r4000 use
1684 interlocks. */
1685 /* Itbl support may require additional care here. */
1686 know (prev_pinfo & INSN_WRITE_GPR_T);
1687 if (mips_optimize == 0
1688 || insn_uses_reg (ip,
1689 ((prev_insn.insn_opcode >> OP_SH_RT)
1690 & OP_MASK_RT),
1691 MIPS_GR_REG))
1692 ++nops;
1693 }
1694 else if (! mips_opts.mips16
1695 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1696 && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1697 && ! cop_interlocks)
1698 || (mips_opts.isa == ISA_MIPS1
1699 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1700 {
1701 /* A generic coprocessor delay. The previous instruction
1702 modified a coprocessor general or control register. If
1703 it modified a control register, we need to avoid any
1704 coprocessor instruction (this is probably not always
1705 required, but it sometimes is). If it modified a general
1706 register, we avoid using that register.
1707
1708 On the r6000 and r4000 loading a coprocessor register
1709 from memory is interlocked, and does not require a delay.
1710
1711 This case is not handled very well. There is no special
1712 knowledge of CP0 handling, and the coprocessors other
1713 than the floating point unit are not distinguished at
1714 all. */
1715 /* Itbl support may require additional care here. FIXME!
1716 Need to modify this to include knowledge about
1717 user specified delays! */
1718 if (prev_pinfo & INSN_WRITE_FPR_T)
1719 {
1720 if (mips_optimize == 0
1721 || insn_uses_reg (ip,
1722 ((prev_insn.insn_opcode >> OP_SH_FT)
1723 & OP_MASK_FT),
1724 MIPS_FP_REG))
1725 ++nops;
1726 }
1727 else if (prev_pinfo & INSN_WRITE_FPR_S)
1728 {
1729 if (mips_optimize == 0
1730 || insn_uses_reg (ip,
1731 ((prev_insn.insn_opcode >> OP_SH_FS)
1732 & OP_MASK_FS),
1733 MIPS_FP_REG))
1734 ++nops;
1735 }
1736 else
1737 {
1738 /* We don't know exactly what the previous instruction
1739 does. If the current instruction uses a coprocessor
1740 register, we must insert a NOP. If previous
1741 instruction may set the condition codes, and the
1742 current instruction uses them, we must insert two
1743 NOPS. */
1744 /* Itbl support may require additional care here. */
1745 if (mips_optimize == 0
1746 || ((prev_pinfo & INSN_WRITE_COND_CODE)
1747 && (pinfo & INSN_READ_COND_CODE)))
1748 nops += 2;
1749 else if (pinfo & INSN_COP)
1750 ++nops;
1751 }
1752 }
1753 else if (! mips_opts.mips16
1754 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1755 && (prev_pinfo & INSN_WRITE_COND_CODE)
1756 && ! cop_interlocks)
1757 {
1758 /* The previous instruction sets the coprocessor condition
1759 codes, but does not require a general coprocessor delay
1760 (this means it is a floating point comparison
1761 instruction). If this instruction uses the condition
1762 codes, we need to insert a single NOP. */
1763 /* Itbl support may require additional care here. */
1764 if (mips_optimize == 0
1765 || (pinfo & INSN_READ_COND_CODE))
1766 ++nops;
1767 }
1768
1769 /* If we're fixing up mfhi/mflo for the r7000 and the
1770 previous insn was an mfhi/mflo and the current insn
1771 reads the register that the mfhi/mflo wrote to, then
1772 insert two nops. */
1773
1774 else if (mips_7000_hilo_fix
1775 && MF_HILO_INSN (prev_pinfo)
1776 && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1777 & OP_MASK_RD),
1778 MIPS_GR_REG))
1779 {
1780 nops += 2;
1781 }
1782
1783 /* If we're fixing up mfhi/mflo for the r7000 and the
1784 2nd previous insn was an mfhi/mflo and the current insn
1785 reads the register that the mfhi/mflo wrote to, then
1786 insert one nop. */
1787
1788 else if (mips_7000_hilo_fix
1789 && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1790 && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1791 & OP_MASK_RD),
1792 MIPS_GR_REG))
1793
1794 {
1795 ++nops;
1796 }
1797
1798 else if (prev_pinfo & INSN_READ_LO)
1799 {
1800 /* The previous instruction reads the LO register; if the
1801 current instruction writes to the LO register, we must
1802 insert two NOPS. Some newer processors have interlocks.
1803 Also the tx39's multiply instructions can be exectuted
1804 immediatly after a read from HI/LO (without the delay),
1805 though the tx39's divide insns still do require the
1806 delay. */
1807 if (! (hilo_interlocks
1808 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1809 && (mips_optimize == 0
1810 || (pinfo & INSN_WRITE_LO)))
1811 nops += 2;
1812 /* Most mips16 branch insns don't have a delay slot.
1813 If a read from LO is immediately followed by a branch
1814 to a write to LO we have a read followed by a write
1815 less than 2 insns away. We assume the target of
1816 a branch might be a write to LO, and insert a nop
1817 between a read and an immediately following branch. */
1818 else if (mips_opts.mips16
1819 && (mips_optimize == 0
1820 || (pinfo & MIPS16_INSN_BRANCH)))
1821 ++nops;
1822 }
1823 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1824 {
1825 /* The previous instruction reads the HI register; if the
1826 current instruction writes to the HI register, we must
1827 insert a NOP. Some newer processors have interlocks.
1828 Also the note tx39's multiply above. */
1829 if (! (hilo_interlocks
1830 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1831 && (mips_optimize == 0
1832 || (pinfo & INSN_WRITE_HI)))
1833 nops += 2;
1834 /* Most mips16 branch insns don't have a delay slot.
1835 If a read from HI is immediately followed by a branch
1836 to a write to HI we have a read followed by a write
1837 less than 2 insns away. We assume the target of
1838 a branch might be a write to HI, and insert a nop
1839 between a read and an immediately following branch. */
1840 else if (mips_opts.mips16
1841 && (mips_optimize == 0
1842 || (pinfo & MIPS16_INSN_BRANCH)))
1843 ++nops;
1844 }
1845
1846 /* If the previous instruction was in a noreorder section, then
1847 we don't want to insert the nop after all. */
1848 /* Itbl support may require additional care here. */
1849 if (prev_insn_unreordered)
1850 nops = 0;
1851
1852 /* There are two cases which require two intervening
1853 instructions: 1) setting the condition codes using a move to
1854 coprocessor instruction which requires a general coprocessor
1855 delay and then reading the condition codes 2) reading the HI
1856 or LO register and then writing to it (except on processors
1857 which have interlocks). If we are not already emitting a NOP
1858 instruction, we must check for these cases compared to the
1859 instruction previous to the previous instruction. */
1860 if ((! mips_opts.mips16
1861 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1862 && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1863 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1864 && (pinfo & INSN_READ_COND_CODE)
1865 && ! cop_interlocks)
1866 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1867 && (pinfo & INSN_WRITE_LO)
1868 && ! (hilo_interlocks
1869 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
1870 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1871 && (pinfo & INSN_WRITE_HI)
1872 && ! (hilo_interlocks
1873 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
1874 prev_prev_nop = 1;
1875 else
1876 prev_prev_nop = 0;
1877
1878 if (prev_prev_insn_unreordered)
1879 prev_prev_nop = 0;
1880
1881 if (prev_prev_nop && nops == 0)
1882 ++nops;
1883
1884 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
1885 {
1886 /* We're out of bits in pinfo, so we must resort to string
1887 ops here. Shortcuts are selected based on opcodes being
1888 limited to the VR4122 instruction set. */
1889 int min_nops = 0;
1890 const char *pn = prev_insn.insn_mo->name;
1891 const char *tn = ip->insn_mo->name;
1892 if (strncmp(pn, "macc", 4) == 0
1893 || strncmp(pn, "dmacc", 5) == 0)
1894 {
1895 /* Errata 21 - [D]DIV[U] after [D]MACC */
1896 if (strstr (tn, "div"))
1897 {
1898 min_nops = 1;
1899 }
1900
1901 /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1902 if (pn[0] == 'd' /* dmacc */
1903 && (strncmp(tn, "dmult", 5) == 0
1904 || strncmp(tn, "dmacc", 5) == 0))
1905 {
1906 min_nops = 1;
1907 }
1908
1909 /* Errata 24 - MT{LO,HI} after [D]MACC */
1910 if (strcmp (tn, "mtlo") == 0
1911 || strcmp (tn, "mthi") == 0)
1912 {
1913 min_nops = 1;
1914 }
1915
1916 }
1917 else if (strncmp(pn, "dmult", 5) == 0
1918 && (strncmp(tn, "dmult", 5) == 0
1919 || strncmp(tn, "dmacc", 5) == 0))
1920 {
1921 /* Here is the rest of errata 23. */
1922 min_nops = 1;
1923 }
1924 if (nops < min_nops)
1925 nops = min_nops;
1926 }
1927
1928 /* If we are being given a nop instruction, don't bother with
1929 one of the nops we would otherwise output. This will only
1930 happen when a nop instruction is used with mips_optimize set
1931 to 0. */
1932 if (nops > 0
1933 && ! mips_opts.noreorder
1934 && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1935 --nops;
1936
1937 /* Now emit the right number of NOP instructions. */
1938 if (nops > 0 && ! mips_opts.noreorder)
1939 {
1940 fragS *old_frag;
1941 unsigned long old_frag_offset;
1942 int i;
1943 struct insn_label_list *l;
1944
1945 old_frag = frag_now;
1946 old_frag_offset = frag_now_fix ();
1947
1948 for (i = 0; i < nops; i++)
1949 emit_nop ();
1950
1951 if (listing)
1952 {
1953 listing_prev_line ();
1954 /* We may be at the start of a variant frag. In case we
1955 are, make sure there is enough space for the frag
1956 after the frags created by listing_prev_line. The
1957 argument to frag_grow here must be at least as large
1958 as the argument to all other calls to frag_grow in
1959 this file. We don't have to worry about being in the
1960 middle of a variant frag, because the variants insert
1961 all needed nop instructions themselves. */
1962 frag_grow (40);
1963 }
1964
1965 for (l = insn_labels; l != NULL; l = l->next)
1966 {
1967 valueT val;
1968
1969 assert (S_GET_SEGMENT (l->label) == now_seg);
1970 symbol_set_frag (l->label, frag_now);
1971 val = (valueT) frag_now_fix ();
1972 /* mips16 text labels are stored as odd. */
1973 if (mips_opts.mips16)
1974 ++val;
1975 S_SET_VALUE (l->label, val);
1976 }
1977
1978 #ifndef NO_ECOFF_DEBUGGING
1979 if (ECOFF_DEBUGGING)
1980 ecoff_fix_loc (old_frag, old_frag_offset);
1981 #endif
1982 }
1983 else if (prev_nop_frag != NULL)
1984 {
1985 /* We have a frag holding nops we may be able to remove. If
1986 we don't need any nops, we can decrease the size of
1987 prev_nop_frag by the size of one instruction. If we do
1988 need some nops, we count them in prev_nops_required. */
1989 if (prev_nop_frag_since == 0)
1990 {
1991 if (nops == 0)
1992 {
1993 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1994 --prev_nop_frag_holds;
1995 }
1996 else
1997 prev_nop_frag_required += nops;
1998 }
1999 else
2000 {
2001 if (prev_prev_nop == 0)
2002 {
2003 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2004 --prev_nop_frag_holds;
2005 }
2006 else
2007 ++prev_nop_frag_required;
2008 }
2009
2010 if (prev_nop_frag_holds <= prev_nop_frag_required)
2011 prev_nop_frag = NULL;
2012
2013 ++prev_nop_frag_since;
2014
2015 /* Sanity check: by the time we reach the second instruction
2016 after prev_nop_frag, we should have used up all the nops
2017 one way or another. */
2018 assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2019 }
2020 }
2021
2022 if (place == NULL
2023 && address_expr
2024 && *reloc_type == BFD_RELOC_16_PCREL_S2
2025 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2026 || pinfo & INSN_COND_BRANCH_LIKELY)
2027 && mips_relax_branch
2028 /* Don't try branch relaxation within .set nomacro, or within
2029 .set noat if we use $at for PIC computations. If it turns
2030 out that the branch was out-of-range, we'll get an error. */
2031 && !mips_opts.warn_about_macros
2032 && !(mips_opts.noat && mips_pic != NO_PIC)
2033 && !mips_opts.mips16)
2034 {
2035 f = frag_var (rs_machine_dependent,
2036 relaxed_branch_length
2037 (NULL, NULL,
2038 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2039 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2040 RELAX_BRANCH_ENCODE
2041 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2042 pinfo & INSN_COND_BRANCH_LIKELY,
2043 pinfo & INSN_WRITE_GPR_31,
2044 0),
2045 address_expr->X_add_symbol,
2046 address_expr->X_add_number,
2047 0);
2048 *reloc_type = BFD_RELOC_UNUSED;
2049 }
2050 else if (*reloc_type > BFD_RELOC_UNUSED)
2051 {
2052 /* We need to set up a variant frag. */
2053 assert (mips_opts.mips16 && address_expr != NULL);
2054 f = frag_var (rs_machine_dependent, 4, 0,
2055 RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2056 mips16_small, mips16_ext,
2057 (prev_pinfo
2058 & INSN_UNCOND_BRANCH_DELAY),
2059 (*prev_insn_reloc_type
2060 == BFD_RELOC_MIPS16_JMP)),
2061 make_expr_symbol (address_expr), 0, NULL);
2062 }
2063 else if (place != NULL)
2064 f = place;
2065 else if (mips_opts.mips16
2066 && ! ip->use_extend
2067 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2068 {
2069 /* Make sure there is enough room to swap this instruction with
2070 a following jump instruction. */
2071 frag_grow (6);
2072 f = frag_more (2);
2073 }
2074 else
2075 {
2076 if (mips_opts.mips16
2077 && mips_opts.noreorder
2078 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2079 as_warn (_("extended instruction in delay slot"));
2080
2081 f = frag_more (4);
2082 }
2083
2084 fixp[0] = fixp[1] = fixp[2] = NULL;
2085 if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2086 {
2087 if (address_expr->X_op == O_constant)
2088 {
2089 valueT tmp;
2090
2091 switch (*reloc_type)
2092 {
2093 case BFD_RELOC_32:
2094 ip->insn_opcode |= address_expr->X_add_number;
2095 break;
2096
2097 case BFD_RELOC_MIPS_HIGHEST:
2098 tmp = (address_expr->X_add_number + 0x800080008000) >> 16;
2099 tmp >>= 16;
2100 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2101 break;
2102
2103 case BFD_RELOC_MIPS_HIGHER:
2104 tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2105 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2106 break;
2107
2108 case BFD_RELOC_HI16_S:
2109 ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2110 >> 16) & 0xffff;
2111 break;
2112
2113 case BFD_RELOC_HI16:
2114 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2115 break;
2116
2117 case BFD_RELOC_LO16:
2118 case BFD_RELOC_MIPS_GOT_DISP:
2119 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2120 break;
2121
2122 case BFD_RELOC_MIPS_JMP:
2123 if ((address_expr->X_add_number & 3) != 0)
2124 as_bad (_("jump to misaligned address (0x%lx)"),
2125 (unsigned long) address_expr->X_add_number);
2126 if (address_expr->X_add_number & ~0xfffffff)
2127 as_bad (_("jump address range overflow (0x%lx)"),
2128 (unsigned long) address_expr->X_add_number);
2129 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2130 break;
2131
2132 case BFD_RELOC_MIPS16_JMP:
2133 if ((address_expr->X_add_number & 3) != 0)
2134 as_bad (_("jump to misaligned address (0x%lx)"),
2135 (unsigned long) address_expr->X_add_number);
2136 if (address_expr->X_add_number & ~0xfffffff)
2137 as_bad (_("jump address range overflow (0x%lx)"),
2138 (unsigned long) address_expr->X_add_number);
2139 ip->insn_opcode |=
2140 (((address_expr->X_add_number & 0x7c0000) << 3)
2141 | ((address_expr->X_add_number & 0xf800000) >> 7)
2142 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2143 break;
2144
2145 case BFD_RELOC_16_PCREL_S2:
2146 goto need_reloc;
2147
2148 default:
2149 internalError ();
2150 }
2151 }
2152 else
2153 {
2154 need_reloc:
2155 /* Don't generate a reloc if we are writing into a variant frag. */
2156 if (place == NULL)
2157 {
2158 fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2159 address_expr,
2160 *reloc_type == BFD_RELOC_16_PCREL_S2,
2161 reloc_type[0]);
2162
2163 /* These relocations can have an addend that won't fit in
2164 4 octets for 64bit assembly. */
2165 if (HAVE_64BIT_GPRS &&
2166 (*reloc_type == BFD_RELOC_16
2167 || *reloc_type == BFD_RELOC_32
2168 || *reloc_type == BFD_RELOC_MIPS_JMP
2169 || *reloc_type == BFD_RELOC_HI16_S
2170 || *reloc_type == BFD_RELOC_LO16
2171 || *reloc_type == BFD_RELOC_GPREL16
2172 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2173 || *reloc_type == BFD_RELOC_GPREL32
2174 || *reloc_type == BFD_RELOC_64
2175 || *reloc_type == BFD_RELOC_CTOR
2176 || *reloc_type == BFD_RELOC_MIPS_SUB
2177 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2178 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2179 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2180 || *reloc_type == BFD_RELOC_MIPS_REL16
2181 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2182 fixp[0]->fx_no_overflow = 1;
2183
2184 if (reloc_needs_lo_p (*reloc_type))
2185 {
2186 struct mips_hi_fixup *hi_fixup;
2187
2188 /* Reuse the last entry if it already has a matching %lo. */
2189 hi_fixup = mips_hi_fixup_list;
2190 if (hi_fixup == 0
2191 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2192 {
2193 hi_fixup = ((struct mips_hi_fixup *)
2194 xmalloc (sizeof (struct mips_hi_fixup)));
2195 hi_fixup->next = mips_hi_fixup_list;
2196 mips_hi_fixup_list = hi_fixup;
2197 }
2198 hi_fixup->fixp = fixp[0];
2199 hi_fixup->seg = now_seg;
2200 }
2201
2202 if (reloc_type[1] != BFD_RELOC_UNUSED)
2203 {
2204 /* FIXME: This symbol can be one of
2205 RSS_UNDEF, RSS_GP, RSS_GP0, RSS_LOC. */
2206 address_expr->X_op = O_absent;
2207 address_expr->X_add_symbol = 0;
2208 address_expr->X_add_number = 0;
2209
2210 fixp[1] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2211 4, address_expr, FALSE,
2212 reloc_type[1]);
2213
2214 /* These relocations can have an addend that won't fit in
2215 4 octets for 64bit assembly. */
2216 if (HAVE_64BIT_GPRS &&
2217 (*reloc_type == BFD_RELOC_16
2218 || *reloc_type == BFD_RELOC_32
2219 || *reloc_type == BFD_RELOC_MIPS_JMP
2220 || *reloc_type == BFD_RELOC_HI16_S
2221 || *reloc_type == BFD_RELOC_LO16
2222 || *reloc_type == BFD_RELOC_GPREL16
2223 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2224 || *reloc_type == BFD_RELOC_GPREL32
2225 || *reloc_type == BFD_RELOC_64
2226 || *reloc_type == BFD_RELOC_CTOR
2227 || *reloc_type == BFD_RELOC_MIPS_SUB
2228 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2229 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2230 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2231 || *reloc_type == BFD_RELOC_MIPS_REL16
2232 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2233 fixp[1]->fx_no_overflow = 1;
2234
2235 if (reloc_type[2] != BFD_RELOC_UNUSED)
2236 {
2237 address_expr->X_op = O_absent;
2238 address_expr->X_add_symbol = 0;
2239 address_expr->X_add_number = 0;
2240
2241 fixp[2] = fix_new_exp (frag_now,
2242 f - frag_now->fr_literal, 4,
2243 address_expr, FALSE,
2244 reloc_type[2]);
2245
2246 /* These relocations can have an addend that won't fit in
2247 4 octets for 64bit assembly. */
2248 if (HAVE_64BIT_GPRS &&
2249 (*reloc_type == BFD_RELOC_16
2250 || *reloc_type == BFD_RELOC_32
2251 || *reloc_type == BFD_RELOC_MIPS_JMP
2252 || *reloc_type == BFD_RELOC_HI16_S
2253 || *reloc_type == BFD_RELOC_LO16
2254 || *reloc_type == BFD_RELOC_GPREL16
2255 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2256 || *reloc_type == BFD_RELOC_GPREL32
2257 || *reloc_type == BFD_RELOC_64
2258 || *reloc_type == BFD_RELOC_CTOR
2259 || *reloc_type == BFD_RELOC_MIPS_SUB
2260 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2261 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2262 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2263 || *reloc_type == BFD_RELOC_MIPS_REL16
2264 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2265 fixp[2]->fx_no_overflow = 1;
2266 }
2267 }
2268 }
2269 }
2270 }
2271
2272 if (! mips_opts.mips16)
2273 {
2274 md_number_to_chars (f, ip->insn_opcode, 4);
2275 #ifdef OBJ_ELF
2276 dwarf2_emit_insn (4);
2277 #endif
2278 }
2279 else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2280 {
2281 md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2282 md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2283 #ifdef OBJ_ELF
2284 dwarf2_emit_insn (4);
2285 #endif
2286 }
2287 else
2288 {
2289 if (ip->use_extend)
2290 {
2291 md_number_to_chars (f, 0xf000 | ip->extend, 2);
2292 f += 2;
2293 }
2294 md_number_to_chars (f, ip->insn_opcode, 2);
2295 #ifdef OBJ_ELF
2296 dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2297 #endif
2298 }
2299
2300 /* Update the register mask information. */
2301 if (! mips_opts.mips16)
2302 {
2303 if (pinfo & INSN_WRITE_GPR_D)
2304 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2305 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2306 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2307 if (pinfo & INSN_READ_GPR_S)
2308 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2309 if (pinfo & INSN_WRITE_GPR_31)
2310 mips_gprmask |= 1 << RA;
2311 if (pinfo & INSN_WRITE_FPR_D)
2312 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2313 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2314 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2315 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2316 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2317 if ((pinfo & INSN_READ_FPR_R) != 0)
2318 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2319 if (pinfo & INSN_COP)
2320 {
2321 /* We don't keep enough information to sort these cases out.
2322 The itbl support does keep this information however, although
2323 we currently don't support itbl fprmats as part of the cop
2324 instruction. May want to add this support in the future. */
2325 }
2326 /* Never set the bit for $0, which is always zero. */
2327 mips_gprmask &= ~1 << 0;
2328 }
2329 else
2330 {
2331 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2332 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2333 & MIPS16OP_MASK_RX);
2334 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2335 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2336 & MIPS16OP_MASK_RY);
2337 if (pinfo & MIPS16_INSN_WRITE_Z)
2338 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2339 & MIPS16OP_MASK_RZ);
2340 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2341 mips_gprmask |= 1 << TREG;
2342 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2343 mips_gprmask |= 1 << SP;
2344 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2345 mips_gprmask |= 1 << RA;
2346 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2347 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2348 if (pinfo & MIPS16_INSN_READ_Z)
2349 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2350 & MIPS16OP_MASK_MOVE32Z);
2351 if (pinfo & MIPS16_INSN_READ_GPR_X)
2352 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2353 & MIPS16OP_MASK_REGR32);
2354 }
2355
2356 if (place == NULL && ! mips_opts.noreorder)
2357 {
2358 /* Filling the branch delay slot is more complex. We try to
2359 switch the branch with the previous instruction, which we can
2360 do if the previous instruction does not set up a condition
2361 that the branch tests and if the branch is not itself the
2362 target of any branch. */
2363 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2364 || (pinfo & INSN_COND_BRANCH_DELAY))
2365 {
2366 if (mips_optimize < 2
2367 /* If we have seen .set volatile or .set nomove, don't
2368 optimize. */
2369 || mips_opts.nomove != 0
2370 /* If we had to emit any NOP instructions, then we
2371 already know we can not swap. */
2372 || nops != 0
2373 /* If we don't even know the previous insn, we can not
2374 swap. */
2375 || ! prev_insn_valid
2376 /* If the previous insn is already in a branch delay
2377 slot, then we can not swap. */
2378 || prev_insn_is_delay_slot
2379 /* If the previous previous insn was in a .set
2380 noreorder, we can't swap. Actually, the MIPS
2381 assembler will swap in this situation. However, gcc
2382 configured -with-gnu-as will generate code like
2383 .set noreorder
2384 lw $4,XXX
2385 .set reorder
2386 INSN
2387 bne $4,$0,foo
2388 in which we can not swap the bne and INSN. If gcc is
2389 not configured -with-gnu-as, it does not output the
2390 .set pseudo-ops. We don't have to check
2391 prev_insn_unreordered, because prev_insn_valid will
2392 be 0 in that case. We don't want to use
2393 prev_prev_insn_valid, because we do want to be able
2394 to swap at the start of a function. */
2395 || prev_prev_insn_unreordered
2396 /* If the branch is itself the target of a branch, we
2397 can not swap. We cheat on this; all we check for is
2398 whether there is a label on this instruction. If
2399 there are any branches to anything other than a
2400 label, users must use .set noreorder. */
2401 || insn_labels != NULL
2402 /* If the previous instruction is in a variant frag, we
2403 can not do the swap. This does not apply to the
2404 mips16, which uses variant frags for different
2405 purposes. */
2406 || (! mips_opts.mips16
2407 && prev_insn_frag->fr_type == rs_machine_dependent)
2408 /* If the branch reads the condition codes, we don't
2409 even try to swap, because in the sequence
2410 ctc1 $X,$31
2411 INSN
2412 INSN
2413 bc1t LABEL
2414 we can not swap, and I don't feel like handling that
2415 case. */
2416 || (! mips_opts.mips16
2417 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2418 && (pinfo & INSN_READ_COND_CODE))
2419 /* We can not swap with an instruction that requires a
2420 delay slot, becase the target of the branch might
2421 interfere with that instruction. */
2422 || (! mips_opts.mips16
2423 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2424 && (prev_pinfo
2425 /* Itbl support may require additional care here. */
2426 & (INSN_LOAD_COPROC_DELAY
2427 | INSN_COPROC_MOVE_DELAY
2428 | INSN_WRITE_COND_CODE)))
2429 || (! (hilo_interlocks
2430 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
2431 && (prev_pinfo
2432 & (INSN_READ_LO
2433 | INSN_READ_HI)))
2434 || (! mips_opts.mips16
2435 && ! gpr_interlocks
2436 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2437 || (! mips_opts.mips16
2438 && mips_opts.isa == ISA_MIPS1
2439 /* Itbl support may require additional care here. */
2440 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2441 /* We can not swap with a branch instruction. */
2442 || (prev_pinfo
2443 & (INSN_UNCOND_BRANCH_DELAY
2444 | INSN_COND_BRANCH_DELAY
2445 | INSN_COND_BRANCH_LIKELY))
2446 /* We do not swap with a trap instruction, since it
2447 complicates trap handlers to have the trap
2448 instruction be in a delay slot. */
2449 || (prev_pinfo & INSN_TRAP)
2450 /* If the branch reads a register that the previous
2451 instruction sets, we can not swap. */
2452 || (! mips_opts.mips16
2453 && (prev_pinfo & INSN_WRITE_GPR_T)
2454 && insn_uses_reg (ip,
2455 ((prev_insn.insn_opcode >> OP_SH_RT)
2456 & OP_MASK_RT),
2457 MIPS_GR_REG))
2458 || (! mips_opts.mips16
2459 && (prev_pinfo & INSN_WRITE_GPR_D)
2460 && insn_uses_reg (ip,
2461 ((prev_insn.insn_opcode >> OP_SH_RD)
2462 & OP_MASK_RD),
2463 MIPS_GR_REG))
2464 || (mips_opts.mips16
2465 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2466 && insn_uses_reg (ip,
2467 ((prev_insn.insn_opcode
2468 >> MIPS16OP_SH_RX)
2469 & MIPS16OP_MASK_RX),
2470 MIPS16_REG))
2471 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2472 && insn_uses_reg (ip,
2473 ((prev_insn.insn_opcode
2474 >> MIPS16OP_SH_RY)
2475 & MIPS16OP_MASK_RY),
2476 MIPS16_REG))
2477 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2478 && insn_uses_reg (ip,
2479 ((prev_insn.insn_opcode
2480 >> MIPS16OP_SH_RZ)
2481 & MIPS16OP_MASK_RZ),
2482 MIPS16_REG))
2483 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2484 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2485 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2486 && insn_uses_reg (ip, RA, MIPS_GR_REG))
2487 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2488 && insn_uses_reg (ip,
2489 MIPS16OP_EXTRACT_REG32R (prev_insn.
2490 insn_opcode),
2491 MIPS_GR_REG))))
2492 /* If the branch writes a register that the previous
2493 instruction sets, we can not swap (we know that
2494 branches write only to RD or to $31). */
2495 || (! mips_opts.mips16
2496 && (prev_pinfo & INSN_WRITE_GPR_T)
2497 && (((pinfo & INSN_WRITE_GPR_D)
2498 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2499 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2500 || ((pinfo & INSN_WRITE_GPR_31)
2501 && (((prev_insn.insn_opcode >> OP_SH_RT)
2502 & OP_MASK_RT)
2503 == RA))))
2504 || (! mips_opts.mips16
2505 && (prev_pinfo & INSN_WRITE_GPR_D)
2506 && (((pinfo & INSN_WRITE_GPR_D)
2507 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2508 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2509 || ((pinfo & INSN_WRITE_GPR_31)
2510 && (((prev_insn.insn_opcode >> OP_SH_RD)
2511 & OP_MASK_RD)
2512 == RA))))
2513 || (mips_opts.mips16
2514 && (pinfo & MIPS16_INSN_WRITE_31)
2515 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2516 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2517 && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2518 == RA))))
2519 /* If the branch writes a register that the previous
2520 instruction reads, we can not swap (we know that
2521 branches only write to RD or to $31). */
2522 || (! mips_opts.mips16
2523 && (pinfo & INSN_WRITE_GPR_D)
2524 && insn_uses_reg (&prev_insn,
2525 ((ip->insn_opcode >> OP_SH_RD)
2526 & OP_MASK_RD),
2527 MIPS_GR_REG))
2528 || (! mips_opts.mips16
2529 && (pinfo & INSN_WRITE_GPR_31)
2530 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2531 || (mips_opts.mips16
2532 && (pinfo & MIPS16_INSN_WRITE_31)
2533 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2534 /* If we are generating embedded PIC code, the branch
2535 might be expanded into a sequence which uses $at, so
2536 we can't swap with an instruction which reads it. */
2537 || (mips_pic == EMBEDDED_PIC
2538 && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2539 /* If the previous previous instruction has a load
2540 delay, and sets a register that the branch reads, we
2541 can not swap. */
2542 || (! mips_opts.mips16
2543 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2544 /* Itbl support may require additional care here. */
2545 && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2546 || (! gpr_interlocks
2547 && (prev_prev_insn.insn_mo->pinfo
2548 & INSN_LOAD_MEMORY_DELAY)))
2549 && insn_uses_reg (ip,
2550 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2551 & OP_MASK_RT),
2552 MIPS_GR_REG))
2553 /* If one instruction sets a condition code and the
2554 other one uses a condition code, we can not swap. */
2555 || ((pinfo & INSN_READ_COND_CODE)
2556 && (prev_pinfo & INSN_WRITE_COND_CODE))
2557 || ((pinfo & INSN_WRITE_COND_CODE)
2558 && (prev_pinfo & INSN_READ_COND_CODE))
2559 /* If the previous instruction uses the PC, we can not
2560 swap. */
2561 || (mips_opts.mips16
2562 && (prev_pinfo & MIPS16_INSN_READ_PC))
2563 /* If the previous instruction was extended, we can not
2564 swap. */
2565 || (mips_opts.mips16 && prev_insn_extended)
2566 /* If the previous instruction had a fixup in mips16
2567 mode, we can not swap. This normally means that the
2568 previous instruction was a 4 byte branch anyhow. */
2569 || (mips_opts.mips16 && prev_insn_fixp[0])
2570 /* If the previous instruction is a sync, sync.l, or
2571 sync.p, we can not swap. */
2572 || (prev_pinfo & INSN_SYNC))
2573 {
2574 /* We could do even better for unconditional branches to
2575 portions of this object file; we could pick up the
2576 instruction at the destination, put it in the delay
2577 slot, and bump the destination address. */
2578 emit_nop ();
2579 /* Update the previous insn information. */
2580 prev_prev_insn = *ip;
2581 prev_insn.insn_mo = &dummy_opcode;
2582 }
2583 else
2584 {
2585 /* It looks like we can actually do the swap. */
2586 if (! mips_opts.mips16)
2587 {
2588 char *prev_f;
2589 char temp[4];
2590
2591 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2592 memcpy (temp, prev_f, 4);
2593 memcpy (prev_f, f, 4);
2594 memcpy (f, temp, 4);
2595 if (prev_insn_fixp[0])
2596 {
2597 prev_insn_fixp[0]->fx_frag = frag_now;
2598 prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2599 }
2600 if (prev_insn_fixp[1])
2601 {
2602 prev_insn_fixp[1]->fx_frag = frag_now;
2603 prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2604 }
2605 if (prev_insn_fixp[2])
2606 {
2607 prev_insn_fixp[2]->fx_frag = frag_now;
2608 prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2609 }
2610 if (prev_insn_fixp[0] && HAVE_NEWABI
2611 && prev_insn_frag != frag_now
2612 && (prev_insn_fixp[0]->fx_r_type
2613 == BFD_RELOC_MIPS_GOT_DISP
2614 || (prev_insn_fixp[0]->fx_r_type
2615 == BFD_RELOC_MIPS_CALL16)))
2616 {
2617 /* To avoid confusion in tc_gen_reloc, we must
2618 ensure that this does not become a variant
2619 frag. */
2620 force_new_frag = TRUE;
2621 }
2622 if (fixp[0])
2623 {
2624 fixp[0]->fx_frag = prev_insn_frag;
2625 fixp[0]->fx_where = prev_insn_where;
2626 }
2627 if (fixp[1])
2628 {
2629 fixp[1]->fx_frag = prev_insn_frag;
2630 fixp[1]->fx_where = prev_insn_where;
2631 }
2632 if (fixp[2])
2633 {
2634 fixp[2]->fx_frag = prev_insn_frag;
2635 fixp[2]->fx_where = prev_insn_where;
2636 }
2637 }
2638 else
2639 {
2640 char *prev_f;
2641 char temp[2];
2642
2643 assert (prev_insn_fixp[0] == NULL);
2644 assert (prev_insn_fixp[1] == NULL);
2645 assert (prev_insn_fixp[2] == NULL);
2646 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2647 memcpy (temp, prev_f, 2);
2648 memcpy (prev_f, f, 2);
2649 if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2650 {
2651 assert (*reloc_type == BFD_RELOC_UNUSED);
2652 memcpy (f, temp, 2);
2653 }
2654 else
2655 {
2656 memcpy (f, f + 2, 2);
2657 memcpy (f + 2, temp, 2);
2658 }
2659 if (fixp[0])
2660 {
2661 fixp[0]->fx_frag = prev_insn_frag;
2662 fixp[0]->fx_where = prev_insn_where;
2663 }
2664 if (fixp[1])
2665 {
2666 fixp[1]->fx_frag = prev_insn_frag;
2667 fixp[1]->fx_where = prev_insn_where;
2668 }
2669 if (fixp[2])
2670 {
2671 fixp[2]->fx_frag = prev_insn_frag;
2672 fixp[2]->fx_where = prev_insn_where;
2673 }
2674 }
2675
2676 /* Update the previous insn information; leave prev_insn
2677 unchanged. */
2678 prev_prev_insn = *ip;
2679 }
2680 prev_insn_is_delay_slot = 1;
2681
2682 /* If that was an unconditional branch, forget the previous
2683 insn information. */
2684 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2685 {
2686 prev_prev_insn.insn_mo = &dummy_opcode;
2687 prev_insn.insn_mo = &dummy_opcode;
2688 }
2689
2690 prev_insn_fixp[0] = NULL;
2691 prev_insn_fixp[1] = NULL;
2692 prev_insn_fixp[2] = NULL;
2693 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2694 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2695 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2696 prev_insn_extended = 0;
2697 }
2698 else if (pinfo & INSN_COND_BRANCH_LIKELY)
2699 {
2700 /* We don't yet optimize a branch likely. What we should do
2701 is look at the target, copy the instruction found there
2702 into the delay slot, and increment the branch to jump to
2703 the next instruction. */
2704 emit_nop ();
2705 /* Update the previous insn information. */
2706 prev_prev_insn = *ip;
2707 prev_insn.insn_mo = &dummy_opcode;
2708 prev_insn_fixp[0] = NULL;
2709 prev_insn_fixp[1] = NULL;
2710 prev_insn_fixp[2] = NULL;
2711 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2712 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2713 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2714 prev_insn_extended = 0;
2715 }
2716 else
2717 {
2718 /* Update the previous insn information. */
2719 if (nops > 0)
2720 prev_prev_insn.insn_mo = &dummy_opcode;
2721 else
2722 prev_prev_insn = prev_insn;
2723 prev_insn = *ip;
2724
2725 /* Any time we see a branch, we always fill the delay slot
2726 immediately; since this insn is not a branch, we know it
2727 is not in a delay slot. */
2728 prev_insn_is_delay_slot = 0;
2729
2730 prev_insn_fixp[0] = fixp[0];
2731 prev_insn_fixp[1] = fixp[1];
2732 prev_insn_fixp[2] = fixp[2];
2733 prev_insn_reloc_type[0] = reloc_type[0];
2734 prev_insn_reloc_type[1] = reloc_type[1];
2735 prev_insn_reloc_type[2] = reloc_type[2];
2736 if (mips_opts.mips16)
2737 prev_insn_extended = (ip->use_extend
2738 || *reloc_type > BFD_RELOC_UNUSED);
2739 }
2740
2741 prev_prev_insn_unreordered = prev_insn_unreordered;
2742 prev_insn_unreordered = 0;
2743 prev_insn_frag = frag_now;
2744 prev_insn_where = f - frag_now->fr_literal;
2745 prev_insn_valid = 1;
2746 }
2747 else if (place == NULL)
2748 {
2749 /* We need to record a bit of information even when we are not
2750 reordering, in order to determine the base address for mips16
2751 PC relative relocs. */
2752 prev_prev_insn = prev_insn;
2753 prev_insn = *ip;
2754 prev_insn_reloc_type[0] = reloc_type[0];
2755 prev_insn_reloc_type[1] = reloc_type[1];
2756 prev_insn_reloc_type[2] = reloc_type[2];
2757 prev_prev_insn_unreordered = prev_insn_unreordered;
2758 prev_insn_unreordered = 1;
2759 }
2760
2761 /* We just output an insn, so the next one doesn't have a label. */
2762 mips_clear_insn_labels ();
2763
2764 /* We must ensure that the frag to which an instruction that was
2765 moved from a non-variant frag doesn't become a variant frag,
2766 otherwise tc_gen_reloc may get confused. */
2767 if (force_new_frag)
2768 {
2769 frag_wane (frag_now);
2770 frag_new (0);
2771 }
2772 }
2773
2774 /* This function forgets that there was any previous instruction or
2775 label. If PRESERVE is non-zero, it remembers enough information to
2776 know whether nops are needed before a noreorder section. */
2777
2778 static void
2779 mips_no_prev_insn (preserve)
2780 int preserve;
2781 {
2782 if (! preserve)
2783 {
2784 prev_insn.insn_mo = &dummy_opcode;
2785 prev_prev_insn.insn_mo = &dummy_opcode;
2786 prev_nop_frag = NULL;
2787 prev_nop_frag_holds = 0;
2788 prev_nop_frag_required = 0;
2789 prev_nop_frag_since = 0;
2790 }
2791 prev_insn_valid = 0;
2792 prev_insn_is_delay_slot = 0;
2793 prev_insn_unreordered = 0;
2794 prev_insn_extended = 0;
2795 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2796 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2797 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2798 prev_prev_insn_unreordered = 0;
2799 mips_clear_insn_labels ();
2800 }
2801
2802 /* This function must be called whenever we turn on noreorder or emit
2803 something other than instructions. It inserts any NOPS which might
2804 be needed by the previous instruction, and clears the information
2805 kept for the previous instructions. The INSNS parameter is true if
2806 instructions are to follow. */
2807
2808 static void
2809 mips_emit_delays (insns)
2810 bfd_boolean insns;
2811 {
2812 if (! mips_opts.noreorder)
2813 {
2814 int nops;
2815
2816 nops = 0;
2817 if ((! mips_opts.mips16
2818 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2819 && (! cop_interlocks
2820 && (prev_insn.insn_mo->pinfo
2821 & (INSN_LOAD_COPROC_DELAY
2822 | INSN_COPROC_MOVE_DELAY
2823 | INSN_WRITE_COND_CODE))))
2824 || (! hilo_interlocks
2825 && (prev_insn.insn_mo->pinfo
2826 & (INSN_READ_LO
2827 | INSN_READ_HI)))
2828 || (! mips_opts.mips16
2829 && ! gpr_interlocks
2830 && (prev_insn.insn_mo->pinfo
2831 & INSN_LOAD_MEMORY_DELAY))
2832 || (! mips_opts.mips16
2833 && mips_opts.isa == ISA_MIPS1
2834 && (prev_insn.insn_mo->pinfo
2835 & INSN_COPROC_MEMORY_DELAY)))
2836 {
2837 /* Itbl support may require additional care here. */
2838 ++nops;
2839 if ((! mips_opts.mips16
2840 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2841 && (! cop_interlocks
2842 && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2843 || (! hilo_interlocks
2844 && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2845 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2846 ++nops;
2847
2848 if (prev_insn_unreordered)
2849 nops = 0;
2850 }
2851 else if ((! mips_opts.mips16
2852 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2853 && (! cop_interlocks
2854 && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2855 || (! hilo_interlocks
2856 && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2857 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2858 {
2859 /* Itbl support may require additional care here. */
2860 if (! prev_prev_insn_unreordered)
2861 ++nops;
2862 }
2863
2864 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
2865 {
2866 int min_nops = 0;
2867 const char *pn = prev_insn.insn_mo->name;
2868 if (strncmp(pn, "macc", 4) == 0
2869 || strncmp(pn, "dmacc", 5) == 0
2870 || strncmp(pn, "dmult", 5) == 0)
2871 {
2872 min_nops = 1;
2873 }
2874 if (nops < min_nops)
2875 nops = min_nops;
2876 }
2877
2878 if (nops > 0)
2879 {
2880 struct insn_label_list *l;
2881
2882 if (insns)
2883 {
2884 /* Record the frag which holds the nop instructions, so
2885 that we can remove them if we don't need them. */
2886 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2887 prev_nop_frag = frag_now;
2888 prev_nop_frag_holds = nops;
2889 prev_nop_frag_required = 0;
2890 prev_nop_frag_since = 0;
2891 }
2892
2893 for (; nops > 0; --nops)
2894 emit_nop ();
2895
2896 if (insns)
2897 {
2898 /* Move on to a new frag, so that it is safe to simply
2899 decrease the size of prev_nop_frag. */
2900 frag_wane (frag_now);
2901 frag_new (0);
2902 }
2903
2904 for (l = insn_labels; l != NULL; l = l->next)
2905 {
2906 valueT val;
2907
2908 assert (S_GET_SEGMENT (l->label) == now_seg);
2909 symbol_set_frag (l->label, frag_now);
2910 val = (valueT) frag_now_fix ();
2911 /* mips16 text labels are stored as odd. */
2912 if (mips_opts.mips16)
2913 ++val;
2914 S_SET_VALUE (l->label, val);
2915 }
2916 }
2917 }
2918
2919 /* Mark instruction labels in mips16 mode. */
2920 if (insns)
2921 mips16_mark_labels ();
2922
2923 mips_no_prev_insn (insns);
2924 }
2925
2926 /* Build an instruction created by a macro expansion. This is passed
2927 a pointer to the count of instructions created so far, an
2928 expression, the name of the instruction to build, an operand format
2929 string, and corresponding arguments. */
2930
2931 #ifdef USE_STDARG
2932 static void
2933 macro_build (char *place,
2934 int *counter,
2935 expressionS * ep,
2936 const char *name,
2937 const char *fmt,
2938 ...)
2939 #else
2940 static void
2941 macro_build (place, counter, ep, name, fmt, va_alist)
2942 char *place;
2943 int *counter;
2944 expressionS *ep;
2945 const char *name;
2946 const char *fmt;
2947 va_dcl
2948 #endif
2949 {
2950 struct mips_cl_insn insn;
2951 bfd_reloc_code_real_type r[3];
2952 va_list args;
2953
2954 #ifdef USE_STDARG
2955 va_start (args, fmt);
2956 #else
2957 va_start (args);
2958 #endif
2959
2960 /*
2961 * If the macro is about to expand into a second instruction,
2962 * print a warning if needed. We need to pass ip as a parameter
2963 * to generate a better warning message here...
2964 */
2965 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2966 as_warn (_("Macro instruction expanded into multiple instructions"));
2967
2968 /*
2969 * If the macro is about to expand into a second instruction,
2970 * and it is in a delay slot, print a warning.
2971 */
2972 if (place == NULL
2973 && *counter == 1
2974 && mips_opts.noreorder
2975 && (prev_prev_insn.insn_mo->pinfo
2976 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY
2977 | INSN_COND_BRANCH_LIKELY)) != 0)
2978 as_warn (_("Macro instruction expanded into multiple instructions in a branch delay slot"));
2979
2980 if (place == NULL)
2981 ++*counter; /* bump instruction counter */
2982
2983 if (mips_opts.mips16)
2984 {
2985 mips16_macro_build (place, counter, ep, name, fmt, args);
2986 va_end (args);
2987 return;
2988 }
2989
2990 r[0] = BFD_RELOC_UNUSED;
2991 r[1] = BFD_RELOC_UNUSED;
2992 r[2] = BFD_RELOC_UNUSED;
2993 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2994 assert (insn.insn_mo);
2995 assert (strcmp (name, insn.insn_mo->name) == 0);
2996
2997 /* Search until we get a match for NAME. */
2998 while (1)
2999 {
3000 /* It is assumed here that macros will never generate
3001 MDMX or MIPS-3D instructions. */
3002 if (strcmp (fmt, insn.insn_mo->args) == 0
3003 && insn.insn_mo->pinfo != INSN_MACRO
3004 && OPCODE_IS_MEMBER (insn.insn_mo,
3005 (mips_opts.isa
3006 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3007 mips_arch)
3008 && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
3009 break;
3010
3011 ++insn.insn_mo;
3012 assert (insn.insn_mo->name);
3013 assert (strcmp (name, insn.insn_mo->name) == 0);
3014 }
3015
3016 insn.insn_opcode = insn.insn_mo->match;
3017 for (;;)
3018 {
3019 switch (*fmt++)
3020 {
3021 case '\0':
3022 break;
3023
3024 case ',':
3025 case '(':
3026 case ')':
3027 continue;
3028
3029 case 't':
3030 case 'w':
3031 case 'E':
3032 insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3033 continue;
3034
3035 case 'c':
3036 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3037 continue;
3038
3039 case 'T':
3040 case 'W':
3041 insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3042 continue;
3043
3044 case 'd':
3045 case 'G':
3046 case 'K':
3047 insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3048 continue;
3049
3050 case 'U':
3051 {
3052 int tmp = va_arg (args, int);
3053
3054 insn.insn_opcode |= tmp << OP_SH_RT;
3055 insn.insn_opcode |= tmp << OP_SH_RD;
3056 continue;
3057 }
3058
3059 case 'V':
3060 case 'S':
3061 insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3062 continue;
3063
3064 case 'z':
3065 continue;
3066
3067 case '<':
3068 insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3069 continue;
3070
3071 case 'D':
3072 insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3073 continue;
3074
3075 case 'B':
3076 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3077 continue;
3078
3079 case 'J':
3080 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3081 continue;
3082
3083 case 'q':
3084 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3085 continue;
3086
3087 case 'b':
3088 case 's':
3089 case 'r':
3090 case 'v':
3091 insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3092 continue;
3093
3094 case 'i':
3095 case 'j':
3096 case 'o':
3097 *r = (bfd_reloc_code_real_type) va_arg (args, int);
3098 assert (*r == BFD_RELOC_GPREL16
3099 || *r == BFD_RELOC_MIPS_LITERAL
3100 || *r == BFD_RELOC_MIPS_HIGHER
3101 || *r == BFD_RELOC_HI16_S
3102 || *r == BFD_RELOC_LO16
3103 || *r == BFD_RELOC_MIPS_GOT16
3104 || *r == BFD_RELOC_MIPS_CALL16
3105 || *r == BFD_RELOC_MIPS_GOT_DISP
3106 || *r == BFD_RELOC_MIPS_GOT_PAGE
3107 || *r == BFD_RELOC_MIPS_GOT_OFST
3108 || *r == BFD_RELOC_MIPS_GOT_LO16
3109 || *r == BFD_RELOC_MIPS_CALL_LO16
3110 || (ep->X_op == O_subtract
3111 && *r == BFD_RELOC_PCREL_LO16));
3112 continue;
3113
3114 case 'u':
3115 *r = (bfd_reloc_code_real_type) va_arg (args, int);
3116 assert (ep != NULL
3117 && (ep->X_op == O_constant
3118 || (ep->X_op == O_symbol
3119 && (*r == BFD_RELOC_MIPS_HIGHEST
3120 || *r == BFD_RELOC_HI16_S
3121 || *r == BFD_RELOC_HI16
3122 || *r == BFD_RELOC_GPREL16
3123 || *r == BFD_RELOC_MIPS_GOT_HI16
3124 || *r == BFD_RELOC_MIPS_CALL_HI16))
3125 || (ep->X_op == O_subtract
3126 && *r == BFD_RELOC_PCREL_HI16_S)));
3127 continue;
3128
3129 case 'p':
3130 assert (ep != NULL);
3131 /*
3132 * This allows macro() to pass an immediate expression for
3133 * creating short branches without creating a symbol.
3134 * Note that the expression still might come from the assembly
3135 * input, in which case the value is not checked for range nor
3136 * is a relocation entry generated (yuck).
3137 */
3138 if (ep->X_op == O_constant)
3139 {
3140 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3141 ep = NULL;
3142 }
3143 else
3144 *r = BFD_RELOC_16_PCREL_S2;
3145 continue;
3146
3147 case 'a':
3148 assert (ep != NULL);
3149 *r = BFD_RELOC_MIPS_JMP;
3150 continue;
3151
3152 case 'C':
3153 insn.insn_opcode |= va_arg (args, unsigned long);
3154 continue;
3155
3156 default:
3157 internalError ();
3158 }
3159 break;
3160 }
3161 va_end (args);
3162 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3163
3164 append_insn (place, &insn, ep, r);
3165 }
3166
3167 static void
3168 mips16_macro_build (place, counter, ep, name, fmt, args)
3169 char *place;
3170 int *counter ATTRIBUTE_UNUSED;
3171 expressionS *ep;
3172 const char *name;
3173 const char *fmt;
3174 va_list args;
3175 {
3176 struct mips_cl_insn insn;
3177 bfd_reloc_code_real_type r[3]
3178 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3179
3180 insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3181 assert (insn.insn_mo);
3182 assert (strcmp (name, insn.insn_mo->name) == 0);
3183
3184 while (strcmp (fmt, insn.insn_mo->args) != 0
3185 || insn.insn_mo->pinfo == INSN_MACRO)
3186 {
3187 ++insn.insn_mo;
3188 assert (insn.insn_mo->name);
3189 assert (strcmp (name, insn.insn_mo->name) == 0);
3190 }
3191
3192 insn.insn_opcode = insn.insn_mo->match;
3193 insn.use_extend = FALSE;
3194
3195 for (;;)
3196 {
3197 int c;
3198
3199 c = *fmt++;
3200 switch (c)
3201 {
3202 case '\0':
3203 break;
3204
3205 case ',':
3206 case '(':
3207 case ')':
3208 continue;
3209
3210 case 'y':
3211 case 'w':
3212 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3213 continue;
3214
3215 case 'x':
3216 case 'v':
3217 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3218 continue;
3219
3220 case 'z':
3221 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3222 continue;
3223
3224 case 'Z':
3225 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3226 continue;
3227
3228 case '0':
3229 case 'S':
3230 case 'P':
3231 case 'R':
3232 continue;
3233
3234 case 'X':
3235 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3236 continue;
3237
3238 case 'Y':
3239 {
3240 int regno;
3241
3242 regno = va_arg (args, int);
3243 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3244 insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3245 }
3246 continue;
3247
3248 case '<':
3249 case '>':
3250 case '4':
3251 case '5':
3252 case 'H':
3253 case 'W':
3254 case 'D':
3255 case 'j':
3256 case '8':
3257 case 'V':
3258 case 'C':
3259 case 'U':
3260 case 'k':
3261 case 'K':
3262 case 'p':
3263 case 'q':
3264 {
3265 assert (ep != NULL);
3266
3267 if (ep->X_op != O_constant)
3268 *r = (int) BFD_RELOC_UNUSED + c;
3269 else
3270 {
3271 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3272 FALSE, &insn.insn_opcode, &insn.use_extend,
3273 &insn.extend);
3274 ep = NULL;
3275 *r = BFD_RELOC_UNUSED;
3276 }
3277 }
3278 continue;
3279
3280 case '6':
3281 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3282 continue;
3283 }
3284
3285 break;
3286 }
3287
3288 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3289
3290 append_insn (place, &insn, ep, r);
3291 }
3292
3293 /*
3294 * Generate a "jalr" instruction with a relocation hint to the called
3295 * function. This occurs in NewABI PIC code.
3296 */
3297 static void
3298 macro_build_jalr (icnt, ep)
3299 int icnt;
3300 expressionS *ep;
3301 {
3302 char *f;
3303
3304 if (HAVE_NEWABI)
3305 {
3306 frag_grow (4);
3307 f = frag_more (0);
3308 }
3309 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr", "d,s",
3310 RA, PIC_CALL_REG);
3311 if (HAVE_NEWABI)
3312 fix_new_exp (frag_now, f - frag_now->fr_literal,
3313 0, ep, FALSE, BFD_RELOC_MIPS_JALR);
3314 }
3315
3316 /*
3317 * Generate a "lui" instruction.
3318 */
3319 static void
3320 macro_build_lui (place, counter, ep, regnum)
3321 char *place;
3322 int *counter;
3323 expressionS *ep;
3324 int regnum;
3325 {
3326 expressionS high_expr;
3327 struct mips_cl_insn insn;
3328 bfd_reloc_code_real_type r[3]
3329 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3330 const char *name = "lui";
3331 const char *fmt = "t,u";
3332
3333 assert (! mips_opts.mips16);
3334
3335 if (place == NULL)
3336 high_expr = *ep;
3337 else
3338 {
3339 high_expr.X_op = O_constant;
3340 high_expr.X_add_number = ep->X_add_number;
3341 }
3342
3343 if (high_expr.X_op == O_constant)
3344 {
3345 /* we can compute the instruction now without a relocation entry */
3346 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3347 >> 16) & 0xffff;
3348 *r = BFD_RELOC_UNUSED;
3349 }
3350 else
3351 {
3352 assert (ep->X_op == O_symbol);
3353 /* _gp_disp is a special case, used from s_cpload. */
3354 assert (mips_pic == NO_PIC
3355 || (! HAVE_NEWABI
3356 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3357 *r = BFD_RELOC_HI16_S;
3358 }
3359
3360 /*
3361 * If the macro is about to expand into a second instruction,
3362 * print a warning if needed. We need to pass ip as a parameter
3363 * to generate a better warning message here...
3364 */
3365 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
3366 as_warn (_("Macro instruction expanded into multiple instructions"));
3367
3368 if (place == NULL)
3369 ++*counter; /* bump instruction counter */
3370
3371 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3372 assert (insn.insn_mo);
3373 assert (strcmp (name, insn.insn_mo->name) == 0);
3374 assert (strcmp (fmt, insn.insn_mo->args) == 0);
3375
3376 insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3377 if (*r == BFD_RELOC_UNUSED)
3378 {
3379 insn.insn_opcode |= high_expr.X_add_number;
3380 append_insn (place, &insn, NULL, r);
3381 }
3382 else
3383 append_insn (place, &insn, &high_expr, r);
3384 }
3385
3386 /* Generate a sequence of instructions to do a load or store from a constant
3387 offset off of a base register (breg) into/from a target register (treg),
3388 using AT if necessary. */
3389 static void
3390 macro_build_ldst_constoffset (place, counter, ep, op, treg, breg)
3391 char *place;
3392 int *counter;
3393 expressionS *ep;
3394 const char *op;
3395 int treg, breg;
3396 {
3397 assert (ep->X_op == O_constant);
3398
3399 /* Right now, this routine can only handle signed 32-bit contants. */
3400 if (! IS_SEXT_32BIT_NUM(ep->X_add_number))
3401 as_warn (_("operand overflow"));
3402
3403 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3404 {
3405 /* Signed 16-bit offset will fit in the op. Easy! */
3406 macro_build (place, counter, ep, op, "t,o(b)", treg,
3407 (int) BFD_RELOC_LO16, breg);
3408 }
3409 else
3410 {
3411 /* 32-bit offset, need multiple instructions and AT, like:
3412 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3413 addu $tempreg,$tempreg,$breg
3414 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3415 to handle the complete offset. */
3416 macro_build_lui (place, counter, ep, AT);
3417 if (place != NULL)
3418 place += 4;
3419 macro_build (place, counter, (expressionS *) NULL,
3420 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3421 ? "add" : "addu" : "daddu",
3422 "d,v,t", AT, AT, breg);
3423 if (place != NULL)
3424 place += 4;
3425 macro_build (place, counter, ep, op, "t,o(b)", treg,
3426 (int) BFD_RELOC_LO16, AT);
3427
3428 if (mips_opts.noat)
3429 as_warn (_("Macro used $at after \".set noat\""));
3430 }
3431 }
3432
3433 /* set_at()
3434 * Generates code to set the $at register to true (one)
3435 * if reg is less than the immediate expression.
3436 */
3437 static void
3438 set_at (counter, reg, unsignedp)
3439 int *counter;
3440 int reg;
3441 int unsignedp;
3442 {
3443 if (imm_expr.X_op == O_constant
3444 && imm_expr.X_add_number >= -0x8000
3445 && imm_expr.X_add_number < 0x8000)
3446 macro_build ((char *) NULL, counter, &imm_expr,
3447 unsignedp ? "sltiu" : "slti",
3448 "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
3449 else
3450 {
3451 load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
3452 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3453 unsignedp ? "sltu" : "slt",
3454 "d,v,t", AT, reg, AT);
3455 }
3456 }
3457
3458 /* Warn if an expression is not a constant. */
3459
3460 static void
3461 check_absolute_expr (ip, ex)
3462 struct mips_cl_insn *ip;
3463 expressionS *ex;
3464 {
3465 if (ex->X_op == O_big)
3466 as_bad (_("unsupported large constant"));
3467 else if (ex->X_op != O_constant)
3468 as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3469 }
3470
3471 /* Count the leading zeroes by performing a binary chop. This is a
3472 bulky bit of source, but performance is a LOT better for the
3473 majority of values than a simple loop to count the bits:
3474 for (lcnt = 0; (lcnt < 32); lcnt++)
3475 if ((v) & (1 << (31 - lcnt)))
3476 break;
3477 However it is not code size friendly, and the gain will drop a bit
3478 on certain cached systems.
3479 */
3480 #define COUNT_TOP_ZEROES(v) \
3481 (((v) & ~0xffff) == 0 \
3482 ? ((v) & ~0xff) == 0 \
3483 ? ((v) & ~0xf) == 0 \
3484 ? ((v) & ~0x3) == 0 \
3485 ? ((v) & ~0x1) == 0 \
3486 ? !(v) \
3487 ? 32 \
3488 : 31 \
3489 : 30 \
3490 : ((v) & ~0x7) == 0 \
3491 ? 29 \
3492 : 28 \
3493 : ((v) & ~0x3f) == 0 \
3494 ? ((v) & ~0x1f) == 0 \
3495 ? 27 \
3496 : 26 \
3497 : ((v) & ~0x7f) == 0 \
3498 ? 25 \
3499 : 24 \
3500 : ((v) & ~0xfff) == 0 \
3501 ? ((v) & ~0x3ff) == 0 \
3502 ? ((v) & ~0x1ff) == 0 \
3503 ? 23 \
3504 : 22 \
3505 : ((v) & ~0x7ff) == 0 \
3506 ? 21 \
3507 : 20 \
3508 : ((v) & ~0x3fff) == 0 \
3509 ? ((v) & ~0x1fff) == 0 \
3510 ? 19 \
3511 : 18 \
3512 : ((v) & ~0x7fff) == 0 \
3513 ? 17 \
3514 : 16 \
3515 : ((v) & ~0xffffff) == 0 \
3516 ? ((v) & ~0xfffff) == 0 \
3517 ? ((v) & ~0x3ffff) == 0 \
3518 ? ((v) & ~0x1ffff) == 0 \
3519 ? 15 \
3520 : 14 \
3521 : ((v) & ~0x7ffff) == 0 \
3522 ? 13 \
3523 : 12 \
3524 : ((v) & ~0x3fffff) == 0 \
3525 ? ((v) & ~0x1fffff) == 0 \
3526 ? 11 \
3527 : 10 \
3528 : ((v) & ~0x7fffff) == 0 \
3529 ? 9 \
3530 : 8 \
3531 : ((v) & ~0xfffffff) == 0 \
3532 ? ((v) & ~0x3ffffff) == 0 \
3533 ? ((v) & ~0x1ffffff) == 0 \
3534 ? 7 \
3535 : 6 \
3536 : ((v) & ~0x7ffffff) == 0 \
3537 ? 5 \
3538 : 4 \
3539 : ((v) & ~0x3fffffff) == 0 \
3540 ? ((v) & ~0x1fffffff) == 0 \
3541 ? 3 \
3542 : 2 \
3543 : ((v) & ~0x7fffffff) == 0 \
3544 ? 1 \
3545 : 0)
3546
3547 /* load_register()
3548 * This routine generates the least number of instructions neccessary to load
3549 * an absolute expression value into a register.
3550 */
3551 static void
3552 load_register (counter, reg, ep, dbl)
3553 int *counter;
3554 int reg;
3555 expressionS *ep;
3556 int dbl;
3557 {
3558 int freg;
3559 expressionS hi32, lo32;
3560
3561 if (ep->X_op != O_big)
3562 {
3563 assert (ep->X_op == O_constant);
3564 if (ep->X_add_number < 0x8000
3565 && (ep->X_add_number >= 0
3566 || (ep->X_add_number >= -0x8000
3567 && (! dbl
3568 || ! ep->X_unsigned
3569 || sizeof (ep->X_add_number) > 4))))
3570 {
3571 /* We can handle 16 bit signed values with an addiu to
3572 $zero. No need to ever use daddiu here, since $zero and
3573 the result are always correct in 32 bit mode. */
3574 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3575 (int) BFD_RELOC_LO16);
3576 return;
3577 }
3578 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3579 {
3580 /* We can handle 16 bit unsigned values with an ori to
3581 $zero. */
3582 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3583 (int) BFD_RELOC_LO16);
3584 return;
3585 }
3586 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)
3587 && (! dbl
3588 || ! ep->X_unsigned
3589 || sizeof (ep->X_add_number) > 4
3590 || (ep->X_add_number & 0x80000000) == 0))
3591 || ((HAVE_32BIT_GPRS || ! dbl)
3592 && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
3593 || (HAVE_32BIT_GPRS
3594 && ! dbl
3595 && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3596 == ~ (offsetT) 0xffffffff)))
3597 {
3598 /* 32 bit values require an lui. */
3599 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3600 (int) BFD_RELOC_HI16);
3601 if ((ep->X_add_number & 0xffff) != 0)
3602 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3603 (int) BFD_RELOC_LO16);
3604 return;
3605 }
3606 }
3607
3608 /* The value is larger than 32 bits. */
3609
3610 if (HAVE_32BIT_GPRS)
3611 {
3612 as_bad (_("Number (0x%lx) larger than 32 bits"),
3613 (unsigned long) ep->X_add_number);
3614 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3615 (int) BFD_RELOC_LO16);
3616 return;
3617 }
3618
3619 if (ep->X_op != O_big)
3620 {
3621 hi32 = *ep;
3622 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3623 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3624 hi32.X_add_number &= 0xffffffff;
3625 lo32 = *ep;
3626 lo32.X_add_number &= 0xffffffff;
3627 }
3628 else
3629 {
3630 assert (ep->X_add_number > 2);
3631 if (ep->X_add_number == 3)
3632 generic_bignum[3] = 0;
3633 else if (ep->X_add_number > 4)
3634 as_bad (_("Number larger than 64 bits"));
3635 lo32.X_op = O_constant;
3636 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3637 hi32.X_op = O_constant;
3638 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3639 }
3640
3641 if (hi32.X_add_number == 0)
3642 freg = 0;
3643 else
3644 {
3645 int shift, bit;
3646 unsigned long hi, lo;
3647
3648 if (hi32.X_add_number == (offsetT) 0xffffffff)
3649 {
3650 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3651 {
3652 macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
3653 reg, 0, (int) BFD_RELOC_LO16);
3654 return;
3655 }
3656 if (lo32.X_add_number & 0x80000000)
3657 {
3658 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3659 (int) BFD_RELOC_HI16);
3660 if (lo32.X_add_number & 0xffff)
3661 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3662 reg, reg, (int) BFD_RELOC_LO16);
3663 return;
3664 }
3665 }
3666
3667 /* Check for 16bit shifted constant. We know that hi32 is
3668 non-zero, so start the mask on the first bit of the hi32
3669 value. */
3670 shift = 17;
3671 do
3672 {
3673 unsigned long himask, lomask;
3674
3675 if (shift < 32)
3676 {
3677 himask = 0xffff >> (32 - shift);
3678 lomask = (0xffff << shift) & 0xffffffff;
3679 }
3680 else
3681 {
3682 himask = 0xffff << (shift - 32);
3683 lomask = 0;
3684 }
3685 if ((hi32.X_add_number & ~(offsetT) himask) == 0
3686 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3687 {
3688 expressionS tmp;
3689
3690 tmp.X_op = O_constant;
3691 if (shift < 32)
3692 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3693 | (lo32.X_add_number >> shift));
3694 else
3695 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3696 macro_build ((char *) NULL, counter, &tmp,
3697 "ori", "t,r,i", reg, 0,
3698 (int) BFD_RELOC_LO16);
3699 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3700 (shift >= 32) ? "dsll32" : "dsll",
3701 "d,w,<", reg, reg,
3702 (shift >= 32) ? shift - 32 : shift);
3703 return;
3704 }
3705 ++shift;
3706 }
3707 while (shift <= (64 - 16));
3708
3709 /* Find the bit number of the lowest one bit, and store the
3710 shifted value in hi/lo. */
3711 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3712 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3713 if (lo != 0)
3714 {
3715 bit = 0;
3716 while ((lo & 1) == 0)
3717 {
3718 lo >>= 1;
3719 ++bit;
3720 }
3721 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3722 hi >>= bit;
3723 }
3724 else
3725 {
3726 bit = 32;
3727 while ((hi & 1) == 0)
3728 {
3729 hi >>= 1;
3730 ++bit;
3731 }
3732 lo = hi;
3733 hi = 0;
3734 }
3735
3736 /* Optimize if the shifted value is a (power of 2) - 1. */
3737 if ((hi == 0 && ((lo + 1) & lo) == 0)
3738 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3739 {
3740 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3741 if (shift != 0)
3742 {
3743 expressionS tmp;
3744
3745 /* This instruction will set the register to be all
3746 ones. */
3747 tmp.X_op = O_constant;
3748 tmp.X_add_number = (offsetT) -1;
3749 macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
3750 reg, 0, (int) BFD_RELOC_LO16);
3751 if (bit != 0)
3752 {
3753 bit += shift;
3754 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3755 (bit >= 32) ? "dsll32" : "dsll",
3756 "d,w,<", reg, reg,
3757 (bit >= 32) ? bit - 32 : bit);
3758 }
3759 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3760 (shift >= 32) ? "dsrl32" : "dsrl",
3761 "d,w,<", reg, reg,
3762 (shift >= 32) ? shift - 32 : shift);
3763 return;
3764 }
3765 }
3766
3767 /* Sign extend hi32 before calling load_register, because we can
3768 generally get better code when we load a sign extended value. */
3769 if ((hi32.X_add_number & 0x80000000) != 0)
3770 hi32.X_add_number |= ~(offsetT) 0xffffffff;
3771 load_register (counter, reg, &hi32, 0);
3772 freg = reg;
3773 }
3774 if ((lo32.X_add_number & 0xffff0000) == 0)
3775 {
3776 if (freg != 0)
3777 {
3778 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3779 "dsll32", "d,w,<", reg, freg, 0);
3780 freg = reg;
3781 }
3782 }
3783 else
3784 {
3785 expressionS mid16;
3786
3787 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3788 {
3789 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3790 (int) BFD_RELOC_HI16);
3791 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3792 "dsrl32", "d,w,<", reg, reg, 0);
3793 return;
3794 }
3795
3796 if (freg != 0)
3797 {
3798 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3799 "d,w,<", reg, freg, 16);
3800 freg = reg;
3801 }
3802 mid16 = lo32;
3803 mid16.X_add_number >>= 16;
3804 macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3805 freg, (int) BFD_RELOC_LO16);
3806 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3807 "d,w,<", reg, reg, 16);
3808 freg = reg;
3809 }
3810 if ((lo32.X_add_number & 0xffff) != 0)
3811 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3812 (int) BFD_RELOC_LO16);
3813 }
3814
3815 /* Load an address into a register. */
3816
3817 static void
3818 load_address (counter, reg, ep, used_at)
3819 int *counter;
3820 int reg;
3821 expressionS *ep;
3822 int *used_at;
3823 {
3824 char *p = NULL;
3825
3826 if (ep->X_op != O_constant
3827 && ep->X_op != O_symbol)
3828 {
3829 as_bad (_("expression too complex"));
3830 ep->X_op = O_constant;
3831 }
3832
3833 if (ep->X_op == O_constant)
3834 {
3835 load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
3836 return;
3837 }
3838
3839 if (mips_pic == NO_PIC)
3840 {
3841 /* If this is a reference to a GP relative symbol, we want
3842 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
3843 Otherwise we want
3844 lui $reg,<sym> (BFD_RELOC_HI16_S)
3845 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3846 If we have an addend, we always use the latter form.
3847
3848 With 64bit address space and a usable $at we want
3849 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3850 lui $at,<sym> (BFD_RELOC_HI16_S)
3851 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3852 daddiu $at,<sym> (BFD_RELOC_LO16)
3853 dsll32 $reg,0
3854 daddu $reg,$reg,$at
3855
3856 If $at is already in use, we use a path which is suboptimal
3857 on superscalar processors.
3858 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3859 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3860 dsll $reg,16
3861 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
3862 dsll $reg,16
3863 daddiu $reg,<sym> (BFD_RELOC_LO16)
3864 */
3865 if (HAVE_64BIT_ADDRESSES)
3866 {
3867 /* We don't do GP optimization for now because RELAX_ENCODE can't
3868 hold the data for such large chunks. */
3869
3870 if (*used_at == 0 && ! mips_opts.noat)
3871 {
3872 macro_build (p, counter, ep, "lui", "t,u",
3873 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3874 macro_build (p, counter, ep, "lui", "t,u",
3875 AT, (int) BFD_RELOC_HI16_S);
3876 macro_build (p, counter, ep, "daddiu", "t,r,j",
3877 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3878 macro_build (p, counter, ep, "daddiu", "t,r,j",
3879 AT, AT, (int) BFD_RELOC_LO16);
3880 macro_build (p, counter, (expressionS *) NULL, "dsll32",
3881 "d,w,<", reg, reg, 0);
3882 macro_build (p, counter, (expressionS *) NULL, "daddu",
3883 "d,v,t", reg, reg, AT);
3884 *used_at = 1;
3885 }
3886 else
3887 {
3888 macro_build (p, counter, ep, "lui", "t,u",
3889 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3890 macro_build (p, counter, ep, "daddiu", "t,r,j",
3891 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3892 macro_build (p, counter, (expressionS *) NULL, "dsll",
3893 "d,w,<", reg, reg, 16);
3894 macro_build (p, counter, ep, "daddiu", "t,r,j",
3895 reg, reg, (int) BFD_RELOC_HI16_S);
3896 macro_build (p, counter, (expressionS *) NULL, "dsll",
3897 "d,w,<", reg, reg, 16);
3898 macro_build (p, counter, ep, "daddiu", "t,r,j",
3899 reg, reg, (int) BFD_RELOC_LO16);
3900 }
3901 }
3902 else
3903 {
3904 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3905 && ! nopic_need_relax (ep->X_add_symbol, 1))
3906 {
3907 frag_grow (20);
3908 macro_build ((char *) NULL, counter, ep,
3909 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3910 ? "addi" : "addiu" : "daddiu", "t,r,j",
3911 reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
3912 p = frag_var (rs_machine_dependent, 8, 0,
3913 RELAX_ENCODE (4, 8, 0, 4, 0,
3914 mips_opts.warn_about_macros),
3915 ep->X_add_symbol, 0, NULL);
3916 }
3917 macro_build_lui (p, counter, ep, reg);
3918 if (p != NULL)
3919 p += 4;
3920 macro_build (p, counter, ep,
3921 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
3922 ? "addi" : "addiu" : "daddiu",
3923 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3924 }
3925 }
3926 else if (mips_pic == SVR4_PIC && ! mips_big_got)
3927 {
3928 expressionS ex;
3929
3930 /* If this is a reference to an external symbol, we want
3931 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3932 Otherwise we want
3933 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3934 nop
3935 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
3936 If there is a constant, it must be added in after.
3937
3938 If we have NewABI, we want
3939 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
3940 unless we're referencing a global symbol with a non-zero
3941 offset, in which case cst must be added separately. */
3942 if (HAVE_NEWABI)
3943 {
3944 frag_grow (12);
3945
3946 if (ep->X_add_number)
3947 {
3948 frag_now->tc_frag_data.tc_fr_offset =
3949 ex.X_add_number = ep->X_add_number;
3950 ep->X_add_number = 0;
3951 macro_build ((char *) NULL, counter, ep,
3952 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3953 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3954 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3955 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3956 ex.X_op = O_constant;
3957 macro_build ((char *) NULL, counter, &ex,
3958 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
3959 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3960 p = frag_var (rs_machine_dependent, 8, 0,
3961 RELAX_ENCODE (8, 4, 0, 0, 0,
3962 mips_opts.warn_about_macros),
3963 ep->X_add_symbol, 0, (char *) NULL);
3964 ep->X_add_number = ex.X_add_number;
3965 }
3966
3967 macro_build (p, counter, ep,
3968 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3969 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3970
3971 if (! p)
3972 {
3973 /* To avoid confusion in tc_gen_reloc, we must ensure
3974 that this does not become a variant frag. */
3975 frag_wane (frag_now);
3976 frag_new (0);
3977 }
3978 }
3979 else
3980 {
3981 ex.X_add_number = ep->X_add_number;
3982 ep->X_add_number = 0;
3983 frag_grow (20);
3984 macro_build ((char *) NULL, counter, ep,
3985 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
3986 reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
3987 macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3988 p = frag_var (rs_machine_dependent, 4, 0,
3989 RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3990 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3991 macro_build (p, counter, ep,
3992 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3993 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3994
3995 if (ex.X_add_number != 0)
3996 {
3997 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3998 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3999 ex.X_op = O_constant;
4000 macro_build ((char *) NULL, counter, &ex,
4001 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4002 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4003 }
4004 }
4005 }
4006 else if (mips_pic == SVR4_PIC)
4007 {
4008 expressionS ex;
4009 int off;
4010
4011 /* This is the large GOT case. If this is a reference to an
4012 external symbol, we want
4013 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4014 addu $reg,$reg,$gp
4015 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4016
4017 Otherwise, for a reference to a local symbol in old ABI, we want
4018 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4019 nop
4020 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4021 If there is a constant, it must be added in after.
4022
4023 In the NewABI, for local symbols, with or without offsets, we want:
4024 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4025 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4026 */
4027 if (HAVE_NEWABI)
4028 {
4029 frag_grow (24);
4030
4031 frag_now->tc_frag_data.tc_fr_offset =
4032 ex.X_add_number = ep->X_add_number;
4033 ep->X_add_number = 0;
4034 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
4035 (int) BFD_RELOC_MIPS_GOT_HI16);
4036 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4037 HAVE_32BIT_ADDRESSES ? "add" : "daddu", "d,v,t", reg,
4038 reg, mips_gp_register);
4039 macro_build ((char *) NULL, counter, ep,
4040 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4041 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
4042 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4043 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4044 else if (ex.X_add_number)
4045 {
4046 ex.X_op = O_constant;
4047 macro_build ((char *) NULL, counter, &ex,
4048 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
4049 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4050 }
4051
4052 ep->X_add_number = ex.X_add_number;
4053 p = frag_var (rs_machine_dependent, 8, 0,
4054 RELAX_ENCODE (ex.X_add_number ? 16 : 12, 8, 0, 4, 0,
4055 mips_opts.warn_about_macros),
4056 ep->X_add_symbol, 0, (char *) NULL);
4057 macro_build (p, counter, ep,
4058 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
4059 (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4060 macro_build (p + 4, counter, ep,
4061 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu", "t,r,j",
4062 reg, reg, (int) BFD_RELOC_MIPS_GOT_OFST);
4063 }
4064 else
4065 {
4066 ex.X_add_number = ep->X_add_number;
4067 ep->X_add_number = 0;
4068 if (reg_needs_delay (mips_gp_register))
4069 off = 4;
4070 else
4071 off = 0;
4072 frag_grow (32);
4073 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
4074 (int) BFD_RELOC_MIPS_GOT_HI16);
4075 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4076 HAVE_32BIT_ADDRESSES ? "addu" : "daddu", "d,v,t", reg,
4077 reg, mips_gp_register);
4078 macro_build ((char *) NULL, counter, ep,
4079 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4080 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
4081 p = frag_var (rs_machine_dependent, 12 + off, 0,
4082 RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
4083 mips_opts.warn_about_macros),
4084 ep->X_add_symbol, 0, NULL);
4085 if (off > 0)
4086 {
4087 /* We need a nop before loading from $gp. This special
4088 check is required because the lui which starts the main
4089 instruction stream does not refer to $gp, and so will not
4090 insert the nop which may be required. */
4091 macro_build (p, counter, (expressionS *) NULL, "nop", "");
4092 p += 4;
4093 }
4094 macro_build (p, counter, ep,
4095 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
4096 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
4097 p += 4;
4098 macro_build (p, counter, (expressionS *) NULL, "nop", "");
4099 p += 4;
4100 macro_build (p, counter, ep,
4101 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4102 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4103
4104 if (ex.X_add_number != 0)
4105 {
4106 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4107 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4108 ex.X_op = O_constant;
4109 macro_build ((char *) NULL, counter, &ex,
4110 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4111 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4112 }
4113 }
4114 }
4115 else if (mips_pic == EMBEDDED_PIC)
4116 {
4117 /* We always do
4118 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4119 */
4120 macro_build ((char *) NULL, counter, ep,
4121 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4122 "t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
4123 }
4124 else
4125 abort ();
4126 }
4127
4128 /* Move the contents of register SOURCE into register DEST. */
4129
4130 static void
4131 move_register (counter, dest, source)
4132 int *counter;
4133 int dest;
4134 int source;
4135 {
4136 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4137 HAVE_32BIT_GPRS ? "addu" : "daddu",
4138 "d,v,t", dest, source, 0);
4139 }
4140
4141 /*
4142 * Build macros
4143 * This routine implements the seemingly endless macro or synthesized
4144 * instructions and addressing modes in the mips assembly language. Many
4145 * of these macros are simple and are similar to each other. These could
4146 * probably be handled by some kind of table or grammer aproach instead of
4147 * this verbose method. Others are not simple macros but are more like
4148 * optimizing code generation.
4149 * One interesting optimization is when several store macros appear
4150 * consecutivly that would load AT with the upper half of the same address.
4151 * The ensuing load upper instructions are ommited. This implies some kind
4152 * of global optimization. We currently only optimize within a single macro.
4153 * For many of the load and store macros if the address is specified as a
4154 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4155 * first load register 'at' with zero and use it as the base register. The
4156 * mips assembler simply uses register $zero. Just one tiny optimization
4157 * we're missing.
4158 */
4159 static void
4160 macro (ip)
4161 struct mips_cl_insn *ip;
4162 {
4163 register int treg, sreg, dreg, breg;
4164 int tempreg;
4165 int mask;
4166 int icnt = 0;
4167 int used_at = 0;
4168 expressionS expr1;
4169 const char *s;
4170 const char *s2;
4171 const char *fmt;
4172 int likely = 0;
4173 int dbl = 0;
4174 int coproc = 0;
4175 int lr = 0;
4176 int imm = 0;
4177 offsetT maxnum;
4178 int off;
4179 bfd_reloc_code_real_type r;
4180 int hold_mips_optimize;
4181
4182 assert (! mips_opts.mips16);
4183
4184 treg = (ip->insn_opcode >> 16) & 0x1f;
4185 dreg = (ip->insn_opcode >> 11) & 0x1f;
4186 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4187 mask = ip->insn_mo->mask;
4188
4189 expr1.X_op = O_constant;
4190 expr1.X_op_symbol = NULL;
4191 expr1.X_add_symbol = NULL;
4192 expr1.X_add_number = 1;
4193
4194 /* Umatched fixups should not be put in the same frag as a relaxable
4195 macro. For example, suppose we have:
4196
4197 lui $4,%hi(l1) # 1
4198 la $5,l2 # 2
4199 addiu $4,$4,%lo(l1) # 3
4200
4201 If instructions 1 and 2 were put in the same frag, md_frob_file would
4202 move the fixup for #1 after the fixups for the "unrelaxed" version of
4203 #2. This would confuse tc_gen_reloc, which expects the relocations
4204 for #2 to be the last for that frag.
4205
4206 Also, if tc_gen_reloc sees certain relocations in a variant frag,
4207 it assumes that they belong to a relaxable macro. We mustn't put
4208 other uses of such relocations into a variant frag.
4209
4210 To avoid both problems, finish the current frag it contains a
4211 %reloc() operator. The macro then goes into a new frag. */
4212 if (prev_reloc_op_frag == frag_now)
4213 {
4214 frag_wane (frag_now);
4215 frag_new (0);
4216 }
4217
4218 switch (mask)
4219 {
4220 case M_DABS:
4221 dbl = 1;
4222 case M_ABS:
4223 /* bgez $a0,.+12
4224 move v0,$a0
4225 sub v0,$zero,$a0
4226 */
4227
4228 mips_emit_delays (TRUE);
4229 ++mips_opts.noreorder;
4230 mips_any_noreorder = 1;
4231
4232 expr1.X_add_number = 8;
4233 macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
4234 if (dreg == sreg)
4235 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4236 0);
4237 else
4238 move_register (&icnt, dreg, sreg);
4239 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4240 dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4241
4242 --mips_opts.noreorder;
4243 return;
4244
4245 case M_ADD_I:
4246 s = "addi";
4247 s2 = "add";
4248 goto do_addi;
4249 case M_ADDU_I:
4250 s = "addiu";
4251 s2 = "addu";
4252 goto do_addi;
4253 case M_DADD_I:
4254 dbl = 1;
4255 s = "daddi";
4256 s2 = "dadd";
4257 goto do_addi;
4258 case M_DADDU_I:
4259 dbl = 1;
4260 s = "daddiu";
4261 s2 = "daddu";
4262 do_addi:
4263 if (imm_expr.X_op == O_constant
4264 && imm_expr.X_add_number >= -0x8000
4265 && imm_expr.X_add_number < 0x8000)
4266 {
4267 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
4268 (int) BFD_RELOC_LO16);
4269 return;
4270 }
4271 load_register (&icnt, AT, &imm_expr, dbl);
4272 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4273 treg, sreg, AT);
4274 break;
4275
4276 case M_AND_I:
4277 s = "andi";
4278 s2 = "and";
4279 goto do_bit;
4280 case M_OR_I:
4281 s = "ori";
4282 s2 = "or";
4283 goto do_bit;
4284 case M_NOR_I:
4285 s = "";
4286 s2 = "nor";
4287 goto do_bit;
4288 case M_XOR_I:
4289 s = "xori";
4290 s2 = "xor";
4291 do_bit:
4292 if (imm_expr.X_op == O_constant
4293 && imm_expr.X_add_number >= 0
4294 && imm_expr.X_add_number < 0x10000)
4295 {
4296 if (mask != M_NOR_I)
4297 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
4298 sreg, (int) BFD_RELOC_LO16);
4299 else
4300 {
4301 macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
4302 treg, sreg, (int) BFD_RELOC_LO16);
4303 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nor",
4304 "d,v,t", treg, treg, 0);
4305 }
4306 return;
4307 }
4308
4309 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4310 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4311 treg, sreg, AT);
4312 break;
4313
4314 case M_BEQ_I:
4315 s = "beq";
4316 goto beq_i;
4317 case M_BEQL_I:
4318 s = "beql";
4319 likely = 1;
4320 goto beq_i;
4321 case M_BNE_I:
4322 s = "bne";
4323 goto beq_i;
4324 case M_BNEL_I:
4325 s = "bnel";
4326 likely = 1;
4327 beq_i:
4328 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4329 {
4330 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
4331 0);
4332 return;
4333 }
4334 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4335 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
4336 break;
4337
4338 case M_BGEL:
4339 likely = 1;
4340 case M_BGE:
4341 if (treg == 0)
4342 {
4343 macro_build ((char *) NULL, &icnt, &offset_expr,
4344 likely ? "bgezl" : "bgez", "s,p", sreg);
4345 return;
4346 }
4347 if (sreg == 0)
4348 {
4349 macro_build ((char *) NULL, &icnt, &offset_expr,
4350 likely ? "blezl" : "blez", "s,p", treg);
4351 return;
4352 }
4353 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4354 AT, sreg, treg);
4355 macro_build ((char *) NULL, &icnt, &offset_expr,
4356 likely ? "beql" : "beq", "s,t,p", AT, 0);
4357 break;
4358
4359 case M_BGTL_I:
4360 likely = 1;
4361 case M_BGT_I:
4362 /* check for > max integer */
4363 maxnum = 0x7fffffff;
4364 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4365 {
4366 maxnum <<= 16;
4367 maxnum |= 0xffff;
4368 maxnum <<= 16;
4369 maxnum |= 0xffff;
4370 }
4371 if (imm_expr.X_op == O_constant
4372 && imm_expr.X_add_number >= maxnum
4373 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4374 {
4375 do_false:
4376 /* result is always false */
4377 if (! likely)
4378 {
4379 if (warn_nops)
4380 as_warn (_("Branch %s is always false (nop)"),
4381 ip->insn_mo->name);
4382 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop",
4383 "", 0);
4384 }
4385 else
4386 {
4387 if (warn_nops)
4388 as_warn (_("Branch likely %s is always false"),
4389 ip->insn_mo->name);
4390 macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
4391 "s,t,p", 0, 0);
4392 }
4393 return;
4394 }
4395 if (imm_expr.X_op != O_constant)
4396 as_bad (_("Unsupported large constant"));
4397 ++imm_expr.X_add_number;
4398 /* FALLTHROUGH */
4399 case M_BGE_I:
4400 case M_BGEL_I:
4401 if (mask == M_BGEL_I)
4402 likely = 1;
4403 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4404 {
4405 macro_build ((char *) NULL, &icnt, &offset_expr,
4406 likely ? "bgezl" : "bgez", "s,p", sreg);
4407 return;
4408 }
4409 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4410 {
4411 macro_build ((char *) NULL, &icnt, &offset_expr,
4412 likely ? "bgtzl" : "bgtz", "s,p", sreg);
4413 return;
4414 }
4415 maxnum = 0x7fffffff;
4416 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4417 {
4418 maxnum <<= 16;
4419 maxnum |= 0xffff;
4420 maxnum <<= 16;
4421 maxnum |= 0xffff;
4422 }
4423 maxnum = - maxnum - 1;
4424 if (imm_expr.X_op == O_constant
4425 && imm_expr.X_add_number <= maxnum
4426 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4427 {
4428 do_true:
4429 /* result is always true */
4430 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4431 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4432 return;
4433 }
4434 set_at (&icnt, sreg, 0);
4435 macro_build ((char *) NULL, &icnt, &offset_expr,
4436 likely ? "beql" : "beq", "s,t,p", AT, 0);
4437 break;
4438
4439 case M_BGEUL:
4440 likely = 1;
4441 case M_BGEU:
4442 if (treg == 0)
4443 goto do_true;
4444 if (sreg == 0)
4445 {
4446 macro_build ((char *) NULL, &icnt, &offset_expr,
4447 likely ? "beql" : "beq", "s,t,p", 0, treg);
4448 return;
4449 }
4450 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4451 "d,v,t", AT, sreg, treg);
4452 macro_build ((char *) NULL, &icnt, &offset_expr,
4453 likely ? "beql" : "beq", "s,t,p", AT, 0);
4454 break;
4455
4456 case M_BGTUL_I:
4457 likely = 1;
4458 case M_BGTU_I:
4459 if (sreg == 0
4460 || (HAVE_32BIT_GPRS
4461 && imm_expr.X_op == O_constant
4462 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4463 goto do_false;
4464 if (imm_expr.X_op != O_constant)
4465 as_bad (_("Unsupported large constant"));
4466 ++imm_expr.X_add_number;
4467 /* FALLTHROUGH */
4468 case M_BGEU_I:
4469 case M_BGEUL_I:
4470 if (mask == M_BGEUL_I)
4471 likely = 1;
4472 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4473 goto do_true;
4474 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4475 {
4476 macro_build ((char *) NULL, &icnt, &offset_expr,
4477 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4478 return;
4479 }
4480 set_at (&icnt, sreg, 1);
4481 macro_build ((char *) NULL, &icnt, &offset_expr,
4482 likely ? "beql" : "beq", "s,t,p", AT, 0);
4483 break;
4484
4485 case M_BGTL:
4486 likely = 1;
4487 case M_BGT:
4488 if (treg == 0)
4489 {
4490 macro_build ((char *) NULL, &icnt, &offset_expr,
4491 likely ? "bgtzl" : "bgtz", "s,p", sreg);
4492 return;
4493 }
4494 if (sreg == 0)
4495 {
4496 macro_build ((char *) NULL, &icnt, &offset_expr,
4497 likely ? "bltzl" : "bltz", "s,p", treg);
4498 return;
4499 }
4500 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4501 AT, treg, sreg);
4502 macro_build ((char *) NULL, &icnt, &offset_expr,
4503 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4504 break;
4505
4506 case M_BGTUL:
4507 likely = 1;
4508 case M_BGTU:
4509 if (treg == 0)
4510 {
4511 macro_build ((char *) NULL, &icnt, &offset_expr,
4512 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4513 return;
4514 }
4515 if (sreg == 0)
4516 goto do_false;
4517 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4518 "d,v,t", AT, treg, sreg);
4519 macro_build ((char *) NULL, &icnt, &offset_expr,
4520 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4521 break;
4522
4523 case M_BLEL:
4524 likely = 1;
4525 case M_BLE:
4526 if (treg == 0)
4527 {
4528 macro_build ((char *) NULL, &icnt, &offset_expr,
4529 likely ? "blezl" : "blez", "s,p", sreg);
4530 return;
4531 }
4532 if (sreg == 0)
4533 {
4534 macro_build ((char *) NULL, &icnt, &offset_expr,
4535 likely ? "bgezl" : "bgez", "s,p", treg);
4536 return;
4537 }
4538 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4539 AT, treg, sreg);
4540 macro_build ((char *) NULL, &icnt, &offset_expr,
4541 likely ? "beql" : "beq", "s,t,p", AT, 0);
4542 break;
4543
4544 case M_BLEL_I:
4545 likely = 1;
4546 case M_BLE_I:
4547 maxnum = 0x7fffffff;
4548 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4549 {
4550 maxnum <<= 16;
4551 maxnum |= 0xffff;
4552 maxnum <<= 16;
4553 maxnum |= 0xffff;
4554 }
4555 if (imm_expr.X_op == O_constant
4556 && imm_expr.X_add_number >= maxnum
4557 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4558 goto do_true;
4559 if (imm_expr.X_op != O_constant)
4560 as_bad (_("Unsupported large constant"));
4561 ++imm_expr.X_add_number;
4562 /* FALLTHROUGH */
4563 case M_BLT_I:
4564 case M_BLTL_I:
4565 if (mask == M_BLTL_I)
4566 likely = 1;
4567 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4568 {
4569 macro_build ((char *) NULL, &icnt, &offset_expr,
4570 likely ? "bltzl" : "bltz", "s,p", sreg);
4571 return;
4572 }
4573 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4574 {
4575 macro_build ((char *) NULL, &icnt, &offset_expr,
4576 likely ? "blezl" : "blez", "s,p", sreg);
4577 return;
4578 }
4579 set_at (&icnt, sreg, 0);
4580 macro_build ((char *) NULL, &icnt, &offset_expr,
4581 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4582 break;
4583
4584 case M_BLEUL:
4585 likely = 1;
4586 case M_BLEU:
4587 if (treg == 0)
4588 {
4589 macro_build ((char *) NULL, &icnt, &offset_expr,
4590 likely ? "beql" : "beq", "s,t,p", sreg, 0);
4591 return;
4592 }
4593 if (sreg == 0)
4594 goto do_true;
4595 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4596 "d,v,t", AT, treg, sreg);
4597 macro_build ((char *) NULL, &icnt, &offset_expr,
4598 likely ? "beql" : "beq", "s,t,p", AT, 0);
4599 break;
4600
4601 case M_BLEUL_I:
4602 likely = 1;
4603 case M_BLEU_I:
4604 if (sreg == 0
4605 || (HAVE_32BIT_GPRS
4606 && imm_expr.X_op == O_constant
4607 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4608 goto do_true;
4609 if (imm_expr.X_op != O_constant)
4610 as_bad (_("Unsupported large constant"));
4611 ++imm_expr.X_add_number;
4612 /* FALLTHROUGH */
4613 case M_BLTU_I:
4614 case M_BLTUL_I:
4615 if (mask == M_BLTUL_I)
4616 likely = 1;
4617 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4618 goto do_false;
4619 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4620 {
4621 macro_build ((char *) NULL, &icnt, &offset_expr,
4622 likely ? "beql" : "beq",
4623 "s,t,p", sreg, 0);
4624 return;
4625 }
4626 set_at (&icnt, sreg, 1);
4627 macro_build ((char *) NULL, &icnt, &offset_expr,
4628 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4629 break;
4630
4631 case M_BLTL:
4632 likely = 1;
4633 case M_BLT:
4634 if (treg == 0)
4635 {
4636 macro_build ((char *) NULL, &icnt, &offset_expr,
4637 likely ? "bltzl" : "bltz", "s,p", sreg);
4638 return;
4639 }
4640 if (sreg == 0)
4641 {
4642 macro_build ((char *) NULL, &icnt, &offset_expr,
4643 likely ? "bgtzl" : "bgtz", "s,p", treg);
4644 return;
4645 }
4646 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4647 AT, sreg, treg);
4648 macro_build ((char *) NULL, &icnt, &offset_expr,
4649 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4650 break;
4651
4652 case M_BLTUL:
4653 likely = 1;
4654 case M_BLTU:
4655 if (treg == 0)
4656 goto do_false;
4657 if (sreg == 0)
4658 {
4659 macro_build ((char *) NULL, &icnt, &offset_expr,
4660 likely ? "bnel" : "bne", "s,t,p", 0, treg);
4661 return;
4662 }
4663 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4664 "d,v,t", AT, sreg,
4665 treg);
4666 macro_build ((char *) NULL, &icnt, &offset_expr,
4667 likely ? "bnel" : "bne", "s,t,p", AT, 0);
4668 break;
4669
4670 case M_DDIV_3:
4671 dbl = 1;
4672 case M_DIV_3:
4673 s = "mflo";
4674 goto do_div3;
4675 case M_DREM_3:
4676 dbl = 1;
4677 case M_REM_3:
4678 s = "mfhi";
4679 do_div3:
4680 if (treg == 0)
4681 {
4682 as_warn (_("Divide by zero."));
4683 if (mips_trap)
4684 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4685 "s,t,q", 0, 0, 7);
4686 else
4687 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4688 "c", 7);
4689 return;
4690 }
4691
4692 mips_emit_delays (TRUE);
4693 ++mips_opts.noreorder;
4694 mips_any_noreorder = 1;
4695 if (mips_trap)
4696 {
4697 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4698 "s,t,q", treg, 0, 7);
4699 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4700 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4701 }
4702 else
4703 {
4704 expr1.X_add_number = 8;
4705 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4706 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4707 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4708 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4709 "c", 7);
4710 }
4711 expr1.X_add_number = -1;
4712 macro_build ((char *) NULL, &icnt, &expr1,
4713 dbl ? "daddiu" : "addiu",
4714 "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4715 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4716 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4717 if (dbl)
4718 {
4719 expr1.X_add_number = 1;
4720 macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4721 (int) BFD_RELOC_LO16);
4722 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsll32",
4723 "d,w,<", AT, AT, 31);
4724 }
4725 else
4726 {
4727 expr1.X_add_number = 0x80000000;
4728 macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4729 (int) BFD_RELOC_HI16);
4730 }
4731 if (mips_trap)
4732 {
4733 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4734 "s,t,q", sreg, AT, 6);
4735 /* We want to close the noreorder block as soon as possible, so
4736 that later insns are available for delay slot filling. */
4737 --mips_opts.noreorder;
4738 }
4739 else
4740 {
4741 expr1.X_add_number = 8;
4742 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
4743 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4744 0);
4745
4746 /* We want to close the noreorder block as soon as possible, so
4747 that later insns are available for delay slot filling. */
4748 --mips_opts.noreorder;
4749
4750 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4751 "c", 6);
4752 }
4753 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d", dreg);
4754 break;
4755
4756 case M_DIV_3I:
4757 s = "div";
4758 s2 = "mflo";
4759 goto do_divi;
4760 case M_DIVU_3I:
4761 s = "divu";
4762 s2 = "mflo";
4763 goto do_divi;
4764 case M_REM_3I:
4765 s = "div";
4766 s2 = "mfhi";
4767 goto do_divi;
4768 case M_REMU_3I:
4769 s = "divu";
4770 s2 = "mfhi";
4771 goto do_divi;
4772 case M_DDIV_3I:
4773 dbl = 1;
4774 s = "ddiv";
4775 s2 = "mflo";
4776 goto do_divi;
4777 case M_DDIVU_3I:
4778 dbl = 1;
4779 s = "ddivu";
4780 s2 = "mflo";
4781 goto do_divi;
4782 case M_DREM_3I:
4783 dbl = 1;
4784 s = "ddiv";
4785 s2 = "mfhi";
4786 goto do_divi;
4787 case M_DREMU_3I:
4788 dbl = 1;
4789 s = "ddivu";
4790 s2 = "mfhi";
4791 do_divi:
4792 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4793 {
4794 as_warn (_("Divide by zero."));
4795 if (mips_trap)
4796 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4797 "s,t,q", 0, 0, 7);
4798 else
4799 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4800 "c", 7);
4801 return;
4802 }
4803 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4804 {
4805 if (strcmp (s2, "mflo") == 0)
4806 move_register (&icnt, dreg, sreg);
4807 else
4808 move_register (&icnt, dreg, 0);
4809 return;
4810 }
4811 if (imm_expr.X_op == O_constant
4812 && imm_expr.X_add_number == -1
4813 && s[strlen (s) - 1] != 'u')
4814 {
4815 if (strcmp (s2, "mflo") == 0)
4816 {
4817 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4818 dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4819 }
4820 else
4821 move_register (&icnt, dreg, 0);
4822 return;
4823 }
4824
4825 load_register (&icnt, AT, &imm_expr, dbl);
4826 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4827 sreg, AT);
4828 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4829 break;
4830
4831 case M_DIVU_3:
4832 s = "divu";
4833 s2 = "mflo";
4834 goto do_divu3;
4835 case M_REMU_3:
4836 s = "divu";
4837 s2 = "mfhi";
4838 goto do_divu3;
4839 case M_DDIVU_3:
4840 s = "ddivu";
4841 s2 = "mflo";
4842 goto do_divu3;
4843 case M_DREMU_3:
4844 s = "ddivu";
4845 s2 = "mfhi";
4846 do_divu3:
4847 mips_emit_delays (TRUE);
4848 ++mips_opts.noreorder;
4849 mips_any_noreorder = 1;
4850 if (mips_trap)
4851 {
4852 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4853 "s,t,q", treg, 0, 7);
4854 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4855 sreg, treg);
4856 /* We want to close the noreorder block as soon as possible, so
4857 that later insns are available for delay slot filling. */
4858 --mips_opts.noreorder;
4859 }
4860 else
4861 {
4862 expr1.X_add_number = 8;
4863 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4864 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4865 sreg, treg);
4866
4867 /* We want to close the noreorder block as soon as possible, so
4868 that later insns are available for delay slot filling. */
4869 --mips_opts.noreorder;
4870 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4871 "c", 7);
4872 }
4873 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4874 return;
4875
4876 case M_DLA_AB:
4877 dbl = 1;
4878 case M_LA_AB:
4879 /* Load the address of a symbol into a register. If breg is not
4880 zero, we then add a base register to it. */
4881
4882 if (dbl && HAVE_32BIT_GPRS)
4883 as_warn (_("dla used to load 32-bit register"));
4884
4885 if (! dbl && HAVE_64BIT_OBJECTS)
4886 as_warn (_("la used to load 64-bit address"));
4887
4888 if (offset_expr.X_op == O_constant
4889 && offset_expr.X_add_number >= -0x8000
4890 && offset_expr.X_add_number < 0x8000)
4891 {
4892 macro_build ((char *) NULL, &icnt, &offset_expr,
4893 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" :
4894 HAVE_NEWABI ? "addi" : "addiu",
4895 "t,r,j", treg, sreg, (int) BFD_RELOC_LO16);
4896 return;
4897 }
4898
4899 if (treg == breg)
4900 {
4901 tempreg = AT;
4902 used_at = 1;
4903 }
4904 else
4905 {
4906 tempreg = treg;
4907 used_at = 0;
4908 }
4909
4910 /* When generating embedded PIC code, we permit expressions of
4911 the form
4912 la $treg,foo-bar
4913 la $treg,foo-bar($breg)
4914 where bar is an address in the current section. These are used
4915 when getting the addresses of functions. We don't permit
4916 X_add_number to be non-zero, because if the symbol is
4917 external the relaxing code needs to know that any addend is
4918 purely the offset to X_op_symbol. */
4919 if (mips_pic == EMBEDDED_PIC
4920 && offset_expr.X_op == O_subtract
4921 && (symbol_constant_p (offset_expr.X_op_symbol)
4922 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4923 : (symbol_equated_p (offset_expr.X_op_symbol)
4924 && (S_GET_SEGMENT
4925 (symbol_get_value_expression (offset_expr.X_op_symbol)
4926 ->X_add_symbol)
4927 == now_seg)))
4928 && (offset_expr.X_add_number == 0
4929 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4930 {
4931 if (breg == 0)
4932 {
4933 tempreg = treg;
4934 used_at = 0;
4935 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4936 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4937 }
4938 else
4939 {
4940 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4941 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4942 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4943 (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4944 "d,v,t", tempreg, tempreg, breg);
4945 }
4946 macro_build ((char *) NULL, &icnt, &offset_expr,
4947 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4948 "t,r,j", treg, tempreg, (int) BFD_RELOC_PCREL_LO16);
4949 if (! used_at)
4950 return;
4951 break;
4952 }
4953
4954 if (offset_expr.X_op != O_symbol
4955 && offset_expr.X_op != O_constant)
4956 {
4957 as_bad (_("expression too complex"));
4958 offset_expr.X_op = O_constant;
4959 }
4960
4961 if (offset_expr.X_op == O_constant)
4962 load_register (&icnt, tempreg, &offset_expr,
4963 ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4964 ? (dbl || HAVE_64BIT_ADDRESSES)
4965 : HAVE_64BIT_ADDRESSES));
4966 else if (mips_pic == NO_PIC)
4967 {
4968 /* If this is a reference to a GP relative symbol, we want
4969 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
4970 Otherwise we want
4971 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4972 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4973 If we have a constant, we need two instructions anyhow,
4974 so we may as well always use the latter form.
4975
4976 With 64bit address space and a usable $at we want
4977 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4978 lui $at,<sym> (BFD_RELOC_HI16_S)
4979 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4980 daddiu $at,<sym> (BFD_RELOC_LO16)
4981 dsll32 $tempreg,0
4982 daddu $tempreg,$tempreg,$at
4983
4984 If $at is already in use, we use a path which is suboptimal
4985 on superscalar processors.
4986 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4987 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4988 dsll $tempreg,16
4989 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
4990 dsll $tempreg,16
4991 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
4992 */
4993 char *p = NULL;
4994 if (HAVE_64BIT_ADDRESSES)
4995 {
4996 /* We don't do GP optimization for now because RELAX_ENCODE can't
4997 hold the data for such large chunks. */
4998
4999 if (used_at == 0 && ! mips_opts.noat)
5000 {
5001 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5002 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5003 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5004 AT, (int) BFD_RELOC_HI16_S);
5005 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5006 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5007 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5008 AT, AT, (int) BFD_RELOC_LO16);
5009 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
5010 "d,w,<", tempreg, tempreg, 0);
5011 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5012 "d,v,t", tempreg, tempreg, AT);
5013 used_at = 1;
5014 }
5015 else
5016 {
5017 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5018 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5019 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5020 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5021 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
5022 tempreg, tempreg, 16);
5023 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5024 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
5025 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
5026 tempreg, tempreg, 16);
5027 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5028 tempreg, tempreg, (int) BFD_RELOC_LO16);
5029 }
5030 }
5031 else
5032 {
5033 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5034 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
5035 {
5036 frag_grow (20);
5037 macro_build ((char *) NULL, &icnt, &offset_expr,
5038 HAVE_NEWABI ? "addi" : "addiu",
5039 "t,r,j", tempreg, mips_gp_register,
5040 (int) BFD_RELOC_GPREL16);
5041 p = frag_var (rs_machine_dependent, 8, 0,
5042 RELAX_ENCODE (4, 8, 0, 4, 0,
5043 mips_opts.warn_about_macros),
5044 offset_expr.X_add_symbol, 0, NULL);
5045 }
5046 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5047 if (p != NULL)
5048 p += 4;
5049 macro_build (p, &icnt, &offset_expr,
5050 HAVE_NEWABI ? "addi" : "addiu",
5051 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5052 }
5053 }
5054 else if (mips_pic == SVR4_PIC && ! mips_big_got && ! HAVE_NEWABI)
5055 {
5056 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5057
5058 /* If this is a reference to an external symbol, and there
5059 is no constant, we want
5060 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5061 or if tempreg is PIC_CALL_REG
5062 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5063 For a local symbol, we want
5064 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5065 nop
5066 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5067
5068 If we have a small constant, and this is a reference to
5069 an external symbol, we want
5070 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5071 nop
5072 addiu $tempreg,$tempreg,<constant>
5073 For a local symbol, we want the same instruction
5074 sequence, but we output a BFD_RELOC_LO16 reloc on the
5075 addiu instruction.
5076
5077 If we have a large constant, and this is a reference to
5078 an external symbol, we want
5079 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5080 lui $at,<hiconstant>
5081 addiu $at,$at,<loconstant>
5082 addu $tempreg,$tempreg,$at
5083 For a local symbol, we want the same instruction
5084 sequence, but we output a BFD_RELOC_LO16 reloc on the
5085 addiu instruction.
5086 */
5087
5088 expr1.X_add_number = offset_expr.X_add_number;
5089 offset_expr.X_add_number = 0;
5090 frag_grow (32);
5091 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5092 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5093 macro_build ((char *) NULL, &icnt, &offset_expr,
5094 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5095 "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
5096 if (expr1.X_add_number == 0)
5097 {
5098 int off;
5099 char *p;
5100
5101 if (breg == 0)
5102 off = 0;
5103 else
5104 {
5105 /* We're going to put in an addu instruction using
5106 tempreg, so we may as well insert the nop right
5107 now. */
5108 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5109 "nop", "");
5110 off = 4;
5111 }
5112 p = frag_var (rs_machine_dependent, 8 - off, 0,
5113 RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
5114 (breg == 0
5115 ? mips_opts.warn_about_macros
5116 : 0)),
5117 offset_expr.X_add_symbol, 0, NULL);
5118 if (breg == 0)
5119 {
5120 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5121 p += 4;
5122 }
5123 macro_build (p, &icnt, &expr1,
5124 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5125 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5126 /* FIXME: If breg == 0, and the next instruction uses
5127 $tempreg, then if this variant case is used an extra
5128 nop will be generated. */
5129 }
5130 else if (expr1.X_add_number >= -0x8000
5131 && expr1.X_add_number < 0x8000)
5132 {
5133 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5134 "nop", "");
5135 macro_build ((char *) NULL, &icnt, &expr1,
5136 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5137 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5138 frag_var (rs_machine_dependent, 0, 0,
5139 RELAX_ENCODE (0, 0, -12, -4, 0, 0),
5140 offset_expr.X_add_symbol, 0, NULL);
5141 }
5142 else
5143 {
5144 int off1;
5145
5146 /* If we are going to add in a base register, and the
5147 target register and the base register are the same,
5148 then we are using AT as a temporary register. Since
5149 we want to load the constant into AT, we add our
5150 current AT (from the global offset table) and the
5151 register into the register now, and pretend we were
5152 not using a base register. */
5153 if (breg != treg)
5154 off1 = 0;
5155 else
5156 {
5157 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5158 "nop", "");
5159 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5160 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5161 "d,v,t", treg, AT, breg);
5162 breg = 0;
5163 tempreg = treg;
5164 off1 = -8;
5165 }
5166
5167 /* Set mips_optimize around the lui instruction to avoid
5168 inserting an unnecessary nop after the lw. */
5169 hold_mips_optimize = mips_optimize;
5170 mips_optimize = 2;
5171 macro_build_lui (NULL, &icnt, &expr1, AT);
5172 mips_optimize = hold_mips_optimize;
5173
5174 macro_build ((char *) NULL, &icnt, &expr1,
5175 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5176 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5177 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5178 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5179 "d,v,t", tempreg, tempreg, AT);
5180 frag_var (rs_machine_dependent, 0, 0,
5181 RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
5182 offset_expr.X_add_symbol, 0, NULL);
5183 used_at = 1;
5184 }
5185 }
5186 else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
5187 {
5188 char *p = NULL;
5189 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
5190 int adj = 0;
5191
5192 /* If this is a reference to an external, and there is no
5193 constant, or local symbol (*), with or without a
5194 constant, we want
5195 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5196 or if tempreg is PIC_CALL_REG
5197 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5198
5199 If we have a small constant, and this is a reference to
5200 an external symbol, we want
5201 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5202 addiu $tempreg,$tempreg,<constant>
5203
5204 If we have a large constant, and this is a reference to
5205 an external symbol, we want
5206 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5207 lui $at,<hiconstant>
5208 addiu $at,$at,<loconstant>
5209 addu $tempreg,$tempreg,$at
5210
5211 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5212 local symbols, even though it introduces an additional
5213 instruction. */
5214
5215 frag_grow (28);
5216 if (offset_expr.X_add_number == 0 && tempreg == PIC_CALL_REG)
5217 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5218 if (offset_expr.X_add_number)
5219 {
5220 frag_now->tc_frag_data.tc_fr_offset =
5221 expr1.X_add_number = offset_expr.X_add_number;
5222 offset_expr.X_add_number = 0;
5223
5224 macro_build ((char *) NULL, &icnt, &offset_expr,
5225 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5226 "t,o(b)", tempreg, lw_reloc_type,
5227 mips_gp_register);
5228
5229 if (expr1.X_add_number >= -0x8000
5230 && expr1.X_add_number < 0x8000)
5231 {
5232 macro_build ((char *) NULL, &icnt, &expr1,
5233 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5234 "t,r,j", tempreg, tempreg,
5235 (int) BFD_RELOC_LO16);
5236 p = frag_var (rs_machine_dependent, 4, 0,
5237 RELAX_ENCODE (8, 4, 0, 0, 0, 0),
5238 offset_expr.X_add_symbol, 0, NULL);
5239 }
5240 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number))
5241 {
5242 int dreg;
5243
5244 /* If we are going to add in a base register, and the
5245 target register and the base register are the same,
5246 then we are using AT as a temporary register. Since
5247 we want to load the constant into AT, we add our
5248 current AT (from the global offset table) and the
5249 register into the register now, and pretend we were
5250 not using a base register. */
5251 if (breg != treg)
5252 dreg = tempreg;
5253 else
5254 {
5255 assert (tempreg == AT);
5256 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5257 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5258 "d,v,t", treg, AT, breg);
5259 dreg = treg;
5260 adj = 4;
5261 }
5262
5263 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
5264 macro_build ((char *) NULL, &icnt, &expr1,
5265 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5266 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5267 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5268 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5269 "d,v,t", dreg, dreg, AT);
5270
5271 p = frag_var (rs_machine_dependent, 4 + adj, 0,
5272 RELAX_ENCODE (16 + adj, 4 + adj,
5273 0, 0, 0, 0),
5274 offset_expr.X_add_symbol, 0, NULL);
5275
5276 used_at = 1;
5277 }
5278 else
5279 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5280
5281 offset_expr.X_add_number = expr1.X_add_number;
5282
5283 macro_build (p, &icnt, &offset_expr,
5284 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5285 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_DISP,
5286 mips_gp_register);
5287 if (adj)
5288 {
5289 macro_build (p + 4, &icnt, (expressionS *) NULL,
5290 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5291 "d,v,t", treg, tempreg, breg);
5292 breg = 0;
5293 tempreg = treg;
5294 }
5295 }
5296 else
5297 {
5298 macro_build ((char *) NULL, &icnt, &offset_expr,
5299 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5300 "t,o(b)", tempreg, lw_reloc_type,
5301 mips_gp_register);
5302 if (lw_reloc_type != BFD_RELOC_MIPS_GOT_DISP)
5303 p = frag_var (rs_machine_dependent, 0, 0,
5304 RELAX_ENCODE (0, 0, -4, 0, 0, 0),
5305 offset_expr.X_add_symbol, 0, NULL);
5306 }
5307
5308 if (! p)
5309 {
5310 /* To avoid confusion in tc_gen_reloc, we must ensure
5311 that this does not become a variant frag. */
5312 frag_wane (frag_now);
5313 frag_new (0);
5314 }
5315 }
5316 else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
5317 {
5318 int gpdel;
5319 char *p;
5320 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5321 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5322 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5323
5324 /* This is the large GOT case. If this is a reference to an
5325 external symbol, and there is no constant, we want
5326 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5327 addu $tempreg,$tempreg,$gp
5328 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5329 or if tempreg is PIC_CALL_REG
5330 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5331 addu $tempreg,$tempreg,$gp
5332 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5333 For a local symbol, we want
5334 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5335 nop
5336 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5337
5338 If we have a small constant, and this is a reference to
5339 an external symbol, we want
5340 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5341 addu $tempreg,$tempreg,$gp
5342 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5343 nop
5344 addiu $tempreg,$tempreg,<constant>
5345 For a local symbol, we want
5346 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5347 nop
5348 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5349
5350 If we have a large constant, and this is a reference to
5351 an external symbol, we want
5352 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5353 addu $tempreg,$tempreg,$gp
5354 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5355 lui $at,<hiconstant>
5356 addiu $at,$at,<loconstant>
5357 addu $tempreg,$tempreg,$at
5358 For a local symbol, we want
5359 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5360 lui $at,<hiconstant>
5361 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5362 addu $tempreg,$tempreg,$at
5363 */
5364
5365 expr1.X_add_number = offset_expr.X_add_number;
5366 offset_expr.X_add_number = 0;
5367 frag_grow (52);
5368 if (reg_needs_delay (mips_gp_register))
5369 gpdel = 4;
5370 else
5371 gpdel = 0;
5372 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5373 {
5374 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5375 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5376 }
5377 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5378 tempreg, lui_reloc_type);
5379 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5380 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5381 "d,v,t", tempreg, tempreg, mips_gp_register);
5382 macro_build ((char *) NULL, &icnt, &offset_expr,
5383 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5384 "t,o(b)", tempreg, lw_reloc_type, tempreg);
5385 if (expr1.X_add_number == 0)
5386 {
5387 int off;
5388
5389 if (breg == 0)
5390 off = 0;
5391 else
5392 {
5393 /* We're going to put in an addu instruction using
5394 tempreg, so we may as well insert the nop right
5395 now. */
5396 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5397 "nop", "");
5398 off = 4;
5399 }
5400
5401 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5402 RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
5403 8 + gpdel, 0,
5404 (breg == 0
5405 ? mips_opts.warn_about_macros
5406 : 0)),
5407 offset_expr.X_add_symbol, 0, NULL);
5408 }
5409 else if (expr1.X_add_number >= -0x8000
5410 && expr1.X_add_number < 0x8000)
5411 {
5412 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5413 "nop", "");
5414 macro_build ((char *) NULL, &icnt, &expr1,
5415 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5416 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5417
5418 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5419 RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
5420 (breg == 0
5421 ? mips_opts.warn_about_macros
5422 : 0)),
5423 offset_expr.X_add_symbol, 0, NULL);
5424 }
5425 else
5426 {
5427 int adj, dreg;
5428
5429 /* If we are going to add in a base register, and the
5430 target register and the base register are the same,
5431 then we are using AT as a temporary register. Since
5432 we want to load the constant into AT, we add our
5433 current AT (from the global offset table) and the
5434 register into the register now, and pretend we were
5435 not using a base register. */
5436 if (breg != treg)
5437 {
5438 adj = 0;
5439 dreg = tempreg;
5440 }
5441 else
5442 {
5443 assert (tempreg == AT);
5444 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5445 "nop", "");
5446 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5447 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5448 "d,v,t", treg, AT, breg);
5449 dreg = treg;
5450 adj = 8;
5451 }
5452
5453 /* Set mips_optimize around the lui instruction to avoid
5454 inserting an unnecessary nop after the lw. */
5455 hold_mips_optimize = mips_optimize;
5456 mips_optimize = 2;
5457 macro_build_lui (NULL, &icnt, &expr1, AT);
5458 mips_optimize = hold_mips_optimize;
5459
5460 macro_build ((char *) NULL, &icnt, &expr1,
5461 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5462 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5463 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5464 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5465 "d,v,t", dreg, dreg, AT);
5466
5467 p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
5468 RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
5469 8 + gpdel, 0,
5470 (breg == 0
5471 ? mips_opts.warn_about_macros
5472 : 0)),
5473 offset_expr.X_add_symbol, 0, NULL);
5474
5475 used_at = 1;
5476 }
5477
5478 if (gpdel > 0)
5479 {
5480 /* This is needed because this instruction uses $gp, but
5481 the first instruction on the main stream does not. */
5482 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5483 p += 4;
5484 }
5485
5486 macro_build (p, &icnt, &offset_expr,
5487 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5488 "t,o(b)", tempreg,
5489 local_reloc_type,
5490 mips_gp_register);
5491 p += 4;
5492 if (expr1.X_add_number >= -0x8000
5493 && expr1.X_add_number < 0x8000)
5494 {
5495 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5496 p += 4;
5497 macro_build (p, &icnt, &expr1,
5498 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5499 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5500 /* FIXME: If add_number is 0, and there was no base
5501 register, the external symbol case ended with a load,
5502 so if the symbol turns out to not be external, and
5503 the next instruction uses tempreg, an unnecessary nop
5504 will be inserted. */
5505 }
5506 else
5507 {
5508 if (breg == treg)
5509 {
5510 /* We must add in the base register now, as in the
5511 external symbol case. */
5512 assert (tempreg == AT);
5513 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5514 p += 4;
5515 macro_build (p, &icnt, (expressionS *) NULL,
5516 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5517 "d,v,t", treg, AT, breg);
5518 p += 4;
5519 tempreg = treg;
5520 /* We set breg to 0 because we have arranged to add
5521 it in in both cases. */
5522 breg = 0;
5523 }
5524
5525 macro_build_lui (p, &icnt, &expr1, AT);
5526 p += 4;
5527 macro_build (p, &icnt, &expr1,
5528 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5529 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5530 p += 4;
5531 macro_build (p, &icnt, (expressionS *) NULL,
5532 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5533 "d,v,t", tempreg, tempreg, AT);
5534 p += 4;
5535 }
5536 }
5537 else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
5538 {
5539 char *p = NULL;
5540 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5541 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5542 int adj = 0;
5543
5544 /* This is the large GOT case. If this is a reference to an
5545 external symbol, and there is no constant, we want
5546 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5547 add $tempreg,$tempreg,$gp
5548 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5549 or if tempreg is PIC_CALL_REG
5550 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5551 add $tempreg,$tempreg,$gp
5552 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5553
5554 If we have a small constant, and this is a reference to
5555 an external symbol, we want
5556 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5557 add $tempreg,$tempreg,$gp
5558 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5559 addi $tempreg,$tempreg,<constant>
5560
5561 If we have a large constant, and this is a reference to
5562 an external symbol, we want
5563 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5564 addu $tempreg,$tempreg,$gp
5565 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5566 lui $at,<hiconstant>
5567 addi $at,$at,<loconstant>
5568 add $tempreg,$tempreg,$at
5569
5570 If we have NewABI, and we know it's a local symbol, we want
5571 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5572 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5573 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5574
5575 frag_grow (40);
5576
5577 frag_now->tc_frag_data.tc_fr_offset =
5578 expr1.X_add_number = offset_expr.X_add_number;
5579 offset_expr.X_add_number = 0;
5580
5581 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5582 {
5583 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5584 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5585 }
5586 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5587 tempreg, lui_reloc_type);
5588 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5589 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5590 "d,v,t", tempreg, tempreg, mips_gp_register);
5591 macro_build ((char *) NULL, &icnt, &offset_expr,
5592 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5593 "t,o(b)", tempreg, lw_reloc_type, tempreg);
5594
5595 if (expr1.X_add_number == 0)
5596 {
5597 p = frag_var (rs_machine_dependent, 8, 0,
5598 RELAX_ENCODE (12, 8, 0, 4, 0,
5599 mips_opts.warn_about_macros),
5600 offset_expr.X_add_symbol, 0, NULL);
5601 }
5602 else if (expr1.X_add_number >= -0x8000
5603 && expr1.X_add_number < 0x8000)
5604 {
5605 macro_build ((char *) NULL, &icnt, &expr1,
5606 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5607 "t,r,j", tempreg, tempreg,
5608 (int) BFD_RELOC_LO16);
5609 p = frag_var (rs_machine_dependent, 8, 0,
5610 RELAX_ENCODE (16, 8, 0, 4, 0,
5611 mips_opts.warn_about_macros),
5612 offset_expr.X_add_symbol, 0, NULL);
5613 }
5614 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number))
5615 {
5616 int dreg;
5617
5618 /* If we are going to add in a base register, and the
5619 target register and the base register are the same,
5620 then we are using AT as a temporary register. Since
5621 we want to load the constant into AT, we add our
5622 current AT (from the global offset table) and the
5623 register into the register now, and pretend we were
5624 not using a base register. */
5625 if (breg != treg)
5626 dreg = tempreg;
5627 else
5628 {
5629 assert (tempreg == AT);
5630 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5631 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5632 "d,v,t", treg, AT, breg);
5633 dreg = treg;
5634 adj = 4;
5635 }
5636
5637 /* Set mips_optimize around the lui instruction to avoid
5638 inserting an unnecessary nop after the lw. */
5639 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
5640 macro_build ((char *) NULL, &icnt, &expr1,
5641 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5642 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5643 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5644 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5645 "d,v,t", dreg, dreg, AT);
5646
5647 p = frag_var (rs_machine_dependent, 8 + adj, 0,
5648 RELAX_ENCODE (24 + adj, 8 + adj,
5649 0, 4, 0,
5650 (breg == 0
5651 ? mips_opts.warn_about_macros
5652 : 0)),
5653 offset_expr.X_add_symbol, 0, NULL);
5654
5655 used_at = 1;
5656 }
5657 else
5658 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5659
5660 offset_expr.X_add_number = expr1.X_add_number;
5661 macro_build (p, &icnt, &offset_expr,
5662 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5663 tempreg,
5664 (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5665 macro_build (p + 4, &icnt, &offset_expr,
5666 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu", "t,r,j",
5667 tempreg, tempreg, (int) BFD_RELOC_MIPS_GOT_OFST);
5668 if (adj)
5669 {
5670 macro_build (p + 8, &icnt, (expressionS *) NULL,
5671 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5672 "d,v,t", treg, tempreg, breg);
5673 breg = 0;
5674 tempreg = treg;
5675 }
5676 }
5677 else if (mips_pic == EMBEDDED_PIC)
5678 {
5679 /* We use
5680 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5681 */
5682 macro_build ((char *) NULL, &icnt, &offset_expr,
5683 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
5684 tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
5685 }
5686 else
5687 abort ();
5688
5689 if (breg != 0)
5690 {
5691 char *s;
5692
5693 if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5694 s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" :
5695 HAVE_NEWABI ? "add" : "addu";
5696 else
5697 s = HAVE_64BIT_ADDRESSES ? "daddu" : HAVE_NEWABI ? "add" : "addu";
5698
5699 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
5700 "d,v,t", treg, tempreg, breg);
5701 }
5702
5703 if (! used_at)
5704 return;
5705
5706 break;
5707
5708 case M_J_A:
5709 /* The j instruction may not be used in PIC code, since it
5710 requires an absolute address. We convert it to a b
5711 instruction. */
5712 if (mips_pic == NO_PIC)
5713 macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
5714 else
5715 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
5716 return;
5717
5718 /* The jal instructions must be handled as macros because when
5719 generating PIC code they expand to multi-instruction
5720 sequences. Normally they are simple instructions. */
5721 case M_JAL_1:
5722 dreg = RA;
5723 /* Fall through. */
5724 case M_JAL_2:
5725 if (mips_pic == NO_PIC
5726 || mips_pic == EMBEDDED_PIC)
5727 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5728 "d,s", dreg, sreg);
5729 else if (mips_pic == SVR4_PIC)
5730 {
5731 if (sreg != PIC_CALL_REG)
5732 as_warn (_("MIPS PIC call to register other than $25"));
5733
5734 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5735 "d,s", dreg, sreg);
5736 if (! HAVE_NEWABI)
5737 {
5738 if (mips_cprestore_offset < 0)
5739 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5740 else
5741 {
5742 if (! mips_frame_reg_valid)
5743 {
5744 as_warn (_("No .frame pseudo-op used in PIC code"));
5745 /* Quiet this warning. */
5746 mips_frame_reg_valid = 1;
5747 }
5748 if (! mips_cprestore_valid)
5749 {
5750 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5751 /* Quiet this warning. */
5752 mips_cprestore_valid = 1;
5753 }
5754 expr1.X_add_number = mips_cprestore_offset;
5755 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5756 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5757 mips_gp_register, mips_frame_reg);
5758 }
5759 }
5760 }
5761 else
5762 abort ();
5763
5764 return;
5765
5766 case M_JAL_A:
5767 if (mips_pic == NO_PIC)
5768 macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
5769 else if (mips_pic == SVR4_PIC)
5770 {
5771 char *p;
5772
5773 /* If this is a reference to an external symbol, and we are
5774 using a small GOT, we want
5775 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5776 nop
5777 jalr $ra,$25
5778 nop
5779 lw $gp,cprestore($sp)
5780 The cprestore value is set using the .cprestore
5781 pseudo-op. If we are using a big GOT, we want
5782 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5783 addu $25,$25,$gp
5784 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5785 nop
5786 jalr $ra,$25
5787 nop
5788 lw $gp,cprestore($sp)
5789 If the symbol is not external, we want
5790 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5791 nop
5792 addiu $25,$25,<sym> (BFD_RELOC_LO16)
5793 jalr $ra,$25
5794 nop
5795 lw $gp,cprestore($sp)
5796
5797 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5798 sequences above, minus nops, unless the symbol is local,
5799 which enables us to use GOT_PAGE/GOT_OFST (big got) or
5800 GOT_DISP. */
5801 if (HAVE_NEWABI)
5802 {
5803 if (! mips_big_got)
5804 {
5805 frag_grow (4);
5806 macro_build ((char *) NULL, &icnt, &offset_expr,
5807 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5808 "t,o(b)", PIC_CALL_REG,
5809 (int) BFD_RELOC_MIPS_CALL16,
5810 mips_gp_register);
5811 frag_var (rs_machine_dependent, 0, 0,
5812 RELAX_ENCODE (0, 0, -4, 0, 0, 0),
5813 offset_expr.X_add_symbol, 0, NULL);
5814 }
5815 else
5816 {
5817 frag_grow (20);
5818 macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5819 "t,u", PIC_CALL_REG,
5820 (int) BFD_RELOC_MIPS_CALL_HI16);
5821 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5822 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
5823 "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5824 mips_gp_register);
5825 macro_build ((char *) NULL, &icnt, &offset_expr,
5826 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5827 "t,o(b)", PIC_CALL_REG,
5828 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5829 p = frag_var (rs_machine_dependent, 8, 0,
5830 RELAX_ENCODE (12, 8, 0, 4, 0, 0),
5831 offset_expr.X_add_symbol, 0, NULL);
5832 macro_build (p, &icnt, &offset_expr,
5833 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5834 tempreg, (int) BFD_RELOC_MIPS_GOT_PAGE,
5835 mips_gp_register);
5836 macro_build (p + 4, &icnt, &offset_expr,
5837 HAVE_32BIT_ADDRESSES ? "addi" : "daddiu",
5838 "t,r,j", tempreg, tempreg,
5839 (int) BFD_RELOC_MIPS_GOT_OFST);
5840 }
5841
5842 macro_build_jalr (icnt, &offset_expr);
5843 }
5844 else
5845 {
5846 frag_grow (40);
5847 if (! mips_big_got)
5848 {
5849 macro_build ((char *) NULL, &icnt, &offset_expr,
5850 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5851 "t,o(b)", PIC_CALL_REG,
5852 (int) BFD_RELOC_MIPS_CALL16, mips_gp_register);
5853 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5854 "nop", "");
5855 p = frag_var (rs_machine_dependent, 4, 0,
5856 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5857 offset_expr.X_add_symbol, 0, NULL);
5858 }
5859 else
5860 {
5861 int gpdel;
5862
5863 if (reg_needs_delay (mips_gp_register))
5864 gpdel = 4;
5865 else
5866 gpdel = 0;
5867 macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5868 "t,u", PIC_CALL_REG,
5869 (int) BFD_RELOC_MIPS_CALL_HI16);
5870 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5871 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5872 "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5873 mips_gp_register);
5874 macro_build ((char *) NULL, &icnt, &offset_expr,
5875 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5876 "t,o(b)", PIC_CALL_REG,
5877 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5878 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5879 "nop", "");
5880 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5881 RELAX_ENCODE (16, 12 + gpdel, gpdel,
5882 8 + gpdel, 0, 0),
5883 offset_expr.X_add_symbol, 0, NULL);
5884 if (gpdel > 0)
5885 {
5886 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5887 p += 4;
5888 }
5889 macro_build (p, &icnt, &offset_expr,
5890 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5891 "t,o(b)", PIC_CALL_REG,
5892 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
5893 p += 4;
5894 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5895 p += 4;
5896 }
5897 macro_build (p, &icnt, &offset_expr,
5898 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5899 "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
5900 (int) BFD_RELOC_LO16);
5901 macro_build_jalr (icnt, &offset_expr);
5902
5903 if (mips_cprestore_offset < 0)
5904 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5905 else
5906 {
5907 if (! mips_frame_reg_valid)
5908 {
5909 as_warn (_("No .frame pseudo-op used in PIC code"));
5910 /* Quiet this warning. */
5911 mips_frame_reg_valid = 1;
5912 }
5913 if (! mips_cprestore_valid)
5914 {
5915 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5916 /* Quiet this warning. */
5917 mips_cprestore_valid = 1;
5918 }
5919 if (mips_opts.noreorder)
5920 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5921 "nop", "");
5922 expr1.X_add_number = mips_cprestore_offset;
5923 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5924 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5925 mips_gp_register, mips_frame_reg);
5926 }
5927 }
5928 }
5929 else if (mips_pic == EMBEDDED_PIC)
5930 {
5931 macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
5932 /* The linker may expand the call to a longer sequence which
5933 uses $at, so we must break rather than return. */
5934 break;
5935 }
5936 else
5937 abort ();
5938
5939 return;
5940
5941 case M_LB_AB:
5942 s = "lb";
5943 goto ld;
5944 case M_LBU_AB:
5945 s = "lbu";
5946 goto ld;
5947 case M_LH_AB:
5948 s = "lh";
5949 goto ld;
5950 case M_LHU_AB:
5951 s = "lhu";
5952 goto ld;
5953 case M_LW_AB:
5954 s = "lw";
5955 goto ld;
5956 case M_LWC0_AB:
5957 s = "lwc0";
5958 /* Itbl support may require additional care here. */
5959 coproc = 1;
5960 goto ld;
5961 case M_LWC1_AB:
5962 s = "lwc1";
5963 /* Itbl support may require additional care here. */
5964 coproc = 1;
5965 goto ld;
5966 case M_LWC2_AB:
5967 s = "lwc2";
5968 /* Itbl support may require additional care here. */
5969 coproc = 1;
5970 goto ld;
5971 case M_LWC3_AB:
5972 s = "lwc3";
5973 /* Itbl support may require additional care here. */
5974 coproc = 1;
5975 goto ld;
5976 case M_LWL_AB:
5977 s = "lwl";
5978 lr = 1;
5979 goto ld;
5980 case M_LWR_AB:
5981 s = "lwr";
5982 lr = 1;
5983 goto ld;
5984 case M_LDC1_AB:
5985 if (mips_arch == CPU_R4650)
5986 {
5987 as_bad (_("opcode not supported on this processor"));
5988 return;
5989 }
5990 s = "ldc1";
5991 /* Itbl support may require additional care here. */
5992 coproc = 1;
5993 goto ld;
5994 case M_LDC2_AB:
5995 s = "ldc2";
5996 /* Itbl support may require additional care here. */
5997 coproc = 1;
5998 goto ld;
5999 case M_LDC3_AB:
6000 s = "ldc3";
6001 /* Itbl support may require additional care here. */
6002 coproc = 1;
6003 goto ld;
6004 case M_LDL_AB:
6005 s = "ldl";
6006 lr = 1;
6007 goto ld;
6008 case M_LDR_AB:
6009 s = "ldr";
6010 lr = 1;
6011 goto ld;
6012 case M_LL_AB:
6013 s = "ll";
6014 goto ld;
6015 case M_LLD_AB:
6016 s = "lld";
6017 goto ld;
6018 case M_LWU_AB:
6019 s = "lwu";
6020 ld:
6021 if (breg == treg || coproc || lr)
6022 {
6023 tempreg = AT;
6024 used_at = 1;
6025 }
6026 else
6027 {
6028 tempreg = treg;
6029 used_at = 0;
6030 }
6031 goto ld_st;
6032 case M_SB_AB:
6033 s = "sb";
6034 goto st;
6035 case M_SH_AB:
6036 s = "sh";
6037 goto st;
6038 case M_SW_AB:
6039 s = "sw";
6040 goto st;
6041 case M_SWC0_AB:
6042 s = "swc0";
6043 /* Itbl support may require additional care here. */
6044 coproc = 1;
6045 goto st;
6046 case M_SWC1_AB:
6047 s = "swc1";
6048 /* Itbl support may require additional care here. */
6049 coproc = 1;
6050 goto st;
6051 case M_SWC2_AB:
6052 s = "swc2";
6053 /* Itbl support may require additional care here. */
6054 coproc = 1;
6055 goto st;
6056 case M_SWC3_AB:
6057 s = "swc3";
6058 /* Itbl support may require additional care here. */
6059 coproc = 1;
6060 goto st;
6061 case M_SWL_AB:
6062 s = "swl";
6063 goto st;
6064 case M_SWR_AB:
6065 s = "swr";
6066 goto st;
6067 case M_SC_AB:
6068 s = "sc";
6069 goto st;
6070 case M_SCD_AB:
6071 s = "scd";
6072 goto st;
6073 case M_SDC1_AB:
6074 if (mips_arch == CPU_R4650)
6075 {
6076 as_bad (_("opcode not supported on this processor"));
6077 return;
6078 }
6079 s = "sdc1";
6080 coproc = 1;
6081 /* Itbl support may require additional care here. */
6082 goto st;
6083 case M_SDC2_AB:
6084 s = "sdc2";
6085 /* Itbl support may require additional care here. */
6086 coproc = 1;
6087 goto st;
6088 case M_SDC3_AB:
6089 s = "sdc3";
6090 /* Itbl support may require additional care here. */
6091 coproc = 1;
6092 goto st;
6093 case M_SDL_AB:
6094 s = "sdl";
6095 goto st;
6096 case M_SDR_AB:
6097 s = "sdr";
6098 st:
6099 tempreg = AT;
6100 used_at = 1;
6101 ld_st:
6102 /* Itbl support may require additional care here. */
6103 if (mask == M_LWC1_AB
6104 || mask == M_SWC1_AB
6105 || mask == M_LDC1_AB
6106 || mask == M_SDC1_AB
6107 || mask == M_L_DAB
6108 || mask == M_S_DAB)
6109 fmt = "T,o(b)";
6110 else if (coproc)
6111 fmt = "E,o(b)";
6112 else
6113 fmt = "t,o(b)";
6114
6115 /* For embedded PIC, we allow loads where the offset is calculated
6116 by subtracting a symbol in the current segment from an unknown
6117 symbol, relative to a base register, e.g.:
6118 <op> $treg, <sym>-<localsym>($breg)
6119 This is used by the compiler for switch statements. */
6120 if (mips_pic == EMBEDDED_PIC
6121 && offset_expr.X_op == O_subtract
6122 && (symbol_constant_p (offset_expr.X_op_symbol)
6123 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
6124 : (symbol_equated_p (offset_expr.X_op_symbol)
6125 && (S_GET_SEGMENT
6126 (symbol_get_value_expression (offset_expr.X_op_symbol)
6127 ->X_add_symbol)
6128 == now_seg)))
6129 && breg != 0
6130 && (offset_expr.X_add_number == 0
6131 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
6132 {
6133 /* For this case, we output the instructions:
6134 lui $tempreg,<sym> (BFD_RELOC_PCREL_HI16_S)
6135 addiu $tempreg,$tempreg,$breg
6136 <op> $treg,<sym>($tempreg) (BFD_RELOC_PCREL_LO16)
6137 If the relocation would fit entirely in 16 bits, it would be
6138 nice to emit:
6139 <op> $treg,<sym>($breg) (BFD_RELOC_PCREL_LO16)
6140 instead, but that seems quite difficult. */
6141 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6142 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
6143 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6144 ((bfd_arch_bits_per_address (stdoutput) == 32
6145 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
6146 ? HAVE_NEWABI ? "add" : "addu" : "daddu"),
6147 "d,v,t", tempreg, tempreg, breg);
6148 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
6149 (int) BFD_RELOC_PCREL_LO16, tempreg);
6150 if (! used_at)
6151 return;
6152 break;
6153 }
6154
6155 if (offset_expr.X_op != O_constant
6156 && offset_expr.X_op != O_symbol)
6157 {
6158 as_bad (_("expression too complex"));
6159 offset_expr.X_op = O_constant;
6160 }
6161
6162 /* A constant expression in PIC code can be handled just as it
6163 is in non PIC code. */
6164 if (mips_pic == NO_PIC
6165 || offset_expr.X_op == O_constant)
6166 {
6167 char *p;
6168
6169 /* If this is a reference to a GP relative symbol, and there
6170 is no base register, we want
6171 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6172 Otherwise, if there is no base register, we want
6173 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6174 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6175 If we have a constant, we need two instructions anyhow,
6176 so we always use the latter form.
6177
6178 If we have a base register, and this is a reference to a
6179 GP relative symbol, we want
6180 addu $tempreg,$breg,$gp
6181 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6182 Otherwise we want
6183 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6184 addu $tempreg,$tempreg,$breg
6185 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6186 With a constant we always use the latter case.
6187
6188 With 64bit address space and no base register and $at usable,
6189 we want
6190 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6191 lui $at,<sym> (BFD_RELOC_HI16_S)
6192 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6193 dsll32 $tempreg,0
6194 daddu $tempreg,$at
6195 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6196 If we have a base register, we want
6197 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6198 lui $at,<sym> (BFD_RELOC_HI16_S)
6199 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6200 daddu $at,$breg
6201 dsll32 $tempreg,0
6202 daddu $tempreg,$at
6203 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6204
6205 Without $at we can't generate the optimal path for superscalar
6206 processors here since this would require two temporary registers.
6207 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6208 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6209 dsll $tempreg,16
6210 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6211 dsll $tempreg,16
6212 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6213 If we have a base register, we want
6214 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6215 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6216 dsll $tempreg,16
6217 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6218 dsll $tempreg,16
6219 daddu $tempreg,$tempreg,$breg
6220 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6221
6222 If we have 64-bit addresses, as an optimization, for
6223 addresses which are 32-bit constants (e.g. kseg0/kseg1
6224 addresses) we fall back to the 32-bit address generation
6225 mechanism since it is more efficient. Note that due to
6226 the signed offset used by memory operations, the 32-bit
6227 range is shifted down by 32768 here. This code should
6228 probably attempt to generate 64-bit constants more
6229 efficiently in general.
6230
6231 As an extension for architectures with 64-bit registers,
6232 we don't truncate 64-bit addresses given as literal
6233 constants down to 32 bits, to support existing practice
6234 in the mips64 Linux (the kernel), that compiles source
6235 files with -mabi=64, assembling them as o32 or n32 (with
6236 -Wa,-32 or -Wa,-n32). This is not beautiful, but since
6237 the whole kernel is loaded into a memory region that is
6238 addressible with sign-extended 32-bit addresses, it is
6239 wasteful to compute the upper 32 bits of every
6240 non-literal address, that takes more space and time.
6241 Some day this should probably be implemented as an
6242 assembler option, such that the kernel doesn't have to
6243 use such ugly hacks, even though it will still have to
6244 end up converting the binary to ELF32 for a number of
6245 platforms whose boot loaders don't support ELF64
6246 binaries. */
6247 if ((offset_expr.X_op != O_constant && HAVE_64BIT_ADDRESSES)
6248 || (offset_expr.X_op == O_constant
6249 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)
6250 && HAVE_64BIT_ADDRESS_CONSTANTS))
6251 {
6252 p = NULL;
6253
6254 /* We don't do GP optimization for now because RELAX_ENCODE can't
6255 hold the data for such large chunks. */
6256
6257 if (used_at == 0 && ! mips_opts.noat)
6258 {
6259 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6260 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
6261 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6262 AT, (int) BFD_RELOC_HI16_S);
6263 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6264 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
6265 if (breg != 0)
6266 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6267 "d,v,t", AT, AT, breg);
6268 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
6269 "d,w,<", tempreg, tempreg, 0);
6270 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6271 "d,v,t", tempreg, tempreg, AT);
6272 macro_build (p, &icnt, &offset_expr, s,
6273 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
6274 used_at = 1;
6275 }
6276 else
6277 {
6278 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
6279 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
6280 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6281 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
6282 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
6283 "d,w,<", tempreg, tempreg, 16);
6284 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
6285 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
6286 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
6287 "d,w,<", tempreg, tempreg, 16);
6288 if (breg != 0)
6289 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
6290 "d,v,t", tempreg, tempreg, breg);
6291 macro_build (p, &icnt, &offset_expr, s,
6292 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
6293 }
6294
6295 return;
6296 }
6297 else if (offset_expr.X_op == O_constant
6298 && !HAVE_64BIT_ADDRESS_CONSTANTS
6299 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6300 as_bad (_("load/store address overflow (max 32 bits)"));
6301
6302 if (breg == 0)
6303 {
6304 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6305 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6306 p = NULL;
6307 else
6308 {
6309 frag_grow (20);
6310 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6311 treg, (int) BFD_RELOC_GPREL16,
6312 mips_gp_register);
6313 p = frag_var (rs_machine_dependent, 8, 0,
6314 RELAX_ENCODE (4, 8, 0, 4, 0,
6315 (mips_opts.warn_about_macros
6316 || (used_at
6317 && mips_opts.noat))),
6318 offset_expr.X_add_symbol, 0, NULL);
6319 used_at = 0;
6320 }
6321 macro_build_lui (p, &icnt, &offset_expr, tempreg);
6322 if (p != NULL)
6323 p += 4;
6324 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
6325 (int) BFD_RELOC_LO16, tempreg);
6326 }
6327 else
6328 {
6329 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6330 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6331 p = NULL;
6332 else
6333 {
6334 frag_grow (28);
6335 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6336 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6337 ? "add" : "addu" : "daddu",
6338 "d,v,t", tempreg, breg, mips_gp_register);
6339 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6340 treg, (int) BFD_RELOC_GPREL16, tempreg);
6341 p = frag_var (rs_machine_dependent, 12, 0,
6342 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
6343 offset_expr.X_add_symbol, 0, NULL);
6344 }
6345 macro_build_lui (p, &icnt, &offset_expr, tempreg);
6346 if (p != NULL)
6347 p += 4;
6348 macro_build (p, &icnt, (expressionS *) NULL,
6349 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6350 ? "add" : "addu" : "daddu",
6351 "d,v,t", tempreg, tempreg, breg);
6352 if (p != NULL)
6353 p += 4;
6354 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
6355 (int) BFD_RELOC_LO16, tempreg);
6356 }
6357 }
6358 else if (mips_pic == SVR4_PIC && ! mips_big_got)
6359 {
6360 char *p;
6361 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6362
6363 /* If this is a reference to an external symbol, we want
6364 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6365 nop
6366 <op> $treg,0($tempreg)
6367 Otherwise we want
6368 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6369 nop
6370 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6371 <op> $treg,0($tempreg)
6372
6373 For NewABI, we want
6374 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6375 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6376
6377 If there is a base register, we add it to $tempreg before
6378 the <op>. If there is a constant, we stick it in the
6379 <op> instruction. We don't handle constants larger than
6380 16 bits, because we have no way to load the upper 16 bits
6381 (actually, we could handle them for the subset of cases
6382 in which we are not using $at). */
6383 assert (offset_expr.X_op == O_symbol);
6384 if (HAVE_NEWABI)
6385 {
6386 macro_build ((char *) NULL, &icnt, &offset_expr,
6387 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6388 "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_PAGE,
6389 mips_gp_register);
6390 if (breg != 0)
6391 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6392 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6393 "d,v,t", tempreg, tempreg, breg);
6394 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
6395 (int) BFD_RELOC_MIPS_GOT_OFST, tempreg);
6396
6397 if (! used_at)
6398 return;
6399
6400 break;
6401 }
6402 expr1.X_add_number = offset_expr.X_add_number;
6403 offset_expr.X_add_number = 0;
6404 if (expr1.X_add_number < -0x8000
6405 || expr1.X_add_number >= 0x8000)
6406 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6407 frag_grow (20);
6408 macro_build ((char *) NULL, &icnt, &offset_expr,
6409 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
6410 (int) lw_reloc_type, mips_gp_register);
6411 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6412 p = frag_var (rs_machine_dependent, 4, 0,
6413 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
6414 offset_expr.X_add_symbol, 0, NULL);
6415 macro_build (p, &icnt, &offset_expr,
6416 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6417 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6418 if (breg != 0)
6419 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6420 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6421 "d,v,t", tempreg, tempreg, breg);
6422 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6423 (int) BFD_RELOC_LO16, tempreg);
6424 }
6425 else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
6426 {
6427 int gpdel;
6428 char *p;
6429
6430 /* If this is a reference to an external symbol, we want
6431 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6432 addu $tempreg,$tempreg,$gp
6433 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6434 <op> $treg,0($tempreg)
6435 Otherwise we want
6436 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6437 nop
6438 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6439 <op> $treg,0($tempreg)
6440 If there is a base register, we add it to $tempreg before
6441 the <op>. If there is a constant, we stick it in the
6442 <op> instruction. We don't handle constants larger than
6443 16 bits, because we have no way to load the upper 16 bits
6444 (actually, we could handle them for the subset of cases
6445 in which we are not using $at). */
6446 assert (offset_expr.X_op == O_symbol);
6447 expr1.X_add_number = offset_expr.X_add_number;
6448 offset_expr.X_add_number = 0;
6449 if (expr1.X_add_number < -0x8000
6450 || expr1.X_add_number >= 0x8000)
6451 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6452 if (reg_needs_delay (mips_gp_register))
6453 gpdel = 4;
6454 else
6455 gpdel = 0;
6456 frag_grow (36);
6457 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6458 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6459 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6460 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6461 "d,v,t", tempreg, tempreg, mips_gp_register);
6462 macro_build ((char *) NULL, &icnt, &offset_expr,
6463 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6464 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6465 tempreg);
6466 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
6467 RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
6468 offset_expr.X_add_symbol, 0, NULL);
6469 if (gpdel > 0)
6470 {
6471 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6472 p += 4;
6473 }
6474 macro_build (p, &icnt, &offset_expr,
6475 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6476 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
6477 mips_gp_register);
6478 p += 4;
6479 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6480 p += 4;
6481 macro_build (p, &icnt, &offset_expr,
6482 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6483 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6484 if (breg != 0)
6485 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6486 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6487 "d,v,t", tempreg, tempreg, breg);
6488 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6489 (int) BFD_RELOC_LO16, tempreg);
6490 }
6491 else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
6492 {
6493 char *p;
6494 int bregsz = breg != 0 ? 4 : 0;
6495
6496 /* If this is a reference to an external symbol, we want
6497 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6498 add $tempreg,$tempreg,$gp
6499 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6500 <op> $treg,<ofst>($tempreg)
6501 Otherwise, for local symbols, we want:
6502 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6503 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6504 assert (offset_expr.X_op == O_symbol);
6505 frag_now->tc_frag_data.tc_fr_offset =
6506 expr1.X_add_number = offset_expr.X_add_number;
6507 offset_expr.X_add_number = 0;
6508 if (expr1.X_add_number < -0x8000
6509 || expr1.X_add_number >= 0x8000)
6510 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6511 frag_grow (36);
6512 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6513 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6514 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6515 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6516 "d,v,t", tempreg, tempreg, mips_gp_register);
6517 macro_build ((char *) NULL, &icnt, &offset_expr,
6518 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6519 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6520 tempreg);
6521 if (breg != 0)
6522 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6523 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6524 "d,v,t", tempreg, tempreg, breg);
6525 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6526 (int) BFD_RELOC_LO16, tempreg);
6527
6528 offset_expr.X_add_number = expr1.X_add_number;
6529 p = frag_var (rs_machine_dependent, 12 + bregsz, 0,
6530 RELAX_ENCODE (16 + bregsz, 8 + bregsz,
6531 0, 4 + bregsz, 0, 0),
6532 offset_expr.X_add_symbol, 0, NULL);
6533 macro_build (p, &icnt, &offset_expr,
6534 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6535 "t,o(b)", tempreg,
6536 (int) BFD_RELOC_MIPS_GOT_PAGE,
6537 mips_gp_register);
6538 if (breg != 0)
6539 macro_build (p + 4, &icnt, (expressionS *) NULL,
6540 HAVE_32BIT_ADDRESSES ? "add" : "daddu",
6541 "d,v,t", tempreg, tempreg, breg);
6542 macro_build (p + 4 + bregsz, &icnt, &offset_expr, s, fmt, treg,
6543 (int) BFD_RELOC_MIPS_GOT_OFST, tempreg);
6544 }
6545 else if (mips_pic == EMBEDDED_PIC)
6546 {
6547 /* If there is no base register, we want
6548 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6549 If there is a base register, we want
6550 addu $tempreg,$breg,$gp
6551 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6552 */
6553 assert (offset_expr.X_op == O_symbol);
6554 if (breg == 0)
6555 {
6556 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6557 treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
6558 used_at = 0;
6559 }
6560 else
6561 {
6562 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6563 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6564 "d,v,t", tempreg, breg, mips_gp_register);
6565 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6566 treg, (int) BFD_RELOC_GPREL16, tempreg);
6567 }
6568 }
6569 else
6570 abort ();
6571
6572 if (! used_at)
6573 return;
6574
6575 break;
6576
6577 case M_LI:
6578 case M_LI_S:
6579 load_register (&icnt, treg, &imm_expr, 0);
6580 return;
6581
6582 case M_DLI:
6583 load_register (&icnt, treg, &imm_expr, 1);
6584 return;
6585
6586 case M_LI_SS:
6587 if (imm_expr.X_op == O_constant)
6588 {
6589 load_register (&icnt, AT, &imm_expr, 0);
6590 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6591 "mtc1", "t,G", AT, treg);
6592 break;
6593 }
6594 else
6595 {
6596 assert (offset_expr.X_op == O_symbol
6597 && strcmp (segment_name (S_GET_SEGMENT
6598 (offset_expr.X_add_symbol)),
6599 ".lit4") == 0
6600 && offset_expr.X_add_number == 0);
6601 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6602 treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6603 return;
6604 }
6605
6606 case M_LI_D:
6607 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6608 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6609 order 32 bits of the value and the low order 32 bits are either
6610 zero or in OFFSET_EXPR. */
6611 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6612 {
6613 if (HAVE_64BIT_GPRS)
6614 load_register (&icnt, treg, &imm_expr, 1);
6615 else
6616 {
6617 int hreg, lreg;
6618
6619 if (target_big_endian)
6620 {
6621 hreg = treg;
6622 lreg = treg + 1;
6623 }
6624 else
6625 {
6626 hreg = treg + 1;
6627 lreg = treg;
6628 }
6629
6630 if (hreg <= 31)
6631 load_register (&icnt, hreg, &imm_expr, 0);
6632 if (lreg <= 31)
6633 {
6634 if (offset_expr.X_op == O_absent)
6635 move_register (&icnt, lreg, 0);
6636 else
6637 {
6638 assert (offset_expr.X_op == O_constant);
6639 load_register (&icnt, lreg, &offset_expr, 0);
6640 }
6641 }
6642 }
6643 return;
6644 }
6645
6646 /* We know that sym is in the .rdata section. First we get the
6647 upper 16 bits of the address. */
6648 if (mips_pic == NO_PIC)
6649 {
6650 macro_build_lui (NULL, &icnt, &offset_expr, AT);
6651 }
6652 else if (mips_pic == SVR4_PIC)
6653 {
6654 macro_build ((char *) NULL, &icnt, &offset_expr,
6655 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6656 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6657 mips_gp_register);
6658 }
6659 else if (mips_pic == EMBEDDED_PIC)
6660 {
6661 /* For embedded PIC we pick up the entire address off $gp in
6662 a single instruction. */
6663 macro_build ((char *) NULL, &icnt, &offset_expr,
6664 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
6665 mips_gp_register, (int) BFD_RELOC_GPREL16);
6666 offset_expr.X_op = O_constant;
6667 offset_expr.X_add_number = 0;
6668 }
6669 else
6670 abort ();
6671
6672 /* Now we load the register(s). */
6673 if (HAVE_64BIT_GPRS)
6674 macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
6675 treg, (int) BFD_RELOC_LO16, AT);
6676 else
6677 {
6678 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6679 treg, (int) BFD_RELOC_LO16, AT);
6680 if (treg != RA)
6681 {
6682 /* FIXME: How in the world do we deal with the possible
6683 overflow here? */
6684 offset_expr.X_add_number += 4;
6685 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6686 treg + 1, (int) BFD_RELOC_LO16, AT);
6687 }
6688 }
6689
6690 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6691 does not become a variant frag. */
6692 frag_wane (frag_now);
6693 frag_new (0);
6694
6695 break;
6696
6697 case M_LI_DD:
6698 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6699 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6700 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6701 the value and the low order 32 bits are either zero or in
6702 OFFSET_EXPR. */
6703 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6704 {
6705 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
6706 if (HAVE_64BIT_FPRS)
6707 {
6708 assert (HAVE_64BIT_GPRS);
6709 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6710 "dmtc1", "t,S", AT, treg);
6711 }
6712 else
6713 {
6714 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6715 "mtc1", "t,G", AT, treg + 1);
6716 if (offset_expr.X_op == O_absent)
6717 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6718 "mtc1", "t,G", 0, treg);
6719 else
6720 {
6721 assert (offset_expr.X_op == O_constant);
6722 load_register (&icnt, AT, &offset_expr, 0);
6723 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6724 "mtc1", "t,G", AT, treg);
6725 }
6726 }
6727 break;
6728 }
6729
6730 assert (offset_expr.X_op == O_symbol
6731 && offset_expr.X_add_number == 0);
6732 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6733 if (strcmp (s, ".lit8") == 0)
6734 {
6735 if (mips_opts.isa != ISA_MIPS1)
6736 {
6737 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6738 "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
6739 mips_gp_register);
6740 return;
6741 }
6742 breg = mips_gp_register;
6743 r = BFD_RELOC_MIPS_LITERAL;
6744 goto dob;
6745 }
6746 else
6747 {
6748 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6749 if (mips_pic == SVR4_PIC)
6750 macro_build ((char *) NULL, &icnt, &offset_expr,
6751 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6752 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6753 mips_gp_register);
6754 else
6755 {
6756 /* FIXME: This won't work for a 64 bit address. */
6757 macro_build_lui (NULL, &icnt, &offset_expr, AT);
6758 }
6759
6760 if (mips_opts.isa != ISA_MIPS1)
6761 {
6762 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6763 "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
6764
6765 /* To avoid confusion in tc_gen_reloc, we must ensure
6766 that this does not become a variant frag. */
6767 frag_wane (frag_now);
6768 frag_new (0);
6769
6770 break;
6771 }
6772 breg = AT;
6773 r = BFD_RELOC_LO16;
6774 goto dob;
6775 }
6776
6777 case M_L_DOB:
6778 if (mips_arch == CPU_R4650)
6779 {
6780 as_bad (_("opcode not supported on this processor"));
6781 return;
6782 }
6783 /* Even on a big endian machine $fn comes before $fn+1. We have
6784 to adjust when loading from memory. */
6785 r = BFD_RELOC_LO16;
6786 dob:
6787 assert (mips_opts.isa == ISA_MIPS1);
6788 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6789 target_big_endian ? treg + 1 : treg,
6790 (int) r, breg);
6791 /* FIXME: A possible overflow which I don't know how to deal
6792 with. */
6793 offset_expr.X_add_number += 4;
6794 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6795 target_big_endian ? treg : treg + 1,
6796 (int) r, breg);
6797
6798 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6799 does not become a variant frag. */
6800 frag_wane (frag_now);
6801 frag_new (0);
6802
6803 if (breg != AT)
6804 return;
6805 break;
6806
6807 case M_L_DAB:
6808 /*
6809 * The MIPS assembler seems to check for X_add_number not
6810 * being double aligned and generating:
6811 * lui at,%hi(foo+1)
6812 * addu at,at,v1
6813 * addiu at,at,%lo(foo+1)
6814 * lwc1 f2,0(at)
6815 * lwc1 f3,4(at)
6816 * But, the resulting address is the same after relocation so why
6817 * generate the extra instruction?
6818 */
6819 if (mips_arch == CPU_R4650)
6820 {
6821 as_bad (_("opcode not supported on this processor"));
6822 return;
6823 }
6824 /* Itbl support may require additional care here. */
6825 coproc = 1;
6826 if (mips_opts.isa != ISA_MIPS1)
6827 {
6828 s = "ldc1";
6829 goto ld;
6830 }
6831
6832 s = "lwc1";
6833 fmt = "T,o(b)";
6834 goto ldd_std;
6835
6836 case M_S_DAB:
6837 if (mips_arch == CPU_R4650)
6838 {
6839 as_bad (_("opcode not supported on this processor"));
6840 return;
6841 }
6842
6843 if (mips_opts.isa != ISA_MIPS1)
6844 {
6845 s = "sdc1";
6846 goto st;
6847 }
6848
6849 s = "swc1";
6850 fmt = "T,o(b)";
6851 /* Itbl support may require additional care here. */
6852 coproc = 1;
6853 goto ldd_std;
6854
6855 case M_LD_AB:
6856 if (HAVE_64BIT_GPRS)
6857 {
6858 s = "ld";
6859 goto ld;
6860 }
6861
6862 s = "lw";
6863 fmt = "t,o(b)";
6864 goto ldd_std;
6865
6866 case M_SD_AB:
6867 if (HAVE_64BIT_GPRS)
6868 {
6869 s = "sd";
6870 goto st;
6871 }
6872
6873 s = "sw";
6874 fmt = "t,o(b)";
6875
6876 ldd_std:
6877 /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6878 loads for the case of doing a pair of loads to simulate an 'ld'.
6879 This is not currently done by the compiler, and assembly coders
6880 writing embedded-pic code can cope. */
6881
6882 if (offset_expr.X_op != O_symbol
6883 && offset_expr.X_op != O_constant)
6884 {
6885 as_bad (_("expression too complex"));
6886 offset_expr.X_op = O_constant;
6887 }
6888
6889 /* Even on a big endian machine $fn comes before $fn+1. We have
6890 to adjust when loading from memory. We set coproc if we must
6891 load $fn+1 first. */
6892 /* Itbl support may require additional care here. */
6893 if (! target_big_endian)
6894 coproc = 0;
6895
6896 if (mips_pic == NO_PIC
6897 || offset_expr.X_op == O_constant)
6898 {
6899 char *p;
6900
6901 /* If this is a reference to a GP relative symbol, we want
6902 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6903 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6904 If we have a base register, we use this
6905 addu $at,$breg,$gp
6906 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6907 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6908 If this is not a GP relative symbol, we want
6909 lui $at,<sym> (BFD_RELOC_HI16_S)
6910 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6911 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6912 If there is a base register, we add it to $at after the
6913 lui instruction. If there is a constant, we always use
6914 the last case. */
6915 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6916 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6917 {
6918 p = NULL;
6919 used_at = 1;
6920 }
6921 else
6922 {
6923 int off;
6924
6925 if (breg == 0)
6926 {
6927 frag_grow (28);
6928 tempreg = mips_gp_register;
6929 off = 0;
6930 used_at = 0;
6931 }
6932 else
6933 {
6934 frag_grow (36);
6935 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6936 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6937 ? "add" : "addu" : "daddu",
6938 "d,v,t", AT, breg, mips_gp_register);
6939 tempreg = AT;
6940 off = 4;
6941 used_at = 1;
6942 }
6943
6944 /* Itbl support may require additional care here. */
6945 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6946 coproc ? treg + 1 : treg,
6947 (int) BFD_RELOC_GPREL16, tempreg);
6948 offset_expr.X_add_number += 4;
6949
6950 /* Set mips_optimize to 2 to avoid inserting an
6951 undesired nop. */
6952 hold_mips_optimize = mips_optimize;
6953 mips_optimize = 2;
6954 /* Itbl support may require additional care here. */
6955 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6956 coproc ? treg : treg + 1,
6957 (int) BFD_RELOC_GPREL16, tempreg);
6958 mips_optimize = hold_mips_optimize;
6959
6960 p = frag_var (rs_machine_dependent, 12 + off, 0,
6961 RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
6962 used_at && mips_opts.noat),
6963 offset_expr.X_add_symbol, 0, NULL);
6964
6965 /* We just generated two relocs. When tc_gen_reloc
6966 handles this case, it will skip the first reloc and
6967 handle the second. The second reloc already has an
6968 extra addend of 4, which we added above. We must
6969 subtract it out, and then subtract another 4 to make
6970 the first reloc come out right. The second reloc
6971 will come out right because we are going to add 4 to
6972 offset_expr when we build its instruction below.
6973
6974 If we have a symbol, then we don't want to include
6975 the offset, because it will wind up being included
6976 when we generate the reloc. */
6977
6978 if (offset_expr.X_op == O_constant)
6979 offset_expr.X_add_number -= 8;
6980 else
6981 {
6982 offset_expr.X_add_number = -4;
6983 offset_expr.X_op = O_constant;
6984 }
6985 }
6986 macro_build_lui (p, &icnt, &offset_expr, AT);
6987 if (p != NULL)
6988 p += 4;
6989 if (breg != 0)
6990 {
6991 macro_build (p, &icnt, (expressionS *) NULL,
6992 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
6993 ? "add" : "addu" : "daddu",
6994 "d,v,t", AT, breg, AT);
6995 if (p != NULL)
6996 p += 4;
6997 }
6998 /* Itbl support may require additional care here. */
6999 macro_build (p, &icnt, &offset_expr, s, fmt,
7000 coproc ? treg + 1 : treg,
7001 (int) BFD_RELOC_LO16, AT);
7002 if (p != NULL)
7003 p += 4;
7004 /* FIXME: How do we handle overflow here? */
7005 offset_expr.X_add_number += 4;
7006 /* Itbl support may require additional care here. */
7007 macro_build (p, &icnt, &offset_expr, s, fmt,
7008 coproc ? treg : treg + 1,
7009 (int) BFD_RELOC_LO16, AT);
7010 }
7011 else if (mips_pic == SVR4_PIC && ! mips_big_got)
7012 {
7013 int off;
7014
7015 /* If this is a reference to an external symbol, we want
7016 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7017 nop
7018 <op> $treg,0($at)
7019 <op> $treg+1,4($at)
7020 Otherwise we want
7021 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7022 nop
7023 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7024 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7025 If there is a base register we add it to $at before the
7026 lwc1 instructions. If there is a constant we include it
7027 in the lwc1 instructions. */
7028 used_at = 1;
7029 expr1.X_add_number = offset_expr.X_add_number;
7030 offset_expr.X_add_number = 0;
7031 if (expr1.X_add_number < -0x8000
7032 || expr1.X_add_number >= 0x8000 - 4)
7033 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7034 if (breg == 0)
7035 off = 0;
7036 else
7037 off = 4;
7038 frag_grow (24 + off);
7039 macro_build ((char *) NULL, &icnt, &offset_expr,
7040 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
7041 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
7042 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7043 if (breg != 0)
7044 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7045 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7046 ? "add" : "addu" : "daddu",
7047 "d,v,t", AT, breg, AT);
7048 /* Itbl support may require additional care here. */
7049 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7050 coproc ? treg + 1 : treg,
7051 (int) BFD_RELOC_LO16, AT);
7052 expr1.X_add_number += 4;
7053
7054 /* Set mips_optimize to 2 to avoid inserting an undesired
7055 nop. */
7056 hold_mips_optimize = mips_optimize;
7057 mips_optimize = 2;
7058 /* Itbl support may require additional care here. */
7059 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7060 coproc ? treg : treg + 1,
7061 (int) BFD_RELOC_LO16, AT);
7062 mips_optimize = hold_mips_optimize;
7063
7064 (void) frag_var (rs_machine_dependent, 0, 0,
7065 RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
7066 offset_expr.X_add_symbol, 0, NULL);
7067 }
7068 else if (mips_pic == SVR4_PIC)
7069 {
7070 int gpdel, off;
7071 char *p;
7072
7073 /* If this is a reference to an external symbol, we want
7074 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7075 addu $at,$at,$gp
7076 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7077 nop
7078 <op> $treg,0($at)
7079 <op> $treg+1,4($at)
7080 Otherwise we want
7081 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7082 nop
7083 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7084 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7085 If there is a base register we add it to $at before the
7086 lwc1 instructions. If there is a constant we include it
7087 in the lwc1 instructions. */
7088 used_at = 1;
7089 expr1.X_add_number = offset_expr.X_add_number;
7090 offset_expr.X_add_number = 0;
7091 if (expr1.X_add_number < -0x8000
7092 || expr1.X_add_number >= 0x8000 - 4)
7093 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7094 if (reg_needs_delay (mips_gp_register))
7095 gpdel = 4;
7096 else
7097 gpdel = 0;
7098 if (breg == 0)
7099 off = 0;
7100 else
7101 off = 4;
7102 frag_grow (56);
7103 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
7104 AT, (int) BFD_RELOC_MIPS_GOT_HI16);
7105 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7106 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7107 ? "add" : "addu" : "daddu",
7108 "d,v,t", AT, AT, mips_gp_register);
7109 macro_build ((char *) NULL, &icnt, &offset_expr,
7110 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
7111 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
7112 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7113 if (breg != 0)
7114 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7115 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7116 ? "add" : "addu" : "daddu",
7117 "d,v,t", AT, breg, AT);
7118 /* Itbl support may require additional care here. */
7119 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7120 coproc ? treg + 1 : treg,
7121 (int) BFD_RELOC_LO16, AT);
7122 expr1.X_add_number += 4;
7123
7124 /* Set mips_optimize to 2 to avoid inserting an undesired
7125 nop. */
7126 hold_mips_optimize = mips_optimize;
7127 mips_optimize = 2;
7128 /* Itbl support may require additional care here. */
7129 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
7130 coproc ? treg : treg + 1,
7131 (int) BFD_RELOC_LO16, AT);
7132 mips_optimize = hold_mips_optimize;
7133 expr1.X_add_number -= 4;
7134
7135 p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
7136 RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
7137 8 + gpdel + off, 1, 0),
7138 offset_expr.X_add_symbol, 0, NULL);
7139 if (gpdel > 0)
7140 {
7141 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
7142 p += 4;
7143 }
7144 macro_build (p, &icnt, &offset_expr,
7145 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
7146 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
7147 mips_gp_register);
7148 p += 4;
7149 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
7150 p += 4;
7151 if (breg != 0)
7152 {
7153 macro_build (p, &icnt, (expressionS *) NULL,
7154 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
7155 ? "add" : "addu" : "daddu",
7156 "d,v,t", AT, breg, AT);
7157 p += 4;
7158 }
7159 /* Itbl support may require additional care here. */
7160 macro_build (p, &icnt, &expr1, s, fmt,
7161 coproc ? treg + 1 : treg,
7162 (int) BFD_RELOC_LO16, AT);
7163 p += 4;
7164 expr1.X_add_number += 4;
7165
7166 /* Set mips_optimize to 2 to avoid inserting an undesired
7167 nop. */
7168 hold_mips_optimize = mips_optimize;
7169 mips_optimize = 2;
7170 /* Itbl support may require additional care here. */
7171 macro_build (p, &icnt, &expr1, s, fmt,
7172 coproc ? treg : treg + 1,
7173 (int) BFD_RELOC_LO16, AT);
7174 mips_optimize = hold_mips_optimize;
7175 }
7176 else if (mips_pic == EMBEDDED_PIC)
7177 {
7178 /* If there is no base register, we use
7179 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7180 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
7181 If we have a base register, we use
7182 addu $at,$breg,$gp
7183 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7184 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
7185 */
7186 if (breg == 0)
7187 {
7188 tempreg = mips_gp_register;
7189 used_at = 0;
7190 }
7191 else
7192 {
7193 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7194 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7195 "d,v,t", AT, breg, mips_gp_register);
7196 tempreg = AT;
7197 used_at = 1;
7198 }
7199
7200 /* Itbl support may require additional care here. */
7201 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
7202 coproc ? treg + 1 : treg,
7203 (int) BFD_RELOC_GPREL16, tempreg);
7204 offset_expr.X_add_number += 4;
7205 /* Itbl support may require additional care here. */
7206 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
7207 coproc ? treg : treg + 1,
7208 (int) BFD_RELOC_GPREL16, tempreg);
7209 }
7210 else
7211 abort ();
7212
7213 if (! used_at)
7214 return;
7215
7216 break;
7217
7218 case M_LD_OB:
7219 s = "lw";
7220 goto sd_ob;
7221 case M_SD_OB:
7222 s = "sw";
7223 sd_ob:
7224 assert (HAVE_32BIT_ADDRESSES);
7225 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7226 (int) BFD_RELOC_LO16, breg);
7227 offset_expr.X_add_number += 4;
7228 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
7229 (int) BFD_RELOC_LO16, breg);
7230 return;
7231
7232 /* New code added to support COPZ instructions.
7233 This code builds table entries out of the macros in mip_opcodes.
7234 R4000 uses interlocks to handle coproc delays.
7235 Other chips (like the R3000) require nops to be inserted for delays.
7236
7237 FIXME: Currently, we require that the user handle delays.
7238 In order to fill delay slots for non-interlocked chips,
7239 we must have a way to specify delays based on the coprocessor.
7240 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7241 What are the side-effects of the cop instruction?
7242 What cache support might we have and what are its effects?
7243 Both coprocessor & memory require delays. how long???
7244 What registers are read/set/modified?
7245
7246 If an itbl is provided to interpret cop instructions,
7247 this knowledge can be encoded in the itbl spec. */
7248
7249 case M_COP0:
7250 s = "c0";
7251 goto copz;
7252 case M_COP1:
7253 s = "c1";
7254 goto copz;
7255 case M_COP2:
7256 s = "c2";
7257 goto copz;
7258 case M_COP3:
7259 s = "c3";
7260 copz:
7261 /* For now we just do C (same as Cz). The parameter will be
7262 stored in insn_opcode by mips_ip. */
7263 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
7264 ip->insn_opcode);
7265 return;
7266
7267 case M_MOVE:
7268 move_register (&icnt, dreg, sreg);
7269 return;
7270
7271 #ifdef LOSING_COMPILER
7272 default:
7273 /* Try and see if this is a new itbl instruction.
7274 This code builds table entries out of the macros in mip_opcodes.
7275 FIXME: For now we just assemble the expression and pass it's
7276 value along as a 32-bit immediate.
7277 We may want to have the assembler assemble this value,
7278 so that we gain the assembler's knowledge of delay slots,
7279 symbols, etc.
7280 Would it be more efficient to use mask (id) here? */
7281 if (itbl_have_entries
7282 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7283 {
7284 s = ip->insn_mo->name;
7285 s2 = "cop3";
7286 coproc = ITBL_DECODE_PNUM (immed_expr);;
7287 macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
7288 return;
7289 }
7290 macro2 (ip);
7291 return;
7292 }
7293 if (mips_opts.noat)
7294 as_warn (_("Macro used $at after \".set noat\""));
7295 }
7296
7297 static void
7298 macro2 (ip)
7299 struct mips_cl_insn *ip;
7300 {
7301 register int treg, sreg, dreg, breg;
7302 int tempreg;
7303 int mask;
7304 int icnt = 0;
7305 int used_at;
7306 expressionS expr1;
7307 const char *s;
7308 const char *s2;
7309 const char *fmt;
7310 int likely = 0;
7311 int dbl = 0;
7312 int coproc = 0;
7313 int lr = 0;
7314 int imm = 0;
7315 int off;
7316 offsetT maxnum;
7317 bfd_reloc_code_real_type r;
7318 char *p;
7319
7320 treg = (ip->insn_opcode >> 16) & 0x1f;
7321 dreg = (ip->insn_opcode >> 11) & 0x1f;
7322 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7323 mask = ip->insn_mo->mask;
7324
7325 expr1.X_op = O_constant;
7326 expr1.X_op_symbol = NULL;
7327 expr1.X_add_symbol = NULL;
7328 expr1.X_add_number = 1;
7329
7330 switch (mask)
7331 {
7332 #endif /* LOSING_COMPILER */
7333
7334 case M_DMUL:
7335 dbl = 1;
7336 case M_MUL:
7337 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7338 dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7339 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7340 dreg);
7341 return;
7342
7343 case M_DMUL_I:
7344 dbl = 1;
7345 case M_MUL_I:
7346 /* The MIPS assembler some times generates shifts and adds. I'm
7347 not trying to be that fancy. GCC should do this for us
7348 anyway. */
7349 load_register (&icnt, AT, &imm_expr, dbl);
7350 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7351 dbl ? "dmult" : "mult", "s,t", sreg, AT);
7352 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7353 dreg);
7354 break;
7355
7356 case M_DMULO_I:
7357 dbl = 1;
7358 case M_MULO_I:
7359 imm = 1;
7360 goto do_mulo;
7361
7362 case M_DMULO:
7363 dbl = 1;
7364 case M_MULO:
7365 do_mulo:
7366 mips_emit_delays (TRUE);
7367 ++mips_opts.noreorder;
7368 mips_any_noreorder = 1;
7369 if (imm)
7370 load_register (&icnt, AT, &imm_expr, dbl);
7371 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7372 dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7373 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7374 dreg);
7375 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7376 dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7377 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
7378 AT);
7379 if (mips_trap)
7380 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
7381 "s,t,q", dreg, AT, 6);
7382 else
7383 {
7384 expr1.X_add_number = 8;
7385 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg,
7386 AT);
7387 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
7388 0);
7389 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7390 "c", 6);
7391 }
7392 --mips_opts.noreorder;
7393 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d", dreg);
7394 break;
7395
7396 case M_DMULOU_I:
7397 dbl = 1;
7398 case M_MULOU_I:
7399 imm = 1;
7400 goto do_mulou;
7401
7402 case M_DMULOU:
7403 dbl = 1;
7404 case M_MULOU:
7405 do_mulou:
7406 mips_emit_delays (TRUE);
7407 ++mips_opts.noreorder;
7408 mips_any_noreorder = 1;
7409 if (imm)
7410 load_register (&icnt, AT, &imm_expr, dbl);
7411 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7412 dbl ? "dmultu" : "multu",
7413 "s,t", sreg, imm ? AT : treg);
7414 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
7415 AT);
7416 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
7417 dreg);
7418 if (mips_trap)
7419 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
7420 "s,t,q", AT, 0, 6);
7421 else
7422 {
7423 expr1.X_add_number = 8;
7424 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
7425 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
7426 0);
7427 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7428 "c", 6);
7429 }
7430 --mips_opts.noreorder;
7431 break;
7432
7433 case M_DROL:
7434 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7435 {
7436 if (dreg == sreg)
7437 {
7438 tempreg = AT;
7439 used_at = 1;
7440 }
7441 else
7442 {
7443 tempreg = dreg;
7444 used_at = 0;
7445 }
7446 macro_build ((char *) NULL, &icnt, NULL, "dnegu",
7447 "d,w", tempreg, treg);
7448 macro_build ((char *) NULL, &icnt, NULL, "drorv",
7449 "d,t,s", dreg, sreg, tempreg);
7450 if (used_at)
7451 break;
7452 return;
7453 }
7454 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7455 "d,v,t", AT, 0, treg);
7456 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7457 "d,t,s", AT, sreg, AT);
7458 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7459 "d,t,s", dreg, sreg, treg);
7460 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7461 "d,v,t", dreg, dreg, AT);
7462 break;
7463
7464 case M_ROL:
7465 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7466 {
7467 if (dreg == sreg)
7468 {
7469 tempreg = AT;
7470 used_at = 1;
7471 }
7472 else
7473 {
7474 tempreg = dreg;
7475 used_at = 0;
7476 }
7477 macro_build ((char *) NULL, &icnt, NULL, "negu",
7478 "d,w", tempreg, treg);
7479 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7480 "d,t,s", dreg, sreg, tempreg);
7481 if (used_at)
7482 break;
7483 return;
7484 }
7485 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7486 "d,v,t", AT, 0, treg);
7487 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7488 "d,t,s", AT, sreg, AT);
7489 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7490 "d,t,s", dreg, sreg, treg);
7491 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7492 "d,v,t", dreg, dreg, AT);
7493 break;
7494
7495 case M_DROL_I:
7496 {
7497 unsigned int rot;
7498 char *l, *r;
7499
7500 if (imm_expr.X_op != O_constant)
7501 as_bad (_("Improper rotate count"));
7502 rot = imm_expr.X_add_number & 0x3f;
7503 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7504 {
7505 rot = (64 - rot) & 0x3f;
7506 if (rot >= 32)
7507 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7508 "d,w,<", dreg, sreg, rot - 32);
7509 else
7510 macro_build ((char *) NULL, &icnt, NULL, "dror",
7511 "d,w,<", dreg, sreg, rot);
7512 return;
7513 }
7514 if (rot == 0)
7515 {
7516 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7517 "d,w,<", dreg, sreg, 0);
7518 return;
7519 }
7520 l = (rot < 0x20) ? "dsll" : "dsll32";
7521 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7522 rot &= 0x1f;
7523 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7524 "d,w,<", AT, sreg, rot);
7525 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7526 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7527 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7528 "d,v,t", dreg, dreg, AT);
7529 }
7530 break;
7531
7532 case M_ROL_I:
7533 {
7534 unsigned int rot;
7535
7536 if (imm_expr.X_op != O_constant)
7537 as_bad (_("Improper rotate count"));
7538 rot = imm_expr.X_add_number & 0x1f;
7539 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7540 {
7541 macro_build ((char *) NULL, &icnt, NULL, "ror",
7542 "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7543 return;
7544 }
7545 if (rot == 0)
7546 {
7547 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7548 "d,w,<", dreg, sreg, 0);
7549 return;
7550 }
7551 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7552 "d,w,<", AT, sreg, rot);
7553 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7554 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7555 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7556 "d,v,t", dreg, dreg, AT);
7557 }
7558 break;
7559
7560 case M_DROR:
7561 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7562 {
7563 macro_build ((char *) NULL, &icnt, NULL, "drorv",
7564 "d,t,s", dreg, sreg, treg);
7565 return;
7566 }
7567 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7568 "d,v,t", AT, 0, treg);
7569 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7570 "d,t,s", AT, sreg, AT);
7571 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7572 "d,t,s", dreg, sreg, treg);
7573 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7574 "d,v,t", dreg, dreg, AT);
7575 break;
7576
7577 case M_ROR:
7578 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7579 {
7580 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7581 "d,t,s", dreg, sreg, treg);
7582 return;
7583 }
7584 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7585 "d,v,t", AT, 0, treg);
7586 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7587 "d,t,s", AT, sreg, AT);
7588 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7589 "d,t,s", dreg, sreg, treg);
7590 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7591 "d,v,t", dreg, dreg, AT);
7592 break;
7593
7594 case M_DROR_I:
7595 {
7596 unsigned int rot;
7597 char *l, *r;
7598
7599 if (imm_expr.X_op != O_constant)
7600 as_bad (_("Improper rotate count"));
7601 rot = imm_expr.X_add_number & 0x3f;
7602 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7603 {
7604 if (rot >= 32)
7605 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7606 "d,w,<", dreg, sreg, rot - 32);
7607 else
7608 macro_build ((char *) NULL, &icnt, NULL, "dror",
7609 "d,w,<", dreg, sreg, rot);
7610 return;
7611 }
7612 if (rot == 0)
7613 {
7614 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7615 "d,w,<", dreg, sreg, 0);
7616 return;
7617 }
7618 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7619 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7620 rot &= 0x1f;
7621 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7622 "d,w,<", AT, sreg, rot);
7623 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7624 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7625 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7626 "d,v,t", dreg, dreg, AT);
7627 }
7628 break;
7629
7630 case M_ROR_I:
7631 {
7632 unsigned int rot;
7633
7634 if (imm_expr.X_op != O_constant)
7635 as_bad (_("Improper rotate count"));
7636 rot = imm_expr.X_add_number & 0x1f;
7637 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7638 {
7639 macro_build ((char *) NULL, &icnt, NULL, "ror",
7640 "d,w,<", dreg, sreg, rot);
7641 return;
7642 }
7643 if (rot == 0)
7644 {
7645 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7646 "d,w,<", dreg, sreg, 0);
7647 return;
7648 }
7649 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7650 "d,w,<", AT, sreg, rot);
7651 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7652 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7653 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7654 "d,v,t", dreg, dreg, AT);
7655 }
7656 break;
7657
7658 case M_S_DOB:
7659 if (mips_arch == CPU_R4650)
7660 {
7661 as_bad (_("opcode not supported on this processor"));
7662 return;
7663 }
7664 assert (mips_opts.isa == ISA_MIPS1);
7665 /* Even on a big endian machine $fn comes before $fn+1. We have
7666 to adjust when storing to memory. */
7667 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7668 target_big_endian ? treg + 1 : treg,
7669 (int) BFD_RELOC_LO16, breg);
7670 offset_expr.X_add_number += 4;
7671 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7672 target_big_endian ? treg : treg + 1,
7673 (int) BFD_RELOC_LO16, breg);
7674 return;
7675
7676 case M_SEQ:
7677 if (sreg == 0)
7678 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7679 treg, (int) BFD_RELOC_LO16);
7680 else if (treg == 0)
7681 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7682 sreg, (int) BFD_RELOC_LO16);
7683 else
7684 {
7685 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7686 "d,v,t", dreg, sreg, treg);
7687 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7688 dreg, (int) BFD_RELOC_LO16);
7689 }
7690 return;
7691
7692 case M_SEQ_I:
7693 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7694 {
7695 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7696 sreg, (int) BFD_RELOC_LO16);
7697 return;
7698 }
7699 if (sreg == 0)
7700 {
7701 as_warn (_("Instruction %s: result is always false"),
7702 ip->insn_mo->name);
7703 move_register (&icnt, dreg, 0);
7704 return;
7705 }
7706 if (imm_expr.X_op == O_constant
7707 && imm_expr.X_add_number >= 0
7708 && imm_expr.X_add_number < 0x10000)
7709 {
7710 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
7711 sreg, (int) BFD_RELOC_LO16);
7712 used_at = 0;
7713 }
7714 else if (imm_expr.X_op == O_constant
7715 && imm_expr.X_add_number > -0x8000
7716 && imm_expr.X_add_number < 0)
7717 {
7718 imm_expr.X_add_number = -imm_expr.X_add_number;
7719 macro_build ((char *) NULL, &icnt, &imm_expr,
7720 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7721 "t,r,j", dreg, sreg,
7722 (int) BFD_RELOC_LO16);
7723 used_at = 0;
7724 }
7725 else
7726 {
7727 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7728 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7729 "d,v,t", dreg, sreg, AT);
7730 used_at = 1;
7731 }
7732 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
7733 (int) BFD_RELOC_LO16);
7734 if (used_at)
7735 break;
7736 return;
7737
7738 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7739 s = "slt";
7740 goto sge;
7741 case M_SGEU:
7742 s = "sltu";
7743 sge:
7744 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7745 dreg, sreg, treg);
7746 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7747 (int) BFD_RELOC_LO16);
7748 return;
7749
7750 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7751 case M_SGEU_I:
7752 if (imm_expr.X_op == O_constant
7753 && imm_expr.X_add_number >= -0x8000
7754 && imm_expr.X_add_number < 0x8000)
7755 {
7756 macro_build ((char *) NULL, &icnt, &imm_expr,
7757 mask == M_SGE_I ? "slti" : "sltiu",
7758 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7759 used_at = 0;
7760 }
7761 else
7762 {
7763 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7764 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7765 mask == M_SGE_I ? "slt" : "sltu", "d,v,t", dreg, sreg,
7766 AT);
7767 used_at = 1;
7768 }
7769 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7770 (int) BFD_RELOC_LO16);
7771 if (used_at)
7772 break;
7773 return;
7774
7775 case M_SGT: /* sreg > treg <==> treg < sreg */
7776 s = "slt";
7777 goto sgt;
7778 case M_SGTU:
7779 s = "sltu";
7780 sgt:
7781 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7782 dreg, treg, sreg);
7783 return;
7784
7785 case M_SGT_I: /* sreg > I <==> I < sreg */
7786 s = "slt";
7787 goto sgti;
7788 case M_SGTU_I:
7789 s = "sltu";
7790 sgti:
7791 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7792 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7793 dreg, AT, sreg);
7794 break;
7795
7796 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7797 s = "slt";
7798 goto sle;
7799 case M_SLEU:
7800 s = "sltu";
7801 sle:
7802 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7803 dreg, treg, sreg);
7804 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7805 (int) BFD_RELOC_LO16);
7806 return;
7807
7808 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7809 s = "slt";
7810 goto slei;
7811 case M_SLEU_I:
7812 s = "sltu";
7813 slei:
7814 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7815 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7816 dreg, AT, sreg);
7817 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7818 (int) BFD_RELOC_LO16);
7819 break;
7820
7821 case M_SLT_I:
7822 if (imm_expr.X_op == O_constant
7823 && imm_expr.X_add_number >= -0x8000
7824 && imm_expr.X_add_number < 0x8000)
7825 {
7826 macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
7827 dreg, sreg, (int) BFD_RELOC_LO16);
7828 return;
7829 }
7830 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7831 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
7832 dreg, sreg, AT);
7833 break;
7834
7835 case M_SLTU_I:
7836 if (imm_expr.X_op == O_constant
7837 && imm_expr.X_add_number >= -0x8000
7838 && imm_expr.X_add_number < 0x8000)
7839 {
7840 macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
7841 dreg, sreg, (int) BFD_RELOC_LO16);
7842 return;
7843 }
7844 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7845 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7846 "d,v,t", dreg, sreg, AT);
7847 break;
7848
7849 case M_SNE:
7850 if (sreg == 0)
7851 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7852 "d,v,t", dreg, 0, treg);
7853 else if (treg == 0)
7854 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7855 "d,v,t", dreg, 0, sreg);
7856 else
7857 {
7858 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7859 "d,v,t", dreg, sreg, treg);
7860 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7861 "d,v,t", dreg, 0, dreg);
7862 }
7863 return;
7864
7865 case M_SNE_I:
7866 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7867 {
7868 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7869 "d,v,t", dreg, 0, sreg);
7870 return;
7871 }
7872 if (sreg == 0)
7873 {
7874 as_warn (_("Instruction %s: result is always true"),
7875 ip->insn_mo->name);
7876 macro_build ((char *) NULL, &icnt, &expr1,
7877 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7878 "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
7879 return;
7880 }
7881 if (imm_expr.X_op == O_constant
7882 && imm_expr.X_add_number >= 0
7883 && imm_expr.X_add_number < 0x10000)
7884 {
7885 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
7886 dreg, sreg, (int) BFD_RELOC_LO16);
7887 used_at = 0;
7888 }
7889 else if (imm_expr.X_op == O_constant
7890 && imm_expr.X_add_number > -0x8000
7891 && imm_expr.X_add_number < 0)
7892 {
7893 imm_expr.X_add_number = -imm_expr.X_add_number;
7894 macro_build ((char *) NULL, &icnt, &imm_expr,
7895 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7896 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7897 used_at = 0;
7898 }
7899 else
7900 {
7901 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7902 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7903 "d,v,t", dreg, sreg, AT);
7904 used_at = 1;
7905 }
7906 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7907 "d,v,t", dreg, 0, dreg);
7908 if (used_at)
7909 break;
7910 return;
7911
7912 case M_DSUB_I:
7913 dbl = 1;
7914 case M_SUB_I:
7915 if (imm_expr.X_op == O_constant
7916 && imm_expr.X_add_number > -0x8000
7917 && imm_expr.X_add_number <= 0x8000)
7918 {
7919 imm_expr.X_add_number = -imm_expr.X_add_number;
7920 macro_build ((char *) NULL, &icnt, &imm_expr,
7921 dbl ? "daddi" : "addi",
7922 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7923 return;
7924 }
7925 load_register (&icnt, AT, &imm_expr, dbl);
7926 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7927 dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7928 break;
7929
7930 case M_DSUBU_I:
7931 dbl = 1;
7932 case M_SUBU_I:
7933 if (imm_expr.X_op == O_constant
7934 && imm_expr.X_add_number > -0x8000
7935 && imm_expr.X_add_number <= 0x8000)
7936 {
7937 imm_expr.X_add_number = -imm_expr.X_add_number;
7938 macro_build ((char *) NULL, &icnt, &imm_expr,
7939 dbl ? "daddiu" : "addiu",
7940 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7941 return;
7942 }
7943 load_register (&icnt, AT, &imm_expr, dbl);
7944 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7945 dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7946 break;
7947
7948 case M_TEQ_I:
7949 s = "teq";
7950 goto trap;
7951 case M_TGE_I:
7952 s = "tge";
7953 goto trap;
7954 case M_TGEU_I:
7955 s = "tgeu";
7956 goto trap;
7957 case M_TLT_I:
7958 s = "tlt";
7959 goto trap;
7960 case M_TLTU_I:
7961 s = "tltu";
7962 goto trap;
7963 case M_TNE_I:
7964 s = "tne";
7965 trap:
7966 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7967 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "s,t", sreg,
7968 AT);
7969 break;
7970
7971 case M_TRUNCWS:
7972 case M_TRUNCWD:
7973 assert (mips_opts.isa == ISA_MIPS1);
7974 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7975 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7976
7977 /*
7978 * Is the double cfc1 instruction a bug in the mips assembler;
7979 * or is there a reason for it?
7980 */
7981 mips_emit_delays (TRUE);
7982 ++mips_opts.noreorder;
7983 mips_any_noreorder = 1;
7984 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7985 treg, RA);
7986 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7987 treg, RA);
7988 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7989 expr1.X_add_number = 3;
7990 macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
7991 (int) BFD_RELOC_LO16);
7992 expr1.X_add_number = 2;
7993 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
7994 (int) BFD_RELOC_LO16);
7995 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7996 AT, RA);
7997 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7998 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7999 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
8000 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
8001 treg, RA);
8002 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
8003 --mips_opts.noreorder;
8004 break;
8005
8006 case M_ULH:
8007 s = "lb";
8008 goto ulh;
8009 case M_ULHU:
8010 s = "lbu";
8011 ulh:
8012 if (offset_expr.X_add_number >= 0x7fff)
8013 as_bad (_("operand overflow"));
8014 if (! target_big_endian)
8015 ++offset_expr.X_add_number;
8016 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", AT,
8017 (int) BFD_RELOC_LO16, breg);
8018 if (! target_big_endian)
8019 --offset_expr.X_add_number;
8020 else
8021 ++offset_expr.X_add_number;
8022 macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", treg,
8023 (int) BFD_RELOC_LO16, breg);
8024 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8025 AT, AT, 8);
8026 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8027 treg, treg, AT);
8028 break;
8029
8030 case M_ULD:
8031 s = "ldl";
8032 s2 = "ldr";
8033 off = 7;
8034 goto ulw;
8035 case M_ULW:
8036 s = "lwl";
8037 s2 = "lwr";
8038 off = 3;
8039 ulw:
8040 if (offset_expr.X_add_number >= 0x8000 - off)
8041 as_bad (_("operand overflow"));
8042 if (treg != breg)
8043 tempreg = treg;
8044 else
8045 tempreg = AT;
8046 if (! target_big_endian)
8047 offset_expr.X_add_number += off;
8048 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", tempreg,
8049 (int) BFD_RELOC_LO16, breg);
8050 if (! target_big_endian)
8051 offset_expr.X_add_number -= off;
8052 else
8053 offset_expr.X_add_number += off;
8054 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", tempreg,
8055 (int) BFD_RELOC_LO16, breg);
8056
8057 /* If necessary, move the result in tempreg the final destination. */
8058 if (treg == tempreg)
8059 return;
8060 /* Protect second load's delay slot. */
8061 if (!gpr_interlocks)
8062 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
8063 move_register (&icnt, treg, tempreg);
8064 break;
8065
8066 case M_ULD_A:
8067 s = "ldl";
8068 s2 = "ldr";
8069 off = 7;
8070 goto ulwa;
8071 case M_ULW_A:
8072 s = "lwl";
8073 s2 = "lwr";
8074 off = 3;
8075 ulwa:
8076 used_at = 1;
8077 load_address (&icnt, AT, &offset_expr, &used_at);
8078 if (breg != 0)
8079 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8080 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8081 ? "add" : "addu" : "daddu",
8082 "d,v,t", AT, AT, breg);
8083 if (! target_big_endian)
8084 expr1.X_add_number = off;
8085 else
8086 expr1.X_add_number = 0;
8087 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
8088 (int) BFD_RELOC_LO16, AT);
8089 if (! target_big_endian)
8090 expr1.X_add_number = 0;
8091 else
8092 expr1.X_add_number = off;
8093 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
8094 (int) BFD_RELOC_LO16, AT);
8095 break;
8096
8097 case M_ULH_A:
8098 case M_ULHU_A:
8099 used_at = 1;
8100 load_address (&icnt, AT, &offset_expr, &used_at);
8101 if (breg != 0)
8102 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8103 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8104 ? "add" : "addu" : "daddu",
8105 "d,v,t", AT, AT, breg);
8106 if (target_big_endian)
8107 expr1.X_add_number = 0;
8108 macro_build ((char *) NULL, &icnt, &expr1,
8109 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
8110 (int) BFD_RELOC_LO16, AT);
8111 if (target_big_endian)
8112 expr1.X_add_number = 1;
8113 else
8114 expr1.X_add_number = 0;
8115 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
8116 (int) BFD_RELOC_LO16, AT);
8117 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8118 treg, treg, 8);
8119 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8120 treg, treg, AT);
8121 break;
8122
8123 case M_USH:
8124 if (offset_expr.X_add_number >= 0x7fff)
8125 as_bad (_("operand overflow"));
8126 if (target_big_endian)
8127 ++offset_expr.X_add_number;
8128 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
8129 (int) BFD_RELOC_LO16, breg);
8130 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
8131 AT, treg, 8);
8132 if (target_big_endian)
8133 --offset_expr.X_add_number;
8134 else
8135 ++offset_expr.X_add_number;
8136 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
8137 (int) BFD_RELOC_LO16, breg);
8138 break;
8139
8140 case M_USD:
8141 s = "sdl";
8142 s2 = "sdr";
8143 off = 7;
8144 goto usw;
8145 case M_USW:
8146 s = "swl";
8147 s2 = "swr";
8148 off = 3;
8149 usw:
8150 if (offset_expr.X_add_number >= 0x8000 - off)
8151 as_bad (_("operand overflow"));
8152 if (! target_big_endian)
8153 offset_expr.X_add_number += off;
8154 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
8155 (int) BFD_RELOC_LO16, breg);
8156 if (! target_big_endian)
8157 offset_expr.X_add_number -= off;
8158 else
8159 offset_expr.X_add_number += off;
8160 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
8161 (int) BFD_RELOC_LO16, breg);
8162 return;
8163
8164 case M_USD_A:
8165 s = "sdl";
8166 s2 = "sdr";
8167 off = 7;
8168 goto uswa;
8169 case M_USW_A:
8170 s = "swl";
8171 s2 = "swr";
8172 off = 3;
8173 uswa:
8174 used_at = 1;
8175 load_address (&icnt, AT, &offset_expr, &used_at);
8176 if (breg != 0)
8177 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8178 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8179 ? "add" : "addu" : "daddu",
8180 "d,v,t", AT, AT, breg);
8181 if (! target_big_endian)
8182 expr1.X_add_number = off;
8183 else
8184 expr1.X_add_number = 0;
8185 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
8186 (int) BFD_RELOC_LO16, AT);
8187 if (! target_big_endian)
8188 expr1.X_add_number = 0;
8189 else
8190 expr1.X_add_number = off;
8191 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
8192 (int) BFD_RELOC_LO16, AT);
8193 break;
8194
8195 case M_USH_A:
8196 used_at = 1;
8197 load_address (&icnt, AT, &offset_expr, &used_at);
8198 if (breg != 0)
8199 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8200 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI
8201 ? "add" : "addu" : "daddu",
8202 "d,v,t", AT, AT, breg);
8203 if (! target_big_endian)
8204 expr1.X_add_number = 0;
8205 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
8206 (int) BFD_RELOC_LO16, AT);
8207 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
8208 treg, treg, 8);
8209 if (! target_big_endian)
8210 expr1.X_add_number = 1;
8211 else
8212 expr1.X_add_number = 0;
8213 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
8214 (int) BFD_RELOC_LO16, AT);
8215 if (! target_big_endian)
8216 expr1.X_add_number = 0;
8217 else
8218 expr1.X_add_number = 1;
8219 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
8220 (int) BFD_RELOC_LO16, AT);
8221 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
8222 treg, treg, 8);
8223 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
8224 treg, treg, AT);
8225 break;
8226
8227 default:
8228 /* FIXME: Check if this is one of the itbl macros, since they
8229 are added dynamically. */
8230 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8231 break;
8232 }
8233 if (mips_opts.noat)
8234 as_warn (_("Macro used $at after \".set noat\""));
8235 }
8236
8237 /* Implement macros in mips16 mode. */
8238
8239 static void
8240 mips16_macro (ip)
8241 struct mips_cl_insn *ip;
8242 {
8243 int mask;
8244 int xreg, yreg, zreg, tmp;
8245 int icnt;
8246 expressionS expr1;
8247 int dbl;
8248 const char *s, *s2, *s3;
8249
8250 mask = ip->insn_mo->mask;
8251
8252 xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
8253 yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
8254 zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
8255
8256 icnt = 0;
8257
8258 expr1.X_op = O_constant;
8259 expr1.X_op_symbol = NULL;
8260 expr1.X_add_symbol = NULL;
8261 expr1.X_add_number = 1;
8262
8263 dbl = 0;
8264
8265 switch (mask)
8266 {
8267 default:
8268 internalError ();
8269
8270 case M_DDIV_3:
8271 dbl = 1;
8272 case M_DIV_3:
8273 s = "mflo";
8274 goto do_div3;
8275 case M_DREM_3:
8276 dbl = 1;
8277 case M_REM_3:
8278 s = "mfhi";
8279 do_div3:
8280 mips_emit_delays (TRUE);
8281 ++mips_opts.noreorder;
8282 mips_any_noreorder = 1;
8283 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8284 dbl ? "ddiv" : "div",
8285 "0,x,y", xreg, yreg);
8286 expr1.X_add_number = 2;
8287 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
8288 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break", "6",
8289 7);
8290
8291 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8292 since that causes an overflow. We should do that as well,
8293 but I don't see how to do the comparisons without a temporary
8294 register. */
8295 --mips_opts.noreorder;
8296 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x", zreg);
8297 break;
8298
8299 case M_DIVU_3:
8300 s = "divu";
8301 s2 = "mflo";
8302 goto do_divu3;
8303 case M_REMU_3:
8304 s = "divu";
8305 s2 = "mfhi";
8306 goto do_divu3;
8307 case M_DDIVU_3:
8308 s = "ddivu";
8309 s2 = "mflo";
8310 goto do_divu3;
8311 case M_DREMU_3:
8312 s = "ddivu";
8313 s2 = "mfhi";
8314 do_divu3:
8315 mips_emit_delays (TRUE);
8316 ++mips_opts.noreorder;
8317 mips_any_noreorder = 1;
8318 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "0,x,y",
8319 xreg, yreg);
8320 expr1.X_add_number = 2;
8321 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
8322 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
8323 "6", 7);
8324 --mips_opts.noreorder;
8325 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "x", zreg);
8326 break;
8327
8328 case M_DMUL:
8329 dbl = 1;
8330 case M_MUL:
8331 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8332 dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8333 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "x",
8334 zreg);
8335 return;
8336
8337 case M_DSUBU_I:
8338 dbl = 1;
8339 goto do_subu;
8340 case M_SUBU_I:
8341 do_subu:
8342 if (imm_expr.X_op != O_constant)
8343 as_bad (_("Unsupported large constant"));
8344 imm_expr.X_add_number = -imm_expr.X_add_number;
8345 macro_build ((char *) NULL, &icnt, &imm_expr,
8346 dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8347 break;
8348
8349 case M_SUBU_I_2:
8350 if (imm_expr.X_op != O_constant)
8351 as_bad (_("Unsupported large constant"));
8352 imm_expr.X_add_number = -imm_expr.X_add_number;
8353 macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
8354 "x,k", xreg);
8355 break;
8356
8357 case M_DSUBU_I_2:
8358 if (imm_expr.X_op != O_constant)
8359 as_bad (_("Unsupported large constant"));
8360 imm_expr.X_add_number = -imm_expr.X_add_number;
8361 macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
8362 "y,j", yreg);
8363 break;
8364
8365 case M_BEQ:
8366 s = "cmp";
8367 s2 = "bteqz";
8368 goto do_branch;
8369 case M_BNE:
8370 s = "cmp";
8371 s2 = "btnez";
8372 goto do_branch;
8373 case M_BLT:
8374 s = "slt";
8375 s2 = "btnez";
8376 goto do_branch;
8377 case M_BLTU:
8378 s = "sltu";
8379 s2 = "btnez";
8380 goto do_branch;
8381 case M_BLE:
8382 s = "slt";
8383 s2 = "bteqz";
8384 goto do_reverse_branch;
8385 case M_BLEU:
8386 s = "sltu";
8387 s2 = "bteqz";
8388 goto do_reverse_branch;
8389 case M_BGE:
8390 s = "slt";
8391 s2 = "bteqz";
8392 goto do_branch;
8393 case M_BGEU:
8394 s = "sltu";
8395 s2 = "bteqz";
8396 goto do_branch;
8397 case M_BGT:
8398 s = "slt";
8399 s2 = "btnez";
8400 goto do_reverse_branch;
8401 case M_BGTU:
8402 s = "sltu";
8403 s2 = "btnez";
8404
8405 do_reverse_branch:
8406 tmp = xreg;
8407 xreg = yreg;
8408 yreg = tmp;
8409
8410 do_branch:
8411 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
8412 xreg, yreg);
8413 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
8414 break;
8415
8416 case M_BEQ_I:
8417 s = "cmpi";
8418 s2 = "bteqz";
8419 s3 = "x,U";
8420 goto do_branch_i;
8421 case M_BNE_I:
8422 s = "cmpi";
8423 s2 = "btnez";
8424 s3 = "x,U";
8425 goto do_branch_i;
8426 case M_BLT_I:
8427 s = "slti";
8428 s2 = "btnez";
8429 s3 = "x,8";
8430 goto do_branch_i;
8431 case M_BLTU_I:
8432 s = "sltiu";
8433 s2 = "btnez";
8434 s3 = "x,8";
8435 goto do_branch_i;
8436 case M_BLE_I:
8437 s = "slti";
8438 s2 = "btnez";
8439 s3 = "x,8";
8440 goto do_addone_branch_i;
8441 case M_BLEU_I:
8442 s = "sltiu";
8443 s2 = "btnez";
8444 s3 = "x,8";
8445 goto do_addone_branch_i;
8446 case M_BGE_I:
8447 s = "slti";
8448 s2 = "bteqz";
8449 s3 = "x,8";
8450 goto do_branch_i;
8451 case M_BGEU_I:
8452 s = "sltiu";
8453 s2 = "bteqz";
8454 s3 = "x,8";
8455 goto do_branch_i;
8456 case M_BGT_I:
8457 s = "slti";
8458 s2 = "bteqz";
8459 s3 = "x,8";
8460 goto do_addone_branch_i;
8461 case M_BGTU_I:
8462 s = "sltiu";
8463 s2 = "bteqz";
8464 s3 = "x,8";
8465
8466 do_addone_branch_i:
8467 if (imm_expr.X_op != O_constant)
8468 as_bad (_("Unsupported large constant"));
8469 ++imm_expr.X_add_number;
8470
8471 do_branch_i:
8472 macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
8473 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
8474 break;
8475
8476 case M_ABS:
8477 expr1.X_add_number = 0;
8478 macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8", yreg);
8479 if (xreg != yreg)
8480 move_register (&icnt, xreg, yreg);
8481 expr1.X_add_number = 2;
8482 macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
8483 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8484 "neg", "x,w", xreg, xreg);
8485 }
8486 }
8487
8488 /* For consistency checking, verify that all bits are specified either
8489 by the match/mask part of the instruction definition, or by the
8490 operand list. */
8491 static int
8492 validate_mips_insn (opc)
8493 const struct mips_opcode *opc;
8494 {
8495 const char *p = opc->args;
8496 char c;
8497 unsigned long used_bits = opc->mask;
8498
8499 if ((used_bits & opc->match) != opc->match)
8500 {
8501 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8502 opc->name, opc->args);
8503 return 0;
8504 }
8505 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8506 while (*p)
8507 switch (c = *p++)
8508 {
8509 case ',': break;
8510 case '(': break;
8511 case ')': break;
8512 case '+':
8513 switch (c = *p++)
8514 {
8515 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8516 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8517 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8518 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8519 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8520 default:
8521 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8522 c, opc->name, opc->args);
8523 return 0;
8524 }
8525 break;
8526 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8527 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8528 case 'A': break;
8529 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8530 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8531 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8532 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8533 case 'F': break;
8534 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8535 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8536 case 'I': break;
8537 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8538 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8539 case 'L': break;
8540 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8541 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8542 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8543 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8544 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8545 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8546 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8547 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8548 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8549 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8550 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8551 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8552 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8553 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8554 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8555 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8556 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8557 case 'f': break;
8558 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8559 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8560 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8561 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8562 case 'l': break;
8563 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8564 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8565 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8566 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8567 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8568 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8569 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8570 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8571 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8572 case 'x': break;
8573 case 'z': break;
8574 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8575 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8576 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8577 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8578 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8579 case '[': break;
8580 case ']': break;
8581 default:
8582 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8583 c, opc->name, opc->args);
8584 return 0;
8585 }
8586 #undef USE_BITS
8587 if (used_bits != 0xffffffff)
8588 {
8589 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8590 ~used_bits & 0xffffffff, opc->name, opc->args);
8591 return 0;
8592 }
8593 return 1;
8594 }
8595
8596 /* This routine assembles an instruction into its binary format. As a
8597 side effect, it sets one of the global variables imm_reloc or
8598 offset_reloc to the type of relocation to do if one of the operands
8599 is an address expression. */
8600
8601 static void
8602 mips_ip (str, ip)
8603 char *str;
8604 struct mips_cl_insn *ip;
8605 {
8606 char *s;
8607 const char *args;
8608 char c = 0;
8609 struct mips_opcode *insn;
8610 char *argsStart;
8611 unsigned int regno;
8612 unsigned int lastregno = 0;
8613 unsigned int lastpos = 0;
8614 unsigned int limlo, limhi;
8615 char *s_reset;
8616 char save_c = 0;
8617
8618 insn_error = NULL;
8619
8620 /* If the instruction contains a '.', we first try to match an instruction
8621 including the '.'. Then we try again without the '.'. */
8622 insn = NULL;
8623 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8624 continue;
8625
8626 /* If we stopped on whitespace, then replace the whitespace with null for
8627 the call to hash_find. Save the character we replaced just in case we
8628 have to re-parse the instruction. */
8629 if (ISSPACE (*s))
8630 {
8631 save_c = *s;
8632 *s++ = '\0';
8633 }
8634
8635 insn = (struct mips_opcode *) hash_find (op_hash, str);
8636
8637 /* If we didn't find the instruction in the opcode table, try again, but
8638 this time with just the instruction up to, but not including the
8639 first '.'. */
8640 if (insn == NULL)
8641 {
8642 /* Restore the character we overwrite above (if any). */
8643 if (save_c)
8644 *(--s) = save_c;
8645
8646 /* Scan up to the first '.' or whitespace. */
8647 for (s = str;
8648 *s != '\0' && *s != '.' && !ISSPACE (*s);
8649 ++s)
8650 continue;
8651
8652 /* If we did not find a '.', then we can quit now. */
8653 if (*s != '.')
8654 {
8655 insn_error = "unrecognized opcode";
8656 return;
8657 }
8658
8659 /* Lookup the instruction in the hash table. */
8660 *s++ = '\0';
8661 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8662 {
8663 insn_error = "unrecognized opcode";
8664 return;
8665 }
8666 }
8667
8668 argsStart = s;
8669 for (;;)
8670 {
8671 bfd_boolean ok;
8672
8673 assert (strcmp (insn->name, str) == 0);
8674
8675 if (OPCODE_IS_MEMBER (insn,
8676 (mips_opts.isa
8677 | (file_ase_mips16 ? INSN_MIPS16 : 0)
8678 | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8679 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8680 mips_arch))
8681 ok = TRUE;
8682 else
8683 ok = FALSE;
8684
8685 if (insn->pinfo != INSN_MACRO)
8686 {
8687 if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8688 ok = FALSE;
8689 }
8690
8691 if (! ok)
8692 {
8693 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8694 && strcmp (insn->name, insn[1].name) == 0)
8695 {
8696 ++insn;
8697 continue;
8698 }
8699 else
8700 {
8701 if (!insn_error)
8702 {
8703 static char buf[100];
8704 if (mips_arch_info->is_isa)
8705 sprintf (buf,
8706 _("opcode not supported at this ISA level (%s)"),
8707 mips_cpu_info_from_isa (mips_opts.isa)->name);
8708 else
8709 sprintf (buf,
8710 _("opcode not supported on this processor: %s (%s)"),
8711 mips_arch_info->name,
8712 mips_cpu_info_from_isa (mips_opts.isa)->name);
8713 insn_error = buf;
8714 }
8715 if (save_c)
8716 *(--s) = save_c;
8717 return;
8718 }
8719 }
8720
8721 ip->insn_mo = insn;
8722 ip->insn_opcode = insn->match;
8723 insn_error = NULL;
8724 for (args = insn->args;; ++args)
8725 {
8726 int is_mdmx;
8727
8728 s += strspn (s, " \t");
8729 is_mdmx = 0;
8730 switch (*args)
8731 {
8732 case '\0': /* end of args */
8733 if (*s == '\0')
8734 return;
8735 break;
8736
8737 case ',':
8738 if (*s++ == *args)
8739 continue;
8740 s--;
8741 switch (*++args)
8742 {
8743 case 'r':
8744 case 'v':
8745 ip->insn_opcode |= lastregno << OP_SH_RS;
8746 continue;
8747
8748 case 'w':
8749 ip->insn_opcode |= lastregno << OP_SH_RT;
8750 continue;
8751
8752 case 'W':
8753 ip->insn_opcode |= lastregno << OP_SH_FT;
8754 continue;
8755
8756 case 'V':
8757 ip->insn_opcode |= lastregno << OP_SH_FS;
8758 continue;
8759 }
8760 break;
8761
8762 case '(':
8763 /* Handle optional base register.
8764 Either the base register is omitted or
8765 we must have a left paren. */
8766 /* This is dependent on the next operand specifier
8767 is a base register specification. */
8768 assert (args[1] == 'b' || args[1] == '5'
8769 || args[1] == '-' || args[1] == '4');
8770 if (*s == '\0')
8771 return;
8772
8773 case ')': /* these must match exactly */
8774 case '[':
8775 case ']':
8776 if (*s++ == *args)
8777 continue;
8778 break;
8779
8780 case '+': /* Opcode extension character. */
8781 switch (*++args)
8782 {
8783 case 'A': /* ins/ext position, becomes LSB. */
8784 limlo = 0;
8785 limhi = 31;
8786 my_getExpression (&imm_expr, s);
8787 check_absolute_expr (ip, &imm_expr);
8788 if ((unsigned long) imm_expr.X_add_number < limlo
8789 || (unsigned long) imm_expr.X_add_number > limhi)
8790 {
8791 as_bad (_("Improper position (%lu)"),
8792 (unsigned long) imm_expr.X_add_number);
8793 imm_expr.X_add_number = limlo;
8794 }
8795 lastpos = imm_expr.X_add_number;
8796 ip->insn_opcode |= (imm_expr.X_add_number
8797 & OP_MASK_SHAMT) << OP_SH_SHAMT;
8798 imm_expr.X_op = O_absent;
8799 s = expr_end;
8800 continue;
8801
8802 case 'B': /* ins size, becomes MSB. */
8803 limlo = 1;
8804 limhi = 32;
8805 my_getExpression (&imm_expr, s);
8806 check_absolute_expr (ip, &imm_expr);
8807 /* Check for negative input so that small negative numbers
8808 will not succeed incorrectly. The checks against
8809 (pos+size) transitively check "size" itself,
8810 assuming that "pos" is reasonable. */
8811 if ((long) imm_expr.X_add_number < 0
8812 || ((unsigned long) imm_expr.X_add_number
8813 + lastpos) < limlo
8814 || ((unsigned long) imm_expr.X_add_number
8815 + lastpos) > limhi)
8816 {
8817 as_bad (_("Improper insert size (%lu, position %lu)"),
8818 (unsigned long) imm_expr.X_add_number,
8819 (unsigned long) lastpos);
8820 imm_expr.X_add_number = limlo - lastpos;
8821 }
8822 ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8823 & OP_MASK_INSMSB) << OP_SH_INSMSB;
8824 imm_expr.X_op = O_absent;
8825 s = expr_end;
8826 continue;
8827
8828 case 'C': /* ext size, becomes MSBD. */
8829 limlo = 1;
8830 limhi = 32;
8831 my_getExpression (&imm_expr, s);
8832 check_absolute_expr (ip, &imm_expr);
8833 /* Check for negative input so that small negative numbers
8834 will not succeed incorrectly. The checks against
8835 (pos+size) transitively check "size" itself,
8836 assuming that "pos" is reasonable. */
8837 if ((long) imm_expr.X_add_number < 0
8838 || ((unsigned long) imm_expr.X_add_number
8839 + lastpos) < limlo
8840 || ((unsigned long) imm_expr.X_add_number
8841 + lastpos) > limhi)
8842 {
8843 as_bad (_("Improper extract size (%lu, position %lu)"),
8844 (unsigned long) imm_expr.X_add_number,
8845 (unsigned long) lastpos);
8846 imm_expr.X_add_number = limlo - lastpos;
8847 }
8848 ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8849 & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8850 imm_expr.X_op = O_absent;
8851 s = expr_end;
8852 continue;
8853
8854 case 'D':
8855 /* +D is for disassembly only; never match. */
8856 break;
8857
8858 default:
8859 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8860 *args, insn->name, insn->args);
8861 /* Further processing is fruitless. */
8862 return;
8863 }
8864 break;
8865
8866 case '<': /* must be at least one digit */
8867 /*
8868 * According to the manual, if the shift amount is greater
8869 * than 31 or less than 0, then the shift amount should be
8870 * mod 32. In reality the mips assembler issues an error.
8871 * We issue a warning and mask out all but the low 5 bits.
8872 */
8873 my_getExpression (&imm_expr, s);
8874 check_absolute_expr (ip, &imm_expr);
8875 if ((unsigned long) imm_expr.X_add_number > 31)
8876 {
8877 as_warn (_("Improper shift amount (%lu)"),
8878 (unsigned long) imm_expr.X_add_number);
8879 imm_expr.X_add_number &= OP_MASK_SHAMT;
8880 }
8881 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8882 imm_expr.X_op = O_absent;
8883 s = expr_end;
8884 continue;
8885
8886 case '>': /* shift amount minus 32 */
8887 my_getExpression (&imm_expr, s);
8888 check_absolute_expr (ip, &imm_expr);
8889 if ((unsigned long) imm_expr.X_add_number < 32
8890 || (unsigned long) imm_expr.X_add_number > 63)
8891 break;
8892 ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8893 imm_expr.X_op = O_absent;
8894 s = expr_end;
8895 continue;
8896
8897 case 'k': /* cache code */
8898 case 'h': /* prefx code */
8899 my_getExpression (&imm_expr, s);
8900 check_absolute_expr (ip, &imm_expr);
8901 if ((unsigned long) imm_expr.X_add_number > 31)
8902 {
8903 as_warn (_("Invalid value for `%s' (%lu)"),
8904 ip->insn_mo->name,
8905 (unsigned long) imm_expr.X_add_number);
8906 imm_expr.X_add_number &= 0x1f;
8907 }
8908 if (*args == 'k')
8909 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8910 else
8911 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8912 imm_expr.X_op = O_absent;
8913 s = expr_end;
8914 continue;
8915
8916 case 'c': /* break code */
8917 my_getExpression (&imm_expr, s);
8918 check_absolute_expr (ip, &imm_expr);
8919 if ((unsigned long) imm_expr.X_add_number > 1023)
8920 {
8921 as_warn (_("Illegal break code (%lu)"),
8922 (unsigned long) imm_expr.X_add_number);
8923 imm_expr.X_add_number &= OP_MASK_CODE;
8924 }
8925 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8926 imm_expr.X_op = O_absent;
8927 s = expr_end;
8928 continue;
8929
8930 case 'q': /* lower break code */
8931 my_getExpression (&imm_expr, s);
8932 check_absolute_expr (ip, &imm_expr);
8933 if ((unsigned long) imm_expr.X_add_number > 1023)
8934 {
8935 as_warn (_("Illegal lower break code (%lu)"),
8936 (unsigned long) imm_expr.X_add_number);
8937 imm_expr.X_add_number &= OP_MASK_CODE2;
8938 }
8939 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8940 imm_expr.X_op = O_absent;
8941 s = expr_end;
8942 continue;
8943
8944 case 'B': /* 20-bit syscall/break code. */
8945 my_getExpression (&imm_expr, s);
8946 check_absolute_expr (ip, &imm_expr);
8947 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8948 as_warn (_("Illegal 20-bit code (%lu)"),
8949 (unsigned long) imm_expr.X_add_number);
8950 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8951 imm_expr.X_op = O_absent;
8952 s = expr_end;
8953 continue;
8954
8955 case 'C': /* Coprocessor code */
8956 my_getExpression (&imm_expr, s);
8957 check_absolute_expr (ip, &imm_expr);
8958 if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8959 {
8960 as_warn (_("Coproccesor code > 25 bits (%lu)"),
8961 (unsigned long) imm_expr.X_add_number);
8962 imm_expr.X_add_number &= ((1 << 25) - 1);
8963 }
8964 ip->insn_opcode |= imm_expr.X_add_number;
8965 imm_expr.X_op = O_absent;
8966 s = expr_end;
8967 continue;
8968
8969 case 'J': /* 19-bit wait code. */
8970 my_getExpression (&imm_expr, s);
8971 check_absolute_expr (ip, &imm_expr);
8972 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8973 as_warn (_("Illegal 19-bit code (%lu)"),
8974 (unsigned long) imm_expr.X_add_number);
8975 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8976 imm_expr.X_op = O_absent;
8977 s = expr_end;
8978 continue;
8979
8980 case 'P': /* Performance register */
8981 my_getExpression (&imm_expr, s);
8982 check_absolute_expr (ip, &imm_expr);
8983 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8984 {
8985 as_warn (_("Invalid performance register (%lu)"),
8986 (unsigned long) imm_expr.X_add_number);
8987 imm_expr.X_add_number &= OP_MASK_PERFREG;
8988 }
8989 ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8990 imm_expr.X_op = O_absent;
8991 s = expr_end;
8992 continue;
8993
8994 case 'b': /* base register */
8995 case 'd': /* destination register */
8996 case 's': /* source register */
8997 case 't': /* target register */
8998 case 'r': /* both target and source */
8999 case 'v': /* both dest and source */
9000 case 'w': /* both dest and target */
9001 case 'E': /* coprocessor target register */
9002 case 'G': /* coprocessor destination register */
9003 case 'K': /* 'rdhwr' destination register */
9004 case 'x': /* ignore register name */
9005 case 'z': /* must be zero register */
9006 case 'U': /* destination register (clo/clz). */
9007 s_reset = s;
9008 if (s[0] == '$')
9009 {
9010
9011 if (ISDIGIT (s[1]))
9012 {
9013 ++s;
9014 regno = 0;
9015 do
9016 {
9017 regno *= 10;
9018 regno += *s - '0';
9019 ++s;
9020 }
9021 while (ISDIGIT (*s));
9022 if (regno > 31)
9023 as_bad (_("Invalid register number (%d)"), regno);
9024 }
9025 else if (*args == 'E' || *args == 'G' || *args == 'K')
9026 goto notreg;
9027 else
9028 {
9029 if (s[1] == 'r' && s[2] == 'a')
9030 {
9031 s += 3;
9032 regno = RA;
9033 }
9034 else if (s[1] == 'f' && s[2] == 'p')
9035 {
9036 s += 3;
9037 regno = FP;
9038 }
9039 else if (s[1] == 's' && s[2] == 'p')
9040 {
9041 s += 3;
9042 regno = SP;
9043 }
9044 else if (s[1] == 'g' && s[2] == 'p')
9045 {
9046 s += 3;
9047 regno = GP;
9048 }
9049 else if (s[1] == 'a' && s[2] == 't')
9050 {
9051 s += 3;
9052 regno = AT;
9053 }
9054 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9055 {
9056 s += 4;
9057 regno = KT0;
9058 }
9059 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9060 {
9061 s += 4;
9062 regno = KT1;
9063 }
9064 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9065 {
9066 s += 5;
9067 regno = ZERO;
9068 }
9069 else if (itbl_have_entries)
9070 {
9071 char *p, *n;
9072 unsigned long r;
9073
9074 p = s + 1; /* advance past '$' */
9075 n = itbl_get_field (&p); /* n is name */
9076
9077 /* See if this is a register defined in an
9078 itbl entry. */
9079 if (itbl_get_reg_val (n, &r))
9080 {
9081 /* Get_field advances to the start of
9082 the next field, so we need to back
9083 rack to the end of the last field. */
9084 if (p)
9085 s = p - 1;
9086 else
9087 s = strchr (s, '\0');
9088 regno = r;
9089 }
9090 else
9091 goto notreg;
9092 }
9093 else
9094 goto notreg;
9095 }
9096 if (regno == AT
9097 && ! mips_opts.noat
9098 && *args != 'E'
9099 && *args != 'G'
9100 && *args != 'K')
9101 as_warn (_("Used $at without \".set noat\""));
9102 c = *args;
9103 if (*s == ' ')
9104 ++s;
9105 if (args[1] != *s)
9106 {
9107 if (c == 'r' || c == 'v' || c == 'w')
9108 {
9109 regno = lastregno;
9110 s = s_reset;
9111 ++args;
9112 }
9113 }
9114 /* 'z' only matches $0. */
9115 if (c == 'z' && regno != 0)
9116 break;
9117
9118 /* Now that we have assembled one operand, we use the args string
9119 * to figure out where it goes in the instruction. */
9120 switch (c)
9121 {
9122 case 'r':
9123 case 's':
9124 case 'v':
9125 case 'b':
9126 ip->insn_opcode |= regno << OP_SH_RS;
9127 break;
9128 case 'd':
9129 case 'G':
9130 case 'K':
9131 ip->insn_opcode |= regno << OP_SH_RD;
9132 break;
9133 case 'U':
9134 ip->insn_opcode |= regno << OP_SH_RD;
9135 ip->insn_opcode |= regno << OP_SH_RT;
9136 break;
9137 case 'w':
9138 case 't':
9139 case 'E':
9140 ip->insn_opcode |= regno << OP_SH_RT;
9141 break;
9142 case 'x':
9143 /* This case exists because on the r3000 trunc
9144 expands into a macro which requires a gp
9145 register. On the r6000 or r4000 it is
9146 assembled into a single instruction which
9147 ignores the register. Thus the insn version
9148 is MIPS_ISA2 and uses 'x', and the macro
9149 version is MIPS_ISA1 and uses 't'. */
9150 break;
9151 case 'z':
9152 /* This case is for the div instruction, which
9153 acts differently if the destination argument
9154 is $0. This only matches $0, and is checked
9155 outside the switch. */
9156 break;
9157 case 'D':
9158 /* Itbl operand; not yet implemented. FIXME ?? */
9159 break;
9160 /* What about all other operands like 'i', which
9161 can be specified in the opcode table? */
9162 }
9163 lastregno = regno;
9164 continue;
9165 }
9166 notreg:
9167 switch (*args++)
9168 {
9169 case 'r':
9170 case 'v':
9171 ip->insn_opcode |= lastregno << OP_SH_RS;
9172 continue;
9173 case 'w':
9174 ip->insn_opcode |= lastregno << OP_SH_RT;
9175 continue;
9176 }
9177 break;
9178
9179 case 'O': /* MDMX alignment immediate constant. */
9180 my_getExpression (&imm_expr, s);
9181 check_absolute_expr (ip, &imm_expr);
9182 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9183 {
9184 as_warn ("Improper align amount (%ld), using low bits",
9185 (long) imm_expr.X_add_number);
9186 imm_expr.X_add_number &= OP_MASK_ALN;
9187 }
9188 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
9189 imm_expr.X_op = O_absent;
9190 s = expr_end;
9191 continue;
9192
9193 case 'Q': /* MDMX vector, element sel, or const. */
9194 if (s[0] != '$')
9195 {
9196 /* MDMX Immediate. */
9197 my_getExpression (&imm_expr, s);
9198 check_absolute_expr (ip, &imm_expr);
9199 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9200 {
9201 as_warn (_("Invalid MDMX Immediate (%ld)"),
9202 (long) imm_expr.X_add_number);
9203 imm_expr.X_add_number &= OP_MASK_FT;
9204 }
9205 imm_expr.X_add_number &= OP_MASK_FT;
9206 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9207 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9208 else
9209 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9210 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
9211 imm_expr.X_op = O_absent;
9212 s = expr_end;
9213 continue;
9214 }
9215 /* Not MDMX Immediate. Fall through. */
9216 case 'X': /* MDMX destination register. */
9217 case 'Y': /* MDMX source register. */
9218 case 'Z': /* MDMX target register. */
9219 is_mdmx = 1;
9220 case 'D': /* floating point destination register */
9221 case 'S': /* floating point source register */
9222 case 'T': /* floating point target register */
9223 case 'R': /* floating point source register */
9224 case 'V':
9225 case 'W':
9226 s_reset = s;
9227 /* Accept $fN for FP and MDMX register numbers, and in
9228 addition accept $vN for MDMX register numbers. */
9229 if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
9230 || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
9231 && ISDIGIT (s[2])))
9232 {
9233 s += 2;
9234 regno = 0;
9235 do
9236 {
9237 regno *= 10;
9238 regno += *s - '0';
9239 ++s;
9240 }
9241 while (ISDIGIT (*s));
9242
9243 if (regno > 31)
9244 as_bad (_("Invalid float register number (%d)"), regno);
9245
9246 if ((regno & 1) != 0
9247 && HAVE_32BIT_FPRS
9248 && ! (strcmp (str, "mtc1") == 0
9249 || strcmp (str, "mfc1") == 0
9250 || strcmp (str, "lwc1") == 0
9251 || strcmp (str, "swc1") == 0
9252 || strcmp (str, "l.s") == 0
9253 || strcmp (str, "s.s") == 0))
9254 as_warn (_("Float register should be even, was %d"),
9255 regno);
9256
9257 c = *args;
9258 if (*s == ' ')
9259 ++s;
9260 if (args[1] != *s)
9261 {
9262 if (c == 'V' || c == 'W')
9263 {
9264 regno = lastregno;
9265 s = s_reset;
9266 ++args;
9267 }
9268 }
9269 switch (c)
9270 {
9271 case 'D':
9272 case 'X':
9273 ip->insn_opcode |= regno << OP_SH_FD;
9274 break;
9275 case 'V':
9276 case 'S':
9277 case 'Y':
9278 ip->insn_opcode |= regno << OP_SH_FS;
9279 break;
9280 case 'Q':
9281 /* This is like 'Z', but also needs to fix the MDMX
9282 vector/scalar select bits. Note that the
9283 scalar immediate case is handled above. */
9284 if (*s == '[')
9285 {
9286 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9287 int max_el = (is_qh ? 3 : 7);
9288 s++;
9289 my_getExpression(&imm_expr, s);
9290 check_absolute_expr (ip, &imm_expr);
9291 s = expr_end;
9292 if (imm_expr.X_add_number > max_el)
9293 as_bad(_("Bad element selector %ld"),
9294 (long) imm_expr.X_add_number);
9295 imm_expr.X_add_number &= max_el;
9296 ip->insn_opcode |= (imm_expr.X_add_number
9297 << (OP_SH_VSEL +
9298 (is_qh ? 2 : 1)));
9299 if (*s != ']')
9300 as_warn(_("Expecting ']' found '%s'"), s);
9301 else
9302 s++;
9303 }
9304 else
9305 {
9306 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9307 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9308 << OP_SH_VSEL);
9309 else
9310 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9311 OP_SH_VSEL);
9312 }
9313 /* Fall through */
9314 case 'W':
9315 case 'T':
9316 case 'Z':
9317 ip->insn_opcode |= regno << OP_SH_FT;
9318 break;
9319 case 'R':
9320 ip->insn_opcode |= regno << OP_SH_FR;
9321 break;
9322 }
9323 lastregno = regno;
9324 continue;
9325 }
9326
9327 switch (*args++)
9328 {
9329 case 'V':
9330 ip->insn_opcode |= lastregno << OP_SH_FS;
9331 continue;
9332 case 'W':
9333 ip->insn_opcode |= lastregno << OP_SH_FT;
9334 continue;
9335 }
9336 break;
9337
9338 case 'I':
9339 my_getExpression (&imm_expr, s);
9340 if (imm_expr.X_op != O_big
9341 && imm_expr.X_op != O_constant)
9342 insn_error = _("absolute expression required");
9343 s = expr_end;
9344 continue;
9345
9346 case 'A':
9347 my_getExpression (&offset_expr, s);
9348 *imm_reloc = BFD_RELOC_32;
9349 s = expr_end;
9350 continue;
9351
9352 case 'F':
9353 case 'L':
9354 case 'f':
9355 case 'l':
9356 {
9357 int f64;
9358 int using_gprs;
9359 char *save_in;
9360 char *err;
9361 unsigned char temp[8];
9362 int len;
9363 unsigned int length;
9364 segT seg;
9365 subsegT subseg;
9366 char *p;
9367
9368 /* These only appear as the last operand in an
9369 instruction, and every instruction that accepts
9370 them in any variant accepts them in all variants.
9371 This means we don't have to worry about backing out
9372 any changes if the instruction does not match.
9373
9374 The difference between them is the size of the
9375 floating point constant and where it goes. For 'F'
9376 and 'L' the constant is 64 bits; for 'f' and 'l' it
9377 is 32 bits. Where the constant is placed is based
9378 on how the MIPS assembler does things:
9379 F -- .rdata
9380 L -- .lit8
9381 f -- immediate value
9382 l -- .lit4
9383
9384 The .lit4 and .lit8 sections are only used if
9385 permitted by the -G argument.
9386
9387 When generating embedded PIC code, we use the
9388 .lit8 section but not the .lit4 section (we can do
9389 .lit4 inline easily; we need to put .lit8
9390 somewhere in the data segment, and using .lit8
9391 permits the linker to eventually combine identical
9392 .lit8 entries).
9393
9394 The code below needs to know whether the target register
9395 is 32 or 64 bits wide. It relies on the fact 'f' and
9396 'F' are used with GPR-based instructions and 'l' and
9397 'L' are used with FPR-based instructions. */
9398
9399 f64 = *args == 'F' || *args == 'L';
9400 using_gprs = *args == 'F' || *args == 'f';
9401
9402 save_in = input_line_pointer;
9403 input_line_pointer = s;
9404 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9405 length = len;
9406 s = input_line_pointer;
9407 input_line_pointer = save_in;
9408 if (err != NULL && *err != '\0')
9409 {
9410 as_bad (_("Bad floating point constant: %s"), err);
9411 memset (temp, '\0', sizeof temp);
9412 length = f64 ? 8 : 4;
9413 }
9414
9415 assert (length == (unsigned) (f64 ? 8 : 4));
9416
9417 if (*args == 'f'
9418 || (*args == 'l'
9419 && (! USE_GLOBAL_POINTER_OPT
9420 || mips_pic == EMBEDDED_PIC
9421 || g_switch_value < 4
9422 || (temp[0] == 0 && temp[1] == 0)
9423 || (temp[2] == 0 && temp[3] == 0))))
9424 {
9425 imm_expr.X_op = O_constant;
9426 if (! target_big_endian)
9427 imm_expr.X_add_number = bfd_getl32 (temp);
9428 else
9429 imm_expr.X_add_number = bfd_getb32 (temp);
9430 }
9431 else if (length > 4
9432 && ! mips_disable_float_construction
9433 /* Constants can only be constructed in GPRs and
9434 copied to FPRs if the GPRs are at least as wide
9435 as the FPRs. Force the constant into memory if
9436 we are using 64-bit FPRs but the GPRs are only
9437 32 bits wide. */
9438 && (using_gprs
9439 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9440 && ((temp[0] == 0 && temp[1] == 0)
9441 || (temp[2] == 0 && temp[3] == 0))
9442 && ((temp[4] == 0 && temp[5] == 0)
9443 || (temp[6] == 0 && temp[7] == 0)))
9444 {
9445 /* The value is simple enough to load with a couple of
9446 instructions. If using 32-bit registers, set
9447 imm_expr to the high order 32 bits and offset_expr to
9448 the low order 32 bits. Otherwise, set imm_expr to
9449 the entire 64 bit constant. */
9450 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9451 {
9452 imm_expr.X_op = O_constant;
9453 offset_expr.X_op = O_constant;
9454 if (! target_big_endian)
9455 {
9456 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9457 offset_expr.X_add_number = bfd_getl32 (temp);
9458 }
9459 else
9460 {
9461 imm_expr.X_add_number = bfd_getb32 (temp);
9462 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9463 }
9464 if (offset_expr.X_add_number == 0)
9465 offset_expr.X_op = O_absent;
9466 }
9467 else if (sizeof (imm_expr.X_add_number) > 4)
9468 {
9469 imm_expr.X_op = O_constant;
9470 if (! target_big_endian)
9471 imm_expr.X_add_number = bfd_getl64 (temp);
9472 else
9473 imm_expr.X_add_number = bfd_getb64 (temp);
9474 }
9475 else
9476 {
9477 imm_expr.X_op = O_big;
9478 imm_expr.X_add_number = 4;
9479 if (! target_big_endian)
9480 {
9481 generic_bignum[0] = bfd_getl16 (temp);
9482 generic_bignum[1] = bfd_getl16 (temp + 2);
9483 generic_bignum[2] = bfd_getl16 (temp + 4);
9484 generic_bignum[3] = bfd_getl16 (temp + 6);
9485 }
9486 else
9487 {
9488 generic_bignum[0] = bfd_getb16 (temp + 6);
9489 generic_bignum[1] = bfd_getb16 (temp + 4);
9490 generic_bignum[2] = bfd_getb16 (temp + 2);
9491 generic_bignum[3] = bfd_getb16 (temp);
9492 }
9493 }
9494 }
9495 else
9496 {
9497 const char *newname;
9498 segT new_seg;
9499
9500 /* Switch to the right section. */
9501 seg = now_seg;
9502 subseg = now_subseg;
9503 switch (*args)
9504 {
9505 default: /* unused default case avoids warnings. */
9506 case 'L':
9507 newname = RDATA_SECTION_NAME;
9508 if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
9509 || mips_pic == EMBEDDED_PIC)
9510 newname = ".lit8";
9511 break;
9512 case 'F':
9513 if (mips_pic == EMBEDDED_PIC)
9514 newname = ".lit8";
9515 else
9516 newname = RDATA_SECTION_NAME;
9517 break;
9518 case 'l':
9519 assert (!USE_GLOBAL_POINTER_OPT
9520 || g_switch_value >= 4);
9521 newname = ".lit4";
9522 break;
9523 }
9524 new_seg = subseg_new (newname, (subsegT) 0);
9525 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9526 bfd_set_section_flags (stdoutput, new_seg,
9527 (SEC_ALLOC
9528 | SEC_LOAD
9529 | SEC_READONLY
9530 | SEC_DATA));
9531 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9532 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9533 && strcmp (TARGET_OS, "elf") != 0)
9534 record_alignment (new_seg, 4);
9535 else
9536 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9537 if (seg == now_seg)
9538 as_bad (_("Can't use floating point insn in this section"));
9539
9540 /* Set the argument to the current address in the
9541 section. */
9542 offset_expr.X_op = O_symbol;
9543 offset_expr.X_add_symbol =
9544 symbol_new ("L0\001", now_seg,
9545 (valueT) frag_now_fix (), frag_now);
9546 offset_expr.X_add_number = 0;
9547
9548 /* Put the floating point number into the section. */
9549 p = frag_more ((int) length);
9550 memcpy (p, temp, length);
9551
9552 /* Switch back to the original section. */
9553 subseg_set (seg, subseg);
9554 }
9555 }
9556 continue;
9557
9558 case 'i': /* 16 bit unsigned immediate */
9559 case 'j': /* 16 bit signed immediate */
9560 *imm_reloc = BFD_RELOC_LO16;
9561 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9562 {
9563 int more;
9564 offsetT minval, maxval;
9565
9566 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9567 && strcmp (insn->name, insn[1].name) == 0);
9568
9569 /* If the expression was written as an unsigned number,
9570 only treat it as signed if there are no more
9571 alternatives. */
9572 if (more
9573 && *args == 'j'
9574 && sizeof (imm_expr.X_add_number) <= 4
9575 && imm_expr.X_op == O_constant
9576 && imm_expr.X_add_number < 0
9577 && imm_expr.X_unsigned
9578 && HAVE_64BIT_GPRS)
9579 break;
9580
9581 /* For compatibility with older assemblers, we accept
9582 0x8000-0xffff as signed 16-bit numbers when only
9583 signed numbers are allowed. */
9584 if (*args == 'i')
9585 minval = 0, maxval = 0xffff;
9586 else if (more)
9587 minval = -0x8000, maxval = 0x7fff;
9588 else
9589 minval = -0x8000, maxval = 0xffff;
9590
9591 if (imm_expr.X_op != O_constant
9592 || imm_expr.X_add_number < minval
9593 || imm_expr.X_add_number > maxval)
9594 {
9595 if (more)
9596 break;
9597 if (imm_expr.X_op == O_constant
9598 || imm_expr.X_op == O_big)
9599 as_bad (_("expression out of range"));
9600 }
9601 }
9602 s = expr_end;
9603 continue;
9604
9605 case 'o': /* 16 bit offset */
9606 /* Check whether there is only a single bracketed expression
9607 left. If so, it must be the base register and the
9608 constant must be zero. */
9609 if (*s == '(' && strchr (s + 1, '(') == 0)
9610 {
9611 offset_expr.X_op = O_constant;
9612 offset_expr.X_add_number = 0;
9613 continue;
9614 }
9615
9616 /* If this value won't fit into a 16 bit offset, then go
9617 find a macro that will generate the 32 bit offset
9618 code pattern. */
9619 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9620 && (offset_expr.X_op != O_constant
9621 || offset_expr.X_add_number >= 0x8000
9622 || offset_expr.X_add_number < -0x8000))
9623 break;
9624
9625 s = expr_end;
9626 continue;
9627
9628 case 'p': /* pc relative offset */
9629 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9630 my_getExpression (&offset_expr, s);
9631 s = expr_end;
9632 continue;
9633
9634 case 'u': /* upper 16 bits */
9635 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9636 && imm_expr.X_op == O_constant
9637 && (imm_expr.X_add_number < 0
9638 || imm_expr.X_add_number >= 0x10000))
9639 as_bad (_("lui expression not in range 0..65535"));
9640 s = expr_end;
9641 continue;
9642
9643 case 'a': /* 26 bit address */
9644 my_getExpression (&offset_expr, s);
9645 s = expr_end;
9646 *offset_reloc = BFD_RELOC_MIPS_JMP;
9647 continue;
9648
9649 case 'N': /* 3 bit branch condition code */
9650 case 'M': /* 3 bit compare condition code */
9651 if (strncmp (s, "$fcc", 4) != 0)
9652 break;
9653 s += 4;
9654 regno = 0;
9655 do
9656 {
9657 regno *= 10;
9658 regno += *s - '0';
9659 ++s;
9660 }
9661 while (ISDIGIT (*s));
9662 if (regno > 7)
9663 as_bad (_("invalid condition code register $fcc%d"), regno);
9664 if (*args == 'N')
9665 ip->insn_opcode |= regno << OP_SH_BCC;
9666 else
9667 ip->insn_opcode |= regno << OP_SH_CCC;
9668 continue;
9669
9670 case 'H':
9671 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9672 s += 2;
9673 if (ISDIGIT (*s))
9674 {
9675 c = 0;
9676 do
9677 {
9678 c *= 10;
9679 c += *s - '0';
9680 ++s;
9681 }
9682 while (ISDIGIT (*s));
9683 }
9684 else
9685 c = 8; /* Invalid sel value. */
9686
9687 if (c > 7)
9688 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9689 ip->insn_opcode |= c;
9690 continue;
9691
9692 case 'e':
9693 /* Must be at least one digit. */
9694 my_getExpression (&imm_expr, s);
9695 check_absolute_expr (ip, &imm_expr);
9696
9697 if ((unsigned long) imm_expr.X_add_number
9698 > (unsigned long) OP_MASK_VECBYTE)
9699 {
9700 as_bad (_("bad byte vector index (%ld)"),
9701 (long) imm_expr.X_add_number);
9702 imm_expr.X_add_number = 0;
9703 }
9704
9705 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9706 imm_expr.X_op = O_absent;
9707 s = expr_end;
9708 continue;
9709
9710 case '%':
9711 my_getExpression (&imm_expr, s);
9712 check_absolute_expr (ip, &imm_expr);
9713
9714 if ((unsigned long) imm_expr.X_add_number
9715 > (unsigned long) OP_MASK_VECALIGN)
9716 {
9717 as_bad (_("bad byte vector index (%ld)"),
9718 (long) imm_expr.X_add_number);
9719 imm_expr.X_add_number = 0;
9720 }
9721
9722 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9723 imm_expr.X_op = O_absent;
9724 s = expr_end;
9725 continue;
9726
9727 default:
9728 as_bad (_("bad char = '%c'\n"), *args);
9729 internalError ();
9730 }
9731 break;
9732 }
9733 /* Args don't match. */
9734 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9735 !strcmp (insn->name, insn[1].name))
9736 {
9737 ++insn;
9738 s = argsStart;
9739 insn_error = _("illegal operands");
9740 continue;
9741 }
9742 if (save_c)
9743 *(--s) = save_c;
9744 insn_error = _("illegal operands");
9745 return;
9746 }
9747 }
9748
9749 /* This routine assembles an instruction into its binary format when
9750 assembling for the mips16. As a side effect, it sets one of the
9751 global variables imm_reloc or offset_reloc to the type of
9752 relocation to do if one of the operands is an address expression.
9753 It also sets mips16_small and mips16_ext if the user explicitly
9754 requested a small or extended instruction. */
9755
9756 static void
9757 mips16_ip (str, ip)
9758 char *str;
9759 struct mips_cl_insn *ip;
9760 {
9761 char *s;
9762 const char *args;
9763 struct mips_opcode *insn;
9764 char *argsstart;
9765 unsigned int regno;
9766 unsigned int lastregno = 0;
9767 char *s_reset;
9768
9769 insn_error = NULL;
9770
9771 mips16_small = FALSE;
9772 mips16_ext = FALSE;
9773
9774 for (s = str; ISLOWER (*s); ++s)
9775 ;
9776 switch (*s)
9777 {
9778 case '\0':
9779 break;
9780
9781 case ' ':
9782 *s++ = '\0';
9783 break;
9784
9785 case '.':
9786 if (s[1] == 't' && s[2] == ' ')
9787 {
9788 *s = '\0';
9789 mips16_small = TRUE;
9790 s += 3;
9791 break;
9792 }
9793 else if (s[1] == 'e' && s[2] == ' ')
9794 {
9795 *s = '\0';
9796 mips16_ext = TRUE;
9797 s += 3;
9798 break;
9799 }
9800 /* Fall through. */
9801 default:
9802 insn_error = _("unknown opcode");
9803 return;
9804 }
9805
9806 if (mips_opts.noautoextend && ! mips16_ext)
9807 mips16_small = TRUE;
9808
9809 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9810 {
9811 insn_error = _("unrecognized opcode");
9812 return;
9813 }
9814
9815 argsstart = s;
9816 for (;;)
9817 {
9818 assert (strcmp (insn->name, str) == 0);
9819
9820 ip->insn_mo = insn;
9821 ip->insn_opcode = insn->match;
9822 ip->use_extend = FALSE;
9823 imm_expr.X_op = O_absent;
9824 imm_reloc[0] = BFD_RELOC_UNUSED;
9825 imm_reloc[1] = BFD_RELOC_UNUSED;
9826 imm_reloc[2] = BFD_RELOC_UNUSED;
9827 offset_expr.X_op = O_absent;
9828 offset_reloc[0] = BFD_RELOC_UNUSED;
9829 offset_reloc[1] = BFD_RELOC_UNUSED;
9830 offset_reloc[2] = BFD_RELOC_UNUSED;
9831 for (args = insn->args; 1; ++args)
9832 {
9833 int c;
9834
9835 if (*s == ' ')
9836 ++s;
9837
9838 /* In this switch statement we call break if we did not find
9839 a match, continue if we did find a match, or return if we
9840 are done. */
9841
9842 c = *args;
9843 switch (c)
9844 {
9845 case '\0':
9846 if (*s == '\0')
9847 {
9848 /* Stuff the immediate value in now, if we can. */
9849 if (imm_expr.X_op == O_constant
9850 && *imm_reloc > BFD_RELOC_UNUSED
9851 && insn->pinfo != INSN_MACRO)
9852 {
9853 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9854 imm_expr.X_add_number, TRUE, mips16_small,
9855 mips16_ext, &ip->insn_opcode,
9856 &ip->use_extend, &ip->extend);
9857 imm_expr.X_op = O_absent;
9858 *imm_reloc = BFD_RELOC_UNUSED;
9859 }
9860
9861 return;
9862 }
9863 break;
9864
9865 case ',':
9866 if (*s++ == c)
9867 continue;
9868 s--;
9869 switch (*++args)
9870 {
9871 case 'v':
9872 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9873 continue;
9874 case 'w':
9875 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9876 continue;
9877 }
9878 break;
9879
9880 case '(':
9881 case ')':
9882 if (*s++ == c)
9883 continue;
9884 break;
9885
9886 case 'v':
9887 case 'w':
9888 if (s[0] != '$')
9889 {
9890 if (c == 'v')
9891 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9892 else
9893 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9894 ++args;
9895 continue;
9896 }
9897 /* Fall through. */
9898 case 'x':
9899 case 'y':
9900 case 'z':
9901 case 'Z':
9902 case '0':
9903 case 'S':
9904 case 'R':
9905 case 'X':
9906 case 'Y':
9907 if (s[0] != '$')
9908 break;
9909 s_reset = s;
9910 if (ISDIGIT (s[1]))
9911 {
9912 ++s;
9913 regno = 0;
9914 do
9915 {
9916 regno *= 10;
9917 regno += *s - '0';
9918 ++s;
9919 }
9920 while (ISDIGIT (*s));
9921 if (regno > 31)
9922 {
9923 as_bad (_("invalid register number (%d)"), regno);
9924 regno = 2;
9925 }
9926 }
9927 else
9928 {
9929 if (s[1] == 'r' && s[2] == 'a')
9930 {
9931 s += 3;
9932 regno = RA;
9933 }
9934 else if (s[1] == 'f' && s[2] == 'p')
9935 {
9936 s += 3;
9937 regno = FP;
9938 }
9939 else if (s[1] == 's' && s[2] == 'p')
9940 {
9941 s += 3;
9942 regno = SP;
9943 }
9944 else if (s[1] == 'g' && s[2] == 'p')
9945 {
9946 s += 3;
9947 regno = GP;
9948 }
9949 else if (s[1] == 'a' && s[2] == 't')
9950 {
9951 s += 3;
9952 regno = AT;
9953 }
9954 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9955 {
9956 s += 4;
9957 regno = KT0;
9958 }
9959 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9960 {
9961 s += 4;
9962 regno = KT1;
9963 }
9964 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9965 {
9966 s += 5;
9967 regno = ZERO;
9968 }
9969 else
9970 break;
9971 }
9972
9973 if (*s == ' ')
9974 ++s;
9975 if (args[1] != *s)
9976 {
9977 if (c == 'v' || c == 'w')
9978 {
9979 regno = mips16_to_32_reg_map[lastregno];
9980 s = s_reset;
9981 ++args;
9982 }
9983 }
9984
9985 switch (c)
9986 {
9987 case 'x':
9988 case 'y':
9989 case 'z':
9990 case 'v':
9991 case 'w':
9992 case 'Z':
9993 regno = mips32_to_16_reg_map[regno];
9994 break;
9995
9996 case '0':
9997 if (regno != 0)
9998 regno = ILLEGAL_REG;
9999 break;
10000
10001 case 'S':
10002 if (regno != SP)
10003 regno = ILLEGAL_REG;
10004 break;
10005
10006 case 'R':
10007 if (regno != RA)
10008 regno = ILLEGAL_REG;
10009 break;
10010
10011 case 'X':
10012 case 'Y':
10013 if (regno == AT && ! mips_opts.noat)
10014 as_warn (_("used $at without \".set noat\""));
10015 break;
10016
10017 default:
10018 internalError ();
10019 }
10020
10021 if (regno == ILLEGAL_REG)
10022 break;
10023
10024 switch (c)
10025 {
10026 case 'x':
10027 case 'v':
10028 ip->insn_opcode |= regno << MIPS16OP_SH_RX;
10029 break;
10030 case 'y':
10031 case 'w':
10032 ip->insn_opcode |= regno << MIPS16OP_SH_RY;
10033 break;
10034 case 'z':
10035 ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
10036 break;
10037 case 'Z':
10038 ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
10039 case '0':
10040 case 'S':
10041 case 'R':
10042 break;
10043 case 'X':
10044 ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
10045 break;
10046 case 'Y':
10047 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10048 ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
10049 break;
10050 default:
10051 internalError ();
10052 }
10053
10054 lastregno = regno;
10055 continue;
10056
10057 case 'P':
10058 if (strncmp (s, "$pc", 3) == 0)
10059 {
10060 s += 3;
10061 continue;
10062 }
10063 break;
10064
10065 case '<':
10066 case '>':
10067 case '[':
10068 case ']':
10069 case '4':
10070 case '5':
10071 case 'H':
10072 case 'W':
10073 case 'D':
10074 case 'j':
10075 case '8':
10076 case 'V':
10077 case 'C':
10078 case 'U':
10079 case 'k':
10080 case 'K':
10081 if (s[0] == '%'
10082 && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
10083 {
10084 /* This is %gprel(SYMBOL). We need to read SYMBOL,
10085 and generate the appropriate reloc. If the text
10086 inside %gprel is not a symbol name with an
10087 optional offset, then we generate a normal reloc
10088 and will probably fail later. */
10089 my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
10090 if (imm_expr.X_op == O_symbol)
10091 {
10092 mips16_ext = TRUE;
10093 *imm_reloc = BFD_RELOC_MIPS16_GPREL;
10094 s = expr_end;
10095 ip->use_extend = TRUE;
10096 ip->extend = 0;
10097 continue;
10098 }
10099 }
10100 else
10101 {
10102 /* Just pick up a normal expression. */
10103 my_getExpression (&imm_expr, s);
10104 }
10105
10106 if (imm_expr.X_op == O_register)
10107 {
10108 /* What we thought was an expression turned out to
10109 be a register. */
10110
10111 if (s[0] == '(' && args[1] == '(')
10112 {
10113 /* It looks like the expression was omitted
10114 before a register indirection, which means
10115 that the expression is implicitly zero. We
10116 still set up imm_expr, so that we handle
10117 explicit extensions correctly. */
10118 imm_expr.X_op = O_constant;
10119 imm_expr.X_add_number = 0;
10120 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10121 continue;
10122 }
10123
10124 break;
10125 }
10126
10127 /* We need to relax this instruction. */
10128 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10129 s = expr_end;
10130 continue;
10131
10132 case 'p':
10133 case 'q':
10134 case 'A':
10135 case 'B':
10136 case 'E':
10137 /* We use offset_reloc rather than imm_reloc for the PC
10138 relative operands. This lets macros with both
10139 immediate and address operands work correctly. */
10140 my_getExpression (&offset_expr, s);
10141
10142 if (offset_expr.X_op == O_register)
10143 break;
10144
10145 /* We need to relax this instruction. */
10146 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10147 s = expr_end;
10148 continue;
10149
10150 case '6': /* break code */
10151 my_getExpression (&imm_expr, s);
10152 check_absolute_expr (ip, &imm_expr);
10153 if ((unsigned long) imm_expr.X_add_number > 63)
10154 {
10155 as_warn (_("Invalid value for `%s' (%lu)"),
10156 ip->insn_mo->name,
10157 (unsigned long) imm_expr.X_add_number);
10158 imm_expr.X_add_number &= 0x3f;
10159 }
10160 ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
10161 imm_expr.X_op = O_absent;
10162 s = expr_end;
10163 continue;
10164
10165 case 'a': /* 26 bit address */
10166 my_getExpression (&offset_expr, s);
10167 s = expr_end;
10168 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10169 ip->insn_opcode <<= 16;
10170 continue;
10171
10172 case 'l': /* register list for entry macro */
10173 case 'L': /* register list for exit macro */
10174 {
10175 int mask;
10176
10177 if (c == 'l')
10178 mask = 0;
10179 else
10180 mask = 7 << 3;
10181 while (*s != '\0')
10182 {
10183 int freg, reg1, reg2;
10184
10185 while (*s == ' ' || *s == ',')
10186 ++s;
10187 if (*s != '$')
10188 {
10189 as_bad (_("can't parse register list"));
10190 break;
10191 }
10192 ++s;
10193 if (*s != 'f')
10194 freg = 0;
10195 else
10196 {
10197 freg = 1;
10198 ++s;
10199 }
10200 reg1 = 0;
10201 while (ISDIGIT (*s))
10202 {
10203 reg1 *= 10;
10204 reg1 += *s - '0';
10205 ++s;
10206 }
10207 if (*s == ' ')
10208 ++s;
10209 if (*s != '-')
10210 reg2 = reg1;
10211 else
10212 {
10213 ++s;
10214 if (*s != '$')
10215 break;
10216 ++s;
10217 if (freg)
10218 {
10219 if (*s == 'f')
10220 ++s;
10221 else
10222 {
10223 as_bad (_("invalid register list"));
10224 break;
10225 }
10226 }
10227 reg2 = 0;
10228 while (ISDIGIT (*s))
10229 {
10230 reg2 *= 10;
10231 reg2 += *s - '0';
10232 ++s;
10233 }
10234 }
10235 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10236 {
10237 mask &= ~ (7 << 3);
10238 mask |= 5 << 3;
10239 }
10240 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10241 {
10242 mask &= ~ (7 << 3);
10243 mask |= 6 << 3;
10244 }
10245 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10246 mask |= (reg2 - 3) << 3;
10247 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10248 mask |= (reg2 - 15) << 1;
10249 else if (reg1 == RA && reg2 == RA)
10250 mask |= 1;
10251 else
10252 {
10253 as_bad (_("invalid register list"));
10254 break;
10255 }
10256 }
10257 /* The mask is filled in in the opcode table for the
10258 benefit of the disassembler. We remove it before
10259 applying the actual mask. */
10260 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10261 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10262 }
10263 continue;
10264
10265 case 'e': /* extend code */
10266 my_getExpression (&imm_expr, s);
10267 check_absolute_expr (ip, &imm_expr);
10268 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10269 {
10270 as_warn (_("Invalid value for `%s' (%lu)"),
10271 ip->insn_mo->name,
10272 (unsigned long) imm_expr.X_add_number);
10273 imm_expr.X_add_number &= 0x7ff;
10274 }
10275 ip->insn_opcode |= imm_expr.X_add_number;
10276 imm_expr.X_op = O_absent;
10277 s = expr_end;
10278 continue;
10279
10280 default:
10281 internalError ();
10282 }
10283 break;
10284 }
10285
10286 /* Args don't match. */
10287 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10288 strcmp (insn->name, insn[1].name) == 0)
10289 {
10290 ++insn;
10291 s = argsstart;
10292 continue;
10293 }
10294
10295 insn_error = _("illegal operands");
10296
10297 return;
10298 }
10299 }
10300
10301 /* This structure holds information we know about a mips16 immediate
10302 argument type. */
10303
10304 struct mips16_immed_operand
10305 {
10306 /* The type code used in the argument string in the opcode table. */
10307 int type;
10308 /* The number of bits in the short form of the opcode. */
10309 int nbits;
10310 /* The number of bits in the extended form of the opcode. */
10311 int extbits;
10312 /* The amount by which the short form is shifted when it is used;
10313 for example, the sw instruction has a shift count of 2. */
10314 int shift;
10315 /* The amount by which the short form is shifted when it is stored
10316 into the instruction code. */
10317 int op_shift;
10318 /* Non-zero if the short form is unsigned. */
10319 int unsp;
10320 /* Non-zero if the extended form is unsigned. */
10321 int extu;
10322 /* Non-zero if the value is PC relative. */
10323 int pcrel;
10324 };
10325
10326 /* The mips16 immediate operand types. */
10327
10328 static const struct mips16_immed_operand mips16_immed_operands[] =
10329 {
10330 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10331 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10332 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10333 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10334 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10335 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10336 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10337 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10338 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10339 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10340 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10341 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10342 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10343 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10344 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10345 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10346 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10347 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10348 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10349 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10350 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10351 };
10352
10353 #define MIPS16_NUM_IMMED \
10354 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10355
10356 /* Handle a mips16 instruction with an immediate value. This or's the
10357 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10358 whether an extended value is needed; if one is needed, it sets
10359 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10360 If SMALL is true, an unextended opcode was explicitly requested.
10361 If EXT is true, an extended opcode was explicitly requested. If
10362 WARN is true, warn if EXT does not match reality. */
10363
10364 static void
10365 mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
10366 extend)
10367 char *file;
10368 unsigned int line;
10369 int type;
10370 offsetT val;
10371 bfd_boolean warn;
10372 bfd_boolean small;
10373 bfd_boolean ext;
10374 unsigned long *insn;
10375 bfd_boolean *use_extend;
10376 unsigned short *extend;
10377 {
10378 register const struct mips16_immed_operand *op;
10379 int mintiny, maxtiny;
10380 bfd_boolean needext;
10381
10382 op = mips16_immed_operands;
10383 while (op->type != type)
10384 {
10385 ++op;
10386 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10387 }
10388
10389 if (op->unsp)
10390 {
10391 if (type == '<' || type == '>' || type == '[' || type == ']')
10392 {
10393 mintiny = 1;
10394 maxtiny = 1 << op->nbits;
10395 }
10396 else
10397 {
10398 mintiny = 0;
10399 maxtiny = (1 << op->nbits) - 1;
10400 }
10401 }
10402 else
10403 {
10404 mintiny = - (1 << (op->nbits - 1));
10405 maxtiny = (1 << (op->nbits - 1)) - 1;
10406 }
10407
10408 /* Branch offsets have an implicit 0 in the lowest bit. */
10409 if (type == 'p' || type == 'q')
10410 val /= 2;
10411
10412 if ((val & ((1 << op->shift) - 1)) != 0
10413 || val < (mintiny << op->shift)
10414 || val > (maxtiny << op->shift))
10415 needext = TRUE;
10416 else
10417 needext = FALSE;
10418
10419 if (warn && ext && ! needext)
10420 as_warn_where (file, line,
10421 _("extended operand requested but not required"));
10422 if (small && needext)
10423 as_bad_where (file, line, _("invalid unextended operand value"));
10424
10425 if (small || (! ext && ! needext))
10426 {
10427 int insnval;
10428
10429 *use_extend = FALSE;
10430 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10431 insnval <<= op->op_shift;
10432 *insn |= insnval;
10433 }
10434 else
10435 {
10436 long minext, maxext;
10437 int extval;
10438
10439 if (op->extu)
10440 {
10441 minext = 0;
10442 maxext = (1 << op->extbits) - 1;
10443 }
10444 else
10445 {
10446 minext = - (1 << (op->extbits - 1));
10447 maxext = (1 << (op->extbits - 1)) - 1;
10448 }
10449 if (val < minext || val > maxext)
10450 as_bad_where (file, line,
10451 _("operand value out of range for instruction"));
10452
10453 *use_extend = TRUE;
10454 if (op->extbits == 16)
10455 {
10456 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10457 val &= 0x1f;
10458 }
10459 else if (op->extbits == 15)
10460 {
10461 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10462 val &= 0xf;
10463 }
10464 else
10465 {
10466 extval = ((val & 0x1f) << 6) | (val & 0x20);
10467 val = 0;
10468 }
10469
10470 *extend = (unsigned short) extval;
10471 *insn |= val;
10472 }
10473 }
10474 \f
10475 static const struct percent_op_match
10476 {
10477 const char *str;
10478 bfd_reloc_code_real_type reloc;
10479 } percent_op[] =
10480 {
10481 {"%lo", BFD_RELOC_LO16},
10482 #ifdef OBJ_ELF
10483 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10484 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10485 {"%call16", BFD_RELOC_MIPS_CALL16},
10486 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10487 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10488 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10489 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10490 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10491 {"%got", BFD_RELOC_MIPS_GOT16},
10492 {"%gp_rel", BFD_RELOC_GPREL16},
10493 {"%half", BFD_RELOC_16},
10494 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10495 {"%higher", BFD_RELOC_MIPS_HIGHER},
10496 {"%neg", BFD_RELOC_MIPS_SUB},
10497 #endif
10498 {"%hi", BFD_RELOC_HI16_S}
10499 };
10500
10501
10502 /* Return true if *STR points to a relocation operator. When returning true,
10503 move *STR over the operator and store its relocation code in *RELOC.
10504 Leave both *STR and *RELOC alone when returning false. */
10505
10506 static bfd_boolean
10507 parse_relocation (str, reloc)
10508 char **str;
10509 bfd_reloc_code_real_type *reloc;
10510 {
10511 size_t i;
10512
10513 for (i = 0; i < ARRAY_SIZE (percent_op); i++)
10514 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10515 {
10516 *str += strlen (percent_op[i].str);
10517 *reloc = percent_op[i].reloc;
10518
10519 /* Check whether the output BFD supports this relocation.
10520 If not, issue an error and fall back on something safe. */
10521 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10522 {
10523 as_bad ("relocation %s isn't supported by the current ABI",
10524 percent_op[i].str);
10525 *reloc = BFD_RELOC_LO16;
10526 }
10527 return TRUE;
10528 }
10529 return FALSE;
10530 }
10531
10532
10533 /* Parse string STR as a 16-bit relocatable operand. Store the
10534 expression in *EP and the relocations in the array starting
10535 at RELOC. Return the number of relocation operators used.
10536
10537 On exit, EXPR_END points to the first character after the expression.
10538 If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16. */
10539
10540 static size_t
10541 my_getSmallExpression (ep, reloc, str)
10542 expressionS *ep;
10543 bfd_reloc_code_real_type *reloc;
10544 char *str;
10545 {
10546 bfd_reloc_code_real_type reversed_reloc[3];
10547 size_t reloc_index, i;
10548 int crux_depth, str_depth;
10549 char *crux;
10550
10551 /* Search for the start of the main expression, recoding relocations
10552 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10553 of the main expression and with CRUX_DEPTH containing the number
10554 of open brackets at that point. */
10555 reloc_index = -1;
10556 str_depth = 0;
10557 do
10558 {
10559 reloc_index++;
10560 crux = str;
10561 crux_depth = str_depth;
10562
10563 /* Skip over whitespace and brackets, keeping count of the number
10564 of brackets. */
10565 while (*str == ' ' || *str == '\t' || *str == '(')
10566 if (*str++ == '(')
10567 str_depth++;
10568 }
10569 while (*str == '%'
10570 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10571 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10572
10573 my_getExpression (ep, crux);
10574 str = expr_end;
10575
10576 /* Match every open bracket. */
10577 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10578 if (*str++ == ')')
10579 crux_depth--;
10580
10581 if (crux_depth > 0)
10582 as_bad ("unclosed '('");
10583
10584 expr_end = str;
10585
10586 if (reloc_index == 0)
10587 reloc[0] = BFD_RELOC_LO16;
10588 else
10589 {
10590 prev_reloc_op_frag = frag_now;
10591 for (i = 0; i < reloc_index; i++)
10592 reloc[i] = reversed_reloc[reloc_index - 1 - i];
10593 }
10594
10595 return reloc_index;
10596 }
10597
10598 static void
10599 my_getExpression (ep, str)
10600 expressionS *ep;
10601 char *str;
10602 {
10603 char *save_in;
10604 valueT val;
10605
10606 save_in = input_line_pointer;
10607 input_line_pointer = str;
10608 expression (ep);
10609 expr_end = input_line_pointer;
10610 input_line_pointer = save_in;
10611
10612 /* If we are in mips16 mode, and this is an expression based on `.',
10613 then we bump the value of the symbol by 1 since that is how other
10614 text symbols are handled. We don't bother to handle complex
10615 expressions, just `.' plus or minus a constant. */
10616 if (mips_opts.mips16
10617 && ep->X_op == O_symbol
10618 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10619 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10620 && symbol_get_frag (ep->X_add_symbol) == frag_now
10621 && symbol_constant_p (ep->X_add_symbol)
10622 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10623 S_SET_VALUE (ep->X_add_symbol, val + 1);
10624 }
10625
10626 /* Turn a string in input_line_pointer into a floating point constant
10627 of type TYPE, and store the appropriate bytes in *LITP. The number
10628 of LITTLENUMS emitted is stored in *SIZEP. An error message is
10629 returned, or NULL on OK. */
10630
10631 char *
10632 md_atof (type, litP, sizeP)
10633 int type;
10634 char *litP;
10635 int *sizeP;
10636 {
10637 int prec;
10638 LITTLENUM_TYPE words[4];
10639 char *t;
10640 int i;
10641
10642 switch (type)
10643 {
10644 case 'f':
10645 prec = 2;
10646 break;
10647
10648 case 'd':
10649 prec = 4;
10650 break;
10651
10652 default:
10653 *sizeP = 0;
10654 return _("bad call to md_atof");
10655 }
10656
10657 t = atof_ieee (input_line_pointer, type, words);
10658 if (t)
10659 input_line_pointer = t;
10660
10661 *sizeP = prec * 2;
10662
10663 if (! target_big_endian)
10664 {
10665 for (i = prec - 1; i >= 0; i--)
10666 {
10667 md_number_to_chars (litP, (valueT) words[i], 2);
10668 litP += 2;
10669 }
10670 }
10671 else
10672 {
10673 for (i = 0; i < prec; i++)
10674 {
10675 md_number_to_chars (litP, (valueT) words[i], 2);
10676 litP += 2;
10677 }
10678 }
10679
10680 return NULL;
10681 }
10682
10683 void
10684 md_number_to_chars (buf, val, n)
10685 char *buf;
10686 valueT val;
10687 int n;
10688 {
10689 if (target_big_endian)
10690 number_to_chars_bigendian (buf, val, n);
10691 else
10692 number_to_chars_littleendian (buf, val, n);
10693 }
10694 \f
10695 #ifdef OBJ_ELF
10696 static int support_64bit_objects(void)
10697 {
10698 const char **list, **l;
10699 int yes;
10700
10701 list = bfd_target_list ();
10702 for (l = list; *l != NULL; l++)
10703 #ifdef TE_TMIPS
10704 /* This is traditional mips */
10705 if (strcmp (*l, "elf64-tradbigmips") == 0
10706 || strcmp (*l, "elf64-tradlittlemips") == 0)
10707 #else
10708 if (strcmp (*l, "elf64-bigmips") == 0
10709 || strcmp (*l, "elf64-littlemips") == 0)
10710 #endif
10711 break;
10712 yes = (*l != NULL);
10713 free (list);
10714 return yes;
10715 }
10716 #endif /* OBJ_ELF */
10717
10718 const char *md_shortopts = "nO::g::G:";
10719
10720 struct option md_longopts[] =
10721 {
10722 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
10723 {"mips0", no_argument, NULL, OPTION_MIPS1},
10724 {"mips1", no_argument, NULL, OPTION_MIPS1},
10725 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
10726 {"mips2", no_argument, NULL, OPTION_MIPS2},
10727 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
10728 {"mips3", no_argument, NULL, OPTION_MIPS3},
10729 #define OPTION_MIPS4 (OPTION_MD_BASE + 4)
10730 {"mips4", no_argument, NULL, OPTION_MIPS4},
10731 #define OPTION_MIPS5 (OPTION_MD_BASE + 5)
10732 {"mips5", no_argument, NULL, OPTION_MIPS5},
10733 #define OPTION_MIPS32 (OPTION_MD_BASE + 6)
10734 {"mips32", no_argument, NULL, OPTION_MIPS32},
10735 #define OPTION_MIPS64 (OPTION_MD_BASE + 7)
10736 {"mips64", no_argument, NULL, OPTION_MIPS64},
10737 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 8)
10738 {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
10739 #define OPTION_TRAP (OPTION_MD_BASE + 9)
10740 {"trap", no_argument, NULL, OPTION_TRAP},
10741 {"no-break", no_argument, NULL, OPTION_TRAP},
10742 #define OPTION_BREAK (OPTION_MD_BASE + 10)
10743 {"break", no_argument, NULL, OPTION_BREAK},
10744 {"no-trap", no_argument, NULL, OPTION_BREAK},
10745 #define OPTION_EB (OPTION_MD_BASE + 11)
10746 {"EB", no_argument, NULL, OPTION_EB},
10747 #define OPTION_EL (OPTION_MD_BASE + 12)
10748 {"EL", no_argument, NULL, OPTION_EL},
10749 #define OPTION_MIPS16 (OPTION_MD_BASE + 13)
10750 {"mips16", no_argument, NULL, OPTION_MIPS16},
10751 #define OPTION_NO_MIPS16 (OPTION_MD_BASE + 14)
10752 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10753 #define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 15)
10754 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10755 #define OPTION_MNO_7000_HILO_FIX (OPTION_MD_BASE + 16)
10756 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10757 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10758 #define OPTION_FP32 (OPTION_MD_BASE + 17)
10759 {"mfp32", no_argument, NULL, OPTION_FP32},
10760 #define OPTION_GP32 (OPTION_MD_BASE + 18)
10761 {"mgp32", no_argument, NULL, OPTION_GP32},
10762 #define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 19)
10763 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10764 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 20)
10765 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10766 #define OPTION_MARCH (OPTION_MD_BASE + 21)
10767 {"march", required_argument, NULL, OPTION_MARCH},
10768 #define OPTION_MTUNE (OPTION_MD_BASE + 22)
10769 {"mtune", required_argument, NULL, OPTION_MTUNE},
10770 #define OPTION_FP64 (OPTION_MD_BASE + 23)
10771 {"mfp64", no_argument, NULL, OPTION_FP64},
10772 #define OPTION_M4650 (OPTION_MD_BASE + 24)
10773 {"m4650", no_argument, NULL, OPTION_M4650},
10774 #define OPTION_NO_M4650 (OPTION_MD_BASE + 25)
10775 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10776 #define OPTION_M4010 (OPTION_MD_BASE + 26)
10777 {"m4010", no_argument, NULL, OPTION_M4010},
10778 #define OPTION_NO_M4010 (OPTION_MD_BASE + 27)
10779 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10780 #define OPTION_M4100 (OPTION_MD_BASE + 28)
10781 {"m4100", no_argument, NULL, OPTION_M4100},
10782 #define OPTION_NO_M4100 (OPTION_MD_BASE + 29)
10783 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10784 #define OPTION_M3900 (OPTION_MD_BASE + 30)
10785 {"m3900", no_argument, NULL, OPTION_M3900},
10786 #define OPTION_NO_M3900 (OPTION_MD_BASE + 31)
10787 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10788 #define OPTION_GP64 (OPTION_MD_BASE + 32)
10789 {"mgp64", no_argument, NULL, OPTION_GP64},
10790 #define OPTION_MIPS3D (OPTION_MD_BASE + 33)
10791 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10792 #define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
10793 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10794 #define OPTION_MDMX (OPTION_MD_BASE + 35)
10795 {"mdmx", no_argument, NULL, OPTION_MDMX},
10796 #define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
10797 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10798 #define OPTION_FIX_VR4122 (OPTION_MD_BASE + 37)
10799 #define OPTION_NO_FIX_VR4122 (OPTION_MD_BASE + 38)
10800 {"mfix-vr4122-bugs", no_argument, NULL, OPTION_FIX_VR4122},
10801 {"no-mfix-vr4122-bugs", no_argument, NULL, OPTION_NO_FIX_VR4122},
10802 #define OPTION_RELAX_BRANCH (OPTION_MD_BASE + 39)
10803 #define OPTION_NO_RELAX_BRANCH (OPTION_MD_BASE + 40)
10804 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10805 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10806 #define OPTION_MIPS32R2 (OPTION_MD_BASE + 41)
10807 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10808 #ifdef OBJ_ELF
10809 #define OPTION_ELF_BASE (OPTION_MD_BASE + 42)
10810 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10811 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
10812 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10813 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
10814 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
10815 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
10816 {"xgot", no_argument, NULL, OPTION_XGOT},
10817 #define OPTION_MABI (OPTION_ELF_BASE + 3)
10818 {"mabi", required_argument, NULL, OPTION_MABI},
10819 #define OPTION_32 (OPTION_ELF_BASE + 4)
10820 {"32", no_argument, NULL, OPTION_32},
10821 #define OPTION_N32 (OPTION_ELF_BASE + 5)
10822 {"n32", no_argument, NULL, OPTION_N32},
10823 #define OPTION_64 (OPTION_ELF_BASE + 6)
10824 {"64", no_argument, NULL, OPTION_64},
10825 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10826 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10827 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10828 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10829 #endif /* OBJ_ELF */
10830 {NULL, no_argument, NULL, 0}
10831 };
10832 size_t md_longopts_size = sizeof (md_longopts);
10833
10834 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10835 NEW_VALUE. Warn if another value was already specified. Note:
10836 we have to defer parsing the -march and -mtune arguments in order
10837 to handle 'from-abi' correctly, since the ABI might be specified
10838 in a later argument. */
10839
10840 static void
10841 mips_set_option_string (string_ptr, new_value)
10842 const char **string_ptr, *new_value;
10843 {
10844 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10845 as_warn (_("A different %s was already specified, is now %s"),
10846 string_ptr == &mips_arch_string ? "-march" : "-mtune",
10847 new_value);
10848
10849 *string_ptr = new_value;
10850 }
10851
10852 int
10853 md_parse_option (c, arg)
10854 int c;
10855 char *arg;
10856 {
10857 switch (c)
10858 {
10859 case OPTION_CONSTRUCT_FLOATS:
10860 mips_disable_float_construction = 0;
10861 break;
10862
10863 case OPTION_NO_CONSTRUCT_FLOATS:
10864 mips_disable_float_construction = 1;
10865 break;
10866
10867 case OPTION_TRAP:
10868 mips_trap = 1;
10869 break;
10870
10871 case OPTION_BREAK:
10872 mips_trap = 0;
10873 break;
10874
10875 case OPTION_EB:
10876 target_big_endian = 1;
10877 break;
10878
10879 case OPTION_EL:
10880 target_big_endian = 0;
10881 break;
10882
10883 case 'n':
10884 warn_nops = 1;
10885 break;
10886
10887 case 'O':
10888 if (arg && arg[1] == '0')
10889 mips_optimize = 1;
10890 else
10891 mips_optimize = 2;
10892 break;
10893
10894 case 'g':
10895 if (arg == NULL)
10896 mips_debug = 2;
10897 else
10898 mips_debug = atoi (arg);
10899 /* When the MIPS assembler sees -g or -g2, it does not do
10900 optimizations which limit full symbolic debugging. We take
10901 that to be equivalent to -O0. */
10902 if (mips_debug == 2)
10903 mips_optimize = 1;
10904 break;
10905
10906 case OPTION_MIPS1:
10907 file_mips_isa = ISA_MIPS1;
10908 break;
10909
10910 case OPTION_MIPS2:
10911 file_mips_isa = ISA_MIPS2;
10912 break;
10913
10914 case OPTION_MIPS3:
10915 file_mips_isa = ISA_MIPS3;
10916 break;
10917
10918 case OPTION_MIPS4:
10919 file_mips_isa = ISA_MIPS4;
10920 break;
10921
10922 case OPTION_MIPS5:
10923 file_mips_isa = ISA_MIPS5;
10924 break;
10925
10926 case OPTION_MIPS32:
10927 file_mips_isa = ISA_MIPS32;
10928 break;
10929
10930 case OPTION_MIPS32R2:
10931 file_mips_isa = ISA_MIPS32R2;
10932 break;
10933
10934 case OPTION_MIPS64:
10935 file_mips_isa = ISA_MIPS64;
10936 break;
10937
10938 case OPTION_MTUNE:
10939 mips_set_option_string (&mips_tune_string, arg);
10940 break;
10941
10942 case OPTION_MARCH:
10943 mips_set_option_string (&mips_arch_string, arg);
10944 break;
10945
10946 case OPTION_M4650:
10947 mips_set_option_string (&mips_arch_string, "4650");
10948 mips_set_option_string (&mips_tune_string, "4650");
10949 break;
10950
10951 case OPTION_NO_M4650:
10952 break;
10953
10954 case OPTION_M4010:
10955 mips_set_option_string (&mips_arch_string, "4010");
10956 mips_set_option_string (&mips_tune_string, "4010");
10957 break;
10958
10959 case OPTION_NO_M4010:
10960 break;
10961
10962 case OPTION_M4100:
10963 mips_set_option_string (&mips_arch_string, "4100");
10964 mips_set_option_string (&mips_tune_string, "4100");
10965 break;
10966
10967 case OPTION_NO_M4100:
10968 break;
10969
10970 case OPTION_M3900:
10971 mips_set_option_string (&mips_arch_string, "3900");
10972 mips_set_option_string (&mips_tune_string, "3900");
10973 break;
10974
10975 case OPTION_NO_M3900:
10976 break;
10977
10978 case OPTION_MDMX:
10979 mips_opts.ase_mdmx = 1;
10980 break;
10981
10982 case OPTION_NO_MDMX:
10983 mips_opts.ase_mdmx = 0;
10984 break;
10985
10986 case OPTION_MIPS16:
10987 mips_opts.mips16 = 1;
10988 mips_no_prev_insn (FALSE);
10989 break;
10990
10991 case OPTION_NO_MIPS16:
10992 mips_opts.mips16 = 0;
10993 mips_no_prev_insn (FALSE);
10994 break;
10995
10996 case OPTION_MIPS3D:
10997 mips_opts.ase_mips3d = 1;
10998 break;
10999
11000 case OPTION_NO_MIPS3D:
11001 mips_opts.ase_mips3d = 0;
11002 break;
11003
11004 case OPTION_MEMBEDDED_PIC:
11005 mips_pic = EMBEDDED_PIC;
11006 if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
11007 {
11008 as_bad (_("-G may not be used with embedded PIC code"));
11009 return 0;
11010 }
11011 g_switch_value = 0x7fffffff;
11012 break;
11013
11014 case OPTION_FIX_VR4122:
11015 mips_fix_4122_bugs = 1;
11016 break;
11017
11018 case OPTION_NO_FIX_VR4122:
11019 mips_fix_4122_bugs = 0;
11020 break;
11021
11022 case OPTION_RELAX_BRANCH:
11023 mips_relax_branch = 1;
11024 break;
11025
11026 case OPTION_NO_RELAX_BRANCH:
11027 mips_relax_branch = 0;
11028 break;
11029
11030 #ifdef OBJ_ELF
11031 /* When generating ELF code, we permit -KPIC and -call_shared to
11032 select SVR4_PIC, and -non_shared to select no PIC. This is
11033 intended to be compatible with Irix 5. */
11034 case OPTION_CALL_SHARED:
11035 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11036 {
11037 as_bad (_("-call_shared is supported only for ELF format"));
11038 return 0;
11039 }
11040 mips_pic = SVR4_PIC;
11041 if (g_switch_seen && g_switch_value != 0)
11042 {
11043 as_bad (_("-G may not be used with SVR4 PIC code"));
11044 return 0;
11045 }
11046 g_switch_value = 0;
11047 break;
11048
11049 case OPTION_NON_SHARED:
11050 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11051 {
11052 as_bad (_("-non_shared is supported only for ELF format"));
11053 return 0;
11054 }
11055 mips_pic = NO_PIC;
11056 break;
11057
11058 /* The -xgot option tells the assembler to use 32 offsets when
11059 accessing the got in SVR4_PIC mode. It is for Irix
11060 compatibility. */
11061 case OPTION_XGOT:
11062 mips_big_got = 1;
11063 break;
11064 #endif /* OBJ_ELF */
11065
11066 case 'G':
11067 if (! USE_GLOBAL_POINTER_OPT)
11068 {
11069 as_bad (_("-G is not supported for this configuration"));
11070 return 0;
11071 }
11072 else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
11073 {
11074 as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
11075 return 0;
11076 }
11077 else
11078 g_switch_value = atoi (arg);
11079 g_switch_seen = 1;
11080 break;
11081
11082 #ifdef OBJ_ELF
11083 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11084 and -mabi=64. */
11085 case OPTION_32:
11086 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11087 {
11088 as_bad (_("-32 is supported for ELF format only"));
11089 return 0;
11090 }
11091 mips_abi = O32_ABI;
11092 break;
11093
11094 case OPTION_N32:
11095 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11096 {
11097 as_bad (_("-n32 is supported for ELF format only"));
11098 return 0;
11099 }
11100 mips_abi = N32_ABI;
11101 break;
11102
11103 case OPTION_64:
11104 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11105 {
11106 as_bad (_("-64 is supported for ELF format only"));
11107 return 0;
11108 }
11109 mips_abi = N64_ABI;
11110 if (! support_64bit_objects())
11111 as_fatal (_("No compiled in support for 64 bit object file format"));
11112 break;
11113 #endif /* OBJ_ELF */
11114
11115 case OPTION_GP32:
11116 file_mips_gp32 = 1;
11117 break;
11118
11119 case OPTION_GP64:
11120 file_mips_gp32 = 0;
11121 break;
11122
11123 case OPTION_FP32:
11124 file_mips_fp32 = 1;
11125 break;
11126
11127 case OPTION_FP64:
11128 file_mips_fp32 = 0;
11129 break;
11130
11131 #ifdef OBJ_ELF
11132 case OPTION_MABI:
11133 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11134 {
11135 as_bad (_("-mabi is supported for ELF format only"));
11136 return 0;
11137 }
11138 if (strcmp (arg, "32") == 0)
11139 mips_abi = O32_ABI;
11140 else if (strcmp (arg, "o64") == 0)
11141 mips_abi = O64_ABI;
11142 else if (strcmp (arg, "n32") == 0)
11143 mips_abi = N32_ABI;
11144 else if (strcmp (arg, "64") == 0)
11145 {
11146 mips_abi = N64_ABI;
11147 if (! support_64bit_objects())
11148 as_fatal (_("No compiled in support for 64 bit object file "
11149 "format"));
11150 }
11151 else if (strcmp (arg, "eabi") == 0)
11152 mips_abi = EABI_ABI;
11153 else
11154 {
11155 as_fatal (_("invalid abi -mabi=%s"), arg);
11156 return 0;
11157 }
11158 break;
11159 #endif /* OBJ_ELF */
11160
11161 case OPTION_M7000_HILO_FIX:
11162 mips_7000_hilo_fix = TRUE;
11163 break;
11164
11165 case OPTION_MNO_7000_HILO_FIX:
11166 mips_7000_hilo_fix = FALSE;
11167 break;
11168
11169 #ifdef OBJ_ELF
11170 case OPTION_MDEBUG:
11171 mips_flag_mdebug = TRUE;
11172 break;
11173
11174 case OPTION_NO_MDEBUG:
11175 mips_flag_mdebug = FALSE;
11176 break;
11177 #endif /* OBJ_ELF */
11178
11179 default:
11180 return 0;
11181 }
11182
11183 return 1;
11184 }
11185 \f
11186 /* Set up globals to generate code for the ISA or processor
11187 described by INFO. */
11188
11189 static void
11190 mips_set_architecture (info)
11191 const struct mips_cpu_info *info;
11192 {
11193 if (info != 0)
11194 {
11195 mips_arch_info = info;
11196 mips_arch = info->cpu;
11197 mips_opts.isa = info->isa;
11198 }
11199 }
11200
11201
11202 /* Likewise for tuning. */
11203
11204 static void
11205 mips_set_tune (info)
11206 const struct mips_cpu_info *info;
11207 {
11208 if (info != 0)
11209 {
11210 mips_tune_info = info;
11211 mips_tune = info->cpu;
11212 }
11213 }
11214
11215
11216 void
11217 mips_after_parse_args ()
11218 {
11219 /* GP relative stuff not working for PE */
11220 if (strncmp (TARGET_OS, "pe", 2) == 0
11221 && g_switch_value != 0)
11222 {
11223 if (g_switch_seen)
11224 as_bad (_("-G not supported in this configuration."));
11225 g_switch_value = 0;
11226 }
11227
11228 /* The following code determines the architecture and register size.
11229 Similar code was added to GCC 3.3 (see override_options() in
11230 config/mips/mips.c). The GAS and GCC code should be kept in sync
11231 as much as possible. */
11232
11233 if (mips_arch_string != 0)
11234 mips_set_architecture (mips_parse_cpu ("-march", mips_arch_string));
11235
11236 if (mips_tune_string != 0)
11237 mips_set_tune (mips_parse_cpu ("-mtune", mips_tune_string));
11238
11239 if (file_mips_isa != ISA_UNKNOWN)
11240 {
11241 /* Handle -mipsN. At this point, file_mips_isa contains the
11242 ISA level specified by -mipsN, while mips_opts.isa contains
11243 the -march selection (if any). */
11244 if (mips_arch_info != 0)
11245 {
11246 /* -march takes precedence over -mipsN, since it is more descriptive.
11247 There's no harm in specifying both as long as the ISA levels
11248 are the same. */
11249 if (file_mips_isa != mips_opts.isa)
11250 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11251 mips_cpu_info_from_isa (file_mips_isa)->name,
11252 mips_cpu_info_from_isa (mips_opts.isa)->name);
11253 }
11254 else
11255 mips_set_architecture (mips_cpu_info_from_isa (file_mips_isa));
11256 }
11257
11258 if (mips_arch_info == 0)
11259 mips_set_architecture (mips_parse_cpu ("default CPU",
11260 MIPS_CPU_STRING_DEFAULT));
11261
11262 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11263 as_bad ("-march=%s is not compatible with the selected ABI",
11264 mips_arch_info->name);
11265
11266 /* Optimize for mips_arch, unless -mtune selects a different processor. */
11267 if (mips_tune_info == 0)
11268 mips_set_tune (mips_arch_info);
11269
11270 if (file_mips_gp32 >= 0)
11271 {
11272 /* The user specified the size of the integer registers. Make sure
11273 it agrees with the ABI and ISA. */
11274 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11275 as_bad (_("-mgp64 used with a 32-bit processor"));
11276 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11277 as_bad (_("-mgp32 used with a 64-bit ABI"));
11278 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11279 as_bad (_("-mgp64 used with a 32-bit ABI"));
11280 }
11281 else
11282 {
11283 /* Infer the integer register size from the ABI and processor.
11284 Restrict ourselves to 32-bit registers if that's all the
11285 processor has, or if the ABI cannot handle 64-bit registers. */
11286 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11287 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11288 }
11289
11290 /* ??? GAS treats single-float processors as though they had 64-bit
11291 float registers (although it complains when double-precision
11292 instructions are used). As things stand, saying they have 32-bit
11293 registers would lead to spurious "register must be even" messages.
11294 So here we assume float registers are always the same size as
11295 integer ones, unless the user says otherwise. */
11296 if (file_mips_fp32 < 0)
11297 file_mips_fp32 = file_mips_gp32;
11298
11299 /* End of GCC-shared inference code. */
11300
11301 /* ??? When do we want this flag to be set? Who uses it? */
11302 if (file_mips_gp32 == 1
11303 && mips_abi == NO_ABI
11304 && ISA_HAS_64BIT_REGS (mips_opts.isa))
11305 mips_32bitmode = 1;
11306
11307 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11308 as_bad (_("trap exception not supported at ISA 1"));
11309
11310 /* If the selected architecture includes support for ASEs, enable
11311 generation of code for them. */
11312 if (mips_opts.mips16 == -1)
11313 mips_opts.mips16 = (CPU_HAS_MIPS16 (mips_arch)) ? 1 : 0;
11314 if (mips_opts.ase_mips3d == -1)
11315 mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (mips_arch)) ? 1 : 0;
11316 if (mips_opts.ase_mdmx == -1)
11317 mips_opts.ase_mdmx = (CPU_HAS_MDMX (mips_arch)) ? 1 : 0;
11318
11319 file_mips_isa = mips_opts.isa;
11320 file_ase_mips16 = mips_opts.mips16;
11321 file_ase_mips3d = mips_opts.ase_mips3d;
11322 file_ase_mdmx = mips_opts.ase_mdmx;
11323 mips_opts.gp32 = file_mips_gp32;
11324 mips_opts.fp32 = file_mips_fp32;
11325
11326 if (mips_flag_mdebug < 0)
11327 {
11328 #ifdef OBJ_MAYBE_ECOFF
11329 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11330 mips_flag_mdebug = 1;
11331 else
11332 #endif /* OBJ_MAYBE_ECOFF */
11333 mips_flag_mdebug = 0;
11334 }
11335 }
11336 \f
11337 void
11338 mips_init_after_args ()
11339 {
11340 /* initialize opcodes */
11341 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11342 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11343 }
11344
11345 long
11346 md_pcrel_from (fixP)
11347 fixS *fixP;
11348 {
11349 if (OUTPUT_FLAVOR != bfd_target_aout_flavour
11350 && fixP->fx_addsy != (symbolS *) NULL
11351 && ! S_IS_DEFINED (fixP->fx_addsy))
11352 return 4;
11353
11354 /* Return the address of the delay slot. */
11355 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11356 }
11357
11358 /* This is called before the symbol table is processed. In order to
11359 work with gcc when using mips-tfile, we must keep all local labels.
11360 However, in other cases, we want to discard them. If we were
11361 called with -g, but we didn't see any debugging information, it may
11362 mean that gcc is smuggling debugging information through to
11363 mips-tfile, in which case we must generate all local labels. */
11364
11365 void
11366 mips_frob_file_before_adjust ()
11367 {
11368 #ifndef NO_ECOFF_DEBUGGING
11369 if (ECOFF_DEBUGGING
11370 && mips_debug != 0
11371 && ! ecoff_debugging_seen)
11372 flag_keep_locals = 1;
11373 #endif
11374 }
11375
11376 /* Sort any unmatched HI16_S relocs so that they immediately precede
11377 the corresponding LO reloc. This is called before md_apply_fix3 and
11378 tc_gen_reloc. Unmatched HI16_S relocs can only be generated by
11379 explicit use of the %hi modifier. */
11380
11381 void
11382 mips_frob_file ()
11383 {
11384 struct mips_hi_fixup *l;
11385
11386 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11387 {
11388 segment_info_type *seginfo;
11389 int pass;
11390
11391 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11392
11393 /* If a GOT16 relocation turns out to be against a global symbol,
11394 there isn't supposed to be a matching LO. */
11395 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11396 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11397 continue;
11398
11399 /* Check quickly whether the next fixup happens to be a matching %lo. */
11400 if (fixup_has_matching_lo_p (l->fixp))
11401 continue;
11402
11403 /* Look through the fixups for this segment for a matching %lo.
11404 When we find one, move the %hi just in front of it. We do
11405 this in two passes. In the first pass, we try to find a
11406 unique %lo. In the second pass, we permit multiple %hi
11407 relocs for a single %lo (this is a GNU extension). */
11408 seginfo = seg_info (l->seg);
11409 for (pass = 0; pass < 2; pass++)
11410 {
11411 fixS *f, *prev;
11412
11413 prev = NULL;
11414 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
11415 {
11416 /* Check whether this is a %lo fixup which matches l->fixp. */
11417 if (f->fx_r_type == BFD_RELOC_LO16
11418 && f->fx_addsy == l->fixp->fx_addsy
11419 && f->fx_offset == l->fixp->fx_offset
11420 && (pass == 1
11421 || prev == NULL
11422 || !reloc_needs_lo_p (prev->fx_r_type)
11423 || !fixup_has_matching_lo_p (prev)))
11424 {
11425 fixS **pf;
11426
11427 /* Move l->fixp before f. */
11428 for (pf = &seginfo->fix_root;
11429 *pf != l->fixp;
11430 pf = &(*pf)->fx_next)
11431 assert (*pf != NULL);
11432
11433 *pf = l->fixp->fx_next;
11434
11435 l->fixp->fx_next = f;
11436 if (prev == NULL)
11437 seginfo->fix_root = l->fixp;
11438 else
11439 prev->fx_next = l->fixp;
11440
11441 break;
11442 }
11443
11444 prev = f;
11445 }
11446
11447 if (f != NULL)
11448 break;
11449
11450 #if 0 /* GCC code motion plus incomplete dead code elimination
11451 can leave a %hi without a %lo. */
11452 if (pass == 1)
11453 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
11454 _("Unmatched %%hi reloc"));
11455 #endif
11456 }
11457 }
11458 }
11459
11460 /* When generating embedded PIC code we need to use a special
11461 relocation to represent the difference of two symbols in the .text
11462 section (switch tables use a difference of this sort). See
11463 include/coff/mips.h for details. This macro checks whether this
11464 fixup requires the special reloc. */
11465 #define SWITCH_TABLE(fixp) \
11466 ((fixp)->fx_r_type == BFD_RELOC_32 \
11467 && OUTPUT_FLAVOR != bfd_target_elf_flavour \
11468 && (fixp)->fx_addsy != NULL \
11469 && (fixp)->fx_subsy != NULL \
11470 && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
11471 && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
11472
11473 /* When generating embedded PIC code we must keep all PC relative
11474 relocations, in case the linker has to relax a call. We also need
11475 to keep relocations for switch table entries.
11476
11477 We may have combined relocations without symbols in the N32/N64 ABI.
11478 We have to prevent gas from dropping them. */
11479
11480 int
11481 mips_force_relocation (fixp)
11482 fixS *fixp;
11483 {
11484 if (generic_force_reloc (fixp))
11485 return 1;
11486
11487 if (HAVE_NEWABI
11488 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11489 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11490 || fixp->fx_r_type == BFD_RELOC_HI16_S
11491 || fixp->fx_r_type == BFD_RELOC_LO16))
11492 return 1;
11493
11494 return (mips_pic == EMBEDDED_PIC
11495 && (fixp->fx_pcrel
11496 || SWITCH_TABLE (fixp)
11497 || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11498 || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11499 }
11500
11501 /* This hook is called before a fix is simplified. We don't really
11502 decide whether to skip a fix here. Rather, we turn global symbols
11503 used as branch targets into local symbols, such that they undergo
11504 simplification. We can only do this if the symbol is defined and
11505 it is in the same section as the branch. If this doesn't hold, we
11506 emit a better error message than just saying the relocation is not
11507 valid for the selected object format.
11508
11509 FIXP is the fix-up we're going to try to simplify, SEG is the
11510 segment in which the fix up occurs. The return value should be
11511 non-zero to indicate the fix-up is valid for further
11512 simplifications. */
11513
11514 int
11515 mips_validate_fix (fixP, seg)
11516 struct fix *fixP;
11517 asection *seg;
11518 {
11519 /* There's a lot of discussion on whether it should be possible to
11520 use R_MIPS_PC16 to represent branch relocations. The outcome
11521 seems to be that it can, but gas/bfd are very broken in creating
11522 RELA relocations for this, so for now we only accept branches to
11523 symbols in the same section. Anything else is of dubious value,
11524 since there's no guarantee that at link time the symbol would be
11525 in range. Even for branches to local symbols this is arguably
11526 wrong, since it we assume the symbol is not going to be
11527 overridden, which should be possible per ELF library semantics,
11528 but then, there isn't a dynamic relocation that could be used to
11529 this effect, and the target would likely be out of range as well.
11530
11531 Unfortunately, it seems that there is too much code out there
11532 that relies on branches to symbols that are global to be resolved
11533 as if they were local, like the IRIX tools do, so we do it as
11534 well, but with a warning so that people are reminded to fix their
11535 code. If we ever get back to using R_MIPS_PC16 for branch
11536 targets, this entire block should go away (and probably the
11537 whole function). */
11538
11539 if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
11540 && (((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11541 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11542 && mips_pic != EMBEDDED_PIC)
11543 || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
11544 && fixP->fx_addsy)
11545 {
11546 if (! S_IS_DEFINED (fixP->fx_addsy))
11547 {
11548 as_bad_where (fixP->fx_file, fixP->fx_line,
11549 _("Cannot branch to undefined symbol."));
11550 /* Avoid any further errors about this fixup. */
11551 fixP->fx_done = 1;
11552 }
11553 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
11554 {
11555 as_bad_where (fixP->fx_file, fixP->fx_line,
11556 _("Cannot branch to symbol in another section."));
11557 fixP->fx_done = 1;
11558 }
11559 else if (S_IS_EXTERNAL (fixP->fx_addsy))
11560 {
11561 symbolS *sym = fixP->fx_addsy;
11562
11563 as_warn_where (fixP->fx_file, fixP->fx_line,
11564 _("Pretending global symbol used as branch target is local."));
11565
11566 fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
11567 S_GET_SEGMENT (sym),
11568 S_GET_VALUE (sym),
11569 symbol_get_frag (sym));
11570 copy_symbol_attributes (fixP->fx_addsy, sym);
11571 S_CLEAR_EXTERNAL (fixP->fx_addsy);
11572 assert (symbol_resolved_p (sym));
11573 symbol_mark_resolved (fixP->fx_addsy);
11574 }
11575 }
11576
11577 return 1;
11578 }
11579
11580 #ifdef OBJ_ELF
11581 static int
11582 mips_need_elf_addend_fixup (fixP)
11583 fixS *fixP;
11584 {
11585 if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
11586 return 1;
11587 if (mips_pic == EMBEDDED_PIC
11588 && S_IS_WEAK (fixP->fx_addsy))
11589 return 1;
11590 if (mips_pic != EMBEDDED_PIC
11591 && (S_IS_WEAK (fixP->fx_addsy)
11592 || S_IS_EXTERNAL (fixP->fx_addsy))
11593 && !S_IS_COMMON (fixP->fx_addsy))
11594 return 1;
11595 if (((bfd_get_section_flags (stdoutput,
11596 S_GET_SEGMENT (fixP->fx_addsy))
11597 & (SEC_LINK_ONCE | SEC_MERGE)) != 0)
11598 || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
11599 ".gnu.linkonce",
11600 sizeof (".gnu.linkonce") - 1))
11601 return 1;
11602 return 0;
11603 }
11604 #endif
11605
11606 /* Apply a fixup to the object file. */
11607
11608 void
11609 md_apply_fix3 (fixP, valP, seg)
11610 fixS *fixP;
11611 valueT *valP;
11612 segT seg ATTRIBUTE_UNUSED;
11613 {
11614 bfd_byte *buf;
11615 long insn;
11616 valueT value;
11617 static int previous_fx_r_type = 0;
11618
11619 /* FIXME: Maybe just return for all reloc types not listed below?
11620 Eric Christopher says: "This is stupid, please rewrite md_apply_fix3. */
11621 if (fixP->fx_r_type == BFD_RELOC_8)
11622 return;
11623
11624 assert (fixP->fx_size == 4
11625 || fixP->fx_r_type == BFD_RELOC_16
11626 || fixP->fx_r_type == BFD_RELOC_32
11627 || fixP->fx_r_type == BFD_RELOC_MIPS_JMP
11628 || fixP->fx_r_type == BFD_RELOC_HI16_S
11629 || fixP->fx_r_type == BFD_RELOC_LO16
11630 || fixP->fx_r_type == BFD_RELOC_GPREL16
11631 || fixP->fx_r_type == BFD_RELOC_MIPS_LITERAL
11632 || fixP->fx_r_type == BFD_RELOC_GPREL32
11633 || fixP->fx_r_type == BFD_RELOC_64
11634 || fixP->fx_r_type == BFD_RELOC_CTOR
11635 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11636 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHEST
11637 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHER
11638 || fixP->fx_r_type == BFD_RELOC_MIPS_SCN_DISP
11639 || fixP->fx_r_type == BFD_RELOC_MIPS_REL16
11640 || fixP->fx_r_type == BFD_RELOC_MIPS_RELGOT
11641 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11642 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11643 || fixP->fx_r_type == BFD_RELOC_MIPS_JALR);
11644
11645 value = *valP;
11646
11647 /* If we aren't adjusting this fixup to be against the section
11648 symbol, we need to adjust the value. */
11649 #ifdef OBJ_ELF
11650 if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
11651 {
11652 if (mips_need_elf_addend_fixup (fixP))
11653 {
11654 reloc_howto_type *howto;
11655 valueT symval = S_GET_VALUE (fixP->fx_addsy);
11656
11657 value -= symval;
11658
11659 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11660 if (value != 0 && howto && howto->partial_inplace)
11661 {
11662 /* In this case, the bfd_install_relocation routine will
11663 incorrectly add the symbol value back in. We just want
11664 the addend to appear in the object file.
11665
11666 The condition above used to include
11667 "&& (! fixP->fx_pcrel || howto->pcrel_offset)".
11668
11669 However, howto can't be trusted here, because we
11670 might change the reloc type in tc_gen_reloc. We can
11671 check howto->partial_inplace because that conversion
11672 happens to preserve howto->partial_inplace; but it
11673 does not preserve howto->pcrel_offset. I've just
11674 eliminated the check, because all MIPS PC-relative
11675 relocations are marked howto->pcrel_offset.
11676
11677 howto->pcrel_offset was originally added for
11678 R_MIPS_PC16, which is generated for code like
11679
11680 globl g1 .text
11681 .text
11682 .space 20
11683 g1:
11684 x:
11685 bal g1
11686 */
11687 value -= symval;
11688
11689 /* Make sure the addend is still non-zero. If it became zero
11690 after the last operation, set it to a spurious value and
11691 subtract the same value from the object file's contents. */
11692 if (value == 0)
11693 {
11694 value = 8;
11695
11696 /* The in-place addends for LO16 relocations are signed;
11697 leave the matching HI16 in-place addends as zero. */
11698 if (fixP->fx_r_type != BFD_RELOC_HI16_S)
11699 {
11700 bfd_vma contents, mask, field;
11701
11702 contents = bfd_get_bits (fixP->fx_frag->fr_literal
11703 + fixP->fx_where,
11704 fixP->fx_size * 8,
11705 target_big_endian);
11706
11707 /* MASK has bits set where the relocation should go.
11708 FIELD is -value, shifted into the appropriate place
11709 for this relocation. */
11710 mask = 1 << (howto->bitsize - 1);
11711 mask = (((mask - 1) << 1) | 1) << howto->bitpos;
11712 field = (-value >> howto->rightshift) << howto->bitpos;
11713
11714 bfd_put_bits ((field & mask) | (contents & ~mask),
11715 fixP->fx_frag->fr_literal + fixP->fx_where,
11716 fixP->fx_size * 8,
11717 target_big_endian);
11718 }
11719 }
11720 }
11721 }
11722
11723 /* This code was generated using trial and error and so is
11724 fragile and not trustworthy. If you change it, you should
11725 rerun the elf-rel, elf-rel2, and empic testcases and ensure
11726 they still pass. */
11727 if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
11728 {
11729 value += fixP->fx_frag->fr_address + fixP->fx_where;
11730
11731 /* BFD's REL handling, for MIPS, is _very_ weird.
11732 This gives the right results, but it can't possibly
11733 be the way things are supposed to work. */
11734 if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11735 || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
11736 value += fixP->fx_frag->fr_address + fixP->fx_where;
11737 }
11738 }
11739 #endif
11740
11741 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc. */
11742
11743 /* We are not done if this is a composite relocation to set up gp. */
11744 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11745 && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11746 || (fixP->fx_r_type == BFD_RELOC_64
11747 && (previous_fx_r_type == BFD_RELOC_GPREL32
11748 || previous_fx_r_type == BFD_RELOC_GPREL16))
11749 || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11750 && (fixP->fx_r_type == BFD_RELOC_HI16_S
11751 || fixP->fx_r_type == BFD_RELOC_LO16))))
11752 fixP->fx_done = 1;
11753 previous_fx_r_type = fixP->fx_r_type;
11754
11755 switch (fixP->fx_r_type)
11756 {
11757 case BFD_RELOC_MIPS_JMP:
11758 case BFD_RELOC_MIPS_SHIFT5:
11759 case BFD_RELOC_MIPS_SHIFT6:
11760 case BFD_RELOC_MIPS_GOT_DISP:
11761 case BFD_RELOC_MIPS_GOT_PAGE:
11762 case BFD_RELOC_MIPS_GOT_OFST:
11763 case BFD_RELOC_MIPS_SUB:
11764 case BFD_RELOC_MIPS_INSERT_A:
11765 case BFD_RELOC_MIPS_INSERT_B:
11766 case BFD_RELOC_MIPS_DELETE:
11767 case BFD_RELOC_MIPS_HIGHEST:
11768 case BFD_RELOC_MIPS_HIGHER:
11769 case BFD_RELOC_MIPS_SCN_DISP:
11770 case BFD_RELOC_MIPS_REL16:
11771 case BFD_RELOC_MIPS_RELGOT:
11772 case BFD_RELOC_MIPS_JALR:
11773 case BFD_RELOC_HI16:
11774 case BFD_RELOC_HI16_S:
11775 case BFD_RELOC_GPREL16:
11776 case BFD_RELOC_MIPS_LITERAL:
11777 case BFD_RELOC_MIPS_CALL16:
11778 case BFD_RELOC_MIPS_GOT16:
11779 case BFD_RELOC_GPREL32:
11780 case BFD_RELOC_MIPS_GOT_HI16:
11781 case BFD_RELOC_MIPS_GOT_LO16:
11782 case BFD_RELOC_MIPS_CALL_HI16:
11783 case BFD_RELOC_MIPS_CALL_LO16:
11784 case BFD_RELOC_MIPS16_GPREL:
11785 if (fixP->fx_pcrel)
11786 as_bad_where (fixP->fx_file, fixP->fx_line,
11787 _("Invalid PC relative reloc"));
11788 /* Nothing needed to do. The value comes from the reloc entry */
11789 break;
11790
11791 case BFD_RELOC_MIPS16_JMP:
11792 /* We currently always generate a reloc against a symbol, which
11793 means that we don't want an addend even if the symbol is
11794 defined. */
11795 fixP->fx_addnumber = 0;
11796 break;
11797
11798 case BFD_RELOC_PCREL_HI16_S:
11799 /* The addend for this is tricky if it is internal, so we just
11800 do everything here rather than in bfd_install_relocation. */
11801 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11802 && !fixP->fx_done
11803 && value != 0)
11804 break;
11805 if (fixP->fx_addsy
11806 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11807 {
11808 /* For an external symbol adjust by the address to make it
11809 pcrel_offset. We use the address of the RELLO reloc
11810 which follows this one. */
11811 value += (fixP->fx_next->fx_frag->fr_address
11812 + fixP->fx_next->fx_where);
11813 }
11814 value = ((value + 0x8000) >> 16) & 0xffff;
11815 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11816 if (target_big_endian)
11817 buf += 2;
11818 md_number_to_chars ((char *) buf, value, 2);
11819 break;
11820
11821 case BFD_RELOC_PCREL_LO16:
11822 /* The addend for this is tricky if it is internal, so we just
11823 do everything here rather than in bfd_install_relocation. */
11824 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11825 && !fixP->fx_done
11826 && value != 0)
11827 break;
11828 if (fixP->fx_addsy
11829 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11830 value += fixP->fx_frag->fr_address + fixP->fx_where;
11831 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11832 if (target_big_endian)
11833 buf += 2;
11834 md_number_to_chars ((char *) buf, value, 2);
11835 break;
11836
11837 case BFD_RELOC_64:
11838 /* This is handled like BFD_RELOC_32, but we output a sign
11839 extended value if we are only 32 bits. */
11840 if (fixP->fx_done
11841 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11842 {
11843 if (8 <= sizeof (valueT))
11844 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11845 value, 8);
11846 else
11847 {
11848 long w1, w2;
11849 long hiv;
11850
11851 w1 = w2 = fixP->fx_where;
11852 if (target_big_endian)
11853 w1 += 4;
11854 else
11855 w2 += 4;
11856 md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
11857 if ((value & 0x80000000) != 0)
11858 hiv = 0xffffffff;
11859 else
11860 hiv = 0;
11861 md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
11862 }
11863 }
11864 break;
11865
11866 case BFD_RELOC_RVA:
11867 case BFD_RELOC_32:
11868 /* If we are deleting this reloc entry, we must fill in the
11869 value now. This can happen if we have a .word which is not
11870 resolved when it appears but is later defined. We also need
11871 to fill in the value if this is an embedded PIC switch table
11872 entry. */
11873 if (fixP->fx_done
11874 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11875 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11876 value, 4);
11877 break;
11878
11879 case BFD_RELOC_16:
11880 /* If we are deleting this reloc entry, we must fill in the
11881 value now. */
11882 assert (fixP->fx_size == 2);
11883 if (fixP->fx_done)
11884 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11885 value, 2);
11886 break;
11887
11888 case BFD_RELOC_LO16:
11889 /* When handling an embedded PIC switch statement, we can wind
11890 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11891 if (fixP->fx_done)
11892 {
11893 if (value + 0x8000 > 0xffff)
11894 as_bad_where (fixP->fx_file, fixP->fx_line,
11895 _("relocation overflow"));
11896 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11897 if (target_big_endian)
11898 buf += 2;
11899 md_number_to_chars ((char *) buf, value, 2);
11900 }
11901 break;
11902
11903 case BFD_RELOC_16_PCREL_S2:
11904 if ((value & 0x3) != 0)
11905 as_bad_where (fixP->fx_file, fixP->fx_line,
11906 _("Branch to odd address (%lx)"), (long) value);
11907
11908 /*
11909 * We need to save the bits in the instruction since fixup_segment()
11910 * might be deleting the relocation entry (i.e., a branch within
11911 * the current segment).
11912 */
11913 if (!fixP->fx_done && (value != 0 || HAVE_NEWABI))
11914 break;
11915 /* If 'value' is zero, the remaining reloc code won't actually
11916 do the store, so it must be done here. This is probably
11917 a bug somewhere. */
11918 if (!fixP->fx_done
11919 && (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11920 || fixP->fx_addsy == NULL /* ??? */
11921 || ! S_IS_DEFINED (fixP->fx_addsy)))
11922 value -= fixP->fx_frag->fr_address + fixP->fx_where;
11923
11924 value = (offsetT) value >> 2;
11925
11926 /* update old instruction data */
11927 buf = (bfd_byte *) (fixP->fx_where + fixP->fx_frag->fr_literal);
11928 if (target_big_endian)
11929 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11930 else
11931 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11932
11933 if (value + 0x8000 <= 0xffff)
11934 insn |= value & 0xffff;
11935 else
11936 {
11937 /* The branch offset is too large. If this is an
11938 unconditional branch, and we are not generating PIC code,
11939 we can convert it to an absolute jump instruction. */
11940 if (mips_pic == NO_PIC
11941 && fixP->fx_done
11942 && fixP->fx_frag->fr_address >= text_section->vma
11943 && (fixP->fx_frag->fr_address
11944 < text_section->vma + text_section->_raw_size)
11945 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
11946 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
11947 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11948 {
11949 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
11950 insn = 0x0c000000; /* jal */
11951 else
11952 insn = 0x08000000; /* j */
11953 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11954 fixP->fx_done = 0;
11955 fixP->fx_addsy = section_symbol (text_section);
11956 fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
11957 }
11958 else
11959 {
11960 /* If we got here, we have branch-relaxation disabled,
11961 and there's nothing we can do to fix this instruction
11962 without turning it into a longer sequence. */
11963 as_bad_where (fixP->fx_file, fixP->fx_line,
11964 _("Branch out of range"));
11965 }
11966 }
11967
11968 md_number_to_chars ((char *) buf, (valueT) insn, 4);
11969 break;
11970
11971 case BFD_RELOC_VTABLE_INHERIT:
11972 fixP->fx_done = 0;
11973 if (fixP->fx_addsy
11974 && !S_IS_DEFINED (fixP->fx_addsy)
11975 && !S_IS_WEAK (fixP->fx_addsy))
11976 S_SET_WEAK (fixP->fx_addsy);
11977 break;
11978
11979 case BFD_RELOC_VTABLE_ENTRY:
11980 fixP->fx_done = 0;
11981 break;
11982
11983 default:
11984 internalError ();
11985 }
11986 }
11987
11988 #if 0
11989 void
11990 printInsn (oc)
11991 unsigned long oc;
11992 {
11993 const struct mips_opcode *p;
11994 int treg, sreg, dreg, shamt;
11995 short imm;
11996 const char *args;
11997 int i;
11998
11999 for (i = 0; i < NUMOPCODES; ++i)
12000 {
12001 p = &mips_opcodes[i];
12002 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
12003 {
12004 printf ("%08lx %s\t", oc, p->name);
12005 treg = (oc >> 16) & 0x1f;
12006 sreg = (oc >> 21) & 0x1f;
12007 dreg = (oc >> 11) & 0x1f;
12008 shamt = (oc >> 6) & 0x1f;
12009 imm = oc;
12010 for (args = p->args;; ++args)
12011 {
12012 switch (*args)
12013 {
12014 case '\0':
12015 printf ("\n");
12016 break;
12017
12018 case ',':
12019 case '(':
12020 case ')':
12021 printf ("%c", *args);
12022 continue;
12023
12024 case 'r':
12025 assert (treg == sreg);
12026 printf ("$%d,$%d", treg, sreg);
12027 continue;
12028
12029 case 'd':
12030 case 'G':
12031 printf ("$%d", dreg);
12032 continue;
12033
12034 case 't':
12035 case 'E':
12036 printf ("$%d", treg);
12037 continue;
12038
12039 case 'k':
12040 printf ("0x%x", treg);
12041 continue;
12042
12043 case 'b':
12044 case 's':
12045 printf ("$%d", sreg);
12046 continue;
12047
12048 case 'a':
12049 printf ("0x%08lx", oc & 0x1ffffff);
12050 continue;
12051
12052 case 'i':
12053 case 'j':
12054 case 'o':
12055 case 'u':
12056 printf ("%d", imm);
12057 continue;
12058
12059 case '<':
12060 case '>':
12061 printf ("$%d", shamt);
12062 continue;
12063
12064 default:
12065 internalError ();
12066 }
12067 break;
12068 }
12069 return;
12070 }
12071 }
12072 printf (_("%08lx UNDEFINED\n"), oc);
12073 }
12074 #endif
12075
12076 static symbolS *
12077 get_symbol ()
12078 {
12079 int c;
12080 char *name;
12081 symbolS *p;
12082
12083 name = input_line_pointer;
12084 c = get_symbol_end ();
12085 p = (symbolS *) symbol_find_or_make (name);
12086 *input_line_pointer = c;
12087 return p;
12088 }
12089
12090 /* Align the current frag to a given power of two. The MIPS assembler
12091 also automatically adjusts any preceding label. */
12092
12093 static void
12094 mips_align (to, fill, label)
12095 int to;
12096 int fill;
12097 symbolS *label;
12098 {
12099 mips_emit_delays (FALSE);
12100 frag_align (to, fill, 0);
12101 record_alignment (now_seg, to);
12102 if (label != NULL)
12103 {
12104 assert (S_GET_SEGMENT (label) == now_seg);
12105 symbol_set_frag (label, frag_now);
12106 S_SET_VALUE (label, (valueT) frag_now_fix ());
12107 }
12108 }
12109
12110 /* Align to a given power of two. .align 0 turns off the automatic
12111 alignment used by the data creating pseudo-ops. */
12112
12113 static void
12114 s_align (x)
12115 int x ATTRIBUTE_UNUSED;
12116 {
12117 register int temp;
12118 register long temp_fill;
12119 long max_alignment = 15;
12120
12121 /*
12122
12123 o Note that the assembler pulls down any immediately preceeding label
12124 to the aligned address.
12125 o It's not documented but auto alignment is reinstated by
12126 a .align pseudo instruction.
12127 o Note also that after auto alignment is turned off the mips assembler
12128 issues an error on attempt to assemble an improperly aligned data item.
12129 We don't.
12130
12131 */
12132
12133 temp = get_absolute_expression ();
12134 if (temp > max_alignment)
12135 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12136 else if (temp < 0)
12137 {
12138 as_warn (_("Alignment negative: 0 assumed."));
12139 temp = 0;
12140 }
12141 if (*input_line_pointer == ',')
12142 {
12143 ++input_line_pointer;
12144 temp_fill = get_absolute_expression ();
12145 }
12146 else
12147 temp_fill = 0;
12148 if (temp)
12149 {
12150 auto_align = 1;
12151 mips_align (temp, (int) temp_fill,
12152 insn_labels != NULL ? insn_labels->label : NULL);
12153 }
12154 else
12155 {
12156 auto_align = 0;
12157 }
12158
12159 demand_empty_rest_of_line ();
12160 }
12161
12162 void
12163 mips_flush_pending_output ()
12164 {
12165 mips_emit_delays (FALSE);
12166 mips_clear_insn_labels ();
12167 }
12168
12169 static void
12170 s_change_sec (sec)
12171 int sec;
12172 {
12173 segT seg;
12174
12175 /* When generating embedded PIC code, we only use the .text, .lit8,
12176 .sdata and .sbss sections. We change the .data and .rdata
12177 pseudo-ops to use .sdata. */
12178 if (mips_pic == EMBEDDED_PIC
12179 && (sec == 'd' || sec == 'r'))
12180 sec = 's';
12181
12182 #ifdef OBJ_ELF
12183 /* The ELF backend needs to know that we are changing sections, so
12184 that .previous works correctly. We could do something like check
12185 for an obj_section_change_hook macro, but that might be confusing
12186 as it would not be appropriate to use it in the section changing
12187 functions in read.c, since obj-elf.c intercepts those. FIXME:
12188 This should be cleaner, somehow. */
12189 obj_elf_section_change_hook ();
12190 #endif
12191
12192 mips_emit_delays (FALSE);
12193 switch (sec)
12194 {
12195 case 't':
12196 s_text (0);
12197 break;
12198 case 'd':
12199 s_data (0);
12200 break;
12201 case 'b':
12202 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12203 demand_empty_rest_of_line ();
12204 break;
12205
12206 case 'r':
12207 if (USE_GLOBAL_POINTER_OPT)
12208 {
12209 seg = subseg_new (RDATA_SECTION_NAME,
12210 (subsegT) get_absolute_expression ());
12211 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12212 {
12213 bfd_set_section_flags (stdoutput, seg,
12214 (SEC_ALLOC
12215 | SEC_LOAD
12216 | SEC_READONLY
12217 | SEC_RELOC
12218 | SEC_DATA));
12219 if (strcmp (TARGET_OS, "elf") != 0)
12220 record_alignment (seg, 4);
12221 }
12222 demand_empty_rest_of_line ();
12223 }
12224 else
12225 {
12226 as_bad (_("No read only data section in this object file format"));
12227 demand_empty_rest_of_line ();
12228 return;
12229 }
12230 break;
12231
12232 case 's':
12233 if (USE_GLOBAL_POINTER_OPT)
12234 {
12235 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12236 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12237 {
12238 bfd_set_section_flags (stdoutput, seg,
12239 SEC_ALLOC | SEC_LOAD | SEC_RELOC
12240 | SEC_DATA);
12241 if (strcmp (TARGET_OS, "elf") != 0)
12242 record_alignment (seg, 4);
12243 }
12244 demand_empty_rest_of_line ();
12245 break;
12246 }
12247 else
12248 {
12249 as_bad (_("Global pointers not supported; recompile -G 0"));
12250 demand_empty_rest_of_line ();
12251 return;
12252 }
12253 }
12254
12255 auto_align = 1;
12256 }
12257
12258 void
12259 s_change_section (ignore)
12260 int ignore ATTRIBUTE_UNUSED;
12261 {
12262 #ifdef OBJ_ELF
12263 char *section_name;
12264 char c;
12265 char next_c = 0;
12266 int section_type;
12267 int section_flag;
12268 int section_entry_size;
12269 int section_alignment;
12270
12271 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
12272 return;
12273
12274 section_name = input_line_pointer;
12275 c = get_symbol_end ();
12276 if (c)
12277 next_c = *(input_line_pointer + 1);
12278
12279 /* Do we have .section Name<,"flags">? */
12280 if (c != ',' || (c == ',' && next_c == '"'))
12281 {
12282 /* just after name is now '\0'. */
12283 *input_line_pointer = c;
12284 input_line_pointer = section_name;
12285 obj_elf_section (ignore);
12286 return;
12287 }
12288 input_line_pointer++;
12289
12290 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12291 if (c == ',')
12292 section_type = get_absolute_expression ();
12293 else
12294 section_type = 0;
12295 if (*input_line_pointer++ == ',')
12296 section_flag = get_absolute_expression ();
12297 else
12298 section_flag = 0;
12299 if (*input_line_pointer++ == ',')
12300 section_entry_size = get_absolute_expression ();
12301 else
12302 section_entry_size = 0;
12303 if (*input_line_pointer++ == ',')
12304 section_alignment = get_absolute_expression ();
12305 else
12306 section_alignment = 0;
12307
12308 section_name = xstrdup (section_name);
12309
12310 obj_elf_change_section (section_name, section_type, section_flag,
12311 section_entry_size, 0, 0, 0);
12312
12313 if (now_seg->name != section_name)
12314 free (section_name);
12315 #endif /* OBJ_ELF */
12316 }
12317
12318 void
12319 mips_enable_auto_align ()
12320 {
12321 auto_align = 1;
12322 }
12323
12324 static void
12325 s_cons (log_size)
12326 int log_size;
12327 {
12328 symbolS *label;
12329
12330 label = insn_labels != NULL ? insn_labels->label : NULL;
12331 mips_emit_delays (FALSE);
12332 if (log_size > 0 && auto_align)
12333 mips_align (log_size, 0, label);
12334 mips_clear_insn_labels ();
12335 cons (1 << log_size);
12336 }
12337
12338 static void
12339 s_float_cons (type)
12340 int type;
12341 {
12342 symbolS *label;
12343
12344 label = insn_labels != NULL ? insn_labels->label : NULL;
12345
12346 mips_emit_delays (FALSE);
12347
12348 if (auto_align)
12349 {
12350 if (type == 'd')
12351 mips_align (3, 0, label);
12352 else
12353 mips_align (2, 0, label);
12354 }
12355
12356 mips_clear_insn_labels ();
12357
12358 float_cons (type);
12359 }
12360
12361 /* Handle .globl. We need to override it because on Irix 5 you are
12362 permitted to say
12363 .globl foo .text
12364 where foo is an undefined symbol, to mean that foo should be
12365 considered to be the address of a function. */
12366
12367 static void
12368 s_mips_globl (x)
12369 int x ATTRIBUTE_UNUSED;
12370 {
12371 char *name;
12372 int c;
12373 symbolS *symbolP;
12374 flagword flag;
12375
12376 name = input_line_pointer;
12377 c = get_symbol_end ();
12378 symbolP = symbol_find_or_make (name);
12379 *input_line_pointer = c;
12380 SKIP_WHITESPACE ();
12381
12382 /* On Irix 5, every global symbol that is not explicitly labelled as
12383 being a function is apparently labelled as being an object. */
12384 flag = BSF_OBJECT;
12385
12386 if (! is_end_of_line[(unsigned char) *input_line_pointer])
12387 {
12388 char *secname;
12389 asection *sec;
12390
12391 secname = input_line_pointer;
12392 c = get_symbol_end ();
12393 sec = bfd_get_section_by_name (stdoutput, secname);
12394 if (sec == NULL)
12395 as_bad (_("%s: no such section"), secname);
12396 *input_line_pointer = c;
12397
12398 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12399 flag = BSF_FUNCTION;
12400 }
12401
12402 symbol_get_bfdsym (symbolP)->flags |= flag;
12403
12404 S_SET_EXTERNAL (symbolP);
12405 demand_empty_rest_of_line ();
12406 }
12407
12408 static void
12409 s_option (x)
12410 int x ATTRIBUTE_UNUSED;
12411 {
12412 char *opt;
12413 char c;
12414
12415 opt = input_line_pointer;
12416 c = get_symbol_end ();
12417
12418 if (*opt == 'O')
12419 {
12420 /* FIXME: What does this mean? */
12421 }
12422 else if (strncmp (opt, "pic", 3) == 0)
12423 {
12424 int i;
12425
12426 i = atoi (opt + 3);
12427 if (i == 0)
12428 mips_pic = NO_PIC;
12429 else if (i == 2)
12430 mips_pic = SVR4_PIC;
12431 else
12432 as_bad (_(".option pic%d not supported"), i);
12433
12434 if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
12435 {
12436 if (g_switch_seen && g_switch_value != 0)
12437 as_warn (_("-G may not be used with SVR4 PIC code"));
12438 g_switch_value = 0;
12439 bfd_set_gp_size (stdoutput, 0);
12440 }
12441 }
12442 else
12443 as_warn (_("Unrecognized option \"%s\""), opt);
12444
12445 *input_line_pointer = c;
12446 demand_empty_rest_of_line ();
12447 }
12448
12449 /* This structure is used to hold a stack of .set values. */
12450
12451 struct mips_option_stack
12452 {
12453 struct mips_option_stack *next;
12454 struct mips_set_options options;
12455 };
12456
12457 static struct mips_option_stack *mips_opts_stack;
12458
12459 /* Handle the .set pseudo-op. */
12460
12461 static void
12462 s_mipsset (x)
12463 int x ATTRIBUTE_UNUSED;
12464 {
12465 char *name = input_line_pointer, ch;
12466
12467 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12468 ++input_line_pointer;
12469 ch = *input_line_pointer;
12470 *input_line_pointer = '\0';
12471
12472 if (strcmp (name, "reorder") == 0)
12473 {
12474 if (mips_opts.noreorder && prev_nop_frag != NULL)
12475 {
12476 /* If we still have pending nops, we can discard them. The
12477 usual nop handling will insert any that are still
12478 needed. */
12479 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12480 * (mips_opts.mips16 ? 2 : 4));
12481 prev_nop_frag = NULL;
12482 }
12483 mips_opts.noreorder = 0;
12484 }
12485 else if (strcmp (name, "noreorder") == 0)
12486 {
12487 mips_emit_delays (TRUE);
12488 mips_opts.noreorder = 1;
12489 mips_any_noreorder = 1;
12490 }
12491 else if (strcmp (name, "at") == 0)
12492 {
12493 mips_opts.noat = 0;
12494 }
12495 else if (strcmp (name, "noat") == 0)
12496 {
12497 mips_opts.noat = 1;
12498 }
12499 else if (strcmp (name, "macro") == 0)
12500 {
12501 mips_opts.warn_about_macros = 0;
12502 }
12503 else if (strcmp (name, "nomacro") == 0)
12504 {
12505 if (mips_opts.noreorder == 0)
12506 as_bad (_("`noreorder' must be set before `nomacro'"));
12507 mips_opts.warn_about_macros = 1;
12508 }
12509 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12510 {
12511 mips_opts.nomove = 0;
12512 }
12513 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12514 {
12515 mips_opts.nomove = 1;
12516 }
12517 else if (strcmp (name, "bopt") == 0)
12518 {
12519 mips_opts.nobopt = 0;
12520 }
12521 else if (strcmp (name, "nobopt") == 0)
12522 {
12523 mips_opts.nobopt = 1;
12524 }
12525 else if (strcmp (name, "mips16") == 0
12526 || strcmp (name, "MIPS-16") == 0)
12527 mips_opts.mips16 = 1;
12528 else if (strcmp (name, "nomips16") == 0
12529 || strcmp (name, "noMIPS-16") == 0)
12530 mips_opts.mips16 = 0;
12531 else if (strcmp (name, "mips3d") == 0)
12532 mips_opts.ase_mips3d = 1;
12533 else if (strcmp (name, "nomips3d") == 0)
12534 mips_opts.ase_mips3d = 0;
12535 else if (strcmp (name, "mdmx") == 0)
12536 mips_opts.ase_mdmx = 1;
12537 else if (strcmp (name, "nomdmx") == 0)
12538 mips_opts.ase_mdmx = 0;
12539 else if (strncmp (name, "mips", 4) == 0)
12540 {
12541 int reset = 0;
12542
12543 /* Permit the user to change the ISA on the fly. Needless to
12544 say, misuse can cause serious problems. */
12545 if (strcmp (name, "mips0") == 0)
12546 {
12547 reset = 1;
12548 mips_opts.isa = file_mips_isa;
12549 }
12550 else if (strcmp (name, "mips1") == 0)
12551 mips_opts.isa = ISA_MIPS1;
12552 else if (strcmp (name, "mips2") == 0)
12553 mips_opts.isa = ISA_MIPS2;
12554 else if (strcmp (name, "mips3") == 0)
12555 mips_opts.isa = ISA_MIPS3;
12556 else if (strcmp (name, "mips4") == 0)
12557 mips_opts.isa = ISA_MIPS4;
12558 else if (strcmp (name, "mips5") == 0)
12559 mips_opts.isa = ISA_MIPS5;
12560 else if (strcmp (name, "mips32") == 0)
12561 mips_opts.isa = ISA_MIPS32;
12562 else if (strcmp (name, "mips32r2") == 0)
12563 mips_opts.isa = ISA_MIPS32R2;
12564 else if (strcmp (name, "mips64") == 0)
12565 mips_opts.isa = ISA_MIPS64;
12566 else
12567 as_bad (_("unknown ISA level %s"), name + 4);
12568
12569 switch (mips_opts.isa)
12570 {
12571 case 0:
12572 break;
12573 case ISA_MIPS1:
12574 case ISA_MIPS2:
12575 case ISA_MIPS32:
12576 case ISA_MIPS32R2:
12577 mips_opts.gp32 = 1;
12578 mips_opts.fp32 = 1;
12579 break;
12580 case ISA_MIPS3:
12581 case ISA_MIPS4:
12582 case ISA_MIPS5:
12583 case ISA_MIPS64:
12584 mips_opts.gp32 = 0;
12585 mips_opts.fp32 = 0;
12586 break;
12587 default:
12588 as_bad (_("unknown ISA level %s"), name + 4);
12589 break;
12590 }
12591 if (reset)
12592 {
12593 mips_opts.gp32 = file_mips_gp32;
12594 mips_opts.fp32 = file_mips_fp32;
12595 }
12596 }
12597 else if (strcmp (name, "autoextend") == 0)
12598 mips_opts.noautoextend = 0;
12599 else if (strcmp (name, "noautoextend") == 0)
12600 mips_opts.noautoextend = 1;
12601 else if (strcmp (name, "push") == 0)
12602 {
12603 struct mips_option_stack *s;
12604
12605 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12606 s->next = mips_opts_stack;
12607 s->options = mips_opts;
12608 mips_opts_stack = s;
12609 }
12610 else if (strcmp (name, "pop") == 0)
12611 {
12612 struct mips_option_stack *s;
12613
12614 s = mips_opts_stack;
12615 if (s == NULL)
12616 as_bad (_(".set pop with no .set push"));
12617 else
12618 {
12619 /* If we're changing the reorder mode we need to handle
12620 delay slots correctly. */
12621 if (s->options.noreorder && ! mips_opts.noreorder)
12622 mips_emit_delays (TRUE);
12623 else if (! s->options.noreorder && mips_opts.noreorder)
12624 {
12625 if (prev_nop_frag != NULL)
12626 {
12627 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12628 * (mips_opts.mips16 ? 2 : 4));
12629 prev_nop_frag = NULL;
12630 }
12631 }
12632
12633 mips_opts = s->options;
12634 mips_opts_stack = s->next;
12635 free (s);
12636 }
12637 }
12638 else
12639 {
12640 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12641 }
12642 *input_line_pointer = ch;
12643 demand_empty_rest_of_line ();
12644 }
12645
12646 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12647 .option pic2. It means to generate SVR4 PIC calls. */
12648
12649 static void
12650 s_abicalls (ignore)
12651 int ignore ATTRIBUTE_UNUSED;
12652 {
12653 mips_pic = SVR4_PIC;
12654 if (USE_GLOBAL_POINTER_OPT)
12655 {
12656 if (g_switch_seen && g_switch_value != 0)
12657 as_warn (_("-G may not be used with SVR4 PIC code"));
12658 g_switch_value = 0;
12659 }
12660 bfd_set_gp_size (stdoutput, 0);
12661 demand_empty_rest_of_line ();
12662 }
12663
12664 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12665 PIC code. It sets the $gp register for the function based on the
12666 function address, which is in the register named in the argument.
12667 This uses a relocation against _gp_disp, which is handled specially
12668 by the linker. The result is:
12669 lui $gp,%hi(_gp_disp)
12670 addiu $gp,$gp,%lo(_gp_disp)
12671 addu $gp,$gp,.cpload argument
12672 The .cpload argument is normally $25 == $t9. */
12673
12674 static void
12675 s_cpload (ignore)
12676 int ignore ATTRIBUTE_UNUSED;
12677 {
12678 expressionS ex;
12679 int icnt = 0;
12680
12681 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12682 .cpload is ignored. */
12683 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12684 {
12685 s_ignore (0);
12686 return;
12687 }
12688
12689 /* .cpload should be in a .set noreorder section. */
12690 if (mips_opts.noreorder == 0)
12691 as_warn (_(".cpload not in noreorder section"));
12692
12693 ex.X_op = O_symbol;
12694 ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12695 ex.X_op_symbol = NULL;
12696 ex.X_add_number = 0;
12697
12698 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12699 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12700
12701 macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
12702 macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
12703 mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
12704
12705 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
12706 mips_gp_register, mips_gp_register, tc_get_register (0));
12707
12708 demand_empty_rest_of_line ();
12709 }
12710
12711 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12712 .cpsetup $reg1, offset|$reg2, label
12713
12714 If offset is given, this results in:
12715 sd $gp, offset($sp)
12716 lui $gp, %hi(%neg(%gp_rel(label)))
12717 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12718 daddu $gp, $gp, $reg1
12719
12720 If $reg2 is given, this results in:
12721 daddu $reg2, $gp, $0
12722 lui $gp, %hi(%neg(%gp_rel(label)))
12723 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12724 daddu $gp, $gp, $reg1
12725 $reg1 is normally $25 == $t9. */
12726 static void
12727 s_cpsetup (ignore)
12728 int ignore ATTRIBUTE_UNUSED;
12729 {
12730 expressionS ex_off;
12731 expressionS ex_sym;
12732 int reg1;
12733 int icnt = 0;
12734 char *f;
12735
12736 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12737 We also need NewABI support. */
12738 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12739 {
12740 s_ignore (0);
12741 return;
12742 }
12743
12744 reg1 = tc_get_register (0);
12745 SKIP_WHITESPACE ();
12746 if (*input_line_pointer != ',')
12747 {
12748 as_bad (_("missing argument separator ',' for .cpsetup"));
12749 return;
12750 }
12751 else
12752 ++input_line_pointer;
12753 SKIP_WHITESPACE ();
12754 if (*input_line_pointer == '$')
12755 {
12756 mips_cpreturn_register = tc_get_register (0);
12757 mips_cpreturn_offset = -1;
12758 }
12759 else
12760 {
12761 mips_cpreturn_offset = get_absolute_expression ();
12762 mips_cpreturn_register = -1;
12763 }
12764 SKIP_WHITESPACE ();
12765 if (*input_line_pointer != ',')
12766 {
12767 as_bad (_("missing argument separator ',' for .cpsetup"));
12768 return;
12769 }
12770 else
12771 ++input_line_pointer;
12772 SKIP_WHITESPACE ();
12773 expression (&ex_sym);
12774
12775 if (mips_cpreturn_register == -1)
12776 {
12777 ex_off.X_op = O_constant;
12778 ex_off.X_add_symbol = NULL;
12779 ex_off.X_op_symbol = NULL;
12780 ex_off.X_add_number = mips_cpreturn_offset;
12781
12782 macro_build ((char *) NULL, &icnt, &ex_off, "sd", "t,o(b)",
12783 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12784 }
12785 else
12786 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12787 "d,v,t", mips_cpreturn_register, mips_gp_register, 0);
12788
12789 /* Ensure there's room for the next two instructions, so that `f'
12790 doesn't end up with an address in the wrong frag. */
12791 frag_grow (8);
12792 f = frag_more (0);
12793 macro_build ((char *) NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
12794 (int) BFD_RELOC_GPREL16);
12795 fix_new (frag_now, f - frag_now->fr_literal,
12796 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12797 fix_new (frag_now, f - frag_now->fr_literal,
12798 0, NULL, 0, 0, BFD_RELOC_HI16_S);
12799
12800 f = frag_more (0);
12801 macro_build ((char *) NULL, &icnt, &ex_sym, "addiu", "t,r,j",
12802 mips_gp_register, mips_gp_register, (int) BFD_RELOC_GPREL16);
12803 fix_new (frag_now, f - frag_now->fr_literal,
12804 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12805 fix_new (frag_now, f - frag_now->fr_literal,
12806 0, NULL, 0, 0, BFD_RELOC_LO16);
12807
12808 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
12809 HAVE_64BIT_ADDRESSES ? "daddu" : "add", "d,v,t",
12810 mips_gp_register, mips_gp_register, reg1);
12811
12812 demand_empty_rest_of_line ();
12813 }
12814
12815 static void
12816 s_cplocal (ignore)
12817 int ignore ATTRIBUTE_UNUSED;
12818 {
12819 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12820 .cplocal is ignored. */
12821 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12822 {
12823 s_ignore (0);
12824 return;
12825 }
12826
12827 mips_gp_register = tc_get_register (0);
12828 demand_empty_rest_of_line ();
12829 }
12830
12831 /* Handle the .cprestore pseudo-op. This stores $gp into a given
12832 offset from $sp. The offset is remembered, and after making a PIC
12833 call $gp is restored from that location. */
12834
12835 static void
12836 s_cprestore (ignore)
12837 int ignore ATTRIBUTE_UNUSED;
12838 {
12839 expressionS ex;
12840 int icnt = 0;
12841
12842 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12843 .cprestore is ignored. */
12844 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12845 {
12846 s_ignore (0);
12847 return;
12848 }
12849
12850 mips_cprestore_offset = get_absolute_expression ();
12851 mips_cprestore_valid = 1;
12852
12853 ex.X_op = O_constant;
12854 ex.X_add_symbol = NULL;
12855 ex.X_op_symbol = NULL;
12856 ex.X_add_number = mips_cprestore_offset;
12857
12858 macro_build_ldst_constoffset ((char *) NULL, &icnt, &ex,
12859 HAVE_32BIT_ADDRESSES ? "sw" : "sd",
12860 mips_gp_register, SP);
12861
12862 demand_empty_rest_of_line ();
12863 }
12864
12865 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12866 was given in the preceeding .gpsetup, it results in:
12867 ld $gp, offset($sp)
12868
12869 If a register $reg2 was given there, it results in:
12870 daddiu $gp, $gp, $reg2
12871 */
12872 static void
12873 s_cpreturn (ignore)
12874 int ignore ATTRIBUTE_UNUSED;
12875 {
12876 expressionS ex;
12877 int icnt = 0;
12878
12879 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12880 We also need NewABI support. */
12881 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12882 {
12883 s_ignore (0);
12884 return;
12885 }
12886
12887 if (mips_cpreturn_register == -1)
12888 {
12889 ex.X_op = O_constant;
12890 ex.X_add_symbol = NULL;
12891 ex.X_op_symbol = NULL;
12892 ex.X_add_number = mips_cpreturn_offset;
12893
12894 macro_build ((char *) NULL, &icnt, &ex, "ld", "t,o(b)",
12895 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12896 }
12897 else
12898 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12899 "d,v,t", mips_gp_register, mips_cpreturn_register, 0);
12900
12901 demand_empty_rest_of_line ();
12902 }
12903
12904 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12905 code. It sets the offset to use in gp_rel relocations. */
12906
12907 static void
12908 s_gpvalue (ignore)
12909 int ignore ATTRIBUTE_UNUSED;
12910 {
12911 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12912 We also need NewABI support. */
12913 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12914 {
12915 s_ignore (0);
12916 return;
12917 }
12918
12919 mips_gprel_offset = get_absolute_expression ();
12920
12921 demand_empty_rest_of_line ();
12922 }
12923
12924 /* Handle the .gpword pseudo-op. This is used when generating PIC
12925 code. It generates a 32 bit GP relative reloc. */
12926
12927 static void
12928 s_gpword (ignore)
12929 int ignore ATTRIBUTE_UNUSED;
12930 {
12931 symbolS *label;
12932 expressionS ex;
12933 char *p;
12934
12935 /* When not generating PIC code, this is treated as .word. */
12936 if (mips_pic != SVR4_PIC)
12937 {
12938 s_cons (2);
12939 return;
12940 }
12941
12942 label = insn_labels != NULL ? insn_labels->label : NULL;
12943 mips_emit_delays (TRUE);
12944 if (auto_align)
12945 mips_align (2, 0, label);
12946 mips_clear_insn_labels ();
12947
12948 expression (&ex);
12949
12950 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12951 {
12952 as_bad (_("Unsupported use of .gpword"));
12953 ignore_rest_of_line ();
12954 }
12955
12956 p = frag_more (4);
12957 md_number_to_chars (p, (valueT) 0, 4);
12958 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12959 BFD_RELOC_GPREL32);
12960
12961 demand_empty_rest_of_line ();
12962 }
12963
12964 static void
12965 s_gpdword (ignore)
12966 int ignore ATTRIBUTE_UNUSED;
12967 {
12968 symbolS *label;
12969 expressionS ex;
12970 char *p;
12971
12972 /* When not generating PIC code, this is treated as .dword. */
12973 if (mips_pic != SVR4_PIC)
12974 {
12975 s_cons (3);
12976 return;
12977 }
12978
12979 label = insn_labels != NULL ? insn_labels->label : NULL;
12980 mips_emit_delays (TRUE);
12981 if (auto_align)
12982 mips_align (3, 0, label);
12983 mips_clear_insn_labels ();
12984
12985 expression (&ex);
12986
12987 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12988 {
12989 as_bad (_("Unsupported use of .gpdword"));
12990 ignore_rest_of_line ();
12991 }
12992
12993 p = frag_more (8);
12994 md_number_to_chars (p, (valueT) 0, 8);
12995 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12996 BFD_RELOC_GPREL32);
12997
12998 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
12999 ex.X_op = O_absent;
13000 ex.X_add_symbol = 0;
13001 ex.X_add_number = 0;
13002 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
13003 BFD_RELOC_64);
13004
13005 demand_empty_rest_of_line ();
13006 }
13007
13008 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13009 tables in SVR4 PIC code. */
13010
13011 static void
13012 s_cpadd (ignore)
13013 int ignore ATTRIBUTE_UNUSED;
13014 {
13015 int icnt = 0;
13016 int reg;
13017
13018 /* This is ignored when not generating SVR4 PIC code. */
13019 if (mips_pic != SVR4_PIC)
13020 {
13021 s_ignore (0);
13022 return;
13023 }
13024
13025 /* Add $gp to the register named as an argument. */
13026 reg = tc_get_register (0);
13027 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
13028 HAVE_32BIT_ADDRESSES ? HAVE_NEWABI ? "add" : "addu" : "daddu",
13029 "d,v,t", reg, reg, mips_gp_register);
13030
13031 demand_empty_rest_of_line ();
13032 }
13033
13034 /* Handle the .insn pseudo-op. This marks instruction labels in
13035 mips16 mode. This permits the linker to handle them specially,
13036 such as generating jalx instructions when needed. We also make
13037 them odd for the duration of the assembly, in order to generate the
13038 right sort of code. We will make them even in the adjust_symtab
13039 routine, while leaving them marked. This is convenient for the
13040 debugger and the disassembler. The linker knows to make them odd
13041 again. */
13042
13043 static void
13044 s_insn (ignore)
13045 int ignore ATTRIBUTE_UNUSED;
13046 {
13047 mips16_mark_labels ();
13048
13049 demand_empty_rest_of_line ();
13050 }
13051
13052 /* Handle a .stabn directive. We need these in order to mark a label
13053 as being a mips16 text label correctly. Sometimes the compiler
13054 will emit a label, followed by a .stabn, and then switch sections.
13055 If the label and .stabn are in mips16 mode, then the label is
13056 really a mips16 text label. */
13057
13058 static void
13059 s_mips_stab (type)
13060 int type;
13061 {
13062 if (type == 'n')
13063 mips16_mark_labels ();
13064
13065 s_stab (type);
13066 }
13067
13068 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
13069 */
13070
13071 static void
13072 s_mips_weakext (ignore)
13073 int ignore ATTRIBUTE_UNUSED;
13074 {
13075 char *name;
13076 int c;
13077 symbolS *symbolP;
13078 expressionS exp;
13079
13080 name = input_line_pointer;
13081 c = get_symbol_end ();
13082 symbolP = symbol_find_or_make (name);
13083 S_SET_WEAK (symbolP);
13084 *input_line_pointer = c;
13085
13086 SKIP_WHITESPACE ();
13087
13088 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13089 {
13090 if (S_IS_DEFINED (symbolP))
13091 {
13092 as_bad ("ignoring attempt to redefine symbol %s",
13093 S_GET_NAME (symbolP));
13094 ignore_rest_of_line ();
13095 return;
13096 }
13097
13098 if (*input_line_pointer == ',')
13099 {
13100 ++input_line_pointer;
13101 SKIP_WHITESPACE ();
13102 }
13103
13104 expression (&exp);
13105 if (exp.X_op != O_symbol)
13106 {
13107 as_bad ("bad .weakext directive");
13108 ignore_rest_of_line ();
13109 return;
13110 }
13111 symbol_set_value_expression (symbolP, &exp);
13112 }
13113
13114 demand_empty_rest_of_line ();
13115 }
13116
13117 /* Parse a register string into a number. Called from the ECOFF code
13118 to parse .frame. The argument is non-zero if this is the frame
13119 register, so that we can record it in mips_frame_reg. */
13120
13121 int
13122 tc_get_register (frame)
13123 int frame;
13124 {
13125 int reg;
13126
13127 SKIP_WHITESPACE ();
13128 if (*input_line_pointer++ != '$')
13129 {
13130 as_warn (_("expected `$'"));
13131 reg = ZERO;
13132 }
13133 else if (ISDIGIT (*input_line_pointer))
13134 {
13135 reg = get_absolute_expression ();
13136 if (reg < 0 || reg >= 32)
13137 {
13138 as_warn (_("Bad register number"));
13139 reg = ZERO;
13140 }
13141 }
13142 else
13143 {
13144 if (strncmp (input_line_pointer, "ra", 2) == 0)
13145 {
13146 reg = RA;
13147 input_line_pointer += 2;
13148 }
13149 else if (strncmp (input_line_pointer, "fp", 2) == 0)
13150 {
13151 reg = FP;
13152 input_line_pointer += 2;
13153 }
13154 else if (strncmp (input_line_pointer, "sp", 2) == 0)
13155 {
13156 reg = SP;
13157 input_line_pointer += 2;
13158 }
13159 else if (strncmp (input_line_pointer, "gp", 2) == 0)
13160 {
13161 reg = GP;
13162 input_line_pointer += 2;
13163 }
13164 else if (strncmp (input_line_pointer, "at", 2) == 0)
13165 {
13166 reg = AT;
13167 input_line_pointer += 2;
13168 }
13169 else if (strncmp (input_line_pointer, "kt0", 3) == 0)
13170 {
13171 reg = KT0;
13172 input_line_pointer += 3;
13173 }
13174 else if (strncmp (input_line_pointer, "kt1", 3) == 0)
13175 {
13176 reg = KT1;
13177 input_line_pointer += 3;
13178 }
13179 else if (strncmp (input_line_pointer, "zero", 4) == 0)
13180 {
13181 reg = ZERO;
13182 input_line_pointer += 4;
13183 }
13184 else
13185 {
13186 as_warn (_("Unrecognized register name"));
13187 reg = ZERO;
13188 while (ISALNUM(*input_line_pointer))
13189 input_line_pointer++;
13190 }
13191 }
13192 if (frame)
13193 {
13194 mips_frame_reg = reg != 0 ? reg : SP;
13195 mips_frame_reg_valid = 1;
13196 mips_cprestore_valid = 0;
13197 }
13198 return reg;
13199 }
13200
13201 valueT
13202 md_section_align (seg, addr)
13203 asection *seg;
13204 valueT addr;
13205 {
13206 int align = bfd_get_section_alignment (stdoutput, seg);
13207
13208 #ifdef OBJ_ELF
13209 /* We don't need to align ELF sections to the full alignment.
13210 However, Irix 5 may prefer that we align them at least to a 16
13211 byte boundary. We don't bother to align the sections if we are
13212 targeted for an embedded system. */
13213 if (strcmp (TARGET_OS, "elf") == 0)
13214 return addr;
13215 if (align > 4)
13216 align = 4;
13217 #endif
13218
13219 return ((addr + (1 << align) - 1) & (-1 << align));
13220 }
13221
13222 /* Utility routine, called from above as well. If called while the
13223 input file is still being read, it's only an approximation. (For
13224 example, a symbol may later become defined which appeared to be
13225 undefined earlier.) */
13226
13227 static int
13228 nopic_need_relax (sym, before_relaxing)
13229 symbolS *sym;
13230 int before_relaxing;
13231 {
13232 if (sym == 0)
13233 return 0;
13234
13235 if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
13236 {
13237 const char *symname;
13238 int change;
13239
13240 /* Find out whether this symbol can be referenced off the $gp
13241 register. It can be if it is smaller than the -G size or if
13242 it is in the .sdata or .sbss section. Certain symbols can
13243 not be referenced off the $gp, although it appears as though
13244 they can. */
13245 symname = S_GET_NAME (sym);
13246 if (symname != (const char *) NULL
13247 && (strcmp (symname, "eprol") == 0
13248 || strcmp (symname, "etext") == 0
13249 || strcmp (symname, "_gp") == 0
13250 || strcmp (symname, "edata") == 0
13251 || strcmp (symname, "_fbss") == 0
13252 || strcmp (symname, "_fdata") == 0
13253 || strcmp (symname, "_ftext") == 0
13254 || strcmp (symname, "end") == 0
13255 || strcmp (symname, "_gp_disp") == 0))
13256 change = 1;
13257 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13258 && (0
13259 #ifndef NO_ECOFF_DEBUGGING
13260 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13261 && (symbol_get_obj (sym)->ecoff_extern_size
13262 <= g_switch_value))
13263 #endif
13264 /* We must defer this decision until after the whole
13265 file has been read, since there might be a .extern
13266 after the first use of this symbol. */
13267 || (before_relaxing
13268 #ifndef NO_ECOFF_DEBUGGING
13269 && symbol_get_obj (sym)->ecoff_extern_size == 0
13270 #endif
13271 && S_GET_VALUE (sym) == 0)
13272 || (S_GET_VALUE (sym) != 0
13273 && S_GET_VALUE (sym) <= g_switch_value)))
13274 change = 0;
13275 else
13276 {
13277 const char *segname;
13278
13279 segname = segment_name (S_GET_SEGMENT (sym));
13280 assert (strcmp (segname, ".lit8") != 0
13281 && strcmp (segname, ".lit4") != 0);
13282 change = (strcmp (segname, ".sdata") != 0
13283 && strcmp (segname, ".sbss") != 0
13284 && strncmp (segname, ".sdata.", 7) != 0
13285 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13286 }
13287 return change;
13288 }
13289 else
13290 /* We are not optimizing for the $gp register. */
13291 return 1;
13292 }
13293
13294
13295 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13296
13297 static bfd_boolean
13298 pic_need_relax (sym, segtype)
13299 symbolS *sym;
13300 asection *segtype;
13301 {
13302 asection *symsec;
13303 bfd_boolean linkonce;
13304
13305 /* Handle the case of a symbol equated to another symbol. */
13306 while (symbol_equated_reloc_p (sym))
13307 {
13308 symbolS *n;
13309
13310 /* It's possible to get a loop here in a badly written
13311 program. */
13312 n = symbol_get_value_expression (sym)->X_add_symbol;
13313 if (n == sym)
13314 break;
13315 sym = n;
13316 }
13317
13318 symsec = S_GET_SEGMENT (sym);
13319
13320 /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
13321 linkonce = FALSE;
13322 if (symsec != segtype && ! S_IS_LOCAL (sym))
13323 {
13324 if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
13325 != 0)
13326 linkonce = TRUE;
13327
13328 /* The GNU toolchain uses an extension for ELF: a section
13329 beginning with the magic string .gnu.linkonce is a linkonce
13330 section. */
13331 if (strncmp (segment_name (symsec), ".gnu.linkonce",
13332 sizeof ".gnu.linkonce" - 1) == 0)
13333 linkonce = TRUE;
13334 }
13335
13336 /* This must duplicate the test in adjust_reloc_syms. */
13337 return (symsec != &bfd_und_section
13338 && symsec != &bfd_abs_section
13339 && ! bfd_is_com_section (symsec)
13340 && !linkonce
13341 #ifdef OBJ_ELF
13342 /* A global or weak symbol is treated as external. */
13343 && (OUTPUT_FLAVOR != bfd_target_elf_flavour
13344 || (! S_IS_WEAK (sym)
13345 && (! S_IS_EXTERNAL (sym)
13346 || mips_pic == EMBEDDED_PIC)))
13347 #endif
13348 );
13349 }
13350
13351
13352 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13353 extended opcode. SEC is the section the frag is in. */
13354
13355 static int
13356 mips16_extended_frag (fragp, sec, stretch)
13357 fragS *fragp;
13358 asection *sec;
13359 long stretch;
13360 {
13361 int type;
13362 register const struct mips16_immed_operand *op;
13363 offsetT val;
13364 int mintiny, maxtiny;
13365 segT symsec;
13366 fragS *sym_frag;
13367
13368 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13369 return 0;
13370 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13371 return 1;
13372
13373 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13374 op = mips16_immed_operands;
13375 while (op->type != type)
13376 {
13377 ++op;
13378 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13379 }
13380
13381 if (op->unsp)
13382 {
13383 if (type == '<' || type == '>' || type == '[' || type == ']')
13384 {
13385 mintiny = 1;
13386 maxtiny = 1 << op->nbits;
13387 }
13388 else
13389 {
13390 mintiny = 0;
13391 maxtiny = (1 << op->nbits) - 1;
13392 }
13393 }
13394 else
13395 {
13396 mintiny = - (1 << (op->nbits - 1));
13397 maxtiny = (1 << (op->nbits - 1)) - 1;
13398 }
13399
13400 sym_frag = symbol_get_frag (fragp->fr_symbol);
13401 val = S_GET_VALUE (fragp->fr_symbol);
13402 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13403
13404 if (op->pcrel)
13405 {
13406 addressT addr;
13407
13408 /* We won't have the section when we are called from
13409 mips_relax_frag. However, we will always have been called
13410 from md_estimate_size_before_relax first. If this is a
13411 branch to a different section, we mark it as such. If SEC is
13412 NULL, and the frag is not marked, then it must be a branch to
13413 the same section. */
13414 if (sec == NULL)
13415 {
13416 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13417 return 1;
13418 }
13419 else
13420 {
13421 /* Must have been called from md_estimate_size_before_relax. */
13422 if (symsec != sec)
13423 {
13424 fragp->fr_subtype =
13425 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13426
13427 /* FIXME: We should support this, and let the linker
13428 catch branches and loads that are out of range. */
13429 as_bad_where (fragp->fr_file, fragp->fr_line,
13430 _("unsupported PC relative reference to different section"));
13431
13432 return 1;
13433 }
13434 if (fragp != sym_frag && sym_frag->fr_address == 0)
13435 /* Assume non-extended on the first relaxation pass.
13436 The address we have calculated will be bogus if this is
13437 a forward branch to another frag, as the forward frag
13438 will have fr_address == 0. */
13439 return 0;
13440 }
13441
13442 /* In this case, we know for sure that the symbol fragment is in
13443 the same section. If the relax_marker of the symbol fragment
13444 differs from the relax_marker of this fragment, we have not
13445 yet adjusted the symbol fragment fr_address. We want to add
13446 in STRETCH in order to get a better estimate of the address.
13447 This particularly matters because of the shift bits. */
13448 if (stretch != 0
13449 && sym_frag->relax_marker != fragp->relax_marker)
13450 {
13451 fragS *f;
13452
13453 /* Adjust stretch for any alignment frag. Note that if have
13454 been expanding the earlier code, the symbol may be
13455 defined in what appears to be an earlier frag. FIXME:
13456 This doesn't handle the fr_subtype field, which specifies
13457 a maximum number of bytes to skip when doing an
13458 alignment. */
13459 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13460 {
13461 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13462 {
13463 if (stretch < 0)
13464 stretch = - ((- stretch)
13465 & ~ ((1 << (int) f->fr_offset) - 1));
13466 else
13467 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13468 if (stretch == 0)
13469 break;
13470 }
13471 }
13472 if (f != NULL)
13473 val += stretch;
13474 }
13475
13476 addr = fragp->fr_address + fragp->fr_fix;
13477
13478 /* The base address rules are complicated. The base address of
13479 a branch is the following instruction. The base address of a
13480 PC relative load or add is the instruction itself, but if it
13481 is in a delay slot (in which case it can not be extended) use
13482 the address of the instruction whose delay slot it is in. */
13483 if (type == 'p' || type == 'q')
13484 {
13485 addr += 2;
13486
13487 /* If we are currently assuming that this frag should be
13488 extended, then, the current address is two bytes
13489 higher. */
13490 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13491 addr += 2;
13492
13493 /* Ignore the low bit in the target, since it will be set
13494 for a text label. */
13495 if ((val & 1) != 0)
13496 --val;
13497 }
13498 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13499 addr -= 4;
13500 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13501 addr -= 2;
13502
13503 val -= addr & ~ ((1 << op->shift) - 1);
13504
13505 /* Branch offsets have an implicit 0 in the lowest bit. */
13506 if (type == 'p' || type == 'q')
13507 val /= 2;
13508
13509 /* If any of the shifted bits are set, we must use an extended
13510 opcode. If the address depends on the size of this
13511 instruction, this can lead to a loop, so we arrange to always
13512 use an extended opcode. We only check this when we are in
13513 the main relaxation loop, when SEC is NULL. */
13514 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13515 {
13516 fragp->fr_subtype =
13517 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13518 return 1;
13519 }
13520
13521 /* If we are about to mark a frag as extended because the value
13522 is precisely maxtiny + 1, then there is a chance of an
13523 infinite loop as in the following code:
13524 la $4,foo
13525 .skip 1020
13526 .align 2
13527 foo:
13528 In this case when the la is extended, foo is 0x3fc bytes
13529 away, so the la can be shrunk, but then foo is 0x400 away, so
13530 the la must be extended. To avoid this loop, we mark the
13531 frag as extended if it was small, and is about to become
13532 extended with a value of maxtiny + 1. */
13533 if (val == ((maxtiny + 1) << op->shift)
13534 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13535 && sec == NULL)
13536 {
13537 fragp->fr_subtype =
13538 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13539 return 1;
13540 }
13541 }
13542 else if (symsec != absolute_section && sec != NULL)
13543 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13544
13545 if ((val & ((1 << op->shift) - 1)) != 0
13546 || val < (mintiny << op->shift)
13547 || val > (maxtiny << op->shift))
13548 return 1;
13549 else
13550 return 0;
13551 }
13552
13553 /* Compute the length of a branch sequence, and adjust the
13554 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13555 worst-case length is computed, with UPDATE being used to indicate
13556 whether an unconditional (-1), branch-likely (+1) or regular (0)
13557 branch is to be computed. */
13558 static int
13559 relaxed_branch_length (fragp, sec, update)
13560 fragS *fragp;
13561 asection *sec;
13562 int update;
13563 {
13564 bfd_boolean toofar;
13565 int length;
13566
13567 if (fragp
13568 && S_IS_DEFINED (fragp->fr_symbol)
13569 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13570 {
13571 addressT addr;
13572 offsetT val;
13573
13574 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13575
13576 addr = fragp->fr_address + fragp->fr_fix + 4;
13577
13578 val -= addr;
13579
13580 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13581 }
13582 else if (fragp)
13583 /* If the symbol is not defined or it's in a different segment,
13584 assume the user knows what's going on and emit a short
13585 branch. */
13586 toofar = FALSE;
13587 else
13588 toofar = TRUE;
13589
13590 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13591 fragp->fr_subtype
13592 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13593 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13594 RELAX_BRANCH_LINK (fragp->fr_subtype),
13595 toofar);
13596
13597 length = 4;
13598 if (toofar)
13599 {
13600 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13601 length += 8;
13602
13603 if (mips_pic != NO_PIC)
13604 {
13605 /* Additional space for PIC loading of target address. */
13606 length += 8;
13607 if (mips_opts.isa == ISA_MIPS1)
13608 /* Additional space for $at-stabilizing nop. */
13609 length += 4;
13610 }
13611
13612 /* If branch is conditional. */
13613 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13614 length += 8;
13615 }
13616
13617 return length;
13618 }
13619
13620 /* Estimate the size of a frag before relaxing. Unless this is the
13621 mips16, we are not really relaxing here, and the final size is
13622 encoded in the subtype information. For the mips16, we have to
13623 decide whether we are using an extended opcode or not. */
13624
13625 int
13626 md_estimate_size_before_relax (fragp, segtype)
13627 fragS *fragp;
13628 asection *segtype;
13629 {
13630 int change;
13631
13632 if (RELAX_BRANCH_P (fragp->fr_subtype))
13633 {
13634
13635 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13636
13637 return fragp->fr_var;
13638 }
13639
13640 if (RELAX_MIPS16_P (fragp->fr_subtype))
13641 /* We don't want to modify the EXTENDED bit here; it might get us
13642 into infinite loops. We change it only in mips_relax_frag(). */
13643 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13644
13645 if (mips_pic == NO_PIC)
13646 change = nopic_need_relax (fragp->fr_symbol, 0);
13647 else if (mips_pic == SVR4_PIC)
13648 change = pic_need_relax (fragp->fr_symbol, segtype);
13649 else
13650 abort ();
13651
13652 if (change)
13653 {
13654 /* Record the offset to the first reloc in the fr_opcode field.
13655 This lets md_convert_frag and tc_gen_reloc know that the code
13656 must be expanded. */
13657 fragp->fr_opcode = (fragp->fr_literal
13658 + fragp->fr_fix
13659 - RELAX_OLD (fragp->fr_subtype)
13660 + RELAX_RELOC1 (fragp->fr_subtype));
13661 /* FIXME: This really needs as_warn_where. */
13662 if (RELAX_WARN (fragp->fr_subtype))
13663 as_warn (_("AT used after \".set noat\" or macro used after "
13664 "\".set nomacro\""));
13665
13666 return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
13667 }
13668
13669 return 0;
13670 }
13671
13672 /* This is called to see whether a reloc against a defined symbol
13673 should be converted into a reloc against a section. Don't adjust
13674 MIPS16 jump relocations, so we don't have to worry about the format
13675 of the offset in the .o file. Don't adjust relocations against
13676 mips16 symbols, so that the linker can find them if it needs to set
13677 up a stub. */
13678
13679 int
13680 mips_fix_adjustable (fixp)
13681 fixS *fixp;
13682 {
13683 if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13684 return 0;
13685
13686 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13687 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13688 return 0;
13689
13690 if (fixp->fx_addsy == NULL)
13691 return 1;
13692
13693 #ifdef OBJ_ELF
13694 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13695 && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13696 && fixp->fx_subsy == NULL)
13697 return 0;
13698 #endif
13699
13700 return 1;
13701 }
13702
13703 /* Translate internal representation of relocation info to BFD target
13704 format. */
13705
13706 arelent **
13707 tc_gen_reloc (section, fixp)
13708 asection *section ATTRIBUTE_UNUSED;
13709 fixS *fixp;
13710 {
13711 static arelent *retval[4];
13712 arelent *reloc;
13713 bfd_reloc_code_real_type code;
13714
13715 reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
13716 retval[1] = NULL;
13717
13718 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13719 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13720 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13721
13722 if (mips_pic == EMBEDDED_PIC
13723 && SWITCH_TABLE (fixp))
13724 {
13725 /* For a switch table entry we use a special reloc. The addend
13726 is actually the difference between the reloc address and the
13727 subtrahend. */
13728 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13729 if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13730 as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13731 fixp->fx_r_type = BFD_RELOC_GPREL32;
13732 }
13733 else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
13734 {
13735 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13736 reloc->addend = fixp->fx_addnumber;
13737 else
13738 {
13739 /* We use a special addend for an internal RELLO reloc. */
13740 if (symbol_section_p (fixp->fx_addsy))
13741 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13742 else
13743 reloc->addend = fixp->fx_addnumber + reloc->address;
13744 }
13745 }
13746 else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13747 {
13748 assert (fixp->fx_next != NULL
13749 && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
13750
13751 /* The reloc is relative to the RELLO; adjust the addend
13752 accordingly. */
13753 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13754 reloc->addend = fixp->fx_next->fx_addnumber;
13755 else
13756 {
13757 /* We use a special addend for an internal RELHI reloc. */
13758 if (symbol_section_p (fixp->fx_addsy))
13759 reloc->addend = (fixp->fx_next->fx_frag->fr_address
13760 + fixp->fx_next->fx_where
13761 - S_GET_VALUE (fixp->fx_subsy));
13762 else
13763 reloc->addend = (fixp->fx_addnumber
13764 + fixp->fx_next->fx_frag->fr_address
13765 + fixp->fx_next->fx_where);
13766 }
13767 }
13768 else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13769 reloc->addend = fixp->fx_addnumber;
13770 else
13771 {
13772 if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13773 /* A gruesome hack which is a result of the gruesome gas reloc
13774 handling. */
13775 reloc->addend = reloc->address;
13776 else
13777 reloc->addend = -reloc->address;
13778 }
13779
13780 /* If this is a variant frag, we may need to adjust the existing
13781 reloc and generate a new one. */
13782 if (fixp->fx_frag->fr_opcode != NULL
13783 && ((fixp->fx_r_type == BFD_RELOC_GPREL16
13784 && ! HAVE_NEWABI)
13785 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_DISP
13786 && HAVE_NEWABI)
13787 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
13788 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
13789 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13790 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
13791 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13792 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16)
13793 )
13794 {
13795 arelent *reloc2;
13796
13797 assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
13798
13799 /* If this is not the last reloc in this frag, then we have two
13800 GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
13801 CALL_HI16/CALL_LO16, both of which are being replaced. Let
13802 the second one handle all of them. */
13803 if (fixp->fx_next != NULL
13804 && fixp->fx_frag == fixp->fx_next->fx_frag)
13805 {
13806 assert ((fixp->fx_r_type == BFD_RELOC_GPREL16
13807 && fixp->fx_next->fx_r_type == BFD_RELOC_GPREL16)
13808 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13809 && (fixp->fx_next->fx_r_type
13810 == BFD_RELOC_MIPS_GOT_LO16))
13811 || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13812 && (fixp->fx_next->fx_r_type
13813 == BFD_RELOC_MIPS_CALL_LO16)));
13814 retval[0] = NULL;
13815 return retval;
13816 }
13817
13818 fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
13819 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13820 reloc->addend += fixp->fx_frag->tc_frag_data.tc_fr_offset;
13821 reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
13822 retval[2] = NULL;
13823 reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13824 *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13825 reloc2->address = (reloc->address
13826 + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
13827 - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
13828 reloc2->addend = fixp->fx_addnumber
13829 + fixp->fx_frag->tc_frag_data.tc_fr_offset;
13830 reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
13831 assert (reloc2->howto != NULL);
13832
13833 if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
13834 {
13835 arelent *reloc3;
13836
13837 reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
13838 retval[3] = NULL;
13839 *reloc3 = *reloc2;
13840 reloc3->address += 4;
13841 }
13842
13843 if (mips_pic == NO_PIC)
13844 {
13845 assert (fixp->fx_r_type == BFD_RELOC_GPREL16);
13846 fixp->fx_r_type = BFD_RELOC_HI16_S;
13847 }
13848 else if (mips_pic == SVR4_PIC)
13849 {
13850 switch (fixp->fx_r_type)
13851 {
13852 default:
13853 abort ();
13854 case BFD_RELOC_MIPS_GOT16:
13855 break;
13856 case BFD_RELOC_MIPS_GOT_LO16:
13857 case BFD_RELOC_MIPS_CALL_LO16:
13858 if (HAVE_NEWABI)
13859 {
13860 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_PAGE;
13861 reloc2->howto = bfd_reloc_type_lookup
13862 (stdoutput, BFD_RELOC_MIPS_GOT_OFST);
13863 }
13864 else
13865 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13866 break;
13867 case BFD_RELOC_MIPS_CALL16:
13868 case BFD_RELOC_MIPS_GOT_OFST:
13869 case BFD_RELOC_MIPS_GOT_DISP:
13870 if (HAVE_NEWABI)
13871 {
13872 /* It may seem nonsensical to relax GOT_DISP to
13873 GOT_DISP, but we're actually turning a GOT_DISP
13874 without offset into a GOT_DISP with an offset,
13875 getting rid of the separate addition, which we can
13876 do when the symbol is found to be local. */
13877 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_DISP;
13878 retval[1] = NULL;
13879 }
13880 else
13881 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13882 break;
13883 }
13884 }
13885 else
13886 abort ();
13887 }
13888
13889 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13890 entry to be used in the relocation's section offset. */
13891 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13892 {
13893 reloc->address = reloc->addend;
13894 reloc->addend = 0;
13895 }
13896
13897 /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13898 fixup_segment converted a non-PC relative reloc into a PC
13899 relative reloc. In such a case, we need to convert the reloc
13900 code. */
13901 code = fixp->fx_r_type;
13902 if (fixp->fx_pcrel)
13903 {
13904 switch (code)
13905 {
13906 case BFD_RELOC_8:
13907 code = BFD_RELOC_8_PCREL;
13908 break;
13909 case BFD_RELOC_16:
13910 code = BFD_RELOC_16_PCREL;
13911 break;
13912 case BFD_RELOC_32:
13913 code = BFD_RELOC_32_PCREL;
13914 break;
13915 case BFD_RELOC_64:
13916 code = BFD_RELOC_64_PCREL;
13917 break;
13918 case BFD_RELOC_8_PCREL:
13919 case BFD_RELOC_16_PCREL:
13920 case BFD_RELOC_32_PCREL:
13921 case BFD_RELOC_64_PCREL:
13922 case BFD_RELOC_16_PCREL_S2:
13923 case BFD_RELOC_PCREL_HI16_S:
13924 case BFD_RELOC_PCREL_LO16:
13925 break;
13926 default:
13927 as_bad_where (fixp->fx_file, fixp->fx_line,
13928 _("Cannot make %s relocation PC relative"),
13929 bfd_get_reloc_code_name (code));
13930 }
13931 }
13932
13933 #ifdef OBJ_ELF
13934 /* md_apply_fix3 has a double-subtraction hack to get
13935 bfd_install_relocation to behave nicely. GPREL relocations are
13936 handled correctly without this hack, so undo it here. We can't
13937 stop md_apply_fix3 from subtracting twice in the first place since
13938 the fake addend is required for variant frags above. */
13939 if (fixp->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour
13940 && (code == BFD_RELOC_GPREL16 || code == BFD_RELOC_MIPS16_GPREL)
13941 && reloc->addend != 0
13942 && mips_need_elf_addend_fixup (fixp))
13943 reloc->addend += S_GET_VALUE (fixp->fx_addsy);
13944 #endif
13945
13946 /* To support a PC relative reloc when generating embedded PIC code
13947 for ECOFF, we use a Cygnus extension. We check for that here to
13948 make sure that we don't let such a reloc escape normally. */
13949 if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13950 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13951 && code == BFD_RELOC_16_PCREL_S2
13952 && mips_pic != EMBEDDED_PIC)
13953 reloc->howto = NULL;
13954 else
13955 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13956
13957 if (reloc->howto == NULL)
13958 {
13959 as_bad_where (fixp->fx_file, fixp->fx_line,
13960 _("Can not represent %s relocation in this object file format"),
13961 bfd_get_reloc_code_name (code));
13962 retval[0] = NULL;
13963 }
13964
13965 return retval;
13966 }
13967
13968 /* Relax a machine dependent frag. This returns the amount by which
13969 the current size of the frag should change. */
13970
13971 int
13972 mips_relax_frag (sec, fragp, stretch)
13973 asection *sec;
13974 fragS *fragp;
13975 long stretch;
13976 {
13977 if (RELAX_BRANCH_P (fragp->fr_subtype))
13978 {
13979 offsetT old_var = fragp->fr_var;
13980
13981 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13982
13983 return fragp->fr_var - old_var;
13984 }
13985
13986 if (! RELAX_MIPS16_P (fragp->fr_subtype))
13987 return 0;
13988
13989 if (mips16_extended_frag (fragp, NULL, stretch))
13990 {
13991 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13992 return 0;
13993 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13994 return 2;
13995 }
13996 else
13997 {
13998 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13999 return 0;
14000 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14001 return -2;
14002 }
14003
14004 return 0;
14005 }
14006
14007 /* Convert a machine dependent frag. */
14008
14009 void
14010 md_convert_frag (abfd, asec, fragp)
14011 bfd *abfd ATTRIBUTE_UNUSED;
14012 segT asec;
14013 fragS *fragp;
14014 {
14015 int old, new;
14016 char *fixptr;
14017
14018 if (RELAX_BRANCH_P (fragp->fr_subtype))
14019 {
14020 bfd_byte *buf;
14021 unsigned long insn;
14022 expressionS exp;
14023 fixS *fixp;
14024
14025 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14026
14027 if (target_big_endian)
14028 insn = bfd_getb32 (buf);
14029 else
14030 insn = bfd_getl32 (buf);
14031
14032 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14033 {
14034 /* We generate a fixup instead of applying it right now
14035 because, if there are linker relaxations, we're going to
14036 need the relocations. */
14037 exp.X_op = O_symbol;
14038 exp.X_add_symbol = fragp->fr_symbol;
14039 exp.X_add_number = fragp->fr_offset;
14040
14041 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14042 4, &exp, 1,
14043 BFD_RELOC_16_PCREL_S2);
14044 fixp->fx_file = fragp->fr_file;
14045 fixp->fx_line = fragp->fr_line;
14046
14047 md_number_to_chars ((char *)buf, insn, 4);
14048 buf += 4;
14049 }
14050 else
14051 {
14052 int i;
14053
14054 as_warn_where (fragp->fr_file, fragp->fr_line,
14055 _("relaxed out-of-range branch into a jump"));
14056
14057 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14058 goto uncond;
14059
14060 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14061 {
14062 /* Reverse the branch. */
14063 switch ((insn >> 28) & 0xf)
14064 {
14065 case 4:
14066 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14067 have the condition reversed by tweaking a single
14068 bit, and their opcodes all have 0x4???????. */
14069 assert ((insn & 0xf1000000) == 0x41000000);
14070 insn ^= 0x00010000;
14071 break;
14072
14073 case 0:
14074 /* bltz 0x04000000 bgez 0x04010000
14075 bltzal 0x04100000 bgezal 0x04110000 */
14076 assert ((insn & 0xfc0e0000) == 0x04000000);
14077 insn ^= 0x00010000;
14078 break;
14079
14080 case 1:
14081 /* beq 0x10000000 bne 0x14000000
14082 blez 0x18000000 bgtz 0x1c000000 */
14083 insn ^= 0x04000000;
14084 break;
14085
14086 default:
14087 abort ();
14088 }
14089 }
14090
14091 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14092 {
14093 /* Clear the and-link bit. */
14094 assert ((insn & 0xfc1c0000) == 0x04100000);
14095
14096 /* bltzal 0x04100000 bgezal 0x04110000
14097 bltzall 0x04120000 bgezall 0x04130000 */
14098 insn &= ~0x00100000;
14099 }
14100
14101 /* Branch over the branch (if the branch was likely) or the
14102 full jump (not likely case). Compute the offset from the
14103 current instruction to branch to. */
14104 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14105 i = 16;
14106 else
14107 {
14108 /* How many bytes in instructions we've already emitted? */
14109 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14110 /* How many bytes in instructions from here to the end? */
14111 i = fragp->fr_var - i;
14112 }
14113 /* Convert to instruction count. */
14114 i >>= 2;
14115 /* Branch counts from the next instruction. */
14116 i--;
14117 insn |= i;
14118 /* Branch over the jump. */
14119 md_number_to_chars ((char *)buf, insn, 4);
14120 buf += 4;
14121
14122 /* Nop */
14123 md_number_to_chars ((char*)buf, 0, 4);
14124 buf += 4;
14125
14126 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14127 {
14128 /* beql $0, $0, 2f */
14129 insn = 0x50000000;
14130 /* Compute the PC offset from the current instruction to
14131 the end of the variable frag. */
14132 /* How many bytes in instructions we've already emitted? */
14133 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14134 /* How many bytes in instructions from here to the end? */
14135 i = fragp->fr_var - i;
14136 /* Convert to instruction count. */
14137 i >>= 2;
14138 /* Don't decrement i, because we want to branch over the
14139 delay slot. */
14140
14141 insn |= i;
14142 md_number_to_chars ((char *)buf, insn, 4);
14143 buf += 4;
14144
14145 md_number_to_chars ((char *)buf, 0, 4);
14146 buf += 4;
14147 }
14148
14149 uncond:
14150 if (mips_pic == NO_PIC)
14151 {
14152 /* j or jal. */
14153 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14154 ? 0x0c000000 : 0x08000000);
14155 exp.X_op = O_symbol;
14156 exp.X_add_symbol = fragp->fr_symbol;
14157 exp.X_add_number = fragp->fr_offset;
14158
14159 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14160 4, &exp, 0, BFD_RELOC_MIPS_JMP);
14161 fixp->fx_file = fragp->fr_file;
14162 fixp->fx_line = fragp->fr_line;
14163
14164 md_number_to_chars ((char*)buf, insn, 4);
14165 buf += 4;
14166 }
14167 else
14168 {
14169 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14170 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14171 exp.X_op = O_symbol;
14172 exp.X_add_symbol = fragp->fr_symbol;
14173 exp.X_add_number = fragp->fr_offset;
14174
14175 if (fragp->fr_offset)
14176 {
14177 exp.X_add_symbol = make_expr_symbol (&exp);
14178 exp.X_add_number = 0;
14179 }
14180
14181 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14182 4, &exp, 0, BFD_RELOC_MIPS_GOT16);
14183 fixp->fx_file = fragp->fr_file;
14184 fixp->fx_line = fragp->fr_line;
14185
14186 md_number_to_chars ((char*)buf, insn, 4);
14187 buf += 4;
14188
14189 if (mips_opts.isa == ISA_MIPS1)
14190 {
14191 /* nop */
14192 md_number_to_chars ((char*)buf, 0, 4);
14193 buf += 4;
14194 }
14195
14196 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14197 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14198
14199 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14200 4, &exp, 0, BFD_RELOC_LO16);
14201 fixp->fx_file = fragp->fr_file;
14202 fixp->fx_line = fragp->fr_line;
14203
14204 md_number_to_chars ((char*)buf, insn, 4);
14205 buf += 4;
14206
14207 /* j(al)r $at. */
14208 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14209 insn = 0x0020f809;
14210 else
14211 insn = 0x00200008;
14212
14213 md_number_to_chars ((char*)buf, insn, 4);
14214 buf += 4;
14215 }
14216 }
14217
14218 assert (buf == (bfd_byte *)fragp->fr_literal
14219 + fragp->fr_fix + fragp->fr_var);
14220
14221 fragp->fr_fix += fragp->fr_var;
14222
14223 return;
14224 }
14225
14226 if (RELAX_MIPS16_P (fragp->fr_subtype))
14227 {
14228 int type;
14229 register const struct mips16_immed_operand *op;
14230 bfd_boolean small, ext;
14231 offsetT val;
14232 bfd_byte *buf;
14233 unsigned long insn;
14234 bfd_boolean use_extend;
14235 unsigned short extend;
14236
14237 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14238 op = mips16_immed_operands;
14239 while (op->type != type)
14240 ++op;
14241
14242 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14243 {
14244 small = FALSE;
14245 ext = TRUE;
14246 }
14247 else
14248 {
14249 small = TRUE;
14250 ext = FALSE;
14251 }
14252
14253 resolve_symbol_value (fragp->fr_symbol);
14254 val = S_GET_VALUE (fragp->fr_symbol);
14255 if (op->pcrel)
14256 {
14257 addressT addr;
14258
14259 addr = fragp->fr_address + fragp->fr_fix;
14260
14261 /* The rules for the base address of a PC relative reloc are
14262 complicated; see mips16_extended_frag. */
14263 if (type == 'p' || type == 'q')
14264 {
14265 addr += 2;
14266 if (ext)
14267 addr += 2;
14268 /* Ignore the low bit in the target, since it will be
14269 set for a text label. */
14270 if ((val & 1) != 0)
14271 --val;
14272 }
14273 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14274 addr -= 4;
14275 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14276 addr -= 2;
14277
14278 addr &= ~ (addressT) ((1 << op->shift) - 1);
14279 val -= addr;
14280
14281 /* Make sure the section winds up with the alignment we have
14282 assumed. */
14283 if (op->shift > 0)
14284 record_alignment (asec, op->shift);
14285 }
14286
14287 if (ext
14288 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14289 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14290 as_warn_where (fragp->fr_file, fragp->fr_line,
14291 _("extended instruction in delay slot"));
14292
14293 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14294
14295 if (target_big_endian)
14296 insn = bfd_getb16 (buf);
14297 else
14298 insn = bfd_getl16 (buf);
14299
14300 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14301 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14302 small, ext, &insn, &use_extend, &extend);
14303
14304 if (use_extend)
14305 {
14306 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14307 fragp->fr_fix += 2;
14308 buf += 2;
14309 }
14310
14311 md_number_to_chars ((char *) buf, insn, 2);
14312 fragp->fr_fix += 2;
14313 buf += 2;
14314 }
14315 else
14316 {
14317 if (fragp->fr_opcode == NULL)
14318 return;
14319
14320 old = RELAX_OLD (fragp->fr_subtype);
14321 new = RELAX_NEW (fragp->fr_subtype);
14322 fixptr = fragp->fr_literal + fragp->fr_fix;
14323
14324 if (new > 0)
14325 memmove (fixptr - old, fixptr, new);
14326
14327 fragp->fr_fix += new - old;
14328 }
14329 }
14330
14331 #ifdef OBJ_ELF
14332
14333 /* This function is called after the relocs have been generated.
14334 We've been storing mips16 text labels as odd. Here we convert them
14335 back to even for the convenience of the debugger. */
14336
14337 void
14338 mips_frob_file_after_relocs ()
14339 {
14340 asymbol **syms;
14341 unsigned int count, i;
14342
14343 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
14344 return;
14345
14346 syms = bfd_get_outsymbols (stdoutput);
14347 count = bfd_get_symcount (stdoutput);
14348 for (i = 0; i < count; i++, syms++)
14349 {
14350 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14351 && ((*syms)->value & 1) != 0)
14352 {
14353 (*syms)->value &= ~1;
14354 /* If the symbol has an odd size, it was probably computed
14355 incorrectly, so adjust that as well. */
14356 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14357 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14358 }
14359 }
14360 }
14361
14362 #endif
14363
14364 /* This function is called whenever a label is defined. It is used
14365 when handling branch delays; if a branch has a label, we assume we
14366 can not move it. */
14367
14368 void
14369 mips_define_label (sym)
14370 symbolS *sym;
14371 {
14372 struct insn_label_list *l;
14373
14374 if (free_insn_labels == NULL)
14375 l = (struct insn_label_list *) xmalloc (sizeof *l);
14376 else
14377 {
14378 l = free_insn_labels;
14379 free_insn_labels = l->next;
14380 }
14381
14382 l->label = sym;
14383 l->next = insn_labels;
14384 insn_labels = l;
14385 }
14386 \f
14387 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14388
14389 /* Some special processing for a MIPS ELF file. */
14390
14391 void
14392 mips_elf_final_processing ()
14393 {
14394 /* Write out the register information. */
14395 if (mips_abi != N64_ABI)
14396 {
14397 Elf32_RegInfo s;
14398
14399 s.ri_gprmask = mips_gprmask;
14400 s.ri_cprmask[0] = mips_cprmask[0];
14401 s.ri_cprmask[1] = mips_cprmask[1];
14402 s.ri_cprmask[2] = mips_cprmask[2];
14403 s.ri_cprmask[3] = mips_cprmask[3];
14404 /* The gp_value field is set by the MIPS ELF backend. */
14405
14406 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14407 ((Elf32_External_RegInfo *)
14408 mips_regmask_frag));
14409 }
14410 else
14411 {
14412 Elf64_Internal_RegInfo s;
14413
14414 s.ri_gprmask = mips_gprmask;
14415 s.ri_pad = 0;
14416 s.ri_cprmask[0] = mips_cprmask[0];
14417 s.ri_cprmask[1] = mips_cprmask[1];
14418 s.ri_cprmask[2] = mips_cprmask[2];
14419 s.ri_cprmask[3] = mips_cprmask[3];
14420 /* The gp_value field is set by the MIPS ELF backend. */
14421
14422 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14423 ((Elf64_External_RegInfo *)
14424 mips_regmask_frag));
14425 }
14426
14427 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14428 sort of BFD interface for this. */
14429 if (mips_any_noreorder)
14430 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14431 if (mips_pic != NO_PIC)
14432 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14433
14434 /* Set MIPS ELF flags for ASEs. */
14435 if (file_ase_mips16)
14436 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14437 #if 0 /* XXX FIXME */
14438 if (file_ase_mips3d)
14439 elf_elfheader (stdoutput)->e_flags |= ???;
14440 #endif
14441 if (file_ase_mdmx)
14442 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14443
14444 /* Set the MIPS ELF ABI flags. */
14445 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14446 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14447 else if (mips_abi == O64_ABI)
14448 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14449 else if (mips_abi == EABI_ABI)
14450 {
14451 if (!file_mips_gp32)
14452 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14453 else
14454 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14455 }
14456 else if (mips_abi == N32_ABI)
14457 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14458
14459 /* Nothing to do for N64_ABI. */
14460
14461 if (mips_32bitmode)
14462 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14463 }
14464
14465 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14466 \f
14467 typedef struct proc {
14468 symbolS *isym;
14469 unsigned long reg_mask;
14470 unsigned long reg_offset;
14471 unsigned long fpreg_mask;
14472 unsigned long fpreg_offset;
14473 unsigned long frame_offset;
14474 unsigned long frame_reg;
14475 unsigned long pc_reg;
14476 } procS;
14477
14478 static procS cur_proc;
14479 static procS *cur_proc_ptr;
14480 static int numprocs;
14481
14482 /* Fill in an rs_align_code fragment. */
14483
14484 void
14485 mips_handle_align (fragp)
14486 fragS *fragp;
14487 {
14488 if (fragp->fr_type != rs_align_code)
14489 return;
14490
14491 if (mips_opts.mips16)
14492 {
14493 static const unsigned char be_nop[] = { 0x65, 0x00 };
14494 static const unsigned char le_nop[] = { 0x00, 0x65 };
14495
14496 int bytes;
14497 char *p;
14498
14499 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14500 p = fragp->fr_literal + fragp->fr_fix;
14501
14502 if (bytes & 1)
14503 {
14504 *p++ = 0;
14505 fragp->fr_fix++;
14506 }
14507
14508 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14509 fragp->fr_var = 2;
14510 }
14511
14512 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
14513 }
14514
14515 static void
14516 md_obj_begin ()
14517 {
14518 }
14519
14520 static void
14521 md_obj_end ()
14522 {
14523 /* check for premature end, nesting errors, etc */
14524 if (cur_proc_ptr)
14525 as_warn (_("missing .end at end of assembly"));
14526 }
14527
14528 static long
14529 get_number ()
14530 {
14531 int negative = 0;
14532 long val = 0;
14533
14534 if (*input_line_pointer == '-')
14535 {
14536 ++input_line_pointer;
14537 negative = 1;
14538 }
14539 if (!ISDIGIT (*input_line_pointer))
14540 as_bad (_("expected simple number"));
14541 if (input_line_pointer[0] == '0')
14542 {
14543 if (input_line_pointer[1] == 'x')
14544 {
14545 input_line_pointer += 2;
14546 while (ISXDIGIT (*input_line_pointer))
14547 {
14548 val <<= 4;
14549 val |= hex_value (*input_line_pointer++);
14550 }
14551 return negative ? -val : val;
14552 }
14553 else
14554 {
14555 ++input_line_pointer;
14556 while (ISDIGIT (*input_line_pointer))
14557 {
14558 val <<= 3;
14559 val |= *input_line_pointer++ - '0';
14560 }
14561 return negative ? -val : val;
14562 }
14563 }
14564 if (!ISDIGIT (*input_line_pointer))
14565 {
14566 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14567 *input_line_pointer, *input_line_pointer);
14568 as_warn (_("invalid number"));
14569 return -1;
14570 }
14571 while (ISDIGIT (*input_line_pointer))
14572 {
14573 val *= 10;
14574 val += *input_line_pointer++ - '0';
14575 }
14576 return negative ? -val : val;
14577 }
14578
14579 /* The .file directive; just like the usual .file directive, but there
14580 is an initial number which is the ECOFF file index. In the non-ECOFF
14581 case .file implies DWARF-2. */
14582
14583 static void
14584 s_mips_file (x)
14585 int x ATTRIBUTE_UNUSED;
14586 {
14587 static int first_file_directive = 0;
14588
14589 if (ECOFF_DEBUGGING)
14590 {
14591 get_number ();
14592 s_app_file (0);
14593 }
14594 else
14595 {
14596 char *filename;
14597
14598 filename = dwarf2_directive_file (0);
14599
14600 /* Versions of GCC up to 3.1 start files with a ".file"
14601 directive even for stabs output. Make sure that this
14602 ".file" is handled. Note that you need a version of GCC
14603 after 3.1 in order to support DWARF-2 on MIPS. */
14604 if (filename != NULL && ! first_file_directive)
14605 {
14606 (void) new_logical_line (filename, -1);
14607 s_app_file_string (filename);
14608 }
14609 first_file_directive = 1;
14610 }
14611 }
14612
14613 /* The .loc directive, implying DWARF-2. */
14614
14615 static void
14616 s_mips_loc (x)
14617 int x ATTRIBUTE_UNUSED;
14618 {
14619 if (!ECOFF_DEBUGGING)
14620 dwarf2_directive_loc (0);
14621 }
14622
14623 /* The .end directive. */
14624
14625 static void
14626 s_mips_end (x)
14627 int x ATTRIBUTE_UNUSED;
14628 {
14629 symbolS *p;
14630
14631 /* Following functions need their own .frame and .cprestore directives. */
14632 mips_frame_reg_valid = 0;
14633 mips_cprestore_valid = 0;
14634
14635 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14636 {
14637 p = get_symbol ();
14638 demand_empty_rest_of_line ();
14639 }
14640 else
14641 p = NULL;
14642
14643 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14644 as_warn (_(".end not in text section"));
14645
14646 if (!cur_proc_ptr)
14647 {
14648 as_warn (_(".end directive without a preceding .ent directive."));
14649 demand_empty_rest_of_line ();
14650 return;
14651 }
14652
14653 if (p != NULL)
14654 {
14655 assert (S_GET_NAME (p));
14656 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
14657 as_warn (_(".end symbol does not match .ent symbol."));
14658
14659 if (debug_type == DEBUG_STABS)
14660 stabs_generate_asm_endfunc (S_GET_NAME (p),
14661 S_GET_NAME (p));
14662 }
14663 else
14664 as_warn (_(".end directive missing or unknown symbol"));
14665
14666 #ifdef OBJ_ELF
14667 /* Generate a .pdr section. */
14668 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14669 {
14670 segT saved_seg = now_seg;
14671 subsegT saved_subseg = now_subseg;
14672 valueT dot;
14673 expressionS exp;
14674 char *fragp;
14675
14676 dot = frag_now_fix ();
14677
14678 #ifdef md_flush_pending_output
14679 md_flush_pending_output ();
14680 #endif
14681
14682 assert (pdr_seg);
14683 subseg_set (pdr_seg, 0);
14684
14685 /* Write the symbol. */
14686 exp.X_op = O_symbol;
14687 exp.X_add_symbol = p;
14688 exp.X_add_number = 0;
14689 emit_expr (&exp, 4);
14690
14691 fragp = frag_more (7 * 4);
14692
14693 md_number_to_chars (fragp, (valueT) cur_proc_ptr->reg_mask, 4);
14694 md_number_to_chars (fragp + 4, (valueT) cur_proc_ptr->reg_offset, 4);
14695 md_number_to_chars (fragp + 8, (valueT) cur_proc_ptr->fpreg_mask, 4);
14696 md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
14697 md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
14698 md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
14699 md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
14700
14701 subseg_set (saved_seg, saved_subseg);
14702 }
14703 #endif /* OBJ_ELF */
14704
14705 cur_proc_ptr = NULL;
14706 }
14707
14708 /* The .aent and .ent directives. */
14709
14710 static void
14711 s_mips_ent (aent)
14712 int aent;
14713 {
14714 symbolS *symbolP;
14715
14716 symbolP = get_symbol ();
14717 if (*input_line_pointer == ',')
14718 ++input_line_pointer;
14719 SKIP_WHITESPACE ();
14720 if (ISDIGIT (*input_line_pointer)
14721 || *input_line_pointer == '-')
14722 get_number ();
14723
14724 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14725 as_warn (_(".ent or .aent not in text section."));
14726
14727 if (!aent && cur_proc_ptr)
14728 as_warn (_("missing .end"));
14729
14730 if (!aent)
14731 {
14732 /* This function needs its own .frame and .cprestore directives. */
14733 mips_frame_reg_valid = 0;
14734 mips_cprestore_valid = 0;
14735
14736 cur_proc_ptr = &cur_proc;
14737 memset (cur_proc_ptr, '\0', sizeof (procS));
14738
14739 cur_proc_ptr->isym = symbolP;
14740
14741 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14742
14743 ++numprocs;
14744
14745 if (debug_type == DEBUG_STABS)
14746 stabs_generate_asm_func (S_GET_NAME (symbolP),
14747 S_GET_NAME (symbolP));
14748 }
14749
14750 demand_empty_rest_of_line ();
14751 }
14752
14753 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14754 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14755 s_mips_frame is used so that we can set the PDR information correctly.
14756 We can't use the ecoff routines because they make reference to the ecoff
14757 symbol table (in the mdebug section). */
14758
14759 static void
14760 s_mips_frame (ignore)
14761 int ignore ATTRIBUTE_UNUSED;
14762 {
14763 #ifdef OBJ_ELF
14764 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14765 {
14766 long val;
14767
14768 if (cur_proc_ptr == (procS *) NULL)
14769 {
14770 as_warn (_(".frame outside of .ent"));
14771 demand_empty_rest_of_line ();
14772 return;
14773 }
14774
14775 cur_proc_ptr->frame_reg = tc_get_register (1);
14776
14777 SKIP_WHITESPACE ();
14778 if (*input_line_pointer++ != ','
14779 || get_absolute_expression_and_terminator (&val) != ',')
14780 {
14781 as_warn (_("Bad .frame directive"));
14782 --input_line_pointer;
14783 demand_empty_rest_of_line ();
14784 return;
14785 }
14786
14787 cur_proc_ptr->frame_offset = val;
14788 cur_proc_ptr->pc_reg = tc_get_register (0);
14789
14790 demand_empty_rest_of_line ();
14791 }
14792 else
14793 #endif /* OBJ_ELF */
14794 s_ignore (ignore);
14795 }
14796
14797 /* The .fmask and .mask directives. If the mdebug section is present
14798 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14799 embedded targets, s_mips_mask is used so that we can set the PDR
14800 information correctly. We can't use the ecoff routines because they
14801 make reference to the ecoff symbol table (in the mdebug section). */
14802
14803 static void
14804 s_mips_mask (reg_type)
14805 char reg_type;
14806 {
14807 #ifdef OBJ_ELF
14808 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14809 {
14810 long mask, off;
14811
14812 if (cur_proc_ptr == (procS *) NULL)
14813 {
14814 as_warn (_(".mask/.fmask outside of .ent"));
14815 demand_empty_rest_of_line ();
14816 return;
14817 }
14818
14819 if (get_absolute_expression_and_terminator (&mask) != ',')
14820 {
14821 as_warn (_("Bad .mask/.fmask directive"));
14822 --input_line_pointer;
14823 demand_empty_rest_of_line ();
14824 return;
14825 }
14826
14827 off = get_absolute_expression ();
14828
14829 if (reg_type == 'F')
14830 {
14831 cur_proc_ptr->fpreg_mask = mask;
14832 cur_proc_ptr->fpreg_offset = off;
14833 }
14834 else
14835 {
14836 cur_proc_ptr->reg_mask = mask;
14837 cur_proc_ptr->reg_offset = off;
14838 }
14839
14840 demand_empty_rest_of_line ();
14841 }
14842 else
14843 #endif /* OBJ_ELF */
14844 s_ignore (reg_type);
14845 }
14846
14847 /* The .loc directive. */
14848
14849 #if 0
14850 static void
14851 s_loc (x)
14852 int x;
14853 {
14854 symbolS *symbolP;
14855 int lineno;
14856 int addroff;
14857
14858 assert (now_seg == text_section);
14859
14860 lineno = get_number ();
14861 addroff = frag_now_fix ();
14862
14863 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14864 S_SET_TYPE (symbolP, N_SLINE);
14865 S_SET_OTHER (symbolP, 0);
14866 S_SET_DESC (symbolP, lineno);
14867 symbolP->sy_segment = now_seg;
14868 }
14869 #endif
14870
14871 /* A table describing all the processors gas knows about. Names are
14872 matched in the order listed.
14873
14874 To ease comparison, please keep this table in the same order as
14875 gcc's mips_cpu_info_table[]. */
14876 static const struct mips_cpu_info mips_cpu_info_table[] =
14877 {
14878 /* Entries for generic ISAs */
14879 { "mips1", 1, ISA_MIPS1, CPU_R3000 },
14880 { "mips2", 1, ISA_MIPS2, CPU_R6000 },
14881 { "mips3", 1, ISA_MIPS3, CPU_R4000 },
14882 { "mips4", 1, ISA_MIPS4, CPU_R8000 },
14883 { "mips5", 1, ISA_MIPS5, CPU_MIPS5 },
14884 { "mips32", 1, ISA_MIPS32, CPU_MIPS32 },
14885 { "mips32r2", 1, ISA_MIPS32R2, CPU_MIPS32R2 },
14886 { "mips64", 1, ISA_MIPS64, CPU_MIPS64 },
14887
14888 /* MIPS I */
14889 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14890 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14891 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14892
14893 /* MIPS II */
14894 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14895
14896 /* MIPS III */
14897 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
14898 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
14899 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
14900 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
14901 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
14902 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
14903 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
14904 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
14905 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
14906 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
14907 { "orion", 0, ISA_MIPS3, CPU_R4600 },
14908 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
14909
14910 /* MIPS IV */
14911 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
14912 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
14913 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
14914 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
14915 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
14916 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
14917 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
14918 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
14919 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
14920 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
14921 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
14922 { "r7000", 0, ISA_MIPS4, CPU_R5000 },
14923
14924 /* MIPS 32 */
14925 { "4kc", 0, ISA_MIPS32, CPU_MIPS32, },
14926 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
14927 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
14928
14929 /* MIPS 64 */
14930 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
14931 { "20kc", 0, ISA_MIPS64, CPU_MIPS64 },
14932
14933 /* Broadcom SB-1 CPU core */
14934 { "sb1", 0, ISA_MIPS64, CPU_SB1 },
14935
14936 /* End marker */
14937 { NULL, 0, 0, 0 }
14938 };
14939
14940
14941 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14942 with a final "000" replaced by "k". Ignore case.
14943
14944 Note: this function is shared between GCC and GAS. */
14945
14946 static bfd_boolean
14947 mips_strict_matching_cpu_name_p (canonical, given)
14948 const char *canonical, *given;
14949 {
14950 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14951 given++, canonical++;
14952
14953 return ((*given == 0 && *canonical == 0)
14954 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14955 }
14956
14957
14958 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14959 CPU name. We've traditionally allowed a lot of variation here.
14960
14961 Note: this function is shared between GCC and GAS. */
14962
14963 static bfd_boolean
14964 mips_matching_cpu_name_p (canonical, given)
14965 const char *canonical, *given;
14966 {
14967 /* First see if the name matches exactly, or with a final "000"
14968 turned into "k". */
14969 if (mips_strict_matching_cpu_name_p (canonical, given))
14970 return TRUE;
14971
14972 /* If not, try comparing based on numerical designation alone.
14973 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14974 if (TOLOWER (*given) == 'r')
14975 given++;
14976 if (!ISDIGIT (*given))
14977 return FALSE;
14978
14979 /* Skip over some well-known prefixes in the canonical name,
14980 hoping to find a number there too. */
14981 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14982 canonical += 2;
14983 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14984 canonical += 2;
14985 else if (TOLOWER (canonical[0]) == 'r')
14986 canonical += 1;
14987
14988 return mips_strict_matching_cpu_name_p (canonical, given);
14989 }
14990
14991
14992 /* Parse an option that takes the name of a processor as its argument.
14993 OPTION is the name of the option and CPU_STRING is the argument.
14994 Return the corresponding processor enumeration if the CPU_STRING is
14995 recognized, otherwise report an error and return null.
14996
14997 A similar function exists in GCC. */
14998
14999 static const struct mips_cpu_info *
15000 mips_parse_cpu (option, cpu_string)
15001 const char *option, *cpu_string;
15002 {
15003 const struct mips_cpu_info *p;
15004
15005 /* 'from-abi' selects the most compatible architecture for the given
15006 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15007 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15008 version. Look first at the -mgp options, if given, otherwise base
15009 the choice on MIPS_DEFAULT_64BIT.
15010
15011 Treat NO_ABI like the EABIs. One reason to do this is that the
15012 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15013 architecture. This code picks MIPS I for 'mips' and MIPS III for
15014 'mips64', just as we did in the days before 'from-abi'. */
15015 if (strcasecmp (cpu_string, "from-abi") == 0)
15016 {
15017 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15018 return mips_cpu_info_from_isa (ISA_MIPS1);
15019
15020 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15021 return mips_cpu_info_from_isa (ISA_MIPS3);
15022
15023 if (file_mips_gp32 >= 0)
15024 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15025
15026 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15027 ? ISA_MIPS3
15028 : ISA_MIPS1);
15029 }
15030
15031 /* 'default' has traditionally been a no-op. Probably not very useful. */
15032 if (strcasecmp (cpu_string, "default") == 0)
15033 return 0;
15034
15035 for (p = mips_cpu_info_table; p->name != 0; p++)
15036 if (mips_matching_cpu_name_p (p->name, cpu_string))
15037 return p;
15038
15039 as_bad ("Bad value (%s) for %s", cpu_string, option);
15040 return 0;
15041 }
15042
15043 /* Return the canonical processor information for ISA (a member of the
15044 ISA_MIPS* enumeration). */
15045
15046 static const struct mips_cpu_info *
15047 mips_cpu_info_from_isa (isa)
15048 int isa;
15049 {
15050 int i;
15051
15052 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15053 if (mips_cpu_info_table[i].is_isa
15054 && isa == mips_cpu_info_table[i].isa)
15055 return (&mips_cpu_info_table[i]);
15056
15057 return NULL;
15058 }
15059 \f
15060 static void
15061 show (stream, string, col_p, first_p)
15062 FILE *stream;
15063 const char *string;
15064 int *col_p;
15065 int *first_p;
15066 {
15067 if (*first_p)
15068 {
15069 fprintf (stream, "%24s", "");
15070 *col_p = 24;
15071 }
15072 else
15073 {
15074 fprintf (stream, ", ");
15075 *col_p += 2;
15076 }
15077
15078 if (*col_p + strlen (string) > 72)
15079 {
15080 fprintf (stream, "\n%24s", "");
15081 *col_p = 24;
15082 }
15083
15084 fprintf (stream, "%s", string);
15085 *col_p += strlen (string);
15086
15087 *first_p = 0;
15088 }
15089
15090 void
15091 md_show_usage (stream)
15092 FILE *stream;
15093 {
15094 int column, first;
15095 size_t i;
15096
15097 fprintf (stream, _("\
15098 MIPS options:\n\
15099 -membedded-pic generate embedded position independent code\n\
15100 -EB generate big endian output\n\
15101 -EL generate little endian output\n\
15102 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15103 -G NUM allow referencing objects up to NUM bytes\n\
15104 implicitly with the gp register [default 8]\n"));
15105 fprintf (stream, _("\
15106 -mips1 generate MIPS ISA I instructions\n\
15107 -mips2 generate MIPS ISA II instructions\n\
15108 -mips3 generate MIPS ISA III instructions\n\
15109 -mips4 generate MIPS ISA IV instructions\n\
15110 -mips5 generate MIPS ISA V instructions\n\
15111 -mips32 generate MIPS32 ISA instructions\n\
15112 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15113 -mips64 generate MIPS64 ISA instructions\n\
15114 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15115
15116 first = 1;
15117
15118 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15119 show (stream, mips_cpu_info_table[i].name, &column, &first);
15120 show (stream, "from-abi", &column, &first);
15121 fputc ('\n', stream);
15122
15123 fprintf (stream, _("\
15124 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15125 -no-mCPU don't generate code specific to CPU.\n\
15126 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15127
15128 first = 1;
15129
15130 show (stream, "3900", &column, &first);
15131 show (stream, "4010", &column, &first);
15132 show (stream, "4100", &column, &first);
15133 show (stream, "4650", &column, &first);
15134 fputc ('\n', stream);
15135
15136 fprintf (stream, _("\
15137 -mips16 generate mips16 instructions\n\
15138 -no-mips16 do not generate mips16 instructions\n"));
15139 fprintf (stream, _("\
15140 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15141 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15142 -O0 remove unneeded NOPs, do not swap branches\n\
15143 -O remove unneeded NOPs and swap branches\n\
15144 -n warn about NOPs generated from macros\n\
15145 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15146 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15147 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15148 #ifdef OBJ_ELF
15149 fprintf (stream, _("\
15150 -KPIC, -call_shared generate SVR4 position independent code\n\
15151 -non_shared do not generate position independent code\n\
15152 -xgot assume a 32 bit GOT\n\
15153 -mabi=ABI create ABI conformant object file for:\n"));
15154
15155 first = 1;
15156
15157 show (stream, "32", &column, &first);
15158 show (stream, "o64", &column, &first);
15159 show (stream, "n32", &column, &first);
15160 show (stream, "64", &column, &first);
15161 show (stream, "eabi", &column, &first);
15162
15163 fputc ('\n', stream);
15164
15165 fprintf (stream, _("\
15166 -32 create o32 ABI object file (default)\n\
15167 -n32 create n32 ABI object file\n\
15168 -64 create 64 ABI object file\n"));
15169 #endif
15170 }
15171
15172 enum dwarf2_format
15173 mips_dwarf2_format ()
15174 {
15175 if (mips_abi == N64_ABI)
15176 {
15177 #ifdef TE_IRIX
15178 return dwarf2_format_64bit_irix;
15179 #else
15180 return dwarf2_format_64bit;
15181 #endif
15182 }
15183 else
15184 return dwarf2_format_32bit;
15185 }
This page took 0.478079 seconds and 4 git commands to generate.