1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007 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
9 This file is part of GAS.
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 3, or (at your option)
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.
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
29 #include "safe-ctype.h"
31 #include "opcode/mips.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
37 #define DBG(x) printf x
43 /* Clean up namespace so we can include obj-elf.h too. */
44 static int mips_output_flavor (void);
45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR
; }
46 #undef OBJ_PROCESS_STAB
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
60 /* Fix any of them that we actually care about. */
62 #define OUTPUT_FLAVOR mips_output_flavor()
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
74 int mips_flag_mdebug
= -1;
76 /* Control generation of .pdr sections. Off by default on IRIX: the native
77 linker doesn't know about and discards them, but relocations against them
78 remain, leading to rld crashes. */
80 int mips_flag_pdr
= FALSE
;
82 int mips_flag_pdr
= TRUE
;
87 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88 static char *mips_regmask_frag
;
94 #define PIC_CALL_REG 25
102 #define ILLEGAL_REG (32)
104 /* Allow override of standard little-endian ECOFF format. */
106 #ifndef ECOFF_LITTLE_FORMAT
107 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 extern int target_big_endian
;
112 /* The name of the readonly data section. */
113 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
115 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
117 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121 /* Information about an instruction, including its format, operands
125 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
126 const struct mips_opcode
*insn_mo
;
128 /* True if this is a mips16 instruction and if we want the extended
130 bfd_boolean use_extend
;
132 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
133 unsigned short extend
;
135 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
136 a copy of INSN_MO->match with the operands filled in. */
137 unsigned long insn_opcode
;
139 /* The frag that contains the instruction. */
142 /* The offset into FRAG of the first instruction byte. */
145 /* The relocs associated with the instruction, if any. */
148 /* True if this entry cannot be moved from its current position. */
149 unsigned int fixed_p
: 1;
151 /* True if this instruction occurred in a .set noreorder block. */
152 unsigned int noreorder_p
: 1;
154 /* True for mips16 instructions that jump to an absolute address. */
155 unsigned int mips16_absolute_jump_p
: 1;
158 /* The ABI to use. */
169 /* MIPS ABI we are using for this output file. */
170 static enum mips_abi_level mips_abi
= NO_ABI
;
172 /* Whether or not we have code that can call pic code. */
173 int mips_abicalls
= FALSE
;
175 /* Whether or not we have code which can be put into a shared
177 static bfd_boolean mips_in_shared
= TRUE
;
179 /* This is the set of options which may be modified by the .set
180 pseudo-op. We use a struct so that .set push and .set pop are more
183 struct mips_set_options
185 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
186 if it has not been initialized. Changed by `.set mipsN', and the
187 -mipsN command line option, and the default CPU. */
189 /* Enabled Application Specific Extensions (ASEs). These are set to -1
190 if they have not been initialized. Changed by `.set <asename>', by
191 command line options, and based on the default architecture. */
198 /* Whether we are assembling for the mips16 processor. 0 if we are
199 not, 1 if we are, and -1 if the value has not been initialized.
200 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
201 -nomips16 command line options, and the default CPU. */
203 /* Non-zero if we should not reorder instructions. Changed by `.set
204 reorder' and `.set noreorder'. */
206 /* Non-zero if we should not permit the $at ($1) register to be used
207 in instructions. Changed by `.set at' and `.set noat'. */
209 /* Non-zero if we should warn when a macro instruction expands into
210 more than one machine instruction. Changed by `.set nomacro' and
212 int warn_about_macros
;
213 /* Non-zero if we should not move instructions. Changed by `.set
214 move', `.set volatile', `.set nomove', and `.set novolatile'. */
216 /* Non-zero if we should not optimize branches by moving the target
217 of the branch into the delay slot. Actually, we don't perform
218 this optimization anyhow. Changed by `.set bopt' and `.set
221 /* Non-zero if we should not autoextend mips16 instructions.
222 Changed by `.set autoextend' and `.set noautoextend'. */
224 /* Restrict general purpose registers and floating point registers
225 to 32 bit. This is initially determined when -mgp32 or -mfp32
226 is passed but can changed if the assembler code uses .set mipsN. */
229 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
230 command line option, and the default CPU. */
232 /* True if ".set sym32" is in effect. */
236 /* True if -mgp32 was passed. */
237 static int file_mips_gp32
= -1;
239 /* True if -mfp32 was passed. */
240 static int file_mips_fp32
= -1;
242 /* This is the struct we use to hold the current set of options. Note
243 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
244 -1 to indicate that they have not been initialized. */
246 static struct mips_set_options mips_opts
=
248 ISA_UNKNOWN
, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN
, FALSE
251 /* These variables are filled in with the masks of registers used.
252 The object format code reads them and puts them in the appropriate
254 unsigned long mips_gprmask
;
255 unsigned long mips_cprmask
[4];
257 /* MIPS ISA we are using for this output file. */
258 static int file_mips_isa
= ISA_UNKNOWN
;
260 /* True if -mips16 was passed or implied by arguments passed on the
261 command line (e.g., by -march). */
262 static int file_ase_mips16
;
264 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
265 || mips_opts.isa == ISA_MIPS32R2 \
266 || mips_opts.isa == ISA_MIPS64 \
267 || mips_opts.isa == ISA_MIPS64R2)
269 /* True if -mips3d was passed or implied by arguments passed on the
270 command line (e.g., by -march). */
271 static int file_ase_mips3d
;
273 /* True if -mdmx was passed or implied by arguments passed on the
274 command line (e.g., by -march). */
275 static int file_ase_mdmx
;
277 /* True if -msmartmips was passed or implied by arguments passed on the
278 command line (e.g., by -march). */
279 static int file_ase_smartmips
;
281 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
282 || mips_opts.isa == ISA_MIPS32R2)
284 /* True if -mdsp was passed or implied by arguments passed on the
285 command line (e.g., by -march). */
286 static int file_ase_dsp
;
288 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
289 || mips_opts.isa == ISA_MIPS64R2)
291 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
293 /* True if -mdspr2 was passed or implied by arguments passed on the
294 command line (e.g., by -march). */
295 static int file_ase_dspr2
;
297 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
298 || mips_opts.isa == ISA_MIPS64R2)
300 /* True if -mmt was passed or implied by arguments passed on the
301 command line (e.g., by -march). */
302 static int file_ase_mt
;
304 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
305 || mips_opts.isa == ISA_MIPS64R2)
307 /* The argument of the -march= flag. The architecture we are assembling. */
308 static int file_mips_arch
= CPU_UNKNOWN
;
309 static const char *mips_arch_string
;
311 /* The argument of the -mtune= flag. The architecture for which we
313 static int mips_tune
= CPU_UNKNOWN
;
314 static const char *mips_tune_string
;
316 /* True when generating 32-bit code for a 64-bit processor. */
317 static int mips_32bitmode
= 0;
319 /* True if the given ABI requires 32-bit registers. */
320 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
322 /* Likewise 64-bit registers. */
323 #define ABI_NEEDS_64BIT_REGS(ABI) \
325 || (ABI) == N64_ABI \
328 /* Return true if ISA supports 64 bit wide gp registers. */
329 #define ISA_HAS_64BIT_REGS(ISA) \
330 ((ISA) == ISA_MIPS3 \
331 || (ISA) == ISA_MIPS4 \
332 || (ISA) == ISA_MIPS5 \
333 || (ISA) == ISA_MIPS64 \
334 || (ISA) == ISA_MIPS64R2)
336 /* Return true if ISA supports 64 bit wide float registers. */
337 #define ISA_HAS_64BIT_FPRS(ISA) \
338 ((ISA) == ISA_MIPS3 \
339 || (ISA) == ISA_MIPS4 \
340 || (ISA) == ISA_MIPS5 \
341 || (ISA) == ISA_MIPS32R2 \
342 || (ISA) == ISA_MIPS64 \
343 || (ISA) == ISA_MIPS64R2)
345 /* Return true if ISA supports 64-bit right rotate (dror et al.)
347 #define ISA_HAS_DROR(ISA) \
348 ((ISA) == ISA_MIPS64R2)
350 /* Return true if ISA supports 32-bit right rotate (ror et al.)
352 #define ISA_HAS_ROR(ISA) \
353 ((ISA) == ISA_MIPS32R2 \
354 || (ISA) == ISA_MIPS64R2 \
355 || mips_opts.ase_smartmips)
357 /* Return true if ISA supports single-precision floats in odd registers. */
358 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
359 ((ISA) == ISA_MIPS32 \
360 || (ISA) == ISA_MIPS32R2 \
361 || (ISA) == ISA_MIPS64 \
362 || (ISA) == ISA_MIPS64R2)
364 /* Return true if ISA supports move to/from high part of a 64-bit
365 floating-point register. */
366 #define ISA_HAS_MXHC1(ISA) \
367 ((ISA) == ISA_MIPS32R2 \
368 || (ISA) == ISA_MIPS64R2)
370 #define HAVE_32BIT_GPRS \
371 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
373 #define HAVE_32BIT_FPRS \
374 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
376 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
377 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
379 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
381 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
383 /* True if relocations are stored in-place. */
384 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
386 /* The ABI-derived address size. */
387 #define HAVE_64BIT_ADDRESSES \
388 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
389 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
391 /* The size of symbolic constants (i.e., expressions of the form
392 "SYMBOL" or "SYMBOL + OFFSET"). */
393 #define HAVE_32BIT_SYMBOLS \
394 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
395 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
397 /* Addresses are loaded in different ways, depending on the address size
398 in use. The n32 ABI Documentation also mandates the use of additions
399 with overflow checking, but existing implementations don't follow it. */
400 #define ADDRESS_ADD_INSN \
401 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
403 #define ADDRESS_ADDI_INSN \
404 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
406 #define ADDRESS_LOAD_INSN \
407 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
409 #define ADDRESS_STORE_INSN \
410 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
412 /* Return true if the given CPU supports the MIPS16 ASE. */
413 #define CPU_HAS_MIPS16(cpu) \
414 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
415 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
417 /* True if CPU has a dror instruction. */
418 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
420 /* True if CPU has a ror instruction. */
421 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
423 /* True if mflo and mfhi can be immediately followed by instructions
424 which write to the HI and LO registers.
426 According to MIPS specifications, MIPS ISAs I, II, and III need
427 (at least) two instructions between the reads of HI/LO and
428 instructions which write them, and later ISAs do not. Contradicting
429 the MIPS specifications, some MIPS IV processor user manuals (e.g.
430 the UM for the NEC Vr5000) document needing the instructions between
431 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
432 MIPS64 and later ISAs to have the interlocks, plus any specific
433 earlier-ISA CPUs for which CPU documentation declares that the
434 instructions are really interlocked. */
435 #define hilo_interlocks \
436 (mips_opts.isa == ISA_MIPS32 \
437 || mips_opts.isa == ISA_MIPS32R2 \
438 || mips_opts.isa == ISA_MIPS64 \
439 || mips_opts.isa == ISA_MIPS64R2 \
440 || mips_opts.arch == CPU_R4010 \
441 || mips_opts.arch == CPU_R10000 \
442 || mips_opts.arch == CPU_R12000 \
443 || mips_opts.arch == CPU_RM7000 \
444 || mips_opts.arch == CPU_VR5500 \
447 /* Whether the processor uses hardware interlocks to protect reads
448 from the GPRs after they are loaded from memory, and thus does not
449 require nops to be inserted. This applies to instructions marked
450 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
452 #define gpr_interlocks \
453 (mips_opts.isa != ISA_MIPS1 \
454 || mips_opts.arch == CPU_R3900)
456 /* Whether the processor uses hardware interlocks to avoid delays
457 required by coprocessor instructions, and thus does not require
458 nops to be inserted. This applies to instructions marked
459 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
460 between instructions marked INSN_WRITE_COND_CODE and ones marked
461 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
462 levels I, II, and III. */
463 /* Itbl support may require additional care here. */
464 #define cop_interlocks \
465 ((mips_opts.isa != ISA_MIPS1 \
466 && mips_opts.isa != ISA_MIPS2 \
467 && mips_opts.isa != ISA_MIPS3) \
468 || mips_opts.arch == CPU_R4300 \
471 /* Whether the processor uses hardware interlocks to protect reads
472 from coprocessor registers after they are loaded from memory, and
473 thus does not require nops to be inserted. This applies to
474 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
475 requires at MIPS ISA level I. */
476 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
478 /* Is this a mfhi or mflo instruction? */
479 #define MF_HILO_INSN(PINFO) \
480 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
482 /* MIPS PIC level. */
484 enum mips_pic_level mips_pic
;
486 /* 1 if we should generate 32 bit offsets from the $gp register in
487 SVR4_PIC mode. Currently has no meaning in other modes. */
488 static int mips_big_got
= 0;
490 /* 1 if trap instructions should used for overflow rather than break
492 static int mips_trap
= 0;
494 /* 1 if double width floating point constants should not be constructed
495 by assembling two single width halves into two single width floating
496 point registers which just happen to alias the double width destination
497 register. On some architectures this aliasing can be disabled by a bit
498 in the status register, and the setting of this bit cannot be determined
499 automatically at assemble time. */
500 static int mips_disable_float_construction
;
502 /* Non-zero if any .set noreorder directives were used. */
504 static int mips_any_noreorder
;
506 /* Non-zero if nops should be inserted when the register referenced in
507 an mfhi/mflo instruction is read in the next two instructions. */
508 static int mips_7000_hilo_fix
;
510 /* The size of objects in the small data section. */
511 static unsigned int g_switch_value
= 8;
512 /* Whether the -G option was used. */
513 static int g_switch_seen
= 0;
518 /* If we can determine in advance that GP optimization won't be
519 possible, we can skip the relaxation stuff that tries to produce
520 GP-relative references. This makes delay slot optimization work
523 This function can only provide a guess, but it seems to work for
524 gcc output. It needs to guess right for gcc, otherwise gcc
525 will put what it thinks is a GP-relative instruction in a branch
528 I don't know if a fix is needed for the SVR4_PIC mode. I've only
529 fixed it for the non-PIC mode. KR 95/04/07 */
530 static int nopic_need_relax (symbolS
*, int);
532 /* handle of the OPCODE hash table */
533 static struct hash_control
*op_hash
= NULL
;
535 /* The opcode hash table we use for the mips16. */
536 static struct hash_control
*mips16_op_hash
= NULL
;
538 /* This array holds the chars that always start a comment. If the
539 pre-processor is disabled, these aren't very useful */
540 const char comment_chars
[] = "#";
542 /* This array holds the chars that only start a comment at the beginning of
543 a line. If the line seems to have the form '# 123 filename'
544 .line and .file directives will appear in the pre-processed output */
545 /* Note that input_file.c hand checks for '#' at the beginning of the
546 first line of the input file. This is because the compiler outputs
547 #NO_APP at the beginning of its output. */
548 /* Also note that C style comments are always supported. */
549 const char line_comment_chars
[] = "#";
551 /* This array holds machine specific line separator characters. */
552 const char line_separator_chars
[] = ";";
554 /* Chars that can be used to separate mant from exp in floating point nums */
555 const char EXP_CHARS
[] = "eE";
557 /* Chars that mean this number is a floating point constant */
560 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
562 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
563 changed in read.c . Ideally it shouldn't have to know about it at all,
564 but nothing is ideal around here.
567 static char *insn_error
;
569 static int auto_align
= 1;
571 /* When outputting SVR4 PIC code, the assembler needs to know the
572 offset in the stack frame from which to restore the $gp register.
573 This is set by the .cprestore pseudo-op, and saved in this
575 static offsetT mips_cprestore_offset
= -1;
577 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
578 more optimizations, it can use a register value instead of a memory-saved
579 offset and even an other register than $gp as global pointer. */
580 static offsetT mips_cpreturn_offset
= -1;
581 static int mips_cpreturn_register
= -1;
582 static int mips_gp_register
= GP
;
583 static int mips_gprel_offset
= 0;
585 /* Whether mips_cprestore_offset has been set in the current function
586 (or whether it has already been warned about, if not). */
587 static int mips_cprestore_valid
= 0;
589 /* This is the register which holds the stack frame, as set by the
590 .frame pseudo-op. This is needed to implement .cprestore. */
591 static int mips_frame_reg
= SP
;
593 /* Whether mips_frame_reg has been set in the current function
594 (or whether it has already been warned about, if not). */
595 static int mips_frame_reg_valid
= 0;
597 /* To output NOP instructions correctly, we need to keep information
598 about the previous two instructions. */
600 /* Whether we are optimizing. The default value of 2 means to remove
601 unneeded NOPs and swap branch instructions when possible. A value
602 of 1 means to not swap branches. A value of 0 means to always
604 static int mips_optimize
= 2;
606 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
607 equivalent to seeing no -g option at all. */
608 static int mips_debug
= 0;
610 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
611 #define MAX_VR4130_NOPS 4
613 /* The maximum number of NOPs needed to fill delay slots. */
614 #define MAX_DELAY_NOPS 2
616 /* The maximum number of NOPs needed for any purpose. */
619 /* A list of previous instructions, with index 0 being the most recent.
620 We need to look back MAX_NOPS instructions when filling delay slots
621 or working around processor errata. We need to look back one
622 instruction further if we're thinking about using history[0] to
623 fill a branch delay slot. */
624 static struct mips_cl_insn history
[1 + MAX_NOPS
];
626 /* Nop instructions used by emit_nop. */
627 static struct mips_cl_insn nop_insn
, mips16_nop_insn
;
629 /* The appropriate nop for the current mode. */
630 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
632 /* If this is set, it points to a frag holding nop instructions which
633 were inserted before the start of a noreorder section. If those
634 nops turn out to be unnecessary, the size of the frag can be
636 static fragS
*prev_nop_frag
;
638 /* The number of nop instructions we created in prev_nop_frag. */
639 static int prev_nop_frag_holds
;
641 /* The number of nop instructions that we know we need in
643 static int prev_nop_frag_required
;
645 /* The number of instructions we've seen since prev_nop_frag. */
646 static int prev_nop_frag_since
;
648 /* For ECOFF and ELF, relocations against symbols are done in two
649 parts, with a HI relocation and a LO relocation. Each relocation
650 has only 16 bits of space to store an addend. This means that in
651 order for the linker to handle carries correctly, it must be able
652 to locate both the HI and the LO relocation. This means that the
653 relocations must appear in order in the relocation table.
655 In order to implement this, we keep track of each unmatched HI
656 relocation. We then sort them so that they immediately precede the
657 corresponding LO relocation. */
662 struct mips_hi_fixup
*next
;
665 /* The section this fixup is in. */
669 /* The list of unmatched HI relocs. */
671 static struct mips_hi_fixup
*mips_hi_fixup_list
;
673 /* The frag containing the last explicit relocation operator.
674 Null if explicit relocations have not been used. */
676 static fragS
*prev_reloc_op_frag
;
678 /* Map normal MIPS register numbers to mips16 register numbers. */
680 #define X ILLEGAL_REG
681 static const int mips32_to_16_reg_map
[] =
683 X
, X
, 2, 3, 4, 5, 6, 7,
684 X
, X
, X
, X
, X
, X
, X
, X
,
685 0, 1, X
, X
, X
, X
, X
, X
,
686 X
, X
, X
, X
, X
, X
, X
, X
690 /* Map mips16 register numbers to normal MIPS register numbers. */
692 static const unsigned int mips16_to_32_reg_map
[] =
694 16, 17, 2, 3, 4, 5, 6, 7
697 /* Classifies the kind of instructions we're interested in when
698 implementing -mfix-vr4120. */
699 enum fix_vr4120_class
{
706 NUM_FIX_VR4120_CLASSES
709 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
710 there must be at least one other instruction between an instruction
711 of type X and an instruction of type Y. */
712 static unsigned int vr4120_conflicts
[NUM_FIX_VR4120_CLASSES
];
714 /* True if -mfix-vr4120 is in force. */
715 static int mips_fix_vr4120
;
717 /* ...likewise -mfix-vr4130. */
718 static int mips_fix_vr4130
;
720 /* We don't relax branches by default, since this causes us to expand
721 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
722 fail to compute the offset before expanding the macro to the most
723 efficient expansion. */
725 static int mips_relax_branch
;
727 /* The expansion of many macros depends on the type of symbol that
728 they refer to. For example, when generating position-dependent code,
729 a macro that refers to a symbol may have two different expansions,
730 one which uses GP-relative addresses and one which uses absolute
731 addresses. When generating SVR4-style PIC, a macro may have
732 different expansions for local and global symbols.
734 We handle these situations by generating both sequences and putting
735 them in variant frags. In position-dependent code, the first sequence
736 will be the GP-relative one and the second sequence will be the
737 absolute one. In SVR4 PIC, the first sequence will be for global
738 symbols and the second will be for local symbols.
740 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
741 SECOND are the lengths of the two sequences in bytes. These fields
742 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
743 the subtype has the following flags:
746 Set if it has been decided that we should use the second
747 sequence instead of the first.
750 Set in the first variant frag if the macro's second implementation
751 is longer than its first. This refers to the macro as a whole,
752 not an individual relaxation.
755 Set in the first variant frag if the macro appeared in a .set nomacro
756 block and if one alternative requires a warning but the other does not.
759 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
762 The frag's "opcode" points to the first fixup for relaxable code.
764 Relaxable macros are generated using a sequence such as:
766 relax_start (SYMBOL);
767 ... generate first expansion ...
769 ... generate second expansion ...
772 The code and fixups for the unwanted alternative are discarded
773 by md_convert_frag. */
774 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
776 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
777 #define RELAX_SECOND(X) ((X) & 0xff)
778 #define RELAX_USE_SECOND 0x10000
779 #define RELAX_SECOND_LONGER 0x20000
780 #define RELAX_NOMACRO 0x40000
781 #define RELAX_DELAY_SLOT 0x80000
783 /* Branch without likely bit. If label is out of range, we turn:
785 beq reg1, reg2, label
795 with the following opcode replacements:
802 bltzal <-> bgezal (with jal label instead of j label)
804 Even though keeping the delay slot instruction in the delay slot of
805 the branch would be more efficient, it would be very tricky to do
806 correctly, because we'd have to introduce a variable frag *after*
807 the delay slot instruction, and expand that instead. Let's do it
808 the easy way for now, even if the branch-not-taken case now costs
809 one additional instruction. Out-of-range branches are not supposed
810 to be common, anyway.
812 Branch likely. If label is out of range, we turn:
814 beql reg1, reg2, label
815 delay slot (annulled if branch not taken)
824 delay slot (executed only if branch taken)
827 It would be possible to generate a shorter sequence by losing the
828 likely bit, generating something like:
833 delay slot (executed only if branch taken)
845 bltzall -> bgezal (with jal label instead of j label)
846 bgezall -> bltzal (ditto)
849 but it's not clear that it would actually improve performance. */
850 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
853 | ((toofar) ? 1 : 0) \
855 | ((likely) ? 4 : 0) \
856 | ((uncond) ? 8 : 0)))
857 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
858 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
859 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
860 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
861 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
863 /* For mips16 code, we use an entirely different form of relaxation.
864 mips16 supports two versions of most instructions which take
865 immediate values: a small one which takes some small value, and a
866 larger one which takes a 16 bit value. Since branches also follow
867 this pattern, relaxing these values is required.
869 We can assemble both mips16 and normal MIPS code in a single
870 object. Therefore, we need to support this type of relaxation at
871 the same time that we support the relaxation described above. We
872 use the high bit of the subtype field to distinguish these cases.
874 The information we store for this type of relaxation is the
875 argument code found in the opcode file for this relocation, whether
876 the user explicitly requested a small or extended form, and whether
877 the relocation is in a jump or jal delay slot. That tells us the
878 size of the value, and how it should be stored. We also store
879 whether the fragment is considered to be extended or not. We also
880 store whether this is known to be a branch to a different section,
881 whether we have tried to relax this frag yet, and whether we have
882 ever extended a PC relative fragment because of a shift count. */
883 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
886 | ((small) ? 0x100 : 0) \
887 | ((ext) ? 0x200 : 0) \
888 | ((dslot) ? 0x400 : 0) \
889 | ((jal_dslot) ? 0x800 : 0))
890 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
891 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
892 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
893 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
894 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
895 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
896 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
897 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
898 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
899 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
900 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
901 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
903 /* Is the given value a sign-extended 32-bit value? */
904 #define IS_SEXT_32BIT_NUM(x) \
905 (((x) &~ (offsetT) 0x7fffffff) == 0 \
906 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
908 /* Is the given value a sign-extended 16-bit value? */
909 #define IS_SEXT_16BIT_NUM(x) \
910 (((x) &~ (offsetT) 0x7fff) == 0 \
911 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
913 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
914 #define IS_ZEXT_32BIT_NUM(x) \
915 (((x) &~ (offsetT) 0xffffffff) == 0 \
916 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
918 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
919 VALUE << SHIFT. VALUE is evaluated exactly once. */
920 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
921 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
922 | (((VALUE) & (MASK)) << (SHIFT)))
924 /* Extract bits MASK << SHIFT from STRUCT and shift them right
926 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
927 (((STRUCT) >> (SHIFT)) & (MASK))
929 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
930 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
932 include/opcode/mips.h specifies operand fields using the macros
933 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
934 with "MIPS16OP" instead of "OP". */
935 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
936 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
937 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
938 INSERT_BITS ((INSN).insn_opcode, VALUE, \
939 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
941 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
942 #define EXTRACT_OPERAND(FIELD, INSN) \
943 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
944 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
945 EXTRACT_BITS ((INSN).insn_opcode, \
946 MIPS16OP_MASK_##FIELD, \
949 /* Global variables used when generating relaxable macros. See the
950 comment above RELAX_ENCODE for more details about how relaxation
953 /* 0 if we're not emitting a relaxable macro.
954 1 if we're emitting the first of the two relaxation alternatives.
955 2 if we're emitting the second alternative. */
958 /* The first relaxable fixup in the current frag. (In other words,
959 the first fixup that refers to relaxable code.) */
962 /* sizes[0] says how many bytes of the first alternative are stored in
963 the current frag. Likewise sizes[1] for the second alternative. */
964 unsigned int sizes
[2];
966 /* The symbol on which the choice of sequence depends. */
970 /* Global variables used to decide whether a macro needs a warning. */
972 /* True if the macro is in a branch delay slot. */
973 bfd_boolean delay_slot_p
;
975 /* For relaxable macros, sizes[0] is the length of the first alternative
976 in bytes and sizes[1] is the length of the second alternative.
977 For non-relaxable macros, both elements give the length of the
979 unsigned int sizes
[2];
981 /* The first variant frag for this macro. */
983 } mips_macro_warning
;
985 /* Prototypes for static functions. */
987 #define internalError() \
988 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
990 enum mips_regclass
{ MIPS_GR_REG
, MIPS_FP_REG
, MIPS16_REG
};
992 static void append_insn
993 (struct mips_cl_insn
*ip
, expressionS
*p
, bfd_reloc_code_real_type
*r
);
994 static void mips_no_prev_insn (void);
995 static void mips16_macro_build
996 (expressionS
*, const char *, const char *, va_list);
997 static void load_register (int, expressionS
*, int);
998 static void macro_start (void);
999 static void macro_end (void);
1000 static void macro (struct mips_cl_insn
* ip
);
1001 static void mips16_macro (struct mips_cl_insn
* ip
);
1002 #ifdef LOSING_COMPILER
1003 static void macro2 (struct mips_cl_insn
* ip
);
1005 static void mips_ip (char *str
, struct mips_cl_insn
* ip
);
1006 static void mips16_ip (char *str
, struct mips_cl_insn
* ip
);
1007 static void mips16_immed
1008 (char *, unsigned int, int, offsetT
, bfd_boolean
, bfd_boolean
, bfd_boolean
,
1009 unsigned long *, bfd_boolean
*, unsigned short *);
1010 static size_t my_getSmallExpression
1011 (expressionS
*, bfd_reloc_code_real_type
*, char *);
1012 static void my_getExpression (expressionS
*, char *);
1013 static void s_align (int);
1014 static void s_change_sec (int);
1015 static void s_change_section (int);
1016 static void s_cons (int);
1017 static void s_float_cons (int);
1018 static void s_mips_globl (int);
1019 static void s_option (int);
1020 static void s_mipsset (int);
1021 static void s_abicalls (int);
1022 static void s_cpload (int);
1023 static void s_cpsetup (int);
1024 static void s_cplocal (int);
1025 static void s_cprestore (int);
1026 static void s_cpreturn (int);
1027 static void s_dtprelword (int);
1028 static void s_dtpreldword (int);
1029 static void s_gpvalue (int);
1030 static void s_gpword (int);
1031 static void s_gpdword (int);
1032 static void s_cpadd (int);
1033 static void s_insn (int);
1034 static void md_obj_begin (void);
1035 static void md_obj_end (void);
1036 static void s_mips_ent (int);
1037 static void s_mips_end (int);
1038 static void s_mips_frame (int);
1039 static void s_mips_mask (int reg_type
);
1040 static void s_mips_stab (int);
1041 static void s_mips_weakext (int);
1042 static void s_mips_file (int);
1043 static void s_mips_loc (int);
1044 static bfd_boolean
pic_need_relax (symbolS
*, asection
*);
1045 static int relaxed_branch_length (fragS
*, asection
*, int);
1046 static int validate_mips_insn (const struct mips_opcode
*);
1048 /* Table and functions used to map between CPU/ISA names, and
1049 ISA levels, and CPU numbers. */
1051 struct mips_cpu_info
1053 const char *name
; /* CPU or ISA name. */
1054 int flags
; /* ASEs available, or ISA flag. */
1055 int isa
; /* ISA level. */
1056 int cpu
; /* CPU number (default CPU if ISA). */
1059 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1060 #define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1061 #define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1062 #define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1063 #define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1064 #define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
1065 #define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
1067 static const struct mips_cpu_info
*mips_parse_cpu (const char *, const char *);
1068 static const struct mips_cpu_info
*mips_cpu_info_from_isa (int);
1069 static const struct mips_cpu_info
*mips_cpu_info_from_arch (int);
1073 The following pseudo-ops from the Kane and Heinrich MIPS book
1074 should be defined here, but are currently unsupported: .alias,
1075 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1077 The following pseudo-ops from the Kane and Heinrich MIPS book are
1078 specific to the type of debugging information being generated, and
1079 should be defined by the object format: .aent, .begin, .bend,
1080 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1083 The following pseudo-ops from the Kane and Heinrich MIPS book are
1084 not MIPS CPU specific, but are also not specific to the object file
1085 format. This file is probably the best place to define them, but
1086 they are not currently supported: .asm0, .endr, .lab, .struct. */
1088 static const pseudo_typeS mips_pseudo_table
[] =
1090 /* MIPS specific pseudo-ops. */
1091 {"option", s_option
, 0},
1092 {"set", s_mipsset
, 0},
1093 {"rdata", s_change_sec
, 'r'},
1094 {"sdata", s_change_sec
, 's'},
1095 {"livereg", s_ignore
, 0},
1096 {"abicalls", s_abicalls
, 0},
1097 {"cpload", s_cpload
, 0},
1098 {"cpsetup", s_cpsetup
, 0},
1099 {"cplocal", s_cplocal
, 0},
1100 {"cprestore", s_cprestore
, 0},
1101 {"cpreturn", s_cpreturn
, 0},
1102 {"dtprelword", s_dtprelword
, 0},
1103 {"dtpreldword", s_dtpreldword
, 0},
1104 {"gpvalue", s_gpvalue
, 0},
1105 {"gpword", s_gpword
, 0},
1106 {"gpdword", s_gpdword
, 0},
1107 {"cpadd", s_cpadd
, 0},
1108 {"insn", s_insn
, 0},
1110 /* Relatively generic pseudo-ops that happen to be used on MIPS
1112 {"asciiz", stringer
, 1},
1113 {"bss", s_change_sec
, 'b'},
1115 {"half", s_cons
, 1},
1116 {"dword", s_cons
, 3},
1117 {"weakext", s_mips_weakext
, 0},
1118 {"origin", s_org
, 0},
1119 {"repeat", s_rept
, 0},
1121 /* These pseudo-ops are defined in read.c, but must be overridden
1122 here for one reason or another. */
1123 {"align", s_align
, 0},
1124 {"byte", s_cons
, 0},
1125 {"data", s_change_sec
, 'd'},
1126 {"double", s_float_cons
, 'd'},
1127 {"float", s_float_cons
, 'f'},
1128 {"globl", s_mips_globl
, 0},
1129 {"global", s_mips_globl
, 0},
1130 {"hword", s_cons
, 1},
1132 {"long", s_cons
, 2},
1133 {"octa", s_cons
, 4},
1134 {"quad", s_cons
, 3},
1135 {"section", s_change_section
, 0},
1136 {"short", s_cons
, 1},
1137 {"single", s_float_cons
, 'f'},
1138 {"stabn", s_mips_stab
, 'n'},
1139 {"text", s_change_sec
, 't'},
1140 {"word", s_cons
, 2},
1142 { "extern", ecoff_directive_extern
, 0},
1147 static const pseudo_typeS mips_nonecoff_pseudo_table
[] =
1149 /* These pseudo-ops should be defined by the object file format.
1150 However, a.out doesn't support them, so we have versions here. */
1151 {"aent", s_mips_ent
, 1},
1152 {"bgnb", s_ignore
, 0},
1153 {"end", s_mips_end
, 0},
1154 {"endb", s_ignore
, 0},
1155 {"ent", s_mips_ent
, 0},
1156 {"file", s_mips_file
, 0},
1157 {"fmask", s_mips_mask
, 'F'},
1158 {"frame", s_mips_frame
, 0},
1159 {"loc", s_mips_loc
, 0},
1160 {"mask", s_mips_mask
, 'R'},
1161 {"verstamp", s_ignore
, 0},
1165 extern void pop_insert (const pseudo_typeS
*);
1168 mips_pop_insert (void)
1170 pop_insert (mips_pseudo_table
);
1171 if (! ECOFF_DEBUGGING
)
1172 pop_insert (mips_nonecoff_pseudo_table
);
1175 /* Symbols labelling the current insn. */
1177 struct insn_label_list
1179 struct insn_label_list
*next
;
1183 static struct insn_label_list
*free_insn_labels
;
1184 #define label_list tc_segment_info_data
1186 static void mips_clear_insn_labels (void);
1189 mips_clear_insn_labels (void)
1191 register struct insn_label_list
**pl
;
1192 segment_info_type
*si
;
1196 for (pl
= &free_insn_labels
; *pl
!= NULL
; pl
= &(*pl
)->next
)
1199 si
= seg_info (now_seg
);
1200 *pl
= si
->label_list
;
1201 si
->label_list
= NULL
;
1206 static char *expr_end
;
1208 /* Expressions which appear in instructions. These are set by
1211 static expressionS imm_expr
;
1212 static expressionS imm2_expr
;
1213 static expressionS offset_expr
;
1215 /* Relocs associated with imm_expr and offset_expr. */
1217 static bfd_reloc_code_real_type imm_reloc
[3]
1218 = {BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
};
1219 static bfd_reloc_code_real_type offset_reloc
[3]
1220 = {BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
};
1222 /* These are set by mips16_ip if an explicit extension is used. */
1224 static bfd_boolean mips16_small
, mips16_ext
;
1227 /* The pdr segment for per procedure frame/regmask info. Not used for
1230 static segT pdr_seg
;
1233 /* The default target format to use. */
1236 mips_target_format (void)
1238 switch (OUTPUT_FLAVOR
)
1240 case bfd_target_ecoff_flavour
:
1241 return target_big_endian
? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT
;
1242 case bfd_target_coff_flavour
:
1244 case bfd_target_elf_flavour
:
1246 if (!HAVE_64BIT_OBJECTS
&& !HAVE_NEWABI
)
1247 return (target_big_endian
1248 ? "elf32-bigmips-vxworks"
1249 : "elf32-littlemips-vxworks");
1252 /* This is traditional mips. */
1253 return (target_big_endian
1254 ? (HAVE_64BIT_OBJECTS
1255 ? "elf64-tradbigmips"
1257 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1258 : (HAVE_64BIT_OBJECTS
1259 ? "elf64-tradlittlemips"
1261 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1263 return (target_big_endian
1264 ? (HAVE_64BIT_OBJECTS
1267 ? "elf32-nbigmips" : "elf32-bigmips"))
1268 : (HAVE_64BIT_OBJECTS
1269 ? "elf64-littlemips"
1271 ? "elf32-nlittlemips" : "elf32-littlemips")));
1279 /* Return the length of instruction INSN. */
1281 static inline unsigned int
1282 insn_length (const struct mips_cl_insn
*insn
)
1284 if (!mips_opts
.mips16
)
1286 return insn
->mips16_absolute_jump_p
|| insn
->use_extend
? 4 : 2;
1289 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1292 create_insn (struct mips_cl_insn
*insn
, const struct mips_opcode
*mo
)
1297 insn
->use_extend
= FALSE
;
1299 insn
->insn_opcode
= mo
->match
;
1302 for (i
= 0; i
< ARRAY_SIZE (insn
->fixp
); i
++)
1303 insn
->fixp
[i
] = NULL
;
1304 insn
->fixed_p
= (mips_opts
.noreorder
> 0);
1305 insn
->noreorder_p
= (mips_opts
.noreorder
> 0);
1306 insn
->mips16_absolute_jump_p
= 0;
1309 /* Install INSN at the location specified by its "frag" and "where" fields. */
1312 install_insn (const struct mips_cl_insn
*insn
)
1314 char *f
= insn
->frag
->fr_literal
+ insn
->where
;
1315 if (!mips_opts
.mips16
)
1316 md_number_to_chars (f
, insn
->insn_opcode
, 4);
1317 else if (insn
->mips16_absolute_jump_p
)
1319 md_number_to_chars (f
, insn
->insn_opcode
>> 16, 2);
1320 md_number_to_chars (f
+ 2, insn
->insn_opcode
& 0xffff, 2);
1324 if (insn
->use_extend
)
1326 md_number_to_chars (f
, 0xf000 | insn
->extend
, 2);
1329 md_number_to_chars (f
, insn
->insn_opcode
, 2);
1333 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1334 and install the opcode in the new location. */
1337 move_insn (struct mips_cl_insn
*insn
, fragS
*frag
, long where
)
1342 insn
->where
= where
;
1343 for (i
= 0; i
< ARRAY_SIZE (insn
->fixp
); i
++)
1344 if (insn
->fixp
[i
] != NULL
)
1346 insn
->fixp
[i
]->fx_frag
= frag
;
1347 insn
->fixp
[i
]->fx_where
= where
;
1349 install_insn (insn
);
1352 /* Add INSN to the end of the output. */
1355 add_fixed_insn (struct mips_cl_insn
*insn
)
1357 char *f
= frag_more (insn_length (insn
));
1358 move_insn (insn
, frag_now
, f
- frag_now
->fr_literal
);
1361 /* Start a variant frag and move INSN to the start of the variant part,
1362 marking it as fixed. The other arguments are as for frag_var. */
1365 add_relaxed_insn (struct mips_cl_insn
*insn
, int max_chars
, int var
,
1366 relax_substateT subtype
, symbolS
*symbol
, offsetT offset
)
1368 frag_grow (max_chars
);
1369 move_insn (insn
, frag_now
, frag_more (0) - frag_now
->fr_literal
);
1371 frag_var (rs_machine_dependent
, max_chars
, var
,
1372 subtype
, symbol
, offset
, NULL
);
1375 /* Insert N copies of INSN into the history buffer, starting at
1376 position FIRST. Neither FIRST nor N need to be clipped. */
1379 insert_into_history (unsigned int first
, unsigned int n
,
1380 const struct mips_cl_insn
*insn
)
1382 if (mips_relax
.sequence
!= 2)
1386 for (i
= ARRAY_SIZE (history
); i
-- > first
;)
1388 history
[i
] = history
[i
- n
];
1394 /* Emit a nop instruction, recording it in the history buffer. */
1399 add_fixed_insn (NOP_INSN
);
1400 insert_into_history (0, 1, NOP_INSN
);
1403 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1404 the idea is to make it obvious at a glance that each errata is
1408 init_vr4120_conflicts (void)
1410 #define CONFLICT(FIRST, SECOND) \
1411 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1413 /* Errata 21 - [D]DIV[U] after [D]MACC */
1414 CONFLICT (MACC
, DIV
);
1415 CONFLICT (DMACC
, DIV
);
1417 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1418 CONFLICT (DMULT
, DMULT
);
1419 CONFLICT (DMULT
, DMACC
);
1420 CONFLICT (DMACC
, DMULT
);
1421 CONFLICT (DMACC
, DMACC
);
1423 /* Errata 24 - MT{LO,HI} after [D]MACC */
1424 CONFLICT (MACC
, MTHILO
);
1425 CONFLICT (DMACC
, MTHILO
);
1427 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1428 instruction is executed immediately after a MACC or DMACC
1429 instruction, the result of [either instruction] is incorrect." */
1430 CONFLICT (MACC
, MULT
);
1431 CONFLICT (MACC
, DMULT
);
1432 CONFLICT (DMACC
, MULT
);
1433 CONFLICT (DMACC
, DMULT
);
1435 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1436 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1437 DDIV or DDIVU instruction, the result of the MACC or
1438 DMACC instruction is incorrect.". */
1439 CONFLICT (DMULT
, MACC
);
1440 CONFLICT (DMULT
, DMACC
);
1441 CONFLICT (DIV
, MACC
);
1442 CONFLICT (DIV
, DMACC
);
1452 #define RTYPE_MASK 0x1ff00
1453 #define RTYPE_NUM 0x00100
1454 #define RTYPE_FPU 0x00200
1455 #define RTYPE_FCC 0x00400
1456 #define RTYPE_VEC 0x00800
1457 #define RTYPE_GP 0x01000
1458 #define RTYPE_CP0 0x02000
1459 #define RTYPE_PC 0x04000
1460 #define RTYPE_ACC 0x08000
1461 #define RTYPE_CCC 0x10000
1462 #define RNUM_MASK 0x000ff
1463 #define RWARN 0x80000
1465 #define GENERIC_REGISTER_NUMBERS \
1466 {"$0", RTYPE_NUM | 0}, \
1467 {"$1", RTYPE_NUM | 1}, \
1468 {"$2", RTYPE_NUM | 2}, \
1469 {"$3", RTYPE_NUM | 3}, \
1470 {"$4", RTYPE_NUM | 4}, \
1471 {"$5", RTYPE_NUM | 5}, \
1472 {"$6", RTYPE_NUM | 6}, \
1473 {"$7", RTYPE_NUM | 7}, \
1474 {"$8", RTYPE_NUM | 8}, \
1475 {"$9", RTYPE_NUM | 9}, \
1476 {"$10", RTYPE_NUM | 10}, \
1477 {"$11", RTYPE_NUM | 11}, \
1478 {"$12", RTYPE_NUM | 12}, \
1479 {"$13", RTYPE_NUM | 13}, \
1480 {"$14", RTYPE_NUM | 14}, \
1481 {"$15", RTYPE_NUM | 15}, \
1482 {"$16", RTYPE_NUM | 16}, \
1483 {"$17", RTYPE_NUM | 17}, \
1484 {"$18", RTYPE_NUM | 18}, \
1485 {"$19", RTYPE_NUM | 19}, \
1486 {"$20", RTYPE_NUM | 20}, \
1487 {"$21", RTYPE_NUM | 21}, \
1488 {"$22", RTYPE_NUM | 22}, \
1489 {"$23", RTYPE_NUM | 23}, \
1490 {"$24", RTYPE_NUM | 24}, \
1491 {"$25", RTYPE_NUM | 25}, \
1492 {"$26", RTYPE_NUM | 26}, \
1493 {"$27", RTYPE_NUM | 27}, \
1494 {"$28", RTYPE_NUM | 28}, \
1495 {"$29", RTYPE_NUM | 29}, \
1496 {"$30", RTYPE_NUM | 30}, \
1497 {"$31", RTYPE_NUM | 31}
1499 #define FPU_REGISTER_NAMES \
1500 {"$f0", RTYPE_FPU | 0}, \
1501 {"$f1", RTYPE_FPU | 1}, \
1502 {"$f2", RTYPE_FPU | 2}, \
1503 {"$f3", RTYPE_FPU | 3}, \
1504 {"$f4", RTYPE_FPU | 4}, \
1505 {"$f5", RTYPE_FPU | 5}, \
1506 {"$f6", RTYPE_FPU | 6}, \
1507 {"$f7", RTYPE_FPU | 7}, \
1508 {"$f8", RTYPE_FPU | 8}, \
1509 {"$f9", RTYPE_FPU | 9}, \
1510 {"$f10", RTYPE_FPU | 10}, \
1511 {"$f11", RTYPE_FPU | 11}, \
1512 {"$f12", RTYPE_FPU | 12}, \
1513 {"$f13", RTYPE_FPU | 13}, \
1514 {"$f14", RTYPE_FPU | 14}, \
1515 {"$f15", RTYPE_FPU | 15}, \
1516 {"$f16", RTYPE_FPU | 16}, \
1517 {"$f17", RTYPE_FPU | 17}, \
1518 {"$f18", RTYPE_FPU | 18}, \
1519 {"$f19", RTYPE_FPU | 19}, \
1520 {"$f20", RTYPE_FPU | 20}, \
1521 {"$f21", RTYPE_FPU | 21}, \
1522 {"$f22", RTYPE_FPU | 22}, \
1523 {"$f23", RTYPE_FPU | 23}, \
1524 {"$f24", RTYPE_FPU | 24}, \
1525 {"$f25", RTYPE_FPU | 25}, \
1526 {"$f26", RTYPE_FPU | 26}, \
1527 {"$f27", RTYPE_FPU | 27}, \
1528 {"$f28", RTYPE_FPU | 28}, \
1529 {"$f29", RTYPE_FPU | 29}, \
1530 {"$f30", RTYPE_FPU | 30}, \
1531 {"$f31", RTYPE_FPU | 31}
1533 #define FPU_CONDITION_CODE_NAMES \
1534 {"$fcc0", RTYPE_FCC | 0}, \
1535 {"$fcc1", RTYPE_FCC | 1}, \
1536 {"$fcc2", RTYPE_FCC | 2}, \
1537 {"$fcc3", RTYPE_FCC | 3}, \
1538 {"$fcc4", RTYPE_FCC | 4}, \
1539 {"$fcc5", RTYPE_FCC | 5}, \
1540 {"$fcc6", RTYPE_FCC | 6}, \
1541 {"$fcc7", RTYPE_FCC | 7}
1543 #define COPROC_CONDITION_CODE_NAMES \
1544 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1545 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1546 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1547 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1548 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1549 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1550 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1551 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1553 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1554 {"$a4", RTYPE_GP | 8}, \
1555 {"$a5", RTYPE_GP | 9}, \
1556 {"$a6", RTYPE_GP | 10}, \
1557 {"$a7", RTYPE_GP | 11}, \
1558 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1559 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1560 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1561 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1562 {"$t0", RTYPE_GP | 12}, \
1563 {"$t1", RTYPE_GP | 13}, \
1564 {"$t2", RTYPE_GP | 14}, \
1565 {"$t3", RTYPE_GP | 15}
1567 #define O32_SYMBOLIC_REGISTER_NAMES \
1568 {"$t0", RTYPE_GP | 8}, \
1569 {"$t1", RTYPE_GP | 9}, \
1570 {"$t2", RTYPE_GP | 10}, \
1571 {"$t3", RTYPE_GP | 11}, \
1572 {"$t4", RTYPE_GP | 12}, \
1573 {"$t5", RTYPE_GP | 13}, \
1574 {"$t6", RTYPE_GP | 14}, \
1575 {"$t7", RTYPE_GP | 15}, \
1576 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1577 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1578 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1579 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1581 /* Remaining symbolic register names */
1582 #define SYMBOLIC_REGISTER_NAMES \
1583 {"$zero", RTYPE_GP | 0}, \
1584 {"$at", RTYPE_GP | 1}, \
1585 {"$AT", RTYPE_GP | 1}, \
1586 {"$v0", RTYPE_GP | 2}, \
1587 {"$v1", RTYPE_GP | 3}, \
1588 {"$a0", RTYPE_GP | 4}, \
1589 {"$a1", RTYPE_GP | 5}, \
1590 {"$a2", RTYPE_GP | 6}, \
1591 {"$a3", RTYPE_GP | 7}, \
1592 {"$s0", RTYPE_GP | 16}, \
1593 {"$s1", RTYPE_GP | 17}, \
1594 {"$s2", RTYPE_GP | 18}, \
1595 {"$s3", RTYPE_GP | 19}, \
1596 {"$s4", RTYPE_GP | 20}, \
1597 {"$s5", RTYPE_GP | 21}, \
1598 {"$s6", RTYPE_GP | 22}, \
1599 {"$s7", RTYPE_GP | 23}, \
1600 {"$t8", RTYPE_GP | 24}, \
1601 {"$t9", RTYPE_GP | 25}, \
1602 {"$k0", RTYPE_GP | 26}, \
1603 {"$kt0", RTYPE_GP | 26}, \
1604 {"$k1", RTYPE_GP | 27}, \
1605 {"$kt1", RTYPE_GP | 27}, \
1606 {"$gp", RTYPE_GP | 28}, \
1607 {"$sp", RTYPE_GP | 29}, \
1608 {"$s8", RTYPE_GP | 30}, \
1609 {"$fp", RTYPE_GP | 30}, \
1610 {"$ra", RTYPE_GP | 31}
1612 #define MIPS16_SPECIAL_REGISTER_NAMES \
1613 {"$pc", RTYPE_PC | 0}
1615 #define MDMX_VECTOR_REGISTER_NAMES \
1616 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1617 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1618 {"$v2", RTYPE_VEC | 2}, \
1619 {"$v3", RTYPE_VEC | 3}, \
1620 {"$v4", RTYPE_VEC | 4}, \
1621 {"$v5", RTYPE_VEC | 5}, \
1622 {"$v6", RTYPE_VEC | 6}, \
1623 {"$v7", RTYPE_VEC | 7}, \
1624 {"$v8", RTYPE_VEC | 8}, \
1625 {"$v9", RTYPE_VEC | 9}, \
1626 {"$v10", RTYPE_VEC | 10}, \
1627 {"$v11", RTYPE_VEC | 11}, \
1628 {"$v12", RTYPE_VEC | 12}, \
1629 {"$v13", RTYPE_VEC | 13}, \
1630 {"$v14", RTYPE_VEC | 14}, \
1631 {"$v15", RTYPE_VEC | 15}, \
1632 {"$v16", RTYPE_VEC | 16}, \
1633 {"$v17", RTYPE_VEC | 17}, \
1634 {"$v18", RTYPE_VEC | 18}, \
1635 {"$v19", RTYPE_VEC | 19}, \
1636 {"$v20", RTYPE_VEC | 20}, \
1637 {"$v21", RTYPE_VEC | 21}, \
1638 {"$v22", RTYPE_VEC | 22}, \
1639 {"$v23", RTYPE_VEC | 23}, \
1640 {"$v24", RTYPE_VEC | 24}, \
1641 {"$v25", RTYPE_VEC | 25}, \
1642 {"$v26", RTYPE_VEC | 26}, \
1643 {"$v27", RTYPE_VEC | 27}, \
1644 {"$v28", RTYPE_VEC | 28}, \
1645 {"$v29", RTYPE_VEC | 29}, \
1646 {"$v30", RTYPE_VEC | 30}, \
1647 {"$v31", RTYPE_VEC | 31}
1649 #define MIPS_DSP_ACCUMULATOR_NAMES \
1650 {"$ac0", RTYPE_ACC | 0}, \
1651 {"$ac1", RTYPE_ACC | 1}, \
1652 {"$ac2", RTYPE_ACC | 2}, \
1653 {"$ac3", RTYPE_ACC | 3}
1655 static const struct regname reg_names
[] = {
1656 GENERIC_REGISTER_NUMBERS
,
1658 FPU_CONDITION_CODE_NAMES
,
1659 COPROC_CONDITION_CODE_NAMES
,
1661 /* The $txx registers depends on the abi,
1662 these will be added later into the symbol table from
1663 one of the tables below once mips_abi is set after
1664 parsing of arguments from the command line. */
1665 SYMBOLIC_REGISTER_NAMES
,
1667 MIPS16_SPECIAL_REGISTER_NAMES
,
1668 MDMX_VECTOR_REGISTER_NAMES
,
1669 MIPS_DSP_ACCUMULATOR_NAMES
,
1673 static const struct regname reg_names_o32
[] = {
1674 O32_SYMBOLIC_REGISTER_NAMES
,
1678 static const struct regname reg_names_n32n64
[] = {
1679 N32N64_SYMBOLIC_REGISTER_NAMES
,
1684 reg_lookup (char **s
, unsigned int types
, unsigned int *regnop
)
1691 /* Find end of name. */
1693 if (is_name_beginner (*e
))
1695 while (is_part_of_name (*e
))
1698 /* Terminate name. */
1702 /* Look for a register symbol. */
1703 if ((symbolP
= symbol_find (*s
)) && S_GET_SEGMENT (symbolP
) == reg_section
)
1705 int r
= S_GET_VALUE (symbolP
);
1707 reg
= r
& RNUM_MASK
;
1708 else if ((types
& RTYPE_VEC
) && (r
& ~1) == (RTYPE_GP
| 2))
1709 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1710 reg
= (r
& RNUM_MASK
) - 2;
1712 /* Else see if this is a register defined in an itbl entry. */
1713 else if ((types
& RTYPE_GP
) && itbl_have_entries
)
1720 if (itbl_get_reg_val (n
, &r
))
1721 reg
= r
& RNUM_MASK
;
1724 /* Advance to next token if a register was recognised. */
1727 else if (types
& RWARN
)
1728 as_warn ("Unrecognized register name `%s'", *s
);
1736 /* This function is called once, at assembler startup time. It should set up
1737 all the tables, etc. that the MD part of the assembler will need. */
1742 const char *retval
= NULL
;
1746 if (mips_pic
!= NO_PIC
)
1748 if (g_switch_seen
&& g_switch_value
!= 0)
1749 as_bad (_("-G may not be used in position-independent code"));
1753 if (! bfd_set_arch_mach (stdoutput
, bfd_arch_mips
, file_mips_arch
))
1754 as_warn (_("Could not set architecture and machine"));
1756 op_hash
= hash_new ();
1758 for (i
= 0; i
< NUMOPCODES
;)
1760 const char *name
= mips_opcodes
[i
].name
;
1762 retval
= hash_insert (op_hash
, name
, (void *) &mips_opcodes
[i
]);
1765 fprintf (stderr
, _("internal error: can't hash `%s': %s\n"),
1766 mips_opcodes
[i
].name
, retval
);
1767 /* Probably a memory allocation problem? Give up now. */
1768 as_fatal (_("Broken assembler. No assembly attempted."));
1772 if (mips_opcodes
[i
].pinfo
!= INSN_MACRO
)
1774 if (!validate_mips_insn (&mips_opcodes
[i
]))
1776 if (nop_insn
.insn_mo
== NULL
&& strcmp (name
, "nop") == 0)
1778 create_insn (&nop_insn
, mips_opcodes
+ i
);
1779 nop_insn
.fixed_p
= 1;
1784 while ((i
< NUMOPCODES
) && !strcmp (mips_opcodes
[i
].name
, name
));
1787 mips16_op_hash
= hash_new ();
1790 while (i
< bfd_mips16_num_opcodes
)
1792 const char *name
= mips16_opcodes
[i
].name
;
1794 retval
= hash_insert (mips16_op_hash
, name
, (void *) &mips16_opcodes
[i
]);
1796 as_fatal (_("internal: can't hash `%s': %s"),
1797 mips16_opcodes
[i
].name
, retval
);
1800 if (mips16_opcodes
[i
].pinfo
!= INSN_MACRO
1801 && ((mips16_opcodes
[i
].match
& mips16_opcodes
[i
].mask
)
1802 != mips16_opcodes
[i
].match
))
1804 fprintf (stderr
, _("internal error: bad mips16 opcode: %s %s\n"),
1805 mips16_opcodes
[i
].name
, mips16_opcodes
[i
].args
);
1808 if (mips16_nop_insn
.insn_mo
== NULL
&& strcmp (name
, "nop") == 0)
1810 create_insn (&mips16_nop_insn
, mips16_opcodes
+ i
);
1811 mips16_nop_insn
.fixed_p
= 1;
1815 while (i
< bfd_mips16_num_opcodes
1816 && strcmp (mips16_opcodes
[i
].name
, name
) == 0);
1820 as_fatal (_("Broken assembler. No assembly attempted."));
1822 /* We add all the general register names to the symbol table. This
1823 helps us detect invalid uses of them. */
1824 for (i
= 0; reg_names
[i
].name
; i
++)
1825 symbol_table_insert (symbol_new (reg_names
[i
].name
, reg_section
,
1826 reg_names
[i
].num
, // & RNUM_MASK,
1827 &zero_address_frag
));
1829 for (i
= 0; reg_names_n32n64
[i
].name
; i
++)
1830 symbol_table_insert (symbol_new (reg_names_n32n64
[i
].name
, reg_section
,
1831 reg_names_n32n64
[i
].num
, // & RNUM_MASK,
1832 &zero_address_frag
));
1834 for (i
= 0; reg_names_o32
[i
].name
; i
++)
1835 symbol_table_insert (symbol_new (reg_names_o32
[i
].name
, reg_section
,
1836 reg_names_o32
[i
].num
, // & RNUM_MASK,
1837 &zero_address_frag
));
1839 mips_no_prev_insn ();
1842 mips_cprmask
[0] = 0;
1843 mips_cprmask
[1] = 0;
1844 mips_cprmask
[2] = 0;
1845 mips_cprmask
[3] = 0;
1847 /* set the default alignment for the text section (2**2) */
1848 record_alignment (text_section
, 2);
1850 bfd_set_gp_size (stdoutput
, g_switch_value
);
1855 /* On a native system other than VxWorks, sections must be aligned
1856 to 16 byte boundaries. When configured for an embedded ELF
1857 target, we don't bother. */
1858 if (strcmp (TARGET_OS
, "elf") != 0
1859 && strcmp (TARGET_OS
, "vxworks") != 0)
1861 (void) bfd_set_section_alignment (stdoutput
, text_section
, 4);
1862 (void) bfd_set_section_alignment (stdoutput
, data_section
, 4);
1863 (void) bfd_set_section_alignment (stdoutput
, bss_section
, 4);
1866 /* Create a .reginfo section for register masks and a .mdebug
1867 section for debugging information. */
1875 subseg
= now_subseg
;
1877 /* The ABI says this section should be loaded so that the
1878 running program can access it. However, we don't load it
1879 if we are configured for an embedded target */
1880 flags
= SEC_READONLY
| SEC_DATA
;
1881 if (strcmp (TARGET_OS
, "elf") != 0)
1882 flags
|= SEC_ALLOC
| SEC_LOAD
;
1884 if (mips_abi
!= N64_ABI
)
1886 sec
= subseg_new (".reginfo", (subsegT
) 0);
1888 bfd_set_section_flags (stdoutput
, sec
, flags
);
1889 bfd_set_section_alignment (stdoutput
, sec
, HAVE_NEWABI
? 3 : 2);
1891 mips_regmask_frag
= frag_more (sizeof (Elf32_External_RegInfo
));
1895 /* The 64-bit ABI uses a .MIPS.options section rather than
1896 .reginfo section. */
1897 sec
= subseg_new (".MIPS.options", (subsegT
) 0);
1898 bfd_set_section_flags (stdoutput
, sec
, flags
);
1899 bfd_set_section_alignment (stdoutput
, sec
, 3);
1901 /* Set up the option header. */
1903 Elf_Internal_Options opthdr
;
1906 opthdr
.kind
= ODK_REGINFO
;
1907 opthdr
.size
= (sizeof (Elf_External_Options
)
1908 + sizeof (Elf64_External_RegInfo
));
1911 f
= frag_more (sizeof (Elf_External_Options
));
1912 bfd_mips_elf_swap_options_out (stdoutput
, &opthdr
,
1913 (Elf_External_Options
*) f
);
1915 mips_regmask_frag
= frag_more (sizeof (Elf64_External_RegInfo
));
1919 if (ECOFF_DEBUGGING
)
1921 sec
= subseg_new (".mdebug", (subsegT
) 0);
1922 (void) bfd_set_section_flags (stdoutput
, sec
,
1923 SEC_HAS_CONTENTS
| SEC_READONLY
);
1924 (void) bfd_set_section_alignment (stdoutput
, sec
, 2);
1926 else if (mips_flag_pdr
)
1928 pdr_seg
= subseg_new (".pdr", (subsegT
) 0);
1929 (void) bfd_set_section_flags (stdoutput
, pdr_seg
,
1930 SEC_READONLY
| SEC_RELOC
1932 (void) bfd_set_section_alignment (stdoutput
, pdr_seg
, 2);
1935 subseg_set (seg
, subseg
);
1938 #endif /* OBJ_ELF */
1940 if (! ECOFF_DEBUGGING
)
1943 if (mips_fix_vr4120
)
1944 init_vr4120_conflicts ();
1950 if (! ECOFF_DEBUGGING
)
1955 md_assemble (char *str
)
1957 struct mips_cl_insn insn
;
1958 bfd_reloc_code_real_type unused_reloc
[3]
1959 = {BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
};
1961 imm_expr
.X_op
= O_absent
;
1962 imm2_expr
.X_op
= O_absent
;
1963 offset_expr
.X_op
= O_absent
;
1964 imm_reloc
[0] = BFD_RELOC_UNUSED
;
1965 imm_reloc
[1] = BFD_RELOC_UNUSED
;
1966 imm_reloc
[2] = BFD_RELOC_UNUSED
;
1967 offset_reloc
[0] = BFD_RELOC_UNUSED
;
1968 offset_reloc
[1] = BFD_RELOC_UNUSED
;
1969 offset_reloc
[2] = BFD_RELOC_UNUSED
;
1971 if (mips_opts
.mips16
)
1972 mips16_ip (str
, &insn
);
1975 mips_ip (str
, &insn
);
1976 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1977 str
, insn
.insn_opcode
));
1982 as_bad ("%s `%s'", insn_error
, str
);
1986 if (insn
.insn_mo
->pinfo
== INSN_MACRO
)
1989 if (mips_opts
.mips16
)
1990 mips16_macro (&insn
);
1997 if (imm_expr
.X_op
!= O_absent
)
1998 append_insn (&insn
, &imm_expr
, imm_reloc
);
1999 else if (offset_expr
.X_op
!= O_absent
)
2000 append_insn (&insn
, &offset_expr
, offset_reloc
);
2002 append_insn (&insn
, NULL
, unused_reloc
);
2006 /* Return true if the given relocation might need a matching %lo().
2007 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2008 need a matching %lo() when applied to local symbols. */
2010 static inline bfd_boolean
2011 reloc_needs_lo_p (bfd_reloc_code_real_type reloc
)
2013 return (HAVE_IN_PLACE_ADDENDS
2014 && (reloc
== BFD_RELOC_HI16_S
2015 || reloc
== BFD_RELOC_MIPS16_HI16_S
2016 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2017 all GOT16 relocations evaluate to "G". */
2018 || (reloc
== BFD_RELOC_MIPS_GOT16
&& mips_pic
!= VXWORKS_PIC
)));
2021 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2024 static inline bfd_boolean
2025 fixup_has_matching_lo_p (fixS
*fixp
)
2027 return (fixp
->fx_next
!= NULL
2028 && (fixp
->fx_next
->fx_r_type
== BFD_RELOC_LO16
2029 || fixp
->fx_next
->fx_r_type
== BFD_RELOC_MIPS16_LO16
)
2030 && fixp
->fx_addsy
== fixp
->fx_next
->fx_addsy
2031 && fixp
->fx_offset
== fixp
->fx_next
->fx_offset
);
2034 /* See whether instruction IP reads register REG. CLASS is the type
2038 insn_uses_reg (const struct mips_cl_insn
*ip
, unsigned int reg
,
2039 enum mips_regclass
class)
2041 if (class == MIPS16_REG
)
2043 assert (mips_opts
.mips16
);
2044 reg
= mips16_to_32_reg_map
[reg
];
2045 class = MIPS_GR_REG
;
2048 /* Don't report on general register ZERO, since it never changes. */
2049 if (class == MIPS_GR_REG
&& reg
== ZERO
)
2052 if (class == MIPS_FP_REG
)
2054 assert (! mips_opts
.mips16
);
2055 /* If we are called with either $f0 or $f1, we must check $f0.
2056 This is not optimal, because it will introduce an unnecessary
2057 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2058 need to distinguish reading both $f0 and $f1 or just one of
2059 them. Note that we don't have to check the other way,
2060 because there is no instruction that sets both $f0 and $f1
2061 and requires a delay. */
2062 if ((ip
->insn_mo
->pinfo
& INSN_READ_FPR_S
)
2063 && ((EXTRACT_OPERAND (FS
, *ip
) & ~(unsigned) 1)
2064 == (reg
&~ (unsigned) 1)))
2066 if ((ip
->insn_mo
->pinfo
& INSN_READ_FPR_T
)
2067 && ((EXTRACT_OPERAND (FT
, *ip
) & ~(unsigned) 1)
2068 == (reg
&~ (unsigned) 1)))
2071 else if (! mips_opts
.mips16
)
2073 if ((ip
->insn_mo
->pinfo
& INSN_READ_GPR_S
)
2074 && EXTRACT_OPERAND (RS
, *ip
) == reg
)
2076 if ((ip
->insn_mo
->pinfo
& INSN_READ_GPR_T
)
2077 && EXTRACT_OPERAND (RT
, *ip
) == reg
)
2082 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_X
)
2083 && mips16_to_32_reg_map
[MIPS16_EXTRACT_OPERAND (RX
, *ip
)] == reg
)
2085 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_Y
)
2086 && mips16_to_32_reg_map
[MIPS16_EXTRACT_OPERAND (RY
, *ip
)] == reg
)
2088 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_Z
)
2089 && (mips16_to_32_reg_map
[MIPS16_EXTRACT_OPERAND (MOVE32Z
, *ip
)]
2092 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_T
) && reg
== TREG
)
2094 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_SP
) && reg
== SP
)
2096 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_31
) && reg
== RA
)
2098 if ((ip
->insn_mo
->pinfo
& MIPS16_INSN_READ_GPR_X
)
2099 && MIPS16_EXTRACT_OPERAND (REGR32
, *ip
) == reg
)
2106 /* This function returns true if modifying a register requires a
2110 reg_needs_delay (unsigned int reg
)
2112 unsigned long prev_pinfo
;
2114 prev_pinfo
= history
[0].insn_mo
->pinfo
;
2115 if (! mips_opts
.noreorder
2116 && (((prev_pinfo
& INSN_LOAD_MEMORY_DELAY
)
2117 && ! gpr_interlocks
)
2118 || ((prev_pinfo
& INSN_LOAD_COPROC_DELAY
)
2119 && ! cop_interlocks
)))
2121 /* A load from a coprocessor or from memory. All load delays
2122 delay the use of general register rt for one instruction. */
2123 /* Itbl support may require additional care here. */
2124 know (prev_pinfo
& INSN_WRITE_GPR_T
);
2125 if (reg
== EXTRACT_OPERAND (RT
, history
[0]))
2132 /* Move all labels in insn_labels to the current insertion point. */
2135 mips_move_labels (void)
2137 segment_info_type
*si
= seg_info (now_seg
);
2138 struct insn_label_list
*l
;
2141 for (l
= si
->label_list
; l
!= NULL
; l
= l
->next
)
2143 assert (S_GET_SEGMENT (l
->label
) == now_seg
);
2144 symbol_set_frag (l
->label
, frag_now
);
2145 val
= (valueT
) frag_now_fix ();
2146 /* mips16 text labels are stored as odd. */
2147 if (mips_opts
.mips16
)
2149 S_SET_VALUE (l
->label
, val
);
2154 s_is_linkonce (symbolS
*sym
, segT from_seg
)
2156 bfd_boolean linkonce
= FALSE
;
2157 segT symseg
= S_GET_SEGMENT (sym
);
2159 if (symseg
!= from_seg
&& !S_IS_LOCAL (sym
))
2161 if ((bfd_get_section_flags (stdoutput
, symseg
) & SEC_LINK_ONCE
))
2164 /* The GNU toolchain uses an extension for ELF: a section
2165 beginning with the magic string .gnu.linkonce is a
2166 linkonce section. */
2167 if (strncmp (segment_name (symseg
), ".gnu.linkonce",
2168 sizeof ".gnu.linkonce" - 1) == 0)
2175 /* Mark instruction labels in mips16 mode. This permits the linker to
2176 handle them specially, such as generating jalx instructions when
2177 needed. We also make them odd for the duration of the assembly, in
2178 order to generate the right sort of code. We will make them even
2179 in the adjust_symtab routine, while leaving them marked. This is
2180 convenient for the debugger and the disassembler. The linker knows
2181 to make them odd again. */
2184 mips16_mark_labels (void)
2186 segment_info_type
*si
= seg_info (now_seg
);
2187 struct insn_label_list
*l
;
2189 if (!mips_opts
.mips16
)
2192 for (l
= si
->label_list
; l
!= NULL
; l
= l
->next
)
2194 symbolS
*label
= l
->label
;
2196 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2198 S_SET_OTHER (label
, STO_MIPS16
);
2200 if ((S_GET_VALUE (label
) & 1) == 0
2201 /* Don't adjust the address if the label is global or weak, or
2202 in a link-once section, since we'll be emitting symbol reloc
2203 references to it which will be patched up by the linker, and
2204 the final value of the symbol may or may not be MIPS16. */
2205 && ! S_IS_WEAK (label
)
2206 && ! S_IS_EXTERNAL (label
)
2207 && ! s_is_linkonce (label
, now_seg
))
2208 S_SET_VALUE (label
, S_GET_VALUE (label
) | 1);
2212 /* End the current frag. Make it a variant frag and record the
2216 relax_close_frag (void)
2218 mips_macro_warning
.first_frag
= frag_now
;
2219 frag_var (rs_machine_dependent
, 0, 0,
2220 RELAX_ENCODE (mips_relax
.sizes
[0], mips_relax
.sizes
[1]),
2221 mips_relax
.symbol
, 0, (char *) mips_relax
.first_fixup
);
2223 memset (&mips_relax
.sizes
, 0, sizeof (mips_relax
.sizes
));
2224 mips_relax
.first_fixup
= 0;
2227 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2228 See the comment above RELAX_ENCODE for more details. */
2231 relax_start (symbolS
*symbol
)
2233 assert (mips_relax
.sequence
== 0);
2234 mips_relax
.sequence
= 1;
2235 mips_relax
.symbol
= symbol
;
2238 /* Start generating the second version of a relaxable sequence.
2239 See the comment above RELAX_ENCODE for more details. */
2244 assert (mips_relax
.sequence
== 1);
2245 mips_relax
.sequence
= 2;
2248 /* End the current relaxable sequence. */
2253 assert (mips_relax
.sequence
== 2);
2254 relax_close_frag ();
2255 mips_relax
.sequence
= 0;
2258 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2259 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2260 by VR4120 errata. */
2263 classify_vr4120_insn (const char *name
)
2265 if (strncmp (name
, "macc", 4) == 0)
2266 return FIX_VR4120_MACC
;
2267 if (strncmp (name
, "dmacc", 5) == 0)
2268 return FIX_VR4120_DMACC
;
2269 if (strncmp (name
, "mult", 4) == 0)
2270 return FIX_VR4120_MULT
;
2271 if (strncmp (name
, "dmult", 5) == 0)
2272 return FIX_VR4120_DMULT
;
2273 if (strstr (name
, "div"))
2274 return FIX_VR4120_DIV
;
2275 if (strcmp (name
, "mtlo") == 0 || strcmp (name
, "mthi") == 0)
2276 return FIX_VR4120_MTHILO
;
2277 return NUM_FIX_VR4120_CLASSES
;
2280 /* Return the number of instructions that must separate INSN1 and INSN2,
2281 where INSN1 is the earlier instruction. Return the worst-case value
2282 for any INSN2 if INSN2 is null. */
2285 insns_between (const struct mips_cl_insn
*insn1
,
2286 const struct mips_cl_insn
*insn2
)
2288 unsigned long pinfo1
, pinfo2
;
2290 /* This function needs to know which pinfo flags are set for INSN2
2291 and which registers INSN2 uses. The former is stored in PINFO2 and
2292 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2293 will have every flag set and INSN2_USES_REG will always return true. */
2294 pinfo1
= insn1
->insn_mo
->pinfo
;
2295 pinfo2
= insn2
? insn2
->insn_mo
->pinfo
: ~0U;
2297 #define INSN2_USES_REG(REG, CLASS) \
2298 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2300 /* For most targets, write-after-read dependencies on the HI and LO
2301 registers must be separated by at least two instructions. */
2302 if (!hilo_interlocks
)
2304 if ((pinfo1
& INSN_READ_LO
) && (pinfo2
& INSN_WRITE_LO
))
2306 if ((pinfo1
& INSN_READ_HI
) && (pinfo2
& INSN_WRITE_HI
))
2310 /* If we're working around r7000 errata, there must be two instructions
2311 between an mfhi or mflo and any instruction that uses the result. */
2312 if (mips_7000_hilo_fix
2313 && MF_HILO_INSN (pinfo1
)
2314 && INSN2_USES_REG (EXTRACT_OPERAND (RD
, *insn1
), MIPS_GR_REG
))
2317 /* If working around VR4120 errata, check for combinations that need
2318 a single intervening instruction. */
2319 if (mips_fix_vr4120
)
2321 unsigned int class1
, class2
;
2323 class1
= classify_vr4120_insn (insn1
->insn_mo
->name
);
2324 if (class1
!= NUM_FIX_VR4120_CLASSES
&& vr4120_conflicts
[class1
] != 0)
2328 class2
= classify_vr4120_insn (insn2
->insn_mo
->name
);
2329 if (vr4120_conflicts
[class1
] & (1 << class2
))
2334 if (!mips_opts
.mips16
)
2336 /* Check for GPR or coprocessor load delays. All such delays
2337 are on the RT register. */
2338 /* Itbl support may require additional care here. */
2339 if ((!gpr_interlocks
&& (pinfo1
& INSN_LOAD_MEMORY_DELAY
))
2340 || (!cop_interlocks
&& (pinfo1
& INSN_LOAD_COPROC_DELAY
)))
2342 know (pinfo1
& INSN_WRITE_GPR_T
);
2343 if (INSN2_USES_REG (EXTRACT_OPERAND (RT
, *insn1
), MIPS_GR_REG
))
2347 /* Check for generic coprocessor hazards.
2349 This case is not handled very well. There is no special
2350 knowledge of CP0 handling, and the coprocessors other than
2351 the floating point unit are not distinguished at all. */
2352 /* Itbl support may require additional care here. FIXME!
2353 Need to modify this to include knowledge about
2354 user specified delays! */
2355 else if ((!cop_interlocks
&& (pinfo1
& INSN_COPROC_MOVE_DELAY
))
2356 || (!cop_mem_interlocks
&& (pinfo1
& INSN_COPROC_MEMORY_DELAY
)))
2358 /* Handle cases where INSN1 writes to a known general coprocessor
2359 register. There must be a one instruction delay before INSN2
2360 if INSN2 reads that register, otherwise no delay is needed. */
2361 if (pinfo1
& INSN_WRITE_FPR_T
)
2363 if (INSN2_USES_REG (EXTRACT_OPERAND (FT
, *insn1
), MIPS_FP_REG
))
2366 else if (pinfo1
& INSN_WRITE_FPR_S
)
2368 if (INSN2_USES_REG (EXTRACT_OPERAND (FS
, *insn1
), MIPS_FP_REG
))
2373 /* Read-after-write dependencies on the control registers
2374 require a two-instruction gap. */
2375 if ((pinfo1
& INSN_WRITE_COND_CODE
)
2376 && (pinfo2
& INSN_READ_COND_CODE
))
2379 /* We don't know exactly what INSN1 does. If INSN2 is
2380 also a coprocessor instruction, assume there must be
2381 a one instruction gap. */
2382 if (pinfo2
& INSN_COP
)
2387 /* Check for read-after-write dependencies on the coprocessor
2388 control registers in cases where INSN1 does not need a general
2389 coprocessor delay. This means that INSN1 is a floating point
2390 comparison instruction. */
2391 /* Itbl support may require additional care here. */
2392 else if (!cop_interlocks
2393 && (pinfo1
& INSN_WRITE_COND_CODE
)
2394 && (pinfo2
& INSN_READ_COND_CODE
))
2398 #undef INSN2_USES_REG
2403 /* Return the number of nops that would be needed to work around the
2404 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2405 the MAX_VR4130_NOPS instructions described by HISTORY. */
2408 nops_for_vr4130 (const struct mips_cl_insn
*history
,
2409 const struct mips_cl_insn
*insn
)
2413 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2414 are not affected by the errata. */
2416 && ((insn
->insn_mo
->pinfo
& (INSN_WRITE_HI
| INSN_WRITE_LO
)) == 0
2417 || strcmp (insn
->insn_mo
->name
, "mtlo") == 0
2418 || strcmp (insn
->insn_mo
->name
, "mthi") == 0))
2421 /* Search for the first MFLO or MFHI. */
2422 for (i
= 0; i
< MAX_VR4130_NOPS
; i
++)
2423 if (!history
[i
].noreorder_p
&& MF_HILO_INSN (history
[i
].insn_mo
->pinfo
))
2425 /* Extract the destination register. */
2426 if (mips_opts
.mips16
)
2427 reg
= mips16_to_32_reg_map
[MIPS16_EXTRACT_OPERAND (RX
, history
[i
])];
2429 reg
= EXTRACT_OPERAND (RD
, history
[i
]);
2431 /* No nops are needed if INSN reads that register. */
2432 if (insn
!= NULL
&& insn_uses_reg (insn
, reg
, MIPS_GR_REG
))
2435 /* ...or if any of the intervening instructions do. */
2436 for (j
= 0; j
< i
; j
++)
2437 if (insn_uses_reg (&history
[j
], reg
, MIPS_GR_REG
))
2440 return MAX_VR4130_NOPS
- i
;
2445 /* Return the number of nops that would be needed if instruction INSN
2446 immediately followed the MAX_NOPS instructions given by HISTORY,
2447 where HISTORY[0] is the most recent instruction. If INSN is null,
2448 return the worse-case number of nops for any instruction. */
2451 nops_for_insn (const struct mips_cl_insn
*history
,
2452 const struct mips_cl_insn
*insn
)
2454 int i
, nops
, tmp_nops
;
2457 for (i
= 0; i
< MAX_DELAY_NOPS
; i
++)
2458 if (!history
[i
].noreorder_p
)
2460 tmp_nops
= insns_between (history
+ i
, insn
) - i
;
2461 if (tmp_nops
> nops
)
2465 if (mips_fix_vr4130
)
2467 tmp_nops
= nops_for_vr4130 (history
, insn
);
2468 if (tmp_nops
> nops
)
2475 /* The variable arguments provide NUM_INSNS extra instructions that
2476 might be added to HISTORY. Return the largest number of nops that
2477 would be needed after the extended sequence. */
2480 nops_for_sequence (int num_insns
, const struct mips_cl_insn
*history
, ...)
2483 struct mips_cl_insn buffer
[MAX_NOPS
];
2484 struct mips_cl_insn
*cursor
;
2487 va_start (args
, history
);
2488 cursor
= buffer
+ num_insns
;
2489 memcpy (cursor
, history
, (MAX_NOPS
- num_insns
) * sizeof (*cursor
));
2490 while (cursor
> buffer
)
2491 *--cursor
= *va_arg (args
, const struct mips_cl_insn
*);
2493 nops
= nops_for_insn (buffer
, NULL
);
2498 /* Like nops_for_insn, but if INSN is a branch, take into account the
2499 worst-case delay for the branch target. */
2502 nops_for_insn_or_target (const struct mips_cl_insn
*history
,
2503 const struct mips_cl_insn
*insn
)
2507 nops
= nops_for_insn (history
, insn
);
2508 if (insn
->insn_mo
->pinfo
& (INSN_UNCOND_BRANCH_DELAY
2509 | INSN_COND_BRANCH_DELAY
2510 | INSN_COND_BRANCH_LIKELY
))
2512 tmp_nops
= nops_for_sequence (2, history
, insn
, NOP_INSN
);
2513 if (tmp_nops
> nops
)
2516 else if (mips_opts
.mips16
&& (insn
->insn_mo
->pinfo
& MIPS16_INSN_BRANCH
))
2518 tmp_nops
= nops_for_sequence (1, history
, insn
);
2519 if (tmp_nops
> nops
)
2525 /* Output an instruction. IP is the instruction information.
2526 ADDRESS_EXPR is an operand of the instruction to be used with
2530 append_insn (struct mips_cl_insn
*ip
, expressionS
*address_expr
,
2531 bfd_reloc_code_real_type
*reloc_type
)
2533 unsigned long prev_pinfo
, pinfo
;
2534 relax_stateT prev_insn_frag_type
= 0;
2535 bfd_boolean relaxed_branch
= FALSE
;
2536 segment_info_type
*si
= seg_info (now_seg
);
2538 /* Mark instruction labels in mips16 mode. */
2539 mips16_mark_labels ();
2541 prev_pinfo
= history
[0].insn_mo
->pinfo
;
2542 pinfo
= ip
->insn_mo
->pinfo
;
2544 if (mips_relax
.sequence
!= 2 && !mips_opts
.noreorder
)
2546 /* There are a lot of optimizations we could do that we don't.
2547 In particular, we do not, in general, reorder instructions.
2548 If you use gcc with optimization, it will reorder
2549 instructions and generally do much more optimization then we
2550 do here; repeating all that work in the assembler would only
2551 benefit hand written assembly code, and does not seem worth
2553 int nops
= (mips_optimize
== 0
2554 ? nops_for_insn (history
, NULL
)
2555 : nops_for_insn_or_target (history
, ip
));
2559 unsigned long old_frag_offset
;
2562 old_frag
= frag_now
;
2563 old_frag_offset
= frag_now_fix ();
2565 for (i
= 0; i
< nops
; i
++)
2570 listing_prev_line ();
2571 /* We may be at the start of a variant frag. In case we
2572 are, make sure there is enough space for the frag
2573 after the frags created by listing_prev_line. The
2574 argument to frag_grow here must be at least as large
2575 as the argument to all other calls to frag_grow in
2576 this file. We don't have to worry about being in the
2577 middle of a variant frag, because the variants insert
2578 all needed nop instructions themselves. */
2582 mips_move_labels ();
2584 #ifndef NO_ECOFF_DEBUGGING
2585 if (ECOFF_DEBUGGING
)
2586 ecoff_fix_loc (old_frag
, old_frag_offset
);
2590 else if (mips_relax
.sequence
!= 2 && prev_nop_frag
!= NULL
)
2592 /* Work out how many nops in prev_nop_frag are needed by IP. */
2593 int nops
= nops_for_insn_or_target (history
, ip
);
2594 assert (nops
<= prev_nop_frag_holds
);
2596 /* Enforce NOPS as a minimum. */
2597 if (nops
> prev_nop_frag_required
)
2598 prev_nop_frag_required
= nops
;
2600 if (prev_nop_frag_holds
== prev_nop_frag_required
)
2602 /* Settle for the current number of nops. Update the history
2603 accordingly (for the benefit of any future .set reorder code). */
2604 prev_nop_frag
= NULL
;
2605 insert_into_history (prev_nop_frag_since
,
2606 prev_nop_frag_holds
, NOP_INSN
);
2610 /* Allow this instruction to replace one of the nops that was
2611 tentatively added to prev_nop_frag. */
2612 prev_nop_frag
->fr_fix
-= mips_opts
.mips16
? 2 : 4;
2613 prev_nop_frag_holds
--;
2614 prev_nop_frag_since
++;
2619 /* The value passed to dwarf2_emit_insn is the distance between
2620 the beginning of the current instruction and the address that
2621 should be recorded in the debug tables. For MIPS16 debug info
2622 we want to use ISA-encoded addresses, so we pass -1 for an
2623 address higher by one than the current. */
2624 dwarf2_emit_insn (mips_opts
.mips16
? -1 : 0);
2627 /* Record the frag type before frag_var. */
2628 if (history
[0].frag
)
2629 prev_insn_frag_type
= history
[0].frag
->fr_type
;
2632 && *reloc_type
== BFD_RELOC_16_PCREL_S2
2633 && (pinfo
& INSN_UNCOND_BRANCH_DELAY
|| pinfo
& INSN_COND_BRANCH_DELAY
2634 || pinfo
& INSN_COND_BRANCH_LIKELY
)
2635 && mips_relax_branch
2636 /* Don't try branch relaxation within .set nomacro, or within
2637 .set noat if we use $at for PIC computations. If it turns
2638 out that the branch was out-of-range, we'll get an error. */
2639 && !mips_opts
.warn_about_macros
2640 && !(mips_opts
.noat
&& mips_pic
!= NO_PIC
)
2641 && !mips_opts
.mips16
)
2643 relaxed_branch
= TRUE
;
2644 add_relaxed_insn (ip
, (relaxed_branch_length
2646 (pinfo
& INSN_UNCOND_BRANCH_DELAY
) ? -1
2647 : (pinfo
& INSN_COND_BRANCH_LIKELY
) ? 1
2650 (pinfo
& INSN_UNCOND_BRANCH_DELAY
,
2651 pinfo
& INSN_COND_BRANCH_LIKELY
,
2652 pinfo
& INSN_WRITE_GPR_31
,
2654 address_expr
->X_add_symbol
,
2655 address_expr
->X_add_number
);
2656 *reloc_type
= BFD_RELOC_UNUSED
;
2658 else if (*reloc_type
> BFD_RELOC_UNUSED
)
2660 /* We need to set up a variant frag. */
2661 assert (mips_opts
.mips16
&& address_expr
!= NULL
);
2662 add_relaxed_insn (ip
, 4, 0,
2664 (*reloc_type
- BFD_RELOC_UNUSED
,
2665 mips16_small
, mips16_ext
,
2666 prev_pinfo
& INSN_UNCOND_BRANCH_DELAY
,
2667 history
[0].mips16_absolute_jump_p
),
2668 make_expr_symbol (address_expr
), 0);
2670 else if (mips_opts
.mips16
2672 && *reloc_type
!= BFD_RELOC_MIPS16_JMP
)
2674 if ((pinfo
& INSN_UNCOND_BRANCH_DELAY
) == 0)
2675 /* Make sure there is enough room to swap this instruction with
2676 a following jump instruction. */
2678 add_fixed_insn (ip
);
2682 if (mips_opts
.mips16
2683 && mips_opts
.noreorder
2684 && (prev_pinfo
& INSN_UNCOND_BRANCH_DELAY
) != 0)
2685 as_warn (_("extended instruction in delay slot"));
2687 if (mips_relax
.sequence
)
2689 /* If we've reached the end of this frag, turn it into a variant
2690 frag and record the information for the instructions we've
2692 if (frag_room () < 4)
2693 relax_close_frag ();
2694 mips_relax
.sizes
[mips_relax
.sequence
- 1] += 4;
2697 if (mips_relax
.sequence
!= 2)
2698 mips_macro_warning
.sizes
[0] += 4;
2699 if (mips_relax
.sequence
!= 1)
2700 mips_macro_warning
.sizes
[1] += 4;
2702 if (mips_opts
.mips16
)
2705 ip
->mips16_absolute_jump_p
= (*reloc_type
== BFD_RELOC_MIPS16_JMP
);
2707 add_fixed_insn (ip
);
2710 if (address_expr
!= NULL
&& *reloc_type
<= BFD_RELOC_UNUSED
)
2712 if (address_expr
->X_op
== O_constant
)
2716 switch (*reloc_type
)
2719 ip
->insn_opcode
|= address_expr
->X_add_number
;
2722 case BFD_RELOC_MIPS_HIGHEST
:
2723 tmp
= (address_expr
->X_add_number
+ 0x800080008000ull
) >> 48;
2724 ip
->insn_opcode
|= tmp
& 0xffff;
2727 case BFD_RELOC_MIPS_HIGHER
:
2728 tmp
= (address_expr
->X_add_number
+ 0x80008000ull
) >> 32;
2729 ip
->insn_opcode
|= tmp
& 0xffff;
2732 case BFD_RELOC_HI16_S
:
2733 tmp
= (address_expr
->X_add_number
+ 0x8000) >> 16;
2734 ip
->insn_opcode
|= tmp
& 0xffff;
2737 case BFD_RELOC_HI16
:
2738 ip
->insn_opcode
|= (address_expr
->X_add_number
>> 16) & 0xffff;
2741 case BFD_RELOC_UNUSED
:
2742 case BFD_RELOC_LO16
:
2743 case BFD_RELOC_MIPS_GOT_DISP
:
2744 ip
->insn_opcode
|= address_expr
->X_add_number
& 0xffff;
2747 case BFD_RELOC_MIPS_JMP
:
2748 if ((address_expr
->X_add_number
& 3) != 0)
2749 as_bad (_("jump to misaligned address (0x%lx)"),
2750 (unsigned long) address_expr
->X_add_number
);
2751 ip
->insn_opcode
|= (address_expr
->X_add_number
>> 2) & 0x3ffffff;
2754 case BFD_RELOC_MIPS16_JMP
:
2755 if ((address_expr
->X_add_number
& 3) != 0)
2756 as_bad (_("jump to misaligned address (0x%lx)"),
2757 (unsigned long) address_expr
->X_add_number
);
2759 (((address_expr
->X_add_number
& 0x7c0000) << 3)
2760 | ((address_expr
->X_add_number
& 0xf800000) >> 7)
2761 | ((address_expr
->X_add_number
& 0x3fffc) >> 2));
2764 case BFD_RELOC_16_PCREL_S2
:
2765 if ((address_expr
->X_add_number
& 3) != 0)
2766 as_bad (_("branch to misaligned address (0x%lx)"),
2767 (unsigned long) address_expr
->X_add_number
);
2768 if (mips_relax_branch
)
2770 if ((address_expr
->X_add_number
+ 0x20000) & ~0x3ffff)
2771 as_bad (_("branch address range overflow (0x%lx)"),
2772 (unsigned long) address_expr
->X_add_number
);
2773 ip
->insn_opcode
|= (address_expr
->X_add_number
>> 2) & 0xffff;
2780 else if (*reloc_type
< BFD_RELOC_UNUSED
)
2783 reloc_howto_type
*howto
;
2786 /* In a compound relocation, it is the final (outermost)
2787 operator that determines the relocated field. */
2788 for (i
= 1; i
< 3; i
++)
2789 if (reloc_type
[i
] == BFD_RELOC_UNUSED
)
2792 howto
= bfd_reloc_type_lookup (stdoutput
, reloc_type
[i
- 1]);
2793 ip
->fixp
[0] = fix_new_exp (ip
->frag
, ip
->where
,
2794 bfd_get_reloc_size (howto
),
2796 reloc_type
[0] == BFD_RELOC_16_PCREL_S2
,
2799 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
2800 if (reloc_type
[0] == BFD_RELOC_MIPS16_JMP
2801 && ip
->fixp
[0]->fx_addsy
)
2802 *symbol_get_tc (ip
->fixp
[0]->fx_addsy
) = 1;
2804 /* These relocations can have an addend that won't fit in
2805 4 octets for 64bit assembly. */
2807 && ! howto
->partial_inplace
2808 && (reloc_type
[0] == BFD_RELOC_16
2809 || reloc_type
[0] == BFD_RELOC_32
2810 || reloc_type
[0] == BFD_RELOC_MIPS_JMP
2811 || reloc_type
[0] == BFD_RELOC_HI16_S
2812 || reloc_type
[0] == BFD_RELOC_LO16
2813 || reloc_type
[0] == BFD_RELOC_GPREL16
2814 || reloc_type
[0] == BFD_RELOC_MIPS_LITERAL
2815 || reloc_type
[0] == BFD_RELOC_GPREL32
2816 || reloc_type
[0] == BFD_RELOC_64
2817 || reloc_type
[0] == BFD_RELOC_CTOR
2818 || reloc_type
[0] == BFD_RELOC_MIPS_SUB
2819 || reloc_type
[0] == BFD_RELOC_MIPS_HIGHEST
2820 || reloc_type
[0] == BFD_RELOC_MIPS_HIGHER
2821 || reloc_type
[0] == BFD_RELOC_MIPS_SCN_DISP
2822 || reloc_type
[0] == BFD_RELOC_MIPS_REL16
2823 || reloc_type
[0] == BFD_RELOC_MIPS_RELGOT
2824 || reloc_type
[0] == BFD_RELOC_MIPS16_GPREL
2825 || reloc_type
[0] == BFD_RELOC_MIPS16_HI16_S
2826 || reloc_type
[0] == BFD_RELOC_MIPS16_LO16
))
2827 ip
->fixp
[0]->fx_no_overflow
= 1;
2829 if (mips_relax
.sequence
)
2831 if (mips_relax
.first_fixup
== 0)
2832 mips_relax
.first_fixup
= ip
->fixp
[0];
2834 else if (reloc_needs_lo_p (*reloc_type
))
2836 struct mips_hi_fixup
*hi_fixup
;
2838 /* Reuse the last entry if it already has a matching %lo. */
2839 hi_fixup
= mips_hi_fixup_list
;
2841 || !fixup_has_matching_lo_p (hi_fixup
->fixp
))
2843 hi_fixup
= ((struct mips_hi_fixup
*)
2844 xmalloc (sizeof (struct mips_hi_fixup
)));
2845 hi_fixup
->next
= mips_hi_fixup_list
;
2846 mips_hi_fixup_list
= hi_fixup
;
2848 hi_fixup
->fixp
= ip
->fixp
[0];
2849 hi_fixup
->seg
= now_seg
;
2852 /* Add fixups for the second and third relocations, if given.
2853 Note that the ABI allows the second relocation to be
2854 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
2855 moment we only use RSS_UNDEF, but we could add support
2856 for the others if it ever becomes necessary. */
2857 for (i
= 1; i
< 3; i
++)
2858 if (reloc_type
[i
] != BFD_RELOC_UNUSED
)
2860 ip
->fixp
[i
] = fix_new (ip
->frag
, ip
->where
,
2861 ip
->fixp
[0]->fx_size
, NULL
, 0,
2862 FALSE
, reloc_type
[i
]);
2864 /* Use fx_tcbit to mark compound relocs. */
2865 ip
->fixp
[0]->fx_tcbit
= 1;
2866 ip
->fixp
[i
]->fx_tcbit
= 1;
2872 /* Update the register mask information. */
2873 if (! mips_opts
.mips16
)
2875 if (pinfo
& INSN_WRITE_GPR_D
)
2876 mips_gprmask
|= 1 << EXTRACT_OPERAND (RD
, *ip
);
2877 if ((pinfo
& (INSN_WRITE_GPR_T
| INSN_READ_GPR_T
)) != 0)
2878 mips_gprmask
|= 1 << EXTRACT_OPERAND (RT
, *ip
);
2879 if (pinfo
& INSN_READ_GPR_S
)
2880 mips_gprmask
|= 1 << EXTRACT_OPERAND (RS
, *ip
);
2881 if (pinfo
& INSN_WRITE_GPR_31
)
2882 mips_gprmask
|= 1 << RA
;
2883 if (pinfo
& INSN_WRITE_FPR_D
)
2884 mips_cprmask
[1] |= 1 << EXTRACT_OPERAND (FD
, *ip
);
2885 if ((pinfo
& (INSN_WRITE_FPR_S
| INSN_READ_FPR_S
)) != 0)
2886 mips_cprmask
[1] |= 1 << EXTRACT_OPERAND (FS
, *ip
);
2887 if ((pinfo
& (INSN_WRITE_FPR_T
| INSN_READ_FPR_T
)) != 0)
2888 mips_cprmask
[1] |= 1 << EXTRACT_OPERAND (FT
, *ip
);
2889 if ((pinfo
& INSN_READ_FPR_R
) != 0)
2890 mips_cprmask
[1] |= 1 << EXTRACT_OPERAND (FR
, *ip
);
2891 if (pinfo
& INSN_COP
)
2893 /* We don't keep enough information to sort these cases out.
2894 The itbl support does keep this information however, although
2895 we currently don't support itbl fprmats as part of the cop
2896 instruction. May want to add this support in the future. */
2898 /* Never set the bit for $0, which is always zero. */
2899 mips_gprmask
&= ~1 << 0;
2903 if (pinfo
& (MIPS16_INSN_WRITE_X
| MIPS16_INSN_READ_X
))
2904 mips_gprmask
|= 1 << MIPS16_EXTRACT_OPERAND (RX
, *ip
);
2905 if (pinfo
& (MIPS16_INSN_WRITE_Y
| MIPS16_INSN_READ_Y
))
2906 mips_gprmask
|= 1 << MIPS16_EXTRACT_OPERAND (RY
, *ip
);
2907 if (pinfo
& MIPS16_INSN_WRITE_Z
)
2908 mips_gprmask
|= 1 << MIPS16_EXTRACT_OPERAND (RZ
, *ip
);
2909 if (pinfo
& (MIPS16_INSN_WRITE_T
| MIPS16_INSN_READ_T
))
2910 mips_gprmask
|= 1 << TREG
;
2911 if (pinfo
& (MIPS16_INSN_WRITE_SP
| MIPS16_INSN_READ_SP
))
2912 mips_gprmask
|= 1 << SP
;
2913 if (pinfo
& (MIPS16_INSN_WRITE_31
| MIPS16_INSN_READ_31
))
2914 mips_gprmask
|= 1 << RA
;
2915 if (pinfo
& MIPS16_INSN_WRITE_GPR_Y
)
2916 mips_gprmask
|= 1 << MIPS16OP_EXTRACT_REG32R (ip
->insn_opcode
);
2917 if (pinfo
& MIPS16_INSN_READ_Z
)
2918 mips_gprmask
|= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z
, *ip
);
2919 if (pinfo
& MIPS16_INSN_READ_GPR_X
)
2920 mips_gprmask
|= 1 << MIPS16_EXTRACT_OPERAND (REGR32
, *ip
);
2923 if (mips_relax
.sequence
!= 2 && !mips_opts
.noreorder
)
2925 /* Filling the branch delay slot is more complex. We try to
2926 switch the branch with the previous instruction, which we can
2927 do if the previous instruction does not set up a condition
2928 that the branch tests and if the branch is not itself the
2929 target of any branch. */
2930 if ((pinfo
& INSN_UNCOND_BRANCH_DELAY
)
2931 || (pinfo
& INSN_COND_BRANCH_DELAY
))
2933 if (mips_optimize
< 2
2934 /* If we have seen .set volatile or .set nomove, don't
2936 || mips_opts
.nomove
!= 0
2937 /* We can't swap if the previous instruction's position
2939 || history
[0].fixed_p
2940 /* If the previous previous insn was in a .set
2941 noreorder, we can't swap. Actually, the MIPS
2942 assembler will swap in this situation. However, gcc
2943 configured -with-gnu-as will generate code like
2949 in which we can not swap the bne and INSN. If gcc is
2950 not configured -with-gnu-as, it does not output the
2952 || history
[1].noreorder_p
2953 /* If the branch is itself the target of a branch, we
2954 can not swap. We cheat on this; all we check for is
2955 whether there is a label on this instruction. If
2956 there are any branches to anything other than a
2957 label, users must use .set noreorder. */
2958 || si
->label_list
!= NULL
2959 /* If the previous instruction is in a variant frag
2960 other than this branch's one, we cannot do the swap.
2961 This does not apply to the mips16, which uses variant
2962 frags for different purposes. */
2963 || (! mips_opts
.mips16
2964 && prev_insn_frag_type
== rs_machine_dependent
)
2965 /* Check for conflicts between the branch and the instructions
2966 before the candidate delay slot. */
2967 || nops_for_insn (history
+ 1, ip
) > 0
2968 /* Check for conflicts between the swapped sequence and the
2969 target of the branch. */
2970 || nops_for_sequence (2, history
+ 1, ip
, history
) > 0
2971 /* We do not swap with a trap instruction, since it
2972 complicates trap handlers to have the trap
2973 instruction be in a delay slot. */
2974 || (prev_pinfo
& INSN_TRAP
)
2975 /* If the branch reads a register that the previous
2976 instruction sets, we can not swap. */
2977 || (! mips_opts
.mips16
2978 && (prev_pinfo
& INSN_WRITE_GPR_T
)
2979 && insn_uses_reg (ip
, EXTRACT_OPERAND (RT
, history
[0]),
2981 || (! mips_opts
.mips16
2982 && (prev_pinfo
& INSN_WRITE_GPR_D
)
2983 && insn_uses_reg (ip
, EXTRACT_OPERAND (RD
, history
[0]),
2985 || (mips_opts
.mips16
2986 && (((prev_pinfo
& MIPS16_INSN_WRITE_X
)
2988 (ip
, MIPS16_EXTRACT_OPERAND (RX
, history
[0]),
2990 || ((prev_pinfo
& MIPS16_INSN_WRITE_Y
)
2992 (ip
, MIPS16_EXTRACT_OPERAND (RY
, history
[0]),
2994 || ((prev_pinfo
& MIPS16_INSN_WRITE_Z
)
2996 (ip
, MIPS16_EXTRACT_OPERAND (RZ
, history
[0]),
2998 || ((prev_pinfo
& MIPS16_INSN_WRITE_T
)
2999 && insn_uses_reg (ip
, TREG
, MIPS_GR_REG
))
3000 || ((prev_pinfo
& MIPS16_INSN_WRITE_31
)
3001 && insn_uses_reg (ip
, RA
, MIPS_GR_REG
))
3002 || ((prev_pinfo
& MIPS16_INSN_WRITE_GPR_Y
)
3003 && insn_uses_reg (ip
,
3004 MIPS16OP_EXTRACT_REG32R
3005 (history
[0].insn_opcode
),
3007 /* If the branch writes a register that the previous
3008 instruction sets, we can not swap (we know that
3009 branches write only to RD or to $31). */
3010 || (! mips_opts
.mips16
3011 && (prev_pinfo
& INSN_WRITE_GPR_T
)
3012 && (((pinfo
& INSN_WRITE_GPR_D
)
3013 && (EXTRACT_OPERAND (RT
, history
[0])
3014 == EXTRACT_OPERAND (RD
, *ip
)))
3015 || ((pinfo
& INSN_WRITE_GPR_31
)
3016 && EXTRACT_OPERAND (RT
, history
[0]) == RA
)))
3017 || (! mips_opts
.mips16
3018 && (prev_pinfo
& INSN_WRITE_GPR_D
)
3019 && (((pinfo
& INSN_WRITE_GPR_D
)
3020 && (EXTRACT_OPERAND (RD
, history
[0])
3021 == EXTRACT_OPERAND (RD
, *ip
)))
3022 || ((pinfo
& INSN_WRITE_GPR_31
)
3023 && EXTRACT_OPERAND (RD
, history
[0]) == RA
)))
3024 || (mips_opts
.mips16
3025 && (pinfo
& MIPS16_INSN_WRITE_31
)
3026 && ((prev_pinfo
& MIPS16_INSN_WRITE_31
)
3027 || ((prev_pinfo
& MIPS16_INSN_WRITE_GPR_Y
)
3028 && (MIPS16OP_EXTRACT_REG32R (history
[0].insn_opcode
)
3030 /* If the branch writes a register that the previous
3031 instruction reads, we can not swap (we know that
3032 branches only write to RD or to $31). */
3033 || (! mips_opts
.mips16
3034 && (pinfo
& INSN_WRITE_GPR_D
)
3035 && insn_uses_reg (&history
[0],
3036 EXTRACT_OPERAND (RD
, *ip
),
3038 || (! mips_opts
.mips16
3039 && (pinfo
& INSN_WRITE_GPR_31
)
3040 && insn_uses_reg (&history
[0], RA
, MIPS_GR_REG
))
3041 || (mips_opts
.mips16
3042 && (pinfo
& MIPS16_INSN_WRITE_31
)
3043 && insn_uses_reg (&history
[0], RA
, MIPS_GR_REG
))
3044 /* If one instruction sets a condition code and the
3045 other one uses a condition code, we can not swap. */
3046 || ((pinfo
& INSN_READ_COND_CODE
)
3047 && (prev_pinfo
& INSN_WRITE_COND_CODE
))
3048 || ((pinfo
& INSN_WRITE_COND_CODE
)
3049 && (prev_pinfo
& INSN_READ_COND_CODE
))
3050 /* If the previous instruction uses the PC, we can not
3052 || (mips_opts
.mips16
3053 && (prev_pinfo
& MIPS16_INSN_READ_PC
))
3054 /* If the previous instruction had a fixup in mips16
3055 mode, we can not swap. This normally means that the
3056 previous instruction was a 4 byte branch anyhow. */
3057 || (mips_opts
.mips16
&& history
[0].fixp
[0])
3058 /* If the previous instruction is a sync, sync.l, or
3059 sync.p, we can not swap. */
3060 || (prev_pinfo
& INSN_SYNC
))
3062 if (mips_opts
.mips16
3063 && (pinfo
& INSN_UNCOND_BRANCH_DELAY
)
3064 && (pinfo
& (MIPS16_INSN_READ_X
| MIPS16_INSN_READ_31
))
3065 && ISA_SUPPORTS_MIPS16E
)
3067 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3068 ip
->insn_opcode
|= 0x0080;
3070 insert_into_history (0, 1, ip
);
3074 /* We could do even better for unconditional branches to
3075 portions of this object file; we could pick up the
3076 instruction at the destination, put it in the delay
3077 slot, and bump the destination address. */
3078 insert_into_history (0, 1, ip
);
3082 if (mips_relax
.sequence
)
3083 mips_relax
.sizes
[mips_relax
.sequence
- 1] += 4;
3087 /* It looks like we can actually do the swap. */
3088 struct mips_cl_insn delay
= history
[0];
3089 if (mips_opts
.mips16
)
3091 know (delay
.frag
== ip
->frag
);
3092 move_insn (ip
, delay
.frag
, delay
.where
);
3093 move_insn (&delay
, ip
->frag
, ip
->where
+ insn_length (ip
));
3095 else if (relaxed_branch
)
3097 /* Add the delay slot instruction to the end of the
3098 current frag and shrink the fixed part of the
3099 original frag. If the branch occupies the tail of
3100 the latter, move it backwards to cover the gap. */
3101 delay
.frag
->fr_fix
-= 4;
3102 if (delay
.frag
== ip
->frag
)
3103 move_insn (ip
, ip
->frag
, ip
->where
- 4);
3104 add_fixed_insn (&delay
);
3108 move_insn (&delay
, ip
->frag
, ip
->where
);
3109 move_insn (ip
, history
[0].frag
, history
[0].where
);
3113 insert_into_history (0, 1, &delay
);
3116 /* If that was an unconditional branch, forget the previous
3117 insn information. */
3118 if (pinfo
& INSN_UNCOND_BRANCH_DELAY
)
3119 mips_no_prev_insn ();
3121 else if (pinfo
& INSN_COND_BRANCH_LIKELY
)
3123 /* We don't yet optimize a branch likely. What we should do
3124 is look at the target, copy the instruction found there
3125 into the delay slot, and increment the branch to jump to
3126 the next instruction. */
3127 insert_into_history (0, 1, ip
);
3131 insert_into_history (0, 1, ip
);
3134 insert_into_history (0, 1, ip
);
3136 /* We just output an insn, so the next one doesn't have a label. */
3137 mips_clear_insn_labels ();
3140 /* Forget that there was any previous instruction or label. */
3143 mips_no_prev_insn (void)
3145 prev_nop_frag
= NULL
;
3146 insert_into_history (0, ARRAY_SIZE (history
), NOP_INSN
);
3147 mips_clear_insn_labels ();
3150 /* This function must be called before we emit something other than
3151 instructions. It is like mips_no_prev_insn except that it inserts
3152 any NOPS that might be needed by previous instructions. */
3155 mips_emit_delays (void)
3157 if (! mips_opts
.noreorder
)
3159 int nops
= nops_for_insn (history
, NULL
);
3163 add_fixed_insn (NOP_INSN
);
3164 mips_move_labels ();
3167 mips_no_prev_insn ();
3170 /* Start a (possibly nested) noreorder block. */
3173 start_noreorder (void)
3175 if (mips_opts
.noreorder
== 0)
3180 /* None of the instructions before the .set noreorder can be moved. */
3181 for (i
= 0; i
< ARRAY_SIZE (history
); i
++)
3182 history
[i
].fixed_p
= 1;
3184 /* Insert any nops that might be needed between the .set noreorder
3185 block and the previous instructions. We will later remove any
3186 nops that turn out not to be needed. */
3187 nops
= nops_for_insn (history
, NULL
);
3190 if (mips_optimize
!= 0)
3192 /* Record the frag which holds the nop instructions, so
3193 that we can remove them if we don't need them. */
3194 frag_grow (mips_opts
.mips16
? nops
* 2 : nops
* 4);
3195 prev_nop_frag
= frag_now
;
3196 prev_nop_frag_holds
= nops
;
3197 prev_nop_frag_required
= 0;
3198 prev_nop_frag_since
= 0;
3201 for (; nops
> 0; --nops
)
3202 add_fixed_insn (NOP_INSN
);
3204 /* Move on to a new frag, so that it is safe to simply
3205 decrease the size of prev_nop_frag. */
3206 frag_wane (frag_now
);
3208 mips_move_labels ();
3210 mips16_mark_labels ();
3211 mips_clear_insn_labels ();
3213 mips_opts
.noreorder
++;
3214 mips_any_noreorder
= 1;
3217 /* End a nested noreorder block. */
3220 end_noreorder (void)
3222 mips_opts
.noreorder
--;
3223 if (mips_opts
.noreorder
== 0 && prev_nop_frag
!= NULL
)
3225 /* Commit to inserting prev_nop_frag_required nops and go back to
3226 handling nop insertion the .set reorder way. */
3227 prev_nop_frag
->fr_fix
-= ((prev_nop_frag_holds
- prev_nop_frag_required
)
3228 * (mips_opts
.mips16
? 2 : 4));
3229 insert_into_history (prev_nop_frag_since
,
3230 prev_nop_frag_required
, NOP_INSN
);
3231 prev_nop_frag
= NULL
;
3235 /* Set up global variables for the start of a new macro. */
3240 memset (&mips_macro_warning
.sizes
, 0, sizeof (mips_macro_warning
.sizes
));
3241 mips_macro_warning
.delay_slot_p
= (mips_opts
.noreorder
3242 && (history
[0].insn_mo
->pinfo
3243 & (INSN_UNCOND_BRANCH_DELAY
3244 | INSN_COND_BRANCH_DELAY
3245 | INSN_COND_BRANCH_LIKELY
)) != 0);
3248 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3249 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3250 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3253 macro_warning (relax_substateT subtype
)
3255 if (subtype
& RELAX_DELAY_SLOT
)
3256 return _("Macro instruction expanded into multiple instructions"
3257 " in a branch delay slot");
3258 else if (subtype
& RELAX_NOMACRO
)
3259 return _("Macro instruction expanded into multiple instructions");
3264 /* Finish up a macro. Emit warnings as appropriate. */
3269 if (mips_macro_warning
.sizes
[0] > 4 || mips_macro_warning
.sizes
[1] > 4)
3271 relax_substateT subtype
;
3273 /* Set up the relaxation warning flags. */
3275 if (mips_macro_warning
.sizes
[1] > mips_macro_warning
.sizes
[0])
3276 subtype
|= RELAX_SECOND_LONGER
;
3277 if (mips_opts
.warn_about_macros
)
3278 subtype
|= RELAX_NOMACRO
;
3279 if (mips_macro_warning
.delay_slot_p
)
3280 subtype
|= RELAX_DELAY_SLOT
;
3282 if (mips_macro_warning
.sizes
[0] > 4 && mips_macro_warning
.sizes
[1] > 4)
3284 /* Either the macro has a single implementation or both
3285 implementations are longer than 4 bytes. Emit the
3287 const char *msg
= macro_warning (subtype
);
3293 /* One implementation might need a warning but the other
3294 definitely doesn't. */
3295 mips_macro_warning
.first_frag
->fr_subtype
|= subtype
;
3300 /* Read a macro's relocation codes from *ARGS and store them in *R.
3301 The first argument in *ARGS will be either the code for a single
3302 relocation or -1 followed by the three codes that make up a
3303 composite relocation. */
3306 macro_read_relocs (va_list *args
, bfd_reloc_code_real_type
*r
)
3310 next
= va_arg (*args
, int);
3312 r
[0] = (bfd_reloc_code_real_type
) next
;
3314 for (i
= 0; i
< 3; i
++)
3315 r
[i
] = (bfd_reloc_code_real_type
) va_arg (*args
, int);
3318 /* Build an instruction created by a macro expansion. This is passed
3319 a pointer to the count of instructions created so far, an
3320 expression, the name of the instruction to build, an operand format
3321 string, and corresponding arguments. */
3324 macro_build (expressionS
*ep
, const char *name
, const char *fmt
, ...)
3326 const struct mips_opcode
*mo
;
3327 struct mips_cl_insn insn
;
3328 bfd_reloc_code_real_type r
[3];
3331 va_start (args
, fmt
);
3333 if (mips_opts
.mips16
)
3335 mips16_macro_build (ep
, name
, fmt
, args
);
3340 r
[0] = BFD_RELOC_UNUSED
;
3341 r
[1] = BFD_RELOC_UNUSED
;
3342 r
[2] = BFD_RELOC_UNUSED
;
3343 mo
= (struct mips_opcode
*) hash_find (op_hash
, name
);
3345 assert (strcmp (name
, mo
->name
) == 0);
3349 /* Search until we get a match for NAME. It is assumed here that
3350 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3351 if (strcmp (fmt
, mo
->args
) == 0
3352 && mo
->pinfo
!= INSN_MACRO
3353 && OPCODE_IS_MEMBER (mo
,
3355 | (mips_opts
.mips16
? INSN_MIPS16
: 0)
3356 | (mips_opts
.ase_dsp
? INSN_DSP
: 0)
3357 | ((mips_opts
.ase_dsp
&& ISA_SUPPORTS_DSP64_ASE
)
3359 | (mips_opts
.ase_dspr2
? INSN_DSPR2
: 0)
3360 | (mips_opts
.ase_smartmips
? INSN_SMARTMIPS
: 0)),
3362 && (mips_opts
.arch
!= CPU_R4650
|| (mo
->pinfo
& FP_D
) == 0))
3367 assert (strcmp (name
, mo
->name
) == 0);
3370 create_insn (&insn
, mo
);
3388 INSERT_OPERAND (SHAMT
, insn
, va_arg (args
, int));
3393 /* Note that in the macro case, these arguments are already
3394 in MSB form. (When handling the instruction in the
3395 non-macro case, these arguments are sizes from which
3396 MSB values must be calculated.) */
3397 INSERT_OPERAND (INSMSB
, insn
, va_arg (args
, int));
3403 /* Note that in the macro case, these arguments are already
3404 in MSBD form. (When handling the instruction in the
3405 non-macro case, these arguments are sizes from which
3406 MSBD values must be calculated.) */
3407 INSERT_OPERAND (EXTMSBD
, insn
, va_arg (args
, int));
3416 INSERT_OPERAND (BP
, insn
, va_arg (args
, int));
3422 INSERT_OPERAND (RT
, insn
, va_arg (args
, int));
3426 INSERT_OPERAND (CODE
, insn
, va_arg (args
, int));
3431 INSERT_OPERAND (FT
, insn
, va_arg (args
, int));
3437 INSERT_OPERAND (RD
, insn
, va_arg (args
, int));
3442 int tmp
= va_arg (args
, int);
3444 INSERT_OPERAND (RT
, insn
, tmp
);
3445 INSERT_OPERAND (RD
, insn
, tmp
);
3451 INSERT_OPERAND (FS
, insn
, va_arg (args
, int));
3458 INSERT_OPERAND (SHAMT
, insn
, va_arg (args
, int));
3462 INSERT_OPERAND (FD
, insn
, va_arg (args
, int));
3466 INSERT_OPERAND (CODE20
, insn
, va_arg (args
, int));
3470 INSERT_OPERAND (CODE19
, insn
, va_arg (args
, int));
3474 INSERT_OPERAND (CODE2
, insn
, va_arg (args
, int));
3481 INSERT_OPERAND (RS
, insn
, va_arg (args
, int));
3487 macro_read_relocs (&args
, r
);
3488 assert (*r
== BFD_RELOC_GPREL16
3489 || *r
== BFD_RELOC_MIPS_LITERAL
3490 || *r
== BFD_RELOC_MIPS_HIGHER
3491 || *r
== BFD_RELOC_HI16_S
3492 || *r
== BFD_RELOC_LO16
3493 || *r
== BFD_RELOC_MIPS_GOT16
3494 || *r
== BFD_RELOC_MIPS_CALL16
3495 || *r
== BFD_RELOC_MIPS_GOT_DISP
3496 || *r
== BFD_RELOC_MIPS_GOT_PAGE
3497 || *r
== BFD_RELOC_MIPS_GOT_OFST
3498 || *r
== BFD_RELOC_MIPS_GOT_LO16
3499 || *r
== BFD_RELOC_MIPS_CALL_LO16
);
3503 macro_read_relocs (&args
, r
);
3505 && (ep
->X_op
== O_constant
3506 || (ep
->X_op
== O_symbol
3507 && (*r
== BFD_RELOC_MIPS_HIGHEST
3508 || *r
== BFD_RELOC_HI16_S
3509 || *r
== BFD_RELOC_HI16
3510 || *r
== BFD_RELOC_GPREL16
3511 || *r
== BFD_RELOC_MIPS_GOT_HI16
3512 || *r
== BFD_RELOC_MIPS_CALL_HI16
))));
3516 assert (ep
!= NULL
);
3519 * This allows macro() to pass an immediate expression for
3520 * creating short branches without creating a symbol.
3522 * We don't allow branch relaxation for these branches, as
3523 * they should only appear in ".set nomacro" anyway.
3525 if (ep
->X_op
== O_constant
)
3527 if ((ep
->X_add_number
& 3) != 0)
3528 as_bad (_("branch to misaligned address (0x%lx)"),
3529 (unsigned long) ep
->X_add_number
);
3530 if ((ep
->X_add_number
+ 0x20000) & ~0x3ffff)
3531 as_bad (_("branch address range overflow (0x%lx)"),
3532 (unsigned long) ep
->X_add_number
);
3533 insn
.insn_opcode
|= (ep
->X_add_number
>> 2) & 0xffff;
3537 *r
= BFD_RELOC_16_PCREL_S2
;
3541 assert (ep
!= NULL
);
3542 *r
= BFD_RELOC_MIPS_JMP
;
3546 INSERT_OPERAND (COPZ
, insn
, va_arg (args
, unsigned long));
3550 INSERT_OPERAND (CACHE
, insn
, va_arg (args
, unsigned long));
3559 assert (*r
== BFD_RELOC_UNUSED
? ep
== NULL
: ep
!= NULL
);
3561 append_insn (&insn
, ep
, r
);
3565 mips16_macro_build (expressionS
*ep
, const char *name
, const char *fmt
,
3568 struct mips_opcode
*mo
;
3569 struct mips_cl_insn insn
;
3570 bfd_reloc_code_real_type r
[3]
3571 = {BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
};
3573 mo
= (struct mips_opcode
*) hash_find (mips16_op_hash
, name
);
3575 assert (strcmp (name
, mo
->name
) == 0);
3577 while (strcmp (fmt
, mo
->args
) != 0 || mo
->pinfo
== INSN_MACRO
)
3581 assert (strcmp (name
, mo
->name
) == 0);
3584 create_insn (&insn
, mo
);
3602 MIPS16_INSERT_OPERAND (RY
, insn
, va_arg (args
, int));
3607 MIPS16_INSERT_OPERAND (RX
, insn
, va_arg (args
, int));
3611 MIPS16_INSERT_OPERAND (RZ
, insn
, va_arg (args
, int));
3615 MIPS16_INSERT_OPERAND (MOVE32Z
, insn
, va_arg (args
, int));
3625 MIPS16_INSERT_OPERAND (REGR32
, insn
, va_arg (args
, int));
3632 regno
= va_arg (args
, int);
3633 regno
= ((regno
& 7) << 2) | ((regno
& 0x18) >> 3);
3634 MIPS16_INSERT_OPERAND (REG32R
, insn
, regno
);
3655 assert (ep
!= NULL
);
3657 if (ep
->X_op
!= O_constant
)
3658 *r
= (int) BFD_RELOC_UNUSED
+ c
;
3661 mips16_immed (NULL
, 0, c
, ep
->X_add_number
, FALSE
, FALSE
,
3662 FALSE
, &insn
.insn_opcode
, &insn
.use_extend
,
3665 *r
= BFD_RELOC_UNUSED
;
3671 MIPS16_INSERT_OPERAND (IMM6
, insn
, va_arg (args
, int));
3678 assert (*r
== BFD_RELOC_UNUSED
? ep
== NULL
: ep
!= NULL
);
3680 append_insn (&insn
, ep
, r
);
3684 * Sign-extend 32-bit mode constants that have bit 31 set and all
3685 * higher bits unset.
3688 normalize_constant_expr (expressionS
*ex
)
3690 if (ex
->X_op
== O_constant
3691 && IS_ZEXT_32BIT_NUM (ex
->X_add_number
))
3692 ex
->X_add_number
= (((ex
->X_add_number
& 0xffffffff) ^ 0x80000000)
3697 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3698 * all higher bits unset.
3701 normalize_address_expr (expressionS
*ex
)
3703 if (((ex
->X_op
== O_constant
&& HAVE_32BIT_ADDRESSES
)
3704 || (ex
->X_op
== O_symbol
&& HAVE_32BIT_SYMBOLS
))
3705 && IS_ZEXT_32BIT_NUM (ex
->X_add_number
))
3706 ex
->X_add_number
= (((ex
->X_add_number
& 0xffffffff) ^ 0x80000000)
3711 * Generate a "jalr" instruction with a relocation hint to the called
3712 * function. This occurs in NewABI PIC code.
3715 macro_build_jalr (expressionS
*ep
)
3724 macro_build (NULL
, "jalr", "d,s", RA
, PIC_CALL_REG
);
3726 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
,
3727 4, ep
, FALSE
, BFD_RELOC_MIPS_JALR
);
3731 * Generate a "lui" instruction.
3734 macro_build_lui (expressionS
*ep
, int regnum
)
3736 expressionS high_expr
;
3737 const struct mips_opcode
*mo
;
3738 struct mips_cl_insn insn
;
3739 bfd_reloc_code_real_type r
[3]
3740 = {BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
, BFD_RELOC_UNUSED
};
3741 const char *name
= "lui";
3742 const char *fmt
= "t,u";
3744 assert (! mips_opts
.mips16
);
3748 if (high_expr
.X_op
== O_constant
)
3750 /* We can compute the instruction now without a relocation entry. */
3751 high_expr
.X_add_number
= ((high_expr
.X_add_number
+ 0x8000)
3753 *r
= BFD_RELOC_UNUSED
;
3757 assert (ep
->X_op
== O_symbol
);
3758 /* _gp_disp is a special case, used from s_cpload.
3759 __gnu_local_gp is used if mips_no_shared. */
3760 assert (mips_pic
== NO_PIC
3762 && strcmp (S_GET_NAME (ep
->X_add_symbol
), "_gp_disp") == 0)
3763 || (! mips_in_shared
3764 && strcmp (S_GET_NAME (ep
->X_add_symbol
),
3765 "__gnu_local_gp") == 0));
3766 *r
= BFD_RELOC_HI16_S
;
3769 mo
= hash_find (op_hash
, name
);
3770 assert (strcmp (name
, mo
->name
) == 0);
3771 assert (strcmp (fmt
, mo
->args
) == 0);
3772 create_insn (&insn
, mo
);
3774 insn
.insn_opcode
= insn
.insn_mo
->match
;
3775 INSERT_OPERAND (RT
, insn
, regnum
);
3776 if (*r
== BFD_RELOC_UNUSED
)
3778 insn
.insn_opcode
|= high_expr
.X_add_number
;
3779 append_insn (&insn
, NULL
, r
);
3782 append_insn (&insn
, &high_expr
, r
);
3785 /* Generate a sequence of instructions to do a load or store from a constant
3786 offset off of a base register (breg) into/from a target register (treg),
3787 using AT if necessary. */
3789 macro_build_ldst_constoffset (expressionS
*ep
, const char *op
,
3790 int treg
, int breg
, int dbl
)
3792 assert (ep
->X_op
== O_constant
);
3794 /* Sign-extending 32-bit constants makes their handling easier. */
3796 normalize_constant_expr (ep
);
3798 /* Right now, this routine can only handle signed 32-bit constants. */
3799 if (! IS_SEXT_32BIT_NUM(ep
->X_add_number
+ 0x8000))
3800 as_warn (_("operand overflow"));
3802 if (IS_SEXT_16BIT_NUM(ep
->X_add_number
))
3804 /* Signed 16-bit offset will fit in the op. Easy! */
3805 macro_build (ep
, op
, "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
3809 /* 32-bit offset, need multiple instructions and AT, like:
3810 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3811 addu $tempreg,$tempreg,$breg
3812 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3813 to handle the complete offset. */
3814 macro_build_lui (ep
, AT
);
3815 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, AT
, breg
);
3816 macro_build (ep
, op
, "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
3819 as_bad (_("Macro used $at after \".set noat\""));
3824 * Generates code to set the $at register to true (one)
3825 * if reg is less than the immediate expression.
3828 set_at (int reg
, int unsignedp
)
3830 if (imm_expr
.X_op
== O_constant
3831 && imm_expr
.X_add_number
>= -0x8000
3832 && imm_expr
.X_add_number
< 0x8000)
3833 macro_build (&imm_expr
, unsignedp
? "sltiu" : "slti", "t,r,j",
3834 AT
, reg
, BFD_RELOC_LO16
);
3837 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
3838 macro_build (NULL
, unsignedp
? "sltu" : "slt", "d,v,t", AT
, reg
, AT
);
3842 /* Warn if an expression is not a constant. */
3845 check_absolute_expr (struct mips_cl_insn
*ip
, expressionS
*ex
)
3847 if (ex
->X_op
== O_big
)
3848 as_bad (_("unsupported large constant"));
3849 else if (ex
->X_op
!= O_constant
)
3850 as_bad (_("Instruction %s requires absolute expression"),
3853 if (HAVE_32BIT_GPRS
)
3854 normalize_constant_expr (ex
);
3857 /* Count the leading zeroes by performing a binary chop. This is a
3858 bulky bit of source, but performance is a LOT better for the
3859 majority of values than a simple loop to count the bits:
3860 for (lcnt = 0; (lcnt < 32); lcnt++)
3861 if ((v) & (1 << (31 - lcnt)))
3863 However it is not code size friendly, and the gain will drop a bit
3864 on certain cached systems.
3866 #define COUNT_TOP_ZEROES(v) \
3867 (((v) & ~0xffff) == 0 \
3868 ? ((v) & ~0xff) == 0 \
3869 ? ((v) & ~0xf) == 0 \
3870 ? ((v) & ~0x3) == 0 \
3871 ? ((v) & ~0x1) == 0 \
3876 : ((v) & ~0x7) == 0 \
3879 : ((v) & ~0x3f) == 0 \
3880 ? ((v) & ~0x1f) == 0 \
3883 : ((v) & ~0x7f) == 0 \
3886 : ((v) & ~0xfff) == 0 \
3887 ? ((v) & ~0x3ff) == 0 \
3888 ? ((v) & ~0x1ff) == 0 \
3891 : ((v) & ~0x7ff) == 0 \
3894 : ((v) & ~0x3fff) == 0 \
3895 ? ((v) & ~0x1fff) == 0 \
3898 : ((v) & ~0x7fff) == 0 \
3901 : ((v) & ~0xffffff) == 0 \
3902 ? ((v) & ~0xfffff) == 0 \
3903 ? ((v) & ~0x3ffff) == 0 \
3904 ? ((v) & ~0x1ffff) == 0 \
3907 : ((v) & ~0x7ffff) == 0 \
3910 : ((v) & ~0x3fffff) == 0 \
3911 ? ((v) & ~0x1fffff) == 0 \
3914 : ((v) & ~0x7fffff) == 0 \
3917 : ((v) & ~0xfffffff) == 0 \
3918 ? ((v) & ~0x3ffffff) == 0 \
3919 ? ((v) & ~0x1ffffff) == 0 \
3922 : ((v) & ~0x7ffffff) == 0 \
3925 : ((v) & ~0x3fffffff) == 0 \
3926 ? ((v) & ~0x1fffffff) == 0 \
3929 : ((v) & ~0x7fffffff) == 0 \
3934 * This routine generates the least number of instructions necessary to load
3935 * an absolute expression value into a register.
3938 load_register (int reg
, expressionS
*ep
, int dbl
)
3941 expressionS hi32
, lo32
;
3943 if (ep
->X_op
!= O_big
)
3945 assert (ep
->X_op
== O_constant
);
3947 /* Sign-extending 32-bit constants makes their handling easier. */
3949 normalize_constant_expr (ep
);
3951 if (IS_SEXT_16BIT_NUM (ep
->X_add_number
))
3953 /* We can handle 16 bit signed values with an addiu to
3954 $zero. No need to ever use daddiu here, since $zero and
3955 the result are always correct in 32 bit mode. */
3956 macro_build (ep
, "addiu", "t,r,j", reg
, 0, BFD_RELOC_LO16
);
3959 else if (ep
->X_add_number
>= 0 && ep
->X_add_number
< 0x10000)
3961 /* We can handle 16 bit unsigned values with an ori to
3963 macro_build (ep
, "ori", "t,r,i", reg
, 0, BFD_RELOC_LO16
);
3966 else if ((IS_SEXT_32BIT_NUM (ep
->X_add_number
)))
3968 /* 32 bit values require an lui. */
3969 macro_build (ep
, "lui", "t,u", reg
, BFD_RELOC_HI16
);
3970 if ((ep
->X_add_number
& 0xffff) != 0)
3971 macro_build (ep
, "ori", "t,r,i", reg
, reg
, BFD_RELOC_LO16
);
3976 /* The value is larger than 32 bits. */
3978 if (!dbl
|| HAVE_32BIT_GPRS
)
3982 sprintf_vma (value
, ep
->X_add_number
);
3983 as_bad (_("Number (0x%s) larger than 32 bits"), value
);
3984 macro_build (ep
, "addiu", "t,r,j", reg
, 0, BFD_RELOC_LO16
);
3988 if (ep
->X_op
!= O_big
)
3991 hi32
.X_add_number
= (valueT
) hi32
.X_add_number
>> 16;
3992 hi32
.X_add_number
= (valueT
) hi32
.X_add_number
>> 16;
3993 hi32
.X_add_number
&= 0xffffffff;
3995 lo32
.X_add_number
&= 0xffffffff;
3999 assert (ep
->X_add_number
> 2);
4000 if (ep
->X_add_number
== 3)
4001 generic_bignum
[3] = 0;
4002 else if (ep
->X_add_number
> 4)
4003 as_bad (_("Number larger than 64 bits"));
4004 lo32
.X_op
= O_constant
;
4005 lo32
.X_add_number
= generic_bignum
[0] + (generic_bignum
[1] << 16);
4006 hi32
.X_op
= O_constant
;
4007 hi32
.X_add_number
= generic_bignum
[2] + (generic_bignum
[3] << 16);
4010 if (hi32
.X_add_number
== 0)
4015 unsigned long hi
, lo
;
4017 if (hi32
.X_add_number
== (offsetT
) 0xffffffff)
4019 if ((lo32
.X_add_number
& 0xffff8000) == 0xffff8000)
4021 macro_build (&lo32
, "addiu", "t,r,j", reg
, 0, BFD_RELOC_LO16
);
4024 if (lo32
.X_add_number
& 0x80000000)
4026 macro_build (&lo32
, "lui", "t,u", reg
, BFD_RELOC_HI16
);
4027 if (lo32
.X_add_number
& 0xffff)
4028 macro_build (&lo32
, "ori", "t,r,i", reg
, reg
, BFD_RELOC_LO16
);
4033 /* Check for 16bit shifted constant. We know that hi32 is
4034 non-zero, so start the mask on the first bit of the hi32
4039 unsigned long himask
, lomask
;
4043 himask
= 0xffff >> (32 - shift
);
4044 lomask
= (0xffff << shift
) & 0xffffffff;
4048 himask
= 0xffff << (shift
- 32);
4051 if ((hi32
.X_add_number
& ~(offsetT
) himask
) == 0
4052 && (lo32
.X_add_number
& ~(offsetT
) lomask
) == 0)
4056 tmp
.X_op
= O_constant
;
4058 tmp
.X_add_number
= ((hi32
.X_add_number
<< (32 - shift
))
4059 | (lo32
.X_add_number
>> shift
));
4061 tmp
.X_add_number
= hi32
.X_add_number
>> (shift
- 32);
4062 macro_build (&tmp
, "ori", "t,r,i", reg
, 0, BFD_RELOC_LO16
);
4063 macro_build (NULL
, (shift
>= 32) ? "dsll32" : "dsll", "d,w,<",
4064 reg
, reg
, (shift
>= 32) ? shift
- 32 : shift
);
4069 while (shift
<= (64 - 16));
4071 /* Find the bit number of the lowest one bit, and store the
4072 shifted value in hi/lo. */
4073 hi
= (unsigned long) (hi32
.X_add_number
& 0xffffffff);
4074 lo
= (unsigned long) (lo32
.X_add_number
& 0xffffffff);
4078 while ((lo
& 1) == 0)
4083 lo
|= (hi
& (((unsigned long) 1 << bit
) - 1)) << (32 - bit
);
4089 while ((hi
& 1) == 0)
4098 /* Optimize if the shifted value is a (power of 2) - 1. */
4099 if ((hi
== 0 && ((lo
+ 1) & lo
) == 0)
4100 || (lo
== 0xffffffff && ((hi
+ 1) & hi
) == 0))
4102 shift
= COUNT_TOP_ZEROES ((unsigned int) hi32
.X_add_number
);
4107 /* This instruction will set the register to be all
4109 tmp
.X_op
= O_constant
;
4110 tmp
.X_add_number
= (offsetT
) -1;
4111 macro_build (&tmp
, "addiu", "t,r,j", reg
, 0, BFD_RELOC_LO16
);
4115 macro_build (NULL
, (bit
>= 32) ? "dsll32" : "dsll", "d,w,<",
4116 reg
, reg
, (bit
>= 32) ? bit
- 32 : bit
);
4118 macro_build (NULL
, (shift
>= 32) ? "dsrl32" : "dsrl", "d,w,<",
4119 reg
, reg
, (shift
>= 32) ? shift
- 32 : shift
);
4124 /* Sign extend hi32 before calling load_register, because we can
4125 generally get better code when we load a sign extended value. */
4126 if ((hi32
.X_add_number
& 0x80000000) != 0)
4127 hi32
.X_add_number
|= ~(offsetT
) 0xffffffff;
4128 load_register (reg
, &hi32
, 0);
4131 if ((lo32
.X_add_number
& 0xffff0000) == 0)
4135 macro_build (NULL
, "dsll32", "d,w,<", reg
, freg
, 0);
4143 if ((freg
== 0) && (lo32
.X_add_number
== (offsetT
) 0xffffffff))
4145 macro_build (&lo32
, "lui", "t,u", reg
, BFD_RELOC_HI16
);
4146 macro_build (NULL
, "dsrl32", "d,w,<", reg
, reg
, 0);
4152 macro_build (NULL
, "dsll", "d,w,<", reg
, freg
, 16);
4156 mid16
.X_add_number
>>= 16;
4157 macro_build (&mid16
, "ori", "t,r,i", reg
, freg
, BFD_RELOC_LO16
);
4158 macro_build (NULL
, "dsll", "d,w,<", reg
, reg
, 16);
4161 if ((lo32
.X_add_number
& 0xffff) != 0)
4162 macro_build (&lo32
, "ori", "t,r,i", reg
, freg
, BFD_RELOC_LO16
);
4166 load_delay_nop (void)
4168 if (!gpr_interlocks
)
4169 macro_build (NULL
, "nop", "");
4172 /* Load an address into a register. */
4175 load_address (int reg
, expressionS
*ep
, int *used_at
)
4177 if (ep
->X_op
!= O_constant
4178 && ep
->X_op
!= O_symbol
)
4180 as_bad (_("expression too complex"));
4181 ep
->X_op
= O_constant
;
4184 if (ep
->X_op
== O_constant
)
4186 load_register (reg
, ep
, HAVE_64BIT_ADDRESSES
);
4190 if (mips_pic
== NO_PIC
)
4192 /* If this is a reference to a GP relative symbol, we want
4193 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4195 lui $reg,<sym> (BFD_RELOC_HI16_S)
4196 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4197 If we have an addend, we always use the latter form.
4199 With 64bit address space and a usable $at we want
4200 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4201 lui $at,<sym> (BFD_RELOC_HI16_S)
4202 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4203 daddiu $at,<sym> (BFD_RELOC_LO16)
4207 If $at is already in use, we use a path which is suboptimal
4208 on superscalar processors.
4209 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4210 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4212 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4214 daddiu $reg,<sym> (BFD_RELOC_LO16)
4216 For GP relative symbols in 64bit address space we can use
4217 the same sequence as in 32bit address space. */
4218 if (HAVE_64BIT_SYMBOLS
)
4220 if ((valueT
) ep
->X_add_number
<= MAX_GPREL_OFFSET
4221 && !nopic_need_relax (ep
->X_add_symbol
, 1))
4223 relax_start (ep
->X_add_symbol
);
4224 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j", reg
,
4225 mips_gp_register
, BFD_RELOC_GPREL16
);
4229 if (*used_at
== 0 && !mips_opts
.noat
)
4231 macro_build (ep
, "lui", "t,u", reg
, BFD_RELOC_MIPS_HIGHEST
);
4232 macro_build (ep
, "lui", "t,u", AT
, BFD_RELOC_HI16_S
);
4233 macro_build (ep
, "daddiu", "t,r,j", reg
, reg
,
4234 BFD_RELOC_MIPS_HIGHER
);
4235 macro_build (ep
, "daddiu", "t,r,j", AT
, AT
, BFD_RELOC_LO16
);
4236 macro_build (NULL
, "dsll32", "d,w,<", reg
, reg
, 0);
4237 macro_build (NULL
, "daddu", "d,v,t", reg
, reg
, AT
);
4242 macro_build (ep
, "lui", "t,u", reg
, BFD_RELOC_MIPS_HIGHEST
);
4243 macro_build (ep
, "daddiu", "t,r,j", reg
, reg
,
4244 BFD_RELOC_MIPS_HIGHER
);
4245 macro_build (NULL
, "dsll", "d,w,<", reg
, reg
, 16);
4246 macro_build (ep
, "daddiu", "t,r,j", reg
, reg
, BFD_RELOC_HI16_S
);
4247 macro_build (NULL
, "dsll", "d,w,<", reg
, reg
, 16);
4248 macro_build (ep
, "daddiu", "t,r,j", reg
, reg
, BFD_RELOC_LO16
);
4251 if (mips_relax
.sequence
)
4256 if ((valueT
) ep
->X_add_number
<= MAX_GPREL_OFFSET
4257 && !nopic_need_relax (ep
->X_add_symbol
, 1))
4259 relax_start (ep
->X_add_symbol
);
4260 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j", reg
,
4261 mips_gp_register
, BFD_RELOC_GPREL16
);
4264 macro_build_lui (ep
, reg
);
4265 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j",
4266 reg
, reg
, BFD_RELOC_LO16
);
4267 if (mips_relax
.sequence
)
4271 else if (!mips_big_got
)
4275 /* If this is a reference to an external symbol, we want
4276 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4278 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4280 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4281 If there is a constant, it must be added in after.
4283 If we have NewABI, we want
4284 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4285 unless we're referencing a global symbol with a non-zero
4286 offset, in which case cst must be added separately. */
4289 if (ep
->X_add_number
)
4291 ex
.X_add_number
= ep
->X_add_number
;
4292 ep
->X_add_number
= 0;
4293 relax_start (ep
->X_add_symbol
);
4294 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)", reg
,
4295 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
4296 if (ex
.X_add_number
< -0x8000 || ex
.X_add_number
>= 0x8000)
4297 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4298 ex
.X_op
= O_constant
;
4299 macro_build (&ex
, ADDRESS_ADDI_INSN
, "t,r,j",
4300 reg
, reg
, BFD_RELOC_LO16
);
4301 ep
->X_add_number
= ex
.X_add_number
;
4304 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)", reg
,
4305 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
4306 if (mips_relax
.sequence
)
4311 ex
.X_add_number
= ep
->X_add_number
;
4312 ep
->X_add_number
= 0;
4313 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)", reg
,
4314 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
4316 relax_start (ep
->X_add_symbol
);
4318 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j", reg
, reg
,
4322 if (ex
.X_add_number
!= 0)
4324 if (ex
.X_add_number
< -0x8000 || ex
.X_add_number
>= 0x8000)
4325 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4326 ex
.X_op
= O_constant
;
4327 macro_build (&ex
, ADDRESS_ADDI_INSN
, "t,r,j",
4328 reg
, reg
, BFD_RELOC_LO16
);
4332 else if (mips_big_got
)
4336 /* This is the large GOT case. If this is a reference to an
4337 external symbol, we want
4338 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4340 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4342 Otherwise, for a reference to a local symbol in old ABI, we want
4343 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4345 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4346 If there is a constant, it must be added in after.
4348 In the NewABI, for local symbols, with or without offsets, we want:
4349 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4350 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4354 ex
.X_add_number
= ep
->X_add_number
;
4355 ep
->X_add_number
= 0;
4356 relax_start (ep
->X_add_symbol
);
4357 macro_build (ep
, "lui", "t,u", reg
, BFD_RELOC_MIPS_GOT_HI16
);
4358 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
4359 reg
, reg
, mips_gp_register
);
4360 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)",
4361 reg
, BFD_RELOC_MIPS_GOT_LO16
, reg
);
4362 if (ex
.X_add_number
< -0x8000 || ex
.X_add_number
>= 0x8000)
4363 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4364 else if (ex
.X_add_number
)
4366 ex
.X_op
= O_constant
;
4367 macro_build (&ex
, ADDRESS_ADDI_INSN
, "t,r,j", reg
, reg
,
4371 ep
->X_add_number
= ex
.X_add_number
;
4373 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)", reg
,
4374 BFD_RELOC_MIPS_GOT_PAGE
, mips_gp_register
);
4375 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j", reg
, reg
,
4376 BFD_RELOC_MIPS_GOT_OFST
);
4381 ex
.X_add_number
= ep
->X_add_number
;
4382 ep
->X_add_number
= 0;
4383 relax_start (ep
->X_add_symbol
);
4384 macro_build (ep
, "lui", "t,u", reg
, BFD_RELOC_MIPS_GOT_HI16
);
4385 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
4386 reg
, reg
, mips_gp_register
);
4387 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)",
4388 reg
, BFD_RELOC_MIPS_GOT_LO16
, reg
);
4390 if (reg_needs_delay (mips_gp_register
))
4392 /* We need a nop before loading from $gp. This special
4393 check is required because the lui which starts the main
4394 instruction stream does not refer to $gp, and so will not
4395 insert the nop which may be required. */
4396 macro_build (NULL
, "nop", "");
4398 macro_build (ep
, ADDRESS_LOAD_INSN
, "t,o(b)", reg
,
4399 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
4401 macro_build (ep
, ADDRESS_ADDI_INSN
, "t,r,j", reg
, reg
,
4405 if (ex
.X_add_number
!= 0)
4407 if (ex
.X_add_number
< -0x8000 || ex
.X_add_number
>= 0x8000)
4408 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4409 ex
.X_op
= O_constant
;
4410 macro_build (&ex
, ADDRESS_ADDI_INSN
, "t,r,j", reg
, reg
,
4418 if (mips_opts
.noat
&& *used_at
== 1)
4419 as_bad (_("Macro used $at after \".set noat\""));
4422 /* Move the contents of register SOURCE into register DEST. */
4425 move_register (int dest
, int source
)
4427 macro_build (NULL
, HAVE_32BIT_GPRS
? "addu" : "daddu", "d,v,t",
4431 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4432 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4433 The two alternatives are:
4435 Global symbol Local sybmol
4436 ------------- ------------
4437 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4439 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4441 load_got_offset emits the first instruction and add_got_offset
4442 emits the second for a 16-bit offset or add_got_offset_hilo emits
4443 a sequence to add a 32-bit offset using a scratch register. */
4446 load_got_offset (int dest
, expressionS
*local
)
4451 global
.X_add_number
= 0;
4453 relax_start (local
->X_add_symbol
);
4454 macro_build (&global
, ADDRESS_LOAD_INSN
, "t,o(b)", dest
,
4455 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
4457 macro_build (local
, ADDRESS_LOAD_INSN
, "t,o(b)", dest
,
4458 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
4463 add_got_offset (int dest
, expressionS
*local
)
4467 global
.X_op
= O_constant
;
4468 global
.X_op_symbol
= NULL
;
4469 global
.X_add_symbol
= NULL
;
4470 global
.X_add_number
= local
->X_add_number
;
4472 relax_start (local
->X_add_symbol
);
4473 macro_build (&global
, ADDRESS_ADDI_INSN
, "t,r,j",
4474 dest
, dest
, BFD_RELOC_LO16
);
4476 macro_build (local
, ADDRESS_ADDI_INSN
, "t,r,j", dest
, dest
, BFD_RELOC_LO16
);
4481 add_got_offset_hilo (int dest
, expressionS
*local
, int tmp
)
4484 int hold_mips_optimize
;
4486 global
.X_op
= O_constant
;
4487 global
.X_op_symbol
= NULL
;
4488 global
.X_add_symbol
= NULL
;
4489 global
.X_add_number
= local
->X_add_number
;
4491 relax_start (local
->X_add_symbol
);
4492 load_register (tmp
, &global
, HAVE_64BIT_ADDRESSES
);
4494 /* Set mips_optimize around the lui instruction to avoid
4495 inserting an unnecessary nop after the lw. */
4496 hold_mips_optimize
= mips_optimize
;
4498 macro_build_lui (&global
, tmp
);
4499 mips_optimize
= hold_mips_optimize
;
4500 macro_build (local
, ADDRESS_ADDI_INSN
, "t,r,j", tmp
, tmp
, BFD_RELOC_LO16
);
4503 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", dest
, dest
, tmp
);
4508 * This routine implements the seemingly endless macro or synthesized
4509 * instructions and addressing modes in the mips assembly language. Many
4510 * of these macros are simple and are similar to each other. These could
4511 * probably be handled by some kind of table or grammar approach instead of
4512 * this verbose method. Others are not simple macros but are more like
4513 * optimizing code generation.
4514 * One interesting optimization is when several store macros appear
4515 * consecutively that would load AT with the upper half of the same address.
4516 * The ensuing load upper instructions are ommited. This implies some kind
4517 * of global optimization. We currently only optimize within a single macro.
4518 * For many of the load and store macros if the address is specified as a
4519 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4520 * first load register 'at' with zero and use it as the base register. The
4521 * mips assembler simply uses register $zero. Just one tiny optimization
4525 macro (struct mips_cl_insn
*ip
)
4527 int treg
, sreg
, dreg
, breg
;
4543 bfd_reloc_code_real_type r
;
4544 int hold_mips_optimize
;
4546 assert (! mips_opts
.mips16
);
4548 treg
= (ip
->insn_opcode
>> 16) & 0x1f;
4549 dreg
= (ip
->insn_opcode
>> 11) & 0x1f;
4550 sreg
= breg
= (ip
->insn_opcode
>> 21) & 0x1f;
4551 mask
= ip
->insn_mo
->mask
;
4553 expr1
.X_op
= O_constant
;
4554 expr1
.X_op_symbol
= NULL
;
4555 expr1
.X_add_symbol
= NULL
;
4556 expr1
.X_add_number
= 1;
4570 expr1
.X_add_number
= 8;
4571 macro_build (&expr1
, "bgez", "s,p", sreg
);
4573 macro_build (NULL
, "nop", "", 0);
4575 move_register (dreg
, sreg
);
4576 macro_build (NULL
, dbl
? "dsub" : "sub", "d,v,t", dreg
, 0, sreg
);
4599 if (imm_expr
.X_op
== O_constant
4600 && imm_expr
.X_add_number
>= -0x8000
4601 && imm_expr
.X_add_number
< 0x8000)
4603 macro_build (&imm_expr
, s
, "t,r,j", treg
, sreg
, BFD_RELOC_LO16
);
4607 load_register (AT
, &imm_expr
, dbl
);
4608 macro_build (NULL
, s2
, "d,v,t", treg
, sreg
, AT
);
4627 if (imm_expr
.X_op
== O_constant
4628 && imm_expr
.X_add_number
>= 0
4629 && imm_expr
.X_add_number
< 0x10000)
4631 if (mask
!= M_NOR_I
)
4632 macro_build (&imm_expr
, s
, "t,r,i", treg
, sreg
, BFD_RELOC_LO16
);
4635 macro_build (&imm_expr
, "ori", "t,r,i",
4636 treg
, sreg
, BFD_RELOC_LO16
);
4637 macro_build (NULL
, "nor", "d,v,t", treg
, treg
, 0);
4643 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
4644 macro_build (NULL
, s2
, "d,v,t", treg
, sreg
, AT
);
4648 switch (imm_expr
.X_add_number
)
4651 macro_build (NULL
, "nop", "");
4654 macro_build (NULL
, "packrl.ph", "d,s,t", treg
, treg
, sreg
);
4657 macro_build (NULL
, "balign", "t,s,2", treg
, sreg
,
4658 (int)imm_expr
.X_add_number
);
4677 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
4679 macro_build (&offset_expr
, s
, "s,t,p", sreg
, 0);
4683 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
4684 macro_build (&offset_expr
, s
, "s,t,p", sreg
, AT
);
4692 macro_build (&offset_expr
, likely
? "bgezl" : "bgez", "s,p", sreg
);
4697 macro_build (&offset_expr
, likely
? "blezl" : "blez", "s,p", treg
);
4701 macro_build (NULL
, "slt", "d,v,t", AT
, sreg
, treg
);
4702 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4708 /* check for > max integer */
4709 maxnum
= 0x7fffffff;
4710 if (HAVE_64BIT_GPRS
&& sizeof (maxnum
) > 4)
4717 if (imm_expr
.X_op
== O_constant
4718 && imm_expr
.X_add_number
>= maxnum
4719 && (HAVE_32BIT_GPRS
|| sizeof (maxnum
) > 4))
4722 /* result is always false */
4724 macro_build (NULL
, "nop", "", 0);
4726 macro_build (&offset_expr
, "bnel", "s,t,p", 0, 0);
4729 if (imm_expr
.X_op
!= O_constant
)
4730 as_bad (_("Unsupported large constant"));
4731 ++imm_expr
.X_add_number
;
4735 if (mask
== M_BGEL_I
)
4737 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
4739 macro_build (&offset_expr
, likely
? "bgezl" : "bgez", "s,p", sreg
);
4742 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 1)
4744 macro_build (&offset_expr
, likely
? "bgtzl" : "bgtz", "s,p", sreg
);
4747 maxnum
= 0x7fffffff;
4748 if (HAVE_64BIT_GPRS
&& sizeof (maxnum
) > 4)
4755 maxnum
= - maxnum
- 1;
4756 if (imm_expr
.X_op
== O_constant
4757 && imm_expr
.X_add_number
<= maxnum
4758 && (HAVE_32BIT_GPRS
|| sizeof (maxnum
) > 4))
4761 /* result is always true */
4762 as_warn (_("Branch %s is always true"), ip
->insn_mo
->name
);
4763 macro_build (&offset_expr
, "b", "p");
4768 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4778 macro_build (&offset_expr
, likely
? "beql" : "beq",
4783 macro_build (NULL
, "sltu", "d,v,t", AT
, sreg
, treg
);
4784 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4792 && imm_expr
.X_op
== O_constant
4793 && imm_expr
.X_add_number
== (offsetT
) 0xffffffff))
4795 if (imm_expr
.X_op
!= O_constant
)
4796 as_bad (_("Unsupported large constant"));
4797 ++imm_expr
.X_add_number
;
4801 if (mask
== M_BGEUL_I
)
4803 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
4805 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 1)
4807 macro_build (&offset_expr
, likely
? "bnel" : "bne",
4813 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4821 macro_build (&offset_expr
, likely
? "bgtzl" : "bgtz", "s,p", sreg
);
4826 macro_build (&offset_expr
, likely
? "bltzl" : "bltz", "s,p", treg
);
4830 macro_build (NULL
, "slt", "d,v,t", AT
, treg
, sreg
);
4831 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4839 macro_build (&offset_expr
, likely
? "bnel" : "bne",
4846 macro_build (NULL
, "sltu", "d,v,t", AT
, treg
, sreg
);
4847 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4855 macro_build (&offset_expr
, likely
? "blezl" : "blez", "s,p", sreg
);
4860 macro_build (&offset_expr
, likely
? "bgezl" : "bgez", "s,p", treg
);
4864 macro_build (NULL
, "slt", "d,v,t", AT
, treg
, sreg
);
4865 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4871 maxnum
= 0x7fffffff;
4872 if (HAVE_64BIT_GPRS
&& sizeof (maxnum
) > 4)
4879 if (imm_expr
.X_op
== O_constant
4880 && imm_expr
.X_add_number
>= maxnum
4881 && (HAVE_32BIT_GPRS
|| sizeof (maxnum
) > 4))
4883 if (imm_expr
.X_op
!= O_constant
)
4884 as_bad (_("Unsupported large constant"));
4885 ++imm_expr
.X_add_number
;
4889 if (mask
== M_BLTL_I
)
4891 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
4893 macro_build (&offset_expr
, likely
? "bltzl" : "bltz", "s,p", sreg
);
4896 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 1)
4898 macro_build (&offset_expr
, likely
? "blezl" : "blez", "s,p", sreg
);
4903 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4911 macro_build (&offset_expr
, likely
? "beql" : "beq",
4918 macro_build (NULL
, "sltu", "d,v,t", AT
, treg
, sreg
);
4919 macro_build (&offset_expr
, likely
? "beql" : "beq", "s,t,p", AT
, 0);
4927 && imm_expr
.X_op
== O_constant
4928 && imm_expr
.X_add_number
== (offsetT
) 0xffffffff))
4930 if (imm_expr
.X_op
!= O_constant
)
4931 as_bad (_("Unsupported large constant"));
4932 ++imm_expr
.X_add_number
;
4936 if (mask
== M_BLTUL_I
)
4938 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
4940 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 1)
4942 macro_build (&offset_expr
, likely
? "beql" : "beq",
4948 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4956 macro_build (&offset_expr
, likely
? "bltzl" : "bltz", "s,p", sreg
);
4961 macro_build (&offset_expr
, likely
? "bgtzl" : "bgtz", "s,p", treg
);
4965 macro_build (NULL
, "slt", "d,v,t", AT
, sreg
, treg
);
4966 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4976 macro_build (&offset_expr
, likely
? "bnel" : "bne",
4981 macro_build (NULL
, "sltu", "d,v,t", AT
, sreg
, treg
);
4982 macro_build (&offset_expr
, likely
? "bnel" : "bne", "s,t,p", AT
, 0);
4990 if (imm_expr
.X_op
!= O_constant
|| imm2_expr
.X_op
!= O_constant
)
4992 as_bad (_("Unsupported large constant"));
4997 pos
= (unsigned long) imm_expr
.X_add_number
;
4998 size
= (unsigned long) imm2_expr
.X_add_number
;
5003 as_bad (_("Improper position (%lu)"), pos
);
5006 if (size
== 0 || size
> 64
5007 || (pos
+ size
- 1) > 63)
5009 as_bad (_("Improper extract size (%lu, position %lu)"),
5014 if (size
<= 32 && pos
< 32)
5019 else if (size
<= 32)
5029 macro_build ((expressionS
*) NULL
, s
, fmt
, treg
, sreg
, pos
, size
- 1);
5038 if (imm_expr
.X_op
!= O_constant
|| imm2_expr
.X_op
!= O_constant
)
5040 as_bad (_("Unsupported large constant"));
5045 pos
= (unsigned long) imm_expr
.X_add_number
;
5046 size
= (unsigned long) imm2_expr
.X_add_number
;
5051 as_bad (_("Improper position (%lu)"), pos
);
5054 if (size
== 0 || size
> 64
5055 || (pos
+ size
- 1) > 63)
5057 as_bad (_("Improper insert size (%lu, position %lu)"),
5062 if (pos
< 32 && (pos
+ size
- 1) < 32)
5077 macro_build ((expressionS
*) NULL
, s
, fmt
, treg
, sreg
, pos
,
5094 as_warn (_("Divide by zero."));
5096 macro_build (NULL
, "teq", "s,t,q", 0, 0, 7);
5098 macro_build (NULL
, "break", "c", 7);
5105 macro_build (NULL
, "teq", "s,t,q", treg
, 0, 7);
5106 macro_build (NULL
, dbl
? "ddiv" : "div", "z,s,t", sreg
, treg
);
5110 expr1
.X_add_number
= 8;
5111 macro_build (&expr1
, "bne", "s,t,p", treg
, 0);
5112 macro_build (NULL
, dbl
? "ddiv" : "div", "z,s,t", sreg
, treg
);
5113 macro_build (NULL
, "break", "c", 7);
5115 expr1
.X_add_number
= -1;
5117 load_register (AT
, &expr1
, dbl
);
5118 expr1
.X_add_number
= mips_trap
? (dbl
? 12 : 8) : (dbl
? 20 : 16);
5119 macro_build (&expr1
, "bne", "s,t,p", treg
, AT
);
5122 expr1
.X_add_number
= 1;
5123 load_register (AT
, &expr1
, dbl
);
5124 macro_build (NULL
, "dsll32", "d,w,<", AT
, AT
, 31);
5128 expr1
.X_add_number
= 0x80000000;
5129 macro_build (&expr1
, "lui", "t,u", AT
, BFD_RELOC_HI16
);
5133 macro_build (NULL
, "teq", "s,t,q", sreg
, AT
, 6);
5134 /* We want to close the noreorder block as soon as possible, so
5135 that later insns are available for delay slot filling. */
5140 expr1
.X_add_number
= 8;
5141 macro_build (&expr1
, "bne", "s,t,p", sreg
, AT
);
5142 macro_build (NULL
, "nop", "", 0);
5144 /* We want to close the noreorder block as soon as possible, so
5145 that later insns are available for delay slot filling. */
5148 macro_build (NULL
, "break", "c", 6);
5150 macro_build (NULL
, s
, "d", dreg
);
5189 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
5191 as_warn (_("Divide by zero."));
5193 macro_build (NULL
, "teq", "s,t,q", 0, 0, 7);
5195 macro_build (NULL
, "break", "c", 7);
5198 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 1)
5200 if (strcmp (s2
, "mflo") == 0)
5201 move_register (dreg
, sreg
);
5203 move_register (dreg
, 0);
5206 if (imm_expr
.X_op
== O_constant
5207 && imm_expr
.X_add_number
== -1
5208 && s
[strlen (s
) - 1] != 'u')
5210 if (strcmp (s2
, "mflo") == 0)
5212 macro_build (NULL
, dbl
? "dneg" : "neg", "d,w", dreg
, sreg
);
5215 move_register (dreg
, 0);
5220 load_register (AT
, &imm_expr
, dbl
);
5221 macro_build (NULL
, s
, "z,s,t", sreg
, AT
);
5222 macro_build (NULL
, s2
, "d", dreg
);
5244 macro_build (NULL
, "teq", "s,t,q", treg
, 0, 7);
5245 macro_build (NULL
, s
, "z,s,t", sreg
, treg
);
5246 /* We want to close the noreorder block as soon as possible, so
5247 that later insns are available for delay slot filling. */
5252 expr1
.X_add_number
= 8;
5253 macro_build (&expr1
, "bne", "s,t,p", treg
, 0);
5254 macro_build (NULL
, s
, "z,s,t", sreg
, treg
);
5256 /* We want to close the noreorder block as soon as possible, so
5257 that later insns are available for delay slot filling. */
5259 macro_build (NULL
, "break", "c", 7);
5261 macro_build (NULL
, s2
, "d", dreg
);
5273 /* Load the address of a symbol into a register. If breg is not
5274 zero, we then add a base register to it. */
5276 if (dbl
&& HAVE_32BIT_GPRS
)
5277 as_warn (_("dla used to load 32-bit register"));
5279 if (! dbl
&& HAVE_64BIT_OBJECTS
)
5280 as_warn (_("la used to load 64-bit address"));
5282 if (offset_expr
.X_op
== O_constant
5283 && offset_expr
.X_add_number
>= -0x8000
5284 && offset_expr
.X_add_number
< 0x8000)
5286 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
,
5287 "t,r,j", treg
, sreg
, BFD_RELOC_LO16
);
5291 if (!mips_opts
.noat
&& (treg
== breg
))
5301 if (offset_expr
.X_op
!= O_symbol
5302 && offset_expr
.X_op
!= O_constant
)
5304 as_bad (_("expression too complex"));
5305 offset_expr
.X_op
= O_constant
;
5308 if (offset_expr
.X_op
== O_constant
)
5309 load_register (tempreg
, &offset_expr
, HAVE_64BIT_ADDRESSES
);
5310 else if (mips_pic
== NO_PIC
)
5312 /* If this is a reference to a GP relative symbol, we want
5313 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5315 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5316 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5317 If we have a constant, we need two instructions anyhow,
5318 so we may as well always use the latter form.
5320 With 64bit address space and a usable $at we want
5321 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5322 lui $at,<sym> (BFD_RELOC_HI16_S)
5323 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5324 daddiu $at,<sym> (BFD_RELOC_LO16)
5326 daddu $tempreg,$tempreg,$at
5328 If $at is already in use, we use a path which is suboptimal
5329 on superscalar processors.
5330 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5331 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5333 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5335 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5337 For GP relative symbols in 64bit address space we can use
5338 the same sequence as in 32bit address space. */
5339 if (HAVE_64BIT_SYMBOLS
)
5341 if ((valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
5342 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
5344 relax_start (offset_expr
.X_add_symbol
);
5345 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5346 tempreg
, mips_gp_register
, BFD_RELOC_GPREL16
);
5350 if (used_at
== 0 && !mips_opts
.noat
)
5352 macro_build (&offset_expr
, "lui", "t,u",
5353 tempreg
, BFD_RELOC_MIPS_HIGHEST
);
5354 macro_build (&offset_expr
, "lui", "t,u",
5355 AT
, BFD_RELOC_HI16_S
);
5356 macro_build (&offset_expr
, "daddiu", "t,r,j",
5357 tempreg
, tempreg
, BFD_RELOC_MIPS_HIGHER
);
5358 macro_build (&offset_expr
, "daddiu", "t,r,j",
5359 AT
, AT
, BFD_RELOC_LO16
);
5360 macro_build (NULL
, "dsll32", "d,w,<", tempreg
, tempreg
, 0);
5361 macro_build (NULL
, "daddu", "d,v,t", tempreg
, tempreg
, AT
);
5366 macro_build (&offset_expr
, "lui", "t,u",
5367 tempreg
, BFD_RELOC_MIPS_HIGHEST
);
5368 macro_build (&offset_expr
, "daddiu", "t,r,j",
5369 tempreg
, tempreg
, BFD_RELOC_MIPS_HIGHER
);
5370 macro_build (NULL
, "dsll", "d,w,<", tempreg
, tempreg
, 16);
5371 macro_build (&offset_expr
, "daddiu", "t,r,j",
5372 tempreg
, tempreg
, BFD_RELOC_HI16_S
);
5373 macro_build (NULL
, "dsll", "d,w,<", tempreg
, tempreg
, 16);
5374 macro_build (&offset_expr
, "daddiu", "t,r,j",
5375 tempreg
, tempreg
, BFD_RELOC_LO16
);
5378 if (mips_relax
.sequence
)
5383 if ((valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
5384 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
5386 relax_start (offset_expr
.X_add_symbol
);
5387 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5388 tempreg
, mips_gp_register
, BFD_RELOC_GPREL16
);
5391 if (!IS_SEXT_32BIT_NUM (offset_expr
.X_add_number
))
5392 as_bad (_("offset too large"));
5393 macro_build_lui (&offset_expr
, tempreg
);
5394 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5395 tempreg
, tempreg
, BFD_RELOC_LO16
);
5396 if (mips_relax
.sequence
)
5400 else if (!mips_big_got
&& !HAVE_NEWABI
)
5402 int lw_reloc_type
= (int) BFD_RELOC_MIPS_GOT16
;
5404 /* If this is a reference to an external symbol, and there
5405 is no constant, we want
5406 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5407 or for lca or if tempreg is PIC_CALL_REG
5408 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5409 For a local symbol, we want
5410 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5412 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5414 If we have a small constant, and this is a reference to
5415 an external symbol, we want
5416 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5418 addiu $tempreg,$tempreg,<constant>
5419 For a local symbol, we want the same instruction
5420 sequence, but we output a BFD_RELOC_LO16 reloc on the
5423 If we have a large constant, and this is a reference to
5424 an external symbol, we want
5425 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5426 lui $at,<hiconstant>
5427 addiu $at,$at,<loconstant>
5428 addu $tempreg,$tempreg,$at
5429 For a local symbol, we want the same instruction
5430 sequence, but we output a BFD_RELOC_LO16 reloc on the
5434 if (offset_expr
.X_add_number
== 0)
5436 if (mips_pic
== SVR4_PIC
5438 && (call
|| tempreg
== PIC_CALL_REG
))
5439 lw_reloc_type
= (int) BFD_RELOC_MIPS_CALL16
;
5441 relax_start (offset_expr
.X_add_symbol
);
5442 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5443 lw_reloc_type
, mips_gp_register
);
5446 /* We're going to put in an addu instruction using
5447 tempreg, so we may as well insert the nop right
5452 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5453 tempreg
, BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
5455 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5456 tempreg
, tempreg
, BFD_RELOC_LO16
);
5458 /* FIXME: If breg == 0, and the next instruction uses
5459 $tempreg, then if this variant case is used an extra
5460 nop will be generated. */
5462 else if (offset_expr
.X_add_number
>= -0x8000
5463 && offset_expr
.X_add_number
< 0x8000)
5465 load_got_offset (tempreg
, &offset_expr
);
5467 add_got_offset (tempreg
, &offset_expr
);
5471 expr1
.X_add_number
= offset_expr
.X_add_number
;
5472 offset_expr
.X_add_number
=
5473 ((offset_expr
.X_add_number
+ 0x8000) & 0xffff) - 0x8000;
5474 load_got_offset (tempreg
, &offset_expr
);
5475 offset_expr
.X_add_number
= expr1
.X_add_number
;
5476 /* If we are going to add in a base register, and the
5477 target register and the base register are the same,
5478 then we are using AT as a temporary register. Since
5479 we want to load the constant into AT, we add our
5480 current AT (from the global offset table) and the
5481 register into the register now, and pretend we were
5482 not using a base register. */
5486 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5491 add_got_offset_hilo (tempreg
, &offset_expr
, AT
);
5495 else if (!mips_big_got
&& HAVE_NEWABI
)
5497 int add_breg_early
= 0;
5499 /* If this is a reference to an external, and there is no
5500 constant, or local symbol (*), with or without a
5502 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5503 or for lca or if tempreg is PIC_CALL_REG
5504 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5506 If we have a small constant, and this is a reference to
5507 an external symbol, we want
5508 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5509 addiu $tempreg,$tempreg,<constant>
5511 If we have a large constant, and this is a reference to
5512 an external symbol, we want
5513 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5514 lui $at,<hiconstant>
5515 addiu $at,$at,<loconstant>
5516 addu $tempreg,$tempreg,$at
5518 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5519 local symbols, even though it introduces an additional
5522 if (offset_expr
.X_add_number
)
5524 expr1
.X_add_number
= offset_expr
.X_add_number
;
5525 offset_expr
.X_add_number
= 0;
5527 relax_start (offset_expr
.X_add_symbol
);
5528 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5529 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
5531 if (expr1
.X_add_number
>= -0x8000
5532 && expr1
.X_add_number
< 0x8000)
5534 macro_build (&expr1
, ADDRESS_ADDI_INSN
, "t,r,j",
5535 tempreg
, tempreg
, BFD_RELOC_LO16
);
5537 else if (IS_SEXT_32BIT_NUM (expr1
.X_add_number
+ 0x8000))
5541 /* If we are going to add in a base register, and the
5542 target register and the base register are the same,
5543 then we are using AT as a temporary register. Since
5544 we want to load the constant into AT, we add our
5545 current AT (from the global offset table) and the
5546 register into the register now, and pretend we were
5547 not using a base register. */
5552 assert (tempreg
== AT
);
5553 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5559 load_register (AT
, &expr1
, HAVE_64BIT_ADDRESSES
);
5560 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5566 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5569 offset_expr
.X_add_number
= expr1
.X_add_number
;
5571 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5572 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
5575 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5576 treg
, tempreg
, breg
);
5582 else if (breg
== 0 && (call
|| tempreg
== PIC_CALL_REG
))
5584 relax_start (offset_expr
.X_add_symbol
);
5585 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5586 BFD_RELOC_MIPS_CALL16
, mips_gp_register
);
5588 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5589 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
5594 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5595 BFD_RELOC_MIPS_GOT_DISP
, mips_gp_register
);
5598 else if (mips_big_got
&& !HAVE_NEWABI
)
5601 int lui_reloc_type
= (int) BFD_RELOC_MIPS_GOT_HI16
;
5602 int lw_reloc_type
= (int) BFD_RELOC_MIPS_GOT_LO16
;
5603 int local_reloc_type
= (int) BFD_RELOC_MIPS_GOT16
;
5605 /* This is the large GOT case. If this is a reference to an
5606 external symbol, and there is no constant, we want
5607 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5608 addu $tempreg,$tempreg,$gp
5609 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5610 or for lca or if tempreg is PIC_CALL_REG
5611 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5612 addu $tempreg,$tempreg,$gp
5613 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5614 For a local symbol, we want
5615 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5617 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5619 If we have a small constant, and this is a reference to
5620 an external symbol, we want
5621 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5622 addu $tempreg,$tempreg,$gp
5623 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5625 addiu $tempreg,$tempreg,<constant>
5626 For a local symbol, we want
5627 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5629 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5631 If we have a large constant, and this is a reference to
5632 an external symbol, we want
5633 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5634 addu $tempreg,$tempreg,$gp
5635 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5636 lui $at,<hiconstant>
5637 addiu $at,$at,<loconstant>
5638 addu $tempreg,$tempreg,$at
5639 For a local symbol, we want
5640 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5641 lui $at,<hiconstant>
5642 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5643 addu $tempreg,$tempreg,$at
5646 expr1
.X_add_number
= offset_expr
.X_add_number
;
5647 offset_expr
.X_add_number
= 0;
5648 relax_start (offset_expr
.X_add_symbol
);
5649 gpdelay
= reg_needs_delay (mips_gp_register
);
5650 if (expr1
.X_add_number
== 0 && breg
== 0
5651 && (call
|| tempreg
== PIC_CALL_REG
))
5653 lui_reloc_type
= (int) BFD_RELOC_MIPS_CALL_HI16
;
5654 lw_reloc_type
= (int) BFD_RELOC_MIPS_CALL_LO16
;
5656 macro_build (&offset_expr
, "lui", "t,u", tempreg
, lui_reloc_type
);
5657 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5658 tempreg
, tempreg
, mips_gp_register
);
5659 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5660 tempreg
, lw_reloc_type
, tempreg
);
5661 if (expr1
.X_add_number
== 0)
5665 /* We're going to put in an addu instruction using
5666 tempreg, so we may as well insert the nop right
5671 else if (expr1
.X_add_number
>= -0x8000
5672 && expr1
.X_add_number
< 0x8000)
5675 macro_build (&expr1
, ADDRESS_ADDI_INSN
, "t,r,j",
5676 tempreg
, tempreg
, BFD_RELOC_LO16
);
5682 /* If we are going to add in a base register, and the
5683 target register and the base register are the same,
5684 then we are using AT as a temporary register. Since
5685 we want to load the constant into AT, we add our
5686 current AT (from the global offset table) and the
5687 register into the register now, and pretend we were
5688 not using a base register. */
5693 assert (tempreg
== AT
);
5695 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5700 load_register (AT
, &expr1
, HAVE_64BIT_ADDRESSES
);
5701 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", dreg
, dreg
, AT
);
5705 offset_expr
.X_add_number
=
5706 ((expr1
.X_add_number
+ 0x8000) & 0xffff) - 0x8000;
5711 /* This is needed because this instruction uses $gp, but
5712 the first instruction on the main stream does not. */
5713 macro_build (NULL
, "nop", "");
5716 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5717 local_reloc_type
, mips_gp_register
);
5718 if (expr1
.X_add_number
>= -0x8000
5719 && expr1
.X_add_number
< 0x8000)
5722 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5723 tempreg
, tempreg
, BFD_RELOC_LO16
);
5724 /* FIXME: If add_number is 0, and there was no base
5725 register, the external symbol case ended with a load,
5726 so if the symbol turns out to not be external, and
5727 the next instruction uses tempreg, an unnecessary nop
5728 will be inserted. */
5734 /* We must add in the base register now, as in the
5735 external symbol case. */
5736 assert (tempreg
== AT
);
5738 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5741 /* We set breg to 0 because we have arranged to add
5742 it in in both cases. */
5746 macro_build_lui (&expr1
, AT
);
5747 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5748 AT
, AT
, BFD_RELOC_LO16
);
5749 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5750 tempreg
, tempreg
, AT
);
5755 else if (mips_big_got
&& HAVE_NEWABI
)
5757 int lui_reloc_type
= (int) BFD_RELOC_MIPS_GOT_HI16
;
5758 int lw_reloc_type
= (int) BFD_RELOC_MIPS_GOT_LO16
;
5759 int add_breg_early
= 0;
5761 /* This is the large GOT case. If this is a reference to an
5762 external symbol, and there is no constant, we want
5763 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5764 add $tempreg,$tempreg,$gp
5765 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5766 or for lca or if tempreg is PIC_CALL_REG
5767 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5768 add $tempreg,$tempreg,$gp
5769 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5771 If we have a small constant, and this is a reference to
5772 an external symbol, we want
5773 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5774 add $tempreg,$tempreg,$gp
5775 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5776 addi $tempreg,$tempreg,<constant>
5778 If we have a large constant, and this is a reference to
5779 an external symbol, we want
5780 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5781 addu $tempreg,$tempreg,$gp
5782 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5783 lui $at,<hiconstant>
5784 addi $at,$at,<loconstant>
5785 add $tempreg,$tempreg,$at
5787 If we have NewABI, and we know it's a local symbol, we want
5788 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5789 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5790 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5792 relax_start (offset_expr
.X_add_symbol
);
5794 expr1
.X_add_number
= offset_expr
.X_add_number
;
5795 offset_expr
.X_add_number
= 0;
5797 if (expr1
.X_add_number
== 0 && breg
== 0
5798 && (call
|| tempreg
== PIC_CALL_REG
))
5800 lui_reloc_type
= (int) BFD_RELOC_MIPS_CALL_HI16
;
5801 lw_reloc_type
= (int) BFD_RELOC_MIPS_CALL_LO16
;
5803 macro_build (&offset_expr
, "lui", "t,u", tempreg
, lui_reloc_type
);
5804 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5805 tempreg
, tempreg
, mips_gp_register
);
5806 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5807 tempreg
, lw_reloc_type
, tempreg
);
5809 if (expr1
.X_add_number
== 0)
5811 else if (expr1
.X_add_number
>= -0x8000
5812 && expr1
.X_add_number
< 0x8000)
5814 macro_build (&expr1
, ADDRESS_ADDI_INSN
, "t,r,j",
5815 tempreg
, tempreg
, BFD_RELOC_LO16
);
5817 else if (IS_SEXT_32BIT_NUM (expr1
.X_add_number
+ 0x8000))
5821 /* If we are going to add in a base register, and the
5822 target register and the base register are the same,
5823 then we are using AT as a temporary register. Since
5824 we want to load the constant into AT, we add our
5825 current AT (from the global offset table) and the
5826 register into the register now, and pretend we were
5827 not using a base register. */
5832 assert (tempreg
== AT
);
5833 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5839 load_register (AT
, &expr1
, HAVE_64BIT_ADDRESSES
);
5840 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", dreg
, dreg
, AT
);
5845 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5848 offset_expr
.X_add_number
= expr1
.X_add_number
;
5849 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
5850 BFD_RELOC_MIPS_GOT_PAGE
, mips_gp_register
);
5851 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j", tempreg
,
5852 tempreg
, BFD_RELOC_MIPS_GOT_OFST
);
5855 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
5856 treg
, tempreg
, breg
);
5866 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", treg
, tempreg
, breg
);
5870 /* The j instruction may not be used in PIC code, since it
5871 requires an absolute address. We convert it to a b
5873 if (mips_pic
== NO_PIC
)
5874 macro_build (&offset_expr
, "j", "a");
5876 macro_build (&offset_expr
, "b", "p");
5879 /* The jal instructions must be handled as macros because when
5880 generating PIC code they expand to multi-instruction
5881 sequences. Normally they are simple instructions. */
5886 if (mips_pic
== NO_PIC
)
5887 macro_build (NULL
, "jalr", "d,s", dreg
, sreg
);
5890 if (sreg
!= PIC_CALL_REG
)
5891 as_warn (_("MIPS PIC call to register other than $25"));
5893 macro_build (NULL
, "jalr", "d,s", dreg
, sreg
);
5894 if (mips_pic
== SVR4_PIC
&& !HAVE_NEWABI
)
5896 if (mips_cprestore_offset
< 0)
5897 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5900 if (! mips_frame_reg_valid
)
5902 as_warn (_("No .frame pseudo-op used in PIC code"));
5903 /* Quiet this warning. */
5904 mips_frame_reg_valid
= 1;
5906 if (! mips_cprestore_valid
)
5908 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5909 /* Quiet this warning. */
5910 mips_cprestore_valid
= 1;
5912 expr1
.X_add_number
= mips_cprestore_offset
;
5913 macro_build_ldst_constoffset (&expr1
, ADDRESS_LOAD_INSN
,
5916 HAVE_64BIT_ADDRESSES
);
5924 if (mips_pic
== NO_PIC
)
5925 macro_build (&offset_expr
, "jal", "a");
5926 else if (mips_pic
== SVR4_PIC
)
5928 /* If this is a reference to an external symbol, and we are
5929 using a small GOT, we want
5930 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5934 lw $gp,cprestore($sp)
5935 The cprestore value is set using the .cprestore
5936 pseudo-op. If we are using a big GOT, we want
5937 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5939 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5943 lw $gp,cprestore($sp)
5944 If the symbol is not external, we want
5945 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5947 addiu $25,$25,<sym> (BFD_RELOC_LO16)
5950 lw $gp,cprestore($sp)
5952 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5953 sequences above, minus nops, unless the symbol is local,
5954 which enables us to use GOT_PAGE/GOT_OFST (big got) or
5960 relax_start (offset_expr
.X_add_symbol
);
5961 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5962 PIC_CALL_REG
, BFD_RELOC_MIPS_CALL16
,
5965 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5966 PIC_CALL_REG
, BFD_RELOC_MIPS_GOT_DISP
,
5972 relax_start (offset_expr
.X_add_symbol
);
5973 macro_build (&offset_expr
, "lui", "t,u", PIC_CALL_REG
,
5974 BFD_RELOC_MIPS_CALL_HI16
);
5975 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", PIC_CALL_REG
,
5976 PIC_CALL_REG
, mips_gp_register
);
5977 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5978 PIC_CALL_REG
, BFD_RELOC_MIPS_CALL_LO16
,
5981 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5982 PIC_CALL_REG
, BFD_RELOC_MIPS_GOT_PAGE
,
5984 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
5985 PIC_CALL_REG
, PIC_CALL_REG
,
5986 BFD_RELOC_MIPS_GOT_OFST
);
5990 macro_build_jalr (&offset_expr
);
5994 relax_start (offset_expr
.X_add_symbol
);
5997 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
5998 PIC_CALL_REG
, BFD_RELOC_MIPS_CALL16
,
6007 gpdelay
= reg_needs_delay (mips_gp_register
);
6008 macro_build (&offset_expr
, "lui", "t,u", PIC_CALL_REG
,
6009 BFD_RELOC_MIPS_CALL_HI16
);
6010 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", PIC_CALL_REG
,
6011 PIC_CALL_REG
, mips_gp_register
);
6012 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
6013 PIC_CALL_REG
, BFD_RELOC_MIPS_CALL_LO16
,
6018 macro_build (NULL
, "nop", "");
6020 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
6021 PIC_CALL_REG
, BFD_RELOC_MIPS_GOT16
,
6024 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j",
6025 PIC_CALL_REG
, PIC_CALL_REG
, BFD_RELOC_LO16
);
6027 macro_build_jalr (&offset_expr
);
6029 if (mips_cprestore_offset
< 0)
6030 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6033 if (! mips_frame_reg_valid
)
6035 as_warn (_("No .frame pseudo-op used in PIC code"));
6036 /* Quiet this warning. */
6037 mips_frame_reg_valid
= 1;
6039 if (! mips_cprestore_valid
)
6041 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6042 /* Quiet this warning. */
6043 mips_cprestore_valid
= 1;
6045 if (mips_opts
.noreorder
)
6046 macro_build (NULL
, "nop", "");
6047 expr1
.X_add_number
= mips_cprestore_offset
;
6048 macro_build_ldst_constoffset (&expr1
, ADDRESS_LOAD_INSN
,
6051 HAVE_64BIT_ADDRESSES
);
6055 else if (mips_pic
== VXWORKS_PIC
)
6056 as_bad (_("Non-PIC jump used in PIC library"));
6079 /* Itbl support may require additional care here. */
6084 /* Itbl support may require additional care here. */
6089 /* Itbl support may require additional care here. */
6094 /* Itbl support may require additional care here. */
6106 if (mips_opts
.arch
== CPU_R4650
)
6108 as_bad (_("opcode not supported on this processor"));
6112 /* Itbl support may require additional care here. */
6117 /* Itbl support may require additional care here. */
6122 /* Itbl support may require additional care here. */
6142 if (breg
== treg
|| coproc
|| lr
)
6163 /* Itbl support may require additional care here. */
6168 /* Itbl support may require additional care here. */
6173 /* Itbl support may require additional care here. */
6178 /* Itbl support may require additional care here. */
6197 if (mips_opts
.arch
== CPU_R4650
)
6199 as_bad (_("opcode not supported on this processor"));
6204 /* Itbl support may require additional care here. */
6208 /* Itbl support may require additional care here. */
6213 /* Itbl support may require additional care here. */
6225 /* Itbl support may require additional care here. */
6226 if (mask
== M_LWC1_AB
6227 || mask
== M_SWC1_AB
6228 || mask
== M_LDC1_AB
6229 || mask
== M_SDC1_AB
6233 else if (mask
== M_CACHE_AB
)
6240 if (offset_expr
.X_op
!= O_constant
6241 && offset_expr
.X_op
!= O_symbol
)
6243 as_bad (_("expression too complex"));
6244 offset_expr
.X_op
= O_constant
;
6247 if (HAVE_32BIT_ADDRESSES
6248 && !IS_SEXT_32BIT_NUM (offset_expr
.X_add_number
))
6252 sprintf_vma (value
, offset_expr
.X_add_number
);
6253 as_bad (_("Number (0x%s) larger than 32 bits"), value
);
6256 /* A constant expression in PIC code can be handled just as it
6257 is in non PIC code. */
6258 if (offset_expr
.X_op
== O_constant
)
6260 expr1
.X_add_number
= ((offset_expr
.X_add_number
+ 0x8000)
6261 & ~(bfd_vma
) 0xffff);
6262 normalize_address_expr (&expr1
);
6263 load_register (tempreg
, &expr1
, HAVE_64BIT_ADDRESSES
);
6265 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6266 tempreg
, tempreg
, breg
);
6267 macro_build (&offset_expr
, s
, fmt
, treg
, BFD_RELOC_LO16
, tempreg
);
6269 else if (mips_pic
== NO_PIC
)
6271 /* If this is a reference to a GP relative symbol, and there
6272 is no base register, we want
6273 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6274 Otherwise, if there is no base register, we want
6275 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6276 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6277 If we have a constant, we need two instructions anyhow,
6278 so we always use the latter form.
6280 If we have a base register, and this is a reference to a
6281 GP relative symbol, we want
6282 addu $tempreg,$breg,$gp
6283 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6285 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6286 addu $tempreg,$tempreg,$breg
6287 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6288 With a constant we always use the latter case.
6290 With 64bit address space and no base register and $at usable,
6292 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6293 lui $at,<sym> (BFD_RELOC_HI16_S)
6294 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6297 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6298 If we have a base register, we want
6299 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6300 lui $at,<sym> (BFD_RELOC_HI16_S)
6301 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6305 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6307 Without $at we can't generate the optimal path for superscalar
6308 processors here since this would require two temporary registers.
6309 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6310 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6312 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6314 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6315 If we have a base register, we want
6316 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6317 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6319 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6321 daddu $tempreg,$tempreg,$breg
6322 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6324 For GP relative symbols in 64bit address space we can use
6325 the same sequence as in 32bit address space. */
6326 if (HAVE_64BIT_SYMBOLS
)
6328 if ((valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
6329 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
6331 relax_start (offset_expr
.X_add_symbol
);
6334 macro_build (&offset_expr
, s
, fmt
, treg
,
6335 BFD_RELOC_GPREL16
, mips_gp_register
);
6339 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6340 tempreg
, breg
, mips_gp_register
);
6341 macro_build (&offset_expr
, s
, fmt
, treg
,
6342 BFD_RELOC_GPREL16
, tempreg
);
6347 if (used_at
== 0 && !mips_opts
.noat
)
6349 macro_build (&offset_expr
, "lui", "t,u", tempreg
,
6350 BFD_RELOC_MIPS_HIGHEST
);
6351 macro_build (&offset_expr
, "lui", "t,u", AT
,
6353 macro_build (&offset_expr
, "daddiu", "t,r,j", tempreg
,
6354 tempreg
, BFD_RELOC_MIPS_HIGHER
);
6356 macro_build (NULL
, "daddu", "d,v,t", AT
, AT
, breg
);
6357 macro_build (NULL
, "dsll32", "d,w,<", tempreg
, tempreg
, 0);
6358 macro_build (NULL
, "daddu", "d,v,t", tempreg
, tempreg
, AT
);
6359 macro_build (&offset_expr
, s
, fmt
, treg
, BFD_RELOC_LO16
,
6365 macro_build (&offset_expr
, "lui", "t,u", tempreg
,
6366 BFD_RELOC_MIPS_HIGHEST
);
6367 macro_build (&offset_expr
, "daddiu", "t,r,j", tempreg
,
6368 tempreg
, BFD_RELOC_MIPS_HIGHER
);
6369 macro_build (NULL
, "dsll", "d,w,<", tempreg
, tempreg
, 16);
6370 macro_build (&offset_expr
, "daddiu", "t,r,j", tempreg
,
6371 tempreg
, BFD_RELOC_HI16_S
);
6372 macro_build (NULL
, "dsll", "d,w,<", tempreg
, tempreg
, 16);
6374 macro_build (NULL
, "daddu", "d,v,t",
6375 tempreg
, tempreg
, breg
);
6376 macro_build (&offset_expr
, s
, fmt
, treg
,
6377 BFD_RELOC_LO16
, tempreg
);
6380 if (mips_relax
.sequence
)
6387 if ((valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
6388 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
6390 relax_start (offset_expr
.X_add_symbol
);
6391 macro_build (&offset_expr
, s
, fmt
, treg
, BFD_RELOC_GPREL16
,
6395 macro_build_lui (&offset_expr
, tempreg
);
6396 macro_build (&offset_expr
, s
, fmt
, treg
,
6397 BFD_RELOC_LO16
, tempreg
);
6398 if (mips_relax
.sequence
)
6403 if ((valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
6404 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
6406 relax_start (offset_expr
.X_add_symbol
);
6407 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6408 tempreg
, breg
, mips_gp_register
);
6409 macro_build (&offset_expr
, s
, fmt
, treg
,
6410 BFD_RELOC_GPREL16
, tempreg
);
6413 macro_build_lui (&offset_expr
, tempreg
);
6414 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6415 tempreg
, tempreg
, breg
);
6416 macro_build (&offset_expr
, s
, fmt
, treg
,
6417 BFD_RELOC_LO16
, tempreg
);
6418 if (mips_relax
.sequence
)
6422 else if (!mips_big_got
)
6424 int lw_reloc_type
= (int) BFD_RELOC_MIPS_GOT16
;
6426 /* If this is a reference to an external symbol, we want
6427 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6429 <op> $treg,0($tempreg)
6431 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6433 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6434 <op> $treg,0($tempreg)
6437 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6438 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
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
);
6449 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6450 BFD_RELOC_MIPS_GOT_PAGE
, mips_gp_register
);
6452 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6453 tempreg
, tempreg
, breg
);
6454 macro_build (&offset_expr
, s
, fmt
, treg
,
6455 BFD_RELOC_MIPS_GOT_OFST
, tempreg
);
6458 expr1
.X_add_number
= offset_expr
.X_add_number
;
6459 offset_expr
.X_add_number
= 0;
6460 if (expr1
.X_add_number
< -0x8000
6461 || expr1
.X_add_number
>= 0x8000)
6462 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6463 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6464 lw_reloc_type
, mips_gp_register
);
6466 relax_start (offset_expr
.X_add_symbol
);
6468 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j", tempreg
,
6469 tempreg
, BFD_RELOC_LO16
);
6472 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6473 tempreg
, tempreg
, breg
);
6474 macro_build (&expr1
, s
, fmt
, treg
, BFD_RELOC_LO16
, tempreg
);
6476 else if (mips_big_got
&& !HAVE_NEWABI
)
6480 /* If this is a reference to an external symbol, we want
6481 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6482 addu $tempreg,$tempreg,$gp
6483 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6484 <op> $treg,0($tempreg)
6486 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6488 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6489 <op> $treg,0($tempreg)
6490 If there is a base register, we add it to $tempreg before
6491 the <op>. If there is a constant, we stick it in the
6492 <op> instruction. We don't handle constants larger than
6493 16 bits, because we have no way to load the upper 16 bits
6494 (actually, we could handle them for the subset of cases
6495 in which we are not using $at). */
6496 assert (offset_expr
.X_op
== O_symbol
);
6497 expr1
.X_add_number
= offset_expr
.X_add_number
;
6498 offset_expr
.X_add_number
= 0;
6499 if (expr1
.X_add_number
< -0x8000
6500 || expr1
.X_add_number
>= 0x8000)
6501 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6502 gpdelay
= reg_needs_delay (mips_gp_register
);
6503 relax_start (offset_expr
.X_add_symbol
);
6504 macro_build (&offset_expr
, "lui", "t,u", tempreg
,
6505 BFD_RELOC_MIPS_GOT_HI16
);
6506 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", tempreg
, tempreg
,
6508 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6509 BFD_RELOC_MIPS_GOT_LO16
, tempreg
);
6512 macro_build (NULL
, "nop", "");
6513 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6514 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
6516 macro_build (&offset_expr
, ADDRESS_ADDI_INSN
, "t,r,j", tempreg
,
6517 tempreg
, BFD_RELOC_LO16
);
6521 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6522 tempreg
, tempreg
, breg
);
6523 macro_build (&expr1
, s
, fmt
, treg
, BFD_RELOC_LO16
, tempreg
);
6525 else if (mips_big_got
&& HAVE_NEWABI
)
6527 /* If this is a reference to an external symbol, we want
6528 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6529 add $tempreg,$tempreg,$gp
6530 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6531 <op> $treg,<ofst>($tempreg)
6532 Otherwise, for local symbols, we want:
6533 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6534 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6535 assert (offset_expr
.X_op
== O_symbol
);
6536 expr1
.X_add_number
= offset_expr
.X_add_number
;
6537 offset_expr
.X_add_number
= 0;
6538 if (expr1
.X_add_number
< -0x8000
6539 || expr1
.X_add_number
>= 0x8000)
6540 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6541 relax_start (offset_expr
.X_add_symbol
);
6542 macro_build (&offset_expr
, "lui", "t,u", tempreg
,
6543 BFD_RELOC_MIPS_GOT_HI16
);
6544 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", tempreg
, tempreg
,
6546 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6547 BFD_RELOC_MIPS_GOT_LO16
, tempreg
);
6549 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6550 tempreg
, tempreg
, breg
);
6551 macro_build (&expr1
, s
, fmt
, treg
, BFD_RELOC_LO16
, tempreg
);
6554 offset_expr
.X_add_number
= expr1
.X_add_number
;
6555 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", tempreg
,
6556 BFD_RELOC_MIPS_GOT_PAGE
, mips_gp_register
);
6558 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6559 tempreg
, tempreg
, breg
);
6560 macro_build (&offset_expr
, s
, fmt
, treg
,
6561 BFD_RELOC_MIPS_GOT_OFST
, tempreg
);
6571 load_register (treg
, &imm_expr
, 0);
6575 load_register (treg
, &imm_expr
, 1);
6579 if (imm_expr
.X_op
== O_constant
)
6582 load_register (AT
, &imm_expr
, 0);
6583 macro_build (NULL
, "mtc1", "t,G", AT
, treg
);
6588 assert (offset_expr
.X_op
== O_symbol
6589 && strcmp (segment_name (S_GET_SEGMENT
6590 (offset_expr
.X_add_symbol
)),
6592 && offset_expr
.X_add_number
== 0);
6593 macro_build (&offset_expr
, "lwc1", "T,o(b)", treg
,
6594 BFD_RELOC_MIPS_LITERAL
, mips_gp_register
);
6599 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6600 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6601 order 32 bits of the value and the low order 32 bits are either
6602 zero or in OFFSET_EXPR. */
6603 if (imm_expr
.X_op
== O_constant
|| imm_expr
.X_op
== O_big
)
6605 if (HAVE_64BIT_GPRS
)
6606 load_register (treg
, &imm_expr
, 1);
6611 if (target_big_endian
)
6623 load_register (hreg
, &imm_expr
, 0);
6626 if (offset_expr
.X_op
== O_absent
)
6627 move_register (lreg
, 0);
6630 assert (offset_expr
.X_op
== O_constant
);
6631 load_register (lreg
, &offset_expr
, 0);
6638 /* We know that sym is in the .rdata section. First we get the
6639 upper 16 bits of the address. */
6640 if (mips_pic
== NO_PIC
)
6642 macro_build_lui (&offset_expr
, AT
);
6647 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", AT
,
6648 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
6652 /* Now we load the register(s). */
6653 if (HAVE_64BIT_GPRS
)
6656 macro_build (&offset_expr
, "ld", "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
6661 macro_build (&offset_expr
, "lw", "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
6664 /* FIXME: How in the world do we deal with the possible
6666 offset_expr
.X_add_number
+= 4;
6667 macro_build (&offset_expr
, "lw", "t,o(b)",
6668 treg
+ 1, BFD_RELOC_LO16
, AT
);
6674 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6675 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6676 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6677 the value and the low order 32 bits are either zero or in
6679 if (imm_expr
.X_op
== O_constant
|| imm_expr
.X_op
== O_big
)
6682 load_register (AT
, &imm_expr
, HAVE_64BIT_FPRS
);
6683 if (HAVE_64BIT_FPRS
)
6685 assert (HAVE_64BIT_GPRS
);
6686 macro_build (NULL
, "dmtc1", "t,S", AT
, treg
);
6690 macro_build (NULL
, "mtc1", "t,G", AT
, treg
+ 1);
6691 if (offset_expr
.X_op
== O_absent
)
6692 macro_build (NULL
, "mtc1", "t,G", 0, treg
);
6695 assert (offset_expr
.X_op
== O_constant
);
6696 load_register (AT
, &offset_expr
, 0);
6697 macro_build (NULL
, "mtc1", "t,G", AT
, treg
);
6703 assert (offset_expr
.X_op
== O_symbol
6704 && offset_expr
.X_add_number
== 0);
6705 s
= segment_name (S_GET_SEGMENT (offset_expr
.X_add_symbol
));
6706 if (strcmp (s
, ".lit8") == 0)
6708 if (mips_opts
.isa
!= ISA_MIPS1
)
6710 macro_build (&offset_expr
, "ldc1", "T,o(b)", treg
,
6711 BFD_RELOC_MIPS_LITERAL
, mips_gp_register
);
6714 breg
= mips_gp_register
;
6715 r
= BFD_RELOC_MIPS_LITERAL
;
6720 assert (strcmp (s
, RDATA_SECTION_NAME
) == 0);
6722 if (mips_pic
!= NO_PIC
)
6723 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", AT
,
6724 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
6727 /* FIXME: This won't work for a 64 bit address. */
6728 macro_build_lui (&offset_expr
, AT
);
6731 if (mips_opts
.isa
!= ISA_MIPS1
)
6733 macro_build (&offset_expr
, "ldc1", "T,o(b)",
6734 treg
, BFD_RELOC_LO16
, AT
);
6743 if (mips_opts
.arch
== CPU_R4650
)
6745 as_bad (_("opcode not supported on this processor"));
6748 /* Even on a big endian machine $fn comes before $fn+1. We have
6749 to adjust when loading from memory. */
6752 assert (mips_opts
.isa
== ISA_MIPS1
);
6753 macro_build (&offset_expr
, "lwc1", "T,o(b)",
6754 target_big_endian
? treg
+ 1 : treg
, r
, breg
);
6755 /* FIXME: A possible overflow which I don't know how to deal
6757 offset_expr
.X_add_number
+= 4;
6758 macro_build (&offset_expr
, "lwc1", "T,o(b)",
6759 target_big_endian
? treg
: treg
+ 1, r
, breg
);
6764 * The MIPS assembler seems to check for X_add_number not
6765 * being double aligned and generating:
6768 * addiu at,at,%lo(foo+1)
6771 * But, the resulting address is the same after relocation so why
6772 * generate the extra instruction?
6774 if (mips_opts
.arch
== CPU_R4650
)
6776 as_bad (_("opcode not supported on this processor"));
6779 /* Itbl support may require additional care here. */
6781 if (mips_opts
.isa
!= ISA_MIPS1
)
6792 if (mips_opts
.arch
== CPU_R4650
)
6794 as_bad (_("opcode not supported on this processor"));
6798 if (mips_opts
.isa
!= ISA_MIPS1
)
6806 /* Itbl support may require additional care here. */
6811 if (HAVE_64BIT_GPRS
)
6822 if (HAVE_64BIT_GPRS
)
6832 if (offset_expr
.X_op
!= O_symbol
6833 && offset_expr
.X_op
!= O_constant
)
6835 as_bad (_("expression too complex"));
6836 offset_expr
.X_op
= O_constant
;
6839 if (HAVE_32BIT_ADDRESSES
6840 && !IS_SEXT_32BIT_NUM (offset_expr
.X_add_number
))
6844 sprintf_vma (value
, offset_expr
.X_add_number
);
6845 as_bad (_("Number (0x%s) larger than 32 bits"), value
);
6848 /* Even on a big endian machine $fn comes before $fn+1. We have
6849 to adjust when loading from memory. We set coproc if we must
6850 load $fn+1 first. */
6851 /* Itbl support may require additional care here. */
6852 if (! target_big_endian
)
6855 if (mips_pic
== NO_PIC
6856 || offset_expr
.X_op
== O_constant
)
6858 /* If this is a reference to a GP relative symbol, we want
6859 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6860 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6861 If we have a base register, we use this
6863 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6864 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6865 If this is not a GP relative symbol, we want
6866 lui $at,<sym> (BFD_RELOC_HI16_S)
6867 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6868 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6869 If there is a base register, we add it to $at after the
6870 lui instruction. If there is a constant, we always use
6872 if (offset_expr
.X_op
== O_symbol
6873 && (valueT
) offset_expr
.X_add_number
<= MAX_GPREL_OFFSET
6874 && !nopic_need_relax (offset_expr
.X_add_symbol
, 1))
6876 relax_start (offset_expr
.X_add_symbol
);
6879 tempreg
= mips_gp_register
;
6883 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
6884 AT
, breg
, mips_gp_register
);
6889 /* Itbl support may require additional care here. */
6890 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
+ 1 : treg
,
6891 BFD_RELOC_GPREL16
, tempreg
);
6892 offset_expr
.X_add_number
+= 4;
6894 /* Set mips_optimize to 2 to avoid inserting an
6896 hold_mips_optimize
= mips_optimize
;
6898 /* Itbl support may require additional care here. */
6899 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
: treg
+ 1,
6900 BFD_RELOC_GPREL16
, tempreg
);
6901 mips_optimize
= hold_mips_optimize
;
6905 /* We just generated two relocs. When tc_gen_reloc
6906 handles this case, it will skip the first reloc and
6907 handle the second. The second reloc already has an
6908 extra addend of 4, which we added above. We must
6909 subtract it out, and then subtract another 4 to make
6910 the first reloc come out right. The second reloc
6911 will come out right because we are going to add 4 to
6912 offset_expr when we build its instruction below.
6914 If we have a symbol, then we don't want to include
6915 the offset, because it will wind up being included
6916 when we generate the reloc. */
6918 if (offset_expr
.X_op
== O_constant
)
6919 offset_expr
.X_add_number
-= 8;
6922 offset_expr
.X_add_number
= -4;
6923 offset_expr
.X_op
= O_constant
;
6927 macro_build_lui (&offset_expr
, AT
);
6929 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, breg
, AT
);
6930 /* Itbl support may require additional care here. */
6931 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
+ 1 : treg
,
6932 BFD_RELOC_LO16
, AT
);
6933 /* FIXME: How do we handle overflow here? */
6934 offset_expr
.X_add_number
+= 4;
6935 /* Itbl support may require additional care here. */
6936 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
: treg
+ 1,
6937 BFD_RELOC_LO16
, AT
);
6938 if (mips_relax
.sequence
)
6941 else if (!mips_big_got
)
6943 /* If this is a reference to an external symbol, we want
6944 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6949 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6951 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6952 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6953 If there is a base register we add it to $at before the
6954 lwc1 instructions. If there is a constant we include it
6955 in the lwc1 instructions. */
6957 expr1
.X_add_number
= offset_expr
.X_add_number
;
6958 if (expr1
.X_add_number
< -0x8000
6959 || expr1
.X_add_number
>= 0x8000 - 4)
6960 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6961 load_got_offset (AT
, &offset_expr
);
6964 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, breg
, AT
);
6966 /* Set mips_optimize to 2 to avoid inserting an undesired
6968 hold_mips_optimize
= mips_optimize
;
6971 /* Itbl support may require additional care here. */
6972 relax_start (offset_expr
.X_add_symbol
);
6973 macro_build (&expr1
, s
, fmt
, coproc
? treg
+ 1 : treg
,
6974 BFD_RELOC_LO16
, AT
);
6975 expr1
.X_add_number
+= 4;
6976 macro_build (&expr1
, s
, fmt
, coproc
? treg
: treg
+ 1,
6977 BFD_RELOC_LO16
, AT
);
6979 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
+ 1 : treg
,
6980 BFD_RELOC_LO16
, AT
);
6981 offset_expr
.X_add_number
+= 4;
6982 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
: treg
+ 1,
6983 BFD_RELOC_LO16
, AT
);
6986 mips_optimize
= hold_mips_optimize
;
6988 else if (mips_big_got
)
6992 /* If this is a reference to an external symbol, we want
6993 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6995 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7000 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7002 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7003 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7004 If there is a base register we add it to $at before the
7005 lwc1 instructions. If there is a constant we include it
7006 in the lwc1 instructions. */
7008 expr1
.X_add_number
= offset_expr
.X_add_number
;
7009 offset_expr
.X_add_number
= 0;
7010 if (expr1
.X_add_number
< -0x8000
7011 || expr1
.X_add_number
>= 0x8000 - 4)
7012 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7013 gpdelay
= reg_needs_delay (mips_gp_register
);
7014 relax_start (offset_expr
.X_add_symbol
);
7015 macro_build (&offset_expr
, "lui", "t,u",
7016 AT
, BFD_RELOC_MIPS_GOT_HI16
);
7017 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t",
7018 AT
, AT
, mips_gp_register
);
7019 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)",
7020 AT
, BFD_RELOC_MIPS_GOT_LO16
, AT
);
7023 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, breg
, AT
);
7024 /* Itbl support may require additional care here. */
7025 macro_build (&expr1
, s
, fmt
, coproc
? treg
+ 1 : treg
,
7026 BFD_RELOC_LO16
, AT
);
7027 expr1
.X_add_number
+= 4;
7029 /* Set mips_optimize to 2 to avoid inserting an undesired
7031 hold_mips_optimize
= mips_optimize
;
7033 /* Itbl support may require additional care here. */
7034 macro_build (&expr1
, s
, fmt
, coproc
? treg
: treg
+ 1,
7035 BFD_RELOC_LO16
, AT
);
7036 mips_optimize
= hold_mips_optimize
;
7037 expr1
.X_add_number
-= 4;
7040 offset_expr
.X_add_number
= expr1
.X_add_number
;
7042 macro_build (NULL
, "nop", "");
7043 macro_build (&offset_expr
, ADDRESS_LOAD_INSN
, "t,o(b)", AT
,
7044 BFD_RELOC_MIPS_GOT16
, mips_gp_register
);
7047 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, breg
, AT
);
7048 /* Itbl support may require additional care here. */
7049 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
+ 1 : treg
,
7050 BFD_RELOC_LO16
, AT
);
7051 offset_expr
.X_add_number
+= 4;
7053 /* Set mips_optimize to 2 to avoid inserting an undesired
7055 hold_mips_optimize
= mips_optimize
;
7057 /* Itbl support may require additional care here. */
7058 macro_build (&offset_expr
, s
, fmt
, coproc
? treg
: treg
+ 1,
7059 BFD_RELOC_LO16
, AT
);
7060 mips_optimize
= hold_mips_optimize
;
7074 assert (HAVE_32BIT_ADDRESSES
);
7075 macro_build (&offset_expr
, s
, "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
7076 offset_expr
.X_add_number
+= 4;
7077 macro_build (&offset_expr
, s
, "t,o(b)", treg
+ 1, BFD_RELOC_LO16
, breg
);
7080 /* New code added to support COPZ instructions.
7081 This code builds table entries out of the macros in mip_opcodes.
7082 R4000 uses interlocks to handle coproc delays.
7083 Other chips (like the R3000) require nops to be inserted for delays.
7085 FIXME: Currently, we require that the user handle delays.
7086 In order to fill delay slots for non-interlocked chips,
7087 we must have a way to specify delays based on the coprocessor.
7088 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7089 What are the side-effects of the cop instruction?
7090 What cache support might we have and what are its effects?
7091 Both coprocessor & memory require delays. how long???
7092 What registers are read/set/modified?
7094 If an itbl is provided to interpret cop instructions,
7095 this knowledge can be encoded in the itbl spec. */
7109 /* For now we just do C (same as Cz). The parameter will be
7110 stored in insn_opcode by mips_ip. */
7111 macro_build (NULL
, s
, "C", ip
->insn_opcode
);
7115 move_register (dreg
, sreg
);
7118 #ifdef LOSING_COMPILER
7120 /* Try and see if this is a new itbl instruction.
7121 This code builds table entries out of the macros in mip_opcodes.
7122 FIXME: For now we just assemble the expression and pass it's
7123 value along as a 32-bit immediate.
7124 We may want to have the assembler assemble this value,
7125 so that we gain the assembler's knowledge of delay slots,
7127 Would it be more efficient to use mask (id) here? */
7128 if (itbl_have_entries
7129 && (immed_expr
= itbl_assemble (ip
->insn_mo
->name
, "")))
7131 s
= ip
->insn_mo
->name
;
7133 coproc
= ITBL_DECODE_PNUM (immed_expr
);;
7134 macro_build (&immed_expr
, s
, "C");
7140 if (mips_opts
.noat
&& used_at
)
7141 as_bad (_("Macro used $at after \".set noat\""));
7145 macro2 (struct mips_cl_insn
*ip
)
7147 int treg
, sreg
, dreg
, breg
;
7162 bfd_reloc_code_real_type r
;
7164 treg
= (ip
->insn_opcode
>> 16) & 0x1f;
7165 dreg
= (ip
->insn_opcode
>> 11) & 0x1f;
7166 sreg
= breg
= (ip
->insn_opcode
>> 21) & 0x1f;
7167 mask
= ip
->insn_mo
->mask
;
7169 expr1
.X_op
= O_constant
;
7170 expr1
.X_op_symbol
= NULL
;
7171 expr1
.X_add_symbol
= NULL
;
7172 expr1
.X_add_number
= 1;
7176 #endif /* LOSING_COMPILER */
7181 macro_build (NULL
, dbl
? "dmultu" : "multu", "s,t", sreg
, treg
);
7182 macro_build (NULL
, "mflo", "d", dreg
);
7188 /* The MIPS assembler some times generates shifts and adds. I'm
7189 not trying to be that fancy. GCC should do this for us
7192 load_register (AT
, &imm_expr
, dbl
);
7193 macro_build (NULL
, dbl
? "dmult" : "mult", "s,t", sreg
, AT
);
7194 macro_build (NULL
, "mflo", "d", dreg
);
7210 load_register (AT
, &imm_expr
, dbl
);
7211 macro_build (NULL
, dbl
? "dmult" : "mult", "s,t", sreg
, imm
? AT
: treg
);
7212 macro_build (NULL
, "mflo", "d", dreg
);
7213 macro_build (NULL
, dbl
? "dsra32" : "sra", "d,w,<", dreg
, dreg
, RA
);
7214 macro_build (NULL
, "mfhi", "d", AT
);
7216 macro_build (NULL
, "tne", "s,t,q", dreg
, AT
, 6);
7219 expr1
.X_add_number
= 8;
7220 macro_build (&expr1
, "beq", "s,t,p", dreg
, AT
);
7221 macro_build (NULL
, "nop", "", 0);
7222 macro_build (NULL
, "break", "c", 6);
7225 macro_build (NULL
, "mflo", "d", dreg
);
7241 load_register (AT
, &imm_expr
, dbl
);
7242 macro_build (NULL
, dbl
? "dmultu" : "multu", "s,t",
7243 sreg
, imm
? AT
: treg
);
7244 macro_build (NULL
, "mfhi", "d", AT
);
7245 macro_build (NULL
, "mflo", "d", dreg
);
7247 macro_build (NULL
, "tne", "s,t,q", AT
, 0, 6);
7250 expr1
.X_add_number
= 8;
7251 macro_build (&expr1
, "beq", "s,t,p", AT
, 0);
7252 macro_build (NULL
, "nop", "", 0);
7253 macro_build (NULL
, "break", "c", 6);
7259 if (ISA_HAS_DROR (mips_opts
.isa
) || CPU_HAS_DROR (mips_opts
.arch
))
7270 macro_build (NULL
, "dnegu", "d,w", tempreg
, treg
);
7271 macro_build (NULL
, "drorv", "d,t,s", dreg
, sreg
, tempreg
);
7275 macro_build (NULL
, "dsubu", "d,v,t", AT
, 0, treg
);
7276 macro_build (NULL
, "dsrlv", "d,t,s", AT
, sreg
, AT
);
7277 macro_build (NULL
, "dsllv", "d,t,s", dreg
, sreg
, treg
);
7278 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7282 if (ISA_HAS_ROR (mips_opts
.isa
) || CPU_HAS_ROR (mips_opts
.arch
))
7293 macro_build (NULL
, "negu", "d,w", tempreg
, treg
);
7294 macro_build (NULL
, "rorv", "d,t,s", dreg
, sreg
, tempreg
);
7298 macro_build (NULL
, "subu", "d,v,t", AT
, 0, treg
);
7299 macro_build (NULL
, "srlv", "d,t,s", AT
, sreg
, AT
);
7300 macro_build (NULL
, "sllv", "d,t,s", dreg
, sreg
, treg
);
7301 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7309 if (imm_expr
.X_op
!= O_constant
)
7310 as_bad (_("Improper rotate count"));
7311 rot
= imm_expr
.X_add_number
& 0x3f;
7312 if (ISA_HAS_DROR (mips_opts
.isa
) || CPU_HAS_DROR (mips_opts
.arch
))
7314 rot
= (64 - rot
) & 0x3f;
7316 macro_build (NULL
, "dror32", "d,w,<", dreg
, sreg
, rot
- 32);
7318 macro_build (NULL
, "dror", "d,w,<", dreg
, sreg
, rot
);
7323 macro_build (NULL
, "dsrl", "d,w,<", dreg
, sreg
, 0);
7326 l
= (rot
< 0x20) ? "dsll" : "dsll32";
7327 r
= ((0x40 - rot
) < 0x20) ? "dsrl" : "dsrl32";
7330 macro_build (NULL
, l
, "d,w,<", AT
, sreg
, rot
);
7331 macro_build (NULL
, r
, "d,w,<", dreg
, sreg
, (0x20 - rot
) & 0x1f);
7332 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7340 if (imm_expr
.X_op
!= O_constant
)
7341 as_bad (_("Improper rotate count"));
7342 rot
= imm_expr
.X_add_number
& 0x1f;
7343 if (ISA_HAS_ROR (mips_opts
.isa
) || CPU_HAS_ROR (mips_opts
.arch
))
7345 macro_build (NULL
, "ror", "d,w,<", dreg
, sreg
, (32 - rot
) & 0x1f);
7350 macro_build (NULL
, "srl", "d,w,<", dreg
, sreg
, 0);
7354 macro_build (NULL
, "sll", "d,w,<", AT
, sreg
, rot
);
7355 macro_build (NULL
, "srl", "d,w,<", dreg
, sreg
, (0x20 - rot
) & 0x1f);
7356 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7361 if (ISA_HAS_DROR (mips_opts
.isa
) || CPU_HAS_DROR (mips_opts
.arch
))
7363 macro_build (NULL
, "drorv", "d,t,s", dreg
, sreg
, treg
);
7367 macro_build (NULL
, "dsubu", "d,v,t", AT
, 0, treg
);
7368 macro_build (NULL
, "dsllv", "d,t,s", AT
, sreg
, AT
);
7369 macro_build (NULL
, "dsrlv", "d,t,s", dreg
, sreg
, treg
);
7370 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7374 if (ISA_HAS_ROR (mips_opts
.isa
) || CPU_HAS_ROR (mips_opts
.arch
))
7376 macro_build (NULL
, "rorv", "d,t,s", dreg
, sreg
, treg
);
7380 macro_build (NULL
, "subu", "d,v,t", AT
, 0, treg
);
7381 macro_build (NULL
, "sllv", "d,t,s", AT
, sreg
, AT
);
7382 macro_build (NULL
, "srlv", "d,t,s", dreg
, sreg
, treg
);
7383 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7391 if (imm_expr
.X_op
!= O_constant
)
7392 as_bad (_("Improper rotate count"));
7393 rot
= imm_expr
.X_add_number
& 0x3f;
7394 if (ISA_HAS_DROR (mips_opts
.isa
) || CPU_HAS_DROR (mips_opts
.arch
))
7397 macro_build (NULL
, "dror32", "d,w,<", dreg
, sreg
, rot
- 32);
7399 macro_build (NULL
, "dror", "d,w,<", dreg
, sreg
, rot
);
7404 macro_build (NULL
, "dsrl", "d,w,<", dreg
, sreg
, 0);
7407 r
= (rot
< 0x20) ? "dsrl" : "dsrl32";
7408 l
= ((0x40 - rot
) < 0x20) ? "dsll" : "dsll32";
7411 macro_build (NULL
, r
, "d,w,<", AT
, sreg
, rot
);
7412 macro_build (NULL
, l
, "d,w,<", dreg
, sreg
, (0x20 - rot
) & 0x1f);
7413 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7421 if (imm_expr
.X_op
!= O_constant
)
7422 as_bad (_("Improper rotate count"));
7423 rot
= imm_expr
.X_add_number
& 0x1f;
7424 if (ISA_HAS_ROR (mips_opts
.isa
) || CPU_HAS_ROR (mips_opts
.arch
))
7426 macro_build (NULL
, "ror", "d,w,<", dreg
, sreg
, rot
);
7431 macro_build (NULL
, "srl", "d,w,<", dreg
, sreg
, 0);
7435 macro_build (NULL
, "srl", "d,w,<", AT
, sreg
, rot
);
7436 macro_build (NULL
, "sll", "d,w,<", dreg
, sreg
, (0x20 - rot
) & 0x1f);
7437 macro_build (NULL
, "or", "d,v,t", dreg
, dreg
, AT
);
7442 if (mips_opts
.arch
== CPU_R4650
)
7444 as_bad (_("opcode not supported on this processor"));
7447 assert (mips_opts
.isa
== ISA_MIPS1
);
7448 /* Even on a big endian machine $fn comes before $fn+1. We have
7449 to adjust when storing to memory. */
7450 macro_build (&offset_expr
, "swc1", "T,o(b)",
7451 target_big_endian
? treg
+ 1 : treg
, BFD_RELOC_LO16
, breg
);
7452 offset_expr
.X_add_number
+= 4;
7453 macro_build (&offset_expr
, "swc1", "T,o(b)",
7454 target_big_endian
? treg
: treg
+ 1, BFD_RELOC_LO16
, breg
);
7459 macro_build (&expr1
, "sltiu", "t,r,j", dreg
, treg
, BFD_RELOC_LO16
);
7461 macro_build (&expr1
, "sltiu", "t,r,j", dreg
, sreg
, BFD_RELOC_LO16
);
7464 macro_build (NULL
, "xor", "d,v,t", dreg
, sreg
, treg
);
7465 macro_build (&expr1
, "sltiu", "t,r,j", dreg
, dreg
, BFD_RELOC_LO16
);
7470 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
7472 macro_build (&expr1
, "sltiu", "t,r,j", dreg
, sreg
, BFD_RELOC_LO16
);
7477 as_warn (_("Instruction %s: result is always false"),
7479 move_register (dreg
, 0);
7482 if (imm_expr
.X_op
== O_constant
7483 && imm_expr
.X_add_number
>= 0
7484 && imm_expr
.X_add_number
< 0x10000)
7486 macro_build (&imm_expr
, "xori", "t,r,i", dreg
, sreg
, BFD_RELOC_LO16
);
7488 else if (imm_expr
.X_op
== O_constant
7489 && imm_expr
.X_add_number
> -0x8000
7490 && imm_expr
.X_add_number
< 0)
7492 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
7493 macro_build (&imm_expr
, HAVE_32BIT_GPRS
? "addiu" : "daddiu",
7494 "t,r,j", dreg
, sreg
, BFD_RELOC_LO16
);
7498 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7499 macro_build (NULL
, "xor", "d,v,t", dreg
, sreg
, AT
);
7502 macro_build (&expr1
, "sltiu", "t,r,j", dreg
, dreg
, BFD_RELOC_LO16
);
7505 case M_SGE
: /* sreg >= treg <==> not (sreg < treg) */
7511 macro_build (NULL
, s
, "d,v,t", dreg
, sreg
, treg
);
7512 macro_build (&expr1
, "xori", "t,r,i", dreg
, dreg
, BFD_RELOC_LO16
);
7515 case M_SGE_I
: /* sreg >= I <==> not (sreg < I) */
7517 if (imm_expr
.X_op
== O_constant
7518 && imm_expr
.X_add_number
>= -0x8000
7519 && imm_expr
.X_add_number
< 0x8000)
7521 macro_build (&imm_expr
, mask
== M_SGE_I
? "slti" : "sltiu", "t,r,j",
7522 dreg
, sreg
, BFD_RELOC_LO16
);
7526 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7527 macro_build (NULL
, mask
== M_SGE_I
? "slt" : "sltu", "d,v,t",
7531 macro_build (&expr1
, "xori", "t,r,i", dreg
, dreg
, BFD_RELOC_LO16
);
7534 case M_SGT
: /* sreg > treg <==> treg < sreg */
7540 macro_build (NULL
, s
, "d,v,t", dreg
, treg
, sreg
);
7543 case M_SGT_I
: /* sreg > I <==> I < sreg */
7550 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7551 macro_build (NULL
, s
, "d,v,t", dreg
, AT
, sreg
);
7554 case M_SLE
: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7560 macro_build (NULL
, s
, "d,v,t", dreg
, treg
, sreg
);
7561 macro_build (&expr1
, "xori", "t,r,i", dreg
, dreg
, BFD_RELOC_LO16
);
7564 case M_SLE_I
: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7571 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7572 macro_build (NULL
, s
, "d,v,t", dreg
, AT
, sreg
);
7573 macro_build (&expr1
, "xori", "t,r,i", dreg
, dreg
, BFD_RELOC_LO16
);
7577 if (imm_expr
.X_op
== O_constant
7578 && imm_expr
.X_add_number
>= -0x8000
7579 && imm_expr
.X_add_number
< 0x8000)
7581 macro_build (&imm_expr
, "slti", "t,r,j", dreg
, sreg
, BFD_RELOC_LO16
);
7585 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7586 macro_build (NULL
, "slt", "d,v,t", dreg
, sreg
, AT
);
7590 if (imm_expr
.X_op
== O_constant
7591 && imm_expr
.X_add_number
>= -0x8000
7592 && imm_expr
.X_add_number
< 0x8000)
7594 macro_build (&imm_expr
, "sltiu", "t,r,j", dreg
, sreg
,
7599 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7600 macro_build (NULL
, "sltu", "d,v,t", dreg
, sreg
, AT
);
7605 macro_build (NULL
, "sltu", "d,v,t", dreg
, 0, treg
);
7607 macro_build (NULL
, "sltu", "d,v,t", dreg
, 0, sreg
);
7610 macro_build (NULL
, "xor", "d,v,t", dreg
, sreg
, treg
);
7611 macro_build (NULL
, "sltu", "d,v,t", dreg
, 0, dreg
);
7616 if (imm_expr
.X_op
== O_constant
&& imm_expr
.X_add_number
== 0)
7618 macro_build (NULL
, "sltu", "d,v,t", dreg
, 0, sreg
);
7623 as_warn (_("Instruction %s: result is always true"),
7625 macro_build (&expr1
, HAVE_32BIT_GPRS
? "addiu" : "daddiu", "t,r,j",
7626 dreg
, 0, BFD_RELOC_LO16
);
7629 if (imm_expr
.X_op
== O_constant
7630 && imm_expr
.X_add_number
>= 0
7631 && imm_expr
.X_add_number
< 0x10000)
7633 macro_build (&imm_expr
, "xori", "t,r,i", dreg
, sreg
, BFD_RELOC_LO16
);
7635 else if (imm_expr
.X_op
== O_constant
7636 && imm_expr
.X_add_number
> -0x8000
7637 && imm_expr
.X_add_number
< 0)
7639 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
7640 macro_build (&imm_expr
, HAVE_32BIT_GPRS
? "addiu" : "daddiu",
7641 "t,r,j", dreg
, sreg
, BFD_RELOC_LO16
);
7645 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7646 macro_build (NULL
, "xor", "d,v,t", dreg
, sreg
, AT
);
7649 macro_build (NULL
, "sltu", "d,v,t", dreg
, 0, dreg
);
7655 if (imm_expr
.X_op
== O_constant
7656 && imm_expr
.X_add_number
> -0x8000
7657 && imm_expr
.X_add_number
<= 0x8000)
7659 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
7660 macro_build (&imm_expr
, dbl
? "daddi" : "addi", "t,r,j",
7661 dreg
, sreg
, BFD_RELOC_LO16
);
7665 load_register (AT
, &imm_expr
, dbl
);
7666 macro_build (NULL
, dbl
? "dsub" : "sub", "d,v,t", dreg
, sreg
, AT
);
7672 if (imm_expr
.X_op
== O_constant
7673 && imm_expr
.X_add_number
> -0x8000
7674 && imm_expr
.X_add_number
<= 0x8000)
7676 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
7677 macro_build (&imm_expr
, dbl
? "daddiu" : "addiu", "t,r,j",
7678 dreg
, sreg
, BFD_RELOC_LO16
);
7682 load_register (AT
, &imm_expr
, dbl
);
7683 macro_build (NULL
, dbl
? "dsubu" : "subu", "d,v,t", dreg
, sreg
, AT
);
7705 load_register (AT
, &imm_expr
, HAVE_64BIT_GPRS
);
7706 macro_build (NULL
, s
, "s,t", sreg
, AT
);
7711 assert (mips_opts
.isa
== ISA_MIPS1
);
7713 sreg
= (ip
->insn_opcode
>> 11) & 0x1f; /* floating reg */
7714 dreg
= (ip
->insn_opcode
>> 06) & 0x1f; /* floating reg */
7717 * Is the double cfc1 instruction a bug in the mips assembler;
7718 * or is there a reason for it?
7721 macro_build (NULL
, "cfc1", "t,G", treg
, RA
);
7722 macro_build (NULL
, "cfc1", "t,G", treg
, RA
);
7723 macro_build (NULL
, "nop", "");
7724 expr1
.X_add_number
= 3;
7725 macro_build (&expr1
, "ori", "t,r,i", AT
, treg
, BFD_RELOC_LO16
);
7726 expr1
.X_add_number
= 2;
7727 macro_build (&expr1
, "xori", "t,r,i", AT
, AT
, BFD_RELOC_LO16
);
7728 macro_build (NULL
, "ctc1", "t,G", AT
, RA
);
7729 macro_build (NULL
, "nop", "");
7730 macro_build (NULL
, mask
== M_TRUNCWD
? "cvt.w.d" : "cvt.w.s", "D,S",
7732 macro_build (NULL
, "ctc1", "t,G", treg
, RA
);
7733 macro_build (NULL
, "nop", "");
7744 if (offset_expr
.X_add_number
>= 0x7fff)
7745 as_bad (_("operand overflow"));
7746 if (! target_big_endian
)
7747 ++offset_expr
.X_add_number
;
7748 macro_build (&offset_expr
, s
, "t,o(b)", AT
, BFD_RELOC_LO16
, breg
);
7749 if (! target_big_endian
)
7750 --offset_expr
.X_add_number
;
7752 ++offset_expr
.X_add_number
;
7753 macro_build (&offset_expr
, "lbu", "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
7754 macro_build (NULL
, "sll", "d,w,<", AT
, AT
, 8);
7755 macro_build (NULL
, "or", "d,v,t", treg
, treg
, AT
);
7768 if (offset_expr
.X_add_number
>= 0x8000 - off
)
7769 as_bad (_("operand overflow"));
7777 if (! target_big_endian
)
7778 offset_expr
.X_add_number
+= off
;
7779 macro_build (&offset_expr
, s
, "t,o(b)", tempreg
, BFD_RELOC_LO16
, breg
);
7780 if (! target_big_endian
)
7781 offset_expr
.X_add_number
-= off
;
7783 offset_expr
.X_add_number
+= off
;
7784 macro_build (&offset_expr
, s2
, "t,o(b)", tempreg
, BFD_RELOC_LO16
, breg
);
7786 /* If necessary, move the result in tempreg the final destination. */
7787 if (treg
== tempreg
)
7789 /* Protect second load's delay slot. */
7791 move_register (treg
, tempreg
);
7805 load_address (AT
, &offset_expr
, &used_at
);
7807 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, AT
, breg
);
7808 if (! target_big_endian
)
7809 expr1
.X_add_number
= off
;
7811 expr1
.X_add_number
= 0;
7812 macro_build (&expr1
, s
, "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7813 if (! target_big_endian
)
7814 expr1
.X_add_number
= 0;
7816 expr1
.X_add_number
= off
;
7817 macro_build (&expr1
, s2
, "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7823 load_address (AT
, &offset_expr
, &used_at
);
7825 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, AT
, breg
);
7826 if (target_big_endian
)
7827 expr1
.X_add_number
= 0;
7828 macro_build (&expr1
, mask
== M_ULH_A
? "lb" : "lbu", "t,o(b)",
7829 treg
, BFD_RELOC_LO16
, AT
);
7830 if (target_big_endian
)
7831 expr1
.X_add_number
= 1;
7833 expr1
.X_add_number
= 0;
7834 macro_build (&expr1
, "lbu", "t,o(b)", AT
, BFD_RELOC_LO16
, AT
);
7835 macro_build (NULL
, "sll", "d,w,<", treg
, treg
, 8);
7836 macro_build (NULL
, "or", "d,v,t", treg
, treg
, AT
);
7841 if (offset_expr
.X_add_number
>= 0x7fff)
7842 as_bad (_("operand overflow"));
7843 if (target_big_endian
)
7844 ++offset_expr
.X_add_number
;
7845 macro_build (&offset_expr
, "sb", "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
7846 macro_build (NULL
, "srl", "d,w,<", AT
, treg
, 8);
7847 if (target_big_endian
)
7848 --offset_expr
.X_add_number
;
7850 ++offset_expr
.X_add_number
;
7851 macro_build (&offset_expr
, "sb", "t,o(b)", AT
, BFD_RELOC_LO16
, breg
);
7864 if (offset_expr
.X_add_number
>= 0x8000 - off
)
7865 as_bad (_("operand overflow"));
7866 if (! target_big_endian
)
7867 offset_expr
.X_add_number
+= off
;
7868 macro_build (&offset_expr
, s
, "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
7869 if (! target_big_endian
)
7870 offset_expr
.X_add_number
-= off
;
7872 offset_expr
.X_add_number
+= off
;
7873 macro_build (&offset_expr
, s2
, "t,o(b)", treg
, BFD_RELOC_LO16
, breg
);
7887 load_address (AT
, &offset_expr
, &used_at
);
7889 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, AT
, breg
);
7890 if (! target_big_endian
)
7891 expr1
.X_add_number
= off
;
7893 expr1
.X_add_number
= 0;
7894 macro_build (&expr1
, s
, "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7895 if (! target_big_endian
)
7896 expr1
.X_add_number
= 0;
7898 expr1
.X_add_number
= off
;
7899 macro_build (&expr1
, s2
, "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7904 load_address (AT
, &offset_expr
, &used_at
);
7906 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", AT
, AT
, breg
);
7907 if (! target_big_endian
)
7908 expr1
.X_add_number
= 0;
7909 macro_build (&expr1
, "sb", "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7910 macro_build (NULL
, "srl", "d,w,<", treg
, treg
, 8);
7911 if (! target_big_endian
)
7912 expr1
.X_add_number
= 1;
7914 expr1
.X_add_number
= 0;
7915 macro_build (&expr1
, "sb", "t,o(b)", treg
, BFD_RELOC_LO16
, AT
);
7916 if (! target_big_endian
)
7917 expr1
.X_add_number
= 0;
7919 expr1
.X_add_number
= 1;
7920 macro_build (&expr1
, "lbu", "t,o(b)", AT
, BFD_RELOC_LO16
, AT
);
7921 macro_build (NULL
, "sll", "d,w,<", treg
, treg
, 8);
7922 macro_build (NULL
, "or", "d,v,t", treg
, treg
, AT
);
7926 /* FIXME: Check if this is one of the itbl macros, since they
7927 are added dynamically. */
7928 as_bad (_("Macro %s not implemented yet"), ip
->insn_mo
->name
);
7931 if (mips_opts
.noat
&& used_at
)
7932 as_bad (_("Macro used $at after \".set noat\""));
7935 /* Implement macros in mips16 mode. */
7938 mips16_macro (struct mips_cl_insn
*ip
)
7941 int xreg
, yreg
, zreg
, tmp
;
7944 const char *s
, *s2
, *s3
;
7946 mask
= ip
->insn_mo
->mask
;
7948 xreg
= MIPS16_EXTRACT_OPERAND (RX
, *ip
);
7949 yreg
= MIPS16_EXTRACT_OPERAND (RY
, *ip
);
7950 zreg
= MIPS16_EXTRACT_OPERAND (RZ
, *ip
);
7952 expr1
.X_op
= O_constant
;
7953 expr1
.X_op_symbol
= NULL
;
7954 expr1
.X_add_symbol
= NULL
;
7955 expr1
.X_add_number
= 1;
7975 macro_build (NULL
, dbl
? "ddiv" : "div", "0,x,y", xreg
, yreg
);
7976 expr1
.X_add_number
= 2;
7977 macro_build (&expr1
, "bnez", "x,p", yreg
);
7978 macro_build (NULL
, "break", "6", 7);
7980 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7981 since that causes an overflow. We should do that as well,
7982 but I don't see how to do the comparisons without a temporary
7985 macro_build (NULL
, s
, "x", zreg
);
8005 macro_build (NULL
, s
, "0,x,y", xreg
, yreg
);
8006 expr1
.X_add_number
= 2;
8007 macro_build (&expr1
, "bnez", "x,p", yreg
);
8008 macro_build (NULL
, "break", "6", 7);
8010 macro_build (NULL
, s2
, "x", zreg
);
8016 macro_build (NULL
, dbl
? "dmultu" : "multu", "x,y", xreg
, yreg
);
8017 macro_build (NULL
, "mflo", "x", zreg
);
8025 if (imm_expr
.X_op
!= O_constant
)
8026 as_bad (_("Unsupported large constant"));
8027 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
8028 macro_build (&imm_expr
, dbl
? "daddiu" : "addiu", "y,x,4", yreg
, xreg
);
8032 if (imm_expr
.X_op
!= O_constant
)
8033 as_bad (_("Unsupported large constant"));
8034 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
8035 macro_build (&imm_expr
, "addiu", "x,k", xreg
);
8039 if (imm_expr
.X_op
!= O_constant
)
8040 as_bad (_("Unsupported large constant"));
8041 imm_expr
.X_add_number
= -imm_expr
.X_add_number
;
8042 macro_build (&imm_expr
, "daddiu", "y,j", yreg
);
8064 goto do_reverse_branch
;
8068 goto do_reverse_branch
;
8080 goto do_reverse_branch
;
8091 macro_build (NULL
, s
, "x,y", xreg
, yreg
);
8092 macro_build (&offset_expr
, s2
, "p");
8119 goto do_addone_branch_i
;
8124 goto do_addone_branch_i
;
8139 goto do_addone_branch_i
;
8146 if (imm_expr
.X_op
!= O_constant
)
8147 as_bad (_("Unsupported large constant"));
8148 ++imm_expr
.X_add_number
;
8151 macro_build (&imm_expr
, s
, s3
, xreg
);
8152 macro_build (&offset_expr
, s2
, "p");
8156 expr1
.X_add_number
= 0;
8157 macro_build (&expr1
, "slti", "x,8", yreg
);
8159 move_register (xreg
, yreg
);
8160 expr1
.X_add_number
= 2;
8161 macro_build (&expr1
, "bteqz", "p");
8162 macro_build (NULL
, "neg", "x,w", xreg
, xreg
);
8166 /* For consistency checking, verify that all bits are specified either
8167 by the match/mask part of the instruction definition, or by the
8170 validate_mips_insn (const struct mips_opcode
*opc
)
8172 const char *p
= opc
->args
;
8174 unsigned long used_bits
= opc
->mask
;
8176 if ((used_bits
& opc
->match
) != opc
->match
)
8178 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8179 opc
->name
, opc
->args
);
8182 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8192 case '1': USE_BITS (OP_MASK_UDI1
, OP_SH_UDI1
); break;
8193 case '2': USE_BITS (OP_MASK_UDI2
, OP_SH_UDI2
); break;
8194 case '3': USE_BITS (OP_MASK_UDI3
, OP_SH_UDI3
); break;
8195 case '4': USE_BITS (OP_MASK_UDI4
, OP_SH_UDI4
); break;
8196 case 'A': USE_BITS (OP_MASK_SHAMT
, OP_SH_SHAMT
); break;
8197 case 'B': USE_BITS (OP_MASK_INSMSB
, OP_SH_INSMSB
); break;
8198 case 'C': USE_BITS (OP_MASK_EXTMSBD
, OP_SH_EXTMSBD
); break;
8199 case 'D': USE_BITS (OP_MASK_RD
, OP_SH_RD
);
8200 USE_BITS (OP_MASK_SEL
, OP_SH_SEL
); break;
8201 case 'E': USE_BITS (OP_MASK_SHAMT
, OP_SH_SHAMT
); break;
8202 case 'F': USE_BITS (OP_MASK_INSMSB
, OP_SH_INSMSB
); break;
8203 case 'G': USE_BITS (OP_MASK_EXTMSBD
, OP_SH_EXTMSBD
); break;
8204 case 'H': USE_BITS (OP_MASK_EXTMSBD
, OP_SH_EXTMSBD
); break;
8206 case 't': USE_BITS (OP_MASK_RT
, OP_SH_RT
); break;
8207 case 'T': USE_BITS (OP_MASK_RT
, OP_SH_RT
);
8208 USE_BITS (OP_MASK_SEL
, OP_SH_SEL
); break;
8210 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8211 c
, opc
->name
, opc
->args
);
8215 case '<': USE_BITS (OP_MASK_SHAMT
, OP_SH_SHAMT
); break;
8216 case '>': USE_BITS (OP_MASK_SHAMT
, OP_SH_SHAMT
); break;
8218 case 'B': USE_BITS (OP_MASK_CODE20
, OP_SH_CODE20
); break;
8219 case 'C': USE_BITS (OP_MASK_COPZ
, OP_SH_COPZ
); break;
8220 case 'D': USE_BITS (OP_MASK_FD
, OP_SH_FD
); break;
8221 case 'E': USE_BITS (OP_MASK_RT
, OP_SH_RT
); break;
8223 case 'G': USE_BITS (OP_MASK_RD
, OP_SH_RD
); break;
8224 case 'H': USE_BITS (OP_MASK_SEL
, OP_SH_SEL
); break;
8226 case 'J': USE_BITS (OP_MASK_CODE19
, OP_SH_CODE19
); break;
8227 case 'K': USE_BITS (OP_MASK_RD
, OP_SH_RD
); break;
8229 case 'M': USE_BITS (OP_MASK_CCC
, OP_SH_CCC
); break;
8230 case 'N': USE_BITS (OP_MASK_BCC
, OP_SH_BCC
); break;
8231 case 'O': USE_BITS (OP_MASK_ALN
, OP_SH_ALN
); break;
8232 case 'Q': USE_BITS (OP_MASK_VSEL
, OP_SH_VSEL
);
8233 USE_BITS (OP_MASK_FT
, OP_SH_FT
); break;
8234 case 'R': USE_BITS (OP_MASK_FR
, OP_SH_FR
); break;
8235 case 'S': USE_BITS (OP_MASK_FS
, OP_SH_FS
); break;
8236 case 'T': USE_BITS (OP_MASK_FT
, OP_SH_FT
); break;
8237 case 'V': USE_BITS (OP_MASK_FS
, OP_SH_FS
); break;
8238 case 'W': USE_BITS (OP_MASK_FT
, OP_SH_FT
); break;
8239 case 'X': USE_BITS (OP_MASK_FD
, OP_SH_FD
); break;
8240 case 'Y': USE_BITS (OP_MASK_FS
, OP_SH_FS
); break;
8241 case 'Z': USE_BITS (OP_MASK_FT
, OP_SH_FT
); break;
8242 case 'a': USE_BITS (OP_MASK_TARGET
, OP_SH_TARGET
); break;
8243 case 'b': USE_BITS (OP_MASK_RS
, OP_SH_RS
); break;
8244 case 'c': USE_BITS (OP_MASK_CODE
, OP_SH_CODE
); break;
8245 case 'd': USE_BITS (OP_MASK_RD
, OP_SH_RD
); break;
8247 case 'h': USE_BITS (OP_MASK_PREFX
, OP_SH_PREFX
); break;
8248 case 'i': USE_BITS (OP_MASK_IMMEDIATE
, OP_SH_IMMEDIATE
); break;
8249 case 'j': USE_BITS (OP_MASK_DELTA
, OP_SH_DELTA
); break;
8250 case 'k': USE_BITS (OP_MASK_CACHE
, OP_SH_CACHE
); break;
8252 case 'o': USE_BITS (OP_MASK_DELTA
, OP_SH_DELTA
); break;
8253 case 'p': USE_BITS (OP_MASK_DELTA
, OP_SH_DELTA
); break;
8254 case 'q': USE_BITS (OP_MASK_CODE2
, OP_SH_CODE2
); break;
8255 case 'r': USE_BITS (OP_MASK_RS
, OP_SH_RS
); break;
8256 case 's': USE_BITS (OP_MASK_RS
, OP_SH_RS
); break;
8257 case 't': USE_BITS (OP_MASK_RT
, OP_SH_RT
); break;
8258 case 'u': USE_BITS (OP_MASK_IMMEDIATE
, OP_SH_IMMEDIATE
); break;
8259 case 'v': USE_BITS (OP_MASK_RS
, OP_SH_RS
); break;
8260 case 'w': USE_BITS (OP_MASK_RT
, OP_SH_RT
); break;
8263 case 'P': USE_BITS (OP_MASK_PERFREG
, OP_SH_PERFREG
); break;
8264 case 'U': USE_BITS (OP_MASK_RD
, OP_SH_RD
);
8265 USE_BITS (OP_MASK_RT
, OP_SH_RT
); break;
8266 case 'e': USE_BITS (OP_MASK_VECBYTE
, OP_SH_VECBYTE
); break;
8267 case '%': USE_BITS (OP_MASK_VECALIGN
, OP_SH_VECALIGN
); break;
8270 case '2': USE_BITS (OP_MASK_BP
, OP_SH_BP
); break;
8271 case '3': USE_BITS (OP_MASK_SA3
, OP_SH_SA3
); break;
8272 case '4': USE_BITS (OP_MASK_SA4
, OP_SH_SA4
); break;
8273 case '5': USE_BITS (OP_MASK_IMM8
, OP_SH_IMM8
); break;
8274 case '6': USE_BITS (OP_MASK_RS
, OP_SH_RS
); break;
8275 case '7': USE_BITS (OP_MASK_DSPACC
, OP_SH_DSPACC
); break;
8276 case '8': USE_BITS (OP_MASK_WRDSP
, OP_SH_WRDSP
); break;
8277 case '9': USE_BITS (OP_MASK_DSPACC_S
, OP_SH_DSPACC_S
);break;
8278 case '0': USE_BITS (OP_MASK_DSPSFT
, OP_SH_DSPSFT
); break;
8279 case '\'': USE_BITS (OP_MASK_RDDSP
, OP_SH_RDDSP
); break;
8280 case ':': USE_BITS (OP_MASK_DSPSFT_7
, OP_SH_DSPSFT_7
);break;
8281 case '@': USE_BITS (OP_MASK_IMM10
, OP_SH_IMM10
); break;
8282 case '!': USE_BITS (OP_MASK_MT_U
, OP_SH_MT_U
); break;
8283 case '$': USE_BITS (OP_MASK_MT_H
, OP_SH_MT_H
); break;
8284 case '*': USE_BITS (OP_MASK_MTACC_T
, OP_SH_MTACC_T
); break;
8285 case '&': USE_BITS (OP_MASK_MTACC_D
, OP_SH_MTACC_D
); break;
8286 case 'g': USE_BITS (OP_MASK_RD
, OP_SH_RD
); break;
8288 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8289 c
, opc
->name
, opc
->args
);
8293 if (used_bits
!= 0xffffffff)
8295 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8296 ~used_bits
& 0xffffffff, opc
->name
, opc
->args
);
8302 /* UDI immediates. */
8310 static const struct mips_immed mips_immed
[] = {
8311 { '1', OP_SH_UDI1
, OP_MASK_UDI1
, 0},
8312 { '2', OP_SH_UDI2
, OP_MASK_UDI2
, 0},
8313 { '3', OP_SH_UDI3
, OP_MASK_UDI3
, 0},
8314 { '4', OP_SH_UDI4
, OP_MASK_UDI4
, 0},
8318 /* Check whether an odd floating-point register is allowed. */
8320 mips_oddfpreg_ok (const struct mips_opcode
*insn
, int argnum
)
8322 const char *s
= insn
->name
;
8324 if (insn
->pinfo
== INSN_MACRO
)
8325 /* Let a macro pass, we'll catch it later when it is expanded. */
8328 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts
.isa
))
8330 /* Allow odd registers for single-precision ops. */
8331 switch (insn
->pinfo
& (FP_S
| FP_D
))
8335 return 1; /* both single precision - ok */
8337 return 0; /* both double precision - fail */
8342 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8343 s
= strchr (insn
->name
, '.');
8345 s
= s
!= NULL
? strchr (s
+ 1, '.') : NULL
;
8346 return (s
!= NULL
&& (s
[1] == 'w' || s
[1] == 's'));
8349 /* Single-precision coprocessor loads and moves are OK too. */
8350 if ((insn
->pinfo
& FP_S
)
8351 && (insn
->pinfo
& (INSN_COPROC_MEMORY_DELAY
| INSN_STORE_MEMORY
8352 | INSN_LOAD_COPROC_DELAY
| INSN_COPROC_MOVE_DELAY
)))
8358 /* This routine assembles an instruction into its binary format. As a
8359 side effect, it sets one of the global variables imm_reloc or
8360 offset_reloc to the type of relocation to do if one of the operands
8361 is an address expression. */
8364 mips_ip (char *str
, struct mips_cl_insn
*ip
)
8369 struct mips_opcode
*insn
;
8372 unsigned int lastregno
= 0;
8373 unsigned int lastpos
= 0;
8374 unsigned int limlo
, limhi
;
8377 offsetT min_range
, max_range
;
8383 /* If the instruction contains a '.', we first try to match an instruction
8384 including the '.'. Then we try again without the '.'. */
8386 for (s
= str
; *s
!= '\0' && !ISSPACE (*s
); ++s
)
8389 /* If we stopped on whitespace, then replace the whitespace with null for
8390 the call to hash_find. Save the character we replaced just in case we
8391 have to re-parse the instruction. */
8398 insn
= (struct mips_opcode
*) hash_find (op_hash
, str
);
8400 /* If we didn't find the instruction in the opcode table, try again, but
8401 this time with just the instruction up to, but not including the
8405 /* Restore the character we overwrite above (if any). */
8409 /* Scan up to the first '.' or whitespace. */
8411 *s
!= '\0' && *s
!= '.' && !ISSPACE (*s
);
8415 /* If we did not find a '.', then we can quit now. */
8418 insn_error
= "unrecognized opcode";
8422 /* Lookup the instruction in the hash table. */
8424 if ((insn
= (struct mips_opcode
*) hash_find (op_hash
, str
)) == NULL
)
8426 insn_error
= "unrecognized opcode";
8436 assert (strcmp (insn
->name
, str
) == 0);
8438 if (OPCODE_IS_MEMBER (insn
,
8440 /* We don't check for mips_opts.mips16 here since
8441 we want to allow jalx if -mips16 was specified
8442 on the command line. */
8443 | (file_ase_mips16
? INSN_MIPS16
: 0)
8444 | (mips_opts
.ase_mdmx
? INSN_MDMX
: 0)
8445 | (mips_opts
.ase_dsp
? INSN_DSP
: 0)
8446 | ((mips_opts
.ase_dsp
&& ISA_SUPPORTS_DSP64_ASE
)
8448 | (mips_opts
.ase_dspr2
? INSN_DSPR2
: 0)
8449 | (mips_opts
.ase_mt
? INSN_MT
: 0)
8450 | (mips_opts
.ase_mips3d
? INSN_MIPS3D
: 0)
8451 | (mips_opts
.ase_smartmips
? INSN_SMARTMIPS
: 0)),
8457 if (insn
->pinfo
!= INSN_MACRO
)
8459 if (mips_opts
.arch
== CPU_R4650
&& (insn
->pinfo
& FP_D
) != 0)
8465 if (insn
+ 1 < &mips_opcodes
[NUMOPCODES
]
8466 && strcmp (insn
->name
, insn
[1].name
) == 0)
8475 static char buf
[100];
8477 _("opcode not supported on this processor: %s (%s)"),
8478 mips_cpu_info_from_arch (mips_opts
.arch
)->name
,
8479 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
8488 create_insn (ip
, insn
);
8491 for (args
= insn
->args
;; ++args
)
8495 s
+= strspn (s
, " \t");
8499 case '\0': /* end of args */
8504 case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8505 my_getExpression (&imm_expr
, s
);
8506 check_absolute_expr (ip
, &imm_expr
);
8507 if ((unsigned long) imm_expr
.X_add_number
!= 1
8508 && (unsigned long) imm_expr
.X_add_number
!= 3)
8510 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8511 (unsigned long) imm_expr
.X_add_number
);
8513 INSERT_OPERAND (BP
, *ip
, imm_expr
.X_add_number
);
8514 imm_expr
.X_op
= O_absent
;
8518 case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8519 my_getExpression (&imm_expr
, s
);
8520 check_absolute_expr (ip
, &imm_expr
);
8521 if (imm_expr
.X_add_number
& ~OP_MASK_SA3
)
8523 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8524 OP_MASK_SA3
, (unsigned long) imm_expr
.X_add_number
);
8526 INSERT_OPERAND (SA3
, *ip
, imm_expr
.X_add_number
);
8527 imm_expr
.X_op
= O_absent
;
8531 case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8532 my_getExpression (&imm_expr
, s
);
8533 check_absolute_expr (ip
, &imm_expr
);
8534 if (imm_expr
.X_add_number
& ~OP_MASK_SA4
)
8536 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8537 OP_MASK_SA4
, (unsigned long) imm_expr
.X_add_number
);
8539 INSERT_OPERAND (SA4
, *ip
, imm_expr
.X_add_number
);
8540 imm_expr
.X_op
= O_absent
;
8544 case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8545 my_getExpression (&imm_expr
, s
);
8546 check_absolute_expr (ip
, &imm_expr
);
8547 if (imm_expr
.X_add_number
& ~OP_MASK_IMM8
)
8549 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8550 OP_MASK_IMM8
, (unsigned long) imm_expr
.X_add_number
);
8552 INSERT_OPERAND (IMM8
, *ip
, imm_expr
.X_add_number
);
8553 imm_expr
.X_op
= O_absent
;
8557 case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8558 my_getExpression (&imm_expr
, s
);
8559 check_absolute_expr (ip
, &imm_expr
);
8560 if (imm_expr
.X_add_number
& ~OP_MASK_RS
)
8562 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8563 OP_MASK_RS
, (unsigned long) imm_expr
.X_add_number
);
8565 INSERT_OPERAND (RS
, *ip
, imm_expr
.X_add_number
);
8566 imm_expr
.X_op
= O_absent
;
8570 case '7': /* four dsp accumulators in bits 11,12 */
8571 if (s
[0] == '$' && s
[1] == 'a' && s
[2] == 'c' &&
8572 s
[3] >= '0' && s
[3] <= '3')
8576 INSERT_OPERAND (DSPACC
, *ip
, regno
);
8580 as_bad (_("Invalid dsp acc register"));
8583 case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8584 my_getExpression (&imm_expr
, s
);
8585 check_absolute_expr (ip
, &imm_expr
);
8586 if (imm_expr
.X_add_number
& ~OP_MASK_WRDSP
)
8588 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8590 (unsigned long) imm_expr
.X_add_number
);
8592 INSERT_OPERAND (WRDSP
, *ip
, imm_expr
.X_add_number
);
8593 imm_expr
.X_op
= O_absent
;
8597 case '9': /* four dsp accumulators in bits 21,22 */
8598 if (s
[0] == '$' && s
[1] == 'a' && s
[2] == 'c' &&
8599 s
[3] >= '0' && s
[3] <= '3')
8603 INSERT_OPERAND (DSPACC_S
, *ip
, regno
);
8607 as_bad (_("Invalid dsp acc register"));
8610 case '0': /* dsp 6-bit signed immediate in bit 20 */
8611 my_getExpression (&imm_expr
, s
);
8612 check_absolute_expr (ip
, &imm_expr
);
8613 min_range
= -((OP_MASK_DSPSFT
+ 1) >> 1);
8614 max_range
= ((OP_MASK_DSPSFT
+ 1) >> 1) - 1;
8615 if (imm_expr
.X_add_number
< min_range
||
8616 imm_expr
.X_add_number
> max_range
)
8618 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8619 (long) min_range
, (long) max_range
,
8620 (long) imm_expr
.X_add_number
);
8622 INSERT_OPERAND (DSPSFT
, *ip
, imm_expr
.X_add_number
);
8623 imm_expr
.X_op
= O_absent
;
8627 case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8628 my_getExpression (&imm_expr
, s
);
8629 check_absolute_expr (ip
, &imm_expr
);
8630 if (imm_expr
.X_add_number
& ~OP_MASK_RDDSP
)
8632 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8634 (unsigned long) imm_expr
.X_add_number
);
8636 INSERT_OPERAND (RDDSP
, *ip
, imm_expr
.X_add_number
);
8637 imm_expr
.X_op
= O_absent
;
8641 case ':': /* dsp 7-bit signed immediate in bit 19 */
8642 my_getExpression (&imm_expr
, s
);
8643 check_absolute_expr (ip
, &imm_expr
);
8644 min_range
= -((OP_MASK_DSPSFT_7
+ 1) >> 1);
8645 max_range
= ((OP_MASK_DSPSFT_7
+ 1) >> 1) - 1;
8646 if (imm_expr
.X_add_number
< min_range
||
8647 imm_expr
.X_add_number
> max_range
)
8649 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8650 (long) min_range
, (long) max_range
,
8651 (long) imm_expr
.X_add_number
);
8653 INSERT_OPERAND (DSPSFT_7
, *ip
, imm_expr
.X_add_number
);
8654 imm_expr
.X_op
= O_absent
;
8658 case '@': /* dsp 10-bit signed immediate in bit 16 */
8659 my_getExpression (&imm_expr
, s
);
8660 check_absolute_expr (ip
, &imm_expr
);
8661 min_range
= -((OP_MASK_IMM10
+ 1) >> 1);
8662 max_range
= ((OP_MASK_IMM10
+ 1) >> 1) - 1;
8663 if (imm_expr
.X_add_number
< min_range
||
8664 imm_expr
.X_add_number
> max_range
)
8666 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8667 (long) min_range
, (long) max_range
,
8668 (long) imm_expr
.X_add_number
);
8670 INSERT_OPERAND (IMM10
, *ip
, imm_expr
.X_add_number
);
8671 imm_expr
.X_op
= O_absent
;
8675 case '!': /* MT usermode flag bit. */
8676 my_getExpression (&imm_expr
, s
);
8677 check_absolute_expr (ip
, &imm_expr
);
8678 if (imm_expr
.X_add_number
& ~OP_MASK_MT_U
)
8679 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8680 (unsigned long) imm_expr
.X_add_number
);
8681 INSERT_OPERAND (MT_U
, *ip
, imm_expr
.X_add_number
);
8682 imm_expr
.X_op
= O_absent
;
8686 case '$': /* MT load high flag bit. */
8687 my_getExpression (&imm_expr
, s
);
8688 check_absolute_expr (ip
, &imm_expr
);
8689 if (imm_expr
.X_add_number
& ~OP_MASK_MT_H
)
8690 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8691 (unsigned long) imm_expr
.X_add_number
);
8692 INSERT_OPERAND (MT_H
, *ip
, imm_expr
.X_add_number
);
8693 imm_expr
.X_op
= O_absent
;
8697 case '*': /* four dsp accumulators in bits 18,19 */
8698 if (s
[0] == '$' && s
[1] == 'a' && s
[2] == 'c' &&
8699 s
[3] >= '0' && s
[3] <= '3')
8703 INSERT_OPERAND (MTACC_T
, *ip
, regno
);
8707 as_bad (_("Invalid dsp/smartmips acc register"));
8710 case '&': /* four dsp accumulators in bits 13,14 */
8711 if (s
[0] == '$' && s
[1] == 'a' && s
[2] == 'c' &&
8712 s
[3] >= '0' && s
[3] <= '3')
8716 INSERT_OPERAND (MTACC_D
, *ip
, regno
);
8720 as_bad (_("Invalid dsp/smartmips acc register"));
8732 INSERT_OPERAND (RS
, *ip
, lastregno
);
8736 INSERT_OPERAND (RT
, *ip
, lastregno
);
8740 INSERT_OPERAND (FT
, *ip
, lastregno
);
8744 INSERT_OPERAND (FS
, *ip
, lastregno
);
8750 /* Handle optional base register.
8751 Either the base register is omitted or
8752 we must have a left paren. */
8753 /* This is dependent on the next operand specifier
8754 is a base register specification. */
8755 assert (args
[1] == 'b' || args
[1] == '5'
8756 || args
[1] == '-' || args
[1] == '4');
8760 case ')': /* these must match exactly */
8767 case '+': /* Opcode extension character. */
8770 case '1': /* UDI immediates. */
8775 const struct mips_immed
*imm
= mips_immed
;
8777 while (imm
->type
&& imm
->type
!= *args
)
8781 my_getExpression (&imm_expr
, s
);
8782 check_absolute_expr (ip
, &imm_expr
);
8783 if ((unsigned long) imm_expr
.X_add_number
& ~imm
->mask
)
8785 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8786 imm
->desc
? imm
->desc
: ip
->insn_mo
->name
,
8787 (unsigned long) imm_expr
.X_add_number
,
8788 (unsigned long) imm_expr
.X_add_number
);
8789 imm_expr
.X_add_number
&= imm
->mask
;
8791 ip
->insn_opcode
|= ((unsigned long) imm_expr
.X_add_number
8793 imm_expr
.X_op
= O_absent
;
8798 case 'A': /* ins/ext position, becomes LSB. */
8807 my_getExpression (&imm_expr
, s
);
8808 check_absolute_expr (ip
, &imm_expr
);
8809 if ((unsigned long) imm_expr
.X_add_number
< limlo
8810 || (unsigned long) imm_expr
.X_add_number
> limhi
)
8812 as_bad (_("Improper position (%lu)"),
8813 (unsigned long) imm_expr
.X_add_number
);
8814 imm_expr
.X_add_number
= limlo
;
8816 lastpos
= imm_expr
.X_add_number
;
8817 INSERT_OPERAND (SHAMT
, *ip
, imm_expr
.X_add_number
);
8818 imm_expr
.X_op
= O_absent
;
8822 case 'B': /* ins size, becomes MSB. */
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
8840 || ((unsigned long) imm_expr
.X_add_number
8843 as_bad (_("Improper insert size (%lu, position %lu)"),
8844 (unsigned long) imm_expr
.X_add_number
,
8845 (unsigned long) lastpos
);
8846 imm_expr
.X_add_number
= limlo
- lastpos
;
8848 INSERT_OPERAND (INSMSB
, *ip
,
8849 lastpos
+ imm_expr
.X_add_number
- 1);
8850 imm_expr
.X_op
= O_absent
;
8854 case 'C': /* ext size, becomes MSBD. */
8867 my_getExpression (&imm_expr
, s
);
8868 check_absolute_expr (ip
, &imm_expr
);
8869 /* Check for negative input so that small negative numbers
8870 will not succeed incorrectly. The checks against
8871 (pos+size) transitively check "size" itself,
8872 assuming that "pos" is reasonable. */
8873 if ((long) imm_expr
.X_add_number
< 0
8874 || ((unsigned long) imm_expr
.X_add_number
8876 || ((unsigned long) imm_expr
.X_add_number
8879 as_bad (_("Improper extract size (%lu, position %lu)"),
8880 (unsigned long) imm_expr
.X_add_number
,
8881 (unsigned long) lastpos
);
8882 imm_expr
.X_add_number
= limlo
- lastpos
;
8884 INSERT_OPERAND (EXTMSBD
, *ip
, imm_expr
.X_add_number
- 1);
8885 imm_expr
.X_op
= O_absent
;
8890 /* +D is for disassembly only; never match. */
8894 /* "+I" is like "I", except that imm2_expr is used. */
8895 my_getExpression (&imm2_expr
, s
);
8896 if (imm2_expr
.X_op
!= O_big
8897 && imm2_expr
.X_op
!= O_constant
)
8898 insn_error
= _("absolute expression required");
8899 if (HAVE_32BIT_GPRS
)
8900 normalize_constant_expr (&imm2_expr
);
8904 case 'T': /* Coprocessor register. */
8905 /* +T is for disassembly only; never match. */
8908 case 't': /* Coprocessor register number. */
8909 if (s
[0] == '$' && ISDIGIT (s
[1]))
8919 while (ISDIGIT (*s
));
8921 as_bad (_("Invalid register number (%d)"), regno
);
8924 INSERT_OPERAND (RT
, *ip
, regno
);
8929 as_bad (_("Invalid coprocessor 0 register number"));
8933 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8934 *args
, insn
->name
, insn
->args
);
8935 /* Further processing is fruitless. */
8940 case '<': /* must be at least one digit */
8942 * According to the manual, if the shift amount is greater
8943 * than 31 or less than 0, then the shift amount should be
8944 * mod 32. In reality the mips assembler issues an error.
8945 * We issue a warning and mask out all but the low 5 bits.
8947 my_getExpression (&imm_expr
, s
);
8948 check_absolute_expr (ip
, &imm_expr
);
8949 if ((unsigned long) imm_expr
.X_add_number
> 31)
8950 as_warn (_("Improper shift amount (%lu)"),
8951 (unsigned long) imm_expr
.X_add_number
);
8952 INSERT_OPERAND (SHAMT
, *ip
, imm_expr
.X_add_number
);
8953 imm_expr
.X_op
= O_absent
;
8957 case '>': /* shift amount minus 32 */
8958 my_getExpression (&imm_expr
, s
);
8959 check_absolute_expr (ip
, &imm_expr
);
8960 if ((unsigned long) imm_expr
.X_add_number
< 32
8961 || (unsigned long) imm_expr
.X_add_number
> 63)
8963 INSERT_OPERAND (SHAMT
, *ip
, imm_expr
.X_add_number
- 32);
8964 imm_expr
.X_op
= O_absent
;
8968 case 'k': /* cache code */
8969 case 'h': /* prefx code */
8970 my_getExpression (&imm_expr
, s
);
8971 check_absolute_expr (ip
, &imm_expr
);
8972 if ((unsigned long) imm_expr
.X_add_number
> 31)
8973 as_warn (_("Invalid value for `%s' (%lu)"),
8975 (unsigned long) imm_expr
.X_add_number
);
8977 INSERT_OPERAND (CACHE
, *ip
, imm_expr
.X_add_number
);
8979 INSERT_OPERAND (PREFX
, *ip
, imm_expr
.X_add_number
);
8980 imm_expr
.X_op
= O_absent
;
8984 case 'c': /* break code */
8985 my_getExpression (&imm_expr
, s
);
8986 check_absolute_expr (ip
, &imm_expr
);
8987 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_CODE
)
8988 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
8990 (unsigned long) imm_expr
.X_add_number
);
8991 INSERT_OPERAND (CODE
, *ip
, imm_expr
.X_add_number
);
8992 imm_expr
.X_op
= O_absent
;
8996 case 'q': /* lower break code */
8997 my_getExpression (&imm_expr
, s
);
8998 check_absolute_expr (ip
, &imm_expr
);
8999 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_CODE2
)
9000 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9002 (unsigned long) imm_expr
.X_add_number
);
9003 INSERT_OPERAND (CODE2
, *ip
, imm_expr
.X_add_number
);
9004 imm_expr
.X_op
= O_absent
;
9008 case 'B': /* 20-bit syscall/break code. */
9009 my_getExpression (&imm_expr
, s
);
9010 check_absolute_expr (ip
, &imm_expr
);
9011 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_CODE20
)
9012 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9014 (unsigned long) imm_expr
.X_add_number
);
9015 INSERT_OPERAND (CODE20
, *ip
, imm_expr
.X_add_number
);
9016 imm_expr
.X_op
= O_absent
;
9020 case 'C': /* Coprocessor code */
9021 my_getExpression (&imm_expr
, s
);
9022 check_absolute_expr (ip
, &imm_expr
);
9023 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_COPZ
)
9025 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9026 (unsigned long) imm_expr
.X_add_number
);
9027 imm_expr
.X_add_number
&= OP_MASK_COPZ
;
9029 INSERT_OPERAND (COPZ
, *ip
, imm_expr
.X_add_number
);
9030 imm_expr
.X_op
= O_absent
;
9034 case 'J': /* 19-bit wait code. */
9035 my_getExpression (&imm_expr
, s
);
9036 check_absolute_expr (ip
, &imm_expr
);
9037 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_CODE19
)
9039 as_warn (_("Illegal 19-bit code (%lu)"),
9040 (unsigned long) imm_expr
.X_add_number
);
9041 imm_expr
.X_add_number
&= OP_MASK_CODE19
;
9043 INSERT_OPERAND (CODE19
, *ip
, imm_expr
.X_add_number
);
9044 imm_expr
.X_op
= O_absent
;
9048 case 'P': /* Performance register. */
9049 my_getExpression (&imm_expr
, s
);
9050 check_absolute_expr (ip
, &imm_expr
);
9051 if (imm_expr
.X_add_number
!= 0 && imm_expr
.X_add_number
!= 1)
9052 as_warn (_("Invalid performance register (%lu)"),
9053 (unsigned long) imm_expr
.X_add_number
);
9054 INSERT_OPERAND (PERFREG
, *ip
, imm_expr
.X_add_number
);
9055 imm_expr
.X_op
= O_absent
;
9059 case 'G': /* Coprocessor destination register. */
9060 if (((ip
->insn_opcode
>> OP_SH_OP
) & OP_MASK_OP
) == OP_OP_COP0
)
9061 ok
= reg_lookup (&s
, RTYPE_NUM
| RTYPE_CP0
, ®no
);
9063 ok
= reg_lookup (&s
, RTYPE_NUM
| RTYPE_GP
, ®no
);
9064 INSERT_OPERAND (RD
, *ip
, regno
);
9073 case 'b': /* base register */
9074 case 'd': /* destination register */
9075 case 's': /* source register */
9076 case 't': /* target register */
9077 case 'r': /* both target and source */
9078 case 'v': /* both dest and source */
9079 case 'w': /* both dest and target */
9080 case 'E': /* coprocessor target register */
9081 case 'K': /* 'rdhwr' destination register */
9082 case 'x': /* ignore register name */
9083 case 'z': /* must be zero register */
9084 case 'U': /* destination register (clo/clz). */
9085 case 'g': /* coprocessor destination register */
9087 if (*args
== 'E' || *args
== 'K')
9088 ok
= reg_lookup (&s
, RTYPE_NUM
, ®no
);
9091 ok
= reg_lookup (&s
, RTYPE_NUM
| RTYPE_GP
, ®no
);
9092 if (regno
== AT
&& ! mips_opts
.noat
)
9093 as_warn ("Used $at without \".set noat\"");
9102 if (c
== 'r' || c
== 'v' || c
== 'w')
9109 /* 'z' only matches $0. */
9110 if (c
== 'z' && regno
!= 0)
9113 /* Now that we have assembled one operand, we use the args string
9114 * to figure out where it goes in the instruction. */
9121 INSERT_OPERAND (RS
, *ip
, regno
);
9127 INSERT_OPERAND (RD
, *ip
, regno
);
9130 INSERT_OPERAND (RD
, *ip
, regno
);
9131 INSERT_OPERAND (RT
, *ip
, regno
);
9136 INSERT_OPERAND (RT
, *ip
, regno
);
9139 /* This case exists because on the r3000 trunc
9140 expands into a macro which requires a gp
9141 register. On the r6000 or r4000 it is
9142 assembled into a single instruction which
9143 ignores the register. Thus the insn version
9144 is MIPS_ISA2 and uses 'x', and the macro
9145 version is MIPS_ISA1 and uses 't'. */
9148 /* This case is for the div instruction, which
9149 acts differently if the destination argument
9150 is $0. This only matches $0, and is checked
9151 outside the switch. */
9154 /* Itbl operand; not yet implemented. FIXME ?? */
9156 /* What about all other operands like 'i', which
9157 can be specified in the opcode table? */
9166 INSERT_OPERAND (RS
, *ip
, lastregno
);
9169 INSERT_OPERAND (RT
, *ip
, lastregno
);
9174 case 'O': /* MDMX alignment immediate constant. */
9175 my_getExpression (&imm_expr
, s
);
9176 check_absolute_expr (ip
, &imm_expr
);
9177 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_ALN
)
9178 as_warn ("Improper align amount (%ld), using low bits",
9179 (long) imm_expr
.X_add_number
);
9180 INSERT_OPERAND (ALN
, *ip
, imm_expr
.X_add_number
);
9181 imm_expr
.X_op
= O_absent
;
9185 case 'Q': /* MDMX vector, element sel, or const. */
9188 /* MDMX Immediate. */
9189 my_getExpression (&imm_expr
, s
);
9190 check_absolute_expr (ip
, &imm_expr
);
9191 if ((unsigned long) imm_expr
.X_add_number
> OP_MASK_FT
)
9192 as_warn (_("Invalid MDMX Immediate (%ld)"),
9193 (long) imm_expr
.X_add_number
);
9194 INSERT_OPERAND (FT
, *ip
, imm_expr
.X_add_number
);
9195 if (ip
->insn_opcode
& (OP_MASK_VSEL
<< OP_SH_VSEL
))
9196 ip
->insn_opcode
|= MDMX_FMTSEL_IMM_QH
<< OP_SH_VSEL
;
9198 ip
->insn_opcode
|= MDMX_FMTSEL_IMM_OB
<< OP_SH_VSEL
;
9199 imm_expr
.X_op
= O_absent
;
9203 /* Not MDMX Immediate. Fall through. */
9204 case 'X': /* MDMX destination register. */
9205 case 'Y': /* MDMX source register. */
9206 case 'Z': /* MDMX target register. */
9208 case 'D': /* floating point destination register */
9209 case 'S': /* floating point source register */
9210 case 'T': /* floating point target register */
9211 case 'R': /* floating point source register */
9216 || (mips_opts
.ase_mdmx
9217 && (ip
->insn_mo
->pinfo
& FP_D
)
9218 && (ip
->insn_mo
->pinfo
& (INSN_COPROC_MOVE_DELAY
9219 | INSN_COPROC_MEMORY_DELAY
9220 | INSN_LOAD_COPROC_DELAY
9221 | INSN_LOAD_MEMORY_DELAY
9222 | INSN_STORE_MEMORY
))))
9225 if (reg_lookup (&s
, rtype
, ®no
))
9227 if ((regno
& 1) != 0
9229 && ! mips_oddfpreg_ok (ip
->insn_mo
, argnum
))
9230 as_warn (_("Float register should be even, was %d"),
9238 if (c
== 'V' || c
== 'W')
9249 INSERT_OPERAND (FD
, *ip
, regno
);
9254 INSERT_OPERAND (FS
, *ip
, regno
);
9257 /* This is like 'Z', but also needs to fix the MDMX
9258 vector/scalar select bits. Note that the
9259 scalar immediate case is handled above. */
9262 int is_qh
= (ip
->insn_opcode
& (1 << OP_SH_VSEL
));
9263 int max_el
= (is_qh
? 3 : 7);
9265 my_getExpression(&imm_expr
, s
);
9266 check_absolute_expr (ip
, &imm_expr
);
9268 if (imm_expr
.X_add_number
> max_el
)
9269 as_bad(_("Bad element selector %ld"),
9270 (long) imm_expr
.X_add_number
);
9271 imm_expr
.X_add_number
&= max_el
;
9272 ip
->insn_opcode
|= (imm_expr
.X_add_number
9275 imm_expr
.X_op
= O_absent
;
9277 as_warn(_("Expecting ']' found '%s'"), s
);
9283 if (ip
->insn_opcode
& (OP_MASK_VSEL
<< OP_SH_VSEL
))
9284 ip
->insn_opcode
|= (MDMX_FMTSEL_VEC_QH
9287 ip
->insn_opcode
|= (MDMX_FMTSEL_VEC_OB
<<
9294 INSERT_OPERAND (FT
, *ip
, regno
);
9297 INSERT_OPERAND (FR
, *ip
, regno
);
9307 INSERT_OPERAND (FS
, *ip
, lastregno
);
9310 INSERT_OPERAND (FT
, *ip
, lastregno
);
9316 my_getExpression (&imm_expr
, s
);
9317 if (imm_expr
.X_op
!= O_big
9318 && imm_expr
.X_op
!= O_constant
)
9319 insn_error
= _("absolute expression required");
9320 if (HAVE_32BIT_GPRS
)
9321 normalize_constant_expr (&imm_expr
);
9326 my_getExpression (&offset_expr
, s
);
9327 normalize_address_expr (&offset_expr
);
9328 *imm_reloc
= BFD_RELOC_32
;
9341 unsigned char temp
[8];
9343 unsigned int length
;
9348 /* These only appear as the last operand in an
9349 instruction, and every instruction that accepts
9350 them in any variant accepts them in all variants.
9351 This means we don't have to worry about backing out
9352 any changes if the instruction does not match.
9354 The difference between them is the size of the
9355 floating point constant and where it goes. For 'F'
9356 and 'L' the constant is 64 bits; for 'f' and 'l' it
9357 is 32 bits. Where the constant is placed is based
9358 on how the MIPS assembler does things:
9361 f -- immediate value
9364 The .lit4 and .lit8 sections are only used if
9365 permitted by the -G argument.
9367 The code below needs to know whether the target register
9368 is 32 or 64 bits wide. It relies on the fact 'f' and
9369 'F' are used with GPR-based instructions and 'l' and
9370 'L' are used with FPR-based instructions. */
9372 f64
= *args
== 'F' || *args
== 'L';
9373 using_gprs
= *args
== 'F' || *args
== 'f';
9375 save_in
= input_line_pointer
;
9376 input_line_pointer
= s
;
9377 err
= md_atof (f64
? 'd' : 'f', (char *) temp
, &len
);
9379 s
= input_line_pointer
;
9380 input_line_pointer
= save_in
;
9381 if (err
!= NULL
&& *err
!= '\0')
9383 as_bad (_("Bad floating point constant: %s"), err
);
9384 memset (temp
, '\0', sizeof temp
);
9385 length
= f64
? 8 : 4;
9388 assert (length
== (unsigned) (f64
? 8 : 4));
9392 && (g_switch_value
< 4
9393 || (temp
[0] == 0 && temp
[1] == 0)
9394 || (temp
[2] == 0 && temp
[3] == 0))))
9396 imm_expr
.X_op
= O_constant
;
9397 if (! target_big_endian
)
9398 imm_expr
.X_add_number
= bfd_getl32 (temp
);
9400 imm_expr
.X_add_number
= bfd_getb32 (temp
);
9403 && ! mips_disable_float_construction
9404 /* Constants can only be constructed in GPRs and
9405 copied to FPRs if the GPRs are at least as wide
9406 as the FPRs. Force the constant into memory if
9407 we are using 64-bit FPRs but the GPRs are only
9410 || ! (HAVE_64BIT_FPRS
&& HAVE_32BIT_GPRS
))
9411 && ((temp
[0] == 0 && temp
[1] == 0)
9412 || (temp
[2] == 0 && temp
[3] == 0))
9413 && ((temp
[4] == 0 && temp
[5] == 0)
9414 || (temp
[6] == 0 && temp
[7] == 0)))
9416 /* The value is simple enough to load with a couple of
9417 instructions. If using 32-bit registers, set
9418 imm_expr to the high order 32 bits and offset_expr to
9419 the low order 32 bits. Otherwise, set imm_expr to
9420 the entire 64 bit constant. */
9421 if (using_gprs
? HAVE_32BIT_GPRS
: HAVE_32BIT_FPRS
)
9423 imm_expr
.X_op
= O_constant
;
9424 offset_expr
.X_op
= O_constant
;
9425 if (! target_big_endian
)
9427 imm_expr
.X_add_number
= bfd_getl32 (temp
+ 4);
9428 offset_expr
.X_add_number
= bfd_getl32 (temp
);
9432 imm_expr
.X_add_number
= bfd_getb32 (temp
);
9433 offset_expr
.X_add_number
= bfd_getb32 (temp
+ 4);
9435 if (offset_expr
.X_add_number
== 0)
9436 offset_expr
.X_op
= O_absent
;
9438 else if (sizeof (imm_expr
.X_add_number
) > 4)
9440 imm_expr
.X_op
= O_constant
;
9441 if (! target_big_endian
)
9442 imm_expr
.X_add_number
= bfd_getl64 (temp
);
9444 imm_expr
.X_add_number
= bfd_getb64 (temp
);
9448 imm_expr
.X_op
= O_big
;
9449 imm_expr
.X_add_number
= 4;
9450 if (! target_big_endian
)
9452 generic_bignum
[0] = bfd_getl16 (temp
);
9453 generic_bignum
[1] = bfd_getl16 (temp
+ 2);
9454 generic_bignum
[2] = bfd_getl16 (temp
+ 4);
9455 generic_bignum
[3] = bfd_getl16 (temp
+ 6);
9459 generic_bignum
[0] = bfd_getb16 (temp
+ 6);
9460 generic_bignum
[1] = bfd_getb16 (temp
+ 4);
9461 generic_bignum
[2] = bfd_getb16 (temp
+ 2);
9462 generic_bignum
[3] = bfd_getb16 (temp
);
9468 const char *newname
;
9471 /* Switch to the right section. */
9473 subseg
= now_subseg
;
9476 default: /* unused default case avoids warnings. */
9478 newname
= RDATA_SECTION_NAME
;
9479 if (g_switch_value
>= 8)
9483 newname
= RDATA_SECTION_NAME
;
9486 assert (g_switch_value
>= 4);
9490 new_seg
= subseg_new (newname
, (subsegT
) 0);
9492 bfd_set_section_flags (stdoutput
, new_seg
,
9497 frag_align (*args
== 'l' ? 2 : 3, 0, 0);
9498 if (IS_ELF
&& strcmp (TARGET_OS
, "elf") != 0)
9499 record_alignment (new_seg
, 4);
9501 record_alignment (new_seg
, *args
== 'l' ? 2 : 3);
9503 as_bad (_("Can't use floating point insn in this section"));
9505 /* Set the argument to the current address in the
9507 offset_expr
.X_op
= O_symbol
;
9508 offset_expr
.X_add_symbol
=
9509 symbol_new ("L0\001", now_seg
,
9510 (valueT
) frag_now_fix (), frag_now
);
9511 offset_expr
.X_add_number
= 0;
9513 /* Put the floating point number into the section. */
9514 p
= frag_more ((int) length
);
9515 memcpy (p
, temp
, length
);
9517 /* Switch back to the original section. */
9518 subseg_set (seg
, subseg
);
9523 case 'i': /* 16 bit unsigned immediate */
9524 case 'j': /* 16 bit signed immediate */
9525 *imm_reloc
= BFD_RELOC_LO16
;
9526 if (my_getSmallExpression (&imm_expr
, imm_reloc
, s
) == 0)
9529 offsetT minval
, maxval
;
9531 more
= (insn
+ 1 < &mips_opcodes
[NUMOPCODES
]
9532 && strcmp (insn
->name
, insn
[1].name
) == 0);
9534 /* If the expression was written as an unsigned number,
9535 only treat it as signed if there are no more
9539 && sizeof (imm_expr
.X_add_number
) <= 4
9540 && imm_expr
.X_op
== O_constant
9541 && imm_expr
.X_add_number
< 0
9542 && imm_expr
.X_unsigned
9546 /* For compatibility with older assemblers, we accept
9547 0x8000-0xffff as signed 16-bit numbers when only
9548 signed numbers are allowed. */
9550 minval
= 0, maxval
= 0xffff;
9552 minval
= -0x8000, maxval
= 0x7fff;
9554 minval
= -0x8000, maxval
= 0xffff;
9556 if (imm_expr
.X_op
!= O_constant
9557 || imm_expr
.X_add_number
< minval
9558 || imm_expr
.X_add_number
> maxval
)
9562 if (imm_expr
.X_op
== O_constant
9563 || imm_expr
.X_op
== O_big
)
9564 as_bad (_("expression out of range"));
9570 case 'o': /* 16 bit offset */
9571 /* Check whether there is only a single bracketed expression
9572 left. If so, it must be the base register and the
9573 constant must be zero. */
9574 if (*s
== '(' && strchr (s
+ 1, '(') == 0)
9576 offset_expr
.X_op
= O_constant
;
9577 offset_expr
.X_add_number
= 0;
9581 /* If this value won't fit into a 16 bit offset, then go
9582 find a macro that will generate the 32 bit offset
9584 if (my_getSmallExpression (&offset_expr
, offset_reloc
, s
) == 0
9585 && (offset_expr
.X_op
!= O_constant
9586 || offset_expr
.X_add_number
>= 0x8000
9587 || offset_expr
.X_add_number
< -0x8000))
9593 case 'p': /* pc relative offset */
9594 *offset_reloc
= BFD_RELOC_16_PCREL_S2
;
9595 my_getExpression (&offset_expr
, s
);
9599 case 'u': /* upper 16 bits */
9600 if (my_getSmallExpression (&imm_expr
, imm_reloc
, s
) == 0
9601 && imm_expr
.X_op
== O_constant
9602 && (imm_expr
.X_add_number
< 0
9603 || imm_expr
.X_add_number
>= 0x10000))
9604 as_bad (_("lui expression not in range 0..65535"));
9608 case 'a': /* 26 bit address */
9609 my_getExpression (&offset_expr
, s
);
9611 *offset_reloc
= BFD_RELOC_MIPS_JMP
;
9614 case 'N': /* 3 bit branch condition code */
9615 case 'M': /* 3 bit compare condition code */
9617 if (ip
->insn_mo
->pinfo
& (FP_D
| FP_S
))
9619 if (!reg_lookup (&s
, rtype
, ®no
))
9621 if ((strcmp(str
+ strlen(str
) - 3, ".ps") == 0
9622 || strcmp(str
+ strlen(str
) - 5, "any2f") == 0
9623 || strcmp(str
+ strlen(str
) - 5, "any2t") == 0)
9624 && (regno
& 1) != 0)
9625 as_warn(_("Condition code register should be even for %s, was %d"),
9627 if ((strcmp(str
+ strlen(str
) - 5, "any4f") == 0
9628 || strcmp(str
+ strlen(str
) - 5, "any4t") == 0)
9629 && (regno
& 3) != 0)
9630 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9633 INSERT_OPERAND (BCC
, *ip
, regno
);
9635 INSERT_OPERAND (CCC
, *ip
, regno
);
9639 if (s
[0] == '0' && (s
[1] == 'x' || s
[1] == 'X'))
9650 while (ISDIGIT (*s
));
9653 c
= 8; /* Invalid sel value. */
9656 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9657 ip
->insn_opcode
|= c
;
9661 /* Must be at least one digit. */
9662 my_getExpression (&imm_expr
, s
);
9663 check_absolute_expr (ip
, &imm_expr
);
9665 if ((unsigned long) imm_expr
.X_add_number
9666 > (unsigned long) OP_MASK_VECBYTE
)
9668 as_bad (_("bad byte vector index (%ld)"),
9669 (long) imm_expr
.X_add_number
);
9670 imm_expr
.X_add_number
= 0;
9673 INSERT_OPERAND (VECBYTE
, *ip
, imm_expr
.X_add_number
);
9674 imm_expr
.X_op
= O_absent
;
9679 my_getExpression (&imm_expr
, s
);
9680 check_absolute_expr (ip
, &imm_expr
);
9682 if ((unsigned long) imm_expr
.X_add_number
9683 > (unsigned long) OP_MASK_VECALIGN
)
9685 as_bad (_("bad byte vector index (%ld)"),
9686 (long) imm_expr
.X_add_number
);
9687 imm_expr
.X_add_number
= 0;
9690 INSERT_OPERAND (VECALIGN
, *ip
, imm_expr
.X_add_number
);
9691 imm_expr
.X_op
= O_absent
;
9696 as_bad (_("bad char = '%c'\n"), *args
);
9701 /* Args don't match. */
9702 if (insn
+ 1 < &mips_opcodes
[NUMOPCODES
] &&
9703 !strcmp (insn
->name
, insn
[1].name
))
9707 insn_error
= _("illegal operands");
9712 insn_error
= _("illegal operands");
9717 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9719 /* This routine assembles an instruction into its binary format when
9720 assembling for the mips16. As a side effect, it sets one of the
9721 global variables imm_reloc or offset_reloc to the type of
9722 relocation to do if one of the operands is an address expression.
9723 It also sets mips16_small and mips16_ext if the user explicitly
9724 requested a small or extended instruction. */
9727 mips16_ip (char *str
, struct mips_cl_insn
*ip
)
9731 struct mips_opcode
*insn
;
9734 unsigned int lastregno
= 0;
9740 mips16_small
= FALSE
;
9743 for (s
= str
; ISLOWER (*s
); ++s
)
9755 if (s
[1] == 't' && s
[2] == ' ')
9758 mips16_small
= TRUE
;
9762 else if (s
[1] == 'e' && s
[2] == ' ')
9771 insn_error
= _("unknown opcode");
9775 if (mips_opts
.noautoextend
&& ! mips16_ext
)
9776 mips16_small
= TRUE
;
9778 if ((insn
= (struct mips_opcode
*) hash_find (mips16_op_hash
, str
)) == NULL
)
9780 insn_error
= _("unrecognized opcode");
9789 assert (strcmp (insn
->name
, str
) == 0);
9791 if (OPCODE_IS_MEMBER (insn
, mips_opts
.isa
, mips_opts
.arch
))
9798 if (insn
+ 1 < &mips16_opcodes
[bfd_mips16_num_opcodes
]
9799 && strcmp (insn
->name
, insn
[1].name
) == 0)
9808 static char buf
[100];
9810 _("opcode not supported on this processor: %s (%s)"),
9811 mips_cpu_info_from_arch (mips_opts
.arch
)->name
,
9812 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
9819 create_insn (ip
, insn
);
9820 imm_expr
.X_op
= O_absent
;
9821 imm_reloc
[0] = BFD_RELOC_UNUSED
;
9822 imm_reloc
[1] = BFD_RELOC_UNUSED
;
9823 imm_reloc
[2] = BFD_RELOC_UNUSED
;
9824 imm2_expr
.X_op
= O_absent
;
9825 offset_expr
.X_op
= O_absent
;
9826 offset_reloc
[0] = BFD_RELOC_UNUSED
;
9827 offset_reloc
[1] = BFD_RELOC_UNUSED
;
9828 offset_reloc
[2] = BFD_RELOC_UNUSED
;
9829 for (args
= insn
->args
; 1; ++args
)
9836 /* In this switch statement we call break if we did not find
9837 a match, continue if we did find a match, or return if we
9846 /* Stuff the immediate value in now, if we can. */
9847 if (imm_expr
.X_op
== O_constant
9848 && *imm_reloc
> BFD_RELOC_UNUSED
9849 && insn
->pinfo
!= INSN_MACRO
)
9853 switch (*offset_reloc
)
9855 case BFD_RELOC_MIPS16_HI16_S
:
9856 tmp
= (imm_expr
.X_add_number
+ 0x8000) >> 16;
9859 case BFD_RELOC_MIPS16_HI16
:
9860 tmp
= imm_expr
.X_add_number
>> 16;
9863 case BFD_RELOC_MIPS16_LO16
:
9864 tmp
= ((imm_expr
.X_add_number
+ 0x8000) & 0xffff)
9868 case BFD_RELOC_UNUSED
:
9869 tmp
= imm_expr
.X_add_number
;
9875 *offset_reloc
= BFD_RELOC_UNUSED
;
9877 mips16_immed (NULL
, 0, *imm_reloc
- BFD_RELOC_UNUSED
,
9878 tmp
, TRUE
, mips16_small
,
9879 mips16_ext
, &ip
->insn_opcode
,
9880 &ip
->use_extend
, &ip
->extend
);
9881 imm_expr
.X_op
= O_absent
;
9882 *imm_reloc
= BFD_RELOC_UNUSED
;
9896 MIPS16_INSERT_OPERAND (RX
, *ip
, lastregno
);
9899 MIPS16_INSERT_OPERAND (RY
, *ip
, lastregno
);
9915 MIPS16_INSERT_OPERAND (RX
, *ip
, lastregno
);
9917 MIPS16_INSERT_OPERAND (RY
, *ip
, lastregno
);
9932 if (!reg_lookup (&s
, RTYPE_NUM
| RTYPE_GP
, ®no
))
9934 if (c
== 'v' || c
== 'w')
9937 MIPS16_INSERT_OPERAND (RX
, *ip
, lastregno
);
9939 MIPS16_INSERT_OPERAND (RY
, *ip
, lastregno
);
9950 if (c
== 'v' || c
== 'w')
9952 regno
= mips16_to_32_reg_map
[lastregno
];
9966 regno
= mips32_to_16_reg_map
[regno
];
9971 regno
= ILLEGAL_REG
;
9976 regno
= ILLEGAL_REG
;
9981 regno
= ILLEGAL_REG
;
9986 if (regno
== AT
&& ! mips_opts
.noat
)
9987 as_warn (_("used $at without \".set noat\""));
9994 if (regno
== ILLEGAL_REG
)
10001 MIPS16_INSERT_OPERAND (RX
, *ip
, regno
);
10005 MIPS16_INSERT_OPERAND (RY
, *ip
, regno
);
10008 MIPS16_INSERT_OPERAND (RZ
, *ip
, regno
);
10011 MIPS16_INSERT_OPERAND (MOVE32Z
, *ip
, regno
);
10017 MIPS16_INSERT_OPERAND (REGR32
, *ip
, regno
);
10020 regno
= ((regno
& 7) << 2) | ((regno
& 0x18) >> 3);
10021 MIPS16_INSERT_OPERAND (REG32R
, *ip
, regno
);
10031 if (strncmp (s
, "$pc", 3) == 0)
10048 i
= my_getSmallExpression (&imm_expr
, imm_reloc
, s
);
10051 if (imm_expr
.X_op
!= O_constant
)
10054 ip
->use_extend
= TRUE
;
10059 /* We need to relax this instruction. */
10060 *offset_reloc
= *imm_reloc
;
10061 *imm_reloc
= (int) BFD_RELOC_UNUSED
+ c
;
10066 *imm_reloc
= BFD_RELOC_UNUSED
;
10067 /* Fall through. */
10074 my_getExpression (&imm_expr
, s
);
10075 if (imm_expr
.X_op
== O_register
)
10077 /* What we thought was an expression turned out to
10080 if (s
[0] == '(' && args
[1] == '(')
10082 /* It looks like the expression was omitted
10083 before a register indirection, which means
10084 that the expression is implicitly zero. We
10085 still set up imm_expr, so that we handle
10086 explicit extensions correctly. */
10087 imm_expr
.X_op
= O_constant
;
10088 imm_expr
.X_add_number
= 0;
10089 *imm_reloc
= (int) BFD_RELOC_UNUSED
+ c
;
10096 /* We need to relax this instruction. */
10097 *imm_reloc
= (int) BFD_RELOC_UNUSED
+ c
;
10106 /* We use offset_reloc rather than imm_reloc for the PC
10107 relative operands. This lets macros with both
10108 immediate and address operands work correctly. */
10109 my_getExpression (&offset_expr
, s
);
10111 if (offset_expr
.X_op
== O_register
)
10114 /* We need to relax this instruction. */
10115 *offset_reloc
= (int) BFD_RELOC_UNUSED
+ c
;
10119 case '6': /* break code */
10120 my_getExpression (&imm_expr
, s
);
10121 check_absolute_expr (ip
, &imm_expr
);
10122 if ((unsigned long) imm_expr
.X_add_number
> 63)
10123 as_warn (_("Invalid value for `%s' (%lu)"),
10125 (unsigned long) imm_expr
.X_add_number
);
10126 MIPS16_INSERT_OPERAND (IMM6
, *ip
, imm_expr
.X_add_number
);
10127 imm_expr
.X_op
= O_absent
;
10131 case 'a': /* 26 bit address */
10132 my_getExpression (&offset_expr
, s
);
10134 *offset_reloc
= BFD_RELOC_MIPS16_JMP
;
10135 ip
->insn_opcode
<<= 16;
10138 case 'l': /* register list for entry macro */
10139 case 'L': /* register list for exit macro */
10149 unsigned int freg
, reg1
, reg2
;
10151 while (*s
== ' ' || *s
== ',')
10153 if (reg_lookup (&s
, RTYPE_GP
| RTYPE_NUM
, ®1
))
10155 else if (reg_lookup (&s
, RTYPE_FPU
, ®1
))
10159 as_bad (_("can't parse register list"));
10169 if (!reg_lookup (&s
, freg
? RTYPE_FPU
10170 : (RTYPE_GP
| RTYPE_NUM
), ®2
))
10172 as_bad (_("invalid register list"));
10176 if (freg
&& reg1
== 0 && reg2
== 0 && c
== 'L')
10178 mask
&= ~ (7 << 3);
10181 else if (freg
&& reg1
== 0 && reg2
== 1 && c
== 'L')
10183 mask
&= ~ (7 << 3);
10186 else if (reg1
== 4 && reg2
>= 4 && reg2
<= 7 && c
!= 'L')
10187 mask
|= (reg2
- 3) << 3;
10188 else if (reg1
== 16 && reg2
>= 16 && reg2
<= 17)
10189 mask
|= (reg2
- 15) << 1;
10190 else if (reg1
== RA
&& reg2
== RA
)
10194 as_bad (_("invalid register list"));
10198 /* The mask is filled in in the opcode table for the
10199 benefit of the disassembler. We remove it before
10200 applying the actual mask. */
10201 ip
->insn_opcode
&= ~ ((7 << 3) << MIPS16OP_SH_IMM6
);
10202 ip
->insn_opcode
|= mask
<< MIPS16OP_SH_IMM6
;
10206 case 'm': /* Register list for save insn. */
10207 case 'M': /* Register list for restore insn. */
10210 int framesz
= 0, seen_framesz
= 0;
10211 int args
= 0, statics
= 0, sregs
= 0;
10215 unsigned int reg1
, reg2
;
10217 SKIP_SPACE_TABS (s
);
10220 SKIP_SPACE_TABS (s
);
10222 my_getExpression (&imm_expr
, s
);
10223 if (imm_expr
.X_op
== O_constant
)
10225 /* Handle the frame size. */
10228 as_bad (_("more than one frame size in list"));
10232 framesz
= imm_expr
.X_add_number
;
10233 imm_expr
.X_op
= O_absent
;
10238 if (! reg_lookup (&s
, RTYPE_GP
| RTYPE_NUM
, ®1
))
10240 as_bad (_("can't parse register list"));
10252 if (! reg_lookup (&s
, RTYPE_GP
| RTYPE_NUM
, ®2
)
10255 as_bad (_("can't parse register list"));
10260 while (reg1
<= reg2
)
10262 if (reg1
>= 4 && reg1
<= 7)
10266 args
|= 1 << (reg1
- 4);
10268 /* statics $a0-$a3 */
10269 statics
|= 1 << (reg1
- 4);
10271 else if ((reg1
>= 16 && reg1
<= 23) || reg1
== 30)
10274 sregs
|= 1 << ((reg1
== 30) ? 8 : (reg1
- 16));
10276 else if (reg1
== 31)
10278 /* Add $ra to insn. */
10283 as_bad (_("unexpected register in list"));
10291 /* Encode args/statics combination. */
10292 if (args
& statics
)
10293 as_bad (_("arg/static registers overlap"));
10294 else if (args
== 0xf)
10295 /* All $a0-$a3 are args. */
10296 opcode
|= MIPS16_ALL_ARGS
<< 16;
10297 else if (statics
== 0xf)
10298 /* All $a0-$a3 are statics. */
10299 opcode
|= MIPS16_ALL_STATICS
<< 16;
10302 int narg
= 0, nstat
= 0;
10304 /* Count arg registers. */
10311 as_bad (_("invalid arg register list"));
10313 /* Count static registers. */
10314 while (statics
& 0x8)
10316 statics
= (statics
<< 1) & 0xf;
10320 as_bad (_("invalid static register list"));
10322 /* Encode args/statics. */
10323 opcode
|= ((narg
<< 2) | nstat
) << 16;
10326 /* Encode $s0/$s1. */
10327 if (sregs
& (1 << 0)) /* $s0 */
10329 if (sregs
& (1 << 1)) /* $s1 */
10335 /* Count regs $s2-$s8. */
10343 as_bad (_("invalid static register list"));
10344 /* Encode $s2-$s8. */
10345 opcode
|= nsreg
<< 24;
10348 /* Encode frame size. */
10350 as_bad (_("missing frame size"));
10351 else if ((framesz
& 7) != 0 || framesz
< 0
10352 || framesz
> 0xff * 8)
10353 as_bad (_("invalid frame size"));
10354 else if (framesz
!= 128 || (opcode
>> 16) != 0)
10357 opcode
|= (((framesz
& 0xf0) << 16)
10358 | (framesz
& 0x0f));
10361 /* Finally build the instruction. */
10362 if ((opcode
>> 16) != 0 || framesz
== 0)
10364 ip
->use_extend
= TRUE
;
10365 ip
->extend
= opcode
>> 16;
10367 ip
->insn_opcode
|= opcode
& 0x7f;
10371 case 'e': /* extend code */
10372 my_getExpression (&imm_expr
, s
);
10373 check_absolute_expr (ip
, &imm_expr
);
10374 if ((unsigned long) imm_expr
.X_add_number
> 0x7ff)
10376 as_warn (_("Invalid value for `%s' (%lu)"),
10378 (unsigned long) imm_expr
.X_add_number
);
10379 imm_expr
.X_add_number
&= 0x7ff;
10381 ip
->insn_opcode
|= imm_expr
.X_add_number
;
10382 imm_expr
.X_op
= O_absent
;
10392 /* Args don't match. */
10393 if (insn
+ 1 < &mips16_opcodes
[bfd_mips16_num_opcodes
] &&
10394 strcmp (insn
->name
, insn
[1].name
) == 0)
10401 insn_error
= _("illegal operands");
10407 /* This structure holds information we know about a mips16 immediate
10410 struct mips16_immed_operand
10412 /* The type code used in the argument string in the opcode table. */
10414 /* The number of bits in the short form of the opcode. */
10416 /* The number of bits in the extended form of the opcode. */
10418 /* The amount by which the short form is shifted when it is used;
10419 for example, the sw instruction has a shift count of 2. */
10421 /* The amount by which the short form is shifted when it is stored
10422 into the instruction code. */
10424 /* Non-zero if the short form is unsigned. */
10426 /* Non-zero if the extended form is unsigned. */
10428 /* Non-zero if the value is PC relative. */
10432 /* The mips16 immediate operand types. */
10434 static const struct mips16_immed_operand mips16_immed_operands
[] =
10436 { '<', 3, 5, 0, MIPS16OP_SH_RZ
, 1, 1, 0 },
10437 { '>', 3, 5, 0, MIPS16OP_SH_RX
, 1, 1, 0 },
10438 { '[', 3, 6, 0, MIPS16OP_SH_RZ
, 1, 1, 0 },
10439 { ']', 3, 6, 0, MIPS16OP_SH_RX
, 1, 1, 0 },
10440 { '4', 4, 15, 0, MIPS16OP_SH_IMM4
, 0, 0, 0 },
10441 { '5', 5, 16, 0, MIPS16OP_SH_IMM5
, 1, 0, 0 },
10442 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5
, 1, 0, 0 },
10443 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5
, 1, 0, 0 },
10444 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5
, 1, 0, 0 },
10445 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5
, 0, 0, 0 },
10446 { '8', 8, 16, 0, MIPS16OP_SH_IMM8
, 1, 0, 0 },
10447 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8
, 1, 0, 0 },
10448 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8
, 1, 0, 0 },
10449 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8
, 1, 1, 0 },
10450 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8
, 0, 0, 0 },
10451 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8
, 0, 0, 0 },
10452 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8
, 0, 0, 1 },
10453 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8
, 0, 0, 1 },
10454 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8
, 1, 0, 1 },
10455 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5
, 1, 0, 1 },
10456 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5
, 1, 0, 1 }
10459 #define MIPS16_NUM_IMMED \
10460 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10462 /* Handle a mips16 instruction with an immediate value. This or's the
10463 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10464 whether an extended value is needed; if one is needed, it sets
10465 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10466 If SMALL is true, an unextended opcode was explicitly requested.
10467 If EXT is true, an extended opcode was explicitly requested. If
10468 WARN is true, warn if EXT does not match reality. */
10471 mips16_immed (char *file
, unsigned int line
, int type
, offsetT val
,
10472 bfd_boolean warn
, bfd_boolean small
, bfd_boolean ext
,
10473 unsigned long *insn
, bfd_boolean
*use_extend
,
10474 unsigned short *extend
)
10476 const struct mips16_immed_operand
*op
;
10477 int mintiny
, maxtiny
;
10478 bfd_boolean needext
;
10480 op
= mips16_immed_operands
;
10481 while (op
->type
!= type
)
10484 assert (op
< mips16_immed_operands
+ MIPS16_NUM_IMMED
);
10489 if (type
== '<' || type
== '>' || type
== '[' || type
== ']')
10492 maxtiny
= 1 << op
->nbits
;
10497 maxtiny
= (1 << op
->nbits
) - 1;
10502 mintiny
= - (1 << (op
->nbits
- 1));
10503 maxtiny
= (1 << (op
->nbits
- 1)) - 1;
10506 /* Branch offsets have an implicit 0 in the lowest bit. */
10507 if (type
== 'p' || type
== 'q')
10510 if ((val
& ((1 << op
->shift
) - 1)) != 0
10511 || val
< (mintiny
<< op
->shift
)
10512 || val
> (maxtiny
<< op
->shift
))
10517 if (warn
&& ext
&& ! needext
)
10518 as_warn_where (file
, line
,
10519 _("extended operand requested but not required"));
10520 if (small
&& needext
)
10521 as_bad_where (file
, line
, _("invalid unextended operand value"));
10523 if (small
|| (! ext
&& ! needext
))
10527 *use_extend
= FALSE
;
10528 insnval
= ((val
>> op
->shift
) & ((1 << op
->nbits
) - 1));
10529 insnval
<<= op
->op_shift
;
10534 long minext
, maxext
;
10540 maxext
= (1 << op
->extbits
) - 1;
10544 minext
= - (1 << (op
->extbits
- 1));
10545 maxext
= (1 << (op
->extbits
- 1)) - 1;
10547 if (val
< minext
|| val
> maxext
)
10548 as_bad_where (file
, line
,
10549 _("operand value out of range for instruction"));
10551 *use_extend
= TRUE
;
10552 if (op
->extbits
== 16)
10554 extval
= ((val
>> 11) & 0x1f) | (val
& 0x7e0);
10557 else if (op
->extbits
== 15)
10559 extval
= ((val
>> 11) & 0xf) | (val
& 0x7f0);
10564 extval
= ((val
& 0x1f) << 6) | (val
& 0x20);
10568 *extend
= (unsigned short) extval
;
10573 struct percent_op_match
10576 bfd_reloc_code_real_type reloc
;
10579 static const struct percent_op_match mips_percent_op
[] =
10581 {"%lo", BFD_RELOC_LO16
},
10583 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16
},
10584 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16
},
10585 {"%call16", BFD_RELOC_MIPS_CALL16
},
10586 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP
},
10587 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE
},
10588 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST
},
10589 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16
},
10590 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16
},
10591 {"%got", BFD_RELOC_MIPS_GOT16
},
10592 {"%gp_rel", BFD_RELOC_GPREL16
},
10593 {"%half", BFD_RELOC_16
},
10594 {"%highest", BFD_RELOC_MIPS_HIGHEST
},
10595 {"%higher", BFD_RELOC_MIPS_HIGHER
},
10596 {"%neg", BFD_RELOC_MIPS_SUB
},
10597 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD
},
10598 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM
},
10599 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16
},
10600 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16
},
10601 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16
},
10602 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16
},
10603 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL
},
10605 {"%hi", BFD_RELOC_HI16_S
}
10608 static const struct percent_op_match mips16_percent_op
[] =
10610 {"%lo", BFD_RELOC_MIPS16_LO16
},
10611 {"%gprel", BFD_RELOC_MIPS16_GPREL
},
10612 {"%hi", BFD_RELOC_MIPS16_HI16_S
}
10616 /* Return true if *STR points to a relocation operator. When returning true,
10617 move *STR over the operator and store its relocation code in *RELOC.
10618 Leave both *STR and *RELOC alone when returning false. */
10621 parse_relocation (char **str
, bfd_reloc_code_real_type
*reloc
)
10623 const struct percent_op_match
*percent_op
;
10626 if (mips_opts
.mips16
)
10628 percent_op
= mips16_percent_op
;
10629 limit
= ARRAY_SIZE (mips16_percent_op
);
10633 percent_op
= mips_percent_op
;
10634 limit
= ARRAY_SIZE (mips_percent_op
);
10637 for (i
= 0; i
< limit
; i
++)
10638 if (strncasecmp (*str
, percent_op
[i
].str
, strlen (percent_op
[i
].str
)) == 0)
10640 int len
= strlen (percent_op
[i
].str
);
10642 if (!ISSPACE ((*str
)[len
]) && (*str
)[len
] != '(')
10645 *str
+= strlen (percent_op
[i
].str
);
10646 *reloc
= percent_op
[i
].reloc
;
10648 /* Check whether the output BFD supports this relocation.
10649 If not, issue an error and fall back on something safe. */
10650 if (!bfd_reloc_type_lookup (stdoutput
, percent_op
[i
].reloc
))
10652 as_bad ("relocation %s isn't supported by the current ABI",
10653 percent_op
[i
].str
);
10654 *reloc
= BFD_RELOC_UNUSED
;
10662 /* Parse string STR as a 16-bit relocatable operand. Store the
10663 expression in *EP and the relocations in the array starting
10664 at RELOC. Return the number of relocation operators used.
10666 On exit, EXPR_END points to the first character after the expression. */
10669 my_getSmallExpression (expressionS
*ep
, bfd_reloc_code_real_type
*reloc
,
10672 bfd_reloc_code_real_type reversed_reloc
[3];
10673 size_t reloc_index
, i
;
10674 int crux_depth
, str_depth
;
10677 /* Search for the start of the main expression, recoding relocations
10678 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10679 of the main expression and with CRUX_DEPTH containing the number
10680 of open brackets at that point. */
10687 crux_depth
= str_depth
;
10689 /* Skip over whitespace and brackets, keeping count of the number
10691 while (*str
== ' ' || *str
== '\t' || *str
== '(')
10696 && reloc_index
< (HAVE_NEWABI
? 3 : 1)
10697 && parse_relocation (&str
, &reversed_reloc
[reloc_index
]));
10699 my_getExpression (ep
, crux
);
10702 /* Match every open bracket. */
10703 while (crux_depth
> 0 && (*str
== ')' || *str
== ' ' || *str
== '\t'))
10707 if (crux_depth
> 0)
10708 as_bad ("unclosed '('");
10712 if (reloc_index
!= 0)
10714 prev_reloc_op_frag
= frag_now
;
10715 for (i
= 0; i
< reloc_index
; i
++)
10716 reloc
[i
] = reversed_reloc
[reloc_index
- 1 - i
];
10719 return reloc_index
;
10723 my_getExpression (expressionS
*ep
, char *str
)
10728 save_in
= input_line_pointer
;
10729 input_line_pointer
= str
;
10731 expr_end
= input_line_pointer
;
10732 input_line_pointer
= save_in
;
10734 /* If we are in mips16 mode, and this is an expression based on `.',
10735 then we bump the value of the symbol by 1 since that is how other
10736 text symbols are handled. We don't bother to handle complex
10737 expressions, just `.' plus or minus a constant. */
10738 if (mips_opts
.mips16
10739 && ep
->X_op
== O_symbol
10740 && strcmp (S_GET_NAME (ep
->X_add_symbol
), FAKE_LABEL_NAME
) == 0
10741 && S_GET_SEGMENT (ep
->X_add_symbol
) == now_seg
10742 && symbol_get_frag (ep
->X_add_symbol
) == frag_now
10743 && symbol_constant_p (ep
->X_add_symbol
)
10744 && (val
= S_GET_VALUE (ep
->X_add_symbol
)) == frag_now_fix ())
10745 S_SET_VALUE (ep
->X_add_symbol
, val
+ 1);
10748 /* Turn a string in input_line_pointer into a floating point constant
10749 of type TYPE, and store the appropriate bytes in *LITP. The number
10750 of LITTLENUMS emitted is stored in *SIZEP. An error message is
10751 returned, or NULL on OK. */
10754 md_atof (int type
, char *litP
, int *sizeP
)
10757 LITTLENUM_TYPE words
[4];
10773 return _("bad call to md_atof");
10776 t
= atof_ieee (input_line_pointer
, type
, words
);
10778 input_line_pointer
= t
;
10782 if (! target_big_endian
)
10784 for (i
= prec
- 1; i
>= 0; i
--)
10786 md_number_to_chars (litP
, words
[i
], 2);
10792 for (i
= 0; i
< prec
; i
++)
10794 md_number_to_chars (litP
, words
[i
], 2);
10803 md_number_to_chars (char *buf
, valueT val
, int n
)
10805 if (target_big_endian
)
10806 number_to_chars_bigendian (buf
, val
, n
);
10808 number_to_chars_littleendian (buf
, val
, n
);
10812 static int support_64bit_objects(void)
10814 const char **list
, **l
;
10817 list
= bfd_target_list ();
10818 for (l
= list
; *l
!= NULL
; l
++)
10820 /* This is traditional mips */
10821 if (strcmp (*l
, "elf64-tradbigmips") == 0
10822 || strcmp (*l
, "elf64-tradlittlemips") == 0)
10824 if (strcmp (*l
, "elf64-bigmips") == 0
10825 || strcmp (*l
, "elf64-littlemips") == 0)
10828 yes
= (*l
!= NULL
);
10832 #endif /* OBJ_ELF */
10834 const char *md_shortopts
= "O::g::G:";
10836 struct option md_longopts
[] =
10838 /* Options which specify architecture. */
10839 #define OPTION_ARCH_BASE (OPTION_MD_BASE)
10840 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10841 {"march", required_argument
, NULL
, OPTION_MARCH
},
10842 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10843 {"mtune", required_argument
, NULL
, OPTION_MTUNE
},
10844 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10845 {"mips0", no_argument
, NULL
, OPTION_MIPS1
},
10846 {"mips1", no_argument
, NULL
, OPTION_MIPS1
},
10847 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10848 {"mips2", no_argument
, NULL
, OPTION_MIPS2
},
10849 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10850 {"mips3", no_argument
, NULL
, OPTION_MIPS3
},
10851 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10852 {"mips4", no_argument
, NULL
, OPTION_MIPS4
},
10853 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10854 {"mips5", no_argument
, NULL
, OPTION_MIPS5
},
10855 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10856 {"mips32", no_argument
, NULL
, OPTION_MIPS32
},
10857 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10858 {"mips64", no_argument
, NULL
, OPTION_MIPS64
},
10859 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10860 {"mips32r2", no_argument
, NULL
, OPTION_MIPS32R2
},
10861 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10862 {"mips64r2", no_argument
, NULL
, OPTION_MIPS64R2
},
10864 /* Options which specify Application Specific Extensions (ASEs). */
10865 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10866 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10867 {"mips16", no_argument
, NULL
, OPTION_MIPS16
},
10868 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10869 {"no-mips16", no_argument
, NULL
, OPTION_NO_MIPS16
},
10870 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10871 {"mips3d", no_argument
, NULL
, OPTION_MIPS3D
},
10872 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10873 {"no-mips3d", no_argument
, NULL
, OPTION_NO_MIPS3D
},
10874 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10875 {"mdmx", no_argument
, NULL
, OPTION_MDMX
},
10876 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10877 {"no-mdmx", no_argument
, NULL
, OPTION_NO_MDMX
},
10878 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10879 {"mdsp", no_argument
, NULL
, OPTION_DSP
},
10880 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10881 {"mno-dsp", no_argument
, NULL
, OPTION_NO_DSP
},
10882 #define OPTION_MT (OPTION_ASE_BASE + 8)
10883 {"mmt", no_argument
, NULL
, OPTION_MT
},
10884 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10885 {"mno-mt", no_argument
, NULL
, OPTION_NO_MT
},
10886 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10887 {"msmartmips", no_argument
, NULL
, OPTION_SMARTMIPS
},
10888 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10889 {"mno-smartmips", no_argument
, NULL
, OPTION_NO_SMARTMIPS
},
10890 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
10891 {"mdspr2", no_argument
, NULL
, OPTION_DSPR2
},
10892 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
10893 {"mno-dspr2", no_argument
, NULL
, OPTION_NO_DSPR2
},
10895 /* Old-style architecture options. Don't add more of these. */
10896 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
10897 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10898 {"m4650", no_argument
, NULL
, OPTION_M4650
},
10899 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10900 {"no-m4650", no_argument
, NULL
, OPTION_NO_M4650
},
10901 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10902 {"m4010", no_argument
, NULL
, OPTION_M4010
},
10903 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10904 {"no-m4010", no_argument
, NULL
, OPTION_NO_M4010
},
10905 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10906 {"m4100", no_argument
, NULL
, OPTION_M4100
},
10907 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10908 {"no-m4100", no_argument
, NULL
, OPTION_NO_M4100
},
10909 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10910 {"m3900", no_argument
, NULL
, OPTION_M3900
},
10911 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10912 {"no-m3900", no_argument
, NULL
, OPTION_NO_M3900
},
10914 /* Options which enable bug fixes. */
10915 #define OPTION_FIX_BASE (OPTION_COMPAT_ARCH_BASE + 8)
10916 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10917 {"mfix7000", no_argument
, NULL
, OPTION_M7000_HILO_FIX
},
10918 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10919 {"no-fix-7000", no_argument
, NULL
, OPTION_MNO_7000_HILO_FIX
},
10920 {"mno-fix7000", no_argument
, NULL
, OPTION_MNO_7000_HILO_FIX
},
10921 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10922 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10923 {"mfix-vr4120", no_argument
, NULL
, OPTION_FIX_VR4120
},
10924 {"mno-fix-vr4120", no_argument
, NULL
, OPTION_NO_FIX_VR4120
},
10925 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10926 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10927 {"mfix-vr4130", no_argument
, NULL
, OPTION_FIX_VR4130
},
10928 {"mno-fix-vr4130", no_argument
, NULL
, OPTION_NO_FIX_VR4130
},
10930 /* Miscellaneous options. */
10931 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10932 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10933 {"trap", no_argument
, NULL
, OPTION_TRAP
},
10934 {"no-break", no_argument
, NULL
, OPTION_TRAP
},
10935 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10936 {"break", no_argument
, NULL
, OPTION_BREAK
},
10937 {"no-trap", no_argument
, NULL
, OPTION_BREAK
},
10938 #define OPTION_EB (OPTION_MISC_BASE + 2)
10939 {"EB", no_argument
, NULL
, OPTION_EB
},
10940 #define OPTION_EL (OPTION_MISC_BASE + 3)
10941 {"EL", no_argument
, NULL
, OPTION_EL
},
10942 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10943 {"mfp32", no_argument
, NULL
, OPTION_FP32
},
10944 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10945 {"mgp32", no_argument
, NULL
, OPTION_GP32
},
10946 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10947 {"construct-floats", no_argument
, NULL
, OPTION_CONSTRUCT_FLOATS
},
10948 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10949 {"no-construct-floats", no_argument
, NULL
, OPTION_NO_CONSTRUCT_FLOATS
},
10950 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10951 {"mfp64", no_argument
, NULL
, OPTION_FP64
},
10952 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10953 {"mgp64", no_argument
, NULL
, OPTION_GP64
},
10954 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10955 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10956 {"relax-branch", no_argument
, NULL
, OPTION_RELAX_BRANCH
},
10957 {"no-relax-branch", no_argument
, NULL
, OPTION_NO_RELAX_BRANCH
},
10958 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10959 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10960 {"mshared", no_argument
, NULL
, OPTION_MSHARED
},
10961 {"mno-shared", no_argument
, NULL
, OPTION_MNO_SHARED
},
10962 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10963 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10964 {"msym32", no_argument
, NULL
, OPTION_MSYM32
},
10965 {"mno-sym32", no_argument
, NULL
, OPTION_MNO_SYM32
},
10967 /* ELF-specific options. */
10969 #define OPTION_ELF_BASE (OPTION_MISC_BASE + 16)
10970 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10971 {"KPIC", no_argument
, NULL
, OPTION_CALL_SHARED
},
10972 {"call_shared", no_argument
, NULL
, OPTION_CALL_SHARED
},
10973 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
10974 {"non_shared", no_argument
, NULL
, OPTION_NON_SHARED
},
10975 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
10976 {"xgot", no_argument
, NULL
, OPTION_XGOT
},
10977 #define OPTION_MABI (OPTION_ELF_BASE + 3)
10978 {"mabi", required_argument
, NULL
, OPTION_MABI
},
10979 #define OPTION_32 (OPTION_ELF_BASE + 4)
10980 {"32", no_argument
, NULL
, OPTION_32
},
10981 #define OPTION_N32 (OPTION_ELF_BASE + 5)
10982 {"n32", no_argument
, NULL
, OPTION_N32
},
10983 #define OPTION_64 (OPTION_ELF_BASE + 6)
10984 {"64", no_argument
, NULL
, OPTION_64
},
10985 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10986 {"mdebug", no_argument
, NULL
, OPTION_MDEBUG
},
10987 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10988 {"no-mdebug", no_argument
, NULL
, OPTION_NO_MDEBUG
},
10989 #define OPTION_PDR (OPTION_ELF_BASE + 9)
10990 {"mpdr", no_argument
, NULL
, OPTION_PDR
},
10991 #define OPTION_NO_PDR (OPTION_ELF_BASE + 10)
10992 {"mno-pdr", no_argument
, NULL
, OPTION_NO_PDR
},
10993 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10994 {"mvxworks-pic", no_argument
, NULL
, OPTION_MVXWORKS_PIC
},
10995 #endif /* OBJ_ELF */
10997 {NULL
, no_argument
, NULL
, 0}
10999 size_t md_longopts_size
= sizeof (md_longopts
);
11001 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11002 NEW_VALUE. Warn if another value was already specified. Note:
11003 we have to defer parsing the -march and -mtune arguments in order
11004 to handle 'from-abi' correctly, since the ABI might be specified
11005 in a later argument. */
11008 mips_set_option_string (const char **string_ptr
, const char *new_value
)
11010 if (*string_ptr
!= 0 && strcasecmp (*string_ptr
, new_value
) != 0)
11011 as_warn (_("A different %s was already specified, is now %s"),
11012 string_ptr
== &mips_arch_string
? "-march" : "-mtune",
11015 *string_ptr
= new_value
;
11019 md_parse_option (int c
, char *arg
)
11023 case OPTION_CONSTRUCT_FLOATS
:
11024 mips_disable_float_construction
= 0;
11027 case OPTION_NO_CONSTRUCT_FLOATS
:
11028 mips_disable_float_construction
= 1;
11040 target_big_endian
= 1;
11044 target_big_endian
= 0;
11048 if (arg
&& arg
[0] == '0')
11058 mips_debug
= atoi (arg
);
11062 file_mips_isa
= ISA_MIPS1
;
11066 file_mips_isa
= ISA_MIPS2
;
11070 file_mips_isa
= ISA_MIPS3
;
11074 file_mips_isa
= ISA_MIPS4
;
11078 file_mips_isa
= ISA_MIPS5
;
11081 case OPTION_MIPS32
:
11082 file_mips_isa
= ISA_MIPS32
;
11085 case OPTION_MIPS32R2
:
11086 file_mips_isa
= ISA_MIPS32R2
;
11089 case OPTION_MIPS64R2
:
11090 file_mips_isa
= ISA_MIPS64R2
;
11093 case OPTION_MIPS64
:
11094 file_mips_isa
= ISA_MIPS64
;
11098 mips_set_option_string (&mips_tune_string
, arg
);
11102 mips_set_option_string (&mips_arch_string
, arg
);
11106 mips_set_option_string (&mips_arch_string
, "4650");
11107 mips_set_option_string (&mips_tune_string
, "4650");
11110 case OPTION_NO_M4650
:
11114 mips_set_option_string (&mips_arch_string
, "4010");
11115 mips_set_option_string (&mips_tune_string
, "4010");
11118 case OPTION_NO_M4010
:
11122 mips_set_option_string (&mips_arch_string
, "4100");
11123 mips_set_option_string (&mips_tune_string
, "4100");
11126 case OPTION_NO_M4100
:
11130 mips_set_option_string (&mips_arch_string
, "3900");
11131 mips_set_option_string (&mips_tune_string
, "3900");
11134 case OPTION_NO_M3900
:
11138 mips_opts
.ase_mdmx
= 1;
11141 case OPTION_NO_MDMX
:
11142 mips_opts
.ase_mdmx
= 0;
11146 mips_opts
.ase_dsp
= 1;
11147 mips_opts
.ase_dspr2
= 0;
11150 case OPTION_NO_DSP
:
11151 mips_opts
.ase_dsp
= 0;
11152 mips_opts
.ase_dspr2
= 0;
11156 mips_opts
.ase_dspr2
= 1;
11157 mips_opts
.ase_dsp
= 1;
11160 case OPTION_NO_DSPR2
:
11161 mips_opts
.ase_dspr2
= 0;
11162 mips_opts
.ase_dsp
= 0;
11166 mips_opts
.ase_mt
= 1;
11170 mips_opts
.ase_mt
= 0;
11173 case OPTION_MIPS16
:
11174 mips_opts
.mips16
= 1;
11175 mips_no_prev_insn ();
11178 case OPTION_NO_MIPS16
:
11179 mips_opts
.mips16
= 0;
11180 mips_no_prev_insn ();
11183 case OPTION_MIPS3D
:
11184 mips_opts
.ase_mips3d
= 1;
11187 case OPTION_NO_MIPS3D
:
11188 mips_opts
.ase_mips3d
= 0;
11191 case OPTION_SMARTMIPS
:
11192 mips_opts
.ase_smartmips
= 1;
11195 case OPTION_NO_SMARTMIPS
:
11196 mips_opts
.ase_smartmips
= 0;
11199 case OPTION_FIX_VR4120
:
11200 mips_fix_vr4120
= 1;
11203 case OPTION_NO_FIX_VR4120
:
11204 mips_fix_vr4120
= 0;
11207 case OPTION_FIX_VR4130
:
11208 mips_fix_vr4130
= 1;
11211 case OPTION_NO_FIX_VR4130
:
11212 mips_fix_vr4130
= 0;
11215 case OPTION_RELAX_BRANCH
:
11216 mips_relax_branch
= 1;
11219 case OPTION_NO_RELAX_BRANCH
:
11220 mips_relax_branch
= 0;
11223 case OPTION_MSHARED
:
11224 mips_in_shared
= TRUE
;
11227 case OPTION_MNO_SHARED
:
11228 mips_in_shared
= FALSE
;
11231 case OPTION_MSYM32
:
11232 mips_opts
.sym32
= TRUE
;
11235 case OPTION_MNO_SYM32
:
11236 mips_opts
.sym32
= FALSE
;
11240 /* When generating ELF code, we permit -KPIC and -call_shared to
11241 select SVR4_PIC, and -non_shared to select no PIC. This is
11242 intended to be compatible with Irix 5. */
11243 case OPTION_CALL_SHARED
:
11246 as_bad (_("-call_shared is supported only for ELF format"));
11249 mips_pic
= SVR4_PIC
;
11250 mips_abicalls
= TRUE
;
11253 case OPTION_NON_SHARED
:
11256 as_bad (_("-non_shared is supported only for ELF format"));
11260 mips_abicalls
= FALSE
;
11263 /* The -xgot option tells the assembler to use 32 bit offsets
11264 when accessing the got in SVR4_PIC mode. It is for Irix
11269 #endif /* OBJ_ELF */
11272 g_switch_value
= atoi (arg
);
11277 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11282 as_bad (_("-32 is supported for ELF format only"));
11285 mips_abi
= O32_ABI
;
11291 as_bad (_("-n32 is supported for ELF format only"));
11294 mips_abi
= N32_ABI
;
11300 as_bad (_("-64 is supported for ELF format only"));
11303 mips_abi
= N64_ABI
;
11304 if (!support_64bit_objects())
11305 as_fatal (_("No compiled in support for 64 bit object file format"));
11307 #endif /* OBJ_ELF */
11310 file_mips_gp32
= 1;
11314 file_mips_gp32
= 0;
11318 file_mips_fp32
= 1;
11322 file_mips_fp32
= 0;
11329 as_bad (_("-mabi is supported for ELF format only"));
11332 if (strcmp (arg
, "32") == 0)
11333 mips_abi
= O32_ABI
;
11334 else if (strcmp (arg
, "o64") == 0)
11335 mips_abi
= O64_ABI
;
11336 else if (strcmp (arg
, "n32") == 0)
11337 mips_abi
= N32_ABI
;
11338 else if (strcmp (arg
, "64") == 0)
11340 mips_abi
= N64_ABI
;
11341 if (! support_64bit_objects())
11342 as_fatal (_("No compiled in support for 64 bit object file "
11345 else if (strcmp (arg
, "eabi") == 0)
11346 mips_abi
= EABI_ABI
;
11349 as_fatal (_("invalid abi -mabi=%s"), arg
);
11353 #endif /* OBJ_ELF */
11355 case OPTION_M7000_HILO_FIX
:
11356 mips_7000_hilo_fix
= TRUE
;
11359 case OPTION_MNO_7000_HILO_FIX
:
11360 mips_7000_hilo_fix
= FALSE
;
11364 case OPTION_MDEBUG
:
11365 mips_flag_mdebug
= TRUE
;
11368 case OPTION_NO_MDEBUG
:
11369 mips_flag_mdebug
= FALSE
;
11373 mips_flag_pdr
= TRUE
;
11376 case OPTION_NO_PDR
:
11377 mips_flag_pdr
= FALSE
;
11380 case OPTION_MVXWORKS_PIC
:
11381 mips_pic
= VXWORKS_PIC
;
11383 #endif /* OBJ_ELF */
11392 /* Set up globals to generate code for the ISA or processor
11393 described by INFO. */
11396 mips_set_architecture (const struct mips_cpu_info
*info
)
11400 file_mips_arch
= info
->cpu
;
11401 mips_opts
.arch
= info
->cpu
;
11402 mips_opts
.isa
= info
->isa
;
11407 /* Likewise for tuning. */
11410 mips_set_tune (const struct mips_cpu_info
*info
)
11413 mips_tune
= info
->cpu
;
11418 mips_after_parse_args (void)
11420 const struct mips_cpu_info
*arch_info
= 0;
11421 const struct mips_cpu_info
*tune_info
= 0;
11423 /* GP relative stuff not working for PE */
11424 if (strncmp (TARGET_OS
, "pe", 2) == 0)
11426 if (g_switch_seen
&& g_switch_value
!= 0)
11427 as_bad (_("-G not supported in this configuration."));
11428 g_switch_value
= 0;
11431 if (mips_abi
== NO_ABI
)
11432 mips_abi
= MIPS_DEFAULT_ABI
;
11434 /* The following code determines the architecture and register size.
11435 Similar code was added to GCC 3.3 (see override_options() in
11436 config/mips/mips.c). The GAS and GCC code should be kept in sync
11437 as much as possible. */
11439 if (mips_arch_string
!= 0)
11440 arch_info
= mips_parse_cpu ("-march", mips_arch_string
);
11442 if (file_mips_isa
!= ISA_UNKNOWN
)
11444 /* Handle -mipsN. At this point, file_mips_isa contains the
11445 ISA level specified by -mipsN, while arch_info->isa contains
11446 the -march selection (if any). */
11447 if (arch_info
!= 0)
11449 /* -march takes precedence over -mipsN, since it is more descriptive.
11450 There's no harm in specifying both as long as the ISA levels
11452 if (file_mips_isa
!= arch_info
->isa
)
11453 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11454 mips_cpu_info_from_isa (file_mips_isa
)->name
,
11455 mips_cpu_info_from_isa (arch_info
->isa
)->name
);
11458 arch_info
= mips_cpu_info_from_isa (file_mips_isa
);
11461 if (arch_info
== 0)
11462 arch_info
= mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT
);
11464 if (ABI_NEEDS_64BIT_REGS (mips_abi
) && !ISA_HAS_64BIT_REGS (arch_info
->isa
))
11465 as_bad ("-march=%s is not compatible with the selected ABI",
11468 mips_set_architecture (arch_info
);
11470 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11471 if (mips_tune_string
!= 0)
11472 tune_info
= mips_parse_cpu ("-mtune", mips_tune_string
);
11474 if (tune_info
== 0)
11475 mips_set_tune (arch_info
);
11477 mips_set_tune (tune_info
);
11479 if (file_mips_gp32
>= 0)
11481 /* The user specified the size of the integer registers. Make sure
11482 it agrees with the ABI and ISA. */
11483 if (file_mips_gp32
== 0 && !ISA_HAS_64BIT_REGS (mips_opts
.isa
))
11484 as_bad (_("-mgp64 used with a 32-bit processor"));
11485 else if (file_mips_gp32
== 1 && ABI_NEEDS_64BIT_REGS (mips_abi
))
11486 as_bad (_("-mgp32 used with a 64-bit ABI"));
11487 else if (file_mips_gp32
== 0 && ABI_NEEDS_32BIT_REGS (mips_abi
))
11488 as_bad (_("-mgp64 used with a 32-bit ABI"));
11492 /* Infer the integer register size from the ABI and processor.
11493 Restrict ourselves to 32-bit registers if that's all the
11494 processor has, or if the ABI cannot handle 64-bit registers. */
11495 file_mips_gp32
= (ABI_NEEDS_32BIT_REGS (mips_abi
)
11496 || !ISA_HAS_64BIT_REGS (mips_opts
.isa
));
11499 switch (file_mips_fp32
)
11503 /* No user specified float register size.
11504 ??? GAS treats single-float processors as though they had 64-bit
11505 float registers (although it complains when double-precision
11506 instructions are used). As things stand, saying they have 32-bit
11507 registers would lead to spurious "register must be even" messages.
11508 So here we assume float registers are never smaller than the
11510 if (file_mips_gp32
== 0)
11511 /* 64-bit integer registers implies 64-bit float registers. */
11512 file_mips_fp32
= 0;
11513 else if ((mips_opts
.ase_mips3d
> 0 || mips_opts
.ase_mdmx
> 0)
11514 && ISA_HAS_64BIT_FPRS (mips_opts
.isa
))
11515 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11516 file_mips_fp32
= 0;
11518 /* 32-bit float registers. */
11519 file_mips_fp32
= 1;
11522 /* The user specified the size of the float registers. Check if it
11523 agrees with the ABI and ISA. */
11525 if (!ISA_HAS_64BIT_FPRS (mips_opts
.isa
))
11526 as_bad (_("-mfp64 used with a 32-bit fpu"));
11527 else if (ABI_NEEDS_32BIT_REGS (mips_abi
)
11528 && !ISA_HAS_MXHC1 (mips_opts
.isa
))
11529 as_warn (_("-mfp64 used with a 32-bit ABI"));
11532 if (ABI_NEEDS_64BIT_REGS (mips_abi
))
11533 as_warn (_("-mfp32 used with a 64-bit ABI"));
11537 /* End of GCC-shared inference code. */
11539 /* This flag is set when we have a 64-bit capable CPU but use only
11540 32-bit wide registers. Note that EABI does not use it. */
11541 if (ISA_HAS_64BIT_REGS (mips_opts
.isa
)
11542 && ((mips_abi
== NO_ABI
&& file_mips_gp32
== 1)
11543 || mips_abi
== O32_ABI
))
11544 mips_32bitmode
= 1;
11546 if (mips_opts
.isa
== ISA_MIPS1
&& mips_trap
)
11547 as_bad (_("trap exception not supported at ISA 1"));
11549 /* If the selected architecture includes support for ASEs, enable
11550 generation of code for them. */
11551 if (mips_opts
.mips16
== -1)
11552 mips_opts
.mips16
= (CPU_HAS_MIPS16 (file_mips_arch
)) ? 1 : 0;
11553 if (mips_opts
.ase_mips3d
== -1)
11554 mips_opts
.ase_mips3d
= ((arch_info
->flags
& MIPS_CPU_ASE_MIPS3D
)
11555 && file_mips_fp32
== 0) ? 1 : 0;
11556 if (mips_opts
.ase_mips3d
&& file_mips_fp32
== 1)
11557 as_bad (_("-mfp32 used with -mips3d"));
11559 if (mips_opts
.ase_mdmx
== -1)
11560 mips_opts
.ase_mdmx
= ((arch_info
->flags
& MIPS_CPU_ASE_MDMX
)
11561 && file_mips_fp32
== 0) ? 1 : 0;
11562 if (mips_opts
.ase_mdmx
&& file_mips_fp32
== 1)
11563 as_bad (_("-mfp32 used with -mdmx"));
11565 if (mips_opts
.ase_smartmips
== -1)
11566 mips_opts
.ase_smartmips
= (arch_info
->flags
& MIPS_CPU_ASE_SMARTMIPS
) ? 1 : 0;
11567 if (mips_opts
.ase_smartmips
&& !ISA_SUPPORTS_SMARTMIPS
)
11568 as_warn ("%s ISA does not support SmartMIPS",
11569 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
11571 if (mips_opts
.ase_dsp
== -1)
11572 mips_opts
.ase_dsp
= (arch_info
->flags
& MIPS_CPU_ASE_DSP
) ? 1 : 0;
11573 if (mips_opts
.ase_dsp
&& !ISA_SUPPORTS_DSP_ASE
)
11574 as_warn ("%s ISA does not support DSP ASE",
11575 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
11577 if (mips_opts
.ase_dspr2
== -1)
11579 mips_opts
.ase_dspr2
= (arch_info
->flags
& MIPS_CPU_ASE_DSPR2
) ? 1 : 0;
11580 mips_opts
.ase_dsp
= (arch_info
->flags
& MIPS_CPU_ASE_DSP
) ? 1 : 0;
11582 if (mips_opts
.ase_dspr2
&& !ISA_SUPPORTS_DSPR2_ASE
)
11583 as_warn ("%s ISA does not support DSP R2 ASE",
11584 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
11586 if (mips_opts
.ase_mt
== -1)
11587 mips_opts
.ase_mt
= (arch_info
->flags
& MIPS_CPU_ASE_MT
) ? 1 : 0;
11588 if (mips_opts
.ase_mt
&& !ISA_SUPPORTS_MT_ASE
)
11589 as_warn ("%s ISA does not support MT ASE",
11590 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
11592 file_mips_isa
= mips_opts
.isa
;
11593 file_ase_mips16
= mips_opts
.mips16
;
11594 file_ase_mips3d
= mips_opts
.ase_mips3d
;
11595 file_ase_mdmx
= mips_opts
.ase_mdmx
;
11596 file_ase_smartmips
= mips_opts
.ase_smartmips
;
11597 file_ase_dsp
= mips_opts
.ase_dsp
;
11598 file_ase_dspr2
= mips_opts
.ase_dspr2
;
11599 file_ase_mt
= mips_opts
.ase_mt
;
11600 mips_opts
.gp32
= file_mips_gp32
;
11601 mips_opts
.fp32
= file_mips_fp32
;
11603 if (mips_flag_mdebug
< 0)
11605 #ifdef OBJ_MAYBE_ECOFF
11606 if (OUTPUT_FLAVOR
== bfd_target_ecoff_flavour
)
11607 mips_flag_mdebug
= 1;
11609 #endif /* OBJ_MAYBE_ECOFF */
11610 mips_flag_mdebug
= 0;
11615 mips_init_after_args (void)
11617 /* initialize opcodes */
11618 bfd_mips_num_opcodes
= bfd_mips_num_builtin_opcodes
;
11619 mips_opcodes
= (struct mips_opcode
*) mips_builtin_opcodes
;
11623 md_pcrel_from (fixS
*fixP
)
11625 valueT addr
= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
11626 switch (fixP
->fx_r_type
)
11628 case BFD_RELOC_16_PCREL_S2
:
11629 case BFD_RELOC_MIPS_JMP
:
11630 /* Return the address of the delay slot. */
11633 /* We have no relocation type for PC relative MIPS16 instructions. */
11634 if (fixP
->fx_addsy
&& S_GET_SEGMENT (fixP
->fx_addsy
) != now_seg
)
11635 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
11636 _("PC relative MIPS16 instruction references a different section"));
11641 /* This is called before the symbol table is processed. In order to
11642 work with gcc when using mips-tfile, we must keep all local labels.
11643 However, in other cases, we want to discard them. If we were
11644 called with -g, but we didn't see any debugging information, it may
11645 mean that gcc is smuggling debugging information through to
11646 mips-tfile, in which case we must generate all local labels. */
11649 mips_frob_file_before_adjust (void)
11651 #ifndef NO_ECOFF_DEBUGGING
11652 if (ECOFF_DEBUGGING
11654 && ! ecoff_debugging_seen
)
11655 flag_keep_locals
= 1;
11659 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11660 the corresponding LO16 reloc. This is called before md_apply_fix and
11661 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
11662 relocation operators.
11664 For our purposes, a %lo() expression matches a %got() or %hi()
11667 (a) it refers to the same symbol; and
11668 (b) the offset applied in the %lo() expression is no lower than
11669 the offset applied in the %got() or %hi().
11671 (b) allows us to cope with code like:
11674 lh $4,%lo(foo+2)($4)
11676 ...which is legal on RELA targets, and has a well-defined behaviour
11677 if the user knows that adding 2 to "foo" will not induce a carry to
11680 When several %lo()s match a particular %got() or %hi(), we use the
11681 following rules to distinguish them:
11683 (1) %lo()s with smaller offsets are a better match than %lo()s with
11686 (2) %lo()s with no matching %got() or %hi() are better than those
11687 that already have a matching %got() or %hi().
11689 (3) later %lo()s are better than earlier %lo()s.
11691 These rules are applied in order.
11693 (1) means, among other things, that %lo()s with identical offsets are
11694 chosen if they exist.
11696 (2) means that we won't associate several high-part relocations with
11697 the same low-part relocation unless there's no alternative. Having
11698 several high parts for the same low part is a GNU extension; this rule
11699 allows careful users to avoid it.
11701 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
11702 with the last high-part relocation being at the front of the list.
11703 It therefore makes sense to choose the last matching low-part
11704 relocation, all other things being equal. It's also easier
11705 to code that way. */
11708 mips_frob_file (void)
11710 struct mips_hi_fixup
*l
;
11712 for (l
= mips_hi_fixup_list
; l
!= NULL
; l
= l
->next
)
11714 segment_info_type
*seginfo
;
11715 bfd_boolean matched_lo_p
;
11716 fixS
**hi_pos
, **lo_pos
, **pos
;
11718 assert (reloc_needs_lo_p (l
->fixp
->fx_r_type
));
11720 /* If a GOT16 relocation turns out to be against a global symbol,
11721 there isn't supposed to be a matching LO. */
11722 if (l
->fixp
->fx_r_type
== BFD_RELOC_MIPS_GOT16
11723 && !pic_need_relax (l
->fixp
->fx_addsy
, l
->seg
))
11726 /* Check quickly whether the next fixup happens to be a matching %lo. */
11727 if (fixup_has_matching_lo_p (l
->fixp
))
11730 seginfo
= seg_info (l
->seg
);
11732 /* Set HI_POS to the position of this relocation in the chain.
11733 Set LO_POS to the position of the chosen low-part relocation.
11734 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11735 relocation that matches an immediately-preceding high-part
11739 matched_lo_p
= FALSE
;
11740 for (pos
= &seginfo
->fix_root
; *pos
!= NULL
; pos
= &(*pos
)->fx_next
)
11742 if (*pos
== l
->fixp
)
11745 if (((*pos
)->fx_r_type
== BFD_RELOC_LO16
11746 || (*pos
)->fx_r_type
== BFD_RELOC_MIPS16_LO16
)
11747 && (*pos
)->fx_addsy
== l
->fixp
->fx_addsy
11748 && (*pos
)->fx_offset
>= l
->fixp
->fx_offset
11750 || (*pos
)->fx_offset
< (*lo_pos
)->fx_offset
11752 && (*pos
)->fx_offset
== (*lo_pos
)->fx_offset
)))
11755 matched_lo_p
= (reloc_needs_lo_p ((*pos
)->fx_r_type
)
11756 && fixup_has_matching_lo_p (*pos
));
11759 /* If we found a match, remove the high-part relocation from its
11760 current position and insert it before the low-part relocation.
11761 Make the offsets match so that fixup_has_matching_lo_p()
11764 We don't warn about unmatched high-part relocations since some
11765 versions of gcc have been known to emit dead "lui ...%hi(...)"
11767 if (lo_pos
!= NULL
)
11769 l
->fixp
->fx_offset
= (*lo_pos
)->fx_offset
;
11770 if (l
->fixp
->fx_next
!= *lo_pos
)
11772 *hi_pos
= l
->fixp
->fx_next
;
11773 l
->fixp
->fx_next
= *lo_pos
;
11780 /* We may have combined relocations without symbols in the N32/N64 ABI.
11781 We have to prevent gas from dropping them. */
11784 mips_force_relocation (fixS
*fixp
)
11786 if (generic_force_reloc (fixp
))
11790 && S_GET_SEGMENT (fixp
->fx_addsy
) == bfd_abs_section_ptr
11791 && (fixp
->fx_r_type
== BFD_RELOC_MIPS_SUB
11792 || fixp
->fx_r_type
== BFD_RELOC_HI16_S
11793 || fixp
->fx_r_type
== BFD_RELOC_LO16
))
11799 /* Apply a fixup to the object file. */
11802 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
11806 reloc_howto_type
*howto
;
11808 /* We ignore generic BFD relocations we don't know about. */
11809 howto
= bfd_reloc_type_lookup (stdoutput
, fixP
->fx_r_type
);
11813 assert (fixP
->fx_size
== 4
11814 || fixP
->fx_r_type
== BFD_RELOC_16
11815 || fixP
->fx_r_type
== BFD_RELOC_64
11816 || fixP
->fx_r_type
== BFD_RELOC_CTOR
11817 || fixP
->fx_r_type
== BFD_RELOC_MIPS_SUB
11818 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
11819 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
11820 || fixP
->fx_r_type
== BFD_RELOC_MIPS_TLS_DTPREL64
);
11822 buf
= (bfd_byte
*) (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
);
11824 assert (!fixP
->fx_pcrel
|| fixP
->fx_r_type
== BFD_RELOC_16_PCREL_S2
);
11826 /* Don't treat parts of a composite relocation as done. There are two
11829 (1) The second and third parts will be against 0 (RSS_UNDEF) but
11830 should nevertheless be emitted if the first part is.
11832 (2) In normal usage, composite relocations are never assembly-time
11833 constants. The easiest way of dealing with the pathological
11834 exceptions is to generate a relocation against STN_UNDEF and
11835 leave everything up to the linker. */
11836 if (fixP
->fx_addsy
== NULL
&& !fixP
->fx_pcrel
&& fixP
->fx_tcbit
== 0)
11839 switch (fixP
->fx_r_type
)
11841 case BFD_RELOC_MIPS_TLS_GD
:
11842 case BFD_RELOC_MIPS_TLS_LDM
:
11843 case BFD_RELOC_MIPS_TLS_DTPREL32
:
11844 case BFD_RELOC_MIPS_TLS_DTPREL64
:
11845 case BFD_RELOC_MIPS_TLS_DTPREL_HI16
:
11846 case BFD_RELOC_MIPS_TLS_DTPREL_LO16
:
11847 case BFD_RELOC_MIPS_TLS_GOTTPREL
:
11848 case BFD_RELOC_MIPS_TLS_TPREL_HI16
:
11849 case BFD_RELOC_MIPS_TLS_TPREL_LO16
:
11850 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
11853 case BFD_RELOC_MIPS_JMP
:
11854 case BFD_RELOC_MIPS_SHIFT5
:
11855 case BFD_RELOC_MIPS_SHIFT6
:
11856 case BFD_RELOC_MIPS_GOT_DISP
:
11857 case BFD_RELOC_MIPS_GOT_PAGE
:
11858 case BFD_RELOC_MIPS_GOT_OFST
:
11859 case BFD_RELOC_MIPS_SUB
:
11860 case BFD_RELOC_MIPS_INSERT_A
:
11861 case BFD_RELOC_MIPS_INSERT_B
:
11862 case BFD_RELOC_MIPS_DELETE
:
11863 case BFD_RELOC_MIPS_HIGHEST
:
11864 case BFD_RELOC_MIPS_HIGHER
:
11865 case BFD_RELOC_MIPS_SCN_DISP
:
11866 case BFD_RELOC_MIPS_REL16
:
11867 case BFD_RELOC_MIPS_RELGOT
:
11868 case BFD_RELOC_MIPS_JALR
:
11869 case BFD_RELOC_HI16
:
11870 case BFD_RELOC_HI16_S
:
11871 case BFD_RELOC_GPREL16
:
11872 case BFD_RELOC_MIPS_LITERAL
:
11873 case BFD_RELOC_MIPS_CALL16
:
11874 case BFD_RELOC_MIPS_GOT16
:
11875 case BFD_RELOC_GPREL32
:
11876 case BFD_RELOC_MIPS_GOT_HI16
:
11877 case BFD_RELOC_MIPS_GOT_LO16
:
11878 case BFD_RELOC_MIPS_CALL_HI16
:
11879 case BFD_RELOC_MIPS_CALL_LO16
:
11880 case BFD_RELOC_MIPS16_GPREL
:
11881 case BFD_RELOC_MIPS16_HI16
:
11882 case BFD_RELOC_MIPS16_HI16_S
:
11883 case BFD_RELOC_MIPS16_JMP
:
11884 /* Nothing needed to do. The value comes from the reloc entry. */
11888 /* This is handled like BFD_RELOC_32, but we output a sign
11889 extended value if we are only 32 bits. */
11892 if (8 <= sizeof (valueT
))
11893 md_number_to_chars ((char *) buf
, *valP
, 8);
11898 if ((*valP
& 0x80000000) != 0)
11902 md_number_to_chars ((char *)(buf
+ (target_big_endian
? 4 : 0)),
11904 md_number_to_chars ((char *)(buf
+ (target_big_endian
? 0 : 4)),
11910 case BFD_RELOC_RVA
:
11913 /* If we are deleting this reloc entry, we must fill in the
11914 value now. This can happen if we have a .word which is not
11915 resolved when it appears but is later defined. */
11917 md_number_to_chars ((char *) buf
, *valP
, fixP
->fx_size
);
11920 case BFD_RELOC_LO16
:
11921 case BFD_RELOC_MIPS16_LO16
:
11922 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11923 may be safe to remove, but if so it's not obvious. */
11924 /* When handling an embedded PIC switch statement, we can wind
11925 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11928 if (*valP
+ 0x8000 > 0xffff)
11929 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
11930 _("relocation overflow"));
11931 if (target_big_endian
)
11933 md_number_to_chars ((char *) buf
, *valP
, 2);
11937 case BFD_RELOC_16_PCREL_S2
:
11938 if ((*valP
& 0x3) != 0)
11939 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
11940 _("Branch to misaligned address (%lx)"), (long) *valP
);
11942 /* We need to save the bits in the instruction since fixup_segment()
11943 might be deleting the relocation entry (i.e., a branch within
11944 the current segment). */
11945 if (! fixP
->fx_done
)
11948 /* Update old instruction data. */
11949 if (target_big_endian
)
11950 insn
= (buf
[0] << 24) | (buf
[1] << 16) | (buf
[2] << 8) | buf
[3];
11952 insn
= (buf
[3] << 24) | (buf
[2] << 16) | (buf
[1] << 8) | buf
[0];
11954 if (*valP
+ 0x20000 <= 0x3ffff)
11956 insn
|= (*valP
>> 2) & 0xffff;
11957 md_number_to_chars ((char *) buf
, insn
, 4);
11959 else if (mips_pic
== NO_PIC
11961 && fixP
->fx_frag
->fr_address
>= text_section
->vma
11962 && (fixP
->fx_frag
->fr_address
11963 < text_section
->vma
+ bfd_get_section_size (text_section
))
11964 && ((insn
& 0xffff0000) == 0x10000000 /* beq $0,$0 */
11965 || (insn
& 0xffff0000) == 0x04010000 /* bgez $0 */
11966 || (insn
& 0xffff0000) == 0x04110000)) /* bgezal $0 */
11968 /* The branch offset is too large. If this is an
11969 unconditional branch, and we are not generating PIC code,
11970 we can convert it to an absolute jump instruction. */
11971 if ((insn
& 0xffff0000) == 0x04110000) /* bgezal $0 */
11972 insn
= 0x0c000000; /* jal */
11974 insn
= 0x08000000; /* j */
11975 fixP
->fx_r_type
= BFD_RELOC_MIPS_JMP
;
11977 fixP
->fx_addsy
= section_symbol (text_section
);
11978 *valP
+= md_pcrel_from (fixP
);
11979 md_number_to_chars ((char *) buf
, insn
, 4);
11983 /* If we got here, we have branch-relaxation disabled,
11984 and there's nothing we can do to fix this instruction
11985 without turning it into a longer sequence. */
11986 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
11987 _("Branch out of range"));
11991 case BFD_RELOC_VTABLE_INHERIT
:
11994 && !S_IS_DEFINED (fixP
->fx_addsy
)
11995 && !S_IS_WEAK (fixP
->fx_addsy
))
11996 S_SET_WEAK (fixP
->fx_addsy
);
11999 case BFD_RELOC_VTABLE_ENTRY
:
12007 /* Remember value for tc_gen_reloc. */
12008 fixP
->fx_addnumber
= *valP
;
12018 name
= input_line_pointer
;
12019 c
= get_symbol_end ();
12020 p
= (symbolS
*) symbol_find_or_make (name
);
12021 *input_line_pointer
= c
;
12025 /* Align the current frag to a given power of two. The MIPS assembler
12026 also automatically adjusts any preceding label. */
12029 mips_align (int to
, int fill
, symbolS
*label
)
12031 mips_emit_delays ();
12032 frag_align (to
, fill
, 0);
12033 record_alignment (now_seg
, to
);
12036 assert (S_GET_SEGMENT (label
) == now_seg
);
12037 symbol_set_frag (label
, frag_now
);
12038 S_SET_VALUE (label
, (valueT
) frag_now_fix ());
12042 /* Align to a given power of two. .align 0 turns off the automatic
12043 alignment used by the data creating pseudo-ops. */
12046 s_align (int x ATTRIBUTE_UNUSED
)
12050 long max_alignment
= 15;
12052 /* o Note that the assembler pulls down any immediately preceding label
12053 to the aligned address.
12054 o It's not documented but auto alignment is reinstated by
12055 a .align pseudo instruction.
12056 o Note also that after auto alignment is turned off the mips assembler
12057 issues an error on attempt to assemble an improperly aligned data item.
12060 temp
= get_absolute_expression ();
12061 if (temp
> max_alignment
)
12062 as_bad (_("Alignment too large: %d. assumed."), temp
= max_alignment
);
12065 as_warn (_("Alignment negative: 0 assumed."));
12068 if (*input_line_pointer
== ',')
12070 ++input_line_pointer
;
12071 temp_fill
= get_absolute_expression ();
12077 segment_info_type
*si
= seg_info (now_seg
);
12078 struct insn_label_list
*l
= si
->label_list
;
12079 /* Auto alignment should be switched on by next section change. */
12081 mips_align (temp
, (int) temp_fill
, l
!= NULL
? l
->label
: NULL
);
12088 demand_empty_rest_of_line ();
12092 s_change_sec (int sec
)
12097 /* The ELF backend needs to know that we are changing sections, so
12098 that .previous works correctly. We could do something like check
12099 for an obj_section_change_hook macro, but that might be confusing
12100 as it would not be appropriate to use it in the section changing
12101 functions in read.c, since obj-elf.c intercepts those. FIXME:
12102 This should be cleaner, somehow. */
12104 obj_elf_section_change_hook ();
12107 mips_emit_delays ();
12117 subseg_set (bss_section
, (subsegT
) get_absolute_expression ());
12118 demand_empty_rest_of_line ();
12122 seg
= subseg_new (RDATA_SECTION_NAME
,
12123 (subsegT
) get_absolute_expression ());
12126 bfd_set_section_flags (stdoutput
, seg
, (SEC_ALLOC
| SEC_LOAD
12127 | SEC_READONLY
| SEC_RELOC
12129 if (strcmp (TARGET_OS
, "elf") != 0)
12130 record_alignment (seg
, 4);
12132 demand_empty_rest_of_line ();
12136 seg
= subseg_new (".sdata", (subsegT
) get_absolute_expression ());
12139 bfd_set_section_flags (stdoutput
, seg
,
12140 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
);
12141 if (strcmp (TARGET_OS
, "elf") != 0)
12142 record_alignment (seg
, 4);
12144 demand_empty_rest_of_line ();
12152 s_change_section (int ignore ATTRIBUTE_UNUSED
)
12155 char *section_name
;
12160 int section_entry_size
;
12161 int section_alignment
;
12166 section_name
= input_line_pointer
;
12167 c
= get_symbol_end ();
12169 next_c
= *(input_line_pointer
+ 1);
12171 /* Do we have .section Name<,"flags">? */
12172 if (c
!= ',' || (c
== ',' && next_c
== '"'))
12174 /* just after name is now '\0'. */
12175 *input_line_pointer
= c
;
12176 input_line_pointer
= section_name
;
12177 obj_elf_section (ignore
);
12180 input_line_pointer
++;
12182 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12184 section_type
= get_absolute_expression ();
12187 if (*input_line_pointer
++ == ',')
12188 section_flag
= get_absolute_expression ();
12191 if (*input_line_pointer
++ == ',')
12192 section_entry_size
= get_absolute_expression ();
12194 section_entry_size
= 0;
12195 if (*input_line_pointer
++ == ',')
12196 section_alignment
= get_absolute_expression ();
12198 section_alignment
= 0;
12200 section_name
= xstrdup (section_name
);
12202 /* When using the generic form of .section (as implemented by obj-elf.c),
12203 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12204 traditionally had to fall back on the more common @progbits instead.
12206 There's nothing really harmful in this, since bfd will correct
12207 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
12208 means that, for backwards compatibility, the special_section entries
12209 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12211 Even so, we shouldn't force users of the MIPS .section syntax to
12212 incorrectly label the sections as SHT_PROGBITS. The best compromise
12213 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12214 generic type-checking code. */
12215 if (section_type
== SHT_MIPS_DWARF
)
12216 section_type
= SHT_PROGBITS
;
12218 obj_elf_change_section (section_name
, section_type
, section_flag
,
12219 section_entry_size
, 0, 0, 0);
12221 if (now_seg
->name
!= section_name
)
12222 free (section_name
);
12223 #endif /* OBJ_ELF */
12227 mips_enable_auto_align (void)
12233 s_cons (int log_size
)
12235 segment_info_type
*si
= seg_info (now_seg
);
12236 struct insn_label_list
*l
= si
->label_list
;
12239 label
= l
!= NULL
? l
->label
: NULL
;
12240 mips_emit_delays ();
12241 if (log_size
> 0 && auto_align
)
12242 mips_align (log_size
, 0, label
);
12243 mips_clear_insn_labels ();
12244 cons (1 << log_size
);
12248 s_float_cons (int type
)
12250 segment_info_type
*si
= seg_info (now_seg
);
12251 struct insn_label_list
*l
= si
->label_list
;
12254 label
= l
!= NULL
? l
->label
: NULL
;
12256 mips_emit_delays ();
12261 mips_align (3, 0, label
);
12263 mips_align (2, 0, label
);
12266 mips_clear_insn_labels ();
12271 /* Handle .globl. We need to override it because on Irix 5 you are
12274 where foo is an undefined symbol, to mean that foo should be
12275 considered to be the address of a function. */
12278 s_mips_globl (int x ATTRIBUTE_UNUSED
)
12287 name
= input_line_pointer
;
12288 c
= get_symbol_end ();
12289 symbolP
= symbol_find_or_make (name
);
12290 S_SET_EXTERNAL (symbolP
);
12292 *input_line_pointer
= c
;
12293 SKIP_WHITESPACE ();
12295 /* On Irix 5, every global symbol that is not explicitly labelled as
12296 being a function is apparently labelled as being an object. */
12299 if (!is_end_of_line
[(unsigned char) *input_line_pointer
]
12300 && (*input_line_pointer
!= ','))
12305 secname
= input_line_pointer
;
12306 c
= get_symbol_end ();
12307 sec
= bfd_get_section_by_name (stdoutput
, secname
);
12309 as_bad (_("%s: no such section"), secname
);
12310 *input_line_pointer
= c
;
12312 if (sec
!= NULL
&& (sec
->flags
& SEC_CODE
) != 0)
12313 flag
= BSF_FUNCTION
;
12316 symbol_get_bfdsym (symbolP
)->flags
|= flag
;
12318 c
= *input_line_pointer
;
12321 input_line_pointer
++;
12322 SKIP_WHITESPACE ();
12323 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
12329 demand_empty_rest_of_line ();
12333 s_option (int x ATTRIBUTE_UNUSED
)
12338 opt
= input_line_pointer
;
12339 c
= get_symbol_end ();
12343 /* FIXME: What does this mean? */
12345 else if (strncmp (opt
, "pic", 3) == 0)
12349 i
= atoi (opt
+ 3);
12354 mips_pic
= SVR4_PIC
;
12355 mips_abicalls
= TRUE
;
12358 as_bad (_(".option pic%d not supported"), i
);
12360 if (mips_pic
== SVR4_PIC
)
12362 if (g_switch_seen
&& g_switch_value
!= 0)
12363 as_warn (_("-G may not be used with SVR4 PIC code"));
12364 g_switch_value
= 0;
12365 bfd_set_gp_size (stdoutput
, 0);
12369 as_warn (_("Unrecognized option \"%s\""), opt
);
12371 *input_line_pointer
= c
;
12372 demand_empty_rest_of_line ();
12375 /* This structure is used to hold a stack of .set values. */
12377 struct mips_option_stack
12379 struct mips_option_stack
*next
;
12380 struct mips_set_options options
;
12383 static struct mips_option_stack
*mips_opts_stack
;
12385 /* Handle the .set pseudo-op. */
12388 s_mipsset (int x ATTRIBUTE_UNUSED
)
12390 char *name
= input_line_pointer
, ch
;
12392 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
12393 ++input_line_pointer
;
12394 ch
= *input_line_pointer
;
12395 *input_line_pointer
= '\0';
12397 if (strcmp (name
, "reorder") == 0)
12399 if (mips_opts
.noreorder
)
12402 else if (strcmp (name
, "noreorder") == 0)
12404 if (!mips_opts
.noreorder
)
12405 start_noreorder ();
12407 else if (strcmp (name
, "at") == 0)
12409 mips_opts
.noat
= 0;
12411 else if (strcmp (name
, "noat") == 0)
12413 mips_opts
.noat
= 1;
12415 else if (strcmp (name
, "macro") == 0)
12417 mips_opts
.warn_about_macros
= 0;
12419 else if (strcmp (name
, "nomacro") == 0)
12421 if (mips_opts
.noreorder
== 0)
12422 as_bad (_("`noreorder' must be set before `nomacro'"));
12423 mips_opts
.warn_about_macros
= 1;
12425 else if (strcmp (name
, "move") == 0 || strcmp (name
, "novolatile") == 0)
12427 mips_opts
.nomove
= 0;
12429 else if (strcmp (name
, "nomove") == 0 || strcmp (name
, "volatile") == 0)
12431 mips_opts
.nomove
= 1;
12433 else if (strcmp (name
, "bopt") == 0)
12435 mips_opts
.nobopt
= 0;
12437 else if (strcmp (name
, "nobopt") == 0)
12439 mips_opts
.nobopt
= 1;
12441 else if (strcmp (name
, "gp=default") == 0)
12442 mips_opts
.gp32
= file_mips_gp32
;
12443 else if (strcmp (name
, "gp=32") == 0)
12444 mips_opts
.gp32
= 1;
12445 else if (strcmp (name
, "gp=64") == 0)
12447 if (!ISA_HAS_64BIT_REGS (mips_opts
.isa
))
12448 as_warn ("%s isa does not support 64-bit registers",
12449 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12450 mips_opts
.gp32
= 0;
12452 else if (strcmp (name
, "fp=default") == 0)
12453 mips_opts
.fp32
= file_mips_fp32
;
12454 else if (strcmp (name
, "fp=32") == 0)
12455 mips_opts
.fp32
= 1;
12456 else if (strcmp (name
, "fp=64") == 0)
12458 if (!ISA_HAS_64BIT_FPRS (mips_opts
.isa
))
12459 as_warn ("%s isa does not support 64-bit floating point registers",
12460 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12461 mips_opts
.fp32
= 0;
12463 else if (strcmp (name
, "mips16") == 0
12464 || strcmp (name
, "MIPS-16") == 0)
12465 mips_opts
.mips16
= 1;
12466 else if (strcmp (name
, "nomips16") == 0
12467 || strcmp (name
, "noMIPS-16") == 0)
12468 mips_opts
.mips16
= 0;
12469 else if (strcmp (name
, "smartmips") == 0)
12471 if (!ISA_SUPPORTS_SMARTMIPS
)
12472 as_warn ("%s ISA does not support SmartMIPS ASE",
12473 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12474 mips_opts
.ase_smartmips
= 1;
12476 else if (strcmp (name
, "nosmartmips") == 0)
12477 mips_opts
.ase_smartmips
= 0;
12478 else if (strcmp (name
, "mips3d") == 0)
12479 mips_opts
.ase_mips3d
= 1;
12480 else if (strcmp (name
, "nomips3d") == 0)
12481 mips_opts
.ase_mips3d
= 0;
12482 else if (strcmp (name
, "mdmx") == 0)
12483 mips_opts
.ase_mdmx
= 1;
12484 else if (strcmp (name
, "nomdmx") == 0)
12485 mips_opts
.ase_mdmx
= 0;
12486 else if (strcmp (name
, "dsp") == 0)
12488 if (!ISA_SUPPORTS_DSP_ASE
)
12489 as_warn ("%s ISA does not support DSP ASE",
12490 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12491 mips_opts
.ase_dsp
= 1;
12492 mips_opts
.ase_dspr2
= 0;
12494 else if (strcmp (name
, "nodsp") == 0)
12496 mips_opts
.ase_dsp
= 0;
12497 mips_opts
.ase_dspr2
= 0;
12499 else if (strcmp (name
, "dspr2") == 0)
12501 if (!ISA_SUPPORTS_DSPR2_ASE
)
12502 as_warn ("%s ISA does not support DSP R2 ASE",
12503 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12504 mips_opts
.ase_dspr2
= 1;
12505 mips_opts
.ase_dsp
= 1;
12507 else if (strcmp (name
, "nodspr2") == 0)
12509 mips_opts
.ase_dspr2
= 0;
12510 mips_opts
.ase_dsp
= 0;
12512 else if (strcmp (name
, "mt") == 0)
12514 if (!ISA_SUPPORTS_MT_ASE
)
12515 as_warn ("%s ISA does not support MT ASE",
12516 mips_cpu_info_from_isa (mips_opts
.isa
)->name
);
12517 mips_opts
.ase_mt
= 1;
12519 else if (strcmp (name
, "nomt") == 0)
12520 mips_opts
.ase_mt
= 0;
12521 else if (strncmp (name
, "mips", 4) == 0 || strncmp (name
, "arch=", 5) == 0)
12525 /* Permit the user to change the ISA and architecture on the fly.
12526 Needless to say, misuse can cause serious problems. */
12527 if (strcmp (name
, "mips0") == 0 || strcmp (name
, "arch=default") == 0)
12530 mips_opts
.isa
= file_mips_isa
;
12531 mips_opts
.arch
= file_mips_arch
;
12533 else if (strncmp (name
, "arch=", 5) == 0)
12535 const struct mips_cpu_info
*p
;
12537 p
= mips_parse_cpu("internal use", name
+ 5);
12539 as_bad (_("unknown architecture %s"), name
+ 5);
12542 mips_opts
.arch
= p
->cpu
;
12543 mips_opts
.isa
= p
->isa
;
12546 else if (strncmp (name
, "mips", 4) == 0)
12548 const struct mips_cpu_info
*p
;
12550 p
= mips_parse_cpu("internal use", name
);
12552 as_bad (_("unknown ISA level %s"), name
+ 4);
12555 mips_opts
.arch
= p
->cpu
;
12556 mips_opts
.isa
= p
->isa
;
12560 as_bad (_("unknown ISA or architecture %s"), name
);
12562 switch (mips_opts
.isa
)
12570 mips_opts
.gp32
= 1;
12571 mips_opts
.fp32
= 1;
12578 mips_opts
.gp32
= 0;
12579 mips_opts
.fp32
= 0;
12582 as_bad (_("unknown ISA level %s"), name
+ 4);
12587 mips_opts
.gp32
= file_mips_gp32
;
12588 mips_opts
.fp32
= file_mips_fp32
;
12591 else if (strcmp (name
, "autoextend") == 0)
12592 mips_opts
.noautoextend
= 0;
12593 else if (strcmp (name
, "noautoextend") == 0)
12594 mips_opts
.noautoextend
= 1;
12595 else if (strcmp (name
, "push") == 0)
12597 struct mips_option_stack
*s
;
12599 s
= (struct mips_option_stack
*) xmalloc (sizeof *s
);
12600 s
->next
= mips_opts_stack
;
12601 s
->options
= mips_opts
;
12602 mips_opts_stack
= s
;
12604 else if (strcmp (name
, "pop") == 0)
12606 struct mips_option_stack
*s
;
12608 s
= mips_opts_stack
;
12610 as_bad (_(".set pop with no .set push"));
12613 /* If we're changing the reorder mode we need to handle
12614 delay slots correctly. */
12615 if (s
->options
.noreorder
&& ! mips_opts
.noreorder
)
12616 start_noreorder ();
12617 else if (! s
->options
.noreorder
&& mips_opts
.noreorder
)
12620 mips_opts
= s
->options
;
12621 mips_opts_stack
= s
->next
;
12625 else if (strcmp (name
, "sym32") == 0)
12626 mips_opts
.sym32
= TRUE
;
12627 else if (strcmp (name
, "nosym32") == 0)
12628 mips_opts
.sym32
= FALSE
;
12629 else if (strchr (name
, ','))
12631 /* Generic ".set" directive; use the generic handler. */
12632 *input_line_pointer
= ch
;
12633 input_line_pointer
= name
;
12639 as_warn (_("Tried to set unrecognized symbol: %s\n"), name
);
12641 *input_line_pointer
= ch
;
12642 demand_empty_rest_of_line ();
12645 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12646 .option pic2. It means to generate SVR4 PIC calls. */
12649 s_abicalls (int ignore ATTRIBUTE_UNUSED
)
12651 mips_pic
= SVR4_PIC
;
12652 mips_abicalls
= TRUE
;
12654 if (g_switch_seen
&& g_switch_value
!= 0)
12655 as_warn (_("-G may not be used with SVR4 PIC code"));
12656 g_switch_value
= 0;
12658 bfd_set_gp_size (stdoutput
, 0);
12659 demand_empty_rest_of_line ();
12662 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12663 PIC code. It sets the $gp register for the function based on the
12664 function address, which is in the register named in the argument.
12665 This uses a relocation against _gp_disp, which is handled specially
12666 by the linker. The result is:
12667 lui $gp,%hi(_gp_disp)
12668 addiu $gp,$gp,%lo(_gp_disp)
12669 addu $gp,$gp,.cpload argument
12670 The .cpload argument is normally $25 == $t9.
12672 The -mno-shared option changes this to:
12673 lui $gp,%hi(__gnu_local_gp)
12674 addiu $gp,$gp,%lo(__gnu_local_gp)
12675 and the argument is ignored. This saves an instruction, but the
12676 resulting code is not position independent; it uses an absolute
12677 address for __gnu_local_gp. Thus code assembled with -mno-shared
12678 can go into an ordinary executable, but not into a shared library. */
12681 s_cpload (int ignore ATTRIBUTE_UNUSED
)
12687 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12688 .cpload is ignored. */
12689 if (mips_pic
!= SVR4_PIC
|| HAVE_NEWABI
)
12695 /* .cpload should be in a .set noreorder section. */
12696 if (mips_opts
.noreorder
== 0)
12697 as_warn (_(".cpload not in noreorder section"));
12699 reg
= tc_get_register (0);
12701 /* If we need to produce a 64-bit address, we are better off using
12702 the default instruction sequence. */
12703 in_shared
= mips_in_shared
|| HAVE_64BIT_SYMBOLS
;
12705 ex
.X_op
= O_symbol
;
12706 ex
.X_add_symbol
= symbol_find_or_make (in_shared
? "_gp_disp" :
12708 ex
.X_op_symbol
= NULL
;
12709 ex
.X_add_number
= 0;
12711 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12712 symbol_get_bfdsym (ex
.X_add_symbol
)->flags
|= BSF_OBJECT
;
12715 macro_build_lui (&ex
, mips_gp_register
);
12716 macro_build (&ex
, "addiu", "t,r,j", mips_gp_register
,
12717 mips_gp_register
, BFD_RELOC_LO16
);
12719 macro_build (NULL
, "addu", "d,v,t", mips_gp_register
,
12720 mips_gp_register
, reg
);
12723 demand_empty_rest_of_line ();
12726 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12727 .cpsetup $reg1, offset|$reg2, label
12729 If offset is given, this results in:
12730 sd $gp, offset($sp)
12731 lui $gp, %hi(%neg(%gp_rel(label)))
12732 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12733 daddu $gp, $gp, $reg1
12735 If $reg2 is given, this results in:
12736 daddu $reg2, $gp, $0
12737 lui $gp, %hi(%neg(%gp_rel(label)))
12738 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12739 daddu $gp, $gp, $reg1
12740 $reg1 is normally $25 == $t9.
12742 The -mno-shared option replaces the last three instructions with
12744 addiu $gp,$gp,%lo(_gp) */
12747 s_cpsetup (int ignore ATTRIBUTE_UNUSED
)
12749 expressionS ex_off
;
12750 expressionS ex_sym
;
12753 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12754 We also need NewABI support. */
12755 if (mips_pic
!= SVR4_PIC
|| ! HAVE_NEWABI
)
12761 reg1
= tc_get_register (0);
12762 SKIP_WHITESPACE ();
12763 if (*input_line_pointer
!= ',')
12765 as_bad (_("missing argument separator ',' for .cpsetup"));
12769 ++input_line_pointer
;
12770 SKIP_WHITESPACE ();
12771 if (*input_line_pointer
== '$')
12773 mips_cpreturn_register
= tc_get_register (0);
12774 mips_cpreturn_offset
= -1;
12778 mips_cpreturn_offset
= get_absolute_expression ();
12779 mips_cpreturn_register
= -1;
12781 SKIP_WHITESPACE ();
12782 if (*input_line_pointer
!= ',')
12784 as_bad (_("missing argument separator ',' for .cpsetup"));
12788 ++input_line_pointer
;
12789 SKIP_WHITESPACE ();
12790 expression (&ex_sym
);
12793 if (mips_cpreturn_register
== -1)
12795 ex_off
.X_op
= O_constant
;
12796 ex_off
.X_add_symbol
= NULL
;
12797 ex_off
.X_op_symbol
= NULL
;
12798 ex_off
.X_add_number
= mips_cpreturn_offset
;
12800 macro_build (&ex_off
, "sd", "t,o(b)", mips_gp_register
,
12801 BFD_RELOC_LO16
, SP
);
12804 macro_build (NULL
, "daddu", "d,v,t", mips_cpreturn_register
,
12805 mips_gp_register
, 0);
12807 if (mips_in_shared
|| HAVE_64BIT_SYMBOLS
)
12809 macro_build (&ex_sym
, "lui", "t,u", mips_gp_register
,
12810 -1, BFD_RELOC_GPREL16
, BFD_RELOC_MIPS_SUB
,
12813 macro_build (&ex_sym
, "addiu", "t,r,j", mips_gp_register
,
12814 mips_gp_register
, -1, BFD_RELOC_GPREL16
,
12815 BFD_RELOC_MIPS_SUB
, BFD_RELOC_LO16
);
12817 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", mips_gp_register
,
12818 mips_gp_register
, reg1
);
12824 ex
.X_op
= O_symbol
;
12825 ex
.X_add_symbol
= symbol_find_or_make ("__gnu_local_gp");
12826 ex
.X_op_symbol
= NULL
;
12827 ex
.X_add_number
= 0;
12829 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12830 symbol_get_bfdsym (ex
.X_add_symbol
)->flags
|= BSF_OBJECT
;
12832 macro_build_lui (&ex
, mips_gp_register
);
12833 macro_build (&ex
, "addiu", "t,r,j", mips_gp_register
,
12834 mips_gp_register
, BFD_RELOC_LO16
);
12839 demand_empty_rest_of_line ();
12843 s_cplocal (int ignore ATTRIBUTE_UNUSED
)
12845 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12846 .cplocal is ignored. */
12847 if (mips_pic
!= SVR4_PIC
|| ! HAVE_NEWABI
)
12853 mips_gp_register
= tc_get_register (0);
12854 demand_empty_rest_of_line ();
12857 /* Handle the .cprestore pseudo-op. This stores $gp into a given
12858 offset from $sp. The offset is remembered, and after making a PIC
12859 call $gp is restored from that location. */
12862 s_cprestore (int ignore ATTRIBUTE_UNUSED
)
12866 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12867 .cprestore is ignored. */
12868 if (mips_pic
!= SVR4_PIC
|| HAVE_NEWABI
)
12874 mips_cprestore_offset
= get_absolute_expression ();
12875 mips_cprestore_valid
= 1;
12877 ex
.X_op
= O_constant
;
12878 ex
.X_add_symbol
= NULL
;
12879 ex
.X_op_symbol
= NULL
;
12880 ex
.X_add_number
= mips_cprestore_offset
;
12883 macro_build_ldst_constoffset (&ex
, ADDRESS_STORE_INSN
, mips_gp_register
,
12884 SP
, HAVE_64BIT_ADDRESSES
);
12887 demand_empty_rest_of_line ();
12890 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12891 was given in the preceding .cpsetup, it results in:
12892 ld $gp, offset($sp)
12894 If a register $reg2 was given there, it results in:
12895 daddu $gp, $reg2, $0 */
12898 s_cpreturn (int ignore ATTRIBUTE_UNUSED
)
12902 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12903 We also need NewABI support. */
12904 if (mips_pic
!= SVR4_PIC
|| ! HAVE_NEWABI
)
12911 if (mips_cpreturn_register
== -1)
12913 ex
.X_op
= O_constant
;
12914 ex
.X_add_symbol
= NULL
;
12915 ex
.X_op_symbol
= NULL
;
12916 ex
.X_add_number
= mips_cpreturn_offset
;
12918 macro_build (&ex
, "ld", "t,o(b)", mips_gp_register
, BFD_RELOC_LO16
, SP
);
12921 macro_build (NULL
, "daddu", "d,v,t", mips_gp_register
,
12922 mips_cpreturn_register
, 0);
12925 demand_empty_rest_of_line ();
12928 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
12929 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
12930 use in DWARF debug information. */
12933 s_dtprel_internal (size_t bytes
)
12940 if (ex
.X_op
!= O_symbol
)
12942 as_bad (_("Unsupported use of %s"), (bytes
== 8
12945 ignore_rest_of_line ();
12948 p
= frag_more (bytes
);
12949 md_number_to_chars (p
, 0, bytes
);
12950 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, bytes
, &ex
, FALSE
,
12952 ? BFD_RELOC_MIPS_TLS_DTPREL64
12953 : BFD_RELOC_MIPS_TLS_DTPREL32
));
12955 demand_empty_rest_of_line ();
12958 /* Handle .dtprelword. */
12961 s_dtprelword (int ignore ATTRIBUTE_UNUSED
)
12963 s_dtprel_internal (4);
12966 /* Handle .dtpreldword. */
12969 s_dtpreldword (int ignore ATTRIBUTE_UNUSED
)
12971 s_dtprel_internal (8);
12974 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12975 code. It sets the offset to use in gp_rel relocations. */
12978 s_gpvalue (int ignore ATTRIBUTE_UNUSED
)
12980 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12981 We also need NewABI support. */
12982 if (mips_pic
!= SVR4_PIC
|| ! HAVE_NEWABI
)
12988 mips_gprel_offset
= get_absolute_expression ();
12990 demand_empty_rest_of_line ();
12993 /* Handle the .gpword pseudo-op. This is used when generating PIC
12994 code. It generates a 32 bit GP relative reloc. */
12997 s_gpword (int ignore ATTRIBUTE_UNUSED
)
12999 segment_info_type
*si
;
13000 struct insn_label_list
*l
;
13005 /* When not generating PIC code, this is treated as .word. */
13006 if (mips_pic
!= SVR4_PIC
)
13012 si
= seg_info (now_seg
);
13013 l
= si
->label_list
;
13014 label
= l
!= NULL
? l
->label
: NULL
;
13015 mips_emit_delays ();
13017 mips_align (2, 0, label
);
13018 mips_clear_insn_labels ();
13022 if (ex
.X_op
!= O_symbol
|| ex
.X_add_number
!= 0)
13024 as_bad (_("Unsupported use of .gpword"));
13025 ignore_rest_of_line ();
13029 md_number_to_chars (p
, 0, 4);
13030 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 4, &ex
, FALSE
,
13031 BFD_RELOC_GPREL32
);
13033 demand_empty_rest_of_line ();
13037 s_gpdword (int ignore ATTRIBUTE_UNUSED
)
13039 segment_info_type
*si
;
13040 struct insn_label_list
*l
;
13045 /* When not generating PIC code, this is treated as .dword. */
13046 if (mips_pic
!= SVR4_PIC
)
13052 si
= seg_info (now_seg
);
13053 l
= si
->label_list
;
13054 label
= l
!= NULL
? l
->label
: NULL
;
13055 mips_emit_delays ();
13057 mips_align (3, 0, label
);
13058 mips_clear_insn_labels ();
13062 if (ex
.X_op
!= O_symbol
|| ex
.X_add_number
!= 0)
13064 as_bad (_("Unsupported use of .gpdword"));
13065 ignore_rest_of_line ();
13069 md_number_to_chars (p
, 0, 8);
13070 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 4, &ex
, FALSE
,
13071 BFD_RELOC_GPREL32
)->fx_tcbit
= 1;
13073 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13074 fix_new (frag_now
, p
- frag_now
->fr_literal
, 8, NULL
, 0,
13075 FALSE
, BFD_RELOC_64
)->fx_tcbit
= 1;
13077 demand_empty_rest_of_line ();
13080 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13081 tables in SVR4 PIC code. */
13084 s_cpadd (int ignore ATTRIBUTE_UNUSED
)
13088 /* This is ignored when not generating SVR4 PIC code. */
13089 if (mips_pic
!= SVR4_PIC
)
13095 /* Add $gp to the register named as an argument. */
13097 reg
= tc_get_register (0);
13098 macro_build (NULL
, ADDRESS_ADD_INSN
, "d,v,t", reg
, reg
, mips_gp_register
);
13101 demand_empty_rest_of_line ();
13104 /* Handle the .insn pseudo-op. This marks instruction labels in
13105 mips16 mode. This permits the linker to handle them specially,
13106 such as generating jalx instructions when needed. We also make
13107 them odd for the duration of the assembly, in order to generate the
13108 right sort of code. We will make them even in the adjust_symtab
13109 routine, while leaving them marked. This is convenient for the
13110 debugger and the disassembler. The linker knows to make them odd
13114 s_insn (int ignore ATTRIBUTE_UNUSED
)
13116 mips16_mark_labels ();
13118 demand_empty_rest_of_line ();
13121 /* Handle a .stabn directive. We need these in order to mark a label
13122 as being a mips16 text label correctly. Sometimes the compiler
13123 will emit a label, followed by a .stabn, and then switch sections.
13124 If the label and .stabn are in mips16 mode, then the label is
13125 really a mips16 text label. */
13128 s_mips_stab (int type
)
13131 mips16_mark_labels ();
13136 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13139 s_mips_weakext (int ignore ATTRIBUTE_UNUSED
)
13146 name
= input_line_pointer
;
13147 c
= get_symbol_end ();
13148 symbolP
= symbol_find_or_make (name
);
13149 S_SET_WEAK (symbolP
);
13150 *input_line_pointer
= c
;
13152 SKIP_WHITESPACE ();
13154 if (! is_end_of_line
[(unsigned char) *input_line_pointer
])
13156 if (S_IS_DEFINED (symbolP
))
13158 as_bad ("ignoring attempt to redefine symbol %s",
13159 S_GET_NAME (symbolP
));
13160 ignore_rest_of_line ();
13164 if (*input_line_pointer
== ',')
13166 ++input_line_pointer
;
13167 SKIP_WHITESPACE ();
13171 if (exp
.X_op
!= O_symbol
)
13173 as_bad ("bad .weakext directive");
13174 ignore_rest_of_line ();
13177 symbol_set_value_expression (symbolP
, &exp
);
13180 demand_empty_rest_of_line ();
13183 /* Parse a register string into a number. Called from the ECOFF code
13184 to parse .frame. The argument is non-zero if this is the frame
13185 register, so that we can record it in mips_frame_reg. */
13188 tc_get_register (int frame
)
13192 SKIP_WHITESPACE ();
13193 if (! reg_lookup (&input_line_pointer
, RWARN
| RTYPE_NUM
| RTYPE_GP
, ®
))
13197 mips_frame_reg
= reg
!= 0 ? reg
: SP
;
13198 mips_frame_reg_valid
= 1;
13199 mips_cprestore_valid
= 0;
13205 md_section_align (asection
*seg
, valueT addr
)
13207 int align
= bfd_get_section_alignment (stdoutput
, seg
);
13211 /* We don't need to align ELF sections to the full alignment.
13212 However, Irix 5 may prefer that we align them at least to a 16
13213 byte boundary. We don't bother to align the sections if we
13214 are targeted for an embedded system. */
13215 if (strcmp (TARGET_OS
, "elf") == 0)
13221 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
13224 /* Utility routine, called from above as well. If called while the
13225 input file is still being read, it's only an approximation. (For
13226 example, a symbol may later become defined which appeared to be
13227 undefined earlier.) */
13230 nopic_need_relax (symbolS
*sym
, int before_relaxing
)
13235 if (g_switch_value
> 0)
13237 const char *symname
;
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
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))
13257 else if ((! S_IS_DEFINED (sym
) || S_IS_COMMON (sym
))
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
))
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
13271 && S_GET_VALUE (sym
) == 0)
13272 || (S_GET_VALUE (sym
) != 0
13273 && S_GET_VALUE (sym
) <= g_switch_value
)))
13277 const char *segname
;
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
, ".sbss.", 6) != 0
13286 && strncmp (segname
, ".gnu.linkonce.sb.", 17) != 0
13287 && strncmp (segname
, ".gnu.linkonce.s.", 16) != 0);
13292 /* We are not optimizing for the $gp register. */
13297 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13300 pic_need_relax (symbolS
*sym
, asection
*segtype
)
13304 /* Handle the case of a symbol equated to another symbol. */
13305 while (symbol_equated_reloc_p (sym
))
13309 /* It's possible to get a loop here in a badly written program. */
13310 n
= symbol_get_value_expression (sym
)->X_add_symbol
;
13316 if (symbol_section_p (sym
))
13319 symsec
= S_GET_SEGMENT (sym
);
13321 /* This must duplicate the test in adjust_reloc_syms. */
13322 return (symsec
!= &bfd_und_section
13323 && symsec
!= &bfd_abs_section
13324 && !bfd_is_com_section (symsec
)
13325 && !s_is_linkonce (sym
, segtype
)
13327 /* A global or weak symbol is treated as external. */
13328 && (!IS_ELF
|| (! S_IS_WEAK (sym
) && ! S_IS_EXTERNAL (sym
)))
13334 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13335 extended opcode. SEC is the section the frag is in. */
13338 mips16_extended_frag (fragS
*fragp
, asection
*sec
, long stretch
)
13341 const struct mips16_immed_operand
*op
;
13343 int mintiny
, maxtiny
;
13347 if (RELAX_MIPS16_USER_SMALL (fragp
->fr_subtype
))
13349 if (RELAX_MIPS16_USER_EXT (fragp
->fr_subtype
))
13352 type
= RELAX_MIPS16_TYPE (fragp
->fr_subtype
);
13353 op
= mips16_immed_operands
;
13354 while (op
->type
!= type
)
13357 assert (op
< mips16_immed_operands
+ MIPS16_NUM_IMMED
);
13362 if (type
== '<' || type
== '>' || type
== '[' || type
== ']')
13365 maxtiny
= 1 << op
->nbits
;
13370 maxtiny
= (1 << op
->nbits
) - 1;
13375 mintiny
= - (1 << (op
->nbits
- 1));
13376 maxtiny
= (1 << (op
->nbits
- 1)) - 1;
13379 sym_frag
= symbol_get_frag (fragp
->fr_symbol
);
13380 val
= S_GET_VALUE (fragp
->fr_symbol
);
13381 symsec
= S_GET_SEGMENT (fragp
->fr_symbol
);
13387 /* We won't have the section when we are called from
13388 mips_relax_frag. However, we will always have been called
13389 from md_estimate_size_before_relax first. If this is a
13390 branch to a different section, we mark it as such. If SEC is
13391 NULL, and the frag is not marked, then it must be a branch to
13392 the same section. */
13395 if (RELAX_MIPS16_LONG_BRANCH (fragp
->fr_subtype
))
13400 /* Must have been called from md_estimate_size_before_relax. */
13403 fragp
->fr_subtype
=
13404 RELAX_MIPS16_MARK_LONG_BRANCH (fragp
->fr_subtype
);
13406 /* FIXME: We should support this, and let the linker
13407 catch branches and loads that are out of range. */
13408 as_bad_where (fragp
->fr_file
, fragp
->fr_line
,
13409 _("unsupported PC relative reference to different section"));
13413 if (fragp
!= sym_frag
&& sym_frag
->fr_address
== 0)
13414 /* Assume non-extended on the first relaxation pass.
13415 The address we have calculated will be bogus if this is
13416 a forward branch to another frag, as the forward frag
13417 will have fr_address == 0. */
13421 /* In this case, we know for sure that the symbol fragment is in
13422 the same section. If the relax_marker of the symbol fragment
13423 differs from the relax_marker of this fragment, we have not
13424 yet adjusted the symbol fragment fr_address. We want to add
13425 in STRETCH in order to get a better estimate of the address.
13426 This particularly matters because of the shift bits. */
13428 && sym_frag
->relax_marker
!= fragp
->relax_marker
)
13432 /* Adjust stretch for any alignment frag. Note that if have
13433 been expanding the earlier code, the symbol may be
13434 defined in what appears to be an earlier frag. FIXME:
13435 This doesn't handle the fr_subtype field, which specifies
13436 a maximum number of bytes to skip when doing an
13438 for (f
= fragp
; f
!= NULL
&& f
!= sym_frag
; f
= f
->fr_next
)
13440 if (f
->fr_type
== rs_align
|| f
->fr_type
== rs_align_code
)
13443 stretch
= - ((- stretch
)
13444 & ~ ((1 << (int) f
->fr_offset
) - 1));
13446 stretch
&= ~ ((1 << (int) f
->fr_offset
) - 1);
13455 addr
= fragp
->fr_address
+ fragp
->fr_fix
;
13457 /* The base address rules are complicated. The base address of
13458 a branch is the following instruction. The base address of a
13459 PC relative load or add is the instruction itself, but if it
13460 is in a delay slot (in which case it can not be extended) use
13461 the address of the instruction whose delay slot it is in. */
13462 if (type
== 'p' || type
== 'q')
13466 /* If we are currently assuming that this frag should be
13467 extended, then, the current address is two bytes
13469 if (RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
))
13472 /* Ignore the low bit in the target, since it will be set
13473 for a text label. */
13474 if ((val
& 1) != 0)
13477 else if (RELAX_MIPS16_JAL_DSLOT (fragp
->fr_subtype
))
13479 else if (RELAX_MIPS16_DSLOT (fragp
->fr_subtype
))
13482 val
-= addr
& ~ ((1 << op
->shift
) - 1);
13484 /* Branch offsets have an implicit 0 in the lowest bit. */
13485 if (type
== 'p' || type
== 'q')
13488 /* If any of the shifted bits are set, we must use an extended
13489 opcode. If the address depends on the size of this
13490 instruction, this can lead to a loop, so we arrange to always
13491 use an extended opcode. We only check this when we are in
13492 the main relaxation loop, when SEC is NULL. */
13493 if ((val
& ((1 << op
->shift
) - 1)) != 0 && sec
== NULL
)
13495 fragp
->fr_subtype
=
13496 RELAX_MIPS16_MARK_LONG_BRANCH (fragp
->fr_subtype
);
13500 /* If we are about to mark a frag as extended because the value
13501 is precisely maxtiny + 1, then there is a chance of an
13502 infinite loop as in the following code:
13507 In this case when the la is extended, foo is 0x3fc bytes
13508 away, so the la can be shrunk, but then foo is 0x400 away, so
13509 the la must be extended. To avoid this loop, we mark the
13510 frag as extended if it was small, and is about to become
13511 extended with a value of maxtiny + 1. */
13512 if (val
== ((maxtiny
+ 1) << op
->shift
)
13513 && ! RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
)
13516 fragp
->fr_subtype
=
13517 RELAX_MIPS16_MARK_LONG_BRANCH (fragp
->fr_subtype
);
13521 else if (symsec
!= absolute_section
&& sec
!= NULL
)
13522 as_bad_where (fragp
->fr_file
, fragp
->fr_line
, _("unsupported relocation"));
13524 if ((val
& ((1 << op
->shift
) - 1)) != 0
13525 || val
< (mintiny
<< op
->shift
)
13526 || val
> (maxtiny
<< op
->shift
))
13532 /* Compute the length of a branch sequence, and adjust the
13533 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13534 worst-case length is computed, with UPDATE being used to indicate
13535 whether an unconditional (-1), branch-likely (+1) or regular (0)
13536 branch is to be computed. */
13538 relaxed_branch_length (fragS
*fragp
, asection
*sec
, int update
)
13540 bfd_boolean toofar
;
13544 && S_IS_DEFINED (fragp
->fr_symbol
)
13545 && sec
== S_GET_SEGMENT (fragp
->fr_symbol
))
13550 val
= S_GET_VALUE (fragp
->fr_symbol
) + fragp
->fr_offset
;
13552 addr
= fragp
->fr_address
+ fragp
->fr_fix
+ 4;
13556 toofar
= val
< - (0x8000 << 2) || val
>= (0x8000 << 2);
13559 /* If the symbol is not defined or it's in a different segment,
13560 assume the user knows what's going on and emit a short
13566 if (fragp
&& update
&& toofar
!= RELAX_BRANCH_TOOFAR (fragp
->fr_subtype
))
13568 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp
->fr_subtype
),
13569 RELAX_BRANCH_LIKELY (fragp
->fr_subtype
),
13570 RELAX_BRANCH_LINK (fragp
->fr_subtype
),
13576 if (fragp
? RELAX_BRANCH_LIKELY (fragp
->fr_subtype
) : (update
> 0))
13579 if (mips_pic
!= NO_PIC
)
13581 /* Additional space for PIC loading of target address. */
13583 if (mips_opts
.isa
== ISA_MIPS1
)
13584 /* Additional space for $at-stabilizing nop. */
13588 /* If branch is conditional. */
13589 if (fragp
? !RELAX_BRANCH_UNCOND (fragp
->fr_subtype
) : (update
>= 0))
13596 /* Estimate the size of a frag before relaxing. Unless this is the
13597 mips16, we are not really relaxing here, and the final size is
13598 encoded in the subtype information. For the mips16, we have to
13599 decide whether we are using an extended opcode or not. */
13602 md_estimate_size_before_relax (fragS
*fragp
, asection
*segtype
)
13606 if (RELAX_BRANCH_P (fragp
->fr_subtype
))
13609 fragp
->fr_var
= relaxed_branch_length (fragp
, segtype
, FALSE
);
13611 return fragp
->fr_var
;
13614 if (RELAX_MIPS16_P (fragp
->fr_subtype
))
13615 /* We don't want to modify the EXTENDED bit here; it might get us
13616 into infinite loops. We change it only in mips_relax_frag(). */
13617 return (RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
) ? 4 : 2);
13619 if (mips_pic
== NO_PIC
)
13620 change
= nopic_need_relax (fragp
->fr_symbol
, 0);
13621 else if (mips_pic
== SVR4_PIC
)
13622 change
= pic_need_relax (fragp
->fr_symbol
, segtype
);
13623 else if (mips_pic
== VXWORKS_PIC
)
13624 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
13631 fragp
->fr_subtype
|= RELAX_USE_SECOND
;
13632 return -RELAX_FIRST (fragp
->fr_subtype
);
13635 return -RELAX_SECOND (fragp
->fr_subtype
);
13638 /* This is called to see whether a reloc against a defined symbol
13639 should be converted into a reloc against a section. */
13642 mips_fix_adjustable (fixS
*fixp
)
13644 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
13645 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
13648 if (fixp
->fx_addsy
== NULL
)
13651 /* If symbol SYM is in a mergeable section, relocations of the form
13652 SYM + 0 can usually be made section-relative. The mergeable data
13653 is then identified by the section offset rather than by the symbol.
13655 However, if we're generating REL LO16 relocations, the offset is split
13656 between the LO16 and parterning high part relocation. The linker will
13657 need to recalculate the complete offset in order to correctly identify
13660 The linker has traditionally not looked for the parterning high part
13661 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13662 placed anywhere. Rather than break backwards compatibility by changing
13663 this, it seems better not to force the issue, and instead keep the
13664 original symbol. This will work with either linker behavior. */
13665 if ((fixp
->fx_r_type
== BFD_RELOC_LO16
13666 || fixp
->fx_r_type
== BFD_RELOC_MIPS16_LO16
13667 || reloc_needs_lo_p (fixp
->fx_r_type
))
13668 && HAVE_IN_PLACE_ADDENDS
13669 && (S_GET_SEGMENT (fixp
->fx_addsy
)->flags
& SEC_MERGE
) != 0)
13673 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13674 to a floating-point stub. The same is true for non-R_MIPS16_26
13675 relocations against MIPS16 functions; in this case, the stub becomes
13676 the function's canonical address.
13678 Floating-point stubs are stored in unique .mips16.call.* or
13679 .mips16.fn.* sections. If a stub T for function F is in section S,
13680 the first relocation in section S must be against F; this is how the
13681 linker determines the target function. All relocations that might
13682 resolve to T must also be against F. We therefore have the following
13683 restrictions, which are given in an intentionally-redundant way:
13685 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
13688 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
13689 if that stub might be used.
13691 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
13694 4. We cannot reduce a stub's relocations against MIPS16 symbols if
13695 that stub might be used.
13697 There is a further restriction:
13699 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
13700 on targets with in-place addends; the relocation field cannot
13701 encode the low bit.
13703 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
13704 against a MIPS16 symbol.
13706 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
13707 relocation against some symbol R, no relocation against R may be
13708 reduced. (Note that this deals with (2) as well as (1) because
13709 relocations against global symbols will never be reduced on ELF
13710 targets.) This approach is a little simpler than trying to detect
13711 stub sections, and gives the "all or nothing" per-symbol consistency
13712 that we have for MIPS16 symbols. */
13714 && fixp
->fx_subsy
== NULL
13715 && (S_GET_OTHER (fixp
->fx_addsy
) == STO_MIPS16
13716 || *symbol_get_tc (fixp
->fx_addsy
)))
13723 /* Translate internal representation of relocation info to BFD target
13727 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
13729 static arelent
*retval
[4];
13731 bfd_reloc_code_real_type code
;
13733 memset (retval
, 0, sizeof(retval
));
13734 reloc
= retval
[0] = (arelent
*) xcalloc (1, sizeof (arelent
));
13735 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
13736 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
13737 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
13739 if (fixp
->fx_pcrel
)
13741 assert (fixp
->fx_r_type
== BFD_RELOC_16_PCREL_S2
);
13743 /* At this point, fx_addnumber is "symbol offset - pcrel address".
13744 Relocations want only the symbol offset. */
13745 reloc
->addend
= fixp
->fx_addnumber
+ reloc
->address
;
13748 /* A gruesome hack which is a result of the gruesome gas
13749 reloc handling. What's worse, for COFF (as opposed to
13750 ECOFF), we might need yet another copy of reloc->address.
13751 See bfd_install_relocation. */
13752 reloc
->addend
+= reloc
->address
;
13756 reloc
->addend
= fixp
->fx_addnumber
;
13758 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13759 entry to be used in the relocation's section offset. */
13760 if (! HAVE_NEWABI
&& fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
13762 reloc
->address
= reloc
->addend
;
13766 code
= fixp
->fx_r_type
;
13768 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
13769 if (reloc
->howto
== NULL
)
13771 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
13772 _("Can not represent %s relocation in this object file format"),
13773 bfd_get_reloc_code_name (code
));
13780 /* Relax a machine dependent frag. This returns the amount by which
13781 the current size of the frag should change. */
13784 mips_relax_frag (asection
*sec
, fragS
*fragp
, long stretch
)
13786 if (RELAX_BRANCH_P (fragp
->fr_subtype
))
13788 offsetT old_var
= fragp
->fr_var
;
13790 fragp
->fr_var
= relaxed_branch_length (fragp
, sec
, TRUE
);
13792 return fragp
->fr_var
- old_var
;
13795 if (! RELAX_MIPS16_P (fragp
->fr_subtype
))
13798 if (mips16_extended_frag (fragp
, NULL
, stretch
))
13800 if (RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
))
13802 fragp
->fr_subtype
= RELAX_MIPS16_MARK_EXTENDED (fragp
->fr_subtype
);
13807 if (! RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
))
13809 fragp
->fr_subtype
= RELAX_MIPS16_CLEAR_EXTENDED (fragp
->fr_subtype
);
13816 /* Convert a machine dependent frag. */
13819 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
, segT asec
, fragS
*fragp
)
13821 if (RELAX_BRANCH_P (fragp
->fr_subtype
))
13824 unsigned long insn
;
13828 buf
= (bfd_byte
*)fragp
->fr_literal
+ fragp
->fr_fix
;
13830 if (target_big_endian
)
13831 insn
= bfd_getb32 (buf
);
13833 insn
= bfd_getl32 (buf
);
13835 if (!RELAX_BRANCH_TOOFAR (fragp
->fr_subtype
))
13837 /* We generate a fixup instead of applying it right now
13838 because, if there are linker relaxations, we're going to
13839 need the relocations. */
13840 exp
.X_op
= O_symbol
;
13841 exp
.X_add_symbol
= fragp
->fr_symbol
;
13842 exp
.X_add_number
= fragp
->fr_offset
;
13844 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*)fragp
->fr_literal
,
13845 4, &exp
, TRUE
, BFD_RELOC_16_PCREL_S2
);
13846 fixp
->fx_file
= fragp
->fr_file
;
13847 fixp
->fx_line
= fragp
->fr_line
;
13849 md_number_to_chars ((char *) buf
, insn
, 4);
13856 as_warn_where (fragp
->fr_file
, fragp
->fr_line
,
13857 _("relaxed out-of-range branch into a jump"));
13859 if (RELAX_BRANCH_UNCOND (fragp
->fr_subtype
))
13862 if (!RELAX_BRANCH_LIKELY (fragp
->fr_subtype
))
13864 /* Reverse the branch. */
13865 switch ((insn
>> 28) & 0xf)
13868 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13869 have the condition reversed by tweaking a single
13870 bit, and their opcodes all have 0x4???????. */
13871 assert ((insn
& 0xf1000000) == 0x41000000);
13872 insn
^= 0x00010000;
13876 /* bltz 0x04000000 bgez 0x04010000
13877 bltzal 0x04100000 bgezal 0x04110000 */
13878 assert ((insn
& 0xfc0e0000) == 0x04000000);
13879 insn
^= 0x00010000;
13883 /* beq 0x10000000 bne 0x14000000
13884 blez 0x18000000 bgtz 0x1c000000 */
13885 insn
^= 0x04000000;
13893 if (RELAX_BRANCH_LINK (fragp
->fr_subtype
))
13895 /* Clear the and-link bit. */
13896 assert ((insn
& 0xfc1c0000) == 0x04100000);
13898 /* bltzal 0x04100000 bgezal 0x04110000
13899 bltzall 0x04120000 bgezall 0x04130000 */
13900 insn
&= ~0x00100000;
13903 /* Branch over the branch (if the branch was likely) or the
13904 full jump (not likely case). Compute the offset from the
13905 current instruction to branch to. */
13906 if (RELAX_BRANCH_LIKELY (fragp
->fr_subtype
))
13910 /* How many bytes in instructions we've already emitted? */
13911 i
= buf
- (bfd_byte
*)fragp
->fr_literal
- fragp
->fr_fix
;
13912 /* How many bytes in instructions from here to the end? */
13913 i
= fragp
->fr_var
- i
;
13915 /* Convert to instruction count. */
13917 /* Branch counts from the next instruction. */
13920 /* Branch over the jump. */
13921 md_number_to_chars ((char *) buf
, insn
, 4);
13925 md_number_to_chars ((char *) buf
, 0, 4);
13928 if (RELAX_BRANCH_LIKELY (fragp
->fr_subtype
))
13930 /* beql $0, $0, 2f */
13932 /* Compute the PC offset from the current instruction to
13933 the end of the variable frag. */
13934 /* How many bytes in instructions we've already emitted? */
13935 i
= buf
- (bfd_byte
*)fragp
->fr_literal
- fragp
->fr_fix
;
13936 /* How many bytes in instructions from here to the end? */
13937 i
= fragp
->fr_var
- i
;
13938 /* Convert to instruction count. */
13940 /* Don't decrement i, because we want to branch over the
13944 md_number_to_chars ((char *) buf
, insn
, 4);
13947 md_number_to_chars ((char *) buf
, 0, 4);
13952 if (mips_pic
== NO_PIC
)
13955 insn
= (RELAX_BRANCH_LINK (fragp
->fr_subtype
)
13956 ? 0x0c000000 : 0x08000000);
13957 exp
.X_op
= O_symbol
;
13958 exp
.X_add_symbol
= fragp
->fr_symbol
;
13959 exp
.X_add_number
= fragp
->fr_offset
;
13961 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*)fragp
->fr_literal
,
13962 4, &exp
, FALSE
, BFD_RELOC_MIPS_JMP
);
13963 fixp
->fx_file
= fragp
->fr_file
;
13964 fixp
->fx_line
= fragp
->fr_line
;
13966 md_number_to_chars ((char *) buf
, insn
, 4);
13971 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
13972 insn
= HAVE_64BIT_ADDRESSES
? 0xdf810000 : 0x8f810000;
13973 exp
.X_op
= O_symbol
;
13974 exp
.X_add_symbol
= fragp
->fr_symbol
;
13975 exp
.X_add_number
= fragp
->fr_offset
;
13977 if (fragp
->fr_offset
)
13979 exp
.X_add_symbol
= make_expr_symbol (&exp
);
13980 exp
.X_add_number
= 0;
13983 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*)fragp
->fr_literal
,
13984 4, &exp
, FALSE
, BFD_RELOC_MIPS_GOT16
);
13985 fixp
->fx_file
= fragp
->fr_file
;
13986 fixp
->fx_line
= fragp
->fr_line
;
13988 md_number_to_chars ((char *) buf
, insn
, 4);
13991 if (mips_opts
.isa
== ISA_MIPS1
)
13994 md_number_to_chars ((char *) buf
, 0, 4);
13998 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
13999 insn
= HAVE_64BIT_ADDRESSES
? 0x64210000 : 0x24210000;
14001 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*)fragp
->fr_literal
,
14002 4, &exp
, FALSE
, BFD_RELOC_LO16
);
14003 fixp
->fx_file
= fragp
->fr_file
;
14004 fixp
->fx_line
= fragp
->fr_line
;
14006 md_number_to_chars ((char *) buf
, insn
, 4);
14010 if (RELAX_BRANCH_LINK (fragp
->fr_subtype
))
14015 md_number_to_chars ((char *) buf
, insn
, 4);
14020 assert (buf
== (bfd_byte
*)fragp
->fr_literal
14021 + fragp
->fr_fix
+ fragp
->fr_var
);
14023 fragp
->fr_fix
+= fragp
->fr_var
;
14028 if (RELAX_MIPS16_P (fragp
->fr_subtype
))
14031 const struct mips16_immed_operand
*op
;
14032 bfd_boolean small
, ext
;
14035 unsigned long insn
;
14036 bfd_boolean use_extend
;
14037 unsigned short extend
;
14039 type
= RELAX_MIPS16_TYPE (fragp
->fr_subtype
);
14040 op
= mips16_immed_operands
;
14041 while (op
->type
!= type
)
14044 if (RELAX_MIPS16_EXTENDED (fragp
->fr_subtype
))
14055 resolve_symbol_value (fragp
->fr_symbol
);
14056 val
= S_GET_VALUE (fragp
->fr_symbol
);
14061 addr
= fragp
->fr_address
+ fragp
->fr_fix
;
14063 /* The rules for the base address of a PC relative reloc are
14064 complicated; see mips16_extended_frag. */
14065 if (type
== 'p' || type
== 'q')
14070 /* Ignore the low bit in the target, since it will be
14071 set for a text label. */
14072 if ((val
& 1) != 0)
14075 else if (RELAX_MIPS16_JAL_DSLOT (fragp
->fr_subtype
))
14077 else if (RELAX_MIPS16_DSLOT (fragp
->fr_subtype
))
14080 addr
&= ~ (addressT
) ((1 << op
->shift
) - 1);
14083 /* Make sure the section winds up with the alignment we have
14086 record_alignment (asec
, op
->shift
);
14090 && (RELAX_MIPS16_JAL_DSLOT (fragp
->fr_subtype
)
14091 || RELAX_MIPS16_DSLOT (fragp
->fr_subtype
)))
14092 as_warn_where (fragp
->fr_file
, fragp
->fr_line
,
14093 _("extended instruction in delay slot"));
14095 buf
= (bfd_byte
*) (fragp
->fr_literal
+ fragp
->fr_fix
);
14097 if (target_big_endian
)
14098 insn
= bfd_getb16 (buf
);
14100 insn
= bfd_getl16 (buf
);
14102 mips16_immed (fragp
->fr_file
, fragp
->fr_line
, type
, val
,
14103 RELAX_MIPS16_USER_EXT (fragp
->fr_subtype
),
14104 small
, ext
, &insn
, &use_extend
, &extend
);
14108 md_number_to_chars ((char *) buf
, 0xf000 | extend
, 2);
14109 fragp
->fr_fix
+= 2;
14113 md_number_to_chars ((char *) buf
, insn
, 2);
14114 fragp
->fr_fix
+= 2;
14122 first
= RELAX_FIRST (fragp
->fr_subtype
);
14123 second
= RELAX_SECOND (fragp
->fr_subtype
);
14124 fixp
= (fixS
*) fragp
->fr_opcode
;
14126 /* Possibly emit a warning if we've chosen the longer option. */
14127 if (((fragp
->fr_subtype
& RELAX_USE_SECOND
) != 0)
14128 == ((fragp
->fr_subtype
& RELAX_SECOND_LONGER
) != 0))
14130 const char *msg
= macro_warning (fragp
->fr_subtype
);
14132 as_warn_where (fragp
->fr_file
, fragp
->fr_line
, msg
);
14135 /* Go through all the fixups for the first sequence. Disable them
14136 (by marking them as done) if we're going to use the second
14137 sequence instead. */
14139 && fixp
->fx_frag
== fragp
14140 && fixp
->fx_where
< fragp
->fr_fix
- second
)
14142 if (fragp
->fr_subtype
& RELAX_USE_SECOND
)
14144 fixp
= fixp
->fx_next
;
14147 /* Go through the fixups for the second sequence. Disable them if
14148 we're going to use the first sequence, otherwise adjust their
14149 addresses to account for the relaxation. */
14150 while (fixp
&& fixp
->fx_frag
== fragp
)
14152 if (fragp
->fr_subtype
& RELAX_USE_SECOND
)
14153 fixp
->fx_where
-= first
;
14156 fixp
= fixp
->fx_next
;
14159 /* Now modify the frag contents. */
14160 if (fragp
->fr_subtype
& RELAX_USE_SECOND
)
14164 start
= fragp
->fr_literal
+ fragp
->fr_fix
- first
- second
;
14165 memmove (start
, start
+ first
, second
);
14166 fragp
->fr_fix
-= first
;
14169 fragp
->fr_fix
-= second
;
14175 /* This function is called after the relocs have been generated.
14176 We've been storing mips16 text labels as odd. Here we convert them
14177 back to even for the convenience of the debugger. */
14180 mips_frob_file_after_relocs (void)
14183 unsigned int count
, i
;
14188 syms
= bfd_get_outsymbols (stdoutput
);
14189 count
= bfd_get_symcount (stdoutput
);
14190 for (i
= 0; i
< count
; i
++, syms
++)
14192 if (elf_symbol (*syms
)->internal_elf_sym
.st_other
== STO_MIPS16
14193 && ((*syms
)->value
& 1) != 0)
14195 (*syms
)->value
&= ~1;
14196 /* If the symbol has an odd size, it was probably computed
14197 incorrectly, so adjust that as well. */
14198 if ((elf_symbol (*syms
)->internal_elf_sym
.st_size
& 1) != 0)
14199 ++elf_symbol (*syms
)->internal_elf_sym
.st_size
;
14206 /* This function is called whenever a label is defined. It is used
14207 when handling branch delays; if a branch has a label, we assume we
14208 can not move it. */
14211 mips_define_label (symbolS
*sym
)
14213 segment_info_type
*si
= seg_info (now_seg
);
14214 struct insn_label_list
*l
;
14216 if (free_insn_labels
== NULL
)
14217 l
= (struct insn_label_list
*) xmalloc (sizeof *l
);
14220 l
= free_insn_labels
;
14221 free_insn_labels
= l
->next
;
14225 l
->next
= si
->label_list
;
14226 si
->label_list
= l
;
14229 dwarf2_emit_label (sym
);
14233 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14235 /* Some special processing for a MIPS ELF file. */
14238 mips_elf_final_processing (void)
14240 /* Write out the register information. */
14241 if (mips_abi
!= N64_ABI
)
14245 s
.ri_gprmask
= mips_gprmask
;
14246 s
.ri_cprmask
[0] = mips_cprmask
[0];
14247 s
.ri_cprmask
[1] = mips_cprmask
[1];
14248 s
.ri_cprmask
[2] = mips_cprmask
[2];
14249 s
.ri_cprmask
[3] = mips_cprmask
[3];
14250 /* The gp_value field is set by the MIPS ELF backend. */
14252 bfd_mips_elf32_swap_reginfo_out (stdoutput
, &s
,
14253 ((Elf32_External_RegInfo
*)
14254 mips_regmask_frag
));
14258 Elf64_Internal_RegInfo s
;
14260 s
.ri_gprmask
= mips_gprmask
;
14262 s
.ri_cprmask
[0] = mips_cprmask
[0];
14263 s
.ri_cprmask
[1] = mips_cprmask
[1];
14264 s
.ri_cprmask
[2] = mips_cprmask
[2];
14265 s
.ri_cprmask
[3] = mips_cprmask
[3];
14266 /* The gp_value field is set by the MIPS ELF backend. */
14268 bfd_mips_elf64_swap_reginfo_out (stdoutput
, &s
,
14269 ((Elf64_External_RegInfo
*)
14270 mips_regmask_frag
));
14273 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14274 sort of BFD interface for this. */
14275 if (mips_any_noreorder
)
14276 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_NOREORDER
;
14277 if (mips_pic
!= NO_PIC
)
14279 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_PIC
;
14280 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_CPIC
;
14283 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_CPIC
;
14285 /* Set MIPS ELF flags for ASEs. */
14286 /* We may need to define a new flag for DSP ASE, and set this flag when
14287 file_ase_dsp is true. */
14288 /* Same for DSP R2. */
14289 /* We may need to define a new flag for MT ASE, and set this flag when
14290 file_ase_mt is true. */
14291 if (file_ase_mips16
)
14292 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_ARCH_ASE_M16
;
14293 #if 0 /* XXX FIXME */
14294 if (file_ase_mips3d
)
14295 elf_elfheader (stdoutput
)->e_flags
|= ???;
14298 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_ARCH_ASE_MDMX
;
14300 /* Set the MIPS ELF ABI flags. */
14301 if (mips_abi
== O32_ABI
&& USE_E_MIPS_ABI_O32
)
14302 elf_elfheader (stdoutput
)->e_flags
|= E_MIPS_ABI_O32
;
14303 else if (mips_abi
== O64_ABI
)
14304 elf_elfheader (stdoutput
)->e_flags
|= E_MIPS_ABI_O64
;
14305 else if (mips_abi
== EABI_ABI
)
14307 if (!file_mips_gp32
)
14308 elf_elfheader (stdoutput
)->e_flags
|= E_MIPS_ABI_EABI64
;
14310 elf_elfheader (stdoutput
)->e_flags
|= E_MIPS_ABI_EABI32
;
14312 else if (mips_abi
== N32_ABI
)
14313 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_ABI2
;
14315 /* Nothing to do for N64_ABI. */
14317 if (mips_32bitmode
)
14318 elf_elfheader (stdoutput
)->e_flags
|= EF_MIPS_32BITMODE
;
14320 #if 0 /* XXX FIXME */
14321 /* 32 bit code with 64 bit FP registers. */
14322 if (!file_mips_fp32
&& ABI_NEEDS_32BIT_REGS (mips_abi
))
14323 elf_elfheader (stdoutput
)->e_flags
|= ???;
14327 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14329 typedef struct proc
{
14331 symbolS
*func_end_sym
;
14332 unsigned long reg_mask
;
14333 unsigned long reg_offset
;
14334 unsigned long fpreg_mask
;
14335 unsigned long fpreg_offset
;
14336 unsigned long frame_offset
;
14337 unsigned long frame_reg
;
14338 unsigned long pc_reg
;
14341 static procS cur_proc
;
14342 static procS
*cur_proc_ptr
;
14343 static int numprocs
;
14345 /* Fill in an rs_align_code fragment. */
14348 mips_handle_align (fragS
*fragp
)
14350 if (fragp
->fr_type
!= rs_align_code
)
14353 if (mips_opts
.mips16
)
14355 static const unsigned char be_nop
[] = { 0x65, 0x00 };
14356 static const unsigned char le_nop
[] = { 0x00, 0x65 };
14361 bytes
= fragp
->fr_next
->fr_address
- fragp
->fr_address
- fragp
->fr_fix
;
14362 p
= fragp
->fr_literal
+ fragp
->fr_fix
;
14370 memcpy (p
, (target_big_endian
? be_nop
: le_nop
), 2);
14374 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
14378 md_obj_begin (void)
14385 /* Check for premature end, nesting errors, etc. */
14387 as_warn (_("missing .end at end of assembly"));
14396 if (*input_line_pointer
== '-')
14398 ++input_line_pointer
;
14401 if (!ISDIGIT (*input_line_pointer
))
14402 as_bad (_("expected simple number"));
14403 if (input_line_pointer
[0] == '0')
14405 if (input_line_pointer
[1] == 'x')
14407 input_line_pointer
+= 2;
14408 while (ISXDIGIT (*input_line_pointer
))
14411 val
|= hex_value (*input_line_pointer
++);
14413 return negative
? -val
: val
;
14417 ++input_line_pointer
;
14418 while (ISDIGIT (*input_line_pointer
))
14421 val
|= *input_line_pointer
++ - '0';
14423 return negative
? -val
: val
;
14426 if (!ISDIGIT (*input_line_pointer
))
14428 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14429 *input_line_pointer
, *input_line_pointer
);
14430 as_warn (_("invalid number"));
14433 while (ISDIGIT (*input_line_pointer
))
14436 val
+= *input_line_pointer
++ - '0';
14438 return negative
? -val
: val
;
14441 /* The .file directive; just like the usual .file directive, but there
14442 is an initial number which is the ECOFF file index. In the non-ECOFF
14443 case .file implies DWARF-2. */
14446 s_mips_file (int x ATTRIBUTE_UNUSED
)
14448 static int first_file_directive
= 0;
14450 if (ECOFF_DEBUGGING
)
14459 filename
= dwarf2_directive_file (0);
14461 /* Versions of GCC up to 3.1 start files with a ".file"
14462 directive even for stabs output. Make sure that this
14463 ".file" is handled. Note that you need a version of GCC
14464 after 3.1 in order to support DWARF-2 on MIPS. */
14465 if (filename
!= NULL
&& ! first_file_directive
)
14467 (void) new_logical_line (filename
, -1);
14468 s_app_file_string (filename
, 0);
14470 first_file_directive
= 1;
14474 /* The .loc directive, implying DWARF-2. */
14477 s_mips_loc (int x ATTRIBUTE_UNUSED
)
14479 if (!ECOFF_DEBUGGING
)
14480 dwarf2_directive_loc (0);
14483 /* The .end directive. */
14486 s_mips_end (int x ATTRIBUTE_UNUSED
)
14490 /* Following functions need their own .frame and .cprestore directives. */
14491 mips_frame_reg_valid
= 0;
14492 mips_cprestore_valid
= 0;
14494 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
14497 demand_empty_rest_of_line ();
14502 if ((bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
) == 0)
14503 as_warn (_(".end not in text section"));
14507 as_warn (_(".end directive without a preceding .ent directive."));
14508 demand_empty_rest_of_line ();
14514 assert (S_GET_NAME (p
));
14515 if (strcmp (S_GET_NAME (p
), S_GET_NAME (cur_proc_ptr
->func_sym
)))
14516 as_warn (_(".end symbol does not match .ent symbol."));
14518 if (debug_type
== DEBUG_STABS
)
14519 stabs_generate_asm_endfunc (S_GET_NAME (p
),
14523 as_warn (_(".end directive missing or unknown symbol"));
14526 /* Create an expression to calculate the size of the function. */
14527 if (p
&& cur_proc_ptr
)
14529 OBJ_SYMFIELD_TYPE
*obj
= symbol_get_obj (p
);
14530 expressionS
*exp
= xmalloc (sizeof (expressionS
));
14533 exp
->X_op
= O_subtract
;
14534 exp
->X_add_symbol
= symbol_temp_new_now ();
14535 exp
->X_op_symbol
= p
;
14536 exp
->X_add_number
= 0;
14538 cur_proc_ptr
->func_end_sym
= exp
->X_add_symbol
;
14541 /* Generate a .pdr section. */
14542 if (IS_ELF
&& !ECOFF_DEBUGGING
&& mips_flag_pdr
)
14544 segT saved_seg
= now_seg
;
14545 subsegT saved_subseg
= now_subseg
;
14550 dot
= frag_now_fix ();
14552 #ifdef md_flush_pending_output
14553 md_flush_pending_output ();
14557 subseg_set (pdr_seg
, 0);
14559 /* Write the symbol. */
14560 exp
.X_op
= O_symbol
;
14561 exp
.X_add_symbol
= p
;
14562 exp
.X_add_number
= 0;
14563 emit_expr (&exp
, 4);
14565 fragp
= frag_more (7 * 4);
14567 md_number_to_chars (fragp
, cur_proc_ptr
->reg_mask
, 4);
14568 md_number_to_chars (fragp
+ 4, cur_proc_ptr
->reg_offset
, 4);
14569 md_number_to_chars (fragp
+ 8, cur_proc_ptr
->fpreg_mask
, 4);
14570 md_number_to_chars (fragp
+ 12, cur_proc_ptr
->fpreg_offset
, 4);
14571 md_number_to_chars (fragp
+ 16, cur_proc_ptr
->frame_offset
, 4);
14572 md_number_to_chars (fragp
+ 20, cur_proc_ptr
->frame_reg
, 4);
14573 md_number_to_chars (fragp
+ 24, cur_proc_ptr
->pc_reg
, 4);
14575 subseg_set (saved_seg
, saved_subseg
);
14577 #endif /* OBJ_ELF */
14579 cur_proc_ptr
= NULL
;
14582 /* The .aent and .ent directives. */
14585 s_mips_ent (int aent
)
14589 symbolP
= get_symbol ();
14590 if (*input_line_pointer
== ',')
14591 ++input_line_pointer
;
14592 SKIP_WHITESPACE ();
14593 if (ISDIGIT (*input_line_pointer
)
14594 || *input_line_pointer
== '-')
14597 if ((bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
) == 0)
14598 as_warn (_(".ent or .aent not in text section."));
14600 if (!aent
&& cur_proc_ptr
)
14601 as_warn (_("missing .end"));
14605 /* This function needs its own .frame and .cprestore directives. */
14606 mips_frame_reg_valid
= 0;
14607 mips_cprestore_valid
= 0;
14609 cur_proc_ptr
= &cur_proc
;
14610 memset (cur_proc_ptr
, '\0', sizeof (procS
));
14612 cur_proc_ptr
->func_sym
= symbolP
;
14614 symbol_get_bfdsym (symbolP
)->flags
|= BSF_FUNCTION
;
14618 if (debug_type
== DEBUG_STABS
)
14619 stabs_generate_asm_func (S_GET_NAME (symbolP
),
14620 S_GET_NAME (symbolP
));
14623 demand_empty_rest_of_line ();
14626 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14627 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14628 s_mips_frame is used so that we can set the PDR information correctly.
14629 We can't use the ecoff routines because they make reference to the ecoff
14630 symbol table (in the mdebug section). */
14633 s_mips_frame (int ignore ATTRIBUTE_UNUSED
)
14636 if (IS_ELF
&& !ECOFF_DEBUGGING
)
14640 if (cur_proc_ptr
== (procS
*) NULL
)
14642 as_warn (_(".frame outside of .ent"));
14643 demand_empty_rest_of_line ();
14647 cur_proc_ptr
->frame_reg
= tc_get_register (1);
14649 SKIP_WHITESPACE ();
14650 if (*input_line_pointer
++ != ','
14651 || get_absolute_expression_and_terminator (&val
) != ',')
14653 as_warn (_("Bad .frame directive"));
14654 --input_line_pointer
;
14655 demand_empty_rest_of_line ();
14659 cur_proc_ptr
->frame_offset
= val
;
14660 cur_proc_ptr
->pc_reg
= tc_get_register (0);
14662 demand_empty_rest_of_line ();
14665 #endif /* OBJ_ELF */
14669 /* The .fmask and .mask directives. If the mdebug section is present
14670 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14671 embedded targets, s_mips_mask is used so that we can set the PDR
14672 information correctly. We can't use the ecoff routines because they
14673 make reference to the ecoff symbol table (in the mdebug section). */
14676 s_mips_mask (int reg_type
)
14679 if (IS_ELF
&& !ECOFF_DEBUGGING
)
14683 if (cur_proc_ptr
== (procS
*) NULL
)
14685 as_warn (_(".mask/.fmask outside of .ent"));
14686 demand_empty_rest_of_line ();
14690 if (get_absolute_expression_and_terminator (&mask
) != ',')
14692 as_warn (_("Bad .mask/.fmask directive"));
14693 --input_line_pointer
;
14694 demand_empty_rest_of_line ();
14698 off
= get_absolute_expression ();
14700 if (reg_type
== 'F')
14702 cur_proc_ptr
->fpreg_mask
= mask
;
14703 cur_proc_ptr
->fpreg_offset
= off
;
14707 cur_proc_ptr
->reg_mask
= mask
;
14708 cur_proc_ptr
->reg_offset
= off
;
14711 demand_empty_rest_of_line ();
14714 #endif /* OBJ_ELF */
14715 s_ignore (reg_type
);
14718 /* A table describing all the processors gas knows about. Names are
14719 matched in the order listed.
14721 To ease comparison, please keep this table in the same order as
14722 gcc's mips_cpu_info_table[]. */
14723 static const struct mips_cpu_info mips_cpu_info_table
[] =
14725 /* Entries for generic ISAs */
14726 { "mips1", MIPS_CPU_IS_ISA
, ISA_MIPS1
, CPU_R3000
},
14727 { "mips2", MIPS_CPU_IS_ISA
, ISA_MIPS2
, CPU_R6000
},
14728 { "mips3", MIPS_CPU_IS_ISA
, ISA_MIPS3
, CPU_R4000
},
14729 { "mips4", MIPS_CPU_IS_ISA
, ISA_MIPS4
, CPU_R8000
},
14730 { "mips5", MIPS_CPU_IS_ISA
, ISA_MIPS5
, CPU_MIPS5
},
14731 { "mips32", MIPS_CPU_IS_ISA
, ISA_MIPS32
, CPU_MIPS32
},
14732 { "mips32r2", MIPS_CPU_IS_ISA
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14733 { "mips64", MIPS_CPU_IS_ISA
, ISA_MIPS64
, CPU_MIPS64
},
14734 { "mips64r2", MIPS_CPU_IS_ISA
, ISA_MIPS64R2
, CPU_MIPS64R2
},
14737 { "r3000", 0, ISA_MIPS1
, CPU_R3000
},
14738 { "r2000", 0, ISA_MIPS1
, CPU_R3000
},
14739 { "r3900", 0, ISA_MIPS1
, CPU_R3900
},
14742 { "r6000", 0, ISA_MIPS2
, CPU_R6000
},
14745 { "r4000", 0, ISA_MIPS3
, CPU_R4000
},
14746 { "r4010", 0, ISA_MIPS2
, CPU_R4010
},
14747 { "vr4100", 0, ISA_MIPS3
, CPU_VR4100
},
14748 { "vr4111", 0, ISA_MIPS3
, CPU_R4111
},
14749 { "vr4120", 0, ISA_MIPS3
, CPU_VR4120
},
14750 { "vr4130", 0, ISA_MIPS3
, CPU_VR4120
},
14751 { "vr4181", 0, ISA_MIPS3
, CPU_R4111
},
14752 { "vr4300", 0, ISA_MIPS3
, CPU_R4300
},
14753 { "r4400", 0, ISA_MIPS3
, CPU_R4400
},
14754 { "r4600", 0, ISA_MIPS3
, CPU_R4600
},
14755 { "orion", 0, ISA_MIPS3
, CPU_R4600
},
14756 { "r4650", 0, ISA_MIPS3
, CPU_R4650
},
14759 { "r8000", 0, ISA_MIPS4
, CPU_R8000
},
14760 { "r10000", 0, ISA_MIPS4
, CPU_R10000
},
14761 { "r12000", 0, ISA_MIPS4
, CPU_R12000
},
14762 { "vr5000", 0, ISA_MIPS4
, CPU_R5000
},
14763 { "vr5400", 0, ISA_MIPS4
, CPU_VR5400
},
14764 { "vr5500", 0, ISA_MIPS4
, CPU_VR5500
},
14765 { "rm5200", 0, ISA_MIPS4
, CPU_R5000
},
14766 { "rm5230", 0, ISA_MIPS4
, CPU_R5000
},
14767 { "rm5231", 0, ISA_MIPS4
, CPU_R5000
},
14768 { "rm5261", 0, ISA_MIPS4
, CPU_R5000
},
14769 { "rm5721", 0, ISA_MIPS4
, CPU_R5000
},
14770 { "rm7000", 0, ISA_MIPS4
, CPU_RM7000
},
14771 { "rm9000", 0, ISA_MIPS4
, CPU_RM9000
},
14774 { "4kc", 0, ISA_MIPS32
, CPU_MIPS32
},
14775 { "4km", 0, ISA_MIPS32
, CPU_MIPS32
},
14776 { "4kp", 0, ISA_MIPS32
, CPU_MIPS32
},
14777 { "4ksc", MIPS_CPU_ASE_SMARTMIPS
, ISA_MIPS32
, CPU_MIPS32
},
14779 /* MIPS 32 Release 2 */
14780 { "4kec", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14781 { "4kem", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14782 { "4kep", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14783 { "4ksd", MIPS_CPU_ASE_SMARTMIPS
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14784 { "m4k", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14785 { "m4kp", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14786 { "24kc", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14787 { "24kf2_1", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14788 { "24kf", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14789 { "24kf1_1", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14790 /* Deprecated forms of the above. */
14791 { "24kfx", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14792 { "24kx", 0, ISA_MIPS32R2
, CPU_MIPS32R2
},
14793 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
14794 { "24kec", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14795 { "24kef2_1", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14796 { "24kef", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14797 { "24kef1_1", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14798 /* Deprecated forms of the above. */
14799 { "24kefx", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14800 { "24kex", MIPS_CPU_ASE_DSP
, ISA_MIPS32R2
, CPU_MIPS32R2
},
14801 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
14802 { "34kc", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14803 ISA_MIPS32R2
, CPU_MIPS32R2
},
14804 { "34kf2_1", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14805 ISA_MIPS32R2
, CPU_MIPS32R2
},
14806 { "34kf", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14807 ISA_MIPS32R2
, CPU_MIPS32R2
},
14808 { "34kf1_1", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14809 ISA_MIPS32R2
, CPU_MIPS32R2
},
14810 /* Deprecated forms of the above. */
14811 { "34kfx", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14812 ISA_MIPS32R2
, CPU_MIPS32R2
},
14813 { "34kx", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_MT
,
14814 ISA_MIPS32R2
, CPU_MIPS32R2
},
14815 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
14816 { "74kc", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14817 ISA_MIPS32R2
, CPU_MIPS32R2
},
14818 { "74kf2_1", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14819 ISA_MIPS32R2
, CPU_MIPS32R2
},
14820 { "74kf", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14821 ISA_MIPS32R2
, CPU_MIPS32R2
},
14822 { "74kf1_1", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14823 ISA_MIPS32R2
, CPU_MIPS32R2
},
14824 { "74kf3_2", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14825 ISA_MIPS32R2
, CPU_MIPS32R2
},
14826 /* Deprecated forms of the above. */
14827 { "74kfx", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14828 ISA_MIPS32R2
, CPU_MIPS32R2
},
14829 { "74kx", MIPS_CPU_ASE_DSP
| MIPS_CPU_ASE_DSPR2
,
14830 ISA_MIPS32R2
, CPU_MIPS32R2
},
14833 { "5kc", 0, ISA_MIPS64
, CPU_MIPS64
},
14834 { "5kf", 0, ISA_MIPS64
, CPU_MIPS64
},
14835 { "20kc", MIPS_CPU_ASE_MIPS3D
, ISA_MIPS64
, CPU_MIPS64
},
14836 { "25kf", MIPS_CPU_ASE_MIPS3D
, ISA_MIPS64
, CPU_MIPS64
},
14838 /* MIPS 64 Release 2 */
14840 /* Broadcom SB-1 CPU core */
14841 { "sb1", MIPS_CPU_ASE_MIPS3D
| MIPS_CPU_ASE_MDMX
,
14842 ISA_MIPS64
, CPU_SB1
},
14843 /* Broadcom SB-1A CPU core */
14844 { "sb1a", MIPS_CPU_ASE_MIPS3D
| MIPS_CPU_ASE_MDMX
,
14845 ISA_MIPS64
, CPU_SB1
},
14852 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14853 with a final "000" replaced by "k". Ignore case.
14855 Note: this function is shared between GCC and GAS. */
14858 mips_strict_matching_cpu_name_p (const char *canonical
, const char *given
)
14860 while (*given
!= 0 && TOLOWER (*given
) == TOLOWER (*canonical
))
14861 given
++, canonical
++;
14863 return ((*given
== 0 && *canonical
== 0)
14864 || (strcmp (canonical
, "000") == 0 && strcasecmp (given
, "k") == 0));
14868 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14869 CPU name. We've traditionally allowed a lot of variation here.
14871 Note: this function is shared between GCC and GAS. */
14874 mips_matching_cpu_name_p (const char *canonical
, const char *given
)
14876 /* First see if the name matches exactly, or with a final "000"
14877 turned into "k". */
14878 if (mips_strict_matching_cpu_name_p (canonical
, given
))
14881 /* If not, try comparing based on numerical designation alone.
14882 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14883 if (TOLOWER (*given
) == 'r')
14885 if (!ISDIGIT (*given
))
14888 /* Skip over some well-known prefixes in the canonical name,
14889 hoping to find a number there too. */
14890 if (TOLOWER (canonical
[0]) == 'v' && TOLOWER (canonical
[1]) == 'r')
14892 else if (TOLOWER (canonical
[0]) == 'r' && TOLOWER (canonical
[1]) == 'm')
14894 else if (TOLOWER (canonical
[0]) == 'r')
14897 return mips_strict_matching_cpu_name_p (canonical
, given
);
14901 /* Parse an option that takes the name of a processor as its argument.
14902 OPTION is the name of the option and CPU_STRING is the argument.
14903 Return the corresponding processor enumeration if the CPU_STRING is
14904 recognized, otherwise report an error and return null.
14906 A similar function exists in GCC. */
14908 static const struct mips_cpu_info
*
14909 mips_parse_cpu (const char *option
, const char *cpu_string
)
14911 const struct mips_cpu_info
*p
;
14913 /* 'from-abi' selects the most compatible architecture for the given
14914 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
14915 EABIs, we have to decide whether we're using the 32-bit or 64-bit
14916 version. Look first at the -mgp options, if given, otherwise base
14917 the choice on MIPS_DEFAULT_64BIT.
14919 Treat NO_ABI like the EABIs. One reason to do this is that the
14920 plain 'mips' and 'mips64' configs have 'from-abi' as their default
14921 architecture. This code picks MIPS I for 'mips' and MIPS III for
14922 'mips64', just as we did in the days before 'from-abi'. */
14923 if (strcasecmp (cpu_string
, "from-abi") == 0)
14925 if (ABI_NEEDS_32BIT_REGS (mips_abi
))
14926 return mips_cpu_info_from_isa (ISA_MIPS1
);
14928 if (ABI_NEEDS_64BIT_REGS (mips_abi
))
14929 return mips_cpu_info_from_isa (ISA_MIPS3
);
14931 if (file_mips_gp32
>= 0)
14932 return mips_cpu_info_from_isa (file_mips_gp32
? ISA_MIPS1
: ISA_MIPS3
);
14934 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14939 /* 'default' has traditionally been a no-op. Probably not very useful. */
14940 if (strcasecmp (cpu_string
, "default") == 0)
14943 for (p
= mips_cpu_info_table
; p
->name
!= 0; p
++)
14944 if (mips_matching_cpu_name_p (p
->name
, cpu_string
))
14947 as_bad ("Bad value (%s) for %s", cpu_string
, option
);
14951 /* Return the canonical processor information for ISA (a member of the
14952 ISA_MIPS* enumeration). */
14954 static const struct mips_cpu_info
*
14955 mips_cpu_info_from_isa (int isa
)
14959 for (i
= 0; mips_cpu_info_table
[i
].name
!= NULL
; i
++)
14960 if ((mips_cpu_info_table
[i
].flags
& MIPS_CPU_IS_ISA
)
14961 && isa
== mips_cpu_info_table
[i
].isa
)
14962 return (&mips_cpu_info_table
[i
]);
14967 static const struct mips_cpu_info
*
14968 mips_cpu_info_from_arch (int arch
)
14972 for (i
= 0; mips_cpu_info_table
[i
].name
!= NULL
; i
++)
14973 if (arch
== mips_cpu_info_table
[i
].cpu
)
14974 return (&mips_cpu_info_table
[i
]);
14980 show (FILE *stream
, const char *string
, int *col_p
, int *first_p
)
14984 fprintf (stream
, "%24s", "");
14989 fprintf (stream
, ", ");
14993 if (*col_p
+ strlen (string
) > 72)
14995 fprintf (stream
, "\n%24s", "");
14999 fprintf (stream
, "%s", string
);
15000 *col_p
+= strlen (string
);
15006 md_show_usage (FILE *stream
)
15011 fprintf (stream
, _("\
15013 -EB generate big endian output\n\
15014 -EL generate little endian output\n\
15015 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15016 -G NUM allow referencing objects up to NUM bytes\n\
15017 implicitly with the gp register [default 8]\n"));
15018 fprintf (stream
, _("\
15019 -mips1 generate MIPS ISA I instructions\n\
15020 -mips2 generate MIPS ISA II instructions\n\
15021 -mips3 generate MIPS ISA III instructions\n\
15022 -mips4 generate MIPS ISA IV instructions\n\
15023 -mips5 generate MIPS ISA V instructions\n\
15024 -mips32 generate MIPS32 ISA instructions\n\
15025 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15026 -mips64 generate MIPS64 ISA instructions\n\
15027 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
15028 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15032 for (i
= 0; mips_cpu_info_table
[i
].name
!= NULL
; i
++)
15033 show (stream
, mips_cpu_info_table
[i
].name
, &column
, &first
);
15034 show (stream
, "from-abi", &column
, &first
);
15035 fputc ('\n', stream
);
15037 fprintf (stream
, _("\
15038 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15039 -no-mCPU don't generate code specific to CPU.\n\
15040 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15044 show (stream
, "3900", &column
, &first
);
15045 show (stream
, "4010", &column
, &first
);
15046 show (stream
, "4100", &column
, &first
);
15047 show (stream
, "4650", &column
, &first
);
15048 fputc ('\n', stream
);
15050 fprintf (stream
, _("\
15051 -mips16 generate mips16 instructions\n\
15052 -no-mips16 do not generate mips16 instructions\n"));
15053 fprintf (stream
, _("\
15054 -msmartmips generate smartmips instructions\n\
15055 -mno-smartmips do not generate smartmips instructions\n"));
15056 fprintf (stream
, _("\
15057 -mdsp generate DSP instructions\n\
15058 -mno-dsp do not generate DSP instructions\n"));
15059 fprintf (stream
, _("\
15060 -mdspr2 generate DSP R2 instructions\n\
15061 -mno-dspr2 do not generate DSP R2 instructions\n"));
15062 fprintf (stream
, _("\
15063 -mmt generate MT instructions\n\
15064 -mno-mt do not generate MT instructions\n"));
15065 fprintf (stream
, _("\
15066 -mfix-vr4120 work around certain VR4120 errata\n\
15067 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
15068 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15069 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15070 -msym32 assume all symbols have 32-bit values\n\
15071 -O0 remove unneeded NOPs, do not swap branches\n\
15072 -O remove unneeded NOPs and swap branches\n\
15073 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15074 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15075 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15077 fprintf (stream
, _("\
15078 -KPIC, -call_shared generate SVR4 position independent code\n\
15079 -mvxworks-pic generate VxWorks position independent code\n\
15080 -non_shared do not generate position independent code\n\
15081 -xgot assume a 32 bit GOT\n\
15082 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
15083 -mshared, -mno-shared disable/enable .cpload optimization for\n\
15084 position dependent (non shared) code\n\
15085 -mabi=ABI create ABI conformant object file for:\n"));
15089 show (stream
, "32", &column
, &first
);
15090 show (stream
, "o64", &column
, &first
);
15091 show (stream
, "n32", &column
, &first
);
15092 show (stream
, "64", &column
, &first
);
15093 show (stream
, "eabi", &column
, &first
);
15095 fputc ('\n', stream
);
15097 fprintf (stream
, _("\
15098 -32 create o32 ABI object file (default)\n\
15099 -n32 create n32 ABI object file\n\
15100 -64 create 64 ABI object file\n"));
15105 mips_dwarf2_format (void)
15107 if (HAVE_64BIT_SYMBOLS
)
15110 return dwarf2_format_64bit_irix
;
15112 return dwarf2_format_64bit
;
15116 return dwarf2_format_32bit
;
15120 mips_dwarf2_addr_size (void)
15122 if (HAVE_64BIT_SYMBOLS
)
15128 /* Standard calling conventions leave the CFA at SP on entry. */
15130 mips_cfi_frame_initial_instructions (void)
15132 cfi_add_CFA_def_cfa_register (SP
);
15136 tc_mips_regname_to_dw2regnum (char *regname
)
15138 unsigned int regnum
= -1;
15141 if (reg_lookup (®name
, RTYPE_GP
| RTYPE_NUM
, ®
))