2008-04-23 Mike Frysinger <vapier@gentoo.org>
[binutils.git] / gas / config / tc-mips.c
blobf089345456f944f6f8ff402bb1851c1066168955
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, 2008 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 ATREG 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 #define AT mips_opts.at
106 /* Allow override of standard little-endian ECOFF format. */
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
112 extern int target_big_endian;
114 /* The name of the readonly data section. */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116 ? ".rdata" \
117 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118 ? ".rdata" \
119 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120 ? ".rodata" \
121 : (abort (), ""))
123 /* Information about an instruction, including its format, operands
124 and fixups. */
125 struct mips_cl_insn
127 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
128 const struct mips_opcode *insn_mo;
130 /* True if this is a mips16 instruction and if we want the extended
131 form of INSN_MO. */
132 bfd_boolean use_extend;
134 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
135 unsigned short extend;
137 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
138 a copy of INSN_MO->match with the operands filled in. */
139 unsigned long insn_opcode;
141 /* The frag that contains the instruction. */
142 struct frag *frag;
144 /* The offset into FRAG of the first instruction byte. */
145 long where;
147 /* The relocs associated with the instruction, if any. */
148 fixS *fixp[3];
150 /* True if this entry cannot be moved from its current position. */
151 unsigned int fixed_p : 1;
153 /* True if this instruction occurred in a .set noreorder block. */
154 unsigned int noreorder_p : 1;
156 /* True for mips16 instructions that jump to an absolute address. */
157 unsigned int mips16_absolute_jump_p : 1;
160 /* The ABI to use. */
161 enum mips_abi_level
163 NO_ABI = 0,
164 O32_ABI,
165 O64_ABI,
166 N32_ABI,
167 N64_ABI,
168 EABI_ABI
171 /* MIPS ABI we are using for this output file. */
172 static enum mips_abi_level mips_abi = NO_ABI;
174 /* Whether or not we have code that can call pic code. */
175 int mips_abicalls = FALSE;
177 /* Whether or not we have code which can be put into a shared
178 library. */
179 static bfd_boolean mips_in_shared = TRUE;
181 /* This is the set of options which may be modified by the .set
182 pseudo-op. We use a struct so that .set push and .set pop are more
183 reliable. */
185 struct mips_set_options
187 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
188 if it has not been initialized. Changed by `.set mipsN', and the
189 -mipsN command line option, and the default CPU. */
190 int isa;
191 /* Enabled Application Specific Extensions (ASEs). These are set to -1
192 if they have not been initialized. Changed by `.set <asename>', by
193 command line options, and based on the default architecture. */
194 int ase_mips3d;
195 int ase_mdmx;
196 int ase_smartmips;
197 int ase_dsp;
198 int ase_dspr2;
199 int ase_mt;
200 /* Whether we are assembling for the mips16 processor. 0 if we are
201 not, 1 if we are, and -1 if the value has not been initialized.
202 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203 -nomips16 command line options, and the default CPU. */
204 int mips16;
205 /* Non-zero if we should not reorder instructions. Changed by `.set
206 reorder' and `.set noreorder'. */
207 int noreorder;
208 /* Non-zero if we should not permit the register designated "assembler
209 temporary" to be used in instructions. The value is the register
210 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
211 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
212 unsigned int at;
213 /* Non-zero if we should warn when a macro instruction expands into
214 more than one machine instruction. Changed by `.set nomacro' and
215 `.set macro'. */
216 int warn_about_macros;
217 /* Non-zero if we should not move instructions. Changed by `.set
218 move', `.set volatile', `.set nomove', and `.set novolatile'. */
219 int nomove;
220 /* Non-zero if we should not optimize branches by moving the target
221 of the branch into the delay slot. Actually, we don't perform
222 this optimization anyhow. Changed by `.set bopt' and `.set
223 nobopt'. */
224 int nobopt;
225 /* Non-zero if we should not autoextend mips16 instructions.
226 Changed by `.set autoextend' and `.set noautoextend'. */
227 int noautoextend;
228 /* Restrict general purpose registers and floating point registers
229 to 32 bit. This is initially determined when -mgp32 or -mfp32
230 is passed but can changed if the assembler code uses .set mipsN. */
231 int gp32;
232 int fp32;
233 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
234 command line option, and the default CPU. */
235 int arch;
236 /* True if ".set sym32" is in effect. */
237 bfd_boolean sym32;
240 /* True if -mgp32 was passed. */
241 static int file_mips_gp32 = -1;
243 /* True if -mfp32 was passed. */
244 static int file_mips_fp32 = -1;
246 /* This is the struct we use to hold the current set of options. Note
247 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
248 -1 to indicate that they have not been initialized. */
250 static struct mips_set_options mips_opts =
252 ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, ATREG, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
255 /* These variables are filled in with the masks of registers used.
256 The object format code reads them and puts them in the appropriate
257 place. */
258 unsigned long mips_gprmask;
259 unsigned long mips_cprmask[4];
261 /* MIPS ISA we are using for this output file. */
262 static int file_mips_isa = ISA_UNKNOWN;
264 /* True if -mips16 was passed or implied by arguments passed on the
265 command line (e.g., by -march). */
266 static int file_ase_mips16;
268 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
269 || mips_opts.isa == ISA_MIPS32R2 \
270 || mips_opts.isa == ISA_MIPS64 \
271 || mips_opts.isa == ISA_MIPS64R2)
273 /* True if -mips3d was passed or implied by arguments passed on the
274 command line (e.g., by -march). */
275 static int file_ase_mips3d;
277 /* True if -mdmx was passed or implied by arguments passed on the
278 command line (e.g., by -march). */
279 static int file_ase_mdmx;
281 /* True if -msmartmips was passed or implied by arguments passed on the
282 command line (e.g., by -march). */
283 static int file_ase_smartmips;
285 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
286 || mips_opts.isa == ISA_MIPS32R2)
288 /* True if -mdsp was passed or implied by arguments passed on the
289 command line (e.g., by -march). */
290 static int file_ase_dsp;
292 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
293 || mips_opts.isa == ISA_MIPS64R2)
295 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
297 /* True if -mdspr2 was passed or implied by arguments passed on the
298 command line (e.g., by -march). */
299 static int file_ase_dspr2;
301 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
302 || mips_opts.isa == ISA_MIPS64R2)
304 /* True if -mmt was passed or implied by arguments passed on the
305 command line (e.g., by -march). */
306 static int file_ase_mt;
308 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
309 || mips_opts.isa == ISA_MIPS64R2)
311 /* The argument of the -march= flag. The architecture we are assembling. */
312 static int file_mips_arch = CPU_UNKNOWN;
313 static const char *mips_arch_string;
315 /* The argument of the -mtune= flag. The architecture for which we
316 are optimizing. */
317 static int mips_tune = CPU_UNKNOWN;
318 static const char *mips_tune_string;
320 /* True when generating 32-bit code for a 64-bit processor. */
321 static int mips_32bitmode = 0;
323 /* True if the given ABI requires 32-bit registers. */
324 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
326 /* Likewise 64-bit registers. */
327 #define ABI_NEEDS_64BIT_REGS(ABI) \
328 ((ABI) == N32_ABI \
329 || (ABI) == N64_ABI \
330 || (ABI) == O64_ABI)
332 /* Return true if ISA supports 64 bit wide gp registers. */
333 #define ISA_HAS_64BIT_REGS(ISA) \
334 ((ISA) == ISA_MIPS3 \
335 || (ISA) == ISA_MIPS4 \
336 || (ISA) == ISA_MIPS5 \
337 || (ISA) == ISA_MIPS64 \
338 || (ISA) == ISA_MIPS64R2)
340 /* Return true if ISA supports 64 bit wide float registers. */
341 #define ISA_HAS_64BIT_FPRS(ISA) \
342 ((ISA) == ISA_MIPS3 \
343 || (ISA) == ISA_MIPS4 \
344 || (ISA) == ISA_MIPS5 \
345 || (ISA) == ISA_MIPS32R2 \
346 || (ISA) == ISA_MIPS64 \
347 || (ISA) == ISA_MIPS64R2)
349 /* Return true if ISA supports 64-bit right rotate (dror et al.)
350 instructions. */
351 #define ISA_HAS_DROR(ISA) \
352 ((ISA) == ISA_MIPS64R2)
354 /* Return true if ISA supports 32-bit right rotate (ror et al.)
355 instructions. */
356 #define ISA_HAS_ROR(ISA) \
357 ((ISA) == ISA_MIPS32R2 \
358 || (ISA) == ISA_MIPS64R2 \
359 || mips_opts.ase_smartmips)
361 /* Return true if ISA supports single-precision floats in odd registers. */
362 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
363 ((ISA) == ISA_MIPS32 \
364 || (ISA) == ISA_MIPS32R2 \
365 || (ISA) == ISA_MIPS64 \
366 || (ISA) == ISA_MIPS64R2)
368 /* Return true if ISA supports move to/from high part of a 64-bit
369 floating-point register. */
370 #define ISA_HAS_MXHC1(ISA) \
371 ((ISA) == ISA_MIPS32R2 \
372 || (ISA) == ISA_MIPS64R2)
374 #define HAVE_32BIT_GPRS \
375 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
377 #define HAVE_32BIT_FPRS \
378 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
380 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
381 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
383 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
385 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
387 /* True if relocations are stored in-place. */
388 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
390 /* The ABI-derived address size. */
391 #define HAVE_64BIT_ADDRESSES \
392 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
393 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
395 /* The size of symbolic constants (i.e., expressions of the form
396 "SYMBOL" or "SYMBOL + OFFSET"). */
397 #define HAVE_32BIT_SYMBOLS \
398 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
399 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
401 /* Addresses are loaded in different ways, depending on the address size
402 in use. The n32 ABI Documentation also mandates the use of additions
403 with overflow checking, but existing implementations don't follow it. */
404 #define ADDRESS_ADD_INSN \
405 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
407 #define ADDRESS_ADDI_INSN \
408 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
410 #define ADDRESS_LOAD_INSN \
411 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
413 #define ADDRESS_STORE_INSN \
414 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
416 /* Return true if the given CPU supports the MIPS16 ASE. */
417 #define CPU_HAS_MIPS16(cpu) \
418 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
419 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
421 /* True if CPU has a dror instruction. */
422 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
424 /* True if CPU has a ror instruction. */
425 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
427 /* True if mflo and mfhi can be immediately followed by instructions
428 which write to the HI and LO registers.
430 According to MIPS specifications, MIPS ISAs I, II, and III need
431 (at least) two instructions between the reads of HI/LO and
432 instructions which write them, and later ISAs do not. Contradicting
433 the MIPS specifications, some MIPS IV processor user manuals (e.g.
434 the UM for the NEC Vr5000) document needing the instructions between
435 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
436 MIPS64 and later ISAs to have the interlocks, plus any specific
437 earlier-ISA CPUs for which CPU documentation declares that the
438 instructions are really interlocked. */
439 #define hilo_interlocks \
440 (mips_opts.isa == ISA_MIPS32 \
441 || mips_opts.isa == ISA_MIPS32R2 \
442 || mips_opts.isa == ISA_MIPS64 \
443 || mips_opts.isa == ISA_MIPS64R2 \
444 || mips_opts.arch == CPU_R4010 \
445 || mips_opts.arch == CPU_R10000 \
446 || mips_opts.arch == CPU_R12000 \
447 || mips_opts.arch == CPU_RM7000 \
448 || mips_opts.arch == CPU_VR5500 \
451 /* Whether the processor uses hardware interlocks to protect reads
452 from the GPRs after they are loaded from memory, and thus does not
453 require nops to be inserted. This applies to instructions marked
454 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
455 level I. */
456 #define gpr_interlocks \
457 (mips_opts.isa != ISA_MIPS1 \
458 || mips_opts.arch == CPU_R3900)
460 /* Whether the processor uses hardware interlocks to avoid delays
461 required by coprocessor instructions, and thus does not require
462 nops to be inserted. This applies to instructions marked
463 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
464 between instructions marked INSN_WRITE_COND_CODE and ones marked
465 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
466 levels I, II, and III. */
467 /* Itbl support may require additional care here. */
468 #define cop_interlocks \
469 ((mips_opts.isa != ISA_MIPS1 \
470 && mips_opts.isa != ISA_MIPS2 \
471 && mips_opts.isa != ISA_MIPS3) \
472 || mips_opts.arch == CPU_R4300 \
475 /* Whether the processor uses hardware interlocks to protect reads
476 from coprocessor registers after they are loaded from memory, and
477 thus does not require nops to be inserted. This applies to
478 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
479 requires at MIPS ISA level I. */
480 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
482 /* Is this a mfhi or mflo instruction? */
483 #define MF_HILO_INSN(PINFO) \
484 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
486 /* MIPS PIC level. */
488 enum mips_pic_level mips_pic;
490 /* 1 if we should generate 32 bit offsets from the $gp register in
491 SVR4_PIC mode. Currently has no meaning in other modes. */
492 static int mips_big_got = 0;
494 /* 1 if trap instructions should used for overflow rather than break
495 instructions. */
496 static int mips_trap = 0;
498 /* 1 if double width floating point constants should not be constructed
499 by assembling two single width halves into two single width floating
500 point registers which just happen to alias the double width destination
501 register. On some architectures this aliasing can be disabled by a bit
502 in the status register, and the setting of this bit cannot be determined
503 automatically at assemble time. */
504 static int mips_disable_float_construction;
506 /* Non-zero if any .set noreorder directives were used. */
508 static int mips_any_noreorder;
510 /* Non-zero if nops should be inserted when the register referenced in
511 an mfhi/mflo instruction is read in the next two instructions. */
512 static int mips_7000_hilo_fix;
514 /* The size of objects in the small data section. */
515 static unsigned int g_switch_value = 8;
516 /* Whether the -G option was used. */
517 static int g_switch_seen = 0;
519 #define N_RMASK 0xc4
520 #define N_VFP 0xd4
522 /* If we can determine in advance that GP optimization won't be
523 possible, we can skip the relaxation stuff that tries to produce
524 GP-relative references. This makes delay slot optimization work
525 better.
527 This function can only provide a guess, but it seems to work for
528 gcc output. It needs to guess right for gcc, otherwise gcc
529 will put what it thinks is a GP-relative instruction in a branch
530 delay slot.
532 I don't know if a fix is needed for the SVR4_PIC mode. I've only
533 fixed it for the non-PIC mode. KR 95/04/07 */
534 static int nopic_need_relax (symbolS *, int);
536 /* handle of the OPCODE hash table */
537 static struct hash_control *op_hash = NULL;
539 /* The opcode hash table we use for the mips16. */
540 static struct hash_control *mips16_op_hash = NULL;
542 /* This array holds the chars that always start a comment. If the
543 pre-processor is disabled, these aren't very useful */
544 const char comment_chars[] = "#";
546 /* This array holds the chars that only start a comment at the beginning of
547 a line. If the line seems to have the form '# 123 filename'
548 .line and .file directives will appear in the pre-processed output */
549 /* Note that input_file.c hand checks for '#' at the beginning of the
550 first line of the input file. This is because the compiler outputs
551 #NO_APP at the beginning of its output. */
552 /* Also note that C style comments are always supported. */
553 const char line_comment_chars[] = "#";
555 /* This array holds machine specific line separator characters. */
556 const char line_separator_chars[] = ";";
558 /* Chars that can be used to separate mant from exp in floating point nums */
559 const char EXP_CHARS[] = "eE";
561 /* Chars that mean this number is a floating point constant */
562 /* As in 0f12.456 */
563 /* or 0d1.2345e12 */
564 const char FLT_CHARS[] = "rRsSfFdDxXpP";
566 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
567 changed in read.c . Ideally it shouldn't have to know about it at all,
568 but nothing is ideal around here.
571 static char *insn_error;
573 static int auto_align = 1;
575 /* When outputting SVR4 PIC code, the assembler needs to know the
576 offset in the stack frame from which to restore the $gp register.
577 This is set by the .cprestore pseudo-op, and saved in this
578 variable. */
579 static offsetT mips_cprestore_offset = -1;
581 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
582 more optimizations, it can use a register value instead of a memory-saved
583 offset and even an other register than $gp as global pointer. */
584 static offsetT mips_cpreturn_offset = -1;
585 static int mips_cpreturn_register = -1;
586 static int mips_gp_register = GP;
587 static int mips_gprel_offset = 0;
589 /* Whether mips_cprestore_offset has been set in the current function
590 (or whether it has already been warned about, if not). */
591 static int mips_cprestore_valid = 0;
593 /* This is the register which holds the stack frame, as set by the
594 .frame pseudo-op. This is needed to implement .cprestore. */
595 static int mips_frame_reg = SP;
597 /* Whether mips_frame_reg has been set in the current function
598 (or whether it has already been warned about, if not). */
599 static int mips_frame_reg_valid = 0;
601 /* To output NOP instructions correctly, we need to keep information
602 about the previous two instructions. */
604 /* Whether we are optimizing. The default value of 2 means to remove
605 unneeded NOPs and swap branch instructions when possible. A value
606 of 1 means to not swap branches. A value of 0 means to always
607 insert NOPs. */
608 static int mips_optimize = 2;
610 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
611 equivalent to seeing no -g option at all. */
612 static int mips_debug = 0;
614 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
615 #define MAX_VR4130_NOPS 4
617 /* The maximum number of NOPs needed to fill delay slots. */
618 #define MAX_DELAY_NOPS 2
620 /* The maximum number of NOPs needed for any purpose. */
621 #define MAX_NOPS 4
623 /* A list of previous instructions, with index 0 being the most recent.
624 We need to look back MAX_NOPS instructions when filling delay slots
625 or working around processor errata. We need to look back one
626 instruction further if we're thinking about using history[0] to
627 fill a branch delay slot. */
628 static struct mips_cl_insn history[1 + MAX_NOPS];
630 /* Nop instructions used by emit_nop. */
631 static struct mips_cl_insn nop_insn, mips16_nop_insn;
633 /* The appropriate nop for the current mode. */
634 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
636 /* If this is set, it points to a frag holding nop instructions which
637 were inserted before the start of a noreorder section. If those
638 nops turn out to be unnecessary, the size of the frag can be
639 decreased. */
640 static fragS *prev_nop_frag;
642 /* The number of nop instructions we created in prev_nop_frag. */
643 static int prev_nop_frag_holds;
645 /* The number of nop instructions that we know we need in
646 prev_nop_frag. */
647 static int prev_nop_frag_required;
649 /* The number of instructions we've seen since prev_nop_frag. */
650 static int prev_nop_frag_since;
652 /* For ECOFF and ELF, relocations against symbols are done in two
653 parts, with a HI relocation and a LO relocation. Each relocation
654 has only 16 bits of space to store an addend. This means that in
655 order for the linker to handle carries correctly, it must be able
656 to locate both the HI and the LO relocation. This means that the
657 relocations must appear in order in the relocation table.
659 In order to implement this, we keep track of each unmatched HI
660 relocation. We then sort them so that they immediately precede the
661 corresponding LO relocation. */
663 struct mips_hi_fixup
665 /* Next HI fixup. */
666 struct mips_hi_fixup *next;
667 /* This fixup. */
668 fixS *fixp;
669 /* The section this fixup is in. */
670 segT seg;
673 /* The list of unmatched HI relocs. */
675 static struct mips_hi_fixup *mips_hi_fixup_list;
677 /* The frag containing the last explicit relocation operator.
678 Null if explicit relocations have not been used. */
680 static fragS *prev_reloc_op_frag;
682 /* Map normal MIPS register numbers to mips16 register numbers. */
684 #define X ILLEGAL_REG
685 static const int mips32_to_16_reg_map[] =
687 X, X, 2, 3, 4, 5, 6, 7,
688 X, X, X, X, X, X, X, X,
689 0, 1, X, X, X, X, X, X,
690 X, X, X, X, X, X, X, X
692 #undef X
694 /* Map mips16 register numbers to normal MIPS register numbers. */
696 static const unsigned int mips16_to_32_reg_map[] =
698 16, 17, 2, 3, 4, 5, 6, 7
701 /* Classifies the kind of instructions we're interested in when
702 implementing -mfix-vr4120. */
703 enum fix_vr4120_class {
704 FIX_VR4120_MACC,
705 FIX_VR4120_DMACC,
706 FIX_VR4120_MULT,
707 FIX_VR4120_DMULT,
708 FIX_VR4120_DIV,
709 FIX_VR4120_MTHILO,
710 NUM_FIX_VR4120_CLASSES
713 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
714 there must be at least one other instruction between an instruction
715 of type X and an instruction of type Y. */
716 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
718 /* True if -mfix-vr4120 is in force. */
719 static int mips_fix_vr4120;
721 /* ...likewise -mfix-vr4130. */
722 static int mips_fix_vr4130;
724 /* We don't relax branches by default, since this causes us to expand
725 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
726 fail to compute the offset before expanding the macro to the most
727 efficient expansion. */
729 static int mips_relax_branch;
731 /* The expansion of many macros depends on the type of symbol that
732 they refer to. For example, when generating position-dependent code,
733 a macro that refers to a symbol may have two different expansions,
734 one which uses GP-relative addresses and one which uses absolute
735 addresses. When generating SVR4-style PIC, a macro may have
736 different expansions for local and global symbols.
738 We handle these situations by generating both sequences and putting
739 them in variant frags. In position-dependent code, the first sequence
740 will be the GP-relative one and the second sequence will be the
741 absolute one. In SVR4 PIC, the first sequence will be for global
742 symbols and the second will be for local symbols.
744 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
745 SECOND are the lengths of the two sequences in bytes. These fields
746 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
747 the subtype has the following flags:
749 RELAX_USE_SECOND
750 Set if it has been decided that we should use the second
751 sequence instead of the first.
753 RELAX_SECOND_LONGER
754 Set in the first variant frag if the macro's second implementation
755 is longer than its first. This refers to the macro as a whole,
756 not an individual relaxation.
758 RELAX_NOMACRO
759 Set in the first variant frag if the macro appeared in a .set nomacro
760 block and if one alternative requires a warning but the other does not.
762 RELAX_DELAY_SLOT
763 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
764 delay slot.
766 The frag's "opcode" points to the first fixup for relaxable code.
768 Relaxable macros are generated using a sequence such as:
770 relax_start (SYMBOL);
771 ... generate first expansion ...
772 relax_switch ();
773 ... generate second expansion ...
774 relax_end ();
776 The code and fixups for the unwanted alternative are discarded
777 by md_convert_frag. */
778 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
780 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
781 #define RELAX_SECOND(X) ((X) & 0xff)
782 #define RELAX_USE_SECOND 0x10000
783 #define RELAX_SECOND_LONGER 0x20000
784 #define RELAX_NOMACRO 0x40000
785 #define RELAX_DELAY_SLOT 0x80000
787 /* Branch without likely bit. If label is out of range, we turn:
789 beq reg1, reg2, label
790 delay slot
792 into
794 bne reg1, reg2, 0f
796 j label
797 0: delay slot
799 with the following opcode replacements:
801 beq <-> bne
802 blez <-> bgtz
803 bltz <-> bgez
804 bc1f <-> bc1t
806 bltzal <-> bgezal (with jal label instead of j label)
808 Even though keeping the delay slot instruction in the delay slot of
809 the branch would be more efficient, it would be very tricky to do
810 correctly, because we'd have to introduce a variable frag *after*
811 the delay slot instruction, and expand that instead. Let's do it
812 the easy way for now, even if the branch-not-taken case now costs
813 one additional instruction. Out-of-range branches are not supposed
814 to be common, anyway.
816 Branch likely. If label is out of range, we turn:
818 beql reg1, reg2, label
819 delay slot (annulled if branch not taken)
821 into
823 beql reg1, reg2, 1f
825 beql $0, $0, 2f
827 1: j[al] label
828 delay slot (executed only if branch taken)
831 It would be possible to generate a shorter sequence by losing the
832 likely bit, generating something like:
834 bne reg1, reg2, 0f
836 j[al] label
837 delay slot (executed only if branch taken)
840 beql -> bne
841 bnel -> beq
842 blezl -> bgtz
843 bgtzl -> blez
844 bltzl -> bgez
845 bgezl -> bltz
846 bc1fl -> bc1t
847 bc1tl -> bc1f
849 bltzall -> bgezal (with jal label instead of j label)
850 bgezall -> bltzal (ditto)
853 but it's not clear that it would actually improve performance. */
854 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
855 ((relax_substateT) \
856 (0xc0000000 \
857 | ((toofar) ? 1 : 0) \
858 | ((link) ? 2 : 0) \
859 | ((likely) ? 4 : 0) \
860 | ((uncond) ? 8 : 0)))
861 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
862 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
863 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
864 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
865 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
867 /* For mips16 code, we use an entirely different form of relaxation.
868 mips16 supports two versions of most instructions which take
869 immediate values: a small one which takes some small value, and a
870 larger one which takes a 16 bit value. Since branches also follow
871 this pattern, relaxing these values is required.
873 We can assemble both mips16 and normal MIPS code in a single
874 object. Therefore, we need to support this type of relaxation at
875 the same time that we support the relaxation described above. We
876 use the high bit of the subtype field to distinguish these cases.
878 The information we store for this type of relaxation is the
879 argument code found in the opcode file for this relocation, whether
880 the user explicitly requested a small or extended form, and whether
881 the relocation is in a jump or jal delay slot. That tells us the
882 size of the value, and how it should be stored. We also store
883 whether the fragment is considered to be extended or not. We also
884 store whether this is known to be a branch to a different section,
885 whether we have tried to relax this frag yet, and whether we have
886 ever extended a PC relative fragment because of a shift count. */
887 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
888 (0x80000000 \
889 | ((type) & 0xff) \
890 | ((small) ? 0x100 : 0) \
891 | ((ext) ? 0x200 : 0) \
892 | ((dslot) ? 0x400 : 0) \
893 | ((jal_dslot) ? 0x800 : 0))
894 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
895 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
896 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
897 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
898 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
899 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
900 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
901 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
902 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
903 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
904 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
905 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
907 /* Is the given value a sign-extended 32-bit value? */
908 #define IS_SEXT_32BIT_NUM(x) \
909 (((x) &~ (offsetT) 0x7fffffff) == 0 \
910 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
912 /* Is the given value a sign-extended 16-bit value? */
913 #define IS_SEXT_16BIT_NUM(x) \
914 (((x) &~ (offsetT) 0x7fff) == 0 \
915 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
917 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
918 #define IS_ZEXT_32BIT_NUM(x) \
919 (((x) &~ (offsetT) 0xffffffff) == 0 \
920 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
922 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
923 VALUE << SHIFT. VALUE is evaluated exactly once. */
924 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
925 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
926 | (((VALUE) & (MASK)) << (SHIFT)))
928 /* Extract bits MASK << SHIFT from STRUCT and shift them right
929 SHIFT places. */
930 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
931 (((STRUCT) >> (SHIFT)) & (MASK))
933 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
934 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
936 include/opcode/mips.h specifies operand fields using the macros
937 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
938 with "MIPS16OP" instead of "OP". */
939 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
940 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
941 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
942 INSERT_BITS ((INSN).insn_opcode, VALUE, \
943 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
945 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
946 #define EXTRACT_OPERAND(FIELD, INSN) \
947 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
948 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
949 EXTRACT_BITS ((INSN).insn_opcode, \
950 MIPS16OP_MASK_##FIELD, \
951 MIPS16OP_SH_##FIELD)
953 /* Global variables used when generating relaxable macros. See the
954 comment above RELAX_ENCODE for more details about how relaxation
955 is used. */
956 static struct {
957 /* 0 if we're not emitting a relaxable macro.
958 1 if we're emitting the first of the two relaxation alternatives.
959 2 if we're emitting the second alternative. */
960 int sequence;
962 /* The first relaxable fixup in the current frag. (In other words,
963 the first fixup that refers to relaxable code.) */
964 fixS *first_fixup;
966 /* sizes[0] says how many bytes of the first alternative are stored in
967 the current frag. Likewise sizes[1] for the second alternative. */
968 unsigned int sizes[2];
970 /* The symbol on which the choice of sequence depends. */
971 symbolS *symbol;
972 } mips_relax;
974 /* Global variables used to decide whether a macro needs a warning. */
975 static struct {
976 /* True if the macro is in a branch delay slot. */
977 bfd_boolean delay_slot_p;
979 /* For relaxable macros, sizes[0] is the length of the first alternative
980 in bytes and sizes[1] is the length of the second alternative.
981 For non-relaxable macros, both elements give the length of the
982 macro in bytes. */
983 unsigned int sizes[2];
985 /* The first variant frag for this macro. */
986 fragS *first_frag;
987 } mips_macro_warning;
989 /* Prototypes for static functions. */
991 #define internalError() \
992 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
994 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
996 static void append_insn
997 (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
998 static void mips_no_prev_insn (void);
999 static void mips16_macro_build
1000 (expressionS *, const char *, const char *, va_list);
1001 static void load_register (int, expressionS *, int);
1002 static void macro_start (void);
1003 static void macro_end (void);
1004 static void macro (struct mips_cl_insn * ip);
1005 static void mips16_macro (struct mips_cl_insn * ip);
1006 #ifdef LOSING_COMPILER
1007 static void macro2 (struct mips_cl_insn * ip);
1008 #endif
1009 static void mips_ip (char *str, struct mips_cl_insn * ip);
1010 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1011 static void mips16_immed
1012 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1013 unsigned long *, bfd_boolean *, unsigned short *);
1014 static size_t my_getSmallExpression
1015 (expressionS *, bfd_reloc_code_real_type *, char *);
1016 static void my_getExpression (expressionS *, char *);
1017 static void s_align (int);
1018 static void s_change_sec (int);
1019 static void s_change_section (int);
1020 static void s_cons (int);
1021 static void s_float_cons (int);
1022 static void s_mips_globl (int);
1023 static void s_option (int);
1024 static void s_mipsset (int);
1025 static void s_abicalls (int);
1026 static void s_cpload (int);
1027 static void s_cpsetup (int);
1028 static void s_cplocal (int);
1029 static void s_cprestore (int);
1030 static void s_cpreturn (int);
1031 static void s_dtprelword (int);
1032 static void s_dtpreldword (int);
1033 static void s_gpvalue (int);
1034 static void s_gpword (int);
1035 static void s_gpdword (int);
1036 static void s_cpadd (int);
1037 static void s_insn (int);
1038 static void md_obj_begin (void);
1039 static void md_obj_end (void);
1040 static void s_mips_ent (int);
1041 static void s_mips_end (int);
1042 static void s_mips_frame (int);
1043 static void s_mips_mask (int reg_type);
1044 static void s_mips_stab (int);
1045 static void s_mips_weakext (int);
1046 static void s_mips_file (int);
1047 static void s_mips_loc (int);
1048 static bfd_boolean pic_need_relax (symbolS *, asection *);
1049 static int relaxed_branch_length (fragS *, asection *, int);
1050 static int validate_mips_insn (const struct mips_opcode *);
1052 /* Table and functions used to map between CPU/ISA names, and
1053 ISA levels, and CPU numbers. */
1055 struct mips_cpu_info
1057 const char *name; /* CPU or ISA name. */
1058 int flags; /* ASEs available, or ISA flag. */
1059 int isa; /* ISA level. */
1060 int cpu; /* CPU number (default CPU if ISA). */
1063 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1064 #define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1065 #define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1066 #define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1067 #define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1068 #define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
1069 #define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
1071 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1072 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1073 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1075 /* Pseudo-op table.
1077 The following pseudo-ops from the Kane and Heinrich MIPS book
1078 should be defined here, but are currently unsupported: .alias,
1079 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1081 The following pseudo-ops from the Kane and Heinrich MIPS book are
1082 specific to the type of debugging information being generated, and
1083 should be defined by the object format: .aent, .begin, .bend,
1084 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1085 .vreg.
1087 The following pseudo-ops from the Kane and Heinrich MIPS book are
1088 not MIPS CPU specific, but are also not specific to the object file
1089 format. This file is probably the best place to define them, but
1090 they are not currently supported: .asm0, .endr, .lab, .struct. */
1092 static const pseudo_typeS mips_pseudo_table[] =
1094 /* MIPS specific pseudo-ops. */
1095 {"option", s_option, 0},
1096 {"set", s_mipsset, 0},
1097 {"rdata", s_change_sec, 'r'},
1098 {"sdata", s_change_sec, 's'},
1099 {"livereg", s_ignore, 0},
1100 {"abicalls", s_abicalls, 0},
1101 {"cpload", s_cpload, 0},
1102 {"cpsetup", s_cpsetup, 0},
1103 {"cplocal", s_cplocal, 0},
1104 {"cprestore", s_cprestore, 0},
1105 {"cpreturn", s_cpreturn, 0},
1106 {"dtprelword", s_dtprelword, 0},
1107 {"dtpreldword", s_dtpreldword, 0},
1108 {"gpvalue", s_gpvalue, 0},
1109 {"gpword", s_gpword, 0},
1110 {"gpdword", s_gpdword, 0},
1111 {"cpadd", s_cpadd, 0},
1112 {"insn", s_insn, 0},
1114 /* Relatively generic pseudo-ops that happen to be used on MIPS
1115 chips. */
1116 {"asciiz", stringer, 8 + 1},
1117 {"bss", s_change_sec, 'b'},
1118 {"err", s_err, 0},
1119 {"half", s_cons, 1},
1120 {"dword", s_cons, 3},
1121 {"weakext", s_mips_weakext, 0},
1122 {"origin", s_org, 0},
1123 {"repeat", s_rept, 0},
1125 /* These pseudo-ops are defined in read.c, but must be overridden
1126 here for one reason or another. */
1127 {"align", s_align, 0},
1128 {"byte", s_cons, 0},
1129 {"data", s_change_sec, 'd'},
1130 {"double", s_float_cons, 'd'},
1131 {"float", s_float_cons, 'f'},
1132 {"globl", s_mips_globl, 0},
1133 {"global", s_mips_globl, 0},
1134 {"hword", s_cons, 1},
1135 {"int", s_cons, 2},
1136 {"long", s_cons, 2},
1137 {"octa", s_cons, 4},
1138 {"quad", s_cons, 3},
1139 {"section", s_change_section, 0},
1140 {"short", s_cons, 1},
1141 {"single", s_float_cons, 'f'},
1142 {"stabn", s_mips_stab, 'n'},
1143 {"text", s_change_sec, 't'},
1144 {"word", s_cons, 2},
1146 { "extern", ecoff_directive_extern, 0},
1148 { NULL, NULL, 0 },
1151 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1153 /* These pseudo-ops should be defined by the object file format.
1154 However, a.out doesn't support them, so we have versions here. */
1155 {"aent", s_mips_ent, 1},
1156 {"bgnb", s_ignore, 0},
1157 {"end", s_mips_end, 0},
1158 {"endb", s_ignore, 0},
1159 {"ent", s_mips_ent, 0},
1160 {"file", s_mips_file, 0},
1161 {"fmask", s_mips_mask, 'F'},
1162 {"frame", s_mips_frame, 0},
1163 {"loc", s_mips_loc, 0},
1164 {"mask", s_mips_mask, 'R'},
1165 {"verstamp", s_ignore, 0},
1166 { NULL, NULL, 0 },
1169 extern void pop_insert (const pseudo_typeS *);
1171 void
1172 mips_pop_insert (void)
1174 pop_insert (mips_pseudo_table);
1175 if (! ECOFF_DEBUGGING)
1176 pop_insert (mips_nonecoff_pseudo_table);
1179 /* Symbols labelling the current insn. */
1181 struct insn_label_list
1183 struct insn_label_list *next;
1184 symbolS *label;
1187 static struct insn_label_list *free_insn_labels;
1188 #define label_list tc_segment_info_data.labels
1190 static void mips_clear_insn_labels (void);
1192 static inline void
1193 mips_clear_insn_labels (void)
1195 register struct insn_label_list **pl;
1196 segment_info_type *si;
1198 if (now_seg)
1200 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1203 si = seg_info (now_seg);
1204 *pl = si->label_list;
1205 si->label_list = NULL;
1210 static char *expr_end;
1212 /* Expressions which appear in instructions. These are set by
1213 mips_ip. */
1215 static expressionS imm_expr;
1216 static expressionS imm2_expr;
1217 static expressionS offset_expr;
1219 /* Relocs associated with imm_expr and offset_expr. */
1221 static bfd_reloc_code_real_type imm_reloc[3]
1222 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1223 static bfd_reloc_code_real_type offset_reloc[3]
1224 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1226 /* These are set by mips16_ip if an explicit extension is used. */
1228 static bfd_boolean mips16_small, mips16_ext;
1230 #ifdef OBJ_ELF
1231 /* The pdr segment for per procedure frame/regmask info. Not used for
1232 ECOFF debugging. */
1234 static segT pdr_seg;
1235 #endif
1237 /* The default target format to use. */
1239 const char *
1240 mips_target_format (void)
1242 switch (OUTPUT_FLAVOR)
1244 case bfd_target_ecoff_flavour:
1245 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1246 case bfd_target_coff_flavour:
1247 return "pe-mips";
1248 case bfd_target_elf_flavour:
1249 #ifdef TE_VXWORKS
1250 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1251 return (target_big_endian
1252 ? "elf32-bigmips-vxworks"
1253 : "elf32-littlemips-vxworks");
1254 #endif
1255 #ifdef TE_TMIPS
1256 /* This is traditional mips. */
1257 return (target_big_endian
1258 ? (HAVE_64BIT_OBJECTS
1259 ? "elf64-tradbigmips"
1260 : (HAVE_NEWABI
1261 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1262 : (HAVE_64BIT_OBJECTS
1263 ? "elf64-tradlittlemips"
1264 : (HAVE_NEWABI
1265 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1266 #else
1267 return (target_big_endian
1268 ? (HAVE_64BIT_OBJECTS
1269 ? "elf64-bigmips"
1270 : (HAVE_NEWABI
1271 ? "elf32-nbigmips" : "elf32-bigmips"))
1272 : (HAVE_64BIT_OBJECTS
1273 ? "elf64-littlemips"
1274 : (HAVE_NEWABI
1275 ? "elf32-nlittlemips" : "elf32-littlemips")));
1276 #endif
1277 default:
1278 abort ();
1279 return NULL;
1283 /* Return the length of instruction INSN. */
1285 static inline unsigned int
1286 insn_length (const struct mips_cl_insn *insn)
1288 if (!mips_opts.mips16)
1289 return 4;
1290 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1293 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1295 static void
1296 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1298 size_t i;
1300 insn->insn_mo = mo;
1301 insn->use_extend = FALSE;
1302 insn->extend = 0;
1303 insn->insn_opcode = mo->match;
1304 insn->frag = NULL;
1305 insn->where = 0;
1306 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1307 insn->fixp[i] = NULL;
1308 insn->fixed_p = (mips_opts.noreorder > 0);
1309 insn->noreorder_p = (mips_opts.noreorder > 0);
1310 insn->mips16_absolute_jump_p = 0;
1313 /* Record the current MIPS16 mode in now_seg. */
1315 static void
1316 mips_record_mips16_mode (void)
1318 segment_info_type *si;
1320 si = seg_info (now_seg);
1321 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1322 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1325 /* Install INSN at the location specified by its "frag" and "where" fields. */
1327 static void
1328 install_insn (const struct mips_cl_insn *insn)
1330 char *f = insn->frag->fr_literal + insn->where;
1331 if (!mips_opts.mips16)
1332 md_number_to_chars (f, insn->insn_opcode, 4);
1333 else if (insn->mips16_absolute_jump_p)
1335 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1336 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1338 else
1340 if (insn->use_extend)
1342 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1343 f += 2;
1345 md_number_to_chars (f, insn->insn_opcode, 2);
1347 mips_record_mips16_mode ();
1350 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1351 and install the opcode in the new location. */
1353 static void
1354 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1356 size_t i;
1358 insn->frag = frag;
1359 insn->where = where;
1360 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1361 if (insn->fixp[i] != NULL)
1363 insn->fixp[i]->fx_frag = frag;
1364 insn->fixp[i]->fx_where = where;
1366 install_insn (insn);
1369 /* Add INSN to the end of the output. */
1371 static void
1372 add_fixed_insn (struct mips_cl_insn *insn)
1374 char *f = frag_more (insn_length (insn));
1375 move_insn (insn, frag_now, f - frag_now->fr_literal);
1378 /* Start a variant frag and move INSN to the start of the variant part,
1379 marking it as fixed. The other arguments are as for frag_var. */
1381 static void
1382 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1383 relax_substateT subtype, symbolS *symbol, offsetT offset)
1385 frag_grow (max_chars);
1386 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1387 insn->fixed_p = 1;
1388 frag_var (rs_machine_dependent, max_chars, var,
1389 subtype, symbol, offset, NULL);
1392 /* Insert N copies of INSN into the history buffer, starting at
1393 position FIRST. Neither FIRST nor N need to be clipped. */
1395 static void
1396 insert_into_history (unsigned int first, unsigned int n,
1397 const struct mips_cl_insn *insn)
1399 if (mips_relax.sequence != 2)
1401 unsigned int i;
1403 for (i = ARRAY_SIZE (history); i-- > first;)
1404 if (i >= first + n)
1405 history[i] = history[i - n];
1406 else
1407 history[i] = *insn;
1411 /* Emit a nop instruction, recording it in the history buffer. */
1413 static void
1414 emit_nop (void)
1416 add_fixed_insn (NOP_INSN);
1417 insert_into_history (0, 1, NOP_INSN);
1420 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1421 the idea is to make it obvious at a glance that each errata is
1422 included. */
1424 static void
1425 init_vr4120_conflicts (void)
1427 #define CONFLICT(FIRST, SECOND) \
1428 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1430 /* Errata 21 - [D]DIV[U] after [D]MACC */
1431 CONFLICT (MACC, DIV);
1432 CONFLICT (DMACC, DIV);
1434 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1435 CONFLICT (DMULT, DMULT);
1436 CONFLICT (DMULT, DMACC);
1437 CONFLICT (DMACC, DMULT);
1438 CONFLICT (DMACC, DMACC);
1440 /* Errata 24 - MT{LO,HI} after [D]MACC */
1441 CONFLICT (MACC, MTHILO);
1442 CONFLICT (DMACC, MTHILO);
1444 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1445 instruction is executed immediately after a MACC or DMACC
1446 instruction, the result of [either instruction] is incorrect." */
1447 CONFLICT (MACC, MULT);
1448 CONFLICT (MACC, DMULT);
1449 CONFLICT (DMACC, MULT);
1450 CONFLICT (DMACC, DMULT);
1452 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1453 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1454 DDIV or DDIVU instruction, the result of the MACC or
1455 DMACC instruction is incorrect.". */
1456 CONFLICT (DMULT, MACC);
1457 CONFLICT (DMULT, DMACC);
1458 CONFLICT (DIV, MACC);
1459 CONFLICT (DIV, DMACC);
1461 #undef CONFLICT
1464 struct regname {
1465 const char *name;
1466 unsigned int num;
1469 #define RTYPE_MASK 0x1ff00
1470 #define RTYPE_NUM 0x00100
1471 #define RTYPE_FPU 0x00200
1472 #define RTYPE_FCC 0x00400
1473 #define RTYPE_VEC 0x00800
1474 #define RTYPE_GP 0x01000
1475 #define RTYPE_CP0 0x02000
1476 #define RTYPE_PC 0x04000
1477 #define RTYPE_ACC 0x08000
1478 #define RTYPE_CCC 0x10000
1479 #define RNUM_MASK 0x000ff
1480 #define RWARN 0x80000
1482 #define GENERIC_REGISTER_NUMBERS \
1483 {"$0", RTYPE_NUM | 0}, \
1484 {"$1", RTYPE_NUM | 1}, \
1485 {"$2", RTYPE_NUM | 2}, \
1486 {"$3", RTYPE_NUM | 3}, \
1487 {"$4", RTYPE_NUM | 4}, \
1488 {"$5", RTYPE_NUM | 5}, \
1489 {"$6", RTYPE_NUM | 6}, \
1490 {"$7", RTYPE_NUM | 7}, \
1491 {"$8", RTYPE_NUM | 8}, \
1492 {"$9", RTYPE_NUM | 9}, \
1493 {"$10", RTYPE_NUM | 10}, \
1494 {"$11", RTYPE_NUM | 11}, \
1495 {"$12", RTYPE_NUM | 12}, \
1496 {"$13", RTYPE_NUM | 13}, \
1497 {"$14", RTYPE_NUM | 14}, \
1498 {"$15", RTYPE_NUM | 15}, \
1499 {"$16", RTYPE_NUM | 16}, \
1500 {"$17", RTYPE_NUM | 17}, \
1501 {"$18", RTYPE_NUM | 18}, \
1502 {"$19", RTYPE_NUM | 19}, \
1503 {"$20", RTYPE_NUM | 20}, \
1504 {"$21", RTYPE_NUM | 21}, \
1505 {"$22", RTYPE_NUM | 22}, \
1506 {"$23", RTYPE_NUM | 23}, \
1507 {"$24", RTYPE_NUM | 24}, \
1508 {"$25", RTYPE_NUM | 25}, \
1509 {"$26", RTYPE_NUM | 26}, \
1510 {"$27", RTYPE_NUM | 27}, \
1511 {"$28", RTYPE_NUM | 28}, \
1512 {"$29", RTYPE_NUM | 29}, \
1513 {"$30", RTYPE_NUM | 30}, \
1514 {"$31", RTYPE_NUM | 31}
1516 #define FPU_REGISTER_NAMES \
1517 {"$f0", RTYPE_FPU | 0}, \
1518 {"$f1", RTYPE_FPU | 1}, \
1519 {"$f2", RTYPE_FPU | 2}, \
1520 {"$f3", RTYPE_FPU | 3}, \
1521 {"$f4", RTYPE_FPU | 4}, \
1522 {"$f5", RTYPE_FPU | 5}, \
1523 {"$f6", RTYPE_FPU | 6}, \
1524 {"$f7", RTYPE_FPU | 7}, \
1525 {"$f8", RTYPE_FPU | 8}, \
1526 {"$f9", RTYPE_FPU | 9}, \
1527 {"$f10", RTYPE_FPU | 10}, \
1528 {"$f11", RTYPE_FPU | 11}, \
1529 {"$f12", RTYPE_FPU | 12}, \
1530 {"$f13", RTYPE_FPU | 13}, \
1531 {"$f14", RTYPE_FPU | 14}, \
1532 {"$f15", RTYPE_FPU | 15}, \
1533 {"$f16", RTYPE_FPU | 16}, \
1534 {"$f17", RTYPE_FPU | 17}, \
1535 {"$f18", RTYPE_FPU | 18}, \
1536 {"$f19", RTYPE_FPU | 19}, \
1537 {"$f20", RTYPE_FPU | 20}, \
1538 {"$f21", RTYPE_FPU | 21}, \
1539 {"$f22", RTYPE_FPU | 22}, \
1540 {"$f23", RTYPE_FPU | 23}, \
1541 {"$f24", RTYPE_FPU | 24}, \
1542 {"$f25", RTYPE_FPU | 25}, \
1543 {"$f26", RTYPE_FPU | 26}, \
1544 {"$f27", RTYPE_FPU | 27}, \
1545 {"$f28", RTYPE_FPU | 28}, \
1546 {"$f29", RTYPE_FPU | 29}, \
1547 {"$f30", RTYPE_FPU | 30}, \
1548 {"$f31", RTYPE_FPU | 31}
1550 #define FPU_CONDITION_CODE_NAMES \
1551 {"$fcc0", RTYPE_FCC | 0}, \
1552 {"$fcc1", RTYPE_FCC | 1}, \
1553 {"$fcc2", RTYPE_FCC | 2}, \
1554 {"$fcc3", RTYPE_FCC | 3}, \
1555 {"$fcc4", RTYPE_FCC | 4}, \
1556 {"$fcc5", RTYPE_FCC | 5}, \
1557 {"$fcc6", RTYPE_FCC | 6}, \
1558 {"$fcc7", RTYPE_FCC | 7}
1560 #define COPROC_CONDITION_CODE_NAMES \
1561 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1562 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1563 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1564 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1565 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1566 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1567 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1568 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1570 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1571 {"$a4", RTYPE_GP | 8}, \
1572 {"$a5", RTYPE_GP | 9}, \
1573 {"$a6", RTYPE_GP | 10}, \
1574 {"$a7", RTYPE_GP | 11}, \
1575 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1576 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1577 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1578 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1579 {"$t0", RTYPE_GP | 12}, \
1580 {"$t1", RTYPE_GP | 13}, \
1581 {"$t2", RTYPE_GP | 14}, \
1582 {"$t3", RTYPE_GP | 15}
1584 #define O32_SYMBOLIC_REGISTER_NAMES \
1585 {"$t0", RTYPE_GP | 8}, \
1586 {"$t1", RTYPE_GP | 9}, \
1587 {"$t2", RTYPE_GP | 10}, \
1588 {"$t3", RTYPE_GP | 11}, \
1589 {"$t4", RTYPE_GP | 12}, \
1590 {"$t5", RTYPE_GP | 13}, \
1591 {"$t6", RTYPE_GP | 14}, \
1592 {"$t7", RTYPE_GP | 15}, \
1593 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1594 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1595 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1596 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1598 /* Remaining symbolic register names */
1599 #define SYMBOLIC_REGISTER_NAMES \
1600 {"$zero", RTYPE_GP | 0}, \
1601 {"$at", RTYPE_GP | 1}, \
1602 {"$AT", RTYPE_GP | 1}, \
1603 {"$v0", RTYPE_GP | 2}, \
1604 {"$v1", RTYPE_GP | 3}, \
1605 {"$a0", RTYPE_GP | 4}, \
1606 {"$a1", RTYPE_GP | 5}, \
1607 {"$a2", RTYPE_GP | 6}, \
1608 {"$a3", RTYPE_GP | 7}, \
1609 {"$s0", RTYPE_GP | 16}, \
1610 {"$s1", RTYPE_GP | 17}, \
1611 {"$s2", RTYPE_GP | 18}, \
1612 {"$s3", RTYPE_GP | 19}, \
1613 {"$s4", RTYPE_GP | 20}, \
1614 {"$s5", RTYPE_GP | 21}, \
1615 {"$s6", RTYPE_GP | 22}, \
1616 {"$s7", RTYPE_GP | 23}, \
1617 {"$t8", RTYPE_GP | 24}, \
1618 {"$t9", RTYPE_GP | 25}, \
1619 {"$k0", RTYPE_GP | 26}, \
1620 {"$kt0", RTYPE_GP | 26}, \
1621 {"$k1", RTYPE_GP | 27}, \
1622 {"$kt1", RTYPE_GP | 27}, \
1623 {"$gp", RTYPE_GP | 28}, \
1624 {"$sp", RTYPE_GP | 29}, \
1625 {"$s8", RTYPE_GP | 30}, \
1626 {"$fp", RTYPE_GP | 30}, \
1627 {"$ra", RTYPE_GP | 31}
1629 #define MIPS16_SPECIAL_REGISTER_NAMES \
1630 {"$pc", RTYPE_PC | 0}
1632 #define MDMX_VECTOR_REGISTER_NAMES \
1633 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1634 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1635 {"$v2", RTYPE_VEC | 2}, \
1636 {"$v3", RTYPE_VEC | 3}, \
1637 {"$v4", RTYPE_VEC | 4}, \
1638 {"$v5", RTYPE_VEC | 5}, \
1639 {"$v6", RTYPE_VEC | 6}, \
1640 {"$v7", RTYPE_VEC | 7}, \
1641 {"$v8", RTYPE_VEC | 8}, \
1642 {"$v9", RTYPE_VEC | 9}, \
1643 {"$v10", RTYPE_VEC | 10}, \
1644 {"$v11", RTYPE_VEC | 11}, \
1645 {"$v12", RTYPE_VEC | 12}, \
1646 {"$v13", RTYPE_VEC | 13}, \
1647 {"$v14", RTYPE_VEC | 14}, \
1648 {"$v15", RTYPE_VEC | 15}, \
1649 {"$v16", RTYPE_VEC | 16}, \
1650 {"$v17", RTYPE_VEC | 17}, \
1651 {"$v18", RTYPE_VEC | 18}, \
1652 {"$v19", RTYPE_VEC | 19}, \
1653 {"$v20", RTYPE_VEC | 20}, \
1654 {"$v21", RTYPE_VEC | 21}, \
1655 {"$v22", RTYPE_VEC | 22}, \
1656 {"$v23", RTYPE_VEC | 23}, \
1657 {"$v24", RTYPE_VEC | 24}, \
1658 {"$v25", RTYPE_VEC | 25}, \
1659 {"$v26", RTYPE_VEC | 26}, \
1660 {"$v27", RTYPE_VEC | 27}, \
1661 {"$v28", RTYPE_VEC | 28}, \
1662 {"$v29", RTYPE_VEC | 29}, \
1663 {"$v30", RTYPE_VEC | 30}, \
1664 {"$v31", RTYPE_VEC | 31}
1666 #define MIPS_DSP_ACCUMULATOR_NAMES \
1667 {"$ac0", RTYPE_ACC | 0}, \
1668 {"$ac1", RTYPE_ACC | 1}, \
1669 {"$ac2", RTYPE_ACC | 2}, \
1670 {"$ac3", RTYPE_ACC | 3}
1672 static const struct regname reg_names[] = {
1673 GENERIC_REGISTER_NUMBERS,
1674 FPU_REGISTER_NAMES,
1675 FPU_CONDITION_CODE_NAMES,
1676 COPROC_CONDITION_CODE_NAMES,
1678 /* The $txx registers depends on the abi,
1679 these will be added later into the symbol table from
1680 one of the tables below once mips_abi is set after
1681 parsing of arguments from the command line. */
1682 SYMBOLIC_REGISTER_NAMES,
1684 MIPS16_SPECIAL_REGISTER_NAMES,
1685 MDMX_VECTOR_REGISTER_NAMES,
1686 MIPS_DSP_ACCUMULATOR_NAMES,
1687 {0, 0}
1690 static const struct regname reg_names_o32[] = {
1691 O32_SYMBOLIC_REGISTER_NAMES,
1692 {0, 0}
1695 static const struct regname reg_names_n32n64[] = {
1696 N32N64_SYMBOLIC_REGISTER_NAMES,
1697 {0, 0}
1700 static int
1701 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1703 symbolS *symbolP;
1704 char *e;
1705 char save_c;
1706 int reg = -1;
1708 /* Find end of name. */
1709 e = *s;
1710 if (is_name_beginner (*e))
1711 ++e;
1712 while (is_part_of_name (*e))
1713 ++e;
1715 /* Terminate name. */
1716 save_c = *e;
1717 *e = '\0';
1719 /* Look for a register symbol. */
1720 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1722 int r = S_GET_VALUE (symbolP);
1723 if (r & types)
1724 reg = r & RNUM_MASK;
1725 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1726 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1727 reg = (r & RNUM_MASK) - 2;
1729 /* Else see if this is a register defined in an itbl entry. */
1730 else if ((types & RTYPE_GP) && itbl_have_entries)
1732 char *n = *s;
1733 unsigned long r;
1735 if (*n == '$')
1736 ++n;
1737 if (itbl_get_reg_val (n, &r))
1738 reg = r & RNUM_MASK;
1741 /* Advance to next token if a register was recognised. */
1742 if (reg >= 0)
1743 *s = e;
1744 else if (types & RWARN)
1745 as_warn ("Unrecognized register name `%s'", *s);
1747 *e = save_c;
1748 if (regnop)
1749 *regnop = reg;
1750 return reg >= 0;
1753 /* This function is called once, at assembler startup time. It should set up
1754 all the tables, etc. that the MD part of the assembler will need. */
1756 void
1757 md_begin (void)
1759 const char *retval = NULL;
1760 int i = 0;
1761 int broken = 0;
1763 if (mips_pic != NO_PIC)
1765 if (g_switch_seen && g_switch_value != 0)
1766 as_bad (_("-G may not be used in position-independent code"));
1767 g_switch_value = 0;
1770 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1771 as_warn (_("Could not set architecture and machine"));
1773 op_hash = hash_new ();
1775 for (i = 0; i < NUMOPCODES;)
1777 const char *name = mips_opcodes[i].name;
1779 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1780 if (retval != NULL)
1782 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1783 mips_opcodes[i].name, retval);
1784 /* Probably a memory allocation problem? Give up now. */
1785 as_fatal (_("Broken assembler. No assembly attempted."));
1789 if (mips_opcodes[i].pinfo != INSN_MACRO)
1791 if (!validate_mips_insn (&mips_opcodes[i]))
1792 broken = 1;
1793 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1795 create_insn (&nop_insn, mips_opcodes + i);
1796 nop_insn.fixed_p = 1;
1799 ++i;
1801 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1804 mips16_op_hash = hash_new ();
1806 i = 0;
1807 while (i < bfd_mips16_num_opcodes)
1809 const char *name = mips16_opcodes[i].name;
1811 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1812 if (retval != NULL)
1813 as_fatal (_("internal: can't hash `%s': %s"),
1814 mips16_opcodes[i].name, retval);
1817 if (mips16_opcodes[i].pinfo != INSN_MACRO
1818 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1819 != mips16_opcodes[i].match))
1821 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1822 mips16_opcodes[i].name, mips16_opcodes[i].args);
1823 broken = 1;
1825 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1827 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1828 mips16_nop_insn.fixed_p = 1;
1830 ++i;
1832 while (i < bfd_mips16_num_opcodes
1833 && strcmp (mips16_opcodes[i].name, name) == 0);
1836 if (broken)
1837 as_fatal (_("Broken assembler. No assembly attempted."));
1839 /* We add all the general register names to the symbol table. This
1840 helps us detect invalid uses of them. */
1841 for (i = 0; reg_names[i].name; i++)
1842 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1843 reg_names[i].num, // & RNUM_MASK,
1844 &zero_address_frag));
1845 if (HAVE_NEWABI)
1846 for (i = 0; reg_names_n32n64[i].name; i++)
1847 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1848 reg_names_n32n64[i].num, // & RNUM_MASK,
1849 &zero_address_frag));
1850 else
1851 for (i = 0; reg_names_o32[i].name; i++)
1852 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1853 reg_names_o32[i].num, // & RNUM_MASK,
1854 &zero_address_frag));
1856 mips_no_prev_insn ();
1858 mips_gprmask = 0;
1859 mips_cprmask[0] = 0;
1860 mips_cprmask[1] = 0;
1861 mips_cprmask[2] = 0;
1862 mips_cprmask[3] = 0;
1864 /* set the default alignment for the text section (2**2) */
1865 record_alignment (text_section, 2);
1867 bfd_set_gp_size (stdoutput, g_switch_value);
1869 #ifdef OBJ_ELF
1870 if (IS_ELF)
1872 /* On a native system other than VxWorks, sections must be aligned
1873 to 16 byte boundaries. When configured for an embedded ELF
1874 target, we don't bother. */
1875 if (strcmp (TARGET_OS, "elf") != 0
1876 && strcmp (TARGET_OS, "vxworks") != 0)
1878 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1879 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1880 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1883 /* Create a .reginfo section for register masks and a .mdebug
1884 section for debugging information. */
1886 segT seg;
1887 subsegT subseg;
1888 flagword flags;
1889 segT sec;
1891 seg = now_seg;
1892 subseg = now_subseg;
1894 /* The ABI says this section should be loaded so that the
1895 running program can access it. However, we don't load it
1896 if we are configured for an embedded target */
1897 flags = SEC_READONLY | SEC_DATA;
1898 if (strcmp (TARGET_OS, "elf") != 0)
1899 flags |= SEC_ALLOC | SEC_LOAD;
1901 if (mips_abi != N64_ABI)
1903 sec = subseg_new (".reginfo", (subsegT) 0);
1905 bfd_set_section_flags (stdoutput, sec, flags);
1906 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1908 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1910 else
1912 /* The 64-bit ABI uses a .MIPS.options section rather than
1913 .reginfo section. */
1914 sec = subseg_new (".MIPS.options", (subsegT) 0);
1915 bfd_set_section_flags (stdoutput, sec, flags);
1916 bfd_set_section_alignment (stdoutput, sec, 3);
1918 /* Set up the option header. */
1920 Elf_Internal_Options opthdr;
1921 char *f;
1923 opthdr.kind = ODK_REGINFO;
1924 opthdr.size = (sizeof (Elf_External_Options)
1925 + sizeof (Elf64_External_RegInfo));
1926 opthdr.section = 0;
1927 opthdr.info = 0;
1928 f = frag_more (sizeof (Elf_External_Options));
1929 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1930 (Elf_External_Options *) f);
1932 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1936 if (ECOFF_DEBUGGING)
1938 sec = subseg_new (".mdebug", (subsegT) 0);
1939 (void) bfd_set_section_flags (stdoutput, sec,
1940 SEC_HAS_CONTENTS | SEC_READONLY);
1941 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1943 else if (mips_flag_pdr)
1945 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1946 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1947 SEC_READONLY | SEC_RELOC
1948 | SEC_DEBUGGING);
1949 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1952 subseg_set (seg, subseg);
1955 #endif /* OBJ_ELF */
1957 if (! ECOFF_DEBUGGING)
1958 md_obj_begin ();
1960 if (mips_fix_vr4120)
1961 init_vr4120_conflicts ();
1964 void
1965 md_mips_end (void)
1967 if (! ECOFF_DEBUGGING)
1968 md_obj_end ();
1971 void
1972 md_assemble (char *str)
1974 struct mips_cl_insn insn;
1975 bfd_reloc_code_real_type unused_reloc[3]
1976 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1978 imm_expr.X_op = O_absent;
1979 imm2_expr.X_op = O_absent;
1980 offset_expr.X_op = O_absent;
1981 imm_reloc[0] = BFD_RELOC_UNUSED;
1982 imm_reloc[1] = BFD_RELOC_UNUSED;
1983 imm_reloc[2] = BFD_RELOC_UNUSED;
1984 offset_reloc[0] = BFD_RELOC_UNUSED;
1985 offset_reloc[1] = BFD_RELOC_UNUSED;
1986 offset_reloc[2] = BFD_RELOC_UNUSED;
1988 if (mips_opts.mips16)
1989 mips16_ip (str, &insn);
1990 else
1992 mips_ip (str, &insn);
1993 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1994 str, insn.insn_opcode));
1997 if (insn_error)
1999 as_bad ("%s `%s'", insn_error, str);
2000 return;
2003 if (insn.insn_mo->pinfo == INSN_MACRO)
2005 macro_start ();
2006 if (mips_opts.mips16)
2007 mips16_macro (&insn);
2008 else
2009 macro (&insn);
2010 macro_end ();
2012 else
2014 if (imm_expr.X_op != O_absent)
2015 append_insn (&insn, &imm_expr, imm_reloc);
2016 else if (offset_expr.X_op != O_absent)
2017 append_insn (&insn, &offset_expr, offset_reloc);
2018 else
2019 append_insn (&insn, NULL, unused_reloc);
2023 /* Return true if the given relocation might need a matching %lo().
2024 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2025 need a matching %lo() when applied to local symbols. */
2027 static inline bfd_boolean
2028 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2030 return (HAVE_IN_PLACE_ADDENDS
2031 && (reloc == BFD_RELOC_HI16_S
2032 || reloc == BFD_RELOC_MIPS16_HI16_S
2033 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2034 all GOT16 relocations evaluate to "G". */
2035 || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2038 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2039 relocation. */
2041 static inline bfd_boolean
2042 fixup_has_matching_lo_p (fixS *fixp)
2044 return (fixp->fx_next != NULL
2045 && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2046 || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2047 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2048 && fixp->fx_offset == fixp->fx_next->fx_offset);
2051 /* See whether instruction IP reads register REG. CLASS is the type
2052 of register. */
2054 static int
2055 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2056 enum mips_regclass class)
2058 if (class == MIPS16_REG)
2060 assert (mips_opts.mips16);
2061 reg = mips16_to_32_reg_map[reg];
2062 class = MIPS_GR_REG;
2065 /* Don't report on general register ZERO, since it never changes. */
2066 if (class == MIPS_GR_REG && reg == ZERO)
2067 return 0;
2069 if (class == MIPS_FP_REG)
2071 assert (! mips_opts.mips16);
2072 /* If we are called with either $f0 or $f1, we must check $f0.
2073 This is not optimal, because it will introduce an unnecessary
2074 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2075 need to distinguish reading both $f0 and $f1 or just one of
2076 them. Note that we don't have to check the other way,
2077 because there is no instruction that sets both $f0 and $f1
2078 and requires a delay. */
2079 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2080 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2081 == (reg &~ (unsigned) 1)))
2082 return 1;
2083 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2084 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2085 == (reg &~ (unsigned) 1)))
2086 return 1;
2088 else if (! mips_opts.mips16)
2090 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2091 && EXTRACT_OPERAND (RS, *ip) == reg)
2092 return 1;
2093 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2094 && EXTRACT_OPERAND (RT, *ip) == reg)
2095 return 1;
2097 else
2099 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2100 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2101 return 1;
2102 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2103 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2104 return 1;
2105 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2106 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2107 == reg))
2108 return 1;
2109 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2110 return 1;
2111 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2112 return 1;
2113 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2114 return 1;
2115 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2116 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2117 return 1;
2120 return 0;
2123 /* This function returns true if modifying a register requires a
2124 delay. */
2126 static int
2127 reg_needs_delay (unsigned int reg)
2129 unsigned long prev_pinfo;
2131 prev_pinfo = history[0].insn_mo->pinfo;
2132 if (! mips_opts.noreorder
2133 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2134 && ! gpr_interlocks)
2135 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2136 && ! cop_interlocks)))
2138 /* A load from a coprocessor or from memory. All load delays
2139 delay the use of general register rt for one instruction. */
2140 /* Itbl support may require additional care here. */
2141 know (prev_pinfo & INSN_WRITE_GPR_T);
2142 if (reg == EXTRACT_OPERAND (RT, history[0]))
2143 return 1;
2146 return 0;
2149 /* Move all labels in insn_labels to the current insertion point. */
2151 static void
2152 mips_move_labels (void)
2154 segment_info_type *si = seg_info (now_seg);
2155 struct insn_label_list *l;
2156 valueT val;
2158 for (l = si->label_list; l != NULL; l = l->next)
2160 assert (S_GET_SEGMENT (l->label) == now_seg);
2161 symbol_set_frag (l->label, frag_now);
2162 val = (valueT) frag_now_fix ();
2163 /* mips16 text labels are stored as odd. */
2164 if (mips_opts.mips16)
2165 ++val;
2166 S_SET_VALUE (l->label, val);
2170 static bfd_boolean
2171 s_is_linkonce (symbolS *sym, segT from_seg)
2173 bfd_boolean linkonce = FALSE;
2174 segT symseg = S_GET_SEGMENT (sym);
2176 if (symseg != from_seg && !S_IS_LOCAL (sym))
2178 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2179 linkonce = TRUE;
2180 #ifdef OBJ_ELF
2181 /* The GNU toolchain uses an extension for ELF: a section
2182 beginning with the magic string .gnu.linkonce is a
2183 linkonce section. */
2184 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2185 sizeof ".gnu.linkonce" - 1) == 0)
2186 linkonce = TRUE;
2187 #endif
2189 return linkonce;
2192 /* Mark instruction labels in mips16 mode. This permits the linker to
2193 handle them specially, such as generating jalx instructions when
2194 needed. We also make them odd for the duration of the assembly, in
2195 order to generate the right sort of code. We will make them even
2196 in the adjust_symtab routine, while leaving them marked. This is
2197 convenient for the debugger and the disassembler. The linker knows
2198 to make them odd again. */
2200 static void
2201 mips16_mark_labels (void)
2203 segment_info_type *si = seg_info (now_seg);
2204 struct insn_label_list *l;
2206 if (!mips_opts.mips16)
2207 return;
2209 for (l = si->label_list; l != NULL; l = l->next)
2211 symbolS *label = l->label;
2213 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2214 if (IS_ELF)
2215 S_SET_OTHER (label, STO_MIPS16);
2216 #endif
2217 if ((S_GET_VALUE (label) & 1) == 0
2218 /* Don't adjust the address if the label is global or weak, or
2219 in a link-once section, since we'll be emitting symbol reloc
2220 references to it which will be patched up by the linker, and
2221 the final value of the symbol may or may not be MIPS16. */
2222 && ! S_IS_WEAK (label)
2223 && ! S_IS_EXTERNAL (label)
2224 && ! s_is_linkonce (label, now_seg))
2225 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2229 /* End the current frag. Make it a variant frag and record the
2230 relaxation info. */
2232 static void
2233 relax_close_frag (void)
2235 mips_macro_warning.first_frag = frag_now;
2236 frag_var (rs_machine_dependent, 0, 0,
2237 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2238 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2240 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2241 mips_relax.first_fixup = 0;
2244 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2245 See the comment above RELAX_ENCODE for more details. */
2247 static void
2248 relax_start (symbolS *symbol)
2250 assert (mips_relax.sequence == 0);
2251 mips_relax.sequence = 1;
2252 mips_relax.symbol = symbol;
2255 /* Start generating the second version of a relaxable sequence.
2256 See the comment above RELAX_ENCODE for more details. */
2258 static void
2259 relax_switch (void)
2261 assert (mips_relax.sequence == 1);
2262 mips_relax.sequence = 2;
2265 /* End the current relaxable sequence. */
2267 static void
2268 relax_end (void)
2270 assert (mips_relax.sequence == 2);
2271 relax_close_frag ();
2272 mips_relax.sequence = 0;
2275 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2276 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2277 by VR4120 errata. */
2279 static unsigned int
2280 classify_vr4120_insn (const char *name)
2282 if (strncmp (name, "macc", 4) == 0)
2283 return FIX_VR4120_MACC;
2284 if (strncmp (name, "dmacc", 5) == 0)
2285 return FIX_VR4120_DMACC;
2286 if (strncmp (name, "mult", 4) == 0)
2287 return FIX_VR4120_MULT;
2288 if (strncmp (name, "dmult", 5) == 0)
2289 return FIX_VR4120_DMULT;
2290 if (strstr (name, "div"))
2291 return FIX_VR4120_DIV;
2292 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2293 return FIX_VR4120_MTHILO;
2294 return NUM_FIX_VR4120_CLASSES;
2297 /* Return the number of instructions that must separate INSN1 and INSN2,
2298 where INSN1 is the earlier instruction. Return the worst-case value
2299 for any INSN2 if INSN2 is null. */
2301 static unsigned int
2302 insns_between (const struct mips_cl_insn *insn1,
2303 const struct mips_cl_insn *insn2)
2305 unsigned long pinfo1, pinfo2;
2307 /* This function needs to know which pinfo flags are set for INSN2
2308 and which registers INSN2 uses. The former is stored in PINFO2 and
2309 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2310 will have every flag set and INSN2_USES_REG will always return true. */
2311 pinfo1 = insn1->insn_mo->pinfo;
2312 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2314 #define INSN2_USES_REG(REG, CLASS) \
2315 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2317 /* For most targets, write-after-read dependencies on the HI and LO
2318 registers must be separated by at least two instructions. */
2319 if (!hilo_interlocks)
2321 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2322 return 2;
2323 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2324 return 2;
2327 /* If we're working around r7000 errata, there must be two instructions
2328 between an mfhi or mflo and any instruction that uses the result. */
2329 if (mips_7000_hilo_fix
2330 && MF_HILO_INSN (pinfo1)
2331 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2332 return 2;
2334 /* If working around VR4120 errata, check for combinations that need
2335 a single intervening instruction. */
2336 if (mips_fix_vr4120)
2338 unsigned int class1, class2;
2340 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2341 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2343 if (insn2 == NULL)
2344 return 1;
2345 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2346 if (vr4120_conflicts[class1] & (1 << class2))
2347 return 1;
2351 if (!mips_opts.mips16)
2353 /* Check for GPR or coprocessor load delays. All such delays
2354 are on the RT register. */
2355 /* Itbl support may require additional care here. */
2356 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2357 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2359 know (pinfo1 & INSN_WRITE_GPR_T);
2360 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2361 return 1;
2364 /* Check for generic coprocessor hazards.
2366 This case is not handled very well. There is no special
2367 knowledge of CP0 handling, and the coprocessors other than
2368 the floating point unit are not distinguished at all. */
2369 /* Itbl support may require additional care here. FIXME!
2370 Need to modify this to include knowledge about
2371 user specified delays! */
2372 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2373 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2375 /* Handle cases where INSN1 writes to a known general coprocessor
2376 register. There must be a one instruction delay before INSN2
2377 if INSN2 reads that register, otherwise no delay is needed. */
2378 if (pinfo1 & INSN_WRITE_FPR_T)
2380 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2381 return 1;
2383 else if (pinfo1 & INSN_WRITE_FPR_S)
2385 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2386 return 1;
2388 else
2390 /* Read-after-write dependencies on the control registers
2391 require a two-instruction gap. */
2392 if ((pinfo1 & INSN_WRITE_COND_CODE)
2393 && (pinfo2 & INSN_READ_COND_CODE))
2394 return 2;
2396 /* We don't know exactly what INSN1 does. If INSN2 is
2397 also a coprocessor instruction, assume there must be
2398 a one instruction gap. */
2399 if (pinfo2 & INSN_COP)
2400 return 1;
2404 /* Check for read-after-write dependencies on the coprocessor
2405 control registers in cases where INSN1 does not need a general
2406 coprocessor delay. This means that INSN1 is a floating point
2407 comparison instruction. */
2408 /* Itbl support may require additional care here. */
2409 else if (!cop_interlocks
2410 && (pinfo1 & INSN_WRITE_COND_CODE)
2411 && (pinfo2 & INSN_READ_COND_CODE))
2412 return 1;
2415 #undef INSN2_USES_REG
2417 return 0;
2420 /* Return the number of nops that would be needed to work around the
2421 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2422 the MAX_VR4130_NOPS instructions described by HISTORY. */
2424 static int
2425 nops_for_vr4130 (const struct mips_cl_insn *history,
2426 const struct mips_cl_insn *insn)
2428 int i, j, reg;
2430 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2431 are not affected by the errata. */
2432 if (insn != 0
2433 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2434 || strcmp (insn->insn_mo->name, "mtlo") == 0
2435 || strcmp (insn->insn_mo->name, "mthi") == 0))
2436 return 0;
2438 /* Search for the first MFLO or MFHI. */
2439 for (i = 0; i < MAX_VR4130_NOPS; i++)
2440 if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2442 /* Extract the destination register. */
2443 if (mips_opts.mips16)
2444 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2445 else
2446 reg = EXTRACT_OPERAND (RD, history[i]);
2448 /* No nops are needed if INSN reads that register. */
2449 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2450 return 0;
2452 /* ...or if any of the intervening instructions do. */
2453 for (j = 0; j < i; j++)
2454 if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2455 return 0;
2457 return MAX_VR4130_NOPS - i;
2459 return 0;
2462 /* Return the number of nops that would be needed if instruction INSN
2463 immediately followed the MAX_NOPS instructions given by HISTORY,
2464 where HISTORY[0] is the most recent instruction. If INSN is null,
2465 return the worse-case number of nops for any instruction. */
2467 static int
2468 nops_for_insn (const struct mips_cl_insn *history,
2469 const struct mips_cl_insn *insn)
2471 int i, nops, tmp_nops;
2473 nops = 0;
2474 for (i = 0; i < MAX_DELAY_NOPS; i++)
2475 if (!history[i].noreorder_p)
2477 tmp_nops = insns_between (history + i, insn) - i;
2478 if (tmp_nops > nops)
2479 nops = tmp_nops;
2482 if (mips_fix_vr4130)
2484 tmp_nops = nops_for_vr4130 (history, insn);
2485 if (tmp_nops > nops)
2486 nops = tmp_nops;
2489 return nops;
2492 /* The variable arguments provide NUM_INSNS extra instructions that
2493 might be added to HISTORY. Return the largest number of nops that
2494 would be needed after the extended sequence. */
2496 static int
2497 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2499 va_list args;
2500 struct mips_cl_insn buffer[MAX_NOPS];
2501 struct mips_cl_insn *cursor;
2502 int nops;
2504 va_start (args, history);
2505 cursor = buffer + num_insns;
2506 memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2507 while (cursor > buffer)
2508 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2510 nops = nops_for_insn (buffer, NULL);
2511 va_end (args);
2512 return nops;
2515 /* Like nops_for_insn, but if INSN is a branch, take into account the
2516 worst-case delay for the branch target. */
2518 static int
2519 nops_for_insn_or_target (const struct mips_cl_insn *history,
2520 const struct mips_cl_insn *insn)
2522 int nops, tmp_nops;
2524 nops = nops_for_insn (history, insn);
2525 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2526 | INSN_COND_BRANCH_DELAY
2527 | INSN_COND_BRANCH_LIKELY))
2529 tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2530 if (tmp_nops > nops)
2531 nops = tmp_nops;
2533 else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2535 tmp_nops = nops_for_sequence (1, history, insn);
2536 if (tmp_nops > nops)
2537 nops = tmp_nops;
2539 return nops;
2542 /* Output an instruction. IP is the instruction information.
2543 ADDRESS_EXPR is an operand of the instruction to be used with
2544 RELOC_TYPE. */
2546 static void
2547 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2548 bfd_reloc_code_real_type *reloc_type)
2550 unsigned long prev_pinfo, pinfo;
2551 relax_stateT prev_insn_frag_type = 0;
2552 bfd_boolean relaxed_branch = FALSE;
2553 segment_info_type *si = seg_info (now_seg);
2555 /* Mark instruction labels in mips16 mode. */
2556 mips16_mark_labels ();
2558 prev_pinfo = history[0].insn_mo->pinfo;
2559 pinfo = ip->insn_mo->pinfo;
2561 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2563 /* There are a lot of optimizations we could do that we don't.
2564 In particular, we do not, in general, reorder instructions.
2565 If you use gcc with optimization, it will reorder
2566 instructions and generally do much more optimization then we
2567 do here; repeating all that work in the assembler would only
2568 benefit hand written assembly code, and does not seem worth
2569 it. */
2570 int nops = (mips_optimize == 0
2571 ? nops_for_insn (history, NULL)
2572 : nops_for_insn_or_target (history, ip));
2573 if (nops > 0)
2575 fragS *old_frag;
2576 unsigned long old_frag_offset;
2577 int i;
2579 old_frag = frag_now;
2580 old_frag_offset = frag_now_fix ();
2582 for (i = 0; i < nops; i++)
2583 emit_nop ();
2585 if (listing)
2587 listing_prev_line ();
2588 /* We may be at the start of a variant frag. In case we
2589 are, make sure there is enough space for the frag
2590 after the frags created by listing_prev_line. The
2591 argument to frag_grow here must be at least as large
2592 as the argument to all other calls to frag_grow in
2593 this file. We don't have to worry about being in the
2594 middle of a variant frag, because the variants insert
2595 all needed nop instructions themselves. */
2596 frag_grow (40);
2599 mips_move_labels ();
2601 #ifndef NO_ECOFF_DEBUGGING
2602 if (ECOFF_DEBUGGING)
2603 ecoff_fix_loc (old_frag, old_frag_offset);
2604 #endif
2607 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2609 /* Work out how many nops in prev_nop_frag are needed by IP. */
2610 int nops = nops_for_insn_or_target (history, ip);
2611 assert (nops <= prev_nop_frag_holds);
2613 /* Enforce NOPS as a minimum. */
2614 if (nops > prev_nop_frag_required)
2615 prev_nop_frag_required = nops;
2617 if (prev_nop_frag_holds == prev_nop_frag_required)
2619 /* Settle for the current number of nops. Update the history
2620 accordingly (for the benefit of any future .set reorder code). */
2621 prev_nop_frag = NULL;
2622 insert_into_history (prev_nop_frag_since,
2623 prev_nop_frag_holds, NOP_INSN);
2625 else
2627 /* Allow this instruction to replace one of the nops that was
2628 tentatively added to prev_nop_frag. */
2629 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2630 prev_nop_frag_holds--;
2631 prev_nop_frag_since++;
2635 #ifdef OBJ_ELF
2636 /* The value passed to dwarf2_emit_insn is the distance between
2637 the beginning of the current instruction and the address that
2638 should be recorded in the debug tables. For MIPS16 debug info
2639 we want to use ISA-encoded addresses, so we pass -1 for an
2640 address higher by one than the current. */
2641 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2642 #endif
2644 /* Record the frag type before frag_var. */
2645 if (history[0].frag)
2646 prev_insn_frag_type = history[0].frag->fr_type;
2648 if (address_expr
2649 && *reloc_type == BFD_RELOC_16_PCREL_S2
2650 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2651 || pinfo & INSN_COND_BRANCH_LIKELY)
2652 && mips_relax_branch
2653 /* Don't try branch relaxation within .set nomacro, or within
2654 .set noat if we use $at for PIC computations. If it turns
2655 out that the branch was out-of-range, we'll get an error. */
2656 && !mips_opts.warn_about_macros
2657 && (mips_opts.at || mips_pic == NO_PIC)
2658 && !mips_opts.mips16)
2660 relaxed_branch = TRUE;
2661 add_relaxed_insn (ip, (relaxed_branch_length
2662 (NULL, NULL,
2663 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2664 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2665 : 0)), 4,
2666 RELAX_BRANCH_ENCODE
2667 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2668 pinfo & INSN_COND_BRANCH_LIKELY,
2669 pinfo & INSN_WRITE_GPR_31,
2671 address_expr->X_add_symbol,
2672 address_expr->X_add_number);
2673 *reloc_type = BFD_RELOC_UNUSED;
2675 else if (*reloc_type > BFD_RELOC_UNUSED)
2677 /* We need to set up a variant frag. */
2678 assert (mips_opts.mips16 && address_expr != NULL);
2679 add_relaxed_insn (ip, 4, 0,
2680 RELAX_MIPS16_ENCODE
2681 (*reloc_type - BFD_RELOC_UNUSED,
2682 mips16_small, mips16_ext,
2683 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2684 history[0].mips16_absolute_jump_p),
2685 make_expr_symbol (address_expr), 0);
2687 else if (mips_opts.mips16
2688 && ! ip->use_extend
2689 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2691 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2692 /* Make sure there is enough room to swap this instruction with
2693 a following jump instruction. */
2694 frag_grow (6);
2695 add_fixed_insn (ip);
2697 else
2699 if (mips_opts.mips16
2700 && mips_opts.noreorder
2701 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2702 as_warn (_("extended instruction in delay slot"));
2704 if (mips_relax.sequence)
2706 /* If we've reached the end of this frag, turn it into a variant
2707 frag and record the information for the instructions we've
2708 written so far. */
2709 if (frag_room () < 4)
2710 relax_close_frag ();
2711 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2714 if (mips_relax.sequence != 2)
2715 mips_macro_warning.sizes[0] += 4;
2716 if (mips_relax.sequence != 1)
2717 mips_macro_warning.sizes[1] += 4;
2719 if (mips_opts.mips16)
2721 ip->fixed_p = 1;
2722 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2724 add_fixed_insn (ip);
2727 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2729 if (address_expr->X_op == O_constant)
2731 unsigned int tmp;
2733 switch (*reloc_type)
2735 case BFD_RELOC_32:
2736 ip->insn_opcode |= address_expr->X_add_number;
2737 break;
2739 case BFD_RELOC_MIPS_HIGHEST:
2740 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2741 ip->insn_opcode |= tmp & 0xffff;
2742 break;
2744 case BFD_RELOC_MIPS_HIGHER:
2745 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2746 ip->insn_opcode |= tmp & 0xffff;
2747 break;
2749 case BFD_RELOC_HI16_S:
2750 tmp = (address_expr->X_add_number + 0x8000) >> 16;
2751 ip->insn_opcode |= tmp & 0xffff;
2752 break;
2754 case BFD_RELOC_HI16:
2755 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2756 break;
2758 case BFD_RELOC_UNUSED:
2759 case BFD_RELOC_LO16:
2760 case BFD_RELOC_MIPS_GOT_DISP:
2761 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2762 break;
2764 case BFD_RELOC_MIPS_JMP:
2765 if ((address_expr->X_add_number & 3) != 0)
2766 as_bad (_("jump to misaligned address (0x%lx)"),
2767 (unsigned long) address_expr->X_add_number);
2768 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2769 break;
2771 case BFD_RELOC_MIPS16_JMP:
2772 if ((address_expr->X_add_number & 3) != 0)
2773 as_bad (_("jump to misaligned address (0x%lx)"),
2774 (unsigned long) address_expr->X_add_number);
2775 ip->insn_opcode |=
2776 (((address_expr->X_add_number & 0x7c0000) << 3)
2777 | ((address_expr->X_add_number & 0xf800000) >> 7)
2778 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2779 break;
2781 case BFD_RELOC_16_PCREL_S2:
2782 if ((address_expr->X_add_number & 3) != 0)
2783 as_bad (_("branch to misaligned address (0x%lx)"),
2784 (unsigned long) address_expr->X_add_number);
2785 if (mips_relax_branch)
2786 goto need_reloc;
2787 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2788 as_bad (_("branch address range overflow (0x%lx)"),
2789 (unsigned long) address_expr->X_add_number);
2790 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2791 break;
2793 default:
2794 internalError ();
2797 else if (*reloc_type < BFD_RELOC_UNUSED)
2798 need_reloc:
2800 reloc_howto_type *howto;
2801 int i;
2803 /* In a compound relocation, it is the final (outermost)
2804 operator that determines the relocated field. */
2805 for (i = 1; i < 3; i++)
2806 if (reloc_type[i] == BFD_RELOC_UNUSED)
2807 break;
2809 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2810 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2811 bfd_get_reloc_size (howto),
2812 address_expr,
2813 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2814 reloc_type[0]);
2816 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
2817 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2818 && ip->fixp[0]->fx_addsy)
2819 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2821 /* These relocations can have an addend that won't fit in
2822 4 octets for 64bit assembly. */
2823 if (HAVE_64BIT_GPRS
2824 && ! howto->partial_inplace
2825 && (reloc_type[0] == BFD_RELOC_16
2826 || reloc_type[0] == BFD_RELOC_32
2827 || reloc_type[0] == BFD_RELOC_MIPS_JMP
2828 || reloc_type[0] == BFD_RELOC_HI16_S
2829 || reloc_type[0] == BFD_RELOC_LO16
2830 || reloc_type[0] == BFD_RELOC_GPREL16
2831 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2832 || reloc_type[0] == BFD_RELOC_GPREL32
2833 || reloc_type[0] == BFD_RELOC_64
2834 || reloc_type[0] == BFD_RELOC_CTOR
2835 || reloc_type[0] == BFD_RELOC_MIPS_SUB
2836 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2837 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2838 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2839 || reloc_type[0] == BFD_RELOC_MIPS_REL16
2840 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2841 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2842 || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2843 || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2844 ip->fixp[0]->fx_no_overflow = 1;
2846 if (mips_relax.sequence)
2848 if (mips_relax.first_fixup == 0)
2849 mips_relax.first_fixup = ip->fixp[0];
2851 else if (reloc_needs_lo_p (*reloc_type))
2853 struct mips_hi_fixup *hi_fixup;
2855 /* Reuse the last entry if it already has a matching %lo. */
2856 hi_fixup = mips_hi_fixup_list;
2857 if (hi_fixup == 0
2858 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2860 hi_fixup = ((struct mips_hi_fixup *)
2861 xmalloc (sizeof (struct mips_hi_fixup)));
2862 hi_fixup->next = mips_hi_fixup_list;
2863 mips_hi_fixup_list = hi_fixup;
2865 hi_fixup->fixp = ip->fixp[0];
2866 hi_fixup->seg = now_seg;
2869 /* Add fixups for the second and third relocations, if given.
2870 Note that the ABI allows the second relocation to be
2871 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
2872 moment we only use RSS_UNDEF, but we could add support
2873 for the others if it ever becomes necessary. */
2874 for (i = 1; i < 3; i++)
2875 if (reloc_type[i] != BFD_RELOC_UNUSED)
2877 ip->fixp[i] = fix_new (ip->frag, ip->where,
2878 ip->fixp[0]->fx_size, NULL, 0,
2879 FALSE, reloc_type[i]);
2881 /* Use fx_tcbit to mark compound relocs. */
2882 ip->fixp[0]->fx_tcbit = 1;
2883 ip->fixp[i]->fx_tcbit = 1;
2887 install_insn (ip);
2889 /* Update the register mask information. */
2890 if (! mips_opts.mips16)
2892 if (pinfo & INSN_WRITE_GPR_D)
2893 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2894 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2895 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2896 if (pinfo & INSN_READ_GPR_S)
2897 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2898 if (pinfo & INSN_WRITE_GPR_31)
2899 mips_gprmask |= 1 << RA;
2900 if (pinfo & INSN_WRITE_FPR_D)
2901 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2902 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2903 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2904 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2905 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2906 if ((pinfo & INSN_READ_FPR_R) != 0)
2907 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2908 if (pinfo & INSN_COP)
2910 /* We don't keep enough information to sort these cases out.
2911 The itbl support does keep this information however, although
2912 we currently don't support itbl fprmats as part of the cop
2913 instruction. May want to add this support in the future. */
2915 /* Never set the bit for $0, which is always zero. */
2916 mips_gprmask &= ~1 << 0;
2918 else
2920 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2921 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2922 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2923 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2924 if (pinfo & MIPS16_INSN_WRITE_Z)
2925 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2926 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2927 mips_gprmask |= 1 << TREG;
2928 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2929 mips_gprmask |= 1 << SP;
2930 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2931 mips_gprmask |= 1 << RA;
2932 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2933 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2934 if (pinfo & MIPS16_INSN_READ_Z)
2935 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2936 if (pinfo & MIPS16_INSN_READ_GPR_X)
2937 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2940 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2942 /* Filling the branch delay slot is more complex. We try to
2943 switch the branch with the previous instruction, which we can
2944 do if the previous instruction does not set up a condition
2945 that the branch tests and if the branch is not itself the
2946 target of any branch. */
2947 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2948 || (pinfo & INSN_COND_BRANCH_DELAY))
2950 if (mips_optimize < 2
2951 /* If we have seen .set volatile or .set nomove, don't
2952 optimize. */
2953 || mips_opts.nomove != 0
2954 /* We can't swap if the previous instruction's position
2955 is fixed. */
2956 || history[0].fixed_p
2957 /* If the previous previous insn was in a .set
2958 noreorder, we can't swap. Actually, the MIPS
2959 assembler will swap in this situation. However, gcc
2960 configured -with-gnu-as will generate code like
2961 .set noreorder
2962 lw $4,XXX
2963 .set reorder
2964 INSN
2965 bne $4,$0,foo
2966 in which we can not swap the bne and INSN. If gcc is
2967 not configured -with-gnu-as, it does not output the
2968 .set pseudo-ops. */
2969 || history[1].noreorder_p
2970 /* If the branch is itself the target of a branch, we
2971 can not swap. We cheat on this; all we check for is
2972 whether there is a label on this instruction. If
2973 there are any branches to anything other than a
2974 label, users must use .set noreorder. */
2975 || si->label_list != NULL
2976 /* If the previous instruction is in a variant frag
2977 other than this branch's one, we cannot do the swap.
2978 This does not apply to the mips16, which uses variant
2979 frags for different purposes. */
2980 || (! mips_opts.mips16
2981 && prev_insn_frag_type == rs_machine_dependent)
2982 /* Check for conflicts between the branch and the instructions
2983 before the candidate delay slot. */
2984 || nops_for_insn (history + 1, ip) > 0
2985 /* Check for conflicts between the swapped sequence and the
2986 target of the branch. */
2987 || nops_for_sequence (2, history + 1, ip, history) > 0
2988 /* We do not swap with a trap instruction, since it
2989 complicates trap handlers to have the trap
2990 instruction be in a delay slot. */
2991 || (prev_pinfo & INSN_TRAP)
2992 /* If the branch reads a register that the previous
2993 instruction sets, we can not swap. */
2994 || (! mips_opts.mips16
2995 && (prev_pinfo & INSN_WRITE_GPR_T)
2996 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2997 MIPS_GR_REG))
2998 || (! mips_opts.mips16
2999 && (prev_pinfo & INSN_WRITE_GPR_D)
3000 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3001 MIPS_GR_REG))
3002 || (mips_opts.mips16
3003 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3004 && (insn_uses_reg
3005 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3006 MIPS16_REG)))
3007 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3008 && (insn_uses_reg
3009 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3010 MIPS16_REG)))
3011 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3012 && (insn_uses_reg
3013 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3014 MIPS16_REG)))
3015 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3016 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3017 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3018 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3019 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3020 && insn_uses_reg (ip,
3021 MIPS16OP_EXTRACT_REG32R
3022 (history[0].insn_opcode),
3023 MIPS_GR_REG))))
3024 /* If the branch writes a register that the previous
3025 instruction sets, we can not swap (we know that
3026 branches write only to RD or to $31). */
3027 || (! mips_opts.mips16
3028 && (prev_pinfo & INSN_WRITE_GPR_T)
3029 && (((pinfo & INSN_WRITE_GPR_D)
3030 && (EXTRACT_OPERAND (RT, history[0])
3031 == EXTRACT_OPERAND (RD, *ip)))
3032 || ((pinfo & INSN_WRITE_GPR_31)
3033 && EXTRACT_OPERAND (RT, history[0]) == RA)))
3034 || (! mips_opts.mips16
3035 && (prev_pinfo & INSN_WRITE_GPR_D)
3036 && (((pinfo & INSN_WRITE_GPR_D)
3037 && (EXTRACT_OPERAND (RD, history[0])
3038 == EXTRACT_OPERAND (RD, *ip)))
3039 || ((pinfo & INSN_WRITE_GPR_31)
3040 && EXTRACT_OPERAND (RD, history[0]) == RA)))
3041 || (mips_opts.mips16
3042 && (pinfo & MIPS16_INSN_WRITE_31)
3043 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3044 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3045 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3046 == RA))))
3047 /* If the branch writes a register that the previous
3048 instruction reads, we can not swap (we know that
3049 branches only write to RD or to $31). */
3050 || (! mips_opts.mips16
3051 && (pinfo & INSN_WRITE_GPR_D)
3052 && insn_uses_reg (&history[0],
3053 EXTRACT_OPERAND (RD, *ip),
3054 MIPS_GR_REG))
3055 || (! mips_opts.mips16
3056 && (pinfo & INSN_WRITE_GPR_31)
3057 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3058 || (mips_opts.mips16
3059 && (pinfo & MIPS16_INSN_WRITE_31)
3060 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3061 /* If one instruction sets a condition code and the
3062 other one uses a condition code, we can not swap. */
3063 || ((pinfo & INSN_READ_COND_CODE)
3064 && (prev_pinfo & INSN_WRITE_COND_CODE))
3065 || ((pinfo & INSN_WRITE_COND_CODE)
3066 && (prev_pinfo & INSN_READ_COND_CODE))
3067 /* If the previous instruction uses the PC, we can not
3068 swap. */
3069 || (mips_opts.mips16
3070 && (prev_pinfo & MIPS16_INSN_READ_PC))
3071 /* If the previous instruction had a fixup in mips16
3072 mode, we can not swap. This normally means that the
3073 previous instruction was a 4 byte branch anyhow. */
3074 || (mips_opts.mips16 && history[0].fixp[0])
3075 /* If the previous instruction is a sync, sync.l, or
3076 sync.p, we can not swap. */
3077 || (prev_pinfo & INSN_SYNC))
3079 if (mips_opts.mips16
3080 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3081 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3082 && ISA_SUPPORTS_MIPS16E)
3084 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3085 ip->insn_opcode |= 0x0080;
3086 install_insn (ip);
3087 insert_into_history (0, 1, ip);
3089 else
3091 /* We could do even better for unconditional branches to
3092 portions of this object file; we could pick up the
3093 instruction at the destination, put it in the delay
3094 slot, and bump the destination address. */
3095 insert_into_history (0, 1, ip);
3096 emit_nop ();
3099 if (mips_relax.sequence)
3100 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3102 else
3104 /* It looks like we can actually do the swap. */
3105 struct mips_cl_insn delay = history[0];
3106 if (mips_opts.mips16)
3108 know (delay.frag == ip->frag);
3109 move_insn (ip, delay.frag, delay.where);
3110 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3112 else if (relaxed_branch)
3114 /* Add the delay slot instruction to the end of the
3115 current frag and shrink the fixed part of the
3116 original frag. If the branch occupies the tail of
3117 the latter, move it backwards to cover the gap. */
3118 delay.frag->fr_fix -= 4;
3119 if (delay.frag == ip->frag)
3120 move_insn (ip, ip->frag, ip->where - 4);
3121 add_fixed_insn (&delay);
3123 else
3125 move_insn (&delay, ip->frag, ip->where);
3126 move_insn (ip, history[0].frag, history[0].where);
3128 history[0] = *ip;
3129 delay.fixed_p = 1;
3130 insert_into_history (0, 1, &delay);
3133 /* If that was an unconditional branch, forget the previous
3134 insn information. */
3135 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3136 mips_no_prev_insn ();
3138 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3140 /* We don't yet optimize a branch likely. What we should do
3141 is look at the target, copy the instruction found there
3142 into the delay slot, and increment the branch to jump to
3143 the next instruction. */
3144 insert_into_history (0, 1, ip);
3145 emit_nop ();
3147 else
3148 insert_into_history (0, 1, ip);
3150 else
3151 insert_into_history (0, 1, ip);
3153 /* We just output an insn, so the next one doesn't have a label. */
3154 mips_clear_insn_labels ();
3157 /* Forget that there was any previous instruction or label. */
3159 static void
3160 mips_no_prev_insn (void)
3162 prev_nop_frag = NULL;
3163 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3164 mips_clear_insn_labels ();
3167 /* This function must be called before we emit something other than
3168 instructions. It is like mips_no_prev_insn except that it inserts
3169 any NOPS that might be needed by previous instructions. */
3171 void
3172 mips_emit_delays (void)
3174 if (! mips_opts.noreorder)
3176 int nops = nops_for_insn (history, NULL);
3177 if (nops > 0)
3179 while (nops-- > 0)
3180 add_fixed_insn (NOP_INSN);
3181 mips_move_labels ();
3184 mips_no_prev_insn ();
3187 /* Start a (possibly nested) noreorder block. */
3189 static void
3190 start_noreorder (void)
3192 if (mips_opts.noreorder == 0)
3194 unsigned int i;
3195 int nops;
3197 /* None of the instructions before the .set noreorder can be moved. */
3198 for (i = 0; i < ARRAY_SIZE (history); i++)
3199 history[i].fixed_p = 1;
3201 /* Insert any nops that might be needed between the .set noreorder
3202 block and the previous instructions. We will later remove any
3203 nops that turn out not to be needed. */
3204 nops = nops_for_insn (history, NULL);
3205 if (nops > 0)
3207 if (mips_optimize != 0)
3209 /* Record the frag which holds the nop instructions, so
3210 that we can remove them if we don't need them. */
3211 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3212 prev_nop_frag = frag_now;
3213 prev_nop_frag_holds = nops;
3214 prev_nop_frag_required = 0;
3215 prev_nop_frag_since = 0;
3218 for (; nops > 0; --nops)
3219 add_fixed_insn (NOP_INSN);
3221 /* Move on to a new frag, so that it is safe to simply
3222 decrease the size of prev_nop_frag. */
3223 frag_wane (frag_now);
3224 frag_new (0);
3225 mips_move_labels ();
3227 mips16_mark_labels ();
3228 mips_clear_insn_labels ();
3230 mips_opts.noreorder++;
3231 mips_any_noreorder = 1;
3234 /* End a nested noreorder block. */
3236 static void
3237 end_noreorder (void)
3239 mips_opts.noreorder--;
3240 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3242 /* Commit to inserting prev_nop_frag_required nops and go back to
3243 handling nop insertion the .set reorder way. */
3244 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3245 * (mips_opts.mips16 ? 2 : 4));
3246 insert_into_history (prev_nop_frag_since,
3247 prev_nop_frag_required, NOP_INSN);
3248 prev_nop_frag = NULL;
3252 /* Set up global variables for the start of a new macro. */
3254 static void
3255 macro_start (void)
3257 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3258 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3259 && (history[0].insn_mo->pinfo
3260 & (INSN_UNCOND_BRANCH_DELAY
3261 | INSN_COND_BRANCH_DELAY
3262 | INSN_COND_BRANCH_LIKELY)) != 0);
3265 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3266 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3267 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3269 static const char *
3270 macro_warning (relax_substateT subtype)
3272 if (subtype & RELAX_DELAY_SLOT)
3273 return _("Macro instruction expanded into multiple instructions"
3274 " in a branch delay slot");
3275 else if (subtype & RELAX_NOMACRO)
3276 return _("Macro instruction expanded into multiple instructions");
3277 else
3278 return 0;
3281 /* Finish up a macro. Emit warnings as appropriate. */
3283 static void
3284 macro_end (void)
3286 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3288 relax_substateT subtype;
3290 /* Set up the relaxation warning flags. */
3291 subtype = 0;
3292 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3293 subtype |= RELAX_SECOND_LONGER;
3294 if (mips_opts.warn_about_macros)
3295 subtype |= RELAX_NOMACRO;
3296 if (mips_macro_warning.delay_slot_p)
3297 subtype |= RELAX_DELAY_SLOT;
3299 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3301 /* Either the macro has a single implementation or both
3302 implementations are longer than 4 bytes. Emit the
3303 warning now. */
3304 const char *msg = macro_warning (subtype);
3305 if (msg != 0)
3306 as_warn (msg);
3308 else
3310 /* One implementation might need a warning but the other
3311 definitely doesn't. */
3312 mips_macro_warning.first_frag->fr_subtype |= subtype;
3317 /* Read a macro's relocation codes from *ARGS and store them in *R.
3318 The first argument in *ARGS will be either the code for a single
3319 relocation or -1 followed by the three codes that make up a
3320 composite relocation. */
3322 static void
3323 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3325 int i, next;
3327 next = va_arg (*args, int);
3328 if (next >= 0)
3329 r[0] = (bfd_reloc_code_real_type) next;
3330 else
3331 for (i = 0; i < 3; i++)
3332 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3335 /* Build an instruction created by a macro expansion. This is passed
3336 a pointer to the count of instructions created so far, an
3337 expression, the name of the instruction to build, an operand format
3338 string, and corresponding arguments. */
3340 static void
3341 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3343 const struct mips_opcode *mo;
3344 struct mips_cl_insn insn;
3345 bfd_reloc_code_real_type r[3];
3346 va_list args;
3348 va_start (args, fmt);
3350 if (mips_opts.mips16)
3352 mips16_macro_build (ep, name, fmt, args);
3353 va_end (args);
3354 return;
3357 r[0] = BFD_RELOC_UNUSED;
3358 r[1] = BFD_RELOC_UNUSED;
3359 r[2] = BFD_RELOC_UNUSED;
3360 mo = (struct mips_opcode *) hash_find (op_hash, name);
3361 assert (mo);
3362 assert (strcmp (name, mo->name) == 0);
3364 while (1)
3366 /* Search until we get a match for NAME. It is assumed here that
3367 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3368 if (strcmp (fmt, mo->args) == 0
3369 && mo->pinfo != INSN_MACRO
3370 && OPCODE_IS_MEMBER (mo,
3371 (mips_opts.isa
3372 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3373 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3374 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3375 ? INSN_DSP64 : 0)
3376 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3377 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3378 mips_opts.arch)
3379 && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3380 break;
3382 ++mo;
3383 assert (mo->name);
3384 assert (strcmp (name, mo->name) == 0);
3387 create_insn (&insn, mo);
3388 for (;;)
3390 switch (*fmt++)
3392 case '\0':
3393 break;
3395 case ',':
3396 case '(':
3397 case ')':
3398 continue;
3400 case '+':
3401 switch (*fmt++)
3403 case 'A':
3404 case 'E':
3405 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3406 continue;
3408 case 'B':
3409 case 'F':
3410 /* Note that in the macro case, these arguments are already
3411 in MSB form. (When handling the instruction in the
3412 non-macro case, these arguments are sizes from which
3413 MSB values must be calculated.) */
3414 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3415 continue;
3417 case 'C':
3418 case 'G':
3419 case 'H':
3420 /* Note that in the macro case, these arguments are already
3421 in MSBD form. (When handling the instruction in the
3422 non-macro case, these arguments are sizes from which
3423 MSBD values must be calculated.) */
3424 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3425 continue;
3427 default:
3428 internalError ();
3430 continue;
3432 case '2':
3433 INSERT_OPERAND (BP, insn, va_arg (args, int));
3434 continue;
3436 case 't':
3437 case 'w':
3438 case 'E':
3439 INSERT_OPERAND (RT, insn, va_arg (args, int));
3440 continue;
3442 case 'c':
3443 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3444 continue;
3446 case 'T':
3447 case 'W':
3448 INSERT_OPERAND (FT, insn, va_arg (args, int));
3449 continue;
3451 case 'd':
3452 case 'G':
3453 case 'K':
3454 INSERT_OPERAND (RD, insn, va_arg (args, int));
3455 continue;
3457 case 'U':
3459 int tmp = va_arg (args, int);
3461 INSERT_OPERAND (RT, insn, tmp);
3462 INSERT_OPERAND (RD, insn, tmp);
3463 continue;
3466 case 'V':
3467 case 'S':
3468 INSERT_OPERAND (FS, insn, va_arg (args, int));
3469 continue;
3471 case 'z':
3472 continue;
3474 case '<':
3475 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3476 continue;
3478 case 'D':
3479 INSERT_OPERAND (FD, insn, va_arg (args, int));
3480 continue;
3482 case 'B':
3483 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3484 continue;
3486 case 'J':
3487 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3488 continue;
3490 case 'q':
3491 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3492 continue;
3494 case 'b':
3495 case 's':
3496 case 'r':
3497 case 'v':
3498 INSERT_OPERAND (RS, insn, va_arg (args, int));
3499 continue;
3501 case 'i':
3502 case 'j':
3503 case 'o':
3504 macro_read_relocs (&args, r);
3505 assert (*r == BFD_RELOC_GPREL16
3506 || *r == BFD_RELOC_MIPS_LITERAL
3507 || *r == BFD_RELOC_MIPS_HIGHER
3508 || *r == BFD_RELOC_HI16_S
3509 || *r == BFD_RELOC_LO16
3510 || *r == BFD_RELOC_MIPS_GOT16
3511 || *r == BFD_RELOC_MIPS_CALL16
3512 || *r == BFD_RELOC_MIPS_GOT_DISP
3513 || *r == BFD_RELOC_MIPS_GOT_PAGE
3514 || *r == BFD_RELOC_MIPS_GOT_OFST
3515 || *r == BFD_RELOC_MIPS_GOT_LO16
3516 || *r == BFD_RELOC_MIPS_CALL_LO16);
3517 continue;
3519 case 'u':
3520 macro_read_relocs (&args, r);
3521 assert (ep != NULL
3522 && (ep->X_op == O_constant
3523 || (ep->X_op == O_symbol
3524 && (*r == BFD_RELOC_MIPS_HIGHEST
3525 || *r == BFD_RELOC_HI16_S
3526 || *r == BFD_RELOC_HI16
3527 || *r == BFD_RELOC_GPREL16
3528 || *r == BFD_RELOC_MIPS_GOT_HI16
3529 || *r == BFD_RELOC_MIPS_CALL_HI16))));
3530 continue;
3532 case 'p':
3533 assert (ep != NULL);
3536 * This allows macro() to pass an immediate expression for
3537 * creating short branches without creating a symbol.
3539 * We don't allow branch relaxation for these branches, as
3540 * they should only appear in ".set nomacro" anyway.
3542 if (ep->X_op == O_constant)
3544 if ((ep->X_add_number & 3) != 0)
3545 as_bad (_("branch to misaligned address (0x%lx)"),
3546 (unsigned long) ep->X_add_number);
3547 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3548 as_bad (_("branch address range overflow (0x%lx)"),
3549 (unsigned long) ep->X_add_number);
3550 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3551 ep = NULL;
3553 else
3554 *r = BFD_RELOC_16_PCREL_S2;
3555 continue;
3557 case 'a':
3558 assert (ep != NULL);
3559 *r = BFD_RELOC_MIPS_JMP;
3560 continue;
3562 case 'C':
3563 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3564 continue;
3566 case 'k':
3567 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3568 continue;
3570 default:
3571 internalError ();
3573 break;
3575 va_end (args);
3576 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3578 append_insn (&insn, ep, r);
3581 static void
3582 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3583 va_list args)
3585 struct mips_opcode *mo;
3586 struct mips_cl_insn insn;
3587 bfd_reloc_code_real_type r[3]
3588 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3590 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3591 assert (mo);
3592 assert (strcmp (name, mo->name) == 0);
3594 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3596 ++mo;
3597 assert (mo->name);
3598 assert (strcmp (name, mo->name) == 0);
3601 create_insn (&insn, mo);
3602 for (;;)
3604 int c;
3606 c = *fmt++;
3607 switch (c)
3609 case '\0':
3610 break;
3612 case ',':
3613 case '(':
3614 case ')':
3615 continue;
3617 case 'y':
3618 case 'w':
3619 MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3620 continue;
3622 case 'x':
3623 case 'v':
3624 MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3625 continue;
3627 case 'z':
3628 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3629 continue;
3631 case 'Z':
3632 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3633 continue;
3635 case '0':
3636 case 'S':
3637 case 'P':
3638 case 'R':
3639 continue;
3641 case 'X':
3642 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3643 continue;
3645 case 'Y':
3647 int regno;
3649 regno = va_arg (args, int);
3650 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3651 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3653 continue;
3655 case '<':
3656 case '>':
3657 case '4':
3658 case '5':
3659 case 'H':
3660 case 'W':
3661 case 'D':
3662 case 'j':
3663 case '8':
3664 case 'V':
3665 case 'C':
3666 case 'U':
3667 case 'k':
3668 case 'K':
3669 case 'p':
3670 case 'q':
3672 assert (ep != NULL);
3674 if (ep->X_op != O_constant)
3675 *r = (int) BFD_RELOC_UNUSED + c;
3676 else
3678 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3679 FALSE, &insn.insn_opcode, &insn.use_extend,
3680 &insn.extend);
3681 ep = NULL;
3682 *r = BFD_RELOC_UNUSED;
3685 continue;
3687 case '6':
3688 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3689 continue;
3692 break;
3695 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3697 append_insn (&insn, ep, r);
3701 * Sign-extend 32-bit mode constants that have bit 31 set and all
3702 * higher bits unset.
3704 static void
3705 normalize_constant_expr (expressionS *ex)
3707 if (ex->X_op == O_constant
3708 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3709 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3710 - 0x80000000);
3714 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3715 * all higher bits unset.
3717 static void
3718 normalize_address_expr (expressionS *ex)
3720 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3721 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3722 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3723 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3724 - 0x80000000);
3728 * Generate a "jalr" instruction with a relocation hint to the called
3729 * function. This occurs in NewABI PIC code.
3731 static void
3732 macro_build_jalr (expressionS *ep)
3734 char *f = NULL;
3736 if (HAVE_NEWABI)
3738 frag_grow (8);
3739 f = frag_more (0);
3741 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3742 if (HAVE_NEWABI)
3743 fix_new_exp (frag_now, f - frag_now->fr_literal,
3744 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3748 * Generate a "lui" instruction.
3750 static void
3751 macro_build_lui (expressionS *ep, int regnum)
3753 expressionS high_expr;
3754 const struct mips_opcode *mo;
3755 struct mips_cl_insn insn;
3756 bfd_reloc_code_real_type r[3]
3757 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3758 const char *name = "lui";
3759 const char *fmt = "t,u";
3761 assert (! mips_opts.mips16);
3763 high_expr = *ep;
3765 if (high_expr.X_op == O_constant)
3767 /* We can compute the instruction now without a relocation entry. */
3768 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3769 >> 16) & 0xffff;
3770 *r = BFD_RELOC_UNUSED;
3772 else
3774 assert (ep->X_op == O_symbol);
3775 /* _gp_disp is a special case, used from s_cpload.
3776 __gnu_local_gp is used if mips_no_shared. */
3777 assert (mips_pic == NO_PIC
3778 || (! HAVE_NEWABI
3779 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3780 || (! mips_in_shared
3781 && strcmp (S_GET_NAME (ep->X_add_symbol),
3782 "__gnu_local_gp") == 0));
3783 *r = BFD_RELOC_HI16_S;
3786 mo = hash_find (op_hash, name);
3787 assert (strcmp (name, mo->name) == 0);
3788 assert (strcmp (fmt, mo->args) == 0);
3789 create_insn (&insn, mo);
3791 insn.insn_opcode = insn.insn_mo->match;
3792 INSERT_OPERAND (RT, insn, regnum);
3793 if (*r == BFD_RELOC_UNUSED)
3795 insn.insn_opcode |= high_expr.X_add_number;
3796 append_insn (&insn, NULL, r);
3798 else
3799 append_insn (&insn, &high_expr, r);
3802 /* Generate a sequence of instructions to do a load or store from a constant
3803 offset off of a base register (breg) into/from a target register (treg),
3804 using AT if necessary. */
3805 static void
3806 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3807 int treg, int breg, int dbl)
3809 assert (ep->X_op == O_constant);
3811 /* Sign-extending 32-bit constants makes their handling easier. */
3812 if (!dbl)
3813 normalize_constant_expr (ep);
3815 /* Right now, this routine can only handle signed 32-bit constants. */
3816 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3817 as_warn (_("operand overflow"));
3819 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3821 /* Signed 16-bit offset will fit in the op. Easy! */
3822 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3824 else
3826 /* 32-bit offset, need multiple instructions and AT, like:
3827 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3828 addu $tempreg,$tempreg,$breg
3829 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3830 to handle the complete offset. */
3831 macro_build_lui (ep, AT);
3832 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3833 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3835 if (!mips_opts.at)
3836 as_bad (_("Macro used $at after \".set noat\""));
3840 /* set_at()
3841 * Generates code to set the $at register to true (one)
3842 * if reg is less than the immediate expression.
3844 static void
3845 set_at (int reg, int unsignedp)
3847 if (imm_expr.X_op == O_constant
3848 && imm_expr.X_add_number >= -0x8000
3849 && imm_expr.X_add_number < 0x8000)
3850 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3851 AT, reg, BFD_RELOC_LO16);
3852 else
3854 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3855 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3859 /* Warn if an expression is not a constant. */
3861 static void
3862 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3864 if (ex->X_op == O_big)
3865 as_bad (_("unsupported large constant"));
3866 else if (ex->X_op != O_constant)
3867 as_bad (_("Instruction %s requires absolute expression"),
3868 ip->insn_mo->name);
3870 if (HAVE_32BIT_GPRS)
3871 normalize_constant_expr (ex);
3874 /* Count the leading zeroes by performing a binary chop. This is a
3875 bulky bit of source, but performance is a LOT better for the
3876 majority of values than a simple loop to count the bits:
3877 for (lcnt = 0; (lcnt < 32); lcnt++)
3878 if ((v) & (1 << (31 - lcnt)))
3879 break;
3880 However it is not code size friendly, and the gain will drop a bit
3881 on certain cached systems.
3883 #define COUNT_TOP_ZEROES(v) \
3884 (((v) & ~0xffff) == 0 \
3885 ? ((v) & ~0xff) == 0 \
3886 ? ((v) & ~0xf) == 0 \
3887 ? ((v) & ~0x3) == 0 \
3888 ? ((v) & ~0x1) == 0 \
3889 ? !(v) \
3890 ? 32 \
3891 : 31 \
3892 : 30 \
3893 : ((v) & ~0x7) == 0 \
3894 ? 29 \
3895 : 28 \
3896 : ((v) & ~0x3f) == 0 \
3897 ? ((v) & ~0x1f) == 0 \
3898 ? 27 \
3899 : 26 \
3900 : ((v) & ~0x7f) == 0 \
3901 ? 25 \
3902 : 24 \
3903 : ((v) & ~0xfff) == 0 \
3904 ? ((v) & ~0x3ff) == 0 \
3905 ? ((v) & ~0x1ff) == 0 \
3906 ? 23 \
3907 : 22 \
3908 : ((v) & ~0x7ff) == 0 \
3909 ? 21 \
3910 : 20 \
3911 : ((v) & ~0x3fff) == 0 \
3912 ? ((v) & ~0x1fff) == 0 \
3913 ? 19 \
3914 : 18 \
3915 : ((v) & ~0x7fff) == 0 \
3916 ? 17 \
3917 : 16 \
3918 : ((v) & ~0xffffff) == 0 \
3919 ? ((v) & ~0xfffff) == 0 \
3920 ? ((v) & ~0x3ffff) == 0 \
3921 ? ((v) & ~0x1ffff) == 0 \
3922 ? 15 \
3923 : 14 \
3924 : ((v) & ~0x7ffff) == 0 \
3925 ? 13 \
3926 : 12 \
3927 : ((v) & ~0x3fffff) == 0 \
3928 ? ((v) & ~0x1fffff) == 0 \
3929 ? 11 \
3930 : 10 \
3931 : ((v) & ~0x7fffff) == 0 \
3932 ? 9 \
3933 : 8 \
3934 : ((v) & ~0xfffffff) == 0 \
3935 ? ((v) & ~0x3ffffff) == 0 \
3936 ? ((v) & ~0x1ffffff) == 0 \
3937 ? 7 \
3938 : 6 \
3939 : ((v) & ~0x7ffffff) == 0 \
3940 ? 5 \
3941 : 4 \
3942 : ((v) & ~0x3fffffff) == 0 \
3943 ? ((v) & ~0x1fffffff) == 0 \
3944 ? 3 \
3945 : 2 \
3946 : ((v) & ~0x7fffffff) == 0 \
3947 ? 1 \
3948 : 0)
3950 /* load_register()
3951 * This routine generates the least number of instructions necessary to load
3952 * an absolute expression value into a register.
3954 static void
3955 load_register (int reg, expressionS *ep, int dbl)
3957 int freg;
3958 expressionS hi32, lo32;
3960 if (ep->X_op != O_big)
3962 assert (ep->X_op == O_constant);
3964 /* Sign-extending 32-bit constants makes their handling easier. */
3965 if (!dbl)
3966 normalize_constant_expr (ep);
3968 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3970 /* We can handle 16 bit signed values with an addiu to
3971 $zero. No need to ever use daddiu here, since $zero and
3972 the result are always correct in 32 bit mode. */
3973 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3974 return;
3976 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3978 /* We can handle 16 bit unsigned values with an ori to
3979 $zero. */
3980 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3981 return;
3983 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3985 /* 32 bit values require an lui. */
3986 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3987 if ((ep->X_add_number & 0xffff) != 0)
3988 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3989 return;
3993 /* The value is larger than 32 bits. */
3995 if (!dbl || HAVE_32BIT_GPRS)
3997 char value[32];
3999 sprintf_vma (value, ep->X_add_number);
4000 as_bad (_("Number (0x%s) larger than 32 bits"), value);
4001 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4002 return;
4005 if (ep->X_op != O_big)
4007 hi32 = *ep;
4008 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4009 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4010 hi32.X_add_number &= 0xffffffff;
4011 lo32 = *ep;
4012 lo32.X_add_number &= 0xffffffff;
4014 else
4016 assert (ep->X_add_number > 2);
4017 if (ep->X_add_number == 3)
4018 generic_bignum[3] = 0;
4019 else if (ep->X_add_number > 4)
4020 as_bad (_("Number larger than 64 bits"));
4021 lo32.X_op = O_constant;
4022 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4023 hi32.X_op = O_constant;
4024 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4027 if (hi32.X_add_number == 0)
4028 freg = 0;
4029 else
4031 int shift, bit;
4032 unsigned long hi, lo;
4034 if (hi32.X_add_number == (offsetT) 0xffffffff)
4036 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4038 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4039 return;
4041 if (lo32.X_add_number & 0x80000000)
4043 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4044 if (lo32.X_add_number & 0xffff)
4045 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4046 return;
4050 /* Check for 16bit shifted constant. We know that hi32 is
4051 non-zero, so start the mask on the first bit of the hi32
4052 value. */
4053 shift = 17;
4056 unsigned long himask, lomask;
4058 if (shift < 32)
4060 himask = 0xffff >> (32 - shift);
4061 lomask = (0xffff << shift) & 0xffffffff;
4063 else
4065 himask = 0xffff << (shift - 32);
4066 lomask = 0;
4068 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4069 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4071 expressionS tmp;
4073 tmp.X_op = O_constant;
4074 if (shift < 32)
4075 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4076 | (lo32.X_add_number >> shift));
4077 else
4078 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4079 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4080 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4081 reg, reg, (shift >= 32) ? shift - 32 : shift);
4082 return;
4084 ++shift;
4086 while (shift <= (64 - 16));
4088 /* Find the bit number of the lowest one bit, and store the
4089 shifted value in hi/lo. */
4090 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4091 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4092 if (lo != 0)
4094 bit = 0;
4095 while ((lo & 1) == 0)
4097 lo >>= 1;
4098 ++bit;
4100 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4101 hi >>= bit;
4103 else
4105 bit = 32;
4106 while ((hi & 1) == 0)
4108 hi >>= 1;
4109 ++bit;
4111 lo = hi;
4112 hi = 0;
4115 /* Optimize if the shifted value is a (power of 2) - 1. */
4116 if ((hi == 0 && ((lo + 1) & lo) == 0)
4117 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4119 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4120 if (shift != 0)
4122 expressionS tmp;
4124 /* This instruction will set the register to be all
4125 ones. */
4126 tmp.X_op = O_constant;
4127 tmp.X_add_number = (offsetT) -1;
4128 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4129 if (bit != 0)
4131 bit += shift;
4132 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4133 reg, reg, (bit >= 32) ? bit - 32 : bit);
4135 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4136 reg, reg, (shift >= 32) ? shift - 32 : shift);
4137 return;
4141 /* Sign extend hi32 before calling load_register, because we can
4142 generally get better code when we load a sign extended value. */
4143 if ((hi32.X_add_number & 0x80000000) != 0)
4144 hi32.X_add_number |= ~(offsetT) 0xffffffff;
4145 load_register (reg, &hi32, 0);
4146 freg = reg;
4148 if ((lo32.X_add_number & 0xffff0000) == 0)
4150 if (freg != 0)
4152 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4153 freg = reg;
4156 else
4158 expressionS mid16;
4160 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4162 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4163 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4164 return;
4167 if (freg != 0)
4169 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4170 freg = reg;
4172 mid16 = lo32;
4173 mid16.X_add_number >>= 16;
4174 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4175 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4176 freg = reg;
4178 if ((lo32.X_add_number & 0xffff) != 0)
4179 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4182 static inline void
4183 load_delay_nop (void)
4185 if (!gpr_interlocks)
4186 macro_build (NULL, "nop", "");
4189 /* Load an address into a register. */
4191 static void
4192 load_address (int reg, expressionS *ep, int *used_at)
4194 if (ep->X_op != O_constant
4195 && ep->X_op != O_symbol)
4197 as_bad (_("expression too complex"));
4198 ep->X_op = O_constant;
4201 if (ep->X_op == O_constant)
4203 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4204 return;
4207 if (mips_pic == NO_PIC)
4209 /* If this is a reference to a GP relative symbol, we want
4210 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4211 Otherwise we want
4212 lui $reg,<sym> (BFD_RELOC_HI16_S)
4213 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4214 If we have an addend, we always use the latter form.
4216 With 64bit address space and a usable $at we want
4217 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4218 lui $at,<sym> (BFD_RELOC_HI16_S)
4219 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4220 daddiu $at,<sym> (BFD_RELOC_LO16)
4221 dsll32 $reg,0
4222 daddu $reg,$reg,$at
4224 If $at is already in use, we use a path which is suboptimal
4225 on superscalar processors.
4226 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4227 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4228 dsll $reg,16
4229 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4230 dsll $reg,16
4231 daddiu $reg,<sym> (BFD_RELOC_LO16)
4233 For GP relative symbols in 64bit address space we can use
4234 the same sequence as in 32bit address space. */
4235 if (HAVE_64BIT_SYMBOLS)
4237 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4238 && !nopic_need_relax (ep->X_add_symbol, 1))
4240 relax_start (ep->X_add_symbol);
4241 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4242 mips_gp_register, BFD_RELOC_GPREL16);
4243 relax_switch ();
4246 if (*used_at == 0 && mips_opts.at)
4248 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4249 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4250 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4251 BFD_RELOC_MIPS_HIGHER);
4252 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4253 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4254 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4255 *used_at = 1;
4257 else
4259 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4260 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4261 BFD_RELOC_MIPS_HIGHER);
4262 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4263 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4264 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4265 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4268 if (mips_relax.sequence)
4269 relax_end ();
4271 else
4273 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4274 && !nopic_need_relax (ep->X_add_symbol, 1))
4276 relax_start (ep->X_add_symbol);
4277 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4278 mips_gp_register, BFD_RELOC_GPREL16);
4279 relax_switch ();
4281 macro_build_lui (ep, reg);
4282 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4283 reg, reg, BFD_RELOC_LO16);
4284 if (mips_relax.sequence)
4285 relax_end ();
4288 else if (!mips_big_got)
4290 expressionS ex;
4292 /* If this is a reference to an external symbol, we want
4293 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4294 Otherwise we want
4295 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4297 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4298 If there is a constant, it must be added in after.
4300 If we have NewABI, we want
4301 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4302 unless we're referencing a global symbol with a non-zero
4303 offset, in which case cst must be added separately. */
4304 if (HAVE_NEWABI)
4306 if (ep->X_add_number)
4308 ex.X_add_number = ep->X_add_number;
4309 ep->X_add_number = 0;
4310 relax_start (ep->X_add_symbol);
4311 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4312 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4313 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4314 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4315 ex.X_op = O_constant;
4316 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4317 reg, reg, BFD_RELOC_LO16);
4318 ep->X_add_number = ex.X_add_number;
4319 relax_switch ();
4321 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4322 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4323 if (mips_relax.sequence)
4324 relax_end ();
4326 else
4328 ex.X_add_number = ep->X_add_number;
4329 ep->X_add_number = 0;
4330 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4331 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4332 load_delay_nop ();
4333 relax_start (ep->X_add_symbol);
4334 relax_switch ();
4335 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4336 BFD_RELOC_LO16);
4337 relax_end ();
4339 if (ex.X_add_number != 0)
4341 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4342 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4343 ex.X_op = O_constant;
4344 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4345 reg, reg, BFD_RELOC_LO16);
4349 else if (mips_big_got)
4351 expressionS ex;
4353 /* This is the large GOT case. If this is a reference to an
4354 external symbol, we want
4355 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4356 addu $reg,$reg,$gp
4357 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4359 Otherwise, for a reference to a local symbol in old ABI, we want
4360 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4362 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4363 If there is a constant, it must be added in after.
4365 In the NewABI, for local symbols, with or without offsets, we want:
4366 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4367 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4369 if (HAVE_NEWABI)
4371 ex.X_add_number = ep->X_add_number;
4372 ep->X_add_number = 0;
4373 relax_start (ep->X_add_symbol);
4374 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4375 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4376 reg, reg, mips_gp_register);
4377 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4378 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4379 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4380 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4381 else if (ex.X_add_number)
4383 ex.X_op = O_constant;
4384 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4385 BFD_RELOC_LO16);
4388 ep->X_add_number = ex.X_add_number;
4389 relax_switch ();
4390 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4391 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4392 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4393 BFD_RELOC_MIPS_GOT_OFST);
4394 relax_end ();
4396 else
4398 ex.X_add_number = ep->X_add_number;
4399 ep->X_add_number = 0;
4400 relax_start (ep->X_add_symbol);
4401 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4402 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4403 reg, reg, mips_gp_register);
4404 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4405 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4406 relax_switch ();
4407 if (reg_needs_delay (mips_gp_register))
4409 /* We need a nop before loading from $gp. This special
4410 check is required because the lui which starts the main
4411 instruction stream does not refer to $gp, and so will not
4412 insert the nop which may be required. */
4413 macro_build (NULL, "nop", "");
4415 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4416 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4417 load_delay_nop ();
4418 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4419 BFD_RELOC_LO16);
4420 relax_end ();
4422 if (ex.X_add_number != 0)
4424 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4425 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4426 ex.X_op = O_constant;
4427 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4428 BFD_RELOC_LO16);
4432 else
4433 abort ();
4435 if (!mips_opts.at && *used_at == 1)
4436 as_bad (_("Macro used $at after \".set noat\""));
4439 /* Move the contents of register SOURCE into register DEST. */
4441 static void
4442 move_register (int dest, int source)
4444 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4445 dest, source, 0);
4448 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4449 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4450 The two alternatives are:
4452 Global symbol Local sybmol
4453 ------------- ------------
4454 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4455 ... ...
4456 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4458 load_got_offset emits the first instruction and add_got_offset
4459 emits the second for a 16-bit offset or add_got_offset_hilo emits
4460 a sequence to add a 32-bit offset using a scratch register. */
4462 static void
4463 load_got_offset (int dest, expressionS *local)
4465 expressionS global;
4467 global = *local;
4468 global.X_add_number = 0;
4470 relax_start (local->X_add_symbol);
4471 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4472 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4473 relax_switch ();
4474 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4475 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4476 relax_end ();
4479 static void
4480 add_got_offset (int dest, expressionS *local)
4482 expressionS global;
4484 global.X_op = O_constant;
4485 global.X_op_symbol = NULL;
4486 global.X_add_symbol = NULL;
4487 global.X_add_number = local->X_add_number;
4489 relax_start (local->X_add_symbol);
4490 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4491 dest, dest, BFD_RELOC_LO16);
4492 relax_switch ();
4493 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4494 relax_end ();
4497 static void
4498 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4500 expressionS global;
4501 int hold_mips_optimize;
4503 global.X_op = O_constant;
4504 global.X_op_symbol = NULL;
4505 global.X_add_symbol = NULL;
4506 global.X_add_number = local->X_add_number;
4508 relax_start (local->X_add_symbol);
4509 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4510 relax_switch ();
4511 /* Set mips_optimize around the lui instruction to avoid
4512 inserting an unnecessary nop after the lw. */
4513 hold_mips_optimize = mips_optimize;
4514 mips_optimize = 2;
4515 macro_build_lui (&global, tmp);
4516 mips_optimize = hold_mips_optimize;
4517 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4518 relax_end ();
4520 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4524 * Build macros
4525 * This routine implements the seemingly endless macro or synthesized
4526 * instructions and addressing modes in the mips assembly language. Many
4527 * of these macros are simple and are similar to each other. These could
4528 * probably be handled by some kind of table or grammar approach instead of
4529 * this verbose method. Others are not simple macros but are more like
4530 * optimizing code generation.
4531 * One interesting optimization is when several store macros appear
4532 * consecutively that would load AT with the upper half of the same address.
4533 * The ensuing load upper instructions are ommited. This implies some kind
4534 * of global optimization. We currently only optimize within a single macro.
4535 * For many of the load and store macros if the address is specified as a
4536 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4537 * first load register 'at' with zero and use it as the base register. The
4538 * mips assembler simply uses register $zero. Just one tiny optimization
4539 * we're missing.
4541 static void
4542 macro (struct mips_cl_insn *ip)
4544 unsigned int treg, sreg, dreg, breg;
4545 unsigned int tempreg;
4546 int mask;
4547 int used_at = 0;
4548 expressionS expr1;
4549 const char *s;
4550 const char *s2;
4551 const char *fmt;
4552 int likely = 0;
4553 int dbl = 0;
4554 int coproc = 0;
4555 int lr = 0;
4556 int imm = 0;
4557 int call = 0;
4558 int off;
4559 offsetT maxnum;
4560 bfd_reloc_code_real_type r;
4561 int hold_mips_optimize;
4563 assert (! mips_opts.mips16);
4565 treg = (ip->insn_opcode >> 16) & 0x1f;
4566 dreg = (ip->insn_opcode >> 11) & 0x1f;
4567 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4568 mask = ip->insn_mo->mask;
4570 expr1.X_op = O_constant;
4571 expr1.X_op_symbol = NULL;
4572 expr1.X_add_symbol = NULL;
4573 expr1.X_add_number = 1;
4575 switch (mask)
4577 case M_DABS:
4578 dbl = 1;
4579 case M_ABS:
4580 /* bgez $a0,.+12
4581 move v0,$a0
4582 sub v0,$zero,$a0
4585 start_noreorder ();
4587 expr1.X_add_number = 8;
4588 macro_build (&expr1, "bgez", "s,p", sreg);
4589 if (dreg == sreg)
4590 macro_build (NULL, "nop", "", 0);
4591 else
4592 move_register (dreg, sreg);
4593 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4595 end_noreorder ();
4596 break;
4598 case M_ADD_I:
4599 s = "addi";
4600 s2 = "add";
4601 goto do_addi;
4602 case M_ADDU_I:
4603 s = "addiu";
4604 s2 = "addu";
4605 goto do_addi;
4606 case M_DADD_I:
4607 dbl = 1;
4608 s = "daddi";
4609 s2 = "dadd";
4610 goto do_addi;
4611 case M_DADDU_I:
4612 dbl = 1;
4613 s = "daddiu";
4614 s2 = "daddu";
4615 do_addi:
4616 if (imm_expr.X_op == O_constant
4617 && imm_expr.X_add_number >= -0x8000
4618 && imm_expr.X_add_number < 0x8000)
4620 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4621 break;
4623 used_at = 1;
4624 load_register (AT, &imm_expr, dbl);
4625 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4626 break;
4628 case M_AND_I:
4629 s = "andi";
4630 s2 = "and";
4631 goto do_bit;
4632 case M_OR_I:
4633 s = "ori";
4634 s2 = "or";
4635 goto do_bit;
4636 case M_NOR_I:
4637 s = "";
4638 s2 = "nor";
4639 goto do_bit;
4640 case M_XOR_I:
4641 s = "xori";
4642 s2 = "xor";
4643 do_bit:
4644 if (imm_expr.X_op == O_constant
4645 && imm_expr.X_add_number >= 0
4646 && imm_expr.X_add_number < 0x10000)
4648 if (mask != M_NOR_I)
4649 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4650 else
4652 macro_build (&imm_expr, "ori", "t,r,i",
4653 treg, sreg, BFD_RELOC_LO16);
4654 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4656 break;
4659 used_at = 1;
4660 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4661 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4662 break;
4664 case M_BALIGN:
4665 switch (imm_expr.X_add_number)
4667 case 0:
4668 macro_build (NULL, "nop", "");
4669 break;
4670 case 2:
4671 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4672 break;
4673 default:
4674 macro_build (NULL, "balign", "t,s,2", treg, sreg,
4675 (int)imm_expr.X_add_number);
4676 break;
4678 break;
4680 case M_BEQ_I:
4681 s = "beq";
4682 goto beq_i;
4683 case M_BEQL_I:
4684 s = "beql";
4685 likely = 1;
4686 goto beq_i;
4687 case M_BNE_I:
4688 s = "bne";
4689 goto beq_i;
4690 case M_BNEL_I:
4691 s = "bnel";
4692 likely = 1;
4693 beq_i:
4694 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4696 macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4697 break;
4699 used_at = 1;
4700 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4701 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4702 break;
4704 case M_BGEL:
4705 likely = 1;
4706 case M_BGE:
4707 if (treg == 0)
4709 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4710 break;
4712 if (sreg == 0)
4714 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4715 break;
4717 used_at = 1;
4718 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4719 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4720 break;
4722 case M_BGTL_I:
4723 likely = 1;
4724 case M_BGT_I:
4725 /* check for > max integer */
4726 maxnum = 0x7fffffff;
4727 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4729 maxnum <<= 16;
4730 maxnum |= 0xffff;
4731 maxnum <<= 16;
4732 maxnum |= 0xffff;
4734 if (imm_expr.X_op == O_constant
4735 && imm_expr.X_add_number >= maxnum
4736 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4738 do_false:
4739 /* result is always false */
4740 if (! likely)
4741 macro_build (NULL, "nop", "", 0);
4742 else
4743 macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4744 break;
4746 if (imm_expr.X_op != O_constant)
4747 as_bad (_("Unsupported large constant"));
4748 ++imm_expr.X_add_number;
4749 /* FALLTHROUGH */
4750 case M_BGE_I:
4751 case M_BGEL_I:
4752 if (mask == M_BGEL_I)
4753 likely = 1;
4754 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4756 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4757 break;
4759 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4761 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4762 break;
4764 maxnum = 0x7fffffff;
4765 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4767 maxnum <<= 16;
4768 maxnum |= 0xffff;
4769 maxnum <<= 16;
4770 maxnum |= 0xffff;
4772 maxnum = - maxnum - 1;
4773 if (imm_expr.X_op == O_constant
4774 && imm_expr.X_add_number <= maxnum
4775 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4777 do_true:
4778 /* result is always true */
4779 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4780 macro_build (&offset_expr, "b", "p");
4781 break;
4783 used_at = 1;
4784 set_at (sreg, 0);
4785 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4786 break;
4788 case M_BGEUL:
4789 likely = 1;
4790 case M_BGEU:
4791 if (treg == 0)
4792 goto do_true;
4793 if (sreg == 0)
4795 macro_build (&offset_expr, likely ? "beql" : "beq",
4796 "s,t,p", 0, treg);
4797 break;
4799 used_at = 1;
4800 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4801 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4802 break;
4804 case M_BGTUL_I:
4805 likely = 1;
4806 case M_BGTU_I:
4807 if (sreg == 0
4808 || (HAVE_32BIT_GPRS
4809 && imm_expr.X_op == O_constant
4810 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4811 goto do_false;
4812 if (imm_expr.X_op != O_constant)
4813 as_bad (_("Unsupported large constant"));
4814 ++imm_expr.X_add_number;
4815 /* FALLTHROUGH */
4816 case M_BGEU_I:
4817 case M_BGEUL_I:
4818 if (mask == M_BGEUL_I)
4819 likely = 1;
4820 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4821 goto do_true;
4822 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4824 macro_build (&offset_expr, likely ? "bnel" : "bne",
4825 "s,t,p", sreg, 0);
4826 break;
4828 used_at = 1;
4829 set_at (sreg, 1);
4830 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4831 break;
4833 case M_BGTL:
4834 likely = 1;
4835 case M_BGT:
4836 if (treg == 0)
4838 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4839 break;
4841 if (sreg == 0)
4843 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4844 break;
4846 used_at = 1;
4847 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4848 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4849 break;
4851 case M_BGTUL:
4852 likely = 1;
4853 case M_BGTU:
4854 if (treg == 0)
4856 macro_build (&offset_expr, likely ? "bnel" : "bne",
4857 "s,t,p", sreg, 0);
4858 break;
4860 if (sreg == 0)
4861 goto do_false;
4862 used_at = 1;
4863 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4864 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4865 break;
4867 case M_BLEL:
4868 likely = 1;
4869 case M_BLE:
4870 if (treg == 0)
4872 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4873 break;
4875 if (sreg == 0)
4877 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4878 break;
4880 used_at = 1;
4881 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4882 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4883 break;
4885 case M_BLEL_I:
4886 likely = 1;
4887 case M_BLE_I:
4888 maxnum = 0x7fffffff;
4889 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4891 maxnum <<= 16;
4892 maxnum |= 0xffff;
4893 maxnum <<= 16;
4894 maxnum |= 0xffff;
4896 if (imm_expr.X_op == O_constant
4897 && imm_expr.X_add_number >= maxnum
4898 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4899 goto do_true;
4900 if (imm_expr.X_op != O_constant)
4901 as_bad (_("Unsupported large constant"));
4902 ++imm_expr.X_add_number;
4903 /* FALLTHROUGH */
4904 case M_BLT_I:
4905 case M_BLTL_I:
4906 if (mask == M_BLTL_I)
4907 likely = 1;
4908 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4910 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4911 break;
4913 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4915 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4916 break;
4918 used_at = 1;
4919 set_at (sreg, 0);
4920 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4921 break;
4923 case M_BLEUL:
4924 likely = 1;
4925 case M_BLEU:
4926 if (treg == 0)
4928 macro_build (&offset_expr, likely ? "beql" : "beq",
4929 "s,t,p", sreg, 0);
4930 break;
4932 if (sreg == 0)
4933 goto do_true;
4934 used_at = 1;
4935 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4936 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4937 break;
4939 case M_BLEUL_I:
4940 likely = 1;
4941 case M_BLEU_I:
4942 if (sreg == 0
4943 || (HAVE_32BIT_GPRS
4944 && imm_expr.X_op == O_constant
4945 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4946 goto do_true;
4947 if (imm_expr.X_op != O_constant)
4948 as_bad (_("Unsupported large constant"));
4949 ++imm_expr.X_add_number;
4950 /* FALLTHROUGH */
4951 case M_BLTU_I:
4952 case M_BLTUL_I:
4953 if (mask == M_BLTUL_I)
4954 likely = 1;
4955 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4956 goto do_false;
4957 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4959 macro_build (&offset_expr, likely ? "beql" : "beq",
4960 "s,t,p", sreg, 0);
4961 break;
4963 used_at = 1;
4964 set_at (sreg, 1);
4965 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4966 break;
4968 case M_BLTL:
4969 likely = 1;
4970 case M_BLT:
4971 if (treg == 0)
4973 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4974 break;
4976 if (sreg == 0)
4978 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4979 break;
4981 used_at = 1;
4982 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4983 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4984 break;
4986 case M_BLTUL:
4987 likely = 1;
4988 case M_BLTU:
4989 if (treg == 0)
4990 goto do_false;
4991 if (sreg == 0)
4993 macro_build (&offset_expr, likely ? "bnel" : "bne",
4994 "s,t,p", 0, treg);
4995 break;
4997 used_at = 1;
4998 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4999 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5000 break;
5002 case M_DEXT:
5004 unsigned long pos;
5005 unsigned long size;
5007 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5009 as_bad (_("Unsupported large constant"));
5010 pos = size = 1;
5012 else
5014 pos = (unsigned long) imm_expr.X_add_number;
5015 size = (unsigned long) imm2_expr.X_add_number;
5018 if (pos > 63)
5020 as_bad (_("Improper position (%lu)"), pos);
5021 pos = 1;
5023 if (size == 0 || size > 64
5024 || (pos + size - 1) > 63)
5026 as_bad (_("Improper extract size (%lu, position %lu)"),
5027 size, pos);
5028 size = 1;
5031 if (size <= 32 && pos < 32)
5033 s = "dext";
5034 fmt = "t,r,+A,+C";
5036 else if (size <= 32)
5038 s = "dextu";
5039 fmt = "t,r,+E,+H";
5041 else
5043 s = "dextm";
5044 fmt = "t,r,+A,+G";
5046 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5048 break;
5050 case M_DINS:
5052 unsigned long pos;
5053 unsigned long size;
5055 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5057 as_bad (_("Unsupported large constant"));
5058 pos = size = 1;
5060 else
5062 pos = (unsigned long) imm_expr.X_add_number;
5063 size = (unsigned long) imm2_expr.X_add_number;
5066 if (pos > 63)
5068 as_bad (_("Improper position (%lu)"), pos);
5069 pos = 1;
5071 if (size == 0 || size > 64
5072 || (pos + size - 1) > 63)
5074 as_bad (_("Improper insert size (%lu, position %lu)"),
5075 size, pos);
5076 size = 1;
5079 if (pos < 32 && (pos + size - 1) < 32)
5081 s = "dins";
5082 fmt = "t,r,+A,+B";
5084 else if (pos >= 32)
5086 s = "dinsu";
5087 fmt = "t,r,+E,+F";
5089 else
5091 s = "dinsm";
5092 fmt = "t,r,+A,+F";
5094 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5095 pos + size - 1);
5097 break;
5099 case M_DDIV_3:
5100 dbl = 1;
5101 case M_DIV_3:
5102 s = "mflo";
5103 goto do_div3;
5104 case M_DREM_3:
5105 dbl = 1;
5106 case M_REM_3:
5107 s = "mfhi";
5108 do_div3:
5109 if (treg == 0)
5111 as_warn (_("Divide by zero."));
5112 if (mips_trap)
5113 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5114 else
5115 macro_build (NULL, "break", "c", 7);
5116 break;
5119 start_noreorder ();
5120 if (mips_trap)
5122 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5123 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5125 else
5127 expr1.X_add_number = 8;
5128 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5129 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5130 macro_build (NULL, "break", "c", 7);
5132 expr1.X_add_number = -1;
5133 used_at = 1;
5134 load_register (AT, &expr1, dbl);
5135 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5136 macro_build (&expr1, "bne", "s,t,p", treg, AT);
5137 if (dbl)
5139 expr1.X_add_number = 1;
5140 load_register (AT, &expr1, dbl);
5141 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5143 else
5145 expr1.X_add_number = 0x80000000;
5146 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5148 if (mips_trap)
5150 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5151 /* We want to close the noreorder block as soon as possible, so
5152 that later insns are available for delay slot filling. */
5153 end_noreorder ();
5155 else
5157 expr1.X_add_number = 8;
5158 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5159 macro_build (NULL, "nop", "", 0);
5161 /* We want to close the noreorder block as soon as possible, so
5162 that later insns are available for delay slot filling. */
5163 end_noreorder ();
5165 macro_build (NULL, "break", "c", 6);
5167 macro_build (NULL, s, "d", dreg);
5168 break;
5170 case M_DIV_3I:
5171 s = "div";
5172 s2 = "mflo";
5173 goto do_divi;
5174 case M_DIVU_3I:
5175 s = "divu";
5176 s2 = "mflo";
5177 goto do_divi;
5178 case M_REM_3I:
5179 s = "div";
5180 s2 = "mfhi";
5181 goto do_divi;
5182 case M_REMU_3I:
5183 s = "divu";
5184 s2 = "mfhi";
5185 goto do_divi;
5186 case M_DDIV_3I:
5187 dbl = 1;
5188 s = "ddiv";
5189 s2 = "mflo";
5190 goto do_divi;
5191 case M_DDIVU_3I:
5192 dbl = 1;
5193 s = "ddivu";
5194 s2 = "mflo";
5195 goto do_divi;
5196 case M_DREM_3I:
5197 dbl = 1;
5198 s = "ddiv";
5199 s2 = "mfhi";
5200 goto do_divi;
5201 case M_DREMU_3I:
5202 dbl = 1;
5203 s = "ddivu";
5204 s2 = "mfhi";
5205 do_divi:
5206 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5208 as_warn (_("Divide by zero."));
5209 if (mips_trap)
5210 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5211 else
5212 macro_build (NULL, "break", "c", 7);
5213 break;
5215 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5217 if (strcmp (s2, "mflo") == 0)
5218 move_register (dreg, sreg);
5219 else
5220 move_register (dreg, 0);
5221 break;
5223 if (imm_expr.X_op == O_constant
5224 && imm_expr.X_add_number == -1
5225 && s[strlen (s) - 1] != 'u')
5227 if (strcmp (s2, "mflo") == 0)
5229 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5231 else
5232 move_register (dreg, 0);
5233 break;
5236 used_at = 1;
5237 load_register (AT, &imm_expr, dbl);
5238 macro_build (NULL, s, "z,s,t", sreg, AT);
5239 macro_build (NULL, s2, "d", dreg);
5240 break;
5242 case M_DIVU_3:
5243 s = "divu";
5244 s2 = "mflo";
5245 goto do_divu3;
5246 case M_REMU_3:
5247 s = "divu";
5248 s2 = "mfhi";
5249 goto do_divu3;
5250 case M_DDIVU_3:
5251 s = "ddivu";
5252 s2 = "mflo";
5253 goto do_divu3;
5254 case M_DREMU_3:
5255 s = "ddivu";
5256 s2 = "mfhi";
5257 do_divu3:
5258 start_noreorder ();
5259 if (mips_trap)
5261 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5262 macro_build (NULL, s, "z,s,t", sreg, treg);
5263 /* We want to close the noreorder block as soon as possible, so
5264 that later insns are available for delay slot filling. */
5265 end_noreorder ();
5267 else
5269 expr1.X_add_number = 8;
5270 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5271 macro_build (NULL, s, "z,s,t", sreg, treg);
5273 /* We want to close the noreorder block as soon as possible, so
5274 that later insns are available for delay slot filling. */
5275 end_noreorder ();
5276 macro_build (NULL, "break", "c", 7);
5278 macro_build (NULL, s2, "d", dreg);
5279 break;
5281 case M_DLCA_AB:
5282 dbl = 1;
5283 case M_LCA_AB:
5284 call = 1;
5285 goto do_la;
5286 case M_DLA_AB:
5287 dbl = 1;
5288 case M_LA_AB:
5289 do_la:
5290 /* Load the address of a symbol into a register. If breg is not
5291 zero, we then add a base register to it. */
5293 if (dbl && HAVE_32BIT_GPRS)
5294 as_warn (_("dla used to load 32-bit register"));
5296 if (! dbl && HAVE_64BIT_OBJECTS)
5297 as_warn (_("la used to load 64-bit address"));
5299 if (offset_expr.X_op == O_constant
5300 && offset_expr.X_add_number >= -0x8000
5301 && offset_expr.X_add_number < 0x8000)
5303 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5304 "t,r,j", treg, sreg, BFD_RELOC_LO16);
5305 break;
5308 if (mips_opts.at && (treg == breg))
5310 tempreg = AT;
5311 used_at = 1;
5313 else
5315 tempreg = treg;
5318 if (offset_expr.X_op != O_symbol
5319 && offset_expr.X_op != O_constant)
5321 as_bad (_("expression too complex"));
5322 offset_expr.X_op = O_constant;
5325 if (offset_expr.X_op == O_constant)
5326 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5327 else if (mips_pic == NO_PIC)
5329 /* If this is a reference to a GP relative symbol, we want
5330 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5331 Otherwise we want
5332 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5333 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5334 If we have a constant, we need two instructions anyhow,
5335 so we may as well always use the latter form.
5337 With 64bit address space and a usable $at we want
5338 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5339 lui $at,<sym> (BFD_RELOC_HI16_S)
5340 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5341 daddiu $at,<sym> (BFD_RELOC_LO16)
5342 dsll32 $tempreg,0
5343 daddu $tempreg,$tempreg,$at
5345 If $at is already in use, we use a path which is suboptimal
5346 on superscalar processors.
5347 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5348 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5349 dsll $tempreg,16
5350 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5351 dsll $tempreg,16
5352 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5354 For GP relative symbols in 64bit address space we can use
5355 the same sequence as in 32bit address space. */
5356 if (HAVE_64BIT_SYMBOLS)
5358 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5359 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5361 relax_start (offset_expr.X_add_symbol);
5362 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5363 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5364 relax_switch ();
5367 if (used_at == 0 && mips_opts.at)
5369 macro_build (&offset_expr, "lui", "t,u",
5370 tempreg, BFD_RELOC_MIPS_HIGHEST);
5371 macro_build (&offset_expr, "lui", "t,u",
5372 AT, BFD_RELOC_HI16_S);
5373 macro_build (&offset_expr, "daddiu", "t,r,j",
5374 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5375 macro_build (&offset_expr, "daddiu", "t,r,j",
5376 AT, AT, BFD_RELOC_LO16);
5377 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5378 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5379 used_at = 1;
5381 else
5383 macro_build (&offset_expr, "lui", "t,u",
5384 tempreg, BFD_RELOC_MIPS_HIGHEST);
5385 macro_build (&offset_expr, "daddiu", "t,r,j",
5386 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5387 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5388 macro_build (&offset_expr, "daddiu", "t,r,j",
5389 tempreg, tempreg, BFD_RELOC_HI16_S);
5390 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5391 macro_build (&offset_expr, "daddiu", "t,r,j",
5392 tempreg, tempreg, BFD_RELOC_LO16);
5395 if (mips_relax.sequence)
5396 relax_end ();
5398 else
5400 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5401 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5403 relax_start (offset_expr.X_add_symbol);
5404 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5405 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5406 relax_switch ();
5408 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5409 as_bad (_("offset too large"));
5410 macro_build_lui (&offset_expr, tempreg);
5411 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5412 tempreg, tempreg, BFD_RELOC_LO16);
5413 if (mips_relax.sequence)
5414 relax_end ();
5417 else if (!mips_big_got && !HAVE_NEWABI)
5419 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5421 /* If this is a reference to an external symbol, and there
5422 is no constant, we want
5423 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5424 or for lca or if tempreg is PIC_CALL_REG
5425 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5426 For a local symbol, we want
5427 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5429 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5431 If we have a small constant, and this is a reference to
5432 an external symbol, we want
5433 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5435 addiu $tempreg,$tempreg,<constant>
5436 For a local symbol, we want the same instruction
5437 sequence, but we output a BFD_RELOC_LO16 reloc on the
5438 addiu instruction.
5440 If we have a large constant, and this is a reference to
5441 an external symbol, we want
5442 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5443 lui $at,<hiconstant>
5444 addiu $at,$at,<loconstant>
5445 addu $tempreg,$tempreg,$at
5446 For a local symbol, we want the same instruction
5447 sequence, but we output a BFD_RELOC_LO16 reloc on the
5448 addiu instruction.
5451 if (offset_expr.X_add_number == 0)
5453 if (mips_pic == SVR4_PIC
5454 && breg == 0
5455 && (call || tempreg == PIC_CALL_REG))
5456 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5458 relax_start (offset_expr.X_add_symbol);
5459 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5460 lw_reloc_type, mips_gp_register);
5461 if (breg != 0)
5463 /* We're going to put in an addu instruction using
5464 tempreg, so we may as well insert the nop right
5465 now. */
5466 load_delay_nop ();
5468 relax_switch ();
5469 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5470 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5471 load_delay_nop ();
5472 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5473 tempreg, tempreg, BFD_RELOC_LO16);
5474 relax_end ();
5475 /* FIXME: If breg == 0, and the next instruction uses
5476 $tempreg, then if this variant case is used an extra
5477 nop will be generated. */
5479 else if (offset_expr.X_add_number >= -0x8000
5480 && offset_expr.X_add_number < 0x8000)
5482 load_got_offset (tempreg, &offset_expr);
5483 load_delay_nop ();
5484 add_got_offset (tempreg, &offset_expr);
5486 else
5488 expr1.X_add_number = offset_expr.X_add_number;
5489 offset_expr.X_add_number =
5490 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5491 load_got_offset (tempreg, &offset_expr);
5492 offset_expr.X_add_number = expr1.X_add_number;
5493 /* If we are going to add in a base register, and the
5494 target register and the base register are the same,
5495 then we are using AT as a temporary register. Since
5496 we want to load the constant into AT, we add our
5497 current AT (from the global offset table) and the
5498 register into the register now, and pretend we were
5499 not using a base register. */
5500 if (breg == treg)
5502 load_delay_nop ();
5503 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5504 treg, AT, breg);
5505 breg = 0;
5506 tempreg = treg;
5508 add_got_offset_hilo (tempreg, &offset_expr, AT);
5509 used_at = 1;
5512 else if (!mips_big_got && HAVE_NEWABI)
5514 int add_breg_early = 0;
5516 /* If this is a reference to an external, and there is no
5517 constant, or local symbol (*), with or without a
5518 constant, we want
5519 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5520 or for lca or if tempreg is PIC_CALL_REG
5521 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5523 If we have a small constant, and this is a reference to
5524 an external symbol, we want
5525 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5526 addiu $tempreg,$tempreg,<constant>
5528 If we have a large constant, and this is a reference to
5529 an external symbol, we want
5530 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5531 lui $at,<hiconstant>
5532 addiu $at,$at,<loconstant>
5533 addu $tempreg,$tempreg,$at
5535 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5536 local symbols, even though it introduces an additional
5537 instruction. */
5539 if (offset_expr.X_add_number)
5541 expr1.X_add_number = offset_expr.X_add_number;
5542 offset_expr.X_add_number = 0;
5544 relax_start (offset_expr.X_add_symbol);
5545 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5546 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5548 if (expr1.X_add_number >= -0x8000
5549 && expr1.X_add_number < 0x8000)
5551 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5552 tempreg, tempreg, BFD_RELOC_LO16);
5554 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5556 int dreg;
5558 /* If we are going to add in a base register, and the
5559 target register and the base register are the same,
5560 then we are using AT as a temporary register. Since
5561 we want to load the constant into AT, we add our
5562 current AT (from the global offset table) and the
5563 register into the register now, and pretend we were
5564 not using a base register. */
5565 if (breg != treg)
5566 dreg = tempreg;
5567 else
5569 assert (tempreg == AT);
5570 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5571 treg, AT, breg);
5572 dreg = treg;
5573 add_breg_early = 1;
5576 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5577 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5578 dreg, dreg, AT);
5580 used_at = 1;
5582 else
5583 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5585 relax_switch ();
5586 offset_expr.X_add_number = expr1.X_add_number;
5588 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5589 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5590 if (add_breg_early)
5592 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5593 treg, tempreg, breg);
5594 breg = 0;
5595 tempreg = treg;
5597 relax_end ();
5599 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5601 relax_start (offset_expr.X_add_symbol);
5602 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5603 BFD_RELOC_MIPS_CALL16, mips_gp_register);
5604 relax_switch ();
5605 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5606 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5607 relax_end ();
5609 else
5611 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5612 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5615 else if (mips_big_got && !HAVE_NEWABI)
5617 int gpdelay;
5618 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5619 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5620 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5622 /* This is the large GOT case. If this is a reference to an
5623 external symbol, and there is no constant, we want
5624 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5625 addu $tempreg,$tempreg,$gp
5626 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5627 or for lca or if tempreg is PIC_CALL_REG
5628 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5629 addu $tempreg,$tempreg,$gp
5630 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5631 For a local symbol, we want
5632 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5634 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5636 If we have a small constant, and this is a reference to
5637 an external symbol, we want
5638 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5639 addu $tempreg,$tempreg,$gp
5640 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5642 addiu $tempreg,$tempreg,<constant>
5643 For a local symbol, we want
5644 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5646 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5648 If we have a large constant, and this is a reference to
5649 an external symbol, we want
5650 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5651 addu $tempreg,$tempreg,$gp
5652 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5653 lui $at,<hiconstant>
5654 addiu $at,$at,<loconstant>
5655 addu $tempreg,$tempreg,$at
5656 For a local symbol, we want
5657 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5658 lui $at,<hiconstant>
5659 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5660 addu $tempreg,$tempreg,$at
5663 expr1.X_add_number = offset_expr.X_add_number;
5664 offset_expr.X_add_number = 0;
5665 relax_start (offset_expr.X_add_symbol);
5666 gpdelay = reg_needs_delay (mips_gp_register);
5667 if (expr1.X_add_number == 0 && breg == 0
5668 && (call || tempreg == PIC_CALL_REG))
5670 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5671 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5673 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5674 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5675 tempreg, tempreg, mips_gp_register);
5676 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5677 tempreg, lw_reloc_type, tempreg);
5678 if (expr1.X_add_number == 0)
5680 if (breg != 0)
5682 /* We're going to put in an addu instruction using
5683 tempreg, so we may as well insert the nop right
5684 now. */
5685 load_delay_nop ();
5688 else if (expr1.X_add_number >= -0x8000
5689 && expr1.X_add_number < 0x8000)
5691 load_delay_nop ();
5692 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5693 tempreg, tempreg, BFD_RELOC_LO16);
5695 else
5697 int dreg;
5699 /* If we are going to add in a base register, and the
5700 target register and the base register are the same,
5701 then we are using AT as a temporary register. Since
5702 we want to load the constant into AT, we add our
5703 current AT (from the global offset table) and the
5704 register into the register now, and pretend we were
5705 not using a base register. */
5706 if (breg != treg)
5707 dreg = tempreg;
5708 else
5710 assert (tempreg == AT);
5711 load_delay_nop ();
5712 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5713 treg, AT, breg);
5714 dreg = treg;
5717 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5718 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5720 used_at = 1;
5722 offset_expr.X_add_number =
5723 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5724 relax_switch ();
5726 if (gpdelay)
5728 /* This is needed because this instruction uses $gp, but
5729 the first instruction on the main stream does not. */
5730 macro_build (NULL, "nop", "");
5733 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5734 local_reloc_type, mips_gp_register);
5735 if (expr1.X_add_number >= -0x8000
5736 && expr1.X_add_number < 0x8000)
5738 load_delay_nop ();
5739 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5740 tempreg, tempreg, BFD_RELOC_LO16);
5741 /* FIXME: If add_number is 0, and there was no base
5742 register, the external symbol case ended with a load,
5743 so if the symbol turns out to not be external, and
5744 the next instruction uses tempreg, an unnecessary nop
5745 will be inserted. */
5747 else
5749 if (breg == treg)
5751 /* We must add in the base register now, as in the
5752 external symbol case. */
5753 assert (tempreg == AT);
5754 load_delay_nop ();
5755 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5756 treg, AT, breg);
5757 tempreg = treg;
5758 /* We set breg to 0 because we have arranged to add
5759 it in in both cases. */
5760 breg = 0;
5763 macro_build_lui (&expr1, AT);
5764 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5765 AT, AT, BFD_RELOC_LO16);
5766 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5767 tempreg, tempreg, AT);
5768 used_at = 1;
5770 relax_end ();
5772 else if (mips_big_got && HAVE_NEWABI)
5774 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5775 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5776 int add_breg_early = 0;
5778 /* This is the large GOT case. If this is a reference to an
5779 external symbol, and there is no constant, we want
5780 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5781 add $tempreg,$tempreg,$gp
5782 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5783 or for lca or if tempreg is PIC_CALL_REG
5784 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5785 add $tempreg,$tempreg,$gp
5786 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5788 If we have a small constant, and this is a reference to
5789 an external symbol, we want
5790 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5791 add $tempreg,$tempreg,$gp
5792 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5793 addi $tempreg,$tempreg,<constant>
5795 If we have a large constant, and this is a reference to
5796 an external symbol, we want
5797 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5798 addu $tempreg,$tempreg,$gp
5799 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5800 lui $at,<hiconstant>
5801 addi $at,$at,<loconstant>
5802 add $tempreg,$tempreg,$at
5804 If we have NewABI, and we know it's a local symbol, we want
5805 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5806 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5807 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5809 relax_start (offset_expr.X_add_symbol);
5811 expr1.X_add_number = offset_expr.X_add_number;
5812 offset_expr.X_add_number = 0;
5814 if (expr1.X_add_number == 0 && breg == 0
5815 && (call || tempreg == PIC_CALL_REG))
5817 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5818 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5820 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5821 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5822 tempreg, tempreg, mips_gp_register);
5823 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5824 tempreg, lw_reloc_type, tempreg);
5826 if (expr1.X_add_number == 0)
5828 else if (expr1.X_add_number >= -0x8000
5829 && expr1.X_add_number < 0x8000)
5831 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5832 tempreg, tempreg, BFD_RELOC_LO16);
5834 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5836 int dreg;
5838 /* If we are going to add in a base register, and the
5839 target register and the base register are the same,
5840 then we are using AT as a temporary register. Since
5841 we want to load the constant into AT, we add our
5842 current AT (from the global offset table) and the
5843 register into the register now, and pretend we were
5844 not using a base register. */
5845 if (breg != treg)
5846 dreg = tempreg;
5847 else
5849 assert (tempreg == AT);
5850 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5851 treg, AT, breg);
5852 dreg = treg;
5853 add_breg_early = 1;
5856 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5857 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5859 used_at = 1;
5861 else
5862 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5864 relax_switch ();
5865 offset_expr.X_add_number = expr1.X_add_number;
5866 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5867 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5868 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5869 tempreg, BFD_RELOC_MIPS_GOT_OFST);
5870 if (add_breg_early)
5872 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5873 treg, tempreg, breg);
5874 breg = 0;
5875 tempreg = treg;
5877 relax_end ();
5879 else
5880 abort ();
5882 if (breg != 0)
5883 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5884 break;
5886 case M_J_A:
5887 /* The j instruction may not be used in PIC code, since it
5888 requires an absolute address. We convert it to a b
5889 instruction. */
5890 if (mips_pic == NO_PIC)
5891 macro_build (&offset_expr, "j", "a");
5892 else
5893 macro_build (&offset_expr, "b", "p");
5894 break;
5896 /* The jal instructions must be handled as macros because when
5897 generating PIC code they expand to multi-instruction
5898 sequences. Normally they are simple instructions. */
5899 case M_JAL_1:
5900 dreg = RA;
5901 /* Fall through. */
5902 case M_JAL_2:
5903 if (mips_pic == NO_PIC)
5904 macro_build (NULL, "jalr", "d,s", dreg, sreg);
5905 else
5907 if (sreg != PIC_CALL_REG)
5908 as_warn (_("MIPS PIC call to register other than $25"));
5910 macro_build (NULL, "jalr", "d,s", dreg, sreg);
5911 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5913 if (mips_cprestore_offset < 0)
5914 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5915 else
5917 if (! mips_frame_reg_valid)
5919 as_warn (_("No .frame pseudo-op used in PIC code"));
5920 /* Quiet this warning. */
5921 mips_frame_reg_valid = 1;
5923 if (! mips_cprestore_valid)
5925 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5926 /* Quiet this warning. */
5927 mips_cprestore_valid = 1;
5929 expr1.X_add_number = mips_cprestore_offset;
5930 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5931 mips_gp_register,
5932 mips_frame_reg,
5933 HAVE_64BIT_ADDRESSES);
5938 break;
5940 case M_JAL_A:
5941 if (mips_pic == NO_PIC)
5942 macro_build (&offset_expr, "jal", "a");
5943 else if (mips_pic == SVR4_PIC)
5945 /* If this is a reference to an external symbol, and we are
5946 using a small GOT, we want
5947 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5949 jalr $ra,$25
5951 lw $gp,cprestore($sp)
5952 The cprestore value is set using the .cprestore
5953 pseudo-op. If we are using a big GOT, we want
5954 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5955 addu $25,$25,$gp
5956 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5958 jalr $ra,$25
5960 lw $gp,cprestore($sp)
5961 If the symbol is not external, we want
5962 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5964 addiu $25,$25,<sym> (BFD_RELOC_LO16)
5965 jalr $ra,$25
5967 lw $gp,cprestore($sp)
5969 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5970 sequences above, minus nops, unless the symbol is local,
5971 which enables us to use GOT_PAGE/GOT_OFST (big got) or
5972 GOT_DISP. */
5973 if (HAVE_NEWABI)
5975 if (! mips_big_got)
5977 relax_start (offset_expr.X_add_symbol);
5978 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5979 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5980 mips_gp_register);
5981 relax_switch ();
5982 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5983 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5984 mips_gp_register);
5985 relax_end ();
5987 else
5989 relax_start (offset_expr.X_add_symbol);
5990 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5991 BFD_RELOC_MIPS_CALL_HI16);
5992 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5993 PIC_CALL_REG, mips_gp_register);
5994 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5995 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5996 PIC_CALL_REG);
5997 relax_switch ();
5998 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5999 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6000 mips_gp_register);
6001 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6002 PIC_CALL_REG, PIC_CALL_REG,
6003 BFD_RELOC_MIPS_GOT_OFST);
6004 relax_end ();
6007 macro_build_jalr (&offset_expr);
6009 else
6011 relax_start (offset_expr.X_add_symbol);
6012 if (! mips_big_got)
6014 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6015 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6016 mips_gp_register);
6017 load_delay_nop ();
6018 relax_switch ();
6020 else
6022 int gpdelay;
6024 gpdelay = reg_needs_delay (mips_gp_register);
6025 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6026 BFD_RELOC_MIPS_CALL_HI16);
6027 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6028 PIC_CALL_REG, mips_gp_register);
6029 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6030 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6031 PIC_CALL_REG);
6032 load_delay_nop ();
6033 relax_switch ();
6034 if (gpdelay)
6035 macro_build (NULL, "nop", "");
6037 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6038 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6039 mips_gp_register);
6040 load_delay_nop ();
6041 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6042 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6043 relax_end ();
6044 macro_build_jalr (&offset_expr);
6046 if (mips_cprestore_offset < 0)
6047 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6048 else
6050 if (! mips_frame_reg_valid)
6052 as_warn (_("No .frame pseudo-op used in PIC code"));
6053 /* Quiet this warning. */
6054 mips_frame_reg_valid = 1;
6056 if (! mips_cprestore_valid)
6058 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6059 /* Quiet this warning. */
6060 mips_cprestore_valid = 1;
6062 if (mips_opts.noreorder)
6063 macro_build (NULL, "nop", "");
6064 expr1.X_add_number = mips_cprestore_offset;
6065 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6066 mips_gp_register,
6067 mips_frame_reg,
6068 HAVE_64BIT_ADDRESSES);
6072 else if (mips_pic == VXWORKS_PIC)
6073 as_bad (_("Non-PIC jump used in PIC library"));
6074 else
6075 abort ();
6077 break;
6079 case M_LB_AB:
6080 s = "lb";
6081 goto ld;
6082 case M_LBU_AB:
6083 s = "lbu";
6084 goto ld;
6085 case M_LH_AB:
6086 s = "lh";
6087 goto ld;
6088 case M_LHU_AB:
6089 s = "lhu";
6090 goto ld;
6091 case M_LW_AB:
6092 s = "lw";
6093 goto ld;
6094 case M_LWC0_AB:
6095 s = "lwc0";
6096 /* Itbl support may require additional care here. */
6097 coproc = 1;
6098 goto ld;
6099 case M_LWC1_AB:
6100 s = "lwc1";
6101 /* Itbl support may require additional care here. */
6102 coproc = 1;
6103 goto ld;
6104 case M_LWC2_AB:
6105 s = "lwc2";
6106 /* Itbl support may require additional care here. */
6107 coproc = 1;
6108 goto ld;
6109 case M_LWC3_AB:
6110 s = "lwc3";
6111 /* Itbl support may require additional care here. */
6112 coproc = 1;
6113 goto ld;
6114 case M_LWL_AB:
6115 s = "lwl";
6116 lr = 1;
6117 goto ld;
6118 case M_LWR_AB:
6119 s = "lwr";
6120 lr = 1;
6121 goto ld;
6122 case M_LDC1_AB:
6123 if (mips_opts.arch == CPU_R4650)
6125 as_bad (_("opcode not supported on this processor"));
6126 break;
6128 s = "ldc1";
6129 /* Itbl support may require additional care here. */
6130 coproc = 1;
6131 goto ld;
6132 case M_LDC2_AB:
6133 s = "ldc2";
6134 /* Itbl support may require additional care here. */
6135 coproc = 1;
6136 goto ld;
6137 case M_LDC3_AB:
6138 s = "ldc3";
6139 /* Itbl support may require additional care here. */
6140 coproc = 1;
6141 goto ld;
6142 case M_LDL_AB:
6143 s = "ldl";
6144 lr = 1;
6145 goto ld;
6146 case M_LDR_AB:
6147 s = "ldr";
6148 lr = 1;
6149 goto ld;
6150 case M_LL_AB:
6151 s = "ll";
6152 goto ld;
6153 case M_LLD_AB:
6154 s = "lld";
6155 goto ld;
6156 case M_LWU_AB:
6157 s = "lwu";
6159 if (breg == treg || coproc || lr)
6161 tempreg = AT;
6162 used_at = 1;
6164 else
6166 tempreg = treg;
6168 goto ld_st;
6169 case M_SB_AB:
6170 s = "sb";
6171 goto st;
6172 case M_SH_AB:
6173 s = "sh";
6174 goto st;
6175 case M_SW_AB:
6176 s = "sw";
6177 goto st;
6178 case M_SWC0_AB:
6179 s = "swc0";
6180 /* Itbl support may require additional care here. */
6181 coproc = 1;
6182 goto st;
6183 case M_SWC1_AB:
6184 s = "swc1";
6185 /* Itbl support may require additional care here. */
6186 coproc = 1;
6187 goto st;
6188 case M_SWC2_AB:
6189 s = "swc2";
6190 /* Itbl support may require additional care here. */
6191 coproc = 1;
6192 goto st;
6193 case M_SWC3_AB:
6194 s = "swc3";
6195 /* Itbl support may require additional care here. */
6196 coproc = 1;
6197 goto st;
6198 case M_SWL_AB:
6199 s = "swl";
6200 goto st;
6201 case M_SWR_AB:
6202 s = "swr";
6203 goto st;
6204 case M_SC_AB:
6205 s = "sc";
6206 goto st;
6207 case M_SCD_AB:
6208 s = "scd";
6209 goto st;
6210 case M_CACHE_AB:
6211 s = "cache";
6212 goto st;
6213 case M_SDC1_AB:
6214 if (mips_opts.arch == CPU_R4650)
6216 as_bad (_("opcode not supported on this processor"));
6217 break;
6219 s = "sdc1";
6220 coproc = 1;
6221 /* Itbl support may require additional care here. */
6222 goto st;
6223 case M_SDC2_AB:
6224 s = "sdc2";
6225 /* Itbl support may require additional care here. */
6226 coproc = 1;
6227 goto st;
6228 case M_SDC3_AB:
6229 s = "sdc3";
6230 /* Itbl support may require additional care here. */
6231 coproc = 1;
6232 goto st;
6233 case M_SDL_AB:
6234 s = "sdl";
6235 goto st;
6236 case M_SDR_AB:
6237 s = "sdr";
6239 tempreg = AT;
6240 used_at = 1;
6241 ld_st:
6242 /* Itbl support may require additional care here. */
6243 if (mask == M_LWC1_AB
6244 || mask == M_SWC1_AB
6245 || mask == M_LDC1_AB
6246 || mask == M_SDC1_AB
6247 || mask == M_L_DAB
6248 || mask == M_S_DAB)
6249 fmt = "T,o(b)";
6250 else if (mask == M_CACHE_AB)
6251 fmt = "k,o(b)";
6252 else if (coproc)
6253 fmt = "E,o(b)";
6254 else
6255 fmt = "t,o(b)";
6257 if (offset_expr.X_op != O_constant
6258 && offset_expr.X_op != O_symbol)
6260 as_bad (_("expression too complex"));
6261 offset_expr.X_op = O_constant;
6264 if (HAVE_32BIT_ADDRESSES
6265 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6267 char value [32];
6269 sprintf_vma (value, offset_expr.X_add_number);
6270 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6273 /* A constant expression in PIC code can be handled just as it
6274 is in non PIC code. */
6275 if (offset_expr.X_op == O_constant)
6277 expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6278 & ~(bfd_vma) 0xffff);
6279 normalize_address_expr (&expr1);
6280 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6281 if (breg != 0)
6282 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6283 tempreg, tempreg, breg);
6284 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6286 else if (mips_pic == NO_PIC)
6288 /* If this is a reference to a GP relative symbol, and there
6289 is no base register, we want
6290 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6291 Otherwise, if there is no base register, we want
6292 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6293 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6294 If we have a constant, we need two instructions anyhow,
6295 so we always use the latter form.
6297 If we have a base register, and this is a reference to a
6298 GP relative symbol, we want
6299 addu $tempreg,$breg,$gp
6300 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6301 Otherwise we want
6302 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6303 addu $tempreg,$tempreg,$breg
6304 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6305 With a constant we always use the latter case.
6307 With 64bit address space and no base register and $at usable,
6308 we want
6309 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6310 lui $at,<sym> (BFD_RELOC_HI16_S)
6311 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6312 dsll32 $tempreg,0
6313 daddu $tempreg,$at
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 lui $at,<sym> (BFD_RELOC_HI16_S)
6318 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6319 daddu $at,$breg
6320 dsll32 $tempreg,0
6321 daddu $tempreg,$at
6322 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6324 Without $at we can't generate the optimal path for superscalar
6325 processors here since this would require two temporary registers.
6326 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6327 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6328 dsll $tempreg,16
6329 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6330 dsll $tempreg,16
6331 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6332 If we have a base register, we want
6333 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6334 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6335 dsll $tempreg,16
6336 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6337 dsll $tempreg,16
6338 daddu $tempreg,$tempreg,$breg
6339 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6341 For GP relative symbols in 64bit address space we can use
6342 the same sequence as in 32bit address space. */
6343 if (HAVE_64BIT_SYMBOLS)
6345 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6346 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6348 relax_start (offset_expr.X_add_symbol);
6349 if (breg == 0)
6351 macro_build (&offset_expr, s, fmt, treg,
6352 BFD_RELOC_GPREL16, mips_gp_register);
6354 else
6356 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6357 tempreg, breg, mips_gp_register);
6358 macro_build (&offset_expr, s, fmt, treg,
6359 BFD_RELOC_GPREL16, tempreg);
6361 relax_switch ();
6364 if (used_at == 0 && mips_opts.at)
6366 macro_build (&offset_expr, "lui", "t,u", tempreg,
6367 BFD_RELOC_MIPS_HIGHEST);
6368 macro_build (&offset_expr, "lui", "t,u", AT,
6369 BFD_RELOC_HI16_S);
6370 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6371 tempreg, BFD_RELOC_MIPS_HIGHER);
6372 if (breg != 0)
6373 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6374 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6375 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6376 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6377 tempreg);
6378 used_at = 1;
6380 else
6382 macro_build (&offset_expr, "lui", "t,u", tempreg,
6383 BFD_RELOC_MIPS_HIGHEST);
6384 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6385 tempreg, BFD_RELOC_MIPS_HIGHER);
6386 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6387 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6388 tempreg, BFD_RELOC_HI16_S);
6389 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6390 if (breg != 0)
6391 macro_build (NULL, "daddu", "d,v,t",
6392 tempreg, tempreg, breg);
6393 macro_build (&offset_expr, s, fmt, treg,
6394 BFD_RELOC_LO16, tempreg);
6397 if (mips_relax.sequence)
6398 relax_end ();
6399 break;
6402 if (breg == 0)
6404 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6405 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6407 relax_start (offset_expr.X_add_symbol);
6408 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6409 mips_gp_register);
6410 relax_switch ();
6412 macro_build_lui (&offset_expr, tempreg);
6413 macro_build (&offset_expr, s, fmt, treg,
6414 BFD_RELOC_LO16, tempreg);
6415 if (mips_relax.sequence)
6416 relax_end ();
6418 else
6420 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6421 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6423 relax_start (offset_expr.X_add_symbol);
6424 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6425 tempreg, breg, mips_gp_register);
6426 macro_build (&offset_expr, s, fmt, treg,
6427 BFD_RELOC_GPREL16, tempreg);
6428 relax_switch ();
6430 macro_build_lui (&offset_expr, tempreg);
6431 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6432 tempreg, tempreg, breg);
6433 macro_build (&offset_expr, s, fmt, treg,
6434 BFD_RELOC_LO16, tempreg);
6435 if (mips_relax.sequence)
6436 relax_end ();
6439 else if (!mips_big_got)
6441 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6443 /* If this is a reference to an external symbol, we want
6444 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6446 <op> $treg,0($tempreg)
6447 Otherwise we want
6448 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6450 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6451 <op> $treg,0($tempreg)
6453 For NewABI, we want
6454 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6455 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6457 If there is a base register, we add it to $tempreg before
6458 the <op>. If there is a constant, we stick it in the
6459 <op> instruction. We don't handle constants larger than
6460 16 bits, because we have no way to load the upper 16 bits
6461 (actually, we could handle them for the subset of cases
6462 in which we are not using $at). */
6463 assert (offset_expr.X_op == O_symbol);
6464 if (HAVE_NEWABI)
6466 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6467 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6468 if (breg != 0)
6469 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6470 tempreg, tempreg, breg);
6471 macro_build (&offset_expr, s, fmt, treg,
6472 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6473 break;
6475 expr1.X_add_number = offset_expr.X_add_number;
6476 offset_expr.X_add_number = 0;
6477 if (expr1.X_add_number < -0x8000
6478 || expr1.X_add_number >= 0x8000)
6479 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6480 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6481 lw_reloc_type, mips_gp_register);
6482 load_delay_nop ();
6483 relax_start (offset_expr.X_add_symbol);
6484 relax_switch ();
6485 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6486 tempreg, BFD_RELOC_LO16);
6487 relax_end ();
6488 if (breg != 0)
6489 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6490 tempreg, tempreg, breg);
6491 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6493 else if (mips_big_got && !HAVE_NEWABI)
6495 int gpdelay;
6497 /* If this is a reference to an external symbol, we want
6498 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6499 addu $tempreg,$tempreg,$gp
6500 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6501 <op> $treg,0($tempreg)
6502 Otherwise we want
6503 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6505 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6506 <op> $treg,0($tempreg)
6507 If there is a base register, we add it to $tempreg before
6508 the <op>. If there is a constant, we stick it in the
6509 <op> instruction. We don't handle constants larger than
6510 16 bits, because we have no way to load the upper 16 bits
6511 (actually, we could handle them for the subset of cases
6512 in which we are not using $at). */
6513 assert (offset_expr.X_op == O_symbol);
6514 expr1.X_add_number = offset_expr.X_add_number;
6515 offset_expr.X_add_number = 0;
6516 if (expr1.X_add_number < -0x8000
6517 || expr1.X_add_number >= 0x8000)
6518 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6519 gpdelay = reg_needs_delay (mips_gp_register);
6520 relax_start (offset_expr.X_add_symbol);
6521 macro_build (&offset_expr, "lui", "t,u", tempreg,
6522 BFD_RELOC_MIPS_GOT_HI16);
6523 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6524 mips_gp_register);
6525 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6526 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6527 relax_switch ();
6528 if (gpdelay)
6529 macro_build (NULL, "nop", "");
6530 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6531 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6532 load_delay_nop ();
6533 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6534 tempreg, BFD_RELOC_LO16);
6535 relax_end ();
6537 if (breg != 0)
6538 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6539 tempreg, tempreg, breg);
6540 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6542 else if (mips_big_got && HAVE_NEWABI)
6544 /* If this is a reference to an external symbol, we want
6545 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6546 add $tempreg,$tempreg,$gp
6547 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6548 <op> $treg,<ofst>($tempreg)
6549 Otherwise, for local symbols, we want:
6550 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6551 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6552 assert (offset_expr.X_op == O_symbol);
6553 expr1.X_add_number = offset_expr.X_add_number;
6554 offset_expr.X_add_number = 0;
6555 if (expr1.X_add_number < -0x8000
6556 || expr1.X_add_number >= 0x8000)
6557 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6558 relax_start (offset_expr.X_add_symbol);
6559 macro_build (&offset_expr, "lui", "t,u", tempreg,
6560 BFD_RELOC_MIPS_GOT_HI16);
6561 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6562 mips_gp_register);
6563 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6564 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6565 if (breg != 0)
6566 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6567 tempreg, tempreg, breg);
6568 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6570 relax_switch ();
6571 offset_expr.X_add_number = expr1.X_add_number;
6572 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6573 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6574 if (breg != 0)
6575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6576 tempreg, tempreg, breg);
6577 macro_build (&offset_expr, s, fmt, treg,
6578 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6579 relax_end ();
6581 else
6582 abort ();
6584 break;
6586 case M_LI:
6587 case M_LI_S:
6588 load_register (treg, &imm_expr, 0);
6589 break;
6591 case M_DLI:
6592 load_register (treg, &imm_expr, 1);
6593 break;
6595 case M_LI_SS:
6596 if (imm_expr.X_op == O_constant)
6598 used_at = 1;
6599 load_register (AT, &imm_expr, 0);
6600 macro_build (NULL, "mtc1", "t,G", AT, treg);
6601 break;
6603 else
6605 assert (offset_expr.X_op == O_symbol
6606 && strcmp (segment_name (S_GET_SEGMENT
6607 (offset_expr.X_add_symbol)),
6608 ".lit4") == 0
6609 && offset_expr.X_add_number == 0);
6610 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6611 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6612 break;
6615 case M_LI_D:
6616 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6617 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6618 order 32 bits of the value and the low order 32 bits are either
6619 zero or in OFFSET_EXPR. */
6620 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6622 if (HAVE_64BIT_GPRS)
6623 load_register (treg, &imm_expr, 1);
6624 else
6626 int hreg, lreg;
6628 if (target_big_endian)
6630 hreg = treg;
6631 lreg = treg + 1;
6633 else
6635 hreg = treg + 1;
6636 lreg = treg;
6639 if (hreg <= 31)
6640 load_register (hreg, &imm_expr, 0);
6641 if (lreg <= 31)
6643 if (offset_expr.X_op == O_absent)
6644 move_register (lreg, 0);
6645 else
6647 assert (offset_expr.X_op == O_constant);
6648 load_register (lreg, &offset_expr, 0);
6652 break;
6655 /* We know that sym is in the .rdata section. First we get the
6656 upper 16 bits of the address. */
6657 if (mips_pic == NO_PIC)
6659 macro_build_lui (&offset_expr, AT);
6660 used_at = 1;
6662 else
6664 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6665 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6666 used_at = 1;
6669 /* Now we load the register(s). */
6670 if (HAVE_64BIT_GPRS)
6672 used_at = 1;
6673 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6675 else
6677 used_at = 1;
6678 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6679 if (treg != RA)
6681 /* FIXME: How in the world do we deal with the possible
6682 overflow here? */
6683 offset_expr.X_add_number += 4;
6684 macro_build (&offset_expr, "lw", "t,o(b)",
6685 treg + 1, BFD_RELOC_LO16, AT);
6688 break;
6690 case M_LI_DD:
6691 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6692 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6693 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6694 the value and the low order 32 bits are either zero or in
6695 OFFSET_EXPR. */
6696 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6698 used_at = 1;
6699 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6700 if (HAVE_64BIT_FPRS)
6702 assert (HAVE_64BIT_GPRS);
6703 macro_build (NULL, "dmtc1", "t,S", AT, treg);
6705 else
6707 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6708 if (offset_expr.X_op == O_absent)
6709 macro_build (NULL, "mtc1", "t,G", 0, treg);
6710 else
6712 assert (offset_expr.X_op == O_constant);
6713 load_register (AT, &offset_expr, 0);
6714 macro_build (NULL, "mtc1", "t,G", AT, treg);
6717 break;
6720 assert (offset_expr.X_op == O_symbol
6721 && offset_expr.X_add_number == 0);
6722 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6723 if (strcmp (s, ".lit8") == 0)
6725 if (mips_opts.isa != ISA_MIPS1)
6727 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6728 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6729 break;
6731 breg = mips_gp_register;
6732 r = BFD_RELOC_MIPS_LITERAL;
6733 goto dob;
6735 else
6737 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6738 used_at = 1;
6739 if (mips_pic != NO_PIC)
6740 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6741 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6742 else
6744 /* FIXME: This won't work for a 64 bit address. */
6745 macro_build_lui (&offset_expr, AT);
6748 if (mips_opts.isa != ISA_MIPS1)
6750 macro_build (&offset_expr, "ldc1", "T,o(b)",
6751 treg, BFD_RELOC_LO16, AT);
6752 break;
6754 breg = AT;
6755 r = BFD_RELOC_LO16;
6756 goto dob;
6759 case M_L_DOB:
6760 if (mips_opts.arch == CPU_R4650)
6762 as_bad (_("opcode not supported on this processor"));
6763 break;
6765 /* Even on a big endian machine $fn comes before $fn+1. We have
6766 to adjust when loading from memory. */
6767 r = BFD_RELOC_LO16;
6768 dob:
6769 assert (mips_opts.isa == ISA_MIPS1);
6770 macro_build (&offset_expr, "lwc1", "T,o(b)",
6771 target_big_endian ? treg + 1 : treg, r, breg);
6772 /* FIXME: A possible overflow which I don't know how to deal
6773 with. */
6774 offset_expr.X_add_number += 4;
6775 macro_build (&offset_expr, "lwc1", "T,o(b)",
6776 target_big_endian ? treg : treg + 1, r, breg);
6777 break;
6779 case M_L_DAB:
6781 * The MIPS assembler seems to check for X_add_number not
6782 * being double aligned and generating:
6783 * lui at,%hi(foo+1)
6784 * addu at,at,v1
6785 * addiu at,at,%lo(foo+1)
6786 * lwc1 f2,0(at)
6787 * lwc1 f3,4(at)
6788 * But, the resulting address is the same after relocation so why
6789 * generate the extra instruction?
6791 if (mips_opts.arch == CPU_R4650)
6793 as_bad (_("opcode not supported on this processor"));
6794 break;
6796 /* Itbl support may require additional care here. */
6797 coproc = 1;
6798 if (mips_opts.isa != ISA_MIPS1)
6800 s = "ldc1";
6801 goto ld;
6804 s = "lwc1";
6805 fmt = "T,o(b)";
6806 goto ldd_std;
6808 case M_S_DAB:
6809 if (mips_opts.arch == CPU_R4650)
6811 as_bad (_("opcode not supported on this processor"));
6812 break;
6815 if (mips_opts.isa != ISA_MIPS1)
6817 s = "sdc1";
6818 goto st;
6821 s = "swc1";
6822 fmt = "T,o(b)";
6823 /* Itbl support may require additional care here. */
6824 coproc = 1;
6825 goto ldd_std;
6827 case M_LD_AB:
6828 if (HAVE_64BIT_GPRS)
6830 s = "ld";
6831 goto ld;
6834 s = "lw";
6835 fmt = "t,o(b)";
6836 goto ldd_std;
6838 case M_SD_AB:
6839 if (HAVE_64BIT_GPRS)
6841 s = "sd";
6842 goto st;
6845 s = "sw";
6846 fmt = "t,o(b)";
6848 ldd_std:
6849 if (offset_expr.X_op != O_symbol
6850 && offset_expr.X_op != O_constant)
6852 as_bad (_("expression too complex"));
6853 offset_expr.X_op = O_constant;
6856 if (HAVE_32BIT_ADDRESSES
6857 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6859 char value [32];
6861 sprintf_vma (value, offset_expr.X_add_number);
6862 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6865 /* Even on a big endian machine $fn comes before $fn+1. We have
6866 to adjust when loading from memory. We set coproc if we must
6867 load $fn+1 first. */
6868 /* Itbl support may require additional care here. */
6869 if (! target_big_endian)
6870 coproc = 0;
6872 if (mips_pic == NO_PIC
6873 || offset_expr.X_op == O_constant)
6875 /* If this is a reference to a GP relative symbol, we want
6876 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6877 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6878 If we have a base register, we use this
6879 addu $at,$breg,$gp
6880 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6881 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6882 If this is not a GP relative symbol, we want
6883 lui $at,<sym> (BFD_RELOC_HI16_S)
6884 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6885 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6886 If there is a base register, we add it to $at after the
6887 lui instruction. If there is a constant, we always use
6888 the last case. */
6889 if (offset_expr.X_op == O_symbol
6890 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6891 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6893 relax_start (offset_expr.X_add_symbol);
6894 if (breg == 0)
6896 tempreg = mips_gp_register;
6898 else
6900 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6901 AT, breg, mips_gp_register);
6902 tempreg = AT;
6903 used_at = 1;
6906 /* Itbl support may require additional care here. */
6907 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6908 BFD_RELOC_GPREL16, tempreg);
6909 offset_expr.X_add_number += 4;
6911 /* Set mips_optimize to 2 to avoid inserting an
6912 undesired nop. */
6913 hold_mips_optimize = mips_optimize;
6914 mips_optimize = 2;
6915 /* Itbl support may require additional care here. */
6916 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6917 BFD_RELOC_GPREL16, tempreg);
6918 mips_optimize = hold_mips_optimize;
6920 relax_switch ();
6922 /* We just generated two relocs. When tc_gen_reloc
6923 handles this case, it will skip the first reloc and
6924 handle the second. The second reloc already has an
6925 extra addend of 4, which we added above. We must
6926 subtract it out, and then subtract another 4 to make
6927 the first reloc come out right. The second reloc
6928 will come out right because we are going to add 4 to
6929 offset_expr when we build its instruction below.
6931 If we have a symbol, then we don't want to include
6932 the offset, because it will wind up being included
6933 when we generate the reloc. */
6935 if (offset_expr.X_op == O_constant)
6936 offset_expr.X_add_number -= 8;
6937 else
6939 offset_expr.X_add_number = -4;
6940 offset_expr.X_op = O_constant;
6943 used_at = 1;
6944 macro_build_lui (&offset_expr, AT);
6945 if (breg != 0)
6946 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6947 /* Itbl support may require additional care here. */
6948 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6949 BFD_RELOC_LO16, AT);
6950 /* FIXME: How do we handle overflow here? */
6951 offset_expr.X_add_number += 4;
6952 /* Itbl support may require additional care here. */
6953 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6954 BFD_RELOC_LO16, AT);
6955 if (mips_relax.sequence)
6956 relax_end ();
6958 else if (!mips_big_got)
6960 /* If this is a reference to an external symbol, we want
6961 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6963 <op> $treg,0($at)
6964 <op> $treg+1,4($at)
6965 Otherwise we want
6966 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6968 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6969 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6970 If there is a base register we add it to $at before the
6971 lwc1 instructions. If there is a constant we include it
6972 in the lwc1 instructions. */
6973 used_at = 1;
6974 expr1.X_add_number = offset_expr.X_add_number;
6975 if (expr1.X_add_number < -0x8000
6976 || expr1.X_add_number >= 0x8000 - 4)
6977 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6978 load_got_offset (AT, &offset_expr);
6979 load_delay_nop ();
6980 if (breg != 0)
6981 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6983 /* Set mips_optimize to 2 to avoid inserting an undesired
6984 nop. */
6985 hold_mips_optimize = mips_optimize;
6986 mips_optimize = 2;
6988 /* Itbl support may require additional care here. */
6989 relax_start (offset_expr.X_add_symbol);
6990 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6991 BFD_RELOC_LO16, AT);
6992 expr1.X_add_number += 4;
6993 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6994 BFD_RELOC_LO16, AT);
6995 relax_switch ();
6996 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6997 BFD_RELOC_LO16, AT);
6998 offset_expr.X_add_number += 4;
6999 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7000 BFD_RELOC_LO16, AT);
7001 relax_end ();
7003 mips_optimize = hold_mips_optimize;
7005 else if (mips_big_got)
7007 int gpdelay;
7009 /* If this is a reference to an external symbol, we want
7010 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7011 addu $at,$at,$gp
7012 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7014 <op> $treg,0($at)
7015 <op> $treg+1,4($at)
7016 Otherwise we want
7017 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7019 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7020 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7021 If there is a base register we add it to $at before the
7022 lwc1 instructions. If there is a constant we include it
7023 in the lwc1 instructions. */
7024 used_at = 1;
7025 expr1.X_add_number = offset_expr.X_add_number;
7026 offset_expr.X_add_number = 0;
7027 if (expr1.X_add_number < -0x8000
7028 || expr1.X_add_number >= 0x8000 - 4)
7029 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7030 gpdelay = reg_needs_delay (mips_gp_register);
7031 relax_start (offset_expr.X_add_symbol);
7032 macro_build (&offset_expr, "lui", "t,u",
7033 AT, BFD_RELOC_MIPS_GOT_HI16);
7034 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7035 AT, AT, mips_gp_register);
7036 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7037 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7038 load_delay_nop ();
7039 if (breg != 0)
7040 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7041 /* Itbl support may require additional care here. */
7042 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7043 BFD_RELOC_LO16, AT);
7044 expr1.X_add_number += 4;
7046 /* Set mips_optimize to 2 to avoid inserting an undesired
7047 nop. */
7048 hold_mips_optimize = mips_optimize;
7049 mips_optimize = 2;
7050 /* Itbl support may require additional care here. */
7051 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7052 BFD_RELOC_LO16, AT);
7053 mips_optimize = hold_mips_optimize;
7054 expr1.X_add_number -= 4;
7056 relax_switch ();
7057 offset_expr.X_add_number = expr1.X_add_number;
7058 if (gpdelay)
7059 macro_build (NULL, "nop", "");
7060 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7061 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7062 load_delay_nop ();
7063 if (breg != 0)
7064 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7065 /* Itbl support may require additional care here. */
7066 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7067 BFD_RELOC_LO16, AT);
7068 offset_expr.X_add_number += 4;
7070 /* Set mips_optimize to 2 to avoid inserting an undesired
7071 nop. */
7072 hold_mips_optimize = mips_optimize;
7073 mips_optimize = 2;
7074 /* Itbl support may require additional care here. */
7075 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7076 BFD_RELOC_LO16, AT);
7077 mips_optimize = hold_mips_optimize;
7078 relax_end ();
7080 else
7081 abort ();
7083 break;
7085 case M_LD_OB:
7086 s = "lw";
7087 goto sd_ob;
7088 case M_SD_OB:
7089 s = "sw";
7090 sd_ob:
7091 assert (HAVE_32BIT_ADDRESSES);
7092 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7093 offset_expr.X_add_number += 4;
7094 macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7095 break;
7097 /* New code added to support COPZ instructions.
7098 This code builds table entries out of the macros in mip_opcodes.
7099 R4000 uses interlocks to handle coproc delays.
7100 Other chips (like the R3000) require nops to be inserted for delays.
7102 FIXME: Currently, we require that the user handle delays.
7103 In order to fill delay slots for non-interlocked chips,
7104 we must have a way to specify delays based on the coprocessor.
7105 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7106 What are the side-effects of the cop instruction?
7107 What cache support might we have and what are its effects?
7108 Both coprocessor & memory require delays. how long???
7109 What registers are read/set/modified?
7111 If an itbl is provided to interpret cop instructions,
7112 this knowledge can be encoded in the itbl spec. */
7114 case M_COP0:
7115 s = "c0";
7116 goto copz;
7117 case M_COP1:
7118 s = "c1";
7119 goto copz;
7120 case M_COP2:
7121 s = "c2";
7122 goto copz;
7123 case M_COP3:
7124 s = "c3";
7125 copz:
7126 /* For now we just do C (same as Cz). The parameter will be
7127 stored in insn_opcode by mips_ip. */
7128 macro_build (NULL, s, "C", ip->insn_opcode);
7129 break;
7131 case M_MOVE:
7132 move_register (dreg, sreg);
7133 break;
7135 #ifdef LOSING_COMPILER
7136 default:
7137 /* Try and see if this is a new itbl instruction.
7138 This code builds table entries out of the macros in mip_opcodes.
7139 FIXME: For now we just assemble the expression and pass it's
7140 value along as a 32-bit immediate.
7141 We may want to have the assembler assemble this value,
7142 so that we gain the assembler's knowledge of delay slots,
7143 symbols, etc.
7144 Would it be more efficient to use mask (id) here? */
7145 if (itbl_have_entries
7146 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7148 s = ip->insn_mo->name;
7149 s2 = "cop3";
7150 coproc = ITBL_DECODE_PNUM (immed_expr);;
7151 macro_build (&immed_expr, s, "C");
7152 break;
7154 macro2 (ip);
7155 break;
7157 if (!mips_opts.at && used_at)
7158 as_bad (_("Macro used $at after \".set noat\""));
7161 static void
7162 macro2 (struct mips_cl_insn *ip)
7164 unsigned int treg, sreg, dreg, breg;
7165 unsigned int tempreg;
7166 int mask;
7167 int used_at;
7168 expressionS expr1;
7169 const char *s;
7170 const char *s2;
7171 const char *fmt;
7172 int likely = 0;
7173 int dbl = 0;
7174 int coproc = 0;
7175 int lr = 0;
7176 int imm = 0;
7177 int off;
7178 offsetT maxnum;
7179 bfd_reloc_code_real_type r;
7181 treg = (ip->insn_opcode >> 16) & 0x1f;
7182 dreg = (ip->insn_opcode >> 11) & 0x1f;
7183 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7184 mask = ip->insn_mo->mask;
7186 expr1.X_op = O_constant;
7187 expr1.X_op_symbol = NULL;
7188 expr1.X_add_symbol = NULL;
7189 expr1.X_add_number = 1;
7191 switch (mask)
7193 #endif /* LOSING_COMPILER */
7195 case M_DMUL:
7196 dbl = 1;
7197 case M_MUL:
7198 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7199 macro_build (NULL, "mflo", "d", dreg);
7200 break;
7202 case M_DMUL_I:
7203 dbl = 1;
7204 case M_MUL_I:
7205 /* The MIPS assembler some times generates shifts and adds. I'm
7206 not trying to be that fancy. GCC should do this for us
7207 anyway. */
7208 used_at = 1;
7209 load_register (AT, &imm_expr, dbl);
7210 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7211 macro_build (NULL, "mflo", "d", dreg);
7212 break;
7214 case M_DMULO_I:
7215 dbl = 1;
7216 case M_MULO_I:
7217 imm = 1;
7218 goto do_mulo;
7220 case M_DMULO:
7221 dbl = 1;
7222 case M_MULO:
7223 do_mulo:
7224 start_noreorder ();
7225 used_at = 1;
7226 if (imm)
7227 load_register (AT, &imm_expr, dbl);
7228 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7229 macro_build (NULL, "mflo", "d", dreg);
7230 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7231 macro_build (NULL, "mfhi", "d", AT);
7232 if (mips_trap)
7233 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7234 else
7236 expr1.X_add_number = 8;
7237 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7238 macro_build (NULL, "nop", "", 0);
7239 macro_build (NULL, "break", "c", 6);
7241 end_noreorder ();
7242 macro_build (NULL, "mflo", "d", dreg);
7243 break;
7245 case M_DMULOU_I:
7246 dbl = 1;
7247 case M_MULOU_I:
7248 imm = 1;
7249 goto do_mulou;
7251 case M_DMULOU:
7252 dbl = 1;
7253 case M_MULOU:
7254 do_mulou:
7255 start_noreorder ();
7256 used_at = 1;
7257 if (imm)
7258 load_register (AT, &imm_expr, dbl);
7259 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7260 sreg, imm ? AT : treg);
7261 macro_build (NULL, "mfhi", "d", AT);
7262 macro_build (NULL, "mflo", "d", dreg);
7263 if (mips_trap)
7264 macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7265 else
7267 expr1.X_add_number = 8;
7268 macro_build (&expr1, "beq", "s,t,p", AT, 0);
7269 macro_build (NULL, "nop", "", 0);
7270 macro_build (NULL, "break", "c", 6);
7272 end_noreorder ();
7273 break;
7275 case M_DROL:
7276 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7278 if (dreg == sreg)
7280 tempreg = AT;
7281 used_at = 1;
7283 else
7285 tempreg = dreg;
7287 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7288 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7289 break;
7291 used_at = 1;
7292 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7293 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7294 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7295 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7296 break;
7298 case M_ROL:
7299 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7301 if (dreg == sreg)
7303 tempreg = AT;
7304 used_at = 1;
7306 else
7308 tempreg = dreg;
7310 macro_build (NULL, "negu", "d,w", tempreg, treg);
7311 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7312 break;
7314 used_at = 1;
7315 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7316 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7317 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7318 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7319 break;
7321 case M_DROL_I:
7323 unsigned int rot;
7324 char *l, *r;
7326 if (imm_expr.X_op != O_constant)
7327 as_bad (_("Improper rotate count"));
7328 rot = imm_expr.X_add_number & 0x3f;
7329 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7331 rot = (64 - rot) & 0x3f;
7332 if (rot >= 32)
7333 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7334 else
7335 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7336 break;
7338 if (rot == 0)
7340 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7341 break;
7343 l = (rot < 0x20) ? "dsll" : "dsll32";
7344 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7345 rot &= 0x1f;
7346 used_at = 1;
7347 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7348 macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7349 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7351 break;
7353 case M_ROL_I:
7355 unsigned int rot;
7357 if (imm_expr.X_op != O_constant)
7358 as_bad (_("Improper rotate count"));
7359 rot = imm_expr.X_add_number & 0x1f;
7360 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7362 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7363 break;
7365 if (rot == 0)
7367 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7368 break;
7370 used_at = 1;
7371 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7372 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7373 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7375 break;
7377 case M_DROR:
7378 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7380 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7381 break;
7383 used_at = 1;
7384 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7385 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7386 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7387 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7388 break;
7390 case M_ROR:
7391 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7393 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7394 break;
7396 used_at = 1;
7397 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7398 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7399 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7400 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7401 break;
7403 case M_DROR_I:
7405 unsigned int rot;
7406 char *l, *r;
7408 if (imm_expr.X_op != O_constant)
7409 as_bad (_("Improper rotate count"));
7410 rot = imm_expr.X_add_number & 0x3f;
7411 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7413 if (rot >= 32)
7414 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7415 else
7416 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7417 break;
7419 if (rot == 0)
7421 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7422 break;
7424 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7425 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7426 rot &= 0x1f;
7427 used_at = 1;
7428 macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7429 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7430 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7432 break;
7434 case M_ROR_I:
7436 unsigned int rot;
7438 if (imm_expr.X_op != O_constant)
7439 as_bad (_("Improper rotate count"));
7440 rot = imm_expr.X_add_number & 0x1f;
7441 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7443 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7444 break;
7446 if (rot == 0)
7448 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7449 break;
7451 used_at = 1;
7452 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7453 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7454 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7456 break;
7458 case M_S_DOB:
7459 if (mips_opts.arch == CPU_R4650)
7461 as_bad (_("opcode not supported on this processor"));
7462 break;
7464 assert (mips_opts.isa == ISA_MIPS1);
7465 /* Even on a big endian machine $fn comes before $fn+1. We have
7466 to adjust when storing to memory. */
7467 macro_build (&offset_expr, "swc1", "T,o(b)",
7468 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7469 offset_expr.X_add_number += 4;
7470 macro_build (&offset_expr, "swc1", "T,o(b)",
7471 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7472 break;
7474 case M_SEQ:
7475 if (sreg == 0)
7476 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7477 else if (treg == 0)
7478 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7479 else
7481 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7482 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7484 break;
7486 case M_SEQ_I:
7487 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7489 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7490 break;
7492 if (sreg == 0)
7494 as_warn (_("Instruction %s: result is always false"),
7495 ip->insn_mo->name);
7496 move_register (dreg, 0);
7497 break;
7499 if (imm_expr.X_op == O_constant
7500 && imm_expr.X_add_number >= 0
7501 && imm_expr.X_add_number < 0x10000)
7503 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7505 else if (imm_expr.X_op == O_constant
7506 && imm_expr.X_add_number > -0x8000
7507 && imm_expr.X_add_number < 0)
7509 imm_expr.X_add_number = -imm_expr.X_add_number;
7510 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7511 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7513 else
7515 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7516 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7517 used_at = 1;
7519 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7520 break;
7522 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7523 s = "slt";
7524 goto sge;
7525 case M_SGEU:
7526 s = "sltu";
7527 sge:
7528 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7529 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7530 break;
7532 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7533 case M_SGEU_I:
7534 if (imm_expr.X_op == O_constant
7535 && imm_expr.X_add_number >= -0x8000
7536 && imm_expr.X_add_number < 0x8000)
7538 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7539 dreg, sreg, BFD_RELOC_LO16);
7541 else
7543 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7544 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7545 dreg, sreg, AT);
7546 used_at = 1;
7548 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7549 break;
7551 case M_SGT: /* sreg > treg <==> treg < sreg */
7552 s = "slt";
7553 goto sgt;
7554 case M_SGTU:
7555 s = "sltu";
7556 sgt:
7557 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7558 break;
7560 case M_SGT_I: /* sreg > I <==> I < sreg */
7561 s = "slt";
7562 goto sgti;
7563 case M_SGTU_I:
7564 s = "sltu";
7565 sgti:
7566 used_at = 1;
7567 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7568 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7569 break;
7571 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7572 s = "slt";
7573 goto sle;
7574 case M_SLEU:
7575 s = "sltu";
7576 sle:
7577 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7578 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7579 break;
7581 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7582 s = "slt";
7583 goto slei;
7584 case M_SLEU_I:
7585 s = "sltu";
7586 slei:
7587 used_at = 1;
7588 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7589 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7590 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7591 break;
7593 case M_SLT_I:
7594 if (imm_expr.X_op == O_constant
7595 && imm_expr.X_add_number >= -0x8000
7596 && imm_expr.X_add_number < 0x8000)
7598 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7599 break;
7601 used_at = 1;
7602 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7603 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7604 break;
7606 case M_SLTU_I:
7607 if (imm_expr.X_op == O_constant
7608 && imm_expr.X_add_number >= -0x8000
7609 && imm_expr.X_add_number < 0x8000)
7611 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7612 BFD_RELOC_LO16);
7613 break;
7615 used_at = 1;
7616 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7617 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7618 break;
7620 case M_SNE:
7621 if (sreg == 0)
7622 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7623 else if (treg == 0)
7624 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7625 else
7627 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7628 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7630 break;
7632 case M_SNE_I:
7633 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7635 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7636 break;
7638 if (sreg == 0)
7640 as_warn (_("Instruction %s: result is always true"),
7641 ip->insn_mo->name);
7642 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7643 dreg, 0, BFD_RELOC_LO16);
7644 break;
7646 if (imm_expr.X_op == O_constant
7647 && imm_expr.X_add_number >= 0
7648 && imm_expr.X_add_number < 0x10000)
7650 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7652 else if (imm_expr.X_op == O_constant
7653 && imm_expr.X_add_number > -0x8000
7654 && imm_expr.X_add_number < 0)
7656 imm_expr.X_add_number = -imm_expr.X_add_number;
7657 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7658 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7660 else
7662 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7663 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7664 used_at = 1;
7666 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7667 break;
7669 case M_DSUB_I:
7670 dbl = 1;
7671 case M_SUB_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 ? "daddi" : "addi", "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 ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7684 break;
7686 case M_DSUBU_I:
7687 dbl = 1;
7688 case M_SUBU_I:
7689 if (imm_expr.X_op == O_constant
7690 && imm_expr.X_add_number > -0x8000
7691 && imm_expr.X_add_number <= 0x8000)
7693 imm_expr.X_add_number = -imm_expr.X_add_number;
7694 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7695 dreg, sreg, BFD_RELOC_LO16);
7696 break;
7698 used_at = 1;
7699 load_register (AT, &imm_expr, dbl);
7700 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7701 break;
7703 case M_TEQ_I:
7704 s = "teq";
7705 goto trap;
7706 case M_TGE_I:
7707 s = "tge";
7708 goto trap;
7709 case M_TGEU_I:
7710 s = "tgeu";
7711 goto trap;
7712 case M_TLT_I:
7713 s = "tlt";
7714 goto trap;
7715 case M_TLTU_I:
7716 s = "tltu";
7717 goto trap;
7718 case M_TNE_I:
7719 s = "tne";
7720 trap:
7721 used_at = 1;
7722 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7723 macro_build (NULL, s, "s,t", sreg, AT);
7724 break;
7726 case M_TRUNCWS:
7727 case M_TRUNCWD:
7728 assert (mips_opts.isa == ISA_MIPS1);
7729 used_at = 1;
7730 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7731 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7734 * Is the double cfc1 instruction a bug in the mips assembler;
7735 * or is there a reason for it?
7737 start_noreorder ();
7738 macro_build (NULL, "cfc1", "t,G", treg, RA);
7739 macro_build (NULL, "cfc1", "t,G", treg, RA);
7740 macro_build (NULL, "nop", "");
7741 expr1.X_add_number = 3;
7742 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7743 expr1.X_add_number = 2;
7744 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7745 macro_build (NULL, "ctc1", "t,G", AT, RA);
7746 macro_build (NULL, "nop", "");
7747 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7748 dreg, sreg);
7749 macro_build (NULL, "ctc1", "t,G", treg, RA);
7750 macro_build (NULL, "nop", "");
7751 end_noreorder ();
7752 break;
7754 case M_ULH:
7755 s = "lb";
7756 goto ulh;
7757 case M_ULHU:
7758 s = "lbu";
7759 ulh:
7760 used_at = 1;
7761 if (offset_expr.X_add_number >= 0x7fff)
7762 as_bad (_("operand overflow"));
7763 if (! target_big_endian)
7764 ++offset_expr.X_add_number;
7765 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7766 if (! target_big_endian)
7767 --offset_expr.X_add_number;
7768 else
7769 ++offset_expr.X_add_number;
7770 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7771 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7772 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7773 break;
7775 case M_ULD:
7776 s = "ldl";
7777 s2 = "ldr";
7778 off = 7;
7779 goto ulw;
7780 case M_ULW:
7781 s = "lwl";
7782 s2 = "lwr";
7783 off = 3;
7784 ulw:
7785 if (offset_expr.X_add_number >= 0x8000 - off)
7786 as_bad (_("operand overflow"));
7787 if (treg != breg)
7788 tempreg = treg;
7789 else
7791 used_at = 1;
7792 tempreg = AT;
7794 if (! target_big_endian)
7795 offset_expr.X_add_number += off;
7796 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7797 if (! target_big_endian)
7798 offset_expr.X_add_number -= off;
7799 else
7800 offset_expr.X_add_number += off;
7801 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7803 /* If necessary, move the result in tempreg the final destination. */
7804 if (treg == tempreg)
7805 break;
7806 /* Protect second load's delay slot. */
7807 load_delay_nop ();
7808 move_register (treg, tempreg);
7809 break;
7811 case M_ULD_A:
7812 s = "ldl";
7813 s2 = "ldr";
7814 off = 7;
7815 goto ulwa;
7816 case M_ULW_A:
7817 s = "lwl";
7818 s2 = "lwr";
7819 off = 3;
7820 ulwa:
7821 used_at = 1;
7822 load_address (AT, &offset_expr, &used_at);
7823 if (breg != 0)
7824 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7825 if (! target_big_endian)
7826 expr1.X_add_number = off;
7827 else
7828 expr1.X_add_number = 0;
7829 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7830 if (! target_big_endian)
7831 expr1.X_add_number = 0;
7832 else
7833 expr1.X_add_number = off;
7834 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7835 break;
7837 case M_ULH_A:
7838 case M_ULHU_A:
7839 used_at = 1;
7840 load_address (AT, &offset_expr, &used_at);
7841 if (breg != 0)
7842 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7843 if (target_big_endian)
7844 expr1.X_add_number = 0;
7845 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7846 treg, BFD_RELOC_LO16, AT);
7847 if (target_big_endian)
7848 expr1.X_add_number = 1;
7849 else
7850 expr1.X_add_number = 0;
7851 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7852 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7853 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7854 break;
7856 case M_USH:
7857 used_at = 1;
7858 if (offset_expr.X_add_number >= 0x7fff)
7859 as_bad (_("operand overflow"));
7860 if (target_big_endian)
7861 ++offset_expr.X_add_number;
7862 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7863 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7864 if (target_big_endian)
7865 --offset_expr.X_add_number;
7866 else
7867 ++offset_expr.X_add_number;
7868 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7869 break;
7871 case M_USD:
7872 s = "sdl";
7873 s2 = "sdr";
7874 off = 7;
7875 goto usw;
7876 case M_USW:
7877 s = "swl";
7878 s2 = "swr";
7879 off = 3;
7880 usw:
7881 if (offset_expr.X_add_number >= 0x8000 - off)
7882 as_bad (_("operand overflow"));
7883 if (! target_big_endian)
7884 offset_expr.X_add_number += off;
7885 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7886 if (! target_big_endian)
7887 offset_expr.X_add_number -= off;
7888 else
7889 offset_expr.X_add_number += off;
7890 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7891 break;
7893 case M_USD_A:
7894 s = "sdl";
7895 s2 = "sdr";
7896 off = 7;
7897 goto uswa;
7898 case M_USW_A:
7899 s = "swl";
7900 s2 = "swr";
7901 off = 3;
7902 uswa:
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 = off;
7909 else
7910 expr1.X_add_number = 0;
7911 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7912 if (! target_big_endian)
7913 expr1.X_add_number = 0;
7914 else
7915 expr1.X_add_number = off;
7916 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7917 break;
7919 case M_USH_A:
7920 used_at = 1;
7921 load_address (AT, &offset_expr, &used_at);
7922 if (breg != 0)
7923 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7924 if (! target_big_endian)
7925 expr1.X_add_number = 0;
7926 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7927 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7928 if (! target_big_endian)
7929 expr1.X_add_number = 1;
7930 else
7931 expr1.X_add_number = 0;
7932 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7933 if (! target_big_endian)
7934 expr1.X_add_number = 0;
7935 else
7936 expr1.X_add_number = 1;
7937 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7938 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7939 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7940 break;
7942 default:
7943 /* FIXME: Check if this is one of the itbl macros, since they
7944 are added dynamically. */
7945 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7946 break;
7948 if (!mips_opts.at && used_at)
7949 as_bad (_("Macro used $at after \".set noat\""));
7952 /* Implement macros in mips16 mode. */
7954 static void
7955 mips16_macro (struct mips_cl_insn *ip)
7957 int mask;
7958 int xreg, yreg, zreg, tmp;
7959 expressionS expr1;
7960 int dbl;
7961 const char *s, *s2, *s3;
7963 mask = ip->insn_mo->mask;
7965 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7966 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7967 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7969 expr1.X_op = O_constant;
7970 expr1.X_op_symbol = NULL;
7971 expr1.X_add_symbol = NULL;
7972 expr1.X_add_number = 1;
7974 dbl = 0;
7976 switch (mask)
7978 default:
7979 internalError ();
7981 case M_DDIV_3:
7982 dbl = 1;
7983 case M_DIV_3:
7984 s = "mflo";
7985 goto do_div3;
7986 case M_DREM_3:
7987 dbl = 1;
7988 case M_REM_3:
7989 s = "mfhi";
7990 do_div3:
7991 start_noreorder ();
7992 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7993 expr1.X_add_number = 2;
7994 macro_build (&expr1, "bnez", "x,p", yreg);
7995 macro_build (NULL, "break", "6", 7);
7997 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7998 since that causes an overflow. We should do that as well,
7999 but I don't see how to do the comparisons without a temporary
8000 register. */
8001 end_noreorder ();
8002 macro_build (NULL, s, "x", zreg);
8003 break;
8005 case M_DIVU_3:
8006 s = "divu";
8007 s2 = "mflo";
8008 goto do_divu3;
8009 case M_REMU_3:
8010 s = "divu";
8011 s2 = "mfhi";
8012 goto do_divu3;
8013 case M_DDIVU_3:
8014 s = "ddivu";
8015 s2 = "mflo";
8016 goto do_divu3;
8017 case M_DREMU_3:
8018 s = "ddivu";
8019 s2 = "mfhi";
8020 do_divu3:
8021 start_noreorder ();
8022 macro_build (NULL, s, "0,x,y", xreg, yreg);
8023 expr1.X_add_number = 2;
8024 macro_build (&expr1, "bnez", "x,p", yreg);
8025 macro_build (NULL, "break", "6", 7);
8026 end_noreorder ();
8027 macro_build (NULL, s2, "x", zreg);
8028 break;
8030 case M_DMUL:
8031 dbl = 1;
8032 case M_MUL:
8033 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8034 macro_build (NULL, "mflo", "x", zreg);
8035 break;
8037 case M_DSUBU_I:
8038 dbl = 1;
8039 goto do_subu;
8040 case M_SUBU_I:
8041 do_subu:
8042 if (imm_expr.X_op != O_constant)
8043 as_bad (_("Unsupported large constant"));
8044 imm_expr.X_add_number = -imm_expr.X_add_number;
8045 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8046 break;
8048 case M_SUBU_I_2:
8049 if (imm_expr.X_op != O_constant)
8050 as_bad (_("Unsupported large constant"));
8051 imm_expr.X_add_number = -imm_expr.X_add_number;
8052 macro_build (&imm_expr, "addiu", "x,k", xreg);
8053 break;
8055 case M_DSUBU_I_2:
8056 if (imm_expr.X_op != O_constant)
8057 as_bad (_("Unsupported large constant"));
8058 imm_expr.X_add_number = -imm_expr.X_add_number;
8059 macro_build (&imm_expr, "daddiu", "y,j", yreg);
8060 break;
8062 case M_BEQ:
8063 s = "cmp";
8064 s2 = "bteqz";
8065 goto do_branch;
8066 case M_BNE:
8067 s = "cmp";
8068 s2 = "btnez";
8069 goto do_branch;
8070 case M_BLT:
8071 s = "slt";
8072 s2 = "btnez";
8073 goto do_branch;
8074 case M_BLTU:
8075 s = "sltu";
8076 s2 = "btnez";
8077 goto do_branch;
8078 case M_BLE:
8079 s = "slt";
8080 s2 = "bteqz";
8081 goto do_reverse_branch;
8082 case M_BLEU:
8083 s = "sltu";
8084 s2 = "bteqz";
8085 goto do_reverse_branch;
8086 case M_BGE:
8087 s = "slt";
8088 s2 = "bteqz";
8089 goto do_branch;
8090 case M_BGEU:
8091 s = "sltu";
8092 s2 = "bteqz";
8093 goto do_branch;
8094 case M_BGT:
8095 s = "slt";
8096 s2 = "btnez";
8097 goto do_reverse_branch;
8098 case M_BGTU:
8099 s = "sltu";
8100 s2 = "btnez";
8102 do_reverse_branch:
8103 tmp = xreg;
8104 xreg = yreg;
8105 yreg = tmp;
8107 do_branch:
8108 macro_build (NULL, s, "x,y", xreg, yreg);
8109 macro_build (&offset_expr, s2, "p");
8110 break;
8112 case M_BEQ_I:
8113 s = "cmpi";
8114 s2 = "bteqz";
8115 s3 = "x,U";
8116 goto do_branch_i;
8117 case M_BNE_I:
8118 s = "cmpi";
8119 s2 = "btnez";
8120 s3 = "x,U";
8121 goto do_branch_i;
8122 case M_BLT_I:
8123 s = "slti";
8124 s2 = "btnez";
8125 s3 = "x,8";
8126 goto do_branch_i;
8127 case M_BLTU_I:
8128 s = "sltiu";
8129 s2 = "btnez";
8130 s3 = "x,8";
8131 goto do_branch_i;
8132 case M_BLE_I:
8133 s = "slti";
8134 s2 = "btnez";
8135 s3 = "x,8";
8136 goto do_addone_branch_i;
8137 case M_BLEU_I:
8138 s = "sltiu";
8139 s2 = "btnez";
8140 s3 = "x,8";
8141 goto do_addone_branch_i;
8142 case M_BGE_I:
8143 s = "slti";
8144 s2 = "bteqz";
8145 s3 = "x,8";
8146 goto do_branch_i;
8147 case M_BGEU_I:
8148 s = "sltiu";
8149 s2 = "bteqz";
8150 s3 = "x,8";
8151 goto do_branch_i;
8152 case M_BGT_I:
8153 s = "slti";
8154 s2 = "bteqz";
8155 s3 = "x,8";
8156 goto do_addone_branch_i;
8157 case M_BGTU_I:
8158 s = "sltiu";
8159 s2 = "bteqz";
8160 s3 = "x,8";
8162 do_addone_branch_i:
8163 if (imm_expr.X_op != O_constant)
8164 as_bad (_("Unsupported large constant"));
8165 ++imm_expr.X_add_number;
8167 do_branch_i:
8168 macro_build (&imm_expr, s, s3, xreg);
8169 macro_build (&offset_expr, s2, "p");
8170 break;
8172 case M_ABS:
8173 expr1.X_add_number = 0;
8174 macro_build (&expr1, "slti", "x,8", yreg);
8175 if (xreg != yreg)
8176 move_register (xreg, yreg);
8177 expr1.X_add_number = 2;
8178 macro_build (&expr1, "bteqz", "p");
8179 macro_build (NULL, "neg", "x,w", xreg, xreg);
8183 /* For consistency checking, verify that all bits are specified either
8184 by the match/mask part of the instruction definition, or by the
8185 operand list. */
8186 static int
8187 validate_mips_insn (const struct mips_opcode *opc)
8189 const char *p = opc->args;
8190 char c;
8191 unsigned long used_bits = opc->mask;
8193 if ((used_bits & opc->match) != opc->match)
8195 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8196 opc->name, opc->args);
8197 return 0;
8199 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8200 while (*p)
8201 switch (c = *p++)
8203 case ',': break;
8204 case '(': break;
8205 case ')': break;
8206 case '+':
8207 switch (c = *p++)
8209 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8210 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8211 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8212 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
8213 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8214 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8215 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8216 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8217 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8218 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8219 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8220 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8221 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8222 case 'I': break;
8223 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8224 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8225 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8226 default:
8227 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8228 c, opc->name, opc->args);
8229 return 0;
8231 break;
8232 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8233 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8234 case 'A': break;
8235 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8236 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8237 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8238 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8239 case 'F': break;
8240 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8241 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8242 case 'I': break;
8243 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8244 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8245 case 'L': break;
8246 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8247 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8248 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8249 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8250 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8251 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8252 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8253 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8254 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8255 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8256 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8257 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8258 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8259 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8260 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8261 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8262 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8263 case 'f': break;
8264 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8265 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8266 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8267 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8268 case 'l': break;
8269 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8270 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8271 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8272 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8273 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8274 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8275 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8276 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8277 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8278 case 'x': break;
8279 case 'z': break;
8280 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8281 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8282 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8283 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8284 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8285 case '[': break;
8286 case ']': break;
8287 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
8288 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8289 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8290 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8291 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8292 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8293 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8294 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8295 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8296 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8297 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8298 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
8299 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8300 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8301 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8302 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8303 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8304 default:
8305 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8306 c, opc->name, opc->args);
8307 return 0;
8309 #undef USE_BITS
8310 if (used_bits != 0xffffffff)
8312 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8313 ~used_bits & 0xffffffff, opc->name, opc->args);
8314 return 0;
8316 return 1;
8319 /* UDI immediates. */
8320 struct mips_immed {
8321 char type;
8322 unsigned int shift;
8323 unsigned long mask;
8324 const char * desc;
8327 static const struct mips_immed mips_immed[] = {
8328 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8329 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8330 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8331 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8332 { 0,0,0,0 }
8335 /* Check whether an odd floating-point register is allowed. */
8336 static int
8337 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8339 const char *s = insn->name;
8341 if (insn->pinfo == INSN_MACRO)
8342 /* Let a macro pass, we'll catch it later when it is expanded. */
8343 return 1;
8345 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8347 /* Allow odd registers for single-precision ops. */
8348 switch (insn->pinfo & (FP_S | FP_D))
8350 case FP_S:
8351 case 0:
8352 return 1; /* both single precision - ok */
8353 case FP_D:
8354 return 0; /* both double precision - fail */
8355 default:
8356 break;
8359 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8360 s = strchr (insn->name, '.');
8361 if (argnum == 2)
8362 s = s != NULL ? strchr (s + 1, '.') : NULL;
8363 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8366 /* Single-precision coprocessor loads and moves are OK too. */
8367 if ((insn->pinfo & FP_S)
8368 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8369 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8370 return 1;
8372 return 0;
8375 /* This routine assembles an instruction into its binary format. As a
8376 side effect, it sets one of the global variables imm_reloc or
8377 offset_reloc to the type of relocation to do if one of the operands
8378 is an address expression. */
8380 static void
8381 mips_ip (char *str, struct mips_cl_insn *ip)
8383 char *s;
8384 const char *args;
8385 char c = 0;
8386 struct mips_opcode *insn;
8387 char *argsStart;
8388 unsigned int regno;
8389 unsigned int lastregno = 0;
8390 unsigned int lastpos = 0;
8391 unsigned int limlo, limhi;
8392 char *s_reset;
8393 char save_c = 0;
8394 offsetT min_range, max_range;
8395 int argnum;
8396 unsigned int rtype;
8398 insn_error = NULL;
8400 /* If the instruction contains a '.', we first try to match an instruction
8401 including the '.'. Then we try again without the '.'. */
8402 insn = NULL;
8403 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8404 continue;
8406 /* If we stopped on whitespace, then replace the whitespace with null for
8407 the call to hash_find. Save the character we replaced just in case we
8408 have to re-parse the instruction. */
8409 if (ISSPACE (*s))
8411 save_c = *s;
8412 *s++ = '\0';
8415 insn = (struct mips_opcode *) hash_find (op_hash, str);
8417 /* If we didn't find the instruction in the opcode table, try again, but
8418 this time with just the instruction up to, but not including the
8419 first '.'. */
8420 if (insn == NULL)
8422 /* Restore the character we overwrite above (if any). */
8423 if (save_c)
8424 *(--s) = save_c;
8426 /* Scan up to the first '.' or whitespace. */
8427 for (s = str;
8428 *s != '\0' && *s != '.' && !ISSPACE (*s);
8429 ++s)
8430 continue;
8432 /* If we did not find a '.', then we can quit now. */
8433 if (*s != '.')
8435 insn_error = "unrecognized opcode";
8436 return;
8439 /* Lookup the instruction in the hash table. */
8440 *s++ = '\0';
8441 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8443 insn_error = "unrecognized opcode";
8444 return;
8448 argsStart = s;
8449 for (;;)
8451 bfd_boolean ok;
8453 assert (strcmp (insn->name, str) == 0);
8455 if (OPCODE_IS_MEMBER (insn,
8456 (mips_opts.isa
8457 /* We don't check for mips_opts.mips16 here since
8458 we want to allow jalx if -mips16 was specified
8459 on the command line. */
8460 | (file_ase_mips16 ? INSN_MIPS16 : 0)
8461 | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8462 | (mips_opts.ase_dsp ? INSN_DSP : 0)
8463 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8464 ? INSN_DSP64 : 0)
8465 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8466 | (mips_opts.ase_mt ? INSN_MT : 0)
8467 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8468 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8469 mips_opts.arch))
8470 ok = TRUE;
8471 else
8472 ok = FALSE;
8474 if (insn->pinfo != INSN_MACRO)
8476 if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8477 ok = FALSE;
8480 if (! ok)
8482 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8483 && strcmp (insn->name, insn[1].name) == 0)
8485 ++insn;
8486 continue;
8488 else
8490 if (!insn_error)
8492 static char buf[100];
8493 sprintf (buf,
8494 _("opcode not supported on this processor: %s (%s)"),
8495 mips_cpu_info_from_arch (mips_opts.arch)->name,
8496 mips_cpu_info_from_isa (mips_opts.isa)->name);
8497 insn_error = buf;
8499 if (save_c)
8500 *(--s) = save_c;
8501 return;
8505 create_insn (ip, insn);
8506 insn_error = NULL;
8507 argnum = 1;
8508 for (args = insn->args;; ++args)
8510 int is_mdmx;
8512 s += strspn (s, " \t");
8513 is_mdmx = 0;
8514 switch (*args)
8516 case '\0': /* end of args */
8517 if (*s == '\0')
8518 return;
8519 break;
8521 case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8522 my_getExpression (&imm_expr, s);
8523 check_absolute_expr (ip, &imm_expr);
8524 if ((unsigned long) imm_expr.X_add_number != 1
8525 && (unsigned long) imm_expr.X_add_number != 3)
8527 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8528 (unsigned long) imm_expr.X_add_number);
8530 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8531 imm_expr.X_op = O_absent;
8532 s = expr_end;
8533 continue;
8535 case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8536 my_getExpression (&imm_expr, s);
8537 check_absolute_expr (ip, &imm_expr);
8538 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8540 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8541 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8543 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8544 imm_expr.X_op = O_absent;
8545 s = expr_end;
8546 continue;
8548 case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8549 my_getExpression (&imm_expr, s);
8550 check_absolute_expr (ip, &imm_expr);
8551 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8553 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8554 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8556 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8557 imm_expr.X_op = O_absent;
8558 s = expr_end;
8559 continue;
8561 case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8562 my_getExpression (&imm_expr, s);
8563 check_absolute_expr (ip, &imm_expr);
8564 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8566 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8567 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8569 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8570 imm_expr.X_op = O_absent;
8571 s = expr_end;
8572 continue;
8574 case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8575 my_getExpression (&imm_expr, s);
8576 check_absolute_expr (ip, &imm_expr);
8577 if (imm_expr.X_add_number & ~OP_MASK_RS)
8579 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8580 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8582 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8583 imm_expr.X_op = O_absent;
8584 s = expr_end;
8585 continue;
8587 case '7': /* four dsp accumulators in bits 11,12 */
8588 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8589 s[3] >= '0' && s[3] <= '3')
8591 regno = s[3] - '0';
8592 s += 4;
8593 INSERT_OPERAND (DSPACC, *ip, regno);
8594 continue;
8596 else
8597 as_bad (_("Invalid dsp acc register"));
8598 break;
8600 case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8601 my_getExpression (&imm_expr, s);
8602 check_absolute_expr (ip, &imm_expr);
8603 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8605 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8606 OP_MASK_WRDSP,
8607 (unsigned long) imm_expr.X_add_number);
8609 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8610 imm_expr.X_op = O_absent;
8611 s = expr_end;
8612 continue;
8614 case '9': /* four dsp accumulators in bits 21,22 */
8615 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8616 s[3] >= '0' && s[3] <= '3')
8618 regno = s[3] - '0';
8619 s += 4;
8620 INSERT_OPERAND (DSPACC_S, *ip, regno);
8621 continue;
8623 else
8624 as_bad (_("Invalid dsp acc register"));
8625 break;
8627 case '0': /* dsp 6-bit signed immediate in bit 20 */
8628 my_getExpression (&imm_expr, s);
8629 check_absolute_expr (ip, &imm_expr);
8630 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8631 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8632 if (imm_expr.X_add_number < min_range ||
8633 imm_expr.X_add_number > max_range)
8635 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8636 (long) min_range, (long) max_range,
8637 (long) imm_expr.X_add_number);
8639 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8640 imm_expr.X_op = O_absent;
8641 s = expr_end;
8642 continue;
8644 case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8645 my_getExpression (&imm_expr, s);
8646 check_absolute_expr (ip, &imm_expr);
8647 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8649 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8650 OP_MASK_RDDSP,
8651 (unsigned long) imm_expr.X_add_number);
8653 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8654 imm_expr.X_op = O_absent;
8655 s = expr_end;
8656 continue;
8658 case ':': /* dsp 7-bit signed immediate in bit 19 */
8659 my_getExpression (&imm_expr, s);
8660 check_absolute_expr (ip, &imm_expr);
8661 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8662 max_range = ((OP_MASK_DSPSFT_7 + 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 (DSPSFT_7, *ip, imm_expr.X_add_number);
8671 imm_expr.X_op = O_absent;
8672 s = expr_end;
8673 continue;
8675 case '@': /* dsp 10-bit signed immediate in bit 16 */
8676 my_getExpression (&imm_expr, s);
8677 check_absolute_expr (ip, &imm_expr);
8678 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8679 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8680 if (imm_expr.X_add_number < min_range ||
8681 imm_expr.X_add_number > max_range)
8683 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8684 (long) min_range, (long) max_range,
8685 (long) imm_expr.X_add_number);
8687 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8688 imm_expr.X_op = O_absent;
8689 s = expr_end;
8690 continue;
8692 case '!': /* MT usermode flag bit. */
8693 my_getExpression (&imm_expr, s);
8694 check_absolute_expr (ip, &imm_expr);
8695 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8696 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8697 (unsigned long) imm_expr.X_add_number);
8698 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8699 imm_expr.X_op = O_absent;
8700 s = expr_end;
8701 continue;
8703 case '$': /* MT load high flag bit. */
8704 my_getExpression (&imm_expr, s);
8705 check_absolute_expr (ip, &imm_expr);
8706 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8707 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8708 (unsigned long) imm_expr.X_add_number);
8709 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8710 imm_expr.X_op = O_absent;
8711 s = expr_end;
8712 continue;
8714 case '*': /* four dsp accumulators in bits 18,19 */
8715 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8716 s[3] >= '0' && s[3] <= '3')
8718 regno = s[3] - '0';
8719 s += 4;
8720 INSERT_OPERAND (MTACC_T, *ip, regno);
8721 continue;
8723 else
8724 as_bad (_("Invalid dsp/smartmips acc register"));
8725 break;
8727 case '&': /* four dsp accumulators in bits 13,14 */
8728 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8729 s[3] >= '0' && s[3] <= '3')
8731 regno = s[3] - '0';
8732 s += 4;
8733 INSERT_OPERAND (MTACC_D, *ip, regno);
8734 continue;
8736 else
8737 as_bad (_("Invalid dsp/smartmips acc register"));
8738 break;
8740 case ',':
8741 ++argnum;
8742 if (*s++ == *args)
8743 continue;
8744 s--;
8745 switch (*++args)
8747 case 'r':
8748 case 'v':
8749 INSERT_OPERAND (RS, *ip, lastregno);
8750 continue;
8752 case 'w':
8753 INSERT_OPERAND (RT, *ip, lastregno);
8754 continue;
8756 case 'W':
8757 INSERT_OPERAND (FT, *ip, lastregno);
8758 continue;
8760 case 'V':
8761 INSERT_OPERAND (FS, *ip, lastregno);
8762 continue;
8764 break;
8766 case '(':
8767 /* Handle optional base register.
8768 Either the base register is omitted or
8769 we must have a left paren. */
8770 /* This is dependent on the next operand specifier
8771 is a base register specification. */
8772 assert (args[1] == 'b' || args[1] == '5'
8773 || args[1] == '-' || args[1] == '4');
8774 if (*s == '\0')
8775 return;
8777 case ')': /* these must match exactly */
8778 case '[':
8779 case ']':
8780 if (*s++ == *args)
8781 continue;
8782 break;
8784 case '+': /* Opcode extension character. */
8785 switch (*++args)
8787 case '1': /* UDI immediates. */
8788 case '2':
8789 case '3':
8790 case '4':
8792 const struct mips_immed *imm = mips_immed;
8794 while (imm->type && imm->type != *args)
8795 ++imm;
8796 if (! imm->type)
8797 internalError ();
8798 my_getExpression (&imm_expr, s);
8799 check_absolute_expr (ip, &imm_expr);
8800 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8802 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8803 imm->desc ? imm->desc : ip->insn_mo->name,
8804 (unsigned long) imm_expr.X_add_number,
8805 (unsigned long) imm_expr.X_add_number);
8806 imm_expr.X_add_number &= imm->mask;
8808 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8809 << imm->shift);
8810 imm_expr.X_op = O_absent;
8811 s = expr_end;
8813 continue;
8815 case 'A': /* ins/ext position, becomes LSB. */
8816 limlo = 0;
8817 limhi = 31;
8818 goto do_lsb;
8819 case 'E':
8820 limlo = 32;
8821 limhi = 63;
8822 goto do_lsb;
8823 do_lsb:
8824 my_getExpression (&imm_expr, s);
8825 check_absolute_expr (ip, &imm_expr);
8826 if ((unsigned long) imm_expr.X_add_number < limlo
8827 || (unsigned long) imm_expr.X_add_number > limhi)
8829 as_bad (_("Improper position (%lu)"),
8830 (unsigned long) imm_expr.X_add_number);
8831 imm_expr.X_add_number = limlo;
8833 lastpos = imm_expr.X_add_number;
8834 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8835 imm_expr.X_op = O_absent;
8836 s = expr_end;
8837 continue;
8839 case 'B': /* ins size, becomes MSB. */
8840 limlo = 1;
8841 limhi = 32;
8842 goto do_msb;
8843 case 'F':
8844 limlo = 33;
8845 limhi = 64;
8846 goto do_msb;
8847 do_msb:
8848 my_getExpression (&imm_expr, s);
8849 check_absolute_expr (ip, &imm_expr);
8850 /* Check for negative input so that small negative numbers
8851 will not succeed incorrectly. The checks against
8852 (pos+size) transitively check "size" itself,
8853 assuming that "pos" is reasonable. */
8854 if ((long) imm_expr.X_add_number < 0
8855 || ((unsigned long) imm_expr.X_add_number
8856 + lastpos) < limlo
8857 || ((unsigned long) imm_expr.X_add_number
8858 + lastpos) > limhi)
8860 as_bad (_("Improper insert size (%lu, position %lu)"),
8861 (unsigned long) imm_expr.X_add_number,
8862 (unsigned long) lastpos);
8863 imm_expr.X_add_number = limlo - lastpos;
8865 INSERT_OPERAND (INSMSB, *ip,
8866 lastpos + imm_expr.X_add_number - 1);
8867 imm_expr.X_op = O_absent;
8868 s = expr_end;
8869 continue;
8871 case 'C': /* ext size, becomes MSBD. */
8872 limlo = 1;
8873 limhi = 32;
8874 goto do_msbd;
8875 case 'G':
8876 limlo = 33;
8877 limhi = 64;
8878 goto do_msbd;
8879 case 'H':
8880 limlo = 33;
8881 limhi = 64;
8882 goto do_msbd;
8883 do_msbd:
8884 my_getExpression (&imm_expr, s);
8885 check_absolute_expr (ip, &imm_expr);
8886 /* Check for negative input so that small negative numbers
8887 will not succeed incorrectly. The checks against
8888 (pos+size) transitively check "size" itself,
8889 assuming that "pos" is reasonable. */
8890 if ((long) imm_expr.X_add_number < 0
8891 || ((unsigned long) imm_expr.X_add_number
8892 + lastpos) < limlo
8893 || ((unsigned long) imm_expr.X_add_number
8894 + lastpos) > limhi)
8896 as_bad (_("Improper extract size (%lu, position %lu)"),
8897 (unsigned long) imm_expr.X_add_number,
8898 (unsigned long) lastpos);
8899 imm_expr.X_add_number = limlo - lastpos;
8901 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8902 imm_expr.X_op = O_absent;
8903 s = expr_end;
8904 continue;
8906 case 'D':
8907 /* +D is for disassembly only; never match. */
8908 break;
8910 case 'I':
8911 /* "+I" is like "I", except that imm2_expr is used. */
8912 my_getExpression (&imm2_expr, s);
8913 if (imm2_expr.X_op != O_big
8914 && imm2_expr.X_op != O_constant)
8915 insn_error = _("absolute expression required");
8916 if (HAVE_32BIT_GPRS)
8917 normalize_constant_expr (&imm2_expr);
8918 s = expr_end;
8919 continue;
8921 case 'T': /* Coprocessor register. */
8922 /* +T is for disassembly only; never match. */
8923 break;
8925 case 't': /* Coprocessor register number. */
8926 if (s[0] == '$' && ISDIGIT (s[1]))
8928 ++s;
8929 regno = 0;
8932 regno *= 10;
8933 regno += *s - '0';
8934 ++s;
8936 while (ISDIGIT (*s));
8937 if (regno > 31)
8938 as_bad (_("Invalid register number (%d)"), regno);
8939 else
8941 INSERT_OPERAND (RT, *ip, regno);
8942 continue;
8945 else
8946 as_bad (_("Invalid coprocessor 0 register number"));
8947 break;
8949 default:
8950 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8951 *args, insn->name, insn->args);
8952 /* Further processing is fruitless. */
8953 return;
8955 break;
8957 case '<': /* must be at least one digit */
8959 * According to the manual, if the shift amount is greater
8960 * than 31 or less than 0, then the shift amount should be
8961 * mod 32. In reality the mips assembler issues an error.
8962 * We issue a warning and mask out all but the low 5 bits.
8964 my_getExpression (&imm_expr, s);
8965 check_absolute_expr (ip, &imm_expr);
8966 if ((unsigned long) imm_expr.X_add_number > 31)
8967 as_warn (_("Improper shift amount (%lu)"),
8968 (unsigned long) imm_expr.X_add_number);
8969 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8970 imm_expr.X_op = O_absent;
8971 s = expr_end;
8972 continue;
8974 case '>': /* shift amount minus 32 */
8975 my_getExpression (&imm_expr, s);
8976 check_absolute_expr (ip, &imm_expr);
8977 if ((unsigned long) imm_expr.X_add_number < 32
8978 || (unsigned long) imm_expr.X_add_number > 63)
8979 break;
8980 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8981 imm_expr.X_op = O_absent;
8982 s = expr_end;
8983 continue;
8985 case 'k': /* cache code */
8986 case 'h': /* prefx code */
8987 my_getExpression (&imm_expr, s);
8988 check_absolute_expr (ip, &imm_expr);
8989 if ((unsigned long) imm_expr.X_add_number > 31)
8990 as_warn (_("Invalid value for `%s' (%lu)"),
8991 ip->insn_mo->name,
8992 (unsigned long) imm_expr.X_add_number);
8993 if (*args == 'k')
8994 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8995 else
8996 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8997 imm_expr.X_op = O_absent;
8998 s = expr_end;
8999 continue;
9001 case 'c': /* break code */
9002 my_getExpression (&imm_expr, s);
9003 check_absolute_expr (ip, &imm_expr);
9004 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9005 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9006 ip->insn_mo->name,
9007 (unsigned long) imm_expr.X_add_number);
9008 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9009 imm_expr.X_op = O_absent;
9010 s = expr_end;
9011 continue;
9013 case 'q': /* lower break code */
9014 my_getExpression (&imm_expr, s);
9015 check_absolute_expr (ip, &imm_expr);
9016 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9017 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9018 ip->insn_mo->name,
9019 (unsigned long) imm_expr.X_add_number);
9020 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9021 imm_expr.X_op = O_absent;
9022 s = expr_end;
9023 continue;
9025 case 'B': /* 20-bit syscall/break code. */
9026 my_getExpression (&imm_expr, s);
9027 check_absolute_expr (ip, &imm_expr);
9028 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9029 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9030 ip->insn_mo->name,
9031 (unsigned long) imm_expr.X_add_number);
9032 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9033 imm_expr.X_op = O_absent;
9034 s = expr_end;
9035 continue;
9037 case 'C': /* Coprocessor code */
9038 my_getExpression (&imm_expr, s);
9039 check_absolute_expr (ip, &imm_expr);
9040 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9042 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9043 (unsigned long) imm_expr.X_add_number);
9044 imm_expr.X_add_number &= OP_MASK_COPZ;
9046 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9047 imm_expr.X_op = O_absent;
9048 s = expr_end;
9049 continue;
9051 case 'J': /* 19-bit wait code. */
9052 my_getExpression (&imm_expr, s);
9053 check_absolute_expr (ip, &imm_expr);
9054 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9056 as_warn (_("Illegal 19-bit code (%lu)"),
9057 (unsigned long) imm_expr.X_add_number);
9058 imm_expr.X_add_number &= OP_MASK_CODE19;
9060 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9061 imm_expr.X_op = O_absent;
9062 s = expr_end;
9063 continue;
9065 case 'P': /* Performance register. */
9066 my_getExpression (&imm_expr, s);
9067 check_absolute_expr (ip, &imm_expr);
9068 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9069 as_warn (_("Invalid performance register (%lu)"),
9070 (unsigned long) imm_expr.X_add_number);
9071 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9072 imm_expr.X_op = O_absent;
9073 s = expr_end;
9074 continue;
9076 case 'G': /* Coprocessor destination register. */
9077 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9078 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9079 else
9080 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9081 INSERT_OPERAND (RD, *ip, regno);
9082 if (ok)
9084 lastregno = regno;
9085 continue;
9087 else
9088 break;
9090 case 'b': /* base register */
9091 case 'd': /* destination register */
9092 case 's': /* source register */
9093 case 't': /* target register */
9094 case 'r': /* both target and source */
9095 case 'v': /* both dest and source */
9096 case 'w': /* both dest and target */
9097 case 'E': /* coprocessor target register */
9098 case 'K': /* 'rdhwr' destination register */
9099 case 'x': /* ignore register name */
9100 case 'z': /* must be zero register */
9101 case 'U': /* destination register (clo/clz). */
9102 case 'g': /* coprocessor destination register */
9103 s_reset = s;
9104 if (*args == 'E' || *args == 'K')
9105 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9106 else
9108 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9109 if (regno == AT && mips_opts.at)
9111 if (mips_opts.at == ATREG)
9112 as_warn (_("used $at without \".set noat\""));
9113 else
9114 as_warn (_("used $%u with \".set at=$%u\""),
9115 regno, mips_opts.at);
9118 if (ok)
9120 c = *args;
9121 if (*s == ' ')
9122 ++s;
9123 if (args[1] != *s)
9125 if (c == 'r' || c == 'v' || c == 'w')
9127 regno = lastregno;
9128 s = s_reset;
9129 ++args;
9132 /* 'z' only matches $0. */
9133 if (c == 'z' && regno != 0)
9134 break;
9136 if (c == 's' && !strcmp (ip->insn_mo->name, "jalr"))
9138 if (regno == lastregno)
9140 insn_error = _("source and destinationations must be different");
9141 continue;
9143 if (regno == 31 && lastregno == 0)
9145 insn_error = _("a destination register must be supplied");
9146 continue;
9149 /* Now that we have assembled one operand, we use the args string
9150 * to figure out where it goes in the instruction. */
9151 switch (c)
9153 case 'r':
9154 case 's':
9155 case 'v':
9156 case 'b':
9157 INSERT_OPERAND (RS, *ip, regno);
9158 break;
9159 case 'd':
9160 case 'G':
9161 case 'K':
9162 case 'g':
9163 INSERT_OPERAND (RD, *ip, regno);
9164 break;
9165 case 'U':
9166 INSERT_OPERAND (RD, *ip, regno);
9167 INSERT_OPERAND (RT, *ip, regno);
9168 break;
9169 case 'w':
9170 case 't':
9171 case 'E':
9172 INSERT_OPERAND (RT, *ip, regno);
9173 break;
9174 case 'x':
9175 /* This case exists because on the r3000 trunc
9176 expands into a macro which requires a gp
9177 register. On the r6000 or r4000 it is
9178 assembled into a single instruction which
9179 ignores the register. Thus the insn version
9180 is MIPS_ISA2 and uses 'x', and the macro
9181 version is MIPS_ISA1 and uses 't'. */
9182 break;
9183 case 'z':
9184 /* This case is for the div instruction, which
9185 acts differently if the destination argument
9186 is $0. This only matches $0, and is checked
9187 outside the switch. */
9188 break;
9189 case 'D':
9190 /* Itbl operand; not yet implemented. FIXME ?? */
9191 break;
9192 /* What about all other operands like 'i', which
9193 can be specified in the opcode table? */
9195 lastregno = regno;
9196 continue;
9198 switch (*args++)
9200 case 'r':
9201 case 'v':
9202 INSERT_OPERAND (RS, *ip, lastregno);
9203 continue;
9204 case 'w':
9205 INSERT_OPERAND (RT, *ip, lastregno);
9206 continue;
9208 break;
9210 case 'O': /* MDMX alignment immediate constant. */
9211 my_getExpression (&imm_expr, s);
9212 check_absolute_expr (ip, &imm_expr);
9213 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9214 as_warn ("Improper align amount (%ld), using low bits",
9215 (long) imm_expr.X_add_number);
9216 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9217 imm_expr.X_op = O_absent;
9218 s = expr_end;
9219 continue;
9221 case 'Q': /* MDMX vector, element sel, or const. */
9222 if (s[0] != '$')
9224 /* MDMX Immediate. */
9225 my_getExpression (&imm_expr, s);
9226 check_absolute_expr (ip, &imm_expr);
9227 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9228 as_warn (_("Invalid MDMX Immediate (%ld)"),
9229 (long) imm_expr.X_add_number);
9230 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9231 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9232 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9233 else
9234 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9235 imm_expr.X_op = O_absent;
9236 s = expr_end;
9237 continue;
9239 /* Not MDMX Immediate. Fall through. */
9240 case 'X': /* MDMX destination register. */
9241 case 'Y': /* MDMX source register. */
9242 case 'Z': /* MDMX target register. */
9243 is_mdmx = 1;
9244 case 'D': /* floating point destination register */
9245 case 'S': /* floating point source register */
9246 case 'T': /* floating point target register */
9247 case 'R': /* floating point source register */
9248 case 'V':
9249 case 'W':
9250 rtype = RTYPE_FPU;
9251 if (is_mdmx
9252 || (mips_opts.ase_mdmx
9253 && (ip->insn_mo->pinfo & FP_D)
9254 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9255 | INSN_COPROC_MEMORY_DELAY
9256 | INSN_LOAD_COPROC_DELAY
9257 | INSN_LOAD_MEMORY_DELAY
9258 | INSN_STORE_MEMORY))))
9259 rtype |= RTYPE_VEC;
9260 s_reset = s;
9261 if (reg_lookup (&s, rtype, &regno))
9263 if ((regno & 1) != 0
9264 && HAVE_32BIT_FPRS
9265 && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9266 as_warn (_("Float register should be even, was %d"),
9267 regno);
9269 c = *args;
9270 if (*s == ' ')
9271 ++s;
9272 if (args[1] != *s)
9274 if (c == 'V' || c == 'W')
9276 regno = lastregno;
9277 s = s_reset;
9278 ++args;
9281 switch (c)
9283 case 'D':
9284 case 'X':
9285 INSERT_OPERAND (FD, *ip, regno);
9286 break;
9287 case 'V':
9288 case 'S':
9289 case 'Y':
9290 INSERT_OPERAND (FS, *ip, regno);
9291 break;
9292 case 'Q':
9293 /* This is like 'Z', but also needs to fix the MDMX
9294 vector/scalar select bits. Note that the
9295 scalar immediate case is handled above. */
9296 if (*s == '[')
9298 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9299 int max_el = (is_qh ? 3 : 7);
9300 s++;
9301 my_getExpression(&imm_expr, s);
9302 check_absolute_expr (ip, &imm_expr);
9303 s = expr_end;
9304 if (imm_expr.X_add_number > max_el)
9305 as_bad(_("Bad element selector %ld"),
9306 (long) imm_expr.X_add_number);
9307 imm_expr.X_add_number &= max_el;
9308 ip->insn_opcode |= (imm_expr.X_add_number
9309 << (OP_SH_VSEL +
9310 (is_qh ? 2 : 1)));
9311 imm_expr.X_op = O_absent;
9312 if (*s != ']')
9313 as_warn(_("Expecting ']' found '%s'"), s);
9314 else
9315 s++;
9317 else
9319 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9320 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9321 << OP_SH_VSEL);
9322 else
9323 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9324 OP_SH_VSEL);
9326 /* Fall through */
9327 case 'W':
9328 case 'T':
9329 case 'Z':
9330 INSERT_OPERAND (FT, *ip, regno);
9331 break;
9332 case 'R':
9333 INSERT_OPERAND (FR, *ip, regno);
9334 break;
9336 lastregno = regno;
9337 continue;
9340 switch (*args++)
9342 case 'V':
9343 INSERT_OPERAND (FS, *ip, lastregno);
9344 continue;
9345 case 'W':
9346 INSERT_OPERAND (FT, *ip, lastregno);
9347 continue;
9349 break;
9351 case 'I':
9352 my_getExpression (&imm_expr, s);
9353 if (imm_expr.X_op != O_big
9354 && imm_expr.X_op != O_constant)
9355 insn_error = _("absolute expression required");
9356 if (HAVE_32BIT_GPRS)
9357 normalize_constant_expr (&imm_expr);
9358 s = expr_end;
9359 continue;
9361 case 'A':
9362 my_getExpression (&offset_expr, s);
9363 normalize_address_expr (&offset_expr);
9364 *imm_reloc = BFD_RELOC_32;
9365 s = expr_end;
9366 continue;
9368 case 'F':
9369 case 'L':
9370 case 'f':
9371 case 'l':
9373 int f64;
9374 int using_gprs;
9375 char *save_in;
9376 char *err;
9377 unsigned char temp[8];
9378 int len;
9379 unsigned int length;
9380 segT seg;
9381 subsegT subseg;
9382 char *p;
9384 /* These only appear as the last operand in an
9385 instruction, and every instruction that accepts
9386 them in any variant accepts them in all variants.
9387 This means we don't have to worry about backing out
9388 any changes if the instruction does not match.
9390 The difference between them is the size of the
9391 floating point constant and where it goes. For 'F'
9392 and 'L' the constant is 64 bits; for 'f' and 'l' it
9393 is 32 bits. Where the constant is placed is based
9394 on how the MIPS assembler does things:
9395 F -- .rdata
9396 L -- .lit8
9397 f -- immediate value
9398 l -- .lit4
9400 The .lit4 and .lit8 sections are only used if
9401 permitted by the -G argument.
9403 The code below needs to know whether the target register
9404 is 32 or 64 bits wide. It relies on the fact 'f' and
9405 'F' are used with GPR-based instructions and 'l' and
9406 'L' are used with FPR-based instructions. */
9408 f64 = *args == 'F' || *args == 'L';
9409 using_gprs = *args == 'F' || *args == 'f';
9411 save_in = input_line_pointer;
9412 input_line_pointer = s;
9413 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9414 length = len;
9415 s = input_line_pointer;
9416 input_line_pointer = save_in;
9417 if (err != NULL && *err != '\0')
9419 as_bad (_("Bad floating point constant: %s"), err);
9420 memset (temp, '\0', sizeof temp);
9421 length = f64 ? 8 : 4;
9424 assert (length == (unsigned) (f64 ? 8 : 4));
9426 if (*args == 'f'
9427 || (*args == 'l'
9428 && (g_switch_value < 4
9429 || (temp[0] == 0 && temp[1] == 0)
9430 || (temp[2] == 0 && temp[3] == 0))))
9432 imm_expr.X_op = O_constant;
9433 if (! target_big_endian)
9434 imm_expr.X_add_number = bfd_getl32 (temp);
9435 else
9436 imm_expr.X_add_number = bfd_getb32 (temp);
9438 else if (length > 4
9439 && ! mips_disable_float_construction
9440 /* Constants can only be constructed in GPRs and
9441 copied to FPRs if the GPRs are at least as wide
9442 as the FPRs. Force the constant into memory if
9443 we are using 64-bit FPRs but the GPRs are only
9444 32 bits wide. */
9445 && (using_gprs
9446 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9447 && ((temp[0] == 0 && temp[1] == 0)
9448 || (temp[2] == 0 && temp[3] == 0))
9449 && ((temp[4] == 0 && temp[5] == 0)
9450 || (temp[6] == 0 && temp[7] == 0)))
9452 /* The value is simple enough to load with a couple of
9453 instructions. If using 32-bit registers, set
9454 imm_expr to the high order 32 bits and offset_expr to
9455 the low order 32 bits. Otherwise, set imm_expr to
9456 the entire 64 bit constant. */
9457 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9459 imm_expr.X_op = O_constant;
9460 offset_expr.X_op = O_constant;
9461 if (! target_big_endian)
9463 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9464 offset_expr.X_add_number = bfd_getl32 (temp);
9466 else
9468 imm_expr.X_add_number = bfd_getb32 (temp);
9469 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9471 if (offset_expr.X_add_number == 0)
9472 offset_expr.X_op = O_absent;
9474 else if (sizeof (imm_expr.X_add_number) > 4)
9476 imm_expr.X_op = O_constant;
9477 if (! target_big_endian)
9478 imm_expr.X_add_number = bfd_getl64 (temp);
9479 else
9480 imm_expr.X_add_number = bfd_getb64 (temp);
9482 else
9484 imm_expr.X_op = O_big;
9485 imm_expr.X_add_number = 4;
9486 if (! target_big_endian)
9488 generic_bignum[0] = bfd_getl16 (temp);
9489 generic_bignum[1] = bfd_getl16 (temp + 2);
9490 generic_bignum[2] = bfd_getl16 (temp + 4);
9491 generic_bignum[3] = bfd_getl16 (temp + 6);
9493 else
9495 generic_bignum[0] = bfd_getb16 (temp + 6);
9496 generic_bignum[1] = bfd_getb16 (temp + 4);
9497 generic_bignum[2] = bfd_getb16 (temp + 2);
9498 generic_bignum[3] = bfd_getb16 (temp);
9502 else
9504 const char *newname;
9505 segT new_seg;
9507 /* Switch to the right section. */
9508 seg = now_seg;
9509 subseg = now_subseg;
9510 switch (*args)
9512 default: /* unused default case avoids warnings. */
9513 case 'L':
9514 newname = RDATA_SECTION_NAME;
9515 if (g_switch_value >= 8)
9516 newname = ".lit8";
9517 break;
9518 case 'F':
9519 newname = RDATA_SECTION_NAME;
9520 break;
9521 case 'l':
9522 assert (g_switch_value >= 4);
9523 newname = ".lit4";
9524 break;
9526 new_seg = subseg_new (newname, (subsegT) 0);
9527 if (IS_ELF)
9528 bfd_set_section_flags (stdoutput, new_seg,
9529 (SEC_ALLOC
9530 | SEC_LOAD
9531 | SEC_READONLY
9532 | SEC_DATA));
9533 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9534 if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9535 record_alignment (new_seg, 4);
9536 else
9537 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9538 if (seg == now_seg)
9539 as_bad (_("Can't use floating point insn in this section"));
9541 /* Set the argument to the current address in the
9542 section. */
9543 offset_expr.X_op = O_symbol;
9544 offset_expr.X_add_symbol =
9545 symbol_new ("L0\001", now_seg,
9546 (valueT) frag_now_fix (), frag_now);
9547 offset_expr.X_add_number = 0;
9549 /* Put the floating point number into the section. */
9550 p = frag_more ((int) length);
9551 memcpy (p, temp, length);
9553 /* Switch back to the original section. */
9554 subseg_set (seg, subseg);
9557 continue;
9559 case 'i': /* 16 bit unsigned immediate */
9560 case 'j': /* 16 bit signed immediate */
9561 *imm_reloc = BFD_RELOC_LO16;
9562 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9564 int more;
9565 offsetT minval, maxval;
9567 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9568 && strcmp (insn->name, insn[1].name) == 0);
9570 /* If the expression was written as an unsigned number,
9571 only treat it as signed if there are no more
9572 alternatives. */
9573 if (more
9574 && *args == 'j'
9575 && sizeof (imm_expr.X_add_number) <= 4
9576 && imm_expr.X_op == O_constant
9577 && imm_expr.X_add_number < 0
9578 && imm_expr.X_unsigned
9579 && HAVE_64BIT_GPRS)
9580 break;
9582 /* For compatibility with older assemblers, we accept
9583 0x8000-0xffff as signed 16-bit numbers when only
9584 signed numbers are allowed. */
9585 if (*args == 'i')
9586 minval = 0, maxval = 0xffff;
9587 else if (more)
9588 minval = -0x8000, maxval = 0x7fff;
9589 else
9590 minval = -0x8000, maxval = 0xffff;
9592 if (imm_expr.X_op != O_constant
9593 || imm_expr.X_add_number < minval
9594 || imm_expr.X_add_number > maxval)
9596 if (more)
9597 break;
9598 if (imm_expr.X_op == O_constant
9599 || imm_expr.X_op == O_big)
9600 as_bad (_("expression out of range"));
9603 s = expr_end;
9604 continue;
9606 case 'o': /* 16 bit offset */
9607 /* Check whether there is only a single bracketed expression
9608 left. If so, it must be the base register and the
9609 constant must be zero. */
9610 if (*s == '(' && strchr (s + 1, '(') == 0)
9612 offset_expr.X_op = O_constant;
9613 offset_expr.X_add_number = 0;
9614 continue;
9617 /* If this value won't fit into a 16 bit offset, then go
9618 find a macro that will generate the 32 bit offset
9619 code pattern. */
9620 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9621 && (offset_expr.X_op != O_constant
9622 || offset_expr.X_add_number >= 0x8000
9623 || offset_expr.X_add_number < -0x8000))
9624 break;
9626 s = expr_end;
9627 continue;
9629 case 'p': /* pc relative offset */
9630 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9631 my_getExpression (&offset_expr, s);
9632 s = expr_end;
9633 continue;
9635 case 'u': /* upper 16 bits */
9636 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9637 && imm_expr.X_op == O_constant
9638 && (imm_expr.X_add_number < 0
9639 || imm_expr.X_add_number >= 0x10000))
9640 as_bad (_("lui expression not in range 0..65535"));
9641 s = expr_end;
9642 continue;
9644 case 'a': /* 26 bit address */
9645 my_getExpression (&offset_expr, s);
9646 s = expr_end;
9647 *offset_reloc = BFD_RELOC_MIPS_JMP;
9648 continue;
9650 case 'N': /* 3 bit branch condition code */
9651 case 'M': /* 3 bit compare condition code */
9652 rtype = RTYPE_CCC;
9653 if (ip->insn_mo->pinfo & (FP_D| FP_S))
9654 rtype |= RTYPE_FCC;
9655 if (!reg_lookup (&s, rtype, &regno))
9656 break;
9657 if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9658 || strcmp(str + strlen(str) - 5, "any2f") == 0
9659 || strcmp(str + strlen(str) - 5, "any2t") == 0)
9660 && (regno & 1) != 0)
9661 as_warn(_("Condition code register should be even for %s, was %d"),
9662 str, regno);
9663 if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9664 || strcmp(str + strlen(str) - 5, "any4t") == 0)
9665 && (regno & 3) != 0)
9666 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9667 str, regno);
9668 if (*args == 'N')
9669 INSERT_OPERAND (BCC, *ip, regno);
9670 else
9671 INSERT_OPERAND (CCC, *ip, regno);
9672 continue;
9674 case 'H':
9675 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9676 s += 2;
9677 if (ISDIGIT (*s))
9679 c = 0;
9682 c *= 10;
9683 c += *s - '0';
9684 ++s;
9686 while (ISDIGIT (*s));
9688 else
9689 c = 8; /* Invalid sel value. */
9691 if (c > 7)
9692 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9693 ip->insn_opcode |= c;
9694 continue;
9696 case 'e':
9697 /* Must be at least one digit. */
9698 my_getExpression (&imm_expr, s);
9699 check_absolute_expr (ip, &imm_expr);
9701 if ((unsigned long) imm_expr.X_add_number
9702 > (unsigned long) OP_MASK_VECBYTE)
9704 as_bad (_("bad byte vector index (%ld)"),
9705 (long) imm_expr.X_add_number);
9706 imm_expr.X_add_number = 0;
9709 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9710 imm_expr.X_op = O_absent;
9711 s = expr_end;
9712 continue;
9714 case '%':
9715 my_getExpression (&imm_expr, s);
9716 check_absolute_expr (ip, &imm_expr);
9718 if ((unsigned long) imm_expr.X_add_number
9719 > (unsigned long) OP_MASK_VECALIGN)
9721 as_bad (_("bad byte vector index (%ld)"),
9722 (long) imm_expr.X_add_number);
9723 imm_expr.X_add_number = 0;
9726 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9727 imm_expr.X_op = O_absent;
9728 s = expr_end;
9729 continue;
9731 default:
9732 as_bad (_("bad char = '%c'\n"), *args);
9733 internalError ();
9735 break;
9737 /* Args don't match. */
9738 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9739 !strcmp (insn->name, insn[1].name))
9741 ++insn;
9742 s = argsStart;
9743 insn_error = _("illegal operands");
9744 continue;
9746 if (save_c)
9747 *(--s) = save_c;
9748 insn_error = _("illegal operands");
9749 return;
9753 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9755 /* This routine assembles an instruction into its binary format when
9756 assembling for the mips16. As a side effect, it sets one of the
9757 global variables imm_reloc or offset_reloc to the type of
9758 relocation to do if one of the operands is an address expression.
9759 It also sets mips16_small and mips16_ext if the user explicitly
9760 requested a small or extended instruction. */
9762 static void
9763 mips16_ip (char *str, struct mips_cl_insn *ip)
9765 char *s;
9766 const char *args;
9767 struct mips_opcode *insn;
9768 char *argsstart;
9769 unsigned int regno;
9770 unsigned int lastregno = 0;
9771 char *s_reset;
9772 size_t i;
9774 insn_error = NULL;
9776 mips16_small = FALSE;
9777 mips16_ext = FALSE;
9779 for (s = str; ISLOWER (*s); ++s)
9781 switch (*s)
9783 case '\0':
9784 break;
9786 case ' ':
9787 *s++ = '\0';
9788 break;
9790 case '.':
9791 if (s[1] == 't' && s[2] == ' ')
9793 *s = '\0';
9794 mips16_small = TRUE;
9795 s += 3;
9796 break;
9798 else if (s[1] == 'e' && s[2] == ' ')
9800 *s = '\0';
9801 mips16_ext = TRUE;
9802 s += 3;
9803 break;
9805 /* Fall through. */
9806 default:
9807 insn_error = _("unknown opcode");
9808 return;
9811 if (mips_opts.noautoextend && ! mips16_ext)
9812 mips16_small = TRUE;
9814 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9816 insn_error = _("unrecognized opcode");
9817 return;
9820 argsstart = s;
9821 for (;;)
9823 bfd_boolean ok;
9825 assert (strcmp (insn->name, str) == 0);
9827 if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9828 ok = TRUE;
9829 else
9830 ok = FALSE;
9832 if (! ok)
9834 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9835 && strcmp (insn->name, insn[1].name) == 0)
9837 ++insn;
9838 continue;
9840 else
9842 if (!insn_error)
9844 static char buf[100];
9845 sprintf (buf,
9846 _("opcode not supported on this processor: %s (%s)"),
9847 mips_cpu_info_from_arch (mips_opts.arch)->name,
9848 mips_cpu_info_from_isa (mips_opts.isa)->name);
9849 insn_error = buf;
9851 return;
9855 create_insn (ip, insn);
9856 imm_expr.X_op = O_absent;
9857 imm_reloc[0] = BFD_RELOC_UNUSED;
9858 imm_reloc[1] = BFD_RELOC_UNUSED;
9859 imm_reloc[2] = BFD_RELOC_UNUSED;
9860 imm2_expr.X_op = O_absent;
9861 offset_expr.X_op = O_absent;
9862 offset_reloc[0] = BFD_RELOC_UNUSED;
9863 offset_reloc[1] = BFD_RELOC_UNUSED;
9864 offset_reloc[2] = BFD_RELOC_UNUSED;
9865 for (args = insn->args; 1; ++args)
9867 int c;
9869 if (*s == ' ')
9870 ++s;
9872 /* In this switch statement we call break if we did not find
9873 a match, continue if we did find a match, or return if we
9874 are done. */
9876 c = *args;
9877 switch (c)
9879 case '\0':
9880 if (*s == '\0')
9882 /* Stuff the immediate value in now, if we can. */
9883 if (imm_expr.X_op == O_constant
9884 && *imm_reloc > BFD_RELOC_UNUSED
9885 && insn->pinfo != INSN_MACRO)
9887 valueT tmp;
9889 switch (*offset_reloc)
9891 case BFD_RELOC_MIPS16_HI16_S:
9892 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9893 break;
9895 case BFD_RELOC_MIPS16_HI16:
9896 tmp = imm_expr.X_add_number >> 16;
9897 break;
9899 case BFD_RELOC_MIPS16_LO16:
9900 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9901 - 0x8000;
9902 break;
9904 case BFD_RELOC_UNUSED:
9905 tmp = imm_expr.X_add_number;
9906 break;
9908 default:
9909 internalError ();
9911 *offset_reloc = BFD_RELOC_UNUSED;
9913 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9914 tmp, TRUE, mips16_small,
9915 mips16_ext, &ip->insn_opcode,
9916 &ip->use_extend, &ip->extend);
9917 imm_expr.X_op = O_absent;
9918 *imm_reloc = BFD_RELOC_UNUSED;
9921 return;
9923 break;
9925 case ',':
9926 if (*s++ == c)
9927 continue;
9928 s--;
9929 switch (*++args)
9931 case 'v':
9932 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9933 continue;
9934 case 'w':
9935 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9936 continue;
9938 break;
9940 case '(':
9941 case ')':
9942 if (*s++ == c)
9943 continue;
9944 break;
9946 case 'v':
9947 case 'w':
9948 if (s[0] != '$')
9950 if (c == 'v')
9951 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9952 else
9953 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9954 ++args;
9955 continue;
9957 /* Fall through. */
9958 case 'x':
9959 case 'y':
9960 case 'z':
9961 case 'Z':
9962 case '0':
9963 case 'S':
9964 case 'R':
9965 case 'X':
9966 case 'Y':
9967 s_reset = s;
9968 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9970 if (c == 'v' || c == 'w')
9972 if (c == 'v')
9973 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9974 else
9975 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9976 ++args;
9977 continue;
9979 break;
9982 if (*s == ' ')
9983 ++s;
9984 if (args[1] != *s)
9986 if (c == 'v' || c == 'w')
9988 regno = mips16_to_32_reg_map[lastregno];
9989 s = s_reset;
9990 ++args;
9994 switch (c)
9996 case 'x':
9997 case 'y':
9998 case 'z':
9999 case 'v':
10000 case 'w':
10001 case 'Z':
10002 regno = mips32_to_16_reg_map[regno];
10003 break;
10005 case '0':
10006 if (regno != 0)
10007 regno = ILLEGAL_REG;
10008 break;
10010 case 'S':
10011 if (regno != SP)
10012 regno = ILLEGAL_REG;
10013 break;
10015 case 'R':
10016 if (regno != RA)
10017 regno = ILLEGAL_REG;
10018 break;
10020 case 'X':
10021 case 'Y':
10022 if (regno == AT && mips_opts.at)
10024 if (mips_opts.at == ATREG)
10025 as_warn (_("used $at without \".set noat\""));
10026 else
10027 as_warn (_("used $%u with \".set at=$%u\""),
10028 regno, mips_opts.at);
10030 break;
10032 default:
10033 internalError ();
10036 if (regno == ILLEGAL_REG)
10037 break;
10039 switch (c)
10041 case 'x':
10042 case 'v':
10043 MIPS16_INSERT_OPERAND (RX, *ip, regno);
10044 break;
10045 case 'y':
10046 case 'w':
10047 MIPS16_INSERT_OPERAND (RY, *ip, regno);
10048 break;
10049 case 'z':
10050 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10051 break;
10052 case 'Z':
10053 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10054 case '0':
10055 case 'S':
10056 case 'R':
10057 break;
10058 case 'X':
10059 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10060 break;
10061 case 'Y':
10062 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10063 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10064 break;
10065 default:
10066 internalError ();
10069 lastregno = regno;
10070 continue;
10072 case 'P':
10073 if (strncmp (s, "$pc", 3) == 0)
10075 s += 3;
10076 continue;
10078 break;
10080 case '5':
10081 case 'H':
10082 case 'W':
10083 case 'D':
10084 case 'j':
10085 case 'V':
10086 case 'C':
10087 case 'U':
10088 case 'k':
10089 case 'K':
10090 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10091 if (i > 0)
10093 if (imm_expr.X_op != O_constant)
10095 mips16_ext = TRUE;
10096 ip->use_extend = TRUE;
10097 ip->extend = 0;
10099 else
10101 /* We need to relax this instruction. */
10102 *offset_reloc = *imm_reloc;
10103 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10105 s = expr_end;
10106 continue;
10108 *imm_reloc = BFD_RELOC_UNUSED;
10109 /* Fall through. */
10110 case '<':
10111 case '>':
10112 case '[':
10113 case ']':
10114 case '4':
10115 case '8':
10116 my_getExpression (&imm_expr, s);
10117 if (imm_expr.X_op == O_register)
10119 /* What we thought was an expression turned out to
10120 be a register. */
10122 if (s[0] == '(' && args[1] == '(')
10124 /* It looks like the expression was omitted
10125 before a register indirection, which means
10126 that the expression is implicitly zero. We
10127 still set up imm_expr, so that we handle
10128 explicit extensions correctly. */
10129 imm_expr.X_op = O_constant;
10130 imm_expr.X_add_number = 0;
10131 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10132 continue;
10135 break;
10138 /* We need to relax this instruction. */
10139 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10140 s = expr_end;
10141 continue;
10143 case 'p':
10144 case 'q':
10145 case 'A':
10146 case 'B':
10147 case 'E':
10148 /* We use offset_reloc rather than imm_reloc for the PC
10149 relative operands. This lets macros with both
10150 immediate and address operands work correctly. */
10151 my_getExpression (&offset_expr, s);
10153 if (offset_expr.X_op == O_register)
10154 break;
10156 /* We need to relax this instruction. */
10157 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10158 s = expr_end;
10159 continue;
10161 case '6': /* break code */
10162 my_getExpression (&imm_expr, s);
10163 check_absolute_expr (ip, &imm_expr);
10164 if ((unsigned long) imm_expr.X_add_number > 63)
10165 as_warn (_("Invalid value for `%s' (%lu)"),
10166 ip->insn_mo->name,
10167 (unsigned long) imm_expr.X_add_number);
10168 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10169 imm_expr.X_op = O_absent;
10170 s = expr_end;
10171 continue;
10173 case 'a': /* 26 bit address */
10174 my_getExpression (&offset_expr, s);
10175 s = expr_end;
10176 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10177 ip->insn_opcode <<= 16;
10178 continue;
10180 case 'l': /* register list for entry macro */
10181 case 'L': /* register list for exit macro */
10183 int mask;
10185 if (c == 'l')
10186 mask = 0;
10187 else
10188 mask = 7 << 3;
10189 while (*s != '\0')
10191 unsigned int freg, reg1, reg2;
10193 while (*s == ' ' || *s == ',')
10194 ++s;
10195 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10196 freg = 0;
10197 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10198 freg = 1;
10199 else
10201 as_bad (_("can't parse register list"));
10202 break;
10204 if (*s == ' ')
10205 ++s;
10206 if (*s != '-')
10207 reg2 = reg1;
10208 else
10210 ++s;
10211 if (!reg_lookup (&s, freg ? RTYPE_FPU
10212 : (RTYPE_GP | RTYPE_NUM), &reg2))
10214 as_bad (_("invalid register list"));
10215 break;
10218 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10220 mask &= ~ (7 << 3);
10221 mask |= 5 << 3;
10223 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10225 mask &= ~ (7 << 3);
10226 mask |= 6 << 3;
10228 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10229 mask |= (reg2 - 3) << 3;
10230 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10231 mask |= (reg2 - 15) << 1;
10232 else if (reg1 == RA && reg2 == RA)
10233 mask |= 1;
10234 else
10236 as_bad (_("invalid register list"));
10237 break;
10240 /* The mask is filled in in the opcode table for the
10241 benefit of the disassembler. We remove it before
10242 applying the actual mask. */
10243 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10244 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10246 continue;
10248 case 'm': /* Register list for save insn. */
10249 case 'M': /* Register list for restore insn. */
10251 int opcode = 0;
10252 int framesz = 0, seen_framesz = 0;
10253 int args = 0, statics = 0, sregs = 0;
10255 while (*s != '\0')
10257 unsigned int reg1, reg2;
10259 SKIP_SPACE_TABS (s);
10260 while (*s == ',')
10261 ++s;
10262 SKIP_SPACE_TABS (s);
10264 my_getExpression (&imm_expr, s);
10265 if (imm_expr.X_op == O_constant)
10267 /* Handle the frame size. */
10268 if (seen_framesz)
10270 as_bad (_("more than one frame size in list"));
10271 break;
10273 seen_framesz = 1;
10274 framesz = imm_expr.X_add_number;
10275 imm_expr.X_op = O_absent;
10276 s = expr_end;
10277 continue;
10280 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10282 as_bad (_("can't parse register list"));
10283 break;
10286 while (*s == ' ')
10287 ++s;
10289 if (*s != '-')
10290 reg2 = reg1;
10291 else
10293 ++s;
10294 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10295 || reg2 < reg1)
10297 as_bad (_("can't parse register list"));
10298 break;
10302 while (reg1 <= reg2)
10304 if (reg1 >= 4 && reg1 <= 7)
10306 if (!seen_framesz)
10307 /* args $a0-$a3 */
10308 args |= 1 << (reg1 - 4);
10309 else
10310 /* statics $a0-$a3 */
10311 statics |= 1 << (reg1 - 4);
10313 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10315 /* $s0-$s8 */
10316 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10318 else if (reg1 == 31)
10320 /* Add $ra to insn. */
10321 opcode |= 0x40;
10323 else
10325 as_bad (_("unexpected register in list"));
10326 break;
10328 if (++reg1 == 24)
10329 reg1 = 30;
10333 /* Encode args/statics combination. */
10334 if (args & statics)
10335 as_bad (_("arg/static registers overlap"));
10336 else if (args == 0xf)
10337 /* All $a0-$a3 are args. */
10338 opcode |= MIPS16_ALL_ARGS << 16;
10339 else if (statics == 0xf)
10340 /* All $a0-$a3 are statics. */
10341 opcode |= MIPS16_ALL_STATICS << 16;
10342 else
10344 int narg = 0, nstat = 0;
10346 /* Count arg registers. */
10347 while (args & 0x1)
10349 args >>= 1;
10350 narg++;
10352 if (args != 0)
10353 as_bad (_("invalid arg register list"));
10355 /* Count static registers. */
10356 while (statics & 0x8)
10358 statics = (statics << 1) & 0xf;
10359 nstat++;
10361 if (statics != 0)
10362 as_bad (_("invalid static register list"));
10364 /* Encode args/statics. */
10365 opcode |= ((narg << 2) | nstat) << 16;
10368 /* Encode $s0/$s1. */
10369 if (sregs & (1 << 0)) /* $s0 */
10370 opcode |= 0x20;
10371 if (sregs & (1 << 1)) /* $s1 */
10372 opcode |= 0x10;
10373 sregs >>= 2;
10375 if (sregs != 0)
10377 /* Count regs $s2-$s8. */
10378 int nsreg = 0;
10379 while (sregs & 1)
10381 sregs >>= 1;
10382 nsreg++;
10384 if (sregs != 0)
10385 as_bad (_("invalid static register list"));
10386 /* Encode $s2-$s8. */
10387 opcode |= nsreg << 24;
10390 /* Encode frame size. */
10391 if (!seen_framesz)
10392 as_bad (_("missing frame size"));
10393 else if ((framesz & 7) != 0 || framesz < 0
10394 || framesz > 0xff * 8)
10395 as_bad (_("invalid frame size"));
10396 else if (framesz != 128 || (opcode >> 16) != 0)
10398 framesz /= 8;
10399 opcode |= (((framesz & 0xf0) << 16)
10400 | (framesz & 0x0f));
10403 /* Finally build the instruction. */
10404 if ((opcode >> 16) != 0 || framesz == 0)
10406 ip->use_extend = TRUE;
10407 ip->extend = opcode >> 16;
10409 ip->insn_opcode |= opcode & 0x7f;
10411 continue;
10413 case 'e': /* extend code */
10414 my_getExpression (&imm_expr, s);
10415 check_absolute_expr (ip, &imm_expr);
10416 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10418 as_warn (_("Invalid value for `%s' (%lu)"),
10419 ip->insn_mo->name,
10420 (unsigned long) imm_expr.X_add_number);
10421 imm_expr.X_add_number &= 0x7ff;
10423 ip->insn_opcode |= imm_expr.X_add_number;
10424 imm_expr.X_op = O_absent;
10425 s = expr_end;
10426 continue;
10428 default:
10429 internalError ();
10431 break;
10434 /* Args don't match. */
10435 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10436 strcmp (insn->name, insn[1].name) == 0)
10438 ++insn;
10439 s = argsstart;
10440 continue;
10443 insn_error = _("illegal operands");
10445 return;
10449 /* This structure holds information we know about a mips16 immediate
10450 argument type. */
10452 struct mips16_immed_operand
10454 /* The type code used in the argument string in the opcode table. */
10455 int type;
10456 /* The number of bits in the short form of the opcode. */
10457 int nbits;
10458 /* The number of bits in the extended form of the opcode. */
10459 int extbits;
10460 /* The amount by which the short form is shifted when it is used;
10461 for example, the sw instruction has a shift count of 2. */
10462 int shift;
10463 /* The amount by which the short form is shifted when it is stored
10464 into the instruction code. */
10465 int op_shift;
10466 /* Non-zero if the short form is unsigned. */
10467 int unsp;
10468 /* Non-zero if the extended form is unsigned. */
10469 int extu;
10470 /* Non-zero if the value is PC relative. */
10471 int pcrel;
10474 /* The mips16 immediate operand types. */
10476 static const struct mips16_immed_operand mips16_immed_operands[] =
10478 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10479 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10480 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10481 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10482 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10483 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10484 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10485 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10486 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10487 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10488 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10489 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10490 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10491 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10492 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10493 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10494 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10495 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10496 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10497 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10498 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10501 #define MIPS16_NUM_IMMED \
10502 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10504 /* Handle a mips16 instruction with an immediate value. This or's the
10505 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10506 whether an extended value is needed; if one is needed, it sets
10507 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10508 If SMALL is true, an unextended opcode was explicitly requested.
10509 If EXT is true, an extended opcode was explicitly requested. If
10510 WARN is true, warn if EXT does not match reality. */
10512 static void
10513 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10514 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10515 unsigned long *insn, bfd_boolean *use_extend,
10516 unsigned short *extend)
10518 const struct mips16_immed_operand *op;
10519 int mintiny, maxtiny;
10520 bfd_boolean needext;
10522 op = mips16_immed_operands;
10523 while (op->type != type)
10525 ++op;
10526 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10529 if (op->unsp)
10531 if (type == '<' || type == '>' || type == '[' || type == ']')
10533 mintiny = 1;
10534 maxtiny = 1 << op->nbits;
10536 else
10538 mintiny = 0;
10539 maxtiny = (1 << op->nbits) - 1;
10542 else
10544 mintiny = - (1 << (op->nbits - 1));
10545 maxtiny = (1 << (op->nbits - 1)) - 1;
10548 /* Branch offsets have an implicit 0 in the lowest bit. */
10549 if (type == 'p' || type == 'q')
10550 val /= 2;
10552 if ((val & ((1 << op->shift) - 1)) != 0
10553 || val < (mintiny << op->shift)
10554 || val > (maxtiny << op->shift))
10555 needext = TRUE;
10556 else
10557 needext = FALSE;
10559 if (warn && ext && ! needext)
10560 as_warn_where (file, line,
10561 _("extended operand requested but not required"));
10562 if (small && needext)
10563 as_bad_where (file, line, _("invalid unextended operand value"));
10565 if (small || (! ext && ! needext))
10567 int insnval;
10569 *use_extend = FALSE;
10570 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10571 insnval <<= op->op_shift;
10572 *insn |= insnval;
10574 else
10576 long minext, maxext;
10577 int extval;
10579 if (op->extu)
10581 minext = 0;
10582 maxext = (1 << op->extbits) - 1;
10584 else
10586 minext = - (1 << (op->extbits - 1));
10587 maxext = (1 << (op->extbits - 1)) - 1;
10589 if (val < minext || val > maxext)
10590 as_bad_where (file, line,
10591 _("operand value out of range for instruction"));
10593 *use_extend = TRUE;
10594 if (op->extbits == 16)
10596 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10597 val &= 0x1f;
10599 else if (op->extbits == 15)
10601 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10602 val &= 0xf;
10604 else
10606 extval = ((val & 0x1f) << 6) | (val & 0x20);
10607 val = 0;
10610 *extend = (unsigned short) extval;
10611 *insn |= val;
10615 struct percent_op_match
10617 const char *str;
10618 bfd_reloc_code_real_type reloc;
10621 static const struct percent_op_match mips_percent_op[] =
10623 {"%lo", BFD_RELOC_LO16},
10624 #ifdef OBJ_ELF
10625 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10626 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10627 {"%call16", BFD_RELOC_MIPS_CALL16},
10628 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10629 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10630 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10631 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10632 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10633 {"%got", BFD_RELOC_MIPS_GOT16},
10634 {"%gp_rel", BFD_RELOC_GPREL16},
10635 {"%half", BFD_RELOC_16},
10636 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10637 {"%higher", BFD_RELOC_MIPS_HIGHER},
10638 {"%neg", BFD_RELOC_MIPS_SUB},
10639 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10640 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10641 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10642 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10643 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10644 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10645 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10646 #endif
10647 {"%hi", BFD_RELOC_HI16_S}
10650 static const struct percent_op_match mips16_percent_op[] =
10652 {"%lo", BFD_RELOC_MIPS16_LO16},
10653 {"%gprel", BFD_RELOC_MIPS16_GPREL},
10654 {"%hi", BFD_RELOC_MIPS16_HI16_S}
10658 /* Return true if *STR points to a relocation operator. When returning true,
10659 move *STR over the operator and store its relocation code in *RELOC.
10660 Leave both *STR and *RELOC alone when returning false. */
10662 static bfd_boolean
10663 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10665 const struct percent_op_match *percent_op;
10666 size_t limit, i;
10668 if (mips_opts.mips16)
10670 percent_op = mips16_percent_op;
10671 limit = ARRAY_SIZE (mips16_percent_op);
10673 else
10675 percent_op = mips_percent_op;
10676 limit = ARRAY_SIZE (mips_percent_op);
10679 for (i = 0; i < limit; i++)
10680 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10682 int len = strlen (percent_op[i].str);
10684 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10685 continue;
10687 *str += strlen (percent_op[i].str);
10688 *reloc = percent_op[i].reloc;
10690 /* Check whether the output BFD supports this relocation.
10691 If not, issue an error and fall back on something safe. */
10692 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10694 as_bad ("relocation %s isn't supported by the current ABI",
10695 percent_op[i].str);
10696 *reloc = BFD_RELOC_UNUSED;
10698 return TRUE;
10700 return FALSE;
10704 /* Parse string STR as a 16-bit relocatable operand. Store the
10705 expression in *EP and the relocations in the array starting
10706 at RELOC. Return the number of relocation operators used.
10708 On exit, EXPR_END points to the first character after the expression. */
10710 static size_t
10711 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10712 char *str)
10714 bfd_reloc_code_real_type reversed_reloc[3];
10715 size_t reloc_index, i;
10716 int crux_depth, str_depth;
10717 char *crux;
10719 /* Search for the start of the main expression, recoding relocations
10720 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10721 of the main expression and with CRUX_DEPTH containing the number
10722 of open brackets at that point. */
10723 reloc_index = -1;
10724 str_depth = 0;
10727 reloc_index++;
10728 crux = str;
10729 crux_depth = str_depth;
10731 /* Skip over whitespace and brackets, keeping count of the number
10732 of brackets. */
10733 while (*str == ' ' || *str == '\t' || *str == '(')
10734 if (*str++ == '(')
10735 str_depth++;
10737 while (*str == '%'
10738 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10739 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10741 my_getExpression (ep, crux);
10742 str = expr_end;
10744 /* Match every open bracket. */
10745 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10746 if (*str++ == ')')
10747 crux_depth--;
10749 if (crux_depth > 0)
10750 as_bad ("unclosed '('");
10752 expr_end = str;
10754 if (reloc_index != 0)
10756 prev_reloc_op_frag = frag_now;
10757 for (i = 0; i < reloc_index; i++)
10758 reloc[i] = reversed_reloc[reloc_index - 1 - i];
10761 return reloc_index;
10764 static void
10765 my_getExpression (expressionS *ep, char *str)
10767 char *save_in;
10768 valueT val;
10770 save_in = input_line_pointer;
10771 input_line_pointer = str;
10772 expression (ep);
10773 expr_end = input_line_pointer;
10774 input_line_pointer = save_in;
10776 /* If we are in mips16 mode, and this is an expression based on `.',
10777 then we bump the value of the symbol by 1 since that is how other
10778 text symbols are handled. We don't bother to handle complex
10779 expressions, just `.' plus or minus a constant. */
10780 if (mips_opts.mips16
10781 && ep->X_op == O_symbol
10782 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10783 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10784 && symbol_get_frag (ep->X_add_symbol) == frag_now
10785 && symbol_constant_p (ep->X_add_symbol)
10786 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10787 S_SET_VALUE (ep->X_add_symbol, val + 1);
10790 char *
10791 md_atof (int type, char *litP, int *sizeP)
10793 return ieee_md_atof (type, litP, sizeP, target_big_endian);
10796 void
10797 md_number_to_chars (char *buf, valueT val, int n)
10799 if (target_big_endian)
10800 number_to_chars_bigendian (buf, val, n);
10801 else
10802 number_to_chars_littleendian (buf, val, n);
10805 #ifdef OBJ_ELF
10806 static int support_64bit_objects(void)
10808 const char **list, **l;
10809 int yes;
10811 list = bfd_target_list ();
10812 for (l = list; *l != NULL; l++)
10813 #ifdef TE_TMIPS
10814 /* This is traditional mips */
10815 if (strcmp (*l, "elf64-tradbigmips") == 0
10816 || strcmp (*l, "elf64-tradlittlemips") == 0)
10817 #else
10818 if (strcmp (*l, "elf64-bigmips") == 0
10819 || strcmp (*l, "elf64-littlemips") == 0)
10820 #endif
10821 break;
10822 yes = (*l != NULL);
10823 free (list);
10824 return yes;
10826 #endif /* OBJ_ELF */
10828 const char *md_shortopts = "O::g::G:";
10830 struct option md_longopts[] =
10832 /* Options which specify architecture. */
10833 #define OPTION_ARCH_BASE (OPTION_MD_BASE)
10834 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10835 {"march", required_argument, NULL, OPTION_MARCH},
10836 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10837 {"mtune", required_argument, NULL, OPTION_MTUNE},
10838 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10839 {"mips0", no_argument, NULL, OPTION_MIPS1},
10840 {"mips1", no_argument, NULL, OPTION_MIPS1},
10841 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10842 {"mips2", no_argument, NULL, OPTION_MIPS2},
10843 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10844 {"mips3", no_argument, NULL, OPTION_MIPS3},
10845 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10846 {"mips4", no_argument, NULL, OPTION_MIPS4},
10847 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10848 {"mips5", no_argument, NULL, OPTION_MIPS5},
10849 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10850 {"mips32", no_argument, NULL, OPTION_MIPS32},
10851 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10852 {"mips64", no_argument, NULL, OPTION_MIPS64},
10853 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10854 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10855 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10856 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10858 /* Options which specify Application Specific Extensions (ASEs). */
10859 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10860 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10861 {"mips16", no_argument, NULL, OPTION_MIPS16},
10862 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10863 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10864 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10865 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10866 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10867 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10868 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10869 {"mdmx", no_argument, NULL, OPTION_MDMX},
10870 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10871 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10872 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10873 {"mdsp", no_argument, NULL, OPTION_DSP},
10874 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10875 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10876 #define OPTION_MT (OPTION_ASE_BASE + 8)
10877 {"mmt", no_argument, NULL, OPTION_MT},
10878 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10879 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10880 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10881 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10882 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10883 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10884 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
10885 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
10886 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
10887 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
10889 /* Old-style architecture options. Don't add more of these. */
10890 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
10891 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10892 {"m4650", no_argument, NULL, OPTION_M4650},
10893 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10894 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10895 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10896 {"m4010", no_argument, NULL, OPTION_M4010},
10897 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10898 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10899 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10900 {"m4100", no_argument, NULL, OPTION_M4100},
10901 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10902 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10903 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10904 {"m3900", no_argument, NULL, OPTION_M3900},
10905 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10906 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10908 /* Options which enable bug fixes. */
10909 #define OPTION_FIX_BASE (OPTION_COMPAT_ARCH_BASE + 8)
10910 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10911 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10912 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10913 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10914 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10915 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10916 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10917 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
10918 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10919 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10920 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10921 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
10922 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10924 /* Miscellaneous options. */
10925 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10926 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10927 {"trap", no_argument, NULL, OPTION_TRAP},
10928 {"no-break", no_argument, NULL, OPTION_TRAP},
10929 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10930 {"break", no_argument, NULL, OPTION_BREAK},
10931 {"no-trap", no_argument, NULL, OPTION_BREAK},
10932 #define OPTION_EB (OPTION_MISC_BASE + 2)
10933 {"EB", no_argument, NULL, OPTION_EB},
10934 #define OPTION_EL (OPTION_MISC_BASE + 3)
10935 {"EL", no_argument, NULL, OPTION_EL},
10936 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10937 {"mfp32", no_argument, NULL, OPTION_FP32},
10938 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10939 {"mgp32", no_argument, NULL, OPTION_GP32},
10940 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10941 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10942 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10943 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10944 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10945 {"mfp64", no_argument, NULL, OPTION_FP64},
10946 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10947 {"mgp64", no_argument, NULL, OPTION_GP64},
10948 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10949 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10950 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10951 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10952 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10953 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10954 {"mshared", no_argument, NULL, OPTION_MSHARED},
10955 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10956 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10957 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10958 {"msym32", no_argument, NULL, OPTION_MSYM32},
10959 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10961 /* ELF-specific options. */
10962 #ifdef OBJ_ELF
10963 #define OPTION_ELF_BASE (OPTION_MISC_BASE + 16)
10964 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10965 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
10966 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10967 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
10968 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
10969 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
10970 {"xgot", no_argument, NULL, OPTION_XGOT},
10971 #define OPTION_MABI (OPTION_ELF_BASE + 3)
10972 {"mabi", required_argument, NULL, OPTION_MABI},
10973 #define OPTION_32 (OPTION_ELF_BASE + 4)
10974 {"32", no_argument, NULL, OPTION_32},
10975 #define OPTION_N32 (OPTION_ELF_BASE + 5)
10976 {"n32", no_argument, NULL, OPTION_N32},
10977 #define OPTION_64 (OPTION_ELF_BASE + 6)
10978 {"64", no_argument, NULL, OPTION_64},
10979 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10980 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10981 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10982 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10983 #define OPTION_PDR (OPTION_ELF_BASE + 9)
10984 {"mpdr", no_argument, NULL, OPTION_PDR},
10985 #define OPTION_NO_PDR (OPTION_ELF_BASE + 10)
10986 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10987 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10988 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10989 #endif /* OBJ_ELF */
10991 {NULL, no_argument, NULL, 0}
10993 size_t md_longopts_size = sizeof (md_longopts);
10995 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10996 NEW_VALUE. Warn if another value was already specified. Note:
10997 we have to defer parsing the -march and -mtune arguments in order
10998 to handle 'from-abi' correctly, since the ABI might be specified
10999 in a later argument. */
11001 static void
11002 mips_set_option_string (const char **string_ptr, const char *new_value)
11004 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11005 as_warn (_("A different %s was already specified, is now %s"),
11006 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11007 new_value);
11009 *string_ptr = new_value;
11013 md_parse_option (int c, char *arg)
11015 switch (c)
11017 case OPTION_CONSTRUCT_FLOATS:
11018 mips_disable_float_construction = 0;
11019 break;
11021 case OPTION_NO_CONSTRUCT_FLOATS:
11022 mips_disable_float_construction = 1;
11023 break;
11025 case OPTION_TRAP:
11026 mips_trap = 1;
11027 break;
11029 case OPTION_BREAK:
11030 mips_trap = 0;
11031 break;
11033 case OPTION_EB:
11034 target_big_endian = 1;
11035 break;
11037 case OPTION_EL:
11038 target_big_endian = 0;
11039 break;
11041 case 'O':
11042 if (arg == NULL)
11043 mips_optimize = 1;
11044 else if (arg[0] == '0')
11045 mips_optimize = 0;
11046 else if (arg[0] == '1')
11047 mips_optimize = 1;
11048 else
11049 mips_optimize = 2;
11050 break;
11052 case 'g':
11053 if (arg == NULL)
11054 mips_debug = 2;
11055 else
11056 mips_debug = atoi (arg);
11057 break;
11059 case OPTION_MIPS1:
11060 file_mips_isa = ISA_MIPS1;
11061 break;
11063 case OPTION_MIPS2:
11064 file_mips_isa = ISA_MIPS2;
11065 break;
11067 case OPTION_MIPS3:
11068 file_mips_isa = ISA_MIPS3;
11069 break;
11071 case OPTION_MIPS4:
11072 file_mips_isa = ISA_MIPS4;
11073 break;
11075 case OPTION_MIPS5:
11076 file_mips_isa = ISA_MIPS5;
11077 break;
11079 case OPTION_MIPS32:
11080 file_mips_isa = ISA_MIPS32;
11081 break;
11083 case OPTION_MIPS32R2:
11084 file_mips_isa = ISA_MIPS32R2;
11085 break;
11087 case OPTION_MIPS64R2:
11088 file_mips_isa = ISA_MIPS64R2;
11089 break;
11091 case OPTION_MIPS64:
11092 file_mips_isa = ISA_MIPS64;
11093 break;
11095 case OPTION_MTUNE:
11096 mips_set_option_string (&mips_tune_string, arg);
11097 break;
11099 case OPTION_MARCH:
11100 mips_set_option_string (&mips_arch_string, arg);
11101 break;
11103 case OPTION_M4650:
11104 mips_set_option_string (&mips_arch_string, "4650");
11105 mips_set_option_string (&mips_tune_string, "4650");
11106 break;
11108 case OPTION_NO_M4650:
11109 break;
11111 case OPTION_M4010:
11112 mips_set_option_string (&mips_arch_string, "4010");
11113 mips_set_option_string (&mips_tune_string, "4010");
11114 break;
11116 case OPTION_NO_M4010:
11117 break;
11119 case OPTION_M4100:
11120 mips_set_option_string (&mips_arch_string, "4100");
11121 mips_set_option_string (&mips_tune_string, "4100");
11122 break;
11124 case OPTION_NO_M4100:
11125 break;
11127 case OPTION_M3900:
11128 mips_set_option_string (&mips_arch_string, "3900");
11129 mips_set_option_string (&mips_tune_string, "3900");
11130 break;
11132 case OPTION_NO_M3900:
11133 break;
11135 case OPTION_MDMX:
11136 mips_opts.ase_mdmx = 1;
11137 break;
11139 case OPTION_NO_MDMX:
11140 mips_opts.ase_mdmx = 0;
11141 break;
11143 case OPTION_DSP:
11144 mips_opts.ase_dsp = 1;
11145 mips_opts.ase_dspr2 = 0;
11146 break;
11148 case OPTION_NO_DSP:
11149 mips_opts.ase_dsp = 0;
11150 mips_opts.ase_dspr2 = 0;
11151 break;
11153 case OPTION_DSPR2:
11154 mips_opts.ase_dspr2 = 1;
11155 mips_opts.ase_dsp = 1;
11156 break;
11158 case OPTION_NO_DSPR2:
11159 mips_opts.ase_dspr2 = 0;
11160 mips_opts.ase_dsp = 0;
11161 break;
11163 case OPTION_MT:
11164 mips_opts.ase_mt = 1;
11165 break;
11167 case OPTION_NO_MT:
11168 mips_opts.ase_mt = 0;
11169 break;
11171 case OPTION_MIPS16:
11172 mips_opts.mips16 = 1;
11173 mips_no_prev_insn ();
11174 break;
11176 case OPTION_NO_MIPS16:
11177 mips_opts.mips16 = 0;
11178 mips_no_prev_insn ();
11179 break;
11181 case OPTION_MIPS3D:
11182 mips_opts.ase_mips3d = 1;
11183 break;
11185 case OPTION_NO_MIPS3D:
11186 mips_opts.ase_mips3d = 0;
11187 break;
11189 case OPTION_SMARTMIPS:
11190 mips_opts.ase_smartmips = 1;
11191 break;
11193 case OPTION_NO_SMARTMIPS:
11194 mips_opts.ase_smartmips = 0;
11195 break;
11197 case OPTION_FIX_VR4120:
11198 mips_fix_vr4120 = 1;
11199 break;
11201 case OPTION_NO_FIX_VR4120:
11202 mips_fix_vr4120 = 0;
11203 break;
11205 case OPTION_FIX_VR4130:
11206 mips_fix_vr4130 = 1;
11207 break;
11209 case OPTION_NO_FIX_VR4130:
11210 mips_fix_vr4130 = 0;
11211 break;
11213 case OPTION_RELAX_BRANCH:
11214 mips_relax_branch = 1;
11215 break;
11217 case OPTION_NO_RELAX_BRANCH:
11218 mips_relax_branch = 0;
11219 break;
11221 case OPTION_MSHARED:
11222 mips_in_shared = TRUE;
11223 break;
11225 case OPTION_MNO_SHARED:
11226 mips_in_shared = FALSE;
11227 break;
11229 case OPTION_MSYM32:
11230 mips_opts.sym32 = TRUE;
11231 break;
11233 case OPTION_MNO_SYM32:
11234 mips_opts.sym32 = FALSE;
11235 break;
11237 #ifdef OBJ_ELF
11238 /* When generating ELF code, we permit -KPIC and -call_shared to
11239 select SVR4_PIC, and -non_shared to select no PIC. This is
11240 intended to be compatible with Irix 5. */
11241 case OPTION_CALL_SHARED:
11242 if (!IS_ELF)
11244 as_bad (_("-call_shared is supported only for ELF format"));
11245 return 0;
11247 mips_pic = SVR4_PIC;
11248 mips_abicalls = TRUE;
11249 break;
11251 case OPTION_NON_SHARED:
11252 if (!IS_ELF)
11254 as_bad (_("-non_shared is supported only for ELF format"));
11255 return 0;
11257 mips_pic = NO_PIC;
11258 mips_abicalls = FALSE;
11259 break;
11261 /* The -xgot option tells the assembler to use 32 bit offsets
11262 when accessing the got in SVR4_PIC mode. It is for Irix
11263 compatibility. */
11264 case OPTION_XGOT:
11265 mips_big_got = 1;
11266 break;
11267 #endif /* OBJ_ELF */
11269 case 'G':
11270 g_switch_value = atoi (arg);
11271 g_switch_seen = 1;
11272 break;
11274 #ifdef OBJ_ELF
11275 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11276 and -mabi=64. */
11277 case OPTION_32:
11278 if (!IS_ELF)
11280 as_bad (_("-32 is supported for ELF format only"));
11281 return 0;
11283 mips_abi = O32_ABI;
11284 break;
11286 case OPTION_N32:
11287 if (!IS_ELF)
11289 as_bad (_("-n32 is supported for ELF format only"));
11290 return 0;
11292 mips_abi = N32_ABI;
11293 break;
11295 case OPTION_64:
11296 if (!IS_ELF)
11298 as_bad (_("-64 is supported for ELF format only"));
11299 return 0;
11301 mips_abi = N64_ABI;
11302 if (!support_64bit_objects())
11303 as_fatal (_("No compiled in support for 64 bit object file format"));
11304 break;
11305 #endif /* OBJ_ELF */
11307 case OPTION_GP32:
11308 file_mips_gp32 = 1;
11309 break;
11311 case OPTION_GP64:
11312 file_mips_gp32 = 0;
11313 break;
11315 case OPTION_FP32:
11316 file_mips_fp32 = 1;
11317 break;
11319 case OPTION_FP64:
11320 file_mips_fp32 = 0;
11321 break;
11323 #ifdef OBJ_ELF
11324 case OPTION_MABI:
11325 if (!IS_ELF)
11327 as_bad (_("-mabi is supported for ELF format only"));
11328 return 0;
11330 if (strcmp (arg, "32") == 0)
11331 mips_abi = O32_ABI;
11332 else if (strcmp (arg, "o64") == 0)
11333 mips_abi = O64_ABI;
11334 else if (strcmp (arg, "n32") == 0)
11335 mips_abi = N32_ABI;
11336 else if (strcmp (arg, "64") == 0)
11338 mips_abi = N64_ABI;
11339 if (! support_64bit_objects())
11340 as_fatal (_("No compiled in support for 64 bit object file "
11341 "format"));
11343 else if (strcmp (arg, "eabi") == 0)
11344 mips_abi = EABI_ABI;
11345 else
11347 as_fatal (_("invalid abi -mabi=%s"), arg);
11348 return 0;
11350 break;
11351 #endif /* OBJ_ELF */
11353 case OPTION_M7000_HILO_FIX:
11354 mips_7000_hilo_fix = TRUE;
11355 break;
11357 case OPTION_MNO_7000_HILO_FIX:
11358 mips_7000_hilo_fix = FALSE;
11359 break;
11361 #ifdef OBJ_ELF
11362 case OPTION_MDEBUG:
11363 mips_flag_mdebug = TRUE;
11364 break;
11366 case OPTION_NO_MDEBUG:
11367 mips_flag_mdebug = FALSE;
11368 break;
11370 case OPTION_PDR:
11371 mips_flag_pdr = TRUE;
11372 break;
11374 case OPTION_NO_PDR:
11375 mips_flag_pdr = FALSE;
11376 break;
11378 case OPTION_MVXWORKS_PIC:
11379 mips_pic = VXWORKS_PIC;
11380 break;
11381 #endif /* OBJ_ELF */
11383 default:
11384 return 0;
11387 return 1;
11390 /* Set up globals to generate code for the ISA or processor
11391 described by INFO. */
11393 static void
11394 mips_set_architecture (const struct mips_cpu_info *info)
11396 if (info != 0)
11398 file_mips_arch = info->cpu;
11399 mips_opts.arch = info->cpu;
11400 mips_opts.isa = info->isa;
11405 /* Likewise for tuning. */
11407 static void
11408 mips_set_tune (const struct mips_cpu_info *info)
11410 if (info != 0)
11411 mips_tune = info->cpu;
11415 void
11416 mips_after_parse_args (void)
11418 const struct mips_cpu_info *arch_info = 0;
11419 const struct mips_cpu_info *tune_info = 0;
11421 /* GP relative stuff not working for PE */
11422 if (strncmp (TARGET_OS, "pe", 2) == 0)
11424 if (g_switch_seen && g_switch_value != 0)
11425 as_bad (_("-G not supported in this configuration."));
11426 g_switch_value = 0;
11429 if (mips_abi == NO_ABI)
11430 mips_abi = MIPS_DEFAULT_ABI;
11432 /* The following code determines the architecture and register size.
11433 Similar code was added to GCC 3.3 (see override_options() in
11434 config/mips/mips.c). The GAS and GCC code should be kept in sync
11435 as much as possible. */
11437 if (mips_arch_string != 0)
11438 arch_info = mips_parse_cpu ("-march", mips_arch_string);
11440 if (file_mips_isa != ISA_UNKNOWN)
11442 /* Handle -mipsN. At this point, file_mips_isa contains the
11443 ISA level specified by -mipsN, while arch_info->isa contains
11444 the -march selection (if any). */
11445 if (arch_info != 0)
11447 /* -march takes precedence over -mipsN, since it is more descriptive.
11448 There's no harm in specifying both as long as the ISA levels
11449 are the same. */
11450 if (file_mips_isa != arch_info->isa)
11451 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11452 mips_cpu_info_from_isa (file_mips_isa)->name,
11453 mips_cpu_info_from_isa (arch_info->isa)->name);
11455 else
11456 arch_info = mips_cpu_info_from_isa (file_mips_isa);
11459 if (arch_info == 0)
11460 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11462 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11463 as_bad ("-march=%s is not compatible with the selected ABI",
11464 arch_info->name);
11466 mips_set_architecture (arch_info);
11468 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11469 if (mips_tune_string != 0)
11470 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11472 if (tune_info == 0)
11473 mips_set_tune (arch_info);
11474 else
11475 mips_set_tune (tune_info);
11477 if (file_mips_gp32 >= 0)
11479 /* The user specified the size of the integer registers. Make sure
11480 it agrees with the ABI and ISA. */
11481 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11482 as_bad (_("-mgp64 used with a 32-bit processor"));
11483 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11484 as_bad (_("-mgp32 used with a 64-bit ABI"));
11485 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11486 as_bad (_("-mgp64 used with a 32-bit ABI"));
11488 else
11490 /* Infer the integer register size from the ABI and processor.
11491 Restrict ourselves to 32-bit registers if that's all the
11492 processor has, or if the ABI cannot handle 64-bit registers. */
11493 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11494 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11497 switch (file_mips_fp32)
11499 default:
11500 case -1:
11501 /* No user specified float register size.
11502 ??? GAS treats single-float processors as though they had 64-bit
11503 float registers (although it complains when double-precision
11504 instructions are used). As things stand, saying they have 32-bit
11505 registers would lead to spurious "register must be even" messages.
11506 So here we assume float registers are never smaller than the
11507 integer ones. */
11508 if (file_mips_gp32 == 0)
11509 /* 64-bit integer registers implies 64-bit float registers. */
11510 file_mips_fp32 = 0;
11511 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11512 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11513 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11514 file_mips_fp32 = 0;
11515 else
11516 /* 32-bit float registers. */
11517 file_mips_fp32 = 1;
11518 break;
11520 /* The user specified the size of the float registers. Check if it
11521 agrees with the ABI and ISA. */
11522 case 0:
11523 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11524 as_bad (_("-mfp64 used with a 32-bit fpu"));
11525 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11526 && !ISA_HAS_MXHC1 (mips_opts.isa))
11527 as_warn (_("-mfp64 used with a 32-bit ABI"));
11528 break;
11529 case 1:
11530 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11531 as_warn (_("-mfp32 used with a 64-bit ABI"));
11532 break;
11535 /* End of GCC-shared inference code. */
11537 /* This flag is set when we have a 64-bit capable CPU but use only
11538 32-bit wide registers. Note that EABI does not use it. */
11539 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11540 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11541 || mips_abi == O32_ABI))
11542 mips_32bitmode = 1;
11544 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11545 as_bad (_("trap exception not supported at ISA 1"));
11547 /* If the selected architecture includes support for ASEs, enable
11548 generation of code for them. */
11549 if (mips_opts.mips16 == -1)
11550 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11551 if (mips_opts.ase_mips3d == -1)
11552 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11553 && file_mips_fp32 == 0) ? 1 : 0;
11554 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11555 as_bad (_("-mfp32 used with -mips3d"));
11557 if (mips_opts.ase_mdmx == -1)
11558 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11559 && file_mips_fp32 == 0) ? 1 : 0;
11560 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11561 as_bad (_("-mfp32 used with -mdmx"));
11563 if (mips_opts.ase_smartmips == -1)
11564 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11565 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11566 as_warn ("%s ISA does not support SmartMIPS",
11567 mips_cpu_info_from_isa (mips_opts.isa)->name);
11569 if (mips_opts.ase_dsp == -1)
11570 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11571 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11572 as_warn ("%s ISA does not support DSP ASE",
11573 mips_cpu_info_from_isa (mips_opts.isa)->name);
11575 if (mips_opts.ase_dspr2 == -1)
11577 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11578 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11580 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11581 as_warn ("%s ISA does not support DSP R2 ASE",
11582 mips_cpu_info_from_isa (mips_opts.isa)->name);
11584 if (mips_opts.ase_mt == -1)
11585 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11586 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11587 as_warn ("%s ISA does not support MT ASE",
11588 mips_cpu_info_from_isa (mips_opts.isa)->name);
11590 file_mips_isa = mips_opts.isa;
11591 file_ase_mips16 = mips_opts.mips16;
11592 file_ase_mips3d = mips_opts.ase_mips3d;
11593 file_ase_mdmx = mips_opts.ase_mdmx;
11594 file_ase_smartmips = mips_opts.ase_smartmips;
11595 file_ase_dsp = mips_opts.ase_dsp;
11596 file_ase_dspr2 = mips_opts.ase_dspr2;
11597 file_ase_mt = mips_opts.ase_mt;
11598 mips_opts.gp32 = file_mips_gp32;
11599 mips_opts.fp32 = file_mips_fp32;
11601 if (mips_flag_mdebug < 0)
11603 #ifdef OBJ_MAYBE_ECOFF
11604 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11605 mips_flag_mdebug = 1;
11606 else
11607 #endif /* OBJ_MAYBE_ECOFF */
11608 mips_flag_mdebug = 0;
11612 void
11613 mips_init_after_args (void)
11615 /* initialize opcodes */
11616 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11617 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11620 long
11621 md_pcrel_from (fixS *fixP)
11623 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11624 switch (fixP->fx_r_type)
11626 case BFD_RELOC_16_PCREL_S2:
11627 case BFD_RELOC_MIPS_JMP:
11628 /* Return the address of the delay slot. */
11629 return addr + 4;
11630 default:
11631 /* We have no relocation type for PC relative MIPS16 instructions. */
11632 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11633 as_bad_where (fixP->fx_file, fixP->fx_line,
11634 _("PC relative MIPS16 instruction references a different section"));
11635 return addr;
11639 /* This is called before the symbol table is processed. In order to
11640 work with gcc when using mips-tfile, we must keep all local labels.
11641 However, in other cases, we want to discard them. If we were
11642 called with -g, but we didn't see any debugging information, it may
11643 mean that gcc is smuggling debugging information through to
11644 mips-tfile, in which case we must generate all local labels. */
11646 void
11647 mips_frob_file_before_adjust (void)
11649 #ifndef NO_ECOFF_DEBUGGING
11650 if (ECOFF_DEBUGGING
11651 && mips_debug != 0
11652 && ! ecoff_debugging_seen)
11653 flag_keep_locals = 1;
11654 #endif
11657 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11658 the corresponding LO16 reloc. This is called before md_apply_fix and
11659 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
11660 relocation operators.
11662 For our purposes, a %lo() expression matches a %got() or %hi()
11663 expression if:
11665 (a) it refers to the same symbol; and
11666 (b) the offset applied in the %lo() expression is no lower than
11667 the offset applied in the %got() or %hi().
11669 (b) allows us to cope with code like:
11671 lui $4,%hi(foo)
11672 lh $4,%lo(foo+2)($4)
11674 ...which is legal on RELA targets, and has a well-defined behaviour
11675 if the user knows that adding 2 to "foo" will not induce a carry to
11676 the high 16 bits.
11678 When several %lo()s match a particular %got() or %hi(), we use the
11679 following rules to distinguish them:
11681 (1) %lo()s with smaller offsets are a better match than %lo()s with
11682 higher offsets.
11684 (2) %lo()s with no matching %got() or %hi() are better than those
11685 that already have a matching %got() or %hi().
11687 (3) later %lo()s are better than earlier %lo()s.
11689 These rules are applied in order.
11691 (1) means, among other things, that %lo()s with identical offsets are
11692 chosen if they exist.
11694 (2) means that we won't associate several high-part relocations with
11695 the same low-part relocation unless there's no alternative. Having
11696 several high parts for the same low part is a GNU extension; this rule
11697 allows careful users to avoid it.
11699 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
11700 with the last high-part relocation being at the front of the list.
11701 It therefore makes sense to choose the last matching low-part
11702 relocation, all other things being equal. It's also easier
11703 to code that way. */
11705 void
11706 mips_frob_file (void)
11708 struct mips_hi_fixup *l;
11710 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11712 segment_info_type *seginfo;
11713 bfd_boolean matched_lo_p;
11714 fixS **hi_pos, **lo_pos, **pos;
11716 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11718 /* If a GOT16 relocation turns out to be against a global symbol,
11719 there isn't supposed to be a matching LO. */
11720 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11721 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11722 continue;
11724 /* Check quickly whether the next fixup happens to be a matching %lo. */
11725 if (fixup_has_matching_lo_p (l->fixp))
11726 continue;
11728 seginfo = seg_info (l->seg);
11730 /* Set HI_POS to the position of this relocation in the chain.
11731 Set LO_POS to the position of the chosen low-part relocation.
11732 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11733 relocation that matches an immediately-preceding high-part
11734 relocation. */
11735 hi_pos = NULL;
11736 lo_pos = NULL;
11737 matched_lo_p = FALSE;
11738 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11740 if (*pos == l->fixp)
11741 hi_pos = pos;
11743 if (((*pos)->fx_r_type == BFD_RELOC_LO16
11744 || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11745 && (*pos)->fx_addsy == l->fixp->fx_addsy
11746 && (*pos)->fx_offset >= l->fixp->fx_offset
11747 && (lo_pos == NULL
11748 || (*pos)->fx_offset < (*lo_pos)->fx_offset
11749 || (!matched_lo_p
11750 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11751 lo_pos = pos;
11753 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11754 && fixup_has_matching_lo_p (*pos));
11757 /* If we found a match, remove the high-part relocation from its
11758 current position and insert it before the low-part relocation.
11759 Make the offsets match so that fixup_has_matching_lo_p()
11760 will return true.
11762 We don't warn about unmatched high-part relocations since some
11763 versions of gcc have been known to emit dead "lui ...%hi(...)"
11764 instructions. */
11765 if (lo_pos != NULL)
11767 l->fixp->fx_offset = (*lo_pos)->fx_offset;
11768 if (l->fixp->fx_next != *lo_pos)
11770 *hi_pos = l->fixp->fx_next;
11771 l->fixp->fx_next = *lo_pos;
11772 *lo_pos = l->fixp;
11778 /* We may have combined relocations without symbols in the N32/N64 ABI.
11779 We have to prevent gas from dropping them. */
11782 mips_force_relocation (fixS *fixp)
11784 if (generic_force_reloc (fixp))
11785 return 1;
11787 if (HAVE_NEWABI
11788 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11789 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11790 || fixp->fx_r_type == BFD_RELOC_HI16_S
11791 || fixp->fx_r_type == BFD_RELOC_LO16))
11792 return 1;
11794 return 0;
11797 /* Apply a fixup to the object file. */
11799 void
11800 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11802 bfd_byte *buf;
11803 long insn;
11804 reloc_howto_type *howto;
11806 /* We ignore generic BFD relocations we don't know about. */
11807 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11808 if (! howto)
11809 return;
11811 assert (fixP->fx_size == 4
11812 || fixP->fx_r_type == BFD_RELOC_16
11813 || fixP->fx_r_type == BFD_RELOC_64
11814 || fixP->fx_r_type == BFD_RELOC_CTOR
11815 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11816 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11817 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11818 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
11820 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11822 assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11824 /* Don't treat parts of a composite relocation as done. There are two
11825 reasons for this:
11827 (1) The second and third parts will be against 0 (RSS_UNDEF) but
11828 should nevertheless be emitted if the first part is.
11830 (2) In normal usage, composite relocations are never assembly-time
11831 constants. The easiest way of dealing with the pathological
11832 exceptions is to generate a relocation against STN_UNDEF and
11833 leave everything up to the linker. */
11834 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
11835 fixP->fx_done = 1;
11837 switch (fixP->fx_r_type)
11839 case BFD_RELOC_MIPS_TLS_GD:
11840 case BFD_RELOC_MIPS_TLS_LDM:
11841 case BFD_RELOC_MIPS_TLS_DTPREL32:
11842 case BFD_RELOC_MIPS_TLS_DTPREL64:
11843 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11844 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11845 case BFD_RELOC_MIPS_TLS_GOTTPREL:
11846 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11847 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11848 S_SET_THREAD_LOCAL (fixP->fx_addsy);
11849 /* fall through */
11851 case BFD_RELOC_MIPS_JMP:
11852 case BFD_RELOC_MIPS_SHIFT5:
11853 case BFD_RELOC_MIPS_SHIFT6:
11854 case BFD_RELOC_MIPS_GOT_DISP:
11855 case BFD_RELOC_MIPS_GOT_PAGE:
11856 case BFD_RELOC_MIPS_GOT_OFST:
11857 case BFD_RELOC_MIPS_SUB:
11858 case BFD_RELOC_MIPS_INSERT_A:
11859 case BFD_RELOC_MIPS_INSERT_B:
11860 case BFD_RELOC_MIPS_DELETE:
11861 case BFD_RELOC_MIPS_HIGHEST:
11862 case BFD_RELOC_MIPS_HIGHER:
11863 case BFD_RELOC_MIPS_SCN_DISP:
11864 case BFD_RELOC_MIPS_REL16:
11865 case BFD_RELOC_MIPS_RELGOT:
11866 case BFD_RELOC_MIPS_JALR:
11867 case BFD_RELOC_HI16:
11868 case BFD_RELOC_HI16_S:
11869 case BFD_RELOC_GPREL16:
11870 case BFD_RELOC_MIPS_LITERAL:
11871 case BFD_RELOC_MIPS_CALL16:
11872 case BFD_RELOC_MIPS_GOT16:
11873 case BFD_RELOC_GPREL32:
11874 case BFD_RELOC_MIPS_GOT_HI16:
11875 case BFD_RELOC_MIPS_GOT_LO16:
11876 case BFD_RELOC_MIPS_CALL_HI16:
11877 case BFD_RELOC_MIPS_CALL_LO16:
11878 case BFD_RELOC_MIPS16_GPREL:
11879 case BFD_RELOC_MIPS16_HI16:
11880 case BFD_RELOC_MIPS16_HI16_S:
11881 case BFD_RELOC_MIPS16_JMP:
11882 /* Nothing needed to do. The value comes from the reloc entry. */
11883 break;
11885 case BFD_RELOC_64:
11886 /* This is handled like BFD_RELOC_32, but we output a sign
11887 extended value if we are only 32 bits. */
11888 if (fixP->fx_done)
11890 if (8 <= sizeof (valueT))
11891 md_number_to_chars ((char *) buf, *valP, 8);
11892 else
11894 valueT hiv;
11896 if ((*valP & 0x80000000) != 0)
11897 hiv = 0xffffffff;
11898 else
11899 hiv = 0;
11900 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11901 *valP, 4);
11902 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11903 hiv, 4);
11906 break;
11908 case BFD_RELOC_RVA:
11909 case BFD_RELOC_32:
11910 case BFD_RELOC_16:
11911 /* If we are deleting this reloc entry, we must fill in the
11912 value now. This can happen if we have a .word which is not
11913 resolved when it appears but is later defined. */
11914 if (fixP->fx_done)
11915 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
11916 break;
11918 case BFD_RELOC_LO16:
11919 case BFD_RELOC_MIPS16_LO16:
11920 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11921 may be safe to remove, but if so it's not obvious. */
11922 /* When handling an embedded PIC switch statement, we can wind
11923 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11924 if (fixP->fx_done)
11926 if (*valP + 0x8000 > 0xffff)
11927 as_bad_where (fixP->fx_file, fixP->fx_line,
11928 _("relocation overflow"));
11929 if (target_big_endian)
11930 buf += 2;
11931 md_number_to_chars ((char *) buf, *valP, 2);
11933 break;
11935 case BFD_RELOC_16_PCREL_S2:
11936 if ((*valP & 0x3) != 0)
11937 as_bad_where (fixP->fx_file, fixP->fx_line,
11938 _("Branch to misaligned address (%lx)"), (long) *valP);
11940 /* We need to save the bits in the instruction since fixup_segment()
11941 might be deleting the relocation entry (i.e., a branch within
11942 the current segment). */
11943 if (! fixP->fx_done)
11944 break;
11946 /* Update old instruction data. */
11947 if (target_big_endian)
11948 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11949 else
11950 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11952 if (*valP + 0x20000 <= 0x3ffff)
11954 insn |= (*valP >> 2) & 0xffff;
11955 md_number_to_chars ((char *) buf, insn, 4);
11957 else if (mips_pic == NO_PIC
11958 && fixP->fx_done
11959 && fixP->fx_frag->fr_address >= text_section->vma
11960 && (fixP->fx_frag->fr_address
11961 < text_section->vma + bfd_get_section_size (text_section))
11962 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
11963 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
11964 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11966 /* The branch offset is too large. If this is an
11967 unconditional branch, and we are not generating PIC code,
11968 we can convert it to an absolute jump instruction. */
11969 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
11970 insn = 0x0c000000; /* jal */
11971 else
11972 insn = 0x08000000; /* j */
11973 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11974 fixP->fx_done = 0;
11975 fixP->fx_addsy = section_symbol (text_section);
11976 *valP += md_pcrel_from (fixP);
11977 md_number_to_chars ((char *) buf, insn, 4);
11979 else
11981 /* If we got here, we have branch-relaxation disabled,
11982 and there's nothing we can do to fix this instruction
11983 without turning it into a longer sequence. */
11984 as_bad_where (fixP->fx_file, fixP->fx_line,
11985 _("Branch out of range"));
11987 break;
11989 case BFD_RELOC_VTABLE_INHERIT:
11990 fixP->fx_done = 0;
11991 if (fixP->fx_addsy
11992 && !S_IS_DEFINED (fixP->fx_addsy)
11993 && !S_IS_WEAK (fixP->fx_addsy))
11994 S_SET_WEAK (fixP->fx_addsy);
11995 break;
11997 case BFD_RELOC_VTABLE_ENTRY:
11998 fixP->fx_done = 0;
11999 break;
12001 default:
12002 internalError ();
12005 /* Remember value for tc_gen_reloc. */
12006 fixP->fx_addnumber = *valP;
12009 static symbolS *
12010 get_symbol (void)
12012 int c;
12013 char *name;
12014 symbolS *p;
12016 name = input_line_pointer;
12017 c = get_symbol_end ();
12018 p = (symbolS *) symbol_find_or_make (name);
12019 *input_line_pointer = c;
12020 return p;
12023 /* Align the current frag to a given power of two. If a particular
12024 fill byte should be used, FILL points to an integer that contains
12025 that byte, otherwise FILL is null.
12027 The MIPS assembler also automatically adjusts any preceding
12028 label. */
12030 static void
12031 mips_align (int to, int *fill, symbolS *label)
12033 mips_emit_delays ();
12034 mips_record_mips16_mode ();
12035 if (fill == NULL && subseg_text_p (now_seg))
12036 frag_align_code (to, 0);
12037 else
12038 frag_align (to, fill ? *fill : 0, 0);
12039 record_alignment (now_seg, to);
12040 if (label != NULL)
12042 assert (S_GET_SEGMENT (label) == now_seg);
12043 symbol_set_frag (label, frag_now);
12044 S_SET_VALUE (label, (valueT) frag_now_fix ());
12048 /* Align to a given power of two. .align 0 turns off the automatic
12049 alignment used by the data creating pseudo-ops. */
12051 static void
12052 s_align (int x ATTRIBUTE_UNUSED)
12054 int temp, fill_value, *fill_ptr;
12055 long max_alignment = 28;
12057 /* o Note that the assembler pulls down any immediately preceding label
12058 to the aligned address.
12059 o It's not documented but auto alignment is reinstated by
12060 a .align pseudo instruction.
12061 o Note also that after auto alignment is turned off the mips assembler
12062 issues an error on attempt to assemble an improperly aligned data item.
12063 We don't. */
12065 temp = get_absolute_expression ();
12066 if (temp > max_alignment)
12067 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12068 else if (temp < 0)
12070 as_warn (_("Alignment negative: 0 assumed."));
12071 temp = 0;
12073 if (*input_line_pointer == ',')
12075 ++input_line_pointer;
12076 fill_value = get_absolute_expression ();
12077 fill_ptr = &fill_value;
12079 else
12080 fill_ptr = 0;
12081 if (temp)
12083 segment_info_type *si = seg_info (now_seg);
12084 struct insn_label_list *l = si->label_list;
12085 /* Auto alignment should be switched on by next section change. */
12086 auto_align = 1;
12087 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12089 else
12091 auto_align = 0;
12094 demand_empty_rest_of_line ();
12097 static void
12098 s_change_sec (int sec)
12100 segT seg;
12102 #ifdef OBJ_ELF
12103 /* The ELF backend needs to know that we are changing sections, so
12104 that .previous works correctly. We could do something like check
12105 for an obj_section_change_hook macro, but that might be confusing
12106 as it would not be appropriate to use it in the section changing
12107 functions in read.c, since obj-elf.c intercepts those. FIXME:
12108 This should be cleaner, somehow. */
12109 if (IS_ELF)
12110 obj_elf_section_change_hook ();
12111 #endif
12113 mips_emit_delays ();
12114 switch (sec)
12116 case 't':
12117 s_text (0);
12118 break;
12119 case 'd':
12120 s_data (0);
12121 break;
12122 case 'b':
12123 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12124 demand_empty_rest_of_line ();
12125 break;
12127 case 'r':
12128 seg = subseg_new (RDATA_SECTION_NAME,
12129 (subsegT) get_absolute_expression ());
12130 if (IS_ELF)
12132 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12133 | SEC_READONLY | SEC_RELOC
12134 | SEC_DATA));
12135 if (strcmp (TARGET_OS, "elf") != 0)
12136 record_alignment (seg, 4);
12138 demand_empty_rest_of_line ();
12139 break;
12141 case 's':
12142 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12143 if (IS_ELF)
12145 bfd_set_section_flags (stdoutput, seg,
12146 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12147 if (strcmp (TARGET_OS, "elf") != 0)
12148 record_alignment (seg, 4);
12150 demand_empty_rest_of_line ();
12151 break;
12154 auto_align = 1;
12157 void
12158 s_change_section (int ignore ATTRIBUTE_UNUSED)
12160 #ifdef OBJ_ELF
12161 char *section_name;
12162 char c;
12163 char next_c = 0;
12164 int section_type;
12165 int section_flag;
12166 int section_entry_size;
12167 int section_alignment;
12169 if (!IS_ELF)
12170 return;
12172 section_name = input_line_pointer;
12173 c = get_symbol_end ();
12174 if (c)
12175 next_c = *(input_line_pointer + 1);
12177 /* Do we have .section Name<,"flags">? */
12178 if (c != ',' || (c == ',' && next_c == '"'))
12180 /* just after name is now '\0'. */
12181 *input_line_pointer = c;
12182 input_line_pointer = section_name;
12183 obj_elf_section (ignore);
12184 return;
12186 input_line_pointer++;
12188 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12189 if (c == ',')
12190 section_type = get_absolute_expression ();
12191 else
12192 section_type = 0;
12193 if (*input_line_pointer++ == ',')
12194 section_flag = get_absolute_expression ();
12195 else
12196 section_flag = 0;
12197 if (*input_line_pointer++ == ',')
12198 section_entry_size = get_absolute_expression ();
12199 else
12200 section_entry_size = 0;
12201 if (*input_line_pointer++ == ',')
12202 section_alignment = get_absolute_expression ();
12203 else
12204 section_alignment = 0;
12206 section_name = xstrdup (section_name);
12208 /* When using the generic form of .section (as implemented by obj-elf.c),
12209 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12210 traditionally had to fall back on the more common @progbits instead.
12212 There's nothing really harmful in this, since bfd will correct
12213 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
12214 means that, for backwards compatibility, the special_section entries
12215 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12217 Even so, we shouldn't force users of the MIPS .section syntax to
12218 incorrectly label the sections as SHT_PROGBITS. The best compromise
12219 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12220 generic type-checking code. */
12221 if (section_type == SHT_MIPS_DWARF)
12222 section_type = SHT_PROGBITS;
12224 obj_elf_change_section (section_name, section_type, section_flag,
12225 section_entry_size, 0, 0, 0);
12227 if (now_seg->name != section_name)
12228 free (section_name);
12229 #endif /* OBJ_ELF */
12232 void
12233 mips_enable_auto_align (void)
12235 auto_align = 1;
12238 static void
12239 s_cons (int log_size)
12241 segment_info_type *si = seg_info (now_seg);
12242 struct insn_label_list *l = si->label_list;
12243 symbolS *label;
12245 label = l != NULL ? l->label : NULL;
12246 mips_emit_delays ();
12247 if (log_size > 0 && auto_align)
12248 mips_align (log_size, 0, label);
12249 mips_clear_insn_labels ();
12250 cons (1 << log_size);
12253 static void
12254 s_float_cons (int type)
12256 segment_info_type *si = seg_info (now_seg);
12257 struct insn_label_list *l = si->label_list;
12258 symbolS *label;
12260 label = l != NULL ? l->label : NULL;
12262 mips_emit_delays ();
12264 if (auto_align)
12266 if (type == 'd')
12267 mips_align (3, 0, label);
12268 else
12269 mips_align (2, 0, label);
12272 mips_clear_insn_labels ();
12274 float_cons (type);
12277 /* Handle .globl. We need to override it because on Irix 5 you are
12278 permitted to say
12279 .globl foo .text
12280 where foo is an undefined symbol, to mean that foo should be
12281 considered to be the address of a function. */
12283 static void
12284 s_mips_globl (int x ATTRIBUTE_UNUSED)
12286 char *name;
12287 int c;
12288 symbolS *symbolP;
12289 flagword flag;
12293 name = input_line_pointer;
12294 c = get_symbol_end ();
12295 symbolP = symbol_find_or_make (name);
12296 S_SET_EXTERNAL (symbolP);
12298 *input_line_pointer = c;
12299 SKIP_WHITESPACE ();
12301 /* On Irix 5, every global symbol that is not explicitly labelled as
12302 being a function is apparently labelled as being an object. */
12303 flag = BSF_OBJECT;
12305 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12306 && (*input_line_pointer != ','))
12308 char *secname;
12309 asection *sec;
12311 secname = input_line_pointer;
12312 c = get_symbol_end ();
12313 sec = bfd_get_section_by_name (stdoutput, secname);
12314 if (sec == NULL)
12315 as_bad (_("%s: no such section"), secname);
12316 *input_line_pointer = c;
12318 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12319 flag = BSF_FUNCTION;
12322 symbol_get_bfdsym (symbolP)->flags |= flag;
12324 c = *input_line_pointer;
12325 if (c == ',')
12327 input_line_pointer++;
12328 SKIP_WHITESPACE ();
12329 if (is_end_of_line[(unsigned char) *input_line_pointer])
12330 c = '\n';
12333 while (c == ',');
12335 demand_empty_rest_of_line ();
12338 static void
12339 s_option (int x ATTRIBUTE_UNUSED)
12341 char *opt;
12342 char c;
12344 opt = input_line_pointer;
12345 c = get_symbol_end ();
12347 if (*opt == 'O')
12349 /* FIXME: What does this mean? */
12351 else if (strncmp (opt, "pic", 3) == 0)
12353 int i;
12355 i = atoi (opt + 3);
12356 if (i == 0)
12357 mips_pic = NO_PIC;
12358 else if (i == 2)
12360 mips_pic = SVR4_PIC;
12361 mips_abicalls = TRUE;
12363 else
12364 as_bad (_(".option pic%d not supported"), i);
12366 if (mips_pic == SVR4_PIC)
12368 if (g_switch_seen && g_switch_value != 0)
12369 as_warn (_("-G may not be used with SVR4 PIC code"));
12370 g_switch_value = 0;
12371 bfd_set_gp_size (stdoutput, 0);
12374 else
12375 as_warn (_("Unrecognized option \"%s\""), opt);
12377 *input_line_pointer = c;
12378 demand_empty_rest_of_line ();
12381 /* This structure is used to hold a stack of .set values. */
12383 struct mips_option_stack
12385 struct mips_option_stack *next;
12386 struct mips_set_options options;
12389 static struct mips_option_stack *mips_opts_stack;
12391 /* Handle the .set pseudo-op. */
12393 static void
12394 s_mipsset (int x ATTRIBUTE_UNUSED)
12396 char *name = input_line_pointer, ch;
12398 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12399 ++input_line_pointer;
12400 ch = *input_line_pointer;
12401 *input_line_pointer = '\0';
12403 if (strcmp (name, "reorder") == 0)
12405 if (mips_opts.noreorder)
12406 end_noreorder ();
12408 else if (strcmp (name, "noreorder") == 0)
12410 if (!mips_opts.noreorder)
12411 start_noreorder ();
12413 else if (strncmp (name, "at=", 3) == 0)
12415 char *s = name + 3;
12417 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12418 as_bad (_("Unrecognized register name `%s'"), s);
12420 else if (strcmp (name, "at") == 0)
12422 mips_opts.at = ATREG;
12424 else if (strcmp (name, "noat") == 0)
12426 mips_opts.at = ZERO;
12428 else if (strcmp (name, "macro") == 0)
12430 mips_opts.warn_about_macros = 0;
12432 else if (strcmp (name, "nomacro") == 0)
12434 if (mips_opts.noreorder == 0)
12435 as_bad (_("`noreorder' must be set before `nomacro'"));
12436 mips_opts.warn_about_macros = 1;
12438 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12440 mips_opts.nomove = 0;
12442 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12444 mips_opts.nomove = 1;
12446 else if (strcmp (name, "bopt") == 0)
12448 mips_opts.nobopt = 0;
12450 else if (strcmp (name, "nobopt") == 0)
12452 mips_opts.nobopt = 1;
12454 else if (strcmp (name, "gp=default") == 0)
12455 mips_opts.gp32 = file_mips_gp32;
12456 else if (strcmp (name, "gp=32") == 0)
12457 mips_opts.gp32 = 1;
12458 else if (strcmp (name, "gp=64") == 0)
12460 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12461 as_warn ("%s isa does not support 64-bit registers",
12462 mips_cpu_info_from_isa (mips_opts.isa)->name);
12463 mips_opts.gp32 = 0;
12465 else if (strcmp (name, "fp=default") == 0)
12466 mips_opts.fp32 = file_mips_fp32;
12467 else if (strcmp (name, "fp=32") == 0)
12468 mips_opts.fp32 = 1;
12469 else if (strcmp (name, "fp=64") == 0)
12471 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12472 as_warn ("%s isa does not support 64-bit floating point registers",
12473 mips_cpu_info_from_isa (mips_opts.isa)->name);
12474 mips_opts.fp32 = 0;
12476 else if (strcmp (name, "mips16") == 0
12477 || strcmp (name, "MIPS-16") == 0)
12478 mips_opts.mips16 = 1;
12479 else if (strcmp (name, "nomips16") == 0
12480 || strcmp (name, "noMIPS-16") == 0)
12481 mips_opts.mips16 = 0;
12482 else if (strcmp (name, "smartmips") == 0)
12484 if (!ISA_SUPPORTS_SMARTMIPS)
12485 as_warn ("%s ISA does not support SmartMIPS ASE",
12486 mips_cpu_info_from_isa (mips_opts.isa)->name);
12487 mips_opts.ase_smartmips = 1;
12489 else if (strcmp (name, "nosmartmips") == 0)
12490 mips_opts.ase_smartmips = 0;
12491 else if (strcmp (name, "mips3d") == 0)
12492 mips_opts.ase_mips3d = 1;
12493 else if (strcmp (name, "nomips3d") == 0)
12494 mips_opts.ase_mips3d = 0;
12495 else if (strcmp (name, "mdmx") == 0)
12496 mips_opts.ase_mdmx = 1;
12497 else if (strcmp (name, "nomdmx") == 0)
12498 mips_opts.ase_mdmx = 0;
12499 else if (strcmp (name, "dsp") == 0)
12501 if (!ISA_SUPPORTS_DSP_ASE)
12502 as_warn ("%s ISA does not support DSP ASE",
12503 mips_cpu_info_from_isa (mips_opts.isa)->name);
12504 mips_opts.ase_dsp = 1;
12505 mips_opts.ase_dspr2 = 0;
12507 else if (strcmp (name, "nodsp") == 0)
12509 mips_opts.ase_dsp = 0;
12510 mips_opts.ase_dspr2 = 0;
12512 else if (strcmp (name, "dspr2") == 0)
12514 if (!ISA_SUPPORTS_DSPR2_ASE)
12515 as_warn ("%s ISA does not support DSP R2 ASE",
12516 mips_cpu_info_from_isa (mips_opts.isa)->name);
12517 mips_opts.ase_dspr2 = 1;
12518 mips_opts.ase_dsp = 1;
12520 else if (strcmp (name, "nodspr2") == 0)
12522 mips_opts.ase_dspr2 = 0;
12523 mips_opts.ase_dsp = 0;
12525 else if (strcmp (name, "mt") == 0)
12527 if (!ISA_SUPPORTS_MT_ASE)
12528 as_warn ("%s ISA does not support MT ASE",
12529 mips_cpu_info_from_isa (mips_opts.isa)->name);
12530 mips_opts.ase_mt = 1;
12532 else if (strcmp (name, "nomt") == 0)
12533 mips_opts.ase_mt = 0;
12534 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12536 int reset = 0;
12538 /* Permit the user to change the ISA and architecture on the fly.
12539 Needless to say, misuse can cause serious problems. */
12540 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12542 reset = 1;
12543 mips_opts.isa = file_mips_isa;
12544 mips_opts.arch = file_mips_arch;
12546 else if (strncmp (name, "arch=", 5) == 0)
12548 const struct mips_cpu_info *p;
12550 p = mips_parse_cpu("internal use", name + 5);
12551 if (!p)
12552 as_bad (_("unknown architecture %s"), name + 5);
12553 else
12555 mips_opts.arch = p->cpu;
12556 mips_opts.isa = p->isa;
12559 else if (strncmp (name, "mips", 4) == 0)
12561 const struct mips_cpu_info *p;
12563 p = mips_parse_cpu("internal use", name);
12564 if (!p)
12565 as_bad (_("unknown ISA level %s"), name + 4);
12566 else
12568 mips_opts.arch = p->cpu;
12569 mips_opts.isa = p->isa;
12572 else
12573 as_bad (_("unknown ISA or architecture %s"), name);
12575 switch (mips_opts.isa)
12577 case 0:
12578 break;
12579 case ISA_MIPS1:
12580 case ISA_MIPS2:
12581 case ISA_MIPS32:
12582 case ISA_MIPS32R2:
12583 mips_opts.gp32 = 1;
12584 mips_opts.fp32 = 1;
12585 break;
12586 case ISA_MIPS3:
12587 case ISA_MIPS4:
12588 case ISA_MIPS5:
12589 case ISA_MIPS64:
12590 case ISA_MIPS64R2:
12591 mips_opts.gp32 = 0;
12592 mips_opts.fp32 = 0;
12593 break;
12594 default:
12595 as_bad (_("unknown ISA level %s"), name + 4);
12596 break;
12598 if (reset)
12600 mips_opts.gp32 = file_mips_gp32;
12601 mips_opts.fp32 = file_mips_fp32;
12604 else if (strcmp (name, "autoextend") == 0)
12605 mips_opts.noautoextend = 0;
12606 else if (strcmp (name, "noautoextend") == 0)
12607 mips_opts.noautoextend = 1;
12608 else if (strcmp (name, "push") == 0)
12610 struct mips_option_stack *s;
12612 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12613 s->next = mips_opts_stack;
12614 s->options = mips_opts;
12615 mips_opts_stack = s;
12617 else if (strcmp (name, "pop") == 0)
12619 struct mips_option_stack *s;
12621 s = mips_opts_stack;
12622 if (s == NULL)
12623 as_bad (_(".set pop with no .set push"));
12624 else
12626 /* If we're changing the reorder mode we need to handle
12627 delay slots correctly. */
12628 if (s->options.noreorder && ! mips_opts.noreorder)
12629 start_noreorder ();
12630 else if (! s->options.noreorder && mips_opts.noreorder)
12631 end_noreorder ();
12633 mips_opts = s->options;
12634 mips_opts_stack = s->next;
12635 free (s);
12638 else if (strcmp (name, "sym32") == 0)
12639 mips_opts.sym32 = TRUE;
12640 else if (strcmp (name, "nosym32") == 0)
12641 mips_opts.sym32 = FALSE;
12642 else if (strchr (name, ','))
12644 /* Generic ".set" directive; use the generic handler. */
12645 *input_line_pointer = ch;
12646 input_line_pointer = name;
12647 s_set (0);
12648 return;
12650 else
12652 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12654 *input_line_pointer = ch;
12655 demand_empty_rest_of_line ();
12658 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12659 .option pic2. It means to generate SVR4 PIC calls. */
12661 static void
12662 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12664 mips_pic = SVR4_PIC;
12665 mips_abicalls = TRUE;
12667 if (g_switch_seen && g_switch_value != 0)
12668 as_warn (_("-G may not be used with SVR4 PIC code"));
12669 g_switch_value = 0;
12671 bfd_set_gp_size (stdoutput, 0);
12672 demand_empty_rest_of_line ();
12675 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12676 PIC code. It sets the $gp register for the function based on the
12677 function address, which is in the register named in the argument.
12678 This uses a relocation against _gp_disp, which is handled specially
12679 by the linker. The result is:
12680 lui $gp,%hi(_gp_disp)
12681 addiu $gp,$gp,%lo(_gp_disp)
12682 addu $gp,$gp,.cpload argument
12683 The .cpload argument is normally $25 == $t9.
12685 The -mno-shared option changes this to:
12686 lui $gp,%hi(__gnu_local_gp)
12687 addiu $gp,$gp,%lo(__gnu_local_gp)
12688 and the argument is ignored. This saves an instruction, but the
12689 resulting code is not position independent; it uses an absolute
12690 address for __gnu_local_gp. Thus code assembled with -mno-shared
12691 can go into an ordinary executable, but not into a shared library. */
12693 static void
12694 s_cpload (int ignore ATTRIBUTE_UNUSED)
12696 expressionS ex;
12697 int reg;
12698 int in_shared;
12700 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12701 .cpload is ignored. */
12702 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12704 s_ignore (0);
12705 return;
12708 /* .cpload should be in a .set noreorder section. */
12709 if (mips_opts.noreorder == 0)
12710 as_warn (_(".cpload not in noreorder section"));
12712 reg = tc_get_register (0);
12714 /* If we need to produce a 64-bit address, we are better off using
12715 the default instruction sequence. */
12716 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12718 ex.X_op = O_symbol;
12719 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12720 "__gnu_local_gp");
12721 ex.X_op_symbol = NULL;
12722 ex.X_add_number = 0;
12724 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12725 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12727 macro_start ();
12728 macro_build_lui (&ex, mips_gp_register);
12729 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12730 mips_gp_register, BFD_RELOC_LO16);
12731 if (in_shared)
12732 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12733 mips_gp_register, reg);
12734 macro_end ();
12736 demand_empty_rest_of_line ();
12739 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12740 .cpsetup $reg1, offset|$reg2, label
12742 If offset is given, this results in:
12743 sd $gp, offset($sp)
12744 lui $gp, %hi(%neg(%gp_rel(label)))
12745 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12746 daddu $gp, $gp, $reg1
12748 If $reg2 is given, this results in:
12749 daddu $reg2, $gp, $0
12750 lui $gp, %hi(%neg(%gp_rel(label)))
12751 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12752 daddu $gp, $gp, $reg1
12753 $reg1 is normally $25 == $t9.
12755 The -mno-shared option replaces the last three instructions with
12756 lui $gp,%hi(_gp)
12757 addiu $gp,$gp,%lo(_gp) */
12759 static void
12760 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12762 expressionS ex_off;
12763 expressionS ex_sym;
12764 int reg1;
12766 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12767 We also need NewABI support. */
12768 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12770 s_ignore (0);
12771 return;
12774 reg1 = tc_get_register (0);
12775 SKIP_WHITESPACE ();
12776 if (*input_line_pointer != ',')
12778 as_bad (_("missing argument separator ',' for .cpsetup"));
12779 return;
12781 else
12782 ++input_line_pointer;
12783 SKIP_WHITESPACE ();
12784 if (*input_line_pointer == '$')
12786 mips_cpreturn_register = tc_get_register (0);
12787 mips_cpreturn_offset = -1;
12789 else
12791 mips_cpreturn_offset = get_absolute_expression ();
12792 mips_cpreturn_register = -1;
12794 SKIP_WHITESPACE ();
12795 if (*input_line_pointer != ',')
12797 as_bad (_("missing argument separator ',' for .cpsetup"));
12798 return;
12800 else
12801 ++input_line_pointer;
12802 SKIP_WHITESPACE ();
12803 expression (&ex_sym);
12805 macro_start ();
12806 if (mips_cpreturn_register == -1)
12808 ex_off.X_op = O_constant;
12809 ex_off.X_add_symbol = NULL;
12810 ex_off.X_op_symbol = NULL;
12811 ex_off.X_add_number = mips_cpreturn_offset;
12813 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12814 BFD_RELOC_LO16, SP);
12816 else
12817 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12818 mips_gp_register, 0);
12820 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12822 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12823 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12824 BFD_RELOC_HI16_S);
12826 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12827 mips_gp_register, -1, BFD_RELOC_GPREL16,
12828 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12830 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12831 mips_gp_register, reg1);
12833 else
12835 expressionS ex;
12837 ex.X_op = O_symbol;
12838 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12839 ex.X_op_symbol = NULL;
12840 ex.X_add_number = 0;
12842 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12843 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12845 macro_build_lui (&ex, mips_gp_register);
12846 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12847 mips_gp_register, BFD_RELOC_LO16);
12850 macro_end ();
12852 demand_empty_rest_of_line ();
12855 static void
12856 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12858 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12859 .cplocal is ignored. */
12860 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12862 s_ignore (0);
12863 return;
12866 mips_gp_register = tc_get_register (0);
12867 demand_empty_rest_of_line ();
12870 /* Handle the .cprestore pseudo-op. This stores $gp into a given
12871 offset from $sp. The offset is remembered, and after making a PIC
12872 call $gp is restored from that location. */
12874 static void
12875 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12877 expressionS ex;
12879 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12880 .cprestore is ignored. */
12881 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12883 s_ignore (0);
12884 return;
12887 mips_cprestore_offset = get_absolute_expression ();
12888 mips_cprestore_valid = 1;
12890 ex.X_op = O_constant;
12891 ex.X_add_symbol = NULL;
12892 ex.X_op_symbol = NULL;
12893 ex.X_add_number = mips_cprestore_offset;
12895 macro_start ();
12896 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12897 SP, HAVE_64BIT_ADDRESSES);
12898 macro_end ();
12900 demand_empty_rest_of_line ();
12903 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12904 was given in the preceding .cpsetup, it results in:
12905 ld $gp, offset($sp)
12907 If a register $reg2 was given there, it results in:
12908 daddu $gp, $reg2, $0 */
12910 static void
12911 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12913 expressionS ex;
12915 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12916 We also need NewABI support. */
12917 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12919 s_ignore (0);
12920 return;
12923 macro_start ();
12924 if (mips_cpreturn_register == -1)
12926 ex.X_op = O_constant;
12927 ex.X_add_symbol = NULL;
12928 ex.X_op_symbol = NULL;
12929 ex.X_add_number = mips_cpreturn_offset;
12931 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12933 else
12934 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12935 mips_cpreturn_register, 0);
12936 macro_end ();
12938 demand_empty_rest_of_line ();
12941 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
12942 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
12943 use in DWARF debug information. */
12945 static void
12946 s_dtprel_internal (size_t bytes)
12948 expressionS ex;
12949 char *p;
12951 expression (&ex);
12953 if (ex.X_op != O_symbol)
12955 as_bad (_("Unsupported use of %s"), (bytes == 8
12956 ? ".dtpreldword"
12957 : ".dtprelword"));
12958 ignore_rest_of_line ();
12961 p = frag_more (bytes);
12962 md_number_to_chars (p, 0, bytes);
12963 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
12964 (bytes == 8
12965 ? BFD_RELOC_MIPS_TLS_DTPREL64
12966 : BFD_RELOC_MIPS_TLS_DTPREL32));
12968 demand_empty_rest_of_line ();
12971 /* Handle .dtprelword. */
12973 static void
12974 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
12976 s_dtprel_internal (4);
12979 /* Handle .dtpreldword. */
12981 static void
12982 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
12984 s_dtprel_internal (8);
12987 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12988 code. It sets the offset to use in gp_rel relocations. */
12990 static void
12991 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12993 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12994 We also need NewABI support. */
12995 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12997 s_ignore (0);
12998 return;
13001 mips_gprel_offset = get_absolute_expression ();
13003 demand_empty_rest_of_line ();
13006 /* Handle the .gpword pseudo-op. This is used when generating PIC
13007 code. It generates a 32 bit GP relative reloc. */
13009 static void
13010 s_gpword (int ignore ATTRIBUTE_UNUSED)
13012 segment_info_type *si;
13013 struct insn_label_list *l;
13014 symbolS *label;
13015 expressionS ex;
13016 char *p;
13018 /* When not generating PIC code, this is treated as .word. */
13019 if (mips_pic != SVR4_PIC)
13021 s_cons (2);
13022 return;
13025 si = seg_info (now_seg);
13026 l = si->label_list;
13027 label = l != NULL ? l->label : NULL;
13028 mips_emit_delays ();
13029 if (auto_align)
13030 mips_align (2, 0, label);
13031 mips_clear_insn_labels ();
13033 expression (&ex);
13035 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13037 as_bad (_("Unsupported use of .gpword"));
13038 ignore_rest_of_line ();
13041 p = frag_more (4);
13042 md_number_to_chars (p, 0, 4);
13043 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13044 BFD_RELOC_GPREL32);
13046 demand_empty_rest_of_line ();
13049 static void
13050 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13052 segment_info_type *si;
13053 struct insn_label_list *l;
13054 symbolS *label;
13055 expressionS ex;
13056 char *p;
13058 /* When not generating PIC code, this is treated as .dword. */
13059 if (mips_pic != SVR4_PIC)
13061 s_cons (3);
13062 return;
13065 si = seg_info (now_seg);
13066 l = si->label_list;
13067 label = l != NULL ? l->label : NULL;
13068 mips_emit_delays ();
13069 if (auto_align)
13070 mips_align (3, 0, label);
13071 mips_clear_insn_labels ();
13073 expression (&ex);
13075 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13077 as_bad (_("Unsupported use of .gpdword"));
13078 ignore_rest_of_line ();
13081 p = frag_more (8);
13082 md_number_to_chars (p, 0, 8);
13083 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13084 BFD_RELOC_GPREL32)->fx_tcbit = 1;
13086 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13087 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13088 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13090 demand_empty_rest_of_line ();
13093 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13094 tables in SVR4 PIC code. */
13096 static void
13097 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13099 int reg;
13101 /* This is ignored when not generating SVR4 PIC code. */
13102 if (mips_pic != SVR4_PIC)
13104 s_ignore (0);
13105 return;
13108 /* Add $gp to the register named as an argument. */
13109 macro_start ();
13110 reg = tc_get_register (0);
13111 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13112 macro_end ();
13114 demand_empty_rest_of_line ();
13117 /* Handle the .insn pseudo-op. This marks instruction labels in
13118 mips16 mode. This permits the linker to handle them specially,
13119 such as generating jalx instructions when needed. We also make
13120 them odd for the duration of the assembly, in order to generate the
13121 right sort of code. We will make them even in the adjust_symtab
13122 routine, while leaving them marked. This is convenient for the
13123 debugger and the disassembler. The linker knows to make them odd
13124 again. */
13126 static void
13127 s_insn (int ignore ATTRIBUTE_UNUSED)
13129 mips16_mark_labels ();
13131 demand_empty_rest_of_line ();
13134 /* Handle a .stabn directive. We need these in order to mark a label
13135 as being a mips16 text label correctly. Sometimes the compiler
13136 will emit a label, followed by a .stabn, and then switch sections.
13137 If the label and .stabn are in mips16 mode, then the label is
13138 really a mips16 text label. */
13140 static void
13141 s_mips_stab (int type)
13143 if (type == 'n')
13144 mips16_mark_labels ();
13146 s_stab (type);
13149 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13151 static void
13152 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13154 char *name;
13155 int c;
13156 symbolS *symbolP;
13157 expressionS exp;
13159 name = input_line_pointer;
13160 c = get_symbol_end ();
13161 symbolP = symbol_find_or_make (name);
13162 S_SET_WEAK (symbolP);
13163 *input_line_pointer = c;
13165 SKIP_WHITESPACE ();
13167 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13169 if (S_IS_DEFINED (symbolP))
13171 as_bad ("ignoring attempt to redefine symbol %s",
13172 S_GET_NAME (symbolP));
13173 ignore_rest_of_line ();
13174 return;
13177 if (*input_line_pointer == ',')
13179 ++input_line_pointer;
13180 SKIP_WHITESPACE ();
13183 expression (&exp);
13184 if (exp.X_op != O_symbol)
13186 as_bad ("bad .weakext directive");
13187 ignore_rest_of_line ();
13188 return;
13190 symbol_set_value_expression (symbolP, &exp);
13193 demand_empty_rest_of_line ();
13196 /* Parse a register string into a number. Called from the ECOFF code
13197 to parse .frame. The argument is non-zero if this is the frame
13198 register, so that we can record it in mips_frame_reg. */
13201 tc_get_register (int frame)
13203 unsigned int reg;
13205 SKIP_WHITESPACE ();
13206 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13207 reg = 0;
13208 if (frame)
13210 mips_frame_reg = reg != 0 ? reg : SP;
13211 mips_frame_reg_valid = 1;
13212 mips_cprestore_valid = 0;
13214 return reg;
13217 valueT
13218 md_section_align (asection *seg, valueT addr)
13220 int align = bfd_get_section_alignment (stdoutput, seg);
13222 if (IS_ELF)
13224 /* We don't need to align ELF sections to the full alignment.
13225 However, Irix 5 may prefer that we align them at least to a 16
13226 byte boundary. We don't bother to align the sections if we
13227 are targeted for an embedded system. */
13228 if (strcmp (TARGET_OS, "elf") == 0)
13229 return addr;
13230 if (align > 4)
13231 align = 4;
13234 return ((addr + (1 << align) - 1) & (-1 << align));
13237 /* Utility routine, called from above as well. If called while the
13238 input file is still being read, it's only an approximation. (For
13239 example, a symbol may later become defined which appeared to be
13240 undefined earlier.) */
13242 static int
13243 nopic_need_relax (symbolS *sym, int before_relaxing)
13245 if (sym == 0)
13246 return 0;
13248 if (g_switch_value > 0)
13250 const char *symname;
13251 int change;
13253 /* Find out whether this symbol can be referenced off the $gp
13254 register. It can be if it is smaller than the -G size or if
13255 it is in the .sdata or .sbss section. Certain symbols can
13256 not be referenced off the $gp, although it appears as though
13257 they can. */
13258 symname = S_GET_NAME (sym);
13259 if (symname != (const char *) NULL
13260 && (strcmp (symname, "eprol") == 0
13261 || strcmp (symname, "etext") == 0
13262 || strcmp (symname, "_gp") == 0
13263 || strcmp (symname, "edata") == 0
13264 || strcmp (symname, "_fbss") == 0
13265 || strcmp (symname, "_fdata") == 0
13266 || strcmp (symname, "_ftext") == 0
13267 || strcmp (symname, "end") == 0
13268 || strcmp (symname, "_gp_disp") == 0))
13269 change = 1;
13270 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13271 && (0
13272 #ifndef NO_ECOFF_DEBUGGING
13273 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13274 && (symbol_get_obj (sym)->ecoff_extern_size
13275 <= g_switch_value))
13276 #endif
13277 /* We must defer this decision until after the whole
13278 file has been read, since there might be a .extern
13279 after the first use of this symbol. */
13280 || (before_relaxing
13281 #ifndef NO_ECOFF_DEBUGGING
13282 && symbol_get_obj (sym)->ecoff_extern_size == 0
13283 #endif
13284 && S_GET_VALUE (sym) == 0)
13285 || (S_GET_VALUE (sym) != 0
13286 && S_GET_VALUE (sym) <= g_switch_value)))
13287 change = 0;
13288 else
13290 const char *segname;
13292 segname = segment_name (S_GET_SEGMENT (sym));
13293 assert (strcmp (segname, ".lit8") != 0
13294 && strcmp (segname, ".lit4") != 0);
13295 change = (strcmp (segname, ".sdata") != 0
13296 && strcmp (segname, ".sbss") != 0
13297 && strncmp (segname, ".sdata.", 7) != 0
13298 && strncmp (segname, ".sbss.", 6) != 0
13299 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13300 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13302 return change;
13304 else
13305 /* We are not optimizing for the $gp register. */
13306 return 1;
13310 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13312 static bfd_boolean
13313 pic_need_relax (symbolS *sym, asection *segtype)
13315 asection *symsec;
13317 /* Handle the case of a symbol equated to another symbol. */
13318 while (symbol_equated_reloc_p (sym))
13320 symbolS *n;
13322 /* It's possible to get a loop here in a badly written program. */
13323 n = symbol_get_value_expression (sym)->X_add_symbol;
13324 if (n == sym)
13325 break;
13326 sym = n;
13329 if (symbol_section_p (sym))
13330 return TRUE;
13332 symsec = S_GET_SEGMENT (sym);
13334 /* This must duplicate the test in adjust_reloc_syms. */
13335 return (symsec != &bfd_und_section
13336 && symsec != &bfd_abs_section
13337 && !bfd_is_com_section (symsec)
13338 && !s_is_linkonce (sym, segtype)
13339 #ifdef OBJ_ELF
13340 /* A global or weak symbol is treated as external. */
13341 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13342 #endif
13347 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13348 extended opcode. SEC is the section the frag is in. */
13350 static int
13351 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13353 int type;
13354 const struct mips16_immed_operand *op;
13355 offsetT val;
13356 int mintiny, maxtiny;
13357 segT symsec;
13358 fragS *sym_frag;
13360 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13361 return 0;
13362 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13363 return 1;
13365 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13366 op = mips16_immed_operands;
13367 while (op->type != type)
13369 ++op;
13370 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13373 if (op->unsp)
13375 if (type == '<' || type == '>' || type == '[' || type == ']')
13377 mintiny = 1;
13378 maxtiny = 1 << op->nbits;
13380 else
13382 mintiny = 0;
13383 maxtiny = (1 << op->nbits) - 1;
13386 else
13388 mintiny = - (1 << (op->nbits - 1));
13389 maxtiny = (1 << (op->nbits - 1)) - 1;
13392 sym_frag = symbol_get_frag (fragp->fr_symbol);
13393 val = S_GET_VALUE (fragp->fr_symbol);
13394 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13396 if (op->pcrel)
13398 addressT addr;
13400 /* We won't have the section when we are called from
13401 mips_relax_frag. However, we will always have been called
13402 from md_estimate_size_before_relax first. If this is a
13403 branch to a different section, we mark it as such. If SEC is
13404 NULL, and the frag is not marked, then it must be a branch to
13405 the same section. */
13406 if (sec == NULL)
13408 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13409 return 1;
13411 else
13413 /* Must have been called from md_estimate_size_before_relax. */
13414 if (symsec != sec)
13416 fragp->fr_subtype =
13417 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13419 /* FIXME: We should support this, and let the linker
13420 catch branches and loads that are out of range. */
13421 as_bad_where (fragp->fr_file, fragp->fr_line,
13422 _("unsupported PC relative reference to different section"));
13424 return 1;
13426 if (fragp != sym_frag && sym_frag->fr_address == 0)
13427 /* Assume non-extended on the first relaxation pass.
13428 The address we have calculated will be bogus if this is
13429 a forward branch to another frag, as the forward frag
13430 will have fr_address == 0. */
13431 return 0;
13434 /* In this case, we know for sure that the symbol fragment is in
13435 the same section. If the relax_marker of the symbol fragment
13436 differs from the relax_marker of this fragment, we have not
13437 yet adjusted the symbol fragment fr_address. We want to add
13438 in STRETCH in order to get a better estimate of the address.
13439 This particularly matters because of the shift bits. */
13440 if (stretch != 0
13441 && sym_frag->relax_marker != fragp->relax_marker)
13443 fragS *f;
13445 /* Adjust stretch for any alignment frag. Note that if have
13446 been expanding the earlier code, the symbol may be
13447 defined in what appears to be an earlier frag. FIXME:
13448 This doesn't handle the fr_subtype field, which specifies
13449 a maximum number of bytes to skip when doing an
13450 alignment. */
13451 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13453 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13455 if (stretch < 0)
13456 stretch = - ((- stretch)
13457 & ~ ((1 << (int) f->fr_offset) - 1));
13458 else
13459 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13460 if (stretch == 0)
13461 break;
13464 if (f != NULL)
13465 val += stretch;
13468 addr = fragp->fr_address + fragp->fr_fix;
13470 /* The base address rules are complicated. The base address of
13471 a branch is the following instruction. The base address of a
13472 PC relative load or add is the instruction itself, but if it
13473 is in a delay slot (in which case it can not be extended) use
13474 the address of the instruction whose delay slot it is in. */
13475 if (type == 'p' || type == 'q')
13477 addr += 2;
13479 /* If we are currently assuming that this frag should be
13480 extended, then, the current address is two bytes
13481 higher. */
13482 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13483 addr += 2;
13485 /* Ignore the low bit in the target, since it will be set
13486 for a text label. */
13487 if ((val & 1) != 0)
13488 --val;
13490 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13491 addr -= 4;
13492 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13493 addr -= 2;
13495 val -= addr & ~ ((1 << op->shift) - 1);
13497 /* Branch offsets have an implicit 0 in the lowest bit. */
13498 if (type == 'p' || type == 'q')
13499 val /= 2;
13501 /* If any of the shifted bits are set, we must use an extended
13502 opcode. If the address depends on the size of this
13503 instruction, this can lead to a loop, so we arrange to always
13504 use an extended opcode. We only check this when we are in
13505 the main relaxation loop, when SEC is NULL. */
13506 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13508 fragp->fr_subtype =
13509 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13510 return 1;
13513 /* If we are about to mark a frag as extended because the value
13514 is precisely maxtiny + 1, then there is a chance of an
13515 infinite loop as in the following code:
13516 la $4,foo
13517 .skip 1020
13518 .align 2
13519 foo:
13520 In this case when the la is extended, foo is 0x3fc bytes
13521 away, so the la can be shrunk, but then foo is 0x400 away, so
13522 the la must be extended. To avoid this loop, we mark the
13523 frag as extended if it was small, and is about to become
13524 extended with a value of maxtiny + 1. */
13525 if (val == ((maxtiny + 1) << op->shift)
13526 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13527 && sec == NULL)
13529 fragp->fr_subtype =
13530 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13531 return 1;
13534 else if (symsec != absolute_section && sec != NULL)
13535 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13537 if ((val & ((1 << op->shift) - 1)) != 0
13538 || val < (mintiny << op->shift)
13539 || val > (maxtiny << op->shift))
13540 return 1;
13541 else
13542 return 0;
13545 /* Compute the length of a branch sequence, and adjust the
13546 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13547 worst-case length is computed, with UPDATE being used to indicate
13548 whether an unconditional (-1), branch-likely (+1) or regular (0)
13549 branch is to be computed. */
13550 static int
13551 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13553 bfd_boolean toofar;
13554 int length;
13556 if (fragp
13557 && S_IS_DEFINED (fragp->fr_symbol)
13558 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13560 addressT addr;
13561 offsetT val;
13563 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13565 addr = fragp->fr_address + fragp->fr_fix + 4;
13567 val -= addr;
13569 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13571 else if (fragp)
13572 /* If the symbol is not defined or it's in a different segment,
13573 assume the user knows what's going on and emit a short
13574 branch. */
13575 toofar = FALSE;
13576 else
13577 toofar = TRUE;
13579 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13580 fragp->fr_subtype
13581 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13582 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13583 RELAX_BRANCH_LINK (fragp->fr_subtype),
13584 toofar);
13586 length = 4;
13587 if (toofar)
13589 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13590 length += 8;
13592 if (mips_pic != NO_PIC)
13594 /* Additional space for PIC loading of target address. */
13595 length += 8;
13596 if (mips_opts.isa == ISA_MIPS1)
13597 /* Additional space for $at-stabilizing nop. */
13598 length += 4;
13601 /* If branch is conditional. */
13602 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13603 length += 8;
13606 return length;
13609 /* Estimate the size of a frag before relaxing. Unless this is the
13610 mips16, we are not really relaxing here, and the final size is
13611 encoded in the subtype information. For the mips16, we have to
13612 decide whether we are using an extended opcode or not. */
13615 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13617 int change;
13619 if (RELAX_BRANCH_P (fragp->fr_subtype))
13622 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13624 return fragp->fr_var;
13627 if (RELAX_MIPS16_P (fragp->fr_subtype))
13628 /* We don't want to modify the EXTENDED bit here; it might get us
13629 into infinite loops. We change it only in mips_relax_frag(). */
13630 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13632 if (mips_pic == NO_PIC)
13633 change = nopic_need_relax (fragp->fr_symbol, 0);
13634 else if (mips_pic == SVR4_PIC)
13635 change = pic_need_relax (fragp->fr_symbol, segtype);
13636 else if (mips_pic == VXWORKS_PIC)
13637 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
13638 change = 0;
13639 else
13640 abort ();
13642 if (change)
13644 fragp->fr_subtype |= RELAX_USE_SECOND;
13645 return -RELAX_FIRST (fragp->fr_subtype);
13647 else
13648 return -RELAX_SECOND (fragp->fr_subtype);
13651 /* This is called to see whether a reloc against a defined symbol
13652 should be converted into a reloc against a section. */
13655 mips_fix_adjustable (fixS *fixp)
13657 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13658 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13659 return 0;
13661 if (fixp->fx_addsy == NULL)
13662 return 1;
13664 /* If symbol SYM is in a mergeable section, relocations of the form
13665 SYM + 0 can usually be made section-relative. The mergeable data
13666 is then identified by the section offset rather than by the symbol.
13668 However, if we're generating REL LO16 relocations, the offset is split
13669 between the LO16 and parterning high part relocation. The linker will
13670 need to recalculate the complete offset in order to correctly identify
13671 the merge data.
13673 The linker has traditionally not looked for the parterning high part
13674 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13675 placed anywhere. Rather than break backwards compatibility by changing
13676 this, it seems better not to force the issue, and instead keep the
13677 original symbol. This will work with either linker behavior. */
13678 if ((fixp->fx_r_type == BFD_RELOC_LO16
13679 || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13680 || reloc_needs_lo_p (fixp->fx_r_type))
13681 && HAVE_IN_PLACE_ADDENDS
13682 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13683 return 0;
13685 #ifdef OBJ_ELF
13686 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13687 to a floating-point stub. The same is true for non-R_MIPS16_26
13688 relocations against MIPS16 functions; in this case, the stub becomes
13689 the function's canonical address.
13691 Floating-point stubs are stored in unique .mips16.call.* or
13692 .mips16.fn.* sections. If a stub T for function F is in section S,
13693 the first relocation in section S must be against F; this is how the
13694 linker determines the target function. All relocations that might
13695 resolve to T must also be against F. We therefore have the following
13696 restrictions, which are given in an intentionally-redundant way:
13698 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
13699 symbols.
13701 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
13702 if that stub might be used.
13704 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
13705 symbols.
13707 4. We cannot reduce a stub's relocations against MIPS16 symbols if
13708 that stub might be used.
13710 There is a further restriction:
13712 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
13713 on targets with in-place addends; the relocation field cannot
13714 encode the low bit.
13716 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
13717 against a MIPS16 symbol.
13719 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
13720 relocation against some symbol R, no relocation against R may be
13721 reduced. (Note that this deals with (2) as well as (1) because
13722 relocations against global symbols will never be reduced on ELF
13723 targets.) This approach is a little simpler than trying to detect
13724 stub sections, and gives the "all or nothing" per-symbol consistency
13725 that we have for MIPS16 symbols. */
13726 if (IS_ELF
13727 && fixp->fx_subsy == NULL
13728 && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13729 || *symbol_get_tc (fixp->fx_addsy)))
13730 return 0;
13731 #endif
13733 return 1;
13736 /* Translate internal representation of relocation info to BFD target
13737 format. */
13739 arelent **
13740 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13742 static arelent *retval[4];
13743 arelent *reloc;
13744 bfd_reloc_code_real_type code;
13746 memset (retval, 0, sizeof(retval));
13747 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13748 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13749 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13750 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13752 if (fixp->fx_pcrel)
13754 assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13756 /* At this point, fx_addnumber is "symbol offset - pcrel address".
13757 Relocations want only the symbol offset. */
13758 reloc->addend = fixp->fx_addnumber + reloc->address;
13759 if (!IS_ELF)
13761 /* A gruesome hack which is a result of the gruesome gas
13762 reloc handling. What's worse, for COFF (as opposed to
13763 ECOFF), we might need yet another copy of reloc->address.
13764 See bfd_install_relocation. */
13765 reloc->addend += reloc->address;
13768 else
13769 reloc->addend = fixp->fx_addnumber;
13771 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13772 entry to be used in the relocation's section offset. */
13773 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13775 reloc->address = reloc->addend;
13776 reloc->addend = 0;
13779 code = fixp->fx_r_type;
13781 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13782 if (reloc->howto == NULL)
13784 as_bad_where (fixp->fx_file, fixp->fx_line,
13785 _("Can not represent %s relocation in this object file format"),
13786 bfd_get_reloc_code_name (code));
13787 retval[0] = NULL;
13790 return retval;
13793 /* Relax a machine dependent frag. This returns the amount by which
13794 the current size of the frag should change. */
13797 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13799 if (RELAX_BRANCH_P (fragp->fr_subtype))
13801 offsetT old_var = fragp->fr_var;
13803 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13805 return fragp->fr_var - old_var;
13808 if (! RELAX_MIPS16_P (fragp->fr_subtype))
13809 return 0;
13811 if (mips16_extended_frag (fragp, NULL, stretch))
13813 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13814 return 0;
13815 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13816 return 2;
13818 else
13820 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13821 return 0;
13822 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13823 return -2;
13826 return 0;
13829 /* Convert a machine dependent frag. */
13831 void
13832 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13834 if (RELAX_BRANCH_P (fragp->fr_subtype))
13836 bfd_byte *buf;
13837 unsigned long insn;
13838 expressionS exp;
13839 fixS *fixp;
13841 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13843 if (target_big_endian)
13844 insn = bfd_getb32 (buf);
13845 else
13846 insn = bfd_getl32 (buf);
13848 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13850 /* We generate a fixup instead of applying it right now
13851 because, if there are linker relaxations, we're going to
13852 need the relocations. */
13853 exp.X_op = O_symbol;
13854 exp.X_add_symbol = fragp->fr_symbol;
13855 exp.X_add_number = fragp->fr_offset;
13857 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13858 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
13859 fixp->fx_file = fragp->fr_file;
13860 fixp->fx_line = fragp->fr_line;
13862 md_number_to_chars ((char *) buf, insn, 4);
13863 buf += 4;
13865 else
13867 int i;
13869 as_warn_where (fragp->fr_file, fragp->fr_line,
13870 _("relaxed out-of-range branch into a jump"));
13872 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13873 goto uncond;
13875 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13877 /* Reverse the branch. */
13878 switch ((insn >> 28) & 0xf)
13880 case 4:
13881 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13882 have the condition reversed by tweaking a single
13883 bit, and their opcodes all have 0x4???????. */
13884 assert ((insn & 0xf1000000) == 0x41000000);
13885 insn ^= 0x00010000;
13886 break;
13888 case 0:
13889 /* bltz 0x04000000 bgez 0x04010000
13890 bltzal 0x04100000 bgezal 0x04110000 */
13891 assert ((insn & 0xfc0e0000) == 0x04000000);
13892 insn ^= 0x00010000;
13893 break;
13895 case 1:
13896 /* beq 0x10000000 bne 0x14000000
13897 blez 0x18000000 bgtz 0x1c000000 */
13898 insn ^= 0x04000000;
13899 break;
13901 default:
13902 abort ();
13906 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13908 /* Clear the and-link bit. */
13909 assert ((insn & 0xfc1c0000) == 0x04100000);
13911 /* bltzal 0x04100000 bgezal 0x04110000
13912 bltzall 0x04120000 bgezall 0x04130000 */
13913 insn &= ~0x00100000;
13916 /* Branch over the branch (if the branch was likely) or the
13917 full jump (not likely case). Compute the offset from the
13918 current instruction to branch to. */
13919 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13920 i = 16;
13921 else
13923 /* How many bytes in instructions we've already emitted? */
13924 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13925 /* How many bytes in instructions from here to the end? */
13926 i = fragp->fr_var - i;
13928 /* Convert to instruction count. */
13929 i >>= 2;
13930 /* Branch counts from the next instruction. */
13931 i--;
13932 insn |= i;
13933 /* Branch over the jump. */
13934 md_number_to_chars ((char *) buf, insn, 4);
13935 buf += 4;
13937 /* nop */
13938 md_number_to_chars ((char *) buf, 0, 4);
13939 buf += 4;
13941 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13943 /* beql $0, $0, 2f */
13944 insn = 0x50000000;
13945 /* Compute the PC offset from the current instruction to
13946 the end of the variable frag. */
13947 /* How many bytes in instructions we've already emitted? */
13948 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13949 /* How many bytes in instructions from here to the end? */
13950 i = fragp->fr_var - i;
13951 /* Convert to instruction count. */
13952 i >>= 2;
13953 /* Don't decrement i, because we want to branch over the
13954 delay slot. */
13956 insn |= i;
13957 md_number_to_chars ((char *) buf, insn, 4);
13958 buf += 4;
13960 md_number_to_chars ((char *) buf, 0, 4);
13961 buf += 4;
13964 uncond:
13965 if (mips_pic == NO_PIC)
13967 /* j or jal. */
13968 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13969 ? 0x0c000000 : 0x08000000);
13970 exp.X_op = O_symbol;
13971 exp.X_add_symbol = fragp->fr_symbol;
13972 exp.X_add_number = fragp->fr_offset;
13974 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13975 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
13976 fixp->fx_file = fragp->fr_file;
13977 fixp->fx_line = fragp->fr_line;
13979 md_number_to_chars ((char *) buf, insn, 4);
13980 buf += 4;
13982 else
13984 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
13985 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13986 exp.X_op = O_symbol;
13987 exp.X_add_symbol = fragp->fr_symbol;
13988 exp.X_add_number = fragp->fr_offset;
13990 if (fragp->fr_offset)
13992 exp.X_add_symbol = make_expr_symbol (&exp);
13993 exp.X_add_number = 0;
13996 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13997 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
13998 fixp->fx_file = fragp->fr_file;
13999 fixp->fx_line = fragp->fr_line;
14001 md_number_to_chars ((char *) buf, insn, 4);
14002 buf += 4;
14004 if (mips_opts.isa == ISA_MIPS1)
14006 /* nop */
14007 md_number_to_chars ((char *) buf, 0, 4);
14008 buf += 4;
14011 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14012 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14014 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14015 4, &exp, FALSE, BFD_RELOC_LO16);
14016 fixp->fx_file = fragp->fr_file;
14017 fixp->fx_line = fragp->fr_line;
14019 md_number_to_chars ((char *) buf, insn, 4);
14020 buf += 4;
14022 /* j(al)r $at. */
14023 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14024 insn = 0x0020f809;
14025 else
14026 insn = 0x00200008;
14028 md_number_to_chars ((char *) buf, insn, 4);
14029 buf += 4;
14033 assert (buf == (bfd_byte *)fragp->fr_literal
14034 + fragp->fr_fix + fragp->fr_var);
14036 fragp->fr_fix += fragp->fr_var;
14038 return;
14041 if (RELAX_MIPS16_P (fragp->fr_subtype))
14043 int type;
14044 const struct mips16_immed_operand *op;
14045 bfd_boolean small, ext;
14046 offsetT val;
14047 bfd_byte *buf;
14048 unsigned long insn;
14049 bfd_boolean use_extend;
14050 unsigned short extend;
14052 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14053 op = mips16_immed_operands;
14054 while (op->type != type)
14055 ++op;
14057 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14059 small = FALSE;
14060 ext = TRUE;
14062 else
14064 small = TRUE;
14065 ext = FALSE;
14068 resolve_symbol_value (fragp->fr_symbol);
14069 val = S_GET_VALUE (fragp->fr_symbol);
14070 if (op->pcrel)
14072 addressT addr;
14074 addr = fragp->fr_address + fragp->fr_fix;
14076 /* The rules for the base address of a PC relative reloc are
14077 complicated; see mips16_extended_frag. */
14078 if (type == 'p' || type == 'q')
14080 addr += 2;
14081 if (ext)
14082 addr += 2;
14083 /* Ignore the low bit in the target, since it will be
14084 set for a text label. */
14085 if ((val & 1) != 0)
14086 --val;
14088 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14089 addr -= 4;
14090 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14091 addr -= 2;
14093 addr &= ~ (addressT) ((1 << op->shift) - 1);
14094 val -= addr;
14096 /* Make sure the section winds up with the alignment we have
14097 assumed. */
14098 if (op->shift > 0)
14099 record_alignment (asec, op->shift);
14102 if (ext
14103 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14104 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14105 as_warn_where (fragp->fr_file, fragp->fr_line,
14106 _("extended instruction in delay slot"));
14108 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14110 if (target_big_endian)
14111 insn = bfd_getb16 (buf);
14112 else
14113 insn = bfd_getl16 (buf);
14115 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14116 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14117 small, ext, &insn, &use_extend, &extend);
14119 if (use_extend)
14121 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14122 fragp->fr_fix += 2;
14123 buf += 2;
14126 md_number_to_chars ((char *) buf, insn, 2);
14127 fragp->fr_fix += 2;
14128 buf += 2;
14130 else
14132 int first, second;
14133 fixS *fixp;
14135 first = RELAX_FIRST (fragp->fr_subtype);
14136 second = RELAX_SECOND (fragp->fr_subtype);
14137 fixp = (fixS *) fragp->fr_opcode;
14139 /* Possibly emit a warning if we've chosen the longer option. */
14140 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14141 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14143 const char *msg = macro_warning (fragp->fr_subtype);
14144 if (msg != 0)
14145 as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14148 /* Go through all the fixups for the first sequence. Disable them
14149 (by marking them as done) if we're going to use the second
14150 sequence instead. */
14151 while (fixp
14152 && fixp->fx_frag == fragp
14153 && fixp->fx_where < fragp->fr_fix - second)
14155 if (fragp->fr_subtype & RELAX_USE_SECOND)
14156 fixp->fx_done = 1;
14157 fixp = fixp->fx_next;
14160 /* Go through the fixups for the second sequence. Disable them if
14161 we're going to use the first sequence, otherwise adjust their
14162 addresses to account for the relaxation. */
14163 while (fixp && fixp->fx_frag == fragp)
14165 if (fragp->fr_subtype & RELAX_USE_SECOND)
14166 fixp->fx_where -= first;
14167 else
14168 fixp->fx_done = 1;
14169 fixp = fixp->fx_next;
14172 /* Now modify the frag contents. */
14173 if (fragp->fr_subtype & RELAX_USE_SECOND)
14175 char *start;
14177 start = fragp->fr_literal + fragp->fr_fix - first - second;
14178 memmove (start, start + first, second);
14179 fragp->fr_fix -= first;
14181 else
14182 fragp->fr_fix -= second;
14186 #ifdef OBJ_ELF
14188 /* This function is called after the relocs have been generated.
14189 We've been storing mips16 text labels as odd. Here we convert them
14190 back to even for the convenience of the debugger. */
14192 void
14193 mips_frob_file_after_relocs (void)
14195 asymbol **syms;
14196 unsigned int count, i;
14198 if (!IS_ELF)
14199 return;
14201 syms = bfd_get_outsymbols (stdoutput);
14202 count = bfd_get_symcount (stdoutput);
14203 for (i = 0; i < count; i++, syms++)
14205 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14206 && ((*syms)->value & 1) != 0)
14208 (*syms)->value &= ~1;
14209 /* If the symbol has an odd size, it was probably computed
14210 incorrectly, so adjust that as well. */
14211 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14212 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14217 #endif
14219 /* This function is called whenever a label is defined. It is used
14220 when handling branch delays; if a branch has a label, we assume we
14221 can not move it. */
14223 void
14224 mips_define_label (symbolS *sym)
14226 segment_info_type *si = seg_info (now_seg);
14227 struct insn_label_list *l;
14229 if (free_insn_labels == NULL)
14230 l = (struct insn_label_list *) xmalloc (sizeof *l);
14231 else
14233 l = free_insn_labels;
14234 free_insn_labels = l->next;
14237 l->label = sym;
14238 l->next = si->label_list;
14239 si->label_list = l;
14241 #ifdef OBJ_ELF
14242 dwarf2_emit_label (sym);
14243 #endif
14246 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14248 /* Some special processing for a MIPS ELF file. */
14250 void
14251 mips_elf_final_processing (void)
14253 /* Write out the register information. */
14254 if (mips_abi != N64_ABI)
14256 Elf32_RegInfo s;
14258 s.ri_gprmask = mips_gprmask;
14259 s.ri_cprmask[0] = mips_cprmask[0];
14260 s.ri_cprmask[1] = mips_cprmask[1];
14261 s.ri_cprmask[2] = mips_cprmask[2];
14262 s.ri_cprmask[3] = mips_cprmask[3];
14263 /* The gp_value field is set by the MIPS ELF backend. */
14265 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14266 ((Elf32_External_RegInfo *)
14267 mips_regmask_frag));
14269 else
14271 Elf64_Internal_RegInfo s;
14273 s.ri_gprmask = mips_gprmask;
14274 s.ri_pad = 0;
14275 s.ri_cprmask[0] = mips_cprmask[0];
14276 s.ri_cprmask[1] = mips_cprmask[1];
14277 s.ri_cprmask[2] = mips_cprmask[2];
14278 s.ri_cprmask[3] = mips_cprmask[3];
14279 /* The gp_value field is set by the MIPS ELF backend. */
14281 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14282 ((Elf64_External_RegInfo *)
14283 mips_regmask_frag));
14286 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14287 sort of BFD interface for this. */
14288 if (mips_any_noreorder)
14289 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14290 if (mips_pic != NO_PIC)
14292 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14293 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14295 if (mips_abicalls)
14296 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14298 /* Set MIPS ELF flags for ASEs. */
14299 /* We may need to define a new flag for DSP ASE, and set this flag when
14300 file_ase_dsp is true. */
14301 /* Same for DSP R2. */
14302 /* We may need to define a new flag for MT ASE, and set this flag when
14303 file_ase_mt is true. */
14304 if (file_ase_mips16)
14305 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14306 #if 0 /* XXX FIXME */
14307 if (file_ase_mips3d)
14308 elf_elfheader (stdoutput)->e_flags |= ???;
14309 #endif
14310 if (file_ase_mdmx)
14311 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14313 /* Set the MIPS ELF ABI flags. */
14314 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14315 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14316 else if (mips_abi == O64_ABI)
14317 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14318 else if (mips_abi == EABI_ABI)
14320 if (!file_mips_gp32)
14321 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14322 else
14323 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14325 else if (mips_abi == N32_ABI)
14326 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14328 /* Nothing to do for N64_ABI. */
14330 if (mips_32bitmode)
14331 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14333 #if 0 /* XXX FIXME */
14334 /* 32 bit code with 64 bit FP registers. */
14335 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14336 elf_elfheader (stdoutput)->e_flags |= ???;
14337 #endif
14340 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14342 typedef struct proc {
14343 symbolS *func_sym;
14344 symbolS *func_end_sym;
14345 unsigned long reg_mask;
14346 unsigned long reg_offset;
14347 unsigned long fpreg_mask;
14348 unsigned long fpreg_offset;
14349 unsigned long frame_offset;
14350 unsigned long frame_reg;
14351 unsigned long pc_reg;
14352 } procS;
14354 static procS cur_proc;
14355 static procS *cur_proc_ptr;
14356 static int numprocs;
14358 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
14359 nop as "0". */
14361 char
14362 mips_nop_opcode (void)
14364 return seg_info (now_seg)->tc_segment_info_data.mips16;
14367 /* Fill in an rs_align_code fragment. This only needs to do something
14368 for MIPS16 code, where 0 is not a nop. */
14370 void
14371 mips_handle_align (fragS *fragp)
14373 char *p;
14375 if (fragp->fr_type != rs_align_code)
14376 return;
14378 p = fragp->fr_literal + fragp->fr_fix;
14379 if (*p)
14381 int bytes;
14383 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14384 if (bytes & 1)
14386 *p++ = 0;
14387 fragp->fr_fix++;
14389 md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14390 fragp->fr_var = 2;
14394 static void
14395 md_obj_begin (void)
14399 static void
14400 md_obj_end (void)
14402 /* Check for premature end, nesting errors, etc. */
14403 if (cur_proc_ptr)
14404 as_warn (_("missing .end at end of assembly"));
14407 static long
14408 get_number (void)
14410 int negative = 0;
14411 long val = 0;
14413 if (*input_line_pointer == '-')
14415 ++input_line_pointer;
14416 negative = 1;
14418 if (!ISDIGIT (*input_line_pointer))
14419 as_bad (_("expected simple number"));
14420 if (input_line_pointer[0] == '0')
14422 if (input_line_pointer[1] == 'x')
14424 input_line_pointer += 2;
14425 while (ISXDIGIT (*input_line_pointer))
14427 val <<= 4;
14428 val |= hex_value (*input_line_pointer++);
14430 return negative ? -val : val;
14432 else
14434 ++input_line_pointer;
14435 while (ISDIGIT (*input_line_pointer))
14437 val <<= 3;
14438 val |= *input_line_pointer++ - '0';
14440 return negative ? -val : val;
14443 if (!ISDIGIT (*input_line_pointer))
14445 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14446 *input_line_pointer, *input_line_pointer);
14447 as_warn (_("invalid number"));
14448 return -1;
14450 while (ISDIGIT (*input_line_pointer))
14452 val *= 10;
14453 val += *input_line_pointer++ - '0';
14455 return negative ? -val : val;
14458 /* The .file directive; just like the usual .file directive, but there
14459 is an initial number which is the ECOFF file index. In the non-ECOFF
14460 case .file implies DWARF-2. */
14462 static void
14463 s_mips_file (int x ATTRIBUTE_UNUSED)
14465 static int first_file_directive = 0;
14467 if (ECOFF_DEBUGGING)
14469 get_number ();
14470 s_app_file (0);
14472 else
14474 char *filename;
14476 filename = dwarf2_directive_file (0);
14478 /* Versions of GCC up to 3.1 start files with a ".file"
14479 directive even for stabs output. Make sure that this
14480 ".file" is handled. Note that you need a version of GCC
14481 after 3.1 in order to support DWARF-2 on MIPS. */
14482 if (filename != NULL && ! first_file_directive)
14484 (void) new_logical_line (filename, -1);
14485 s_app_file_string (filename, 0);
14487 first_file_directive = 1;
14491 /* The .loc directive, implying DWARF-2. */
14493 static void
14494 s_mips_loc (int x ATTRIBUTE_UNUSED)
14496 if (!ECOFF_DEBUGGING)
14497 dwarf2_directive_loc (0);
14500 /* The .end directive. */
14502 static void
14503 s_mips_end (int x ATTRIBUTE_UNUSED)
14505 symbolS *p;
14507 /* Following functions need their own .frame and .cprestore directives. */
14508 mips_frame_reg_valid = 0;
14509 mips_cprestore_valid = 0;
14511 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14513 p = get_symbol ();
14514 demand_empty_rest_of_line ();
14516 else
14517 p = NULL;
14519 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14520 as_warn (_(".end not in text section"));
14522 if (!cur_proc_ptr)
14524 as_warn (_(".end directive without a preceding .ent directive."));
14525 demand_empty_rest_of_line ();
14526 return;
14529 if (p != NULL)
14531 assert (S_GET_NAME (p));
14532 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14533 as_warn (_(".end symbol does not match .ent symbol."));
14535 if (debug_type == DEBUG_STABS)
14536 stabs_generate_asm_endfunc (S_GET_NAME (p),
14537 S_GET_NAME (p));
14539 else
14540 as_warn (_(".end directive missing or unknown symbol"));
14542 #ifdef OBJ_ELF
14543 /* Create an expression to calculate the size of the function. */
14544 if (p && cur_proc_ptr)
14546 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14547 expressionS *exp = xmalloc (sizeof (expressionS));
14549 obj->size = exp;
14550 exp->X_op = O_subtract;
14551 exp->X_add_symbol = symbol_temp_new_now ();
14552 exp->X_op_symbol = p;
14553 exp->X_add_number = 0;
14555 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14558 /* Generate a .pdr section. */
14559 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14561 segT saved_seg = now_seg;
14562 subsegT saved_subseg = now_subseg;
14563 valueT dot;
14564 expressionS exp;
14565 char *fragp;
14567 dot = frag_now_fix ();
14569 #ifdef md_flush_pending_output
14570 md_flush_pending_output ();
14571 #endif
14573 assert (pdr_seg);
14574 subseg_set (pdr_seg, 0);
14576 /* Write the symbol. */
14577 exp.X_op = O_symbol;
14578 exp.X_add_symbol = p;
14579 exp.X_add_number = 0;
14580 emit_expr (&exp, 4);
14582 fragp = frag_more (7 * 4);
14584 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14585 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14586 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14587 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14588 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14589 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14590 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14592 subseg_set (saved_seg, saved_subseg);
14594 #endif /* OBJ_ELF */
14596 cur_proc_ptr = NULL;
14599 /* The .aent and .ent directives. */
14601 static void
14602 s_mips_ent (int aent)
14604 symbolS *symbolP;
14606 symbolP = get_symbol ();
14607 if (*input_line_pointer == ',')
14608 ++input_line_pointer;
14609 SKIP_WHITESPACE ();
14610 if (ISDIGIT (*input_line_pointer)
14611 || *input_line_pointer == '-')
14612 get_number ();
14614 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14615 as_warn (_(".ent or .aent not in text section."));
14617 if (!aent && cur_proc_ptr)
14618 as_warn (_("missing .end"));
14620 if (!aent)
14622 /* This function needs its own .frame and .cprestore directives. */
14623 mips_frame_reg_valid = 0;
14624 mips_cprestore_valid = 0;
14626 cur_proc_ptr = &cur_proc;
14627 memset (cur_proc_ptr, '\0', sizeof (procS));
14629 cur_proc_ptr->func_sym = symbolP;
14631 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14633 ++numprocs;
14635 if (debug_type == DEBUG_STABS)
14636 stabs_generate_asm_func (S_GET_NAME (symbolP),
14637 S_GET_NAME (symbolP));
14640 demand_empty_rest_of_line ();
14643 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14644 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14645 s_mips_frame is used so that we can set the PDR information correctly.
14646 We can't use the ecoff routines because they make reference to the ecoff
14647 symbol table (in the mdebug section). */
14649 static void
14650 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14652 #ifdef OBJ_ELF
14653 if (IS_ELF && !ECOFF_DEBUGGING)
14655 long val;
14657 if (cur_proc_ptr == (procS *) NULL)
14659 as_warn (_(".frame outside of .ent"));
14660 demand_empty_rest_of_line ();
14661 return;
14664 cur_proc_ptr->frame_reg = tc_get_register (1);
14666 SKIP_WHITESPACE ();
14667 if (*input_line_pointer++ != ','
14668 || get_absolute_expression_and_terminator (&val) != ',')
14670 as_warn (_("Bad .frame directive"));
14671 --input_line_pointer;
14672 demand_empty_rest_of_line ();
14673 return;
14676 cur_proc_ptr->frame_offset = val;
14677 cur_proc_ptr->pc_reg = tc_get_register (0);
14679 demand_empty_rest_of_line ();
14681 else
14682 #endif /* OBJ_ELF */
14683 s_ignore (ignore);
14686 /* The .fmask and .mask directives. If the mdebug section is present
14687 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14688 embedded targets, s_mips_mask is used so that we can set the PDR
14689 information correctly. We can't use the ecoff routines because they
14690 make reference to the ecoff symbol table (in the mdebug section). */
14692 static void
14693 s_mips_mask (int reg_type)
14695 #ifdef OBJ_ELF
14696 if (IS_ELF && !ECOFF_DEBUGGING)
14698 long mask, off;
14700 if (cur_proc_ptr == (procS *) NULL)
14702 as_warn (_(".mask/.fmask outside of .ent"));
14703 demand_empty_rest_of_line ();
14704 return;
14707 if (get_absolute_expression_and_terminator (&mask) != ',')
14709 as_warn (_("Bad .mask/.fmask directive"));
14710 --input_line_pointer;
14711 demand_empty_rest_of_line ();
14712 return;
14715 off = get_absolute_expression ();
14717 if (reg_type == 'F')
14719 cur_proc_ptr->fpreg_mask = mask;
14720 cur_proc_ptr->fpreg_offset = off;
14722 else
14724 cur_proc_ptr->reg_mask = mask;
14725 cur_proc_ptr->reg_offset = off;
14728 demand_empty_rest_of_line ();
14730 else
14731 #endif /* OBJ_ELF */
14732 s_ignore (reg_type);
14735 /* A table describing all the processors gas knows about. Names are
14736 matched in the order listed.
14738 To ease comparison, please keep this table in the same order as
14739 gcc's mips_cpu_info_table[]. */
14740 static const struct mips_cpu_info mips_cpu_info_table[] =
14742 /* Entries for generic ISAs */
14743 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
14744 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
14745 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
14746 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
14747 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
14748 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
14749 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
14750 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
14751 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
14753 /* MIPS I */
14754 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14755 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14756 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14758 /* MIPS II */
14759 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14761 /* MIPS III */
14762 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
14763 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
14764 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
14765 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
14766 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
14767 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
14768 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
14769 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
14770 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
14771 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
14772 { "orion", 0, ISA_MIPS3, CPU_R4600 },
14773 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
14775 /* MIPS IV */
14776 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
14777 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
14778 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
14779 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
14780 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
14781 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
14782 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
14783 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
14784 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
14785 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
14786 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
14787 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
14788 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
14790 /* MIPS 32 */
14791 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
14792 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
14793 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
14794 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
14796 /* MIPS 32 Release 2 */
14797 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14798 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14799 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14800 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
14801 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14802 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14803 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14804 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14805 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14806 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14807 /* Deprecated forms of the above. */
14808 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14809 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
14810 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
14811 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14812 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14813 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14814 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14815 /* Deprecated forms of the above. */
14816 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14817 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
14818 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
14819 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14820 ISA_MIPS32R2, CPU_MIPS32R2 },
14821 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14822 ISA_MIPS32R2, CPU_MIPS32R2 },
14823 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14824 ISA_MIPS32R2, CPU_MIPS32R2 },
14825 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14826 ISA_MIPS32R2, CPU_MIPS32R2 },
14827 /* Deprecated forms of the above. */
14828 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14829 ISA_MIPS32R2, CPU_MIPS32R2 },
14830 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14831 ISA_MIPS32R2, CPU_MIPS32R2 },
14832 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
14833 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14834 ISA_MIPS32R2, CPU_MIPS32R2 },
14835 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14836 ISA_MIPS32R2, CPU_MIPS32R2 },
14837 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14838 ISA_MIPS32R2, CPU_MIPS32R2 },
14839 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14840 ISA_MIPS32R2, CPU_MIPS32R2 },
14841 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14842 ISA_MIPS32R2, CPU_MIPS32R2 },
14843 /* Deprecated forms of the above. */
14844 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14845 ISA_MIPS32R2, CPU_MIPS32R2 },
14846 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14847 ISA_MIPS32R2, CPU_MIPS32R2 },
14849 /* MIPS 64 */
14850 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
14851 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
14852 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
14853 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
14855 /* MIPS 64 Release 2 */
14857 /* Broadcom SB-1 CPU core */
14858 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14859 ISA_MIPS64, CPU_SB1 },
14860 /* Broadcom SB-1A CPU core */
14861 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14862 ISA_MIPS64, CPU_SB1 },
14864 /* ST Microelectronics Loongson 2E and 2F cores */
14865 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
14866 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
14868 /* Cavium Networks Octeon CPU core */
14869 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
14871 /* End marker */
14872 { NULL, 0, 0, 0 }
14876 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14877 with a final "000" replaced by "k". Ignore case.
14879 Note: this function is shared between GCC and GAS. */
14881 static bfd_boolean
14882 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14884 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14885 given++, canonical++;
14887 return ((*given == 0 && *canonical == 0)
14888 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14892 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14893 CPU name. We've traditionally allowed a lot of variation here.
14895 Note: this function is shared between GCC and GAS. */
14897 static bfd_boolean
14898 mips_matching_cpu_name_p (const char *canonical, const char *given)
14900 /* First see if the name matches exactly, or with a final "000"
14901 turned into "k". */
14902 if (mips_strict_matching_cpu_name_p (canonical, given))
14903 return TRUE;
14905 /* If not, try comparing based on numerical designation alone.
14906 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14907 if (TOLOWER (*given) == 'r')
14908 given++;
14909 if (!ISDIGIT (*given))
14910 return FALSE;
14912 /* Skip over some well-known prefixes in the canonical name,
14913 hoping to find a number there too. */
14914 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14915 canonical += 2;
14916 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14917 canonical += 2;
14918 else if (TOLOWER (canonical[0]) == 'r')
14919 canonical += 1;
14921 return mips_strict_matching_cpu_name_p (canonical, given);
14925 /* Parse an option that takes the name of a processor as its argument.
14926 OPTION is the name of the option and CPU_STRING is the argument.
14927 Return the corresponding processor enumeration if the CPU_STRING is
14928 recognized, otherwise report an error and return null.
14930 A similar function exists in GCC. */
14932 static const struct mips_cpu_info *
14933 mips_parse_cpu (const char *option, const char *cpu_string)
14935 const struct mips_cpu_info *p;
14937 /* 'from-abi' selects the most compatible architecture for the given
14938 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
14939 EABIs, we have to decide whether we're using the 32-bit or 64-bit
14940 version. Look first at the -mgp options, if given, otherwise base
14941 the choice on MIPS_DEFAULT_64BIT.
14943 Treat NO_ABI like the EABIs. One reason to do this is that the
14944 plain 'mips' and 'mips64' configs have 'from-abi' as their default
14945 architecture. This code picks MIPS I for 'mips' and MIPS III for
14946 'mips64', just as we did in the days before 'from-abi'. */
14947 if (strcasecmp (cpu_string, "from-abi") == 0)
14949 if (ABI_NEEDS_32BIT_REGS (mips_abi))
14950 return mips_cpu_info_from_isa (ISA_MIPS1);
14952 if (ABI_NEEDS_64BIT_REGS (mips_abi))
14953 return mips_cpu_info_from_isa (ISA_MIPS3);
14955 if (file_mips_gp32 >= 0)
14956 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14958 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14959 ? ISA_MIPS3
14960 : ISA_MIPS1);
14963 /* 'default' has traditionally been a no-op. Probably not very useful. */
14964 if (strcasecmp (cpu_string, "default") == 0)
14965 return 0;
14967 for (p = mips_cpu_info_table; p->name != 0; p++)
14968 if (mips_matching_cpu_name_p (p->name, cpu_string))
14969 return p;
14971 as_bad ("Bad value (%s) for %s", cpu_string, option);
14972 return 0;
14975 /* Return the canonical processor information for ISA (a member of the
14976 ISA_MIPS* enumeration). */
14978 static const struct mips_cpu_info *
14979 mips_cpu_info_from_isa (int isa)
14981 int i;
14983 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14984 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
14985 && isa == mips_cpu_info_table[i].isa)
14986 return (&mips_cpu_info_table[i]);
14988 return NULL;
14991 static const struct mips_cpu_info *
14992 mips_cpu_info_from_arch (int arch)
14994 int i;
14996 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14997 if (arch == mips_cpu_info_table[i].cpu)
14998 return (&mips_cpu_info_table[i]);
15000 return NULL;
15003 static void
15004 show (FILE *stream, const char *string, int *col_p, int *first_p)
15006 if (*first_p)
15008 fprintf (stream, "%24s", "");
15009 *col_p = 24;
15011 else
15013 fprintf (stream, ", ");
15014 *col_p += 2;
15017 if (*col_p + strlen (string) > 72)
15019 fprintf (stream, "\n%24s", "");
15020 *col_p = 24;
15023 fprintf (stream, "%s", string);
15024 *col_p += strlen (string);
15026 *first_p = 0;
15029 void
15030 md_show_usage (FILE *stream)
15032 int column, first;
15033 size_t i;
15035 fprintf (stream, _("\
15036 MIPS options:\n\
15037 -EB generate big endian output\n\
15038 -EL generate little endian output\n\
15039 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15040 -G NUM allow referencing objects up to NUM bytes\n\
15041 implicitly with the gp register [default 8]\n"));
15042 fprintf (stream, _("\
15043 -mips1 generate MIPS ISA I instructions\n\
15044 -mips2 generate MIPS ISA II instructions\n\
15045 -mips3 generate MIPS ISA III instructions\n\
15046 -mips4 generate MIPS ISA IV instructions\n\
15047 -mips5 generate MIPS ISA V instructions\n\
15048 -mips32 generate MIPS32 ISA instructions\n\
15049 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15050 -mips64 generate MIPS64 ISA instructions\n\
15051 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
15052 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15054 first = 1;
15056 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15057 show (stream, mips_cpu_info_table[i].name, &column, &first);
15058 show (stream, "from-abi", &column, &first);
15059 fputc ('\n', stream);
15061 fprintf (stream, _("\
15062 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15063 -no-mCPU don't generate code specific to CPU.\n\
15064 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15066 first = 1;
15068 show (stream, "3900", &column, &first);
15069 show (stream, "4010", &column, &first);
15070 show (stream, "4100", &column, &first);
15071 show (stream, "4650", &column, &first);
15072 fputc ('\n', stream);
15074 fprintf (stream, _("\
15075 -mips16 generate mips16 instructions\n\
15076 -no-mips16 do not generate mips16 instructions\n"));
15077 fprintf (stream, _("\
15078 -msmartmips generate smartmips instructions\n\
15079 -mno-smartmips do not generate smartmips instructions\n"));
15080 fprintf (stream, _("\
15081 -mdsp generate DSP instructions\n\
15082 -mno-dsp do not generate DSP instructions\n"));
15083 fprintf (stream, _("\
15084 -mdspr2 generate DSP R2 instructions\n\
15085 -mno-dspr2 do not generate DSP R2 instructions\n"));
15086 fprintf (stream, _("\
15087 -mmt generate MT instructions\n\
15088 -mno-mt do not generate MT instructions\n"));
15089 fprintf (stream, _("\
15090 -mfix-vr4120 work around certain VR4120 errata\n\
15091 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
15092 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15093 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15094 -msym32 assume all symbols have 32-bit values\n\
15095 -O0 remove unneeded NOPs, do not swap branches\n\
15096 -O remove unneeded NOPs and swap branches\n\
15097 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15098 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15099 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15100 #ifdef OBJ_ELF
15101 fprintf (stream, _("\
15102 -KPIC, -call_shared generate SVR4 position independent code\n\
15103 -mvxworks-pic generate VxWorks position independent code\n\
15104 -non_shared do not generate position independent code\n\
15105 -xgot assume a 32 bit GOT\n\
15106 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
15107 -mshared, -mno-shared disable/enable .cpload optimization for\n\
15108 position dependent (non shared) code\n\
15109 -mabi=ABI create ABI conformant object file for:\n"));
15111 first = 1;
15113 show (stream, "32", &column, &first);
15114 show (stream, "o64", &column, &first);
15115 show (stream, "n32", &column, &first);
15116 show (stream, "64", &column, &first);
15117 show (stream, "eabi", &column, &first);
15119 fputc ('\n', stream);
15121 fprintf (stream, _("\
15122 -32 create o32 ABI object file (default)\n\
15123 -n32 create n32 ABI object file\n\
15124 -64 create 64 ABI object file\n"));
15125 #endif
15128 enum dwarf2_format
15129 mips_dwarf2_format (void)
15131 if (HAVE_64BIT_SYMBOLS)
15133 #ifdef TE_IRIX
15134 return dwarf2_format_64bit_irix;
15135 #else
15136 return dwarf2_format_64bit;
15137 #endif
15139 else
15140 return dwarf2_format_32bit;
15144 mips_dwarf2_addr_size (void)
15146 if (HAVE_64BIT_SYMBOLS)
15147 return 8;
15148 else
15149 return 4;
15152 /* Standard calling conventions leave the CFA at SP on entry. */
15153 void
15154 mips_cfi_frame_initial_instructions (void)
15156 cfi_add_CFA_def_cfa_register (SP);
15160 tc_mips_regname_to_dw2regnum (char *regname)
15162 unsigned int regnum = -1;
15163 unsigned int reg;
15165 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15166 regnum = reg;
15168 return regnum;