bfd/
[binutils.git] / gas / config / tc-mips.c
blob8c071fb2ef4d69f2386e0e81473607ec56201ab4
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
7 Support.
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)
14 any later version.
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
24 02110-1301, USA. */
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
42 #ifdef OBJ_MAYBE_ELF
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
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about. */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
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. */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
85 #include "ecoff.h"
87 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88 static char *mips_regmask_frag;
89 #endif
91 #define ZERO 0
92 #define AT 1
93 #define TREG 24
94 #define PIC_CALL_REG 25
95 #define KT0 26
96 #define KT1 27
97 #define GP 28
98 #define SP 29
99 #define FP 30
100 #define RA 31
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"
108 #endif
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 \
114 ? ".rdata" \
115 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
116 ? ".rdata" \
117 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
118 ? ".rodata" \
119 : (abort (), ""))
121 /* Information about an instruction, including its format, operands
122 and fixups. */
123 struct mips_cl_insn
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
129 form of INSN_MO. */
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. */
140 struct frag *frag;
142 /* The offset into FRAG of the first instruction byte. */
143 long where;
145 /* The relocs associated with the instruction, if any. */
146 fixS *fixp[3];
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. */
159 enum mips_abi_level
161 NO_ABI = 0,
162 O32_ABI,
163 O64_ABI,
164 N32_ABI,
165 N64_ABI,
166 EABI_ABI
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
176 library. */
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
181 reliable. */
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. */
188 int isa;
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. */
192 int ase_mips3d;
193 int ase_mdmx;
194 int ase_smartmips;
195 int ase_dsp;
196 int ase_dspr2;
197 int ase_mt;
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. */
202 int mips16;
203 /* Non-zero if we should not reorder instructions. Changed by `.set
204 reorder' and `.set noreorder'. */
205 int 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'. */
208 int 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
211 `.set macro'. */
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'. */
215 int nomove;
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
219 nobopt'. */
220 int nobopt;
221 /* Non-zero if we should not autoextend mips16 instructions.
222 Changed by `.set autoextend' and `.set noautoextend'. */
223 int 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. */
227 int gp32;
228 int fp32;
229 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
230 command line option, and the default CPU. */
231 int arch;
232 /* True if ".set sym32" is in effect. */
233 bfd_boolean sym32;
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
253 place. */
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
312 are optimizing. */
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) \
324 ((ABI) == N32_ABI \
325 || (ABI) == N64_ABI \
326 || (ABI) == O64_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.)
346 instructions. */
347 #define ISA_HAS_DROR(ISA) \
348 ((ISA) == ISA_MIPS64R2)
350 /* Return true if ISA supports 32-bit right rotate (ror et al.)
351 instructions. */
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
451 level I. */
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
491 instructions. */
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;
515 #define N_RMASK 0xc4
516 #define N_VFP 0xd4
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
521 better.
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
526 delay slot.
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 */
558 /* As in 0f12.456 */
559 /* or 0d1.2345e12 */
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
574 variable. */
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
603 insert NOPs. */
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. */
617 #define MAX_NOPS 4
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
635 decreased. */
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
642 prev_nop_frag. */
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. */
659 struct mips_hi_fixup
661 /* Next HI fixup. */
662 struct mips_hi_fixup *next;
663 /* This fixup. */
664 fixS *fixp;
665 /* The section this fixup is in. */
666 segT seg;
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
688 #undef 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 {
700 FIX_VR4120_MACC,
701 FIX_VR4120_DMACC,
702 FIX_VR4120_MULT,
703 FIX_VR4120_DMULT,
704 FIX_VR4120_DIV,
705 FIX_VR4120_MTHILO,
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:
745 RELAX_USE_SECOND
746 Set if it has been decided that we should use the second
747 sequence instead of the first.
749 RELAX_SECOND_LONGER
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.
754 RELAX_NOMACRO
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.
758 RELAX_DELAY_SLOT
759 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
760 delay slot.
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 ...
768 relax_switch ();
769 ... generate second expansion ...
770 relax_end ();
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
786 delay slot
788 into
790 bne reg1, reg2, 0f
792 j label
793 0: delay slot
795 with the following opcode replacements:
797 beq <-> bne
798 blez <-> bgtz
799 bltz <-> bgez
800 bc1f <-> bc1t
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)
817 into
819 beql reg1, reg2, 1f
821 beql $0, $0, 2f
823 1: j[al] label
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:
830 bne reg1, reg2, 0f
832 j[al] label
833 delay slot (executed only if branch taken)
836 beql -> bne
837 bnel -> beq
838 blezl -> bgtz
839 bgtzl -> blez
840 bltzl -> bgez
841 bgezl -> bltz
842 bc1fl -> bc1t
843 bc1tl -> bc1f
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) \
851 ((relax_substateT) \
852 (0xc0000000 \
853 | ((toofar) ? 1 : 0) \
854 | ((link) ? 2 : 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) \
884 (0x80000000 \
885 | ((type) & 0xff) \
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
925 SHIFT places. */
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, \
947 MIPS16OP_SH_##FIELD)
949 /* Global variables used when generating relaxable macros. See the
950 comment above RELAX_ENCODE for more details about how relaxation
951 is used. */
952 static struct {
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. */
956 int sequence;
958 /* The first relaxable fixup in the current frag. (In other words,
959 the first fixup that refers to relaxable code.) */
960 fixS *first_fixup;
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. */
967 symbolS *symbol;
968 } mips_relax;
970 /* Global variables used to decide whether a macro needs a warning. */
971 static struct {
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
978 macro in bytes. */
979 unsigned int sizes[2];
981 /* The first variant frag for this macro. */
982 fragS *first_frag;
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);
1004 #endif
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);
1071 /* Pseudo-op table.
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,
1081 .vreg.
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
1111 chips. */
1112 {"asciiz", stringer, 1},
1113 {"bss", s_change_sec, 'b'},
1114 {"err", s_err, 0},
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},
1131 {"int", s_cons, 2},
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},
1144 { NULL, NULL, 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},
1162 { NULL, NULL, 0 },
1165 extern void pop_insert (const pseudo_typeS *);
1167 void
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;
1180 symbolS *label;
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);
1188 static inline void
1189 mips_clear_insn_labels (void)
1191 register struct insn_label_list **pl;
1192 segment_info_type *si;
1194 if (now_seg)
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
1209 mips_ip. */
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;
1226 #ifdef OBJ_ELF
1227 /* The pdr segment for per procedure frame/regmask info. Not used for
1228 ECOFF debugging. */
1230 static segT pdr_seg;
1231 #endif
1233 /* The default target format to use. */
1235 const char *
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:
1243 return "pe-mips";
1244 case bfd_target_elf_flavour:
1245 #ifdef TE_VXWORKS
1246 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1247 return (target_big_endian
1248 ? "elf32-bigmips-vxworks"
1249 : "elf32-littlemips-vxworks");
1250 #endif
1251 #ifdef TE_TMIPS
1252 /* This is traditional mips. */
1253 return (target_big_endian
1254 ? (HAVE_64BIT_OBJECTS
1255 ? "elf64-tradbigmips"
1256 : (HAVE_NEWABI
1257 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1258 : (HAVE_64BIT_OBJECTS
1259 ? "elf64-tradlittlemips"
1260 : (HAVE_NEWABI
1261 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1262 #else
1263 return (target_big_endian
1264 ? (HAVE_64BIT_OBJECTS
1265 ? "elf64-bigmips"
1266 : (HAVE_NEWABI
1267 ? "elf32-nbigmips" : "elf32-bigmips"))
1268 : (HAVE_64BIT_OBJECTS
1269 ? "elf64-littlemips"
1270 : (HAVE_NEWABI
1271 ? "elf32-nlittlemips" : "elf32-littlemips")));
1272 #endif
1273 default:
1274 abort ();
1275 return NULL;
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)
1285 return 4;
1286 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1289 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1291 static void
1292 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1294 size_t i;
1296 insn->insn_mo = mo;
1297 insn->use_extend = FALSE;
1298 insn->extend = 0;
1299 insn->insn_opcode = mo->match;
1300 insn->frag = NULL;
1301 insn->where = 0;
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. */
1311 static void
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);
1322 else
1324 if (insn->use_extend)
1326 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1327 f += 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. */
1336 static void
1337 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1339 size_t i;
1341 insn->frag = frag;
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. */
1354 static void
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. */
1364 static void
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);
1370 insn->fixed_p = 1;
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. */
1378 static void
1379 insert_into_history (unsigned int first, unsigned int n,
1380 const struct mips_cl_insn *insn)
1382 if (mips_relax.sequence != 2)
1384 unsigned int i;
1386 for (i = ARRAY_SIZE (history); i-- > first;)
1387 if (i >= first + n)
1388 history[i] = history[i - n];
1389 else
1390 history[i] = *insn;
1394 /* Emit a nop instruction, recording it in the history buffer. */
1396 static void
1397 emit_nop (void)
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
1405 included. */
1407 static void
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);
1444 #undef CONFLICT
1447 struct regname {
1448 const char *name;
1449 unsigned int num;
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,
1657 FPU_REGISTER_NAMES,
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,
1670 {0, 0}
1673 static const struct regname reg_names_o32[] = {
1674 O32_SYMBOLIC_REGISTER_NAMES,
1675 {0, 0}
1678 static const struct regname reg_names_n32n64[] = {
1679 N32N64_SYMBOLIC_REGISTER_NAMES,
1680 {0, 0}
1683 static int
1684 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1686 symbolS *symbolP;
1687 char *e;
1688 char save_c;
1689 int reg = -1;
1691 /* Find end of name. */
1692 e = *s;
1693 if (is_name_beginner (*e))
1694 ++e;
1695 while (is_part_of_name (*e))
1696 ++e;
1698 /* Terminate name. */
1699 save_c = *e;
1700 *e = '\0';
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);
1706 if (r & types)
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)
1715 char *n = *s;
1716 unsigned long r;
1718 if (*n == '$')
1719 ++n;
1720 if (itbl_get_reg_val (n, &r))
1721 reg = r & RNUM_MASK;
1724 /* Advance to next token if a register was recognised. */
1725 if (reg >= 0)
1726 *s = e;
1727 else if (types & RWARN)
1728 as_warn ("Unrecognized register name `%s'", *s);
1730 *e = save_c;
1731 if (regnop)
1732 *regnop = reg;
1733 return reg >= 0;
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. */
1739 void
1740 md_begin (void)
1742 const char *retval = NULL;
1743 int i = 0;
1744 int broken = 0;
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"));
1750 g_switch_value = 0;
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]);
1763 if (retval != NULL)
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]))
1775 broken = 1;
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;
1782 ++i;
1784 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1787 mips16_op_hash = hash_new ();
1789 i = 0;
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]);
1795 if (retval != NULL)
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);
1806 broken = 1;
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;
1813 ++i;
1815 while (i < bfd_mips16_num_opcodes
1816 && strcmp (mips16_opcodes[i].name, name) == 0);
1819 if (broken)
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));
1828 if (HAVE_NEWABI)
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));
1833 else
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 ();
1841 mips_gprmask = 0;
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);
1852 #ifdef OBJ_ELF
1853 if (IS_ELF)
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. */
1869 segT seg;
1870 subsegT subseg;
1871 flagword flags;
1872 segT sec;
1874 seg = now_seg;
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));
1893 else
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;
1904 char *f;
1906 opthdr.kind = ODK_REGINFO;
1907 opthdr.size = (sizeof (Elf_External_Options)
1908 + sizeof (Elf64_External_RegInfo));
1909 opthdr.section = 0;
1910 opthdr.info = 0;
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
1931 | SEC_DEBUGGING);
1932 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1935 subseg_set (seg, subseg);
1938 #endif /* OBJ_ELF */
1940 if (! ECOFF_DEBUGGING)
1941 md_obj_begin ();
1943 if (mips_fix_vr4120)
1944 init_vr4120_conflicts ();
1947 void
1948 md_mips_end (void)
1950 if (! ECOFF_DEBUGGING)
1951 md_obj_end ();
1954 void
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);
1973 else
1975 mips_ip (str, &insn);
1976 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1977 str, insn.insn_opcode));
1980 if (insn_error)
1982 as_bad ("%s `%s'", insn_error, str);
1983 return;
1986 if (insn.insn_mo->pinfo == INSN_MACRO)
1988 macro_start ();
1989 if (mips_opts.mips16)
1990 mips16_macro (&insn);
1991 else
1992 macro (&insn);
1993 macro_end ();
1995 else
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);
2001 else
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
2022 relocation. */
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
2035 of register. */
2037 static int
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)
2050 return 0;
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)))
2065 return 1;
2066 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2067 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2068 == (reg &~ (unsigned) 1)))
2069 return 1;
2071 else if (! mips_opts.mips16)
2073 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2074 && EXTRACT_OPERAND (RS, *ip) == reg)
2075 return 1;
2076 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2077 && EXTRACT_OPERAND (RT, *ip) == reg)
2078 return 1;
2080 else
2082 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2083 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2084 return 1;
2085 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2086 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2087 return 1;
2088 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2089 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2090 == reg))
2091 return 1;
2092 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2093 return 1;
2094 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2095 return 1;
2096 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2097 return 1;
2098 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2099 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2100 return 1;
2103 return 0;
2106 /* This function returns true if modifying a register requires a
2107 delay. */
2109 static int
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]))
2126 return 1;
2129 return 0;
2132 /* Move all labels in insn_labels to the current insertion point. */
2134 static void
2135 mips_move_labels (void)
2137 segment_info_type *si = seg_info (now_seg);
2138 struct insn_label_list *l;
2139 valueT val;
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)
2148 ++val;
2149 S_SET_VALUE (l->label, val);
2153 static bfd_boolean
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))
2162 linkonce = TRUE;
2163 #ifdef OBJ_ELF
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)
2169 linkonce = TRUE;
2170 #endif
2172 return linkonce;
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. */
2183 static void
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)
2190 return;
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)
2197 if (IS_ELF)
2198 S_SET_OTHER (label, STO_MIPS16);
2199 #endif
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
2213 relaxation info. */
2215 static void
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. */
2230 static void
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. */
2241 static void
2242 relax_switch (void)
2244 assert (mips_relax.sequence == 1);
2245 mips_relax.sequence = 2;
2248 /* End the current relaxable sequence. */
2250 static void
2251 relax_end (void)
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. */
2262 static unsigned int
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. */
2284 static unsigned int
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))
2305 return 2;
2306 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2307 return 2;
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))
2315 return 2;
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)
2326 if (insn2 == NULL)
2327 return 1;
2328 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2329 if (vr4120_conflicts[class1] & (1 << class2))
2330 return 1;
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))
2344 return 1;
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))
2364 return 1;
2366 else if (pinfo1 & INSN_WRITE_FPR_S)
2368 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2369 return 1;
2371 else
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))
2377 return 2;
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)
2383 return 1;
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))
2395 return 1;
2398 #undef INSN2_USES_REG
2400 return 0;
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. */
2407 static int
2408 nops_for_vr4130 (const struct mips_cl_insn *history,
2409 const struct mips_cl_insn *insn)
2411 int i, j, reg;
2413 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2414 are not affected by the errata. */
2415 if (insn != 0
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))
2419 return 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])];
2428 else
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))
2433 return 0;
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))
2438 return 0;
2440 return MAX_VR4130_NOPS - i;
2442 return 0;
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. */
2450 static int
2451 nops_for_insn (const struct mips_cl_insn *history,
2452 const struct mips_cl_insn *insn)
2454 int i, nops, tmp_nops;
2456 nops = 0;
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)
2462 nops = tmp_nops;
2465 if (mips_fix_vr4130)
2467 tmp_nops = nops_for_vr4130 (history, insn);
2468 if (tmp_nops > nops)
2469 nops = tmp_nops;
2472 return 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. */
2479 static int
2480 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2482 va_list args;
2483 struct mips_cl_insn buffer[MAX_NOPS];
2484 struct mips_cl_insn *cursor;
2485 int nops;
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);
2494 va_end (args);
2495 return nops;
2498 /* Like nops_for_insn, but if INSN is a branch, take into account the
2499 worst-case delay for the branch target. */
2501 static int
2502 nops_for_insn_or_target (const struct mips_cl_insn *history,
2503 const struct mips_cl_insn *insn)
2505 int nops, tmp_nops;
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)
2514 nops = tmp_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)
2520 nops = tmp_nops;
2522 return nops;
2525 /* Output an instruction. IP is the instruction information.
2526 ADDRESS_EXPR is an operand of the instruction to be used with
2527 RELOC_TYPE. */
2529 static void
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
2552 it. */
2553 int nops = (mips_optimize == 0
2554 ? nops_for_insn (history, NULL)
2555 : nops_for_insn_or_target (history, ip));
2556 if (nops > 0)
2558 fragS *old_frag;
2559 unsigned long old_frag_offset;
2560 int i;
2562 old_frag = frag_now;
2563 old_frag_offset = frag_now_fix ();
2565 for (i = 0; i < nops; i++)
2566 emit_nop ();
2568 if (listing)
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. */
2579 frag_grow (40);
2582 mips_move_labels ();
2584 #ifndef NO_ECOFF_DEBUGGING
2585 if (ECOFF_DEBUGGING)
2586 ecoff_fix_loc (old_frag, old_frag_offset);
2587 #endif
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);
2608 else
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++;
2618 #ifdef OBJ_ELF
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);
2625 #endif
2627 /* Record the frag type before frag_var. */
2628 if (history[0].frag)
2629 prev_insn_frag_type = history[0].frag->fr_type;
2631 if (address_expr
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
2645 (NULL, NULL,
2646 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2647 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2648 : 0)), 4,
2649 RELAX_BRANCH_ENCODE
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,
2663 RELAX_MIPS16_ENCODE
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
2671 && ! ip->use_extend
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. */
2677 frag_grow (6);
2678 add_fixed_insn (ip);
2680 else
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
2691 written so far. */
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)
2704 ip->fixed_p = 1;
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)
2714 unsigned int tmp;
2716 switch (*reloc_type)
2718 case BFD_RELOC_32:
2719 ip->insn_opcode |= address_expr->X_add_number;
2720 break;
2722 case BFD_RELOC_MIPS_HIGHEST:
2723 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2724 ip->insn_opcode |= tmp & 0xffff;
2725 break;
2727 case BFD_RELOC_MIPS_HIGHER:
2728 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2729 ip->insn_opcode |= tmp & 0xffff;
2730 break;
2732 case BFD_RELOC_HI16_S:
2733 tmp = (address_expr->X_add_number + 0x8000) >> 16;
2734 ip->insn_opcode |= tmp & 0xffff;
2735 break;
2737 case BFD_RELOC_HI16:
2738 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2739 break;
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;
2745 break;
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;
2752 break;
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);
2758 ip->insn_opcode |=
2759 (((address_expr->X_add_number & 0x7c0000) << 3)
2760 | ((address_expr->X_add_number & 0xf800000) >> 7)
2761 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2762 break;
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)
2769 goto need_reloc;
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;
2774 break;
2776 default:
2777 internalError ();
2780 else if (*reloc_type < BFD_RELOC_UNUSED)
2781 need_reloc:
2783 reloc_howto_type *howto;
2784 int i;
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)
2790 break;
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),
2795 address_expr,
2796 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2797 reloc_type[0]);
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. */
2806 if (HAVE_64BIT_GPRS
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;
2840 if (hi_fixup == 0
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;
2870 install_insn (ip);
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;
2901 else
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
2935 optimize. */
2936 || mips_opts.nomove != 0
2937 /* We can't swap if the previous instruction's position
2938 is fixed. */
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
2944 .set noreorder
2945 lw $4,XXX
2946 .set reorder
2947 INSN
2948 bne $4,$0,foo
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
2951 .set pseudo-ops. */
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]),
2980 MIPS_GR_REG))
2981 || (! mips_opts.mips16
2982 && (prev_pinfo & INSN_WRITE_GPR_D)
2983 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
2984 MIPS_GR_REG))
2985 || (mips_opts.mips16
2986 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2987 && (insn_uses_reg
2988 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
2989 MIPS16_REG)))
2990 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2991 && (insn_uses_reg
2992 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
2993 MIPS16_REG)))
2994 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2995 && (insn_uses_reg
2996 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
2997 MIPS16_REG)))
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),
3006 MIPS_GR_REG))))
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)
3029 == RA))))
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),
3037 MIPS_GR_REG))
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
3051 swap. */
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;
3069 install_insn (ip);
3070 insert_into_history (0, 1, ip);
3072 else
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);
3079 emit_nop ();
3082 if (mips_relax.sequence)
3083 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3085 else
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);
3106 else
3108 move_insn (&delay, ip->frag, ip->where);
3109 move_insn (ip, history[0].frag, history[0].where);
3111 history[0] = *ip;
3112 delay.fixed_p = 1;
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);
3128 emit_nop ();
3130 else
3131 insert_into_history (0, 1, ip);
3133 else
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. */
3142 static void
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. */
3154 void
3155 mips_emit_delays (void)
3157 if (! mips_opts.noreorder)
3159 int nops = nops_for_insn (history, NULL);
3160 if (nops > 0)
3162 while (nops-- > 0)
3163 add_fixed_insn (NOP_INSN);
3164 mips_move_labels ();
3167 mips_no_prev_insn ();
3170 /* Start a (possibly nested) noreorder block. */
3172 static void
3173 start_noreorder (void)
3175 if (mips_opts.noreorder == 0)
3177 unsigned int i;
3178 int nops;
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);
3188 if (nops > 0)
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);
3207 frag_new (0);
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. */
3219 static void
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. */
3237 static void
3238 macro_start (void)
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. */
3252 static const char *
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");
3260 else
3261 return 0;
3264 /* Finish up a macro. Emit warnings as appropriate. */
3266 static void
3267 macro_end (void)
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. */
3274 subtype = 0;
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
3286 warning now. */
3287 const char *msg = macro_warning (subtype);
3288 if (msg != 0)
3289 as_warn (msg);
3291 else
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. */
3305 static void
3306 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3308 int i, next;
3310 next = va_arg (*args, int);
3311 if (next >= 0)
3312 r[0] = (bfd_reloc_code_real_type) next;
3313 else
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. */
3323 static void
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];
3329 va_list args;
3331 va_start (args, fmt);
3333 if (mips_opts.mips16)
3335 mips16_macro_build (ep, name, fmt, args);
3336 va_end (args);
3337 return;
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);
3344 assert (mo);
3345 assert (strcmp (name, mo->name) == 0);
3347 while (1)
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,
3354 (mips_opts.isa
3355 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3356 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3357 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3358 ? INSN_DSP64 : 0)
3359 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3360 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3361 mips_opts.arch)
3362 && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3363 break;
3365 ++mo;
3366 assert (mo->name);
3367 assert (strcmp (name, mo->name) == 0);
3370 create_insn (&insn, mo);
3371 for (;;)
3373 switch (*fmt++)
3375 case '\0':
3376 break;
3378 case ',':
3379 case '(':
3380 case ')':
3381 continue;
3383 case '+':
3384 switch (*fmt++)
3386 case 'A':
3387 case 'E':
3388 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3389 continue;
3391 case 'B':
3392 case 'F':
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));
3398 continue;
3400 case 'C':
3401 case 'G':
3402 case 'H':
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));
3408 continue;
3410 default:
3411 internalError ();
3413 continue;
3415 case '2':
3416 INSERT_OPERAND (BP, insn, va_arg (args, int));
3417 continue;
3419 case 't':
3420 case 'w':
3421 case 'E':
3422 INSERT_OPERAND (RT, insn, va_arg (args, int));
3423 continue;
3425 case 'c':
3426 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3427 continue;
3429 case 'T':
3430 case 'W':
3431 INSERT_OPERAND (FT, insn, va_arg (args, int));
3432 continue;
3434 case 'd':
3435 case 'G':
3436 case 'K':
3437 INSERT_OPERAND (RD, insn, va_arg (args, int));
3438 continue;
3440 case 'U':
3442 int tmp = va_arg (args, int);
3444 INSERT_OPERAND (RT, insn, tmp);
3445 INSERT_OPERAND (RD, insn, tmp);
3446 continue;
3449 case 'V':
3450 case 'S':
3451 INSERT_OPERAND (FS, insn, va_arg (args, int));
3452 continue;
3454 case 'z':
3455 continue;
3457 case '<':
3458 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3459 continue;
3461 case 'D':
3462 INSERT_OPERAND (FD, insn, va_arg (args, int));
3463 continue;
3465 case 'B':
3466 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3467 continue;
3469 case 'J':
3470 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3471 continue;
3473 case 'q':
3474 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3475 continue;
3477 case 'b':
3478 case 's':
3479 case 'r':
3480 case 'v':
3481 INSERT_OPERAND (RS, insn, va_arg (args, int));
3482 continue;
3484 case 'i':
3485 case 'j':
3486 case 'o':
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);
3500 continue;
3502 case 'u':
3503 macro_read_relocs (&args, r);
3504 assert (ep != NULL
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))));
3513 continue;
3515 case 'p':
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;
3534 ep = NULL;
3536 else
3537 *r = BFD_RELOC_16_PCREL_S2;
3538 continue;
3540 case 'a':
3541 assert (ep != NULL);
3542 *r = BFD_RELOC_MIPS_JMP;
3543 continue;
3545 case 'C':
3546 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3547 continue;
3549 case 'k':
3550 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3551 continue;
3553 default:
3554 internalError ();
3556 break;
3558 va_end (args);
3559 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3561 append_insn (&insn, ep, r);
3564 static void
3565 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3566 va_list args)
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);
3574 assert (mo);
3575 assert (strcmp (name, mo->name) == 0);
3577 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3579 ++mo;
3580 assert (mo->name);
3581 assert (strcmp (name, mo->name) == 0);
3584 create_insn (&insn, mo);
3585 for (;;)
3587 int c;
3589 c = *fmt++;
3590 switch (c)
3592 case '\0':
3593 break;
3595 case ',':
3596 case '(':
3597 case ')':
3598 continue;
3600 case 'y':
3601 case 'w':
3602 MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3603 continue;
3605 case 'x':
3606 case 'v':
3607 MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3608 continue;
3610 case 'z':
3611 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3612 continue;
3614 case 'Z':
3615 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3616 continue;
3618 case '0':
3619 case 'S':
3620 case 'P':
3621 case 'R':
3622 continue;
3624 case 'X':
3625 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3626 continue;
3628 case 'Y':
3630 int regno;
3632 regno = va_arg (args, int);
3633 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3634 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3636 continue;
3638 case '<':
3639 case '>':
3640 case '4':
3641 case '5':
3642 case 'H':
3643 case 'W':
3644 case 'D':
3645 case 'j':
3646 case '8':
3647 case 'V':
3648 case 'C':
3649 case 'U':
3650 case 'k':
3651 case 'K':
3652 case 'p':
3653 case 'q':
3655 assert (ep != NULL);
3657 if (ep->X_op != O_constant)
3658 *r = (int) BFD_RELOC_UNUSED + c;
3659 else
3661 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3662 FALSE, &insn.insn_opcode, &insn.use_extend,
3663 &insn.extend);
3664 ep = NULL;
3665 *r = BFD_RELOC_UNUSED;
3668 continue;
3670 case '6':
3671 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3672 continue;
3675 break;
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.
3687 static void
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)
3693 - 0x80000000);
3697 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3698 * all higher bits unset.
3700 static void
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)
3707 - 0x80000000);
3711 * Generate a "jalr" instruction with a relocation hint to the called
3712 * function. This occurs in NewABI PIC code.
3714 static void
3715 macro_build_jalr (expressionS *ep)
3717 char *f = NULL;
3719 if (HAVE_NEWABI)
3721 frag_grow (8);
3722 f = frag_more (0);
3724 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3725 if (HAVE_NEWABI)
3726 fix_new_exp (frag_now, f - frag_now->fr_literal,
3727 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3731 * Generate a "lui" instruction.
3733 static void
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);
3746 high_expr = *ep;
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)
3752 >> 16) & 0xffff;
3753 *r = BFD_RELOC_UNUSED;
3755 else
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
3761 || (! HAVE_NEWABI
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);
3781 else
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. */
3788 static void
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. */
3795 if (!dbl)
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);
3807 else
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);
3818 if (mips_opts.noat)
3819 as_bad (_("Macro used $at after \".set noat\""));
3823 /* set_at()
3824 * Generates code to set the $at register to true (one)
3825 * if reg is less than the immediate expression.
3827 static void
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);
3835 else
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. */
3844 static void
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"),
3851 ip->insn_mo->name);
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)))
3862 break;
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 \
3872 ? !(v) \
3873 ? 32 \
3874 : 31 \
3875 : 30 \
3876 : ((v) & ~0x7) == 0 \
3877 ? 29 \
3878 : 28 \
3879 : ((v) & ~0x3f) == 0 \
3880 ? ((v) & ~0x1f) == 0 \
3881 ? 27 \
3882 : 26 \
3883 : ((v) & ~0x7f) == 0 \
3884 ? 25 \
3885 : 24 \
3886 : ((v) & ~0xfff) == 0 \
3887 ? ((v) & ~0x3ff) == 0 \
3888 ? ((v) & ~0x1ff) == 0 \
3889 ? 23 \
3890 : 22 \
3891 : ((v) & ~0x7ff) == 0 \
3892 ? 21 \
3893 : 20 \
3894 : ((v) & ~0x3fff) == 0 \
3895 ? ((v) & ~0x1fff) == 0 \
3896 ? 19 \
3897 : 18 \
3898 : ((v) & ~0x7fff) == 0 \
3899 ? 17 \
3900 : 16 \
3901 : ((v) & ~0xffffff) == 0 \
3902 ? ((v) & ~0xfffff) == 0 \
3903 ? ((v) & ~0x3ffff) == 0 \
3904 ? ((v) & ~0x1ffff) == 0 \
3905 ? 15 \
3906 : 14 \
3907 : ((v) & ~0x7ffff) == 0 \
3908 ? 13 \
3909 : 12 \
3910 : ((v) & ~0x3fffff) == 0 \
3911 ? ((v) & ~0x1fffff) == 0 \
3912 ? 11 \
3913 : 10 \
3914 : ((v) & ~0x7fffff) == 0 \
3915 ? 9 \
3916 : 8 \
3917 : ((v) & ~0xfffffff) == 0 \
3918 ? ((v) & ~0x3ffffff) == 0 \
3919 ? ((v) & ~0x1ffffff) == 0 \
3920 ? 7 \
3921 : 6 \
3922 : ((v) & ~0x7ffffff) == 0 \
3923 ? 5 \
3924 : 4 \
3925 : ((v) & ~0x3fffffff) == 0 \
3926 ? ((v) & ~0x1fffffff) == 0 \
3927 ? 3 \
3928 : 2 \
3929 : ((v) & ~0x7fffffff) == 0 \
3930 ? 1 \
3931 : 0)
3933 /* load_register()
3934 * This routine generates the least number of instructions necessary to load
3935 * an absolute expression value into a register.
3937 static void
3938 load_register (int reg, expressionS *ep, int dbl)
3940 int freg;
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. */
3948 if (!dbl)
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);
3957 return;
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
3962 $zero. */
3963 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3964 return;
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);
3972 return;
3976 /* The value is larger than 32 bits. */
3978 if (!dbl || HAVE_32BIT_GPRS)
3980 char value[32];
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);
3985 return;
3988 if (ep->X_op != O_big)
3990 hi32 = *ep;
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;
3994 lo32 = *ep;
3995 lo32.X_add_number &= 0xffffffff;
3997 else
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)
4011 freg = 0;
4012 else
4014 int shift, bit;
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);
4022 return;
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);
4029 return;
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
4035 value. */
4036 shift = 17;
4039 unsigned long himask, lomask;
4041 if (shift < 32)
4043 himask = 0xffff >> (32 - shift);
4044 lomask = (0xffff << shift) & 0xffffffff;
4046 else
4048 himask = 0xffff << (shift - 32);
4049 lomask = 0;
4051 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4052 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4054 expressionS tmp;
4056 tmp.X_op = O_constant;
4057 if (shift < 32)
4058 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4059 | (lo32.X_add_number >> shift));
4060 else
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);
4065 return;
4067 ++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);
4075 if (lo != 0)
4077 bit = 0;
4078 while ((lo & 1) == 0)
4080 lo >>= 1;
4081 ++bit;
4083 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4084 hi >>= bit;
4086 else
4088 bit = 32;
4089 while ((hi & 1) == 0)
4091 hi >>= 1;
4092 ++bit;
4094 lo = hi;
4095 hi = 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);
4103 if (shift != 0)
4105 expressionS tmp;
4107 /* This instruction will set the register to be all
4108 ones. */
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);
4112 if (bit != 0)
4114 bit += shift;
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);
4120 return;
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);
4129 freg = reg;
4131 if ((lo32.X_add_number & 0xffff0000) == 0)
4133 if (freg != 0)
4135 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4136 freg = reg;
4139 else
4141 expressionS mid16;
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);
4147 return;
4150 if (freg != 0)
4152 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4153 freg = reg;
4155 mid16 = lo32;
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);
4159 freg = reg;
4161 if ((lo32.X_add_number & 0xffff) != 0)
4162 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4165 static inline void
4166 load_delay_nop (void)
4168 if (!gpr_interlocks)
4169 macro_build (NULL, "nop", "");
4172 /* Load an address into a register. */
4174 static void
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);
4187 return;
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)
4194 Otherwise we want
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)
4204 dsll32 $reg,0
4205 daddu $reg,$reg,$at
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)
4211 dsll $reg,16
4212 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4213 dsll $reg,16
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);
4226 relax_switch ();
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);
4238 *used_at = 1;
4240 else
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)
4252 relax_end ();
4254 else
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);
4262 relax_switch ();
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)
4268 relax_end ();
4271 else if (!mips_big_got)
4273 expressionS ex;
4275 /* If this is a reference to an external symbol, we want
4276 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4277 Otherwise we want
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. */
4287 if (HAVE_NEWABI)
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;
4302 relax_switch ();
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)
4307 relax_end ();
4309 else
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);
4315 load_delay_nop ();
4316 relax_start (ep->X_add_symbol);
4317 relax_switch ();
4318 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4319 BFD_RELOC_LO16);
4320 relax_end ();
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)
4334 expressionS ex;
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)
4339 addu $reg,$reg,$gp
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)
4352 if (HAVE_NEWABI)
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,
4368 BFD_RELOC_LO16);
4371 ep->X_add_number = ex.X_add_number;
4372 relax_switch ();
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);
4377 relax_end ();
4379 else
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);
4389 relax_switch ();
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);
4400 load_delay_nop ();
4401 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4402 BFD_RELOC_LO16);
4403 relax_end ();
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,
4411 BFD_RELOC_LO16);
4415 else
4416 abort ();
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. */
4424 static void
4425 move_register (int dest, int source)
4427 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4428 dest, source, 0);
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)
4438 ... ...
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. */
4445 static void
4446 load_got_offset (int dest, expressionS *local)
4448 expressionS global;
4450 global = *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);
4456 relax_switch ();
4457 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4458 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4459 relax_end ();
4462 static void
4463 add_got_offset (int dest, expressionS *local)
4465 expressionS global;
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);
4475 relax_switch ();
4476 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4477 relax_end ();
4480 static void
4481 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4483 expressionS global;
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);
4493 relax_switch ();
4494 /* Set mips_optimize around the lui instruction to avoid
4495 inserting an unnecessary nop after the lw. */
4496 hold_mips_optimize = mips_optimize;
4497 mips_optimize = 2;
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);
4501 relax_end ();
4503 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4507 * Build macros
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
4522 * we're missing.
4524 static void
4525 macro (struct mips_cl_insn *ip)
4527 int treg, sreg, dreg, breg;
4528 int tempreg;
4529 int mask;
4530 int used_at = 0;
4531 expressionS expr1;
4532 const char *s;
4533 const char *s2;
4534 const char *fmt;
4535 int likely = 0;
4536 int dbl = 0;
4537 int coproc = 0;
4538 int lr = 0;
4539 int imm = 0;
4540 int call = 0;
4541 int off;
4542 offsetT maxnum;
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;
4558 switch (mask)
4560 case M_DABS:
4561 dbl = 1;
4562 case M_ABS:
4563 /* bgez $a0,.+12
4564 move v0,$a0
4565 sub v0,$zero,$a0
4568 start_noreorder ();
4570 expr1.X_add_number = 8;
4571 macro_build (&expr1, "bgez", "s,p", sreg);
4572 if (dreg == sreg)
4573 macro_build (NULL, "nop", "", 0);
4574 else
4575 move_register (dreg, sreg);
4576 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4578 end_noreorder ();
4579 break;
4581 case M_ADD_I:
4582 s = "addi";
4583 s2 = "add";
4584 goto do_addi;
4585 case M_ADDU_I:
4586 s = "addiu";
4587 s2 = "addu";
4588 goto do_addi;
4589 case M_DADD_I:
4590 dbl = 1;
4591 s = "daddi";
4592 s2 = "dadd";
4593 goto do_addi;
4594 case M_DADDU_I:
4595 dbl = 1;
4596 s = "daddiu";
4597 s2 = "daddu";
4598 do_addi:
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);
4604 break;
4606 used_at = 1;
4607 load_register (AT, &imm_expr, dbl);
4608 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4609 break;
4611 case M_AND_I:
4612 s = "andi";
4613 s2 = "and";
4614 goto do_bit;
4615 case M_OR_I:
4616 s = "ori";
4617 s2 = "or";
4618 goto do_bit;
4619 case M_NOR_I:
4620 s = "";
4621 s2 = "nor";
4622 goto do_bit;
4623 case M_XOR_I:
4624 s = "xori";
4625 s2 = "xor";
4626 do_bit:
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);
4633 else
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);
4639 break;
4642 used_at = 1;
4643 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4644 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4645 break;
4647 case M_BALIGN:
4648 switch (imm_expr.X_add_number)
4650 case 0:
4651 macro_build (NULL, "nop", "");
4652 break;
4653 case 2:
4654 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4655 break;
4656 default:
4657 macro_build (NULL, "balign", "t,s,2", treg, sreg,
4658 (int)imm_expr.X_add_number);
4659 break;
4661 break;
4663 case M_BEQ_I:
4664 s = "beq";
4665 goto beq_i;
4666 case M_BEQL_I:
4667 s = "beql";
4668 likely = 1;
4669 goto beq_i;
4670 case M_BNE_I:
4671 s = "bne";
4672 goto beq_i;
4673 case M_BNEL_I:
4674 s = "bnel";
4675 likely = 1;
4676 beq_i:
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);
4680 break;
4682 used_at = 1;
4683 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4684 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4685 break;
4687 case M_BGEL:
4688 likely = 1;
4689 case M_BGE:
4690 if (treg == 0)
4692 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4693 break;
4695 if (sreg == 0)
4697 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4698 break;
4700 used_at = 1;
4701 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4702 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4703 break;
4705 case M_BGTL_I:
4706 likely = 1;
4707 case M_BGT_I:
4708 /* check for > max integer */
4709 maxnum = 0x7fffffff;
4710 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4712 maxnum <<= 16;
4713 maxnum |= 0xffff;
4714 maxnum <<= 16;
4715 maxnum |= 0xffff;
4717 if (imm_expr.X_op == O_constant
4718 && imm_expr.X_add_number >= maxnum
4719 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4721 do_false:
4722 /* result is always false */
4723 if (! likely)
4724 macro_build (NULL, "nop", "", 0);
4725 else
4726 macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4727 break;
4729 if (imm_expr.X_op != O_constant)
4730 as_bad (_("Unsupported large constant"));
4731 ++imm_expr.X_add_number;
4732 /* FALLTHROUGH */
4733 case M_BGE_I:
4734 case M_BGEL_I:
4735 if (mask == M_BGEL_I)
4736 likely = 1;
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);
4740 break;
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);
4745 break;
4747 maxnum = 0x7fffffff;
4748 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4750 maxnum <<= 16;
4751 maxnum |= 0xffff;
4752 maxnum <<= 16;
4753 maxnum |= 0xffff;
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))
4760 do_true:
4761 /* result is always true */
4762 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4763 macro_build (&offset_expr, "b", "p");
4764 break;
4766 used_at = 1;
4767 set_at (sreg, 0);
4768 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4769 break;
4771 case M_BGEUL:
4772 likely = 1;
4773 case M_BGEU:
4774 if (treg == 0)
4775 goto do_true;
4776 if (sreg == 0)
4778 macro_build (&offset_expr, likely ? "beql" : "beq",
4779 "s,t,p", 0, treg);
4780 break;
4782 used_at = 1;
4783 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4784 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4785 break;
4787 case M_BGTUL_I:
4788 likely = 1;
4789 case M_BGTU_I:
4790 if (sreg == 0
4791 || (HAVE_32BIT_GPRS
4792 && imm_expr.X_op == O_constant
4793 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4794 goto do_false;
4795 if (imm_expr.X_op != O_constant)
4796 as_bad (_("Unsupported large constant"));
4797 ++imm_expr.X_add_number;
4798 /* FALLTHROUGH */
4799 case M_BGEU_I:
4800 case M_BGEUL_I:
4801 if (mask == M_BGEUL_I)
4802 likely = 1;
4803 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4804 goto do_true;
4805 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4807 macro_build (&offset_expr, likely ? "bnel" : "bne",
4808 "s,t,p", sreg, 0);
4809 break;
4811 used_at = 1;
4812 set_at (sreg, 1);
4813 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4814 break;
4816 case M_BGTL:
4817 likely = 1;
4818 case M_BGT:
4819 if (treg == 0)
4821 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4822 break;
4824 if (sreg == 0)
4826 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4827 break;
4829 used_at = 1;
4830 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4831 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4832 break;
4834 case M_BGTUL:
4835 likely = 1;
4836 case M_BGTU:
4837 if (treg == 0)
4839 macro_build (&offset_expr, likely ? "bnel" : "bne",
4840 "s,t,p", sreg, 0);
4841 break;
4843 if (sreg == 0)
4844 goto do_false;
4845 used_at = 1;
4846 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4847 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4848 break;
4850 case M_BLEL:
4851 likely = 1;
4852 case M_BLE:
4853 if (treg == 0)
4855 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4856 break;
4858 if (sreg == 0)
4860 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4861 break;
4863 used_at = 1;
4864 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4865 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4866 break;
4868 case M_BLEL_I:
4869 likely = 1;
4870 case M_BLE_I:
4871 maxnum = 0x7fffffff;
4872 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4874 maxnum <<= 16;
4875 maxnum |= 0xffff;
4876 maxnum <<= 16;
4877 maxnum |= 0xffff;
4879 if (imm_expr.X_op == O_constant
4880 && imm_expr.X_add_number >= maxnum
4881 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4882 goto do_true;
4883 if (imm_expr.X_op != O_constant)
4884 as_bad (_("Unsupported large constant"));
4885 ++imm_expr.X_add_number;
4886 /* FALLTHROUGH */
4887 case M_BLT_I:
4888 case M_BLTL_I:
4889 if (mask == M_BLTL_I)
4890 likely = 1;
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);
4894 break;
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);
4899 break;
4901 used_at = 1;
4902 set_at (sreg, 0);
4903 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4904 break;
4906 case M_BLEUL:
4907 likely = 1;
4908 case M_BLEU:
4909 if (treg == 0)
4911 macro_build (&offset_expr, likely ? "beql" : "beq",
4912 "s,t,p", sreg, 0);
4913 break;
4915 if (sreg == 0)
4916 goto do_true;
4917 used_at = 1;
4918 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4919 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4920 break;
4922 case M_BLEUL_I:
4923 likely = 1;
4924 case M_BLEU_I:
4925 if (sreg == 0
4926 || (HAVE_32BIT_GPRS
4927 && imm_expr.X_op == O_constant
4928 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4929 goto do_true;
4930 if (imm_expr.X_op != O_constant)
4931 as_bad (_("Unsupported large constant"));
4932 ++imm_expr.X_add_number;
4933 /* FALLTHROUGH */
4934 case M_BLTU_I:
4935 case M_BLTUL_I:
4936 if (mask == M_BLTUL_I)
4937 likely = 1;
4938 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4939 goto do_false;
4940 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4942 macro_build (&offset_expr, likely ? "beql" : "beq",
4943 "s,t,p", sreg, 0);
4944 break;
4946 used_at = 1;
4947 set_at (sreg, 1);
4948 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4949 break;
4951 case M_BLTL:
4952 likely = 1;
4953 case M_BLT:
4954 if (treg == 0)
4956 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4957 break;
4959 if (sreg == 0)
4961 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4962 break;
4964 used_at = 1;
4965 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4966 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4967 break;
4969 case M_BLTUL:
4970 likely = 1;
4971 case M_BLTU:
4972 if (treg == 0)
4973 goto do_false;
4974 if (sreg == 0)
4976 macro_build (&offset_expr, likely ? "bnel" : "bne",
4977 "s,t,p", 0, treg);
4978 break;
4980 used_at = 1;
4981 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4982 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4983 break;
4985 case M_DEXT:
4987 unsigned long pos;
4988 unsigned long size;
4990 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4992 as_bad (_("Unsupported large constant"));
4993 pos = size = 1;
4995 else
4997 pos = (unsigned long) imm_expr.X_add_number;
4998 size = (unsigned long) imm2_expr.X_add_number;
5001 if (pos > 63)
5003 as_bad (_("Improper position (%lu)"), pos);
5004 pos = 1;
5006 if (size == 0 || size > 64
5007 || (pos + size - 1) > 63)
5009 as_bad (_("Improper extract size (%lu, position %lu)"),
5010 size, pos);
5011 size = 1;
5014 if (size <= 32 && pos < 32)
5016 s = "dext";
5017 fmt = "t,r,+A,+C";
5019 else if (size <= 32)
5021 s = "dextu";
5022 fmt = "t,r,+E,+H";
5024 else
5026 s = "dextm";
5027 fmt = "t,r,+A,+G";
5029 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5031 break;
5033 case M_DINS:
5035 unsigned long pos;
5036 unsigned long size;
5038 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5040 as_bad (_("Unsupported large constant"));
5041 pos = size = 1;
5043 else
5045 pos = (unsigned long) imm_expr.X_add_number;
5046 size = (unsigned long) imm2_expr.X_add_number;
5049 if (pos > 63)
5051 as_bad (_("Improper position (%lu)"), pos);
5052 pos = 1;
5054 if (size == 0 || size > 64
5055 || (pos + size - 1) > 63)
5057 as_bad (_("Improper insert size (%lu, position %lu)"),
5058 size, pos);
5059 size = 1;
5062 if (pos < 32 && (pos + size - 1) < 32)
5064 s = "dins";
5065 fmt = "t,r,+A,+B";
5067 else if (pos >= 32)
5069 s = "dinsu";
5070 fmt = "t,r,+E,+F";
5072 else
5074 s = "dinsm";
5075 fmt = "t,r,+A,+F";
5077 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5078 pos + size - 1);
5080 break;
5082 case M_DDIV_3:
5083 dbl = 1;
5084 case M_DIV_3:
5085 s = "mflo";
5086 goto do_div3;
5087 case M_DREM_3:
5088 dbl = 1;
5089 case M_REM_3:
5090 s = "mfhi";
5091 do_div3:
5092 if (treg == 0)
5094 as_warn (_("Divide by zero."));
5095 if (mips_trap)
5096 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5097 else
5098 macro_build (NULL, "break", "c", 7);
5099 break;
5102 start_noreorder ();
5103 if (mips_trap)
5105 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5106 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5108 else
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;
5116 used_at = 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);
5120 if (dbl)
5122 expr1.X_add_number = 1;
5123 load_register (AT, &expr1, dbl);
5124 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5126 else
5128 expr1.X_add_number = 0x80000000;
5129 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5131 if (mips_trap)
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. */
5136 end_noreorder ();
5138 else
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. */
5146 end_noreorder ();
5148 macro_build (NULL, "break", "c", 6);
5150 macro_build (NULL, s, "d", dreg);
5151 break;
5153 case M_DIV_3I:
5154 s = "div";
5155 s2 = "mflo";
5156 goto do_divi;
5157 case M_DIVU_3I:
5158 s = "divu";
5159 s2 = "mflo";
5160 goto do_divi;
5161 case M_REM_3I:
5162 s = "div";
5163 s2 = "mfhi";
5164 goto do_divi;
5165 case M_REMU_3I:
5166 s = "divu";
5167 s2 = "mfhi";
5168 goto do_divi;
5169 case M_DDIV_3I:
5170 dbl = 1;
5171 s = "ddiv";
5172 s2 = "mflo";
5173 goto do_divi;
5174 case M_DDIVU_3I:
5175 dbl = 1;
5176 s = "ddivu";
5177 s2 = "mflo";
5178 goto do_divi;
5179 case M_DREM_3I:
5180 dbl = 1;
5181 s = "ddiv";
5182 s2 = "mfhi";
5183 goto do_divi;
5184 case M_DREMU_3I:
5185 dbl = 1;
5186 s = "ddivu";
5187 s2 = "mfhi";
5188 do_divi:
5189 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5191 as_warn (_("Divide by zero."));
5192 if (mips_trap)
5193 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5194 else
5195 macro_build (NULL, "break", "c", 7);
5196 break;
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);
5202 else
5203 move_register (dreg, 0);
5204 break;
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);
5214 else
5215 move_register (dreg, 0);
5216 break;
5219 used_at = 1;
5220 load_register (AT, &imm_expr, dbl);
5221 macro_build (NULL, s, "z,s,t", sreg, AT);
5222 macro_build (NULL, s2, "d", dreg);
5223 break;
5225 case M_DIVU_3:
5226 s = "divu";
5227 s2 = "mflo";
5228 goto do_divu3;
5229 case M_REMU_3:
5230 s = "divu";
5231 s2 = "mfhi";
5232 goto do_divu3;
5233 case M_DDIVU_3:
5234 s = "ddivu";
5235 s2 = "mflo";
5236 goto do_divu3;
5237 case M_DREMU_3:
5238 s = "ddivu";
5239 s2 = "mfhi";
5240 do_divu3:
5241 start_noreorder ();
5242 if (mips_trap)
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. */
5248 end_noreorder ();
5250 else
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. */
5258 end_noreorder ();
5259 macro_build (NULL, "break", "c", 7);
5261 macro_build (NULL, s2, "d", dreg);
5262 break;
5264 case M_DLCA_AB:
5265 dbl = 1;
5266 case M_LCA_AB:
5267 call = 1;
5268 goto do_la;
5269 case M_DLA_AB:
5270 dbl = 1;
5271 case M_LA_AB:
5272 do_la:
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);
5288 break;
5291 if (!mips_opts.noat && (treg == breg))
5293 tempreg = AT;
5294 used_at = 1;
5296 else
5298 tempreg = treg;
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)
5314 Otherwise we want
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)
5325 dsll32 $tempreg,0
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)
5332 dsll $tempreg,16
5333 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5334 dsll $tempreg,16
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);
5347 relax_switch ();
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);
5362 used_at = 1;
5364 else
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)
5379 relax_end ();
5381 else
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);
5389 relax_switch ();
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)
5397 relax_end ();
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
5421 addiu instruction.
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
5431 addiu instruction.
5434 if (offset_expr.X_add_number == 0)
5436 if (mips_pic == SVR4_PIC
5437 && breg == 0
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);
5444 if (breg != 0)
5446 /* We're going to put in an addu instruction using
5447 tempreg, so we may as well insert the nop right
5448 now. */
5449 load_delay_nop ();
5451 relax_switch ();
5452 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5453 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5454 load_delay_nop ();
5455 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5456 tempreg, tempreg, BFD_RELOC_LO16);
5457 relax_end ();
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);
5466 load_delay_nop ();
5467 add_got_offset (tempreg, &offset_expr);
5469 else
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. */
5483 if (breg == treg)
5485 load_delay_nop ();
5486 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5487 treg, AT, breg);
5488 breg = 0;
5489 tempreg = treg;
5491 add_got_offset_hilo (tempreg, &offset_expr, AT);
5492 used_at = 1;
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
5501 constant, we want
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
5520 instruction. */
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))
5539 int dreg;
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. */
5548 if (breg != treg)
5549 dreg = tempreg;
5550 else
5552 assert (tempreg == AT);
5553 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5554 treg, AT, breg);
5555 dreg = treg;
5556 add_breg_early = 1;
5559 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5560 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5561 dreg, dreg, AT);
5563 used_at = 1;
5565 else
5566 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5568 relax_switch ();
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);
5573 if (add_breg_early)
5575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5576 treg, tempreg, breg);
5577 breg = 0;
5578 tempreg = treg;
5580 relax_end ();
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);
5587 relax_switch ();
5588 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5589 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5590 relax_end ();
5592 else
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)
5600 int gpdelay;
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)
5663 if (breg != 0)
5665 /* We're going to put in an addu instruction using
5666 tempreg, so we may as well insert the nop right
5667 now. */
5668 load_delay_nop ();
5671 else if (expr1.X_add_number >= -0x8000
5672 && expr1.X_add_number < 0x8000)
5674 load_delay_nop ();
5675 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5676 tempreg, tempreg, BFD_RELOC_LO16);
5678 else
5680 int dreg;
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. */
5689 if (breg != treg)
5690 dreg = tempreg;
5691 else
5693 assert (tempreg == AT);
5694 load_delay_nop ();
5695 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5696 treg, AT, breg);
5697 dreg = treg;
5700 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5701 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5703 used_at = 1;
5705 offset_expr.X_add_number =
5706 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5707 relax_switch ();
5709 if (gpdelay)
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)
5721 load_delay_nop ();
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. */
5730 else
5732 if (breg == treg)
5734 /* We must add in the base register now, as in the
5735 external symbol case. */
5736 assert (tempreg == AT);
5737 load_delay_nop ();
5738 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5739 treg, AT, breg);
5740 tempreg = treg;
5741 /* We set breg to 0 because we have arranged to add
5742 it in in both cases. */
5743 breg = 0;
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);
5751 used_at = 1;
5753 relax_end ();
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))
5819 int dreg;
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. */
5828 if (breg != treg)
5829 dreg = tempreg;
5830 else
5832 assert (tempreg == AT);
5833 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5834 treg, AT, breg);
5835 dreg = treg;
5836 add_breg_early = 1;
5839 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5840 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5842 used_at = 1;
5844 else
5845 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5847 relax_switch ();
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);
5853 if (add_breg_early)
5855 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5856 treg, tempreg, breg);
5857 breg = 0;
5858 tempreg = treg;
5860 relax_end ();
5862 else
5863 abort ();
5865 if (breg != 0)
5866 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5867 break;
5869 case M_J_A:
5870 /* The j instruction may not be used in PIC code, since it
5871 requires an absolute address. We convert it to a b
5872 instruction. */
5873 if (mips_pic == NO_PIC)
5874 macro_build (&offset_expr, "j", "a");
5875 else
5876 macro_build (&offset_expr, "b", "p");
5877 break;
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. */
5882 case M_JAL_1:
5883 dreg = RA;
5884 /* Fall through. */
5885 case M_JAL_2:
5886 if (mips_pic == NO_PIC)
5887 macro_build (NULL, "jalr", "d,s", dreg, sreg);
5888 else
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"));
5898 else
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,
5914 mips_gp_register,
5915 mips_frame_reg,
5916 HAVE_64BIT_ADDRESSES);
5921 break;
5923 case M_JAL_A:
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)
5932 jalr $ra,$25
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)
5938 addu $25,$25,$gp
5939 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5941 jalr $ra,$25
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)
5948 jalr $ra,$25
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
5955 GOT_DISP. */
5956 if (HAVE_NEWABI)
5958 if (! mips_big_got)
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,
5963 mips_gp_register);
5964 relax_switch ();
5965 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5966 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5967 mips_gp_register);
5968 relax_end ();
5970 else
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,
5979 PIC_CALL_REG);
5980 relax_switch ();
5981 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5982 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5983 mips_gp_register);
5984 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5985 PIC_CALL_REG, PIC_CALL_REG,
5986 BFD_RELOC_MIPS_GOT_OFST);
5987 relax_end ();
5990 macro_build_jalr (&offset_expr);
5992 else
5994 relax_start (offset_expr.X_add_symbol);
5995 if (! mips_big_got)
5997 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5998 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5999 mips_gp_register);
6000 load_delay_nop ();
6001 relax_switch ();
6003 else
6005 int gpdelay;
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,
6014 PIC_CALL_REG);
6015 load_delay_nop ();
6016 relax_switch ();
6017 if (gpdelay)
6018 macro_build (NULL, "nop", "");
6020 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6021 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6022 mips_gp_register);
6023 load_delay_nop ();
6024 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6025 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6026 relax_end ();
6027 macro_build_jalr (&offset_expr);
6029 if (mips_cprestore_offset < 0)
6030 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6031 else
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,
6049 mips_gp_register,
6050 mips_frame_reg,
6051 HAVE_64BIT_ADDRESSES);
6055 else if (mips_pic == VXWORKS_PIC)
6056 as_bad (_("Non-PIC jump used in PIC library"));
6057 else
6058 abort ();
6060 break;
6062 case M_LB_AB:
6063 s = "lb";
6064 goto ld;
6065 case M_LBU_AB:
6066 s = "lbu";
6067 goto ld;
6068 case M_LH_AB:
6069 s = "lh";
6070 goto ld;
6071 case M_LHU_AB:
6072 s = "lhu";
6073 goto ld;
6074 case M_LW_AB:
6075 s = "lw";
6076 goto ld;
6077 case M_LWC0_AB:
6078 s = "lwc0";
6079 /* Itbl support may require additional care here. */
6080 coproc = 1;
6081 goto ld;
6082 case M_LWC1_AB:
6083 s = "lwc1";
6084 /* Itbl support may require additional care here. */
6085 coproc = 1;
6086 goto ld;
6087 case M_LWC2_AB:
6088 s = "lwc2";
6089 /* Itbl support may require additional care here. */
6090 coproc = 1;
6091 goto ld;
6092 case M_LWC3_AB:
6093 s = "lwc3";
6094 /* Itbl support may require additional care here. */
6095 coproc = 1;
6096 goto ld;
6097 case M_LWL_AB:
6098 s = "lwl";
6099 lr = 1;
6100 goto ld;
6101 case M_LWR_AB:
6102 s = "lwr";
6103 lr = 1;
6104 goto ld;
6105 case M_LDC1_AB:
6106 if (mips_opts.arch == CPU_R4650)
6108 as_bad (_("opcode not supported on this processor"));
6109 break;
6111 s = "ldc1";
6112 /* Itbl support may require additional care here. */
6113 coproc = 1;
6114 goto ld;
6115 case M_LDC2_AB:
6116 s = "ldc2";
6117 /* Itbl support may require additional care here. */
6118 coproc = 1;
6119 goto ld;
6120 case M_LDC3_AB:
6121 s = "ldc3";
6122 /* Itbl support may require additional care here. */
6123 coproc = 1;
6124 goto ld;
6125 case M_LDL_AB:
6126 s = "ldl";
6127 lr = 1;
6128 goto ld;
6129 case M_LDR_AB:
6130 s = "ldr";
6131 lr = 1;
6132 goto ld;
6133 case M_LL_AB:
6134 s = "ll";
6135 goto ld;
6136 case M_LLD_AB:
6137 s = "lld";
6138 goto ld;
6139 case M_LWU_AB:
6140 s = "lwu";
6142 if (breg == treg || coproc || lr)
6144 tempreg = AT;
6145 used_at = 1;
6147 else
6149 tempreg = treg;
6151 goto ld_st;
6152 case M_SB_AB:
6153 s = "sb";
6154 goto st;
6155 case M_SH_AB:
6156 s = "sh";
6157 goto st;
6158 case M_SW_AB:
6159 s = "sw";
6160 goto st;
6161 case M_SWC0_AB:
6162 s = "swc0";
6163 /* Itbl support may require additional care here. */
6164 coproc = 1;
6165 goto st;
6166 case M_SWC1_AB:
6167 s = "swc1";
6168 /* Itbl support may require additional care here. */
6169 coproc = 1;
6170 goto st;
6171 case M_SWC2_AB:
6172 s = "swc2";
6173 /* Itbl support may require additional care here. */
6174 coproc = 1;
6175 goto st;
6176 case M_SWC3_AB:
6177 s = "swc3";
6178 /* Itbl support may require additional care here. */
6179 coproc = 1;
6180 goto st;
6181 case M_SWL_AB:
6182 s = "swl";
6183 goto st;
6184 case M_SWR_AB:
6185 s = "swr";
6186 goto st;
6187 case M_SC_AB:
6188 s = "sc";
6189 goto st;
6190 case M_SCD_AB:
6191 s = "scd";
6192 goto st;
6193 case M_CACHE_AB:
6194 s = "cache";
6195 goto st;
6196 case M_SDC1_AB:
6197 if (mips_opts.arch == CPU_R4650)
6199 as_bad (_("opcode not supported on this processor"));
6200 break;
6202 s = "sdc1";
6203 coproc = 1;
6204 /* Itbl support may require additional care here. */
6205 goto st;
6206 case M_SDC2_AB:
6207 s = "sdc2";
6208 /* Itbl support may require additional care here. */
6209 coproc = 1;
6210 goto st;
6211 case M_SDC3_AB:
6212 s = "sdc3";
6213 /* Itbl support may require additional care here. */
6214 coproc = 1;
6215 goto st;
6216 case M_SDL_AB:
6217 s = "sdl";
6218 goto st;
6219 case M_SDR_AB:
6220 s = "sdr";
6222 tempreg = AT;
6223 used_at = 1;
6224 ld_st:
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
6230 || mask == M_L_DAB
6231 || mask == M_S_DAB)
6232 fmt = "T,o(b)";
6233 else if (mask == M_CACHE_AB)
6234 fmt = "k,o(b)";
6235 else if (coproc)
6236 fmt = "E,o(b)";
6237 else
6238 fmt = "t,o(b)";
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))
6250 char value [32];
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);
6264 if (breg != 0)
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)
6284 Otherwise we want
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,
6291 we want
6292 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6293 lui $at,<sym> (BFD_RELOC_HI16_S)
6294 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6295 dsll32 $tempreg,0
6296 daddu $tempreg,$at
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)
6302 daddu $at,$breg
6303 dsll32 $tempreg,0
6304 daddu $tempreg,$at
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)
6311 dsll $tempreg,16
6312 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6313 dsll $tempreg,16
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)
6318 dsll $tempreg,16
6319 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6320 dsll $tempreg,16
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);
6332 if (breg == 0)
6334 macro_build (&offset_expr, s, fmt, treg,
6335 BFD_RELOC_GPREL16, mips_gp_register);
6337 else
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);
6344 relax_switch ();
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,
6352 BFD_RELOC_HI16_S);
6353 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6354 tempreg, BFD_RELOC_MIPS_HIGHER);
6355 if (breg != 0)
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,
6360 tempreg);
6361 used_at = 1;
6363 else
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);
6373 if (breg != 0)
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)
6381 relax_end ();
6382 break;
6385 if (breg == 0)
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,
6392 mips_gp_register);
6393 relax_switch ();
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)
6399 relax_end ();
6401 else
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);
6411 relax_switch ();
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)
6419 relax_end ();
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)
6430 Otherwise we want
6431 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6433 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6434 <op> $treg,0($tempreg)
6436 For NewABI, we want
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);
6447 if (HAVE_NEWABI)
6449 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6450 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6451 if (breg != 0)
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);
6456 break;
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);
6465 load_delay_nop ();
6466 relax_start (offset_expr.X_add_symbol);
6467 relax_switch ();
6468 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6469 tempreg, BFD_RELOC_LO16);
6470 relax_end ();
6471 if (breg != 0)
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)
6478 int gpdelay;
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)
6485 Otherwise we want
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,
6507 mips_gp_register);
6508 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6509 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6510 relax_switch ();
6511 if (gpdelay)
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);
6515 load_delay_nop ();
6516 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6517 tempreg, BFD_RELOC_LO16);
6518 relax_end ();
6520 if (breg != 0)
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,
6545 mips_gp_register);
6546 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6547 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6548 if (breg != 0)
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);
6553 relax_switch ();
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);
6557 if (breg != 0)
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);
6562 relax_end ();
6564 else
6565 abort ();
6567 break;
6569 case M_LI:
6570 case M_LI_S:
6571 load_register (treg, &imm_expr, 0);
6572 break;
6574 case M_DLI:
6575 load_register (treg, &imm_expr, 1);
6576 break;
6578 case M_LI_SS:
6579 if (imm_expr.X_op == O_constant)
6581 used_at = 1;
6582 load_register (AT, &imm_expr, 0);
6583 macro_build (NULL, "mtc1", "t,G", AT, treg);
6584 break;
6586 else
6588 assert (offset_expr.X_op == O_symbol
6589 && strcmp (segment_name (S_GET_SEGMENT
6590 (offset_expr.X_add_symbol)),
6591 ".lit4") == 0
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);
6595 break;
6598 case M_LI_D:
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);
6607 else
6609 int hreg, lreg;
6611 if (target_big_endian)
6613 hreg = treg;
6614 lreg = treg + 1;
6616 else
6618 hreg = treg + 1;
6619 lreg = treg;
6622 if (hreg <= 31)
6623 load_register (hreg, &imm_expr, 0);
6624 if (lreg <= 31)
6626 if (offset_expr.X_op == O_absent)
6627 move_register (lreg, 0);
6628 else
6630 assert (offset_expr.X_op == O_constant);
6631 load_register (lreg, &offset_expr, 0);
6635 break;
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);
6643 used_at = 1;
6645 else
6647 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6648 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6649 used_at = 1;
6652 /* Now we load the register(s). */
6653 if (HAVE_64BIT_GPRS)
6655 used_at = 1;
6656 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6658 else
6660 used_at = 1;
6661 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6662 if (treg != RA)
6664 /* FIXME: How in the world do we deal with the possible
6665 overflow here? */
6666 offset_expr.X_add_number += 4;
6667 macro_build (&offset_expr, "lw", "t,o(b)",
6668 treg + 1, BFD_RELOC_LO16, AT);
6671 break;
6673 case M_LI_DD:
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
6678 OFFSET_EXPR. */
6679 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6681 used_at = 1;
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);
6688 else
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);
6693 else
6695 assert (offset_expr.X_op == O_constant);
6696 load_register (AT, &offset_expr, 0);
6697 macro_build (NULL, "mtc1", "t,G", AT, treg);
6700 break;
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);
6712 break;
6714 breg = mips_gp_register;
6715 r = BFD_RELOC_MIPS_LITERAL;
6716 goto dob;
6718 else
6720 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6721 used_at = 1;
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);
6725 else
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);
6735 break;
6737 breg = AT;
6738 r = BFD_RELOC_LO16;
6739 goto dob;
6742 case M_L_DOB:
6743 if (mips_opts.arch == CPU_R4650)
6745 as_bad (_("opcode not supported on this processor"));
6746 break;
6748 /* Even on a big endian machine $fn comes before $fn+1. We have
6749 to adjust when loading from memory. */
6750 r = BFD_RELOC_LO16;
6751 dob:
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
6756 with. */
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);
6760 break;
6762 case M_L_DAB:
6764 * The MIPS assembler seems to check for X_add_number not
6765 * being double aligned and generating:
6766 * lui at,%hi(foo+1)
6767 * addu at,at,v1
6768 * addiu at,at,%lo(foo+1)
6769 * lwc1 f2,0(at)
6770 * lwc1 f3,4(at)
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"));
6777 break;
6779 /* Itbl support may require additional care here. */
6780 coproc = 1;
6781 if (mips_opts.isa != ISA_MIPS1)
6783 s = "ldc1";
6784 goto ld;
6787 s = "lwc1";
6788 fmt = "T,o(b)";
6789 goto ldd_std;
6791 case M_S_DAB:
6792 if (mips_opts.arch == CPU_R4650)
6794 as_bad (_("opcode not supported on this processor"));
6795 break;
6798 if (mips_opts.isa != ISA_MIPS1)
6800 s = "sdc1";
6801 goto st;
6804 s = "swc1";
6805 fmt = "T,o(b)";
6806 /* Itbl support may require additional care here. */
6807 coproc = 1;
6808 goto ldd_std;
6810 case M_LD_AB:
6811 if (HAVE_64BIT_GPRS)
6813 s = "ld";
6814 goto ld;
6817 s = "lw";
6818 fmt = "t,o(b)";
6819 goto ldd_std;
6821 case M_SD_AB:
6822 if (HAVE_64BIT_GPRS)
6824 s = "sd";
6825 goto st;
6828 s = "sw";
6829 fmt = "t,o(b)";
6831 ldd_std:
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))
6842 char value [32];
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)
6853 coproc = 0;
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
6862 addu $at,$breg,$gp
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
6871 the last case. */
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);
6877 if (breg == 0)
6879 tempreg = mips_gp_register;
6881 else
6883 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6884 AT, breg, mips_gp_register);
6885 tempreg = AT;
6886 used_at = 1;
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
6895 undesired nop. */
6896 hold_mips_optimize = mips_optimize;
6897 mips_optimize = 2;
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;
6903 relax_switch ();
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;
6920 else
6922 offset_expr.X_add_number = -4;
6923 offset_expr.X_op = O_constant;
6926 used_at = 1;
6927 macro_build_lui (&offset_expr, AT);
6928 if (breg != 0)
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)
6939 relax_end ();
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)
6946 <op> $treg,0($at)
6947 <op> $treg+1,4($at)
6948 Otherwise we want
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. */
6956 used_at = 1;
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);
6962 load_delay_nop ();
6963 if (breg != 0)
6964 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6966 /* Set mips_optimize to 2 to avoid inserting an undesired
6967 nop. */
6968 hold_mips_optimize = mips_optimize;
6969 mips_optimize = 2;
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);
6978 relax_switch ();
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);
6984 relax_end ();
6986 mips_optimize = hold_mips_optimize;
6988 else if (mips_big_got)
6990 int gpdelay;
6992 /* If this is a reference to an external symbol, we want
6993 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6994 addu $at,$at,$gp
6995 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
6997 <op> $treg,0($at)
6998 <op> $treg+1,4($at)
6999 Otherwise we want
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. */
7007 used_at = 1;
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);
7021 load_delay_nop ();
7022 if (breg != 0)
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
7030 nop. */
7031 hold_mips_optimize = mips_optimize;
7032 mips_optimize = 2;
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;
7039 relax_switch ();
7040 offset_expr.X_add_number = expr1.X_add_number;
7041 if (gpdelay)
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);
7045 load_delay_nop ();
7046 if (breg != 0)
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
7054 nop. */
7055 hold_mips_optimize = mips_optimize;
7056 mips_optimize = 2;
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;
7061 relax_end ();
7063 else
7064 abort ();
7066 break;
7068 case M_LD_OB:
7069 s = "lw";
7070 goto sd_ob;
7071 case M_SD_OB:
7072 s = "sw";
7073 sd_ob:
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);
7078 break;
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. */
7097 case M_COP0:
7098 s = "c0";
7099 goto copz;
7100 case M_COP1:
7101 s = "c1";
7102 goto copz;
7103 case M_COP2:
7104 s = "c2";
7105 goto copz;
7106 case M_COP3:
7107 s = "c3";
7108 copz:
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);
7112 break;
7114 case M_MOVE:
7115 move_register (dreg, sreg);
7116 break;
7118 #ifdef LOSING_COMPILER
7119 default:
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,
7126 symbols, etc.
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;
7132 s2 = "cop3";
7133 coproc = ITBL_DECODE_PNUM (immed_expr);;
7134 macro_build (&immed_expr, s, "C");
7135 break;
7137 macro2 (ip);
7138 break;
7140 if (mips_opts.noat && used_at)
7141 as_bad (_("Macro used $at after \".set noat\""));
7144 static void
7145 macro2 (struct mips_cl_insn *ip)
7147 int treg, sreg, dreg, breg;
7148 int tempreg;
7149 int mask;
7150 int used_at;
7151 expressionS expr1;
7152 const char *s;
7153 const char *s2;
7154 const char *fmt;
7155 int likely = 0;
7156 int dbl = 0;
7157 int coproc = 0;
7158 int lr = 0;
7159 int imm = 0;
7160 int off;
7161 offsetT maxnum;
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;
7174 switch (mask)
7176 #endif /* LOSING_COMPILER */
7178 case M_DMUL:
7179 dbl = 1;
7180 case M_MUL:
7181 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7182 macro_build (NULL, "mflo", "d", dreg);
7183 break;
7185 case M_DMUL_I:
7186 dbl = 1;
7187 case M_MUL_I:
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
7190 anyway. */
7191 used_at = 1;
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);
7195 break;
7197 case M_DMULO_I:
7198 dbl = 1;
7199 case M_MULO_I:
7200 imm = 1;
7201 goto do_mulo;
7203 case M_DMULO:
7204 dbl = 1;
7205 case M_MULO:
7206 do_mulo:
7207 start_noreorder ();
7208 used_at = 1;
7209 if (imm)
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);
7215 if (mips_trap)
7216 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7217 else
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);
7224 end_noreorder ();
7225 macro_build (NULL, "mflo", "d", dreg);
7226 break;
7228 case M_DMULOU_I:
7229 dbl = 1;
7230 case M_MULOU_I:
7231 imm = 1;
7232 goto do_mulou;
7234 case M_DMULOU:
7235 dbl = 1;
7236 case M_MULOU:
7237 do_mulou:
7238 start_noreorder ();
7239 used_at = 1;
7240 if (imm)
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);
7246 if (mips_trap)
7247 macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7248 else
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);
7255 end_noreorder ();
7256 break;
7258 case M_DROL:
7259 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7261 if (dreg == sreg)
7263 tempreg = AT;
7264 used_at = 1;
7266 else
7268 tempreg = dreg;
7270 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7271 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7272 break;
7274 used_at = 1;
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);
7279 break;
7281 case M_ROL:
7282 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7284 if (dreg == sreg)
7286 tempreg = AT;
7287 used_at = 1;
7289 else
7291 tempreg = dreg;
7293 macro_build (NULL, "negu", "d,w", tempreg, treg);
7294 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7295 break;
7297 used_at = 1;
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);
7302 break;
7304 case M_DROL_I:
7306 unsigned int rot;
7307 char *l, *r;
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;
7315 if (rot >= 32)
7316 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7317 else
7318 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7319 break;
7321 if (rot == 0)
7323 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7324 break;
7326 l = (rot < 0x20) ? "dsll" : "dsll32";
7327 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7328 rot &= 0x1f;
7329 used_at = 1;
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);
7334 break;
7336 case M_ROL_I:
7338 unsigned int rot;
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);
7346 break;
7348 if (rot == 0)
7350 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7351 break;
7353 used_at = 1;
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);
7358 break;
7360 case M_DROR:
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);
7364 break;
7366 used_at = 1;
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);
7371 break;
7373 case M_ROR:
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);
7377 break;
7379 used_at = 1;
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);
7384 break;
7386 case M_DROR_I:
7388 unsigned int rot;
7389 char *l, *r;
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))
7396 if (rot >= 32)
7397 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7398 else
7399 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7400 break;
7402 if (rot == 0)
7404 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7405 break;
7407 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7408 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7409 rot &= 0x1f;
7410 used_at = 1;
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);
7415 break;
7417 case M_ROR_I:
7419 unsigned int rot;
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);
7427 break;
7429 if (rot == 0)
7431 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7432 break;
7434 used_at = 1;
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);
7439 break;
7441 case M_S_DOB:
7442 if (mips_opts.arch == CPU_R4650)
7444 as_bad (_("opcode not supported on this processor"));
7445 break;
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);
7455 break;
7457 case M_SEQ:
7458 if (sreg == 0)
7459 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7460 else if (treg == 0)
7461 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7462 else
7464 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7465 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7467 break;
7469 case M_SEQ_I:
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);
7473 break;
7475 if (sreg == 0)
7477 as_warn (_("Instruction %s: result is always false"),
7478 ip->insn_mo->name);
7479 move_register (dreg, 0);
7480 break;
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);
7496 else
7498 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7499 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7500 used_at = 1;
7502 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7503 break;
7505 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7506 s = "slt";
7507 goto sge;
7508 case M_SGEU:
7509 s = "sltu";
7510 sge:
7511 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7512 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7513 break;
7515 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7516 case M_SGEU_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);
7524 else
7526 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7527 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7528 dreg, sreg, AT);
7529 used_at = 1;
7531 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7532 break;
7534 case M_SGT: /* sreg > treg <==> treg < sreg */
7535 s = "slt";
7536 goto sgt;
7537 case M_SGTU:
7538 s = "sltu";
7539 sgt:
7540 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7541 break;
7543 case M_SGT_I: /* sreg > I <==> I < sreg */
7544 s = "slt";
7545 goto sgti;
7546 case M_SGTU_I:
7547 s = "sltu";
7548 sgti:
7549 used_at = 1;
7550 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7551 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7552 break;
7554 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7555 s = "slt";
7556 goto sle;
7557 case M_SLEU:
7558 s = "sltu";
7559 sle:
7560 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7561 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7562 break;
7564 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7565 s = "slt";
7566 goto slei;
7567 case M_SLEU_I:
7568 s = "sltu";
7569 slei:
7570 used_at = 1;
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);
7574 break;
7576 case M_SLT_I:
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);
7582 break;
7584 used_at = 1;
7585 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7586 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7587 break;
7589 case M_SLTU_I:
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,
7595 BFD_RELOC_LO16);
7596 break;
7598 used_at = 1;
7599 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7600 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7601 break;
7603 case M_SNE:
7604 if (sreg == 0)
7605 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7606 else if (treg == 0)
7607 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7608 else
7610 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7611 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7613 break;
7615 case M_SNE_I:
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);
7619 break;
7621 if (sreg == 0)
7623 as_warn (_("Instruction %s: result is always true"),
7624 ip->insn_mo->name);
7625 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7626 dreg, 0, BFD_RELOC_LO16);
7627 break;
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);
7643 else
7645 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7646 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7647 used_at = 1;
7649 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7650 break;
7652 case M_DSUB_I:
7653 dbl = 1;
7654 case M_SUB_I:
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);
7662 break;
7664 used_at = 1;
7665 load_register (AT, &imm_expr, dbl);
7666 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7667 break;
7669 case M_DSUBU_I:
7670 dbl = 1;
7671 case M_SUBU_I:
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);
7679 break;
7681 used_at = 1;
7682 load_register (AT, &imm_expr, dbl);
7683 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7684 break;
7686 case M_TEQ_I:
7687 s = "teq";
7688 goto trap;
7689 case M_TGE_I:
7690 s = "tge";
7691 goto trap;
7692 case M_TGEU_I:
7693 s = "tgeu";
7694 goto trap;
7695 case M_TLT_I:
7696 s = "tlt";
7697 goto trap;
7698 case M_TLTU_I:
7699 s = "tltu";
7700 goto trap;
7701 case M_TNE_I:
7702 s = "tne";
7703 trap:
7704 used_at = 1;
7705 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7706 macro_build (NULL, s, "s,t", sreg, AT);
7707 break;
7709 case M_TRUNCWS:
7710 case M_TRUNCWD:
7711 assert (mips_opts.isa == ISA_MIPS1);
7712 used_at = 1;
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?
7720 start_noreorder ();
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",
7731 dreg, sreg);
7732 macro_build (NULL, "ctc1", "t,G", treg, RA);
7733 macro_build (NULL, "nop", "");
7734 end_noreorder ();
7735 break;
7737 case M_ULH:
7738 s = "lb";
7739 goto ulh;
7740 case M_ULHU:
7741 s = "lbu";
7742 ulh:
7743 used_at = 1;
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;
7751 else
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);
7756 break;
7758 case M_ULD:
7759 s = "ldl";
7760 s2 = "ldr";
7761 off = 7;
7762 goto ulw;
7763 case M_ULW:
7764 s = "lwl";
7765 s2 = "lwr";
7766 off = 3;
7767 ulw:
7768 if (offset_expr.X_add_number >= 0x8000 - off)
7769 as_bad (_("operand overflow"));
7770 if (treg != breg)
7771 tempreg = treg;
7772 else
7774 used_at = 1;
7775 tempreg = AT;
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;
7782 else
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)
7788 break;
7789 /* Protect second load's delay slot. */
7790 load_delay_nop ();
7791 move_register (treg, tempreg);
7792 break;
7794 case M_ULD_A:
7795 s = "ldl";
7796 s2 = "ldr";
7797 off = 7;
7798 goto ulwa;
7799 case M_ULW_A:
7800 s = "lwl";
7801 s2 = "lwr";
7802 off = 3;
7803 ulwa:
7804 used_at = 1;
7805 load_address (AT, &offset_expr, &used_at);
7806 if (breg != 0)
7807 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7808 if (! target_big_endian)
7809 expr1.X_add_number = off;
7810 else
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;
7815 else
7816 expr1.X_add_number = off;
7817 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7818 break;
7820 case M_ULH_A:
7821 case M_ULHU_A:
7822 used_at = 1;
7823 load_address (AT, &offset_expr, &used_at);
7824 if (breg != 0)
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;
7832 else
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);
7837 break;
7839 case M_USH:
7840 used_at = 1;
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;
7849 else
7850 ++offset_expr.X_add_number;
7851 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7852 break;
7854 case M_USD:
7855 s = "sdl";
7856 s2 = "sdr";
7857 off = 7;
7858 goto usw;
7859 case M_USW:
7860 s = "swl";
7861 s2 = "swr";
7862 off = 3;
7863 usw:
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;
7871 else
7872 offset_expr.X_add_number += off;
7873 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7874 break;
7876 case M_USD_A:
7877 s = "sdl";
7878 s2 = "sdr";
7879 off = 7;
7880 goto uswa;
7881 case M_USW_A:
7882 s = "swl";
7883 s2 = "swr";
7884 off = 3;
7885 uswa:
7886 used_at = 1;
7887 load_address (AT, &offset_expr, &used_at);
7888 if (breg != 0)
7889 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7890 if (! target_big_endian)
7891 expr1.X_add_number = off;
7892 else
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;
7897 else
7898 expr1.X_add_number = off;
7899 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7900 break;
7902 case M_USH_A:
7903 used_at = 1;
7904 load_address (AT, &offset_expr, &used_at);
7905 if (breg != 0)
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;
7913 else
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;
7918 else
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);
7923 break;
7925 default:
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);
7929 break;
7931 if (mips_opts.noat && used_at)
7932 as_bad (_("Macro used $at after \".set noat\""));
7935 /* Implement macros in mips16 mode. */
7937 static void
7938 mips16_macro (struct mips_cl_insn *ip)
7940 int mask;
7941 int xreg, yreg, zreg, tmp;
7942 expressionS expr1;
7943 int dbl;
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;
7957 dbl = 0;
7959 switch (mask)
7961 default:
7962 internalError ();
7964 case M_DDIV_3:
7965 dbl = 1;
7966 case M_DIV_3:
7967 s = "mflo";
7968 goto do_div3;
7969 case M_DREM_3:
7970 dbl = 1;
7971 case M_REM_3:
7972 s = "mfhi";
7973 do_div3:
7974 start_noreorder ();
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
7983 register. */
7984 end_noreorder ();
7985 macro_build (NULL, s, "x", zreg);
7986 break;
7988 case M_DIVU_3:
7989 s = "divu";
7990 s2 = "mflo";
7991 goto do_divu3;
7992 case M_REMU_3:
7993 s = "divu";
7994 s2 = "mfhi";
7995 goto do_divu3;
7996 case M_DDIVU_3:
7997 s = "ddivu";
7998 s2 = "mflo";
7999 goto do_divu3;
8000 case M_DREMU_3:
8001 s = "ddivu";
8002 s2 = "mfhi";
8003 do_divu3:
8004 start_noreorder ();
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);
8009 end_noreorder ();
8010 macro_build (NULL, s2, "x", zreg);
8011 break;
8013 case M_DMUL:
8014 dbl = 1;
8015 case M_MUL:
8016 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8017 macro_build (NULL, "mflo", "x", zreg);
8018 break;
8020 case M_DSUBU_I:
8021 dbl = 1;
8022 goto do_subu;
8023 case M_SUBU_I:
8024 do_subu:
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);
8029 break;
8031 case M_SUBU_I_2:
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);
8036 break;
8038 case M_DSUBU_I_2:
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);
8043 break;
8045 case M_BEQ:
8046 s = "cmp";
8047 s2 = "bteqz";
8048 goto do_branch;
8049 case M_BNE:
8050 s = "cmp";
8051 s2 = "btnez";
8052 goto do_branch;
8053 case M_BLT:
8054 s = "slt";
8055 s2 = "btnez";
8056 goto do_branch;
8057 case M_BLTU:
8058 s = "sltu";
8059 s2 = "btnez";
8060 goto do_branch;
8061 case M_BLE:
8062 s = "slt";
8063 s2 = "bteqz";
8064 goto do_reverse_branch;
8065 case M_BLEU:
8066 s = "sltu";
8067 s2 = "bteqz";
8068 goto do_reverse_branch;
8069 case M_BGE:
8070 s = "slt";
8071 s2 = "bteqz";
8072 goto do_branch;
8073 case M_BGEU:
8074 s = "sltu";
8075 s2 = "bteqz";
8076 goto do_branch;
8077 case M_BGT:
8078 s = "slt";
8079 s2 = "btnez";
8080 goto do_reverse_branch;
8081 case M_BGTU:
8082 s = "sltu";
8083 s2 = "btnez";
8085 do_reverse_branch:
8086 tmp = xreg;
8087 xreg = yreg;
8088 yreg = tmp;
8090 do_branch:
8091 macro_build (NULL, s, "x,y", xreg, yreg);
8092 macro_build (&offset_expr, s2, "p");
8093 break;
8095 case M_BEQ_I:
8096 s = "cmpi";
8097 s2 = "bteqz";
8098 s3 = "x,U";
8099 goto do_branch_i;
8100 case M_BNE_I:
8101 s = "cmpi";
8102 s2 = "btnez";
8103 s3 = "x,U";
8104 goto do_branch_i;
8105 case M_BLT_I:
8106 s = "slti";
8107 s2 = "btnez";
8108 s3 = "x,8";
8109 goto do_branch_i;
8110 case M_BLTU_I:
8111 s = "sltiu";
8112 s2 = "btnez";
8113 s3 = "x,8";
8114 goto do_branch_i;
8115 case M_BLE_I:
8116 s = "slti";
8117 s2 = "btnez";
8118 s3 = "x,8";
8119 goto do_addone_branch_i;
8120 case M_BLEU_I:
8121 s = "sltiu";
8122 s2 = "btnez";
8123 s3 = "x,8";
8124 goto do_addone_branch_i;
8125 case M_BGE_I:
8126 s = "slti";
8127 s2 = "bteqz";
8128 s3 = "x,8";
8129 goto do_branch_i;
8130 case M_BGEU_I:
8131 s = "sltiu";
8132 s2 = "bteqz";
8133 s3 = "x,8";
8134 goto do_branch_i;
8135 case M_BGT_I:
8136 s = "slti";
8137 s2 = "bteqz";
8138 s3 = "x,8";
8139 goto do_addone_branch_i;
8140 case M_BGTU_I:
8141 s = "sltiu";
8142 s2 = "bteqz";
8143 s3 = "x,8";
8145 do_addone_branch_i:
8146 if (imm_expr.X_op != O_constant)
8147 as_bad (_("Unsupported large constant"));
8148 ++imm_expr.X_add_number;
8150 do_branch_i:
8151 macro_build (&imm_expr, s, s3, xreg);
8152 macro_build (&offset_expr, s2, "p");
8153 break;
8155 case M_ABS:
8156 expr1.X_add_number = 0;
8157 macro_build (&expr1, "slti", "x,8", yreg);
8158 if (xreg != 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
8168 operand list. */
8169 static int
8170 validate_mips_insn (const struct mips_opcode *opc)
8172 const char *p = opc->args;
8173 char c;
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);
8180 return 0;
8182 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8183 while (*p)
8184 switch (c = *p++)
8186 case ',': break;
8187 case '(': break;
8188 case ')': break;
8189 case '+':
8190 switch (c = *p++)
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;
8205 case 'I': 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;
8209 default:
8210 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8211 c, opc->name, opc->args);
8212 return 0;
8214 break;
8215 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8216 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8217 case 'A': 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;
8222 case 'F': 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;
8225 case 'I': 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;
8228 case 'L': 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;
8246 case 'f': 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;
8251 case 'l': 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;
8261 case 'x': break;
8262 case 'z': 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;
8268 case '[': break;
8269 case ']': 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;
8287 default:
8288 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8289 c, opc->name, opc->args);
8290 return 0;
8292 #undef USE_BITS
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);
8297 return 0;
8299 return 1;
8302 /* UDI immediates. */
8303 struct mips_immed {
8304 char type;
8305 unsigned int shift;
8306 unsigned long mask;
8307 const char * desc;
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},
8315 { 0,0,0,0 }
8318 /* Check whether an odd floating-point register is allowed. */
8319 static int
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. */
8326 return 1;
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))
8333 case FP_S:
8334 case 0:
8335 return 1; /* both single precision - ok */
8336 case FP_D:
8337 return 0; /* both double precision - fail */
8338 default:
8339 break;
8342 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8343 s = strchr (insn->name, '.');
8344 if (argnum == 2)
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)))
8353 return 1;
8355 return 0;
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. */
8363 static void
8364 mips_ip (char *str, struct mips_cl_insn *ip)
8366 char *s;
8367 const char *args;
8368 char c = 0;
8369 struct mips_opcode *insn;
8370 char *argsStart;
8371 unsigned int regno;
8372 unsigned int lastregno = 0;
8373 unsigned int lastpos = 0;
8374 unsigned int limlo, limhi;
8375 char *s_reset;
8376 char save_c = 0;
8377 offsetT min_range, max_range;
8378 int argnum;
8379 unsigned int rtype;
8381 insn_error = NULL;
8383 /* If the instruction contains a '.', we first try to match an instruction
8384 including the '.'. Then we try again without the '.'. */
8385 insn = NULL;
8386 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8387 continue;
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. */
8392 if (ISSPACE (*s))
8394 save_c = *s;
8395 *s++ = '\0';
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
8402 first '.'. */
8403 if (insn == NULL)
8405 /* Restore the character we overwrite above (if any). */
8406 if (save_c)
8407 *(--s) = save_c;
8409 /* Scan up to the first '.' or whitespace. */
8410 for (s = str;
8411 *s != '\0' && *s != '.' && !ISSPACE (*s);
8412 ++s)
8413 continue;
8415 /* If we did not find a '.', then we can quit now. */
8416 if (*s != '.')
8418 insn_error = "unrecognized opcode";
8419 return;
8422 /* Lookup the instruction in the hash table. */
8423 *s++ = '\0';
8424 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8426 insn_error = "unrecognized opcode";
8427 return;
8431 argsStart = s;
8432 for (;;)
8434 bfd_boolean ok;
8436 assert (strcmp (insn->name, str) == 0);
8438 if (OPCODE_IS_MEMBER (insn,
8439 (mips_opts.isa
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)
8447 ? INSN_DSP64 : 0)
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)),
8452 mips_opts.arch))
8453 ok = TRUE;
8454 else
8455 ok = FALSE;
8457 if (insn->pinfo != INSN_MACRO)
8459 if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8460 ok = FALSE;
8463 if (! ok)
8465 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8466 && strcmp (insn->name, insn[1].name) == 0)
8468 ++insn;
8469 continue;
8471 else
8473 if (!insn_error)
8475 static char buf[100];
8476 sprintf (buf,
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);
8480 insn_error = buf;
8482 if (save_c)
8483 *(--s) = save_c;
8484 return;
8488 create_insn (ip, insn);
8489 insn_error = NULL;
8490 argnum = 1;
8491 for (args = insn->args;; ++args)
8493 int is_mdmx;
8495 s += strspn (s, " \t");
8496 is_mdmx = 0;
8497 switch (*args)
8499 case '\0': /* end of args */
8500 if (*s == '\0')
8501 return;
8502 break;
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;
8515 s = expr_end;
8516 continue;
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;
8528 s = expr_end;
8529 continue;
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;
8541 s = expr_end;
8542 continue;
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;
8554 s = expr_end;
8555 continue;
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;
8567 s = expr_end;
8568 continue;
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')
8574 regno = s[3] - '0';
8575 s += 4;
8576 INSERT_OPERAND (DSPACC, *ip, regno);
8577 continue;
8579 else
8580 as_bad (_("Invalid dsp acc register"));
8581 break;
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)"),
8589 OP_MASK_WRDSP,
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;
8594 s = expr_end;
8595 continue;
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')
8601 regno = s[3] - '0';
8602 s += 4;
8603 INSERT_OPERAND (DSPACC_S, *ip, regno);
8604 continue;
8606 else
8607 as_bad (_("Invalid dsp acc register"));
8608 break;
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;
8624 s = expr_end;
8625 continue;
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)"),
8633 OP_MASK_RDDSP,
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;
8638 s = expr_end;
8639 continue;
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;
8655 s = expr_end;
8656 continue;
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;
8672 s = expr_end;
8673 continue;
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;
8683 s = expr_end;
8684 continue;
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;
8694 s = expr_end;
8695 continue;
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')
8701 regno = s[3] - '0';
8702 s += 4;
8703 INSERT_OPERAND (MTACC_T, *ip, regno);
8704 continue;
8706 else
8707 as_bad (_("Invalid dsp/smartmips acc register"));
8708 break;
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')
8714 regno = s[3] - '0';
8715 s += 4;
8716 INSERT_OPERAND (MTACC_D, *ip, regno);
8717 continue;
8719 else
8720 as_bad (_("Invalid dsp/smartmips acc register"));
8721 break;
8723 case ',':
8724 ++argnum;
8725 if (*s++ == *args)
8726 continue;
8727 s--;
8728 switch (*++args)
8730 case 'r':
8731 case 'v':
8732 INSERT_OPERAND (RS, *ip, lastregno);
8733 continue;
8735 case 'w':
8736 INSERT_OPERAND (RT, *ip, lastregno);
8737 continue;
8739 case 'W':
8740 INSERT_OPERAND (FT, *ip, lastregno);
8741 continue;
8743 case 'V':
8744 INSERT_OPERAND (FS, *ip, lastregno);
8745 continue;
8747 break;
8749 case '(':
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');
8757 if (*s == '\0')
8758 return;
8760 case ')': /* these must match exactly */
8761 case '[':
8762 case ']':
8763 if (*s++ == *args)
8764 continue;
8765 break;
8767 case '+': /* Opcode extension character. */
8768 switch (*++args)
8770 case '1': /* UDI immediates. */
8771 case '2':
8772 case '3':
8773 case '4':
8775 const struct mips_immed *imm = mips_immed;
8777 while (imm->type && imm->type != *args)
8778 ++imm;
8779 if (! imm->type)
8780 internalError ();
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
8792 << imm->shift);
8793 imm_expr.X_op = O_absent;
8794 s = expr_end;
8796 continue;
8798 case 'A': /* ins/ext position, becomes LSB. */
8799 limlo = 0;
8800 limhi = 31;
8801 goto do_lsb;
8802 case 'E':
8803 limlo = 32;
8804 limhi = 63;
8805 goto do_lsb;
8806 do_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;
8819 s = expr_end;
8820 continue;
8822 case 'B': /* ins size, becomes MSB. */
8823 limlo = 1;
8824 limhi = 32;
8825 goto do_msb;
8826 case 'F':
8827 limlo = 33;
8828 limhi = 64;
8829 goto do_msb;
8830 do_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
8839 + lastpos) < limlo
8840 || ((unsigned long) imm_expr.X_add_number
8841 + lastpos) > limhi)
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;
8851 s = expr_end;
8852 continue;
8854 case 'C': /* ext size, becomes MSBD. */
8855 limlo = 1;
8856 limhi = 32;
8857 goto do_msbd;
8858 case 'G':
8859 limlo = 33;
8860 limhi = 64;
8861 goto do_msbd;
8862 case 'H':
8863 limlo = 33;
8864 limhi = 64;
8865 goto do_msbd;
8866 do_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
8875 + lastpos) < limlo
8876 || ((unsigned long) imm_expr.X_add_number
8877 + lastpos) > limhi)
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;
8886 s = expr_end;
8887 continue;
8889 case 'D':
8890 /* +D is for disassembly only; never match. */
8891 break;
8893 case 'I':
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);
8901 s = expr_end;
8902 continue;
8904 case 'T': /* Coprocessor register. */
8905 /* +T is for disassembly only; never match. */
8906 break;
8908 case 't': /* Coprocessor register number. */
8909 if (s[0] == '$' && ISDIGIT (s[1]))
8911 ++s;
8912 regno = 0;
8915 regno *= 10;
8916 regno += *s - '0';
8917 ++s;
8919 while (ISDIGIT (*s));
8920 if (regno > 31)
8921 as_bad (_("Invalid register number (%d)"), regno);
8922 else
8924 INSERT_OPERAND (RT, *ip, regno);
8925 continue;
8928 else
8929 as_bad (_("Invalid coprocessor 0 register number"));
8930 break;
8932 default:
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. */
8936 return;
8938 break;
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;
8954 s = expr_end;
8955 continue;
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)
8962 break;
8963 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8964 imm_expr.X_op = O_absent;
8965 s = expr_end;
8966 continue;
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)"),
8974 ip->insn_mo->name,
8975 (unsigned long) imm_expr.X_add_number);
8976 if (*args == 'k')
8977 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8978 else
8979 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8980 imm_expr.X_op = O_absent;
8981 s = expr_end;
8982 continue;
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)"),
8989 ip->insn_mo->name,
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;
8993 s = expr_end;
8994 continue;
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)"),
9001 ip->insn_mo->name,
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;
9005 s = expr_end;
9006 continue;
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)"),
9013 ip->insn_mo->name,
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;
9017 s = expr_end;
9018 continue;
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;
9031 s = expr_end;
9032 continue;
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;
9045 s = expr_end;
9046 continue;
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;
9056 s = expr_end;
9057 continue;
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, &regno);
9062 else
9063 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9064 INSERT_OPERAND (RD, *ip, regno);
9065 if (ok)
9067 lastregno = regno;
9068 continue;
9070 else
9071 break;
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 */
9086 s_reset = s;
9087 if (*args == 'E' || *args == 'K')
9088 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9089 else
9091 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9092 if (regno == AT && ! mips_opts.noat)
9093 as_warn ("Used $at without \".set noat\"");
9095 if (ok)
9097 c = *args;
9098 if (*s == ' ')
9099 ++s;
9100 if (args[1] != *s)
9102 if (c == 'r' || c == 'v' || c == 'w')
9104 regno = lastregno;
9105 s = s_reset;
9106 ++args;
9109 /* 'z' only matches $0. */
9110 if (c == 'z' && regno != 0)
9111 break;
9113 /* Now that we have assembled one operand, we use the args string
9114 * to figure out where it goes in the instruction. */
9115 switch (c)
9117 case 'r':
9118 case 's':
9119 case 'v':
9120 case 'b':
9121 INSERT_OPERAND (RS, *ip, regno);
9122 break;
9123 case 'd':
9124 case 'G':
9125 case 'K':
9126 case 'g':
9127 INSERT_OPERAND (RD, *ip, regno);
9128 break;
9129 case 'U':
9130 INSERT_OPERAND (RD, *ip, regno);
9131 INSERT_OPERAND (RT, *ip, regno);
9132 break;
9133 case 'w':
9134 case 't':
9135 case 'E':
9136 INSERT_OPERAND (RT, *ip, regno);
9137 break;
9138 case 'x':
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'. */
9146 break;
9147 case 'z':
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. */
9152 break;
9153 case 'D':
9154 /* Itbl operand; not yet implemented. FIXME ?? */
9155 break;
9156 /* What about all other operands like 'i', which
9157 can be specified in the opcode table? */
9159 lastregno = regno;
9160 continue;
9162 switch (*args++)
9164 case 'r':
9165 case 'v':
9166 INSERT_OPERAND (RS, *ip, lastregno);
9167 continue;
9168 case 'w':
9169 INSERT_OPERAND (RT, *ip, lastregno);
9170 continue;
9172 break;
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;
9182 s = expr_end;
9183 continue;
9185 case 'Q': /* MDMX vector, element sel, or const. */
9186 if (s[0] != '$')
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;
9197 else
9198 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9199 imm_expr.X_op = O_absent;
9200 s = expr_end;
9201 continue;
9203 /* Not MDMX Immediate. Fall through. */
9204 case 'X': /* MDMX destination register. */
9205 case 'Y': /* MDMX source register. */
9206 case 'Z': /* MDMX target register. */
9207 is_mdmx = 1;
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 */
9212 case 'V':
9213 case 'W':
9214 rtype = RTYPE_FPU;
9215 if (is_mdmx
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))))
9223 rtype |= RTYPE_VEC;
9224 s_reset = s;
9225 if (reg_lookup (&s, rtype, &regno))
9227 if ((regno & 1) != 0
9228 && HAVE_32BIT_FPRS
9229 && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9230 as_warn (_("Float register should be even, was %d"),
9231 regno);
9233 c = *args;
9234 if (*s == ' ')
9235 ++s;
9236 if (args[1] != *s)
9238 if (c == 'V' || c == 'W')
9240 regno = lastregno;
9241 s = s_reset;
9242 ++args;
9245 switch (c)
9247 case 'D':
9248 case 'X':
9249 INSERT_OPERAND (FD, *ip, regno);
9250 break;
9251 case 'V':
9252 case 'S':
9253 case 'Y':
9254 INSERT_OPERAND (FS, *ip, regno);
9255 break;
9256 case 'Q':
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. */
9260 if (*s == '[')
9262 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9263 int max_el = (is_qh ? 3 : 7);
9264 s++;
9265 my_getExpression(&imm_expr, s);
9266 check_absolute_expr (ip, &imm_expr);
9267 s = expr_end;
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
9273 << (OP_SH_VSEL +
9274 (is_qh ? 2 : 1)));
9275 imm_expr.X_op = O_absent;
9276 if (*s != ']')
9277 as_warn(_("Expecting ']' found '%s'"), s);
9278 else
9279 s++;
9281 else
9283 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9284 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9285 << OP_SH_VSEL);
9286 else
9287 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9288 OP_SH_VSEL);
9290 /* Fall through */
9291 case 'W':
9292 case 'T':
9293 case 'Z':
9294 INSERT_OPERAND (FT, *ip, regno);
9295 break;
9296 case 'R':
9297 INSERT_OPERAND (FR, *ip, regno);
9298 break;
9300 lastregno = regno;
9301 continue;
9304 switch (*args++)
9306 case 'V':
9307 INSERT_OPERAND (FS, *ip, lastregno);
9308 continue;
9309 case 'W':
9310 INSERT_OPERAND (FT, *ip, lastregno);
9311 continue;
9313 break;
9315 case 'I':
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);
9322 s = expr_end;
9323 continue;
9325 case 'A':
9326 my_getExpression (&offset_expr, s);
9327 normalize_address_expr (&offset_expr);
9328 *imm_reloc = BFD_RELOC_32;
9329 s = expr_end;
9330 continue;
9332 case 'F':
9333 case 'L':
9334 case 'f':
9335 case 'l':
9337 int f64;
9338 int using_gprs;
9339 char *save_in;
9340 char *err;
9341 unsigned char temp[8];
9342 int len;
9343 unsigned int length;
9344 segT seg;
9345 subsegT subseg;
9346 char *p;
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:
9359 F -- .rdata
9360 L -- .lit8
9361 f -- immediate value
9362 l -- .lit4
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);
9378 length = 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));
9390 if (*args == 'f'
9391 || (*args == 'l'
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);
9399 else
9400 imm_expr.X_add_number = bfd_getb32 (temp);
9402 else if (length > 4
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
9408 32 bits wide. */
9409 && (using_gprs
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);
9430 else
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);
9443 else
9444 imm_expr.X_add_number = bfd_getb64 (temp);
9446 else
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);
9457 else
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);
9466 else
9468 const char *newname;
9469 segT new_seg;
9471 /* Switch to the right section. */
9472 seg = now_seg;
9473 subseg = now_subseg;
9474 switch (*args)
9476 default: /* unused default case avoids warnings. */
9477 case 'L':
9478 newname = RDATA_SECTION_NAME;
9479 if (g_switch_value >= 8)
9480 newname = ".lit8";
9481 break;
9482 case 'F':
9483 newname = RDATA_SECTION_NAME;
9484 break;
9485 case 'l':
9486 assert (g_switch_value >= 4);
9487 newname = ".lit4";
9488 break;
9490 new_seg = subseg_new (newname, (subsegT) 0);
9491 if (IS_ELF)
9492 bfd_set_section_flags (stdoutput, new_seg,
9493 (SEC_ALLOC
9494 | SEC_LOAD
9495 | SEC_READONLY
9496 | SEC_DATA));
9497 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9498 if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9499 record_alignment (new_seg, 4);
9500 else
9501 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9502 if (seg == now_seg)
9503 as_bad (_("Can't use floating point insn in this section"));
9505 /* Set the argument to the current address in the
9506 section. */
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);
9521 continue;
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)
9528 int more;
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
9536 alternatives. */
9537 if (more
9538 && *args == 'j'
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
9543 && HAVE_64BIT_GPRS)
9544 break;
9546 /* For compatibility with older assemblers, we accept
9547 0x8000-0xffff as signed 16-bit numbers when only
9548 signed numbers are allowed. */
9549 if (*args == 'i')
9550 minval = 0, maxval = 0xffff;
9551 else if (more)
9552 minval = -0x8000, maxval = 0x7fff;
9553 else
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)
9560 if (more)
9561 break;
9562 if (imm_expr.X_op == O_constant
9563 || imm_expr.X_op == O_big)
9564 as_bad (_("expression out of range"));
9567 s = expr_end;
9568 continue;
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;
9578 continue;
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
9583 code pattern. */
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))
9588 break;
9590 s = expr_end;
9591 continue;
9593 case 'p': /* pc relative offset */
9594 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9595 my_getExpression (&offset_expr, s);
9596 s = expr_end;
9597 continue;
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"));
9605 s = expr_end;
9606 continue;
9608 case 'a': /* 26 bit address */
9609 my_getExpression (&offset_expr, s);
9610 s = expr_end;
9611 *offset_reloc = BFD_RELOC_MIPS_JMP;
9612 continue;
9614 case 'N': /* 3 bit branch condition code */
9615 case 'M': /* 3 bit compare condition code */
9616 rtype = RTYPE_CCC;
9617 if (ip->insn_mo->pinfo & (FP_D| FP_S))
9618 rtype |= RTYPE_FCC;
9619 if (!reg_lookup (&s, rtype, &regno))
9620 break;
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"),
9626 str, regno);
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"),
9631 str, regno);
9632 if (*args == 'N')
9633 INSERT_OPERAND (BCC, *ip, regno);
9634 else
9635 INSERT_OPERAND (CCC, *ip, regno);
9636 continue;
9638 case 'H':
9639 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9640 s += 2;
9641 if (ISDIGIT (*s))
9643 c = 0;
9646 c *= 10;
9647 c += *s - '0';
9648 ++s;
9650 while (ISDIGIT (*s));
9652 else
9653 c = 8; /* Invalid sel value. */
9655 if (c > 7)
9656 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9657 ip->insn_opcode |= c;
9658 continue;
9660 case 'e':
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;
9675 s = expr_end;
9676 continue;
9678 case '%':
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;
9692 s = expr_end;
9693 continue;
9695 default:
9696 as_bad (_("bad char = '%c'\n"), *args);
9697 internalError ();
9699 break;
9701 /* Args don't match. */
9702 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9703 !strcmp (insn->name, insn[1].name))
9705 ++insn;
9706 s = argsStart;
9707 insn_error = _("illegal operands");
9708 continue;
9710 if (save_c)
9711 *(--s) = save_c;
9712 insn_error = _("illegal operands");
9713 return;
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. */
9726 static void
9727 mips16_ip (char *str, struct mips_cl_insn *ip)
9729 char *s;
9730 const char *args;
9731 struct mips_opcode *insn;
9732 char *argsstart;
9733 unsigned int regno;
9734 unsigned int lastregno = 0;
9735 char *s_reset;
9736 size_t i;
9738 insn_error = NULL;
9740 mips16_small = FALSE;
9741 mips16_ext = FALSE;
9743 for (s = str; ISLOWER (*s); ++s)
9745 switch (*s)
9747 case '\0':
9748 break;
9750 case ' ':
9751 *s++ = '\0';
9752 break;
9754 case '.':
9755 if (s[1] == 't' && s[2] == ' ')
9757 *s = '\0';
9758 mips16_small = TRUE;
9759 s += 3;
9760 break;
9762 else if (s[1] == 'e' && s[2] == ' ')
9764 *s = '\0';
9765 mips16_ext = TRUE;
9766 s += 3;
9767 break;
9769 /* Fall through. */
9770 default:
9771 insn_error = _("unknown opcode");
9772 return;
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");
9781 return;
9784 argsstart = s;
9785 for (;;)
9787 bfd_boolean ok;
9789 assert (strcmp (insn->name, str) == 0);
9791 if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9792 ok = TRUE;
9793 else
9794 ok = FALSE;
9796 if (! ok)
9798 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9799 && strcmp (insn->name, insn[1].name) == 0)
9801 ++insn;
9802 continue;
9804 else
9806 if (!insn_error)
9808 static char buf[100];
9809 sprintf (buf,
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);
9813 insn_error = buf;
9815 return;
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)
9831 int c;
9833 if (*s == ' ')
9834 ++s;
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
9838 are done. */
9840 c = *args;
9841 switch (c)
9843 case '\0':
9844 if (*s == '\0')
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)
9851 valueT tmp;
9853 switch (*offset_reloc)
9855 case BFD_RELOC_MIPS16_HI16_S:
9856 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9857 break;
9859 case BFD_RELOC_MIPS16_HI16:
9860 tmp = imm_expr.X_add_number >> 16;
9861 break;
9863 case BFD_RELOC_MIPS16_LO16:
9864 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9865 - 0x8000;
9866 break;
9868 case BFD_RELOC_UNUSED:
9869 tmp = imm_expr.X_add_number;
9870 break;
9872 default:
9873 internalError ();
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;
9885 return;
9887 break;
9889 case ',':
9890 if (*s++ == c)
9891 continue;
9892 s--;
9893 switch (*++args)
9895 case 'v':
9896 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9897 continue;
9898 case 'w':
9899 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9900 continue;
9902 break;
9904 case '(':
9905 case ')':
9906 if (*s++ == c)
9907 continue;
9908 break;
9910 case 'v':
9911 case 'w':
9912 if (s[0] != '$')
9914 if (c == 'v')
9915 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9916 else
9917 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9918 ++args;
9919 continue;
9921 /* Fall through. */
9922 case 'x':
9923 case 'y':
9924 case 'z':
9925 case 'Z':
9926 case '0':
9927 case 'S':
9928 case 'R':
9929 case 'X':
9930 case 'Y':
9931 s_reset = s;
9932 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9934 if (c == 'v' || c == 'w')
9936 if (c == 'v')
9937 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9938 else
9939 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9940 ++args;
9941 continue;
9943 break;
9946 if (*s == ' ')
9947 ++s;
9948 if (args[1] != *s)
9950 if (c == 'v' || c == 'w')
9952 regno = mips16_to_32_reg_map[lastregno];
9953 s = s_reset;
9954 ++args;
9958 switch (c)
9960 case 'x':
9961 case 'y':
9962 case 'z':
9963 case 'v':
9964 case 'w':
9965 case 'Z':
9966 regno = mips32_to_16_reg_map[regno];
9967 break;
9969 case '0':
9970 if (regno != 0)
9971 regno = ILLEGAL_REG;
9972 break;
9974 case 'S':
9975 if (regno != SP)
9976 regno = ILLEGAL_REG;
9977 break;
9979 case 'R':
9980 if (regno != RA)
9981 regno = ILLEGAL_REG;
9982 break;
9984 case 'X':
9985 case 'Y':
9986 if (regno == AT && ! mips_opts.noat)
9987 as_warn (_("used $at without \".set noat\""));
9988 break;
9990 default:
9991 internalError ();
9994 if (regno == ILLEGAL_REG)
9995 break;
9997 switch (c)
9999 case 'x':
10000 case 'v':
10001 MIPS16_INSERT_OPERAND (RX, *ip, regno);
10002 break;
10003 case 'y':
10004 case 'w':
10005 MIPS16_INSERT_OPERAND (RY, *ip, regno);
10006 break;
10007 case 'z':
10008 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10009 break;
10010 case 'Z':
10011 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10012 case '0':
10013 case 'S':
10014 case 'R':
10015 break;
10016 case 'X':
10017 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10018 break;
10019 case 'Y':
10020 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10021 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10022 break;
10023 default:
10024 internalError ();
10027 lastregno = regno;
10028 continue;
10030 case 'P':
10031 if (strncmp (s, "$pc", 3) == 0)
10033 s += 3;
10034 continue;
10036 break;
10038 case '5':
10039 case 'H':
10040 case 'W':
10041 case 'D':
10042 case 'j':
10043 case 'V':
10044 case 'C':
10045 case 'U':
10046 case 'k':
10047 case 'K':
10048 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10049 if (i > 0)
10051 if (imm_expr.X_op != O_constant)
10053 mips16_ext = TRUE;
10054 ip->use_extend = TRUE;
10055 ip->extend = 0;
10057 else
10059 /* We need to relax this instruction. */
10060 *offset_reloc = *imm_reloc;
10061 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10063 s = expr_end;
10064 continue;
10066 *imm_reloc = BFD_RELOC_UNUSED;
10067 /* Fall through. */
10068 case '<':
10069 case '>':
10070 case '[':
10071 case ']':
10072 case '4':
10073 case '8':
10074 my_getExpression (&imm_expr, s);
10075 if (imm_expr.X_op == O_register)
10077 /* What we thought was an expression turned out to
10078 be a register. */
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;
10090 continue;
10093 break;
10096 /* We need to relax this instruction. */
10097 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10098 s = expr_end;
10099 continue;
10101 case 'p':
10102 case 'q':
10103 case 'A':
10104 case 'B':
10105 case 'E':
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)
10112 break;
10114 /* We need to relax this instruction. */
10115 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10116 s = expr_end;
10117 continue;
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)"),
10124 ip->insn_mo->name,
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;
10128 s = expr_end;
10129 continue;
10131 case 'a': /* 26 bit address */
10132 my_getExpression (&offset_expr, s);
10133 s = expr_end;
10134 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10135 ip->insn_opcode <<= 16;
10136 continue;
10138 case 'l': /* register list for entry macro */
10139 case 'L': /* register list for exit macro */
10141 int mask;
10143 if (c == 'l')
10144 mask = 0;
10145 else
10146 mask = 7 << 3;
10147 while (*s != '\0')
10149 unsigned int freg, reg1, reg2;
10151 while (*s == ' ' || *s == ',')
10152 ++s;
10153 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10154 freg = 0;
10155 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10156 freg = 1;
10157 else
10159 as_bad (_("can't parse register list"));
10160 break;
10162 if (*s == ' ')
10163 ++s;
10164 if (*s != '-')
10165 reg2 = reg1;
10166 else
10168 ++s;
10169 if (!reg_lookup (&s, freg ? RTYPE_FPU
10170 : (RTYPE_GP | RTYPE_NUM), &reg2))
10172 as_bad (_("invalid register list"));
10173 break;
10176 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10178 mask &= ~ (7 << 3);
10179 mask |= 5 << 3;
10181 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10183 mask &= ~ (7 << 3);
10184 mask |= 6 << 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)
10191 mask |= 1;
10192 else
10194 as_bad (_("invalid register list"));
10195 break;
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;
10204 continue;
10206 case 'm': /* Register list for save insn. */
10207 case 'M': /* Register list for restore insn. */
10209 int opcode = 0;
10210 int framesz = 0, seen_framesz = 0;
10211 int args = 0, statics = 0, sregs = 0;
10213 while (*s != '\0')
10215 unsigned int reg1, reg2;
10217 SKIP_SPACE_TABS (s);
10218 while (*s == ',')
10219 ++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. */
10226 if (seen_framesz)
10228 as_bad (_("more than one frame size in list"));
10229 break;
10231 seen_framesz = 1;
10232 framesz = imm_expr.X_add_number;
10233 imm_expr.X_op = O_absent;
10234 s = expr_end;
10235 continue;
10238 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10240 as_bad (_("can't parse register list"));
10241 break;
10244 while (*s == ' ')
10245 ++s;
10247 if (*s != '-')
10248 reg2 = reg1;
10249 else
10251 ++s;
10252 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10253 || reg2 < reg1)
10255 as_bad (_("can't parse register list"));
10256 break;
10260 while (reg1 <= reg2)
10262 if (reg1 >= 4 && reg1 <= 7)
10264 if (!seen_framesz)
10265 /* args $a0-$a3 */
10266 args |= 1 << (reg1 - 4);
10267 else
10268 /* statics $a0-$a3 */
10269 statics |= 1 << (reg1 - 4);
10271 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10273 /* $s0-$s8 */
10274 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10276 else if (reg1 == 31)
10278 /* Add $ra to insn. */
10279 opcode |= 0x40;
10281 else
10283 as_bad (_("unexpected register in list"));
10284 break;
10286 if (++reg1 == 24)
10287 reg1 = 30;
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;
10300 else
10302 int narg = 0, nstat = 0;
10304 /* Count arg registers. */
10305 while (args & 0x1)
10307 args >>= 1;
10308 narg++;
10310 if (args != 0)
10311 as_bad (_("invalid arg register list"));
10313 /* Count static registers. */
10314 while (statics & 0x8)
10316 statics = (statics << 1) & 0xf;
10317 nstat++;
10319 if (statics != 0)
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 */
10328 opcode |= 0x20;
10329 if (sregs & (1 << 1)) /* $s1 */
10330 opcode |= 0x10;
10331 sregs >>= 2;
10333 if (sregs != 0)
10335 /* Count regs $s2-$s8. */
10336 int nsreg = 0;
10337 while (sregs & 1)
10339 sregs >>= 1;
10340 nsreg++;
10342 if (sregs != 0)
10343 as_bad (_("invalid static register list"));
10344 /* Encode $s2-$s8. */
10345 opcode |= nsreg << 24;
10348 /* Encode frame size. */
10349 if (!seen_framesz)
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)
10356 framesz /= 8;
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;
10369 continue;
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)"),
10377 ip->insn_mo->name,
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;
10383 s = expr_end;
10384 continue;
10386 default:
10387 internalError ();
10389 break;
10392 /* Args don't match. */
10393 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10394 strcmp (insn->name, insn[1].name) == 0)
10396 ++insn;
10397 s = argsstart;
10398 continue;
10401 insn_error = _("illegal operands");
10403 return;
10407 /* This structure holds information we know about a mips16 immediate
10408 argument type. */
10410 struct mips16_immed_operand
10412 /* The type code used in the argument string in the opcode table. */
10413 int type;
10414 /* The number of bits in the short form of the opcode. */
10415 int nbits;
10416 /* The number of bits in the extended form of the opcode. */
10417 int extbits;
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. */
10420 int shift;
10421 /* The amount by which the short form is shifted when it is stored
10422 into the instruction code. */
10423 int op_shift;
10424 /* Non-zero if the short form is unsigned. */
10425 int unsp;
10426 /* Non-zero if the extended form is unsigned. */
10427 int extu;
10428 /* Non-zero if the value is PC relative. */
10429 int pcrel;
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. */
10470 static void
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)
10483 ++op;
10484 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10487 if (op->unsp)
10489 if (type == '<' || type == '>' || type == '[' || type == ']')
10491 mintiny = 1;
10492 maxtiny = 1 << op->nbits;
10494 else
10496 mintiny = 0;
10497 maxtiny = (1 << op->nbits) - 1;
10500 else
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')
10508 val /= 2;
10510 if ((val & ((1 << op->shift) - 1)) != 0
10511 || val < (mintiny << op->shift)
10512 || val > (maxtiny << op->shift))
10513 needext = TRUE;
10514 else
10515 needext = FALSE;
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))
10525 int insnval;
10527 *use_extend = FALSE;
10528 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10529 insnval <<= op->op_shift;
10530 *insn |= insnval;
10532 else
10534 long minext, maxext;
10535 int extval;
10537 if (op->extu)
10539 minext = 0;
10540 maxext = (1 << op->extbits) - 1;
10542 else
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);
10555 val &= 0x1f;
10557 else if (op->extbits == 15)
10559 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10560 val &= 0xf;
10562 else
10564 extval = ((val & 0x1f) << 6) | (val & 0x20);
10565 val = 0;
10568 *extend = (unsigned short) extval;
10569 *insn |= val;
10573 struct percent_op_match
10575 const char *str;
10576 bfd_reloc_code_real_type reloc;
10579 static const struct percent_op_match mips_percent_op[] =
10581 {"%lo", BFD_RELOC_LO16},
10582 #ifdef OBJ_ELF
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},
10604 #endif
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. */
10620 static bfd_boolean
10621 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10623 const struct percent_op_match *percent_op;
10624 size_t limit, i;
10626 if (mips_opts.mips16)
10628 percent_op = mips16_percent_op;
10629 limit = ARRAY_SIZE (mips16_percent_op);
10631 else
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] != '(')
10643 continue;
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;
10656 return TRUE;
10658 return FALSE;
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. */
10668 static size_t
10669 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10670 char *str)
10672 bfd_reloc_code_real_type reversed_reloc[3];
10673 size_t reloc_index, i;
10674 int crux_depth, str_depth;
10675 char *crux;
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. */
10681 reloc_index = -1;
10682 str_depth = 0;
10685 reloc_index++;
10686 crux = str;
10687 crux_depth = str_depth;
10689 /* Skip over whitespace and brackets, keeping count of the number
10690 of brackets. */
10691 while (*str == ' ' || *str == '\t' || *str == '(')
10692 if (*str++ == '(')
10693 str_depth++;
10695 while (*str == '%'
10696 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10697 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10699 my_getExpression (ep, crux);
10700 str = expr_end;
10702 /* Match every open bracket. */
10703 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10704 if (*str++ == ')')
10705 crux_depth--;
10707 if (crux_depth > 0)
10708 as_bad ("unclosed '('");
10710 expr_end = str;
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;
10722 static void
10723 my_getExpression (expressionS *ep, char *str)
10725 char *save_in;
10726 valueT val;
10728 save_in = input_line_pointer;
10729 input_line_pointer = str;
10730 expression (ep);
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. */
10753 char *
10754 md_atof (int type, char *litP, int *sizeP)
10756 int prec;
10757 LITTLENUM_TYPE words[4];
10758 char *t;
10759 int i;
10761 switch (type)
10763 case 'f':
10764 prec = 2;
10765 break;
10767 case 'd':
10768 prec = 4;
10769 break;
10771 default:
10772 *sizeP = 0;
10773 return _("bad call to md_atof");
10776 t = atof_ieee (input_line_pointer, type, words);
10777 if (t)
10778 input_line_pointer = t;
10780 *sizeP = prec * 2;
10782 if (! target_big_endian)
10784 for (i = prec - 1; i >= 0; i--)
10786 md_number_to_chars (litP, words[i], 2);
10787 litP += 2;
10790 else
10792 for (i = 0; i < prec; i++)
10794 md_number_to_chars (litP, words[i], 2);
10795 litP += 2;
10799 return NULL;
10802 void
10803 md_number_to_chars (char *buf, valueT val, int n)
10805 if (target_big_endian)
10806 number_to_chars_bigendian (buf, val, n);
10807 else
10808 number_to_chars_littleendian (buf, val, n);
10811 #ifdef OBJ_ELF
10812 static int support_64bit_objects(void)
10814 const char **list, **l;
10815 int yes;
10817 list = bfd_target_list ();
10818 for (l = list; *l != NULL; l++)
10819 #ifdef TE_TMIPS
10820 /* This is traditional mips */
10821 if (strcmp (*l, "elf64-tradbigmips") == 0
10822 || strcmp (*l, "elf64-tradlittlemips") == 0)
10823 #else
10824 if (strcmp (*l, "elf64-bigmips") == 0
10825 || strcmp (*l, "elf64-littlemips") == 0)
10826 #endif
10827 break;
10828 yes = (*l != NULL);
10829 free (list);
10830 return yes;
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. */
10968 #ifdef OBJ_ELF
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. */
11007 static void
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",
11013 new_value);
11015 *string_ptr = new_value;
11019 md_parse_option (int c, char *arg)
11021 switch (c)
11023 case OPTION_CONSTRUCT_FLOATS:
11024 mips_disable_float_construction = 0;
11025 break;
11027 case OPTION_NO_CONSTRUCT_FLOATS:
11028 mips_disable_float_construction = 1;
11029 break;
11031 case OPTION_TRAP:
11032 mips_trap = 1;
11033 break;
11035 case OPTION_BREAK:
11036 mips_trap = 0;
11037 break;
11039 case OPTION_EB:
11040 target_big_endian = 1;
11041 break;
11043 case OPTION_EL:
11044 target_big_endian = 0;
11045 break;
11047 case 'O':
11048 if (arg && arg[0] == '0')
11049 mips_optimize = 1;
11050 else
11051 mips_optimize = 2;
11052 break;
11054 case 'g':
11055 if (arg == NULL)
11056 mips_debug = 2;
11057 else
11058 mips_debug = atoi (arg);
11059 break;
11061 case OPTION_MIPS1:
11062 file_mips_isa = ISA_MIPS1;
11063 break;
11065 case OPTION_MIPS2:
11066 file_mips_isa = ISA_MIPS2;
11067 break;
11069 case OPTION_MIPS3:
11070 file_mips_isa = ISA_MIPS3;
11071 break;
11073 case OPTION_MIPS4:
11074 file_mips_isa = ISA_MIPS4;
11075 break;
11077 case OPTION_MIPS5:
11078 file_mips_isa = ISA_MIPS5;
11079 break;
11081 case OPTION_MIPS32:
11082 file_mips_isa = ISA_MIPS32;
11083 break;
11085 case OPTION_MIPS32R2:
11086 file_mips_isa = ISA_MIPS32R2;
11087 break;
11089 case OPTION_MIPS64R2:
11090 file_mips_isa = ISA_MIPS64R2;
11091 break;
11093 case OPTION_MIPS64:
11094 file_mips_isa = ISA_MIPS64;
11095 break;
11097 case OPTION_MTUNE:
11098 mips_set_option_string (&mips_tune_string, arg);
11099 break;
11101 case OPTION_MARCH:
11102 mips_set_option_string (&mips_arch_string, arg);
11103 break;
11105 case OPTION_M4650:
11106 mips_set_option_string (&mips_arch_string, "4650");
11107 mips_set_option_string (&mips_tune_string, "4650");
11108 break;
11110 case OPTION_NO_M4650:
11111 break;
11113 case OPTION_M4010:
11114 mips_set_option_string (&mips_arch_string, "4010");
11115 mips_set_option_string (&mips_tune_string, "4010");
11116 break;
11118 case OPTION_NO_M4010:
11119 break;
11121 case OPTION_M4100:
11122 mips_set_option_string (&mips_arch_string, "4100");
11123 mips_set_option_string (&mips_tune_string, "4100");
11124 break;
11126 case OPTION_NO_M4100:
11127 break;
11129 case OPTION_M3900:
11130 mips_set_option_string (&mips_arch_string, "3900");
11131 mips_set_option_string (&mips_tune_string, "3900");
11132 break;
11134 case OPTION_NO_M3900:
11135 break;
11137 case OPTION_MDMX:
11138 mips_opts.ase_mdmx = 1;
11139 break;
11141 case OPTION_NO_MDMX:
11142 mips_opts.ase_mdmx = 0;
11143 break;
11145 case OPTION_DSP:
11146 mips_opts.ase_dsp = 1;
11147 mips_opts.ase_dspr2 = 0;
11148 break;
11150 case OPTION_NO_DSP:
11151 mips_opts.ase_dsp = 0;
11152 mips_opts.ase_dspr2 = 0;
11153 break;
11155 case OPTION_DSPR2:
11156 mips_opts.ase_dspr2 = 1;
11157 mips_opts.ase_dsp = 1;
11158 break;
11160 case OPTION_NO_DSPR2:
11161 mips_opts.ase_dspr2 = 0;
11162 mips_opts.ase_dsp = 0;
11163 break;
11165 case OPTION_MT:
11166 mips_opts.ase_mt = 1;
11167 break;
11169 case OPTION_NO_MT:
11170 mips_opts.ase_mt = 0;
11171 break;
11173 case OPTION_MIPS16:
11174 mips_opts.mips16 = 1;
11175 mips_no_prev_insn ();
11176 break;
11178 case OPTION_NO_MIPS16:
11179 mips_opts.mips16 = 0;
11180 mips_no_prev_insn ();
11181 break;
11183 case OPTION_MIPS3D:
11184 mips_opts.ase_mips3d = 1;
11185 break;
11187 case OPTION_NO_MIPS3D:
11188 mips_opts.ase_mips3d = 0;
11189 break;
11191 case OPTION_SMARTMIPS:
11192 mips_opts.ase_smartmips = 1;
11193 break;
11195 case OPTION_NO_SMARTMIPS:
11196 mips_opts.ase_smartmips = 0;
11197 break;
11199 case OPTION_FIX_VR4120:
11200 mips_fix_vr4120 = 1;
11201 break;
11203 case OPTION_NO_FIX_VR4120:
11204 mips_fix_vr4120 = 0;
11205 break;
11207 case OPTION_FIX_VR4130:
11208 mips_fix_vr4130 = 1;
11209 break;
11211 case OPTION_NO_FIX_VR4130:
11212 mips_fix_vr4130 = 0;
11213 break;
11215 case OPTION_RELAX_BRANCH:
11216 mips_relax_branch = 1;
11217 break;
11219 case OPTION_NO_RELAX_BRANCH:
11220 mips_relax_branch = 0;
11221 break;
11223 case OPTION_MSHARED:
11224 mips_in_shared = TRUE;
11225 break;
11227 case OPTION_MNO_SHARED:
11228 mips_in_shared = FALSE;
11229 break;
11231 case OPTION_MSYM32:
11232 mips_opts.sym32 = TRUE;
11233 break;
11235 case OPTION_MNO_SYM32:
11236 mips_opts.sym32 = FALSE;
11237 break;
11239 #ifdef OBJ_ELF
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:
11244 if (!IS_ELF)
11246 as_bad (_("-call_shared is supported only for ELF format"));
11247 return 0;
11249 mips_pic = SVR4_PIC;
11250 mips_abicalls = TRUE;
11251 break;
11253 case OPTION_NON_SHARED:
11254 if (!IS_ELF)
11256 as_bad (_("-non_shared is supported only for ELF format"));
11257 return 0;
11259 mips_pic = NO_PIC;
11260 mips_abicalls = FALSE;
11261 break;
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
11265 compatibility. */
11266 case OPTION_XGOT:
11267 mips_big_got = 1;
11268 break;
11269 #endif /* OBJ_ELF */
11271 case 'G':
11272 g_switch_value = atoi (arg);
11273 g_switch_seen = 1;
11274 break;
11276 #ifdef OBJ_ELF
11277 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11278 and -mabi=64. */
11279 case OPTION_32:
11280 if (!IS_ELF)
11282 as_bad (_("-32 is supported for ELF format only"));
11283 return 0;
11285 mips_abi = O32_ABI;
11286 break;
11288 case OPTION_N32:
11289 if (!IS_ELF)
11291 as_bad (_("-n32 is supported for ELF format only"));
11292 return 0;
11294 mips_abi = N32_ABI;
11295 break;
11297 case OPTION_64:
11298 if (!IS_ELF)
11300 as_bad (_("-64 is supported for ELF format only"));
11301 return 0;
11303 mips_abi = N64_ABI;
11304 if (!support_64bit_objects())
11305 as_fatal (_("No compiled in support for 64 bit object file format"));
11306 break;
11307 #endif /* OBJ_ELF */
11309 case OPTION_GP32:
11310 file_mips_gp32 = 1;
11311 break;
11313 case OPTION_GP64:
11314 file_mips_gp32 = 0;
11315 break;
11317 case OPTION_FP32:
11318 file_mips_fp32 = 1;
11319 break;
11321 case OPTION_FP64:
11322 file_mips_fp32 = 0;
11323 break;
11325 #ifdef OBJ_ELF
11326 case OPTION_MABI:
11327 if (!IS_ELF)
11329 as_bad (_("-mabi is supported for ELF format only"));
11330 return 0;
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 "
11343 "format"));
11345 else if (strcmp (arg, "eabi") == 0)
11346 mips_abi = EABI_ABI;
11347 else
11349 as_fatal (_("invalid abi -mabi=%s"), arg);
11350 return 0;
11352 break;
11353 #endif /* OBJ_ELF */
11355 case OPTION_M7000_HILO_FIX:
11356 mips_7000_hilo_fix = TRUE;
11357 break;
11359 case OPTION_MNO_7000_HILO_FIX:
11360 mips_7000_hilo_fix = FALSE;
11361 break;
11363 #ifdef OBJ_ELF
11364 case OPTION_MDEBUG:
11365 mips_flag_mdebug = TRUE;
11366 break;
11368 case OPTION_NO_MDEBUG:
11369 mips_flag_mdebug = FALSE;
11370 break;
11372 case OPTION_PDR:
11373 mips_flag_pdr = TRUE;
11374 break;
11376 case OPTION_NO_PDR:
11377 mips_flag_pdr = FALSE;
11378 break;
11380 case OPTION_MVXWORKS_PIC:
11381 mips_pic = VXWORKS_PIC;
11382 break;
11383 #endif /* OBJ_ELF */
11385 default:
11386 return 0;
11389 return 1;
11392 /* Set up globals to generate code for the ISA or processor
11393 described by INFO. */
11395 static void
11396 mips_set_architecture (const struct mips_cpu_info *info)
11398 if (info != 0)
11400 file_mips_arch = info->cpu;
11401 mips_opts.arch = info->cpu;
11402 mips_opts.isa = info->isa;
11407 /* Likewise for tuning. */
11409 static void
11410 mips_set_tune (const struct mips_cpu_info *info)
11412 if (info != 0)
11413 mips_tune = info->cpu;
11417 void
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
11451 are the same. */
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);
11457 else
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",
11466 arch_info->name);
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);
11476 else
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"));
11490 else
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)
11501 default:
11502 case -1:
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
11509 integer ones. */
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;
11517 else
11518 /* 32-bit float registers. */
11519 file_mips_fp32 = 1;
11520 break;
11522 /* The user specified the size of the float registers. Check if it
11523 agrees with the ABI and ISA. */
11524 case 0:
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"));
11530 break;
11531 case 1:
11532 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11533 as_warn (_("-mfp32 used with a 64-bit ABI"));
11534 break;
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;
11608 else
11609 #endif /* OBJ_MAYBE_ECOFF */
11610 mips_flag_mdebug = 0;
11614 void
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;
11622 long
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. */
11631 return addr + 4;
11632 default:
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"));
11637 return addr;
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. */
11648 void
11649 mips_frob_file_before_adjust (void)
11651 #ifndef NO_ECOFF_DEBUGGING
11652 if (ECOFF_DEBUGGING
11653 && mips_debug != 0
11654 && ! ecoff_debugging_seen)
11655 flag_keep_locals = 1;
11656 #endif
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()
11665 expression if:
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:
11673 lui $4,%hi(foo)
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
11678 the high 16 bits.
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
11684 higher offsets.
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. */
11707 void
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))
11724 continue;
11726 /* Check quickly whether the next fixup happens to be a matching %lo. */
11727 if (fixup_has_matching_lo_p (l->fixp))
11728 continue;
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
11736 relocation. */
11737 hi_pos = NULL;
11738 lo_pos = NULL;
11739 matched_lo_p = FALSE;
11740 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11742 if (*pos == l->fixp)
11743 hi_pos = pos;
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
11749 && (lo_pos == NULL
11750 || (*pos)->fx_offset < (*lo_pos)->fx_offset
11751 || (!matched_lo_p
11752 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11753 lo_pos = pos;
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()
11762 will return true.
11764 We don't warn about unmatched high-part relocations since some
11765 versions of gcc have been known to emit dead "lui ...%hi(...)"
11766 instructions. */
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;
11774 *lo_pos = l->fixp;
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))
11787 return 1;
11789 if (HAVE_NEWABI
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))
11794 return 1;
11796 return 0;
11799 /* Apply a fixup to the object file. */
11801 void
11802 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11804 bfd_byte *buf;
11805 long insn;
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);
11810 if (! howto)
11811 return;
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
11827 reasons for this:
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)
11837 fixP->fx_done = 1;
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);
11851 /* fall through */
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. */
11885 break;
11887 case BFD_RELOC_64:
11888 /* This is handled like BFD_RELOC_32, but we output a sign
11889 extended value if we are only 32 bits. */
11890 if (fixP->fx_done)
11892 if (8 <= sizeof (valueT))
11893 md_number_to_chars ((char *) buf, *valP, 8);
11894 else
11896 valueT hiv;
11898 if ((*valP & 0x80000000) != 0)
11899 hiv = 0xffffffff;
11900 else
11901 hiv = 0;
11902 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11903 *valP, 4);
11904 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11905 hiv, 4);
11908 break;
11910 case BFD_RELOC_RVA:
11911 case BFD_RELOC_32:
11912 case BFD_RELOC_16:
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. */
11916 if (fixP->fx_done)
11917 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
11918 break;
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. */
11926 if (fixP->fx_done)
11928 if (*valP + 0x8000 > 0xffff)
11929 as_bad_where (fixP->fx_file, fixP->fx_line,
11930 _("relocation overflow"));
11931 if (target_big_endian)
11932 buf += 2;
11933 md_number_to_chars ((char *) buf, *valP, 2);
11935 break;
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)
11946 break;
11948 /* Update old instruction data. */
11949 if (target_big_endian)
11950 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11951 else
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
11960 && fixP->fx_done
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 */
11973 else
11974 insn = 0x08000000; /* j */
11975 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11976 fixP->fx_done = 0;
11977 fixP->fx_addsy = section_symbol (text_section);
11978 *valP += md_pcrel_from (fixP);
11979 md_number_to_chars ((char *) buf, insn, 4);
11981 else
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"));
11989 break;
11991 case BFD_RELOC_VTABLE_INHERIT:
11992 fixP->fx_done = 0;
11993 if (fixP->fx_addsy
11994 && !S_IS_DEFINED (fixP->fx_addsy)
11995 && !S_IS_WEAK (fixP->fx_addsy))
11996 S_SET_WEAK (fixP->fx_addsy);
11997 break;
11999 case BFD_RELOC_VTABLE_ENTRY:
12000 fixP->fx_done = 0;
12001 break;
12003 default:
12004 internalError ();
12007 /* Remember value for tc_gen_reloc. */
12008 fixP->fx_addnumber = *valP;
12011 static symbolS *
12012 get_symbol (void)
12014 int c;
12015 char *name;
12016 symbolS *p;
12018 name = input_line_pointer;
12019 c = get_symbol_end ();
12020 p = (symbolS *) symbol_find_or_make (name);
12021 *input_line_pointer = c;
12022 return p;
12025 /* Align the current frag to a given power of two. The MIPS assembler
12026 also automatically adjusts any preceding label. */
12028 static void
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);
12034 if (label != NULL)
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. */
12045 static void
12046 s_align (int x ATTRIBUTE_UNUSED)
12048 int temp;
12049 long temp_fill;
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.
12058 We don't. */
12060 temp = get_absolute_expression ();
12061 if (temp > max_alignment)
12062 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12063 else if (temp < 0)
12065 as_warn (_("Alignment negative: 0 assumed."));
12066 temp = 0;
12068 if (*input_line_pointer == ',')
12070 ++input_line_pointer;
12071 temp_fill = get_absolute_expression ();
12073 else
12074 temp_fill = 0;
12075 if (temp)
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. */
12080 auto_align = 1;
12081 mips_align (temp, (int) temp_fill, l != NULL ? l->label : NULL);
12083 else
12085 auto_align = 0;
12088 demand_empty_rest_of_line ();
12091 static void
12092 s_change_sec (int sec)
12094 segT seg;
12096 #ifdef OBJ_ELF
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. */
12103 if (IS_ELF)
12104 obj_elf_section_change_hook ();
12105 #endif
12107 mips_emit_delays ();
12108 switch (sec)
12110 case 't':
12111 s_text (0);
12112 break;
12113 case 'd':
12114 s_data (0);
12115 break;
12116 case 'b':
12117 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12118 demand_empty_rest_of_line ();
12119 break;
12121 case 'r':
12122 seg = subseg_new (RDATA_SECTION_NAME,
12123 (subsegT) get_absolute_expression ());
12124 if (IS_ELF)
12126 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12127 | SEC_READONLY | SEC_RELOC
12128 | SEC_DATA));
12129 if (strcmp (TARGET_OS, "elf") != 0)
12130 record_alignment (seg, 4);
12132 demand_empty_rest_of_line ();
12133 break;
12135 case 's':
12136 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12137 if (IS_ELF)
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 ();
12145 break;
12148 auto_align = 1;
12151 void
12152 s_change_section (int ignore ATTRIBUTE_UNUSED)
12154 #ifdef OBJ_ELF
12155 char *section_name;
12156 char c;
12157 char next_c = 0;
12158 int section_type;
12159 int section_flag;
12160 int section_entry_size;
12161 int section_alignment;
12163 if (!IS_ELF)
12164 return;
12166 section_name = input_line_pointer;
12167 c = get_symbol_end ();
12168 if (c)
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);
12178 return;
12180 input_line_pointer++;
12182 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12183 if (c == ',')
12184 section_type = get_absolute_expression ();
12185 else
12186 section_type = 0;
12187 if (*input_line_pointer++ == ',')
12188 section_flag = get_absolute_expression ();
12189 else
12190 section_flag = 0;
12191 if (*input_line_pointer++ == ',')
12192 section_entry_size = get_absolute_expression ();
12193 else
12194 section_entry_size = 0;
12195 if (*input_line_pointer++ == ',')
12196 section_alignment = get_absolute_expression ();
12197 else
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 */
12226 void
12227 mips_enable_auto_align (void)
12229 auto_align = 1;
12232 static 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;
12237 symbolS *label;
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);
12247 static void
12248 s_float_cons (int type)
12250 segment_info_type *si = seg_info (now_seg);
12251 struct insn_label_list *l = si->label_list;
12252 symbolS *label;
12254 label = l != NULL ? l->label : NULL;
12256 mips_emit_delays ();
12258 if (auto_align)
12260 if (type == 'd')
12261 mips_align (3, 0, label);
12262 else
12263 mips_align (2, 0, label);
12266 mips_clear_insn_labels ();
12268 float_cons (type);
12271 /* Handle .globl. We need to override it because on Irix 5 you are
12272 permitted to say
12273 .globl foo .text
12274 where foo is an undefined symbol, to mean that foo should be
12275 considered to be the address of a function. */
12277 static void
12278 s_mips_globl (int x ATTRIBUTE_UNUSED)
12280 char *name;
12281 int c;
12282 symbolS *symbolP;
12283 flagword flag;
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. */
12297 flag = BSF_OBJECT;
12299 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12300 && (*input_line_pointer != ','))
12302 char *secname;
12303 asection *sec;
12305 secname = input_line_pointer;
12306 c = get_symbol_end ();
12307 sec = bfd_get_section_by_name (stdoutput, secname);
12308 if (sec == NULL)
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;
12319 if (c == ',')
12321 input_line_pointer++;
12322 SKIP_WHITESPACE ();
12323 if (is_end_of_line[(unsigned char) *input_line_pointer])
12324 c = '\n';
12327 while (c == ',');
12329 demand_empty_rest_of_line ();
12332 static void
12333 s_option (int x ATTRIBUTE_UNUSED)
12335 char *opt;
12336 char c;
12338 opt = input_line_pointer;
12339 c = get_symbol_end ();
12341 if (*opt == 'O')
12343 /* FIXME: What does this mean? */
12345 else if (strncmp (opt, "pic", 3) == 0)
12347 int i;
12349 i = atoi (opt + 3);
12350 if (i == 0)
12351 mips_pic = NO_PIC;
12352 else if (i == 2)
12354 mips_pic = SVR4_PIC;
12355 mips_abicalls = TRUE;
12357 else
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);
12368 else
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. */
12387 static void
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)
12400 end_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)
12523 int reset = 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)
12529 reset = 1;
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);
12538 if (!p)
12539 as_bad (_("unknown architecture %s"), name + 5);
12540 else
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);
12551 if (!p)
12552 as_bad (_("unknown ISA level %s"), name + 4);
12553 else
12555 mips_opts.arch = p->cpu;
12556 mips_opts.isa = p->isa;
12559 else
12560 as_bad (_("unknown ISA or architecture %s"), name);
12562 switch (mips_opts.isa)
12564 case 0:
12565 break;
12566 case ISA_MIPS1:
12567 case ISA_MIPS2:
12568 case ISA_MIPS32:
12569 case ISA_MIPS32R2:
12570 mips_opts.gp32 = 1;
12571 mips_opts.fp32 = 1;
12572 break;
12573 case ISA_MIPS3:
12574 case ISA_MIPS4:
12575 case ISA_MIPS5:
12576 case ISA_MIPS64:
12577 case ISA_MIPS64R2:
12578 mips_opts.gp32 = 0;
12579 mips_opts.fp32 = 0;
12580 break;
12581 default:
12582 as_bad (_("unknown ISA level %s"), name + 4);
12583 break;
12585 if (reset)
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;
12609 if (s == NULL)
12610 as_bad (_(".set pop with no .set push"));
12611 else
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)
12618 end_noreorder ();
12620 mips_opts = s->options;
12621 mips_opts_stack = s->next;
12622 free (s);
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;
12634 s_set (0);
12635 return;
12637 else
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. */
12648 static void
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. */
12680 static void
12681 s_cpload (int ignore ATTRIBUTE_UNUSED)
12683 expressionS ex;
12684 int reg;
12685 int in_shared;
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)
12691 s_ignore (0);
12692 return;
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" :
12707 "__gnu_local_gp");
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;
12714 macro_start ();
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);
12718 if (in_shared)
12719 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12720 mips_gp_register, reg);
12721 macro_end ();
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
12743 lui $gp,%hi(_gp)
12744 addiu $gp,$gp,%lo(_gp) */
12746 static void
12747 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12749 expressionS ex_off;
12750 expressionS ex_sym;
12751 int reg1;
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)
12757 s_ignore (0);
12758 return;
12761 reg1 = tc_get_register (0);
12762 SKIP_WHITESPACE ();
12763 if (*input_line_pointer != ',')
12765 as_bad (_("missing argument separator ',' for .cpsetup"));
12766 return;
12768 else
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;
12776 else
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"));
12785 return;
12787 else
12788 ++input_line_pointer;
12789 SKIP_WHITESPACE ();
12790 expression (&ex_sym);
12792 macro_start ();
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);
12803 else
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,
12811 BFD_RELOC_HI16_S);
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);
12820 else
12822 expressionS ex;
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);
12837 macro_end ();
12839 demand_empty_rest_of_line ();
12842 static void
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)
12849 s_ignore (0);
12850 return;
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. */
12861 static void
12862 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12864 expressionS ex;
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)
12870 s_ignore (0);
12871 return;
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;
12882 macro_start ();
12883 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12884 SP, HAVE_64BIT_ADDRESSES);
12885 macro_end ();
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 */
12897 static void
12898 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12900 expressionS ex;
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)
12906 s_ignore (0);
12907 return;
12910 macro_start ();
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);
12920 else
12921 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12922 mips_cpreturn_register, 0);
12923 macro_end ();
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. */
12932 static void
12933 s_dtprel_internal (size_t bytes)
12935 expressionS ex;
12936 char *p;
12938 expression (&ex);
12940 if (ex.X_op != O_symbol)
12942 as_bad (_("Unsupported use of %s"), (bytes == 8
12943 ? ".dtpreldword"
12944 : ".dtprelword"));
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,
12951 (bytes == 8
12952 ? BFD_RELOC_MIPS_TLS_DTPREL64
12953 : BFD_RELOC_MIPS_TLS_DTPREL32));
12955 demand_empty_rest_of_line ();
12958 /* Handle .dtprelword. */
12960 static void
12961 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
12963 s_dtprel_internal (4);
12966 /* Handle .dtpreldword. */
12968 static void
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. */
12977 static void
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)
12984 s_ignore (0);
12985 return;
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. */
12996 static void
12997 s_gpword (int ignore ATTRIBUTE_UNUSED)
12999 segment_info_type *si;
13000 struct insn_label_list *l;
13001 symbolS *label;
13002 expressionS ex;
13003 char *p;
13005 /* When not generating PIC code, this is treated as .word. */
13006 if (mips_pic != SVR4_PIC)
13008 s_cons (2);
13009 return;
13012 si = seg_info (now_seg);
13013 l = si->label_list;
13014 label = l != NULL ? l->label : NULL;
13015 mips_emit_delays ();
13016 if (auto_align)
13017 mips_align (2, 0, label);
13018 mips_clear_insn_labels ();
13020 expression (&ex);
13022 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13024 as_bad (_("Unsupported use of .gpword"));
13025 ignore_rest_of_line ();
13028 p = frag_more (4);
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 ();
13036 static void
13037 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13039 segment_info_type *si;
13040 struct insn_label_list *l;
13041 symbolS *label;
13042 expressionS ex;
13043 char *p;
13045 /* When not generating PIC code, this is treated as .dword. */
13046 if (mips_pic != SVR4_PIC)
13048 s_cons (3);
13049 return;
13052 si = seg_info (now_seg);
13053 l = si->label_list;
13054 label = l != NULL ? l->label : NULL;
13055 mips_emit_delays ();
13056 if (auto_align)
13057 mips_align (3, 0, label);
13058 mips_clear_insn_labels ();
13060 expression (&ex);
13062 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13064 as_bad (_("Unsupported use of .gpdword"));
13065 ignore_rest_of_line ();
13068 p = frag_more (8);
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. */
13083 static void
13084 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13086 int reg;
13088 /* This is ignored when not generating SVR4 PIC code. */
13089 if (mips_pic != SVR4_PIC)
13091 s_ignore (0);
13092 return;
13095 /* Add $gp to the register named as an argument. */
13096 macro_start ();
13097 reg = tc_get_register (0);
13098 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13099 macro_end ();
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
13111 again. */
13113 static void
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. */
13127 static void
13128 s_mips_stab (int type)
13130 if (type == 'n')
13131 mips16_mark_labels ();
13133 s_stab (type);
13136 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13138 static void
13139 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13141 char *name;
13142 int c;
13143 symbolS *symbolP;
13144 expressionS exp;
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 ();
13161 return;
13164 if (*input_line_pointer == ',')
13166 ++input_line_pointer;
13167 SKIP_WHITESPACE ();
13170 expression (&exp);
13171 if (exp.X_op != O_symbol)
13173 as_bad ("bad .weakext directive");
13174 ignore_rest_of_line ();
13175 return;
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)
13190 unsigned int reg;
13192 SKIP_WHITESPACE ();
13193 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13194 reg = 0;
13195 if (frame)
13197 mips_frame_reg = reg != 0 ? reg : SP;
13198 mips_frame_reg_valid = 1;
13199 mips_cprestore_valid = 0;
13201 return reg;
13204 valueT
13205 md_section_align (asection *seg, valueT addr)
13207 int align = bfd_get_section_alignment (stdoutput, seg);
13209 if (IS_ELF)
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)
13216 return addr;
13217 if (align > 4)
13218 align = 4;
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.) */
13229 static int
13230 nopic_need_relax (symbolS *sym, int before_relaxing)
13232 if (sym == 0)
13233 return 0;
13235 if (g_switch_value > 0)
13237 const char *symname;
13238 int change;
13240 /* Find out whether this symbol can be referenced off the $gp
13241 register. It can be if it is smaller than the -G size or if
13242 it is in the .sdata or .sbss section. Certain symbols can
13243 not be referenced off the $gp, although it appears as though
13244 they can. */
13245 symname = S_GET_NAME (sym);
13246 if (symname != (const char *) NULL
13247 && (strcmp (symname, "eprol") == 0
13248 || strcmp (symname, "etext") == 0
13249 || strcmp (symname, "_gp") == 0
13250 || strcmp (symname, "edata") == 0
13251 || strcmp (symname, "_fbss") == 0
13252 || strcmp (symname, "_fdata") == 0
13253 || strcmp (symname, "_ftext") == 0
13254 || strcmp (symname, "end") == 0
13255 || strcmp (symname, "_gp_disp") == 0))
13256 change = 1;
13257 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13258 && (0
13259 #ifndef NO_ECOFF_DEBUGGING
13260 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13261 && (symbol_get_obj (sym)->ecoff_extern_size
13262 <= g_switch_value))
13263 #endif
13264 /* We must defer this decision until after the whole
13265 file has been read, since there might be a .extern
13266 after the first use of this symbol. */
13267 || (before_relaxing
13268 #ifndef NO_ECOFF_DEBUGGING
13269 && symbol_get_obj (sym)->ecoff_extern_size == 0
13270 #endif
13271 && S_GET_VALUE (sym) == 0)
13272 || (S_GET_VALUE (sym) != 0
13273 && S_GET_VALUE (sym) <= g_switch_value)))
13274 change = 0;
13275 else
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);
13289 return change;
13291 else
13292 /* We are not optimizing for the $gp register. */
13293 return 1;
13297 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13299 static bfd_boolean
13300 pic_need_relax (symbolS *sym, asection *segtype)
13302 asection *symsec;
13304 /* Handle the case of a symbol equated to another symbol. */
13305 while (symbol_equated_reloc_p (sym))
13307 symbolS *n;
13309 /* It's possible to get a loop here in a badly written program. */
13310 n = symbol_get_value_expression (sym)->X_add_symbol;
13311 if (n == sym)
13312 break;
13313 sym = n;
13316 if (symbol_section_p (sym))
13317 return TRUE;
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)
13326 #ifdef OBJ_ELF
13327 /* A global or weak symbol is treated as external. */
13328 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13329 #endif
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. */
13337 static int
13338 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13340 int type;
13341 const struct mips16_immed_operand *op;
13342 offsetT val;
13343 int mintiny, maxtiny;
13344 segT symsec;
13345 fragS *sym_frag;
13347 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13348 return 0;
13349 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13350 return 1;
13352 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13353 op = mips16_immed_operands;
13354 while (op->type != type)
13356 ++op;
13357 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13360 if (op->unsp)
13362 if (type == '<' || type == '>' || type == '[' || type == ']')
13364 mintiny = 1;
13365 maxtiny = 1 << op->nbits;
13367 else
13369 mintiny = 0;
13370 maxtiny = (1 << op->nbits) - 1;
13373 else
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);
13383 if (op->pcrel)
13385 addressT addr;
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. */
13393 if (sec == NULL)
13395 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13396 return 1;
13398 else
13400 /* Must have been called from md_estimate_size_before_relax. */
13401 if (symsec != sec)
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"));
13411 return 1;
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. */
13418 return 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. */
13427 if (stretch != 0
13428 && sym_frag->relax_marker != fragp->relax_marker)
13430 fragS *f;
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
13437 alignment. */
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)
13442 if (stretch < 0)
13443 stretch = - ((- stretch)
13444 & ~ ((1 << (int) f->fr_offset) - 1));
13445 else
13446 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13447 if (stretch == 0)
13448 break;
13451 if (f != NULL)
13452 val += stretch;
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')
13464 addr += 2;
13466 /* If we are currently assuming that this frag should be
13467 extended, then, the current address is two bytes
13468 higher. */
13469 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13470 addr += 2;
13472 /* Ignore the low bit in the target, since it will be set
13473 for a text label. */
13474 if ((val & 1) != 0)
13475 --val;
13477 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13478 addr -= 4;
13479 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13480 addr -= 2;
13482 val -= addr & ~ ((1 << op->shift) - 1);
13484 /* Branch offsets have an implicit 0 in the lowest bit. */
13485 if (type == 'p' || type == 'q')
13486 val /= 2;
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);
13497 return 1;
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:
13503 la $4,foo
13504 .skip 1020
13505 .align 2
13506 foo:
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)
13514 && sec == NULL)
13516 fragp->fr_subtype =
13517 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13518 return 1;
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))
13527 return 1;
13528 else
13529 return 0;
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. */
13537 static int
13538 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13540 bfd_boolean toofar;
13541 int length;
13543 if (fragp
13544 && S_IS_DEFINED (fragp->fr_symbol)
13545 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13547 addressT addr;
13548 offsetT val;
13550 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13552 addr = fragp->fr_address + fragp->fr_fix + 4;
13554 val -= addr;
13556 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13558 else if (fragp)
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
13561 branch. */
13562 toofar = FALSE;
13563 else
13564 toofar = TRUE;
13566 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13567 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),
13571 toofar);
13573 length = 4;
13574 if (toofar)
13576 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13577 length += 8;
13579 if (mips_pic != NO_PIC)
13581 /* Additional space for PIC loading of target address. */
13582 length += 8;
13583 if (mips_opts.isa == ISA_MIPS1)
13584 /* Additional space for $at-stabilizing nop. */
13585 length += 4;
13588 /* If branch is conditional. */
13589 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13590 length += 8;
13593 return length;
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)
13604 int change;
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. */
13625 change = 0;
13626 else
13627 abort ();
13629 if (change)
13631 fragp->fr_subtype |= RELAX_USE_SECOND;
13632 return -RELAX_FIRST (fragp->fr_subtype);
13634 else
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)
13646 return 0;
13648 if (fixp->fx_addsy == NULL)
13649 return 1;
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
13658 the merge data.
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)
13670 return 0;
13672 #ifdef OBJ_ELF
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
13686 symbols.
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
13692 symbols.
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. */
13713 if (IS_ELF
13714 && fixp->fx_subsy == NULL
13715 && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13716 || *symbol_get_tc (fixp->fx_addsy)))
13717 return 0;
13718 #endif
13720 return 1;
13723 /* Translate internal representation of relocation info to BFD target
13724 format. */
13726 arelent **
13727 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13729 static arelent *retval[4];
13730 arelent *reloc;
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;
13746 if (!IS_ELF)
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;
13755 else
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;
13763 reloc->addend = 0;
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));
13774 retval[0] = NULL;
13777 return retval;
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))
13796 return 0;
13798 if (mips16_extended_frag (fragp, NULL, stretch))
13800 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13801 return 0;
13802 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13803 return 2;
13805 else
13807 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13808 return 0;
13809 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13810 return -2;
13813 return 0;
13816 /* Convert a machine dependent frag. */
13818 void
13819 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13821 if (RELAX_BRANCH_P (fragp->fr_subtype))
13823 bfd_byte *buf;
13824 unsigned long insn;
13825 expressionS exp;
13826 fixS *fixp;
13828 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13830 if (target_big_endian)
13831 insn = bfd_getb32 (buf);
13832 else
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);
13850 buf += 4;
13852 else
13854 int i;
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))
13860 goto uncond;
13862 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13864 /* Reverse the branch. */
13865 switch ((insn >> 28) & 0xf)
13867 case 4:
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;
13873 break;
13875 case 0:
13876 /* bltz 0x04000000 bgez 0x04010000
13877 bltzal 0x04100000 bgezal 0x04110000 */
13878 assert ((insn & 0xfc0e0000) == 0x04000000);
13879 insn ^= 0x00010000;
13880 break;
13882 case 1:
13883 /* beq 0x10000000 bne 0x14000000
13884 blez 0x18000000 bgtz 0x1c000000 */
13885 insn ^= 0x04000000;
13886 break;
13888 default:
13889 abort ();
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))
13907 i = 16;
13908 else
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. */
13916 i >>= 2;
13917 /* Branch counts from the next instruction. */
13918 i--;
13919 insn |= i;
13920 /* Branch over the jump. */
13921 md_number_to_chars ((char *) buf, insn, 4);
13922 buf += 4;
13924 /* nop */
13925 md_number_to_chars ((char *) buf, 0, 4);
13926 buf += 4;
13928 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13930 /* beql $0, $0, 2f */
13931 insn = 0x50000000;
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. */
13939 i >>= 2;
13940 /* Don't decrement i, because we want to branch over the
13941 delay slot. */
13943 insn |= i;
13944 md_number_to_chars ((char *) buf, insn, 4);
13945 buf += 4;
13947 md_number_to_chars ((char *) buf, 0, 4);
13948 buf += 4;
13951 uncond:
13952 if (mips_pic == NO_PIC)
13954 /* j or jal. */
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);
13967 buf += 4;
13969 else
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);
13989 buf += 4;
13991 if (mips_opts.isa == ISA_MIPS1)
13993 /* nop */
13994 md_number_to_chars ((char *) buf, 0, 4);
13995 buf += 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);
14007 buf += 4;
14009 /* j(al)r $at. */
14010 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14011 insn = 0x0020f809;
14012 else
14013 insn = 0x00200008;
14015 md_number_to_chars ((char *) buf, insn, 4);
14016 buf += 4;
14020 assert (buf == (bfd_byte *)fragp->fr_literal
14021 + fragp->fr_fix + fragp->fr_var);
14023 fragp->fr_fix += fragp->fr_var;
14025 return;
14028 if (RELAX_MIPS16_P (fragp->fr_subtype))
14030 int type;
14031 const struct mips16_immed_operand *op;
14032 bfd_boolean small, ext;
14033 offsetT val;
14034 bfd_byte *buf;
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)
14042 ++op;
14044 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14046 small = FALSE;
14047 ext = TRUE;
14049 else
14051 small = TRUE;
14052 ext = FALSE;
14055 resolve_symbol_value (fragp->fr_symbol);
14056 val = S_GET_VALUE (fragp->fr_symbol);
14057 if (op->pcrel)
14059 addressT addr;
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')
14067 addr += 2;
14068 if (ext)
14069 addr += 2;
14070 /* Ignore the low bit in the target, since it will be
14071 set for a text label. */
14072 if ((val & 1) != 0)
14073 --val;
14075 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14076 addr -= 4;
14077 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14078 addr -= 2;
14080 addr &= ~ (addressT) ((1 << op->shift) - 1);
14081 val -= addr;
14083 /* Make sure the section winds up with the alignment we have
14084 assumed. */
14085 if (op->shift > 0)
14086 record_alignment (asec, op->shift);
14089 if (ext
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);
14099 else
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);
14106 if (use_extend)
14108 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14109 fragp->fr_fix += 2;
14110 buf += 2;
14113 md_number_to_chars ((char *) buf, insn, 2);
14114 fragp->fr_fix += 2;
14115 buf += 2;
14117 else
14119 int first, second;
14120 fixS *fixp;
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);
14131 if (msg != 0)
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. */
14138 while (fixp
14139 && fixp->fx_frag == fragp
14140 && fixp->fx_where < fragp->fr_fix - second)
14142 if (fragp->fr_subtype & RELAX_USE_SECOND)
14143 fixp->fx_done = 1;
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;
14154 else
14155 fixp->fx_done = 1;
14156 fixp = fixp->fx_next;
14159 /* Now modify the frag contents. */
14160 if (fragp->fr_subtype & RELAX_USE_SECOND)
14162 char *start;
14164 start = fragp->fr_literal + fragp->fr_fix - first - second;
14165 memmove (start, start + first, second);
14166 fragp->fr_fix -= first;
14168 else
14169 fragp->fr_fix -= second;
14173 #ifdef OBJ_ELF
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. */
14179 void
14180 mips_frob_file_after_relocs (void)
14182 asymbol **syms;
14183 unsigned int count, i;
14185 if (!IS_ELF)
14186 return;
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;
14204 #endif
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. */
14210 void
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);
14218 else
14220 l = free_insn_labels;
14221 free_insn_labels = l->next;
14224 l->label = sym;
14225 l->next = si->label_list;
14226 si->label_list = l;
14228 #ifdef OBJ_ELF
14229 dwarf2_emit_label (sym);
14230 #endif
14233 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14235 /* Some special processing for a MIPS ELF file. */
14237 void
14238 mips_elf_final_processing (void)
14240 /* Write out the register information. */
14241 if (mips_abi != N64_ABI)
14243 Elf32_RegInfo s;
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));
14256 else
14258 Elf64_Internal_RegInfo s;
14260 s.ri_gprmask = mips_gprmask;
14261 s.ri_pad = 0;
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;
14282 if (mips_abicalls)
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 |= ???;
14296 #endif
14297 if (file_ase_mdmx)
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;
14309 else
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 |= ???;
14324 #endif
14327 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14329 typedef struct proc {
14330 symbolS *func_sym;
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;
14339 } procS;
14341 static procS cur_proc;
14342 static procS *cur_proc_ptr;
14343 static int numprocs;
14345 /* Fill in an rs_align_code fragment. */
14347 void
14348 mips_handle_align (fragS *fragp)
14350 if (fragp->fr_type != rs_align_code)
14351 return;
14353 if (mips_opts.mips16)
14355 static const unsigned char be_nop[] = { 0x65, 0x00 };
14356 static const unsigned char le_nop[] = { 0x00, 0x65 };
14358 int bytes;
14359 char *p;
14361 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14362 p = fragp->fr_literal + fragp->fr_fix;
14364 if (bytes & 1)
14366 *p++ = 0;
14367 fragp->fr_fix++;
14370 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14371 fragp->fr_var = 2;
14374 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
14377 static void
14378 md_obj_begin (void)
14382 static void
14383 md_obj_end (void)
14385 /* Check for premature end, nesting errors, etc. */
14386 if (cur_proc_ptr)
14387 as_warn (_("missing .end at end of assembly"));
14390 static long
14391 get_number (void)
14393 int negative = 0;
14394 long val = 0;
14396 if (*input_line_pointer == '-')
14398 ++input_line_pointer;
14399 negative = 1;
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))
14410 val <<= 4;
14411 val |= hex_value (*input_line_pointer++);
14413 return negative ? -val : val;
14415 else
14417 ++input_line_pointer;
14418 while (ISDIGIT (*input_line_pointer))
14420 val <<= 3;
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"));
14431 return -1;
14433 while (ISDIGIT (*input_line_pointer))
14435 val *= 10;
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. */
14445 static void
14446 s_mips_file (int x ATTRIBUTE_UNUSED)
14448 static int first_file_directive = 0;
14450 if (ECOFF_DEBUGGING)
14452 get_number ();
14453 s_app_file (0);
14455 else
14457 char *filename;
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. */
14476 static void
14477 s_mips_loc (int x ATTRIBUTE_UNUSED)
14479 if (!ECOFF_DEBUGGING)
14480 dwarf2_directive_loc (0);
14483 /* The .end directive. */
14485 static void
14486 s_mips_end (int x ATTRIBUTE_UNUSED)
14488 symbolS *p;
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])
14496 p = get_symbol ();
14497 demand_empty_rest_of_line ();
14499 else
14500 p = NULL;
14502 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14503 as_warn (_(".end not in text section"));
14505 if (!cur_proc_ptr)
14507 as_warn (_(".end directive without a preceding .ent directive."));
14508 demand_empty_rest_of_line ();
14509 return;
14512 if (p != NULL)
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),
14520 S_GET_NAME (p));
14522 else
14523 as_warn (_(".end directive missing or unknown symbol"));
14525 #ifdef OBJ_ELF
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));
14532 obj->size = exp;
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;
14546 valueT dot;
14547 expressionS exp;
14548 char *fragp;
14550 dot = frag_now_fix ();
14552 #ifdef md_flush_pending_output
14553 md_flush_pending_output ();
14554 #endif
14556 assert (pdr_seg);
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. */
14584 static void
14585 s_mips_ent (int aent)
14587 symbolS *symbolP;
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 == '-')
14595 get_number ();
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"));
14603 if (!aent)
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;
14616 ++numprocs;
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). */
14632 static void
14633 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14635 #ifdef OBJ_ELF
14636 if (IS_ELF && !ECOFF_DEBUGGING)
14638 long val;
14640 if (cur_proc_ptr == (procS *) NULL)
14642 as_warn (_(".frame outside of .ent"));
14643 demand_empty_rest_of_line ();
14644 return;
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 ();
14656 return;
14659 cur_proc_ptr->frame_offset = val;
14660 cur_proc_ptr->pc_reg = tc_get_register (0);
14662 demand_empty_rest_of_line ();
14664 else
14665 #endif /* OBJ_ELF */
14666 s_ignore (ignore);
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). */
14675 static void
14676 s_mips_mask (int reg_type)
14678 #ifdef OBJ_ELF
14679 if (IS_ELF && !ECOFF_DEBUGGING)
14681 long mask, off;
14683 if (cur_proc_ptr == (procS *) NULL)
14685 as_warn (_(".mask/.fmask outside of .ent"));
14686 demand_empty_rest_of_line ();
14687 return;
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 ();
14695 return;
14698 off = get_absolute_expression ();
14700 if (reg_type == 'F')
14702 cur_proc_ptr->fpreg_mask = mask;
14703 cur_proc_ptr->fpreg_offset = off;
14705 else
14707 cur_proc_ptr->reg_mask = mask;
14708 cur_proc_ptr->reg_offset = off;
14711 demand_empty_rest_of_line ();
14713 else
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 },
14736 /* MIPS I */
14737 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14738 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14739 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14741 /* MIPS II */
14742 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14744 /* MIPS III */
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 },
14758 /* MIPS IV */
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 },
14773 /* MIPS 32 */
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 },
14832 /* MIPS 64 */
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 },
14847 /* End marker */
14848 { NULL, 0, 0, 0 }
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. */
14857 static bfd_boolean
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. */
14873 static bfd_boolean
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))
14879 return TRUE;
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')
14884 given++;
14885 if (!ISDIGIT (*given))
14886 return FALSE;
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')
14891 canonical += 2;
14892 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14893 canonical += 2;
14894 else if (TOLOWER (canonical[0]) == 'r')
14895 canonical += 1;
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
14935 ? ISA_MIPS3
14936 : ISA_MIPS1);
14939 /* 'default' has traditionally been a no-op. Probably not very useful. */
14940 if (strcasecmp (cpu_string, "default") == 0)
14941 return 0;
14943 for (p = mips_cpu_info_table; p->name != 0; p++)
14944 if (mips_matching_cpu_name_p (p->name, cpu_string))
14945 return p;
14947 as_bad ("Bad value (%s) for %s", cpu_string, option);
14948 return 0;
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)
14957 int i;
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]);
14964 return NULL;
14967 static const struct mips_cpu_info *
14968 mips_cpu_info_from_arch (int arch)
14970 int i;
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]);
14976 return NULL;
14979 static void
14980 show (FILE *stream, const char *string, int *col_p, int *first_p)
14982 if (*first_p)
14984 fprintf (stream, "%24s", "");
14985 *col_p = 24;
14987 else
14989 fprintf (stream, ", ");
14990 *col_p += 2;
14993 if (*col_p + strlen (string) > 72)
14995 fprintf (stream, "\n%24s", "");
14996 *col_p = 24;
14999 fprintf (stream, "%s", string);
15000 *col_p += strlen (string);
15002 *first_p = 0;
15005 void
15006 md_show_usage (FILE *stream)
15008 int column, first;
15009 size_t i;
15011 fprintf (stream, _("\
15012 MIPS options:\n\
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"));
15030 first = 1;
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"));
15042 first = 1;
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"));
15076 #ifdef OBJ_ELF
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"));
15087 first = 1;
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"));
15101 #endif
15104 enum dwarf2_format
15105 mips_dwarf2_format (void)
15107 if (HAVE_64BIT_SYMBOLS)
15109 #ifdef TE_IRIX
15110 return dwarf2_format_64bit_irix;
15111 #else
15112 return dwarf2_format_64bit;
15113 #endif
15115 else
15116 return dwarf2_format_32bit;
15120 mips_dwarf2_addr_size (void)
15122 if (HAVE_64BIT_SYMBOLS)
15123 return 8;
15124 else
15125 return 4;
15128 /* Standard calling conventions leave the CFA at SP on entry. */
15129 void
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;
15139 unsigned int reg;
15141 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15142 regnum = reg;
15144 return regnum;