gas/
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5 Contributed by the OSF and Ralph Campbell.
6 Written by Keith Knowles and Ralph Campbell, working independently.
7 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8 Support.
9
10 This file is part of GAS.
11
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
24 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25 02110-1301, USA. */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too. */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about. */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections. Off by default on IRIX: the native
78 linker doesn't know about and discards them, but relocations against them
79 remain, leading to rld crashes. */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define ATREG 1
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP 28
99 #define SP 29
100 #define FP 30
101 #define RA 31
102
103 #define ILLEGAL_REG (32)
104
105 #define AT mips_opts.at
106
107 /* Allow override of standard little-endian ECOFF format. */
108
109 #ifndef ECOFF_LITTLE_FORMAT
110 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111 #endif
112
113 extern int target_big_endian;
114
115 /* The name of the readonly data section. */
116 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117 ? ".rdata" \
118 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119 ? ".rdata" \
120 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121 ? ".rodata" \
122 : (abort (), ""))
123
124 /* Information about an instruction, including its format, operands
125 and fixups. */
126 struct mips_cl_insn
127 {
128 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
129 const struct mips_opcode *insn_mo;
130
131 /* True if this is a mips16 instruction and if we want the extended
132 form of INSN_MO. */
133 bfd_boolean use_extend;
134
135 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
136 unsigned short extend;
137
138 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
139 a copy of INSN_MO->match with the operands filled in. */
140 unsigned long insn_opcode;
141
142 /* The frag that contains the instruction. */
143 struct frag *frag;
144
145 /* The offset into FRAG of the first instruction byte. */
146 long where;
147
148 /* The relocs associated with the instruction, if any. */
149 fixS *fixp[3];
150
151 /* True if this entry cannot be moved from its current position. */
152 unsigned int fixed_p : 1;
153
154 /* True if this instruction occurred in a .set noreorder block. */
155 unsigned int noreorder_p : 1;
156
157 /* True for mips16 instructions that jump to an absolute address. */
158 unsigned int mips16_absolute_jump_p : 1;
159
160 /* True if this instruction is complete. */
161 unsigned int complete_p : 1;
162 };
163
164 /* The ABI to use. */
165 enum mips_abi_level
166 {
167 NO_ABI = 0,
168 O32_ABI,
169 O64_ABI,
170 N32_ABI,
171 N64_ABI,
172 EABI_ABI
173 };
174
175 /* MIPS ABI we are using for this output file. */
176 static enum mips_abi_level mips_abi = NO_ABI;
177
178 /* Whether or not we have code that can call pic code. */
179 int mips_abicalls = FALSE;
180
181 /* Whether or not we have code which can be put into a shared
182 library. */
183 static bfd_boolean mips_in_shared = TRUE;
184
185 /* This is the set of options which may be modified by the .set
186 pseudo-op. We use a struct so that .set push and .set pop are more
187 reliable. */
188
189 struct mips_set_options
190 {
191 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
192 if it has not been initialized. Changed by `.set mipsN', and the
193 -mipsN command line option, and the default CPU. */
194 int isa;
195 /* Enabled Application Specific Extensions (ASEs). These are set to -1
196 if they have not been initialized. Changed by `.set <asename>', by
197 command line options, and based on the default architecture. */
198 int ase_mips3d;
199 int ase_mdmx;
200 int ase_smartmips;
201 int ase_dsp;
202 int ase_dspr2;
203 int ase_mt;
204 /* Whether we are assembling for the mips16 processor. 0 if we are
205 not, 1 if we are, and -1 if the value has not been initialized.
206 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
207 -nomips16 command line options, and the default CPU. */
208 int mips16;
209 /* Non-zero if we should not reorder instructions. Changed by `.set
210 reorder' and `.set noreorder'. */
211 int noreorder;
212 /* Non-zero if we should not permit the register designated "assembler
213 temporary" to be used in instructions. The value is the register
214 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
215 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
216 unsigned int at;
217 /* Non-zero if we should warn when a macro instruction expands into
218 more than one machine instruction. Changed by `.set nomacro' and
219 `.set macro'. */
220 int warn_about_macros;
221 /* Non-zero if we should not move instructions. Changed by `.set
222 move', `.set volatile', `.set nomove', and `.set novolatile'. */
223 int nomove;
224 /* Non-zero if we should not optimize branches by moving the target
225 of the branch into the delay slot. Actually, we don't perform
226 this optimization anyhow. Changed by `.set bopt' and `.set
227 nobopt'. */
228 int nobopt;
229 /* Non-zero if we should not autoextend mips16 instructions.
230 Changed by `.set autoextend' and `.set noautoextend'. */
231 int noautoextend;
232 /* Restrict general purpose registers and floating point registers
233 to 32 bit. This is initially determined when -mgp32 or -mfp32
234 is passed but can changed if the assembler code uses .set mipsN. */
235 int gp32;
236 int fp32;
237 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
238 command line option, and the default CPU. */
239 int arch;
240 /* True if ".set sym32" is in effect. */
241 bfd_boolean sym32;
242 /* True if floating-point operations are not allowed. Changed by .set
243 softfloat or .set hardfloat, by command line options -msoft-float or
244 -mhard-float. The default is false. */
245 bfd_boolean soft_float;
246
247 /* True if only single-precision floating-point operations are allowed.
248 Changed by .set singlefloat or .set doublefloat, command-line options
249 -msingle-float or -mdouble-float. The default is false. */
250 bfd_boolean single_float;
251 };
252
253 /* This is the struct we use to hold the current set of options. Note
254 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
255 -1 to indicate that they have not been initialized. */
256
257 /* True if -mgp32 was passed. */
258 static int file_mips_gp32 = -1;
259
260 /* True if -mfp32 was passed. */
261 static int file_mips_fp32 = -1;
262
263 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
264 static int file_mips_soft_float = 0;
265
266 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
267 static int file_mips_single_float = 0;
268
269 static struct mips_set_options mips_opts =
270 {
271 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
272 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
273 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
274 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
275 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
276 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
277 };
278
279 /* These variables are filled in with the masks of registers used.
280 The object format code reads them and puts them in the appropriate
281 place. */
282 unsigned long mips_gprmask;
283 unsigned long mips_cprmask[4];
284
285 /* MIPS ISA we are using for this output file. */
286 static int file_mips_isa = ISA_UNKNOWN;
287
288 /* True if any MIPS16 code was produced. */
289 static int file_ase_mips16;
290
291 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
292 || mips_opts.isa == ISA_MIPS32R2 \
293 || mips_opts.isa == ISA_MIPS64 \
294 || mips_opts.isa == ISA_MIPS64R2)
295
296 /* True if we want to create R_MIPS_JALR for jalr $25. */
297 #ifdef TE_IRIX
298 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
299 #else
300 /* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
301 because there's no place for any addend, the only acceptable
302 expression is a bare symbol. */
303 #define MIPS_JALR_HINT_P(EXPR) \
304 (!HAVE_IN_PLACE_ADDENDS \
305 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
306 #endif
307
308 /* True if -mips3d was passed or implied by arguments passed on the
309 command line (e.g., by -march). */
310 static int file_ase_mips3d;
311
312 /* True if -mdmx was passed or implied by arguments passed on the
313 command line (e.g., by -march). */
314 static int file_ase_mdmx;
315
316 /* True if -msmartmips was passed or implied by arguments passed on the
317 command line (e.g., by -march). */
318 static int file_ase_smartmips;
319
320 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
321 || mips_opts.isa == ISA_MIPS32R2)
322
323 /* True if -mdsp was passed or implied by arguments passed on the
324 command line (e.g., by -march). */
325 static int file_ase_dsp;
326
327 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
328 || mips_opts.isa == ISA_MIPS64R2)
329
330 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
331
332 /* True if -mdspr2 was passed or implied by arguments passed on the
333 command line (e.g., by -march). */
334 static int file_ase_dspr2;
335
336 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
337 || mips_opts.isa == ISA_MIPS64R2)
338
339 /* True if -mmt was passed or implied by arguments passed on the
340 command line (e.g., by -march). */
341 static int file_ase_mt;
342
343 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
344 || mips_opts.isa == ISA_MIPS64R2)
345
346 /* The argument of the -march= flag. The architecture we are assembling. */
347 static int file_mips_arch = CPU_UNKNOWN;
348 static const char *mips_arch_string;
349
350 /* The argument of the -mtune= flag. The architecture for which we
351 are optimizing. */
352 static int mips_tune = CPU_UNKNOWN;
353 static const char *mips_tune_string;
354
355 /* True when generating 32-bit code for a 64-bit processor. */
356 static int mips_32bitmode = 0;
357
358 /* True if the given ABI requires 32-bit registers. */
359 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
360
361 /* Likewise 64-bit registers. */
362 #define ABI_NEEDS_64BIT_REGS(ABI) \
363 ((ABI) == N32_ABI \
364 || (ABI) == N64_ABI \
365 || (ABI) == O64_ABI)
366
367 /* Return true if ISA supports 64 bit wide gp registers. */
368 #define ISA_HAS_64BIT_REGS(ISA) \
369 ((ISA) == ISA_MIPS3 \
370 || (ISA) == ISA_MIPS4 \
371 || (ISA) == ISA_MIPS5 \
372 || (ISA) == ISA_MIPS64 \
373 || (ISA) == ISA_MIPS64R2)
374
375 /* Return true if ISA supports 64 bit wide float registers. */
376 #define ISA_HAS_64BIT_FPRS(ISA) \
377 ((ISA) == ISA_MIPS3 \
378 || (ISA) == ISA_MIPS4 \
379 || (ISA) == ISA_MIPS5 \
380 || (ISA) == ISA_MIPS32R2 \
381 || (ISA) == ISA_MIPS64 \
382 || (ISA) == ISA_MIPS64R2)
383
384 /* Return true if ISA supports 64-bit right rotate (dror et al.)
385 instructions. */
386 #define ISA_HAS_DROR(ISA) \
387 ((ISA) == ISA_MIPS64R2)
388
389 /* Return true if ISA supports 32-bit right rotate (ror et al.)
390 instructions. */
391 #define ISA_HAS_ROR(ISA) \
392 ((ISA) == ISA_MIPS32R2 \
393 || (ISA) == ISA_MIPS64R2 \
394 || mips_opts.ase_smartmips)
395
396 /* Return true if ISA supports single-precision floats in odd registers. */
397 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
398 ((ISA) == ISA_MIPS32 \
399 || (ISA) == ISA_MIPS32R2 \
400 || (ISA) == ISA_MIPS64 \
401 || (ISA) == ISA_MIPS64R2)
402
403 /* Return true if ISA supports move to/from high part of a 64-bit
404 floating-point register. */
405 #define ISA_HAS_MXHC1(ISA) \
406 ((ISA) == ISA_MIPS32R2 \
407 || (ISA) == ISA_MIPS64R2)
408
409 #define HAVE_32BIT_GPRS \
410 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
411
412 #define HAVE_32BIT_FPRS \
413 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
414
415 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
416 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
417
418 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
419
420 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
421
422 /* True if relocations are stored in-place. */
423 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
424
425 /* The ABI-derived address size. */
426 #define HAVE_64BIT_ADDRESSES \
427 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
428 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
429
430 /* The size of symbolic constants (i.e., expressions of the form
431 "SYMBOL" or "SYMBOL + OFFSET"). */
432 #define HAVE_32BIT_SYMBOLS \
433 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
434 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
435
436 /* Addresses are loaded in different ways, depending on the address size
437 in use. The n32 ABI Documentation also mandates the use of additions
438 with overflow checking, but existing implementations don't follow it. */
439 #define ADDRESS_ADD_INSN \
440 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
441
442 #define ADDRESS_ADDI_INSN \
443 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
444
445 #define ADDRESS_LOAD_INSN \
446 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
447
448 #define ADDRESS_STORE_INSN \
449 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
450
451 /* Return true if the given CPU supports the MIPS16 ASE. */
452 #define CPU_HAS_MIPS16(cpu) \
453 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
454 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
455
456 /* True if CPU has a dror instruction. */
457 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
458
459 /* True if CPU has a ror instruction. */
460 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
461
462 /* True if CPU has seq/sne and seqi/snei instructions. */
463 #define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
464
465 /* True if CPU does not implement the all the coprocessor insns. For these
466 CPUs only those COP insns are accepted that are explicitly marked to be
467 available on the CPU. ISA membership for COP insns is ignored. */
468 #define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
469
470 /* True if mflo and mfhi can be immediately followed by instructions
471 which write to the HI and LO registers.
472
473 According to MIPS specifications, MIPS ISAs I, II, and III need
474 (at least) two instructions between the reads of HI/LO and
475 instructions which write them, and later ISAs do not. Contradicting
476 the MIPS specifications, some MIPS IV processor user manuals (e.g.
477 the UM for the NEC Vr5000) document needing the instructions between
478 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
479 MIPS64 and later ISAs to have the interlocks, plus any specific
480 earlier-ISA CPUs for which CPU documentation declares that the
481 instructions are really interlocked. */
482 #define hilo_interlocks \
483 (mips_opts.isa == ISA_MIPS32 \
484 || mips_opts.isa == ISA_MIPS32R2 \
485 || mips_opts.isa == ISA_MIPS64 \
486 || mips_opts.isa == ISA_MIPS64R2 \
487 || mips_opts.arch == CPU_R4010 \
488 || mips_opts.arch == CPU_R10000 \
489 || mips_opts.arch == CPU_R12000 \
490 || mips_opts.arch == CPU_R14000 \
491 || mips_opts.arch == CPU_R16000 \
492 || mips_opts.arch == CPU_RM7000 \
493 || mips_opts.arch == CPU_VR5500 \
494 )
495
496 /* Whether the processor uses hardware interlocks to protect reads
497 from the GPRs after they are loaded from memory, and thus does not
498 require nops to be inserted. This applies to instructions marked
499 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
500 level I. */
501 #define gpr_interlocks \
502 (mips_opts.isa != ISA_MIPS1 \
503 || mips_opts.arch == CPU_R3900)
504
505 /* Whether the processor uses hardware interlocks to avoid delays
506 required by coprocessor instructions, and thus does not require
507 nops to be inserted. This applies to instructions marked
508 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
509 between instructions marked INSN_WRITE_COND_CODE and ones marked
510 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
511 levels I, II, and III. */
512 /* Itbl support may require additional care here. */
513 #define cop_interlocks \
514 ((mips_opts.isa != ISA_MIPS1 \
515 && mips_opts.isa != ISA_MIPS2 \
516 && mips_opts.isa != ISA_MIPS3) \
517 || mips_opts.arch == CPU_R4300 \
518 )
519
520 /* Whether the processor uses hardware interlocks to protect reads
521 from coprocessor registers after they are loaded from memory, and
522 thus does not require nops to be inserted. This applies to
523 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
524 requires at MIPS ISA level I. */
525 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
526
527 /* Is this a mfhi or mflo instruction? */
528 #define MF_HILO_INSN(PINFO) \
529 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
530
531 /* Returns true for a (non floating-point) coprocessor instruction. Reading
532 or writing the condition code is only possible on the coprocessors and
533 these insns are not marked with INSN_COP. Thus for these insns use the
534 condition-code flags. */
535 #define COP_INSN(PINFO) \
536 (PINFO != INSN_MACRO \
537 && ((PINFO) & (FP_S | FP_D)) == 0 \
538 && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
539
540 /* MIPS PIC level. */
541
542 enum mips_pic_level mips_pic;
543
544 /* 1 if we should generate 32 bit offsets from the $gp register in
545 SVR4_PIC mode. Currently has no meaning in other modes. */
546 static int mips_big_got = 0;
547
548 /* 1 if trap instructions should used for overflow rather than break
549 instructions. */
550 static int mips_trap = 0;
551
552 /* 1 if double width floating point constants should not be constructed
553 by assembling two single width halves into two single width floating
554 point registers which just happen to alias the double width destination
555 register. On some architectures this aliasing can be disabled by a bit
556 in the status register, and the setting of this bit cannot be determined
557 automatically at assemble time. */
558 static int mips_disable_float_construction;
559
560 /* Non-zero if any .set noreorder directives were used. */
561
562 static int mips_any_noreorder;
563
564 /* Non-zero if nops should be inserted when the register referenced in
565 an mfhi/mflo instruction is read in the next two instructions. */
566 static int mips_7000_hilo_fix;
567
568 /* The size of objects in the small data section. */
569 static unsigned int g_switch_value = 8;
570 /* Whether the -G option was used. */
571 static int g_switch_seen = 0;
572
573 #define N_RMASK 0xc4
574 #define N_VFP 0xd4
575
576 /* If we can determine in advance that GP optimization won't be
577 possible, we can skip the relaxation stuff that tries to produce
578 GP-relative references. This makes delay slot optimization work
579 better.
580
581 This function can only provide a guess, but it seems to work for
582 gcc output. It needs to guess right for gcc, otherwise gcc
583 will put what it thinks is a GP-relative instruction in a branch
584 delay slot.
585
586 I don't know if a fix is needed for the SVR4_PIC mode. I've only
587 fixed it for the non-PIC mode. KR 95/04/07 */
588 static int nopic_need_relax (symbolS *, int);
589
590 /* handle of the OPCODE hash table */
591 static struct hash_control *op_hash = NULL;
592
593 /* The opcode hash table we use for the mips16. */
594 static struct hash_control *mips16_op_hash = NULL;
595
596 /* This array holds the chars that always start a comment. If the
597 pre-processor is disabled, these aren't very useful */
598 const char comment_chars[] = "#";
599
600 /* This array holds the chars that only start a comment at the beginning of
601 a line. If the line seems to have the form '# 123 filename'
602 .line and .file directives will appear in the pre-processed output */
603 /* Note that input_file.c hand checks for '#' at the beginning of the
604 first line of the input file. This is because the compiler outputs
605 #NO_APP at the beginning of its output. */
606 /* Also note that C style comments are always supported. */
607 const char line_comment_chars[] = "#";
608
609 /* This array holds machine specific line separator characters. */
610 const char line_separator_chars[] = ";";
611
612 /* Chars that can be used to separate mant from exp in floating point nums */
613 const char EXP_CHARS[] = "eE";
614
615 /* Chars that mean this number is a floating point constant */
616 /* As in 0f12.456 */
617 /* or 0d1.2345e12 */
618 const char FLT_CHARS[] = "rRsSfFdDxXpP";
619
620 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
621 changed in read.c . Ideally it shouldn't have to know about it at all,
622 but nothing is ideal around here.
623 */
624
625 static char *insn_error;
626
627 static int auto_align = 1;
628
629 /* When outputting SVR4 PIC code, the assembler needs to know the
630 offset in the stack frame from which to restore the $gp register.
631 This is set by the .cprestore pseudo-op, and saved in this
632 variable. */
633 static offsetT mips_cprestore_offset = -1;
634
635 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
636 more optimizations, it can use a register value instead of a memory-saved
637 offset and even an other register than $gp as global pointer. */
638 static offsetT mips_cpreturn_offset = -1;
639 static int mips_cpreturn_register = -1;
640 static int mips_gp_register = GP;
641 static int mips_gprel_offset = 0;
642
643 /* Whether mips_cprestore_offset has been set in the current function
644 (or whether it has already been warned about, if not). */
645 static int mips_cprestore_valid = 0;
646
647 /* This is the register which holds the stack frame, as set by the
648 .frame pseudo-op. This is needed to implement .cprestore. */
649 static int mips_frame_reg = SP;
650
651 /* Whether mips_frame_reg has been set in the current function
652 (or whether it has already been warned about, if not). */
653 static int mips_frame_reg_valid = 0;
654
655 /* To output NOP instructions correctly, we need to keep information
656 about the previous two instructions. */
657
658 /* Whether we are optimizing. The default value of 2 means to remove
659 unneeded NOPs and swap branch instructions when possible. A value
660 of 1 means to not swap branches. A value of 0 means to always
661 insert NOPs. */
662 static int mips_optimize = 2;
663
664 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
665 equivalent to seeing no -g option at all. */
666 static int mips_debug = 0;
667
668 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
669 #define MAX_VR4130_NOPS 4
670
671 /* The maximum number of NOPs needed to fill delay slots. */
672 #define MAX_DELAY_NOPS 2
673
674 /* The maximum number of NOPs needed for any purpose. */
675 #define MAX_NOPS 4
676
677 /* A list of previous instructions, with index 0 being the most recent.
678 We need to look back MAX_NOPS instructions when filling delay slots
679 or working around processor errata. We need to look back one
680 instruction further if we're thinking about using history[0] to
681 fill a branch delay slot. */
682 static struct mips_cl_insn history[1 + MAX_NOPS];
683
684 /* Nop instructions used by emit_nop. */
685 static struct mips_cl_insn nop_insn, mips16_nop_insn;
686
687 /* The appropriate nop for the current mode. */
688 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
689
690 /* If this is set, it points to a frag holding nop instructions which
691 were inserted before the start of a noreorder section. If those
692 nops turn out to be unnecessary, the size of the frag can be
693 decreased. */
694 static fragS *prev_nop_frag;
695
696 /* The number of nop instructions we created in prev_nop_frag. */
697 static int prev_nop_frag_holds;
698
699 /* The number of nop instructions that we know we need in
700 prev_nop_frag. */
701 static int prev_nop_frag_required;
702
703 /* The number of instructions we've seen since prev_nop_frag. */
704 static int prev_nop_frag_since;
705
706 /* For ECOFF and ELF, relocations against symbols are done in two
707 parts, with a HI relocation and a LO relocation. Each relocation
708 has only 16 bits of space to store an addend. This means that in
709 order for the linker to handle carries correctly, it must be able
710 to locate both the HI and the LO relocation. This means that the
711 relocations must appear in order in the relocation table.
712
713 In order to implement this, we keep track of each unmatched HI
714 relocation. We then sort them so that they immediately precede the
715 corresponding LO relocation. */
716
717 struct mips_hi_fixup
718 {
719 /* Next HI fixup. */
720 struct mips_hi_fixup *next;
721 /* This fixup. */
722 fixS *fixp;
723 /* The section this fixup is in. */
724 segT seg;
725 };
726
727 /* The list of unmatched HI relocs. */
728
729 static struct mips_hi_fixup *mips_hi_fixup_list;
730
731 /* The frag containing the last explicit relocation operator.
732 Null if explicit relocations have not been used. */
733
734 static fragS *prev_reloc_op_frag;
735
736 /* Map normal MIPS register numbers to mips16 register numbers. */
737
738 #define X ILLEGAL_REG
739 static const int mips32_to_16_reg_map[] =
740 {
741 X, X, 2, 3, 4, 5, 6, 7,
742 X, X, X, X, X, X, X, X,
743 0, 1, X, X, X, X, X, X,
744 X, X, X, X, X, X, X, X
745 };
746 #undef X
747
748 /* Map mips16 register numbers to normal MIPS register numbers. */
749
750 static const unsigned int mips16_to_32_reg_map[] =
751 {
752 16, 17, 2, 3, 4, 5, 6, 7
753 };
754
755 /* Classifies the kind of instructions we're interested in when
756 implementing -mfix-vr4120. */
757 enum fix_vr4120_class
758 {
759 FIX_VR4120_MACC,
760 FIX_VR4120_DMACC,
761 FIX_VR4120_MULT,
762 FIX_VR4120_DMULT,
763 FIX_VR4120_DIV,
764 FIX_VR4120_MTHILO,
765 NUM_FIX_VR4120_CLASSES
766 };
767
768 /* ...likewise -mfix-loongson2f-jump. */
769 static bfd_boolean mips_fix_loongson2f_jump;
770
771 /* ...likewise -mfix-loongson2f-nop. */
772 static bfd_boolean mips_fix_loongson2f_nop;
773
774 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
775 static bfd_boolean mips_fix_loongson2f;
776
777 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
778 there must be at least one other instruction between an instruction
779 of type X and an instruction of type Y. */
780 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
781
782 /* True if -mfix-vr4120 is in force. */
783 static int mips_fix_vr4120;
784
785 /* ...likewise -mfix-vr4130. */
786 static int mips_fix_vr4130;
787
788 /* ...likewise -mfix-24k. */
789 static int mips_fix_24k;
790
791 /* ...likewise -mfix-cn63xxp1 */
792 static bfd_boolean mips_fix_cn63xxp1;
793
794 /* We don't relax branches by default, since this causes us to expand
795 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
796 fail to compute the offset before expanding the macro to the most
797 efficient expansion. */
798
799 static int mips_relax_branch;
800 \f
801 /* The expansion of many macros depends on the type of symbol that
802 they refer to. For example, when generating position-dependent code,
803 a macro that refers to a symbol may have two different expansions,
804 one which uses GP-relative addresses and one which uses absolute
805 addresses. When generating SVR4-style PIC, a macro may have
806 different expansions for local and global symbols.
807
808 We handle these situations by generating both sequences and putting
809 them in variant frags. In position-dependent code, the first sequence
810 will be the GP-relative one and the second sequence will be the
811 absolute one. In SVR4 PIC, the first sequence will be for global
812 symbols and the second will be for local symbols.
813
814 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
815 SECOND are the lengths of the two sequences in bytes. These fields
816 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
817 the subtype has the following flags:
818
819 RELAX_USE_SECOND
820 Set if it has been decided that we should use the second
821 sequence instead of the first.
822
823 RELAX_SECOND_LONGER
824 Set in the first variant frag if the macro's second implementation
825 is longer than its first. This refers to the macro as a whole,
826 not an individual relaxation.
827
828 RELAX_NOMACRO
829 Set in the first variant frag if the macro appeared in a .set nomacro
830 block and if one alternative requires a warning but the other does not.
831
832 RELAX_DELAY_SLOT
833 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
834 delay slot.
835
836 The frag's "opcode" points to the first fixup for relaxable code.
837
838 Relaxable macros are generated using a sequence such as:
839
840 relax_start (SYMBOL);
841 ... generate first expansion ...
842 relax_switch ();
843 ... generate second expansion ...
844 relax_end ();
845
846 The code and fixups for the unwanted alternative are discarded
847 by md_convert_frag. */
848 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
849
850 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
851 #define RELAX_SECOND(X) ((X) & 0xff)
852 #define RELAX_USE_SECOND 0x10000
853 #define RELAX_SECOND_LONGER 0x20000
854 #define RELAX_NOMACRO 0x40000
855 #define RELAX_DELAY_SLOT 0x80000
856
857 /* Branch without likely bit. If label is out of range, we turn:
858
859 beq reg1, reg2, label
860 delay slot
861
862 into
863
864 bne reg1, reg2, 0f
865 nop
866 j label
867 0: delay slot
868
869 with the following opcode replacements:
870
871 beq <-> bne
872 blez <-> bgtz
873 bltz <-> bgez
874 bc1f <-> bc1t
875
876 bltzal <-> bgezal (with jal label instead of j label)
877
878 Even though keeping the delay slot instruction in the delay slot of
879 the branch would be more efficient, it would be very tricky to do
880 correctly, because we'd have to introduce a variable frag *after*
881 the delay slot instruction, and expand that instead. Let's do it
882 the easy way for now, even if the branch-not-taken case now costs
883 one additional instruction. Out-of-range branches are not supposed
884 to be common, anyway.
885
886 Branch likely. If label is out of range, we turn:
887
888 beql reg1, reg2, label
889 delay slot (annulled if branch not taken)
890
891 into
892
893 beql reg1, reg2, 1f
894 nop
895 beql $0, $0, 2f
896 nop
897 1: j[al] label
898 delay slot (executed only if branch taken)
899 2:
900
901 It would be possible to generate a shorter sequence by losing the
902 likely bit, generating something like:
903
904 bne reg1, reg2, 0f
905 nop
906 j[al] label
907 delay slot (executed only if branch taken)
908 0:
909
910 beql -> bne
911 bnel -> beq
912 blezl -> bgtz
913 bgtzl -> blez
914 bltzl -> bgez
915 bgezl -> bltz
916 bc1fl -> bc1t
917 bc1tl -> bc1f
918
919 bltzall -> bgezal (with jal label instead of j label)
920 bgezall -> bltzal (ditto)
921
922
923 but it's not clear that it would actually improve performance. */
924 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar) \
925 ((relax_substateT) \
926 (0xc0000000 \
927 | ((at) & 0x1f) \
928 | ((toofar) ? 0x20 : 0) \
929 | ((link) ? 0x40 : 0) \
930 | ((likely) ? 0x80 : 0) \
931 | ((uncond) ? 0x100 : 0)))
932 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
933 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
934 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
935 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
936 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
937 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
938
939 /* For mips16 code, we use an entirely different form of relaxation.
940 mips16 supports two versions of most instructions which take
941 immediate values: a small one which takes some small value, and a
942 larger one which takes a 16 bit value. Since branches also follow
943 this pattern, relaxing these values is required.
944
945 We can assemble both mips16 and normal MIPS code in a single
946 object. Therefore, we need to support this type of relaxation at
947 the same time that we support the relaxation described above. We
948 use the high bit of the subtype field to distinguish these cases.
949
950 The information we store for this type of relaxation is the
951 argument code found in the opcode file for this relocation, whether
952 the user explicitly requested a small or extended form, and whether
953 the relocation is in a jump or jal delay slot. That tells us the
954 size of the value, and how it should be stored. We also store
955 whether the fragment is considered to be extended or not. We also
956 store whether this is known to be a branch to a different section,
957 whether we have tried to relax this frag yet, and whether we have
958 ever extended a PC relative fragment because of a shift count. */
959 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
960 (0x80000000 \
961 | ((type) & 0xff) \
962 | ((small) ? 0x100 : 0) \
963 | ((ext) ? 0x200 : 0) \
964 | ((dslot) ? 0x400 : 0) \
965 | ((jal_dslot) ? 0x800 : 0))
966 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
967 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
968 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
969 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
970 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
971 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
972 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
973 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
974 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
975 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
976 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
977 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
978
979 /* Is the given value a sign-extended 32-bit value? */
980 #define IS_SEXT_32BIT_NUM(x) \
981 (((x) &~ (offsetT) 0x7fffffff) == 0 \
982 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
983
984 /* Is the given value a sign-extended 16-bit value? */
985 #define IS_SEXT_16BIT_NUM(x) \
986 (((x) &~ (offsetT) 0x7fff) == 0 \
987 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
988
989 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
990 #define IS_ZEXT_32BIT_NUM(x) \
991 (((x) &~ (offsetT) 0xffffffff) == 0 \
992 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
993
994 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
995 VALUE << SHIFT. VALUE is evaluated exactly once. */
996 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
997 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
998 | (((VALUE) & (MASK)) << (SHIFT)))
999
1000 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1001 SHIFT places. */
1002 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1003 (((STRUCT) >> (SHIFT)) & (MASK))
1004
1005 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1006 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1007
1008 include/opcode/mips.h specifies operand fields using the macros
1009 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1010 with "MIPS16OP" instead of "OP". */
1011 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1012 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1013 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1014 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1015 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1016
1017 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
1018 #define EXTRACT_OPERAND(FIELD, INSN) \
1019 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1020 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1021 EXTRACT_BITS ((INSN).insn_opcode, \
1022 MIPS16OP_MASK_##FIELD, \
1023 MIPS16OP_SH_##FIELD)
1024 \f
1025 /* Global variables used when generating relaxable macros. See the
1026 comment above RELAX_ENCODE for more details about how relaxation
1027 is used. */
1028 static struct {
1029 /* 0 if we're not emitting a relaxable macro.
1030 1 if we're emitting the first of the two relaxation alternatives.
1031 2 if we're emitting the second alternative. */
1032 int sequence;
1033
1034 /* The first relaxable fixup in the current frag. (In other words,
1035 the first fixup that refers to relaxable code.) */
1036 fixS *first_fixup;
1037
1038 /* sizes[0] says how many bytes of the first alternative are stored in
1039 the current frag. Likewise sizes[1] for the second alternative. */
1040 unsigned int sizes[2];
1041
1042 /* The symbol on which the choice of sequence depends. */
1043 symbolS *symbol;
1044 } mips_relax;
1045 \f
1046 /* Global variables used to decide whether a macro needs a warning. */
1047 static struct {
1048 /* True if the macro is in a branch delay slot. */
1049 bfd_boolean delay_slot_p;
1050
1051 /* For relaxable macros, sizes[0] is the length of the first alternative
1052 in bytes and sizes[1] is the length of the second alternative.
1053 For non-relaxable macros, both elements give the length of the
1054 macro in bytes. */
1055 unsigned int sizes[2];
1056
1057 /* The first variant frag for this macro. */
1058 fragS *first_frag;
1059 } mips_macro_warning;
1060 \f
1061 /* Prototypes for static functions. */
1062
1063 #define internalError() \
1064 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1065
1066 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1067
1068 static void append_insn
1069 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1070 static void mips_no_prev_insn (void);
1071 static void macro_build (expressionS *, const char *, const char *, ...);
1072 static void mips16_macro_build
1073 (expressionS *, const char *, const char *, va_list *);
1074 static void load_register (int, expressionS *, int);
1075 static void macro_start (void);
1076 static void macro_end (void);
1077 static void macro (struct mips_cl_insn * ip);
1078 static void mips16_macro (struct mips_cl_insn * ip);
1079 static void mips_ip (char *str, struct mips_cl_insn * ip);
1080 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1081 static void mips16_immed
1082 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1083 unsigned long *, bfd_boolean *, unsigned short *);
1084 static size_t my_getSmallExpression
1085 (expressionS *, bfd_reloc_code_real_type *, char *);
1086 static void my_getExpression (expressionS *, char *);
1087 static void s_align (int);
1088 static void s_change_sec (int);
1089 static void s_change_section (int);
1090 static void s_cons (int);
1091 static void s_float_cons (int);
1092 static void s_mips_globl (int);
1093 static void s_option (int);
1094 static void s_mipsset (int);
1095 static void s_abicalls (int);
1096 static void s_cpload (int);
1097 static void s_cpsetup (int);
1098 static void s_cplocal (int);
1099 static void s_cprestore (int);
1100 static void s_cpreturn (int);
1101 static void s_dtprelword (int);
1102 static void s_dtpreldword (int);
1103 static void s_gpvalue (int);
1104 static void s_gpword (int);
1105 static void s_gpdword (int);
1106 static void s_cpadd (int);
1107 static void s_insn (int);
1108 static void md_obj_begin (void);
1109 static void md_obj_end (void);
1110 static void s_mips_ent (int);
1111 static void s_mips_end (int);
1112 static void s_mips_frame (int);
1113 static void s_mips_mask (int reg_type);
1114 static void s_mips_stab (int);
1115 static void s_mips_weakext (int);
1116 static void s_mips_file (int);
1117 static void s_mips_loc (int);
1118 static bfd_boolean pic_need_relax (symbolS *, asection *);
1119 static int relaxed_branch_length (fragS *, asection *, int);
1120 static int validate_mips_insn (const struct mips_opcode *);
1121
1122 /* Table and functions used to map between CPU/ISA names, and
1123 ISA levels, and CPU numbers. */
1124
1125 struct mips_cpu_info
1126 {
1127 const char *name; /* CPU or ISA name. */
1128 int flags; /* ASEs available, or ISA flag. */
1129 int isa; /* ISA level. */
1130 int cpu; /* CPU number (default CPU if ISA). */
1131 };
1132
1133 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1134 #define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1135 #define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1136 #define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1137 #define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1138 #define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
1139 #define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
1140
1141 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1142 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1143 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1144 \f
1145 /* Pseudo-op table.
1146
1147 The following pseudo-ops from the Kane and Heinrich MIPS book
1148 should be defined here, but are currently unsupported: .alias,
1149 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1150
1151 The following pseudo-ops from the Kane and Heinrich MIPS book are
1152 specific to the type of debugging information being generated, and
1153 should be defined by the object format: .aent, .begin, .bend,
1154 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1155 .vreg.
1156
1157 The following pseudo-ops from the Kane and Heinrich MIPS book are
1158 not MIPS CPU specific, but are also not specific to the object file
1159 format. This file is probably the best place to define them, but
1160 they are not currently supported: .asm0, .endr, .lab, .struct. */
1161
1162 static const pseudo_typeS mips_pseudo_table[] =
1163 {
1164 /* MIPS specific pseudo-ops. */
1165 {"option", s_option, 0},
1166 {"set", s_mipsset, 0},
1167 {"rdata", s_change_sec, 'r'},
1168 {"sdata", s_change_sec, 's'},
1169 {"livereg", s_ignore, 0},
1170 {"abicalls", s_abicalls, 0},
1171 {"cpload", s_cpload, 0},
1172 {"cpsetup", s_cpsetup, 0},
1173 {"cplocal", s_cplocal, 0},
1174 {"cprestore", s_cprestore, 0},
1175 {"cpreturn", s_cpreturn, 0},
1176 {"dtprelword", s_dtprelword, 0},
1177 {"dtpreldword", s_dtpreldword, 0},
1178 {"gpvalue", s_gpvalue, 0},
1179 {"gpword", s_gpword, 0},
1180 {"gpdword", s_gpdword, 0},
1181 {"cpadd", s_cpadd, 0},
1182 {"insn", s_insn, 0},
1183
1184 /* Relatively generic pseudo-ops that happen to be used on MIPS
1185 chips. */
1186 {"asciiz", stringer, 8 + 1},
1187 {"bss", s_change_sec, 'b'},
1188 {"err", s_err, 0},
1189 {"half", s_cons, 1},
1190 {"dword", s_cons, 3},
1191 {"weakext", s_mips_weakext, 0},
1192 {"origin", s_org, 0},
1193 {"repeat", s_rept, 0},
1194
1195 /* For MIPS this is non-standard, but we define it for consistency. */
1196 {"sbss", s_change_sec, 'B'},
1197
1198 /* These pseudo-ops are defined in read.c, but must be overridden
1199 here for one reason or another. */
1200 {"align", s_align, 0},
1201 {"byte", s_cons, 0},
1202 {"data", s_change_sec, 'd'},
1203 {"double", s_float_cons, 'd'},
1204 {"float", s_float_cons, 'f'},
1205 {"globl", s_mips_globl, 0},
1206 {"global", s_mips_globl, 0},
1207 {"hword", s_cons, 1},
1208 {"int", s_cons, 2},
1209 {"long", s_cons, 2},
1210 {"octa", s_cons, 4},
1211 {"quad", s_cons, 3},
1212 {"section", s_change_section, 0},
1213 {"short", s_cons, 1},
1214 {"single", s_float_cons, 'f'},
1215 {"stabn", s_mips_stab, 'n'},
1216 {"text", s_change_sec, 't'},
1217 {"word", s_cons, 2},
1218
1219 { "extern", ecoff_directive_extern, 0},
1220
1221 { NULL, NULL, 0 },
1222 };
1223
1224 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1225 {
1226 /* These pseudo-ops should be defined by the object file format.
1227 However, a.out doesn't support them, so we have versions here. */
1228 {"aent", s_mips_ent, 1},
1229 {"bgnb", s_ignore, 0},
1230 {"end", s_mips_end, 0},
1231 {"endb", s_ignore, 0},
1232 {"ent", s_mips_ent, 0},
1233 {"file", s_mips_file, 0},
1234 {"fmask", s_mips_mask, 'F'},
1235 {"frame", s_mips_frame, 0},
1236 {"loc", s_mips_loc, 0},
1237 {"mask", s_mips_mask, 'R'},
1238 {"verstamp", s_ignore, 0},
1239 { NULL, NULL, 0 },
1240 };
1241
1242 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1243 purpose of the `.dc.a' internal pseudo-op. */
1244
1245 int
1246 mips_address_bytes (void)
1247 {
1248 return HAVE_64BIT_ADDRESSES ? 8 : 4;
1249 }
1250
1251 extern void pop_insert (const pseudo_typeS *);
1252
1253 void
1254 mips_pop_insert (void)
1255 {
1256 pop_insert (mips_pseudo_table);
1257 if (! ECOFF_DEBUGGING)
1258 pop_insert (mips_nonecoff_pseudo_table);
1259 }
1260 \f
1261 /* Symbols labelling the current insn. */
1262
1263 struct insn_label_list
1264 {
1265 struct insn_label_list *next;
1266 symbolS *label;
1267 };
1268
1269 static struct insn_label_list *free_insn_labels;
1270 #define label_list tc_segment_info_data.labels
1271
1272 static void mips_clear_insn_labels (void);
1273
1274 static inline void
1275 mips_clear_insn_labels (void)
1276 {
1277 register struct insn_label_list **pl;
1278 segment_info_type *si;
1279
1280 if (now_seg)
1281 {
1282 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1283 ;
1284
1285 si = seg_info (now_seg);
1286 *pl = si->label_list;
1287 si->label_list = NULL;
1288 }
1289 }
1290
1291 \f
1292 static char *expr_end;
1293
1294 /* Expressions which appear in instructions. These are set by
1295 mips_ip. */
1296
1297 static expressionS imm_expr;
1298 static expressionS imm2_expr;
1299 static expressionS offset_expr;
1300
1301 /* Relocs associated with imm_expr and offset_expr. */
1302
1303 static bfd_reloc_code_real_type imm_reloc[3]
1304 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1305 static bfd_reloc_code_real_type offset_reloc[3]
1306 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1307
1308 /* These are set by mips16_ip if an explicit extension is used. */
1309
1310 static bfd_boolean mips16_small, mips16_ext;
1311
1312 #ifdef OBJ_ELF
1313 /* The pdr segment for per procedure frame/regmask info. Not used for
1314 ECOFF debugging. */
1315
1316 static segT pdr_seg;
1317 #endif
1318
1319 /* The default target format to use. */
1320
1321 #if defined (TE_FreeBSD)
1322 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1323 #elif defined (TE_TMIPS)
1324 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1325 #else
1326 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1327 #endif
1328
1329 const char *
1330 mips_target_format (void)
1331 {
1332 switch (OUTPUT_FLAVOR)
1333 {
1334 case bfd_target_ecoff_flavour:
1335 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1336 case bfd_target_coff_flavour:
1337 return "pe-mips";
1338 case bfd_target_elf_flavour:
1339 #ifdef TE_VXWORKS
1340 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1341 return (target_big_endian
1342 ? "elf32-bigmips-vxworks"
1343 : "elf32-littlemips-vxworks");
1344 #endif
1345 return (target_big_endian
1346 ? (HAVE_64BIT_OBJECTS
1347 ? ELF_TARGET ("elf64-", "big")
1348 : (HAVE_NEWABI
1349 ? ELF_TARGET ("elf32-n", "big")
1350 : ELF_TARGET ("elf32-", "big")))
1351 : (HAVE_64BIT_OBJECTS
1352 ? ELF_TARGET ("elf64-", "little")
1353 : (HAVE_NEWABI
1354 ? ELF_TARGET ("elf32-n", "little")
1355 : ELF_TARGET ("elf32-", "little"))));
1356 default:
1357 abort ();
1358 return NULL;
1359 }
1360 }
1361
1362 /* Return the length of instruction INSN. */
1363
1364 static inline unsigned int
1365 insn_length (const struct mips_cl_insn *insn)
1366 {
1367 if (!mips_opts.mips16)
1368 return 4;
1369 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1370 }
1371
1372 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1373
1374 static void
1375 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1376 {
1377 size_t i;
1378
1379 insn->insn_mo = mo;
1380 insn->use_extend = FALSE;
1381 insn->extend = 0;
1382 insn->insn_opcode = mo->match;
1383 insn->frag = NULL;
1384 insn->where = 0;
1385 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1386 insn->fixp[i] = NULL;
1387 insn->fixed_p = (mips_opts.noreorder > 0);
1388 insn->noreorder_p = (mips_opts.noreorder > 0);
1389 insn->mips16_absolute_jump_p = 0;
1390 insn->complete_p = 0;
1391 }
1392
1393 /* Record the current MIPS16 mode in now_seg. */
1394
1395 static void
1396 mips_record_mips16_mode (void)
1397 {
1398 segment_info_type *si;
1399
1400 si = seg_info (now_seg);
1401 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1402 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1403 }
1404
1405 /* Install INSN at the location specified by its "frag" and "where" fields. */
1406
1407 static void
1408 install_insn (const struct mips_cl_insn *insn)
1409 {
1410 char *f = insn->frag->fr_literal + insn->where;
1411 if (!mips_opts.mips16)
1412 md_number_to_chars (f, insn->insn_opcode, 4);
1413 else if (insn->mips16_absolute_jump_p)
1414 {
1415 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1416 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1417 }
1418 else
1419 {
1420 if (insn->use_extend)
1421 {
1422 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1423 f += 2;
1424 }
1425 md_number_to_chars (f, insn->insn_opcode, 2);
1426 }
1427 mips_record_mips16_mode ();
1428 }
1429
1430 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1431 and install the opcode in the new location. */
1432
1433 static void
1434 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1435 {
1436 size_t i;
1437
1438 insn->frag = frag;
1439 insn->where = where;
1440 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1441 if (insn->fixp[i] != NULL)
1442 {
1443 insn->fixp[i]->fx_frag = frag;
1444 insn->fixp[i]->fx_where = where;
1445 }
1446 install_insn (insn);
1447 }
1448
1449 /* Add INSN to the end of the output. */
1450
1451 static void
1452 add_fixed_insn (struct mips_cl_insn *insn)
1453 {
1454 char *f = frag_more (insn_length (insn));
1455 move_insn (insn, frag_now, f - frag_now->fr_literal);
1456 }
1457
1458 /* Start a variant frag and move INSN to the start of the variant part,
1459 marking it as fixed. The other arguments are as for frag_var. */
1460
1461 static void
1462 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1463 relax_substateT subtype, symbolS *symbol, offsetT offset)
1464 {
1465 frag_grow (max_chars);
1466 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1467 insn->fixed_p = 1;
1468 frag_var (rs_machine_dependent, max_chars, var,
1469 subtype, symbol, offset, NULL);
1470 }
1471
1472 /* Insert N copies of INSN into the history buffer, starting at
1473 position FIRST. Neither FIRST nor N need to be clipped. */
1474
1475 static void
1476 insert_into_history (unsigned int first, unsigned int n,
1477 const struct mips_cl_insn *insn)
1478 {
1479 if (mips_relax.sequence != 2)
1480 {
1481 unsigned int i;
1482
1483 for (i = ARRAY_SIZE (history); i-- > first;)
1484 if (i >= first + n)
1485 history[i] = history[i - n];
1486 else
1487 history[i] = *insn;
1488 }
1489 }
1490
1491 /* Emit a nop instruction, recording it in the history buffer. */
1492
1493 static void
1494 emit_nop (void)
1495 {
1496 add_fixed_insn (NOP_INSN);
1497 insert_into_history (0, 1, NOP_INSN);
1498 }
1499
1500 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1501 the idea is to make it obvious at a glance that each errata is
1502 included. */
1503
1504 static void
1505 init_vr4120_conflicts (void)
1506 {
1507 #define CONFLICT(FIRST, SECOND) \
1508 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1509
1510 /* Errata 21 - [D]DIV[U] after [D]MACC */
1511 CONFLICT (MACC, DIV);
1512 CONFLICT (DMACC, DIV);
1513
1514 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1515 CONFLICT (DMULT, DMULT);
1516 CONFLICT (DMULT, DMACC);
1517 CONFLICT (DMACC, DMULT);
1518 CONFLICT (DMACC, DMACC);
1519
1520 /* Errata 24 - MT{LO,HI} after [D]MACC */
1521 CONFLICT (MACC, MTHILO);
1522 CONFLICT (DMACC, MTHILO);
1523
1524 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1525 instruction is executed immediately after a MACC or DMACC
1526 instruction, the result of [either instruction] is incorrect." */
1527 CONFLICT (MACC, MULT);
1528 CONFLICT (MACC, DMULT);
1529 CONFLICT (DMACC, MULT);
1530 CONFLICT (DMACC, DMULT);
1531
1532 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1533 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1534 DDIV or DDIVU instruction, the result of the MACC or
1535 DMACC instruction is incorrect.". */
1536 CONFLICT (DMULT, MACC);
1537 CONFLICT (DMULT, DMACC);
1538 CONFLICT (DIV, MACC);
1539 CONFLICT (DIV, DMACC);
1540
1541 #undef CONFLICT
1542 }
1543
1544 struct regname {
1545 const char *name;
1546 unsigned int num;
1547 };
1548
1549 #define RTYPE_MASK 0x1ff00
1550 #define RTYPE_NUM 0x00100
1551 #define RTYPE_FPU 0x00200
1552 #define RTYPE_FCC 0x00400
1553 #define RTYPE_VEC 0x00800
1554 #define RTYPE_GP 0x01000
1555 #define RTYPE_CP0 0x02000
1556 #define RTYPE_PC 0x04000
1557 #define RTYPE_ACC 0x08000
1558 #define RTYPE_CCC 0x10000
1559 #define RNUM_MASK 0x000ff
1560 #define RWARN 0x80000
1561
1562 #define GENERIC_REGISTER_NUMBERS \
1563 {"$0", RTYPE_NUM | 0}, \
1564 {"$1", RTYPE_NUM | 1}, \
1565 {"$2", RTYPE_NUM | 2}, \
1566 {"$3", RTYPE_NUM | 3}, \
1567 {"$4", RTYPE_NUM | 4}, \
1568 {"$5", RTYPE_NUM | 5}, \
1569 {"$6", RTYPE_NUM | 6}, \
1570 {"$7", RTYPE_NUM | 7}, \
1571 {"$8", RTYPE_NUM | 8}, \
1572 {"$9", RTYPE_NUM | 9}, \
1573 {"$10", RTYPE_NUM | 10}, \
1574 {"$11", RTYPE_NUM | 11}, \
1575 {"$12", RTYPE_NUM | 12}, \
1576 {"$13", RTYPE_NUM | 13}, \
1577 {"$14", RTYPE_NUM | 14}, \
1578 {"$15", RTYPE_NUM | 15}, \
1579 {"$16", RTYPE_NUM | 16}, \
1580 {"$17", RTYPE_NUM | 17}, \
1581 {"$18", RTYPE_NUM | 18}, \
1582 {"$19", RTYPE_NUM | 19}, \
1583 {"$20", RTYPE_NUM | 20}, \
1584 {"$21", RTYPE_NUM | 21}, \
1585 {"$22", RTYPE_NUM | 22}, \
1586 {"$23", RTYPE_NUM | 23}, \
1587 {"$24", RTYPE_NUM | 24}, \
1588 {"$25", RTYPE_NUM | 25}, \
1589 {"$26", RTYPE_NUM | 26}, \
1590 {"$27", RTYPE_NUM | 27}, \
1591 {"$28", RTYPE_NUM | 28}, \
1592 {"$29", RTYPE_NUM | 29}, \
1593 {"$30", RTYPE_NUM | 30}, \
1594 {"$31", RTYPE_NUM | 31}
1595
1596 #define FPU_REGISTER_NAMES \
1597 {"$f0", RTYPE_FPU | 0}, \
1598 {"$f1", RTYPE_FPU | 1}, \
1599 {"$f2", RTYPE_FPU | 2}, \
1600 {"$f3", RTYPE_FPU | 3}, \
1601 {"$f4", RTYPE_FPU | 4}, \
1602 {"$f5", RTYPE_FPU | 5}, \
1603 {"$f6", RTYPE_FPU | 6}, \
1604 {"$f7", RTYPE_FPU | 7}, \
1605 {"$f8", RTYPE_FPU | 8}, \
1606 {"$f9", RTYPE_FPU | 9}, \
1607 {"$f10", RTYPE_FPU | 10}, \
1608 {"$f11", RTYPE_FPU | 11}, \
1609 {"$f12", RTYPE_FPU | 12}, \
1610 {"$f13", RTYPE_FPU | 13}, \
1611 {"$f14", RTYPE_FPU | 14}, \
1612 {"$f15", RTYPE_FPU | 15}, \
1613 {"$f16", RTYPE_FPU | 16}, \
1614 {"$f17", RTYPE_FPU | 17}, \
1615 {"$f18", RTYPE_FPU | 18}, \
1616 {"$f19", RTYPE_FPU | 19}, \
1617 {"$f20", RTYPE_FPU | 20}, \
1618 {"$f21", RTYPE_FPU | 21}, \
1619 {"$f22", RTYPE_FPU | 22}, \
1620 {"$f23", RTYPE_FPU | 23}, \
1621 {"$f24", RTYPE_FPU | 24}, \
1622 {"$f25", RTYPE_FPU | 25}, \
1623 {"$f26", RTYPE_FPU | 26}, \
1624 {"$f27", RTYPE_FPU | 27}, \
1625 {"$f28", RTYPE_FPU | 28}, \
1626 {"$f29", RTYPE_FPU | 29}, \
1627 {"$f30", RTYPE_FPU | 30}, \
1628 {"$f31", RTYPE_FPU | 31}
1629
1630 #define FPU_CONDITION_CODE_NAMES \
1631 {"$fcc0", RTYPE_FCC | 0}, \
1632 {"$fcc1", RTYPE_FCC | 1}, \
1633 {"$fcc2", RTYPE_FCC | 2}, \
1634 {"$fcc3", RTYPE_FCC | 3}, \
1635 {"$fcc4", RTYPE_FCC | 4}, \
1636 {"$fcc5", RTYPE_FCC | 5}, \
1637 {"$fcc6", RTYPE_FCC | 6}, \
1638 {"$fcc7", RTYPE_FCC | 7}
1639
1640 #define COPROC_CONDITION_CODE_NAMES \
1641 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1642 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1643 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1644 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1645 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1646 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1647 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1648 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1649
1650 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1651 {"$a4", RTYPE_GP | 8}, \
1652 {"$a5", RTYPE_GP | 9}, \
1653 {"$a6", RTYPE_GP | 10}, \
1654 {"$a7", RTYPE_GP | 11}, \
1655 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1656 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1657 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1658 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1659 {"$t0", RTYPE_GP | 12}, \
1660 {"$t1", RTYPE_GP | 13}, \
1661 {"$t2", RTYPE_GP | 14}, \
1662 {"$t3", RTYPE_GP | 15}
1663
1664 #define O32_SYMBOLIC_REGISTER_NAMES \
1665 {"$t0", RTYPE_GP | 8}, \
1666 {"$t1", RTYPE_GP | 9}, \
1667 {"$t2", RTYPE_GP | 10}, \
1668 {"$t3", RTYPE_GP | 11}, \
1669 {"$t4", RTYPE_GP | 12}, \
1670 {"$t5", RTYPE_GP | 13}, \
1671 {"$t6", RTYPE_GP | 14}, \
1672 {"$t7", RTYPE_GP | 15}, \
1673 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1674 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1675 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1676 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1677
1678 /* Remaining symbolic register names */
1679 #define SYMBOLIC_REGISTER_NAMES \
1680 {"$zero", RTYPE_GP | 0}, \
1681 {"$at", RTYPE_GP | 1}, \
1682 {"$AT", RTYPE_GP | 1}, \
1683 {"$v0", RTYPE_GP | 2}, \
1684 {"$v1", RTYPE_GP | 3}, \
1685 {"$a0", RTYPE_GP | 4}, \
1686 {"$a1", RTYPE_GP | 5}, \
1687 {"$a2", RTYPE_GP | 6}, \
1688 {"$a3", RTYPE_GP | 7}, \
1689 {"$s0", RTYPE_GP | 16}, \
1690 {"$s1", RTYPE_GP | 17}, \
1691 {"$s2", RTYPE_GP | 18}, \
1692 {"$s3", RTYPE_GP | 19}, \
1693 {"$s4", RTYPE_GP | 20}, \
1694 {"$s5", RTYPE_GP | 21}, \
1695 {"$s6", RTYPE_GP | 22}, \
1696 {"$s7", RTYPE_GP | 23}, \
1697 {"$t8", RTYPE_GP | 24}, \
1698 {"$t9", RTYPE_GP | 25}, \
1699 {"$k0", RTYPE_GP | 26}, \
1700 {"$kt0", RTYPE_GP | 26}, \
1701 {"$k1", RTYPE_GP | 27}, \
1702 {"$kt1", RTYPE_GP | 27}, \
1703 {"$gp", RTYPE_GP | 28}, \
1704 {"$sp", RTYPE_GP | 29}, \
1705 {"$s8", RTYPE_GP | 30}, \
1706 {"$fp", RTYPE_GP | 30}, \
1707 {"$ra", RTYPE_GP | 31}
1708
1709 #define MIPS16_SPECIAL_REGISTER_NAMES \
1710 {"$pc", RTYPE_PC | 0}
1711
1712 #define MDMX_VECTOR_REGISTER_NAMES \
1713 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1714 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1715 {"$v2", RTYPE_VEC | 2}, \
1716 {"$v3", RTYPE_VEC | 3}, \
1717 {"$v4", RTYPE_VEC | 4}, \
1718 {"$v5", RTYPE_VEC | 5}, \
1719 {"$v6", RTYPE_VEC | 6}, \
1720 {"$v7", RTYPE_VEC | 7}, \
1721 {"$v8", RTYPE_VEC | 8}, \
1722 {"$v9", RTYPE_VEC | 9}, \
1723 {"$v10", RTYPE_VEC | 10}, \
1724 {"$v11", RTYPE_VEC | 11}, \
1725 {"$v12", RTYPE_VEC | 12}, \
1726 {"$v13", RTYPE_VEC | 13}, \
1727 {"$v14", RTYPE_VEC | 14}, \
1728 {"$v15", RTYPE_VEC | 15}, \
1729 {"$v16", RTYPE_VEC | 16}, \
1730 {"$v17", RTYPE_VEC | 17}, \
1731 {"$v18", RTYPE_VEC | 18}, \
1732 {"$v19", RTYPE_VEC | 19}, \
1733 {"$v20", RTYPE_VEC | 20}, \
1734 {"$v21", RTYPE_VEC | 21}, \
1735 {"$v22", RTYPE_VEC | 22}, \
1736 {"$v23", RTYPE_VEC | 23}, \
1737 {"$v24", RTYPE_VEC | 24}, \
1738 {"$v25", RTYPE_VEC | 25}, \
1739 {"$v26", RTYPE_VEC | 26}, \
1740 {"$v27", RTYPE_VEC | 27}, \
1741 {"$v28", RTYPE_VEC | 28}, \
1742 {"$v29", RTYPE_VEC | 29}, \
1743 {"$v30", RTYPE_VEC | 30}, \
1744 {"$v31", RTYPE_VEC | 31}
1745
1746 #define MIPS_DSP_ACCUMULATOR_NAMES \
1747 {"$ac0", RTYPE_ACC | 0}, \
1748 {"$ac1", RTYPE_ACC | 1}, \
1749 {"$ac2", RTYPE_ACC | 2}, \
1750 {"$ac3", RTYPE_ACC | 3}
1751
1752 static const struct regname reg_names[] = {
1753 GENERIC_REGISTER_NUMBERS,
1754 FPU_REGISTER_NAMES,
1755 FPU_CONDITION_CODE_NAMES,
1756 COPROC_CONDITION_CODE_NAMES,
1757
1758 /* The $txx registers depends on the abi,
1759 these will be added later into the symbol table from
1760 one of the tables below once mips_abi is set after
1761 parsing of arguments from the command line. */
1762 SYMBOLIC_REGISTER_NAMES,
1763
1764 MIPS16_SPECIAL_REGISTER_NAMES,
1765 MDMX_VECTOR_REGISTER_NAMES,
1766 MIPS_DSP_ACCUMULATOR_NAMES,
1767 {0, 0}
1768 };
1769
1770 static const struct regname reg_names_o32[] = {
1771 O32_SYMBOLIC_REGISTER_NAMES,
1772 {0, 0}
1773 };
1774
1775 static const struct regname reg_names_n32n64[] = {
1776 N32N64_SYMBOLIC_REGISTER_NAMES,
1777 {0, 0}
1778 };
1779
1780 static int
1781 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1782 {
1783 symbolS *symbolP;
1784 char *e;
1785 char save_c;
1786 int reg = -1;
1787
1788 /* Find end of name. */
1789 e = *s;
1790 if (is_name_beginner (*e))
1791 ++e;
1792 while (is_part_of_name (*e))
1793 ++e;
1794
1795 /* Terminate name. */
1796 save_c = *e;
1797 *e = '\0';
1798
1799 /* Look for a register symbol. */
1800 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1801 {
1802 int r = S_GET_VALUE (symbolP);
1803 if (r & types)
1804 reg = r & RNUM_MASK;
1805 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1806 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1807 reg = (r & RNUM_MASK) - 2;
1808 }
1809 /* Else see if this is a register defined in an itbl entry. */
1810 else if ((types & RTYPE_GP) && itbl_have_entries)
1811 {
1812 char *n = *s;
1813 unsigned long r;
1814
1815 if (*n == '$')
1816 ++n;
1817 if (itbl_get_reg_val (n, &r))
1818 reg = r & RNUM_MASK;
1819 }
1820
1821 /* Advance to next token if a register was recognised. */
1822 if (reg >= 0)
1823 *s = e;
1824 else if (types & RWARN)
1825 as_warn (_("Unrecognized register name `%s'"), *s);
1826
1827 *e = save_c;
1828 if (regnop)
1829 *regnop = reg;
1830 return reg >= 0;
1831 }
1832
1833 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1834 architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
1835
1836 static bfd_boolean
1837 is_opcode_valid (const struct mips_opcode *mo)
1838 {
1839 int isa = mips_opts.isa;
1840 int fp_s, fp_d;
1841
1842 if (mips_opts.ase_mdmx)
1843 isa |= INSN_MDMX;
1844 if (mips_opts.ase_dsp)
1845 isa |= INSN_DSP;
1846 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1847 isa |= INSN_DSP64;
1848 if (mips_opts.ase_dspr2)
1849 isa |= INSN_DSPR2;
1850 if (mips_opts.ase_mt)
1851 isa |= INSN_MT;
1852 if (mips_opts.ase_mips3d)
1853 isa |= INSN_MIPS3D;
1854 if (mips_opts.ase_smartmips)
1855 isa |= INSN_SMARTMIPS;
1856
1857 /* Don't accept instructions based on the ISA if the CPU does not implement
1858 all the coprocessor insns. */
1859 if (NO_ISA_COP (mips_opts.arch)
1860 && COP_INSN (mo->pinfo))
1861 isa = 0;
1862
1863 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1864 return FALSE;
1865
1866 /* Check whether the instruction or macro requires single-precision or
1867 double-precision floating-point support. Note that this information is
1868 stored differently in the opcode table for insns and macros. */
1869 if (mo->pinfo == INSN_MACRO)
1870 {
1871 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1872 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1873 }
1874 else
1875 {
1876 fp_s = mo->pinfo & FP_S;
1877 fp_d = mo->pinfo & FP_D;
1878 }
1879
1880 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1881 return FALSE;
1882
1883 if (fp_s && mips_opts.soft_float)
1884 return FALSE;
1885
1886 return TRUE;
1887 }
1888
1889 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1890 selected ISA and architecture. */
1891
1892 static bfd_boolean
1893 is_opcode_valid_16 (const struct mips_opcode *mo)
1894 {
1895 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1896 }
1897
1898 /* This function is called once, at assembler startup time. It should set up
1899 all the tables, etc. that the MD part of the assembler will need. */
1900
1901 void
1902 md_begin (void)
1903 {
1904 const char *retval = NULL;
1905 int i = 0;
1906 int broken = 0;
1907
1908 if (mips_pic != NO_PIC)
1909 {
1910 if (g_switch_seen && g_switch_value != 0)
1911 as_bad (_("-G may not be used in position-independent code"));
1912 g_switch_value = 0;
1913 }
1914
1915 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1916 as_warn (_("Could not set architecture and machine"));
1917
1918 op_hash = hash_new ();
1919
1920 for (i = 0; i < NUMOPCODES;)
1921 {
1922 const char *name = mips_opcodes[i].name;
1923
1924 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1925 if (retval != NULL)
1926 {
1927 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1928 mips_opcodes[i].name, retval);
1929 /* Probably a memory allocation problem? Give up now. */
1930 as_fatal (_("Broken assembler. No assembly attempted."));
1931 }
1932 do
1933 {
1934 if (mips_opcodes[i].pinfo != INSN_MACRO)
1935 {
1936 if (!validate_mips_insn (&mips_opcodes[i]))
1937 broken = 1;
1938 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1939 {
1940 create_insn (&nop_insn, mips_opcodes + i);
1941 if (mips_fix_loongson2f_nop)
1942 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1943 nop_insn.fixed_p = 1;
1944 }
1945 }
1946 ++i;
1947 }
1948 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1949 }
1950
1951 mips16_op_hash = hash_new ();
1952
1953 i = 0;
1954 while (i < bfd_mips16_num_opcodes)
1955 {
1956 const char *name = mips16_opcodes[i].name;
1957
1958 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1959 if (retval != NULL)
1960 as_fatal (_("internal: can't hash `%s': %s"),
1961 mips16_opcodes[i].name, retval);
1962 do
1963 {
1964 if (mips16_opcodes[i].pinfo != INSN_MACRO
1965 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1966 != mips16_opcodes[i].match))
1967 {
1968 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1969 mips16_opcodes[i].name, mips16_opcodes[i].args);
1970 broken = 1;
1971 }
1972 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1973 {
1974 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1975 mips16_nop_insn.fixed_p = 1;
1976 }
1977 ++i;
1978 }
1979 while (i < bfd_mips16_num_opcodes
1980 && strcmp (mips16_opcodes[i].name, name) == 0);
1981 }
1982
1983 if (broken)
1984 as_fatal (_("Broken assembler. No assembly attempted."));
1985
1986 /* We add all the general register names to the symbol table. This
1987 helps us detect invalid uses of them. */
1988 for (i = 0; reg_names[i].name; i++)
1989 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1990 reg_names[i].num, /* & RNUM_MASK, */
1991 &zero_address_frag));
1992 if (HAVE_NEWABI)
1993 for (i = 0; reg_names_n32n64[i].name; i++)
1994 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1995 reg_names_n32n64[i].num, /* & RNUM_MASK, */
1996 &zero_address_frag));
1997 else
1998 for (i = 0; reg_names_o32[i].name; i++)
1999 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2000 reg_names_o32[i].num, /* & RNUM_MASK, */
2001 &zero_address_frag));
2002
2003 mips_no_prev_insn ();
2004
2005 mips_gprmask = 0;
2006 mips_cprmask[0] = 0;
2007 mips_cprmask[1] = 0;
2008 mips_cprmask[2] = 0;
2009 mips_cprmask[3] = 0;
2010
2011 /* set the default alignment for the text section (2**2) */
2012 record_alignment (text_section, 2);
2013
2014 bfd_set_gp_size (stdoutput, g_switch_value);
2015
2016 #ifdef OBJ_ELF
2017 if (IS_ELF)
2018 {
2019 /* On a native system other than VxWorks, sections must be aligned
2020 to 16 byte boundaries. When configured for an embedded ELF
2021 target, we don't bother. */
2022 if (strncmp (TARGET_OS, "elf", 3) != 0
2023 && strncmp (TARGET_OS, "vxworks", 7) != 0)
2024 {
2025 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2026 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2027 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2028 }
2029
2030 /* Create a .reginfo section for register masks and a .mdebug
2031 section for debugging information. */
2032 {
2033 segT seg;
2034 subsegT subseg;
2035 flagword flags;
2036 segT sec;
2037
2038 seg = now_seg;
2039 subseg = now_subseg;
2040
2041 /* The ABI says this section should be loaded so that the
2042 running program can access it. However, we don't load it
2043 if we are configured for an embedded target */
2044 flags = SEC_READONLY | SEC_DATA;
2045 if (strncmp (TARGET_OS, "elf", 3) != 0)
2046 flags |= SEC_ALLOC | SEC_LOAD;
2047
2048 if (mips_abi != N64_ABI)
2049 {
2050 sec = subseg_new (".reginfo", (subsegT) 0);
2051
2052 bfd_set_section_flags (stdoutput, sec, flags);
2053 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2054
2055 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2056 }
2057 else
2058 {
2059 /* The 64-bit ABI uses a .MIPS.options section rather than
2060 .reginfo section. */
2061 sec = subseg_new (".MIPS.options", (subsegT) 0);
2062 bfd_set_section_flags (stdoutput, sec, flags);
2063 bfd_set_section_alignment (stdoutput, sec, 3);
2064
2065 /* Set up the option header. */
2066 {
2067 Elf_Internal_Options opthdr;
2068 char *f;
2069
2070 opthdr.kind = ODK_REGINFO;
2071 opthdr.size = (sizeof (Elf_External_Options)
2072 + sizeof (Elf64_External_RegInfo));
2073 opthdr.section = 0;
2074 opthdr.info = 0;
2075 f = frag_more (sizeof (Elf_External_Options));
2076 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2077 (Elf_External_Options *) f);
2078
2079 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2080 }
2081 }
2082
2083 if (ECOFF_DEBUGGING)
2084 {
2085 sec = subseg_new (".mdebug", (subsegT) 0);
2086 (void) bfd_set_section_flags (stdoutput, sec,
2087 SEC_HAS_CONTENTS | SEC_READONLY);
2088 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2089 }
2090 else if (mips_flag_pdr)
2091 {
2092 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2093 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2094 SEC_READONLY | SEC_RELOC
2095 | SEC_DEBUGGING);
2096 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2097 }
2098
2099 subseg_set (seg, subseg);
2100 }
2101 }
2102 #endif /* OBJ_ELF */
2103
2104 if (! ECOFF_DEBUGGING)
2105 md_obj_begin ();
2106
2107 if (mips_fix_vr4120)
2108 init_vr4120_conflicts ();
2109 }
2110
2111 void
2112 md_mips_end (void)
2113 {
2114 if (! ECOFF_DEBUGGING)
2115 md_obj_end ();
2116 }
2117
2118 void
2119 md_assemble (char *str)
2120 {
2121 struct mips_cl_insn insn;
2122 bfd_reloc_code_real_type unused_reloc[3]
2123 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2124
2125 imm_expr.X_op = O_absent;
2126 imm2_expr.X_op = O_absent;
2127 offset_expr.X_op = O_absent;
2128 imm_reloc[0] = BFD_RELOC_UNUSED;
2129 imm_reloc[1] = BFD_RELOC_UNUSED;
2130 imm_reloc[2] = BFD_RELOC_UNUSED;
2131 offset_reloc[0] = BFD_RELOC_UNUSED;
2132 offset_reloc[1] = BFD_RELOC_UNUSED;
2133 offset_reloc[2] = BFD_RELOC_UNUSED;
2134
2135 if (mips_opts.mips16)
2136 mips16_ip (str, &insn);
2137 else
2138 {
2139 mips_ip (str, &insn);
2140 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2141 str, insn.insn_opcode));
2142 }
2143
2144 if (insn_error)
2145 {
2146 as_bad ("%s `%s'", insn_error, str);
2147 return;
2148 }
2149
2150 if (insn.insn_mo->pinfo == INSN_MACRO)
2151 {
2152 macro_start ();
2153 if (mips_opts.mips16)
2154 mips16_macro (&insn);
2155 else
2156 macro (&insn);
2157 macro_end ();
2158 }
2159 else
2160 {
2161 if (imm_expr.X_op != O_absent)
2162 append_insn (&insn, &imm_expr, imm_reloc);
2163 else if (offset_expr.X_op != O_absent)
2164 append_insn (&insn, &offset_expr, offset_reloc);
2165 else
2166 append_insn (&insn, NULL, unused_reloc);
2167 }
2168 }
2169
2170 /* Convenience functions for abstracting away the differences between
2171 MIPS16 and non-MIPS16 relocations. */
2172
2173 static inline bfd_boolean
2174 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2175 {
2176 switch (reloc)
2177 {
2178 case BFD_RELOC_MIPS16_JMP:
2179 case BFD_RELOC_MIPS16_GPREL:
2180 case BFD_RELOC_MIPS16_GOT16:
2181 case BFD_RELOC_MIPS16_CALL16:
2182 case BFD_RELOC_MIPS16_HI16_S:
2183 case BFD_RELOC_MIPS16_HI16:
2184 case BFD_RELOC_MIPS16_LO16:
2185 return TRUE;
2186
2187 default:
2188 return FALSE;
2189 }
2190 }
2191
2192 static inline bfd_boolean
2193 got16_reloc_p (bfd_reloc_code_real_type reloc)
2194 {
2195 return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2196 }
2197
2198 static inline bfd_boolean
2199 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2200 {
2201 return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2202 }
2203
2204 static inline bfd_boolean
2205 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2206 {
2207 return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2208 }
2209
2210 /* Return true if the given relocation might need a matching %lo().
2211 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2212 need a matching %lo() when applied to local symbols. */
2213
2214 static inline bfd_boolean
2215 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2216 {
2217 return (HAVE_IN_PLACE_ADDENDS
2218 && (hi16_reloc_p (reloc)
2219 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2220 all GOT16 relocations evaluate to "G". */
2221 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2222 }
2223
2224 /* Return the type of %lo() reloc needed by RELOC, given that
2225 reloc_needs_lo_p. */
2226
2227 static inline bfd_reloc_code_real_type
2228 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2229 {
2230 return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2231 }
2232
2233 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2234 relocation. */
2235
2236 static inline bfd_boolean
2237 fixup_has_matching_lo_p (fixS *fixp)
2238 {
2239 return (fixp->fx_next != NULL
2240 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2241 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2242 && fixp->fx_offset == fixp->fx_next->fx_offset);
2243 }
2244
2245 /* See whether instruction IP reads register REG. CLASS is the type
2246 of register. */
2247
2248 static int
2249 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2250 enum mips_regclass regclass)
2251 {
2252 if (regclass == MIPS16_REG)
2253 {
2254 gas_assert (mips_opts.mips16);
2255 reg = mips16_to_32_reg_map[reg];
2256 regclass = MIPS_GR_REG;
2257 }
2258
2259 /* Don't report on general register ZERO, since it never changes. */
2260 if (regclass == MIPS_GR_REG && reg == ZERO)
2261 return 0;
2262
2263 if (regclass == MIPS_FP_REG)
2264 {
2265 gas_assert (! mips_opts.mips16);
2266 /* If we are called with either $f0 or $f1, we must check $f0.
2267 This is not optimal, because it will introduce an unnecessary
2268 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2269 need to distinguish reading both $f0 and $f1 or just one of
2270 them. Note that we don't have to check the other way,
2271 because there is no instruction that sets both $f0 and $f1
2272 and requires a delay. */
2273 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2274 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2275 == (reg &~ (unsigned) 1)))
2276 return 1;
2277 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2278 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2279 == (reg &~ (unsigned) 1)))
2280 return 1;
2281 if ((ip->insn_mo->pinfo2 & INSN2_READ_FPR_Z)
2282 && ((EXTRACT_OPERAND (FZ, *ip) & ~(unsigned) 1)
2283 == (reg &~ (unsigned) 1)))
2284 return 1;
2285 }
2286 else if (! mips_opts.mips16)
2287 {
2288 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2289 && EXTRACT_OPERAND (RS, *ip) == reg)
2290 return 1;
2291 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2292 && EXTRACT_OPERAND (RT, *ip) == reg)
2293 return 1;
2294 if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_D)
2295 && EXTRACT_OPERAND (RD, *ip) == reg)
2296 return 1;
2297 if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_Z)
2298 && EXTRACT_OPERAND (RZ, *ip) == reg)
2299 return 1;
2300 }
2301 else
2302 {
2303 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2304 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2305 return 1;
2306 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2307 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2308 return 1;
2309 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2310 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2311 == reg))
2312 return 1;
2313 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2314 return 1;
2315 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2316 return 1;
2317 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2318 return 1;
2319 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2320 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2321 return 1;
2322 }
2323
2324 return 0;
2325 }
2326
2327 /* This function returns true if modifying a register requires a
2328 delay. */
2329
2330 static int
2331 reg_needs_delay (unsigned int reg)
2332 {
2333 unsigned long prev_pinfo;
2334
2335 prev_pinfo = history[0].insn_mo->pinfo;
2336 if (! mips_opts.noreorder
2337 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2338 && ! gpr_interlocks)
2339 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2340 && ! cop_interlocks)))
2341 {
2342 /* A load from a coprocessor or from memory. All load delays
2343 delay the use of general register rt for one instruction. */
2344 /* Itbl support may require additional care here. */
2345 know (prev_pinfo & INSN_WRITE_GPR_T);
2346 if (reg == EXTRACT_OPERAND (RT, history[0]))
2347 return 1;
2348 }
2349
2350 return 0;
2351 }
2352
2353 /* Move all labels in insn_labels to the current insertion point. */
2354
2355 static void
2356 mips_move_labels (void)
2357 {
2358 segment_info_type *si = seg_info (now_seg);
2359 struct insn_label_list *l;
2360 valueT val;
2361
2362 for (l = si->label_list; l != NULL; l = l->next)
2363 {
2364 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2365 symbol_set_frag (l->label, frag_now);
2366 val = (valueT) frag_now_fix ();
2367 /* mips16 text labels are stored as odd. */
2368 if (mips_opts.mips16)
2369 ++val;
2370 S_SET_VALUE (l->label, val);
2371 }
2372 }
2373
2374 static bfd_boolean
2375 s_is_linkonce (symbolS *sym, segT from_seg)
2376 {
2377 bfd_boolean linkonce = FALSE;
2378 segT symseg = S_GET_SEGMENT (sym);
2379
2380 if (symseg != from_seg && !S_IS_LOCAL (sym))
2381 {
2382 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2383 linkonce = TRUE;
2384 #ifdef OBJ_ELF
2385 /* The GNU toolchain uses an extension for ELF: a section
2386 beginning with the magic string .gnu.linkonce is a
2387 linkonce section. */
2388 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2389 sizeof ".gnu.linkonce" - 1) == 0)
2390 linkonce = TRUE;
2391 #endif
2392 }
2393 return linkonce;
2394 }
2395
2396 /* Mark instruction labels in mips16 mode. This permits the linker to
2397 handle them specially, such as generating jalx instructions when
2398 needed. We also make them odd for the duration of the assembly, in
2399 order to generate the right sort of code. We will make them even
2400 in the adjust_symtab routine, while leaving them marked. This is
2401 convenient for the debugger and the disassembler. The linker knows
2402 to make them odd again. */
2403
2404 static void
2405 mips16_mark_labels (void)
2406 {
2407 segment_info_type *si = seg_info (now_seg);
2408 struct insn_label_list *l;
2409
2410 if (!mips_opts.mips16)
2411 return;
2412
2413 for (l = si->label_list; l != NULL; l = l->next)
2414 {
2415 symbolS *label = l->label;
2416
2417 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2418 if (IS_ELF)
2419 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2420 #endif
2421 if ((S_GET_VALUE (label) & 1) == 0
2422 /* Don't adjust the address if the label is global or weak, or
2423 in a link-once section, since we'll be emitting symbol reloc
2424 references to it which will be patched up by the linker, and
2425 the final value of the symbol may or may not be MIPS16. */
2426 && ! S_IS_WEAK (label)
2427 && ! S_IS_EXTERNAL (label)
2428 && ! s_is_linkonce (label, now_seg))
2429 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2430 }
2431 }
2432
2433 /* End the current frag. Make it a variant frag and record the
2434 relaxation info. */
2435
2436 static void
2437 relax_close_frag (void)
2438 {
2439 mips_macro_warning.first_frag = frag_now;
2440 frag_var (rs_machine_dependent, 0, 0,
2441 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2442 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2443
2444 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2445 mips_relax.first_fixup = 0;
2446 }
2447
2448 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2449 See the comment above RELAX_ENCODE for more details. */
2450
2451 static void
2452 relax_start (symbolS *symbol)
2453 {
2454 gas_assert (mips_relax.sequence == 0);
2455 mips_relax.sequence = 1;
2456 mips_relax.symbol = symbol;
2457 }
2458
2459 /* Start generating the second version of a relaxable sequence.
2460 See the comment above RELAX_ENCODE for more details. */
2461
2462 static void
2463 relax_switch (void)
2464 {
2465 gas_assert (mips_relax.sequence == 1);
2466 mips_relax.sequence = 2;
2467 }
2468
2469 /* End the current relaxable sequence. */
2470
2471 static void
2472 relax_end (void)
2473 {
2474 gas_assert (mips_relax.sequence == 2);
2475 relax_close_frag ();
2476 mips_relax.sequence = 0;
2477 }
2478
2479 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2480 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2481 by VR4120 errata. */
2482
2483 static unsigned int
2484 classify_vr4120_insn (const char *name)
2485 {
2486 if (strncmp (name, "macc", 4) == 0)
2487 return FIX_VR4120_MACC;
2488 if (strncmp (name, "dmacc", 5) == 0)
2489 return FIX_VR4120_DMACC;
2490 if (strncmp (name, "mult", 4) == 0)
2491 return FIX_VR4120_MULT;
2492 if (strncmp (name, "dmult", 5) == 0)
2493 return FIX_VR4120_DMULT;
2494 if (strstr (name, "div"))
2495 return FIX_VR4120_DIV;
2496 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2497 return FIX_VR4120_MTHILO;
2498 return NUM_FIX_VR4120_CLASSES;
2499 }
2500
2501 #define INSN_ERET 0x42000018
2502 #define INSN_DERET 0x4200001f
2503
2504 /* Return the number of instructions that must separate INSN1 and INSN2,
2505 where INSN1 is the earlier instruction. Return the worst-case value
2506 for any INSN2 if INSN2 is null. */
2507
2508 static unsigned int
2509 insns_between (const struct mips_cl_insn *insn1,
2510 const struct mips_cl_insn *insn2)
2511 {
2512 unsigned long pinfo1, pinfo2;
2513
2514 /* This function needs to know which pinfo flags are set for INSN2
2515 and which registers INSN2 uses. The former is stored in PINFO2 and
2516 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2517 will have every flag set and INSN2_USES_REG will always return true. */
2518 pinfo1 = insn1->insn_mo->pinfo;
2519 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2520
2521 #define INSN2_USES_REG(REG, CLASS) \
2522 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2523
2524 /* For most targets, write-after-read dependencies on the HI and LO
2525 registers must be separated by at least two instructions. */
2526 if (!hilo_interlocks)
2527 {
2528 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2529 return 2;
2530 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2531 return 2;
2532 }
2533
2534 /* If we're working around r7000 errata, there must be two instructions
2535 between an mfhi or mflo and any instruction that uses the result. */
2536 if (mips_7000_hilo_fix
2537 && MF_HILO_INSN (pinfo1)
2538 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2539 return 2;
2540
2541 /* If we're working around 24K errata, one instruction is required
2542 if an ERET or DERET is followed by a branch instruction. */
2543 if (mips_fix_24k)
2544 {
2545 if (insn1->insn_opcode == INSN_ERET
2546 || insn1->insn_opcode == INSN_DERET)
2547 {
2548 if (insn2 == NULL
2549 || insn2->insn_opcode == INSN_ERET
2550 || insn2->insn_opcode == INSN_DERET
2551 || (insn2->insn_mo->pinfo
2552 & (INSN_UNCOND_BRANCH_DELAY
2553 | INSN_COND_BRANCH_DELAY
2554 | INSN_COND_BRANCH_LIKELY)) != 0)
2555 return 1;
2556 }
2557 }
2558
2559 /* If working around VR4120 errata, check for combinations that need
2560 a single intervening instruction. */
2561 if (mips_fix_vr4120)
2562 {
2563 unsigned int class1, class2;
2564
2565 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2566 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2567 {
2568 if (insn2 == NULL)
2569 return 1;
2570 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2571 if (vr4120_conflicts[class1] & (1 << class2))
2572 return 1;
2573 }
2574 }
2575
2576 if (!mips_opts.mips16)
2577 {
2578 /* Check for GPR or coprocessor load delays. All such delays
2579 are on the RT register. */
2580 /* Itbl support may require additional care here. */
2581 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2582 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2583 {
2584 know (pinfo1 & INSN_WRITE_GPR_T);
2585 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2586 return 1;
2587 }
2588
2589 /* Check for generic coprocessor hazards.
2590
2591 This case is not handled very well. There is no special
2592 knowledge of CP0 handling, and the coprocessors other than
2593 the floating point unit are not distinguished at all. */
2594 /* Itbl support may require additional care here. FIXME!
2595 Need to modify this to include knowledge about
2596 user specified delays! */
2597 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2598 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2599 {
2600 /* Handle cases where INSN1 writes to a known general coprocessor
2601 register. There must be a one instruction delay before INSN2
2602 if INSN2 reads that register, otherwise no delay is needed. */
2603 if (pinfo1 & INSN_WRITE_FPR_T)
2604 {
2605 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2606 return 1;
2607 }
2608 else if (pinfo1 & INSN_WRITE_FPR_S)
2609 {
2610 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2611 return 1;
2612 }
2613 else
2614 {
2615 /* Read-after-write dependencies on the control registers
2616 require a two-instruction gap. */
2617 if ((pinfo1 & INSN_WRITE_COND_CODE)
2618 && (pinfo2 & INSN_READ_COND_CODE))
2619 return 2;
2620
2621 /* We don't know exactly what INSN1 does. If INSN2 is
2622 also a coprocessor instruction, assume there must be
2623 a one instruction gap. */
2624 if (pinfo2 & INSN_COP)
2625 return 1;
2626 }
2627 }
2628
2629 /* Check for read-after-write dependencies on the coprocessor
2630 control registers in cases where INSN1 does not need a general
2631 coprocessor delay. This means that INSN1 is a floating point
2632 comparison instruction. */
2633 /* Itbl support may require additional care here. */
2634 else if (!cop_interlocks
2635 && (pinfo1 & INSN_WRITE_COND_CODE)
2636 && (pinfo2 & INSN_READ_COND_CODE))
2637 return 1;
2638 }
2639
2640 #undef INSN2_USES_REG
2641
2642 return 0;
2643 }
2644
2645 /* Return the number of nops that would be needed to work around the
2646 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2647 the MAX_VR4130_NOPS instructions described by HIST. Ignore hazards
2648 that are contained within the first IGNORE instructions of HIST. */
2649
2650 static int
2651 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
2652 const struct mips_cl_insn *insn)
2653 {
2654 int i, j, reg;
2655
2656 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2657 are not affected by the errata. */
2658 if (insn != 0
2659 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2660 || strcmp (insn->insn_mo->name, "mtlo") == 0
2661 || strcmp (insn->insn_mo->name, "mthi") == 0))
2662 return 0;
2663
2664 /* Search for the first MFLO or MFHI. */
2665 for (i = 0; i < MAX_VR4130_NOPS; i++)
2666 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2667 {
2668 /* Extract the destination register. */
2669 if (mips_opts.mips16)
2670 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2671 else
2672 reg = EXTRACT_OPERAND (RD, hist[i]);
2673
2674 /* No nops are needed if INSN reads that register. */
2675 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2676 return 0;
2677
2678 /* ...or if any of the intervening instructions do. */
2679 for (j = 0; j < i; j++)
2680 if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2681 return 0;
2682
2683 if (i >= ignore)
2684 return MAX_VR4130_NOPS - i;
2685 }
2686 return 0;
2687 }
2688
2689 #define BASE_REG_EQ(INSN1, INSN2) \
2690 ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
2691 == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
2692
2693 /* Return the minimum alignment for this store instruction. */
2694
2695 static int
2696 fix_24k_align_to (const struct mips_opcode *mo)
2697 {
2698 if (strcmp (mo->name, "sh") == 0)
2699 return 2;
2700
2701 if (strcmp (mo->name, "swc1") == 0
2702 || strcmp (mo->name, "swc2") == 0
2703 || strcmp (mo->name, "sw") == 0
2704 || strcmp (mo->name, "sc") == 0
2705 || strcmp (mo->name, "s.s") == 0)
2706 return 4;
2707
2708 if (strcmp (mo->name, "sdc1") == 0
2709 || strcmp (mo->name, "sdc2") == 0
2710 || strcmp (mo->name, "s.d") == 0)
2711 return 8;
2712
2713 /* sb, swl, swr */
2714 return 1;
2715 }
2716
2717 struct fix_24k_store_info
2718 {
2719 /* Immediate offset, if any, for this store instruction. */
2720 short off;
2721 /* Alignment required by this store instruction. */
2722 int align_to;
2723 /* True for register offsets. */
2724 int register_offset;
2725 };
2726
2727 /* Comparison function used by qsort. */
2728
2729 static int
2730 fix_24k_sort (const void *a, const void *b)
2731 {
2732 const struct fix_24k_store_info *pos1 = a;
2733 const struct fix_24k_store_info *pos2 = b;
2734
2735 return (pos1->off - pos2->off);
2736 }
2737
2738 /* INSN is a store instruction. Try to record the store information
2739 in STINFO. Return false if the information isn't known. */
2740
2741 static bfd_boolean
2742 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
2743 const struct mips_cl_insn *insn)
2744 {
2745 /* The instruction must have a known offset. */
2746 if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
2747 return FALSE;
2748
2749 stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
2750 stinfo->align_to = fix_24k_align_to (insn->insn_mo);
2751 return TRUE;
2752 }
2753
2754 /* Return the number of nops that would be needed to work around the 24k
2755 "lost data on stores during refill" errata if instruction INSN
2756 immediately followed the 2 instructions described by HIST.
2757 Ignore hazards that are contained within the first IGNORE
2758 instructions of HIST.
2759
2760 Problem: The FSB (fetch store buffer) acts as an intermediate buffer
2761 for the data cache refills and store data. The following describes
2762 the scenario where the store data could be lost.
2763
2764 * A data cache miss, due to either a load or a store, causing fill
2765 data to be supplied by the memory subsystem
2766 * The first three doublewords of fill data are returned and written
2767 into the cache
2768 * A sequence of four stores occurs in consecutive cycles around the
2769 final doubleword of the fill:
2770 * Store A
2771 * Store B
2772 * Store C
2773 * Zero, One or more instructions
2774 * Store D
2775
2776 The four stores A-D must be to different doublewords of the line that
2777 is being filled. The fourth instruction in the sequence above permits
2778 the fill of the final doubleword to be transferred from the FSB into
2779 the cache. In the sequence above, the stores may be either integer
2780 (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
2781 swxc1, sdxc1, suxc1) stores, as long as the four stores are to
2782 different doublewords on the line. If the floating point unit is
2783 running in 1:2 mode, it is not possible to create the sequence above
2784 using only floating point store instructions.
2785
2786 In this case, the cache line being filled is incorrectly marked
2787 invalid, thereby losing the data from any store to the line that
2788 occurs between the original miss and the completion of the five
2789 cycle sequence shown above.
2790
2791 The workarounds are:
2792
2793 * Run the data cache in write-through mode.
2794 * Insert a non-store instruction between
2795 Store A and Store B or Store B and Store C. */
2796
2797 static int
2798 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
2799 const struct mips_cl_insn *insn)
2800 {
2801 struct fix_24k_store_info pos[3];
2802 int align, i, base_offset;
2803
2804 if (ignore >= 2)
2805 return 0;
2806
2807 /* If INSN is definitely not a store, there's nothing to worry about. */
2808 if (insn && (insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2809 return 0;
2810
2811 /* Likewise, the previous instruction wasn't a store. */
2812 if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2813 return 0;
2814
2815 /* If we don't know what came before, assume the worst. */
2816 if (hist[1].frag == NULL)
2817 return 1;
2818
2819 /* If the instruction was not a store, there's nothing to worry about. */
2820 if ((hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2821 return 0;
2822
2823 /* If we don't know the relationship between the store addresses,
2824 assume the worst. */
2825 if (insn == NULL
2826 || !BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
2827 || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
2828 return 1;
2829
2830 if (!fix_24k_record_store_info (&pos[0], insn)
2831 || !fix_24k_record_store_info (&pos[1], &hist[0])
2832 || !fix_24k_record_store_info (&pos[2], &hist[1]))
2833 return 1;
2834
2835 qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
2836
2837 /* Pick a value of ALIGN and X such that all offsets are adjusted by
2838 X bytes and such that the base register + X is known to be aligned
2839 to align bytes. */
2840
2841 if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
2842 align = 8;
2843 else
2844 {
2845 align = pos[0].align_to;
2846 base_offset = pos[0].off;
2847 for (i = 1; i < 3; i++)
2848 if (align < pos[i].align_to)
2849 {
2850 align = pos[i].align_to;
2851 base_offset = pos[i].off;
2852 }
2853 for (i = 0; i < 3; i++)
2854 pos[i].off -= base_offset;
2855 }
2856
2857 pos[0].off &= ~align + 1;
2858 pos[1].off &= ~align + 1;
2859 pos[2].off &= ~align + 1;
2860
2861 /* If any two stores write to the same chunk, they also write to the
2862 same doubleword. The offsets are still sorted at this point. */
2863 if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
2864 return 0;
2865
2866 /* A range of at least 9 bytes is needed for the stores to be in
2867 non-overlapping doublewords. */
2868 if (pos[2].off - pos[0].off <= 8)
2869 return 0;
2870
2871 if (pos[2].off - pos[1].off >= 24
2872 || pos[1].off - pos[0].off >= 24
2873 || pos[2].off - pos[0].off >= 32)
2874 return 0;
2875
2876 return 1;
2877 }
2878
2879 /* Return the number of nops that would be needed if instruction INSN
2880 immediately followed the MAX_NOPS instructions given by HIST,
2881 where HIST[0] is the most recent instruction. Ignore hazards
2882 between INSN and the first IGNORE instructions in HIST.
2883
2884 If INSN is null, return the worse-case number of nops for any
2885 instruction. */
2886
2887 static int
2888 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
2889 const struct mips_cl_insn *insn)
2890 {
2891 int i, nops, tmp_nops;
2892
2893 nops = 0;
2894 for (i = ignore; i < MAX_DELAY_NOPS; i++)
2895 {
2896 tmp_nops = insns_between (hist + i, insn) - i;
2897 if (tmp_nops > nops)
2898 nops = tmp_nops;
2899 }
2900
2901 if (mips_fix_vr4130)
2902 {
2903 tmp_nops = nops_for_vr4130 (ignore, hist, insn);
2904 if (tmp_nops > nops)
2905 nops = tmp_nops;
2906 }
2907
2908 if (mips_fix_24k)
2909 {
2910 tmp_nops = nops_for_24k (ignore, hist, insn);
2911 if (tmp_nops > nops)
2912 nops = tmp_nops;
2913 }
2914
2915 return nops;
2916 }
2917
2918 /* The variable arguments provide NUM_INSNS extra instructions that
2919 might be added to HIST. Return the largest number of nops that
2920 would be needed after the extended sequence, ignoring hazards
2921 in the first IGNORE instructions. */
2922
2923 static int
2924 nops_for_sequence (int num_insns, int ignore,
2925 const struct mips_cl_insn *hist, ...)
2926 {
2927 va_list args;
2928 struct mips_cl_insn buffer[MAX_NOPS];
2929 struct mips_cl_insn *cursor;
2930 int nops;
2931
2932 va_start (args, hist);
2933 cursor = buffer + num_insns;
2934 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2935 while (cursor > buffer)
2936 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2937
2938 nops = nops_for_insn (ignore, buffer, NULL);
2939 va_end (args);
2940 return nops;
2941 }
2942
2943 /* Like nops_for_insn, but if INSN is a branch, take into account the
2944 worst-case delay for the branch target. */
2945
2946 static int
2947 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
2948 const struct mips_cl_insn *insn)
2949 {
2950 int nops, tmp_nops;
2951
2952 nops = nops_for_insn (ignore, hist, insn);
2953 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2954 | INSN_COND_BRANCH_DELAY
2955 | INSN_COND_BRANCH_LIKELY))
2956 {
2957 tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
2958 hist, insn, NOP_INSN);
2959 if (tmp_nops > nops)
2960 nops = tmp_nops;
2961 }
2962 else if (mips_opts.mips16
2963 && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2964 | MIPS16_INSN_COND_BRANCH)))
2965 {
2966 tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
2967 if (tmp_nops > nops)
2968 nops = tmp_nops;
2969 }
2970 return nops;
2971 }
2972
2973 /* Fix NOP issue: Replace nops by "or at,at,zero". */
2974
2975 static void
2976 fix_loongson2f_nop (struct mips_cl_insn * ip)
2977 {
2978 if (strcmp (ip->insn_mo->name, "nop") == 0)
2979 ip->insn_opcode = LOONGSON2F_NOP_INSN;
2980 }
2981
2982 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2983 jr target pc &= 'hffff_ffff_cfff_ffff. */
2984
2985 static void
2986 fix_loongson2f_jump (struct mips_cl_insn * ip)
2987 {
2988 if (strcmp (ip->insn_mo->name, "j") == 0
2989 || strcmp (ip->insn_mo->name, "jr") == 0
2990 || strcmp (ip->insn_mo->name, "jalr") == 0)
2991 {
2992 int sreg;
2993 expressionS ep;
2994
2995 if (! mips_opts.at)
2996 return;
2997
2998 sreg = EXTRACT_OPERAND (RS, *ip);
2999 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3000 return;
3001
3002 ep.X_op = O_constant;
3003 ep.X_add_number = 0xcfff0000;
3004 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3005 ep.X_add_number = 0xffff;
3006 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3007 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3008 }
3009 }
3010
3011 static void
3012 fix_loongson2f (struct mips_cl_insn * ip)
3013 {
3014 if (mips_fix_loongson2f_nop)
3015 fix_loongson2f_nop (ip);
3016
3017 if (mips_fix_loongson2f_jump)
3018 fix_loongson2f_jump (ip);
3019 }
3020
3021 /* Output an instruction. IP is the instruction information.
3022 ADDRESS_EXPR is an operand of the instruction to be used with
3023 RELOC_TYPE. */
3024
3025 static void
3026 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3027 bfd_reloc_code_real_type *reloc_type)
3028 {
3029 unsigned long prev_pinfo, pinfo;
3030 unsigned long prev_pinfo2, pinfo2;
3031 relax_stateT prev_insn_frag_type = 0;
3032 bfd_boolean relaxed_branch = FALSE;
3033 segment_info_type *si = seg_info (now_seg);
3034
3035 if (mips_fix_loongson2f)
3036 fix_loongson2f (ip);
3037
3038 /* Mark instruction labels in mips16 mode. */
3039 mips16_mark_labels ();
3040
3041 file_ase_mips16 |= mips_opts.mips16;
3042
3043 prev_pinfo = history[0].insn_mo->pinfo;
3044 prev_pinfo2 = history[0].insn_mo->pinfo2;
3045 pinfo = ip->insn_mo->pinfo;
3046 pinfo2 = ip->insn_mo->pinfo2;
3047
3048 if (address_expr == NULL)
3049 ip->complete_p = 1;
3050 else if (*reloc_type <= BFD_RELOC_UNUSED
3051 && address_expr->X_op == O_constant)
3052 {
3053 unsigned int tmp;
3054
3055 ip->complete_p = 1;
3056 switch (*reloc_type)
3057 {
3058 case BFD_RELOC_32:
3059 ip->insn_opcode |= address_expr->X_add_number;
3060 break;
3061
3062 case BFD_RELOC_MIPS_HIGHEST:
3063 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3064 ip->insn_opcode |= tmp & 0xffff;
3065 break;
3066
3067 case BFD_RELOC_MIPS_HIGHER:
3068 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3069 ip->insn_opcode |= tmp & 0xffff;
3070 break;
3071
3072 case BFD_RELOC_HI16_S:
3073 tmp = (address_expr->X_add_number + 0x8000) >> 16;
3074 ip->insn_opcode |= tmp & 0xffff;
3075 break;
3076
3077 case BFD_RELOC_HI16:
3078 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3079 break;
3080
3081 case BFD_RELOC_UNUSED:
3082 case BFD_RELOC_LO16:
3083 case BFD_RELOC_MIPS_GOT_DISP:
3084 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3085 break;
3086
3087 case BFD_RELOC_MIPS_JMP:
3088 if ((address_expr->X_add_number & 3) != 0)
3089 as_bad (_("jump to misaligned address (0x%lx)"),
3090 (unsigned long) address_expr->X_add_number);
3091 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3092 ip->complete_p = 0;
3093 break;
3094
3095 case BFD_RELOC_MIPS16_JMP:
3096 if ((address_expr->X_add_number & 3) != 0)
3097 as_bad (_("jump to misaligned address (0x%lx)"),
3098 (unsigned long) address_expr->X_add_number);
3099 ip->insn_opcode |=
3100 (((address_expr->X_add_number & 0x7c0000) << 3)
3101 | ((address_expr->X_add_number & 0xf800000) >> 7)
3102 | ((address_expr->X_add_number & 0x3fffc) >> 2));
3103 ip->complete_p = 0;
3104 break;
3105
3106 case BFD_RELOC_16_PCREL_S2:
3107 if ((address_expr->X_add_number & 3) != 0)
3108 as_bad (_("branch to misaligned address (0x%lx)"),
3109 (unsigned long) address_expr->X_add_number);
3110 if (mips_relax_branch)
3111 goto need_reloc;
3112 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3113 as_bad (_("branch address range overflow (0x%lx)"),
3114 (unsigned long) address_expr->X_add_number);
3115 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3116 ip->complete_p = 0;
3117 break;
3118
3119 default:
3120 internalError ();
3121 }
3122 }
3123
3124 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3125 {
3126 /* There are a lot of optimizations we could do that we don't.
3127 In particular, we do not, in general, reorder instructions.
3128 If you use gcc with optimization, it will reorder
3129 instructions and generally do much more optimization then we
3130 do here; repeating all that work in the assembler would only
3131 benefit hand written assembly code, and does not seem worth
3132 it. */
3133 int nops = (mips_optimize == 0
3134 ? nops_for_insn (0, history, NULL)
3135 : nops_for_insn_or_target (0, history, ip));
3136 if (nops > 0)
3137 {
3138 fragS *old_frag;
3139 unsigned long old_frag_offset;
3140 int i;
3141
3142 old_frag = frag_now;
3143 old_frag_offset = frag_now_fix ();
3144
3145 for (i = 0; i < nops; i++)
3146 emit_nop ();
3147
3148 if (listing)
3149 {
3150 listing_prev_line ();
3151 /* We may be at the start of a variant frag. In case we
3152 are, make sure there is enough space for the frag
3153 after the frags created by listing_prev_line. The
3154 argument to frag_grow here must be at least as large
3155 as the argument to all other calls to frag_grow in
3156 this file. We don't have to worry about being in the
3157 middle of a variant frag, because the variants insert
3158 all needed nop instructions themselves. */
3159 frag_grow (40);
3160 }
3161
3162 mips_move_labels ();
3163
3164 #ifndef NO_ECOFF_DEBUGGING
3165 if (ECOFF_DEBUGGING)
3166 ecoff_fix_loc (old_frag, old_frag_offset);
3167 #endif
3168 }
3169 }
3170 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
3171 {
3172 int nops;
3173
3174 /* Work out how many nops in prev_nop_frag are needed by IP,
3175 ignoring hazards generated by the first prev_nop_frag_since
3176 instructions. */
3177 nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
3178 gas_assert (nops <= prev_nop_frag_holds);
3179
3180 /* Enforce NOPS as a minimum. */
3181 if (nops > prev_nop_frag_required)
3182 prev_nop_frag_required = nops;
3183
3184 if (prev_nop_frag_holds == prev_nop_frag_required)
3185 {
3186 /* Settle for the current number of nops. Update the history
3187 accordingly (for the benefit of any future .set reorder code). */
3188 prev_nop_frag = NULL;
3189 insert_into_history (prev_nop_frag_since,
3190 prev_nop_frag_holds, NOP_INSN);
3191 }
3192 else
3193 {
3194 /* Allow this instruction to replace one of the nops that was
3195 tentatively added to prev_nop_frag. */
3196 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
3197 prev_nop_frag_holds--;
3198 prev_nop_frag_since++;
3199 }
3200 }
3201
3202 #ifdef OBJ_ELF
3203 /* The value passed to dwarf2_emit_insn is the distance between
3204 the beginning of the current instruction and the address that
3205 should be recorded in the debug tables. For MIPS16 debug info
3206 we want to use ISA-encoded addresses, so we pass -1 for an
3207 address higher by one than the current. */
3208 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
3209 #endif
3210
3211 /* Record the frag type before frag_var. */
3212 if (history[0].frag)
3213 prev_insn_frag_type = history[0].frag->fr_type;
3214
3215 if (address_expr
3216 && *reloc_type == BFD_RELOC_16_PCREL_S2
3217 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
3218 || pinfo & INSN_COND_BRANCH_LIKELY)
3219 && mips_relax_branch
3220 /* Don't try branch relaxation within .set nomacro, or within
3221 .set noat if we use $at for PIC computations. If it turns
3222 out that the branch was out-of-range, we'll get an error. */
3223 && !mips_opts.warn_about_macros
3224 && (mips_opts.at || mips_pic == NO_PIC)
3225 /* Don't relax BPOSGE32/64 as they have no complementing branches. */
3226 && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP))
3227 && !mips_opts.mips16)
3228 {
3229 relaxed_branch = TRUE;
3230 add_relaxed_insn (ip, (relaxed_branch_length
3231 (NULL, NULL,
3232 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
3233 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
3234 : 0)), 4,
3235 RELAX_BRANCH_ENCODE
3236 (AT,
3237 pinfo & INSN_UNCOND_BRANCH_DELAY,
3238 pinfo & INSN_COND_BRANCH_LIKELY,
3239 pinfo & INSN_WRITE_GPR_31,
3240 0),
3241 address_expr->X_add_symbol,
3242 address_expr->X_add_number);
3243 *reloc_type = BFD_RELOC_UNUSED;
3244 }
3245 else if (*reloc_type > BFD_RELOC_UNUSED)
3246 {
3247 /* We need to set up a variant frag. */
3248 gas_assert (mips_opts.mips16 && address_expr != NULL);
3249 add_relaxed_insn (ip, 4, 0,
3250 RELAX_MIPS16_ENCODE
3251 (*reloc_type - BFD_RELOC_UNUSED,
3252 mips16_small, mips16_ext,
3253 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
3254 history[0].mips16_absolute_jump_p),
3255 make_expr_symbol (address_expr), 0);
3256 }
3257 else if (mips_opts.mips16
3258 && ! ip->use_extend
3259 && *reloc_type != BFD_RELOC_MIPS16_JMP)
3260 {
3261 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
3262 /* Make sure there is enough room to swap this instruction with
3263 a following jump instruction. */
3264 frag_grow (6);
3265 add_fixed_insn (ip);
3266 }
3267 else
3268 {
3269 if (mips_opts.mips16
3270 && mips_opts.noreorder
3271 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3272 as_warn (_("extended instruction in delay slot"));
3273
3274 if (mips_relax.sequence)
3275 {
3276 /* If we've reached the end of this frag, turn it into a variant
3277 frag and record the information for the instructions we've
3278 written so far. */
3279 if (frag_room () < 4)
3280 relax_close_frag ();
3281 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3282 }
3283
3284 if (mips_relax.sequence != 2)
3285 mips_macro_warning.sizes[0] += 4;
3286 if (mips_relax.sequence != 1)
3287 mips_macro_warning.sizes[1] += 4;
3288
3289 if (mips_opts.mips16)
3290 {
3291 ip->fixed_p = 1;
3292 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
3293 }
3294 add_fixed_insn (ip);
3295 }
3296
3297 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
3298 {
3299 if (!ip->complete_p
3300 && *reloc_type < BFD_RELOC_UNUSED)
3301 need_reloc:
3302 {
3303 reloc_howto_type *howto;
3304 int i;
3305
3306 /* In a compound relocation, it is the final (outermost)
3307 operator that determines the relocated field. */
3308 for (i = 1; i < 3; i++)
3309 if (reloc_type[i] == BFD_RELOC_UNUSED)
3310 break;
3311
3312 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3313 if (howto == NULL)
3314 {
3315 /* To reproduce this failure try assembling gas/testsuites/
3316 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3317 assembler. */
3318 as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3319 howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3320 }
3321
3322 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3323 bfd_get_reloc_size (howto),
3324 address_expr,
3325 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3326 reloc_type[0]);
3327
3328 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
3329 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3330 && ip->fixp[0]->fx_addsy)
3331 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3332
3333 /* These relocations can have an addend that won't fit in
3334 4 octets for 64bit assembly. */
3335 if (HAVE_64BIT_GPRS
3336 && ! howto->partial_inplace
3337 && (reloc_type[0] == BFD_RELOC_16
3338 || reloc_type[0] == BFD_RELOC_32
3339 || reloc_type[0] == BFD_RELOC_MIPS_JMP
3340 || reloc_type[0] == BFD_RELOC_GPREL16
3341 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3342 || reloc_type[0] == BFD_RELOC_GPREL32
3343 || reloc_type[0] == BFD_RELOC_64
3344 || reloc_type[0] == BFD_RELOC_CTOR
3345 || reloc_type[0] == BFD_RELOC_MIPS_SUB
3346 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3347 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3348 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3349 || reloc_type[0] == BFD_RELOC_MIPS_REL16
3350 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3351 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3352 || hi16_reloc_p (reloc_type[0])
3353 || lo16_reloc_p (reloc_type[0])))
3354 ip->fixp[0]->fx_no_overflow = 1;
3355
3356 if (mips_relax.sequence)
3357 {
3358 if (mips_relax.first_fixup == 0)
3359 mips_relax.first_fixup = ip->fixp[0];
3360 }
3361 else if (reloc_needs_lo_p (*reloc_type))
3362 {
3363 struct mips_hi_fixup *hi_fixup;
3364
3365 /* Reuse the last entry if it already has a matching %lo. */
3366 hi_fixup = mips_hi_fixup_list;
3367 if (hi_fixup == 0
3368 || !fixup_has_matching_lo_p (hi_fixup->fixp))
3369 {
3370 hi_fixup = ((struct mips_hi_fixup *)
3371 xmalloc (sizeof (struct mips_hi_fixup)));
3372 hi_fixup->next = mips_hi_fixup_list;
3373 mips_hi_fixup_list = hi_fixup;
3374 }
3375 hi_fixup->fixp = ip->fixp[0];
3376 hi_fixup->seg = now_seg;
3377 }
3378
3379 /* Add fixups for the second and third relocations, if given.
3380 Note that the ABI allows the second relocation to be
3381 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
3382 moment we only use RSS_UNDEF, but we could add support
3383 for the others if it ever becomes necessary. */
3384 for (i = 1; i < 3; i++)
3385 if (reloc_type[i] != BFD_RELOC_UNUSED)
3386 {
3387 ip->fixp[i] = fix_new (ip->frag, ip->where,
3388 ip->fixp[0]->fx_size, NULL, 0,
3389 FALSE, reloc_type[i]);
3390
3391 /* Use fx_tcbit to mark compound relocs. */
3392 ip->fixp[0]->fx_tcbit = 1;
3393 ip->fixp[i]->fx_tcbit = 1;
3394 }
3395 }
3396 }
3397 install_insn (ip);
3398
3399 /* Update the register mask information. */
3400 if (! mips_opts.mips16)
3401 {
3402 if ((pinfo & INSN_WRITE_GPR_D) || (pinfo2 & INSN2_READ_GPR_D))
3403 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3404 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3405 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3406 if (pinfo & INSN_READ_GPR_S)
3407 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3408 if (pinfo & INSN_WRITE_GPR_31)
3409 mips_gprmask |= 1 << RA;
3410 if (pinfo2 & (INSN2_WRITE_GPR_Z | INSN2_READ_GPR_Z))
3411 mips_gprmask |= 1 << EXTRACT_OPERAND (RZ, *ip);
3412 if (pinfo & INSN_WRITE_FPR_D)
3413 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3414 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3415 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3416 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3417 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3418 if ((pinfo & INSN_READ_FPR_R) != 0)
3419 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3420 if (pinfo2 & (INSN2_WRITE_FPR_Z | INSN2_READ_FPR_Z))
3421 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FZ, *ip);
3422 if (pinfo & INSN_COP)
3423 {
3424 /* We don't keep enough information to sort these cases out.
3425 The itbl support does keep this information however, although
3426 we currently don't support itbl fprmats as part of the cop
3427 instruction. May want to add this support in the future. */
3428 }
3429 /* Never set the bit for $0, which is always zero. */
3430 mips_gprmask &= ~1 << 0;
3431 }
3432 else
3433 {
3434 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3435 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3436 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3437 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3438 if (pinfo & MIPS16_INSN_WRITE_Z)
3439 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3440 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3441 mips_gprmask |= 1 << TREG;
3442 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3443 mips_gprmask |= 1 << SP;
3444 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3445 mips_gprmask |= 1 << RA;
3446 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3447 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3448 if (pinfo & MIPS16_INSN_READ_Z)
3449 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3450 if (pinfo & MIPS16_INSN_READ_GPR_X)
3451 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3452 }
3453
3454 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3455 {
3456 /* Filling the branch delay slot is more complex. We try to
3457 switch the branch with the previous instruction, which we can
3458 do if the previous instruction does not set up a condition
3459 that the branch tests and if the branch is not itself the
3460 target of any branch. */
3461 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3462 || (pinfo & INSN_COND_BRANCH_DELAY))
3463 {
3464 if (mips_optimize < 2
3465 /* If we have seen .set volatile or .set nomove, don't
3466 optimize. */
3467 || mips_opts.nomove != 0
3468 /* We can't swap if the previous instruction's position
3469 is fixed. */
3470 || history[0].fixed_p
3471 /* If the previous previous insn was in a .set
3472 noreorder, we can't swap. Actually, the MIPS
3473 assembler will swap in this situation. However, gcc
3474 configured -with-gnu-as will generate code like
3475 .set noreorder
3476 lw $4,XXX
3477 .set reorder
3478 INSN
3479 bne $4,$0,foo
3480 in which we can not swap the bne and INSN. If gcc is
3481 not configured -with-gnu-as, it does not output the
3482 .set pseudo-ops. */
3483 || history[1].noreorder_p
3484 /* If the branch is itself the target of a branch, we
3485 can not swap. We cheat on this; all we check for is
3486 whether there is a label on this instruction. If
3487 there are any branches to anything other than a
3488 label, users must use .set noreorder. */
3489 || si->label_list != NULL
3490 /* If the previous instruction is in a variant frag
3491 other than this branch's one, we cannot do the swap.
3492 This does not apply to the mips16, which uses variant
3493 frags for different purposes. */
3494 || (! mips_opts.mips16
3495 && prev_insn_frag_type == rs_machine_dependent)
3496 /* Check for conflicts between the branch and the instructions
3497 before the candidate delay slot. */
3498 || nops_for_insn (0, history + 1, ip) > 0
3499 /* Check for conflicts between the swapped sequence and the
3500 target of the branch. */
3501 || nops_for_sequence (2, 0, history + 1, ip, history) > 0
3502 /* We do not swap with a trap instruction, since it
3503 complicates trap handlers to have the trap
3504 instruction be in a delay slot. */
3505 || (prev_pinfo & INSN_TRAP)
3506 /* If the branch reads a register that the previous
3507 instruction sets, we can not swap. */
3508 || (! mips_opts.mips16
3509 && (prev_pinfo & INSN_WRITE_GPR_T)
3510 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3511 MIPS_GR_REG))
3512 || (! mips_opts.mips16
3513 && (prev_pinfo & INSN_WRITE_GPR_D)
3514 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3515 MIPS_GR_REG))
3516 || (! mips_opts.mips16
3517 && (prev_pinfo2 & INSN2_WRITE_GPR_Z)
3518 && insn_uses_reg (ip, EXTRACT_OPERAND (RZ, history[0]),
3519 MIPS_GR_REG))
3520 || (mips_opts.mips16
3521 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3522 && (insn_uses_reg
3523 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3524 MIPS16_REG)))
3525 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3526 && (insn_uses_reg
3527 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3528 MIPS16_REG)))
3529 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3530 && (insn_uses_reg
3531 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3532 MIPS16_REG)))
3533 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3534 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3535 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3536 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3537 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3538 && insn_uses_reg (ip,
3539 MIPS16OP_EXTRACT_REG32R
3540 (history[0].insn_opcode),
3541 MIPS_GR_REG))))
3542 /* If the branch writes a register that the previous
3543 instruction sets, we can not swap (we know that
3544 branches write only to RD or to $31). */
3545 || (! mips_opts.mips16
3546 && (prev_pinfo & INSN_WRITE_GPR_T)
3547 && (((pinfo & INSN_WRITE_GPR_D)
3548 && (EXTRACT_OPERAND (RT, history[0])
3549 == EXTRACT_OPERAND (RD, *ip)))
3550 || ((pinfo & INSN_WRITE_GPR_31)
3551 && EXTRACT_OPERAND (RT, history[0]) == RA)))
3552 || (! mips_opts.mips16
3553 && (prev_pinfo & INSN_WRITE_GPR_D)
3554 && (((pinfo & INSN_WRITE_GPR_D)
3555 && (EXTRACT_OPERAND (RD, history[0])
3556 == EXTRACT_OPERAND (RD, *ip)))
3557 || ((pinfo & INSN_WRITE_GPR_31)
3558 && EXTRACT_OPERAND (RD, history[0]) == RA)))
3559 || (mips_opts.mips16
3560 && (pinfo & MIPS16_INSN_WRITE_31)
3561 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3562 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3563 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3564 == RA))))
3565 /* If the branch writes a register that the previous
3566 instruction reads, we can not swap (we know that
3567 branches only write to RD or to $31). */
3568 || (! mips_opts.mips16
3569 && (pinfo & INSN_WRITE_GPR_D)
3570 && insn_uses_reg (&history[0],
3571 EXTRACT_OPERAND (RD, *ip),
3572 MIPS_GR_REG))
3573 || (! mips_opts.mips16
3574 && (pinfo & INSN_WRITE_GPR_31)
3575 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3576 || (mips_opts.mips16
3577 && (pinfo & MIPS16_INSN_WRITE_31)
3578 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3579 /* If one instruction sets a condition code and the
3580 other one uses a condition code, we can not swap. */
3581 || ((pinfo & INSN_READ_COND_CODE)
3582 && (prev_pinfo & INSN_WRITE_COND_CODE))
3583 || ((pinfo & INSN_WRITE_COND_CODE)
3584 && (prev_pinfo & INSN_READ_COND_CODE))
3585 /* If the previous instruction uses the PC, we can not
3586 swap. */
3587 || (mips_opts.mips16
3588 && (prev_pinfo & MIPS16_INSN_READ_PC))
3589 /* If the previous instruction had a fixup in mips16
3590 mode, we can not swap. This normally means that the
3591 previous instruction was a 4 byte branch anyhow. */
3592 || (mips_opts.mips16 && history[0].fixp[0])
3593 /* If the previous instruction is a sync, sync.l, or
3594 sync.p, we can not swap. */
3595 || (prev_pinfo & INSN_SYNC)
3596 /* If the previous instruction is an ERET or
3597 DERET, avoid the swap. */
3598 || (history[0].insn_opcode == INSN_ERET)
3599 || (history[0].insn_opcode == INSN_DERET))
3600 {
3601 if (mips_opts.mips16
3602 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3603 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3604 && ISA_SUPPORTS_MIPS16E)
3605 {
3606 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3607 ip->insn_opcode |= 0x0080;
3608 install_insn (ip);
3609 insert_into_history (0, 1, ip);
3610 }
3611 else
3612 {
3613 /* We could do even better for unconditional branches to
3614 portions of this object file; we could pick up the
3615 instruction at the destination, put it in the delay
3616 slot, and bump the destination address. */
3617 insert_into_history (0, 1, ip);
3618 emit_nop ();
3619 }
3620
3621 if (mips_relax.sequence)
3622 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3623 }
3624 else
3625 {
3626 /* It looks like we can actually do the swap. */
3627 struct mips_cl_insn delay = history[0];
3628 if (mips_opts.mips16)
3629 {
3630 know (delay.frag == ip->frag);
3631 move_insn (ip, delay.frag, delay.where);
3632 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3633 }
3634 else if (relaxed_branch)
3635 {
3636 /* Add the delay slot instruction to the end of the
3637 current frag and shrink the fixed part of the
3638 original frag. If the branch occupies the tail of
3639 the latter, move it backwards to cover the gap. */
3640 delay.frag->fr_fix -= 4;
3641 if (delay.frag == ip->frag)
3642 move_insn (ip, ip->frag, ip->where - 4);
3643 add_fixed_insn (&delay);
3644 }
3645 else
3646 {
3647 move_insn (&delay, ip->frag, ip->where);
3648 move_insn (ip, history[0].frag, history[0].where);
3649 }
3650 history[0] = *ip;
3651 delay.fixed_p = 1;
3652 insert_into_history (0, 1, &delay);
3653 }
3654
3655 /* If that was an unconditional branch, forget the previous
3656 insn information. */
3657 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3658 {
3659 mips_no_prev_insn ();
3660 }
3661 }
3662 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3663 {
3664 /* We don't yet optimize a branch likely. What we should do
3665 is look at the target, copy the instruction found there
3666 into the delay slot, and increment the branch to jump to
3667 the next instruction. */
3668 insert_into_history (0, 1, ip);
3669 emit_nop ();
3670 }
3671 else
3672 insert_into_history (0, 1, ip);
3673 }
3674 else
3675 insert_into_history (0, 1, ip);
3676
3677 /* We just output an insn, so the next one doesn't have a label. */
3678 mips_clear_insn_labels ();
3679 }
3680
3681 /* Forget that there was any previous instruction or label. */
3682
3683 static void
3684 mips_no_prev_insn (void)
3685 {
3686 prev_nop_frag = NULL;
3687 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3688 mips_clear_insn_labels ();
3689 }
3690
3691 /* This function must be called before we emit something other than
3692 instructions. It is like mips_no_prev_insn except that it inserts
3693 any NOPS that might be needed by previous instructions. */
3694
3695 void
3696 mips_emit_delays (void)
3697 {
3698 if (! mips_opts.noreorder)
3699 {
3700 int nops = nops_for_insn (0, history, NULL);
3701 if (nops > 0)
3702 {
3703 while (nops-- > 0)
3704 add_fixed_insn (NOP_INSN);
3705 mips_move_labels ();
3706 }
3707 }
3708 mips_no_prev_insn ();
3709 }
3710
3711 /* Start a (possibly nested) noreorder block. */
3712
3713 static void
3714 start_noreorder (void)
3715 {
3716 if (mips_opts.noreorder == 0)
3717 {
3718 unsigned int i;
3719 int nops;
3720
3721 /* None of the instructions before the .set noreorder can be moved. */
3722 for (i = 0; i < ARRAY_SIZE (history); i++)
3723 history[i].fixed_p = 1;
3724
3725 /* Insert any nops that might be needed between the .set noreorder
3726 block and the previous instructions. We will later remove any
3727 nops that turn out not to be needed. */
3728 nops = nops_for_insn (0, history, NULL);
3729 if (nops > 0)
3730 {
3731 if (mips_optimize != 0)
3732 {
3733 /* Record the frag which holds the nop instructions, so
3734 that we can remove them if we don't need them. */
3735 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3736 prev_nop_frag = frag_now;
3737 prev_nop_frag_holds = nops;
3738 prev_nop_frag_required = 0;
3739 prev_nop_frag_since = 0;
3740 }
3741
3742 for (; nops > 0; --nops)
3743 add_fixed_insn (NOP_INSN);
3744
3745 /* Move on to a new frag, so that it is safe to simply
3746 decrease the size of prev_nop_frag. */
3747 frag_wane (frag_now);
3748 frag_new (0);
3749 mips_move_labels ();
3750 }
3751 mips16_mark_labels ();
3752 mips_clear_insn_labels ();
3753 }
3754 mips_opts.noreorder++;
3755 mips_any_noreorder = 1;
3756 }
3757
3758 /* End a nested noreorder block. */
3759
3760 static void
3761 end_noreorder (void)
3762 {
3763
3764 mips_opts.noreorder--;
3765 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3766 {
3767 /* Commit to inserting prev_nop_frag_required nops and go back to
3768 handling nop insertion the .set reorder way. */
3769 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3770 * (mips_opts.mips16 ? 2 : 4));
3771 insert_into_history (prev_nop_frag_since,
3772 prev_nop_frag_required, NOP_INSN);
3773 prev_nop_frag = NULL;
3774 }
3775 }
3776
3777 /* Set up global variables for the start of a new macro. */
3778
3779 static void
3780 macro_start (void)
3781 {
3782 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3783 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3784 && (history[0].insn_mo->pinfo
3785 & (INSN_UNCOND_BRANCH_DELAY
3786 | INSN_COND_BRANCH_DELAY
3787 | INSN_COND_BRANCH_LIKELY)) != 0);
3788 }
3789
3790 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3791 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3792 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3793
3794 static const char *
3795 macro_warning (relax_substateT subtype)
3796 {
3797 if (subtype & RELAX_DELAY_SLOT)
3798 return _("Macro instruction expanded into multiple instructions"
3799 " in a branch delay slot");
3800 else if (subtype & RELAX_NOMACRO)
3801 return _("Macro instruction expanded into multiple instructions");
3802 else
3803 return 0;
3804 }
3805
3806 /* Finish up a macro. Emit warnings as appropriate. */
3807
3808 static void
3809 macro_end (void)
3810 {
3811 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3812 {
3813 relax_substateT subtype;
3814
3815 /* Set up the relaxation warning flags. */
3816 subtype = 0;
3817 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3818 subtype |= RELAX_SECOND_LONGER;
3819 if (mips_opts.warn_about_macros)
3820 subtype |= RELAX_NOMACRO;
3821 if (mips_macro_warning.delay_slot_p)
3822 subtype |= RELAX_DELAY_SLOT;
3823
3824 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3825 {
3826 /* Either the macro has a single implementation or both
3827 implementations are longer than 4 bytes. Emit the
3828 warning now. */
3829 const char *msg = macro_warning (subtype);
3830 if (msg != 0)
3831 as_warn ("%s", msg);
3832 }
3833 else
3834 {
3835 /* One implementation might need a warning but the other
3836 definitely doesn't. */
3837 mips_macro_warning.first_frag->fr_subtype |= subtype;
3838 }
3839 }
3840 }
3841
3842 /* Read a macro's relocation codes from *ARGS and store them in *R.
3843 The first argument in *ARGS will be either the code for a single
3844 relocation or -1 followed by the three codes that make up a
3845 composite relocation. */
3846
3847 static void
3848 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3849 {
3850 int i, next;
3851
3852 next = va_arg (*args, int);
3853 if (next >= 0)
3854 r[0] = (bfd_reloc_code_real_type) next;
3855 else
3856 for (i = 0; i < 3; i++)
3857 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3858 }
3859
3860 /* Build an instruction created by a macro expansion. This is passed
3861 a pointer to the count of instructions created so far, an
3862 expression, the name of the instruction to build, an operand format
3863 string, and corresponding arguments. */
3864
3865 static void
3866 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3867 {
3868 const struct mips_opcode *mo;
3869 struct mips_cl_insn insn;
3870 bfd_reloc_code_real_type r[3];
3871 va_list args;
3872
3873 va_start (args, fmt);
3874
3875 if (mips_opts.mips16)
3876 {
3877 mips16_macro_build (ep, name, fmt, &args);
3878 va_end (args);
3879 return;
3880 }
3881
3882 r[0] = BFD_RELOC_UNUSED;
3883 r[1] = BFD_RELOC_UNUSED;
3884 r[2] = BFD_RELOC_UNUSED;
3885 mo = (struct mips_opcode *) hash_find (op_hash, name);
3886 gas_assert (mo);
3887 gas_assert (strcmp (name, mo->name) == 0);
3888
3889 while (1)
3890 {
3891 /* Search until we get a match for NAME. It is assumed here that
3892 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3893 if (strcmp (fmt, mo->args) == 0
3894 && mo->pinfo != INSN_MACRO
3895 && is_opcode_valid (mo))
3896 break;
3897
3898 ++mo;
3899 gas_assert (mo->name);
3900 gas_assert (strcmp (name, mo->name) == 0);
3901 }
3902
3903 create_insn (&insn, mo);
3904 for (;;)
3905 {
3906 switch (*fmt++)
3907 {
3908 case '\0':
3909 break;
3910
3911 case ',':
3912 case '(':
3913 case ')':
3914 continue;
3915
3916 case '+':
3917 switch (*fmt++)
3918 {
3919 case 'A':
3920 case 'E':
3921 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3922 continue;
3923
3924 case 'B':
3925 case 'F':
3926 /* Note that in the macro case, these arguments are already
3927 in MSB form. (When handling the instruction in the
3928 non-macro case, these arguments are sizes from which
3929 MSB values must be calculated.) */
3930 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3931 continue;
3932
3933 case 'C':
3934 case 'G':
3935 case 'H':
3936 /* Note that in the macro case, these arguments are already
3937 in MSBD form. (When handling the instruction in the
3938 non-macro case, these arguments are sizes from which
3939 MSBD values must be calculated.) */
3940 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3941 continue;
3942
3943 case 'Q':
3944 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3945 continue;
3946
3947 default:
3948 internalError ();
3949 }
3950 continue;
3951
3952 case '2':
3953 INSERT_OPERAND (BP, insn, va_arg (args, int));
3954 continue;
3955
3956 case 't':
3957 case 'w':
3958 case 'E':
3959 INSERT_OPERAND (RT, insn, va_arg (args, int));
3960 continue;
3961
3962 case 'c':
3963 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3964 continue;
3965
3966 case 'T':
3967 case 'W':
3968 INSERT_OPERAND (FT, insn, va_arg (args, int));
3969 continue;
3970
3971 case 'd':
3972 case 'G':
3973 case 'K':
3974 INSERT_OPERAND (RD, insn, va_arg (args, int));
3975 continue;
3976
3977 case 'U':
3978 {
3979 int tmp = va_arg (args, int);
3980
3981 INSERT_OPERAND (RT, insn, tmp);
3982 INSERT_OPERAND (RD, insn, tmp);
3983 continue;
3984 }
3985
3986 case 'V':
3987 case 'S':
3988 INSERT_OPERAND (FS, insn, va_arg (args, int));
3989 continue;
3990
3991 case 'z':
3992 continue;
3993
3994 case '<':
3995 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3996 continue;
3997
3998 case 'D':
3999 INSERT_OPERAND (FD, insn, va_arg (args, int));
4000 continue;
4001
4002 case 'B':
4003 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
4004 continue;
4005
4006 case 'J':
4007 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
4008 continue;
4009
4010 case 'q':
4011 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
4012 continue;
4013
4014 case 'b':
4015 case 's':
4016 case 'r':
4017 case 'v':
4018 INSERT_OPERAND (RS, insn, va_arg (args, int));
4019 continue;
4020
4021 case 'i':
4022 case 'j':
4023 macro_read_relocs (&args, r);
4024 gas_assert (*r == BFD_RELOC_GPREL16
4025 || *r == BFD_RELOC_MIPS_HIGHER
4026 || *r == BFD_RELOC_HI16_S
4027 || *r == BFD_RELOC_LO16
4028 || *r == BFD_RELOC_MIPS_GOT_OFST);
4029 continue;
4030
4031 case 'o':
4032 macro_read_relocs (&args, r);
4033 continue;
4034
4035 case 'u':
4036 macro_read_relocs (&args, r);
4037 gas_assert (ep != NULL
4038 && (ep->X_op == O_constant
4039 || (ep->X_op == O_symbol
4040 && (*r == BFD_RELOC_MIPS_HIGHEST
4041 || *r == BFD_RELOC_HI16_S
4042 || *r == BFD_RELOC_HI16
4043 || *r == BFD_RELOC_GPREL16
4044 || *r == BFD_RELOC_MIPS_GOT_HI16
4045 || *r == BFD_RELOC_MIPS_CALL_HI16))));
4046 continue;
4047
4048 case 'p':
4049 gas_assert (ep != NULL);
4050
4051 /*
4052 * This allows macro() to pass an immediate expression for
4053 * creating short branches without creating a symbol.
4054 *
4055 * We don't allow branch relaxation for these branches, as
4056 * they should only appear in ".set nomacro" anyway.
4057 */
4058 if (ep->X_op == O_constant)
4059 {
4060 if ((ep->X_add_number & 3) != 0)
4061 as_bad (_("branch to misaligned address (0x%lx)"),
4062 (unsigned long) ep->X_add_number);
4063 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
4064 as_bad (_("branch address range overflow (0x%lx)"),
4065 (unsigned long) ep->X_add_number);
4066 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
4067 ep = NULL;
4068 }
4069 else
4070 *r = BFD_RELOC_16_PCREL_S2;
4071 continue;
4072
4073 case 'a':
4074 gas_assert (ep != NULL);
4075 *r = BFD_RELOC_MIPS_JMP;
4076 continue;
4077
4078 case 'C':
4079 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
4080 continue;
4081
4082 case 'k':
4083 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
4084 continue;
4085
4086 default:
4087 internalError ();
4088 }
4089 break;
4090 }
4091 va_end (args);
4092 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4093
4094 append_insn (&insn, ep, r);
4095 }
4096
4097 static void
4098 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
4099 va_list *args)
4100 {
4101 struct mips_opcode *mo;
4102 struct mips_cl_insn insn;
4103 bfd_reloc_code_real_type r[3]
4104 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4105
4106 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
4107 gas_assert (mo);
4108 gas_assert (strcmp (name, mo->name) == 0);
4109
4110 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
4111 {
4112 ++mo;
4113 gas_assert (mo->name);
4114 gas_assert (strcmp (name, mo->name) == 0);
4115 }
4116
4117 create_insn (&insn, mo);
4118 for (;;)
4119 {
4120 int c;
4121
4122 c = *fmt++;
4123 switch (c)
4124 {
4125 case '\0':
4126 break;
4127
4128 case ',':
4129 case '(':
4130 case ')':
4131 continue;
4132
4133 case 'y':
4134 case 'w':
4135 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
4136 continue;
4137
4138 case 'x':
4139 case 'v':
4140 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
4141 continue;
4142
4143 case 'z':
4144 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
4145 continue;
4146
4147 case 'Z':
4148 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
4149 continue;
4150
4151 case '0':
4152 case 'S':
4153 case 'P':
4154 case 'R':
4155 continue;
4156
4157 case 'X':
4158 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
4159 continue;
4160
4161 case 'Y':
4162 {
4163 int regno;
4164
4165 regno = va_arg (*args, int);
4166 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
4167 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
4168 }
4169 continue;
4170
4171 case '<':
4172 case '>':
4173 case '4':
4174 case '5':
4175 case 'H':
4176 case 'W':
4177 case 'D':
4178 case 'j':
4179 case '8':
4180 case 'V':
4181 case 'C':
4182 case 'U':
4183 case 'k':
4184 case 'K':
4185 case 'p':
4186 case 'q':
4187 {
4188 gas_assert (ep != NULL);
4189
4190 if (ep->X_op != O_constant)
4191 *r = (int) BFD_RELOC_UNUSED + c;
4192 else
4193 {
4194 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
4195 FALSE, &insn.insn_opcode, &insn.use_extend,
4196 &insn.extend);
4197 ep = NULL;
4198 *r = BFD_RELOC_UNUSED;
4199 }
4200 }
4201 continue;
4202
4203 case '6':
4204 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
4205 continue;
4206 }
4207
4208 break;
4209 }
4210
4211 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4212
4213 append_insn (&insn, ep, r);
4214 }
4215
4216 /*
4217 * Sign-extend 32-bit mode constants that have bit 31 set and all
4218 * higher bits unset.
4219 */
4220 static void
4221 normalize_constant_expr (expressionS *ex)
4222 {
4223 if (ex->X_op == O_constant
4224 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4225 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4226 - 0x80000000);
4227 }
4228
4229 /*
4230 * Sign-extend 32-bit mode address offsets that have bit 31 set and
4231 * all higher bits unset.
4232 */
4233 static void
4234 normalize_address_expr (expressionS *ex)
4235 {
4236 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4237 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4238 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4239 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4240 - 0x80000000);
4241 }
4242
4243 /*
4244 * Generate a "jalr" instruction with a relocation hint to the called
4245 * function. This occurs in NewABI PIC code.
4246 */
4247 static void
4248 macro_build_jalr (expressionS *ep)
4249 {
4250 char *f = NULL;
4251
4252 if (MIPS_JALR_HINT_P (ep))
4253 {
4254 frag_grow (8);
4255 f = frag_more (0);
4256 }
4257 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4258 if (MIPS_JALR_HINT_P (ep))
4259 fix_new_exp (frag_now, f - frag_now->fr_literal,
4260 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4261 }
4262
4263 /*
4264 * Generate a "lui" instruction.
4265 */
4266 static void
4267 macro_build_lui (expressionS *ep, int regnum)
4268 {
4269 expressionS high_expr;
4270 const struct mips_opcode *mo;
4271 struct mips_cl_insn insn;
4272 bfd_reloc_code_real_type r[3]
4273 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4274 const char *name = "lui";
4275 const char *fmt = "t,u";
4276
4277 gas_assert (! mips_opts.mips16);
4278
4279 high_expr = *ep;
4280
4281 if (high_expr.X_op == O_constant)
4282 {
4283 /* We can compute the instruction now without a relocation entry. */
4284 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4285 >> 16) & 0xffff;
4286 *r = BFD_RELOC_UNUSED;
4287 }
4288 else
4289 {
4290 gas_assert (ep->X_op == O_symbol);
4291 /* _gp_disp is a special case, used from s_cpload.
4292 __gnu_local_gp is used if mips_no_shared. */
4293 gas_assert (mips_pic == NO_PIC
4294 || (! HAVE_NEWABI
4295 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4296 || (! mips_in_shared
4297 && strcmp (S_GET_NAME (ep->X_add_symbol),
4298 "__gnu_local_gp") == 0));
4299 *r = BFD_RELOC_HI16_S;
4300 }
4301
4302 mo = hash_find (op_hash, name);
4303 gas_assert (strcmp (name, mo->name) == 0);
4304 gas_assert (strcmp (fmt, mo->args) == 0);
4305 create_insn (&insn, mo);
4306
4307 insn.insn_opcode = insn.insn_mo->match;
4308 INSERT_OPERAND (RT, insn, regnum);
4309 if (*r == BFD_RELOC_UNUSED)
4310 {
4311 insn.insn_opcode |= high_expr.X_add_number;
4312 append_insn (&insn, NULL, r);
4313 }
4314 else
4315 append_insn (&insn, &high_expr, r);
4316 }
4317
4318 /* Generate a sequence of instructions to do a load or store from a constant
4319 offset off of a base register (breg) into/from a target register (treg),
4320 using AT if necessary. */
4321 static void
4322 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4323 int treg, int breg, int dbl)
4324 {
4325 gas_assert (ep->X_op == O_constant);
4326
4327 /* Sign-extending 32-bit constants makes their handling easier. */
4328 if (!dbl)
4329 normalize_constant_expr (ep);
4330
4331 /* Right now, this routine can only handle signed 32-bit constants. */
4332 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4333 as_warn (_("operand overflow"));
4334
4335 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4336 {
4337 /* Signed 16-bit offset will fit in the op. Easy! */
4338 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4339 }
4340 else
4341 {
4342 /* 32-bit offset, need multiple instructions and AT, like:
4343 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
4344 addu $tempreg,$tempreg,$breg
4345 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
4346 to handle the complete offset. */
4347 macro_build_lui (ep, AT);
4348 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4349 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4350
4351 if (!mips_opts.at)
4352 as_bad (_("Macro used $at after \".set noat\""));
4353 }
4354 }
4355
4356 /* set_at()
4357 * Generates code to set the $at register to true (one)
4358 * if reg is less than the immediate expression.
4359 */
4360 static void
4361 set_at (int reg, int unsignedp)
4362 {
4363 if (imm_expr.X_op == O_constant
4364 && imm_expr.X_add_number >= -0x8000
4365 && imm_expr.X_add_number < 0x8000)
4366 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4367 AT, reg, BFD_RELOC_LO16);
4368 else
4369 {
4370 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4371 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4372 }
4373 }
4374
4375 /* Warn if an expression is not a constant. */
4376
4377 static void
4378 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4379 {
4380 if (ex->X_op == O_big)
4381 as_bad (_("unsupported large constant"));
4382 else if (ex->X_op != O_constant)
4383 as_bad (_("Instruction %s requires absolute expression"),
4384 ip->insn_mo->name);
4385
4386 if (HAVE_32BIT_GPRS)
4387 normalize_constant_expr (ex);
4388 }
4389
4390 /* Count the leading zeroes by performing a binary chop. This is a
4391 bulky bit of source, but performance is a LOT better for the
4392 majority of values than a simple loop to count the bits:
4393 for (lcnt = 0; (lcnt < 32); lcnt++)
4394 if ((v) & (1 << (31 - lcnt)))
4395 break;
4396 However it is not code size friendly, and the gain will drop a bit
4397 on certain cached systems.
4398 */
4399 #define COUNT_TOP_ZEROES(v) \
4400 (((v) & ~0xffff) == 0 \
4401 ? ((v) & ~0xff) == 0 \
4402 ? ((v) & ~0xf) == 0 \
4403 ? ((v) & ~0x3) == 0 \
4404 ? ((v) & ~0x1) == 0 \
4405 ? !(v) \
4406 ? 32 \
4407 : 31 \
4408 : 30 \
4409 : ((v) & ~0x7) == 0 \
4410 ? 29 \
4411 : 28 \
4412 : ((v) & ~0x3f) == 0 \
4413 ? ((v) & ~0x1f) == 0 \
4414 ? 27 \
4415 : 26 \
4416 : ((v) & ~0x7f) == 0 \
4417 ? 25 \
4418 : 24 \
4419 : ((v) & ~0xfff) == 0 \
4420 ? ((v) & ~0x3ff) == 0 \
4421 ? ((v) & ~0x1ff) == 0 \
4422 ? 23 \
4423 : 22 \
4424 : ((v) & ~0x7ff) == 0 \
4425 ? 21 \
4426 : 20 \
4427 : ((v) & ~0x3fff) == 0 \
4428 ? ((v) & ~0x1fff) == 0 \
4429 ? 19 \
4430 : 18 \
4431 : ((v) & ~0x7fff) == 0 \
4432 ? 17 \
4433 : 16 \
4434 : ((v) & ~0xffffff) == 0 \
4435 ? ((v) & ~0xfffff) == 0 \
4436 ? ((v) & ~0x3ffff) == 0 \
4437 ? ((v) & ~0x1ffff) == 0 \
4438 ? 15 \
4439 : 14 \
4440 : ((v) & ~0x7ffff) == 0 \
4441 ? 13 \
4442 : 12 \
4443 : ((v) & ~0x3fffff) == 0 \
4444 ? ((v) & ~0x1fffff) == 0 \
4445 ? 11 \
4446 : 10 \
4447 : ((v) & ~0x7fffff) == 0 \
4448 ? 9 \
4449 : 8 \
4450 : ((v) & ~0xfffffff) == 0 \
4451 ? ((v) & ~0x3ffffff) == 0 \
4452 ? ((v) & ~0x1ffffff) == 0 \
4453 ? 7 \
4454 : 6 \
4455 : ((v) & ~0x7ffffff) == 0 \
4456 ? 5 \
4457 : 4 \
4458 : ((v) & ~0x3fffffff) == 0 \
4459 ? ((v) & ~0x1fffffff) == 0 \
4460 ? 3 \
4461 : 2 \
4462 : ((v) & ~0x7fffffff) == 0 \
4463 ? 1 \
4464 : 0)
4465
4466 /* load_register()
4467 * This routine generates the least number of instructions necessary to load
4468 * an absolute expression value into a register.
4469 */
4470 static void
4471 load_register (int reg, expressionS *ep, int dbl)
4472 {
4473 int freg;
4474 expressionS hi32, lo32;
4475
4476 if (ep->X_op != O_big)
4477 {
4478 gas_assert (ep->X_op == O_constant);
4479
4480 /* Sign-extending 32-bit constants makes their handling easier. */
4481 if (!dbl)
4482 normalize_constant_expr (ep);
4483
4484 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4485 {
4486 /* We can handle 16 bit signed values with an addiu to
4487 $zero. No need to ever use daddiu here, since $zero and
4488 the result are always correct in 32 bit mode. */
4489 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4490 return;
4491 }
4492 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4493 {
4494 /* We can handle 16 bit unsigned values with an ori to
4495 $zero. */
4496 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4497 return;
4498 }
4499 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4500 {
4501 /* 32 bit values require an lui. */
4502 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4503 if ((ep->X_add_number & 0xffff) != 0)
4504 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4505 return;
4506 }
4507 }
4508
4509 /* The value is larger than 32 bits. */
4510
4511 if (!dbl || HAVE_32BIT_GPRS)
4512 {
4513 char value[32];
4514
4515 sprintf_vma (value, ep->X_add_number);
4516 as_bad (_("Number (0x%s) larger than 32 bits"), value);
4517 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4518 return;
4519 }
4520
4521 if (ep->X_op != O_big)
4522 {
4523 hi32 = *ep;
4524 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4525 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4526 hi32.X_add_number &= 0xffffffff;
4527 lo32 = *ep;
4528 lo32.X_add_number &= 0xffffffff;
4529 }
4530 else
4531 {
4532 gas_assert (ep->X_add_number > 2);
4533 if (ep->X_add_number == 3)
4534 generic_bignum[3] = 0;
4535 else if (ep->X_add_number > 4)
4536 as_bad (_("Number larger than 64 bits"));
4537 lo32.X_op = O_constant;
4538 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4539 hi32.X_op = O_constant;
4540 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4541 }
4542
4543 if (hi32.X_add_number == 0)
4544 freg = 0;
4545 else
4546 {
4547 int shift, bit;
4548 unsigned long hi, lo;
4549
4550 if (hi32.X_add_number == (offsetT) 0xffffffff)
4551 {
4552 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4553 {
4554 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4555 return;
4556 }
4557 if (lo32.X_add_number & 0x80000000)
4558 {
4559 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4560 if (lo32.X_add_number & 0xffff)
4561 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4562 return;
4563 }
4564 }
4565
4566 /* Check for 16bit shifted constant. We know that hi32 is
4567 non-zero, so start the mask on the first bit of the hi32
4568 value. */
4569 shift = 17;
4570 do
4571 {
4572 unsigned long himask, lomask;
4573
4574 if (shift < 32)
4575 {
4576 himask = 0xffff >> (32 - shift);
4577 lomask = (0xffff << shift) & 0xffffffff;
4578 }
4579 else
4580 {
4581 himask = 0xffff << (shift - 32);
4582 lomask = 0;
4583 }
4584 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4585 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4586 {
4587 expressionS tmp;
4588
4589 tmp.X_op = O_constant;
4590 if (shift < 32)
4591 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4592 | (lo32.X_add_number >> shift));
4593 else
4594 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4595 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4596 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4597 reg, reg, (shift >= 32) ? shift - 32 : shift);
4598 return;
4599 }
4600 ++shift;
4601 }
4602 while (shift <= (64 - 16));
4603
4604 /* Find the bit number of the lowest one bit, and store the
4605 shifted value in hi/lo. */
4606 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4607 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4608 if (lo != 0)
4609 {
4610 bit = 0;
4611 while ((lo & 1) == 0)
4612 {
4613 lo >>= 1;
4614 ++bit;
4615 }
4616 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4617 hi >>= bit;
4618 }
4619 else
4620 {
4621 bit = 32;
4622 while ((hi & 1) == 0)
4623 {
4624 hi >>= 1;
4625 ++bit;
4626 }
4627 lo = hi;
4628 hi = 0;
4629 }
4630
4631 /* Optimize if the shifted value is a (power of 2) - 1. */
4632 if ((hi == 0 && ((lo + 1) & lo) == 0)
4633 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4634 {
4635 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4636 if (shift != 0)
4637 {
4638 expressionS tmp;
4639
4640 /* This instruction will set the register to be all
4641 ones. */
4642 tmp.X_op = O_constant;
4643 tmp.X_add_number = (offsetT) -1;
4644 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4645 if (bit != 0)
4646 {
4647 bit += shift;
4648 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4649 reg, reg, (bit >= 32) ? bit - 32 : bit);
4650 }
4651 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4652 reg, reg, (shift >= 32) ? shift - 32 : shift);
4653 return;
4654 }
4655 }
4656
4657 /* Sign extend hi32 before calling load_register, because we can
4658 generally get better code when we load a sign extended value. */
4659 if ((hi32.X_add_number & 0x80000000) != 0)
4660 hi32.X_add_number |= ~(offsetT) 0xffffffff;
4661 load_register (reg, &hi32, 0);
4662 freg = reg;
4663 }
4664 if ((lo32.X_add_number & 0xffff0000) == 0)
4665 {
4666 if (freg != 0)
4667 {
4668 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4669 freg = reg;
4670 }
4671 }
4672 else
4673 {
4674 expressionS mid16;
4675
4676 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4677 {
4678 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4679 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4680 return;
4681 }
4682
4683 if (freg != 0)
4684 {
4685 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4686 freg = reg;
4687 }
4688 mid16 = lo32;
4689 mid16.X_add_number >>= 16;
4690 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4691 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4692 freg = reg;
4693 }
4694 if ((lo32.X_add_number & 0xffff) != 0)
4695 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4696 }
4697
4698 static inline void
4699 load_delay_nop (void)
4700 {
4701 if (!gpr_interlocks)
4702 macro_build (NULL, "nop", "");
4703 }
4704
4705 /* Load an address into a register. */
4706
4707 static void
4708 load_address (int reg, expressionS *ep, int *used_at)
4709 {
4710 if (ep->X_op != O_constant
4711 && ep->X_op != O_symbol)
4712 {
4713 as_bad (_("expression too complex"));
4714 ep->X_op = O_constant;
4715 }
4716
4717 if (ep->X_op == O_constant)
4718 {
4719 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4720 return;
4721 }
4722
4723 if (mips_pic == NO_PIC)
4724 {
4725 /* If this is a reference to a GP relative symbol, we want
4726 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4727 Otherwise we want
4728 lui $reg,<sym> (BFD_RELOC_HI16_S)
4729 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4730 If we have an addend, we always use the latter form.
4731
4732 With 64bit address space and a usable $at we want
4733 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4734 lui $at,<sym> (BFD_RELOC_HI16_S)
4735 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4736 daddiu $at,<sym> (BFD_RELOC_LO16)
4737 dsll32 $reg,0
4738 daddu $reg,$reg,$at
4739
4740 If $at is already in use, we use a path which is suboptimal
4741 on superscalar processors.
4742 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4743 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4744 dsll $reg,16
4745 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4746 dsll $reg,16
4747 daddiu $reg,<sym> (BFD_RELOC_LO16)
4748
4749 For GP relative symbols in 64bit address space we can use
4750 the same sequence as in 32bit address space. */
4751 if (HAVE_64BIT_SYMBOLS)
4752 {
4753 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4754 && !nopic_need_relax (ep->X_add_symbol, 1))
4755 {
4756 relax_start (ep->X_add_symbol);
4757 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4758 mips_gp_register, BFD_RELOC_GPREL16);
4759 relax_switch ();
4760 }
4761
4762 if (*used_at == 0 && mips_opts.at)
4763 {
4764 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4765 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4766 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4767 BFD_RELOC_MIPS_HIGHER);
4768 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4769 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4770 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4771 *used_at = 1;
4772 }
4773 else
4774 {
4775 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4776 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4777 BFD_RELOC_MIPS_HIGHER);
4778 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4779 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4780 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4781 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4782 }
4783
4784 if (mips_relax.sequence)
4785 relax_end ();
4786 }
4787 else
4788 {
4789 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4790 && !nopic_need_relax (ep->X_add_symbol, 1))
4791 {
4792 relax_start (ep->X_add_symbol);
4793 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4794 mips_gp_register, BFD_RELOC_GPREL16);
4795 relax_switch ();
4796 }
4797 macro_build_lui (ep, reg);
4798 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4799 reg, reg, BFD_RELOC_LO16);
4800 if (mips_relax.sequence)
4801 relax_end ();
4802 }
4803 }
4804 else if (!mips_big_got)
4805 {
4806 expressionS ex;
4807
4808 /* If this is a reference to an external symbol, we want
4809 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4810 Otherwise we want
4811 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4812 nop
4813 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4814 If there is a constant, it must be added in after.
4815
4816 If we have NewABI, we want
4817 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4818 unless we're referencing a global symbol with a non-zero
4819 offset, in which case cst must be added separately. */
4820 if (HAVE_NEWABI)
4821 {
4822 if (ep->X_add_number)
4823 {
4824 ex.X_add_number = ep->X_add_number;
4825 ep->X_add_number = 0;
4826 relax_start (ep->X_add_symbol);
4827 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4828 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4829 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4830 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4831 ex.X_op = O_constant;
4832 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4833 reg, reg, BFD_RELOC_LO16);
4834 ep->X_add_number = ex.X_add_number;
4835 relax_switch ();
4836 }
4837 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4838 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4839 if (mips_relax.sequence)
4840 relax_end ();
4841 }
4842 else
4843 {
4844 ex.X_add_number = ep->X_add_number;
4845 ep->X_add_number = 0;
4846 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4847 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4848 load_delay_nop ();
4849 relax_start (ep->X_add_symbol);
4850 relax_switch ();
4851 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4852 BFD_RELOC_LO16);
4853 relax_end ();
4854
4855 if (ex.X_add_number != 0)
4856 {
4857 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4858 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4859 ex.X_op = O_constant;
4860 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4861 reg, reg, BFD_RELOC_LO16);
4862 }
4863 }
4864 }
4865 else if (mips_big_got)
4866 {
4867 expressionS ex;
4868
4869 /* This is the large GOT case. If this is a reference to an
4870 external symbol, we want
4871 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4872 addu $reg,$reg,$gp
4873 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4874
4875 Otherwise, for a reference to a local symbol in old ABI, we want
4876 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4877 nop
4878 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4879 If there is a constant, it must be added in after.
4880
4881 In the NewABI, for local symbols, with or without offsets, we want:
4882 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4883 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4884 */
4885 if (HAVE_NEWABI)
4886 {
4887 ex.X_add_number = ep->X_add_number;
4888 ep->X_add_number = 0;
4889 relax_start (ep->X_add_symbol);
4890 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4891 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4892 reg, reg, mips_gp_register);
4893 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4894 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4895 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4896 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4897 else if (ex.X_add_number)
4898 {
4899 ex.X_op = O_constant;
4900 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4901 BFD_RELOC_LO16);
4902 }
4903
4904 ep->X_add_number = ex.X_add_number;
4905 relax_switch ();
4906 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4907 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4908 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4909 BFD_RELOC_MIPS_GOT_OFST);
4910 relax_end ();
4911 }
4912 else
4913 {
4914 ex.X_add_number = ep->X_add_number;
4915 ep->X_add_number = 0;
4916 relax_start (ep->X_add_symbol);
4917 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4918 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4919 reg, reg, mips_gp_register);
4920 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4921 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4922 relax_switch ();
4923 if (reg_needs_delay (mips_gp_register))
4924 {
4925 /* We need a nop before loading from $gp. This special
4926 check is required because the lui which starts the main
4927 instruction stream does not refer to $gp, and so will not
4928 insert the nop which may be required. */
4929 macro_build (NULL, "nop", "");
4930 }
4931 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4932 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4933 load_delay_nop ();
4934 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4935 BFD_RELOC_LO16);
4936 relax_end ();
4937
4938 if (ex.X_add_number != 0)
4939 {
4940 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4941 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4942 ex.X_op = O_constant;
4943 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4944 BFD_RELOC_LO16);
4945 }
4946 }
4947 }
4948 else
4949 abort ();
4950
4951 if (!mips_opts.at && *used_at == 1)
4952 as_bad (_("Macro used $at after \".set noat\""));
4953 }
4954
4955 /* Move the contents of register SOURCE into register DEST. */
4956
4957 static void
4958 move_register (int dest, int source)
4959 {
4960 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4961 dest, source, 0);
4962 }
4963
4964 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4965 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4966 The two alternatives are:
4967
4968 Global symbol Local sybmol
4969 ------------- ------------
4970 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4971 ... ...
4972 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4973
4974 load_got_offset emits the first instruction and add_got_offset
4975 emits the second for a 16-bit offset or add_got_offset_hilo emits
4976 a sequence to add a 32-bit offset using a scratch register. */
4977
4978 static void
4979 load_got_offset (int dest, expressionS *local)
4980 {
4981 expressionS global;
4982
4983 global = *local;
4984 global.X_add_number = 0;
4985
4986 relax_start (local->X_add_symbol);
4987 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4988 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4989 relax_switch ();
4990 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4991 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4992 relax_end ();
4993 }
4994
4995 static void
4996 add_got_offset (int dest, expressionS *local)
4997 {
4998 expressionS global;
4999
5000 global.X_op = O_constant;
5001 global.X_op_symbol = NULL;
5002 global.X_add_symbol = NULL;
5003 global.X_add_number = local->X_add_number;
5004
5005 relax_start (local->X_add_symbol);
5006 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
5007 dest, dest, BFD_RELOC_LO16);
5008 relax_switch ();
5009 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
5010 relax_end ();
5011 }
5012
5013 static void
5014 add_got_offset_hilo (int dest, expressionS *local, int tmp)
5015 {
5016 expressionS global;
5017 int hold_mips_optimize;
5018
5019 global.X_op = O_constant;
5020 global.X_op_symbol = NULL;
5021 global.X_add_symbol = NULL;
5022 global.X_add_number = local->X_add_number;
5023
5024 relax_start (local->X_add_symbol);
5025 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
5026 relax_switch ();
5027 /* Set mips_optimize around the lui instruction to avoid
5028 inserting an unnecessary nop after the lw. */
5029 hold_mips_optimize = mips_optimize;
5030 mips_optimize = 2;
5031 macro_build_lui (&global, tmp);
5032 mips_optimize = hold_mips_optimize;
5033 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
5034 relax_end ();
5035
5036 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
5037 }
5038
5039 /*
5040 * Build macros
5041 * This routine implements the seemingly endless macro or synthesized
5042 * instructions and addressing modes in the mips assembly language. Many
5043 * of these macros are simple and are similar to each other. These could
5044 * probably be handled by some kind of table or grammar approach instead of
5045 * this verbose method. Others are not simple macros but are more like
5046 * optimizing code generation.
5047 * One interesting optimization is when several store macros appear
5048 * consecutively that would load AT with the upper half of the same address.
5049 * The ensuing load upper instructions are ommited. This implies some kind
5050 * of global optimization. We currently only optimize within a single macro.
5051 * For many of the load and store macros if the address is specified as a
5052 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
5053 * first load register 'at' with zero and use it as the base register. The
5054 * mips assembler simply uses register $zero. Just one tiny optimization
5055 * we're missing.
5056 */
5057 static void
5058 macro (struct mips_cl_insn *ip)
5059 {
5060 unsigned int treg, sreg, dreg, breg;
5061 unsigned int tempreg;
5062 int mask;
5063 int used_at = 0;
5064 expressionS expr1;
5065 const char *s;
5066 const char *s2;
5067 const char *fmt;
5068 int likely = 0;
5069 int dbl = 0;
5070 int coproc = 0;
5071 int lr = 0;
5072 int imm = 0;
5073 int call = 0;
5074 int off;
5075 offsetT maxnum;
5076 bfd_reloc_code_real_type r;
5077 int hold_mips_optimize;
5078
5079 gas_assert (! mips_opts.mips16);
5080
5081 treg = EXTRACT_OPERAND (RT, *ip);
5082 dreg = EXTRACT_OPERAND (RD, *ip);
5083 sreg = breg = EXTRACT_OPERAND (RS, *ip);
5084 mask = ip->insn_mo->mask;
5085
5086 expr1.X_op = O_constant;
5087 expr1.X_op_symbol = NULL;
5088 expr1.X_add_symbol = NULL;
5089 expr1.X_add_number = 1;
5090
5091 switch (mask)
5092 {
5093 case M_DABS:
5094 dbl = 1;
5095 case M_ABS:
5096 /* bgez $a0,.+12
5097 move v0,$a0
5098 sub v0,$zero,$a0
5099 */
5100
5101 start_noreorder ();
5102
5103 expr1.X_add_number = 8;
5104 macro_build (&expr1, "bgez", "s,p", sreg);
5105 if (dreg == sreg)
5106 macro_build (NULL, "nop", "");
5107 else
5108 move_register (dreg, sreg);
5109 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
5110
5111 end_noreorder ();
5112 break;
5113
5114 case M_ADD_I:
5115 s = "addi";
5116 s2 = "add";
5117 goto do_addi;
5118 case M_ADDU_I:
5119 s = "addiu";
5120 s2 = "addu";
5121 goto do_addi;
5122 case M_DADD_I:
5123 dbl = 1;
5124 s = "daddi";
5125 s2 = "dadd";
5126 goto do_addi;
5127 case M_DADDU_I:
5128 dbl = 1;
5129 s = "daddiu";
5130 s2 = "daddu";
5131 do_addi:
5132 if (imm_expr.X_op == O_constant
5133 && imm_expr.X_add_number >= -0x8000
5134 && imm_expr.X_add_number < 0x8000)
5135 {
5136 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
5137 break;
5138 }
5139 used_at = 1;
5140 load_register (AT, &imm_expr, dbl);
5141 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5142 break;
5143
5144 case M_AND_I:
5145 s = "andi";
5146 s2 = "and";
5147 goto do_bit;
5148 case M_OR_I:
5149 s = "ori";
5150 s2 = "or";
5151 goto do_bit;
5152 case M_NOR_I:
5153 s = "";
5154 s2 = "nor";
5155 goto do_bit;
5156 case M_XOR_I:
5157 s = "xori";
5158 s2 = "xor";
5159 do_bit:
5160 if (imm_expr.X_op == O_constant
5161 && imm_expr.X_add_number >= 0
5162 && imm_expr.X_add_number < 0x10000)
5163 {
5164 if (mask != M_NOR_I)
5165 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
5166 else
5167 {
5168 macro_build (&imm_expr, "ori", "t,r,i",
5169 treg, sreg, BFD_RELOC_LO16);
5170 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
5171 }
5172 break;
5173 }
5174
5175 used_at = 1;
5176 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5177 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5178 break;
5179
5180 case M_BALIGN:
5181 switch (imm_expr.X_add_number)
5182 {
5183 case 0:
5184 macro_build (NULL, "nop", "");
5185 break;
5186 case 2:
5187 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
5188 break;
5189 default:
5190 macro_build (NULL, "balign", "t,s,2", treg, sreg,
5191 (int) imm_expr.X_add_number);
5192 break;
5193 }
5194 break;
5195
5196 case M_BEQ_I:
5197 s = "beq";
5198 goto beq_i;
5199 case M_BEQL_I:
5200 s = "beql";
5201 likely = 1;
5202 goto beq_i;
5203 case M_BNE_I:
5204 s = "bne";
5205 goto beq_i;
5206 case M_BNEL_I:
5207 s = "bnel";
5208 likely = 1;
5209 beq_i:
5210 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5211 {
5212 macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
5213 break;
5214 }
5215 used_at = 1;
5216 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5217 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
5218 break;
5219
5220 case M_BGEL:
5221 likely = 1;
5222 case M_BGE:
5223 if (treg == 0)
5224 {
5225 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5226 break;
5227 }
5228 if (sreg == 0)
5229 {
5230 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
5231 break;
5232 }
5233 used_at = 1;
5234 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5235 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5236 break;
5237
5238 case M_BGTL_I:
5239 likely = 1;
5240 case M_BGT_I:
5241 /* Check for > max integer. */
5242 maxnum = 0x7fffffff;
5243 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5244 {
5245 maxnum <<= 16;
5246 maxnum |= 0xffff;
5247 maxnum <<= 16;
5248 maxnum |= 0xffff;
5249 }
5250 if (imm_expr.X_op == O_constant
5251 && imm_expr.X_add_number >= maxnum
5252 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5253 {
5254 do_false:
5255 /* Result is always false. */
5256 if (! likely)
5257 macro_build (NULL, "nop", "");
5258 else
5259 macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5260 break;
5261 }
5262 if (imm_expr.X_op != O_constant)
5263 as_bad (_("Unsupported large constant"));
5264 ++imm_expr.X_add_number;
5265 /* FALLTHROUGH */
5266 case M_BGE_I:
5267 case M_BGEL_I:
5268 if (mask == M_BGEL_I)
5269 likely = 1;
5270 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5271 {
5272 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5273 break;
5274 }
5275 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5276 {
5277 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5278 break;
5279 }
5280 maxnum = 0x7fffffff;
5281 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5282 {
5283 maxnum <<= 16;
5284 maxnum |= 0xffff;
5285 maxnum <<= 16;
5286 maxnum |= 0xffff;
5287 }
5288 maxnum = - maxnum - 1;
5289 if (imm_expr.X_op == O_constant
5290 && imm_expr.X_add_number <= maxnum
5291 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5292 {
5293 do_true:
5294 /* result is always true */
5295 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5296 macro_build (&offset_expr, "b", "p");
5297 break;
5298 }
5299 used_at = 1;
5300 set_at (sreg, 0);
5301 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5302 break;
5303
5304 case M_BGEUL:
5305 likely = 1;
5306 case M_BGEU:
5307 if (treg == 0)
5308 goto do_true;
5309 if (sreg == 0)
5310 {
5311 macro_build (&offset_expr, likely ? "beql" : "beq",
5312 "s,t,p", ZERO, treg);
5313 break;
5314 }
5315 used_at = 1;
5316 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5317 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5318 break;
5319
5320 case M_BGTUL_I:
5321 likely = 1;
5322 case M_BGTU_I:
5323 if (sreg == 0
5324 || (HAVE_32BIT_GPRS
5325 && imm_expr.X_op == O_constant
5326 && imm_expr.X_add_number == -1))
5327 goto do_false;
5328 if (imm_expr.X_op != O_constant)
5329 as_bad (_("Unsupported large constant"));
5330 ++imm_expr.X_add_number;
5331 /* FALLTHROUGH */
5332 case M_BGEU_I:
5333 case M_BGEUL_I:
5334 if (mask == M_BGEUL_I)
5335 likely = 1;
5336 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5337 goto do_true;
5338 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5339 {
5340 macro_build (&offset_expr, likely ? "bnel" : "bne",
5341 "s,t,p", sreg, ZERO);
5342 break;
5343 }
5344 used_at = 1;
5345 set_at (sreg, 1);
5346 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5347 break;
5348
5349 case M_BGTL:
5350 likely = 1;
5351 case M_BGT:
5352 if (treg == 0)
5353 {
5354 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5355 break;
5356 }
5357 if (sreg == 0)
5358 {
5359 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5360 break;
5361 }
5362 used_at = 1;
5363 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5364 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5365 break;
5366
5367 case M_BGTUL:
5368 likely = 1;
5369 case M_BGTU:
5370 if (treg == 0)
5371 {
5372 macro_build (&offset_expr, likely ? "bnel" : "bne",
5373 "s,t,p", sreg, ZERO);
5374 break;
5375 }
5376 if (sreg == 0)
5377 goto do_false;
5378 used_at = 1;
5379 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5380 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5381 break;
5382
5383 case M_BLEL:
5384 likely = 1;
5385 case M_BLE:
5386 if (treg == 0)
5387 {
5388 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5389 break;
5390 }
5391 if (sreg == 0)
5392 {
5393 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5394 break;
5395 }
5396 used_at = 1;
5397 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5398 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5399 break;
5400
5401 case M_BLEL_I:
5402 likely = 1;
5403 case M_BLE_I:
5404 maxnum = 0x7fffffff;
5405 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5406 {
5407 maxnum <<= 16;
5408 maxnum |= 0xffff;
5409 maxnum <<= 16;
5410 maxnum |= 0xffff;
5411 }
5412 if (imm_expr.X_op == O_constant
5413 && imm_expr.X_add_number >= maxnum
5414 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5415 goto do_true;
5416 if (imm_expr.X_op != O_constant)
5417 as_bad (_("Unsupported large constant"));
5418 ++imm_expr.X_add_number;
5419 /* FALLTHROUGH */
5420 case M_BLT_I:
5421 case M_BLTL_I:
5422 if (mask == M_BLTL_I)
5423 likely = 1;
5424 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5425 {
5426 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5427 break;
5428 }
5429 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5430 {
5431 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5432 break;
5433 }
5434 used_at = 1;
5435 set_at (sreg, 0);
5436 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5437 break;
5438
5439 case M_BLEUL:
5440 likely = 1;
5441 case M_BLEU:
5442 if (treg == 0)
5443 {
5444 macro_build (&offset_expr, likely ? "beql" : "beq",
5445 "s,t,p", sreg, ZERO);
5446 break;
5447 }
5448 if (sreg == 0)
5449 goto do_true;
5450 used_at = 1;
5451 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5452 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5453 break;
5454
5455 case M_BLEUL_I:
5456 likely = 1;
5457 case M_BLEU_I:
5458 if (sreg == 0
5459 || (HAVE_32BIT_GPRS
5460 && imm_expr.X_op == O_constant
5461 && imm_expr.X_add_number == -1))
5462 goto do_true;
5463 if (imm_expr.X_op != O_constant)
5464 as_bad (_("Unsupported large constant"));
5465 ++imm_expr.X_add_number;
5466 /* FALLTHROUGH */
5467 case M_BLTU_I:
5468 case M_BLTUL_I:
5469 if (mask == M_BLTUL_I)
5470 likely = 1;
5471 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5472 goto do_false;
5473 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5474 {
5475 macro_build (&offset_expr, likely ? "beql" : "beq",
5476 "s,t,p", sreg, ZERO);
5477 break;
5478 }
5479 used_at = 1;
5480 set_at (sreg, 1);
5481 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5482 break;
5483
5484 case M_BLTL:
5485 likely = 1;
5486 case M_BLT:
5487 if (treg == 0)
5488 {
5489 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5490 break;
5491 }
5492 if (sreg == 0)
5493 {
5494 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5495 break;
5496 }
5497 used_at = 1;
5498 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5499 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5500 break;
5501
5502 case M_BLTUL:
5503 likely = 1;
5504 case M_BLTU:
5505 if (treg == 0)
5506 goto do_false;
5507 if (sreg == 0)
5508 {
5509 macro_build (&offset_expr, likely ? "bnel" : "bne",
5510 "s,t,p", ZERO, treg);
5511 break;
5512 }
5513 used_at = 1;
5514 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5515 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5516 break;
5517
5518 case M_DEXT:
5519 {
5520 /* Use unsigned arithmetic. */
5521 addressT pos;
5522 addressT size;
5523
5524 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5525 {
5526 as_bad (_("Unsupported large constant"));
5527 pos = size = 1;
5528 }
5529 else
5530 {
5531 pos = imm_expr.X_add_number;
5532 size = imm2_expr.X_add_number;
5533 }
5534
5535 if (pos > 63)
5536 {
5537 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5538 pos = 1;
5539 }
5540 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5541 {
5542 as_bad (_("Improper extract size (%lu, position %lu)"),
5543 (unsigned long) size, (unsigned long) pos);
5544 size = 1;
5545 }
5546
5547 if (size <= 32 && pos < 32)
5548 {
5549 s = "dext";
5550 fmt = "t,r,+A,+C";
5551 }
5552 else if (size <= 32)
5553 {
5554 s = "dextu";
5555 fmt = "t,r,+E,+H";
5556 }
5557 else
5558 {
5559 s = "dextm";
5560 fmt = "t,r,+A,+G";
5561 }
5562 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5563 (int) (size - 1));
5564 }
5565 break;
5566
5567 case M_DINS:
5568 {
5569 /* Use unsigned arithmetic. */
5570 addressT pos;
5571 addressT size;
5572
5573 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5574 {
5575 as_bad (_("Unsupported large constant"));
5576 pos = size = 1;
5577 }
5578 else
5579 {
5580 pos = imm_expr.X_add_number;
5581 size = imm2_expr.X_add_number;
5582 }
5583
5584 if (pos > 63)
5585 {
5586 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5587 pos = 1;
5588 }
5589 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5590 {
5591 as_bad (_("Improper insert size (%lu, position %lu)"),
5592 (unsigned long) size, (unsigned long) pos);
5593 size = 1;
5594 }
5595
5596 if (pos < 32 && (pos + size - 1) < 32)
5597 {
5598 s = "dins";
5599 fmt = "t,r,+A,+B";
5600 }
5601 else if (pos >= 32)
5602 {
5603 s = "dinsu";
5604 fmt = "t,r,+E,+F";
5605 }
5606 else
5607 {
5608 s = "dinsm";
5609 fmt = "t,r,+A,+F";
5610 }
5611 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5612 (int) (pos + size - 1));
5613 }
5614 break;
5615
5616 case M_DDIV_3:
5617 dbl = 1;
5618 case M_DIV_3:
5619 s = "mflo";
5620 goto do_div3;
5621 case M_DREM_3:
5622 dbl = 1;
5623 case M_REM_3:
5624 s = "mfhi";
5625 do_div3:
5626 if (treg == 0)
5627 {
5628 as_warn (_("Divide by zero."));
5629 if (mips_trap)
5630 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5631 else
5632 macro_build (NULL, "break", "c", 7);
5633 break;
5634 }
5635
5636 start_noreorder ();
5637 if (mips_trap)
5638 {
5639 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5640 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5641 }
5642 else
5643 {
5644 expr1.X_add_number = 8;
5645 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5646 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5647 macro_build (NULL, "break", "c", 7);
5648 }
5649 expr1.X_add_number = -1;
5650 used_at = 1;
5651 load_register (AT, &expr1, dbl);
5652 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5653 macro_build (&expr1, "bne", "s,t,p", treg, AT);
5654 if (dbl)
5655 {
5656 expr1.X_add_number = 1;
5657 load_register (AT, &expr1, dbl);
5658 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5659 }
5660 else
5661 {
5662 expr1.X_add_number = 0x80000000;
5663 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5664 }
5665 if (mips_trap)
5666 {
5667 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5668 /* We want to close the noreorder block as soon as possible, so
5669 that later insns are available for delay slot filling. */
5670 end_noreorder ();
5671 }
5672 else
5673 {
5674 expr1.X_add_number = 8;
5675 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5676 macro_build (NULL, "nop", "");
5677
5678 /* We want to close the noreorder block as soon as possible, so
5679 that later insns are available for delay slot filling. */
5680 end_noreorder ();
5681
5682 macro_build (NULL, "break", "c", 6);
5683 }
5684 macro_build (NULL, s, "d", dreg);
5685 break;
5686
5687 case M_DIV_3I:
5688 s = "div";
5689 s2 = "mflo";
5690 goto do_divi;
5691 case M_DIVU_3I:
5692 s = "divu";
5693 s2 = "mflo";
5694 goto do_divi;
5695 case M_REM_3I:
5696 s = "div";
5697 s2 = "mfhi";
5698 goto do_divi;
5699 case M_REMU_3I:
5700 s = "divu";
5701 s2 = "mfhi";
5702 goto do_divi;
5703 case M_DDIV_3I:
5704 dbl = 1;
5705 s = "ddiv";
5706 s2 = "mflo";
5707 goto do_divi;
5708 case M_DDIVU_3I:
5709 dbl = 1;
5710 s = "ddivu";
5711 s2 = "mflo";
5712 goto do_divi;
5713 case M_DREM_3I:
5714 dbl = 1;
5715 s = "ddiv";
5716 s2 = "mfhi";
5717 goto do_divi;
5718 case M_DREMU_3I:
5719 dbl = 1;
5720 s = "ddivu";
5721 s2 = "mfhi";
5722 do_divi:
5723 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5724 {
5725 as_warn (_("Divide by zero."));
5726 if (mips_trap)
5727 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5728 else
5729 macro_build (NULL, "break", "c", 7);
5730 break;
5731 }
5732 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5733 {
5734 if (strcmp (s2, "mflo") == 0)
5735 move_register (dreg, sreg);
5736 else
5737 move_register (dreg, ZERO);
5738 break;
5739 }
5740 if (imm_expr.X_op == O_constant
5741 && imm_expr.X_add_number == -1
5742 && s[strlen (s) - 1] != 'u')
5743 {
5744 if (strcmp (s2, "mflo") == 0)
5745 {
5746 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5747 }
5748 else
5749 move_register (dreg, ZERO);
5750 break;
5751 }
5752
5753 used_at = 1;
5754 load_register (AT, &imm_expr, dbl);
5755 macro_build (NULL, s, "z,s,t", sreg, AT);
5756 macro_build (NULL, s2, "d", dreg);
5757 break;
5758
5759 case M_DIVU_3:
5760 s = "divu";
5761 s2 = "mflo";
5762 goto do_divu3;
5763 case M_REMU_3:
5764 s = "divu";
5765 s2 = "mfhi";
5766 goto do_divu3;
5767 case M_DDIVU_3:
5768 s = "ddivu";
5769 s2 = "mflo";
5770 goto do_divu3;
5771 case M_DREMU_3:
5772 s = "ddivu";
5773 s2 = "mfhi";
5774 do_divu3:
5775 start_noreorder ();
5776 if (mips_trap)
5777 {
5778 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5779 macro_build (NULL, s, "z,s,t", sreg, treg);
5780 /* We want to close the noreorder block as soon as possible, so
5781 that later insns are available for delay slot filling. */
5782 end_noreorder ();
5783 }
5784 else
5785 {
5786 expr1.X_add_number = 8;
5787 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5788 macro_build (NULL, s, "z,s,t", sreg, treg);
5789
5790 /* We want to close the noreorder block as soon as possible, so
5791 that later insns are available for delay slot filling. */
5792 end_noreorder ();
5793 macro_build (NULL, "break", "c", 7);
5794 }
5795 macro_build (NULL, s2, "d", dreg);
5796 break;
5797
5798 case M_DLCA_AB:
5799 dbl = 1;
5800 case M_LCA_AB:
5801 call = 1;
5802 goto do_la;
5803 case M_DLA_AB:
5804 dbl = 1;
5805 case M_LA_AB:
5806 do_la:
5807 /* Load the address of a symbol into a register. If breg is not
5808 zero, we then add a base register to it. */
5809
5810 if (dbl && HAVE_32BIT_GPRS)
5811 as_warn (_("dla used to load 32-bit register"));
5812
5813 if (!dbl && HAVE_64BIT_OBJECTS)
5814 as_warn (_("la used to load 64-bit address"));
5815
5816 if (offset_expr.X_op == O_constant
5817 && offset_expr.X_add_number >= -0x8000
5818 && offset_expr.X_add_number < 0x8000)
5819 {
5820 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5821 "t,r,j", treg, sreg, BFD_RELOC_LO16);
5822 break;
5823 }
5824
5825 if (mips_opts.at && (treg == breg))
5826 {
5827 tempreg = AT;
5828 used_at = 1;
5829 }
5830 else
5831 {
5832 tempreg = treg;
5833 }
5834
5835 if (offset_expr.X_op != O_symbol
5836 && offset_expr.X_op != O_constant)
5837 {
5838 as_bad (_("Expression too complex"));
5839 offset_expr.X_op = O_constant;
5840 }
5841
5842 if (offset_expr.X_op == O_constant)
5843 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5844 else if (mips_pic == NO_PIC)
5845 {
5846 /* If this is a reference to a GP relative symbol, we want
5847 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5848 Otherwise we want
5849 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5850 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5851 If we have a constant, we need two instructions anyhow,
5852 so we may as well always use the latter form.
5853
5854 With 64bit address space and a usable $at we want
5855 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5856 lui $at,<sym> (BFD_RELOC_HI16_S)
5857 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5858 daddiu $at,<sym> (BFD_RELOC_LO16)
5859 dsll32 $tempreg,0
5860 daddu $tempreg,$tempreg,$at
5861
5862 If $at is already in use, we use a path which is suboptimal
5863 on superscalar processors.
5864 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5865 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5866 dsll $tempreg,16
5867 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5868 dsll $tempreg,16
5869 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5870
5871 For GP relative symbols in 64bit address space we can use
5872 the same sequence as in 32bit address space. */
5873 if (HAVE_64BIT_SYMBOLS)
5874 {
5875 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5876 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5877 {
5878 relax_start (offset_expr.X_add_symbol);
5879 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5880 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5881 relax_switch ();
5882 }
5883
5884 if (used_at == 0 && mips_opts.at)
5885 {
5886 macro_build (&offset_expr, "lui", "t,u",
5887 tempreg, BFD_RELOC_MIPS_HIGHEST);
5888 macro_build (&offset_expr, "lui", "t,u",
5889 AT, BFD_RELOC_HI16_S);
5890 macro_build (&offset_expr, "daddiu", "t,r,j",
5891 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5892 macro_build (&offset_expr, "daddiu", "t,r,j",
5893 AT, AT, BFD_RELOC_LO16);
5894 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5895 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5896 used_at = 1;
5897 }
5898 else
5899 {
5900 macro_build (&offset_expr, "lui", "t,u",
5901 tempreg, BFD_RELOC_MIPS_HIGHEST);
5902 macro_build (&offset_expr, "daddiu", "t,r,j",
5903 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5904 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5905 macro_build (&offset_expr, "daddiu", "t,r,j",
5906 tempreg, tempreg, BFD_RELOC_HI16_S);
5907 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5908 macro_build (&offset_expr, "daddiu", "t,r,j",
5909 tempreg, tempreg, BFD_RELOC_LO16);
5910 }
5911
5912 if (mips_relax.sequence)
5913 relax_end ();
5914 }
5915 else
5916 {
5917 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5918 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5919 {
5920 relax_start (offset_expr.X_add_symbol);
5921 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5922 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5923 relax_switch ();
5924 }
5925 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5926 as_bad (_("Offset too large"));
5927 macro_build_lui (&offset_expr, tempreg);
5928 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5929 tempreg, tempreg, BFD_RELOC_LO16);
5930 if (mips_relax.sequence)
5931 relax_end ();
5932 }
5933 }
5934 else if (!mips_big_got && !HAVE_NEWABI)
5935 {
5936 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5937
5938 /* If this is a reference to an external symbol, and there
5939 is no constant, we want
5940 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5941 or for lca or if tempreg is PIC_CALL_REG
5942 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5943 For a local symbol, we want
5944 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5945 nop
5946 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5947
5948 If we have a small constant, and this is a reference to
5949 an external symbol, we want
5950 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5951 nop
5952 addiu $tempreg,$tempreg,<constant>
5953 For a local symbol, we want the same instruction
5954 sequence, but we output a BFD_RELOC_LO16 reloc on the
5955 addiu instruction.
5956
5957 If we have a large constant, and this is a reference to
5958 an external symbol, we want
5959 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5960 lui $at,<hiconstant>
5961 addiu $at,$at,<loconstant>
5962 addu $tempreg,$tempreg,$at
5963 For a local symbol, we want the same instruction
5964 sequence, but we output a BFD_RELOC_LO16 reloc on the
5965 addiu instruction.
5966 */
5967
5968 if (offset_expr.X_add_number == 0)
5969 {
5970 if (mips_pic == SVR4_PIC
5971 && breg == 0
5972 && (call || tempreg == PIC_CALL_REG))
5973 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5974
5975 relax_start (offset_expr.X_add_symbol);
5976 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5977 lw_reloc_type, mips_gp_register);
5978 if (breg != 0)
5979 {
5980 /* We're going to put in an addu instruction using
5981 tempreg, so we may as well insert the nop right
5982 now. */
5983 load_delay_nop ();
5984 }
5985 relax_switch ();
5986 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5987 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5988 load_delay_nop ();
5989 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5990 tempreg, tempreg, BFD_RELOC_LO16);
5991 relax_end ();
5992 /* FIXME: If breg == 0, and the next instruction uses
5993 $tempreg, then if this variant case is used an extra
5994 nop will be generated. */
5995 }
5996 else if (offset_expr.X_add_number >= -0x8000
5997 && offset_expr.X_add_number < 0x8000)
5998 {
5999 load_got_offset (tempreg, &offset_expr);
6000 load_delay_nop ();
6001 add_got_offset (tempreg, &offset_expr);
6002 }
6003 else
6004 {
6005 expr1.X_add_number = offset_expr.X_add_number;
6006 offset_expr.X_add_number =
6007 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
6008 load_got_offset (tempreg, &offset_expr);
6009 offset_expr.X_add_number = expr1.X_add_number;
6010 /* If we are going to add in a base register, and the
6011 target register and the base register are the same,
6012 then we are using AT as a temporary register. Since
6013 we want to load the constant into AT, we add our
6014 current AT (from the global offset table) and the
6015 register into the register now, and pretend we were
6016 not using a base register. */
6017 if (breg == treg)
6018 {
6019 load_delay_nop ();
6020 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6021 treg, AT, breg);
6022 breg = 0;
6023 tempreg = treg;
6024 }
6025 add_got_offset_hilo (tempreg, &offset_expr, AT);
6026 used_at = 1;
6027 }
6028 }
6029 else if (!mips_big_got && HAVE_NEWABI)
6030 {
6031 int add_breg_early = 0;
6032
6033 /* If this is a reference to an external, and there is no
6034 constant, or local symbol (*), with or without a
6035 constant, we want
6036 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6037 or for lca or if tempreg is PIC_CALL_REG
6038 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6039
6040 If we have a small constant, and this is a reference to
6041 an external symbol, we want
6042 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6043 addiu $tempreg,$tempreg,<constant>
6044
6045 If we have a large constant, and this is a reference to
6046 an external symbol, we want
6047 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6048 lui $at,<hiconstant>
6049 addiu $at,$at,<loconstant>
6050 addu $tempreg,$tempreg,$at
6051
6052 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
6053 local symbols, even though it introduces an additional
6054 instruction. */
6055
6056 if (offset_expr.X_add_number)
6057 {
6058 expr1.X_add_number = offset_expr.X_add_number;
6059 offset_expr.X_add_number = 0;
6060
6061 relax_start (offset_expr.X_add_symbol);
6062 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6063 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6064
6065 if (expr1.X_add_number >= -0x8000
6066 && expr1.X_add_number < 0x8000)
6067 {
6068 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6069 tempreg, tempreg, BFD_RELOC_LO16);
6070 }
6071 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6072 {
6073 /* If we are going to add in a base register, and the
6074 target register and the base register are the same,
6075 then we are using AT as a temporary register. Since
6076 we want to load the constant into AT, we add our
6077 current AT (from the global offset table) and the
6078 register into the register now, and pretend we were
6079 not using a base register. */
6080 if (breg != treg)
6081 dreg = tempreg;
6082 else
6083 {
6084 gas_assert (tempreg == AT);
6085 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6086 treg, AT, breg);
6087 dreg = treg;
6088 add_breg_early = 1;
6089 }
6090
6091 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6092 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6093 dreg, dreg, AT);
6094
6095 used_at = 1;
6096 }
6097 else
6098 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6099
6100 relax_switch ();
6101 offset_expr.X_add_number = expr1.X_add_number;
6102
6103 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6104 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6105 if (add_breg_early)
6106 {
6107 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6108 treg, tempreg, breg);
6109 breg = 0;
6110 tempreg = treg;
6111 }
6112 relax_end ();
6113 }
6114 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
6115 {
6116 relax_start (offset_expr.X_add_symbol);
6117 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6118 BFD_RELOC_MIPS_CALL16, mips_gp_register);
6119 relax_switch ();
6120 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6121 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6122 relax_end ();
6123 }
6124 else
6125 {
6126 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6127 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6128 }
6129 }
6130 else if (mips_big_got && !HAVE_NEWABI)
6131 {
6132 int gpdelay;
6133 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6134 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6135 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6136
6137 /* This is the large GOT case. If this is a reference to an
6138 external symbol, and there is no constant, we want
6139 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6140 addu $tempreg,$tempreg,$gp
6141 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6142 or for lca or if tempreg is PIC_CALL_REG
6143 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6144 addu $tempreg,$tempreg,$gp
6145 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6146 For a local symbol, we want
6147 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6148 nop
6149 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6150
6151 If we have a small constant, and this is a reference to
6152 an external symbol, we want
6153 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6154 addu $tempreg,$tempreg,$gp
6155 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6156 nop
6157 addiu $tempreg,$tempreg,<constant>
6158 For a local symbol, we want
6159 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6160 nop
6161 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
6162
6163 If we have a large constant, and this is a reference to
6164 an external symbol, we want
6165 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6166 addu $tempreg,$tempreg,$gp
6167 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6168 lui $at,<hiconstant>
6169 addiu $at,$at,<loconstant>
6170 addu $tempreg,$tempreg,$at
6171 For a local symbol, we want
6172 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6173 lui $at,<hiconstant>
6174 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
6175 addu $tempreg,$tempreg,$at
6176 */
6177
6178 expr1.X_add_number = offset_expr.X_add_number;
6179 offset_expr.X_add_number = 0;
6180 relax_start (offset_expr.X_add_symbol);
6181 gpdelay = reg_needs_delay (mips_gp_register);
6182 if (expr1.X_add_number == 0 && breg == 0
6183 && (call || tempreg == PIC_CALL_REG))
6184 {
6185 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6186 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6187 }
6188 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6189 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6190 tempreg, tempreg, mips_gp_register);
6191 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6192 tempreg, lw_reloc_type, tempreg);
6193 if (expr1.X_add_number == 0)
6194 {
6195 if (breg != 0)
6196 {
6197 /* We're going to put in an addu instruction using
6198 tempreg, so we may as well insert the nop right
6199 now. */
6200 load_delay_nop ();
6201 }
6202 }
6203 else if (expr1.X_add_number >= -0x8000
6204 && expr1.X_add_number < 0x8000)
6205 {
6206 load_delay_nop ();
6207 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6208 tempreg, tempreg, BFD_RELOC_LO16);
6209 }
6210 else
6211 {
6212 /* If we are going to add in a base register, and the
6213 target register and the base register are the same,
6214 then we are using AT as a temporary register. Since
6215 we want to load the constant into AT, we add our
6216 current AT (from the global offset table) and the
6217 register into the register now, and pretend we were
6218 not using a base register. */
6219 if (breg != treg)
6220 dreg = tempreg;
6221 else
6222 {
6223 gas_assert (tempreg == AT);
6224 load_delay_nop ();
6225 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6226 treg, AT, breg);
6227 dreg = treg;
6228 }
6229
6230 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6231 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6232
6233 used_at = 1;
6234 }
6235 offset_expr.X_add_number =
6236 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6237 relax_switch ();
6238
6239 if (gpdelay)
6240 {
6241 /* This is needed because this instruction uses $gp, but
6242 the first instruction on the main stream does not. */
6243 macro_build (NULL, "nop", "");
6244 }
6245
6246 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6247 local_reloc_type, mips_gp_register);
6248 if (expr1.X_add_number >= -0x8000
6249 && expr1.X_add_number < 0x8000)
6250 {
6251 load_delay_nop ();
6252 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6253 tempreg, tempreg, BFD_RELOC_LO16);
6254 /* FIXME: If add_number is 0, and there was no base
6255 register, the external symbol case ended with a load,
6256 so if the symbol turns out to not be external, and
6257 the next instruction uses tempreg, an unnecessary nop
6258 will be inserted. */
6259 }
6260 else
6261 {
6262 if (breg == treg)
6263 {
6264 /* We must add in the base register now, as in the
6265 external symbol case. */
6266 gas_assert (tempreg == AT);
6267 load_delay_nop ();
6268 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6269 treg, AT, breg);
6270 tempreg = treg;
6271 /* We set breg to 0 because we have arranged to add
6272 it in in both cases. */
6273 breg = 0;
6274 }
6275
6276 macro_build_lui (&expr1, AT);
6277 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6278 AT, AT, BFD_RELOC_LO16);
6279 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6280 tempreg, tempreg, AT);
6281 used_at = 1;
6282 }
6283 relax_end ();
6284 }
6285 else if (mips_big_got && HAVE_NEWABI)
6286 {
6287 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6288 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6289 int add_breg_early = 0;
6290
6291 /* This is the large GOT case. If this is a reference to an
6292 external symbol, and there is no constant, we want
6293 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6294 add $tempreg,$tempreg,$gp
6295 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6296 or for lca or if tempreg is PIC_CALL_REG
6297 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6298 add $tempreg,$tempreg,$gp
6299 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6300
6301 If we have a small constant, and this is a reference to
6302 an external symbol, we want
6303 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6304 add $tempreg,$tempreg,$gp
6305 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6306 addi $tempreg,$tempreg,<constant>
6307
6308 If we have a large constant, and this is a reference to
6309 an external symbol, we want
6310 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6311 addu $tempreg,$tempreg,$gp
6312 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6313 lui $at,<hiconstant>
6314 addi $at,$at,<loconstant>
6315 add $tempreg,$tempreg,$at
6316
6317 If we have NewABI, and we know it's a local symbol, we want
6318 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6319 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6320 otherwise we have to resort to GOT_HI16/GOT_LO16. */
6321
6322 relax_start (offset_expr.X_add_symbol);
6323
6324 expr1.X_add_number = offset_expr.X_add_number;
6325 offset_expr.X_add_number = 0;
6326
6327 if (expr1.X_add_number == 0 && breg == 0
6328 && (call || tempreg == PIC_CALL_REG))
6329 {
6330 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6331 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6332 }
6333 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6334 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6335 tempreg, tempreg, mips_gp_register);
6336 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6337 tempreg, lw_reloc_type, tempreg);
6338
6339 if (expr1.X_add_number == 0)
6340 ;
6341 else if (expr1.X_add_number >= -0x8000
6342 && expr1.X_add_number < 0x8000)
6343 {
6344 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6345 tempreg, tempreg, BFD_RELOC_LO16);
6346 }
6347 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6348 {
6349 /* If we are going to add in a base register, and the
6350 target register and the base register are the same,
6351 then we are using AT as a temporary register. Since
6352 we want to load the constant into AT, we add our
6353 current AT (from the global offset table) and the
6354 register into the register now, and pretend we were
6355 not using a base register. */
6356 if (breg != treg)
6357 dreg = tempreg;
6358 else
6359 {
6360 gas_assert (tempreg == AT);
6361 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6362 treg, AT, breg);
6363 dreg = treg;
6364 add_breg_early = 1;
6365 }
6366
6367 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6368 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6369
6370 used_at = 1;
6371 }
6372 else
6373 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6374
6375 relax_switch ();
6376 offset_expr.X_add_number = expr1.X_add_number;
6377 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6378 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6379 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6380 tempreg, BFD_RELOC_MIPS_GOT_OFST);
6381 if (add_breg_early)
6382 {
6383 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6384 treg, tempreg, breg);
6385 breg = 0;
6386 tempreg = treg;
6387 }
6388 relax_end ();
6389 }
6390 else
6391 abort ();
6392
6393 if (breg != 0)
6394 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6395 break;
6396
6397 case M_MSGSND:
6398 {
6399 unsigned long temp = (treg << 16) | (0x01);
6400 macro_build (NULL, "c2", "C", temp);
6401 }
6402 break;
6403
6404 case M_MSGLD:
6405 {
6406 unsigned long temp = (0x02);
6407 macro_build (NULL, "c2", "C", temp);
6408 }
6409 break;
6410
6411 case M_MSGLD_T:
6412 {
6413 unsigned long temp = (treg << 16) | (0x02);
6414 macro_build (NULL, "c2", "C", temp);
6415 }
6416 break;
6417
6418 case M_MSGWAIT:
6419 macro_build (NULL, "c2", "C", 3);
6420 break;
6421
6422 case M_MSGWAIT_T:
6423 {
6424 unsigned long temp = (treg << 16) | 0x03;
6425 macro_build (NULL, "c2", "C", temp);
6426 }
6427 break;
6428
6429 case M_J_A:
6430 /* The j instruction may not be used in PIC code, since it
6431 requires an absolute address. We convert it to a b
6432 instruction. */
6433 if (mips_pic == NO_PIC)
6434 macro_build (&offset_expr, "j", "a");
6435 else
6436 macro_build (&offset_expr, "b", "p");
6437 break;
6438
6439 /* The jal instructions must be handled as macros because when
6440 generating PIC code they expand to multi-instruction
6441 sequences. Normally they are simple instructions. */
6442 case M_JAL_1:
6443 dreg = RA;
6444 /* Fall through. */
6445 case M_JAL_2:
6446 if (mips_pic == NO_PIC)
6447 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6448 else
6449 {
6450 if (sreg != PIC_CALL_REG)
6451 as_warn (_("MIPS PIC call to register other than $25"));
6452
6453 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6454 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6455 {
6456 if (mips_cprestore_offset < 0)
6457 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6458 else
6459 {
6460 if (!mips_frame_reg_valid)
6461 {
6462 as_warn (_("No .frame pseudo-op used in PIC code"));
6463 /* Quiet this warning. */
6464 mips_frame_reg_valid = 1;
6465 }
6466 if (!mips_cprestore_valid)
6467 {
6468 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6469 /* Quiet this warning. */
6470 mips_cprestore_valid = 1;
6471 }
6472 if (mips_opts.noreorder)
6473 macro_build (NULL, "nop", "");
6474 expr1.X_add_number = mips_cprestore_offset;
6475 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6476 mips_gp_register,
6477 mips_frame_reg,
6478 HAVE_64BIT_ADDRESSES);
6479 }
6480 }
6481 }
6482
6483 break;
6484
6485 case M_JAL_A:
6486 if (mips_pic == NO_PIC)
6487 macro_build (&offset_expr, "jal", "a");
6488 else if (mips_pic == SVR4_PIC)
6489 {
6490 /* If this is a reference to an external symbol, and we are
6491 using a small GOT, we want
6492 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6493 nop
6494 jalr $ra,$25
6495 nop
6496 lw $gp,cprestore($sp)
6497 The cprestore value is set using the .cprestore
6498 pseudo-op. If we are using a big GOT, we want
6499 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6500 addu $25,$25,$gp
6501 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6502 nop
6503 jalr $ra,$25
6504 nop
6505 lw $gp,cprestore($sp)
6506 If the symbol is not external, we want
6507 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6508 nop
6509 addiu $25,$25,<sym> (BFD_RELOC_LO16)
6510 jalr $ra,$25
6511 nop
6512 lw $gp,cprestore($sp)
6513
6514 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6515 sequences above, minus nops, unless the symbol is local,
6516 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6517 GOT_DISP. */
6518 if (HAVE_NEWABI)
6519 {
6520 if (!mips_big_got)
6521 {
6522 relax_start (offset_expr.X_add_symbol);
6523 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6524 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6525 mips_gp_register);
6526 relax_switch ();
6527 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6528 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6529 mips_gp_register);
6530 relax_end ();
6531 }
6532 else
6533 {
6534 relax_start (offset_expr.X_add_symbol);
6535 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6536 BFD_RELOC_MIPS_CALL_HI16);
6537 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6538 PIC_CALL_REG, mips_gp_register);
6539 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6540 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6541 PIC_CALL_REG);
6542 relax_switch ();
6543 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6544 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6545 mips_gp_register);
6546 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6547 PIC_CALL_REG, PIC_CALL_REG,
6548 BFD_RELOC_MIPS_GOT_OFST);
6549 relax_end ();
6550 }
6551
6552 macro_build_jalr (&offset_expr);
6553 }
6554 else
6555 {
6556 relax_start (offset_expr.X_add_symbol);
6557 if (!mips_big_got)
6558 {
6559 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6560 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6561 mips_gp_register);
6562 load_delay_nop ();
6563 relax_switch ();
6564 }
6565 else
6566 {
6567 int gpdelay;
6568
6569 gpdelay = reg_needs_delay (mips_gp_register);
6570 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6571 BFD_RELOC_MIPS_CALL_HI16);
6572 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6573 PIC_CALL_REG, mips_gp_register);
6574 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6575 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6576 PIC_CALL_REG);
6577 load_delay_nop ();
6578 relax_switch ();
6579 if (gpdelay)
6580 macro_build (NULL, "nop", "");
6581 }
6582 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6583 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6584 mips_gp_register);
6585 load_delay_nop ();
6586 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6587 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6588 relax_end ();
6589 macro_build_jalr (&offset_expr);
6590
6591 if (mips_cprestore_offset < 0)
6592 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6593 else
6594 {
6595 if (!mips_frame_reg_valid)
6596 {
6597 as_warn (_("No .frame pseudo-op used in PIC code"));
6598 /* Quiet this warning. */
6599 mips_frame_reg_valid = 1;
6600 }
6601 if (!mips_cprestore_valid)
6602 {
6603 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6604 /* Quiet this warning. */
6605 mips_cprestore_valid = 1;
6606 }
6607 if (mips_opts.noreorder)
6608 macro_build (NULL, "nop", "");
6609 expr1.X_add_number = mips_cprestore_offset;
6610 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6611 mips_gp_register,
6612 mips_frame_reg,
6613 HAVE_64BIT_ADDRESSES);
6614 }
6615 }
6616 }
6617 else if (mips_pic == VXWORKS_PIC)
6618 as_bad (_("Non-PIC jump used in PIC library"));
6619 else
6620 abort ();
6621
6622 break;
6623
6624 case M_LB_AB:
6625 s = "lb";
6626 goto ld;
6627 case M_LBU_AB:
6628 s = "lbu";
6629 goto ld;
6630 case M_LH_AB:
6631 s = "lh";
6632 goto ld;
6633 case M_LHU_AB:
6634 s = "lhu";
6635 goto ld;
6636 case M_LW_AB:
6637 s = "lw";
6638 goto ld;
6639 case M_LWC0_AB:
6640 s = "lwc0";
6641 /* Itbl support may require additional care here. */
6642 coproc = 1;
6643 goto ld;
6644 case M_LWC1_AB:
6645 s = "lwc1";
6646 /* Itbl support may require additional care here. */
6647 coproc = 1;
6648 goto ld;
6649 case M_LWC2_AB:
6650 s = "lwc2";
6651 /* Itbl support may require additional care here. */
6652 coproc = 1;
6653 goto ld;
6654 case M_LWC3_AB:
6655 s = "lwc3";
6656 /* Itbl support may require additional care here. */
6657 coproc = 1;
6658 goto ld;
6659 case M_LWL_AB:
6660 s = "lwl";
6661 lr = 1;
6662 goto ld;
6663 case M_LWR_AB:
6664 s = "lwr";
6665 lr = 1;
6666 goto ld;
6667 case M_LDC1_AB:
6668 s = "ldc1";
6669 /* Itbl support may require additional care here. */
6670 coproc = 1;
6671 goto ld;
6672 case M_LDC2_AB:
6673 s = "ldc2";
6674 /* Itbl support may require additional care here. */
6675 coproc = 1;
6676 goto ld;
6677 case M_LDC3_AB:
6678 s = "ldc3";
6679 /* Itbl support may require additional care here. */
6680 coproc = 1;
6681 goto ld;
6682 case M_LDL_AB:
6683 s = "ldl";
6684 lr = 1;
6685 goto ld;
6686 case M_LDR_AB:
6687 s = "ldr";
6688 lr = 1;
6689 goto ld;
6690 case M_LL_AB:
6691 s = "ll";
6692 goto ld;
6693 case M_LLD_AB:
6694 s = "lld";
6695 goto ld;
6696 case M_LWU_AB:
6697 s = "lwu";
6698 ld:
6699 if (breg == treg || coproc || lr)
6700 {
6701 tempreg = AT;
6702 used_at = 1;
6703 }
6704 else
6705 {
6706 tempreg = treg;
6707 }
6708 goto ld_st;
6709 case M_SB_AB:
6710 s = "sb";
6711 goto st;
6712 case M_SH_AB:
6713 s = "sh";
6714 goto st;
6715 case M_SW_AB:
6716 s = "sw";
6717 goto st;
6718 case M_SWC0_AB:
6719 s = "swc0";
6720 /* Itbl support may require additional care here. */
6721 coproc = 1;
6722 goto st;
6723 case M_SWC1_AB:
6724 s = "swc1";
6725 /* Itbl support may require additional care here. */
6726 coproc = 1;
6727 goto st;
6728 case M_SWC2_AB:
6729 s = "swc2";
6730 /* Itbl support may require additional care here. */
6731 coproc = 1;
6732 goto st;
6733 case M_SWC3_AB:
6734 s = "swc3";
6735 /* Itbl support may require additional care here. */
6736 coproc = 1;
6737 goto st;
6738 case M_SWL_AB:
6739 s = "swl";
6740 goto st;
6741 case M_SWR_AB:
6742 s = "swr";
6743 goto st;
6744 case M_SC_AB:
6745 s = "sc";
6746 goto st;
6747 case M_SCD_AB:
6748 s = "scd";
6749 goto st;
6750 case M_CACHE_AB:
6751 s = "cache";
6752 goto st;
6753 case M_PREF_AB:
6754 s = "pref";
6755 goto st;
6756 case M_SDC1_AB:
6757 s = "sdc1";
6758 coproc = 1;
6759 /* Itbl support may require additional care here. */
6760 goto st;
6761 case M_SDC2_AB:
6762 s = "sdc2";
6763 /* Itbl support may require additional care here. */
6764 coproc = 1;
6765 goto st;
6766 case M_SDC3_AB:
6767 s = "sdc3";
6768 /* Itbl support may require additional care here. */
6769 coproc = 1;
6770 goto st;
6771 case M_SDL_AB:
6772 s = "sdl";
6773 goto st;
6774 case M_SDR_AB:
6775 s = "sdr";
6776 st:
6777 tempreg = AT;
6778 used_at = 1;
6779 ld_st:
6780 if (coproc
6781 && NO_ISA_COP (mips_opts.arch)
6782 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6783 {
6784 as_bad (_("Opcode not supported on this processor: %s"),
6785 mips_cpu_info_from_arch (mips_opts.arch)->name);
6786 break;
6787 }
6788
6789 /* Itbl support may require additional care here. */
6790 if (mask == M_LWC1_AB
6791 || mask == M_SWC1_AB
6792 || mask == M_LDC1_AB
6793 || mask == M_SDC1_AB
6794 || mask == M_L_DAB
6795 || mask == M_S_DAB)
6796 fmt = "T,o(b)";
6797 else if (mask == M_CACHE_AB || mask == M_PREF_AB)
6798 fmt = "k,o(b)";
6799 else if (coproc)
6800 fmt = "E,o(b)";
6801 else
6802 fmt = "t,o(b)";
6803
6804 if (offset_expr.X_op != O_constant
6805 && offset_expr.X_op != O_symbol)
6806 {
6807 as_bad (_("Expression too complex"));
6808 offset_expr.X_op = O_constant;
6809 }
6810
6811 if (HAVE_32BIT_ADDRESSES
6812 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6813 {
6814 char value [32];
6815
6816 sprintf_vma (value, offset_expr.X_add_number);
6817 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6818 }
6819
6820 /* A constant expression in PIC code can be handled just as it
6821 is in non PIC code. */
6822 if (offset_expr.X_op == O_constant)
6823 {
6824 expr1.X_add_number = offset_expr.X_add_number;
6825 normalize_address_expr (&expr1);
6826 if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6827 {
6828 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6829 & ~(bfd_vma) 0xffff);
6830 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6831 if (breg != 0)
6832 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6833 tempreg, tempreg, breg);
6834 breg = tempreg;
6835 }
6836 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6837 }
6838 else if (mips_pic == NO_PIC)
6839 {
6840 /* If this is a reference to a GP relative symbol, and there
6841 is no base register, we want
6842 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6843 Otherwise, if there is no base register, we want
6844 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6845 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6846 If we have a constant, we need two instructions anyhow,
6847 so we always use the latter form.
6848
6849 If we have a base register, and this is a reference to a
6850 GP relative symbol, we want
6851 addu $tempreg,$breg,$gp
6852 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6853 Otherwise we want
6854 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6855 addu $tempreg,$tempreg,$breg
6856 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6857 With a constant we always use the latter case.
6858
6859 With 64bit address space and no base register and $at usable,
6860 we want
6861 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6862 lui $at,<sym> (BFD_RELOC_HI16_S)
6863 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6864 dsll32 $tempreg,0
6865 daddu $tempreg,$at
6866 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6867 If we have a base register, we want
6868 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6869 lui $at,<sym> (BFD_RELOC_HI16_S)
6870 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6871 daddu $at,$breg
6872 dsll32 $tempreg,0
6873 daddu $tempreg,$at
6874 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6875
6876 Without $at we can't generate the optimal path for superscalar
6877 processors here since this would require two temporary registers.
6878 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6879 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6880 dsll $tempreg,16
6881 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6882 dsll $tempreg,16
6883 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6884 If we have a base register, we want
6885 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6886 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6887 dsll $tempreg,16
6888 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6889 dsll $tempreg,16
6890 daddu $tempreg,$tempreg,$breg
6891 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6892
6893 For GP relative symbols in 64bit address space we can use
6894 the same sequence as in 32bit address space. */
6895 if (HAVE_64BIT_SYMBOLS)
6896 {
6897 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6898 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6899 {
6900 relax_start (offset_expr.X_add_symbol);
6901 if (breg == 0)
6902 {
6903 macro_build (&offset_expr, s, fmt, treg,
6904 BFD_RELOC_GPREL16, mips_gp_register);
6905 }
6906 else
6907 {
6908 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6909 tempreg, breg, mips_gp_register);
6910 macro_build (&offset_expr, s, fmt, treg,
6911 BFD_RELOC_GPREL16, tempreg);
6912 }
6913 relax_switch ();
6914 }
6915
6916 if (used_at == 0 && mips_opts.at)
6917 {
6918 macro_build (&offset_expr, "lui", "t,u", tempreg,
6919 BFD_RELOC_MIPS_HIGHEST);
6920 macro_build (&offset_expr, "lui", "t,u", AT,
6921 BFD_RELOC_HI16_S);
6922 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6923 tempreg, BFD_RELOC_MIPS_HIGHER);
6924 if (breg != 0)
6925 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6926 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6927 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6928 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6929 tempreg);
6930 used_at = 1;
6931 }
6932 else
6933 {
6934 macro_build (&offset_expr, "lui", "t,u", tempreg,
6935 BFD_RELOC_MIPS_HIGHEST);
6936 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6937 tempreg, BFD_RELOC_MIPS_HIGHER);
6938 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6939 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6940 tempreg, BFD_RELOC_HI16_S);
6941 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6942 if (breg != 0)
6943 macro_build (NULL, "daddu", "d,v,t",
6944 tempreg, tempreg, breg);
6945 macro_build (&offset_expr, s, fmt, treg,
6946 BFD_RELOC_LO16, tempreg);
6947 }
6948
6949 if (mips_relax.sequence)
6950 relax_end ();
6951 break;
6952 }
6953
6954 if (breg == 0)
6955 {
6956 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6957 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6958 {
6959 relax_start (offset_expr.X_add_symbol);
6960 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6961 mips_gp_register);
6962 relax_switch ();
6963 }
6964 macro_build_lui (&offset_expr, tempreg);
6965 macro_build (&offset_expr, s, fmt, treg,
6966 BFD_RELOC_LO16, tempreg);
6967 if (mips_relax.sequence)
6968 relax_end ();
6969 }
6970 else
6971 {
6972 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6973 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6974 {
6975 relax_start (offset_expr.X_add_symbol);
6976 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6977 tempreg, breg, mips_gp_register);
6978 macro_build (&offset_expr, s, fmt, treg,
6979 BFD_RELOC_GPREL16, tempreg);
6980 relax_switch ();
6981 }
6982 macro_build_lui (&offset_expr, tempreg);
6983 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6984 tempreg, tempreg, breg);
6985 macro_build (&offset_expr, s, fmt, treg,
6986 BFD_RELOC_LO16, tempreg);
6987 if (mips_relax.sequence)
6988 relax_end ();
6989 }
6990 }
6991 else if (!mips_big_got)
6992 {
6993 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6994
6995 /* If this is a reference to an external symbol, we want
6996 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6997 nop
6998 <op> $treg,0($tempreg)
6999 Otherwise we want
7000 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7001 nop
7002 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7003 <op> $treg,0($tempreg)
7004
7005 For NewABI, we want
7006 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
7007 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
7008
7009 If there is a base register, we add it to $tempreg before
7010 the <op>. If there is a constant, we stick it in the
7011 <op> instruction. We don't handle constants larger than
7012 16 bits, because we have no way to load the upper 16 bits
7013 (actually, we could handle them for the subset of cases
7014 in which we are not using $at). */
7015 gas_assert (offset_expr.X_op == O_symbol);
7016 if (HAVE_NEWABI)
7017 {
7018 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7019 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7020 if (breg != 0)
7021 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7022 tempreg, tempreg, breg);
7023 macro_build (&offset_expr, s, fmt, treg,
7024 BFD_RELOC_MIPS_GOT_OFST, tempreg);
7025 break;
7026 }
7027 expr1.X_add_number = offset_expr.X_add_number;
7028 offset_expr.X_add_number = 0;
7029 if (expr1.X_add_number < -0x8000
7030 || expr1.X_add_number >= 0x8000)
7031 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7032 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7033 lw_reloc_type, mips_gp_register);
7034 load_delay_nop ();
7035 relax_start (offset_expr.X_add_symbol);
7036 relax_switch ();
7037 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7038 tempreg, BFD_RELOC_LO16);
7039 relax_end ();
7040 if (breg != 0)
7041 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7042 tempreg, tempreg, breg);
7043 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7044 }
7045 else if (mips_big_got && !HAVE_NEWABI)
7046 {
7047 int gpdelay;
7048
7049 /* If this is a reference to an external symbol, we want
7050 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7051 addu $tempreg,$tempreg,$gp
7052 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7053 <op> $treg,0($tempreg)
7054 Otherwise we want
7055 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7056 nop
7057 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7058 <op> $treg,0($tempreg)
7059 If there is a base register, we add it to $tempreg before
7060 the <op>. If there is a constant, we stick it in the
7061 <op> instruction. We don't handle constants larger than
7062 16 bits, because we have no way to load the upper 16 bits
7063 (actually, we could handle them for the subset of cases
7064 in which we are not using $at). */
7065 gas_assert (offset_expr.X_op == O_symbol);
7066 expr1.X_add_number = offset_expr.X_add_number;
7067 offset_expr.X_add_number = 0;
7068 if (expr1.X_add_number < -0x8000
7069 || expr1.X_add_number >= 0x8000)
7070 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7071 gpdelay = reg_needs_delay (mips_gp_register);
7072 relax_start (offset_expr.X_add_symbol);
7073 macro_build (&offset_expr, "lui", "t,u", tempreg,
7074 BFD_RELOC_MIPS_GOT_HI16);
7075 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7076 mips_gp_register);
7077 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7078 BFD_RELOC_MIPS_GOT_LO16, tempreg);
7079 relax_switch ();
7080 if (gpdelay)
7081 macro_build (NULL, "nop", "");
7082 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7083 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7084 load_delay_nop ();
7085 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7086 tempreg, BFD_RELOC_LO16);
7087 relax_end ();
7088
7089 if (breg != 0)
7090 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7091 tempreg, tempreg, breg);
7092 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7093 }
7094 else if (mips_big_got && HAVE_NEWABI)
7095 {
7096 /* If this is a reference to an external symbol, we want
7097 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7098 add $tempreg,$tempreg,$gp
7099 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7100 <op> $treg,<ofst>($tempreg)
7101 Otherwise, for local symbols, we want:
7102 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
7103 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
7104 gas_assert (offset_expr.X_op == O_symbol);
7105 expr1.X_add_number = offset_expr.X_add_number;
7106 offset_expr.X_add_number = 0;
7107 if (expr1.X_add_number < -0x8000
7108 || expr1.X_add_number >= 0x8000)
7109 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7110 relax_start (offset_expr.X_add_symbol);
7111 macro_build (&offset_expr, "lui", "t,u", tempreg,
7112 BFD_RELOC_MIPS_GOT_HI16);
7113 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7114 mips_gp_register);
7115 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7116 BFD_RELOC_MIPS_GOT_LO16, tempreg);
7117 if (breg != 0)
7118 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7119 tempreg, tempreg, breg);
7120 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7121
7122 relax_switch ();
7123 offset_expr.X_add_number = expr1.X_add_number;
7124 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7125 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7126 if (breg != 0)
7127 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7128 tempreg, tempreg, breg);
7129 macro_build (&offset_expr, s, fmt, treg,
7130 BFD_RELOC_MIPS_GOT_OFST, tempreg);
7131 relax_end ();
7132 }
7133 else
7134 abort ();
7135
7136 break;
7137
7138 case M_LI:
7139 case M_LI_S:
7140 load_register (treg, &imm_expr, 0);
7141 break;
7142
7143 case M_DLI:
7144 load_register (treg, &imm_expr, 1);
7145 break;
7146
7147 case M_LI_SS:
7148 if (imm_expr.X_op == O_constant)
7149 {
7150 used_at = 1;
7151 load_register (AT, &imm_expr, 0);
7152 macro_build (NULL, "mtc1", "t,G", AT, treg);
7153 break;
7154 }
7155 else
7156 {
7157 gas_assert (offset_expr.X_op == O_symbol
7158 && strcmp (segment_name (S_GET_SEGMENT
7159 (offset_expr.X_add_symbol)),
7160 ".lit4") == 0
7161 && offset_expr.X_add_number == 0);
7162 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
7163 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7164 break;
7165 }
7166
7167 case M_LI_D:
7168 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
7169 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
7170 order 32 bits of the value and the low order 32 bits are either
7171 zero or in OFFSET_EXPR. */
7172 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7173 {
7174 if (HAVE_64BIT_GPRS)
7175 load_register (treg, &imm_expr, 1);
7176 else
7177 {
7178 int hreg, lreg;
7179
7180 if (target_big_endian)
7181 {
7182 hreg = treg;
7183 lreg = treg + 1;
7184 }
7185 else
7186 {
7187 hreg = treg + 1;
7188 lreg = treg;
7189 }
7190
7191 if (hreg <= 31)
7192 load_register (hreg, &imm_expr, 0);
7193 if (lreg <= 31)
7194 {
7195 if (offset_expr.X_op == O_absent)
7196 move_register (lreg, 0);
7197 else
7198 {
7199 gas_assert (offset_expr.X_op == O_constant);
7200 load_register (lreg, &offset_expr, 0);
7201 }
7202 }
7203 }
7204 break;
7205 }
7206
7207 /* We know that sym is in the .rdata section. First we get the
7208 upper 16 bits of the address. */
7209 if (mips_pic == NO_PIC)
7210 {
7211 macro_build_lui (&offset_expr, AT);
7212 used_at = 1;
7213 }
7214 else
7215 {
7216 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7217 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7218 used_at = 1;
7219 }
7220
7221 /* Now we load the register(s). */
7222 if (HAVE_64BIT_GPRS)
7223 {
7224 used_at = 1;
7225 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7226 }
7227 else
7228 {
7229 used_at = 1;
7230 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7231 if (treg != RA)
7232 {
7233 /* FIXME: How in the world do we deal with the possible
7234 overflow here? */
7235 offset_expr.X_add_number += 4;
7236 macro_build (&offset_expr, "lw", "t,o(b)",
7237 treg + 1, BFD_RELOC_LO16, AT);
7238 }
7239 }
7240 break;
7241
7242 case M_LI_DD:
7243 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
7244 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7245 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
7246 the value and the low order 32 bits are either zero or in
7247 OFFSET_EXPR. */
7248 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7249 {
7250 used_at = 1;
7251 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7252 if (HAVE_64BIT_FPRS)
7253 {
7254 gas_assert (HAVE_64BIT_GPRS);
7255 macro_build (NULL, "dmtc1", "t,S", AT, treg);
7256 }
7257 else
7258 {
7259 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7260 if (offset_expr.X_op == O_absent)
7261 macro_build (NULL, "mtc1", "t,G", 0, treg);
7262 else
7263 {
7264 gas_assert (offset_expr.X_op == O_constant);
7265 load_register (AT, &offset_expr, 0);
7266 macro_build (NULL, "mtc1", "t,G", AT, treg);
7267 }
7268 }
7269 break;
7270 }
7271
7272 gas_assert (offset_expr.X_op == O_symbol
7273 && offset_expr.X_add_number == 0);
7274 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7275 if (strcmp (s, ".lit8") == 0)
7276 {
7277 if (mips_opts.isa != ISA_MIPS1)
7278 {
7279 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7280 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7281 break;
7282 }
7283 breg = mips_gp_register;
7284 r = BFD_RELOC_MIPS_LITERAL;
7285 goto dob;
7286 }
7287 else
7288 {
7289 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7290 used_at = 1;
7291 if (mips_pic != NO_PIC)
7292 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7293 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7294 else
7295 {
7296 /* FIXME: This won't work for a 64 bit address. */
7297 macro_build_lui (&offset_expr, AT);
7298 }
7299
7300 if (mips_opts.isa != ISA_MIPS1)
7301 {
7302 macro_build (&offset_expr, "ldc1", "T,o(b)",
7303 treg, BFD_RELOC_LO16, AT);
7304 break;
7305 }
7306 breg = AT;
7307 r = BFD_RELOC_LO16;
7308 goto dob;
7309 }
7310
7311 case M_L_DOB:
7312 /* Even on a big endian machine $fn comes before $fn+1. We have
7313 to adjust when loading from memory. */
7314 r = BFD_RELOC_LO16;
7315 dob:
7316 gas_assert (mips_opts.isa == ISA_MIPS1);
7317 macro_build (&offset_expr, "lwc1", "T,o(b)",
7318 target_big_endian ? treg + 1 : treg, r, breg);
7319 /* FIXME: A possible overflow which I don't know how to deal
7320 with. */
7321 offset_expr.X_add_number += 4;
7322 macro_build (&offset_expr, "lwc1", "T,o(b)",
7323 target_big_endian ? treg : treg + 1, r, breg);
7324 break;
7325
7326 case M_S_DOB:
7327 gas_assert (mips_opts.isa == ISA_MIPS1);
7328 /* Even on a big endian machine $fn comes before $fn+1. We have
7329 to adjust when storing to memory. */
7330 macro_build (&offset_expr, "swc1", "T,o(b)",
7331 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7332 offset_expr.X_add_number += 4;
7333 macro_build (&offset_expr, "swc1", "T,o(b)",
7334 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7335 break;
7336
7337 case M_L_DAB:
7338 /*
7339 * The MIPS assembler seems to check for X_add_number not
7340 * being double aligned and generating:
7341 * lui at,%hi(foo+1)
7342 * addu at,at,v1
7343 * addiu at,at,%lo(foo+1)
7344 * lwc1 f2,0(at)
7345 * lwc1 f3,4(at)
7346 * But, the resulting address is the same after relocation so why
7347 * generate the extra instruction?
7348 */
7349 /* Itbl support may require additional care here. */
7350 coproc = 1;
7351 if (mips_opts.isa != ISA_MIPS1)
7352 {
7353 s = "ldc1";
7354 goto ld;
7355 }
7356
7357 s = "lwc1";
7358 fmt = "T,o(b)";
7359 goto ldd_std;
7360
7361 case M_S_DAB:
7362 if (mips_opts.isa != ISA_MIPS1)
7363 {
7364 s = "sdc1";
7365 goto st;
7366 }
7367
7368 s = "swc1";
7369 fmt = "T,o(b)";
7370 /* Itbl support may require additional care here. */
7371 coproc = 1;
7372 goto ldd_std;
7373
7374 case M_LD_AB:
7375 if (HAVE_64BIT_GPRS)
7376 {
7377 s = "ld";
7378 goto ld;
7379 }
7380
7381 s = "lw";
7382 fmt = "t,o(b)";
7383 goto ldd_std;
7384
7385 case M_SD_AB:
7386 if (HAVE_64BIT_GPRS)
7387 {
7388 s = "sd";
7389 goto st;
7390 }
7391
7392 s = "sw";
7393 fmt = "t,o(b)";
7394
7395 ldd_std:
7396 if (offset_expr.X_op != O_symbol
7397 && offset_expr.X_op != O_constant)
7398 {
7399 as_bad (_("Expression too complex"));
7400 offset_expr.X_op = O_constant;
7401 }
7402
7403 if (HAVE_32BIT_ADDRESSES
7404 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7405 {
7406 char value [32];
7407
7408 sprintf_vma (value, offset_expr.X_add_number);
7409 as_bad (_("Number (0x%s) larger than 32 bits"), value);
7410 }
7411
7412 /* Even on a big endian machine $fn comes before $fn+1. We have
7413 to adjust when loading from memory. We set coproc if we must
7414 load $fn+1 first. */
7415 /* Itbl support may require additional care here. */
7416 if (!target_big_endian)
7417 coproc = 0;
7418
7419 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7420 {
7421 /* If this is a reference to a GP relative symbol, we want
7422 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7423 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
7424 If we have a base register, we use this
7425 addu $at,$breg,$gp
7426 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7427 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
7428 If this is not a GP relative symbol, we want
7429 lui $at,<sym> (BFD_RELOC_HI16_S)
7430 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7431 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7432 If there is a base register, we add it to $at after the
7433 lui instruction. If there is a constant, we always use
7434 the last case. */
7435 if (offset_expr.X_op == O_symbol
7436 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7437 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7438 {
7439 relax_start (offset_expr.X_add_symbol);
7440 if (breg == 0)
7441 {
7442 tempreg = mips_gp_register;
7443 }
7444 else
7445 {
7446 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7447 AT, breg, mips_gp_register);
7448 tempreg = AT;
7449 used_at = 1;
7450 }
7451
7452 /* Itbl support may require additional care here. */
7453 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7454 BFD_RELOC_GPREL16, tempreg);
7455 offset_expr.X_add_number += 4;
7456
7457 /* Set mips_optimize to 2 to avoid inserting an
7458 undesired nop. */
7459 hold_mips_optimize = mips_optimize;
7460 mips_optimize = 2;
7461 /* Itbl support may require additional care here. */
7462 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7463 BFD_RELOC_GPREL16, tempreg);
7464 mips_optimize = hold_mips_optimize;
7465
7466 relax_switch ();
7467
7468 offset_expr.X_add_number -= 4;
7469 }
7470 used_at = 1;
7471 macro_build_lui (&offset_expr, AT);
7472 if (breg != 0)
7473 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7474 /* Itbl support may require additional care here. */
7475 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7476 BFD_RELOC_LO16, AT);
7477 /* FIXME: How do we handle overflow here? */
7478 offset_expr.X_add_number += 4;
7479 /* Itbl support may require additional care here. */
7480 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7481 BFD_RELOC_LO16, AT);
7482 if (mips_relax.sequence)
7483 relax_end ();
7484 }
7485 else if (!mips_big_got)
7486 {
7487 /* If this is a reference to an external symbol, we want
7488 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7489 nop
7490 <op> $treg,0($at)
7491 <op> $treg+1,4($at)
7492 Otherwise we want
7493 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7494 nop
7495 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7496 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7497 If there is a base register we add it to $at before the
7498 lwc1 instructions. If there is a constant we include it
7499 in the lwc1 instructions. */
7500 used_at = 1;
7501 expr1.X_add_number = offset_expr.X_add_number;
7502 if (expr1.X_add_number < -0x8000
7503 || expr1.X_add_number >= 0x8000 - 4)
7504 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7505 load_got_offset (AT, &offset_expr);
7506 load_delay_nop ();
7507 if (breg != 0)
7508 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7509
7510 /* Set mips_optimize to 2 to avoid inserting an undesired
7511 nop. */
7512 hold_mips_optimize = mips_optimize;
7513 mips_optimize = 2;
7514
7515 /* Itbl support may require additional care here. */
7516 relax_start (offset_expr.X_add_symbol);
7517 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7518 BFD_RELOC_LO16, AT);
7519 expr1.X_add_number += 4;
7520 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7521 BFD_RELOC_LO16, AT);
7522 relax_switch ();
7523 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7524 BFD_RELOC_LO16, AT);
7525 offset_expr.X_add_number += 4;
7526 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7527 BFD_RELOC_LO16, AT);
7528 relax_end ();
7529
7530 mips_optimize = hold_mips_optimize;
7531 }
7532 else if (mips_big_got)
7533 {
7534 int gpdelay;
7535
7536 /* If this is a reference to an external symbol, we want
7537 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7538 addu $at,$at,$gp
7539 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7540 nop
7541 <op> $treg,0($at)
7542 <op> $treg+1,4($at)
7543 Otherwise we want
7544 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7545 nop
7546 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7547 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7548 If there is a base register we add it to $at before the
7549 lwc1 instructions. If there is a constant we include it
7550 in the lwc1 instructions. */
7551 used_at = 1;
7552 expr1.X_add_number = offset_expr.X_add_number;
7553 offset_expr.X_add_number = 0;
7554 if (expr1.X_add_number < -0x8000
7555 || expr1.X_add_number >= 0x8000 - 4)
7556 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7557 gpdelay = reg_needs_delay (mips_gp_register);
7558 relax_start (offset_expr.X_add_symbol);
7559 macro_build (&offset_expr, "lui", "t,u",
7560 AT, BFD_RELOC_MIPS_GOT_HI16);
7561 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7562 AT, AT, mips_gp_register);
7563 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7564 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7565 load_delay_nop ();
7566 if (breg != 0)
7567 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7568 /* Itbl support may require additional care here. */
7569 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7570 BFD_RELOC_LO16, AT);
7571 expr1.X_add_number += 4;
7572
7573 /* Set mips_optimize to 2 to avoid inserting an undesired
7574 nop. */
7575 hold_mips_optimize = mips_optimize;
7576 mips_optimize = 2;
7577 /* Itbl support may require additional care here. */
7578 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7579 BFD_RELOC_LO16, AT);
7580 mips_optimize = hold_mips_optimize;
7581 expr1.X_add_number -= 4;
7582
7583 relax_switch ();
7584 offset_expr.X_add_number = expr1.X_add_number;
7585 if (gpdelay)
7586 macro_build (NULL, "nop", "");
7587 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7588 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7589 load_delay_nop ();
7590 if (breg != 0)
7591 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7592 /* Itbl support may require additional care here. */
7593 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7594 BFD_RELOC_LO16, AT);
7595 offset_expr.X_add_number += 4;
7596
7597 /* Set mips_optimize to 2 to avoid inserting an undesired
7598 nop. */
7599 hold_mips_optimize = mips_optimize;
7600 mips_optimize = 2;
7601 /* Itbl support may require additional care here. */
7602 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7603 BFD_RELOC_LO16, AT);
7604 mips_optimize = hold_mips_optimize;
7605 relax_end ();
7606 }
7607 else
7608 abort ();
7609
7610 break;
7611
7612 case M_LD_OB:
7613 s = HAVE_64BIT_GPRS ? "ld" : "lw";
7614 goto sd_ob;
7615 case M_SD_OB:
7616 s = HAVE_64BIT_GPRS ? "sd" : "sw";
7617 sd_ob:
7618 macro_build (&offset_expr, s, "t,o(b)", treg,
7619 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7620 breg);
7621 if (!HAVE_64BIT_GPRS)
7622 {
7623 offset_expr.X_add_number += 4;
7624 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7625 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7626 breg);
7627 }
7628 break;
7629
7630 /* New code added to support COPZ instructions.
7631 This code builds table entries out of the macros in mip_opcodes.
7632 R4000 uses interlocks to handle coproc delays.
7633 Other chips (like the R3000) require nops to be inserted for delays.
7634
7635 FIXME: Currently, we require that the user handle delays.
7636 In order to fill delay slots for non-interlocked chips,
7637 we must have a way to specify delays based on the coprocessor.
7638 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7639 What are the side-effects of the cop instruction?
7640 What cache support might we have and what are its effects?
7641 Both coprocessor & memory require delays. how long???
7642 What registers are read/set/modified?
7643
7644 If an itbl is provided to interpret cop instructions,
7645 this knowledge can be encoded in the itbl spec. */
7646
7647 case M_COP0:
7648 s = "c0";
7649 goto copz;
7650 case M_COP1:
7651 s = "c1";
7652 goto copz;
7653 case M_COP2:
7654 s = "c2";
7655 goto copz;
7656 case M_COP3:
7657 s = "c3";
7658 copz:
7659 if (NO_ISA_COP (mips_opts.arch)
7660 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7661 {
7662 as_bad (_("opcode not supported on this processor: %s"),
7663 mips_cpu_info_from_arch (mips_opts.arch)->name);
7664 break;
7665 }
7666
7667 /* For now we just do C (same as Cz). The parameter will be
7668 stored in insn_opcode by mips_ip. */
7669 macro_build (NULL, s, "C", ip->insn_opcode);
7670 break;
7671
7672 case M_MOVE:
7673 move_register (dreg, sreg);
7674 break;
7675
7676 case M_DMUL:
7677 dbl = 1;
7678 case M_MUL:
7679 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7680 macro_build (NULL, "mflo", "d", dreg);
7681 break;
7682
7683 case M_DMUL_I:
7684 dbl = 1;
7685 case M_MUL_I:
7686 /* The MIPS assembler some times generates shifts and adds. I'm
7687 not trying to be that fancy. GCC should do this for us
7688 anyway. */
7689 used_at = 1;
7690 load_register (AT, &imm_expr, dbl);
7691 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7692 macro_build (NULL, "mflo", "d", dreg);
7693 break;
7694
7695 case M_DMULO_I:
7696 dbl = 1;
7697 case M_MULO_I:
7698 imm = 1;
7699 goto do_mulo;
7700
7701 case M_DMULO:
7702 dbl = 1;
7703 case M_MULO:
7704 do_mulo:
7705 start_noreorder ();
7706 used_at = 1;
7707 if (imm)
7708 load_register (AT, &imm_expr, dbl);
7709 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7710 macro_build (NULL, "mflo", "d", dreg);
7711 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7712 macro_build (NULL, "mfhi", "d", AT);
7713 if (mips_trap)
7714 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7715 else
7716 {
7717 expr1.X_add_number = 8;
7718 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7719 macro_build (NULL, "nop", "");
7720 macro_build (NULL, "break", "c", 6);
7721 }
7722 end_noreorder ();
7723 macro_build (NULL, "mflo", "d", dreg);
7724 break;
7725
7726 case M_DMULOU_I:
7727 dbl = 1;
7728 case M_MULOU_I:
7729 imm = 1;
7730 goto do_mulou;
7731
7732 case M_DMULOU:
7733 dbl = 1;
7734 case M_MULOU:
7735 do_mulou:
7736 start_noreorder ();
7737 used_at = 1;
7738 if (imm)
7739 load_register (AT, &imm_expr, dbl);
7740 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7741 sreg, imm ? AT : treg);
7742 macro_build (NULL, "mfhi", "d", AT);
7743 macro_build (NULL, "mflo", "d", dreg);
7744 if (mips_trap)
7745 macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7746 else
7747 {
7748 expr1.X_add_number = 8;
7749 macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7750 macro_build (NULL, "nop", "");
7751 macro_build (NULL, "break", "c", 6);
7752 }
7753 end_noreorder ();
7754 break;
7755
7756 case M_DROL:
7757 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7758 {
7759 if (dreg == sreg)
7760 {
7761 tempreg = AT;
7762 used_at = 1;
7763 }
7764 else
7765 {
7766 tempreg = dreg;
7767 }
7768 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7769 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7770 break;
7771 }
7772 used_at = 1;
7773 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7774 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7775 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7776 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7777 break;
7778
7779 case M_ROL:
7780 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7781 {
7782 if (dreg == sreg)
7783 {
7784 tempreg = AT;
7785 used_at = 1;
7786 }
7787 else
7788 {
7789 tempreg = dreg;
7790 }
7791 macro_build (NULL, "negu", "d,w", tempreg, treg);
7792 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7793 break;
7794 }
7795 used_at = 1;
7796 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7797 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7798 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7799 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7800 break;
7801
7802 case M_DROL_I:
7803 {
7804 unsigned int rot;
7805 char *l;
7806 char *rr;
7807
7808 if (imm_expr.X_op != O_constant)
7809 as_bad (_("Improper rotate count"));
7810 rot = imm_expr.X_add_number & 0x3f;
7811 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7812 {
7813 rot = (64 - rot) & 0x3f;
7814 if (rot >= 32)
7815 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7816 else
7817 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7818 break;
7819 }
7820 if (rot == 0)
7821 {
7822 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7823 break;
7824 }
7825 l = (rot < 0x20) ? "dsll" : "dsll32";
7826 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7827 rot &= 0x1f;
7828 used_at = 1;
7829 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7830 macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7831 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7832 }
7833 break;
7834
7835 case M_ROL_I:
7836 {
7837 unsigned int rot;
7838
7839 if (imm_expr.X_op != O_constant)
7840 as_bad (_("Improper rotate count"));
7841 rot = imm_expr.X_add_number & 0x1f;
7842 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7843 {
7844 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7845 break;
7846 }
7847 if (rot == 0)
7848 {
7849 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7850 break;
7851 }
7852 used_at = 1;
7853 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7854 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7855 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7856 }
7857 break;
7858
7859 case M_DROR:
7860 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7861 {
7862 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7863 break;
7864 }
7865 used_at = 1;
7866 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7867 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7868 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7869 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7870 break;
7871
7872 case M_ROR:
7873 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7874 {
7875 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7876 break;
7877 }
7878 used_at = 1;
7879 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7880 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7881 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7882 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7883 break;
7884
7885 case M_DROR_I:
7886 {
7887 unsigned int rot;
7888 char *l;
7889 char *rr;
7890
7891 if (imm_expr.X_op != O_constant)
7892 as_bad (_("Improper rotate count"));
7893 rot = imm_expr.X_add_number & 0x3f;
7894 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7895 {
7896 if (rot >= 32)
7897 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7898 else
7899 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7900 break;
7901 }
7902 if (rot == 0)
7903 {
7904 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7905 break;
7906 }
7907 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7908 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7909 rot &= 0x1f;
7910 used_at = 1;
7911 macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7912 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7913 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7914 }
7915 break;
7916
7917 case M_ROR_I:
7918 {
7919 unsigned int rot;
7920
7921 if (imm_expr.X_op != O_constant)
7922 as_bad (_("Improper rotate count"));
7923 rot = imm_expr.X_add_number & 0x1f;
7924 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7925 {
7926 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7927 break;
7928 }
7929 if (rot == 0)
7930 {
7931 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7932 break;
7933 }
7934 used_at = 1;
7935 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7936 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7937 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7938 }
7939 break;
7940
7941 case M_SEQ:
7942 if (sreg == 0)
7943 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7944 else if (treg == 0)
7945 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7946 else
7947 {
7948 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7949 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7950 }
7951 break;
7952
7953 case M_SEQ_I:
7954 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7955 {
7956 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7957 break;
7958 }
7959 if (sreg == 0)
7960 {
7961 as_warn (_("Instruction %s: result is always false"),
7962 ip->insn_mo->name);
7963 move_register (dreg, 0);
7964 break;
7965 }
7966 if (CPU_HAS_SEQ (mips_opts.arch)
7967 && -512 <= imm_expr.X_add_number
7968 && imm_expr.X_add_number < 512)
7969 {
7970 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7971 (int) imm_expr.X_add_number);
7972 break;
7973 }
7974 if (imm_expr.X_op == O_constant
7975 && imm_expr.X_add_number >= 0
7976 && imm_expr.X_add_number < 0x10000)
7977 {
7978 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7979 }
7980 else if (imm_expr.X_op == O_constant
7981 && imm_expr.X_add_number > -0x8000
7982 && imm_expr.X_add_number < 0)
7983 {
7984 imm_expr.X_add_number = -imm_expr.X_add_number;
7985 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7986 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7987 }
7988 else if (CPU_HAS_SEQ (mips_opts.arch))
7989 {
7990 used_at = 1;
7991 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7992 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7993 break;
7994 }
7995 else
7996 {
7997 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7998 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7999 used_at = 1;
8000 }
8001 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
8002 break;
8003
8004 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
8005 s = "slt";
8006 goto sge;
8007 case M_SGEU:
8008 s = "sltu";
8009 sge:
8010 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
8011 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8012 break;
8013
8014 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
8015 case M_SGEU_I:
8016 if (imm_expr.X_op == O_constant
8017 && imm_expr.X_add_number >= -0x8000
8018 && imm_expr.X_add_number < 0x8000)
8019 {
8020 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
8021 dreg, sreg, BFD_RELOC_LO16);
8022 }
8023 else
8024 {
8025 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8026 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
8027 dreg, sreg, AT);
8028 used_at = 1;
8029 }
8030 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8031 break;
8032
8033 case M_SGT: /* sreg > treg <==> treg < sreg */
8034 s = "slt";
8035 goto sgt;
8036 case M_SGTU:
8037 s = "sltu";
8038 sgt:
8039 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8040 break;
8041
8042 case M_SGT_I: /* sreg > I <==> I < sreg */
8043 s = "slt";
8044 goto sgti;
8045 case M_SGTU_I:
8046 s = "sltu";
8047 sgti:
8048 used_at = 1;
8049 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8050 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8051 break;
8052
8053 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
8054 s = "slt";
8055 goto sle;
8056 case M_SLEU:
8057 s = "sltu";
8058 sle:
8059 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8060 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8061 break;
8062
8063 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
8064 s = "slt";
8065 goto slei;
8066 case M_SLEU_I:
8067 s = "sltu";
8068 slei:
8069 used_at = 1;
8070 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8071 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8072 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8073 break;
8074
8075 case M_SLT_I:
8076 if (imm_expr.X_op == O_constant
8077 && imm_expr.X_add_number >= -0x8000
8078 && imm_expr.X_add_number < 0x8000)
8079 {
8080 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8081 break;
8082 }
8083 used_at = 1;
8084 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8085 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
8086 break;
8087
8088 case M_SLTU_I:
8089 if (imm_expr.X_op == O_constant
8090 && imm_expr.X_add_number >= -0x8000
8091 && imm_expr.X_add_number < 0x8000)
8092 {
8093 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
8094 BFD_RELOC_LO16);
8095 break;
8096 }
8097 used_at = 1;
8098 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8099 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
8100 break;
8101
8102 case M_SNE:
8103 if (sreg == 0)
8104 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
8105 else if (treg == 0)
8106 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8107 else
8108 {
8109 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
8110 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8111 }
8112 break;
8113
8114 case M_SNE_I:
8115 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
8116 {
8117 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8118 break;
8119 }
8120 if (sreg == 0)
8121 {
8122 as_warn (_("Instruction %s: result is always true"),
8123 ip->insn_mo->name);
8124 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
8125 dreg, 0, BFD_RELOC_LO16);
8126 break;
8127 }
8128 if (CPU_HAS_SEQ (mips_opts.arch)
8129 && -512 <= imm_expr.X_add_number
8130 && imm_expr.X_add_number < 512)
8131 {
8132 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
8133 (int) imm_expr.X_add_number);
8134 break;
8135 }
8136 if (imm_expr.X_op == O_constant
8137 && imm_expr.X_add_number >= 0
8138 && imm_expr.X_add_number < 0x10000)
8139 {
8140 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
8141 }
8142 else if (imm_expr.X_op == O_constant
8143 && imm_expr.X_add_number > -0x8000
8144 && imm_expr.X_add_number < 0)
8145 {
8146 imm_expr.X_add_number = -imm_expr.X_add_number;
8147 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
8148 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8149 }
8150 else if (CPU_HAS_SEQ (mips_opts.arch))
8151 {
8152 used_at = 1;
8153 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8154 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
8155 break;
8156 }
8157 else
8158 {
8159 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8160 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
8161 used_at = 1;
8162 }
8163 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8164 break;
8165
8166 case M_DSUB_I:
8167 dbl = 1;
8168 case M_SUB_I:
8169 if (imm_expr.X_op == O_constant
8170 && imm_expr.X_add_number > -0x8000
8171 && imm_expr.X_add_number <= 0x8000)
8172 {
8173 imm_expr.X_add_number = -imm_expr.X_add_number;
8174 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8175 dreg, sreg, BFD_RELOC_LO16);
8176 break;
8177 }
8178 used_at = 1;
8179 load_register (AT, &imm_expr, dbl);
8180 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8181 break;
8182
8183 case M_DSUBU_I:
8184 dbl = 1;
8185 case M_SUBU_I:
8186 if (imm_expr.X_op == O_constant
8187 && imm_expr.X_add_number > -0x8000
8188 && imm_expr.X_add_number <= 0x8000)
8189 {
8190 imm_expr.X_add_number = -imm_expr.X_add_number;
8191 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8192 dreg, sreg, BFD_RELOC_LO16);
8193 break;
8194 }
8195 used_at = 1;
8196 load_register (AT, &imm_expr, dbl);
8197 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8198 break;
8199
8200 case M_TEQ_I:
8201 s = "teq";
8202 goto trap;
8203 case M_TGE_I:
8204 s = "tge";
8205 goto trap;
8206 case M_TGEU_I:
8207 s = "tgeu";
8208 goto trap;
8209 case M_TLT_I:
8210 s = "tlt";
8211 goto trap;
8212 case M_TLTU_I:
8213 s = "tltu";
8214 goto trap;
8215 case M_TNE_I:
8216 s = "tne";
8217 trap:
8218 used_at = 1;
8219 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8220 macro_build (NULL, s, "s,t", sreg, AT);
8221 break;
8222
8223 case M_TRUNCWS:
8224 case M_TRUNCWD:
8225 gas_assert (mips_opts.isa == ISA_MIPS1);
8226 used_at = 1;
8227 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
8228 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
8229
8230 /*
8231 * Is the double cfc1 instruction a bug in the mips assembler;
8232 * or is there a reason for it?
8233 */
8234 start_noreorder ();
8235 macro_build (NULL, "cfc1", "t,G", treg, RA);
8236 macro_build (NULL, "cfc1", "t,G", treg, RA);
8237 macro_build (NULL, "nop", "");
8238 expr1.X_add_number = 3;
8239 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8240 expr1.X_add_number = 2;
8241 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8242 macro_build (NULL, "ctc1", "t,G", AT, RA);
8243 macro_build (NULL, "nop", "");
8244 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8245 dreg, sreg);
8246 macro_build (NULL, "ctc1", "t,G", treg, RA);
8247 macro_build (NULL, "nop", "");
8248 end_noreorder ();
8249 break;
8250
8251 case M_ULH:
8252 s = "lb";
8253 goto ulh;
8254 case M_ULHU:
8255 s = "lbu";
8256 ulh:
8257 used_at = 1;
8258 if (offset_expr.X_add_number >= 0x7fff)
8259 as_bad (_("Operand overflow"));
8260 if (!target_big_endian)
8261 ++offset_expr.X_add_number;
8262 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8263 if (!target_big_endian)
8264 --offset_expr.X_add_number;
8265 else
8266 ++offset_expr.X_add_number;
8267 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8268 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8269 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8270 break;
8271
8272 case M_ULD:
8273 s = "ldl";
8274 s2 = "ldr";
8275 off = 7;
8276 goto ulw;
8277 case M_ULW:
8278 s = "lwl";
8279 s2 = "lwr";
8280 off = 3;
8281 ulw:
8282 if (offset_expr.X_add_number >= 0x8000 - off)
8283 as_bad (_("Operand overflow"));
8284 if (treg != breg)
8285 tempreg = treg;
8286 else
8287 {
8288 used_at = 1;
8289 tempreg = AT;
8290 }
8291 if (!target_big_endian)
8292 offset_expr.X_add_number += off;
8293 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8294 if (!target_big_endian)
8295 offset_expr.X_add_number -= off;
8296 else
8297 offset_expr.X_add_number += off;
8298 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8299
8300 /* If necessary, move the result in tempreg to the final destination. */
8301 if (treg == tempreg)
8302 break;
8303 /* Protect second load's delay slot. */
8304 load_delay_nop ();
8305 move_register (treg, tempreg);
8306 break;
8307
8308 case M_ULD_A:
8309 s = "ldl";
8310 s2 = "ldr";
8311 off = 7;
8312 goto ulwa;
8313 case M_ULW_A:
8314 s = "lwl";
8315 s2 = "lwr";
8316 off = 3;
8317 ulwa:
8318 used_at = 1;
8319 load_address (AT, &offset_expr, &used_at);
8320 if (breg != 0)
8321 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8322 if (!target_big_endian)
8323 expr1.X_add_number = off;
8324 else
8325 expr1.X_add_number = 0;
8326 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8327 if (!target_big_endian)
8328 expr1.X_add_number = 0;
8329 else
8330 expr1.X_add_number = off;
8331 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8332 break;
8333
8334 case M_ULH_A:
8335 case M_ULHU_A:
8336 used_at = 1;
8337 load_address (AT, &offset_expr, &used_at);
8338 if (breg != 0)
8339 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8340 if (target_big_endian)
8341 expr1.X_add_number = 0;
8342 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8343 treg, BFD_RELOC_LO16, AT);
8344 if (target_big_endian)
8345 expr1.X_add_number = 1;
8346 else
8347 expr1.X_add_number = 0;
8348 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8349 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8350 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8351 break;
8352
8353 case M_USH:
8354 used_at = 1;
8355 if (offset_expr.X_add_number >= 0x7fff)
8356 as_bad (_("Operand overflow"));
8357 if (target_big_endian)
8358 ++offset_expr.X_add_number;
8359 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8360 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8361 if (target_big_endian)
8362 --offset_expr.X_add_number;
8363 else
8364 ++offset_expr.X_add_number;
8365 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8366 break;
8367
8368 case M_USD:
8369 s = "sdl";
8370 s2 = "sdr";
8371 off = 7;
8372 goto usw;
8373 case M_USW:
8374 s = "swl";
8375 s2 = "swr";
8376 off = 3;
8377 usw:
8378 if (offset_expr.X_add_number >= 0x8000 - off)
8379 as_bad (_("Operand overflow"));
8380 if (!target_big_endian)
8381 offset_expr.X_add_number += off;
8382 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8383 if (!target_big_endian)
8384 offset_expr.X_add_number -= off;
8385 else
8386 offset_expr.X_add_number += off;
8387 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8388 break;
8389
8390 case M_USD_A:
8391 s = "sdl";
8392 s2 = "sdr";
8393 off = 7;
8394 goto uswa;
8395 case M_USW_A:
8396 s = "swl";
8397 s2 = "swr";
8398 off = 3;
8399 uswa:
8400 used_at = 1;
8401 load_address (AT, &offset_expr, &used_at);
8402 if (breg != 0)
8403 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8404 if (!target_big_endian)
8405 expr1.X_add_number = off;
8406 else
8407 expr1.X_add_number = 0;
8408 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8409 if (!target_big_endian)
8410 expr1.X_add_number = 0;
8411 else
8412 expr1.X_add_number = off;
8413 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8414 break;
8415
8416 case M_USH_A:
8417 used_at = 1;
8418 load_address (AT, &offset_expr, &used_at);
8419 if (breg != 0)
8420 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8421 if (!target_big_endian)
8422 expr1.X_add_number = 0;
8423 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8424 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8425 if (!target_big_endian)
8426 expr1.X_add_number = 1;
8427 else
8428 expr1.X_add_number = 0;
8429 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8430 if (!target_big_endian)
8431 expr1.X_add_number = 0;
8432 else
8433 expr1.X_add_number = 1;
8434 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8435 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8436 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8437 break;
8438
8439 default:
8440 /* FIXME: Check if this is one of the itbl macros, since they
8441 are added dynamically. */
8442 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8443 break;
8444 }
8445 if (!mips_opts.at && used_at)
8446 as_bad (_("Macro used $at after \".set noat\""));
8447 }
8448
8449 /* Implement macros in mips16 mode. */
8450
8451 static void
8452 mips16_macro (struct mips_cl_insn *ip)
8453 {
8454 int mask;
8455 int xreg, yreg, zreg, tmp;
8456 expressionS expr1;
8457 int dbl;
8458 const char *s, *s2, *s3;
8459
8460 mask = ip->insn_mo->mask;
8461
8462 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8463 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8464 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8465
8466 expr1.X_op = O_constant;
8467 expr1.X_op_symbol = NULL;
8468 expr1.X_add_symbol = NULL;
8469 expr1.X_add_number = 1;
8470
8471 dbl = 0;
8472
8473 switch (mask)
8474 {
8475 default:
8476 internalError ();
8477
8478 case M_DDIV_3:
8479 dbl = 1;
8480 case M_DIV_3:
8481 s = "mflo";
8482 goto do_div3;
8483 case M_DREM_3:
8484 dbl = 1;
8485 case M_REM_3:
8486 s = "mfhi";
8487 do_div3:
8488 start_noreorder ();
8489 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8490 expr1.X_add_number = 2;
8491 macro_build (&expr1, "bnez", "x,p", yreg);
8492 macro_build (NULL, "break", "6", 7);
8493
8494 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8495 since that causes an overflow. We should do that as well,
8496 but I don't see how to do the comparisons without a temporary
8497 register. */
8498 end_noreorder ();
8499 macro_build (NULL, s, "x", zreg);
8500 break;
8501
8502 case M_DIVU_3:
8503 s = "divu";
8504 s2 = "mflo";
8505 goto do_divu3;
8506 case M_REMU_3:
8507 s = "divu";
8508 s2 = "mfhi";
8509 goto do_divu3;
8510 case M_DDIVU_3:
8511 s = "ddivu";
8512 s2 = "mflo";
8513 goto do_divu3;
8514 case M_DREMU_3:
8515 s = "ddivu";
8516 s2 = "mfhi";
8517 do_divu3:
8518 start_noreorder ();
8519 macro_build (NULL, s, "0,x,y", xreg, yreg);
8520 expr1.X_add_number = 2;
8521 macro_build (&expr1, "bnez", "x,p", yreg);
8522 macro_build (NULL, "break", "6", 7);
8523 end_noreorder ();
8524 macro_build (NULL, s2, "x", zreg);
8525 break;
8526
8527 case M_DMUL:
8528 dbl = 1;
8529 case M_MUL:
8530 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8531 macro_build (NULL, "mflo", "x", zreg);
8532 break;
8533
8534 case M_DSUBU_I:
8535 dbl = 1;
8536 goto do_subu;
8537 case M_SUBU_I:
8538 do_subu:
8539 if (imm_expr.X_op != O_constant)
8540 as_bad (_("Unsupported large constant"));
8541 imm_expr.X_add_number = -imm_expr.X_add_number;
8542 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8543 break;
8544
8545 case M_SUBU_I_2:
8546 if (imm_expr.X_op != O_constant)
8547 as_bad (_("Unsupported large constant"));
8548 imm_expr.X_add_number = -imm_expr.X_add_number;
8549 macro_build (&imm_expr, "addiu", "x,k", xreg);
8550 break;
8551
8552 case M_DSUBU_I_2:
8553 if (imm_expr.X_op != O_constant)
8554 as_bad (_("Unsupported large constant"));
8555 imm_expr.X_add_number = -imm_expr.X_add_number;
8556 macro_build (&imm_expr, "daddiu", "y,j", yreg);
8557 break;
8558
8559 case M_BEQ:
8560 s = "cmp";
8561 s2 = "bteqz";
8562 goto do_branch;
8563 case M_BNE:
8564 s = "cmp";
8565 s2 = "btnez";
8566 goto do_branch;
8567 case M_BLT:
8568 s = "slt";
8569 s2 = "btnez";
8570 goto do_branch;
8571 case M_BLTU:
8572 s = "sltu";
8573 s2 = "btnez";
8574 goto do_branch;
8575 case M_BLE:
8576 s = "slt";
8577 s2 = "bteqz";
8578 goto do_reverse_branch;
8579 case M_BLEU:
8580 s = "sltu";
8581 s2 = "bteqz";
8582 goto do_reverse_branch;
8583 case M_BGE:
8584 s = "slt";
8585 s2 = "bteqz";
8586 goto do_branch;
8587 case M_BGEU:
8588 s = "sltu";
8589 s2 = "bteqz";
8590 goto do_branch;
8591 case M_BGT:
8592 s = "slt";
8593 s2 = "btnez";
8594 goto do_reverse_branch;
8595 case M_BGTU:
8596 s = "sltu";
8597 s2 = "btnez";
8598
8599 do_reverse_branch:
8600 tmp = xreg;
8601 xreg = yreg;
8602 yreg = tmp;
8603
8604 do_branch:
8605 macro_build (NULL, s, "x,y", xreg, yreg);
8606 macro_build (&offset_expr, s2, "p");
8607 break;
8608
8609 case M_BEQ_I:
8610 s = "cmpi";
8611 s2 = "bteqz";
8612 s3 = "x,U";
8613 goto do_branch_i;
8614 case M_BNE_I:
8615 s = "cmpi";
8616 s2 = "btnez";
8617 s3 = "x,U";
8618 goto do_branch_i;
8619 case M_BLT_I:
8620 s = "slti";
8621 s2 = "btnez";
8622 s3 = "x,8";
8623 goto do_branch_i;
8624 case M_BLTU_I:
8625 s = "sltiu";
8626 s2 = "btnez";
8627 s3 = "x,8";
8628 goto do_branch_i;
8629 case M_BLE_I:
8630 s = "slti";
8631 s2 = "btnez";
8632 s3 = "x,8";
8633 goto do_addone_branch_i;
8634 case M_BLEU_I:
8635 s = "sltiu";
8636 s2 = "btnez";
8637 s3 = "x,8";
8638 goto do_addone_branch_i;
8639 case M_BGE_I:
8640 s = "slti";
8641 s2 = "bteqz";
8642 s3 = "x,8";
8643 goto do_branch_i;
8644 case M_BGEU_I:
8645 s = "sltiu";
8646 s2 = "bteqz";
8647 s3 = "x,8";
8648 goto do_branch_i;
8649 case M_BGT_I:
8650 s = "slti";
8651 s2 = "bteqz";
8652 s3 = "x,8";
8653 goto do_addone_branch_i;
8654 case M_BGTU_I:
8655 s = "sltiu";
8656 s2 = "bteqz";
8657 s3 = "x,8";
8658
8659 do_addone_branch_i:
8660 if (imm_expr.X_op != O_constant)
8661 as_bad (_("Unsupported large constant"));
8662 ++imm_expr.X_add_number;
8663
8664 do_branch_i:
8665 macro_build (&imm_expr, s, s3, xreg);
8666 macro_build (&offset_expr, s2, "p");
8667 break;
8668
8669 case M_ABS:
8670 expr1.X_add_number = 0;
8671 macro_build (&expr1, "slti", "x,8", yreg);
8672 if (xreg != yreg)
8673 move_register (xreg, yreg);
8674 expr1.X_add_number = 2;
8675 macro_build (&expr1, "bteqz", "p");
8676 macro_build (NULL, "neg", "x,w", xreg, xreg);
8677 }
8678 }
8679
8680 /* For consistency checking, verify that all bits are specified either
8681 by the match/mask part of the instruction definition, or by the
8682 operand list. */
8683 static int
8684 validate_mips_insn (const struct mips_opcode *opc)
8685 {
8686 const char *p = opc->args;
8687 char c;
8688 unsigned long used_bits = opc->mask;
8689
8690 if ((used_bits & opc->match) != opc->match)
8691 {
8692 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8693 opc->name, opc->args);
8694 return 0;
8695 }
8696 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8697 while (*p)
8698 switch (c = *p++)
8699 {
8700 case ',': break;
8701 case '(': break;
8702 case ')': break;
8703 case '+':
8704 switch (c = *p++)
8705 {
8706 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8707 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8708 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8709 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
8710 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8711 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8712 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8713 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8714 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8715 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8716 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8717 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8718 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8719 case 'I': break;
8720 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8721 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8722 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8723 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8724 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8725 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8726 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8727 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
8728 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8729 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8730 case 'z': USE_BITS (OP_MASK_RZ, OP_SH_RZ); break;
8731 case 'Z': USE_BITS (OP_MASK_FZ, OP_SH_FZ); break;
8732 case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8733 case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8734 case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
8735
8736 default:
8737 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8738 c, opc->name, opc->args);
8739 return 0;
8740 }
8741 break;
8742 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8743 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8744 case 'A': break;
8745 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8746 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8747 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8748 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8749 case 'F': break;
8750 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8751 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8752 case 'I': break;
8753 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8754 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8755 case 'L': break;
8756 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8757 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8758 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8759 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8760 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8761 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8762 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8763 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8764 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8765 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8766 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8767 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8768 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8769 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8770 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8771 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8772 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8773 case 'f': break;
8774 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8775 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8776 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8777 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8778 case 'l': break;
8779 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8780 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8781 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8782 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8783 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8784 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8785 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8786 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8787 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8788 case 'x': break;
8789 case 'z': break;
8790 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8791 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8792 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8793 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8794 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8795 case '[': break;
8796 case ']': break;
8797 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8798 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
8799 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8800 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8801 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8802 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8803 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8804 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8805 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8806 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8807 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8808 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8809 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
8810 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8811 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8812 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8813 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8814 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8815 default:
8816 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8817 c, opc->name, opc->args);
8818 return 0;
8819 }
8820 #undef USE_BITS
8821 if (used_bits != 0xffffffff)
8822 {
8823 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8824 ~used_bits & 0xffffffff, opc->name, opc->args);
8825 return 0;
8826 }
8827 return 1;
8828 }
8829
8830 /* UDI immediates. */
8831 struct mips_immed {
8832 char type;
8833 unsigned int shift;
8834 unsigned long mask;
8835 const char * desc;
8836 };
8837
8838 static const struct mips_immed mips_immed[] = {
8839 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8840 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8841 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8842 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8843 { 0,0,0,0 }
8844 };
8845
8846 /* Check whether an odd floating-point register is allowed. */
8847 static int
8848 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8849 {
8850 const char *s = insn->name;
8851
8852 if (insn->pinfo == INSN_MACRO)
8853 /* Let a macro pass, we'll catch it later when it is expanded. */
8854 return 1;
8855
8856 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8857 {
8858 /* Allow odd registers for single-precision ops. */
8859 switch (insn->pinfo & (FP_S | FP_D))
8860 {
8861 case FP_S:
8862 case 0:
8863 return 1; /* both single precision - ok */
8864 case FP_D:
8865 return 0; /* both double precision - fail */
8866 default:
8867 break;
8868 }
8869
8870 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8871 s = strchr (insn->name, '.');
8872 if (argnum == 2)
8873 s = s != NULL ? strchr (s + 1, '.') : NULL;
8874 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8875 }
8876
8877 /* Single-precision coprocessor loads and moves are OK too. */
8878 if ((insn->pinfo & FP_S)
8879 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8880 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8881 return 1;
8882
8883 return 0;
8884 }
8885
8886 /* This routine assembles an instruction into its binary format. As a
8887 side effect, it sets one of the global variables imm_reloc or
8888 offset_reloc to the type of relocation to do if one of the operands
8889 is an address expression. */
8890
8891 static void
8892 mips_ip (char *str, struct mips_cl_insn *ip)
8893 {
8894 char *s;
8895 const char *args;
8896 char c = 0;
8897 struct mips_opcode *insn;
8898 char *argsStart;
8899 unsigned int regno;
8900 unsigned int lastregno;
8901 unsigned int lastpos = 0;
8902 unsigned int limlo, limhi;
8903 char *s_reset;
8904 char save_c = 0;
8905 offsetT min_range, max_range;
8906 int argnum;
8907 unsigned int rtype;
8908
8909 insn_error = NULL;
8910
8911 /* If the instruction contains a '.', we first try to match an instruction
8912 including the '.'. Then we try again without the '.'. */
8913 insn = NULL;
8914 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8915 continue;
8916
8917 /* If we stopped on whitespace, then replace the whitespace with null for
8918 the call to hash_find. Save the character we replaced just in case we
8919 have to re-parse the instruction. */
8920 if (ISSPACE (*s))
8921 {
8922 save_c = *s;
8923 *s++ = '\0';
8924 }
8925
8926 insn = (struct mips_opcode *) hash_find (op_hash, str);
8927
8928 /* If we didn't find the instruction in the opcode table, try again, but
8929 this time with just the instruction up to, but not including the
8930 first '.'. */
8931 if (insn == NULL)
8932 {
8933 /* Restore the character we overwrite above (if any). */
8934 if (save_c)
8935 *(--s) = save_c;
8936
8937 /* Scan up to the first '.' or whitespace. */
8938 for (s = str;
8939 *s != '\0' && *s != '.' && !ISSPACE (*s);
8940 ++s)
8941 continue;
8942
8943 /* If we did not find a '.', then we can quit now. */
8944 if (*s != '.')
8945 {
8946 insn_error = _("Unrecognized opcode");
8947 return;
8948 }
8949
8950 /* Lookup the instruction in the hash table. */
8951 *s++ = '\0';
8952 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8953 {
8954 insn_error = _("Unrecognized opcode");
8955 return;
8956 }
8957 }
8958
8959 argsStart = s;
8960 for (;;)
8961 {
8962 bfd_boolean ok;
8963
8964 gas_assert (strcmp (insn->name, str) == 0);
8965
8966 ok = is_opcode_valid (insn);
8967 if (! ok)
8968 {
8969 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8970 && strcmp (insn->name, insn[1].name) == 0)
8971 {
8972 ++insn;
8973 continue;
8974 }
8975 else
8976 {
8977 if (!insn_error)
8978 {
8979 static char buf[100];
8980 sprintf (buf,
8981 _("opcode not supported on this processor: %s (%s)"),
8982 mips_cpu_info_from_arch (mips_opts.arch)->name,
8983 mips_cpu_info_from_isa (mips_opts.isa)->name);
8984 insn_error = buf;
8985 }
8986 if (save_c)
8987 *(--s) = save_c;
8988 return;
8989 }
8990 }
8991
8992 create_insn (ip, insn);
8993 insn_error = NULL;
8994 argnum = 1;
8995 lastregno = 0xffffffff;
8996 for (args = insn->args;; ++args)
8997 {
8998 int is_mdmx;
8999
9000 s += strspn (s, " \t");
9001 is_mdmx = 0;
9002 switch (*args)
9003 {
9004 case '\0': /* end of args */
9005 if (*s == '\0')
9006 return;
9007 break;
9008
9009 case '2': /* DSP 2-bit unsigned immediate in bit 11. */
9010 my_getExpression (&imm_expr, s);
9011 check_absolute_expr (ip, &imm_expr);
9012 if ((unsigned long) imm_expr.X_add_number != 1
9013 && (unsigned long) imm_expr.X_add_number != 3)
9014 {
9015 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
9016 (unsigned long) imm_expr.X_add_number);
9017 }
9018 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
9019 imm_expr.X_op = O_absent;
9020 s = expr_end;
9021 continue;
9022
9023 case '3': /* DSP 3-bit unsigned immediate in bit 21. */
9024 my_getExpression (&imm_expr, s);
9025 check_absolute_expr (ip, &imm_expr);
9026 if (imm_expr.X_add_number & ~OP_MASK_SA3)
9027 {
9028 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9029 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
9030 }
9031 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
9032 imm_expr.X_op = O_absent;
9033 s = expr_end;
9034 continue;
9035
9036 case '4': /* DSP 4-bit unsigned immediate in bit 21. */
9037 my_getExpression (&imm_expr, s);
9038 check_absolute_expr (ip, &imm_expr);
9039 if (imm_expr.X_add_number & ~OP_MASK_SA4)
9040 {
9041 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9042 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
9043 }
9044 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
9045 imm_expr.X_op = O_absent;
9046 s = expr_end;
9047 continue;
9048
9049 case '5': /* DSP 8-bit unsigned immediate in bit 16. */
9050 my_getExpression (&imm_expr, s);
9051 check_absolute_expr (ip, &imm_expr);
9052 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
9053 {
9054 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9055 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
9056 }
9057 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
9058 imm_expr.X_op = O_absent;
9059 s = expr_end;
9060 continue;
9061
9062 case '6': /* DSP 5-bit unsigned immediate in bit 21. */
9063 my_getExpression (&imm_expr, s);
9064 check_absolute_expr (ip, &imm_expr);
9065 if (imm_expr.X_add_number & ~OP_MASK_RS)
9066 {
9067 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9068 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
9069 }
9070 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
9071 imm_expr.X_op = O_absent;
9072 s = expr_end;
9073 continue;
9074
9075 case '7': /* Four DSP accumulators in bits 11,12. */
9076 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9077 s[3] >= '0' && s[3] <= '3')
9078 {
9079 regno = s[3] - '0';
9080 s += 4;
9081 INSERT_OPERAND (DSPACC, *ip, regno);
9082 continue;
9083 }
9084 else
9085 as_bad (_("Invalid dsp acc register"));
9086 break;
9087
9088 case '8': /* DSP 6-bit unsigned immediate in bit 11. */
9089 my_getExpression (&imm_expr, s);
9090 check_absolute_expr (ip, &imm_expr);
9091 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
9092 {
9093 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9094 OP_MASK_WRDSP,
9095 (unsigned long) imm_expr.X_add_number);
9096 }
9097 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
9098 imm_expr.X_op = O_absent;
9099 s = expr_end;
9100 continue;
9101
9102 case '9': /* Four DSP accumulators in bits 21,22. */
9103 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9104 s[3] >= '0' && s[3] <= '3')
9105 {
9106 regno = s[3] - '0';
9107 s += 4;
9108 INSERT_OPERAND (DSPACC_S, *ip, regno);
9109 continue;
9110 }
9111 else
9112 as_bad (_("Invalid dsp acc register"));
9113 break;
9114
9115 case '0': /* DSP 6-bit signed immediate in bit 20. */
9116 my_getExpression (&imm_expr, s);
9117 check_absolute_expr (ip, &imm_expr);
9118 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
9119 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
9120 if (imm_expr.X_add_number < min_range ||
9121 imm_expr.X_add_number > max_range)
9122 {
9123 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9124 (long) min_range, (long) max_range,
9125 (long) imm_expr.X_add_number);
9126 }
9127 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
9128 imm_expr.X_op = O_absent;
9129 s = expr_end;
9130 continue;
9131
9132 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
9133 my_getExpression (&imm_expr, s);
9134 check_absolute_expr (ip, &imm_expr);
9135 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
9136 {
9137 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9138 OP_MASK_RDDSP,
9139 (unsigned long) imm_expr.X_add_number);
9140 }
9141 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
9142 imm_expr.X_op = O_absent;
9143 s = expr_end;
9144 continue;
9145
9146 case ':': /* DSP 7-bit signed immediate in bit 19. */
9147 my_getExpression (&imm_expr, s);
9148 check_absolute_expr (ip, &imm_expr);
9149 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
9150 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
9151 if (imm_expr.X_add_number < min_range ||
9152 imm_expr.X_add_number > max_range)
9153 {
9154 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9155 (long) min_range, (long) max_range,
9156 (long) imm_expr.X_add_number);
9157 }
9158 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
9159 imm_expr.X_op = O_absent;
9160 s = expr_end;
9161 continue;
9162
9163 case '@': /* DSP 10-bit signed immediate in bit 16. */
9164 my_getExpression (&imm_expr, s);
9165 check_absolute_expr (ip, &imm_expr);
9166 min_range = -((OP_MASK_IMM10 + 1) >> 1);
9167 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
9168 if (imm_expr.X_add_number < min_range ||
9169 imm_expr.X_add_number > max_range)
9170 {
9171 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9172 (long) min_range, (long) max_range,
9173 (long) imm_expr.X_add_number);
9174 }
9175 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
9176 imm_expr.X_op = O_absent;
9177 s = expr_end;
9178 continue;
9179
9180 case '!': /* MT usermode flag bit. */
9181 my_getExpression (&imm_expr, s);
9182 check_absolute_expr (ip, &imm_expr);
9183 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9184 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9185 (unsigned long) imm_expr.X_add_number);
9186 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9187 imm_expr.X_op = O_absent;
9188 s = expr_end;
9189 continue;
9190
9191 case '$': /* MT load high flag bit. */
9192 my_getExpression (&imm_expr, s);
9193 check_absolute_expr (ip, &imm_expr);
9194 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9195 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9196 (unsigned long) imm_expr.X_add_number);
9197 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9198 imm_expr.X_op = O_absent;
9199 s = expr_end;
9200 continue;
9201
9202 case '*': /* Four DSP accumulators in bits 18,19. */
9203 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9204 s[3] >= '0' && s[3] <= '3')
9205 {
9206 regno = s[3] - '0';
9207 s += 4;
9208 INSERT_OPERAND (MTACC_T, *ip, regno);
9209 continue;
9210 }
9211 else
9212 as_bad (_("Invalid dsp/smartmips acc register"));
9213 break;
9214
9215 case '&': /* Four DSP accumulators in bits 13,14. */
9216 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9217 s[3] >= '0' && s[3] <= '3')
9218 {
9219 regno = s[3] - '0';
9220 s += 4;
9221 INSERT_OPERAND (MTACC_D, *ip, regno);
9222 continue;
9223 }
9224 else
9225 as_bad (_("Invalid dsp/smartmips acc register"));
9226 break;
9227
9228 case ',':
9229 ++argnum;
9230 if (*s++ == *args)
9231 continue;
9232 s--;
9233 switch (*++args)
9234 {
9235 case 'r':
9236 case 'v':
9237 INSERT_OPERAND (RS, *ip, lastregno);
9238 continue;
9239
9240 case 'w':
9241 INSERT_OPERAND (RT, *ip, lastregno);
9242 continue;
9243
9244 case 'W':
9245 INSERT_OPERAND (FT, *ip, lastregno);
9246 continue;
9247
9248 case 'V':
9249 INSERT_OPERAND (FS, *ip, lastregno);
9250 continue;
9251 }
9252 break;
9253
9254 case '(':
9255 /* Handle optional base register.
9256 Either the base register is omitted or
9257 we must have a left paren. */
9258 /* This is dependent on the next operand specifier
9259 is a base register specification. */
9260 gas_assert (args[1] == 'b');
9261 if (*s == '\0')
9262 return;
9263
9264 case ')': /* These must match exactly. */
9265 case '[':
9266 case ']':
9267 if (*s++ == *args)
9268 continue;
9269 break;
9270
9271 case '+': /* Opcode extension character. */
9272 switch (*++args)
9273 {
9274 case '1': /* UDI immediates. */
9275 case '2':
9276 case '3':
9277 case '4':
9278 {
9279 const struct mips_immed *imm = mips_immed;
9280
9281 while (imm->type && imm->type != *args)
9282 ++imm;
9283 if (! imm->type)
9284 internalError ();
9285 my_getExpression (&imm_expr, s);
9286 check_absolute_expr (ip, &imm_expr);
9287 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9288 {
9289 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9290 imm->desc ? imm->desc : ip->insn_mo->name,
9291 (unsigned long) imm_expr.X_add_number,
9292 (unsigned long) imm_expr.X_add_number);
9293 imm_expr.X_add_number &= imm->mask;
9294 }
9295 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9296 << imm->shift);
9297 imm_expr.X_op = O_absent;
9298 s = expr_end;
9299 }
9300 continue;
9301
9302 case 'A': /* ins/ext position, becomes LSB. */
9303 limlo = 0;
9304 limhi = 31;
9305 goto do_lsb;
9306 case 'E':
9307 limlo = 32;
9308 limhi = 63;
9309 goto do_lsb;
9310 do_lsb:
9311 my_getExpression (&imm_expr, s);
9312 check_absolute_expr (ip, &imm_expr);
9313 if ((unsigned long) imm_expr.X_add_number < limlo
9314 || (unsigned long) imm_expr.X_add_number > limhi)
9315 {
9316 as_bad (_("Improper position (%lu)"),
9317 (unsigned long) imm_expr.X_add_number);
9318 imm_expr.X_add_number = limlo;
9319 }
9320 lastpos = imm_expr.X_add_number;
9321 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9322 imm_expr.X_op = O_absent;
9323 s = expr_end;
9324 continue;
9325
9326 case 'B': /* ins size, becomes MSB. */
9327 limlo = 1;
9328 limhi = 32;
9329 goto do_msb;
9330 case 'F':
9331 limlo = 33;
9332 limhi = 64;
9333 goto do_msb;
9334 do_msb:
9335 my_getExpression (&imm_expr, s);
9336 check_absolute_expr (ip, &imm_expr);
9337 /* Check for negative input so that small negative numbers
9338 will not succeed incorrectly. The checks against
9339 (pos+size) transitively check "size" itself,
9340 assuming that "pos" is reasonable. */
9341 if ((long) imm_expr.X_add_number < 0
9342 || ((unsigned long) imm_expr.X_add_number
9343 + lastpos) < limlo
9344 || ((unsigned long) imm_expr.X_add_number
9345 + lastpos) > limhi)
9346 {
9347 as_bad (_("Improper insert size (%lu, position %lu)"),
9348 (unsigned long) imm_expr.X_add_number,
9349 (unsigned long) lastpos);
9350 imm_expr.X_add_number = limlo - lastpos;
9351 }
9352 INSERT_OPERAND (INSMSB, *ip,
9353 lastpos + imm_expr.X_add_number - 1);
9354 imm_expr.X_op = O_absent;
9355 s = expr_end;
9356 continue;
9357
9358 case 'C': /* ext size, becomes MSBD. */
9359 limlo = 1;
9360 limhi = 32;
9361 goto do_msbd;
9362 case 'G':
9363 limlo = 33;
9364 limhi = 64;
9365 goto do_msbd;
9366 case 'H':
9367 limlo = 33;
9368 limhi = 64;
9369 goto do_msbd;
9370 do_msbd:
9371 my_getExpression (&imm_expr, s);
9372 check_absolute_expr (ip, &imm_expr);
9373 /* Check for negative input so that small negative numbers
9374 will not succeed incorrectly. The checks against
9375 (pos+size) transitively check "size" itself,
9376 assuming that "pos" is reasonable. */
9377 if ((long) imm_expr.X_add_number < 0
9378 || ((unsigned long) imm_expr.X_add_number
9379 + lastpos) < limlo
9380 || ((unsigned long) imm_expr.X_add_number
9381 + lastpos) > limhi)
9382 {
9383 as_bad (_("Improper extract size (%lu, position %lu)"),
9384 (unsigned long) imm_expr.X_add_number,
9385 (unsigned long) lastpos);
9386 imm_expr.X_add_number = limlo - lastpos;
9387 }
9388 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9389 imm_expr.X_op = O_absent;
9390 s = expr_end;
9391 continue;
9392
9393 case 'D':
9394 /* +D is for disassembly only; never match. */
9395 break;
9396
9397 case 'I':
9398 /* "+I" is like "I", except that imm2_expr is used. */
9399 my_getExpression (&imm2_expr, s);
9400 if (imm2_expr.X_op != O_big
9401 && imm2_expr.X_op != O_constant)
9402 insn_error = _("absolute expression required");
9403 if (HAVE_32BIT_GPRS)
9404 normalize_constant_expr (&imm2_expr);
9405 s = expr_end;
9406 continue;
9407
9408 case 'T': /* Coprocessor register. */
9409 /* +T is for disassembly only; never match. */
9410 break;
9411
9412 case 't': /* Coprocessor register number. */
9413 if (s[0] == '$' && ISDIGIT (s[1]))
9414 {
9415 ++s;
9416 regno = 0;
9417 do
9418 {
9419 regno *= 10;
9420 regno += *s - '0';
9421 ++s;
9422 }
9423 while (ISDIGIT (*s));
9424 if (regno > 31)
9425 as_bad (_("Invalid register number (%d)"), regno);
9426 else
9427 {
9428 INSERT_OPERAND (RT, *ip, regno);
9429 continue;
9430 }
9431 }
9432 else
9433 as_bad (_("Invalid coprocessor 0 register number"));
9434 break;
9435
9436 case 'x':
9437 /* bbit[01] and bbit[01]32 bit index. Give error if index
9438 is not in the valid range. */
9439 my_getExpression (&imm_expr, s);
9440 check_absolute_expr (ip, &imm_expr);
9441 if ((unsigned) imm_expr.X_add_number > 31)
9442 {
9443 as_bad (_("Improper bit index (%lu)"),
9444 (unsigned long) imm_expr.X_add_number);
9445 imm_expr.X_add_number = 0;
9446 }
9447 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9448 imm_expr.X_op = O_absent;
9449 s = expr_end;
9450 continue;
9451
9452 case 'X':
9453 /* bbit[01] bit index when bbit is used but we generate
9454 bbit[01]32 because the index is over 32. Move to the
9455 next candidate if index is not in the valid range. */
9456 my_getExpression (&imm_expr, s);
9457 check_absolute_expr (ip, &imm_expr);
9458 if ((unsigned) imm_expr.X_add_number < 32
9459 || (unsigned) imm_expr.X_add_number > 63)
9460 break;
9461 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9462 imm_expr.X_op = O_absent;
9463 s = expr_end;
9464 continue;
9465
9466 case 'p':
9467 /* cins, cins32, exts and exts32 position field. Give error
9468 if it's not in the valid range. */
9469 my_getExpression (&imm_expr, s);
9470 check_absolute_expr (ip, &imm_expr);
9471 if ((unsigned) imm_expr.X_add_number > 31)
9472 {
9473 as_bad (_("Improper position (%lu)"),
9474 (unsigned long) imm_expr.X_add_number);
9475 imm_expr.X_add_number = 0;
9476 }
9477 /* Make the pos explicit to simplify +S. */
9478 lastpos = imm_expr.X_add_number + 32;
9479 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9480 imm_expr.X_op = O_absent;
9481 s = expr_end;
9482 continue;
9483
9484 case 'P':
9485 /* cins, cins32, exts and exts32 position field. Move to
9486 the next candidate if it's not in the valid range. */
9487 my_getExpression (&imm_expr, s);
9488 check_absolute_expr (ip, &imm_expr);
9489 if ((unsigned) imm_expr.X_add_number < 32
9490 || (unsigned) imm_expr.X_add_number > 63)
9491 break;
9492 lastpos = imm_expr.X_add_number;
9493 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9494 imm_expr.X_op = O_absent;
9495 s = expr_end;
9496 continue;
9497
9498 case 's':
9499 /* cins and exts length-minus-one field. */
9500 my_getExpression (&imm_expr, s);
9501 check_absolute_expr (ip, &imm_expr);
9502 if ((unsigned long) imm_expr.X_add_number > 31)
9503 {
9504 as_bad (_("Improper size (%lu)"),
9505 (unsigned long) imm_expr.X_add_number);
9506 imm_expr.X_add_number = 0;
9507 }
9508 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9509 imm_expr.X_op = O_absent;
9510 s = expr_end;
9511 continue;
9512
9513 case 'S':
9514 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9515 length-minus-one field. */
9516 my_getExpression (&imm_expr, s);
9517 check_absolute_expr (ip, &imm_expr);
9518 if ((long) imm_expr.X_add_number < 0
9519 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9520 {
9521 as_bad (_("Improper size (%lu)"),
9522 (unsigned long) imm_expr.X_add_number);
9523 imm_expr.X_add_number = 0;
9524 }
9525 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9526 imm_expr.X_op = O_absent;
9527 s = expr_end;
9528 continue;
9529
9530 case 'Q':
9531 /* seqi/snei immediate field. */
9532 my_getExpression (&imm_expr, s);
9533 check_absolute_expr (ip, &imm_expr);
9534 if ((long) imm_expr.X_add_number < -512
9535 || (long) imm_expr.X_add_number >= 512)
9536 {
9537 as_bad (_("Improper immediate (%ld)"),
9538 (long) imm_expr.X_add_number);
9539 imm_expr.X_add_number = 0;
9540 }
9541 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9542 imm_expr.X_op = O_absent;
9543 s = expr_end;
9544 continue;
9545
9546 case 'a': /* 8-bit signed offset in bit 6 */
9547 my_getExpression (&imm_expr, s);
9548 check_absolute_expr (ip, &imm_expr);
9549 min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9550 max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9551 if (imm_expr.X_add_number < min_range
9552 || imm_expr.X_add_number > max_range)
9553 {
9554 as_bad (_("Offset not in range %ld..%ld (%ld)"),
9555 (long) min_range, (long) max_range,
9556 (long) imm_expr.X_add_number);
9557 }
9558 INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9559 imm_expr.X_op = O_absent;
9560 s = expr_end;
9561 continue;
9562
9563 case 'b': /* 8-bit signed offset in bit 3 */
9564 my_getExpression (&imm_expr, s);
9565 check_absolute_expr (ip, &imm_expr);
9566 min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9567 max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9568 if (imm_expr.X_add_number < min_range
9569 || imm_expr.X_add_number > max_range)
9570 {
9571 as_bad (_("Offset not in range %ld..%ld (%ld)"),
9572 (long) min_range, (long) max_range,
9573 (long) imm_expr.X_add_number);
9574 }
9575 INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9576 imm_expr.X_op = O_absent;
9577 s = expr_end;
9578 continue;
9579
9580 case 'c': /* 9-bit signed offset in bit 6 */
9581 my_getExpression (&imm_expr, s);
9582 check_absolute_expr (ip, &imm_expr);
9583 min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9584 max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
9585 /* We check the offset range before adjusted. */
9586 min_range <<= 4;
9587 max_range <<= 4;
9588 if (imm_expr.X_add_number < min_range
9589 || imm_expr.X_add_number > max_range)
9590 {
9591 as_bad (_("Offset not in range %ld..%ld (%ld)"),
9592 (long) min_range, (long) max_range,
9593 (long) imm_expr.X_add_number);
9594 }
9595 if (imm_expr.X_add_number & 0xf)
9596 {
9597 as_bad (_("Offset not 16 bytes alignment (%ld)"),
9598 (long) imm_expr.X_add_number);
9599 }
9600 /* Right shift 4 bits to adjust the offset operand. */
9601 INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
9602 imm_expr.X_op = O_absent;
9603 s = expr_end;
9604 continue;
9605
9606 case 'z':
9607 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9608 break;
9609 if (regno == AT && mips_opts.at)
9610 {
9611 if (mips_opts.at == ATREG)
9612 as_warn (_("used $at without \".set noat\""));
9613 else
9614 as_warn (_("used $%u with \".set at=$%u\""),
9615 regno, mips_opts.at);
9616 }
9617 INSERT_OPERAND (RZ, *ip, regno);
9618 continue;
9619
9620 case 'Z':
9621 if (!reg_lookup (&s, RTYPE_FPU, &regno))
9622 break;
9623 INSERT_OPERAND (FZ, *ip, regno);
9624 continue;
9625
9626 default:
9627 as_bad (_("Internal error: bad mips opcode "
9628 "(unknown extension operand type `+%c'): %s %s"),
9629 *args, insn->name, insn->args);
9630 /* Further processing is fruitless. */
9631 return;
9632 }
9633 break;
9634
9635 case '<': /* must be at least one digit */
9636 /*
9637 * According to the manual, if the shift amount is greater
9638 * than 31 or less than 0, then the shift amount should be
9639 * mod 32. In reality the mips assembler issues an error.
9640 * We issue a warning and mask out all but the low 5 bits.
9641 */
9642 my_getExpression (&imm_expr, s);
9643 check_absolute_expr (ip, &imm_expr);
9644 if ((unsigned long) imm_expr.X_add_number > 31)
9645 as_warn (_("Improper shift amount (%lu)"),
9646 (unsigned long) imm_expr.X_add_number);
9647 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9648 imm_expr.X_op = O_absent;
9649 s = expr_end;
9650 continue;
9651
9652 case '>': /* shift amount minus 32 */
9653 my_getExpression (&imm_expr, s);
9654 check_absolute_expr (ip, &imm_expr);
9655 if ((unsigned long) imm_expr.X_add_number < 32
9656 || (unsigned long) imm_expr.X_add_number > 63)
9657 break;
9658 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9659 imm_expr.X_op = O_absent;
9660 s = expr_end;
9661 continue;
9662
9663 case 'k': /* CACHE code. */
9664 case 'h': /* PREFX code. */
9665 case '1': /* SYNC type. */
9666 my_getExpression (&imm_expr, s);
9667 check_absolute_expr (ip, &imm_expr);
9668 if ((unsigned long) imm_expr.X_add_number > 31)
9669 as_warn (_("Invalid value for `%s' (%lu)"),
9670 ip->insn_mo->name,
9671 (unsigned long) imm_expr.X_add_number);
9672 if (*args == 'k')
9673 {
9674 if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9675 switch (imm_expr.X_add_number)
9676 {
9677 case 5:
9678 case 25:
9679 case 26:
9680 case 27:
9681 case 28:
9682 case 29:
9683 case 30:
9684 case 31: /* These are ok. */
9685 break;
9686
9687 default: /* The rest must be changed to 28. */
9688 imm_expr.X_add_number = 28;
9689 break;
9690 }
9691 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9692 }
9693 else if (*args == 'h')
9694 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9695 else
9696 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9697 imm_expr.X_op = O_absent;
9698 s = expr_end;
9699 continue;
9700
9701 case 'c': /* BREAK code. */
9702 my_getExpression (&imm_expr, s);
9703 check_absolute_expr (ip, &imm_expr);
9704 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9705 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9706 ip->insn_mo->name,
9707 (unsigned long) imm_expr.X_add_number);
9708 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9709 imm_expr.X_op = O_absent;
9710 s = expr_end;
9711 continue;
9712
9713 case 'q': /* Lower BREAK code. */
9714 my_getExpression (&imm_expr, s);
9715 check_absolute_expr (ip, &imm_expr);
9716 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9717 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9718 ip->insn_mo->name,
9719 (unsigned long) imm_expr.X_add_number);
9720 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9721 imm_expr.X_op = O_absent;
9722 s = expr_end;
9723 continue;
9724
9725 case 'B': /* 20-bit SYSCALL/BREAK code. */
9726 my_getExpression (&imm_expr, s);
9727 check_absolute_expr (ip, &imm_expr);
9728 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9729 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9730 ip->insn_mo->name,
9731 (unsigned long) imm_expr.X_add_number);
9732 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9733 imm_expr.X_op = O_absent;
9734 s = expr_end;
9735 continue;
9736
9737 case 'C': /* Coprocessor code. */
9738 my_getExpression (&imm_expr, s);
9739 check_absolute_expr (ip, &imm_expr);
9740 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9741 {
9742 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9743 (unsigned long) imm_expr.X_add_number);
9744 imm_expr.X_add_number &= OP_MASK_COPZ;
9745 }
9746 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9747 imm_expr.X_op = O_absent;
9748 s = expr_end;
9749 continue;
9750
9751 case 'J': /* 19-bit WAIT code. */
9752 my_getExpression (&imm_expr, s);
9753 check_absolute_expr (ip, &imm_expr);
9754 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9755 {
9756 as_warn (_("Illegal 19-bit code (%lu)"),
9757 (unsigned long) imm_expr.X_add_number);
9758 imm_expr.X_add_number &= OP_MASK_CODE19;
9759 }
9760 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9761 imm_expr.X_op = O_absent;
9762 s = expr_end;
9763 continue;
9764
9765 case 'P': /* Performance register. */
9766 my_getExpression (&imm_expr, s);
9767 check_absolute_expr (ip, &imm_expr);
9768 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9769 as_warn (_("Invalid performance register (%lu)"),
9770 (unsigned long) imm_expr.X_add_number);
9771 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9772 imm_expr.X_op = O_absent;
9773 s = expr_end;
9774 continue;
9775
9776 case 'G': /* Coprocessor destination register. */
9777 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9778 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9779 else
9780 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9781 INSERT_OPERAND (RD, *ip, regno);
9782 if (ok)
9783 {
9784 lastregno = regno;
9785 continue;
9786 }
9787 else
9788 break;
9789
9790 case 'b': /* Base register. */
9791 case 'd': /* Destination register. */
9792 case 's': /* Source register. */
9793 case 't': /* Target register. */
9794 case 'r': /* Both target and source. */
9795 case 'v': /* Both dest and source. */
9796 case 'w': /* Both dest and target. */
9797 case 'E': /* Coprocessor target register. */
9798 case 'K': /* RDHWR destination register. */
9799 case 'x': /* Ignore register name. */
9800 case 'z': /* Must be zero register. */
9801 case 'U': /* Destination register (CLO/CLZ). */
9802 case 'g': /* Coprocessor destination register. */
9803 s_reset = s;
9804 if (*args == 'E' || *args == 'K')
9805 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9806 else
9807 {
9808 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9809 if (regno == AT && mips_opts.at)
9810 {
9811 if (mips_opts.at == ATREG)
9812 as_warn (_("Used $at without \".set noat\""));
9813 else
9814 as_warn (_("Used $%u with \".set at=$%u\""),
9815 regno, mips_opts.at);
9816 }
9817 }
9818 if (ok)
9819 {
9820 c = *args;
9821 if (*s == ' ')
9822 ++s;
9823 if (args[1] != *s)
9824 {
9825 if (c == 'r' || c == 'v' || c == 'w')
9826 {
9827 regno = lastregno;
9828 s = s_reset;
9829 ++args;
9830 }
9831 }
9832 /* 'z' only matches $0. */
9833 if (c == 'z' && regno != 0)
9834 break;
9835
9836 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9837 {
9838 if (regno == lastregno)
9839 {
9840 insn_error
9841 = _("Source and destination must be different");
9842 continue;
9843 }
9844 if (regno == 31 && lastregno == 0xffffffff)
9845 {
9846 insn_error
9847 = _("A destination register must be supplied");
9848 continue;
9849 }
9850 }
9851 /* Now that we have assembled one operand, we use the args
9852 string to figure out where it goes in the instruction. */
9853 switch (c)
9854 {
9855 case 'r':
9856 case 's':
9857 case 'v':
9858 case 'b':
9859 INSERT_OPERAND (RS, *ip, regno);
9860 break;
9861 case 'd':
9862 case 'K':
9863 case 'g':
9864 INSERT_OPERAND (RD, *ip, regno);
9865 break;
9866 case 'U':
9867 INSERT_OPERAND (RD, *ip, regno);
9868 INSERT_OPERAND (RT, *ip, regno);
9869 break;
9870 case 'w':
9871 case 't':
9872 case 'E':
9873 INSERT_OPERAND (RT, *ip, regno);
9874 break;
9875 case 'x':
9876 /* This case exists because on the r3000 trunc
9877 expands into a macro which requires a gp
9878 register. On the r6000 or r4000 it is
9879 assembled into a single instruction which
9880 ignores the register. Thus the insn version
9881 is MIPS_ISA2 and uses 'x', and the macro
9882 version is MIPS_ISA1 and uses 't'. */
9883 break;
9884 case 'z':
9885 /* This case is for the div instruction, which
9886 acts differently if the destination argument
9887 is $0. This only matches $0, and is checked
9888 outside the switch. */
9889 break;
9890 }
9891 lastregno = regno;
9892 continue;
9893 }
9894 switch (*args++)
9895 {
9896 case 'r':
9897 case 'v':
9898 INSERT_OPERAND (RS, *ip, lastregno);
9899 continue;
9900 case 'w':
9901 INSERT_OPERAND (RT, *ip, lastregno);
9902 continue;
9903 }
9904 break;
9905
9906 case 'O': /* MDMX alignment immediate constant. */
9907 my_getExpression (&imm_expr, s);
9908 check_absolute_expr (ip, &imm_expr);
9909 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9910 as_warn (_("Improper align amount (%ld), using low bits"),
9911 (long) imm_expr.X_add_number);
9912 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9913 imm_expr.X_op = O_absent;
9914 s = expr_end;
9915 continue;
9916
9917 case 'Q': /* MDMX vector, element sel, or const. */
9918 if (s[0] != '$')
9919 {
9920 /* MDMX Immediate. */
9921 my_getExpression (&imm_expr, s);
9922 check_absolute_expr (ip, &imm_expr);
9923 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9924 as_warn (_("Invalid MDMX Immediate (%ld)"),
9925 (long) imm_expr.X_add_number);
9926 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9927 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9928 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9929 else
9930 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9931 imm_expr.X_op = O_absent;
9932 s = expr_end;
9933 continue;
9934 }
9935 /* Not MDMX Immediate. Fall through. */
9936 case 'X': /* MDMX destination register. */
9937 case 'Y': /* MDMX source register. */
9938 case 'Z': /* MDMX target register. */
9939 is_mdmx = 1;
9940 case 'D': /* Floating point destination register. */
9941 case 'S': /* Floating point source register. */
9942 case 'T': /* Floating point target register. */
9943 case 'R': /* Floating point source register. */
9944 case 'V':
9945 case 'W':
9946 rtype = RTYPE_FPU;
9947 if (is_mdmx
9948 || (mips_opts.ase_mdmx
9949 && (ip->insn_mo->pinfo & FP_D)
9950 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9951 | INSN_COPROC_MEMORY_DELAY
9952 | INSN_LOAD_COPROC_DELAY
9953 | INSN_LOAD_MEMORY_DELAY
9954 | INSN_STORE_MEMORY))))
9955 rtype |= RTYPE_VEC;
9956 s_reset = s;
9957 if (reg_lookup (&s, rtype, &regno))
9958 {
9959 if ((regno & 1) != 0
9960 && HAVE_32BIT_FPRS
9961 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9962 as_warn (_("Float register should be even, was %d"),
9963 regno);
9964
9965 c = *args;
9966 if (*s == ' ')
9967 ++s;
9968 if (args[1] != *s)
9969 {
9970 if (c == 'V' || c == 'W')
9971 {
9972 regno = lastregno;
9973 s = s_reset;
9974 ++args;
9975 }
9976 }
9977 switch (c)
9978 {
9979 case 'D':
9980 case 'X':
9981 INSERT_OPERAND (FD, *ip, regno);
9982 break;
9983 case 'V':
9984 case 'S':
9985 case 'Y':
9986 INSERT_OPERAND (FS, *ip, regno);
9987 break;
9988 case 'Q':
9989 /* This is like 'Z', but also needs to fix the MDMX
9990 vector/scalar select bits. Note that the
9991 scalar immediate case is handled above. */
9992 if (*s == '[')
9993 {
9994 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9995 int max_el = (is_qh ? 3 : 7);
9996 s++;
9997 my_getExpression(&imm_expr, s);
9998 check_absolute_expr (ip, &imm_expr);
9999 s = expr_end;
10000 if (imm_expr.X_add_number > max_el)
10001 as_bad (_("Bad element selector %ld"),
10002 (long) imm_expr.X_add_number);
10003 imm_expr.X_add_number &= max_el;
10004 ip->insn_opcode |= (imm_expr.X_add_number
10005 << (OP_SH_VSEL +
10006 (is_qh ? 2 : 1)));
10007 imm_expr.X_op = O_absent;
10008 if (*s != ']')
10009 as_warn (_("Expecting ']' found '%s'"), s);
10010 else
10011 s++;
10012 }
10013 else
10014 {
10015 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
10016 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
10017 << OP_SH_VSEL);
10018 else
10019 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
10020 OP_SH_VSEL);
10021 }
10022 /* Fall through. */
10023 case 'W':
10024 case 'T':
10025 case 'Z':
10026 INSERT_OPERAND (FT, *ip, regno);
10027 break;
10028 case 'R':
10029 INSERT_OPERAND (FR, *ip, regno);
10030 break;
10031 }
10032 lastregno = regno;
10033 continue;
10034 }
10035
10036 switch (*args++)
10037 {
10038 case 'V':
10039 INSERT_OPERAND (FS, *ip, lastregno);
10040 continue;
10041 case 'W':
10042 INSERT_OPERAND (FT, *ip, lastregno);
10043 continue;
10044 }
10045 break;
10046
10047 case 'I':
10048 my_getExpression (&imm_expr, s);
10049 if (imm_expr.X_op != O_big
10050 && imm_expr.X_op != O_constant)
10051 insn_error = _("absolute expression required");
10052 if (HAVE_32BIT_GPRS)
10053 normalize_constant_expr (&imm_expr);
10054 s = expr_end;
10055 continue;
10056
10057 case 'A':
10058 my_getExpression (&offset_expr, s);
10059 normalize_address_expr (&offset_expr);
10060 *imm_reloc = BFD_RELOC_32;
10061 s = expr_end;
10062 continue;
10063
10064 case 'F':
10065 case 'L':
10066 case 'f':
10067 case 'l':
10068 {
10069 int f64;
10070 int using_gprs;
10071 char *save_in;
10072 char *err;
10073 unsigned char temp[8];
10074 int len;
10075 unsigned int length;
10076 segT seg;
10077 subsegT subseg;
10078 char *p;
10079
10080 /* These only appear as the last operand in an
10081 instruction, and every instruction that accepts
10082 them in any variant accepts them in all variants.
10083 This means we don't have to worry about backing out
10084 any changes if the instruction does not match.
10085
10086 The difference between them is the size of the
10087 floating point constant and where it goes. For 'F'
10088 and 'L' the constant is 64 bits; for 'f' and 'l' it
10089 is 32 bits. Where the constant is placed is based
10090 on how the MIPS assembler does things:
10091 F -- .rdata
10092 L -- .lit8
10093 f -- immediate value
10094 l -- .lit4
10095
10096 The .lit4 and .lit8 sections are only used if
10097 permitted by the -G argument.
10098
10099 The code below needs to know whether the target register
10100 is 32 or 64 bits wide. It relies on the fact 'f' and
10101 'F' are used with GPR-based instructions and 'l' and
10102 'L' are used with FPR-based instructions. */
10103
10104 f64 = *args == 'F' || *args == 'L';
10105 using_gprs = *args == 'F' || *args == 'f';
10106
10107 save_in = input_line_pointer;
10108 input_line_pointer = s;
10109 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
10110 length = len;
10111 s = input_line_pointer;
10112 input_line_pointer = save_in;
10113 if (err != NULL && *err != '\0')
10114 {
10115 as_bad (_("Bad floating point constant: %s"), err);
10116 memset (temp, '\0', sizeof temp);
10117 length = f64 ? 8 : 4;
10118 }
10119
10120 gas_assert (length == (unsigned) (f64 ? 8 : 4));
10121
10122 if (*args == 'f'
10123 || (*args == 'l'
10124 && (g_switch_value < 4
10125 || (temp[0] == 0 && temp[1] == 0)
10126 || (temp[2] == 0 && temp[3] == 0))))
10127 {
10128 imm_expr.X_op = O_constant;
10129 if (!target_big_endian)
10130 imm_expr.X_add_number = bfd_getl32 (temp);
10131 else
10132 imm_expr.X_add_number = bfd_getb32 (temp);
10133 }
10134 else if (length > 4
10135 && !mips_disable_float_construction
10136 /* Constants can only be constructed in GPRs and
10137 copied to FPRs if the GPRs are at least as wide
10138 as the FPRs. Force the constant into memory if
10139 we are using 64-bit FPRs but the GPRs are only
10140 32 bits wide. */
10141 && (using_gprs
10142 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
10143 && ((temp[0] == 0 && temp[1] == 0)
10144 || (temp[2] == 0 && temp[3] == 0))
10145 && ((temp[4] == 0 && temp[5] == 0)
10146 || (temp[6] == 0 && temp[7] == 0)))
10147 {
10148 /* The value is simple enough to load with a couple of
10149 instructions. If using 32-bit registers, set
10150 imm_expr to the high order 32 bits and offset_expr to
10151 the low order 32 bits. Otherwise, set imm_expr to
10152 the entire 64 bit constant. */
10153 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
10154 {
10155 imm_expr.X_op = O_constant;
10156 offset_expr.X_op = O_constant;
10157 if (!target_big_endian)
10158 {
10159 imm_expr.X_add_number = bfd_getl32 (temp + 4);
10160 offset_expr.X_add_number = bfd_getl32 (temp);
10161 }
10162 else
10163 {
10164 imm_expr.X_add_number = bfd_getb32 (temp);
10165 offset_expr.X_add_number = bfd_getb32 (temp + 4);
10166 }
10167 if (offset_expr.X_add_number == 0)
10168 offset_expr.X_op = O_absent;
10169 }
10170 else if (sizeof (imm_expr.X_add_number) > 4)
10171 {
10172 imm_expr.X_op = O_constant;
10173 if (!target_big_endian)
10174 imm_expr.X_add_number = bfd_getl64 (temp);
10175 else
10176 imm_expr.X_add_number = bfd_getb64 (temp);
10177 }
10178 else
10179 {
10180 imm_expr.X_op = O_big;
10181 imm_expr.X_add_number = 4;
10182 if (!target_big_endian)
10183 {
10184 generic_bignum[0] = bfd_getl16 (temp);
10185 generic_bignum[1] = bfd_getl16 (temp + 2);
10186 generic_bignum[2] = bfd_getl16 (temp + 4);
10187 generic_bignum[3] = bfd_getl16 (temp + 6);
10188 }
10189 else
10190 {
10191 generic_bignum[0] = bfd_getb16 (temp + 6);
10192 generic_bignum[1] = bfd_getb16 (temp + 4);
10193 generic_bignum[2] = bfd_getb16 (temp + 2);
10194 generic_bignum[3] = bfd_getb16 (temp);
10195 }
10196 }
10197 }
10198 else
10199 {
10200 const char *newname;
10201 segT new_seg;
10202
10203 /* Switch to the right section. */
10204 seg = now_seg;
10205 subseg = now_subseg;
10206 switch (*args)
10207 {
10208 default: /* unused default case avoids warnings. */
10209 case 'L':
10210 newname = RDATA_SECTION_NAME;
10211 if (g_switch_value >= 8)
10212 newname = ".lit8";
10213 break;
10214 case 'F':
10215 newname = RDATA_SECTION_NAME;
10216 break;
10217 case 'l':
10218 gas_assert (g_switch_value >= 4);
10219 newname = ".lit4";
10220 break;
10221 }
10222 new_seg = subseg_new (newname, (subsegT) 0);
10223 if (IS_ELF)
10224 bfd_set_section_flags (stdoutput, new_seg,
10225 (SEC_ALLOC
10226 | SEC_LOAD
10227 | SEC_READONLY
10228 | SEC_DATA));
10229 frag_align (*args == 'l' ? 2 : 3, 0, 0);
10230 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
10231 record_alignment (new_seg, 4);
10232 else
10233 record_alignment (new_seg, *args == 'l' ? 2 : 3);
10234 if (seg == now_seg)
10235 as_bad (_("Can't use floating point insn in this section"));
10236
10237 /* Set the argument to the current address in the
10238 section. */
10239 offset_expr.X_op = O_symbol;
10240 offset_expr.X_add_symbol = symbol_temp_new_now ();
10241 offset_expr.X_add_number = 0;
10242
10243 /* Put the floating point number into the section. */
10244 p = frag_more ((int) length);
10245 memcpy (p, temp, length);
10246
10247 /* Switch back to the original section. */
10248 subseg_set (seg, subseg);
10249 }
10250 }
10251 continue;
10252
10253 case 'i': /* 16-bit unsigned immediate. */
10254 case 'j': /* 16-bit signed immediate. */
10255 *imm_reloc = BFD_RELOC_LO16;
10256 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10257 {
10258 int more;
10259 offsetT minval, maxval;
10260
10261 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10262 && strcmp (insn->name, insn[1].name) == 0);
10263
10264 /* If the expression was written as an unsigned number,
10265 only treat it as signed if there are no more
10266 alternatives. */
10267 if (more
10268 && *args == 'j'
10269 && sizeof (imm_expr.X_add_number) <= 4
10270 && imm_expr.X_op == O_constant
10271 && imm_expr.X_add_number < 0
10272 && imm_expr.X_unsigned
10273 && HAVE_64BIT_GPRS)
10274 break;
10275
10276 /* For compatibility with older assemblers, we accept
10277 0x8000-0xffff as signed 16-bit numbers when only
10278 signed numbers are allowed. */
10279 if (*args == 'i')
10280 minval = 0, maxval = 0xffff;
10281 else if (more)
10282 minval = -0x8000, maxval = 0x7fff;
10283 else
10284 minval = -0x8000, maxval = 0xffff;
10285
10286 if (imm_expr.X_op != O_constant
10287 || imm_expr.X_add_number < minval
10288 || imm_expr.X_add_number > maxval)
10289 {
10290 if (more)
10291 break;
10292 if (imm_expr.X_op == O_constant
10293 || imm_expr.X_op == O_big)
10294 as_bad (_("Expression out of range"));
10295 }
10296 }
10297 s = expr_end;
10298 continue;
10299
10300 case 'o': /* 16-bit offset. */
10301 offset_reloc[0] = BFD_RELOC_LO16;
10302 offset_reloc[1] = BFD_RELOC_UNUSED;
10303 offset_reloc[2] = BFD_RELOC_UNUSED;
10304
10305 /* Check whether there is only a single bracketed expression
10306 left. If so, it must be the base register and the
10307 constant must be zero. */
10308 if (*s == '(' && strchr (s + 1, '(') == 0)
10309 {
10310 offset_expr.X_op = O_constant;
10311 offset_expr.X_add_number = 0;
10312 continue;
10313 }
10314
10315 /* If this value won't fit into a 16 bit offset, then go
10316 find a macro that will generate the 32 bit offset
10317 code pattern. */
10318 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10319 && (offset_expr.X_op != O_constant
10320 || offset_expr.X_add_number >= 0x8000
10321 || offset_expr.X_add_number < -0x8000))
10322 break;
10323
10324 s = expr_end;
10325 continue;
10326
10327 case 'p': /* PC-relative offset. */
10328 *offset_reloc = BFD_RELOC_16_PCREL_S2;
10329 my_getExpression (&offset_expr, s);
10330 s = expr_end;
10331 continue;
10332
10333 case 'u': /* Upper 16 bits. */
10334 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10335 && imm_expr.X_op == O_constant
10336 && (imm_expr.X_add_number < 0
10337 || imm_expr.X_add_number >= 0x10000))
10338 as_bad (_("lui expression (%lu) not in range 0..65535"),
10339 (unsigned long) imm_expr.X_add_number);
10340 s = expr_end;
10341 continue;
10342
10343 case 'a': /* 26-bit address. */
10344 my_getExpression (&offset_expr, s);
10345 s = expr_end;
10346 *offset_reloc = BFD_RELOC_MIPS_JMP;
10347 continue;
10348
10349 case 'N': /* 3-bit branch condition code. */
10350 case 'M': /* 3-bit compare condition code. */
10351 rtype = RTYPE_CCC;
10352 if (ip->insn_mo->pinfo & (FP_D | FP_S))
10353 rtype |= RTYPE_FCC;
10354 if (!reg_lookup (&s, rtype, &regno))
10355 break;
10356 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10357 || strcmp (str + strlen (str) - 5, "any2f") == 0
10358 || strcmp (str + strlen (str) - 5, "any2t") == 0)
10359 && (regno & 1) != 0)
10360 as_warn (_("Condition code register should be even for %s, "
10361 "was %d"),
10362 str, regno);
10363 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10364 || strcmp (str + strlen (str) - 5, "any4t") == 0)
10365 && (regno & 3) != 0)
10366 as_warn (_("Condition code register should be 0 or 4 for %s, "
10367 "was %d"),
10368 str, regno);
10369 if (*args == 'N')
10370 INSERT_OPERAND (BCC, *ip, regno);
10371 else
10372 INSERT_OPERAND (CCC, *ip, regno);
10373 continue;
10374
10375 case 'H':
10376 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10377 s += 2;
10378 if (ISDIGIT (*s))
10379 {
10380 c = 0;
10381 do
10382 {
10383 c *= 10;
10384 c += *s - '0';
10385 ++s;
10386 }
10387 while (ISDIGIT (*s));
10388 }
10389 else
10390 c = 8; /* Invalid sel value. */
10391
10392 if (c > 7)
10393 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10394 ip->insn_opcode |= c;
10395 continue;
10396
10397 case 'e':
10398 /* Must be at least one digit. */
10399 my_getExpression (&imm_expr, s);
10400 check_absolute_expr (ip, &imm_expr);
10401
10402 if ((unsigned long) imm_expr.X_add_number
10403 > (unsigned long) OP_MASK_VECBYTE)
10404 {
10405 as_bad (_("bad byte vector index (%ld)"),
10406 (long) imm_expr.X_add_number);
10407 imm_expr.X_add_number = 0;
10408 }
10409
10410 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10411 imm_expr.X_op = O_absent;
10412 s = expr_end;
10413 continue;
10414
10415 case '%':
10416 my_getExpression (&imm_expr, s);
10417 check_absolute_expr (ip, &imm_expr);
10418
10419 if ((unsigned long) imm_expr.X_add_number
10420 > (unsigned long) OP_MASK_VECALIGN)
10421 {
10422 as_bad (_("bad byte vector index (%ld)"),
10423 (long) imm_expr.X_add_number);
10424 imm_expr.X_add_number = 0;
10425 }
10426
10427 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10428 imm_expr.X_op = O_absent;
10429 s = expr_end;
10430 continue;
10431
10432 default:
10433 as_bad (_("Bad char = '%c'\n"), *args);
10434 internalError ();
10435 }
10436 break;
10437 }
10438 /* Args don't match. */
10439 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10440 !strcmp (insn->name, insn[1].name))
10441 {
10442 ++insn;
10443 s = argsStart;
10444 insn_error = _("Illegal operands");
10445 continue;
10446 }
10447 if (save_c)
10448 *(--argsStart) = save_c;
10449 insn_error = _("Illegal operands");
10450 return;
10451 }
10452 }
10453
10454 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10455
10456 /* This routine assembles an instruction into its binary format when
10457 assembling for the mips16. As a side effect, it sets one of the
10458 global variables imm_reloc or offset_reloc to the type of
10459 relocation to do if one of the operands is an address expression.
10460 It also sets mips16_small and mips16_ext if the user explicitly
10461 requested a small or extended instruction. */
10462
10463 static void
10464 mips16_ip (char *str, struct mips_cl_insn *ip)
10465 {
10466 char *s;
10467 const char *args;
10468 struct mips_opcode *insn;
10469 char *argsstart;
10470 unsigned int regno;
10471 unsigned int lastregno = 0;
10472 char *s_reset;
10473 size_t i;
10474
10475 insn_error = NULL;
10476
10477 mips16_small = FALSE;
10478 mips16_ext = FALSE;
10479
10480 for (s = str; ISLOWER (*s); ++s)
10481 ;
10482 switch (*s)
10483 {
10484 case '\0':
10485 break;
10486
10487 case ' ':
10488 *s++ = '\0';
10489 break;
10490
10491 case '.':
10492 if (s[1] == 't' && s[2] == ' ')
10493 {
10494 *s = '\0';
10495 mips16_small = TRUE;
10496 s += 3;
10497 break;
10498 }
10499 else if (s[1] == 'e' && s[2] == ' ')
10500 {
10501 *s = '\0';
10502 mips16_ext = TRUE;
10503 s += 3;
10504 break;
10505 }
10506 /* Fall through. */
10507 default:
10508 insn_error = _("unknown opcode");
10509 return;
10510 }
10511
10512 if (mips_opts.noautoextend && ! mips16_ext)
10513 mips16_small = TRUE;
10514
10515 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10516 {
10517 insn_error = _("unrecognized opcode");
10518 return;
10519 }
10520
10521 argsstart = s;
10522 for (;;)
10523 {
10524 bfd_boolean ok;
10525
10526 gas_assert (strcmp (insn->name, str) == 0);
10527
10528 ok = is_opcode_valid_16 (insn);
10529 if (! ok)
10530 {
10531 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10532 && strcmp (insn->name, insn[1].name) == 0)
10533 {
10534 ++insn;
10535 continue;
10536 }
10537 else
10538 {
10539 if (!insn_error)
10540 {
10541 static char buf[100];
10542 sprintf (buf,
10543 _("opcode not supported on this processor: %s (%s)"),
10544 mips_cpu_info_from_arch (mips_opts.arch)->name,
10545 mips_cpu_info_from_isa (mips_opts.isa)->name);
10546 insn_error = buf;
10547 }
10548 return;
10549 }
10550 }
10551
10552 create_insn (ip, insn);
10553 imm_expr.X_op = O_absent;
10554 imm_reloc[0] = BFD_RELOC_UNUSED;
10555 imm_reloc[1] = BFD_RELOC_UNUSED;
10556 imm_reloc[2] = BFD_RELOC_UNUSED;
10557 imm2_expr.X_op = O_absent;
10558 offset_expr.X_op = O_absent;
10559 offset_reloc[0] = BFD_RELOC_UNUSED;
10560 offset_reloc[1] = BFD_RELOC_UNUSED;
10561 offset_reloc[2] = BFD_RELOC_UNUSED;
10562 for (args = insn->args; 1; ++args)
10563 {
10564 int c;
10565
10566 if (*s == ' ')
10567 ++s;
10568
10569 /* In this switch statement we call break if we did not find
10570 a match, continue if we did find a match, or return if we
10571 are done. */
10572
10573 c = *args;
10574 switch (c)
10575 {
10576 case '\0':
10577 if (*s == '\0')
10578 {
10579 /* Stuff the immediate value in now, if we can. */
10580 if (imm_expr.X_op == O_constant
10581 && *imm_reloc > BFD_RELOC_UNUSED
10582 && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10583 && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10584 && insn->pinfo != INSN_MACRO)
10585 {
10586 valueT tmp;
10587
10588 switch (*offset_reloc)
10589 {
10590 case BFD_RELOC_MIPS16_HI16_S:
10591 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10592 break;
10593
10594 case BFD_RELOC_MIPS16_HI16:
10595 tmp = imm_expr.X_add_number >> 16;
10596 break;
10597
10598 case BFD_RELOC_MIPS16_LO16:
10599 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10600 - 0x8000;
10601 break;
10602
10603 case BFD_RELOC_UNUSED:
10604 tmp = imm_expr.X_add_number;
10605 break;
10606
10607 default:
10608 internalError ();
10609 }
10610 *offset_reloc = BFD_RELOC_UNUSED;
10611
10612 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10613 tmp, TRUE, mips16_small,
10614 mips16_ext, &ip->insn_opcode,
10615 &ip->use_extend, &ip->extend);
10616 imm_expr.X_op = O_absent;
10617 *imm_reloc = BFD_RELOC_UNUSED;
10618 }
10619
10620 return;
10621 }
10622 break;
10623
10624 case ',':
10625 if (*s++ == c)
10626 continue;
10627 s--;
10628 switch (*++args)
10629 {
10630 case 'v':
10631 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10632 continue;
10633 case 'w':
10634 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10635 continue;
10636 }
10637 break;
10638
10639 case '(':
10640 case ')':
10641 if (*s++ == c)
10642 continue;
10643 break;
10644
10645 case 'v':
10646 case 'w':
10647 if (s[0] != '$')
10648 {
10649 if (c == 'v')
10650 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10651 else
10652 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10653 ++args;
10654 continue;
10655 }
10656 /* Fall through. */
10657 case 'x':
10658 case 'y':
10659 case 'z':
10660 case 'Z':
10661 case '0':
10662 case 'S':
10663 case 'R':
10664 case 'X':
10665 case 'Y':
10666 s_reset = s;
10667 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10668 {
10669 if (c == 'v' || c == 'w')
10670 {
10671 if (c == 'v')
10672 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10673 else
10674 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10675 ++args;
10676 continue;
10677 }
10678 break;
10679 }
10680
10681 if (*s == ' ')
10682 ++s;
10683 if (args[1] != *s)
10684 {
10685 if (c == 'v' || c == 'w')
10686 {
10687 regno = mips16_to_32_reg_map[lastregno];
10688 s = s_reset;
10689 ++args;
10690 }
10691 }
10692
10693 switch (c)
10694 {
10695 case 'x':
10696 case 'y':
10697 case 'z':
10698 case 'v':
10699 case 'w':
10700 case 'Z':
10701 regno = mips32_to_16_reg_map[regno];
10702 break;
10703
10704 case '0':
10705 if (regno != 0)
10706 regno = ILLEGAL_REG;
10707 break;
10708
10709 case 'S':
10710 if (regno != SP)
10711 regno = ILLEGAL_REG;
10712 break;
10713
10714 case 'R':
10715 if (regno != RA)
10716 regno = ILLEGAL_REG;
10717 break;
10718
10719 case 'X':
10720 case 'Y':
10721 if (regno == AT && mips_opts.at)
10722 {
10723 if (mips_opts.at == ATREG)
10724 as_warn (_("used $at without \".set noat\""));
10725 else
10726 as_warn (_("used $%u with \".set at=$%u\""),
10727 regno, mips_opts.at);
10728 }
10729 break;
10730
10731 default:
10732 internalError ();
10733 }
10734
10735 if (regno == ILLEGAL_REG)
10736 break;
10737
10738 switch (c)
10739 {
10740 case 'x':
10741 case 'v':
10742 MIPS16_INSERT_OPERAND (RX, *ip, regno);
10743 break;
10744 case 'y':
10745 case 'w':
10746 MIPS16_INSERT_OPERAND (RY, *ip, regno);
10747 break;
10748 case 'z':
10749 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10750 break;
10751 case 'Z':
10752 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10753 case '0':
10754 case 'S':
10755 case 'R':
10756 break;
10757 case 'X':
10758 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10759 break;
10760 case 'Y':
10761 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10762 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10763 break;
10764 default:
10765 internalError ();
10766 }
10767
10768 lastregno = regno;
10769 continue;
10770
10771 case 'P':
10772 if (strncmp (s, "$pc", 3) == 0)
10773 {
10774 s += 3;
10775 continue;
10776 }
10777 break;
10778
10779 case '5':
10780 case 'H':
10781 case 'W':
10782 case 'D':
10783 case 'j':
10784 case 'V':
10785 case 'C':
10786 case 'U':
10787 case 'k':
10788 case 'K':
10789 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10790 if (i > 0)
10791 {
10792 if (imm_expr.X_op != O_constant)
10793 {
10794 mips16_ext = TRUE;
10795 ip->use_extend = TRUE;
10796 ip->extend = 0;
10797 }
10798 else
10799 {
10800 /* We need to relax this instruction. */
10801 *offset_reloc = *imm_reloc;
10802 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10803 }
10804 s = expr_end;
10805 continue;
10806 }
10807 *imm_reloc = BFD_RELOC_UNUSED;
10808 /* Fall through. */
10809 case '<':
10810 case '>':
10811 case '[':
10812 case ']':
10813 case '4':
10814 case '8':
10815 my_getExpression (&imm_expr, s);
10816 if (imm_expr.X_op == O_register)
10817 {
10818 /* What we thought was an expression turned out to
10819 be a register. */
10820
10821 if (s[0] == '(' && args[1] == '(')
10822 {
10823 /* It looks like the expression was omitted
10824 before a register indirection, which means
10825 that the expression is implicitly zero. We
10826 still set up imm_expr, so that we handle
10827 explicit extensions correctly. */
10828 imm_expr.X_op = O_constant;
10829 imm_expr.X_add_number = 0;
10830 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10831 continue;
10832 }
10833
10834 break;
10835 }
10836
10837 /* We need to relax this instruction. */
10838 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10839 s = expr_end;
10840 continue;
10841
10842 case 'p':
10843 case 'q':
10844 case 'A':
10845 case 'B':
10846 case 'E':
10847 /* We use offset_reloc rather than imm_reloc for the PC
10848 relative operands. This lets macros with both
10849 immediate and address operands work correctly. */
10850 my_getExpression (&offset_expr, s);
10851
10852 if (offset_expr.X_op == O_register)
10853 break;
10854
10855 /* We need to relax this instruction. */
10856 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10857 s = expr_end;
10858 continue;
10859
10860 case '6': /* break code */
10861 my_getExpression (&imm_expr, s);
10862 check_absolute_expr (ip, &imm_expr);
10863 if ((unsigned long) imm_expr.X_add_number > 63)
10864 as_warn (_("Invalid value for `%s' (%lu)"),
10865 ip->insn_mo->name,
10866 (unsigned long) imm_expr.X_add_number);
10867 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10868 imm_expr.X_op = O_absent;
10869 s = expr_end;
10870 continue;
10871
10872 case 'a': /* 26 bit address */
10873 my_getExpression (&offset_expr, s);
10874 s = expr_end;
10875 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10876 ip->insn_opcode <<= 16;
10877 continue;
10878
10879 case 'l': /* register list for entry macro */
10880 case 'L': /* register list for exit macro */
10881 {
10882 int mask;
10883
10884 if (c == 'l')
10885 mask = 0;
10886 else
10887 mask = 7 << 3;
10888 while (*s != '\0')
10889 {
10890 unsigned int freg, reg1, reg2;
10891
10892 while (*s == ' ' || *s == ',')
10893 ++s;
10894 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10895 freg = 0;
10896 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10897 freg = 1;
10898 else
10899 {
10900 as_bad (_("can't parse register list"));
10901 break;
10902 }
10903 if (*s == ' ')
10904 ++s;
10905 if (*s != '-')
10906 reg2 = reg1;
10907 else
10908 {
10909 ++s;
10910 if (!reg_lookup (&s, freg ? RTYPE_FPU
10911 : (RTYPE_GP | RTYPE_NUM), &reg2))
10912 {
10913 as_bad (_("invalid register list"));
10914 break;
10915 }
10916 }
10917 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10918 {
10919 mask &= ~ (7 << 3);
10920 mask |= 5 << 3;
10921 }
10922 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10923 {
10924 mask &= ~ (7 << 3);
10925 mask |= 6 << 3;
10926 }
10927 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10928 mask |= (reg2 - 3) << 3;
10929 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10930 mask |= (reg2 - 15) << 1;
10931 else if (reg1 == RA && reg2 == RA)
10932 mask |= 1;
10933 else
10934 {
10935 as_bad (_("invalid register list"));
10936 break;
10937 }
10938 }
10939 /* The mask is filled in in the opcode table for the
10940 benefit of the disassembler. We remove it before
10941 applying the actual mask. */
10942 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10943 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10944 }
10945 continue;
10946
10947 case 'm': /* Register list for save insn. */
10948 case 'M': /* Register list for restore insn. */
10949 {
10950 int opcode = 0;
10951 int framesz = 0, seen_framesz = 0;
10952 int nargs = 0, statics = 0, sregs = 0;
10953
10954 while (*s != '\0')
10955 {
10956 unsigned int reg1, reg2;
10957
10958 SKIP_SPACE_TABS (s);
10959 while (*s == ',')
10960 ++s;
10961 SKIP_SPACE_TABS (s);
10962
10963 my_getExpression (&imm_expr, s);
10964 if (imm_expr.X_op == O_constant)
10965 {
10966 /* Handle the frame size. */
10967 if (seen_framesz)
10968 {
10969 as_bad (_("more than one frame size in list"));
10970 break;
10971 }
10972 seen_framesz = 1;
10973 framesz = imm_expr.X_add_number;
10974 imm_expr.X_op = O_absent;
10975 s = expr_end;
10976 continue;
10977 }
10978
10979 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10980 {
10981 as_bad (_("can't parse register list"));
10982 break;
10983 }
10984
10985 while (*s == ' ')
10986 ++s;
10987
10988 if (*s != '-')
10989 reg2 = reg1;
10990 else
10991 {
10992 ++s;
10993 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10994 || reg2 < reg1)
10995 {
10996 as_bad (_("can't parse register list"));
10997 break;
10998 }
10999 }
11000
11001 while (reg1 <= reg2)
11002 {
11003 if (reg1 >= 4 && reg1 <= 7)
11004 {
11005 if (!seen_framesz)
11006 /* args $a0-$a3 */
11007 nargs |= 1 << (reg1 - 4);
11008 else
11009 /* statics $a0-$a3 */
11010 statics |= 1 << (reg1 - 4);
11011 }
11012 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
11013 {
11014 /* $s0-$s8 */
11015 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
11016 }
11017 else if (reg1 == 31)
11018 {
11019 /* Add $ra to insn. */
11020 opcode |= 0x40;
11021 }
11022 else
11023 {
11024 as_bad (_("unexpected register in list"));
11025 break;
11026 }
11027 if (++reg1 == 24)
11028 reg1 = 30;
11029 }
11030 }
11031
11032 /* Encode args/statics combination. */
11033 if (nargs & statics)
11034 as_bad (_("arg/static registers overlap"));
11035 else if (nargs == 0xf)
11036 /* All $a0-$a3 are args. */
11037 opcode |= MIPS16_ALL_ARGS << 16;
11038 else if (statics == 0xf)
11039 /* All $a0-$a3 are statics. */
11040 opcode |= MIPS16_ALL_STATICS << 16;
11041 else
11042 {
11043 int narg = 0, nstat = 0;
11044
11045 /* Count arg registers. */
11046 while (nargs & 0x1)
11047 {
11048 nargs >>= 1;
11049 narg++;
11050 }
11051 if (nargs != 0)
11052 as_bad (_("invalid arg register list"));
11053
11054 /* Count static registers. */
11055 while (statics & 0x8)
11056 {
11057 statics = (statics << 1) & 0xf;
11058 nstat++;
11059 }
11060 if (statics != 0)
11061 as_bad (_("invalid static register list"));
11062
11063 /* Encode args/statics. */
11064 opcode |= ((narg << 2) | nstat) << 16;
11065 }
11066
11067 /* Encode $s0/$s1. */
11068 if (sregs & (1 << 0)) /* $s0 */
11069 opcode |= 0x20;
11070 if (sregs & (1 << 1)) /* $s1 */
11071 opcode |= 0x10;
11072 sregs >>= 2;
11073
11074 if (sregs != 0)
11075 {
11076 /* Count regs $s2-$s8. */
11077 int nsreg = 0;
11078 while (sregs & 1)
11079 {
11080 sregs >>= 1;
11081 nsreg++;
11082 }
11083 if (sregs != 0)
11084 as_bad (_("invalid static register list"));
11085 /* Encode $s2-$s8. */
11086 opcode |= nsreg << 24;
11087 }
11088
11089 /* Encode frame size. */
11090 if (!seen_framesz)
11091 as_bad (_("missing frame size"));
11092 else if ((framesz & 7) != 0 || framesz < 0
11093 || framesz > 0xff * 8)
11094 as_bad (_("invalid frame size"));
11095 else if (framesz != 128 || (opcode >> 16) != 0)
11096 {
11097 framesz /= 8;
11098 opcode |= (((framesz & 0xf0) << 16)
11099 | (framesz & 0x0f));
11100 }
11101
11102 /* Finally build the instruction. */
11103 if ((opcode >> 16) != 0 || framesz == 0)
11104 {
11105 ip->use_extend = TRUE;
11106 ip->extend = opcode >> 16;
11107 }
11108 ip->insn_opcode |= opcode & 0x7f;
11109 }
11110 continue;
11111
11112 case 'e': /* extend code */
11113 my_getExpression (&imm_expr, s);
11114 check_absolute_expr (ip, &imm_expr);
11115 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
11116 {
11117 as_warn (_("Invalid value for `%s' (%lu)"),
11118 ip->insn_mo->name,
11119 (unsigned long) imm_expr.X_add_number);
11120 imm_expr.X_add_number &= 0x7ff;
11121 }
11122 ip->insn_opcode |= imm_expr.X_add_number;
11123 imm_expr.X_op = O_absent;
11124 s = expr_end;
11125 continue;
11126
11127 default:
11128 internalError ();
11129 }
11130 break;
11131 }
11132
11133 /* Args don't match. */
11134 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
11135 strcmp (insn->name, insn[1].name) == 0)
11136 {
11137 ++insn;
11138 s = argsstart;
11139 continue;
11140 }
11141
11142 insn_error = _("illegal operands");
11143
11144 return;
11145 }
11146 }
11147
11148 /* This structure holds information we know about a mips16 immediate
11149 argument type. */
11150
11151 struct mips16_immed_operand
11152 {
11153 /* The type code used in the argument string in the opcode table. */
11154 int type;
11155 /* The number of bits in the short form of the opcode. */
11156 int nbits;
11157 /* The number of bits in the extended form of the opcode. */
11158 int extbits;
11159 /* The amount by which the short form is shifted when it is used;
11160 for example, the sw instruction has a shift count of 2. */
11161 int shift;
11162 /* The amount by which the short form is shifted when it is stored
11163 into the instruction code. */
11164 int op_shift;
11165 /* Non-zero if the short form is unsigned. */
11166 int unsp;
11167 /* Non-zero if the extended form is unsigned. */
11168 int extu;
11169 /* Non-zero if the value is PC relative. */
11170 int pcrel;
11171 };
11172
11173 /* The mips16 immediate operand types. */
11174
11175 static const struct mips16_immed_operand mips16_immed_operands[] =
11176 {
11177 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
11178 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
11179 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
11180 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
11181 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
11182 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
11183 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
11184 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
11185 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
11186 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
11187 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
11188 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
11189 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
11190 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
11191 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
11192 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
11193 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11194 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11195 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
11196 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
11197 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
11198 };
11199
11200 #define MIPS16_NUM_IMMED \
11201 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
11202
11203 /* Handle a mips16 instruction with an immediate value. This or's the
11204 small immediate value into *INSN. It sets *USE_EXTEND to indicate
11205 whether an extended value is needed; if one is needed, it sets
11206 *EXTEND to the value. The argument type is TYPE. The value is VAL.
11207 If SMALL is true, an unextended opcode was explicitly requested.
11208 If EXT is true, an extended opcode was explicitly requested. If
11209 WARN is true, warn if EXT does not match reality. */
11210
11211 static void
11212 mips16_immed (char *file, unsigned int line, int type, offsetT val,
11213 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
11214 unsigned long *insn, bfd_boolean *use_extend,
11215 unsigned short *extend)
11216 {
11217 const struct mips16_immed_operand *op;
11218 int mintiny, maxtiny;
11219 bfd_boolean needext;
11220
11221 op = mips16_immed_operands;
11222 while (op->type != type)
11223 {
11224 ++op;
11225 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
11226 }
11227
11228 if (op->unsp)
11229 {
11230 if (type == '<' || type == '>' || type == '[' || type == ']')
11231 {
11232 mintiny = 1;
11233 maxtiny = 1 << op->nbits;
11234 }
11235 else
11236 {
11237 mintiny = 0;
11238 maxtiny = (1 << op->nbits) - 1;
11239 }
11240 }
11241 else
11242 {
11243 mintiny = - (1 << (op->nbits - 1));
11244 maxtiny = (1 << (op->nbits - 1)) - 1;
11245 }
11246
11247 /* Branch offsets have an implicit 0 in the lowest bit. */
11248 if (type == 'p' || type == 'q')
11249 val /= 2;
11250
11251 if ((val & ((1 << op->shift) - 1)) != 0
11252 || val < (mintiny << op->shift)
11253 || val > (maxtiny << op->shift))
11254 needext = TRUE;
11255 else
11256 needext = FALSE;
11257
11258 if (warn && ext && ! needext)
11259 as_warn_where (file, line,
11260 _("extended operand requested but not required"));
11261 if (small && needext)
11262 as_bad_where (file, line, _("invalid unextended operand value"));
11263
11264 if (small || (! ext && ! needext))
11265 {
11266 int insnval;
11267
11268 *use_extend = FALSE;
11269 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11270 insnval <<= op->op_shift;
11271 *insn |= insnval;
11272 }
11273 else
11274 {
11275 long minext, maxext;
11276 int extval;
11277
11278 if (op->extu)
11279 {
11280 minext = 0;
11281 maxext = (1 << op->extbits) - 1;
11282 }
11283 else
11284 {
11285 minext = - (1 << (op->extbits - 1));
11286 maxext = (1 << (op->extbits - 1)) - 1;
11287 }
11288 if (val < minext || val > maxext)
11289 as_bad_where (file, line,
11290 _("operand value out of range for instruction"));
11291
11292 *use_extend = TRUE;
11293 if (op->extbits == 16)
11294 {
11295 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11296 val &= 0x1f;
11297 }
11298 else if (op->extbits == 15)
11299 {
11300 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11301 val &= 0xf;
11302 }
11303 else
11304 {
11305 extval = ((val & 0x1f) << 6) | (val & 0x20);
11306 val = 0;
11307 }
11308
11309 *extend = (unsigned short) extval;
11310 *insn |= val;
11311 }
11312 }
11313 \f
11314 struct percent_op_match
11315 {
11316 const char *str;
11317 bfd_reloc_code_real_type reloc;
11318 };
11319
11320 static const struct percent_op_match mips_percent_op[] =
11321 {
11322 {"%lo", BFD_RELOC_LO16},
11323 #ifdef OBJ_ELF
11324 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11325 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11326 {"%call16", BFD_RELOC_MIPS_CALL16},
11327 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11328 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11329 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11330 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11331 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11332 {"%got", BFD_RELOC_MIPS_GOT16},
11333 {"%gp_rel", BFD_RELOC_GPREL16},
11334 {"%half", BFD_RELOC_16},
11335 {"%highest", BFD_RELOC_MIPS_HIGHEST},
11336 {"%higher", BFD_RELOC_MIPS_HIGHER},
11337 {"%neg", BFD_RELOC_MIPS_SUB},
11338 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11339 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11340 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11341 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11342 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11343 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11344 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11345 #endif
11346 {"%hi", BFD_RELOC_HI16_S}
11347 };
11348
11349 static const struct percent_op_match mips16_percent_op[] =
11350 {
11351 {"%lo", BFD_RELOC_MIPS16_LO16},
11352 {"%gprel", BFD_RELOC_MIPS16_GPREL},
11353 {"%got", BFD_RELOC_MIPS16_GOT16},
11354 {"%call16", BFD_RELOC_MIPS16_CALL16},
11355 {"%hi", BFD_RELOC_MIPS16_HI16_S}
11356 };
11357
11358
11359 /* Return true if *STR points to a relocation operator. When returning true,
11360 move *STR over the operator and store its relocation code in *RELOC.
11361 Leave both *STR and *RELOC alone when returning false. */
11362
11363 static bfd_boolean
11364 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11365 {
11366 const struct percent_op_match *percent_op;
11367 size_t limit, i;
11368
11369 if (mips_opts.mips16)
11370 {
11371 percent_op = mips16_percent_op;
11372 limit = ARRAY_SIZE (mips16_percent_op);
11373 }
11374 else
11375 {
11376 percent_op = mips_percent_op;
11377 limit = ARRAY_SIZE (mips_percent_op);
11378 }
11379
11380 for (i = 0; i < limit; i++)
11381 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11382 {
11383 int len = strlen (percent_op[i].str);
11384
11385 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11386 continue;
11387
11388 *str += strlen (percent_op[i].str);
11389 *reloc = percent_op[i].reloc;
11390
11391 /* Check whether the output BFD supports this relocation.
11392 If not, issue an error and fall back on something safe. */
11393 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11394 {
11395 as_bad (_("relocation %s isn't supported by the current ABI"),
11396 percent_op[i].str);
11397 *reloc = BFD_RELOC_UNUSED;
11398 }
11399 return TRUE;
11400 }
11401 return FALSE;
11402 }
11403
11404
11405 /* Parse string STR as a 16-bit relocatable operand. Store the
11406 expression in *EP and the relocations in the array starting
11407 at RELOC. Return the number of relocation operators used.
11408
11409 On exit, EXPR_END points to the first character after the expression. */
11410
11411 static size_t
11412 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11413 char *str)
11414 {
11415 bfd_reloc_code_real_type reversed_reloc[3];
11416 size_t reloc_index, i;
11417 int crux_depth, str_depth;
11418 char *crux;
11419
11420 /* Search for the start of the main expression, recoding relocations
11421 in REVERSED_RELOC. End the loop with CRUX pointing to the start
11422 of the main expression and with CRUX_DEPTH containing the number
11423 of open brackets at that point. */
11424 reloc_index = -1;
11425 str_depth = 0;
11426 do
11427 {
11428 reloc_index++;
11429 crux = str;
11430 crux_depth = str_depth;
11431
11432 /* Skip over whitespace and brackets, keeping count of the number
11433 of brackets. */
11434 while (*str == ' ' || *str == '\t' || *str == '(')
11435 if (*str++ == '(')
11436 str_depth++;
11437 }
11438 while (*str == '%'
11439 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11440 && parse_relocation (&str, &reversed_reloc[reloc_index]));
11441
11442 my_getExpression (ep, crux);
11443 str = expr_end;
11444
11445 /* Match every open bracket. */
11446 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11447 if (*str++ == ')')
11448 crux_depth--;
11449
11450 if (crux_depth > 0)
11451 as_bad (_("unclosed '('"));
11452
11453 expr_end = str;
11454
11455 if (reloc_index != 0)
11456 {
11457 prev_reloc_op_frag = frag_now;
11458 for (i = 0; i < reloc_index; i++)
11459 reloc[i] = reversed_reloc[reloc_index - 1 - i];
11460 }
11461
11462 return reloc_index;
11463 }
11464
11465 static void
11466 my_getExpression (expressionS *ep, char *str)
11467 {
11468 char *save_in;
11469
11470 save_in = input_line_pointer;
11471 input_line_pointer = str;
11472 expression (ep);
11473 expr_end = input_line_pointer;
11474 input_line_pointer = save_in;
11475 }
11476
11477 char *
11478 md_atof (int type, char *litP, int *sizeP)
11479 {
11480 return ieee_md_atof (type, litP, sizeP, target_big_endian);
11481 }
11482
11483 void
11484 md_number_to_chars (char *buf, valueT val, int n)
11485 {
11486 if (target_big_endian)
11487 number_to_chars_bigendian (buf, val, n);
11488 else
11489 number_to_chars_littleendian (buf, val, n);
11490 }
11491 \f
11492 #ifdef OBJ_ELF
11493 static int support_64bit_objects(void)
11494 {
11495 const char **list, **l;
11496 int yes;
11497
11498 list = bfd_target_list ();
11499 for (l = list; *l != NULL; l++)
11500 if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11501 || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
11502 break;
11503 yes = (*l != NULL);
11504 free (list);
11505 return yes;
11506 }
11507 #endif /* OBJ_ELF */
11508
11509 const char *md_shortopts = "O::g::G:";
11510
11511 enum options
11512 {
11513 OPTION_MARCH = OPTION_MD_BASE,
11514 OPTION_MTUNE,
11515 OPTION_MIPS1,
11516 OPTION_MIPS2,
11517 OPTION_MIPS3,
11518 OPTION_MIPS4,
11519 OPTION_MIPS5,
11520 OPTION_MIPS32,
11521 OPTION_MIPS64,
11522 OPTION_MIPS32R2,
11523 OPTION_MIPS64R2,
11524 OPTION_MIPS16,
11525 OPTION_NO_MIPS16,
11526 OPTION_MIPS3D,
11527 OPTION_NO_MIPS3D,
11528 OPTION_MDMX,
11529 OPTION_NO_MDMX,
11530 OPTION_DSP,
11531 OPTION_NO_DSP,
11532 OPTION_MT,
11533 OPTION_NO_MT,
11534 OPTION_SMARTMIPS,
11535 OPTION_NO_SMARTMIPS,
11536 OPTION_DSPR2,
11537 OPTION_NO_DSPR2,
11538 OPTION_COMPAT_ARCH_BASE,
11539 OPTION_M4650,
11540 OPTION_NO_M4650,
11541 OPTION_M4010,
11542 OPTION_NO_M4010,
11543 OPTION_M4100,
11544 OPTION_NO_M4100,
11545 OPTION_M3900,
11546 OPTION_NO_M3900,
11547 OPTION_M7000_HILO_FIX,
11548 OPTION_MNO_7000_HILO_FIX,
11549 OPTION_FIX_24K,
11550 OPTION_NO_FIX_24K,
11551 OPTION_FIX_LOONGSON2F_JUMP,
11552 OPTION_NO_FIX_LOONGSON2F_JUMP,
11553 OPTION_FIX_LOONGSON2F_NOP,
11554 OPTION_NO_FIX_LOONGSON2F_NOP,
11555 OPTION_FIX_VR4120,
11556 OPTION_NO_FIX_VR4120,
11557 OPTION_FIX_VR4130,
11558 OPTION_NO_FIX_VR4130,
11559 OPTION_FIX_CN63XXP1,
11560 OPTION_NO_FIX_CN63XXP1,
11561 OPTION_TRAP,
11562 OPTION_BREAK,
11563 OPTION_EB,
11564 OPTION_EL,
11565 OPTION_FP32,
11566 OPTION_GP32,
11567 OPTION_CONSTRUCT_FLOATS,
11568 OPTION_NO_CONSTRUCT_FLOATS,
11569 OPTION_FP64,
11570 OPTION_GP64,
11571 OPTION_RELAX_BRANCH,
11572 OPTION_NO_RELAX_BRANCH,
11573 OPTION_MSHARED,
11574 OPTION_MNO_SHARED,
11575 OPTION_MSYM32,
11576 OPTION_MNO_SYM32,
11577 OPTION_SOFT_FLOAT,
11578 OPTION_HARD_FLOAT,
11579 OPTION_SINGLE_FLOAT,
11580 OPTION_DOUBLE_FLOAT,
11581 OPTION_32,
11582 #ifdef OBJ_ELF
11583 OPTION_CALL_SHARED,
11584 OPTION_CALL_NONPIC,
11585 OPTION_NON_SHARED,
11586 OPTION_XGOT,
11587 OPTION_MABI,
11588 OPTION_N32,
11589 OPTION_64,
11590 OPTION_MDEBUG,
11591 OPTION_NO_MDEBUG,
11592 OPTION_PDR,
11593 OPTION_NO_PDR,
11594 OPTION_MVXWORKS_PIC,
11595 #endif /* OBJ_ELF */
11596 OPTION_END_OF_ENUM
11597 };
11598
11599 struct option md_longopts[] =
11600 {
11601 /* Options which specify architecture. */
11602 {"march", required_argument, NULL, OPTION_MARCH},
11603 {"mtune", required_argument, NULL, OPTION_MTUNE},
11604 {"mips0", no_argument, NULL, OPTION_MIPS1},
11605 {"mips1", no_argument, NULL, OPTION_MIPS1},
11606 {"mips2", no_argument, NULL, OPTION_MIPS2},
11607 {"mips3", no_argument, NULL, OPTION_MIPS3},
11608 {"mips4", no_argument, NULL, OPTION_MIPS4},
11609 {"mips5", no_argument, NULL, OPTION_MIPS5},
11610 {"mips32", no_argument, NULL, OPTION_MIPS32},
11611 {"mips64", no_argument, NULL, OPTION_MIPS64},
11612 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11613 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11614
11615 /* Options which specify Application Specific Extensions (ASEs). */
11616 {"mips16", no_argument, NULL, OPTION_MIPS16},
11617 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11618 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11619 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11620 {"mdmx", no_argument, NULL, OPTION_MDMX},
11621 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11622 {"mdsp", no_argument, NULL, OPTION_DSP},
11623 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11624 {"mmt", no_argument, NULL, OPTION_MT},
11625 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11626 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11627 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11628 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11629 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11630
11631 /* Old-style architecture options. Don't add more of these. */
11632 {"m4650", no_argument, NULL, OPTION_M4650},
11633 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11634 {"m4010", no_argument, NULL, OPTION_M4010},
11635 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11636 {"m4100", no_argument, NULL, OPTION_M4100},
11637 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11638 {"m3900", no_argument, NULL, OPTION_M3900},
11639 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11640
11641 /* Options which enable bug fixes. */
11642 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11643 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11644 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11645 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11646 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11647 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11648 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11649 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11650 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11651 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11652 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11653 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
11654 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11655 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11656 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11657
11658 /* Miscellaneous options. */
11659 {"trap", no_argument, NULL, OPTION_TRAP},
11660 {"no-break", no_argument, NULL, OPTION_TRAP},
11661 {"break", no_argument, NULL, OPTION_BREAK},
11662 {"no-trap", no_argument, NULL, OPTION_BREAK},
11663 {"EB", no_argument, NULL, OPTION_EB},
11664 {"EL", no_argument, NULL, OPTION_EL},
11665 {"mfp32", no_argument, NULL, OPTION_FP32},
11666 {"mgp32", no_argument, NULL, OPTION_GP32},
11667 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11668 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11669 {"mfp64", no_argument, NULL, OPTION_FP64},
11670 {"mgp64", no_argument, NULL, OPTION_GP64},
11671 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11672 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11673 {"mshared", no_argument, NULL, OPTION_MSHARED},
11674 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11675 {"msym32", no_argument, NULL, OPTION_MSYM32},
11676 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11677 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11678 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11679 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11680 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11681
11682 /* Strictly speaking this next option is ELF specific,
11683 but we allow it for other ports as well in order to
11684 make testing easier. */
11685 {"32", no_argument, NULL, OPTION_32},
11686
11687 /* ELF-specific options. */
11688 #ifdef OBJ_ELF
11689 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11690 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11691 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11692 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
11693 {"xgot", no_argument, NULL, OPTION_XGOT},
11694 {"mabi", required_argument, NULL, OPTION_MABI},
11695 {"n32", no_argument, NULL, OPTION_N32},
11696 {"64", no_argument, NULL, OPTION_64},
11697 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11698 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11699 {"mpdr", no_argument, NULL, OPTION_PDR},
11700 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11701 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11702 #endif /* OBJ_ELF */
11703
11704 {NULL, no_argument, NULL, 0}
11705 };
11706 size_t md_longopts_size = sizeof (md_longopts);
11707
11708 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11709 NEW_VALUE. Warn if another value was already specified. Note:
11710 we have to defer parsing the -march and -mtune arguments in order
11711 to handle 'from-abi' correctly, since the ABI might be specified
11712 in a later argument. */
11713
11714 static void
11715 mips_set_option_string (const char **string_ptr, const char *new_value)
11716 {
11717 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11718 as_warn (_("A different %s was already specified, is now %s"),
11719 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11720 new_value);
11721
11722 *string_ptr = new_value;
11723 }
11724
11725 int
11726 md_parse_option (int c, char *arg)
11727 {
11728 switch (c)
11729 {
11730 case OPTION_CONSTRUCT_FLOATS:
11731 mips_disable_float_construction = 0;
11732 break;
11733
11734 case OPTION_NO_CONSTRUCT_FLOATS:
11735 mips_disable_float_construction = 1;
11736 break;
11737
11738 case OPTION_TRAP:
11739 mips_trap = 1;
11740 break;
11741
11742 case OPTION_BREAK:
11743 mips_trap = 0;
11744 break;
11745
11746 case OPTION_EB:
11747 target_big_endian = 1;
11748 break;
11749
11750 case OPTION_EL:
11751 target_big_endian = 0;
11752 break;
11753
11754 case 'O':
11755 if (arg == NULL)
11756 mips_optimize = 1;
11757 else if (arg[0] == '0')
11758 mips_optimize = 0;
11759 else if (arg[0] == '1')
11760 mips_optimize = 1;
11761 else
11762 mips_optimize = 2;
11763 break;
11764
11765 case 'g':
11766 if (arg == NULL)
11767 mips_debug = 2;
11768 else
11769 mips_debug = atoi (arg);
11770 break;
11771
11772 case OPTION_MIPS1:
11773 file_mips_isa = ISA_MIPS1;
11774 break;
11775
11776 case OPTION_MIPS2:
11777 file_mips_isa = ISA_MIPS2;
11778 break;
11779
11780 case OPTION_MIPS3:
11781 file_mips_isa = ISA_MIPS3;
11782 break;
11783
11784 case OPTION_MIPS4:
11785 file_mips_isa = ISA_MIPS4;
11786 break;
11787
11788 case OPTION_MIPS5:
11789 file_mips_isa = ISA_MIPS5;
11790 break;
11791
11792 case OPTION_MIPS32:
11793 file_mips_isa = ISA_MIPS32;
11794 break;
11795
11796 case OPTION_MIPS32R2:
11797 file_mips_isa = ISA_MIPS32R2;
11798 break;
11799
11800 case OPTION_MIPS64R2:
11801 file_mips_isa = ISA_MIPS64R2;
11802 break;
11803
11804 case OPTION_MIPS64:
11805 file_mips_isa = ISA_MIPS64;
11806 break;
11807
11808 case OPTION_MTUNE:
11809 mips_set_option_string (&mips_tune_string, arg);
11810 break;
11811
11812 case OPTION_MARCH:
11813 mips_set_option_string (&mips_arch_string, arg);
11814 break;
11815
11816 case OPTION_M4650:
11817 mips_set_option_string (&mips_arch_string, "4650");
11818 mips_set_option_string (&mips_tune_string, "4650");
11819 break;
11820
11821 case OPTION_NO_M4650:
11822 break;
11823
11824 case OPTION_M4010:
11825 mips_set_option_string (&mips_arch_string, "4010");
11826 mips_set_option_string (&mips_tune_string, "4010");
11827 break;
11828
11829 case OPTION_NO_M4010:
11830 break;
11831
11832 case OPTION_M4100:
11833 mips_set_option_string (&mips_arch_string, "4100");
11834 mips_set_option_string (&mips_tune_string, "4100");
11835 break;
11836
11837 case OPTION_NO_M4100:
11838 break;
11839
11840 case OPTION_M3900:
11841 mips_set_option_string (&mips_arch_string, "3900");
11842 mips_set_option_string (&mips_tune_string, "3900");
11843 break;
11844
11845 case OPTION_NO_M3900:
11846 break;
11847
11848 case OPTION_MDMX:
11849 mips_opts.ase_mdmx = 1;
11850 break;
11851
11852 case OPTION_NO_MDMX:
11853 mips_opts.ase_mdmx = 0;
11854 break;
11855
11856 case OPTION_DSP:
11857 mips_opts.ase_dsp = 1;
11858 mips_opts.ase_dspr2 = 0;
11859 break;
11860
11861 case OPTION_NO_DSP:
11862 mips_opts.ase_dsp = 0;
11863 mips_opts.ase_dspr2 = 0;
11864 break;
11865
11866 case OPTION_DSPR2:
11867 mips_opts.ase_dspr2 = 1;
11868 mips_opts.ase_dsp = 1;
11869 break;
11870
11871 case OPTION_NO_DSPR2:
11872 mips_opts.ase_dspr2 = 0;
11873 mips_opts.ase_dsp = 0;
11874 break;
11875
11876 case OPTION_MT:
11877 mips_opts.ase_mt = 1;
11878 break;
11879
11880 case OPTION_NO_MT:
11881 mips_opts.ase_mt = 0;
11882 break;
11883
11884 case OPTION_MIPS16:
11885 mips_opts.mips16 = 1;
11886 mips_no_prev_insn ();
11887 break;
11888
11889 case OPTION_NO_MIPS16:
11890 mips_opts.mips16 = 0;
11891 mips_no_prev_insn ();
11892 break;
11893
11894 case OPTION_MIPS3D:
11895 mips_opts.ase_mips3d = 1;
11896 break;
11897
11898 case OPTION_NO_MIPS3D:
11899 mips_opts.ase_mips3d = 0;
11900 break;
11901
11902 case OPTION_SMARTMIPS:
11903 mips_opts.ase_smartmips = 1;
11904 break;
11905
11906 case OPTION_NO_SMARTMIPS:
11907 mips_opts.ase_smartmips = 0;
11908 break;
11909
11910 case OPTION_FIX_24K:
11911 mips_fix_24k = 1;
11912 break;
11913
11914 case OPTION_NO_FIX_24K:
11915 mips_fix_24k = 0;
11916 break;
11917
11918 case OPTION_FIX_LOONGSON2F_JUMP:
11919 mips_fix_loongson2f_jump = TRUE;
11920 break;
11921
11922 case OPTION_NO_FIX_LOONGSON2F_JUMP:
11923 mips_fix_loongson2f_jump = FALSE;
11924 break;
11925
11926 case OPTION_FIX_LOONGSON2F_NOP:
11927 mips_fix_loongson2f_nop = TRUE;
11928 break;
11929
11930 case OPTION_NO_FIX_LOONGSON2F_NOP:
11931 mips_fix_loongson2f_nop = FALSE;
11932 break;
11933
11934 case OPTION_FIX_VR4120:
11935 mips_fix_vr4120 = 1;
11936 break;
11937
11938 case OPTION_NO_FIX_VR4120:
11939 mips_fix_vr4120 = 0;
11940 break;
11941
11942 case OPTION_FIX_VR4130:
11943 mips_fix_vr4130 = 1;
11944 break;
11945
11946 case OPTION_NO_FIX_VR4130:
11947 mips_fix_vr4130 = 0;
11948 break;
11949
11950 case OPTION_FIX_CN63XXP1:
11951 mips_fix_cn63xxp1 = TRUE;
11952 break;
11953
11954 case OPTION_NO_FIX_CN63XXP1:
11955 mips_fix_cn63xxp1 = FALSE;
11956 break;
11957
11958 case OPTION_RELAX_BRANCH:
11959 mips_relax_branch = 1;
11960 break;
11961
11962 case OPTION_NO_RELAX_BRANCH:
11963 mips_relax_branch = 0;
11964 break;
11965
11966 case OPTION_MSHARED:
11967 mips_in_shared = TRUE;
11968 break;
11969
11970 case OPTION_MNO_SHARED:
11971 mips_in_shared = FALSE;
11972 break;
11973
11974 case OPTION_MSYM32:
11975 mips_opts.sym32 = TRUE;
11976 break;
11977
11978 case OPTION_MNO_SYM32:
11979 mips_opts.sym32 = FALSE;
11980 break;
11981
11982 #ifdef OBJ_ELF
11983 /* When generating ELF code, we permit -KPIC and -call_shared to
11984 select SVR4_PIC, and -non_shared to select no PIC. This is
11985 intended to be compatible with Irix 5. */
11986 case OPTION_CALL_SHARED:
11987 if (!IS_ELF)
11988 {
11989 as_bad (_("-call_shared is supported only for ELF format"));
11990 return 0;
11991 }
11992 mips_pic = SVR4_PIC;
11993 mips_abicalls = TRUE;
11994 break;
11995
11996 case OPTION_CALL_NONPIC:
11997 if (!IS_ELF)
11998 {
11999 as_bad (_("-call_nonpic is supported only for ELF format"));
12000 return 0;
12001 }
12002 mips_pic = NO_PIC;
12003 mips_abicalls = TRUE;
12004 break;
12005
12006 case OPTION_NON_SHARED:
12007 if (!IS_ELF)
12008 {
12009 as_bad (_("-non_shared is supported only for ELF format"));
12010 return 0;
12011 }
12012 mips_pic = NO_PIC;
12013 mips_abicalls = FALSE;
12014 break;
12015
12016 /* The -xgot option tells the assembler to use 32 bit offsets
12017 when accessing the got in SVR4_PIC mode. It is for Irix
12018 compatibility. */
12019 case OPTION_XGOT:
12020 mips_big_got = 1;
12021 break;
12022 #endif /* OBJ_ELF */
12023
12024 case 'G':
12025 g_switch_value = atoi (arg);
12026 g_switch_seen = 1;
12027 break;
12028
12029 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
12030 and -mabi=64. */
12031 case OPTION_32:
12032 if (IS_ELF)
12033 mips_abi = O32_ABI;
12034 /* We silently ignore -32 for non-ELF targets. This greatly
12035 simplifies the construction of the MIPS GAS test cases. */
12036 break;
12037
12038 #ifdef OBJ_ELF
12039 case OPTION_N32:
12040 if (!IS_ELF)
12041 {
12042 as_bad (_("-n32 is supported for ELF format only"));
12043 return 0;
12044 }
12045 mips_abi = N32_ABI;
12046 break;
12047
12048 case OPTION_64:
12049 if (!IS_ELF)
12050 {
12051 as_bad (_("-64 is supported for ELF format only"));
12052 return 0;
12053 }
12054 mips_abi = N64_ABI;
12055 if (!support_64bit_objects())
12056 as_fatal (_("No compiled in support for 64 bit object file format"));
12057 break;
12058 #endif /* OBJ_ELF */
12059
12060 case OPTION_GP32:
12061 file_mips_gp32 = 1;
12062 break;
12063
12064 case OPTION_GP64:
12065 file_mips_gp32 = 0;
12066 break;
12067
12068 case OPTION_FP32:
12069 file_mips_fp32 = 1;
12070 break;
12071
12072 case OPTION_FP64:
12073 file_mips_fp32 = 0;
12074 break;
12075
12076 case OPTION_SINGLE_FLOAT:
12077 file_mips_single_float = 1;
12078 break;
12079
12080 case OPTION_DOUBLE_FLOAT:
12081 file_mips_single_float = 0;
12082 break;
12083
12084 case OPTION_SOFT_FLOAT:
12085 file_mips_soft_float = 1;
12086 break;
12087
12088 case OPTION_HARD_FLOAT:
12089 file_mips_soft_float = 0;
12090 break;
12091
12092 #ifdef OBJ_ELF
12093 case OPTION_MABI:
12094 if (!IS_ELF)
12095 {
12096 as_bad (_("-mabi is supported for ELF format only"));
12097 return 0;
12098 }
12099 if (strcmp (arg, "32") == 0)
12100 mips_abi = O32_ABI;
12101 else if (strcmp (arg, "o64") == 0)
12102 mips_abi = O64_ABI;
12103 else if (strcmp (arg, "n32") == 0)
12104 mips_abi = N32_ABI;
12105 else if (strcmp (arg, "64") == 0)
12106 {
12107 mips_abi = N64_ABI;
12108 if (! support_64bit_objects())
12109 as_fatal (_("No compiled in support for 64 bit object file "
12110 "format"));
12111 }
12112 else if (strcmp (arg, "eabi") == 0)
12113 mips_abi = EABI_ABI;
12114 else
12115 {
12116 as_fatal (_("invalid abi -mabi=%s"), arg);
12117 return 0;
12118 }
12119 break;
12120 #endif /* OBJ_ELF */
12121
12122 case OPTION_M7000_HILO_FIX:
12123 mips_7000_hilo_fix = TRUE;
12124 break;
12125
12126 case OPTION_MNO_7000_HILO_FIX:
12127 mips_7000_hilo_fix = FALSE;
12128 break;
12129
12130 #ifdef OBJ_ELF
12131 case OPTION_MDEBUG:
12132 mips_flag_mdebug = TRUE;
12133 break;
12134
12135 case OPTION_NO_MDEBUG:
12136 mips_flag_mdebug = FALSE;
12137 break;
12138
12139 case OPTION_PDR:
12140 mips_flag_pdr = TRUE;
12141 break;
12142
12143 case OPTION_NO_PDR:
12144 mips_flag_pdr = FALSE;
12145 break;
12146
12147 case OPTION_MVXWORKS_PIC:
12148 mips_pic = VXWORKS_PIC;
12149 break;
12150 #endif /* OBJ_ELF */
12151
12152 default:
12153 return 0;
12154 }
12155
12156 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
12157
12158 return 1;
12159 }
12160 \f
12161 /* Set up globals to generate code for the ISA or processor
12162 described by INFO. */
12163
12164 static void
12165 mips_set_architecture (const struct mips_cpu_info *info)
12166 {
12167 if (info != 0)
12168 {
12169 file_mips_arch = info->cpu;
12170 mips_opts.arch = info->cpu;
12171 mips_opts.isa = info->isa;
12172 }
12173 }
12174
12175
12176 /* Likewise for tuning. */
12177
12178 static void
12179 mips_set_tune (const struct mips_cpu_info *info)
12180 {
12181 if (info != 0)
12182 mips_tune = info->cpu;
12183 }
12184
12185
12186 void
12187 mips_after_parse_args (void)
12188 {
12189 const struct mips_cpu_info *arch_info = 0;
12190 const struct mips_cpu_info *tune_info = 0;
12191
12192 /* GP relative stuff not working for PE */
12193 if (strncmp (TARGET_OS, "pe", 2) == 0)
12194 {
12195 if (g_switch_seen && g_switch_value != 0)
12196 as_bad (_("-G not supported in this configuration."));
12197 g_switch_value = 0;
12198 }
12199
12200 if (mips_abi == NO_ABI)
12201 mips_abi = MIPS_DEFAULT_ABI;
12202
12203 /* The following code determines the architecture and register size.
12204 Similar code was added to GCC 3.3 (see override_options() in
12205 config/mips/mips.c). The GAS and GCC code should be kept in sync
12206 as much as possible. */
12207
12208 if (mips_arch_string != 0)
12209 arch_info = mips_parse_cpu ("-march", mips_arch_string);
12210
12211 if (file_mips_isa != ISA_UNKNOWN)
12212 {
12213 /* Handle -mipsN. At this point, file_mips_isa contains the
12214 ISA level specified by -mipsN, while arch_info->isa contains
12215 the -march selection (if any). */
12216 if (arch_info != 0)
12217 {
12218 /* -march takes precedence over -mipsN, since it is more descriptive.
12219 There's no harm in specifying both as long as the ISA levels
12220 are the same. */
12221 if (file_mips_isa != arch_info->isa)
12222 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
12223 mips_cpu_info_from_isa (file_mips_isa)->name,
12224 mips_cpu_info_from_isa (arch_info->isa)->name);
12225 }
12226 else
12227 arch_info = mips_cpu_info_from_isa (file_mips_isa);
12228 }
12229
12230 if (arch_info == 0)
12231 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
12232
12233 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
12234 as_bad (_("-march=%s is not compatible with the selected ABI"),
12235 arch_info->name);
12236
12237 mips_set_architecture (arch_info);
12238
12239 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
12240 if (mips_tune_string != 0)
12241 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
12242
12243 if (tune_info == 0)
12244 mips_set_tune (arch_info);
12245 else
12246 mips_set_tune (tune_info);
12247
12248 if (file_mips_gp32 >= 0)
12249 {
12250 /* The user specified the size of the integer registers. Make sure
12251 it agrees with the ABI and ISA. */
12252 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12253 as_bad (_("-mgp64 used with a 32-bit processor"));
12254 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12255 as_bad (_("-mgp32 used with a 64-bit ABI"));
12256 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12257 as_bad (_("-mgp64 used with a 32-bit ABI"));
12258 }
12259 else
12260 {
12261 /* Infer the integer register size from the ABI and processor.
12262 Restrict ourselves to 32-bit registers if that's all the
12263 processor has, or if the ABI cannot handle 64-bit registers. */
12264 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12265 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12266 }
12267
12268 switch (file_mips_fp32)
12269 {
12270 default:
12271 case -1:
12272 /* No user specified float register size.
12273 ??? GAS treats single-float processors as though they had 64-bit
12274 float registers (although it complains when double-precision
12275 instructions are used). As things stand, saying they have 32-bit
12276 registers would lead to spurious "register must be even" messages.
12277 So here we assume float registers are never smaller than the
12278 integer ones. */
12279 if (file_mips_gp32 == 0)
12280 /* 64-bit integer registers implies 64-bit float registers. */
12281 file_mips_fp32 = 0;
12282 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12283 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12284 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
12285 file_mips_fp32 = 0;
12286 else
12287 /* 32-bit float registers. */
12288 file_mips_fp32 = 1;
12289 break;
12290
12291 /* The user specified the size of the float registers. Check if it
12292 agrees with the ABI and ISA. */
12293 case 0:
12294 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12295 as_bad (_("-mfp64 used with a 32-bit fpu"));
12296 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12297 && !ISA_HAS_MXHC1 (mips_opts.isa))
12298 as_warn (_("-mfp64 used with a 32-bit ABI"));
12299 break;
12300 case 1:
12301 if (ABI_NEEDS_64BIT_REGS (mips_abi))
12302 as_warn (_("-mfp32 used with a 64-bit ABI"));
12303 break;
12304 }
12305
12306 /* End of GCC-shared inference code. */
12307
12308 /* This flag is set when we have a 64-bit capable CPU but use only
12309 32-bit wide registers. Note that EABI does not use it. */
12310 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12311 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12312 || mips_abi == O32_ABI))
12313 mips_32bitmode = 1;
12314
12315 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12316 as_bad (_("trap exception not supported at ISA 1"));
12317
12318 /* If the selected architecture includes support for ASEs, enable
12319 generation of code for them. */
12320 if (mips_opts.mips16 == -1)
12321 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12322 if (mips_opts.ase_mips3d == -1)
12323 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12324 && file_mips_fp32 == 0) ? 1 : 0;
12325 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12326 as_bad (_("-mfp32 used with -mips3d"));
12327
12328 if (mips_opts.ase_mdmx == -1)
12329 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12330 && file_mips_fp32 == 0) ? 1 : 0;
12331 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12332 as_bad (_("-mfp32 used with -mdmx"));
12333
12334 if (mips_opts.ase_smartmips == -1)
12335 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12336 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12337 as_warn (_("%s ISA does not support SmartMIPS"),
12338 mips_cpu_info_from_isa (mips_opts.isa)->name);
12339
12340 if (mips_opts.ase_dsp == -1)
12341 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12342 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12343 as_warn (_("%s ISA does not support DSP ASE"),
12344 mips_cpu_info_from_isa (mips_opts.isa)->name);
12345
12346 if (mips_opts.ase_dspr2 == -1)
12347 {
12348 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12349 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12350 }
12351 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12352 as_warn (_("%s ISA does not support DSP R2 ASE"),
12353 mips_cpu_info_from_isa (mips_opts.isa)->name);
12354
12355 if (mips_opts.ase_mt == -1)
12356 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12357 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12358 as_warn (_("%s ISA does not support MT ASE"),
12359 mips_cpu_info_from_isa (mips_opts.isa)->name);
12360
12361 file_mips_isa = mips_opts.isa;
12362 file_ase_mips3d = mips_opts.ase_mips3d;
12363 file_ase_mdmx = mips_opts.ase_mdmx;
12364 file_ase_smartmips = mips_opts.ase_smartmips;
12365 file_ase_dsp = mips_opts.ase_dsp;
12366 file_ase_dspr2 = mips_opts.ase_dspr2;
12367 file_ase_mt = mips_opts.ase_mt;
12368 mips_opts.gp32 = file_mips_gp32;
12369 mips_opts.fp32 = file_mips_fp32;
12370 mips_opts.soft_float = file_mips_soft_float;
12371 mips_opts.single_float = file_mips_single_float;
12372
12373 if (mips_flag_mdebug < 0)
12374 {
12375 #ifdef OBJ_MAYBE_ECOFF
12376 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12377 mips_flag_mdebug = 1;
12378 else
12379 #endif /* OBJ_MAYBE_ECOFF */
12380 mips_flag_mdebug = 0;
12381 }
12382 }
12383 \f
12384 void
12385 mips_init_after_args (void)
12386 {
12387 /* initialize opcodes */
12388 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12389 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12390 }
12391
12392 long
12393 md_pcrel_from (fixS *fixP)
12394 {
12395 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12396 switch (fixP->fx_r_type)
12397 {
12398 case BFD_RELOC_16_PCREL_S2:
12399 case BFD_RELOC_MIPS_JMP:
12400 /* Return the address of the delay slot. */
12401 return addr + 4;
12402 default:
12403 /* We have no relocation type for PC relative MIPS16 instructions. */
12404 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12405 as_bad_where (fixP->fx_file, fixP->fx_line,
12406 _("PC relative MIPS16 instruction references a different section"));
12407 return addr;
12408 }
12409 }
12410
12411 /* This is called before the symbol table is processed. In order to
12412 work with gcc when using mips-tfile, we must keep all local labels.
12413 However, in other cases, we want to discard them. If we were
12414 called with -g, but we didn't see any debugging information, it may
12415 mean that gcc is smuggling debugging information through to
12416 mips-tfile, in which case we must generate all local labels. */
12417
12418 void
12419 mips_frob_file_before_adjust (void)
12420 {
12421 #ifndef NO_ECOFF_DEBUGGING
12422 if (ECOFF_DEBUGGING
12423 && mips_debug != 0
12424 && ! ecoff_debugging_seen)
12425 flag_keep_locals = 1;
12426 #endif
12427 }
12428
12429 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12430 the corresponding LO16 reloc. This is called before md_apply_fix and
12431 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
12432 relocation operators.
12433
12434 For our purposes, a %lo() expression matches a %got() or %hi()
12435 expression if:
12436
12437 (a) it refers to the same symbol; and
12438 (b) the offset applied in the %lo() expression is no lower than
12439 the offset applied in the %got() or %hi().
12440
12441 (b) allows us to cope with code like:
12442
12443 lui $4,%hi(foo)
12444 lh $4,%lo(foo+2)($4)
12445
12446 ...which is legal on RELA targets, and has a well-defined behaviour
12447 if the user knows that adding 2 to "foo" will not induce a carry to
12448 the high 16 bits.
12449
12450 When several %lo()s match a particular %got() or %hi(), we use the
12451 following rules to distinguish them:
12452
12453 (1) %lo()s with smaller offsets are a better match than %lo()s with
12454 higher offsets.
12455
12456 (2) %lo()s with no matching %got() or %hi() are better than those
12457 that already have a matching %got() or %hi().
12458
12459 (3) later %lo()s are better than earlier %lo()s.
12460
12461 These rules are applied in order.
12462
12463 (1) means, among other things, that %lo()s with identical offsets are
12464 chosen if they exist.
12465
12466 (2) means that we won't associate several high-part relocations with
12467 the same low-part relocation unless there's no alternative. Having
12468 several high parts for the same low part is a GNU extension; this rule
12469 allows careful users to avoid it.
12470
12471 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
12472 with the last high-part relocation being at the front of the list.
12473 It therefore makes sense to choose the last matching low-part
12474 relocation, all other things being equal. It's also easier
12475 to code that way. */
12476
12477 void
12478 mips_frob_file (void)
12479 {
12480 struct mips_hi_fixup *l;
12481 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12482
12483 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12484 {
12485 segment_info_type *seginfo;
12486 bfd_boolean matched_lo_p;
12487 fixS **hi_pos, **lo_pos, **pos;
12488
12489 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12490
12491 /* If a GOT16 relocation turns out to be against a global symbol,
12492 there isn't supposed to be a matching LO. */
12493 if (got16_reloc_p (l->fixp->fx_r_type)
12494 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12495 continue;
12496
12497 /* Check quickly whether the next fixup happens to be a matching %lo. */
12498 if (fixup_has_matching_lo_p (l->fixp))
12499 continue;
12500
12501 seginfo = seg_info (l->seg);
12502
12503 /* Set HI_POS to the position of this relocation in the chain.
12504 Set LO_POS to the position of the chosen low-part relocation.
12505 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12506 relocation that matches an immediately-preceding high-part
12507 relocation. */
12508 hi_pos = NULL;
12509 lo_pos = NULL;
12510 matched_lo_p = FALSE;
12511 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12512
12513 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12514 {
12515 if (*pos == l->fixp)
12516 hi_pos = pos;
12517
12518 if ((*pos)->fx_r_type == looking_for_rtype
12519 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12520 && (*pos)->fx_offset >= l->fixp->fx_offset
12521 && (lo_pos == NULL
12522 || (*pos)->fx_offset < (*lo_pos)->fx_offset
12523 || (!matched_lo_p
12524 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12525 lo_pos = pos;
12526
12527 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12528 && fixup_has_matching_lo_p (*pos));
12529 }
12530
12531 /* If we found a match, remove the high-part relocation from its
12532 current position and insert it before the low-part relocation.
12533 Make the offsets match so that fixup_has_matching_lo_p()
12534 will return true.
12535
12536 We don't warn about unmatched high-part relocations since some
12537 versions of gcc have been known to emit dead "lui ...%hi(...)"
12538 instructions. */
12539 if (lo_pos != NULL)
12540 {
12541 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12542 if (l->fixp->fx_next != *lo_pos)
12543 {
12544 *hi_pos = l->fixp->fx_next;
12545 l->fixp->fx_next = *lo_pos;
12546 *lo_pos = l->fixp;
12547 }
12548 }
12549 }
12550 }
12551
12552 /* We may have combined relocations without symbols in the N32/N64 ABI.
12553 We have to prevent gas from dropping them. */
12554
12555 int
12556 mips_force_relocation (fixS *fixp)
12557 {
12558 if (generic_force_reloc (fixp))
12559 return 1;
12560
12561 if (HAVE_NEWABI
12562 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12563 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12564 || hi16_reloc_p (fixp->fx_r_type)
12565 || lo16_reloc_p (fixp->fx_r_type)))
12566 return 1;
12567
12568 return 0;
12569 }
12570
12571 /* Apply a fixup to the object file. */
12572
12573 void
12574 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12575 {
12576 bfd_byte *buf;
12577 long insn;
12578 reloc_howto_type *howto;
12579
12580 /* We ignore generic BFD relocations we don't know about. */
12581 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12582 if (! howto)
12583 return;
12584
12585 gas_assert (fixP->fx_size == 4
12586 || fixP->fx_r_type == BFD_RELOC_16
12587 || fixP->fx_r_type == BFD_RELOC_64
12588 || fixP->fx_r_type == BFD_RELOC_CTOR
12589 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12590 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12591 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12592 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12593
12594 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12595
12596 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12597
12598 /* Don't treat parts of a composite relocation as done. There are two
12599 reasons for this:
12600
12601 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12602 should nevertheless be emitted if the first part is.
12603
12604 (2) In normal usage, composite relocations are never assembly-time
12605 constants. The easiest way of dealing with the pathological
12606 exceptions is to generate a relocation against STN_UNDEF and
12607 leave everything up to the linker. */
12608 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12609 fixP->fx_done = 1;
12610
12611 switch (fixP->fx_r_type)
12612 {
12613 case BFD_RELOC_MIPS_TLS_GD:
12614 case BFD_RELOC_MIPS_TLS_LDM:
12615 case BFD_RELOC_MIPS_TLS_DTPREL32:
12616 case BFD_RELOC_MIPS_TLS_DTPREL64:
12617 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12618 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12619 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12620 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12621 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12622 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12623 /* fall through */
12624
12625 case BFD_RELOC_MIPS_JMP:
12626 case BFD_RELOC_MIPS_SHIFT5:
12627 case BFD_RELOC_MIPS_SHIFT6:
12628 case BFD_RELOC_MIPS_GOT_DISP:
12629 case BFD_RELOC_MIPS_GOT_PAGE:
12630 case BFD_RELOC_MIPS_GOT_OFST:
12631 case BFD_RELOC_MIPS_SUB:
12632 case BFD_RELOC_MIPS_INSERT_A:
12633 case BFD_RELOC_MIPS_INSERT_B:
12634 case BFD_RELOC_MIPS_DELETE:
12635 case BFD_RELOC_MIPS_HIGHEST:
12636 case BFD_RELOC_MIPS_HIGHER:
12637 case BFD_RELOC_MIPS_SCN_DISP:
12638 case BFD_RELOC_MIPS_REL16:
12639 case BFD_RELOC_MIPS_RELGOT:
12640 case BFD_RELOC_MIPS_JALR:
12641 case BFD_RELOC_HI16:
12642 case BFD_RELOC_HI16_S:
12643 case BFD_RELOC_GPREL16:
12644 case BFD_RELOC_MIPS_LITERAL:
12645 case BFD_RELOC_MIPS_CALL16:
12646 case BFD_RELOC_MIPS_GOT16:
12647 case BFD_RELOC_GPREL32:
12648 case BFD_RELOC_MIPS_GOT_HI16:
12649 case BFD_RELOC_MIPS_GOT_LO16:
12650 case BFD_RELOC_MIPS_CALL_HI16:
12651 case BFD_RELOC_MIPS_CALL_LO16:
12652 case BFD_RELOC_MIPS16_GPREL:
12653 case BFD_RELOC_MIPS16_GOT16:
12654 case BFD_RELOC_MIPS16_CALL16:
12655 case BFD_RELOC_MIPS16_HI16:
12656 case BFD_RELOC_MIPS16_HI16_S:
12657 case BFD_RELOC_MIPS16_JMP:
12658 /* Nothing needed to do. The value comes from the reloc entry. */
12659 break;
12660
12661 case BFD_RELOC_64:
12662 /* This is handled like BFD_RELOC_32, but we output a sign
12663 extended value if we are only 32 bits. */
12664 if (fixP->fx_done)
12665 {
12666 if (8 <= sizeof (valueT))
12667 md_number_to_chars ((char *) buf, *valP, 8);
12668 else
12669 {
12670 valueT hiv;
12671
12672 if ((*valP & 0x80000000) != 0)
12673 hiv = 0xffffffff;
12674 else
12675 hiv = 0;
12676 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12677 *valP, 4);
12678 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12679 hiv, 4);
12680 }
12681 }
12682 break;
12683
12684 case BFD_RELOC_RVA:
12685 case BFD_RELOC_32:
12686 case BFD_RELOC_16:
12687 /* If we are deleting this reloc entry, we must fill in the
12688 value now. This can happen if we have a .word which is not
12689 resolved when it appears but is later defined. */
12690 if (fixP->fx_done)
12691 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12692 break;
12693
12694 case BFD_RELOC_LO16:
12695 case BFD_RELOC_MIPS16_LO16:
12696 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12697 may be safe to remove, but if so it's not obvious. */
12698 /* When handling an embedded PIC switch statement, we can wind
12699 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12700 if (fixP->fx_done)
12701 {
12702 if (*valP + 0x8000 > 0xffff)
12703 as_bad_where (fixP->fx_file, fixP->fx_line,
12704 _("relocation overflow"));
12705 if (target_big_endian)
12706 buf += 2;
12707 md_number_to_chars ((char *) buf, *valP, 2);
12708 }
12709 break;
12710
12711 case BFD_RELOC_16_PCREL_S2:
12712 if ((*valP & 0x3) != 0)
12713 as_bad_where (fixP->fx_file, fixP->fx_line,
12714 _("Branch to misaligned address (%lx)"), (long) *valP);
12715
12716 /* We need to save the bits in the instruction since fixup_segment()
12717 might be deleting the relocation entry (i.e., a branch within
12718 the current segment). */
12719 if (! fixP->fx_done)
12720 break;
12721
12722 /* Update old instruction data. */
12723 if (target_big_endian)
12724 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12725 else
12726 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12727
12728 if (*valP + 0x20000 <= 0x3ffff)
12729 {
12730 insn |= (*valP >> 2) & 0xffff;
12731 md_number_to_chars ((char *) buf, insn, 4);
12732 }
12733 else if (mips_pic == NO_PIC
12734 && fixP->fx_done
12735 && fixP->fx_frag->fr_address >= text_section->vma
12736 && (fixP->fx_frag->fr_address
12737 < text_section->vma + bfd_get_section_size (text_section))
12738 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12739 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12740 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12741 {
12742 /* The branch offset is too large. If this is an
12743 unconditional branch, and we are not generating PIC code,
12744 we can convert it to an absolute jump instruction. */
12745 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12746 insn = 0x0c000000; /* jal */
12747 else
12748 insn = 0x08000000; /* j */
12749 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12750 fixP->fx_done = 0;
12751 fixP->fx_addsy = section_symbol (text_section);
12752 *valP += md_pcrel_from (fixP);
12753 md_number_to_chars ((char *) buf, insn, 4);
12754 }
12755 else
12756 {
12757 /* If we got here, we have branch-relaxation disabled,
12758 and there's nothing we can do to fix this instruction
12759 without turning it into a longer sequence. */
12760 as_bad_where (fixP->fx_file, fixP->fx_line,
12761 _("Branch out of range"));
12762 }
12763 break;
12764
12765 case BFD_RELOC_VTABLE_INHERIT:
12766 fixP->fx_done = 0;
12767 if (fixP->fx_addsy
12768 && !S_IS_DEFINED (fixP->fx_addsy)
12769 && !S_IS_WEAK (fixP->fx_addsy))
12770 S_SET_WEAK (fixP->fx_addsy);
12771 break;
12772
12773 case BFD_RELOC_VTABLE_ENTRY:
12774 fixP->fx_done = 0;
12775 break;
12776
12777 default:
12778 internalError ();
12779 }
12780
12781 /* Remember value for tc_gen_reloc. */
12782 fixP->fx_addnumber = *valP;
12783 }
12784
12785 static symbolS *
12786 get_symbol (void)
12787 {
12788 int c;
12789 char *name;
12790 symbolS *p;
12791
12792 name = input_line_pointer;
12793 c = get_symbol_end ();
12794 p = (symbolS *) symbol_find_or_make (name);
12795 *input_line_pointer = c;
12796 return p;
12797 }
12798
12799 /* Align the current frag to a given power of two. If a particular
12800 fill byte should be used, FILL points to an integer that contains
12801 that byte, otherwise FILL is null.
12802
12803 The MIPS assembler also automatically adjusts any preceding
12804 label. */
12805
12806 static void
12807 mips_align (int to, int *fill, symbolS *label)
12808 {
12809 mips_emit_delays ();
12810 mips_record_mips16_mode ();
12811 if (fill == NULL && subseg_text_p (now_seg))
12812 frag_align_code (to, 0);
12813 else
12814 frag_align (to, fill ? *fill : 0, 0);
12815 record_alignment (now_seg, to);
12816 if (label != NULL)
12817 {
12818 gas_assert (S_GET_SEGMENT (label) == now_seg);
12819 symbol_set_frag (label, frag_now);
12820 S_SET_VALUE (label, (valueT) frag_now_fix ());
12821 }
12822 }
12823
12824 /* Align to a given power of two. .align 0 turns off the automatic
12825 alignment used by the data creating pseudo-ops. */
12826
12827 static void
12828 s_align (int x ATTRIBUTE_UNUSED)
12829 {
12830 int temp, fill_value, *fill_ptr;
12831 long max_alignment = 28;
12832
12833 /* o Note that the assembler pulls down any immediately preceding label
12834 to the aligned address.
12835 o It's not documented but auto alignment is reinstated by
12836 a .align pseudo instruction.
12837 o Note also that after auto alignment is turned off the mips assembler
12838 issues an error on attempt to assemble an improperly aligned data item.
12839 We don't. */
12840
12841 temp = get_absolute_expression ();
12842 if (temp > max_alignment)
12843 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12844 else if (temp < 0)
12845 {
12846 as_warn (_("Alignment negative: 0 assumed."));
12847 temp = 0;
12848 }
12849 if (*input_line_pointer == ',')
12850 {
12851 ++input_line_pointer;
12852 fill_value = get_absolute_expression ();
12853 fill_ptr = &fill_value;
12854 }
12855 else
12856 fill_ptr = 0;
12857 if (temp)
12858 {
12859 segment_info_type *si = seg_info (now_seg);
12860 struct insn_label_list *l = si->label_list;
12861 /* Auto alignment should be switched on by next section change. */
12862 auto_align = 1;
12863 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12864 }
12865 else
12866 {
12867 auto_align = 0;
12868 }
12869
12870 demand_empty_rest_of_line ();
12871 }
12872
12873 static void
12874 s_change_sec (int sec)
12875 {
12876 segT seg;
12877
12878 #ifdef OBJ_ELF
12879 /* The ELF backend needs to know that we are changing sections, so
12880 that .previous works correctly. We could do something like check
12881 for an obj_section_change_hook macro, but that might be confusing
12882 as it would not be appropriate to use it in the section changing
12883 functions in read.c, since obj-elf.c intercepts those. FIXME:
12884 This should be cleaner, somehow. */
12885 if (IS_ELF)
12886 obj_elf_section_change_hook ();
12887 #endif
12888
12889 mips_emit_delays ();
12890
12891 switch (sec)
12892 {
12893 case 't':
12894 s_text (0);
12895 break;
12896 case 'd':
12897 s_data (0);
12898 break;
12899 case 'b':
12900 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12901 demand_empty_rest_of_line ();
12902 break;
12903
12904 case 'r':
12905 seg = subseg_new (RDATA_SECTION_NAME,
12906 (subsegT) get_absolute_expression ());
12907 if (IS_ELF)
12908 {
12909 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12910 | SEC_READONLY | SEC_RELOC
12911 | SEC_DATA));
12912 if (strncmp (TARGET_OS, "elf", 3) != 0)
12913 record_alignment (seg, 4);
12914 }
12915 demand_empty_rest_of_line ();
12916 break;
12917
12918 case 's':
12919 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12920 if (IS_ELF)
12921 {
12922 bfd_set_section_flags (stdoutput, seg,
12923 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12924 if (strncmp (TARGET_OS, "elf", 3) != 0)
12925 record_alignment (seg, 4);
12926 }
12927 demand_empty_rest_of_line ();
12928 break;
12929
12930 case 'B':
12931 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12932 if (IS_ELF)
12933 {
12934 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12935 if (strncmp (TARGET_OS, "elf", 3) != 0)
12936 record_alignment (seg, 4);
12937 }
12938 demand_empty_rest_of_line ();
12939 break;
12940 }
12941
12942 auto_align = 1;
12943 }
12944
12945 void
12946 s_change_section (int ignore ATTRIBUTE_UNUSED)
12947 {
12948 #ifdef OBJ_ELF
12949 char *section_name;
12950 char c;
12951 char next_c = 0;
12952 int section_type;
12953 int section_flag;
12954 int section_entry_size;
12955 int section_alignment;
12956
12957 if (!IS_ELF)
12958 return;
12959
12960 section_name = input_line_pointer;
12961 c = get_symbol_end ();
12962 if (c)
12963 next_c = *(input_line_pointer + 1);
12964
12965 /* Do we have .section Name<,"flags">? */
12966 if (c != ',' || (c == ',' && next_c == '"'))
12967 {
12968 /* just after name is now '\0'. */
12969 *input_line_pointer = c;
12970 input_line_pointer = section_name;
12971 obj_elf_section (ignore);
12972 return;
12973 }
12974 input_line_pointer++;
12975
12976 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12977 if (c == ',')
12978 section_type = get_absolute_expression ();
12979 else
12980 section_type = 0;
12981 if (*input_line_pointer++ == ',')
12982 section_flag = get_absolute_expression ();
12983 else
12984 section_flag = 0;
12985 if (*input_line_pointer++ == ',')
12986 section_entry_size = get_absolute_expression ();
12987 else
12988 section_entry_size = 0;
12989 if (*input_line_pointer++ == ',')
12990 section_alignment = get_absolute_expression ();
12991 else
12992 section_alignment = 0;
12993 /* FIXME: really ignore? */
12994 (void) section_alignment;
12995
12996 section_name = xstrdup (section_name);
12997
12998 /* When using the generic form of .section (as implemented by obj-elf.c),
12999 there's no way to set the section type to SHT_MIPS_DWARF. Users have
13000 traditionally had to fall back on the more common @progbits instead.
13001
13002 There's nothing really harmful in this, since bfd will correct
13003 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
13004 means that, for backwards compatibility, the special_section entries
13005 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
13006
13007 Even so, we shouldn't force users of the MIPS .section syntax to
13008 incorrectly label the sections as SHT_PROGBITS. The best compromise
13009 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
13010 generic type-checking code. */
13011 if (section_type == SHT_MIPS_DWARF)
13012 section_type = SHT_PROGBITS;
13013
13014 obj_elf_change_section (section_name, section_type, section_flag,
13015 section_entry_size, 0, 0, 0);
13016
13017 if (now_seg->name != section_name)
13018 free (section_name);
13019 #endif /* OBJ_ELF */
13020 }
13021
13022 void
13023 mips_enable_auto_align (void)
13024 {
13025 auto_align = 1;
13026 }
13027
13028 static void
13029 s_cons (int log_size)
13030 {
13031 segment_info_type *si = seg_info (now_seg);
13032 struct insn_label_list *l = si->label_list;
13033 symbolS *label;
13034
13035 label = l != NULL ? l->label : NULL;
13036 mips_emit_delays ();
13037 if (log_size > 0 && auto_align)
13038 mips_align (log_size, 0, label);
13039 cons (1 << log_size);
13040 mips_clear_insn_labels ();
13041 }
13042
13043 static void
13044 s_float_cons (int type)
13045 {
13046 segment_info_type *si = seg_info (now_seg);
13047 struct insn_label_list *l = si->label_list;
13048 symbolS *label;
13049
13050 label = l != NULL ? l->label : NULL;
13051
13052 mips_emit_delays ();
13053
13054 if (auto_align)
13055 {
13056 if (type == 'd')
13057 mips_align (3, 0, label);
13058 else
13059 mips_align (2, 0, label);
13060 }
13061
13062 float_cons (type);
13063 mips_clear_insn_labels ();
13064 }
13065
13066 /* Handle .globl. We need to override it because on Irix 5 you are
13067 permitted to say
13068 .globl foo .text
13069 where foo is an undefined symbol, to mean that foo should be
13070 considered to be the address of a function. */
13071
13072 static void
13073 s_mips_globl (int x ATTRIBUTE_UNUSED)
13074 {
13075 char *name;
13076 int c;
13077 symbolS *symbolP;
13078 flagword flag;
13079
13080 do
13081 {
13082 name = input_line_pointer;
13083 c = get_symbol_end ();
13084 symbolP = symbol_find_or_make (name);
13085 S_SET_EXTERNAL (symbolP);
13086
13087 *input_line_pointer = c;
13088 SKIP_WHITESPACE ();
13089
13090 /* On Irix 5, every global symbol that is not explicitly labelled as
13091 being a function is apparently labelled as being an object. */
13092 flag = BSF_OBJECT;
13093
13094 if (!is_end_of_line[(unsigned char) *input_line_pointer]
13095 && (*input_line_pointer != ','))
13096 {
13097 char *secname;
13098 asection *sec;
13099
13100 secname = input_line_pointer;
13101 c = get_symbol_end ();
13102 sec = bfd_get_section_by_name (stdoutput, secname);
13103 if (sec == NULL)
13104 as_bad (_("%s: no such section"), secname);
13105 *input_line_pointer = c;
13106
13107 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
13108 flag = BSF_FUNCTION;
13109 }
13110
13111 symbol_get_bfdsym (symbolP)->flags |= flag;
13112
13113 c = *input_line_pointer;
13114 if (c == ',')
13115 {
13116 input_line_pointer++;
13117 SKIP_WHITESPACE ();
13118 if (is_end_of_line[(unsigned char) *input_line_pointer])
13119 c = '\n';
13120 }
13121 }
13122 while (c == ',');
13123
13124 demand_empty_rest_of_line ();
13125 }
13126
13127 static void
13128 s_option (int x ATTRIBUTE_UNUSED)
13129 {
13130 char *opt;
13131 char c;
13132
13133 opt = input_line_pointer;
13134 c = get_symbol_end ();
13135
13136 if (*opt == 'O')
13137 {
13138 /* FIXME: What does this mean? */
13139 }
13140 else if (strncmp (opt, "pic", 3) == 0)
13141 {
13142 int i;
13143
13144 i = atoi (opt + 3);
13145 if (i == 0)
13146 mips_pic = NO_PIC;
13147 else if (i == 2)
13148 {
13149 mips_pic = SVR4_PIC;
13150 mips_abicalls = TRUE;
13151 }
13152 else
13153 as_bad (_(".option pic%d not supported"), i);
13154
13155 if (mips_pic == SVR4_PIC)
13156 {
13157 if (g_switch_seen && g_switch_value != 0)
13158 as_warn (_("-G may not be used with SVR4 PIC code"));
13159 g_switch_value = 0;
13160 bfd_set_gp_size (stdoutput, 0);
13161 }
13162 }
13163 else
13164 as_warn (_("Unrecognized option \"%s\""), opt);
13165
13166 *input_line_pointer = c;
13167 demand_empty_rest_of_line ();
13168 }
13169
13170 /* This structure is used to hold a stack of .set values. */
13171
13172 struct mips_option_stack
13173 {
13174 struct mips_option_stack *next;
13175 struct mips_set_options options;
13176 };
13177
13178 static struct mips_option_stack *mips_opts_stack;
13179
13180 /* Handle the .set pseudo-op. */
13181
13182 static void
13183 s_mipsset (int x ATTRIBUTE_UNUSED)
13184 {
13185 char *name = input_line_pointer, ch;
13186
13187 while (!is_end_of_line[(unsigned char) *input_line_pointer])
13188 ++input_line_pointer;
13189 ch = *input_line_pointer;
13190 *input_line_pointer = '\0';
13191
13192 if (strcmp (name, "reorder") == 0)
13193 {
13194 if (mips_opts.noreorder)
13195 end_noreorder ();
13196 }
13197 else if (strcmp (name, "noreorder") == 0)
13198 {
13199 if (!mips_opts.noreorder)
13200 start_noreorder ();
13201 }
13202 else if (strncmp (name, "at=", 3) == 0)
13203 {
13204 char *s = name + 3;
13205
13206 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
13207 as_bad (_("Unrecognized register name `%s'"), s);
13208 }
13209 else if (strcmp (name, "at") == 0)
13210 {
13211 mips_opts.at = ATREG;
13212 }
13213 else if (strcmp (name, "noat") == 0)
13214 {
13215 mips_opts.at = ZERO;
13216 }
13217 else if (strcmp (name, "macro") == 0)
13218 {
13219 mips_opts.warn_about_macros = 0;
13220 }
13221 else if (strcmp (name, "nomacro") == 0)
13222 {
13223 if (mips_opts.noreorder == 0)
13224 as_bad (_("`noreorder' must be set before `nomacro'"));
13225 mips_opts.warn_about_macros = 1;
13226 }
13227 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
13228 {
13229 mips_opts.nomove = 0;
13230 }
13231 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
13232 {
13233 mips_opts.nomove = 1;
13234 }
13235 else if (strcmp (name, "bopt") == 0)
13236 {
13237 mips_opts.nobopt = 0;
13238 }
13239 else if (strcmp (name, "nobopt") == 0)
13240 {
13241 mips_opts.nobopt = 1;
13242 }
13243 else if (strcmp (name, "gp=default") == 0)
13244 mips_opts.gp32 = file_mips_gp32;
13245 else if (strcmp (name, "gp=32") == 0)
13246 mips_opts.gp32 = 1;
13247 else if (strcmp (name, "gp=64") == 0)
13248 {
13249 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13250 as_warn (_("%s isa does not support 64-bit registers"),
13251 mips_cpu_info_from_isa (mips_opts.isa)->name);
13252 mips_opts.gp32 = 0;
13253 }
13254 else if (strcmp (name, "fp=default") == 0)
13255 mips_opts.fp32 = file_mips_fp32;
13256 else if (strcmp (name, "fp=32") == 0)
13257 mips_opts.fp32 = 1;
13258 else if (strcmp (name, "fp=64") == 0)
13259 {
13260 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13261 as_warn (_("%s isa does not support 64-bit floating point registers"),
13262 mips_cpu_info_from_isa (mips_opts.isa)->name);
13263 mips_opts.fp32 = 0;
13264 }
13265 else if (strcmp (name, "softfloat") == 0)
13266 mips_opts.soft_float = 1;
13267 else if (strcmp (name, "hardfloat") == 0)
13268 mips_opts.soft_float = 0;
13269 else if (strcmp (name, "singlefloat") == 0)
13270 mips_opts.single_float = 1;
13271 else if (strcmp (name, "doublefloat") == 0)
13272 mips_opts.single_float = 0;
13273 else if (strcmp (name, "mips16") == 0
13274 || strcmp (name, "MIPS-16") == 0)
13275 mips_opts.mips16 = 1;
13276 else if (strcmp (name, "nomips16") == 0
13277 || strcmp (name, "noMIPS-16") == 0)
13278 mips_opts.mips16 = 0;
13279 else if (strcmp (name, "smartmips") == 0)
13280 {
13281 if (!ISA_SUPPORTS_SMARTMIPS)
13282 as_warn (_("%s ISA does not support SmartMIPS ASE"),
13283 mips_cpu_info_from_isa (mips_opts.isa)->name);
13284 mips_opts.ase_smartmips = 1;
13285 }
13286 else if (strcmp (name, "nosmartmips") == 0)
13287 mips_opts.ase_smartmips = 0;
13288 else if (strcmp (name, "mips3d") == 0)
13289 mips_opts.ase_mips3d = 1;
13290 else if (strcmp (name, "nomips3d") == 0)
13291 mips_opts.ase_mips3d = 0;
13292 else if (strcmp (name, "mdmx") == 0)
13293 mips_opts.ase_mdmx = 1;
13294 else if (strcmp (name, "nomdmx") == 0)
13295 mips_opts.ase_mdmx = 0;
13296 else if (strcmp (name, "dsp") == 0)
13297 {
13298 if (!ISA_SUPPORTS_DSP_ASE)
13299 as_warn (_("%s ISA does not support DSP ASE"),
13300 mips_cpu_info_from_isa (mips_opts.isa)->name);
13301 mips_opts.ase_dsp = 1;
13302 mips_opts.ase_dspr2 = 0;
13303 }
13304 else if (strcmp (name, "nodsp") == 0)
13305 {
13306 mips_opts.ase_dsp = 0;
13307 mips_opts.ase_dspr2 = 0;
13308 }
13309 else if (strcmp (name, "dspr2") == 0)
13310 {
13311 if (!ISA_SUPPORTS_DSPR2_ASE)
13312 as_warn (_("%s ISA does not support DSP R2 ASE"),
13313 mips_cpu_info_from_isa (mips_opts.isa)->name);
13314 mips_opts.ase_dspr2 = 1;
13315 mips_opts.ase_dsp = 1;
13316 }
13317 else if (strcmp (name, "nodspr2") == 0)
13318 {
13319 mips_opts.ase_dspr2 = 0;
13320 mips_opts.ase_dsp = 0;
13321 }
13322 else if (strcmp (name, "mt") == 0)
13323 {
13324 if (!ISA_SUPPORTS_MT_ASE)
13325 as_warn (_("%s ISA does not support MT ASE"),
13326 mips_cpu_info_from_isa (mips_opts.isa)->name);
13327 mips_opts.ase_mt = 1;
13328 }
13329 else if (strcmp (name, "nomt") == 0)
13330 mips_opts.ase_mt = 0;
13331 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13332 {
13333 int reset = 0;
13334
13335 /* Permit the user to change the ISA and architecture on the fly.
13336 Needless to say, misuse can cause serious problems. */
13337 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13338 {
13339 reset = 1;
13340 mips_opts.isa = file_mips_isa;
13341 mips_opts.arch = file_mips_arch;
13342 }
13343 else if (strncmp (name, "arch=", 5) == 0)
13344 {
13345 const struct mips_cpu_info *p;
13346
13347 p = mips_parse_cpu("internal use", name + 5);
13348 if (!p)
13349 as_bad (_("unknown architecture %s"), name + 5);
13350 else
13351 {
13352 mips_opts.arch = p->cpu;
13353 mips_opts.isa = p->isa;
13354 }
13355 }
13356 else if (strncmp (name, "mips", 4) == 0)
13357 {
13358 const struct mips_cpu_info *p;
13359
13360 p = mips_parse_cpu("internal use", name);
13361 if (!p)
13362 as_bad (_("unknown ISA level %s"), name + 4);
13363 else
13364 {
13365 mips_opts.arch = p->cpu;
13366 mips_opts.isa = p->isa;
13367 }
13368 }
13369 else
13370 as_bad (_("unknown ISA or architecture %s"), name);
13371
13372 switch (mips_opts.isa)
13373 {
13374 case 0:
13375 break;
13376 case ISA_MIPS1:
13377 case ISA_MIPS2:
13378 case ISA_MIPS32:
13379 case ISA_MIPS32R2:
13380 mips_opts.gp32 = 1;
13381 mips_opts.fp32 = 1;
13382 break;
13383 case ISA_MIPS3:
13384 case ISA_MIPS4:
13385 case ISA_MIPS5:
13386 case ISA_MIPS64:
13387 case ISA_MIPS64R2:
13388 mips_opts.gp32 = 0;
13389 mips_opts.fp32 = 0;
13390 break;
13391 default:
13392 as_bad (_("unknown ISA level %s"), name + 4);
13393 break;
13394 }
13395 if (reset)
13396 {
13397 mips_opts.gp32 = file_mips_gp32;
13398 mips_opts.fp32 = file_mips_fp32;
13399 }
13400 }
13401 else if (strcmp (name, "autoextend") == 0)
13402 mips_opts.noautoextend = 0;
13403 else if (strcmp (name, "noautoextend") == 0)
13404 mips_opts.noautoextend = 1;
13405 else if (strcmp (name, "push") == 0)
13406 {
13407 struct mips_option_stack *s;
13408
13409 s = (struct mips_option_stack *) xmalloc (sizeof *s);
13410 s->next = mips_opts_stack;
13411 s->options = mips_opts;
13412 mips_opts_stack = s;
13413 }
13414 else if (strcmp (name, "pop") == 0)
13415 {
13416 struct mips_option_stack *s;
13417
13418 s = mips_opts_stack;
13419 if (s == NULL)
13420 as_bad (_(".set pop with no .set push"));
13421 else
13422 {
13423 /* If we're changing the reorder mode we need to handle
13424 delay slots correctly. */
13425 if (s->options.noreorder && ! mips_opts.noreorder)
13426 start_noreorder ();
13427 else if (! s->options.noreorder && mips_opts.noreorder)
13428 end_noreorder ();
13429
13430 mips_opts = s->options;
13431 mips_opts_stack = s->next;
13432 free (s);
13433 }
13434 }
13435 else if (strcmp (name, "sym32") == 0)
13436 mips_opts.sym32 = TRUE;
13437 else if (strcmp (name, "nosym32") == 0)
13438 mips_opts.sym32 = FALSE;
13439 else if (strchr (name, ','))
13440 {
13441 /* Generic ".set" directive; use the generic handler. */
13442 *input_line_pointer = ch;
13443 input_line_pointer = name;
13444 s_set (0);
13445 return;
13446 }
13447 else
13448 {
13449 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13450 }
13451 *input_line_pointer = ch;
13452 demand_empty_rest_of_line ();
13453 }
13454
13455 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
13456 .option pic2. It means to generate SVR4 PIC calls. */
13457
13458 static void
13459 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13460 {
13461 mips_pic = SVR4_PIC;
13462 mips_abicalls = TRUE;
13463
13464 if (g_switch_seen && g_switch_value != 0)
13465 as_warn (_("-G may not be used with SVR4 PIC code"));
13466 g_switch_value = 0;
13467
13468 bfd_set_gp_size (stdoutput, 0);
13469 demand_empty_rest_of_line ();
13470 }
13471
13472 /* Handle the .cpload pseudo-op. This is used when generating SVR4
13473 PIC code. It sets the $gp register for the function based on the
13474 function address, which is in the register named in the argument.
13475 This uses a relocation against _gp_disp, which is handled specially
13476 by the linker. The result is:
13477 lui $gp,%hi(_gp_disp)
13478 addiu $gp,$gp,%lo(_gp_disp)
13479 addu $gp,$gp,.cpload argument
13480 The .cpload argument is normally $25 == $t9.
13481
13482 The -mno-shared option changes this to:
13483 lui $gp,%hi(__gnu_local_gp)
13484 addiu $gp,$gp,%lo(__gnu_local_gp)
13485 and the argument is ignored. This saves an instruction, but the
13486 resulting code is not position independent; it uses an absolute
13487 address for __gnu_local_gp. Thus code assembled with -mno-shared
13488 can go into an ordinary executable, but not into a shared library. */
13489
13490 static void
13491 s_cpload (int ignore ATTRIBUTE_UNUSED)
13492 {
13493 expressionS ex;
13494 int reg;
13495 int in_shared;
13496
13497 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13498 .cpload is ignored. */
13499 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13500 {
13501 s_ignore (0);
13502 return;
13503 }
13504
13505 /* .cpload should be in a .set noreorder section. */
13506 if (mips_opts.noreorder == 0)
13507 as_warn (_(".cpload not in noreorder section"));
13508
13509 reg = tc_get_register (0);
13510
13511 /* If we need to produce a 64-bit address, we are better off using
13512 the default instruction sequence. */
13513 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13514
13515 ex.X_op = O_symbol;
13516 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13517 "__gnu_local_gp");
13518 ex.X_op_symbol = NULL;
13519 ex.X_add_number = 0;
13520
13521 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13522 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13523
13524 macro_start ();
13525 macro_build_lui (&ex, mips_gp_register);
13526 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13527 mips_gp_register, BFD_RELOC_LO16);
13528 if (in_shared)
13529 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13530 mips_gp_register, reg);
13531 macro_end ();
13532
13533 demand_empty_rest_of_line ();
13534 }
13535
13536 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
13537 .cpsetup $reg1, offset|$reg2, label
13538
13539 If offset is given, this results in:
13540 sd $gp, offset($sp)
13541 lui $gp, %hi(%neg(%gp_rel(label)))
13542 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13543 daddu $gp, $gp, $reg1
13544
13545 If $reg2 is given, this results in:
13546 daddu $reg2, $gp, $0
13547 lui $gp, %hi(%neg(%gp_rel(label)))
13548 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13549 daddu $gp, $gp, $reg1
13550 $reg1 is normally $25 == $t9.
13551
13552 The -mno-shared option replaces the last three instructions with
13553 lui $gp,%hi(_gp)
13554 addiu $gp,$gp,%lo(_gp) */
13555
13556 static void
13557 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13558 {
13559 expressionS ex_off;
13560 expressionS ex_sym;
13561 int reg1;
13562
13563 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13564 We also need NewABI support. */
13565 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13566 {
13567 s_ignore (0);
13568 return;
13569 }
13570
13571 reg1 = tc_get_register (0);
13572 SKIP_WHITESPACE ();
13573 if (*input_line_pointer != ',')
13574 {
13575 as_bad (_("missing argument separator ',' for .cpsetup"));
13576 return;
13577 }
13578 else
13579 ++input_line_pointer;
13580 SKIP_WHITESPACE ();
13581 if (*input_line_pointer == '$')
13582 {
13583 mips_cpreturn_register = tc_get_register (0);
13584 mips_cpreturn_offset = -1;
13585 }
13586 else
13587 {
13588 mips_cpreturn_offset = get_absolute_expression ();
13589 mips_cpreturn_register = -1;
13590 }
13591 SKIP_WHITESPACE ();
13592 if (*input_line_pointer != ',')
13593 {
13594 as_bad (_("missing argument separator ',' for .cpsetup"));
13595 return;
13596 }
13597 else
13598 ++input_line_pointer;
13599 SKIP_WHITESPACE ();
13600 expression (&ex_sym);
13601
13602 macro_start ();
13603 if (mips_cpreturn_register == -1)
13604 {
13605 ex_off.X_op = O_constant;
13606 ex_off.X_add_symbol = NULL;
13607 ex_off.X_op_symbol = NULL;
13608 ex_off.X_add_number = mips_cpreturn_offset;
13609
13610 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13611 BFD_RELOC_LO16, SP);
13612 }
13613 else
13614 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13615 mips_gp_register, 0);
13616
13617 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13618 {
13619 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13620 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13621 BFD_RELOC_HI16_S);
13622
13623 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13624 mips_gp_register, -1, BFD_RELOC_GPREL16,
13625 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13626
13627 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13628 mips_gp_register, reg1);
13629 }
13630 else
13631 {
13632 expressionS ex;
13633
13634 ex.X_op = O_symbol;
13635 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13636 ex.X_op_symbol = NULL;
13637 ex.X_add_number = 0;
13638
13639 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13640 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13641
13642 macro_build_lui (&ex, mips_gp_register);
13643 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13644 mips_gp_register, BFD_RELOC_LO16);
13645 }
13646
13647 macro_end ();
13648
13649 demand_empty_rest_of_line ();
13650 }
13651
13652 static void
13653 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13654 {
13655 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13656 .cplocal is ignored. */
13657 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13658 {
13659 s_ignore (0);
13660 return;
13661 }
13662
13663 mips_gp_register = tc_get_register (0);
13664 demand_empty_rest_of_line ();
13665 }
13666
13667 /* Handle the .cprestore pseudo-op. This stores $gp into a given
13668 offset from $sp. The offset is remembered, and after making a PIC
13669 call $gp is restored from that location. */
13670
13671 static void
13672 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13673 {
13674 expressionS ex;
13675
13676 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13677 .cprestore is ignored. */
13678 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13679 {
13680 s_ignore (0);
13681 return;
13682 }
13683
13684 mips_cprestore_offset = get_absolute_expression ();
13685 mips_cprestore_valid = 1;
13686
13687 ex.X_op = O_constant;
13688 ex.X_add_symbol = NULL;
13689 ex.X_op_symbol = NULL;
13690 ex.X_add_number = mips_cprestore_offset;
13691
13692 macro_start ();
13693 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13694 SP, HAVE_64BIT_ADDRESSES);
13695 macro_end ();
13696
13697 demand_empty_rest_of_line ();
13698 }
13699
13700 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13701 was given in the preceding .cpsetup, it results in:
13702 ld $gp, offset($sp)
13703
13704 If a register $reg2 was given there, it results in:
13705 daddu $gp, $reg2, $0 */
13706
13707 static void
13708 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13709 {
13710 expressionS ex;
13711
13712 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13713 We also need NewABI support. */
13714 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13715 {
13716 s_ignore (0);
13717 return;
13718 }
13719
13720 macro_start ();
13721 if (mips_cpreturn_register == -1)
13722 {
13723 ex.X_op = O_constant;
13724 ex.X_add_symbol = NULL;
13725 ex.X_op_symbol = NULL;
13726 ex.X_add_number = mips_cpreturn_offset;
13727
13728 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13729 }
13730 else
13731 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13732 mips_cpreturn_register, 0);
13733 macro_end ();
13734
13735 demand_empty_rest_of_line ();
13736 }
13737
13738 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13739 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13740 use in DWARF debug information. */
13741
13742 static void
13743 s_dtprel_internal (size_t bytes)
13744 {
13745 expressionS ex;
13746 char *p;
13747
13748 expression (&ex);
13749
13750 if (ex.X_op != O_symbol)
13751 {
13752 as_bad (_("Unsupported use of %s"), (bytes == 8
13753 ? ".dtpreldword"
13754 : ".dtprelword"));
13755 ignore_rest_of_line ();
13756 }
13757
13758 p = frag_more (bytes);
13759 md_number_to_chars (p, 0, bytes);
13760 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13761 (bytes == 8
13762 ? BFD_RELOC_MIPS_TLS_DTPREL64
13763 : BFD_RELOC_MIPS_TLS_DTPREL32));
13764
13765 demand_empty_rest_of_line ();
13766 }
13767
13768 /* Handle .dtprelword. */
13769
13770 static void
13771 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13772 {
13773 s_dtprel_internal (4);
13774 }
13775
13776 /* Handle .dtpreldword. */
13777
13778 static void
13779 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13780 {
13781 s_dtprel_internal (8);
13782 }
13783
13784 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13785 code. It sets the offset to use in gp_rel relocations. */
13786
13787 static void
13788 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13789 {
13790 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13791 We also need NewABI support. */
13792 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13793 {
13794 s_ignore (0);
13795 return;
13796 }
13797
13798 mips_gprel_offset = get_absolute_expression ();
13799
13800 demand_empty_rest_of_line ();
13801 }
13802
13803 /* Handle the .gpword pseudo-op. This is used when generating PIC
13804 code. It generates a 32 bit GP relative reloc. */
13805
13806 static void
13807 s_gpword (int ignore ATTRIBUTE_UNUSED)
13808 {
13809 segment_info_type *si;
13810 struct insn_label_list *l;
13811 symbolS *label;
13812 expressionS ex;
13813 char *p;
13814
13815 /* When not generating PIC code, this is treated as .word. */
13816 if (mips_pic != SVR4_PIC)
13817 {
13818 s_cons (2);
13819 return;
13820 }
13821
13822 si = seg_info (now_seg);
13823 l = si->label_list;
13824 label = l != NULL ? l->label : NULL;
13825 mips_emit_delays ();
13826 if (auto_align)
13827 mips_align (2, 0, label);
13828
13829 expression (&ex);
13830 mips_clear_insn_labels ();
13831
13832 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13833 {
13834 as_bad (_("Unsupported use of .gpword"));
13835 ignore_rest_of_line ();
13836 }
13837
13838 p = frag_more (4);
13839 md_number_to_chars (p, 0, 4);
13840 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13841 BFD_RELOC_GPREL32);
13842
13843 demand_empty_rest_of_line ();
13844 }
13845
13846 static void
13847 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13848 {
13849 segment_info_type *si;
13850 struct insn_label_list *l;
13851 symbolS *label;
13852 expressionS ex;
13853 char *p;
13854
13855 /* When not generating PIC code, this is treated as .dword. */
13856 if (mips_pic != SVR4_PIC)
13857 {
13858 s_cons (3);
13859 return;
13860 }
13861
13862 si = seg_info (now_seg);
13863 l = si->label_list;
13864 label = l != NULL ? l->label : NULL;
13865 mips_emit_delays ();
13866 if (auto_align)
13867 mips_align (3, 0, label);
13868
13869 expression (&ex);
13870 mips_clear_insn_labels ();
13871
13872 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13873 {
13874 as_bad (_("Unsupported use of .gpdword"));
13875 ignore_rest_of_line ();
13876 }
13877
13878 p = frag_more (8);
13879 md_number_to_chars (p, 0, 8);
13880 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13881 BFD_RELOC_GPREL32)->fx_tcbit = 1;
13882
13883 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13884 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13885 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13886
13887 demand_empty_rest_of_line ();
13888 }
13889
13890 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13891 tables in SVR4 PIC code. */
13892
13893 static void
13894 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13895 {
13896 int reg;
13897
13898 /* This is ignored when not generating SVR4 PIC code. */
13899 if (mips_pic != SVR4_PIC)
13900 {
13901 s_ignore (0);
13902 return;
13903 }
13904
13905 /* Add $gp to the register named as an argument. */
13906 macro_start ();
13907 reg = tc_get_register (0);
13908 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13909 macro_end ();
13910
13911 demand_empty_rest_of_line ();
13912 }
13913
13914 /* Handle the .insn pseudo-op. This marks instruction labels in
13915 mips16 mode. This permits the linker to handle them specially,
13916 such as generating jalx instructions when needed. We also make
13917 them odd for the duration of the assembly, in order to generate the
13918 right sort of code. We will make them even in the adjust_symtab
13919 routine, while leaving them marked. This is convenient for the
13920 debugger and the disassembler. The linker knows to make them odd
13921 again. */
13922
13923 static void
13924 s_insn (int ignore ATTRIBUTE_UNUSED)
13925 {
13926 mips16_mark_labels ();
13927
13928 demand_empty_rest_of_line ();
13929 }
13930
13931 /* Handle a .stabn directive. We need these in order to mark a label
13932 as being a mips16 text label correctly. Sometimes the compiler
13933 will emit a label, followed by a .stabn, and then switch sections.
13934 If the label and .stabn are in mips16 mode, then the label is
13935 really a mips16 text label. */
13936
13937 static void
13938 s_mips_stab (int type)
13939 {
13940 if (type == 'n')
13941 mips16_mark_labels ();
13942
13943 s_stab (type);
13944 }
13945
13946 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13947
13948 static void
13949 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13950 {
13951 char *name;
13952 int c;
13953 symbolS *symbolP;
13954 expressionS exp;
13955
13956 name = input_line_pointer;
13957 c = get_symbol_end ();
13958 symbolP = symbol_find_or_make (name);
13959 S_SET_WEAK (symbolP);
13960 *input_line_pointer = c;
13961
13962 SKIP_WHITESPACE ();
13963
13964 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13965 {
13966 if (S_IS_DEFINED (symbolP))
13967 {
13968 as_bad (_("ignoring attempt to redefine symbol %s"),
13969 S_GET_NAME (symbolP));
13970 ignore_rest_of_line ();
13971 return;
13972 }
13973
13974 if (*input_line_pointer == ',')
13975 {
13976 ++input_line_pointer;
13977 SKIP_WHITESPACE ();
13978 }
13979
13980 expression (&exp);
13981 if (exp.X_op != O_symbol)
13982 {
13983 as_bad (_("bad .weakext directive"));
13984 ignore_rest_of_line ();
13985 return;
13986 }
13987 symbol_set_value_expression (symbolP, &exp);
13988 }
13989
13990 demand_empty_rest_of_line ();
13991 }
13992
13993 /* Parse a register string into a number. Called from the ECOFF code
13994 to parse .frame. The argument is non-zero if this is the frame
13995 register, so that we can record it in mips_frame_reg. */
13996
13997 int
13998 tc_get_register (int frame)
13999 {
14000 unsigned int reg;
14001
14002 SKIP_WHITESPACE ();
14003 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
14004 reg = 0;
14005 if (frame)
14006 {
14007 mips_frame_reg = reg != 0 ? reg : SP;
14008 mips_frame_reg_valid = 1;
14009 mips_cprestore_valid = 0;
14010 }
14011 return reg;
14012 }
14013
14014 valueT
14015 md_section_align (asection *seg, valueT addr)
14016 {
14017 int align = bfd_get_section_alignment (stdoutput, seg);
14018
14019 if (IS_ELF)
14020 {
14021 /* We don't need to align ELF sections to the full alignment.
14022 However, Irix 5 may prefer that we align them at least to a 16
14023 byte boundary. We don't bother to align the sections if we
14024 are targeted for an embedded system. */
14025 if (strncmp (TARGET_OS, "elf", 3) == 0)
14026 return addr;
14027 if (align > 4)
14028 align = 4;
14029 }
14030
14031 return ((addr + (1 << align) - 1) & (-1 << align));
14032 }
14033
14034 /* Utility routine, called from above as well. If called while the
14035 input file is still being read, it's only an approximation. (For
14036 example, a symbol may later become defined which appeared to be
14037 undefined earlier.) */
14038
14039 static int
14040 nopic_need_relax (symbolS *sym, int before_relaxing)
14041 {
14042 if (sym == 0)
14043 return 0;
14044
14045 if (g_switch_value > 0)
14046 {
14047 const char *symname;
14048 int change;
14049
14050 /* Find out whether this symbol can be referenced off the $gp
14051 register. It can be if it is smaller than the -G size or if
14052 it is in the .sdata or .sbss section. Certain symbols can
14053 not be referenced off the $gp, although it appears as though
14054 they can. */
14055 symname = S_GET_NAME (sym);
14056 if (symname != (const char *) NULL
14057 && (strcmp (symname, "eprol") == 0
14058 || strcmp (symname, "etext") == 0
14059 || strcmp (symname, "_gp") == 0
14060 || strcmp (symname, "edata") == 0
14061 || strcmp (symname, "_fbss") == 0
14062 || strcmp (symname, "_fdata") == 0
14063 || strcmp (symname, "_ftext") == 0
14064 || strcmp (symname, "end") == 0
14065 || strcmp (symname, "_gp_disp") == 0))
14066 change = 1;
14067 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
14068 && (0
14069 #ifndef NO_ECOFF_DEBUGGING
14070 || (symbol_get_obj (sym)->ecoff_extern_size != 0
14071 && (symbol_get_obj (sym)->ecoff_extern_size
14072 <= g_switch_value))
14073 #endif
14074 /* We must defer this decision until after the whole
14075 file has been read, since there might be a .extern
14076 after the first use of this symbol. */
14077 || (before_relaxing
14078 #ifndef NO_ECOFF_DEBUGGING
14079 && symbol_get_obj (sym)->ecoff_extern_size == 0
14080 #endif
14081 && S_GET_VALUE (sym) == 0)
14082 || (S_GET_VALUE (sym) != 0
14083 && S_GET_VALUE (sym) <= g_switch_value)))
14084 change = 0;
14085 else
14086 {
14087 const char *segname;
14088
14089 segname = segment_name (S_GET_SEGMENT (sym));
14090 gas_assert (strcmp (segname, ".lit8") != 0
14091 && strcmp (segname, ".lit4") != 0);
14092 change = (strcmp (segname, ".sdata") != 0
14093 && strcmp (segname, ".sbss") != 0
14094 && strncmp (segname, ".sdata.", 7) != 0
14095 && strncmp (segname, ".sbss.", 6) != 0
14096 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
14097 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
14098 }
14099 return change;
14100 }
14101 else
14102 /* We are not optimizing for the $gp register. */
14103 return 1;
14104 }
14105
14106
14107 /* Return true if the given symbol should be considered local for SVR4 PIC. */
14108
14109 static bfd_boolean
14110 pic_need_relax (symbolS *sym, asection *segtype)
14111 {
14112 asection *symsec;
14113
14114 /* Handle the case of a symbol equated to another symbol. */
14115 while (symbol_equated_reloc_p (sym))
14116 {
14117 symbolS *n;
14118
14119 /* It's possible to get a loop here in a badly written program. */
14120 n = symbol_get_value_expression (sym)->X_add_symbol;
14121 if (n == sym)
14122 break;
14123 sym = n;
14124 }
14125
14126 if (symbol_section_p (sym))
14127 return TRUE;
14128
14129 symsec = S_GET_SEGMENT (sym);
14130
14131 /* This must duplicate the test in adjust_reloc_syms. */
14132 return (symsec != &bfd_und_section
14133 && symsec != &bfd_abs_section
14134 && !bfd_is_com_section (symsec)
14135 && !s_is_linkonce (sym, segtype)
14136 #ifdef OBJ_ELF
14137 /* A global or weak symbol is treated as external. */
14138 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
14139 #endif
14140 );
14141 }
14142
14143
14144 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
14145 extended opcode. SEC is the section the frag is in. */
14146
14147 static int
14148 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
14149 {
14150 int type;
14151 const struct mips16_immed_operand *op;
14152 offsetT val;
14153 int mintiny, maxtiny;
14154 segT symsec;
14155 fragS *sym_frag;
14156
14157 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
14158 return 0;
14159 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
14160 return 1;
14161
14162 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14163 op = mips16_immed_operands;
14164 while (op->type != type)
14165 {
14166 ++op;
14167 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14168 }
14169
14170 if (op->unsp)
14171 {
14172 if (type == '<' || type == '>' || type == '[' || type == ']')
14173 {
14174 mintiny = 1;
14175 maxtiny = 1 << op->nbits;
14176 }
14177 else
14178 {
14179 mintiny = 0;
14180 maxtiny = (1 << op->nbits) - 1;
14181 }
14182 }
14183 else
14184 {
14185 mintiny = - (1 << (op->nbits - 1));
14186 maxtiny = (1 << (op->nbits - 1)) - 1;
14187 }
14188
14189 sym_frag = symbol_get_frag (fragp->fr_symbol);
14190 val = S_GET_VALUE (fragp->fr_symbol);
14191 symsec = S_GET_SEGMENT (fragp->fr_symbol);
14192
14193 if (op->pcrel)
14194 {
14195 addressT addr;
14196
14197 /* We won't have the section when we are called from
14198 mips_relax_frag. However, we will always have been called
14199 from md_estimate_size_before_relax first. If this is a
14200 branch to a different section, we mark it as such. If SEC is
14201 NULL, and the frag is not marked, then it must be a branch to
14202 the same section. */
14203 if (sec == NULL)
14204 {
14205 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
14206 return 1;
14207 }
14208 else
14209 {
14210 /* Must have been called from md_estimate_size_before_relax. */
14211 if (symsec != sec)
14212 {
14213 fragp->fr_subtype =
14214 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14215
14216 /* FIXME: We should support this, and let the linker
14217 catch branches and loads that are out of range. */
14218 as_bad_where (fragp->fr_file, fragp->fr_line,
14219 _("unsupported PC relative reference to different section"));
14220
14221 return 1;
14222 }
14223 if (fragp != sym_frag && sym_frag->fr_address == 0)
14224 /* Assume non-extended on the first relaxation pass.
14225 The address we have calculated will be bogus if this is
14226 a forward branch to another frag, as the forward frag
14227 will have fr_address == 0. */
14228 return 0;
14229 }
14230
14231 /* In this case, we know for sure that the symbol fragment is in
14232 the same section. If the relax_marker of the symbol fragment
14233 differs from the relax_marker of this fragment, we have not
14234 yet adjusted the symbol fragment fr_address. We want to add
14235 in STRETCH in order to get a better estimate of the address.
14236 This particularly matters because of the shift bits. */
14237 if (stretch != 0
14238 && sym_frag->relax_marker != fragp->relax_marker)
14239 {
14240 fragS *f;
14241
14242 /* Adjust stretch for any alignment frag. Note that if have
14243 been expanding the earlier code, the symbol may be
14244 defined in what appears to be an earlier frag. FIXME:
14245 This doesn't handle the fr_subtype field, which specifies
14246 a maximum number of bytes to skip when doing an
14247 alignment. */
14248 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14249 {
14250 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14251 {
14252 if (stretch < 0)
14253 stretch = - ((- stretch)
14254 & ~ ((1 << (int) f->fr_offset) - 1));
14255 else
14256 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14257 if (stretch == 0)
14258 break;
14259 }
14260 }
14261 if (f != NULL)
14262 val += stretch;
14263 }
14264
14265 addr = fragp->fr_address + fragp->fr_fix;
14266
14267 /* The base address rules are complicated. The base address of
14268 a branch is the following instruction. The base address of a
14269 PC relative load or add is the instruction itself, but if it
14270 is in a delay slot (in which case it can not be extended) use
14271 the address of the instruction whose delay slot it is in. */
14272 if (type == 'p' || type == 'q')
14273 {
14274 addr += 2;
14275
14276 /* If we are currently assuming that this frag should be
14277 extended, then, the current address is two bytes
14278 higher. */
14279 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14280 addr += 2;
14281
14282 /* Ignore the low bit in the target, since it will be set
14283 for a text label. */
14284 if ((val & 1) != 0)
14285 --val;
14286 }
14287 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14288 addr -= 4;
14289 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14290 addr -= 2;
14291
14292 val -= addr & ~ ((1 << op->shift) - 1);
14293
14294 /* Branch offsets have an implicit 0 in the lowest bit. */
14295 if (type == 'p' || type == 'q')
14296 val /= 2;
14297
14298 /* If any of the shifted bits are set, we must use an extended
14299 opcode. If the address depends on the size of this
14300 instruction, this can lead to a loop, so we arrange to always
14301 use an extended opcode. We only check this when we are in
14302 the main relaxation loop, when SEC is NULL. */
14303 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14304 {
14305 fragp->fr_subtype =
14306 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14307 return 1;
14308 }
14309
14310 /* If we are about to mark a frag as extended because the value
14311 is precisely maxtiny + 1, then there is a chance of an
14312 infinite loop as in the following code:
14313 la $4,foo
14314 .skip 1020
14315 .align 2
14316 foo:
14317 In this case when the la is extended, foo is 0x3fc bytes
14318 away, so the la can be shrunk, but then foo is 0x400 away, so
14319 the la must be extended. To avoid this loop, we mark the
14320 frag as extended if it was small, and is about to become
14321 extended with a value of maxtiny + 1. */
14322 if (val == ((maxtiny + 1) << op->shift)
14323 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14324 && sec == NULL)
14325 {
14326 fragp->fr_subtype =
14327 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14328 return 1;
14329 }
14330 }
14331 else if (symsec != absolute_section && sec != NULL)
14332 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14333
14334 if ((val & ((1 << op->shift) - 1)) != 0
14335 || val < (mintiny << op->shift)
14336 || val > (maxtiny << op->shift))
14337 return 1;
14338 else
14339 return 0;
14340 }
14341
14342 /* Compute the length of a branch sequence, and adjust the
14343 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
14344 worst-case length is computed, with UPDATE being used to indicate
14345 whether an unconditional (-1), branch-likely (+1) or regular (0)
14346 branch is to be computed. */
14347 static int
14348 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14349 {
14350 bfd_boolean toofar;
14351 int length;
14352
14353 if (fragp
14354 && S_IS_DEFINED (fragp->fr_symbol)
14355 && sec == S_GET_SEGMENT (fragp->fr_symbol))
14356 {
14357 addressT addr;
14358 offsetT val;
14359
14360 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14361
14362 addr = fragp->fr_address + fragp->fr_fix + 4;
14363
14364 val -= addr;
14365
14366 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14367 }
14368 else if (fragp)
14369 /* If the symbol is not defined or it's in a different segment,
14370 assume the user knows what's going on and emit a short
14371 branch. */
14372 toofar = FALSE;
14373 else
14374 toofar = TRUE;
14375
14376 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14377 fragp->fr_subtype
14378 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
14379 RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14380 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14381 RELAX_BRANCH_LINK (fragp->fr_subtype),
14382 toofar);
14383
14384 length = 4;
14385 if (toofar)
14386 {
14387 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14388 length += 8;
14389
14390 if (mips_pic != NO_PIC)
14391 {
14392 /* Additional space for PIC loading of target address. */
14393 length += 8;
14394 if (mips_opts.isa == ISA_MIPS1)
14395 /* Additional space for $at-stabilizing nop. */
14396 length += 4;
14397 }
14398
14399 /* If branch is conditional. */
14400 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14401 length += 8;
14402 }
14403
14404 return length;
14405 }
14406
14407 /* Estimate the size of a frag before relaxing. Unless this is the
14408 mips16, we are not really relaxing here, and the final size is
14409 encoded in the subtype information. For the mips16, we have to
14410 decide whether we are using an extended opcode or not. */
14411
14412 int
14413 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14414 {
14415 int change;
14416
14417 if (RELAX_BRANCH_P (fragp->fr_subtype))
14418 {
14419
14420 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14421
14422 return fragp->fr_var;
14423 }
14424
14425 if (RELAX_MIPS16_P (fragp->fr_subtype))
14426 /* We don't want to modify the EXTENDED bit here; it might get us
14427 into infinite loops. We change it only in mips_relax_frag(). */
14428 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14429
14430 if (mips_pic == NO_PIC)
14431 change = nopic_need_relax (fragp->fr_symbol, 0);
14432 else if (mips_pic == SVR4_PIC)
14433 change = pic_need_relax (fragp->fr_symbol, segtype);
14434 else if (mips_pic == VXWORKS_PIC)
14435 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
14436 change = 0;
14437 else
14438 abort ();
14439
14440 if (change)
14441 {
14442 fragp->fr_subtype |= RELAX_USE_SECOND;
14443 return -RELAX_FIRST (fragp->fr_subtype);
14444 }
14445 else
14446 return -RELAX_SECOND (fragp->fr_subtype);
14447 }
14448
14449 /* This is called to see whether a reloc against a defined symbol
14450 should be converted into a reloc against a section. */
14451
14452 int
14453 mips_fix_adjustable (fixS *fixp)
14454 {
14455 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14456 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14457 return 0;
14458
14459 if (fixp->fx_addsy == NULL)
14460 return 1;
14461
14462 /* If symbol SYM is in a mergeable section, relocations of the form
14463 SYM + 0 can usually be made section-relative. The mergeable data
14464 is then identified by the section offset rather than by the symbol.
14465
14466 However, if we're generating REL LO16 relocations, the offset is split
14467 between the LO16 and parterning high part relocation. The linker will
14468 need to recalculate the complete offset in order to correctly identify
14469 the merge data.
14470
14471 The linker has traditionally not looked for the parterning high part
14472 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14473 placed anywhere. Rather than break backwards compatibility by changing
14474 this, it seems better not to force the issue, and instead keep the
14475 original symbol. This will work with either linker behavior. */
14476 if ((lo16_reloc_p (fixp->fx_r_type)
14477 || reloc_needs_lo_p (fixp->fx_r_type))
14478 && HAVE_IN_PLACE_ADDENDS
14479 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14480 return 0;
14481
14482 /* There is no place to store an in-place offset for JALR relocations.
14483 Likewise an in-range offset of PC-relative relocations may overflow
14484 the in-place relocatable field if recalculated against the start
14485 address of the symbol's containing section. */
14486 if (HAVE_IN_PLACE_ADDENDS
14487 && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
14488 return 0;
14489
14490 #ifdef OBJ_ELF
14491 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14492 to a floating-point stub. The same is true for non-R_MIPS16_26
14493 relocations against MIPS16 functions; in this case, the stub becomes
14494 the function's canonical address.
14495
14496 Floating-point stubs are stored in unique .mips16.call.* or
14497 .mips16.fn.* sections. If a stub T for function F is in section S,
14498 the first relocation in section S must be against F; this is how the
14499 linker determines the target function. All relocations that might
14500 resolve to T must also be against F. We therefore have the following
14501 restrictions, which are given in an intentionally-redundant way:
14502
14503 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14504 symbols.
14505
14506 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14507 if that stub might be used.
14508
14509 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14510 symbols.
14511
14512 4. We cannot reduce a stub's relocations against MIPS16 symbols if
14513 that stub might be used.
14514
14515 There is a further restriction:
14516
14517 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14518 on targets with in-place addends; the relocation field cannot
14519 encode the low bit.
14520
14521 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14522 against a MIPS16 symbol.
14523
14524 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14525 relocation against some symbol R, no relocation against R may be
14526 reduced. (Note that this deals with (2) as well as (1) because
14527 relocations against global symbols will never be reduced on ELF
14528 targets.) This approach is a little simpler than trying to detect
14529 stub sections, and gives the "all or nothing" per-symbol consistency
14530 that we have for MIPS16 symbols. */
14531 if (IS_ELF
14532 && fixp->fx_subsy == NULL
14533 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14534 || *symbol_get_tc (fixp->fx_addsy)))
14535 return 0;
14536 #endif
14537
14538 return 1;
14539 }
14540
14541 /* Translate internal representation of relocation info to BFD target
14542 format. */
14543
14544 arelent **
14545 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14546 {
14547 static arelent *retval[4];
14548 arelent *reloc;
14549 bfd_reloc_code_real_type code;
14550
14551 memset (retval, 0, sizeof(retval));
14552 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14553 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14554 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14555 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14556
14557 if (fixp->fx_pcrel)
14558 {
14559 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14560
14561 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14562 Relocations want only the symbol offset. */
14563 reloc->addend = fixp->fx_addnumber + reloc->address;
14564 if (!IS_ELF)
14565 {
14566 /* A gruesome hack which is a result of the gruesome gas
14567 reloc handling. What's worse, for COFF (as opposed to
14568 ECOFF), we might need yet another copy of reloc->address.
14569 See bfd_install_relocation. */
14570 reloc->addend += reloc->address;
14571 }
14572 }
14573 else
14574 reloc->addend = fixp->fx_addnumber;
14575
14576 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14577 entry to be used in the relocation's section offset. */
14578 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14579 {
14580 reloc->address = reloc->addend;
14581 reloc->addend = 0;
14582 }
14583
14584 code = fixp->fx_r_type;
14585
14586 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14587 if (reloc->howto == NULL)
14588 {
14589 as_bad_where (fixp->fx_file, fixp->fx_line,
14590 _("Can not represent %s relocation in this object file format"),
14591 bfd_get_reloc_code_name (code));
14592 retval[0] = NULL;
14593 }
14594
14595 return retval;
14596 }
14597
14598 /* Relax a machine dependent frag. This returns the amount by which
14599 the current size of the frag should change. */
14600
14601 int
14602 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14603 {
14604 if (RELAX_BRANCH_P (fragp->fr_subtype))
14605 {
14606 offsetT old_var = fragp->fr_var;
14607
14608 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14609
14610 return fragp->fr_var - old_var;
14611 }
14612
14613 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14614 return 0;
14615
14616 if (mips16_extended_frag (fragp, NULL, stretch))
14617 {
14618 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14619 return 0;
14620 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14621 return 2;
14622 }
14623 else
14624 {
14625 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14626 return 0;
14627 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14628 return -2;
14629 }
14630
14631 return 0;
14632 }
14633
14634 /* Convert a machine dependent frag. */
14635
14636 void
14637 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14638 {
14639 if (RELAX_BRANCH_P (fragp->fr_subtype))
14640 {
14641 bfd_byte *buf;
14642 unsigned long insn;
14643 expressionS exp;
14644 fixS *fixp;
14645
14646 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14647
14648 if (target_big_endian)
14649 insn = bfd_getb32 (buf);
14650 else
14651 insn = bfd_getl32 (buf);
14652
14653 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14654 {
14655 /* We generate a fixup instead of applying it right now
14656 because, if there are linker relaxations, we're going to
14657 need the relocations. */
14658 exp.X_op = O_symbol;
14659 exp.X_add_symbol = fragp->fr_symbol;
14660 exp.X_add_number = fragp->fr_offset;
14661
14662 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14663 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14664 fixp->fx_file = fragp->fr_file;
14665 fixp->fx_line = fragp->fr_line;
14666
14667 md_number_to_chars ((char *) buf, insn, 4);
14668 buf += 4;
14669 }
14670 else
14671 {
14672 int i;
14673
14674 as_warn_where (fragp->fr_file, fragp->fr_line,
14675 _("Relaxed out-of-range branch into a jump"));
14676
14677 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14678 goto uncond;
14679
14680 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14681 {
14682 /* Reverse the branch. */
14683 switch ((insn >> 28) & 0xf)
14684 {
14685 case 4:
14686 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14687 have the condition reversed by tweaking a single
14688 bit, and their opcodes all have 0x4???????. */
14689 gas_assert ((insn & 0xf1000000) == 0x41000000);
14690 insn ^= 0x00010000;
14691 break;
14692
14693 case 0:
14694 /* bltz 0x04000000 bgez 0x04010000
14695 bltzal 0x04100000 bgezal 0x04110000 */
14696 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14697 insn ^= 0x00010000;
14698 break;
14699
14700 case 1:
14701 /* beq 0x10000000 bne 0x14000000
14702 blez 0x18000000 bgtz 0x1c000000 */
14703 insn ^= 0x04000000;
14704 break;
14705
14706 default:
14707 abort ();
14708 }
14709 }
14710
14711 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14712 {
14713 /* Clear the and-link bit. */
14714 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14715
14716 /* bltzal 0x04100000 bgezal 0x04110000
14717 bltzall 0x04120000 bgezall 0x04130000 */
14718 insn &= ~0x00100000;
14719 }
14720
14721 /* Branch over the branch (if the branch was likely) or the
14722 full jump (not likely case). Compute the offset from the
14723 current instruction to branch to. */
14724 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14725 i = 16;
14726 else
14727 {
14728 /* How many bytes in instructions we've already emitted? */
14729 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14730 /* How many bytes in instructions from here to the end? */
14731 i = fragp->fr_var - i;
14732 }
14733 /* Convert to instruction count. */
14734 i >>= 2;
14735 /* Branch counts from the next instruction. */
14736 i--;
14737 insn |= i;
14738 /* Branch over the jump. */
14739 md_number_to_chars ((char *) buf, insn, 4);
14740 buf += 4;
14741
14742 /* nop */
14743 md_number_to_chars ((char *) buf, 0, 4);
14744 buf += 4;
14745
14746 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14747 {
14748 /* beql $0, $0, 2f */
14749 insn = 0x50000000;
14750 /* Compute the PC offset from the current instruction to
14751 the end of the variable frag. */
14752 /* How many bytes in instructions we've already emitted? */
14753 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14754 /* How many bytes in instructions from here to the end? */
14755 i = fragp->fr_var - i;
14756 /* Convert to instruction count. */
14757 i >>= 2;
14758 /* Don't decrement i, because we want to branch over the
14759 delay slot. */
14760
14761 insn |= i;
14762 md_number_to_chars ((char *) buf, insn, 4);
14763 buf += 4;
14764
14765 md_number_to_chars ((char *) buf, 0, 4);
14766 buf += 4;
14767 }
14768
14769 uncond:
14770 if (mips_pic == NO_PIC)
14771 {
14772 /* j or jal. */
14773 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14774 ? 0x0c000000 : 0x08000000);
14775 exp.X_op = O_symbol;
14776 exp.X_add_symbol = fragp->fr_symbol;
14777 exp.X_add_number = fragp->fr_offset;
14778
14779 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14780 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14781 fixp->fx_file = fragp->fr_file;
14782 fixp->fx_line = fragp->fr_line;
14783
14784 md_number_to_chars ((char *) buf, insn, 4);
14785 buf += 4;
14786 }
14787 else
14788 {
14789 unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
14790
14791 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14792 insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
14793 insn |= at << OP_SH_RT;
14794 exp.X_op = O_symbol;
14795 exp.X_add_symbol = fragp->fr_symbol;
14796 exp.X_add_number = fragp->fr_offset;
14797
14798 if (fragp->fr_offset)
14799 {
14800 exp.X_add_symbol = make_expr_symbol (&exp);
14801 exp.X_add_number = 0;
14802 }
14803
14804 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14805 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14806 fixp->fx_file = fragp->fr_file;
14807 fixp->fx_line = fragp->fr_line;
14808
14809 md_number_to_chars ((char *) buf, insn, 4);
14810 buf += 4;
14811
14812 if (mips_opts.isa == ISA_MIPS1)
14813 {
14814 /* nop */
14815 md_number_to_chars ((char *) buf, 0, 4);
14816 buf += 4;
14817 }
14818
14819 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14820 insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
14821 insn |= at << OP_SH_RS | at << OP_SH_RT;
14822
14823 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14824 4, &exp, FALSE, BFD_RELOC_LO16);
14825 fixp->fx_file = fragp->fr_file;
14826 fixp->fx_line = fragp->fr_line;
14827
14828 md_number_to_chars ((char *) buf, insn, 4);
14829 buf += 4;
14830
14831 /* j(al)r $at. */
14832 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14833 insn = 0x0000f809;
14834 else
14835 insn = 0x00000008;
14836 insn |= at << OP_SH_RS;
14837
14838 md_number_to_chars ((char *) buf, insn, 4);
14839 buf += 4;
14840 }
14841 }
14842
14843 gas_assert (buf == (bfd_byte *)fragp->fr_literal
14844 + fragp->fr_fix + fragp->fr_var);
14845
14846 fragp->fr_fix += fragp->fr_var;
14847
14848 return;
14849 }
14850
14851 if (RELAX_MIPS16_P (fragp->fr_subtype))
14852 {
14853 int type;
14854 const struct mips16_immed_operand *op;
14855 bfd_boolean small, ext;
14856 offsetT val;
14857 bfd_byte *buf;
14858 unsigned long insn;
14859 bfd_boolean use_extend;
14860 unsigned short extend;
14861
14862 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14863 op = mips16_immed_operands;
14864 while (op->type != type)
14865 ++op;
14866
14867 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14868 {
14869 small = FALSE;
14870 ext = TRUE;
14871 }
14872 else
14873 {
14874 small = TRUE;
14875 ext = FALSE;
14876 }
14877
14878 val = resolve_symbol_value (fragp->fr_symbol);
14879 if (op->pcrel)
14880 {
14881 addressT addr;
14882
14883 addr = fragp->fr_address + fragp->fr_fix;
14884
14885 /* The rules for the base address of a PC relative reloc are
14886 complicated; see mips16_extended_frag. */
14887 if (type == 'p' || type == 'q')
14888 {
14889 addr += 2;
14890 if (ext)
14891 addr += 2;
14892 /* Ignore the low bit in the target, since it will be
14893 set for a text label. */
14894 if ((val & 1) != 0)
14895 --val;
14896 }
14897 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14898 addr -= 4;
14899 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14900 addr -= 2;
14901
14902 addr &= ~ (addressT) ((1 << op->shift) - 1);
14903 val -= addr;
14904
14905 /* Make sure the section winds up with the alignment we have
14906 assumed. */
14907 if (op->shift > 0)
14908 record_alignment (asec, op->shift);
14909 }
14910
14911 if (ext
14912 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14913 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14914 as_warn_where (fragp->fr_file, fragp->fr_line,
14915 _("extended instruction in delay slot"));
14916
14917 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14918
14919 if (target_big_endian)
14920 insn = bfd_getb16 (buf);
14921 else
14922 insn = bfd_getl16 (buf);
14923
14924 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14925 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14926 small, ext, &insn, &use_extend, &extend);
14927
14928 if (use_extend)
14929 {
14930 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14931 fragp->fr_fix += 2;
14932 buf += 2;
14933 }
14934
14935 md_number_to_chars ((char *) buf, insn, 2);
14936 fragp->fr_fix += 2;
14937 buf += 2;
14938 }
14939 else
14940 {
14941 int first, second;
14942 fixS *fixp;
14943
14944 first = RELAX_FIRST (fragp->fr_subtype);
14945 second = RELAX_SECOND (fragp->fr_subtype);
14946 fixp = (fixS *) fragp->fr_opcode;
14947
14948 /* Possibly emit a warning if we've chosen the longer option. */
14949 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14950 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14951 {
14952 const char *msg = macro_warning (fragp->fr_subtype);
14953 if (msg != 0)
14954 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14955 }
14956
14957 /* Go through all the fixups for the first sequence. Disable them
14958 (by marking them as done) if we're going to use the second
14959 sequence instead. */
14960 while (fixp
14961 && fixp->fx_frag == fragp
14962 && fixp->fx_where < fragp->fr_fix - second)
14963 {
14964 if (fragp->fr_subtype & RELAX_USE_SECOND)
14965 fixp->fx_done = 1;
14966 fixp = fixp->fx_next;
14967 }
14968
14969 /* Go through the fixups for the second sequence. Disable them if
14970 we're going to use the first sequence, otherwise adjust their
14971 addresses to account for the relaxation. */
14972 while (fixp && fixp->fx_frag == fragp)
14973 {
14974 if (fragp->fr_subtype & RELAX_USE_SECOND)
14975 fixp->fx_where -= first;
14976 else
14977 fixp->fx_done = 1;
14978 fixp = fixp->fx_next;
14979 }
14980
14981 /* Now modify the frag contents. */
14982 if (fragp->fr_subtype & RELAX_USE_SECOND)
14983 {
14984 char *start;
14985
14986 start = fragp->fr_literal + fragp->fr_fix - first - second;
14987 memmove (start, start + first, second);
14988 fragp->fr_fix -= first;
14989 }
14990 else
14991 fragp->fr_fix -= second;
14992 }
14993 }
14994
14995 #ifdef OBJ_ELF
14996
14997 /* This function is called after the relocs have been generated.
14998 We've been storing mips16 text labels as odd. Here we convert them
14999 back to even for the convenience of the debugger. */
15000
15001 void
15002 mips_frob_file_after_relocs (void)
15003 {
15004 asymbol **syms;
15005 unsigned int count, i;
15006
15007 if (!IS_ELF)
15008 return;
15009
15010 syms = bfd_get_outsymbols (stdoutput);
15011 count = bfd_get_symcount (stdoutput);
15012 for (i = 0; i < count; i++, syms++)
15013 {
15014 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
15015 && ((*syms)->value & 1) != 0)
15016 {
15017 (*syms)->value &= ~1;
15018 /* If the symbol has an odd size, it was probably computed
15019 incorrectly, so adjust that as well. */
15020 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
15021 ++elf_symbol (*syms)->internal_elf_sym.st_size;
15022 }
15023 }
15024 }
15025
15026 #endif
15027
15028 /* This function is called whenever a label is defined, including fake
15029 labels instantiated off the dot special symbol. It is used when
15030 handling branch delays; if a branch has a label, we assume we cannot
15031 move it. This also bumps the value of the symbol by 1 in compressed
15032 code. */
15033
15034 void
15035 mips_record_label (symbolS *sym)
15036 {
15037 segment_info_type *si = seg_info (now_seg);
15038 struct insn_label_list *l;
15039
15040 if (free_insn_labels == NULL)
15041 l = (struct insn_label_list *) xmalloc (sizeof *l);
15042 else
15043 {
15044 l = free_insn_labels;
15045 free_insn_labels = l->next;
15046 }
15047
15048 l->label = sym;
15049 l->next = si->label_list;
15050 si->label_list = l;
15051 }
15052
15053 /* This function is called as tc_frob_label() whenever a label is defined
15054 and adds a DWARF-2 record we only want for true labels. */
15055
15056 void
15057 mips_define_label (symbolS *sym)
15058 {
15059 mips_record_label (sym);
15060 #ifdef OBJ_ELF
15061 dwarf2_emit_label (sym);
15062 #endif
15063 }
15064 \f
15065 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15066
15067 /* Some special processing for a MIPS ELF file. */
15068
15069 void
15070 mips_elf_final_processing (void)
15071 {
15072 /* Write out the register information. */
15073 if (mips_abi != N64_ABI)
15074 {
15075 Elf32_RegInfo s;
15076
15077 s.ri_gprmask = mips_gprmask;
15078 s.ri_cprmask[0] = mips_cprmask[0];
15079 s.ri_cprmask[1] = mips_cprmask[1];
15080 s.ri_cprmask[2] = mips_cprmask[2];
15081 s.ri_cprmask[3] = mips_cprmask[3];
15082 /* The gp_value field is set by the MIPS ELF backend. */
15083
15084 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
15085 ((Elf32_External_RegInfo *)
15086 mips_regmask_frag));
15087 }
15088 else
15089 {
15090 Elf64_Internal_RegInfo s;
15091
15092 s.ri_gprmask = mips_gprmask;
15093 s.ri_pad = 0;
15094 s.ri_cprmask[0] = mips_cprmask[0];
15095 s.ri_cprmask[1] = mips_cprmask[1];
15096 s.ri_cprmask[2] = mips_cprmask[2];
15097 s.ri_cprmask[3] = mips_cprmask[3];
15098 /* The gp_value field is set by the MIPS ELF backend. */
15099
15100 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
15101 ((Elf64_External_RegInfo *)
15102 mips_regmask_frag));
15103 }
15104
15105 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
15106 sort of BFD interface for this. */
15107 if (mips_any_noreorder)
15108 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
15109 if (mips_pic != NO_PIC)
15110 {
15111 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
15112 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15113 }
15114 if (mips_abicalls)
15115 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15116
15117 /* Set MIPS ELF flags for ASEs. */
15118 /* We may need to define a new flag for DSP ASE, and set this flag when
15119 file_ase_dsp is true. */
15120 /* Same for DSP R2. */
15121 /* We may need to define a new flag for MT ASE, and set this flag when
15122 file_ase_mt is true. */
15123 if (file_ase_mips16)
15124 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
15125 #if 0 /* XXX FIXME */
15126 if (file_ase_mips3d)
15127 elf_elfheader (stdoutput)->e_flags |= ???;
15128 #endif
15129 if (file_ase_mdmx)
15130 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
15131
15132 /* Set the MIPS ELF ABI flags. */
15133 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
15134 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
15135 else if (mips_abi == O64_ABI)
15136 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
15137 else if (mips_abi == EABI_ABI)
15138 {
15139 if (!file_mips_gp32)
15140 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
15141 else
15142 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
15143 }
15144 else if (mips_abi == N32_ABI)
15145 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
15146
15147 /* Nothing to do for N64_ABI. */
15148
15149 if (mips_32bitmode)
15150 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
15151
15152 #if 0 /* XXX FIXME */
15153 /* 32 bit code with 64 bit FP registers. */
15154 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
15155 elf_elfheader (stdoutput)->e_flags |= ???;
15156 #endif
15157 }
15158
15159 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
15160 \f
15161 typedef struct proc {
15162 symbolS *func_sym;
15163 symbolS *func_end_sym;
15164 unsigned long reg_mask;
15165 unsigned long reg_offset;
15166 unsigned long fpreg_mask;
15167 unsigned long fpreg_offset;
15168 unsigned long frame_offset;
15169 unsigned long frame_reg;
15170 unsigned long pc_reg;
15171 } procS;
15172
15173 static procS cur_proc;
15174 static procS *cur_proc_ptr;
15175 static int numprocs;
15176
15177 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
15178 nop as "0". */
15179
15180 char
15181 mips_nop_opcode (void)
15182 {
15183 return seg_info (now_seg)->tc_segment_info_data.mips16;
15184 }
15185
15186 /* Fill in an rs_align_code fragment. This only needs to do something
15187 for MIPS16 code, where 0 is not a nop. */
15188
15189 void
15190 mips_handle_align (fragS *fragp)
15191 {
15192 char *p;
15193 int bytes, size, excess;
15194 valueT opcode;
15195
15196 if (fragp->fr_type != rs_align_code)
15197 return;
15198
15199 p = fragp->fr_literal + fragp->fr_fix;
15200 if (*p)
15201 {
15202 opcode = mips16_nop_insn.insn_opcode;
15203 size = 2;
15204 }
15205 else
15206 {
15207 opcode = nop_insn.insn_opcode;
15208 size = 4;
15209 }
15210
15211 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
15212 excess = bytes % size;
15213 if (excess != 0)
15214 {
15215 /* If we're not inserting a whole number of instructions,
15216 pad the end of the fixed part of the frag with zeros. */
15217 memset (p, 0, excess);
15218 p += excess;
15219 fragp->fr_fix += excess;
15220 }
15221
15222 md_number_to_chars (p, opcode, size);
15223 fragp->fr_var = size;
15224 }
15225
15226 static void
15227 md_obj_begin (void)
15228 {
15229 }
15230
15231 static void
15232 md_obj_end (void)
15233 {
15234 /* Check for premature end, nesting errors, etc. */
15235 if (cur_proc_ptr)
15236 as_warn (_("missing .end at end of assembly"));
15237 }
15238
15239 static long
15240 get_number (void)
15241 {
15242 int negative = 0;
15243 long val = 0;
15244
15245 if (*input_line_pointer == '-')
15246 {
15247 ++input_line_pointer;
15248 negative = 1;
15249 }
15250 if (!ISDIGIT (*input_line_pointer))
15251 as_bad (_("expected simple number"));
15252 if (input_line_pointer[0] == '0')
15253 {
15254 if (input_line_pointer[1] == 'x')
15255 {
15256 input_line_pointer += 2;
15257 while (ISXDIGIT (*input_line_pointer))
15258 {
15259 val <<= 4;
15260 val |= hex_value (*input_line_pointer++);
15261 }
15262 return negative ? -val : val;
15263 }
15264 else
15265 {
15266 ++input_line_pointer;
15267 while (ISDIGIT (*input_line_pointer))
15268 {
15269 val <<= 3;
15270 val |= *input_line_pointer++ - '0';
15271 }
15272 return negative ? -val : val;
15273 }
15274 }
15275 if (!ISDIGIT (*input_line_pointer))
15276 {
15277 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15278 *input_line_pointer, *input_line_pointer);
15279 as_warn (_("invalid number"));
15280 return -1;
15281 }
15282 while (ISDIGIT (*input_line_pointer))
15283 {
15284 val *= 10;
15285 val += *input_line_pointer++ - '0';
15286 }
15287 return negative ? -val : val;
15288 }
15289
15290 /* The .file directive; just like the usual .file directive, but there
15291 is an initial number which is the ECOFF file index. In the non-ECOFF
15292 case .file implies DWARF-2. */
15293
15294 static void
15295 s_mips_file (int x ATTRIBUTE_UNUSED)
15296 {
15297 static int first_file_directive = 0;
15298
15299 if (ECOFF_DEBUGGING)
15300 {
15301 get_number ();
15302 s_app_file (0);
15303 }
15304 else
15305 {
15306 char *filename;
15307
15308 filename = dwarf2_directive_file (0);
15309
15310 /* Versions of GCC up to 3.1 start files with a ".file"
15311 directive even for stabs output. Make sure that this
15312 ".file" is handled. Note that you need a version of GCC
15313 after 3.1 in order to support DWARF-2 on MIPS. */
15314 if (filename != NULL && ! first_file_directive)
15315 {
15316 (void) new_logical_line (filename, -1);
15317 s_app_file_string (filename, 0);
15318 }
15319 first_file_directive = 1;
15320 }
15321 }
15322
15323 /* The .loc directive, implying DWARF-2. */
15324
15325 static void
15326 s_mips_loc (int x ATTRIBUTE_UNUSED)
15327 {
15328 if (!ECOFF_DEBUGGING)
15329 dwarf2_directive_loc (0);
15330 }
15331
15332 /* The .end directive. */
15333
15334 static void
15335 s_mips_end (int x ATTRIBUTE_UNUSED)
15336 {
15337 symbolS *p;
15338
15339 /* Following functions need their own .frame and .cprestore directives. */
15340 mips_frame_reg_valid = 0;
15341 mips_cprestore_valid = 0;
15342
15343 if (!is_end_of_line[(unsigned char) *input_line_pointer])
15344 {
15345 p = get_symbol ();
15346 demand_empty_rest_of_line ();
15347 }
15348 else
15349 p = NULL;
15350
15351 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15352 as_warn (_(".end not in text section"));
15353
15354 if (!cur_proc_ptr)
15355 {
15356 as_warn (_(".end directive without a preceding .ent directive."));
15357 demand_empty_rest_of_line ();
15358 return;
15359 }
15360
15361 if (p != NULL)
15362 {
15363 gas_assert (S_GET_NAME (p));
15364 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15365 as_warn (_(".end symbol does not match .ent symbol."));
15366
15367 if (debug_type == DEBUG_STABS)
15368 stabs_generate_asm_endfunc (S_GET_NAME (p),
15369 S_GET_NAME (p));
15370 }
15371 else
15372 as_warn (_(".end directive missing or unknown symbol"));
15373
15374 #ifdef OBJ_ELF
15375 /* Create an expression to calculate the size of the function. */
15376 if (p && cur_proc_ptr)
15377 {
15378 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15379 expressionS *exp = xmalloc (sizeof (expressionS));
15380
15381 obj->size = exp;
15382 exp->X_op = O_subtract;
15383 exp->X_add_symbol = symbol_temp_new_now ();
15384 exp->X_op_symbol = p;
15385 exp->X_add_number = 0;
15386
15387 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15388 }
15389
15390 /* Generate a .pdr section. */
15391 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15392 {
15393 segT saved_seg = now_seg;
15394 subsegT saved_subseg = now_subseg;
15395 expressionS exp;
15396 char *fragp;
15397
15398 #ifdef md_flush_pending_output
15399 md_flush_pending_output ();
15400 #endif
15401
15402 gas_assert (pdr_seg);
15403 subseg_set (pdr_seg, 0);
15404
15405 /* Write the symbol. */
15406 exp.X_op = O_symbol;
15407 exp.X_add_symbol = p;
15408 exp.X_add_number = 0;
15409 emit_expr (&exp, 4);
15410
15411 fragp = frag_more (7 * 4);
15412
15413 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15414 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15415 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15416 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15417 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15418 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15419 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15420
15421 subseg_set (saved_seg, saved_subseg);
15422 }
15423 #endif /* OBJ_ELF */
15424
15425 cur_proc_ptr = NULL;
15426 }
15427
15428 /* The .aent and .ent directives. */
15429
15430 static void
15431 s_mips_ent (int aent)
15432 {
15433 symbolS *symbolP;
15434
15435 symbolP = get_symbol ();
15436 if (*input_line_pointer == ',')
15437 ++input_line_pointer;
15438 SKIP_WHITESPACE ();
15439 if (ISDIGIT (*input_line_pointer)
15440 || *input_line_pointer == '-')
15441 get_number ();
15442
15443 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15444 as_warn (_(".ent or .aent not in text section."));
15445
15446 if (!aent && cur_proc_ptr)
15447 as_warn (_("missing .end"));
15448
15449 if (!aent)
15450 {
15451 /* This function needs its own .frame and .cprestore directives. */
15452 mips_frame_reg_valid = 0;
15453 mips_cprestore_valid = 0;
15454
15455 cur_proc_ptr = &cur_proc;
15456 memset (cur_proc_ptr, '\0', sizeof (procS));
15457
15458 cur_proc_ptr->func_sym = symbolP;
15459
15460 ++numprocs;
15461
15462 if (debug_type == DEBUG_STABS)
15463 stabs_generate_asm_func (S_GET_NAME (symbolP),
15464 S_GET_NAME (symbolP));
15465 }
15466
15467 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15468
15469 demand_empty_rest_of_line ();
15470 }
15471
15472 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15473 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15474 s_mips_frame is used so that we can set the PDR information correctly.
15475 We can't use the ecoff routines because they make reference to the ecoff
15476 symbol table (in the mdebug section). */
15477
15478 static void
15479 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15480 {
15481 #ifdef OBJ_ELF
15482 if (IS_ELF && !ECOFF_DEBUGGING)
15483 {
15484 long val;
15485
15486 if (cur_proc_ptr == (procS *) NULL)
15487 {
15488 as_warn (_(".frame outside of .ent"));
15489 demand_empty_rest_of_line ();
15490 return;
15491 }
15492
15493 cur_proc_ptr->frame_reg = tc_get_register (1);
15494
15495 SKIP_WHITESPACE ();
15496 if (*input_line_pointer++ != ','
15497 || get_absolute_expression_and_terminator (&val) != ',')
15498 {
15499 as_warn (_("Bad .frame directive"));
15500 --input_line_pointer;
15501 demand_empty_rest_of_line ();
15502 return;
15503 }
15504
15505 cur_proc_ptr->frame_offset = val;
15506 cur_proc_ptr->pc_reg = tc_get_register (0);
15507
15508 demand_empty_rest_of_line ();
15509 }
15510 else
15511 #endif /* OBJ_ELF */
15512 s_ignore (ignore);
15513 }
15514
15515 /* The .fmask and .mask directives. If the mdebug section is present
15516 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15517 embedded targets, s_mips_mask is used so that we can set the PDR
15518 information correctly. We can't use the ecoff routines because they
15519 make reference to the ecoff symbol table (in the mdebug section). */
15520
15521 static void
15522 s_mips_mask (int reg_type)
15523 {
15524 #ifdef OBJ_ELF
15525 if (IS_ELF && !ECOFF_DEBUGGING)
15526 {
15527 long mask, off;
15528
15529 if (cur_proc_ptr == (procS *) NULL)
15530 {
15531 as_warn (_(".mask/.fmask outside of .ent"));
15532 demand_empty_rest_of_line ();
15533 return;
15534 }
15535
15536 if (get_absolute_expression_and_terminator (&mask) != ',')
15537 {
15538 as_warn (_("Bad .mask/.fmask directive"));
15539 --input_line_pointer;
15540 demand_empty_rest_of_line ();
15541 return;
15542 }
15543
15544 off = get_absolute_expression ();
15545
15546 if (reg_type == 'F')
15547 {
15548 cur_proc_ptr->fpreg_mask = mask;
15549 cur_proc_ptr->fpreg_offset = off;
15550 }
15551 else
15552 {
15553 cur_proc_ptr->reg_mask = mask;
15554 cur_proc_ptr->reg_offset = off;
15555 }
15556
15557 demand_empty_rest_of_line ();
15558 }
15559 else
15560 #endif /* OBJ_ELF */
15561 s_ignore (reg_type);
15562 }
15563
15564 /* A table describing all the processors gas knows about. Names are
15565 matched in the order listed.
15566
15567 To ease comparison, please keep this table in the same order as
15568 gcc's mips_cpu_info_table[]. */
15569 static const struct mips_cpu_info mips_cpu_info_table[] =
15570 {
15571 /* Entries for generic ISAs */
15572 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
15573 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
15574 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
15575 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
15576 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
15577 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15578 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15579 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15580 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
15581
15582 /* MIPS I */
15583 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15584 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15585 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
15586
15587 /* MIPS II */
15588 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
15589
15590 /* MIPS III */
15591 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15592 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15593 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15594 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15595 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15596 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15597 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15598 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15599 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15600 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15601 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15602 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
15603 /* ST Microelectronics Loongson 2E and 2F cores */
15604 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15605 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
15606
15607 /* MIPS IV */
15608 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15609 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15610 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
15611 { "r14000", 0, ISA_MIPS4, CPU_R14000 },
15612 { "r16000", 0, ISA_MIPS4, CPU_R16000 },
15613 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15614 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15615 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15616 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15617 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15618 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15619 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15620 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15621 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15622 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
15623
15624 /* MIPS 32 */
15625 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15626 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15627 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15628 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15629
15630 /* MIPS 32 Release 2 */
15631 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15632 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15633 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15634 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15635 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15636 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15637 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15638 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15639 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15640 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15641 /* Deprecated forms of the above. */
15642 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15643 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15644 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
15645 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15646 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15647 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15648 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15649 /* Deprecated forms of the above. */
15650 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15651 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15652 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
15653 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15654 ISA_MIPS32R2, CPU_MIPS32R2 },
15655 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15656 ISA_MIPS32R2, CPU_MIPS32R2 },
15657 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15658 ISA_MIPS32R2, CPU_MIPS32R2 },
15659 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15660 ISA_MIPS32R2, CPU_MIPS32R2 },
15661 /* Deprecated forms of the above. */
15662 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15663 ISA_MIPS32R2, CPU_MIPS32R2 },
15664 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15665 ISA_MIPS32R2, CPU_MIPS32R2 },
15666 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15667 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15668 ISA_MIPS32R2, CPU_MIPS32R2 },
15669 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15670 ISA_MIPS32R2, CPU_MIPS32R2 },
15671 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15672 ISA_MIPS32R2, CPU_MIPS32R2 },
15673 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15674 ISA_MIPS32R2, CPU_MIPS32R2 },
15675 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15676 ISA_MIPS32R2, CPU_MIPS32R2 },
15677 /* Deprecated forms of the above. */
15678 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15679 ISA_MIPS32R2, CPU_MIPS32R2 },
15680 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15681 ISA_MIPS32R2, CPU_MIPS32R2 },
15682 /* 1004K cores are multiprocessor versions of the 34K. */
15683 { "1004kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15684 ISA_MIPS32R2, CPU_MIPS32R2 },
15685 { "1004kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15686 ISA_MIPS32R2, CPU_MIPS32R2 },
15687 { "1004kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15688 ISA_MIPS32R2, CPU_MIPS32R2 },
15689 { "1004kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15690 ISA_MIPS32R2, CPU_MIPS32R2 },
15691
15692 /* MIPS 64 */
15693 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15694 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15695 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15696 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15697
15698 /* Broadcom SB-1 CPU core */
15699 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15700 ISA_MIPS64, CPU_SB1 },
15701 /* Broadcom SB-1A CPU core */
15702 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15703 ISA_MIPS64, CPU_SB1 },
15704
15705 { "loongson3a", 0, ISA_MIPS64, CPU_LOONGSON_3A },
15706
15707 /* MIPS 64 Release 2 */
15708
15709 /* Cavium Networks Octeon CPU core */
15710 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15711
15712 /* RMI Xlr */
15713 { "xlr", 0, ISA_MIPS64, CPU_XLR },
15714
15715 /* End marker */
15716 { NULL, 0, 0, 0 }
15717 };
15718
15719
15720 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15721 with a final "000" replaced by "k". Ignore case.
15722
15723 Note: this function is shared between GCC and GAS. */
15724
15725 static bfd_boolean
15726 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15727 {
15728 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15729 given++, canonical++;
15730
15731 return ((*given == 0 && *canonical == 0)
15732 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15733 }
15734
15735
15736 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15737 CPU name. We've traditionally allowed a lot of variation here.
15738
15739 Note: this function is shared between GCC and GAS. */
15740
15741 static bfd_boolean
15742 mips_matching_cpu_name_p (const char *canonical, const char *given)
15743 {
15744 /* First see if the name matches exactly, or with a final "000"
15745 turned into "k". */
15746 if (mips_strict_matching_cpu_name_p (canonical, given))
15747 return TRUE;
15748
15749 /* If not, try comparing based on numerical designation alone.
15750 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15751 if (TOLOWER (*given) == 'r')
15752 given++;
15753 if (!ISDIGIT (*given))
15754 return FALSE;
15755
15756 /* Skip over some well-known prefixes in the canonical name,
15757 hoping to find a number there too. */
15758 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15759 canonical += 2;
15760 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15761 canonical += 2;
15762 else if (TOLOWER (canonical[0]) == 'r')
15763 canonical += 1;
15764
15765 return mips_strict_matching_cpu_name_p (canonical, given);
15766 }
15767
15768
15769 /* Parse an option that takes the name of a processor as its argument.
15770 OPTION is the name of the option and CPU_STRING is the argument.
15771 Return the corresponding processor enumeration if the CPU_STRING is
15772 recognized, otherwise report an error and return null.
15773
15774 A similar function exists in GCC. */
15775
15776 static const struct mips_cpu_info *
15777 mips_parse_cpu (const char *option, const char *cpu_string)
15778 {
15779 const struct mips_cpu_info *p;
15780
15781 /* 'from-abi' selects the most compatible architecture for the given
15782 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15783 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15784 version. Look first at the -mgp options, if given, otherwise base
15785 the choice on MIPS_DEFAULT_64BIT.
15786
15787 Treat NO_ABI like the EABIs. One reason to do this is that the
15788 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15789 architecture. This code picks MIPS I for 'mips' and MIPS III for
15790 'mips64', just as we did in the days before 'from-abi'. */
15791 if (strcasecmp (cpu_string, "from-abi") == 0)
15792 {
15793 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15794 return mips_cpu_info_from_isa (ISA_MIPS1);
15795
15796 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15797 return mips_cpu_info_from_isa (ISA_MIPS3);
15798
15799 if (file_mips_gp32 >= 0)
15800 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15801
15802 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15803 ? ISA_MIPS3
15804 : ISA_MIPS1);
15805 }
15806
15807 /* 'default' has traditionally been a no-op. Probably not very useful. */
15808 if (strcasecmp (cpu_string, "default") == 0)
15809 return 0;
15810
15811 for (p = mips_cpu_info_table; p->name != 0; p++)
15812 if (mips_matching_cpu_name_p (p->name, cpu_string))
15813 return p;
15814
15815 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15816 return 0;
15817 }
15818
15819 /* Return the canonical processor information for ISA (a member of the
15820 ISA_MIPS* enumeration). */
15821
15822 static const struct mips_cpu_info *
15823 mips_cpu_info_from_isa (int isa)
15824 {
15825 int i;
15826
15827 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15828 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15829 && isa == mips_cpu_info_table[i].isa)
15830 return (&mips_cpu_info_table[i]);
15831
15832 return NULL;
15833 }
15834
15835 static const struct mips_cpu_info *
15836 mips_cpu_info_from_arch (int arch)
15837 {
15838 int i;
15839
15840 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15841 if (arch == mips_cpu_info_table[i].cpu)
15842 return (&mips_cpu_info_table[i]);
15843
15844 return NULL;
15845 }
15846 \f
15847 static void
15848 show (FILE *stream, const char *string, int *col_p, int *first_p)
15849 {
15850 if (*first_p)
15851 {
15852 fprintf (stream, "%24s", "");
15853 *col_p = 24;
15854 }
15855 else
15856 {
15857 fprintf (stream, ", ");
15858 *col_p += 2;
15859 }
15860
15861 if (*col_p + strlen (string) > 72)
15862 {
15863 fprintf (stream, "\n%24s", "");
15864 *col_p = 24;
15865 }
15866
15867 fprintf (stream, "%s", string);
15868 *col_p += strlen (string);
15869
15870 *first_p = 0;
15871 }
15872
15873 void
15874 md_show_usage (FILE *stream)
15875 {
15876 int column, first;
15877 size_t i;
15878
15879 fprintf (stream, _("\
15880 MIPS options:\n\
15881 -EB generate big endian output\n\
15882 -EL generate little endian output\n\
15883 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15884 -G NUM allow referencing objects up to NUM bytes\n\
15885 implicitly with the gp register [default 8]\n"));
15886 fprintf (stream, _("\
15887 -mips1 generate MIPS ISA I instructions\n\
15888 -mips2 generate MIPS ISA II instructions\n\
15889 -mips3 generate MIPS ISA III instructions\n\
15890 -mips4 generate MIPS ISA IV instructions\n\
15891 -mips5 generate MIPS ISA V instructions\n\
15892 -mips32 generate MIPS32 ISA instructions\n\
15893 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15894 -mips64 generate MIPS64 ISA instructions\n\
15895 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
15896 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15897
15898 first = 1;
15899
15900 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15901 show (stream, mips_cpu_info_table[i].name, &column, &first);
15902 show (stream, "from-abi", &column, &first);
15903 fputc ('\n', stream);
15904
15905 fprintf (stream, _("\
15906 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15907 -no-mCPU don't generate code specific to CPU.\n\
15908 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15909
15910 first = 1;
15911
15912 show (stream, "3900", &column, &first);
15913 show (stream, "4010", &column, &first);
15914 show (stream, "4100", &column, &first);
15915 show (stream, "4650", &column, &first);
15916 fputc ('\n', stream);
15917
15918 fprintf (stream, _("\
15919 -mips16 generate mips16 instructions\n\
15920 -no-mips16 do not generate mips16 instructions\n"));
15921 fprintf (stream, _("\
15922 -msmartmips generate smartmips instructions\n\
15923 -mno-smartmips do not generate smartmips instructions\n"));
15924 fprintf (stream, _("\
15925 -mdsp generate DSP instructions\n\
15926 -mno-dsp do not generate DSP instructions\n"));
15927 fprintf (stream, _("\
15928 -mdspr2 generate DSP R2 instructions\n\
15929 -mno-dspr2 do not generate DSP R2 instructions\n"));
15930 fprintf (stream, _("\
15931 -mmt generate MT instructions\n\
15932 -mno-mt do not generate MT instructions\n"));
15933 fprintf (stream, _("\
15934 -mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
15935 -mfix-loongson2f-nop work around Loongson2F NOP errata\n\
15936 -mfix-vr4120 work around certain VR4120 errata\n\
15937 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
15938 -mfix-24k insert a nop after ERET and DERET instructions\n\
15939 -mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
15940 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15941 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15942 -msym32 assume all symbols have 32-bit values\n\
15943 -O0 remove unneeded NOPs, do not swap branches\n\
15944 -O remove unneeded NOPs and swap branches\n\
15945 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15946 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15947 fprintf (stream, _("\
15948 -mhard-float allow floating-point instructions\n\
15949 -msoft-float do not allow floating-point instructions\n\
15950 -msingle-float only allow 32-bit floating-point operations\n\
15951 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15952 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15953 ));
15954 #ifdef OBJ_ELF
15955 fprintf (stream, _("\
15956 -KPIC, -call_shared generate SVR4 position independent code\n\
15957 -call_nonpic generate non-PIC code that can operate with DSOs\n\
15958 -mvxworks-pic generate VxWorks position independent code\n\
15959 -non_shared do not generate code that can operate with DSOs\n\
15960 -xgot assume a 32 bit GOT\n\
15961 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
15962 -mshared, -mno-shared disable/enable .cpload optimization for\n\
15963 position dependent (non shared) code\n\
15964 -mabi=ABI create ABI conformant object file for:\n"));
15965
15966 first = 1;
15967
15968 show (stream, "32", &column, &first);
15969 show (stream, "o64", &column, &first);
15970 show (stream, "n32", &column, &first);
15971 show (stream, "64", &column, &first);
15972 show (stream, "eabi", &column, &first);
15973
15974 fputc ('\n', stream);
15975
15976 fprintf (stream, _("\
15977 -32 create o32 ABI object file (default)\n\
15978 -n32 create n32 ABI object file\n\
15979 -64 create 64 ABI object file\n"));
15980 #endif
15981 }
15982
15983 #ifdef TE_IRIX
15984 enum dwarf2_format
15985 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15986 {
15987 if (HAVE_64BIT_SYMBOLS)
15988 return dwarf2_format_64bit_irix;
15989 else
15990 return dwarf2_format_32bit;
15991 }
15992 #endif
15993
15994 int
15995 mips_dwarf2_addr_size (void)
15996 {
15997 if (HAVE_64BIT_OBJECTS)
15998 return 8;
15999 else
16000 return 4;
16001 }
16002
16003 /* Standard calling conventions leave the CFA at SP on entry. */
16004 void
16005 mips_cfi_frame_initial_instructions (void)
16006 {
16007 cfi_add_CFA_def_cfa_register (SP);
16008 }
16009
16010 int
16011 tc_mips_regname_to_dw2regnum (char *regname)
16012 {
16013 unsigned int regnum = -1;
16014 unsigned int reg;
16015
16016 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
16017 regnum = reg;
16018
16019 return regnum;
16020 }
This page took 0.381458 seconds and 4 git commands to generate.