include/opcode/
[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, 2011, 2012, 2013
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 /* Check assumptions made in this file. */
38 typedef char static_assert1[sizeof (offsetT) < 8 ? -1 : 1];
39 typedef char static_assert2[sizeof (valueT) < 8 ? -1 : 1];
40
41 #ifdef DEBUG
42 #define DBG(x) printf x
43 #else
44 #define DBG(x)
45 #endif
46
47 /* Clean up namespace so we can include obj-elf.h too. */
48 static int mips_output_flavor (void);
49 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
50 #undef OBJ_PROCESS_STAB
51 #undef OUTPUT_FLAVOR
52 #undef S_GET_ALIGN
53 #undef S_GET_SIZE
54 #undef S_SET_ALIGN
55 #undef S_SET_SIZE
56 #undef obj_frob_file
57 #undef obj_frob_file_after_relocs
58 #undef obj_frob_symbol
59 #undef obj_pop_insert
60 #undef obj_sec_sym_ok_for_reloc
61 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
62
63 #include "obj-elf.h"
64 /* Fix any of them that we actually care about. */
65 #undef OUTPUT_FLAVOR
66 #define OUTPUT_FLAVOR mips_output_flavor()
67
68 #include "elf/mips.h"
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 static char *mips_regmask_frag;
89
90 #define ZERO 0
91 #define ATREG 1
92 #define S0 16
93 #define S7 23
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 extern int target_big_endian;
108
109 /* The name of the readonly data section. */
110 #define RDATA_SECTION_NAME ".rodata"
111
112 /* Ways in which an instruction can be "appended" to the output. */
113 enum append_method {
114 /* Just add it normally. */
115 APPEND_ADD,
116
117 /* Add it normally and then add a nop. */
118 APPEND_ADD_WITH_NOP,
119
120 /* Turn an instruction with a delay slot into a "compact" version. */
121 APPEND_ADD_COMPACT,
122
123 /* Insert the instruction before the last one. */
124 APPEND_SWAP
125 };
126
127 /* Information about an instruction, including its format, operands
128 and fixups. */
129 struct mips_cl_insn
130 {
131 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
132 const struct mips_opcode *insn_mo;
133
134 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
135 a copy of INSN_MO->match with the operands filled in. If we have
136 decided to use an extended MIPS16 instruction, this includes the
137 extension. */
138 unsigned long insn_opcode;
139
140 /* The frag that contains the instruction. */
141 struct frag *frag;
142
143 /* The offset into FRAG of the first instruction byte. */
144 long where;
145
146 /* The relocs associated with the instruction, if any. */
147 fixS *fixp[3];
148
149 /* True if this entry cannot be moved from its current position. */
150 unsigned int fixed_p : 1;
151
152 /* True if this instruction occurred in a .set noreorder block. */
153 unsigned int noreorder_p : 1;
154
155 /* True for mips16 instructions that jump to an absolute address. */
156 unsigned int mips16_absolute_jump_p : 1;
157
158 /* True if this instruction is complete. */
159 unsigned int complete_p : 1;
160
161 /* True if this instruction is cleared from history by unconditional
162 branch. */
163 unsigned int cleared_p : 1;
164 };
165
166 /* The ABI to use. */
167 enum mips_abi_level
168 {
169 NO_ABI = 0,
170 O32_ABI,
171 O64_ABI,
172 N32_ABI,
173 N64_ABI,
174 EABI_ABI
175 };
176
177 /* MIPS ABI we are using for this output file. */
178 static enum mips_abi_level mips_abi = NO_ABI;
179
180 /* Whether or not we have code that can call pic code. */
181 int mips_abicalls = FALSE;
182
183 /* Whether or not we have code which can be put into a shared
184 library. */
185 static bfd_boolean mips_in_shared = TRUE;
186
187 /* This is the set of options which may be modified by the .set
188 pseudo-op. We use a struct so that .set push and .set pop are more
189 reliable. */
190
191 struct mips_set_options
192 {
193 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
194 if it has not been initialized. Changed by `.set mipsN', and the
195 -mipsN command line option, and the default CPU. */
196 int isa;
197 /* Enabled Application Specific Extensions (ASEs). Changed by `.set
198 <asename>', by command line options, and based on the default
199 architecture. */
200 int ase;
201 /* Whether we are assembling for the mips16 processor. 0 if we are
202 not, 1 if we are, and -1 if the value has not been initialized.
203 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
204 -nomips16 command line options, and the default CPU. */
205 int mips16;
206 /* Whether we are assembling for the mipsMIPS ASE. 0 if we are not,
207 1 if we are, and -1 if the value has not been initialized. Changed
208 by `.set micromips' and `.set nomicromips', and the -mmicromips
209 and -mno-micromips command line options, and the default CPU. */
210 int micromips;
211 /* Non-zero if we should not reorder instructions. Changed by `.set
212 reorder' and `.set noreorder'. */
213 int noreorder;
214 /* Non-zero if we should not permit the register designated "assembler
215 temporary" to be used in instructions. The value is the register
216 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
217 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
218 unsigned int at;
219 /* Non-zero if we should warn when a macro instruction expands into
220 more than one machine instruction. Changed by `.set nomacro' and
221 `.set macro'. */
222 int warn_about_macros;
223 /* Non-zero if we should not move instructions. Changed by `.set
224 move', `.set volatile', `.set nomove', and `.set novolatile'. */
225 int nomove;
226 /* Non-zero if we should not optimize branches by moving the target
227 of the branch into the delay slot. Actually, we don't perform
228 this optimization anyhow. Changed by `.set bopt' and `.set
229 nobopt'. */
230 int nobopt;
231 /* Non-zero if we should not autoextend mips16 instructions.
232 Changed by `.set autoextend' and `.set noautoextend'. */
233 int noautoextend;
234 /* True if we should only emit 32-bit microMIPS instructions.
235 Changed by `.set insn32' and `.set noinsn32', and the -minsn32
236 and -mno-insn32 command line options. */
237 bfd_boolean insn32;
238 /* Restrict general purpose registers and floating point registers
239 to 32 bit. This is initially determined when -mgp32 or -mfp32
240 is passed but can changed if the assembler code uses .set mipsN. */
241 int gp32;
242 int fp32;
243 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
244 command line option, and the default CPU. */
245 int arch;
246 /* True if ".set sym32" is in effect. */
247 bfd_boolean sym32;
248 /* True if floating-point operations are not allowed. Changed by .set
249 softfloat or .set hardfloat, by command line options -msoft-float or
250 -mhard-float. The default is false. */
251 bfd_boolean soft_float;
252
253 /* True if only single-precision floating-point operations are allowed.
254 Changed by .set singlefloat or .set doublefloat, command-line options
255 -msingle-float or -mdouble-float. The default is false. */
256 bfd_boolean single_float;
257 };
258
259 /* This is the struct we use to hold the current set of options. Note
260 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
261 -1 to indicate that they have not been initialized. */
262
263 /* True if -mgp32 was passed. */
264 static int file_mips_gp32 = -1;
265
266 /* True if -mfp32 was passed. */
267 static int file_mips_fp32 = -1;
268
269 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
270 static int file_mips_soft_float = 0;
271
272 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
273 static int file_mips_single_float = 0;
274
275 static struct mips_set_options mips_opts =
276 {
277 /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
278 /* noreorder */ 0, /* at */ ATREG, /* warn_about_macros */ 0,
279 /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* insn32 */ FALSE,
280 /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
281 /* soft_float */ FALSE, /* single_float */ FALSE
282 };
283
284 /* The set of ASEs that were selected on the command line, either
285 explicitly via ASE options or implicitly through things like -march. */
286 static unsigned int file_ase;
287
288 /* Which bits of file_ase were explicitly set or cleared by ASE options. */
289 static unsigned int file_ase_explicit;
290
291 /* These variables are filled in with the masks of registers used.
292 The object format code reads them and puts them in the appropriate
293 place. */
294 unsigned long mips_gprmask;
295 unsigned long mips_cprmask[4];
296
297 /* MIPS ISA we are using for this output file. */
298 static int file_mips_isa = ISA_UNKNOWN;
299
300 /* True if any MIPS16 code was produced. */
301 static int file_ase_mips16;
302
303 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
304 || mips_opts.isa == ISA_MIPS32R2 \
305 || mips_opts.isa == ISA_MIPS64 \
306 || mips_opts.isa == ISA_MIPS64R2)
307
308 /* True if any microMIPS code was produced. */
309 static int file_ase_micromips;
310
311 /* True if we want to create R_MIPS_JALR for jalr $25. */
312 #ifdef TE_IRIX
313 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
314 #else
315 /* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
316 because there's no place for any addend, the only acceptable
317 expression is a bare symbol. */
318 #define MIPS_JALR_HINT_P(EXPR) \
319 (!HAVE_IN_PLACE_ADDENDS \
320 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
321 #endif
322
323 /* The argument of the -march= flag. The architecture we are assembling. */
324 static int file_mips_arch = CPU_UNKNOWN;
325 static const char *mips_arch_string;
326
327 /* The argument of the -mtune= flag. The architecture for which we
328 are optimizing. */
329 static int mips_tune = CPU_UNKNOWN;
330 static const char *mips_tune_string;
331
332 /* True when generating 32-bit code for a 64-bit processor. */
333 static int mips_32bitmode = 0;
334
335 /* True if the given ABI requires 32-bit registers. */
336 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
337
338 /* Likewise 64-bit registers. */
339 #define ABI_NEEDS_64BIT_REGS(ABI) \
340 ((ABI) == N32_ABI \
341 || (ABI) == N64_ABI \
342 || (ABI) == O64_ABI)
343
344 /* Return true if ISA supports 64 bit wide gp registers. */
345 #define ISA_HAS_64BIT_REGS(ISA) \
346 ((ISA) == ISA_MIPS3 \
347 || (ISA) == ISA_MIPS4 \
348 || (ISA) == ISA_MIPS5 \
349 || (ISA) == ISA_MIPS64 \
350 || (ISA) == ISA_MIPS64R2)
351
352 /* Return true if ISA supports 64 bit wide float registers. */
353 #define ISA_HAS_64BIT_FPRS(ISA) \
354 ((ISA) == ISA_MIPS3 \
355 || (ISA) == ISA_MIPS4 \
356 || (ISA) == ISA_MIPS5 \
357 || (ISA) == ISA_MIPS32R2 \
358 || (ISA) == ISA_MIPS64 \
359 || (ISA) == ISA_MIPS64R2)
360
361 /* Return true if ISA supports 64-bit right rotate (dror et al.)
362 instructions. */
363 #define ISA_HAS_DROR(ISA) \
364 ((ISA) == ISA_MIPS64R2 \
365 || (mips_opts.micromips \
366 && ISA_HAS_64BIT_REGS (ISA)) \
367 )
368
369 /* Return true if ISA supports 32-bit right rotate (ror et al.)
370 instructions. */
371 #define ISA_HAS_ROR(ISA) \
372 ((ISA) == ISA_MIPS32R2 \
373 || (ISA) == ISA_MIPS64R2 \
374 || (mips_opts.ase & ASE_SMARTMIPS) \
375 || mips_opts.micromips \
376 )
377
378 /* Return true if ISA supports single-precision floats in odd registers. */
379 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
380 ((ISA) == ISA_MIPS32 \
381 || (ISA) == ISA_MIPS32R2 \
382 || (ISA) == ISA_MIPS64 \
383 || (ISA) == ISA_MIPS64R2)
384
385 /* Return true if ISA supports move to/from high part of a 64-bit
386 floating-point register. */
387 #define ISA_HAS_MXHC1(ISA) \
388 ((ISA) == ISA_MIPS32R2 \
389 || (ISA) == ISA_MIPS64R2)
390
391 #define HAVE_32BIT_GPRS \
392 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
393
394 #define HAVE_32BIT_FPRS \
395 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
396
397 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
398 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
399
400 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
401
402 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
403
404 /* True if relocations are stored in-place. */
405 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
406
407 /* The ABI-derived address size. */
408 #define HAVE_64BIT_ADDRESSES \
409 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
410 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
411
412 /* The size of symbolic constants (i.e., expressions of the form
413 "SYMBOL" or "SYMBOL + OFFSET"). */
414 #define HAVE_32BIT_SYMBOLS \
415 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
416 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
417
418 /* Addresses are loaded in different ways, depending on the address size
419 in use. The n32 ABI Documentation also mandates the use of additions
420 with overflow checking, but existing implementations don't follow it. */
421 #define ADDRESS_ADD_INSN \
422 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
423
424 #define ADDRESS_ADDI_INSN \
425 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
426
427 #define ADDRESS_LOAD_INSN \
428 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
429
430 #define ADDRESS_STORE_INSN \
431 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
432
433 /* Return true if the given CPU supports the MIPS16 ASE. */
434 #define CPU_HAS_MIPS16(cpu) \
435 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
436 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
437
438 /* Return true if the given CPU supports the microMIPS ASE. */
439 #define CPU_HAS_MICROMIPS(cpu) 0
440
441 /* True if CPU has a dror instruction. */
442 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443
444 /* True if CPU has a ror instruction. */
445 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
446
447 /* True if CPU is in the Octeon family */
448 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
449
450 /* True if CPU has seq/sne and seqi/snei instructions. */
451 #define CPU_HAS_SEQ(CPU) (CPU_IS_OCTEON (CPU))
452
453 /* True, if CPU has support for ldc1 and sdc1. */
454 #define CPU_HAS_LDC1_SDC1(CPU) \
455 ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
456
457 /* True if mflo and mfhi can be immediately followed by instructions
458 which write to the HI and LO registers.
459
460 According to MIPS specifications, MIPS ISAs I, II, and III need
461 (at least) two instructions between the reads of HI/LO and
462 instructions which write them, and later ISAs do not. Contradicting
463 the MIPS specifications, some MIPS IV processor user manuals (e.g.
464 the UM for the NEC Vr5000) document needing the instructions between
465 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
466 MIPS64 and later ISAs to have the interlocks, plus any specific
467 earlier-ISA CPUs for which CPU documentation declares that the
468 instructions are really interlocked. */
469 #define hilo_interlocks \
470 (mips_opts.isa == ISA_MIPS32 \
471 || mips_opts.isa == ISA_MIPS32R2 \
472 || mips_opts.isa == ISA_MIPS64 \
473 || mips_opts.isa == ISA_MIPS64R2 \
474 || mips_opts.arch == CPU_R4010 \
475 || mips_opts.arch == CPU_R5900 \
476 || mips_opts.arch == CPU_R10000 \
477 || mips_opts.arch == CPU_R12000 \
478 || mips_opts.arch == CPU_R14000 \
479 || mips_opts.arch == CPU_R16000 \
480 || mips_opts.arch == CPU_RM7000 \
481 || mips_opts.arch == CPU_VR5500 \
482 || mips_opts.micromips \
483 )
484
485 /* Whether the processor uses hardware interlocks to protect reads
486 from the GPRs after they are loaded from memory, and thus does not
487 require nops to be inserted. This applies to instructions marked
488 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
489 level I and microMIPS mode instructions are always interlocked. */
490 #define gpr_interlocks \
491 (mips_opts.isa != ISA_MIPS1 \
492 || mips_opts.arch == CPU_R3900 \
493 || mips_opts.arch == CPU_R5900 \
494 || mips_opts.micromips \
495 )
496
497 /* Whether the processor uses hardware interlocks to avoid delays
498 required by coprocessor instructions, and thus does not require
499 nops to be inserted. This applies to instructions marked
500 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
501 between instructions marked INSN_WRITE_COND_CODE and ones marked
502 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
503 levels I, II, and III and microMIPS mode instructions are always
504 interlocked. */
505 /* Itbl support may require additional care here. */
506 #define cop_interlocks \
507 ((mips_opts.isa != ISA_MIPS1 \
508 && mips_opts.isa != ISA_MIPS2 \
509 && mips_opts.isa != ISA_MIPS3) \
510 || mips_opts.arch == CPU_R4300 \
511 || mips_opts.micromips \
512 )
513
514 /* Whether the processor uses hardware interlocks to protect reads
515 from coprocessor registers after they are loaded from memory, and
516 thus does not require nops to be inserted. This applies to
517 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
518 requires at MIPS ISA level I and microMIPS mode instructions are
519 always interlocked. */
520 #define cop_mem_interlocks \
521 (mips_opts.isa != ISA_MIPS1 \
522 || mips_opts.micromips \
523 )
524
525 /* Is this a mfhi or mflo instruction? */
526 #define MF_HILO_INSN(PINFO) \
527 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
528
529 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
530 has been selected. This implies, in particular, that addresses of text
531 labels have their LSB set. */
532 #define HAVE_CODE_COMPRESSION \
533 ((mips_opts.mips16 | mips_opts.micromips) != 0)
534
535 /* The minimum and maximum signed values that can be stored in a GPR. */
536 #define GPR_SMAX ((offsetT) (((valueT) 1 << (HAVE_64BIT_GPRS ? 63 : 31)) - 1))
537 #define GPR_SMIN (-GPR_SMAX - 1)
538
539 /* MIPS PIC level. */
540
541 enum mips_pic_level mips_pic;
542
543 /* 1 if we should generate 32 bit offsets from the $gp register in
544 SVR4_PIC mode. Currently has no meaning in other modes. */
545 static int mips_big_got = 0;
546
547 /* 1 if trap instructions should used for overflow rather than break
548 instructions. */
549 static int mips_trap = 0;
550
551 /* 1 if double width floating point constants should not be constructed
552 by assembling two single width halves into two single width floating
553 point registers which just happen to alias the double width destination
554 register. On some architectures this aliasing can be disabled by a bit
555 in the status register, and the setting of this bit cannot be determined
556 automatically at assemble time. */
557 static int mips_disable_float_construction;
558
559 /* Non-zero if any .set noreorder directives were used. */
560
561 static int mips_any_noreorder;
562
563 /* Non-zero if nops should be inserted when the register referenced in
564 an mfhi/mflo instruction is read in the next two instructions. */
565 static int mips_7000_hilo_fix;
566
567 /* The size of objects in the small data section. */
568 static unsigned int g_switch_value = 8;
569 /* Whether the -G option was used. */
570 static int g_switch_seen = 0;
571
572 #define N_RMASK 0xc4
573 #define N_VFP 0xd4
574
575 /* If we can determine in advance that GP optimization won't be
576 possible, we can skip the relaxation stuff that tries to produce
577 GP-relative references. This makes delay slot optimization work
578 better.
579
580 This function can only provide a guess, but it seems to work for
581 gcc output. It needs to guess right for gcc, otherwise gcc
582 will put what it thinks is a GP-relative instruction in a branch
583 delay slot.
584
585 I don't know if a fix is needed for the SVR4_PIC mode. I've only
586 fixed it for the non-PIC mode. KR 95/04/07 */
587 static int nopic_need_relax (symbolS *, int);
588
589 /* handle of the OPCODE hash table */
590 static struct hash_control *op_hash = NULL;
591
592 /* The opcode hash table we use for the mips16. */
593 static struct hash_control *mips16_op_hash = NULL;
594
595 /* The opcode hash table we use for the microMIPS ASE. */
596 static struct hash_control *micromips_op_hash = NULL;
597
598 /* This array holds the chars that always start a comment. If the
599 pre-processor is disabled, these aren't very useful */
600 const char comment_chars[] = "#";
601
602 /* This array holds the chars that only start a comment at the beginning of
603 a line. If the line seems to have the form '# 123 filename'
604 .line and .file directives will appear in the pre-processed output */
605 /* Note that input_file.c hand checks for '#' at the beginning of the
606 first line of the input file. This is because the compiler outputs
607 #NO_APP at the beginning of its output. */
608 /* Also note that C style comments are always supported. */
609 const char line_comment_chars[] = "#";
610
611 /* This array holds machine specific line separator characters. */
612 const char line_separator_chars[] = ";";
613
614 /* Chars that can be used to separate mant from exp in floating point nums */
615 const char EXP_CHARS[] = "eE";
616
617 /* Chars that mean this number is a floating point constant */
618 /* As in 0f12.456 */
619 /* or 0d1.2345e12 */
620 const char FLT_CHARS[] = "rRsSfFdDxXpP";
621
622 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
623 changed in read.c . Ideally it shouldn't have to know about it at all,
624 but nothing is ideal around here.
625 */
626
627 static char *insn_error;
628
629 static int auto_align = 1;
630
631 /* When outputting SVR4 PIC code, the assembler needs to know the
632 offset in the stack frame from which to restore the $gp register.
633 This is set by the .cprestore pseudo-op, and saved in this
634 variable. */
635 static offsetT mips_cprestore_offset = -1;
636
637 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
638 more optimizations, it can use a register value instead of a memory-saved
639 offset and even an other register than $gp as global pointer. */
640 static offsetT mips_cpreturn_offset = -1;
641 static int mips_cpreturn_register = -1;
642 static int mips_gp_register = GP;
643 static int mips_gprel_offset = 0;
644
645 /* Whether mips_cprestore_offset has been set in the current function
646 (or whether it has already been warned about, if not). */
647 static int mips_cprestore_valid = 0;
648
649 /* This is the register which holds the stack frame, as set by the
650 .frame pseudo-op. This is needed to implement .cprestore. */
651 static int mips_frame_reg = SP;
652
653 /* Whether mips_frame_reg has been set in the current function
654 (or whether it has already been warned about, if not). */
655 static int mips_frame_reg_valid = 0;
656
657 /* To output NOP instructions correctly, we need to keep information
658 about the previous two instructions. */
659
660 /* Whether we are optimizing. The default value of 2 means to remove
661 unneeded NOPs and swap branch instructions when possible. A value
662 of 1 means to not swap branches. A value of 0 means to always
663 insert NOPs. */
664 static int mips_optimize = 2;
665
666 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
667 equivalent to seeing no -g option at all. */
668 static int mips_debug = 0;
669
670 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
671 #define MAX_VR4130_NOPS 4
672
673 /* The maximum number of NOPs needed to fill delay slots. */
674 #define MAX_DELAY_NOPS 2
675
676 /* The maximum number of NOPs needed for any purpose. */
677 #define MAX_NOPS 4
678
679 /* A list of previous instructions, with index 0 being the most recent.
680 We need to look back MAX_NOPS instructions when filling delay slots
681 or working around processor errata. We need to look back one
682 instruction further if we're thinking about using history[0] to
683 fill a branch delay slot. */
684 static struct mips_cl_insn history[1 + MAX_NOPS];
685
686 /* Nop instructions used by emit_nop. */
687 static struct mips_cl_insn nop_insn;
688 static struct mips_cl_insn mips16_nop_insn;
689 static struct mips_cl_insn micromips_nop16_insn;
690 static struct mips_cl_insn micromips_nop32_insn;
691
692 /* The appropriate nop for the current mode. */
693 #define NOP_INSN (mips_opts.mips16 \
694 ? &mips16_nop_insn \
695 : (mips_opts.micromips \
696 ? (mips_opts.insn32 \
697 ? &micromips_nop32_insn \
698 : &micromips_nop16_insn) \
699 : &nop_insn))
700
701 /* The size of NOP_INSN in bytes. */
702 #define NOP_INSN_SIZE ((mips_opts.mips16 \
703 || (mips_opts.micromips && !mips_opts.insn32)) \
704 ? 2 : 4)
705
706 /* If this is set, it points to a frag holding nop instructions which
707 were inserted before the start of a noreorder section. If those
708 nops turn out to be unnecessary, the size of the frag can be
709 decreased. */
710 static fragS *prev_nop_frag;
711
712 /* The number of nop instructions we created in prev_nop_frag. */
713 static int prev_nop_frag_holds;
714
715 /* The number of nop instructions that we know we need in
716 prev_nop_frag. */
717 static int prev_nop_frag_required;
718
719 /* The number of instructions we've seen since prev_nop_frag. */
720 static int prev_nop_frag_since;
721
722 /* Relocations against symbols are sometimes done in two parts, with a HI
723 relocation and a LO relocation. Each relocation has only 16 bits of
724 space to store an addend. This means that in order for the linker to
725 handle carries correctly, it must be able to locate both the HI and
726 the LO relocation. This means that the relocations must appear in
727 order in the relocation table.
728
729 In order to implement this, we keep track of each unmatched HI
730 relocation. We then sort them so that they immediately precede the
731 corresponding LO relocation. */
732
733 struct mips_hi_fixup
734 {
735 /* Next HI fixup. */
736 struct mips_hi_fixup *next;
737 /* This fixup. */
738 fixS *fixp;
739 /* The section this fixup is in. */
740 segT seg;
741 };
742
743 /* The list of unmatched HI relocs. */
744
745 static struct mips_hi_fixup *mips_hi_fixup_list;
746
747 /* The frag containing the last explicit relocation operator.
748 Null if explicit relocations have not been used. */
749
750 static fragS *prev_reloc_op_frag;
751
752 /* Map normal MIPS register numbers to mips16 register numbers. */
753
754 #define X ILLEGAL_REG
755 static const int mips32_to_16_reg_map[] =
756 {
757 X, X, 2, 3, 4, 5, 6, 7,
758 X, X, X, X, X, X, X, X,
759 0, 1, X, X, X, X, X, X,
760 X, X, X, X, X, X, X, X
761 };
762 #undef X
763
764 /* Map mips16 register numbers to normal MIPS register numbers. */
765
766 static const unsigned int mips16_to_32_reg_map[] =
767 {
768 16, 17, 2, 3, 4, 5, 6, 7
769 };
770
771 /* Map normal MIPS register numbers to microMIPS register numbers. */
772
773 #define mips32_to_micromips_reg_b_map mips32_to_16_reg_map
774 #define mips32_to_micromips_reg_c_map mips32_to_16_reg_map
775 #define mips32_to_micromips_reg_d_map mips32_to_16_reg_map
776 #define mips32_to_micromips_reg_e_map mips32_to_16_reg_map
777 #define mips32_to_micromips_reg_f_map mips32_to_16_reg_map
778 #define mips32_to_micromips_reg_g_map mips32_to_16_reg_map
779 #define mips32_to_micromips_reg_l_map mips32_to_16_reg_map
780
781 #define X ILLEGAL_REG
782 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20. */
783 static const int mips32_to_micromips_reg_m_map[] =
784 {
785 0, X, 2, 3, X, X, X, X,
786 X, X, X, X, X, X, X, X,
787 4, 1, 5, 6, 7, X, X, X,
788 X, X, X, X, X, X, X, X
789 };
790
791 /* reg type q: 0, 2-7. 17. */
792 static const int mips32_to_micromips_reg_q_map[] =
793 {
794 0, X, 2, 3, 4, 5, 6, 7,
795 X, X, X, X, X, X, X, X,
796 X, 1, X, X, X, X, X, X,
797 X, X, X, X, X, X, X, X
798 };
799
800 #define mips32_to_micromips_reg_n_map mips32_to_micromips_reg_m_map
801 #undef X
802
803 /* Map microMIPS register numbers to normal MIPS register numbers. */
804
805 #define micromips_to_32_reg_b_map mips16_to_32_reg_map
806 #define micromips_to_32_reg_c_map mips16_to_32_reg_map
807 #define micromips_to_32_reg_d_map mips16_to_32_reg_map
808 #define micromips_to_32_reg_e_map mips16_to_32_reg_map
809 #define micromips_to_32_reg_f_map mips16_to_32_reg_map
810 #define micromips_to_32_reg_g_map mips16_to_32_reg_map
811
812 /* The microMIPS registers with type h. */
813 static const unsigned int micromips_to_32_reg_h_map1[] =
814 {
815 5, 5, 6, 4, 4, 4, 4, 4
816 };
817 static const unsigned int micromips_to_32_reg_h_map2[] =
818 {
819 6, 7, 7, 21, 22, 5, 6, 7
820 };
821
822 #define micromips_to_32_reg_l_map mips16_to_32_reg_map
823
824 /* The microMIPS registers with type m. */
825 static const unsigned int micromips_to_32_reg_m_map[] =
826 {
827 0, 17, 2, 3, 16, 18, 19, 20
828 };
829
830 #define micromips_to_32_reg_n_map micromips_to_32_reg_m_map
831
832 /* The microMIPS registers with type q. */
833 static const unsigned int micromips_to_32_reg_q_map[] =
834 {
835 0, 17, 2, 3, 4, 5, 6, 7
836 };
837
838 /* microMIPS imm type B. */
839 static const int micromips_imm_b_map[] =
840 {
841 1, 4, 8, 12, 16, 20, 24, -1
842 };
843
844 /* microMIPS imm type C. */
845 static const int micromips_imm_c_map[] =
846 {
847 128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
848 };
849
850 /* Classifies the kind of instructions we're interested in when
851 implementing -mfix-vr4120. */
852 enum fix_vr4120_class
853 {
854 FIX_VR4120_MACC,
855 FIX_VR4120_DMACC,
856 FIX_VR4120_MULT,
857 FIX_VR4120_DMULT,
858 FIX_VR4120_DIV,
859 FIX_VR4120_MTHILO,
860 NUM_FIX_VR4120_CLASSES
861 };
862
863 /* ...likewise -mfix-loongson2f-jump. */
864 static bfd_boolean mips_fix_loongson2f_jump;
865
866 /* ...likewise -mfix-loongson2f-nop. */
867 static bfd_boolean mips_fix_loongson2f_nop;
868
869 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
870 static bfd_boolean mips_fix_loongson2f;
871
872 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
873 there must be at least one other instruction between an instruction
874 of type X and an instruction of type Y. */
875 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
876
877 /* True if -mfix-vr4120 is in force. */
878 static int mips_fix_vr4120;
879
880 /* ...likewise -mfix-vr4130. */
881 static int mips_fix_vr4130;
882
883 /* ...likewise -mfix-24k. */
884 static int mips_fix_24k;
885
886 /* ...likewise -mfix-cn63xxp1 */
887 static bfd_boolean mips_fix_cn63xxp1;
888
889 /* We don't relax branches by default, since this causes us to expand
890 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
891 fail to compute the offset before expanding the macro to the most
892 efficient expansion. */
893
894 static int mips_relax_branch;
895 \f
896 /* The expansion of many macros depends on the type of symbol that
897 they refer to. For example, when generating position-dependent code,
898 a macro that refers to a symbol may have two different expansions,
899 one which uses GP-relative addresses and one which uses absolute
900 addresses. When generating SVR4-style PIC, a macro may have
901 different expansions for local and global symbols.
902
903 We handle these situations by generating both sequences and putting
904 them in variant frags. In position-dependent code, the first sequence
905 will be the GP-relative one and the second sequence will be the
906 absolute one. In SVR4 PIC, the first sequence will be for global
907 symbols and the second will be for local symbols.
908
909 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
910 SECOND are the lengths of the two sequences in bytes. These fields
911 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
912 the subtype has the following flags:
913
914 RELAX_USE_SECOND
915 Set if it has been decided that we should use the second
916 sequence instead of the first.
917
918 RELAX_SECOND_LONGER
919 Set in the first variant frag if the macro's second implementation
920 is longer than its first. This refers to the macro as a whole,
921 not an individual relaxation.
922
923 RELAX_NOMACRO
924 Set in the first variant frag if the macro appeared in a .set nomacro
925 block and if one alternative requires a warning but the other does not.
926
927 RELAX_DELAY_SLOT
928 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
929 delay slot.
930
931 RELAX_DELAY_SLOT_16BIT
932 Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
933 16-bit instruction.
934
935 RELAX_DELAY_SLOT_SIZE_FIRST
936 Like RELAX_DELAY_SLOT, but indicates that the first implementation of
937 the macro is of the wrong size for the branch delay slot.
938
939 RELAX_DELAY_SLOT_SIZE_SECOND
940 Like RELAX_DELAY_SLOT, but indicates that the second implementation of
941 the macro is of the wrong size for the branch delay slot.
942
943 The frag's "opcode" points to the first fixup for relaxable code.
944
945 Relaxable macros are generated using a sequence such as:
946
947 relax_start (SYMBOL);
948 ... generate first expansion ...
949 relax_switch ();
950 ... generate second expansion ...
951 relax_end ();
952
953 The code and fixups for the unwanted alternative are discarded
954 by md_convert_frag. */
955 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
956
957 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
958 #define RELAX_SECOND(X) ((X) & 0xff)
959 #define RELAX_USE_SECOND 0x10000
960 #define RELAX_SECOND_LONGER 0x20000
961 #define RELAX_NOMACRO 0x40000
962 #define RELAX_DELAY_SLOT 0x80000
963 #define RELAX_DELAY_SLOT_16BIT 0x100000
964 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
965 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
966
967 /* Branch without likely bit. If label is out of range, we turn:
968
969 beq reg1, reg2, label
970 delay slot
971
972 into
973
974 bne reg1, reg2, 0f
975 nop
976 j label
977 0: delay slot
978
979 with the following opcode replacements:
980
981 beq <-> bne
982 blez <-> bgtz
983 bltz <-> bgez
984 bc1f <-> bc1t
985
986 bltzal <-> bgezal (with jal label instead of j label)
987
988 Even though keeping the delay slot instruction in the delay slot of
989 the branch would be more efficient, it would be very tricky to do
990 correctly, because we'd have to introduce a variable frag *after*
991 the delay slot instruction, and expand that instead. Let's do it
992 the easy way for now, even if the branch-not-taken case now costs
993 one additional instruction. Out-of-range branches are not supposed
994 to be common, anyway.
995
996 Branch likely. If label is out of range, we turn:
997
998 beql reg1, reg2, label
999 delay slot (annulled if branch not taken)
1000
1001 into
1002
1003 beql reg1, reg2, 1f
1004 nop
1005 beql $0, $0, 2f
1006 nop
1007 1: j[al] label
1008 delay slot (executed only if branch taken)
1009 2:
1010
1011 It would be possible to generate a shorter sequence by losing the
1012 likely bit, generating something like:
1013
1014 bne reg1, reg2, 0f
1015 nop
1016 j[al] label
1017 delay slot (executed only if branch taken)
1018 0:
1019
1020 beql -> bne
1021 bnel -> beq
1022 blezl -> bgtz
1023 bgtzl -> blez
1024 bltzl -> bgez
1025 bgezl -> bltz
1026 bc1fl -> bc1t
1027 bc1tl -> bc1f
1028
1029 bltzall -> bgezal (with jal label instead of j label)
1030 bgezall -> bltzal (ditto)
1031
1032
1033 but it's not clear that it would actually improve performance. */
1034 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar) \
1035 ((relax_substateT) \
1036 (0xc0000000 \
1037 | ((at) & 0x1f) \
1038 | ((toofar) ? 0x20 : 0) \
1039 | ((link) ? 0x40 : 0) \
1040 | ((likely) ? 0x80 : 0) \
1041 | ((uncond) ? 0x100 : 0)))
1042 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1043 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1044 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1045 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1046 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1047 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1048
1049 /* For mips16 code, we use an entirely different form of relaxation.
1050 mips16 supports two versions of most instructions which take
1051 immediate values: a small one which takes some small value, and a
1052 larger one which takes a 16 bit value. Since branches also follow
1053 this pattern, relaxing these values is required.
1054
1055 We can assemble both mips16 and normal MIPS code in a single
1056 object. Therefore, we need to support this type of relaxation at
1057 the same time that we support the relaxation described above. We
1058 use the high bit of the subtype field to distinguish these cases.
1059
1060 The information we store for this type of relaxation is the
1061 argument code found in the opcode file for this relocation, whether
1062 the user explicitly requested a small or extended form, and whether
1063 the relocation is in a jump or jal delay slot. That tells us the
1064 size of the value, and how it should be stored. We also store
1065 whether the fragment is considered to be extended or not. We also
1066 store whether this is known to be a branch to a different section,
1067 whether we have tried to relax this frag yet, and whether we have
1068 ever extended a PC relative fragment because of a shift count. */
1069 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1070 (0x80000000 \
1071 | ((type) & 0xff) \
1072 | ((small) ? 0x100 : 0) \
1073 | ((ext) ? 0x200 : 0) \
1074 | ((dslot) ? 0x400 : 0) \
1075 | ((jal_dslot) ? 0x800 : 0))
1076 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1077 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1078 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1079 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1080 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1081 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1082 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1083 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1084 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1085 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1086 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1087 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1088
1089 /* For microMIPS code, we use relaxation similar to one we use for
1090 MIPS16 code. Some instructions that take immediate values support
1091 two encodings: a small one which takes some small value, and a
1092 larger one which takes a 16 bit value. As some branches also follow
1093 this pattern, relaxing these values is required.
1094
1095 We can assemble both microMIPS and normal MIPS code in a single
1096 object. Therefore, we need to support this type of relaxation at
1097 the same time that we support the relaxation described above. We
1098 use one of the high bits of the subtype field to distinguish these
1099 cases.
1100
1101 The information we store for this type of relaxation is the argument
1102 code found in the opcode file for this relocation, the register
1103 selected as the assembler temporary, whether the branch is
1104 unconditional, whether it is compact, whether it stores the link
1105 address implicitly in $ra, whether relaxation of out-of-range 32-bit
1106 branches to a sequence of instructions is enabled, and whether the
1107 displacement of a branch is too large to fit as an immediate argument
1108 of a 16-bit and a 32-bit branch, respectively. */
1109 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1110 relax32, toofar16, toofar32) \
1111 (0x40000000 \
1112 | ((type) & 0xff) \
1113 | (((at) & 0x1f) << 8) \
1114 | ((uncond) ? 0x2000 : 0) \
1115 | ((compact) ? 0x4000 : 0) \
1116 | ((link) ? 0x8000 : 0) \
1117 | ((relax32) ? 0x10000 : 0) \
1118 | ((toofar16) ? 0x20000 : 0) \
1119 | ((toofar32) ? 0x40000 : 0))
1120 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1121 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1122 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1123 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1124 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1125 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1126 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1127
1128 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1129 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1130 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1131 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1132 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1133 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1134
1135 /* Sign-extend 16-bit value X. */
1136 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1137
1138 /* Is the given value a sign-extended 32-bit value? */
1139 #define IS_SEXT_32BIT_NUM(x) \
1140 (((x) &~ (offsetT) 0x7fffffff) == 0 \
1141 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1142
1143 /* Is the given value a sign-extended 16-bit value? */
1144 #define IS_SEXT_16BIT_NUM(x) \
1145 (((x) &~ (offsetT) 0x7fff) == 0 \
1146 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1147
1148 /* Is the given value a sign-extended 12-bit value? */
1149 #define IS_SEXT_12BIT_NUM(x) \
1150 (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1151
1152 /* Is the given value a sign-extended 9-bit value? */
1153 #define IS_SEXT_9BIT_NUM(x) \
1154 (((((x) & 0x1ff) ^ 0x100LL) - 0x100LL) == (x))
1155
1156 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
1157 #define IS_ZEXT_32BIT_NUM(x) \
1158 (((x) &~ (offsetT) 0xffffffff) == 0 \
1159 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1160
1161 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1162 VALUE << SHIFT. VALUE is evaluated exactly once. */
1163 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1164 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1165 | (((VALUE) & (MASK)) << (SHIFT)))
1166
1167 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1168 SHIFT places. */
1169 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1170 (((STRUCT) >> (SHIFT)) & (MASK))
1171
1172 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1173 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1174
1175 include/opcode/mips.h specifies operand fields using the macros
1176 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1177 with "MIPS16OP" instead of "OP". */
1178 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1179 do \
1180 if (!(MICROMIPS)) \
1181 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1182 OP_MASK_##FIELD, OP_SH_##FIELD); \
1183 else \
1184 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1185 MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1186 while (0)
1187 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1188 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1189 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1190
1191 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
1192 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1193 (!(MICROMIPS) \
1194 ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1195 : EXTRACT_BITS ((INSN).insn_opcode, \
1196 MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1197 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1198 EXTRACT_BITS ((INSN).insn_opcode, \
1199 MIPS16OP_MASK_##FIELD, \
1200 MIPS16OP_SH_##FIELD)
1201
1202 /* The MIPS16 EXTEND opcode, shifted left 16 places. */
1203 #define MIPS16_EXTEND (0xf000U << 16)
1204 \f
1205 /* Whether or not we are emitting a branch-likely macro. */
1206 static bfd_boolean emit_branch_likely_macro = FALSE;
1207
1208 /* Global variables used when generating relaxable macros. See the
1209 comment above RELAX_ENCODE for more details about how relaxation
1210 is used. */
1211 static struct {
1212 /* 0 if we're not emitting a relaxable macro.
1213 1 if we're emitting the first of the two relaxation alternatives.
1214 2 if we're emitting the second alternative. */
1215 int sequence;
1216
1217 /* The first relaxable fixup in the current frag. (In other words,
1218 the first fixup that refers to relaxable code.) */
1219 fixS *first_fixup;
1220
1221 /* sizes[0] says how many bytes of the first alternative are stored in
1222 the current frag. Likewise sizes[1] for the second alternative. */
1223 unsigned int sizes[2];
1224
1225 /* The symbol on which the choice of sequence depends. */
1226 symbolS *symbol;
1227 } mips_relax;
1228 \f
1229 /* Global variables used to decide whether a macro needs a warning. */
1230 static struct {
1231 /* True if the macro is in a branch delay slot. */
1232 bfd_boolean delay_slot_p;
1233
1234 /* Set to the length in bytes required if the macro is in a delay slot
1235 that requires a specific length of instruction, otherwise zero. */
1236 unsigned int delay_slot_length;
1237
1238 /* For relaxable macros, sizes[0] is the length of the first alternative
1239 in bytes and sizes[1] is the length of the second alternative.
1240 For non-relaxable macros, both elements give the length of the
1241 macro in bytes. */
1242 unsigned int sizes[2];
1243
1244 /* For relaxable macros, first_insn_sizes[0] is the length of the first
1245 instruction of the first alternative in bytes and first_insn_sizes[1]
1246 is the length of the first instruction of the second alternative.
1247 For non-relaxable macros, both elements give the length of the first
1248 instruction in bytes.
1249
1250 Set to zero if we haven't yet seen the first instruction. */
1251 unsigned int first_insn_sizes[2];
1252
1253 /* For relaxable macros, insns[0] is the number of instructions for the
1254 first alternative and insns[1] is the number of instructions for the
1255 second alternative.
1256
1257 For non-relaxable macros, both elements give the number of
1258 instructions for the macro. */
1259 unsigned int insns[2];
1260
1261 /* The first variant frag for this macro. */
1262 fragS *first_frag;
1263 } mips_macro_warning;
1264 \f
1265 /* Prototypes for static functions. */
1266
1267 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1268
1269 static void append_insn
1270 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1271 bfd_boolean expansionp);
1272 static void mips_no_prev_insn (void);
1273 static void macro_build (expressionS *, const char *, const char *, ...);
1274 static void mips16_macro_build
1275 (expressionS *, const char *, const char *, va_list *);
1276 static void load_register (int, expressionS *, int);
1277 static void macro_start (void);
1278 static void macro_end (void);
1279 static void macro (struct mips_cl_insn *ip, char *str);
1280 static void mips16_macro (struct mips_cl_insn * ip);
1281 static void mips_ip (char *str, struct mips_cl_insn * ip);
1282 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1283 static void mips16_immed
1284 (char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1285 unsigned int, unsigned long *);
1286 static size_t my_getSmallExpression
1287 (expressionS *, bfd_reloc_code_real_type *, char *);
1288 static void my_getExpression (expressionS *, char *);
1289 static void s_align (int);
1290 static void s_change_sec (int);
1291 static void s_change_section (int);
1292 static void s_cons (int);
1293 static void s_float_cons (int);
1294 static void s_mips_globl (int);
1295 static void s_option (int);
1296 static void s_mipsset (int);
1297 static void s_abicalls (int);
1298 static void s_cpload (int);
1299 static void s_cpsetup (int);
1300 static void s_cplocal (int);
1301 static void s_cprestore (int);
1302 static void s_cpreturn (int);
1303 static void s_dtprelword (int);
1304 static void s_dtpreldword (int);
1305 static void s_tprelword (int);
1306 static void s_tpreldword (int);
1307 static void s_gpvalue (int);
1308 static void s_gpword (int);
1309 static void s_gpdword (int);
1310 static void s_ehword (int);
1311 static void s_cpadd (int);
1312 static void s_insn (int);
1313 static void md_obj_begin (void);
1314 static void md_obj_end (void);
1315 static void s_mips_ent (int);
1316 static void s_mips_end (int);
1317 static void s_mips_frame (int);
1318 static void s_mips_mask (int reg_type);
1319 static void s_mips_stab (int);
1320 static void s_mips_weakext (int);
1321 static void s_mips_file (int);
1322 static void s_mips_loc (int);
1323 static bfd_boolean pic_need_relax (symbolS *, asection *);
1324 static int relaxed_branch_length (fragS *, asection *, int);
1325 static int validate_mips_insn (const struct mips_opcode *);
1326 static int validate_micromips_insn (const struct mips_opcode *);
1327 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1328 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1329
1330 /* Table and functions used to map between CPU/ISA names, and
1331 ISA levels, and CPU numbers. */
1332
1333 struct mips_cpu_info
1334 {
1335 const char *name; /* CPU or ISA name. */
1336 int flags; /* MIPS_CPU_* flags. */
1337 int ase; /* Set of ASEs implemented by the CPU. */
1338 int isa; /* ISA level. */
1339 int cpu; /* CPU number (default CPU if ISA). */
1340 };
1341
1342 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1343
1344 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1345 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1346 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1347 \f
1348 /* Command-line options. */
1349 const char *md_shortopts = "O::g::G:";
1350
1351 enum options
1352 {
1353 OPTION_MARCH = OPTION_MD_BASE,
1354 OPTION_MTUNE,
1355 OPTION_MIPS1,
1356 OPTION_MIPS2,
1357 OPTION_MIPS3,
1358 OPTION_MIPS4,
1359 OPTION_MIPS5,
1360 OPTION_MIPS32,
1361 OPTION_MIPS64,
1362 OPTION_MIPS32R2,
1363 OPTION_MIPS64R2,
1364 OPTION_MIPS16,
1365 OPTION_NO_MIPS16,
1366 OPTION_MIPS3D,
1367 OPTION_NO_MIPS3D,
1368 OPTION_MDMX,
1369 OPTION_NO_MDMX,
1370 OPTION_DSP,
1371 OPTION_NO_DSP,
1372 OPTION_MT,
1373 OPTION_NO_MT,
1374 OPTION_VIRT,
1375 OPTION_NO_VIRT,
1376 OPTION_SMARTMIPS,
1377 OPTION_NO_SMARTMIPS,
1378 OPTION_DSPR2,
1379 OPTION_NO_DSPR2,
1380 OPTION_EVA,
1381 OPTION_NO_EVA,
1382 OPTION_MICROMIPS,
1383 OPTION_NO_MICROMIPS,
1384 OPTION_MCU,
1385 OPTION_NO_MCU,
1386 OPTION_COMPAT_ARCH_BASE,
1387 OPTION_M4650,
1388 OPTION_NO_M4650,
1389 OPTION_M4010,
1390 OPTION_NO_M4010,
1391 OPTION_M4100,
1392 OPTION_NO_M4100,
1393 OPTION_M3900,
1394 OPTION_NO_M3900,
1395 OPTION_M7000_HILO_FIX,
1396 OPTION_MNO_7000_HILO_FIX,
1397 OPTION_FIX_24K,
1398 OPTION_NO_FIX_24K,
1399 OPTION_FIX_LOONGSON2F_JUMP,
1400 OPTION_NO_FIX_LOONGSON2F_JUMP,
1401 OPTION_FIX_LOONGSON2F_NOP,
1402 OPTION_NO_FIX_LOONGSON2F_NOP,
1403 OPTION_FIX_VR4120,
1404 OPTION_NO_FIX_VR4120,
1405 OPTION_FIX_VR4130,
1406 OPTION_NO_FIX_VR4130,
1407 OPTION_FIX_CN63XXP1,
1408 OPTION_NO_FIX_CN63XXP1,
1409 OPTION_TRAP,
1410 OPTION_BREAK,
1411 OPTION_EB,
1412 OPTION_EL,
1413 OPTION_FP32,
1414 OPTION_GP32,
1415 OPTION_CONSTRUCT_FLOATS,
1416 OPTION_NO_CONSTRUCT_FLOATS,
1417 OPTION_FP64,
1418 OPTION_GP64,
1419 OPTION_RELAX_BRANCH,
1420 OPTION_NO_RELAX_BRANCH,
1421 OPTION_INSN32,
1422 OPTION_NO_INSN32,
1423 OPTION_MSHARED,
1424 OPTION_MNO_SHARED,
1425 OPTION_MSYM32,
1426 OPTION_MNO_SYM32,
1427 OPTION_SOFT_FLOAT,
1428 OPTION_HARD_FLOAT,
1429 OPTION_SINGLE_FLOAT,
1430 OPTION_DOUBLE_FLOAT,
1431 OPTION_32,
1432 OPTION_CALL_SHARED,
1433 OPTION_CALL_NONPIC,
1434 OPTION_NON_SHARED,
1435 OPTION_XGOT,
1436 OPTION_MABI,
1437 OPTION_N32,
1438 OPTION_64,
1439 OPTION_MDEBUG,
1440 OPTION_NO_MDEBUG,
1441 OPTION_PDR,
1442 OPTION_NO_PDR,
1443 OPTION_MVXWORKS_PIC,
1444 OPTION_END_OF_ENUM
1445 };
1446
1447 struct option md_longopts[] =
1448 {
1449 /* Options which specify architecture. */
1450 {"march", required_argument, NULL, OPTION_MARCH},
1451 {"mtune", required_argument, NULL, OPTION_MTUNE},
1452 {"mips0", no_argument, NULL, OPTION_MIPS1},
1453 {"mips1", no_argument, NULL, OPTION_MIPS1},
1454 {"mips2", no_argument, NULL, OPTION_MIPS2},
1455 {"mips3", no_argument, NULL, OPTION_MIPS3},
1456 {"mips4", no_argument, NULL, OPTION_MIPS4},
1457 {"mips5", no_argument, NULL, OPTION_MIPS5},
1458 {"mips32", no_argument, NULL, OPTION_MIPS32},
1459 {"mips64", no_argument, NULL, OPTION_MIPS64},
1460 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
1461 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
1462
1463 /* Options which specify Application Specific Extensions (ASEs). */
1464 {"mips16", no_argument, NULL, OPTION_MIPS16},
1465 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
1466 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
1467 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
1468 {"mdmx", no_argument, NULL, OPTION_MDMX},
1469 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
1470 {"mdsp", no_argument, NULL, OPTION_DSP},
1471 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
1472 {"mmt", no_argument, NULL, OPTION_MT},
1473 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
1474 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
1475 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
1476 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
1477 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
1478 {"meva", no_argument, NULL, OPTION_EVA},
1479 {"mno-eva", no_argument, NULL, OPTION_NO_EVA},
1480 {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
1481 {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
1482 {"mmcu", no_argument, NULL, OPTION_MCU},
1483 {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
1484 {"mvirt", no_argument, NULL, OPTION_VIRT},
1485 {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
1486
1487 /* Old-style architecture options. Don't add more of these. */
1488 {"m4650", no_argument, NULL, OPTION_M4650},
1489 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
1490 {"m4010", no_argument, NULL, OPTION_M4010},
1491 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
1492 {"m4100", no_argument, NULL, OPTION_M4100},
1493 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
1494 {"m3900", no_argument, NULL, OPTION_M3900},
1495 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
1496
1497 /* Options which enable bug fixes. */
1498 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
1499 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1500 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1501 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
1502 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
1503 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
1504 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
1505 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
1506 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
1507 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
1508 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
1509 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
1510 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
1511 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
1512 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
1513
1514 /* Miscellaneous options. */
1515 {"trap", no_argument, NULL, OPTION_TRAP},
1516 {"no-break", no_argument, NULL, OPTION_TRAP},
1517 {"break", no_argument, NULL, OPTION_BREAK},
1518 {"no-trap", no_argument, NULL, OPTION_BREAK},
1519 {"EB", no_argument, NULL, OPTION_EB},
1520 {"EL", no_argument, NULL, OPTION_EL},
1521 {"mfp32", no_argument, NULL, OPTION_FP32},
1522 {"mgp32", no_argument, NULL, OPTION_GP32},
1523 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1524 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1525 {"mfp64", no_argument, NULL, OPTION_FP64},
1526 {"mgp64", no_argument, NULL, OPTION_GP64},
1527 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
1528 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
1529 {"minsn32", no_argument, NULL, OPTION_INSN32},
1530 {"mno-insn32", no_argument, NULL, OPTION_NO_INSN32},
1531 {"mshared", no_argument, NULL, OPTION_MSHARED},
1532 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
1533 {"msym32", no_argument, NULL, OPTION_MSYM32},
1534 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
1535 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
1536 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
1537 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
1538 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
1539
1540 /* Strictly speaking this next option is ELF specific,
1541 but we allow it for other ports as well in order to
1542 make testing easier. */
1543 {"32", no_argument, NULL, OPTION_32},
1544
1545 /* ELF-specific options. */
1546 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
1547 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
1548 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
1549 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
1550 {"xgot", no_argument, NULL, OPTION_XGOT},
1551 {"mabi", required_argument, NULL, OPTION_MABI},
1552 {"n32", no_argument, NULL, OPTION_N32},
1553 {"64", no_argument, NULL, OPTION_64},
1554 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
1555 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
1556 {"mpdr", no_argument, NULL, OPTION_PDR},
1557 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
1558 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
1559
1560 {NULL, no_argument, NULL, 0}
1561 };
1562 size_t md_longopts_size = sizeof (md_longopts);
1563 \f
1564 /* Information about either an Application Specific Extension or an
1565 optional architecture feature that, for simplicity, we treat in the
1566 same way as an ASE. */
1567 struct mips_ase
1568 {
1569 /* The name of the ASE, used in both the command-line and .set options. */
1570 const char *name;
1571
1572 /* The associated ASE_* flags. If the ASE is available on both 32-bit
1573 and 64-bit architectures, the flags here refer to the subset that
1574 is available on both. */
1575 unsigned int flags;
1576
1577 /* The ASE_* flag used for instructions that are available on 64-bit
1578 architectures but that are not included in FLAGS. */
1579 unsigned int flags64;
1580
1581 /* The command-line options that turn the ASE on and off. */
1582 int option_on;
1583 int option_off;
1584
1585 /* The minimum required architecture revisions for MIPS32, MIPS64,
1586 microMIPS32 and microMIPS64, or -1 if the extension isn't supported. */
1587 int mips32_rev;
1588 int mips64_rev;
1589 int micromips32_rev;
1590 int micromips64_rev;
1591 };
1592
1593 /* A table of all supported ASEs. */
1594 static const struct mips_ase mips_ases[] = {
1595 { "dsp", ASE_DSP, ASE_DSP64,
1596 OPTION_DSP, OPTION_NO_DSP,
1597 2, 2, 2, 2 },
1598
1599 { "dspr2", ASE_DSP | ASE_DSPR2, 0,
1600 OPTION_DSPR2, OPTION_NO_DSPR2,
1601 2, 2, 2, 2 },
1602
1603 { "eva", ASE_EVA, 0,
1604 OPTION_EVA, OPTION_NO_EVA,
1605 2, 2, 2, 2 },
1606
1607 { "mcu", ASE_MCU, 0,
1608 OPTION_MCU, OPTION_NO_MCU,
1609 2, 2, 2, 2 },
1610
1611 /* Deprecated in MIPS64r5, but we don't implement that yet. */
1612 { "mdmx", ASE_MDMX, 0,
1613 OPTION_MDMX, OPTION_NO_MDMX,
1614 -1, 1, -1, -1 },
1615
1616 /* Requires 64-bit FPRs, so the minimum MIPS32 revision is 2. */
1617 { "mips3d", ASE_MIPS3D, 0,
1618 OPTION_MIPS3D, OPTION_NO_MIPS3D,
1619 2, 1, -1, -1 },
1620
1621 { "mt", ASE_MT, 0,
1622 OPTION_MT, OPTION_NO_MT,
1623 2, 2, -1, -1 },
1624
1625 { "smartmips", ASE_SMARTMIPS, 0,
1626 OPTION_SMARTMIPS, OPTION_NO_SMARTMIPS,
1627 1, -1, -1, -1 },
1628
1629 { "virt", ASE_VIRT, ASE_VIRT64,
1630 OPTION_VIRT, OPTION_NO_VIRT,
1631 2, 2, 2, 2 }
1632 };
1633
1634 /* The set of ASEs that require -mfp64. */
1635 #define FP64_ASES (ASE_MIPS3D | ASE_MDMX)
1636
1637 /* Groups of ASE_* flags that represent different revisions of an ASE. */
1638 static const unsigned int mips_ase_groups[] = {
1639 ASE_DSP | ASE_DSPR2
1640 };
1641 \f
1642 /* Pseudo-op table.
1643
1644 The following pseudo-ops from the Kane and Heinrich MIPS book
1645 should be defined here, but are currently unsupported: .alias,
1646 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1647
1648 The following pseudo-ops from the Kane and Heinrich MIPS book are
1649 specific to the type of debugging information being generated, and
1650 should be defined by the object format: .aent, .begin, .bend,
1651 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1652 .vreg.
1653
1654 The following pseudo-ops from the Kane and Heinrich MIPS book are
1655 not MIPS CPU specific, but are also not specific to the object file
1656 format. This file is probably the best place to define them, but
1657 they are not currently supported: .asm0, .endr, .lab, .struct. */
1658
1659 static const pseudo_typeS mips_pseudo_table[] =
1660 {
1661 /* MIPS specific pseudo-ops. */
1662 {"option", s_option, 0},
1663 {"set", s_mipsset, 0},
1664 {"rdata", s_change_sec, 'r'},
1665 {"sdata", s_change_sec, 's'},
1666 {"livereg", s_ignore, 0},
1667 {"abicalls", s_abicalls, 0},
1668 {"cpload", s_cpload, 0},
1669 {"cpsetup", s_cpsetup, 0},
1670 {"cplocal", s_cplocal, 0},
1671 {"cprestore", s_cprestore, 0},
1672 {"cpreturn", s_cpreturn, 0},
1673 {"dtprelword", s_dtprelword, 0},
1674 {"dtpreldword", s_dtpreldword, 0},
1675 {"tprelword", s_tprelword, 0},
1676 {"tpreldword", s_tpreldword, 0},
1677 {"gpvalue", s_gpvalue, 0},
1678 {"gpword", s_gpword, 0},
1679 {"gpdword", s_gpdword, 0},
1680 {"ehword", s_ehword, 0},
1681 {"cpadd", s_cpadd, 0},
1682 {"insn", s_insn, 0},
1683
1684 /* Relatively generic pseudo-ops that happen to be used on MIPS
1685 chips. */
1686 {"asciiz", stringer, 8 + 1},
1687 {"bss", s_change_sec, 'b'},
1688 {"err", s_err, 0},
1689 {"half", s_cons, 1},
1690 {"dword", s_cons, 3},
1691 {"weakext", s_mips_weakext, 0},
1692 {"origin", s_org, 0},
1693 {"repeat", s_rept, 0},
1694
1695 /* For MIPS this is non-standard, but we define it for consistency. */
1696 {"sbss", s_change_sec, 'B'},
1697
1698 /* These pseudo-ops are defined in read.c, but must be overridden
1699 here for one reason or another. */
1700 {"align", s_align, 0},
1701 {"byte", s_cons, 0},
1702 {"data", s_change_sec, 'd'},
1703 {"double", s_float_cons, 'd'},
1704 {"float", s_float_cons, 'f'},
1705 {"globl", s_mips_globl, 0},
1706 {"global", s_mips_globl, 0},
1707 {"hword", s_cons, 1},
1708 {"int", s_cons, 2},
1709 {"long", s_cons, 2},
1710 {"octa", s_cons, 4},
1711 {"quad", s_cons, 3},
1712 {"section", s_change_section, 0},
1713 {"short", s_cons, 1},
1714 {"single", s_float_cons, 'f'},
1715 {"stabd", s_mips_stab, 'd'},
1716 {"stabn", s_mips_stab, 'n'},
1717 {"stabs", s_mips_stab, 's'},
1718 {"text", s_change_sec, 't'},
1719 {"word", s_cons, 2},
1720
1721 { "extern", ecoff_directive_extern, 0},
1722
1723 { NULL, NULL, 0 },
1724 };
1725
1726 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1727 {
1728 /* These pseudo-ops should be defined by the object file format.
1729 However, a.out doesn't support them, so we have versions here. */
1730 {"aent", s_mips_ent, 1},
1731 {"bgnb", s_ignore, 0},
1732 {"end", s_mips_end, 0},
1733 {"endb", s_ignore, 0},
1734 {"ent", s_mips_ent, 0},
1735 {"file", s_mips_file, 0},
1736 {"fmask", s_mips_mask, 'F'},
1737 {"frame", s_mips_frame, 0},
1738 {"loc", s_mips_loc, 0},
1739 {"mask", s_mips_mask, 'R'},
1740 {"verstamp", s_ignore, 0},
1741 { NULL, NULL, 0 },
1742 };
1743
1744 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1745 purpose of the `.dc.a' internal pseudo-op. */
1746
1747 int
1748 mips_address_bytes (void)
1749 {
1750 return HAVE_64BIT_ADDRESSES ? 8 : 4;
1751 }
1752
1753 extern void pop_insert (const pseudo_typeS *);
1754
1755 void
1756 mips_pop_insert (void)
1757 {
1758 pop_insert (mips_pseudo_table);
1759 if (! ECOFF_DEBUGGING)
1760 pop_insert (mips_nonecoff_pseudo_table);
1761 }
1762 \f
1763 /* Symbols labelling the current insn. */
1764
1765 struct insn_label_list
1766 {
1767 struct insn_label_list *next;
1768 symbolS *label;
1769 };
1770
1771 static struct insn_label_list *free_insn_labels;
1772 #define label_list tc_segment_info_data.labels
1773
1774 static void mips_clear_insn_labels (void);
1775 static void mips_mark_labels (void);
1776 static void mips_compressed_mark_labels (void);
1777
1778 static inline void
1779 mips_clear_insn_labels (void)
1780 {
1781 register struct insn_label_list **pl;
1782 segment_info_type *si;
1783
1784 if (now_seg)
1785 {
1786 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1787 ;
1788
1789 si = seg_info (now_seg);
1790 *pl = si->label_list;
1791 si->label_list = NULL;
1792 }
1793 }
1794
1795 /* Mark instruction labels in MIPS16/microMIPS mode. */
1796
1797 static inline void
1798 mips_mark_labels (void)
1799 {
1800 if (HAVE_CODE_COMPRESSION)
1801 mips_compressed_mark_labels ();
1802 }
1803 \f
1804 static char *expr_end;
1805
1806 /* Expressions which appear in instructions. These are set by
1807 mips_ip. */
1808
1809 static expressionS imm_expr;
1810 static expressionS imm2_expr;
1811 static expressionS offset_expr;
1812
1813 /* Relocs associated with imm_expr and offset_expr. */
1814
1815 static bfd_reloc_code_real_type imm_reloc[3]
1816 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1817 static bfd_reloc_code_real_type offset_reloc[3]
1818 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1819
1820 /* This is set to the resulting size of the instruction to be produced
1821 by mips16_ip if an explicit extension is used or by mips_ip if an
1822 explicit size is supplied. */
1823
1824 static unsigned int forced_insn_length;
1825
1826 /* True if we are assembling an instruction. All dot symbols defined during
1827 this time should be treated as code labels. */
1828
1829 static bfd_boolean mips_assembling_insn;
1830
1831 /* The pdr segment for per procedure frame/regmask info. Not used for
1832 ECOFF debugging. */
1833
1834 static segT pdr_seg;
1835
1836 /* The default target format to use. */
1837
1838 #if defined (TE_FreeBSD)
1839 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1840 #elif defined (TE_TMIPS)
1841 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1842 #else
1843 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1844 #endif
1845
1846 const char *
1847 mips_target_format (void)
1848 {
1849 switch (OUTPUT_FLAVOR)
1850 {
1851 case bfd_target_elf_flavour:
1852 #ifdef TE_VXWORKS
1853 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1854 return (target_big_endian
1855 ? "elf32-bigmips-vxworks"
1856 : "elf32-littlemips-vxworks");
1857 #endif
1858 return (target_big_endian
1859 ? (HAVE_64BIT_OBJECTS
1860 ? ELF_TARGET ("elf64-", "big")
1861 : (HAVE_NEWABI
1862 ? ELF_TARGET ("elf32-n", "big")
1863 : ELF_TARGET ("elf32-", "big")))
1864 : (HAVE_64BIT_OBJECTS
1865 ? ELF_TARGET ("elf64-", "little")
1866 : (HAVE_NEWABI
1867 ? ELF_TARGET ("elf32-n", "little")
1868 : ELF_TARGET ("elf32-", "little"))));
1869 default:
1870 abort ();
1871 return NULL;
1872 }
1873 }
1874
1875 /* Return the ISA revision that is currently in use, or 0 if we are
1876 generating code for MIPS V or below. */
1877
1878 static int
1879 mips_isa_rev (void)
1880 {
1881 if (mips_opts.isa == ISA_MIPS32R2 || mips_opts.isa == ISA_MIPS64R2)
1882 return 2;
1883
1884 /* microMIPS implies revision 2 or above. */
1885 if (mips_opts.micromips)
1886 return 2;
1887
1888 if (mips_opts.isa == ISA_MIPS32 || mips_opts.isa == ISA_MIPS64)
1889 return 1;
1890
1891 return 0;
1892 }
1893
1894 /* Return the mask of all ASEs that are revisions of those in FLAGS. */
1895
1896 static unsigned int
1897 mips_ase_mask (unsigned int flags)
1898 {
1899 unsigned int i;
1900
1901 for (i = 0; i < ARRAY_SIZE (mips_ase_groups); i++)
1902 if (flags & mips_ase_groups[i])
1903 flags |= mips_ase_groups[i];
1904 return flags;
1905 }
1906
1907 /* Check whether the current ISA supports ASE. Issue a warning if
1908 appropriate. */
1909
1910 static void
1911 mips_check_isa_supports_ase (const struct mips_ase *ase)
1912 {
1913 const char *base;
1914 int min_rev, size;
1915 static unsigned int warned_isa;
1916 static unsigned int warned_fp32;
1917
1918 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1919 min_rev = mips_opts.micromips ? ase->micromips64_rev : ase->mips64_rev;
1920 else
1921 min_rev = mips_opts.micromips ? ase->micromips32_rev : ase->mips32_rev;
1922 if ((min_rev < 0 || mips_isa_rev () < min_rev)
1923 && (warned_isa & ase->flags) != ase->flags)
1924 {
1925 warned_isa |= ase->flags;
1926 base = mips_opts.micromips ? "microMIPS" : "MIPS";
1927 size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
1928 if (min_rev < 0)
1929 as_warn (_("The %d-bit %s architecture does not support the"
1930 " `%s' extension"), size, base, ase->name);
1931 else
1932 as_warn (_("The `%s' extension requires %s%d revision %d or greater"),
1933 ase->name, base, size, min_rev);
1934 }
1935 if ((ase->flags & FP64_ASES)
1936 && mips_opts.fp32
1937 && (warned_fp32 & ase->flags) != ase->flags)
1938 {
1939 warned_fp32 |= ase->flags;
1940 as_warn (_("The `%s' extension requires 64-bit FPRs"), ase->name);
1941 }
1942 }
1943
1944 /* Check all enabled ASEs to see whether they are supported by the
1945 chosen architecture. */
1946
1947 static void
1948 mips_check_isa_supports_ases (void)
1949 {
1950 unsigned int i, mask;
1951
1952 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1953 {
1954 mask = mips_ase_mask (mips_ases[i].flags);
1955 if ((mips_opts.ase & mask) == mips_ases[i].flags)
1956 mips_check_isa_supports_ase (&mips_ases[i]);
1957 }
1958 }
1959
1960 /* Set the state of ASE to ENABLED_P. Return the mask of ASE_* flags
1961 that were affected. */
1962
1963 static unsigned int
1964 mips_set_ase (const struct mips_ase *ase, bfd_boolean enabled_p)
1965 {
1966 unsigned int mask;
1967
1968 mask = mips_ase_mask (ase->flags);
1969 mips_opts.ase &= ~mask;
1970 if (enabled_p)
1971 mips_opts.ase |= ase->flags;
1972 return mask;
1973 }
1974
1975 /* Return the ASE called NAME, or null if none. */
1976
1977 static const struct mips_ase *
1978 mips_lookup_ase (const char *name)
1979 {
1980 unsigned int i;
1981
1982 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1983 if (strcmp (name, mips_ases[i].name) == 0)
1984 return &mips_ases[i];
1985 return NULL;
1986 }
1987
1988 /* Return the length of a microMIPS instruction in bytes. If bits of
1989 the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1990 Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1991 major opcode) will require further modifications to the opcode
1992 table. */
1993
1994 static inline unsigned int
1995 micromips_insn_length (const struct mips_opcode *mo)
1996 {
1997 return (mo->mask >> 16) == 0 ? 2 : 4;
1998 }
1999
2000 /* Return the length of MIPS16 instruction OPCODE. */
2001
2002 static inline unsigned int
2003 mips16_opcode_length (unsigned long opcode)
2004 {
2005 return (opcode >> 16) == 0 ? 2 : 4;
2006 }
2007
2008 /* Return the length of instruction INSN. */
2009
2010 static inline unsigned int
2011 insn_length (const struct mips_cl_insn *insn)
2012 {
2013 if (mips_opts.micromips)
2014 return micromips_insn_length (insn->insn_mo);
2015 else if (mips_opts.mips16)
2016 return mips16_opcode_length (insn->insn_opcode);
2017 else
2018 return 4;
2019 }
2020
2021 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
2022
2023 static void
2024 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
2025 {
2026 size_t i;
2027
2028 insn->insn_mo = mo;
2029 insn->insn_opcode = mo->match;
2030 insn->frag = NULL;
2031 insn->where = 0;
2032 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2033 insn->fixp[i] = NULL;
2034 insn->fixed_p = (mips_opts.noreorder > 0);
2035 insn->noreorder_p = (mips_opts.noreorder > 0);
2036 insn->mips16_absolute_jump_p = 0;
2037 insn->complete_p = 0;
2038 insn->cleared_p = 0;
2039 }
2040
2041 /* Record the current MIPS16/microMIPS mode in now_seg. */
2042
2043 static void
2044 mips_record_compressed_mode (void)
2045 {
2046 segment_info_type *si;
2047
2048 si = seg_info (now_seg);
2049 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
2050 si->tc_segment_info_data.mips16 = mips_opts.mips16;
2051 if (si->tc_segment_info_data.micromips != mips_opts.micromips)
2052 si->tc_segment_info_data.micromips = mips_opts.micromips;
2053 }
2054
2055 /* Read a standard MIPS instruction from BUF. */
2056
2057 static unsigned long
2058 read_insn (char *buf)
2059 {
2060 if (target_big_endian)
2061 return bfd_getb32 ((bfd_byte *) buf);
2062 else
2063 return bfd_getl32 ((bfd_byte *) buf);
2064 }
2065
2066 /* Write standard MIPS instruction INSN to BUF. Return a pointer to
2067 the next byte. */
2068
2069 static char *
2070 write_insn (char *buf, unsigned int insn)
2071 {
2072 md_number_to_chars (buf, insn, 4);
2073 return buf + 4;
2074 }
2075
2076 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
2077 has length LENGTH. */
2078
2079 static unsigned long
2080 read_compressed_insn (char *buf, unsigned int length)
2081 {
2082 unsigned long insn;
2083 unsigned int i;
2084
2085 insn = 0;
2086 for (i = 0; i < length; i += 2)
2087 {
2088 insn <<= 16;
2089 if (target_big_endian)
2090 insn |= bfd_getb16 ((char *) buf);
2091 else
2092 insn |= bfd_getl16 ((char *) buf);
2093 buf += 2;
2094 }
2095 return insn;
2096 }
2097
2098 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
2099 instruction is LENGTH bytes long. Return a pointer to the next byte. */
2100
2101 static char *
2102 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
2103 {
2104 unsigned int i;
2105
2106 for (i = 0; i < length; i += 2)
2107 md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
2108 return buf + length;
2109 }
2110
2111 /* Install INSN at the location specified by its "frag" and "where" fields. */
2112
2113 static void
2114 install_insn (const struct mips_cl_insn *insn)
2115 {
2116 char *f = insn->frag->fr_literal + insn->where;
2117 if (HAVE_CODE_COMPRESSION)
2118 write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
2119 else
2120 write_insn (f, insn->insn_opcode);
2121 mips_record_compressed_mode ();
2122 }
2123
2124 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
2125 and install the opcode in the new location. */
2126
2127 static void
2128 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
2129 {
2130 size_t i;
2131
2132 insn->frag = frag;
2133 insn->where = where;
2134 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2135 if (insn->fixp[i] != NULL)
2136 {
2137 insn->fixp[i]->fx_frag = frag;
2138 insn->fixp[i]->fx_where = where;
2139 }
2140 install_insn (insn);
2141 }
2142
2143 /* Add INSN to the end of the output. */
2144
2145 static void
2146 add_fixed_insn (struct mips_cl_insn *insn)
2147 {
2148 char *f = frag_more (insn_length (insn));
2149 move_insn (insn, frag_now, f - frag_now->fr_literal);
2150 }
2151
2152 /* Start a variant frag and move INSN to the start of the variant part,
2153 marking it as fixed. The other arguments are as for frag_var. */
2154
2155 static void
2156 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
2157 relax_substateT subtype, symbolS *symbol, offsetT offset)
2158 {
2159 frag_grow (max_chars);
2160 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
2161 insn->fixed_p = 1;
2162 frag_var (rs_machine_dependent, max_chars, var,
2163 subtype, symbol, offset, NULL);
2164 }
2165
2166 /* Insert N copies of INSN into the history buffer, starting at
2167 position FIRST. Neither FIRST nor N need to be clipped. */
2168
2169 static void
2170 insert_into_history (unsigned int first, unsigned int n,
2171 const struct mips_cl_insn *insn)
2172 {
2173 if (mips_relax.sequence != 2)
2174 {
2175 unsigned int i;
2176
2177 for (i = ARRAY_SIZE (history); i-- > first;)
2178 if (i >= first + n)
2179 history[i] = history[i - n];
2180 else
2181 history[i] = *insn;
2182 }
2183 }
2184
2185 /* Initialize vr4120_conflicts. There is a bit of duplication here:
2186 the idea is to make it obvious at a glance that each errata is
2187 included. */
2188
2189 static void
2190 init_vr4120_conflicts (void)
2191 {
2192 #define CONFLICT(FIRST, SECOND) \
2193 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
2194
2195 /* Errata 21 - [D]DIV[U] after [D]MACC */
2196 CONFLICT (MACC, DIV);
2197 CONFLICT (DMACC, DIV);
2198
2199 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
2200 CONFLICT (DMULT, DMULT);
2201 CONFLICT (DMULT, DMACC);
2202 CONFLICT (DMACC, DMULT);
2203 CONFLICT (DMACC, DMACC);
2204
2205 /* Errata 24 - MT{LO,HI} after [D]MACC */
2206 CONFLICT (MACC, MTHILO);
2207 CONFLICT (DMACC, MTHILO);
2208
2209 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
2210 instruction is executed immediately after a MACC or DMACC
2211 instruction, the result of [either instruction] is incorrect." */
2212 CONFLICT (MACC, MULT);
2213 CONFLICT (MACC, DMULT);
2214 CONFLICT (DMACC, MULT);
2215 CONFLICT (DMACC, DMULT);
2216
2217 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
2218 executed immediately after a DMULT, DMULTU, DIV, DIVU,
2219 DDIV or DDIVU instruction, the result of the MACC or
2220 DMACC instruction is incorrect.". */
2221 CONFLICT (DMULT, MACC);
2222 CONFLICT (DMULT, DMACC);
2223 CONFLICT (DIV, MACC);
2224 CONFLICT (DIV, DMACC);
2225
2226 #undef CONFLICT
2227 }
2228
2229 struct regname {
2230 const char *name;
2231 unsigned int num;
2232 };
2233
2234 #define RTYPE_MASK 0x1ff00
2235 #define RTYPE_NUM 0x00100
2236 #define RTYPE_FPU 0x00200
2237 #define RTYPE_FCC 0x00400
2238 #define RTYPE_VEC 0x00800
2239 #define RTYPE_GP 0x01000
2240 #define RTYPE_CP0 0x02000
2241 #define RTYPE_PC 0x04000
2242 #define RTYPE_ACC 0x08000
2243 #define RTYPE_CCC 0x10000
2244 #define RNUM_MASK 0x000ff
2245 #define RWARN 0x80000
2246
2247 #define GENERIC_REGISTER_NUMBERS \
2248 {"$0", RTYPE_NUM | 0}, \
2249 {"$1", RTYPE_NUM | 1}, \
2250 {"$2", RTYPE_NUM | 2}, \
2251 {"$3", RTYPE_NUM | 3}, \
2252 {"$4", RTYPE_NUM | 4}, \
2253 {"$5", RTYPE_NUM | 5}, \
2254 {"$6", RTYPE_NUM | 6}, \
2255 {"$7", RTYPE_NUM | 7}, \
2256 {"$8", RTYPE_NUM | 8}, \
2257 {"$9", RTYPE_NUM | 9}, \
2258 {"$10", RTYPE_NUM | 10}, \
2259 {"$11", RTYPE_NUM | 11}, \
2260 {"$12", RTYPE_NUM | 12}, \
2261 {"$13", RTYPE_NUM | 13}, \
2262 {"$14", RTYPE_NUM | 14}, \
2263 {"$15", RTYPE_NUM | 15}, \
2264 {"$16", RTYPE_NUM | 16}, \
2265 {"$17", RTYPE_NUM | 17}, \
2266 {"$18", RTYPE_NUM | 18}, \
2267 {"$19", RTYPE_NUM | 19}, \
2268 {"$20", RTYPE_NUM | 20}, \
2269 {"$21", RTYPE_NUM | 21}, \
2270 {"$22", RTYPE_NUM | 22}, \
2271 {"$23", RTYPE_NUM | 23}, \
2272 {"$24", RTYPE_NUM | 24}, \
2273 {"$25", RTYPE_NUM | 25}, \
2274 {"$26", RTYPE_NUM | 26}, \
2275 {"$27", RTYPE_NUM | 27}, \
2276 {"$28", RTYPE_NUM | 28}, \
2277 {"$29", RTYPE_NUM | 29}, \
2278 {"$30", RTYPE_NUM | 30}, \
2279 {"$31", RTYPE_NUM | 31}
2280
2281 #define FPU_REGISTER_NAMES \
2282 {"$f0", RTYPE_FPU | 0}, \
2283 {"$f1", RTYPE_FPU | 1}, \
2284 {"$f2", RTYPE_FPU | 2}, \
2285 {"$f3", RTYPE_FPU | 3}, \
2286 {"$f4", RTYPE_FPU | 4}, \
2287 {"$f5", RTYPE_FPU | 5}, \
2288 {"$f6", RTYPE_FPU | 6}, \
2289 {"$f7", RTYPE_FPU | 7}, \
2290 {"$f8", RTYPE_FPU | 8}, \
2291 {"$f9", RTYPE_FPU | 9}, \
2292 {"$f10", RTYPE_FPU | 10}, \
2293 {"$f11", RTYPE_FPU | 11}, \
2294 {"$f12", RTYPE_FPU | 12}, \
2295 {"$f13", RTYPE_FPU | 13}, \
2296 {"$f14", RTYPE_FPU | 14}, \
2297 {"$f15", RTYPE_FPU | 15}, \
2298 {"$f16", RTYPE_FPU | 16}, \
2299 {"$f17", RTYPE_FPU | 17}, \
2300 {"$f18", RTYPE_FPU | 18}, \
2301 {"$f19", RTYPE_FPU | 19}, \
2302 {"$f20", RTYPE_FPU | 20}, \
2303 {"$f21", RTYPE_FPU | 21}, \
2304 {"$f22", RTYPE_FPU | 22}, \
2305 {"$f23", RTYPE_FPU | 23}, \
2306 {"$f24", RTYPE_FPU | 24}, \
2307 {"$f25", RTYPE_FPU | 25}, \
2308 {"$f26", RTYPE_FPU | 26}, \
2309 {"$f27", RTYPE_FPU | 27}, \
2310 {"$f28", RTYPE_FPU | 28}, \
2311 {"$f29", RTYPE_FPU | 29}, \
2312 {"$f30", RTYPE_FPU | 30}, \
2313 {"$f31", RTYPE_FPU | 31}
2314
2315 #define FPU_CONDITION_CODE_NAMES \
2316 {"$fcc0", RTYPE_FCC | 0}, \
2317 {"$fcc1", RTYPE_FCC | 1}, \
2318 {"$fcc2", RTYPE_FCC | 2}, \
2319 {"$fcc3", RTYPE_FCC | 3}, \
2320 {"$fcc4", RTYPE_FCC | 4}, \
2321 {"$fcc5", RTYPE_FCC | 5}, \
2322 {"$fcc6", RTYPE_FCC | 6}, \
2323 {"$fcc7", RTYPE_FCC | 7}
2324
2325 #define COPROC_CONDITION_CODE_NAMES \
2326 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
2327 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
2328 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
2329 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
2330 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
2331 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
2332 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
2333 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
2334
2335 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2336 {"$a4", RTYPE_GP | 8}, \
2337 {"$a5", RTYPE_GP | 9}, \
2338 {"$a6", RTYPE_GP | 10}, \
2339 {"$a7", RTYPE_GP | 11}, \
2340 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
2341 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
2342 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
2343 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
2344 {"$t0", RTYPE_GP | 12}, \
2345 {"$t1", RTYPE_GP | 13}, \
2346 {"$t2", RTYPE_GP | 14}, \
2347 {"$t3", RTYPE_GP | 15}
2348
2349 #define O32_SYMBOLIC_REGISTER_NAMES \
2350 {"$t0", RTYPE_GP | 8}, \
2351 {"$t1", RTYPE_GP | 9}, \
2352 {"$t2", RTYPE_GP | 10}, \
2353 {"$t3", RTYPE_GP | 11}, \
2354 {"$t4", RTYPE_GP | 12}, \
2355 {"$t5", RTYPE_GP | 13}, \
2356 {"$t6", RTYPE_GP | 14}, \
2357 {"$t7", RTYPE_GP | 15}, \
2358 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
2359 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
2360 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
2361 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
2362
2363 /* Remaining symbolic register names */
2364 #define SYMBOLIC_REGISTER_NAMES \
2365 {"$zero", RTYPE_GP | 0}, \
2366 {"$at", RTYPE_GP | 1}, \
2367 {"$AT", RTYPE_GP | 1}, \
2368 {"$v0", RTYPE_GP | 2}, \
2369 {"$v1", RTYPE_GP | 3}, \
2370 {"$a0", RTYPE_GP | 4}, \
2371 {"$a1", RTYPE_GP | 5}, \
2372 {"$a2", RTYPE_GP | 6}, \
2373 {"$a3", RTYPE_GP | 7}, \
2374 {"$s0", RTYPE_GP | 16}, \
2375 {"$s1", RTYPE_GP | 17}, \
2376 {"$s2", RTYPE_GP | 18}, \
2377 {"$s3", RTYPE_GP | 19}, \
2378 {"$s4", RTYPE_GP | 20}, \
2379 {"$s5", RTYPE_GP | 21}, \
2380 {"$s6", RTYPE_GP | 22}, \
2381 {"$s7", RTYPE_GP | 23}, \
2382 {"$t8", RTYPE_GP | 24}, \
2383 {"$t9", RTYPE_GP | 25}, \
2384 {"$k0", RTYPE_GP | 26}, \
2385 {"$kt0", RTYPE_GP | 26}, \
2386 {"$k1", RTYPE_GP | 27}, \
2387 {"$kt1", RTYPE_GP | 27}, \
2388 {"$gp", RTYPE_GP | 28}, \
2389 {"$sp", RTYPE_GP | 29}, \
2390 {"$s8", RTYPE_GP | 30}, \
2391 {"$fp", RTYPE_GP | 30}, \
2392 {"$ra", RTYPE_GP | 31}
2393
2394 #define MIPS16_SPECIAL_REGISTER_NAMES \
2395 {"$pc", RTYPE_PC | 0}
2396
2397 #define MDMX_VECTOR_REGISTER_NAMES \
2398 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
2399 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
2400 {"$v2", RTYPE_VEC | 2}, \
2401 {"$v3", RTYPE_VEC | 3}, \
2402 {"$v4", RTYPE_VEC | 4}, \
2403 {"$v5", RTYPE_VEC | 5}, \
2404 {"$v6", RTYPE_VEC | 6}, \
2405 {"$v7", RTYPE_VEC | 7}, \
2406 {"$v8", RTYPE_VEC | 8}, \
2407 {"$v9", RTYPE_VEC | 9}, \
2408 {"$v10", RTYPE_VEC | 10}, \
2409 {"$v11", RTYPE_VEC | 11}, \
2410 {"$v12", RTYPE_VEC | 12}, \
2411 {"$v13", RTYPE_VEC | 13}, \
2412 {"$v14", RTYPE_VEC | 14}, \
2413 {"$v15", RTYPE_VEC | 15}, \
2414 {"$v16", RTYPE_VEC | 16}, \
2415 {"$v17", RTYPE_VEC | 17}, \
2416 {"$v18", RTYPE_VEC | 18}, \
2417 {"$v19", RTYPE_VEC | 19}, \
2418 {"$v20", RTYPE_VEC | 20}, \
2419 {"$v21", RTYPE_VEC | 21}, \
2420 {"$v22", RTYPE_VEC | 22}, \
2421 {"$v23", RTYPE_VEC | 23}, \
2422 {"$v24", RTYPE_VEC | 24}, \
2423 {"$v25", RTYPE_VEC | 25}, \
2424 {"$v26", RTYPE_VEC | 26}, \
2425 {"$v27", RTYPE_VEC | 27}, \
2426 {"$v28", RTYPE_VEC | 28}, \
2427 {"$v29", RTYPE_VEC | 29}, \
2428 {"$v30", RTYPE_VEC | 30}, \
2429 {"$v31", RTYPE_VEC | 31}
2430
2431 #define MIPS_DSP_ACCUMULATOR_NAMES \
2432 {"$ac0", RTYPE_ACC | 0}, \
2433 {"$ac1", RTYPE_ACC | 1}, \
2434 {"$ac2", RTYPE_ACC | 2}, \
2435 {"$ac3", RTYPE_ACC | 3}
2436
2437 static const struct regname reg_names[] = {
2438 GENERIC_REGISTER_NUMBERS,
2439 FPU_REGISTER_NAMES,
2440 FPU_CONDITION_CODE_NAMES,
2441 COPROC_CONDITION_CODE_NAMES,
2442
2443 /* The $txx registers depends on the abi,
2444 these will be added later into the symbol table from
2445 one of the tables below once mips_abi is set after
2446 parsing of arguments from the command line. */
2447 SYMBOLIC_REGISTER_NAMES,
2448
2449 MIPS16_SPECIAL_REGISTER_NAMES,
2450 MDMX_VECTOR_REGISTER_NAMES,
2451 MIPS_DSP_ACCUMULATOR_NAMES,
2452 {0, 0}
2453 };
2454
2455 static const struct regname reg_names_o32[] = {
2456 O32_SYMBOLIC_REGISTER_NAMES,
2457 {0, 0}
2458 };
2459
2460 static const struct regname reg_names_n32n64[] = {
2461 N32N64_SYMBOLIC_REGISTER_NAMES,
2462 {0, 0}
2463 };
2464
2465 /* Check if S points at a valid register specifier according to TYPES.
2466 If so, then return 1, advance S to consume the specifier and store
2467 the register's number in REGNOP, otherwise return 0. */
2468
2469 static int
2470 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2471 {
2472 symbolS *symbolP;
2473 char *e;
2474 char save_c;
2475 int reg = -1;
2476
2477 /* Find end of name. */
2478 e = *s;
2479 if (is_name_beginner (*e))
2480 ++e;
2481 while (is_part_of_name (*e))
2482 ++e;
2483
2484 /* Terminate name. */
2485 save_c = *e;
2486 *e = '\0';
2487
2488 /* Look for a register symbol. */
2489 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2490 {
2491 int r = S_GET_VALUE (symbolP);
2492 if (r & types)
2493 reg = r & RNUM_MASK;
2494 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2495 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
2496 reg = (r & RNUM_MASK) - 2;
2497 }
2498 /* Else see if this is a register defined in an itbl entry. */
2499 else if ((types & RTYPE_GP) && itbl_have_entries)
2500 {
2501 char *n = *s;
2502 unsigned long r;
2503
2504 if (*n == '$')
2505 ++n;
2506 if (itbl_get_reg_val (n, &r))
2507 reg = r & RNUM_MASK;
2508 }
2509
2510 /* Advance to next token if a register was recognised. */
2511 if (reg >= 0)
2512 *s = e;
2513 else if (types & RWARN)
2514 as_warn (_("Unrecognized register name `%s'"), *s);
2515
2516 *e = save_c;
2517 if (regnop)
2518 *regnop = reg;
2519 return reg >= 0;
2520 }
2521
2522 /* Check if S points at a valid register list according to TYPES.
2523 If so, then return 1, advance S to consume the list and store
2524 the registers present on the list as a bitmask of ones in REGLISTP,
2525 otherwise return 0. A valid list comprises a comma-separated
2526 enumeration of valid single registers and/or dash-separated
2527 contiguous register ranges as determined by their numbers.
2528
2529 As a special exception if one of s0-s7 registers is specified as
2530 the range's lower delimiter and s8 (fp) is its upper one, then no
2531 registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2532 are selected; they have to be listed separately if needed. */
2533
2534 static int
2535 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2536 {
2537 unsigned int reglist = 0;
2538 unsigned int lastregno;
2539 bfd_boolean ok = TRUE;
2540 unsigned int regmask;
2541 char *s_endlist = *s;
2542 char *s_reset = *s;
2543 unsigned int regno;
2544
2545 while (reg_lookup (s, types, &regno))
2546 {
2547 lastregno = regno;
2548 if (**s == '-')
2549 {
2550 (*s)++;
2551 ok = reg_lookup (s, types, &lastregno);
2552 if (ok && lastregno < regno)
2553 ok = FALSE;
2554 if (!ok)
2555 break;
2556 }
2557
2558 if (lastregno == FP && regno >= S0 && regno <= S7)
2559 {
2560 lastregno = S7;
2561 reglist |= 1 << FP;
2562 }
2563 regmask = 1 << lastregno;
2564 regmask = (regmask << 1) - 1;
2565 regmask ^= (1 << regno) - 1;
2566 reglist |= regmask;
2567
2568 s_endlist = *s;
2569 if (**s != ',')
2570 break;
2571 (*s)++;
2572 }
2573
2574 if (ok)
2575 *s = s_endlist;
2576 else
2577 *s = s_reset;
2578 if (reglistp)
2579 *reglistp = reglist;
2580 return ok && reglist != 0;
2581 }
2582
2583 static unsigned int
2584 mips_lookup_reg_pair (unsigned int regno1, unsigned int regno2,
2585 const unsigned int *map1, const unsigned int *map2,
2586 unsigned int count)
2587 {
2588 unsigned int i;
2589
2590 for (i = 0; i < count; i++)
2591 if (map1[i] == regno1 && map2[i] == regno2)
2592 return i;
2593 return ILLEGAL_REG;
2594 }
2595
2596 /* Return TRUE if opcode MO is valid on the currently selected ISA, ASE
2597 and architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
2598
2599 static bfd_boolean
2600 is_opcode_valid (const struct mips_opcode *mo)
2601 {
2602 int isa = mips_opts.isa;
2603 int ase = mips_opts.ase;
2604 int fp_s, fp_d;
2605 unsigned int i;
2606
2607 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
2608 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2609 if ((ase & mips_ases[i].flags) == mips_ases[i].flags)
2610 ase |= mips_ases[i].flags64;
2611
2612 if (!opcode_is_member (mo, isa, ase, mips_opts.arch))
2613 return FALSE;
2614
2615 /* Check whether the instruction or macro requires single-precision or
2616 double-precision floating-point support. Note that this information is
2617 stored differently in the opcode table for insns and macros. */
2618 if (mo->pinfo == INSN_MACRO)
2619 {
2620 fp_s = mo->pinfo2 & INSN2_M_FP_S;
2621 fp_d = mo->pinfo2 & INSN2_M_FP_D;
2622 }
2623 else
2624 {
2625 fp_s = mo->pinfo & FP_S;
2626 fp_d = mo->pinfo & FP_D;
2627 }
2628
2629 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2630 return FALSE;
2631
2632 if (fp_s && mips_opts.soft_float)
2633 return FALSE;
2634
2635 return TRUE;
2636 }
2637
2638 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2639 selected ISA and architecture. */
2640
2641 static bfd_boolean
2642 is_opcode_valid_16 (const struct mips_opcode *mo)
2643 {
2644 return opcode_is_member (mo, mips_opts.isa, 0, mips_opts.arch);
2645 }
2646
2647 /* Return TRUE if the size of the microMIPS opcode MO matches one
2648 explicitly requested. Always TRUE in the standard MIPS mode. */
2649
2650 static bfd_boolean
2651 is_size_valid (const struct mips_opcode *mo)
2652 {
2653 if (!mips_opts.micromips)
2654 return TRUE;
2655
2656 if (mips_opts.insn32)
2657 {
2658 if (mo->pinfo != INSN_MACRO && micromips_insn_length (mo) != 4)
2659 return FALSE;
2660 if ((mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0)
2661 return FALSE;
2662 }
2663 if (!forced_insn_length)
2664 return TRUE;
2665 if (mo->pinfo == INSN_MACRO)
2666 return FALSE;
2667 return forced_insn_length == micromips_insn_length (mo);
2668 }
2669
2670 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2671 of the preceding instruction. Always TRUE in the standard MIPS mode.
2672
2673 We don't accept macros in 16-bit delay slots to avoid a case where
2674 a macro expansion fails because it relies on a preceding 32-bit real
2675 instruction to have matched and does not handle the operands correctly.
2676 The only macros that may expand to 16-bit instructions are JAL that
2677 cannot be placed in a delay slot anyway, and corner cases of BALIGN
2678 and BGT (that likewise cannot be placed in a delay slot) that decay to
2679 a NOP. In all these cases the macros precede any corresponding real
2680 instruction definitions in the opcode table, so they will match in the
2681 second pass where the size of the delay slot is ignored and therefore
2682 produce correct code. */
2683
2684 static bfd_boolean
2685 is_delay_slot_valid (const struct mips_opcode *mo)
2686 {
2687 if (!mips_opts.micromips)
2688 return TRUE;
2689
2690 if (mo->pinfo == INSN_MACRO)
2691 return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2692 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2693 && micromips_insn_length (mo) != 4)
2694 return FALSE;
2695 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2696 && micromips_insn_length (mo) != 2)
2697 return FALSE;
2698
2699 return TRUE;
2700 }
2701
2702 /* This function is called once, at assembler startup time. It should set up
2703 all the tables, etc. that the MD part of the assembler will need. */
2704
2705 void
2706 md_begin (void)
2707 {
2708 const char *retval = NULL;
2709 int i = 0;
2710 int broken = 0;
2711
2712 if (mips_pic != NO_PIC)
2713 {
2714 if (g_switch_seen && g_switch_value != 0)
2715 as_bad (_("-G may not be used in position-independent code"));
2716 g_switch_value = 0;
2717 }
2718
2719 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2720 as_warn (_("Could not set architecture and machine"));
2721
2722 op_hash = hash_new ();
2723
2724 for (i = 0; i < NUMOPCODES;)
2725 {
2726 const char *name = mips_opcodes[i].name;
2727
2728 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2729 if (retval != NULL)
2730 {
2731 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2732 mips_opcodes[i].name, retval);
2733 /* Probably a memory allocation problem? Give up now. */
2734 as_fatal (_("Broken assembler. No assembly attempted."));
2735 }
2736 do
2737 {
2738 if (mips_opcodes[i].pinfo != INSN_MACRO)
2739 {
2740 if (!validate_mips_insn (&mips_opcodes[i]))
2741 broken = 1;
2742 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2743 {
2744 create_insn (&nop_insn, mips_opcodes + i);
2745 if (mips_fix_loongson2f_nop)
2746 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2747 nop_insn.fixed_p = 1;
2748 }
2749 }
2750 ++i;
2751 }
2752 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2753 }
2754
2755 mips16_op_hash = hash_new ();
2756
2757 i = 0;
2758 while (i < bfd_mips16_num_opcodes)
2759 {
2760 const char *name = mips16_opcodes[i].name;
2761
2762 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2763 if (retval != NULL)
2764 as_fatal (_("internal: can't hash `%s': %s"),
2765 mips16_opcodes[i].name, retval);
2766 do
2767 {
2768 if (mips16_opcodes[i].pinfo != INSN_MACRO
2769 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2770 != mips16_opcodes[i].match))
2771 {
2772 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2773 mips16_opcodes[i].name, mips16_opcodes[i].args);
2774 broken = 1;
2775 }
2776 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2777 {
2778 create_insn (&mips16_nop_insn, mips16_opcodes + i);
2779 mips16_nop_insn.fixed_p = 1;
2780 }
2781 ++i;
2782 }
2783 while (i < bfd_mips16_num_opcodes
2784 && strcmp (mips16_opcodes[i].name, name) == 0);
2785 }
2786
2787 micromips_op_hash = hash_new ();
2788
2789 i = 0;
2790 while (i < bfd_micromips_num_opcodes)
2791 {
2792 const char *name = micromips_opcodes[i].name;
2793
2794 retval = hash_insert (micromips_op_hash, name,
2795 (void *) &micromips_opcodes[i]);
2796 if (retval != NULL)
2797 as_fatal (_("internal: can't hash `%s': %s"),
2798 micromips_opcodes[i].name, retval);
2799 do
2800 if (micromips_opcodes[i].pinfo != INSN_MACRO)
2801 {
2802 struct mips_cl_insn *micromips_nop_insn;
2803
2804 if (!validate_micromips_insn (&micromips_opcodes[i]))
2805 broken = 1;
2806
2807 if (micromips_insn_length (micromips_opcodes + i) == 2)
2808 micromips_nop_insn = &micromips_nop16_insn;
2809 else if (micromips_insn_length (micromips_opcodes + i) == 4)
2810 micromips_nop_insn = &micromips_nop32_insn;
2811 else
2812 continue;
2813
2814 if (micromips_nop_insn->insn_mo == NULL
2815 && strcmp (name, "nop") == 0)
2816 {
2817 create_insn (micromips_nop_insn, micromips_opcodes + i);
2818 micromips_nop_insn->fixed_p = 1;
2819 }
2820 }
2821 while (++i < bfd_micromips_num_opcodes
2822 && strcmp (micromips_opcodes[i].name, name) == 0);
2823 }
2824
2825 if (broken)
2826 as_fatal (_("Broken assembler. No assembly attempted."));
2827
2828 /* We add all the general register names to the symbol table. This
2829 helps us detect invalid uses of them. */
2830 for (i = 0; reg_names[i].name; i++)
2831 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2832 reg_names[i].num, /* & RNUM_MASK, */
2833 &zero_address_frag));
2834 if (HAVE_NEWABI)
2835 for (i = 0; reg_names_n32n64[i].name; i++)
2836 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2837 reg_names_n32n64[i].num, /* & RNUM_MASK, */
2838 &zero_address_frag));
2839 else
2840 for (i = 0; reg_names_o32[i].name; i++)
2841 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2842 reg_names_o32[i].num, /* & RNUM_MASK, */
2843 &zero_address_frag));
2844
2845 mips_no_prev_insn ();
2846
2847 mips_gprmask = 0;
2848 mips_cprmask[0] = 0;
2849 mips_cprmask[1] = 0;
2850 mips_cprmask[2] = 0;
2851 mips_cprmask[3] = 0;
2852
2853 /* set the default alignment for the text section (2**2) */
2854 record_alignment (text_section, 2);
2855
2856 bfd_set_gp_size (stdoutput, g_switch_value);
2857
2858 /* On a native system other than VxWorks, sections must be aligned
2859 to 16 byte boundaries. When configured for an embedded ELF
2860 target, we don't bother. */
2861 if (strncmp (TARGET_OS, "elf", 3) != 0
2862 && strncmp (TARGET_OS, "vxworks", 7) != 0)
2863 {
2864 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2865 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2866 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2867 }
2868
2869 /* Create a .reginfo section for register masks and a .mdebug
2870 section for debugging information. */
2871 {
2872 segT seg;
2873 subsegT subseg;
2874 flagword flags;
2875 segT sec;
2876
2877 seg = now_seg;
2878 subseg = now_subseg;
2879
2880 /* The ABI says this section should be loaded so that the
2881 running program can access it. However, we don't load it
2882 if we are configured for an embedded target */
2883 flags = SEC_READONLY | SEC_DATA;
2884 if (strncmp (TARGET_OS, "elf", 3) != 0)
2885 flags |= SEC_ALLOC | SEC_LOAD;
2886
2887 if (mips_abi != N64_ABI)
2888 {
2889 sec = subseg_new (".reginfo", (subsegT) 0);
2890
2891 bfd_set_section_flags (stdoutput, sec, flags);
2892 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2893
2894 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2895 }
2896 else
2897 {
2898 /* The 64-bit ABI uses a .MIPS.options section rather than
2899 .reginfo section. */
2900 sec = subseg_new (".MIPS.options", (subsegT) 0);
2901 bfd_set_section_flags (stdoutput, sec, flags);
2902 bfd_set_section_alignment (stdoutput, sec, 3);
2903
2904 /* Set up the option header. */
2905 {
2906 Elf_Internal_Options opthdr;
2907 char *f;
2908
2909 opthdr.kind = ODK_REGINFO;
2910 opthdr.size = (sizeof (Elf_External_Options)
2911 + sizeof (Elf64_External_RegInfo));
2912 opthdr.section = 0;
2913 opthdr.info = 0;
2914 f = frag_more (sizeof (Elf_External_Options));
2915 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2916 (Elf_External_Options *) f);
2917
2918 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2919 }
2920 }
2921
2922 if (ECOFF_DEBUGGING)
2923 {
2924 sec = subseg_new (".mdebug", (subsegT) 0);
2925 (void) bfd_set_section_flags (stdoutput, sec,
2926 SEC_HAS_CONTENTS | SEC_READONLY);
2927 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2928 }
2929 else if (mips_flag_pdr)
2930 {
2931 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2932 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2933 SEC_READONLY | SEC_RELOC
2934 | SEC_DEBUGGING);
2935 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2936 }
2937
2938 subseg_set (seg, subseg);
2939 }
2940
2941 if (! ECOFF_DEBUGGING)
2942 md_obj_begin ();
2943
2944 if (mips_fix_vr4120)
2945 init_vr4120_conflicts ();
2946 }
2947
2948 void
2949 md_mips_end (void)
2950 {
2951 mips_emit_delays ();
2952 if (! ECOFF_DEBUGGING)
2953 md_obj_end ();
2954 }
2955
2956 void
2957 md_assemble (char *str)
2958 {
2959 struct mips_cl_insn insn;
2960 bfd_reloc_code_real_type unused_reloc[3]
2961 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2962
2963 imm_expr.X_op = O_absent;
2964 imm2_expr.X_op = O_absent;
2965 offset_expr.X_op = O_absent;
2966 imm_reloc[0] = BFD_RELOC_UNUSED;
2967 imm_reloc[1] = BFD_RELOC_UNUSED;
2968 imm_reloc[2] = BFD_RELOC_UNUSED;
2969 offset_reloc[0] = BFD_RELOC_UNUSED;
2970 offset_reloc[1] = BFD_RELOC_UNUSED;
2971 offset_reloc[2] = BFD_RELOC_UNUSED;
2972
2973 mips_mark_labels ();
2974 mips_assembling_insn = TRUE;
2975
2976 if (mips_opts.mips16)
2977 mips16_ip (str, &insn);
2978 else
2979 {
2980 mips_ip (str, &insn);
2981 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2982 str, insn.insn_opcode));
2983 }
2984
2985 if (insn_error)
2986 as_bad ("%s `%s'", insn_error, str);
2987 else if (insn.insn_mo->pinfo == INSN_MACRO)
2988 {
2989 macro_start ();
2990 if (mips_opts.mips16)
2991 mips16_macro (&insn);
2992 else
2993 macro (&insn, str);
2994 macro_end ();
2995 }
2996 else
2997 {
2998 if (imm_expr.X_op != O_absent)
2999 append_insn (&insn, &imm_expr, imm_reloc, FALSE);
3000 else if (offset_expr.X_op != O_absent)
3001 append_insn (&insn, &offset_expr, offset_reloc, FALSE);
3002 else
3003 append_insn (&insn, NULL, unused_reloc, FALSE);
3004 }
3005
3006 mips_assembling_insn = FALSE;
3007 }
3008
3009 /* Convenience functions for abstracting away the differences between
3010 MIPS16 and non-MIPS16 relocations. */
3011
3012 static inline bfd_boolean
3013 mips16_reloc_p (bfd_reloc_code_real_type reloc)
3014 {
3015 switch (reloc)
3016 {
3017 case BFD_RELOC_MIPS16_JMP:
3018 case BFD_RELOC_MIPS16_GPREL:
3019 case BFD_RELOC_MIPS16_GOT16:
3020 case BFD_RELOC_MIPS16_CALL16:
3021 case BFD_RELOC_MIPS16_HI16_S:
3022 case BFD_RELOC_MIPS16_HI16:
3023 case BFD_RELOC_MIPS16_LO16:
3024 return TRUE;
3025
3026 default:
3027 return FALSE;
3028 }
3029 }
3030
3031 static inline bfd_boolean
3032 micromips_reloc_p (bfd_reloc_code_real_type reloc)
3033 {
3034 switch (reloc)
3035 {
3036 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3037 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3038 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3039 case BFD_RELOC_MICROMIPS_GPREL16:
3040 case BFD_RELOC_MICROMIPS_JMP:
3041 case BFD_RELOC_MICROMIPS_HI16:
3042 case BFD_RELOC_MICROMIPS_HI16_S:
3043 case BFD_RELOC_MICROMIPS_LO16:
3044 case BFD_RELOC_MICROMIPS_LITERAL:
3045 case BFD_RELOC_MICROMIPS_GOT16:
3046 case BFD_RELOC_MICROMIPS_CALL16:
3047 case BFD_RELOC_MICROMIPS_GOT_HI16:
3048 case BFD_RELOC_MICROMIPS_GOT_LO16:
3049 case BFD_RELOC_MICROMIPS_CALL_HI16:
3050 case BFD_RELOC_MICROMIPS_CALL_LO16:
3051 case BFD_RELOC_MICROMIPS_SUB:
3052 case BFD_RELOC_MICROMIPS_GOT_PAGE:
3053 case BFD_RELOC_MICROMIPS_GOT_OFST:
3054 case BFD_RELOC_MICROMIPS_GOT_DISP:
3055 case BFD_RELOC_MICROMIPS_HIGHEST:
3056 case BFD_RELOC_MICROMIPS_HIGHER:
3057 case BFD_RELOC_MICROMIPS_SCN_DISP:
3058 case BFD_RELOC_MICROMIPS_JALR:
3059 return TRUE;
3060
3061 default:
3062 return FALSE;
3063 }
3064 }
3065
3066 static inline bfd_boolean
3067 jmp_reloc_p (bfd_reloc_code_real_type reloc)
3068 {
3069 return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
3070 }
3071
3072 static inline bfd_boolean
3073 got16_reloc_p (bfd_reloc_code_real_type reloc)
3074 {
3075 return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
3076 || reloc == BFD_RELOC_MICROMIPS_GOT16);
3077 }
3078
3079 static inline bfd_boolean
3080 hi16_reloc_p (bfd_reloc_code_real_type reloc)
3081 {
3082 return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
3083 || reloc == BFD_RELOC_MICROMIPS_HI16_S);
3084 }
3085
3086 static inline bfd_boolean
3087 lo16_reloc_p (bfd_reloc_code_real_type reloc)
3088 {
3089 return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
3090 || reloc == BFD_RELOC_MICROMIPS_LO16);
3091 }
3092
3093 static inline bfd_boolean
3094 jalr_reloc_p (bfd_reloc_code_real_type reloc)
3095 {
3096 return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
3097 }
3098
3099 /* Return true if RELOC is a PC-relative relocation that does not have
3100 full address range. */
3101
3102 static inline bfd_boolean
3103 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
3104 {
3105 switch (reloc)
3106 {
3107 case BFD_RELOC_16_PCREL_S2:
3108 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3109 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3110 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3111 return TRUE;
3112
3113 case BFD_RELOC_32_PCREL:
3114 return HAVE_64BIT_ADDRESSES;
3115
3116 default:
3117 return FALSE;
3118 }
3119 }
3120
3121 /* Return true if the given relocation might need a matching %lo().
3122 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
3123 need a matching %lo() when applied to local symbols. */
3124
3125 static inline bfd_boolean
3126 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
3127 {
3128 return (HAVE_IN_PLACE_ADDENDS
3129 && (hi16_reloc_p (reloc)
3130 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
3131 all GOT16 relocations evaluate to "G". */
3132 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
3133 }
3134
3135 /* Return the type of %lo() reloc needed by RELOC, given that
3136 reloc_needs_lo_p. */
3137
3138 static inline bfd_reloc_code_real_type
3139 matching_lo_reloc (bfd_reloc_code_real_type reloc)
3140 {
3141 return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
3142 : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
3143 : BFD_RELOC_LO16));
3144 }
3145
3146 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
3147 relocation. */
3148
3149 static inline bfd_boolean
3150 fixup_has_matching_lo_p (fixS *fixp)
3151 {
3152 return (fixp->fx_next != NULL
3153 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
3154 && fixp->fx_addsy == fixp->fx_next->fx_addsy
3155 && fixp->fx_offset == fixp->fx_next->fx_offset);
3156 }
3157
3158 /* This function returns true if modifying a register requires a
3159 delay. */
3160
3161 static int
3162 reg_needs_delay (unsigned int reg)
3163 {
3164 unsigned long prev_pinfo;
3165
3166 prev_pinfo = history[0].insn_mo->pinfo;
3167 if (! mips_opts.noreorder
3168 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
3169 && ! gpr_interlocks)
3170 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
3171 && ! cop_interlocks)))
3172 {
3173 /* A load from a coprocessor or from memory. All load delays
3174 delay the use of general register rt for one instruction. */
3175 /* Itbl support may require additional care here. */
3176 know (prev_pinfo & INSN_WRITE_GPR_T);
3177 if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
3178 return 1;
3179 }
3180
3181 return 0;
3182 }
3183
3184 /* Move all labels in LABELS to the current insertion point. TEXT_P
3185 says whether the labels refer to text or data. */
3186
3187 static void
3188 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
3189 {
3190 struct insn_label_list *l;
3191 valueT val;
3192
3193 for (l = labels; l != NULL; l = l->next)
3194 {
3195 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
3196 symbol_set_frag (l->label, frag_now);
3197 val = (valueT) frag_now_fix ();
3198 /* MIPS16/microMIPS text labels are stored as odd. */
3199 if (text_p && HAVE_CODE_COMPRESSION)
3200 ++val;
3201 S_SET_VALUE (l->label, val);
3202 }
3203 }
3204
3205 /* Move all labels in insn_labels to the current insertion point
3206 and treat them as text labels. */
3207
3208 static void
3209 mips_move_text_labels (void)
3210 {
3211 mips_move_labels (seg_info (now_seg)->label_list, TRUE);
3212 }
3213
3214 static bfd_boolean
3215 s_is_linkonce (symbolS *sym, segT from_seg)
3216 {
3217 bfd_boolean linkonce = FALSE;
3218 segT symseg = S_GET_SEGMENT (sym);
3219
3220 if (symseg != from_seg && !S_IS_LOCAL (sym))
3221 {
3222 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
3223 linkonce = TRUE;
3224 /* The GNU toolchain uses an extension for ELF: a section
3225 beginning with the magic string .gnu.linkonce is a
3226 linkonce section. */
3227 if (strncmp (segment_name (symseg), ".gnu.linkonce",
3228 sizeof ".gnu.linkonce" - 1) == 0)
3229 linkonce = TRUE;
3230 }
3231 return linkonce;
3232 }
3233
3234 /* Mark MIPS16 or microMIPS instruction label LABEL. This permits the
3235 linker to handle them specially, such as generating jalx instructions
3236 when needed. We also make them odd for the duration of the assembly,
3237 in order to generate the right sort of code. We will make them even
3238 in the adjust_symtab routine, while leaving them marked. This is
3239 convenient for the debugger and the disassembler. The linker knows
3240 to make them odd again. */
3241
3242 static void
3243 mips_compressed_mark_label (symbolS *label)
3244 {
3245 gas_assert (HAVE_CODE_COMPRESSION);
3246
3247 if (mips_opts.mips16)
3248 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
3249 else
3250 S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
3251 if ((S_GET_VALUE (label) & 1) == 0
3252 /* Don't adjust the address if the label is global or weak, or
3253 in a link-once section, since we'll be emitting symbol reloc
3254 references to it which will be patched up by the linker, and
3255 the final value of the symbol may or may not be MIPS16/microMIPS. */
3256 && !S_IS_WEAK (label)
3257 && !S_IS_EXTERNAL (label)
3258 && !s_is_linkonce (label, now_seg))
3259 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
3260 }
3261
3262 /* Mark preceding MIPS16 or microMIPS instruction labels. */
3263
3264 static void
3265 mips_compressed_mark_labels (void)
3266 {
3267 struct insn_label_list *l;
3268
3269 for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
3270 mips_compressed_mark_label (l->label);
3271 }
3272
3273 /* End the current frag. Make it a variant frag and record the
3274 relaxation info. */
3275
3276 static void
3277 relax_close_frag (void)
3278 {
3279 mips_macro_warning.first_frag = frag_now;
3280 frag_var (rs_machine_dependent, 0, 0,
3281 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
3282 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
3283
3284 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
3285 mips_relax.first_fixup = 0;
3286 }
3287
3288 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
3289 See the comment above RELAX_ENCODE for more details. */
3290
3291 static void
3292 relax_start (symbolS *symbol)
3293 {
3294 gas_assert (mips_relax.sequence == 0);
3295 mips_relax.sequence = 1;
3296 mips_relax.symbol = symbol;
3297 }
3298
3299 /* Start generating the second version of a relaxable sequence.
3300 See the comment above RELAX_ENCODE for more details. */
3301
3302 static void
3303 relax_switch (void)
3304 {
3305 gas_assert (mips_relax.sequence == 1);
3306 mips_relax.sequence = 2;
3307 }
3308
3309 /* End the current relaxable sequence. */
3310
3311 static void
3312 relax_end (void)
3313 {
3314 gas_assert (mips_relax.sequence == 2);
3315 relax_close_frag ();
3316 mips_relax.sequence = 0;
3317 }
3318
3319 /* Return true if IP is a delayed branch or jump. */
3320
3321 static inline bfd_boolean
3322 delayed_branch_p (const struct mips_cl_insn *ip)
3323 {
3324 return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3325 | INSN_COND_BRANCH_DELAY
3326 | INSN_COND_BRANCH_LIKELY)) != 0;
3327 }
3328
3329 /* Return true if IP is a compact branch or jump. */
3330
3331 static inline bfd_boolean
3332 compact_branch_p (const struct mips_cl_insn *ip)
3333 {
3334 if (mips_opts.mips16)
3335 return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3336 | MIPS16_INSN_COND_BRANCH)) != 0;
3337 else
3338 return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
3339 | INSN2_COND_BRANCH)) != 0;
3340 }
3341
3342 /* Return true if IP is an unconditional branch or jump. */
3343
3344 static inline bfd_boolean
3345 uncond_branch_p (const struct mips_cl_insn *ip)
3346 {
3347 return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3348 || (mips_opts.mips16
3349 ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3350 : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3351 }
3352
3353 /* Return true if IP is a branch-likely instruction. */
3354
3355 static inline bfd_boolean
3356 branch_likely_p (const struct mips_cl_insn *ip)
3357 {
3358 return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3359 }
3360
3361 /* Return the type of nop that should be used to fill the delay slot
3362 of delayed branch IP. */
3363
3364 static struct mips_cl_insn *
3365 get_delay_slot_nop (const struct mips_cl_insn *ip)
3366 {
3367 if (mips_opts.micromips
3368 && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3369 return &micromips_nop32_insn;
3370 return NOP_INSN;
3371 }
3372
3373 /* Return the mask of core registers that IP reads or writes. */
3374
3375 static unsigned int
3376 gpr_mod_mask (const struct mips_cl_insn *ip)
3377 {
3378 unsigned long pinfo2;
3379 unsigned int mask;
3380
3381 mask = 0;
3382 pinfo2 = ip->insn_mo->pinfo2;
3383 if (mips_opts.micromips)
3384 {
3385 if (pinfo2 & INSN2_MOD_GPR_MD)
3386 mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3387 if (pinfo2 & INSN2_MOD_GPR_MF)
3388 mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3389 if (pinfo2 & INSN2_MOD_SP)
3390 mask |= 1 << SP;
3391 }
3392 return mask;
3393 }
3394
3395 /* Return the mask of core registers that IP reads. */
3396
3397 static unsigned int
3398 gpr_read_mask (const struct mips_cl_insn *ip)
3399 {
3400 unsigned long pinfo, pinfo2;
3401 unsigned int mask;
3402
3403 mask = gpr_mod_mask (ip);
3404 pinfo = ip->insn_mo->pinfo;
3405 pinfo2 = ip->insn_mo->pinfo2;
3406 if (mips_opts.mips16)
3407 {
3408 if (pinfo & MIPS16_INSN_READ_X)
3409 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3410 if (pinfo & MIPS16_INSN_READ_Y)
3411 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3412 if (pinfo & MIPS16_INSN_READ_T)
3413 mask |= 1 << TREG;
3414 if (pinfo & MIPS16_INSN_READ_SP)
3415 mask |= 1 << SP;
3416 if (pinfo & MIPS16_INSN_READ_31)
3417 mask |= 1 << RA;
3418 if (pinfo & MIPS16_INSN_READ_Z)
3419 mask |= 1 << (mips16_to_32_reg_map
3420 [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3421 if (pinfo & MIPS16_INSN_READ_GPR_X)
3422 mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3423 }
3424 else
3425 {
3426 if (pinfo2 & INSN2_READ_GPR_D)
3427 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3428 if (pinfo & INSN_READ_GPR_T)
3429 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3430 if (pinfo & INSN_READ_GPR_S)
3431 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3432 if (pinfo2 & INSN2_READ_GP)
3433 mask |= 1 << GP;
3434 if (pinfo2 & INSN2_READ_GPR_31)
3435 mask |= 1 << RA;
3436 if (pinfo2 & INSN2_READ_GPR_Z)
3437 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3438 }
3439 if (mips_opts.micromips)
3440 {
3441 if (pinfo2 & INSN2_READ_GPR_MC)
3442 mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3443 if (pinfo2 & INSN2_READ_GPR_ME)
3444 mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3445 if (pinfo2 & INSN2_READ_GPR_MG)
3446 mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3447 if (pinfo2 & INSN2_READ_GPR_MJ)
3448 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3449 if (pinfo2 & INSN2_READ_GPR_MMN)
3450 {
3451 mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3452 mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3453 }
3454 if (pinfo2 & INSN2_READ_GPR_MP)
3455 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3456 if (pinfo2 & INSN2_READ_GPR_MQ)
3457 mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3458 }
3459 /* Don't include register 0. */
3460 return mask & ~1;
3461 }
3462
3463 /* Return the mask of core registers that IP writes. */
3464
3465 static unsigned int
3466 gpr_write_mask (const struct mips_cl_insn *ip)
3467 {
3468 unsigned long pinfo, pinfo2;
3469 unsigned int mask;
3470
3471 mask = gpr_mod_mask (ip);
3472 pinfo = ip->insn_mo->pinfo;
3473 pinfo2 = ip->insn_mo->pinfo2;
3474 if (mips_opts.mips16)
3475 {
3476 if (pinfo & MIPS16_INSN_WRITE_X)
3477 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3478 if (pinfo & MIPS16_INSN_WRITE_Y)
3479 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3480 if (pinfo & MIPS16_INSN_WRITE_Z)
3481 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3482 if (pinfo & MIPS16_INSN_WRITE_T)
3483 mask |= 1 << TREG;
3484 if (pinfo & MIPS16_INSN_WRITE_SP)
3485 mask |= 1 << SP;
3486 if (pinfo & MIPS16_INSN_WRITE_31)
3487 mask |= 1 << RA;
3488 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3489 mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3490 }
3491 else
3492 {
3493 if (pinfo & INSN_WRITE_GPR_D)
3494 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3495 if (pinfo & INSN_WRITE_GPR_T)
3496 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3497 if (pinfo & INSN_WRITE_GPR_S)
3498 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3499 if (pinfo & INSN_WRITE_GPR_31)
3500 mask |= 1 << RA;
3501 if (pinfo2 & INSN2_WRITE_GPR_Z)
3502 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3503 }
3504 if (mips_opts.micromips)
3505 {
3506 if (pinfo2 & INSN2_WRITE_GPR_MB)
3507 mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3508 if (pinfo2 & INSN2_WRITE_GPR_MH)
3509 {
3510 mask |= 1 << micromips_to_32_reg_h_map1[EXTRACT_OPERAND (1, MH, *ip)];
3511 mask |= 1 << micromips_to_32_reg_h_map2[EXTRACT_OPERAND (1, MH, *ip)];
3512 }
3513 if (pinfo2 & INSN2_WRITE_GPR_MJ)
3514 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3515 if (pinfo2 & INSN2_WRITE_GPR_MP)
3516 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3517 }
3518 /* Don't include register 0. */
3519 return mask & ~1;
3520 }
3521
3522 /* Return the mask of floating-point registers that IP reads. */
3523
3524 static unsigned int
3525 fpr_read_mask (const struct mips_cl_insn *ip)
3526 {
3527 unsigned long pinfo, pinfo2;
3528 unsigned int mask;
3529
3530 mask = 0;
3531 pinfo = ip->insn_mo->pinfo;
3532 pinfo2 = ip->insn_mo->pinfo2;
3533 if (!mips_opts.mips16)
3534 {
3535 if (pinfo2 & INSN2_READ_FPR_D)
3536 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3537 if (pinfo & INSN_READ_FPR_S)
3538 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3539 if (pinfo & INSN_READ_FPR_T)
3540 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3541 if (pinfo & INSN_READ_FPR_R)
3542 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3543 if (pinfo2 & INSN2_READ_FPR_Z)
3544 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3545 }
3546 /* Conservatively treat all operands to an FP_D instruction are doubles.
3547 (This is overly pessimistic for things like cvt.d.s.) */
3548 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3549 mask |= mask << 1;
3550 return mask;
3551 }
3552
3553 /* Return the mask of floating-point registers that IP writes. */
3554
3555 static unsigned int
3556 fpr_write_mask (const struct mips_cl_insn *ip)
3557 {
3558 unsigned long pinfo, pinfo2;
3559 unsigned int mask;
3560
3561 mask = 0;
3562 pinfo = ip->insn_mo->pinfo;
3563 pinfo2 = ip->insn_mo->pinfo2;
3564 if (!mips_opts.mips16)
3565 {
3566 if (pinfo & INSN_WRITE_FPR_D)
3567 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3568 if (pinfo & INSN_WRITE_FPR_S)
3569 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3570 if (pinfo & INSN_WRITE_FPR_T)
3571 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3572 if (pinfo2 & INSN2_WRITE_FPR_Z)
3573 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3574 }
3575 /* Conservatively treat all operands to an FP_D instruction are doubles.
3576 (This is overly pessimistic for things like cvt.s.d.) */
3577 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3578 mask |= mask << 1;
3579 return mask;
3580 }
3581
3582 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3583 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3584 by VR4120 errata. */
3585
3586 static unsigned int
3587 classify_vr4120_insn (const char *name)
3588 {
3589 if (strncmp (name, "macc", 4) == 0)
3590 return FIX_VR4120_MACC;
3591 if (strncmp (name, "dmacc", 5) == 0)
3592 return FIX_VR4120_DMACC;
3593 if (strncmp (name, "mult", 4) == 0)
3594 return FIX_VR4120_MULT;
3595 if (strncmp (name, "dmult", 5) == 0)
3596 return FIX_VR4120_DMULT;
3597 if (strstr (name, "div"))
3598 return FIX_VR4120_DIV;
3599 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3600 return FIX_VR4120_MTHILO;
3601 return NUM_FIX_VR4120_CLASSES;
3602 }
3603
3604 #define INSN_ERET 0x42000018
3605 #define INSN_DERET 0x4200001f
3606
3607 /* Return the number of instructions that must separate INSN1 and INSN2,
3608 where INSN1 is the earlier instruction. Return the worst-case value
3609 for any INSN2 if INSN2 is null. */
3610
3611 static unsigned int
3612 insns_between (const struct mips_cl_insn *insn1,
3613 const struct mips_cl_insn *insn2)
3614 {
3615 unsigned long pinfo1, pinfo2;
3616 unsigned int mask;
3617
3618 /* This function needs to know which pinfo flags are set for INSN2
3619 and which registers INSN2 uses. The former is stored in PINFO2 and
3620 the latter is tested via INSN2_USES_GPR. If INSN2 is null, PINFO2
3621 will have every flag set and INSN2_USES_GPR will always return true. */
3622 pinfo1 = insn1->insn_mo->pinfo;
3623 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3624
3625 #define INSN2_USES_GPR(REG) \
3626 (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3627
3628 /* For most targets, write-after-read dependencies on the HI and LO
3629 registers must be separated by at least two instructions. */
3630 if (!hilo_interlocks)
3631 {
3632 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3633 return 2;
3634 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3635 return 2;
3636 }
3637
3638 /* If we're working around r7000 errata, there must be two instructions
3639 between an mfhi or mflo and any instruction that uses the result. */
3640 if (mips_7000_hilo_fix
3641 && !mips_opts.micromips
3642 && MF_HILO_INSN (pinfo1)
3643 && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3644 return 2;
3645
3646 /* If we're working around 24K errata, one instruction is required
3647 if an ERET or DERET is followed by a branch instruction. */
3648 if (mips_fix_24k && !mips_opts.micromips)
3649 {
3650 if (insn1->insn_opcode == INSN_ERET
3651 || insn1->insn_opcode == INSN_DERET)
3652 {
3653 if (insn2 == NULL
3654 || insn2->insn_opcode == INSN_ERET
3655 || insn2->insn_opcode == INSN_DERET
3656 || delayed_branch_p (insn2))
3657 return 1;
3658 }
3659 }
3660
3661 /* If working around VR4120 errata, check for combinations that need
3662 a single intervening instruction. */
3663 if (mips_fix_vr4120 && !mips_opts.micromips)
3664 {
3665 unsigned int class1, class2;
3666
3667 class1 = classify_vr4120_insn (insn1->insn_mo->name);
3668 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3669 {
3670 if (insn2 == NULL)
3671 return 1;
3672 class2 = classify_vr4120_insn (insn2->insn_mo->name);
3673 if (vr4120_conflicts[class1] & (1 << class2))
3674 return 1;
3675 }
3676 }
3677
3678 if (!HAVE_CODE_COMPRESSION)
3679 {
3680 /* Check for GPR or coprocessor load delays. All such delays
3681 are on the RT register. */
3682 /* Itbl support may require additional care here. */
3683 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3684 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3685 {
3686 know (pinfo1 & INSN_WRITE_GPR_T);
3687 if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3688 return 1;
3689 }
3690
3691 /* Check for generic coprocessor hazards.
3692
3693 This case is not handled very well. There is no special
3694 knowledge of CP0 handling, and the coprocessors other than
3695 the floating point unit are not distinguished at all. */
3696 /* Itbl support may require additional care here. FIXME!
3697 Need to modify this to include knowledge about
3698 user specified delays! */
3699 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3700 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3701 {
3702 /* Handle cases where INSN1 writes to a known general coprocessor
3703 register. There must be a one instruction delay before INSN2
3704 if INSN2 reads that register, otherwise no delay is needed. */
3705 mask = fpr_write_mask (insn1);
3706 if (mask != 0)
3707 {
3708 if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3709 return 1;
3710 }
3711 else
3712 {
3713 /* Read-after-write dependencies on the control registers
3714 require a two-instruction gap. */
3715 if ((pinfo1 & INSN_WRITE_COND_CODE)
3716 && (pinfo2 & INSN_READ_COND_CODE))
3717 return 2;
3718
3719 /* We don't know exactly what INSN1 does. If INSN2 is
3720 also a coprocessor instruction, assume there must be
3721 a one instruction gap. */
3722 if (pinfo2 & INSN_COP)
3723 return 1;
3724 }
3725 }
3726
3727 /* Check for read-after-write dependencies on the coprocessor
3728 control registers in cases where INSN1 does not need a general
3729 coprocessor delay. This means that INSN1 is a floating point
3730 comparison instruction. */
3731 /* Itbl support may require additional care here. */
3732 else if (!cop_interlocks
3733 && (pinfo1 & INSN_WRITE_COND_CODE)
3734 && (pinfo2 & INSN_READ_COND_CODE))
3735 return 1;
3736 }
3737
3738 #undef INSN2_USES_GPR
3739
3740 return 0;
3741 }
3742
3743 /* Return the number of nops that would be needed to work around the
3744 VR4130 mflo/mfhi errata if instruction INSN immediately followed
3745 the MAX_VR4130_NOPS instructions described by HIST. Ignore hazards
3746 that are contained within the first IGNORE instructions of HIST. */
3747
3748 static int
3749 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3750 const struct mips_cl_insn *insn)
3751 {
3752 int i, j;
3753 unsigned int mask;
3754
3755 /* Check if the instruction writes to HI or LO. MTHI and MTLO
3756 are not affected by the errata. */
3757 if (insn != 0
3758 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3759 || strcmp (insn->insn_mo->name, "mtlo") == 0
3760 || strcmp (insn->insn_mo->name, "mthi") == 0))
3761 return 0;
3762
3763 /* Search for the first MFLO or MFHI. */
3764 for (i = 0; i < MAX_VR4130_NOPS; i++)
3765 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3766 {
3767 /* Extract the destination register. */
3768 mask = gpr_write_mask (&hist[i]);
3769
3770 /* No nops are needed if INSN reads that register. */
3771 if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3772 return 0;
3773
3774 /* ...or if any of the intervening instructions do. */
3775 for (j = 0; j < i; j++)
3776 if (gpr_read_mask (&hist[j]) & mask)
3777 return 0;
3778
3779 if (i >= ignore)
3780 return MAX_VR4130_NOPS - i;
3781 }
3782 return 0;
3783 }
3784
3785 #define BASE_REG_EQ(INSN1, INSN2) \
3786 ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3787 == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3788
3789 /* Return the minimum alignment for this store instruction. */
3790
3791 static int
3792 fix_24k_align_to (const struct mips_opcode *mo)
3793 {
3794 if (strcmp (mo->name, "sh") == 0)
3795 return 2;
3796
3797 if (strcmp (mo->name, "swc1") == 0
3798 || strcmp (mo->name, "swc2") == 0
3799 || strcmp (mo->name, "sw") == 0
3800 || strcmp (mo->name, "sc") == 0
3801 || strcmp (mo->name, "s.s") == 0)
3802 return 4;
3803
3804 if (strcmp (mo->name, "sdc1") == 0
3805 || strcmp (mo->name, "sdc2") == 0
3806 || strcmp (mo->name, "s.d") == 0)
3807 return 8;
3808
3809 /* sb, swl, swr */
3810 return 1;
3811 }
3812
3813 struct fix_24k_store_info
3814 {
3815 /* Immediate offset, if any, for this store instruction. */
3816 short off;
3817 /* Alignment required by this store instruction. */
3818 int align_to;
3819 /* True for register offsets. */
3820 int register_offset;
3821 };
3822
3823 /* Comparison function used by qsort. */
3824
3825 static int
3826 fix_24k_sort (const void *a, const void *b)
3827 {
3828 const struct fix_24k_store_info *pos1 = a;
3829 const struct fix_24k_store_info *pos2 = b;
3830
3831 return (pos1->off - pos2->off);
3832 }
3833
3834 /* INSN is a store instruction. Try to record the store information
3835 in STINFO. Return false if the information isn't known. */
3836
3837 static bfd_boolean
3838 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3839 const struct mips_cl_insn *insn)
3840 {
3841 /* The instruction must have a known offset. */
3842 if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3843 return FALSE;
3844
3845 stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3846 stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3847 return TRUE;
3848 }
3849
3850 /* Return the number of nops that would be needed to work around the 24k
3851 "lost data on stores during refill" errata if instruction INSN
3852 immediately followed the 2 instructions described by HIST.
3853 Ignore hazards that are contained within the first IGNORE
3854 instructions of HIST.
3855
3856 Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3857 for the data cache refills and store data. The following describes
3858 the scenario where the store data could be lost.
3859
3860 * A data cache miss, due to either a load or a store, causing fill
3861 data to be supplied by the memory subsystem
3862 * The first three doublewords of fill data are returned and written
3863 into the cache
3864 * A sequence of four stores occurs in consecutive cycles around the
3865 final doubleword of the fill:
3866 * Store A
3867 * Store B
3868 * Store C
3869 * Zero, One or more instructions
3870 * Store D
3871
3872 The four stores A-D must be to different doublewords of the line that
3873 is being filled. The fourth instruction in the sequence above permits
3874 the fill of the final doubleword to be transferred from the FSB into
3875 the cache. In the sequence above, the stores may be either integer
3876 (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3877 swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3878 different doublewords on the line. If the floating point unit is
3879 running in 1:2 mode, it is not possible to create the sequence above
3880 using only floating point store instructions.
3881
3882 In this case, the cache line being filled is incorrectly marked
3883 invalid, thereby losing the data from any store to the line that
3884 occurs between the original miss and the completion of the five
3885 cycle sequence shown above.
3886
3887 The workarounds are:
3888
3889 * Run the data cache in write-through mode.
3890 * Insert a non-store instruction between
3891 Store A and Store B or Store B and Store C. */
3892
3893 static int
3894 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3895 const struct mips_cl_insn *insn)
3896 {
3897 struct fix_24k_store_info pos[3];
3898 int align, i, base_offset;
3899
3900 if (ignore >= 2)
3901 return 0;
3902
3903 /* If the previous instruction wasn't a store, there's nothing to
3904 worry about. */
3905 if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3906 return 0;
3907
3908 /* If the instructions after the previous one are unknown, we have
3909 to assume the worst. */
3910 if (!insn)
3911 return 1;
3912
3913 /* Check whether we are dealing with three consecutive stores. */
3914 if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3915 || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3916 return 0;
3917
3918 /* If we don't know the relationship between the store addresses,
3919 assume the worst. */
3920 if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3921 || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3922 return 1;
3923
3924 if (!fix_24k_record_store_info (&pos[0], insn)
3925 || !fix_24k_record_store_info (&pos[1], &hist[0])
3926 || !fix_24k_record_store_info (&pos[2], &hist[1]))
3927 return 1;
3928
3929 qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3930
3931 /* Pick a value of ALIGN and X such that all offsets are adjusted by
3932 X bytes and such that the base register + X is known to be aligned
3933 to align bytes. */
3934
3935 if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3936 align = 8;
3937 else
3938 {
3939 align = pos[0].align_to;
3940 base_offset = pos[0].off;
3941 for (i = 1; i < 3; i++)
3942 if (align < pos[i].align_to)
3943 {
3944 align = pos[i].align_to;
3945 base_offset = pos[i].off;
3946 }
3947 for (i = 0; i < 3; i++)
3948 pos[i].off -= base_offset;
3949 }
3950
3951 pos[0].off &= ~align + 1;
3952 pos[1].off &= ~align + 1;
3953 pos[2].off &= ~align + 1;
3954
3955 /* If any two stores write to the same chunk, they also write to the
3956 same doubleword. The offsets are still sorted at this point. */
3957 if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3958 return 0;
3959
3960 /* A range of at least 9 bytes is needed for the stores to be in
3961 non-overlapping doublewords. */
3962 if (pos[2].off - pos[0].off <= 8)
3963 return 0;
3964
3965 if (pos[2].off - pos[1].off >= 24
3966 || pos[1].off - pos[0].off >= 24
3967 || pos[2].off - pos[0].off >= 32)
3968 return 0;
3969
3970 return 1;
3971 }
3972
3973 /* Return the number of nops that would be needed if instruction INSN
3974 immediately followed the MAX_NOPS instructions given by HIST,
3975 where HIST[0] is the most recent instruction. Ignore hazards
3976 between INSN and the first IGNORE instructions in HIST.
3977
3978 If INSN is null, return the worse-case number of nops for any
3979 instruction. */
3980
3981 static int
3982 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3983 const struct mips_cl_insn *insn)
3984 {
3985 int i, nops, tmp_nops;
3986
3987 nops = 0;
3988 for (i = ignore; i < MAX_DELAY_NOPS; i++)
3989 {
3990 tmp_nops = insns_between (hist + i, insn) - i;
3991 if (tmp_nops > nops)
3992 nops = tmp_nops;
3993 }
3994
3995 if (mips_fix_vr4130 && !mips_opts.micromips)
3996 {
3997 tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3998 if (tmp_nops > nops)
3999 nops = tmp_nops;
4000 }
4001
4002 if (mips_fix_24k && !mips_opts.micromips)
4003 {
4004 tmp_nops = nops_for_24k (ignore, hist, insn);
4005 if (tmp_nops > nops)
4006 nops = tmp_nops;
4007 }
4008
4009 return nops;
4010 }
4011
4012 /* The variable arguments provide NUM_INSNS extra instructions that
4013 might be added to HIST. Return the largest number of nops that
4014 would be needed after the extended sequence, ignoring hazards
4015 in the first IGNORE instructions. */
4016
4017 static int
4018 nops_for_sequence (int num_insns, int ignore,
4019 const struct mips_cl_insn *hist, ...)
4020 {
4021 va_list args;
4022 struct mips_cl_insn buffer[MAX_NOPS];
4023 struct mips_cl_insn *cursor;
4024 int nops;
4025
4026 va_start (args, hist);
4027 cursor = buffer + num_insns;
4028 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
4029 while (cursor > buffer)
4030 *--cursor = *va_arg (args, const struct mips_cl_insn *);
4031
4032 nops = nops_for_insn (ignore, buffer, NULL);
4033 va_end (args);
4034 return nops;
4035 }
4036
4037 /* Like nops_for_insn, but if INSN is a branch, take into account the
4038 worst-case delay for the branch target. */
4039
4040 static int
4041 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
4042 const struct mips_cl_insn *insn)
4043 {
4044 int nops, tmp_nops;
4045
4046 nops = nops_for_insn (ignore, hist, insn);
4047 if (delayed_branch_p (insn))
4048 {
4049 tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
4050 hist, insn, get_delay_slot_nop (insn));
4051 if (tmp_nops > nops)
4052 nops = tmp_nops;
4053 }
4054 else if (compact_branch_p (insn))
4055 {
4056 tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
4057 if (tmp_nops > nops)
4058 nops = tmp_nops;
4059 }
4060 return nops;
4061 }
4062
4063 /* Fix NOP issue: Replace nops by "or at,at,zero". */
4064
4065 static void
4066 fix_loongson2f_nop (struct mips_cl_insn * ip)
4067 {
4068 gas_assert (!HAVE_CODE_COMPRESSION);
4069 if (strcmp (ip->insn_mo->name, "nop") == 0)
4070 ip->insn_opcode = LOONGSON2F_NOP_INSN;
4071 }
4072
4073 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
4074 jr target pc &= 'hffff_ffff_cfff_ffff. */
4075
4076 static void
4077 fix_loongson2f_jump (struct mips_cl_insn * ip)
4078 {
4079 gas_assert (!HAVE_CODE_COMPRESSION);
4080 if (strcmp (ip->insn_mo->name, "j") == 0
4081 || strcmp (ip->insn_mo->name, "jr") == 0
4082 || strcmp (ip->insn_mo->name, "jalr") == 0)
4083 {
4084 int sreg;
4085 expressionS ep;
4086
4087 if (! mips_opts.at)
4088 return;
4089
4090 sreg = EXTRACT_OPERAND (0, RS, *ip);
4091 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
4092 return;
4093
4094 ep.X_op = O_constant;
4095 ep.X_add_number = 0xcfff0000;
4096 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
4097 ep.X_add_number = 0xffff;
4098 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
4099 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
4100 }
4101 }
4102
4103 static void
4104 fix_loongson2f (struct mips_cl_insn * ip)
4105 {
4106 if (mips_fix_loongson2f_nop)
4107 fix_loongson2f_nop (ip);
4108
4109 if (mips_fix_loongson2f_jump)
4110 fix_loongson2f_jump (ip);
4111 }
4112
4113 /* IP is a branch that has a delay slot, and we need to fill it
4114 automatically. Return true if we can do that by swapping IP
4115 with the previous instruction.
4116 ADDRESS_EXPR is an operand of the instruction to be used with
4117 RELOC_TYPE. */
4118
4119 static bfd_boolean
4120 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
4121 bfd_reloc_code_real_type *reloc_type)
4122 {
4123 unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
4124 unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
4125
4126 /* -O2 and above is required for this optimization. */
4127 if (mips_optimize < 2)
4128 return FALSE;
4129
4130 /* If we have seen .set volatile or .set nomove, don't optimize. */
4131 if (mips_opts.nomove)
4132 return FALSE;
4133
4134 /* We can't swap if the previous instruction's position is fixed. */
4135 if (history[0].fixed_p)
4136 return FALSE;
4137
4138 /* If the previous previous insn was in a .set noreorder, we can't
4139 swap. Actually, the MIPS assembler will swap in this situation.
4140 However, gcc configured -with-gnu-as will generate code like
4141
4142 .set noreorder
4143 lw $4,XXX
4144 .set reorder
4145 INSN
4146 bne $4,$0,foo
4147
4148 in which we can not swap the bne and INSN. If gcc is not configured
4149 -with-gnu-as, it does not output the .set pseudo-ops. */
4150 if (history[1].noreorder_p)
4151 return FALSE;
4152
4153 /* If the previous instruction had a fixup in mips16 mode, we can not swap.
4154 This means that the previous instruction was a 4-byte one anyhow. */
4155 if (mips_opts.mips16 && history[0].fixp[0])
4156 return FALSE;
4157
4158 /* If the branch is itself the target of a branch, we can not swap.
4159 We cheat on this; all we check for is whether there is a label on
4160 this instruction. If there are any branches to anything other than
4161 a label, users must use .set noreorder. */
4162 if (seg_info (now_seg)->label_list)
4163 return FALSE;
4164
4165 /* If the previous instruction is in a variant frag other than this
4166 branch's one, we cannot do the swap. This does not apply to
4167 MIPS16 code, which uses variant frags for different purposes. */
4168 if (!mips_opts.mips16
4169 && history[0].frag
4170 && history[0].frag->fr_type == rs_machine_dependent)
4171 return FALSE;
4172
4173 /* We do not swap with instructions that cannot architecturally
4174 be placed in a branch delay slot, such as SYNC or ERET. We
4175 also refrain from swapping with a trap instruction, since it
4176 complicates trap handlers to have the trap instruction be in
4177 a delay slot. */
4178 prev_pinfo = history[0].insn_mo->pinfo;
4179 if (prev_pinfo & INSN_NO_DELAY_SLOT)
4180 return FALSE;
4181
4182 /* Check for conflicts between the branch and the instructions
4183 before the candidate delay slot. */
4184 if (nops_for_insn (0, history + 1, ip) > 0)
4185 return FALSE;
4186
4187 /* Check for conflicts between the swapped sequence and the
4188 target of the branch. */
4189 if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
4190 return FALSE;
4191
4192 /* If the branch reads a register that the previous
4193 instruction sets, we can not swap. */
4194 gpr_read = gpr_read_mask (ip);
4195 prev_gpr_write = gpr_write_mask (&history[0]);
4196 if (gpr_read & prev_gpr_write)
4197 return FALSE;
4198
4199 /* If the branch writes a register that the previous
4200 instruction sets, we can not swap. */
4201 gpr_write = gpr_write_mask (ip);
4202 if (gpr_write & prev_gpr_write)
4203 return FALSE;
4204
4205 /* If the branch writes a register that the previous
4206 instruction reads, we can not swap. */
4207 prev_gpr_read = gpr_read_mask (&history[0]);
4208 if (gpr_write & prev_gpr_read)
4209 return FALSE;
4210
4211 /* If one instruction sets a condition code and the
4212 other one uses a condition code, we can not swap. */
4213 pinfo = ip->insn_mo->pinfo;
4214 if ((pinfo & INSN_READ_COND_CODE)
4215 && (prev_pinfo & INSN_WRITE_COND_CODE))
4216 return FALSE;
4217 if ((pinfo & INSN_WRITE_COND_CODE)
4218 && (prev_pinfo & INSN_READ_COND_CODE))
4219 return FALSE;
4220
4221 /* If the previous instruction uses the PC, we can not swap. */
4222 prev_pinfo2 = history[0].insn_mo->pinfo2;
4223 if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
4224 return FALSE;
4225 if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
4226 return FALSE;
4227
4228 /* If the previous instruction has an incorrect size for a fixed
4229 branch delay slot in microMIPS mode, we cannot swap. */
4230 pinfo2 = ip->insn_mo->pinfo2;
4231 if (mips_opts.micromips
4232 && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
4233 && insn_length (history) != 2)
4234 return FALSE;
4235 if (mips_opts.micromips
4236 && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
4237 && insn_length (history) != 4)
4238 return FALSE;
4239
4240 /* On R5900 short loops need to be fixed by inserting a nop in
4241 the branch delay slots.
4242 A short loop can be terminated too early. */
4243 if (mips_opts.arch == CPU_R5900
4244 /* Check if instruction has a parameter, ignore "j $31". */
4245 && (address_expr != NULL)
4246 /* Parameter must be 16 bit. */
4247 && (*reloc_type == BFD_RELOC_16_PCREL_S2)
4248 /* Branch to same segment. */
4249 && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
4250 /* Branch to same code fragment. */
4251 && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
4252 /* Can only calculate branch offset if value is known. */
4253 && symbol_constant_p(address_expr->X_add_symbol)
4254 /* Check if branch is really conditional. */
4255 && !((ip->insn_opcode & 0xffff0000) == 0x10000000 /* beq $0,$0 */
4256 || (ip->insn_opcode & 0xffff0000) == 0x04010000 /* bgez $0 */
4257 || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
4258 {
4259 int distance;
4260 /* Check if loop is shorter than 6 instructions including
4261 branch and delay slot. */
4262 distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
4263 if (distance <= 20)
4264 {
4265 int i;
4266 int rv;
4267
4268 rv = FALSE;
4269 /* When the loop includes branches or jumps,
4270 it is not a short loop. */
4271 for (i = 0; i < (distance / 4); i++)
4272 {
4273 if ((history[i].cleared_p)
4274 || delayed_branch_p(&history[i]))
4275 {
4276 rv = TRUE;
4277 break;
4278 }
4279 }
4280 if (rv == FALSE)
4281 {
4282 /* Insert nop after branch to fix short loop. */
4283 return FALSE;
4284 }
4285 }
4286 }
4287
4288 return TRUE;
4289 }
4290
4291 /* Decide how we should add IP to the instruction stream.
4292 ADDRESS_EXPR is an operand of the instruction to be used with
4293 RELOC_TYPE. */
4294
4295 static enum append_method
4296 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
4297 bfd_reloc_code_real_type *reloc_type)
4298 {
4299 unsigned long pinfo;
4300
4301 /* The relaxed version of a macro sequence must be inherently
4302 hazard-free. */
4303 if (mips_relax.sequence == 2)
4304 return APPEND_ADD;
4305
4306 /* We must not dabble with instructions in a ".set norerorder" block. */
4307 if (mips_opts.noreorder)
4308 return APPEND_ADD;
4309
4310 /* Otherwise, it's our responsibility to fill branch delay slots. */
4311 if (delayed_branch_p (ip))
4312 {
4313 if (!branch_likely_p (ip)
4314 && can_swap_branch_p (ip, address_expr, reloc_type))
4315 return APPEND_SWAP;
4316
4317 pinfo = ip->insn_mo->pinfo;
4318 if (mips_opts.mips16
4319 && ISA_SUPPORTS_MIPS16E
4320 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
4321 return APPEND_ADD_COMPACT;
4322
4323 return APPEND_ADD_WITH_NOP;
4324 }
4325
4326 return APPEND_ADD;
4327 }
4328
4329 /* IP is a MIPS16 instruction whose opcode we have just changed.
4330 Point IP->insn_mo to the new opcode's definition. */
4331
4332 static void
4333 find_altered_mips16_opcode (struct mips_cl_insn *ip)
4334 {
4335 const struct mips_opcode *mo, *end;
4336
4337 end = &mips16_opcodes[bfd_mips16_num_opcodes];
4338 for (mo = ip->insn_mo; mo < end; mo++)
4339 if ((ip->insn_opcode & mo->mask) == mo->match)
4340 {
4341 ip->insn_mo = mo;
4342 return;
4343 }
4344 abort ();
4345 }
4346
4347 /* For microMIPS macros, we need to generate a local number label
4348 as the target of branches. */
4349 #define MICROMIPS_LABEL_CHAR '\037'
4350 static unsigned long micromips_target_label;
4351 static char micromips_target_name[32];
4352
4353 static char *
4354 micromips_label_name (void)
4355 {
4356 char *p = micromips_target_name;
4357 char symbol_name_temporary[24];
4358 unsigned long l;
4359 int i;
4360
4361 if (*p)
4362 return p;
4363
4364 i = 0;
4365 l = micromips_target_label;
4366 #ifdef LOCAL_LABEL_PREFIX
4367 *p++ = LOCAL_LABEL_PREFIX;
4368 #endif
4369 *p++ = 'L';
4370 *p++ = MICROMIPS_LABEL_CHAR;
4371 do
4372 {
4373 symbol_name_temporary[i++] = l % 10 + '0';
4374 l /= 10;
4375 }
4376 while (l != 0);
4377 while (i > 0)
4378 *p++ = symbol_name_temporary[--i];
4379 *p = '\0';
4380
4381 return micromips_target_name;
4382 }
4383
4384 static void
4385 micromips_label_expr (expressionS *label_expr)
4386 {
4387 label_expr->X_op = O_symbol;
4388 label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4389 label_expr->X_add_number = 0;
4390 }
4391
4392 static void
4393 micromips_label_inc (void)
4394 {
4395 micromips_target_label++;
4396 *micromips_target_name = '\0';
4397 }
4398
4399 static void
4400 micromips_add_label (void)
4401 {
4402 symbolS *s;
4403
4404 s = colon (micromips_label_name ());
4405 micromips_label_inc ();
4406 S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4407 }
4408
4409 /* If assembling microMIPS code, then return the microMIPS reloc
4410 corresponding to the requested one if any. Otherwise return
4411 the reloc unchanged. */
4412
4413 static bfd_reloc_code_real_type
4414 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4415 {
4416 static const bfd_reloc_code_real_type relocs[][2] =
4417 {
4418 /* Keep sorted incrementally by the left-hand key. */
4419 { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4420 { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4421 { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4422 { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4423 { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4424 { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4425 { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4426 { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4427 { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4428 { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4429 { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4430 { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4431 { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4432 { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4433 { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4434 { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4435 { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4436 { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4437 { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4438 { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4439 { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4440 { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4441 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4442 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4443 { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4444 { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4445 { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4446 };
4447 bfd_reloc_code_real_type r;
4448 size_t i;
4449
4450 if (!mips_opts.micromips)
4451 return reloc;
4452 for (i = 0; i < ARRAY_SIZE (relocs); i++)
4453 {
4454 r = relocs[i][0];
4455 if (r > reloc)
4456 return reloc;
4457 if (r == reloc)
4458 return relocs[i][1];
4459 }
4460 return reloc;
4461 }
4462
4463 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4464 Return true on success, storing the resolved value in RESULT. */
4465
4466 static bfd_boolean
4467 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4468 offsetT *result)
4469 {
4470 switch (reloc)
4471 {
4472 case BFD_RELOC_MIPS_HIGHEST:
4473 case BFD_RELOC_MICROMIPS_HIGHEST:
4474 *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4475 return TRUE;
4476
4477 case BFD_RELOC_MIPS_HIGHER:
4478 case BFD_RELOC_MICROMIPS_HIGHER:
4479 *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4480 return TRUE;
4481
4482 case BFD_RELOC_HI16_S:
4483 case BFD_RELOC_MICROMIPS_HI16_S:
4484 case BFD_RELOC_MIPS16_HI16_S:
4485 *result = ((operand + 0x8000) >> 16) & 0xffff;
4486 return TRUE;
4487
4488 case BFD_RELOC_HI16:
4489 case BFD_RELOC_MICROMIPS_HI16:
4490 case BFD_RELOC_MIPS16_HI16:
4491 *result = (operand >> 16) & 0xffff;
4492 return TRUE;
4493
4494 case BFD_RELOC_LO16:
4495 case BFD_RELOC_MICROMIPS_LO16:
4496 case BFD_RELOC_MIPS16_LO16:
4497 *result = operand & 0xffff;
4498 return TRUE;
4499
4500 case BFD_RELOC_UNUSED:
4501 *result = operand;
4502 return TRUE;
4503
4504 default:
4505 return FALSE;
4506 }
4507 }
4508
4509 /* Output an instruction. IP is the instruction information.
4510 ADDRESS_EXPR is an operand of the instruction to be used with
4511 RELOC_TYPE. EXPANSIONP is true if the instruction is part of
4512 a macro expansion. */
4513
4514 static void
4515 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4516 bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4517 {
4518 unsigned long prev_pinfo2, pinfo;
4519 bfd_boolean relaxed_branch = FALSE;
4520 enum append_method method;
4521 bfd_boolean relax32;
4522 int branch_disp;
4523
4524 if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4525 fix_loongson2f (ip);
4526
4527 file_ase_mips16 |= mips_opts.mips16;
4528 file_ase_micromips |= mips_opts.micromips;
4529
4530 prev_pinfo2 = history[0].insn_mo->pinfo2;
4531 pinfo = ip->insn_mo->pinfo;
4532
4533 if (mips_opts.micromips
4534 && !expansionp
4535 && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4536 && micromips_insn_length (ip->insn_mo) != 2)
4537 || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4538 && micromips_insn_length (ip->insn_mo) != 4)))
4539 as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4540 (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4541
4542 if (address_expr == NULL)
4543 ip->complete_p = 1;
4544 else if (reloc_type[0] <= BFD_RELOC_UNUSED
4545 && reloc_type[1] == BFD_RELOC_UNUSED
4546 && reloc_type[2] == BFD_RELOC_UNUSED
4547 && address_expr->X_op == O_constant)
4548 {
4549 switch (*reloc_type)
4550 {
4551 case BFD_RELOC_MIPS_JMP:
4552 {
4553 int shift;
4554
4555 shift = mips_opts.micromips ? 1 : 2;
4556 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4557 as_bad (_("jump to misaligned address (0x%lx)"),
4558 (unsigned long) address_expr->X_add_number);
4559 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4560 & 0x3ffffff);
4561 ip->complete_p = 1;
4562 }
4563 break;
4564
4565 case BFD_RELOC_MIPS16_JMP:
4566 if ((address_expr->X_add_number & 3) != 0)
4567 as_bad (_("jump to misaligned address (0x%lx)"),
4568 (unsigned long) address_expr->X_add_number);
4569 ip->insn_opcode |=
4570 (((address_expr->X_add_number & 0x7c0000) << 3)
4571 | ((address_expr->X_add_number & 0xf800000) >> 7)
4572 | ((address_expr->X_add_number & 0x3fffc) >> 2));
4573 ip->complete_p = 1;
4574 break;
4575
4576 case BFD_RELOC_16_PCREL_S2:
4577 {
4578 int shift;
4579
4580 shift = mips_opts.micromips ? 1 : 2;
4581 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4582 as_bad (_("branch to misaligned address (0x%lx)"),
4583 (unsigned long) address_expr->X_add_number);
4584 if (!mips_relax_branch)
4585 {
4586 if ((address_expr->X_add_number + (1 << (shift + 15)))
4587 & ~((1 << (shift + 16)) - 1))
4588 as_bad (_("branch address range overflow (0x%lx)"),
4589 (unsigned long) address_expr->X_add_number);
4590 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4591 & 0xffff);
4592 }
4593 }
4594 break;
4595
4596 default:
4597 {
4598 offsetT value;
4599
4600 if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4601 &value))
4602 {
4603 ip->insn_opcode |= value & 0xffff;
4604 ip->complete_p = 1;
4605 }
4606 }
4607 break;
4608 }
4609 }
4610
4611 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4612 {
4613 /* There are a lot of optimizations we could do that we don't.
4614 In particular, we do not, in general, reorder instructions.
4615 If you use gcc with optimization, it will reorder
4616 instructions and generally do much more optimization then we
4617 do here; repeating all that work in the assembler would only
4618 benefit hand written assembly code, and does not seem worth
4619 it. */
4620 int nops = (mips_optimize == 0
4621 ? nops_for_insn (0, history, NULL)
4622 : nops_for_insn_or_target (0, history, ip));
4623 if (nops > 0)
4624 {
4625 fragS *old_frag;
4626 unsigned long old_frag_offset;
4627 int i;
4628
4629 old_frag = frag_now;
4630 old_frag_offset = frag_now_fix ();
4631
4632 for (i = 0; i < nops; i++)
4633 add_fixed_insn (NOP_INSN);
4634 insert_into_history (0, nops, NOP_INSN);
4635
4636 if (listing)
4637 {
4638 listing_prev_line ();
4639 /* We may be at the start of a variant frag. In case we
4640 are, make sure there is enough space for the frag
4641 after the frags created by listing_prev_line. The
4642 argument to frag_grow here must be at least as large
4643 as the argument to all other calls to frag_grow in
4644 this file. We don't have to worry about being in the
4645 middle of a variant frag, because the variants insert
4646 all needed nop instructions themselves. */
4647 frag_grow (40);
4648 }
4649
4650 mips_move_text_labels ();
4651
4652 #ifndef NO_ECOFF_DEBUGGING
4653 if (ECOFF_DEBUGGING)
4654 ecoff_fix_loc (old_frag, old_frag_offset);
4655 #endif
4656 }
4657 }
4658 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4659 {
4660 int nops;
4661
4662 /* Work out how many nops in prev_nop_frag are needed by IP,
4663 ignoring hazards generated by the first prev_nop_frag_since
4664 instructions. */
4665 nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4666 gas_assert (nops <= prev_nop_frag_holds);
4667
4668 /* Enforce NOPS as a minimum. */
4669 if (nops > prev_nop_frag_required)
4670 prev_nop_frag_required = nops;
4671
4672 if (prev_nop_frag_holds == prev_nop_frag_required)
4673 {
4674 /* Settle for the current number of nops. Update the history
4675 accordingly (for the benefit of any future .set reorder code). */
4676 prev_nop_frag = NULL;
4677 insert_into_history (prev_nop_frag_since,
4678 prev_nop_frag_holds, NOP_INSN);
4679 }
4680 else
4681 {
4682 /* Allow this instruction to replace one of the nops that was
4683 tentatively added to prev_nop_frag. */
4684 prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4685 prev_nop_frag_holds--;
4686 prev_nop_frag_since++;
4687 }
4688 }
4689
4690 method = get_append_method (ip, address_expr, reloc_type);
4691 branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4692
4693 dwarf2_emit_insn (0);
4694 /* We want MIPS16 and microMIPS debug info to use ISA-encoded addresses,
4695 so "move" the instruction address accordingly.
4696
4697 Also, it doesn't seem appropriate for the assembler to reorder .loc
4698 entries. If this instruction is a branch that we are going to swap
4699 with the previous instruction, the two instructions should be
4700 treated as a unit, and the debug information for both instructions
4701 should refer to the start of the branch sequence. Using the
4702 current position is certainly wrong when swapping a 32-bit branch
4703 and a 16-bit delay slot, since the current position would then be
4704 in the middle of a branch. */
4705 dwarf2_move_insn ((HAVE_CODE_COMPRESSION ? 1 : 0) - branch_disp);
4706
4707 relax32 = (mips_relax_branch
4708 /* Don't try branch relaxation within .set nomacro, or within
4709 .set noat if we use $at for PIC computations. If it turns
4710 out that the branch was out-of-range, we'll get an error. */
4711 && !mips_opts.warn_about_macros
4712 && (mips_opts.at || mips_pic == NO_PIC)
4713 /* Don't relax BPOSGE32/64 or BC1ANY2T/F and BC1ANY4T/F
4714 as they have no complementing branches. */
4715 && !(ip->insn_mo->ase & (ASE_MIPS3D | ASE_DSP64 | ASE_DSP)));
4716
4717 if (!HAVE_CODE_COMPRESSION
4718 && address_expr
4719 && relax32
4720 && *reloc_type == BFD_RELOC_16_PCREL_S2
4721 && delayed_branch_p (ip))
4722 {
4723 relaxed_branch = TRUE;
4724 add_relaxed_insn (ip, (relaxed_branch_length
4725 (NULL, NULL,
4726 uncond_branch_p (ip) ? -1
4727 : branch_likely_p (ip) ? 1
4728 : 0)), 4,
4729 RELAX_BRANCH_ENCODE
4730 (AT,
4731 uncond_branch_p (ip),
4732 branch_likely_p (ip),
4733 pinfo & INSN_WRITE_GPR_31,
4734 0),
4735 address_expr->X_add_symbol,
4736 address_expr->X_add_number);
4737 *reloc_type = BFD_RELOC_UNUSED;
4738 }
4739 else if (mips_opts.micromips
4740 && address_expr
4741 && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4742 || *reloc_type > BFD_RELOC_UNUSED)
4743 && (delayed_branch_p (ip) || compact_branch_p (ip))
4744 /* Don't try branch relaxation when users specify
4745 16-bit/32-bit instructions. */
4746 && !forced_insn_length)
4747 {
4748 bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4749 int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4750 int uncond = uncond_branch_p (ip) ? -1 : 0;
4751 int compact = compact_branch_p (ip);
4752 int al = pinfo & INSN_WRITE_GPR_31;
4753 int length32;
4754
4755 gas_assert (address_expr != NULL);
4756 gas_assert (!mips_relax.sequence);
4757
4758 relaxed_branch = TRUE;
4759 length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4760 add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4761 RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4762 relax32, 0, 0),
4763 address_expr->X_add_symbol,
4764 address_expr->X_add_number);
4765 *reloc_type = BFD_RELOC_UNUSED;
4766 }
4767 else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4768 {
4769 /* We need to set up a variant frag. */
4770 gas_assert (address_expr != NULL);
4771 add_relaxed_insn (ip, 4, 0,
4772 RELAX_MIPS16_ENCODE
4773 (*reloc_type - BFD_RELOC_UNUSED,
4774 forced_insn_length == 2, forced_insn_length == 4,
4775 delayed_branch_p (&history[0]),
4776 history[0].mips16_absolute_jump_p),
4777 make_expr_symbol (address_expr), 0);
4778 }
4779 else if (mips_opts.mips16 && insn_length (ip) == 2)
4780 {
4781 if (!delayed_branch_p (ip))
4782 /* Make sure there is enough room to swap this instruction with
4783 a following jump instruction. */
4784 frag_grow (6);
4785 add_fixed_insn (ip);
4786 }
4787 else
4788 {
4789 if (mips_opts.mips16
4790 && mips_opts.noreorder
4791 && delayed_branch_p (&history[0]))
4792 as_warn (_("extended instruction in delay slot"));
4793
4794 if (mips_relax.sequence)
4795 {
4796 /* If we've reached the end of this frag, turn it into a variant
4797 frag and record the information for the instructions we've
4798 written so far. */
4799 if (frag_room () < 4)
4800 relax_close_frag ();
4801 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4802 }
4803
4804 if (mips_relax.sequence != 2)
4805 {
4806 if (mips_macro_warning.first_insn_sizes[0] == 0)
4807 mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4808 mips_macro_warning.sizes[0] += insn_length (ip);
4809 mips_macro_warning.insns[0]++;
4810 }
4811 if (mips_relax.sequence != 1)
4812 {
4813 if (mips_macro_warning.first_insn_sizes[1] == 0)
4814 mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4815 mips_macro_warning.sizes[1] += insn_length (ip);
4816 mips_macro_warning.insns[1]++;
4817 }
4818
4819 if (mips_opts.mips16)
4820 {
4821 ip->fixed_p = 1;
4822 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4823 }
4824 add_fixed_insn (ip);
4825 }
4826
4827 if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4828 {
4829 bfd_reloc_code_real_type final_type[3];
4830 reloc_howto_type *howto0;
4831 reloc_howto_type *howto;
4832 int i;
4833
4834 /* Perform any necessary conversion to microMIPS relocations
4835 and find out how many relocations there actually are. */
4836 for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4837 final_type[i] = micromips_map_reloc (reloc_type[i]);
4838
4839 /* In a compound relocation, it is the final (outermost)
4840 operator that determines the relocated field. */
4841 howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4842 if (!howto)
4843 abort ();
4844
4845 if (i > 1)
4846 howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4847 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4848 bfd_get_reloc_size (howto),
4849 address_expr,
4850 howto0 && howto0->pc_relative,
4851 final_type[0]);
4852
4853 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
4854 if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4855 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4856
4857 /* These relocations can have an addend that won't fit in
4858 4 octets for 64bit assembly. */
4859 if (HAVE_64BIT_GPRS
4860 && ! howto->partial_inplace
4861 && (reloc_type[0] == BFD_RELOC_16
4862 || reloc_type[0] == BFD_RELOC_32
4863 || reloc_type[0] == BFD_RELOC_MIPS_JMP
4864 || reloc_type[0] == BFD_RELOC_GPREL16
4865 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4866 || reloc_type[0] == BFD_RELOC_GPREL32
4867 || reloc_type[0] == BFD_RELOC_64
4868 || reloc_type[0] == BFD_RELOC_CTOR
4869 || reloc_type[0] == BFD_RELOC_MIPS_SUB
4870 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4871 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4872 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4873 || reloc_type[0] == BFD_RELOC_MIPS_REL16
4874 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4875 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4876 || hi16_reloc_p (reloc_type[0])
4877 || lo16_reloc_p (reloc_type[0])))
4878 ip->fixp[0]->fx_no_overflow = 1;
4879
4880 /* These relocations can have an addend that won't fit in 2 octets. */
4881 if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4882 || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4883 ip->fixp[0]->fx_no_overflow = 1;
4884
4885 if (mips_relax.sequence)
4886 {
4887 if (mips_relax.first_fixup == 0)
4888 mips_relax.first_fixup = ip->fixp[0];
4889 }
4890 else if (reloc_needs_lo_p (*reloc_type))
4891 {
4892 struct mips_hi_fixup *hi_fixup;
4893
4894 /* Reuse the last entry if it already has a matching %lo. */
4895 hi_fixup = mips_hi_fixup_list;
4896 if (hi_fixup == 0
4897 || !fixup_has_matching_lo_p (hi_fixup->fixp))
4898 {
4899 hi_fixup = ((struct mips_hi_fixup *)
4900 xmalloc (sizeof (struct mips_hi_fixup)));
4901 hi_fixup->next = mips_hi_fixup_list;
4902 mips_hi_fixup_list = hi_fixup;
4903 }
4904 hi_fixup->fixp = ip->fixp[0];
4905 hi_fixup->seg = now_seg;
4906 }
4907
4908 /* Add fixups for the second and third relocations, if given.
4909 Note that the ABI allows the second relocation to be
4910 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
4911 moment we only use RSS_UNDEF, but we could add support
4912 for the others if it ever becomes necessary. */
4913 for (i = 1; i < 3; i++)
4914 if (reloc_type[i] != BFD_RELOC_UNUSED)
4915 {
4916 ip->fixp[i] = fix_new (ip->frag, ip->where,
4917 ip->fixp[0]->fx_size, NULL, 0,
4918 FALSE, final_type[i]);
4919
4920 /* Use fx_tcbit to mark compound relocs. */
4921 ip->fixp[0]->fx_tcbit = 1;
4922 ip->fixp[i]->fx_tcbit = 1;
4923 }
4924 }
4925 install_insn (ip);
4926
4927 /* Update the register mask information. */
4928 mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4929 mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4930
4931 switch (method)
4932 {
4933 case APPEND_ADD:
4934 insert_into_history (0, 1, ip);
4935 break;
4936
4937 case APPEND_ADD_WITH_NOP:
4938 {
4939 struct mips_cl_insn *nop;
4940
4941 insert_into_history (0, 1, ip);
4942 nop = get_delay_slot_nop (ip);
4943 add_fixed_insn (nop);
4944 insert_into_history (0, 1, nop);
4945 if (mips_relax.sequence)
4946 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4947 }
4948 break;
4949
4950 case APPEND_ADD_COMPACT:
4951 /* Convert MIPS16 jr/jalr into a "compact" jump. */
4952 gas_assert (mips_opts.mips16);
4953 ip->insn_opcode |= 0x0080;
4954 find_altered_mips16_opcode (ip);
4955 install_insn (ip);
4956 insert_into_history (0, 1, ip);
4957 break;
4958
4959 case APPEND_SWAP:
4960 {
4961 struct mips_cl_insn delay = history[0];
4962 if (mips_opts.mips16)
4963 {
4964 know (delay.frag == ip->frag);
4965 move_insn (ip, delay.frag, delay.where);
4966 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4967 }
4968 else if (relaxed_branch || delay.frag != ip->frag)
4969 {
4970 /* Add the delay slot instruction to the end of the
4971 current frag and shrink the fixed part of the
4972 original frag. If the branch occupies the tail of
4973 the latter, move it backwards to cover the gap. */
4974 delay.frag->fr_fix -= branch_disp;
4975 if (delay.frag == ip->frag)
4976 move_insn (ip, ip->frag, ip->where - branch_disp);
4977 add_fixed_insn (&delay);
4978 }
4979 else
4980 {
4981 move_insn (&delay, ip->frag,
4982 ip->where - branch_disp + insn_length (ip));
4983 move_insn (ip, history[0].frag, history[0].where);
4984 }
4985 history[0] = *ip;
4986 delay.fixed_p = 1;
4987 insert_into_history (0, 1, &delay);
4988 }
4989 break;
4990 }
4991
4992 /* If we have just completed an unconditional branch, clear the history. */
4993 if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4994 || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4995 {
4996 unsigned int i;
4997
4998 mips_no_prev_insn ();
4999
5000 for (i = 0; i < ARRAY_SIZE (history); i++)
5001 history[i].cleared_p = 1;
5002 }
5003
5004 /* We need to emit a label at the end of branch-likely macros. */
5005 if (emit_branch_likely_macro)
5006 {
5007 emit_branch_likely_macro = FALSE;
5008 micromips_add_label ();
5009 }
5010
5011 /* We just output an insn, so the next one doesn't have a label. */
5012 mips_clear_insn_labels ();
5013 }
5014
5015 /* Forget that there was any previous instruction or label.
5016 When BRANCH is true, the branch history is also flushed. */
5017
5018 static void
5019 mips_no_prev_insn (void)
5020 {
5021 prev_nop_frag = NULL;
5022 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
5023 mips_clear_insn_labels ();
5024 }
5025
5026 /* This function must be called before we emit something other than
5027 instructions. It is like mips_no_prev_insn except that it inserts
5028 any NOPS that might be needed by previous instructions. */
5029
5030 void
5031 mips_emit_delays (void)
5032 {
5033 if (! mips_opts.noreorder)
5034 {
5035 int nops = nops_for_insn (0, history, NULL);
5036 if (nops > 0)
5037 {
5038 while (nops-- > 0)
5039 add_fixed_insn (NOP_INSN);
5040 mips_move_text_labels ();
5041 }
5042 }
5043 mips_no_prev_insn ();
5044 }
5045
5046 /* Start a (possibly nested) noreorder block. */
5047
5048 static void
5049 start_noreorder (void)
5050 {
5051 if (mips_opts.noreorder == 0)
5052 {
5053 unsigned int i;
5054 int nops;
5055
5056 /* None of the instructions before the .set noreorder can be moved. */
5057 for (i = 0; i < ARRAY_SIZE (history); i++)
5058 history[i].fixed_p = 1;
5059
5060 /* Insert any nops that might be needed between the .set noreorder
5061 block and the previous instructions. We will later remove any
5062 nops that turn out not to be needed. */
5063 nops = nops_for_insn (0, history, NULL);
5064 if (nops > 0)
5065 {
5066 if (mips_optimize != 0)
5067 {
5068 /* Record the frag which holds the nop instructions, so
5069 that we can remove them if we don't need them. */
5070 frag_grow (nops * NOP_INSN_SIZE);
5071 prev_nop_frag = frag_now;
5072 prev_nop_frag_holds = nops;
5073 prev_nop_frag_required = 0;
5074 prev_nop_frag_since = 0;
5075 }
5076
5077 for (; nops > 0; --nops)
5078 add_fixed_insn (NOP_INSN);
5079
5080 /* Move on to a new frag, so that it is safe to simply
5081 decrease the size of prev_nop_frag. */
5082 frag_wane (frag_now);
5083 frag_new (0);
5084 mips_move_text_labels ();
5085 }
5086 mips_mark_labels ();
5087 mips_clear_insn_labels ();
5088 }
5089 mips_opts.noreorder++;
5090 mips_any_noreorder = 1;
5091 }
5092
5093 /* End a nested noreorder block. */
5094
5095 static void
5096 end_noreorder (void)
5097 {
5098 mips_opts.noreorder--;
5099 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
5100 {
5101 /* Commit to inserting prev_nop_frag_required nops and go back to
5102 handling nop insertion the .set reorder way. */
5103 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
5104 * NOP_INSN_SIZE);
5105 insert_into_history (prev_nop_frag_since,
5106 prev_nop_frag_required, NOP_INSN);
5107 prev_nop_frag = NULL;
5108 }
5109 }
5110
5111 /* Set up global variables for the start of a new macro. */
5112
5113 static void
5114 macro_start (void)
5115 {
5116 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
5117 memset (&mips_macro_warning.first_insn_sizes, 0,
5118 sizeof (mips_macro_warning.first_insn_sizes));
5119 memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
5120 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
5121 && delayed_branch_p (&history[0]));
5122 switch (history[0].insn_mo->pinfo2
5123 & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
5124 {
5125 case INSN2_BRANCH_DELAY_32BIT:
5126 mips_macro_warning.delay_slot_length = 4;
5127 break;
5128 case INSN2_BRANCH_DELAY_16BIT:
5129 mips_macro_warning.delay_slot_length = 2;
5130 break;
5131 default:
5132 mips_macro_warning.delay_slot_length = 0;
5133 break;
5134 }
5135 mips_macro_warning.first_frag = NULL;
5136 }
5137
5138 /* Given that a macro is longer than one instruction or of the wrong size,
5139 return the appropriate warning for it. Return null if no warning is
5140 needed. SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
5141 RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
5142 and RELAX_NOMACRO. */
5143
5144 static const char *
5145 macro_warning (relax_substateT subtype)
5146 {
5147 if (subtype & RELAX_DELAY_SLOT)
5148 return _("Macro instruction expanded into multiple instructions"
5149 " in a branch delay slot");
5150 else if (subtype & RELAX_NOMACRO)
5151 return _("Macro instruction expanded into multiple instructions");
5152 else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
5153 | RELAX_DELAY_SLOT_SIZE_SECOND))
5154 return ((subtype & RELAX_DELAY_SLOT_16BIT)
5155 ? _("Macro instruction expanded into a wrong size instruction"
5156 " in a 16-bit branch delay slot")
5157 : _("Macro instruction expanded into a wrong size instruction"
5158 " in a 32-bit branch delay slot"));
5159 else
5160 return 0;
5161 }
5162
5163 /* Finish up a macro. Emit warnings as appropriate. */
5164
5165 static void
5166 macro_end (void)
5167 {
5168 /* Relaxation warning flags. */
5169 relax_substateT subtype = 0;
5170
5171 /* Check delay slot size requirements. */
5172 if (mips_macro_warning.delay_slot_length == 2)
5173 subtype |= RELAX_DELAY_SLOT_16BIT;
5174 if (mips_macro_warning.delay_slot_length != 0)
5175 {
5176 if (mips_macro_warning.delay_slot_length
5177 != mips_macro_warning.first_insn_sizes[0])
5178 subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
5179 if (mips_macro_warning.delay_slot_length
5180 != mips_macro_warning.first_insn_sizes[1])
5181 subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
5182 }
5183
5184 /* Check instruction count requirements. */
5185 if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
5186 {
5187 if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
5188 subtype |= RELAX_SECOND_LONGER;
5189 if (mips_opts.warn_about_macros)
5190 subtype |= RELAX_NOMACRO;
5191 if (mips_macro_warning.delay_slot_p)
5192 subtype |= RELAX_DELAY_SLOT;
5193 }
5194
5195 /* If both alternatives fail to fill a delay slot correctly,
5196 emit the warning now. */
5197 if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
5198 && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
5199 {
5200 relax_substateT s;
5201 const char *msg;
5202
5203 s = subtype & (RELAX_DELAY_SLOT_16BIT
5204 | RELAX_DELAY_SLOT_SIZE_FIRST
5205 | RELAX_DELAY_SLOT_SIZE_SECOND);
5206 msg = macro_warning (s);
5207 if (msg != NULL)
5208 as_warn ("%s", msg);
5209 subtype &= ~s;
5210 }
5211
5212 /* If both implementations are longer than 1 instruction, then emit the
5213 warning now. */
5214 if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
5215 {
5216 relax_substateT s;
5217 const char *msg;
5218
5219 s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
5220 msg = macro_warning (s);
5221 if (msg != NULL)
5222 as_warn ("%s", msg);
5223 subtype &= ~s;
5224 }
5225
5226 /* If any flags still set, then one implementation might need a warning
5227 and the other either will need one of a different kind or none at all.
5228 Pass any remaining flags over to relaxation. */
5229 if (mips_macro_warning.first_frag != NULL)
5230 mips_macro_warning.first_frag->fr_subtype |= subtype;
5231 }
5232
5233 /* Instruction operand formats used in macros that vary between
5234 standard MIPS and microMIPS code. */
5235
5236 static const char * const brk_fmt[2][2] = { { "c", "c" }, { "mF", "c" } };
5237 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
5238 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
5239 static const char * const lui_fmt[2] = { "t,u", "s,u" };
5240 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
5241 static const char * const mfhl_fmt[2][2] = { { "d", "d" }, { "mj", "s" } };
5242 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
5243 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
5244
5245 #define BRK_FMT (brk_fmt[mips_opts.micromips][mips_opts.insn32])
5246 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
5247 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
5248 #define LUI_FMT (lui_fmt[mips_opts.micromips])
5249 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
5250 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips][mips_opts.insn32])
5251 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
5252 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
5253
5254 /* Read a macro's relocation codes from *ARGS and store them in *R.
5255 The first argument in *ARGS will be either the code for a single
5256 relocation or -1 followed by the three codes that make up a
5257 composite relocation. */
5258
5259 static void
5260 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
5261 {
5262 int i, next;
5263
5264 next = va_arg (*args, int);
5265 if (next >= 0)
5266 r[0] = (bfd_reloc_code_real_type) next;
5267 else
5268 for (i = 0; i < 3; i++)
5269 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
5270 }
5271
5272 /* Build an instruction created by a macro expansion. This is passed
5273 a pointer to the count of instructions created so far, an
5274 expression, the name of the instruction to build, an operand format
5275 string, and corresponding arguments. */
5276
5277 static void
5278 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
5279 {
5280 const struct mips_opcode *mo = NULL;
5281 bfd_reloc_code_real_type r[3];
5282 const struct mips_opcode *amo;
5283 struct hash_control *hash;
5284 struct mips_cl_insn insn;
5285 va_list args;
5286
5287 va_start (args, fmt);
5288
5289 if (mips_opts.mips16)
5290 {
5291 mips16_macro_build (ep, name, fmt, &args);
5292 va_end (args);
5293 return;
5294 }
5295
5296 r[0] = BFD_RELOC_UNUSED;
5297 r[1] = BFD_RELOC_UNUSED;
5298 r[2] = BFD_RELOC_UNUSED;
5299 hash = mips_opts.micromips ? micromips_op_hash : op_hash;
5300 amo = (struct mips_opcode *) hash_find (hash, name);
5301 gas_assert (amo);
5302 gas_assert (strcmp (name, amo->name) == 0);
5303
5304 do
5305 {
5306 /* Search until we get a match for NAME. It is assumed here that
5307 macros will never generate MDMX, MIPS-3D, or MT instructions.
5308 We try to match an instruction that fulfils the branch delay
5309 slot instruction length requirement (if any) of the previous
5310 instruction. While doing this we record the first instruction
5311 seen that matches all the other conditions and use it anyway
5312 if the requirement cannot be met; we will issue an appropriate
5313 warning later on. */
5314 if (strcmp (fmt, amo->args) == 0
5315 && amo->pinfo != INSN_MACRO
5316 && is_opcode_valid (amo)
5317 && is_size_valid (amo))
5318 {
5319 if (is_delay_slot_valid (amo))
5320 {
5321 mo = amo;
5322 break;
5323 }
5324 else if (!mo)
5325 mo = amo;
5326 }
5327
5328 ++amo;
5329 gas_assert (amo->name);
5330 }
5331 while (strcmp (name, amo->name) == 0);
5332
5333 gas_assert (mo);
5334 create_insn (&insn, mo);
5335 for (;;)
5336 {
5337 switch (*fmt++)
5338 {
5339 case '\0':
5340 break;
5341
5342 case ',':
5343 case '(':
5344 case ')':
5345 continue;
5346
5347 case '+':
5348 switch (*fmt++)
5349 {
5350 case 'A':
5351 case 'E':
5352 INSERT_OPERAND (mips_opts.micromips,
5353 EXTLSB, insn, va_arg (args, int));
5354 continue;
5355
5356 case 'B':
5357 case 'F':
5358 /* Note that in the macro case, these arguments are already
5359 in MSB form. (When handling the instruction in the
5360 non-macro case, these arguments are sizes from which
5361 MSB values must be calculated.) */
5362 INSERT_OPERAND (mips_opts.micromips,
5363 INSMSB, insn, va_arg (args, int));
5364 continue;
5365
5366 case 'J':
5367 gas_assert (!mips_opts.micromips);
5368 INSERT_OPERAND (0, CODE10, insn, va_arg (args, int));
5369 continue;
5370
5371 case 'C':
5372 case 'G':
5373 case 'H':
5374 /* Note that in the macro case, these arguments are already
5375 in MSBD form. (When handling the instruction in the
5376 non-macro case, these arguments are sizes from which
5377 MSBD values must be calculated.) */
5378 INSERT_OPERAND (mips_opts.micromips,
5379 EXTMSBD, insn, va_arg (args, int));
5380 continue;
5381
5382 case 'Q':
5383 gas_assert (!mips_opts.micromips);
5384 INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5385 continue;
5386
5387 case 'j':
5388 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, insn, va_arg (args, int));
5389 continue;
5390
5391 default:
5392 abort ();
5393 }
5394 continue;
5395
5396 case '2':
5397 INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5398 continue;
5399
5400 case 'n':
5401 gas_assert (mips_opts.micromips);
5402 case 't':
5403 case 'w':
5404 case 'E':
5405 INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5406 continue;
5407
5408 case 'c':
5409 INSERT_OPERAND (mips_opts.micromips, CODE, insn, va_arg (args, int));
5410 continue;
5411
5412 case 'W':
5413 gas_assert (!mips_opts.micromips);
5414 case 'T':
5415 INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5416 continue;
5417
5418 case 'G':
5419 if (mips_opts.micromips)
5420 INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5421 else
5422 INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5423 continue;
5424
5425 case 'K':
5426 gas_assert (!mips_opts.micromips);
5427 case 'd':
5428 INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5429 continue;
5430
5431 case 'U':
5432 gas_assert (!mips_opts.micromips);
5433 {
5434 int tmp = va_arg (args, int);
5435
5436 INSERT_OPERAND (0, RT, insn, tmp);
5437 INSERT_OPERAND (0, RD, insn, tmp);
5438 }
5439 continue;
5440
5441 case 'V':
5442 case 'S':
5443 gas_assert (!mips_opts.micromips);
5444 INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5445 continue;
5446
5447 case 'z':
5448 continue;
5449
5450 case '<':
5451 INSERT_OPERAND (mips_opts.micromips,
5452 SHAMT, insn, va_arg (args, int));
5453 continue;
5454
5455 case 'D':
5456 gas_assert (!mips_opts.micromips);
5457 INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5458 continue;
5459
5460 case 'B':
5461 gas_assert (!mips_opts.micromips);
5462 INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5463 continue;
5464
5465 case 'J':
5466 gas_assert (!mips_opts.micromips);
5467 INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5468 continue;
5469
5470 case 'q':
5471 gas_assert (!mips_opts.micromips);
5472 INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5473 continue;
5474
5475 case 'b':
5476 case 's':
5477 case 'r':
5478 case 'v':
5479 INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5480 continue;
5481
5482 case 'i':
5483 case 'j':
5484 macro_read_relocs (&args, r);
5485 gas_assert (*r == BFD_RELOC_GPREL16
5486 || *r == BFD_RELOC_MIPS_HIGHER
5487 || *r == BFD_RELOC_HI16_S
5488 || *r == BFD_RELOC_LO16
5489 || *r == BFD_RELOC_MIPS_GOT_OFST);
5490 continue;
5491
5492 case 'o':
5493 macro_read_relocs (&args, r);
5494 continue;
5495
5496 case 'u':
5497 macro_read_relocs (&args, r);
5498 gas_assert (ep != NULL
5499 && (ep->X_op == O_constant
5500 || (ep->X_op == O_symbol
5501 && (*r == BFD_RELOC_MIPS_HIGHEST
5502 || *r == BFD_RELOC_HI16_S
5503 || *r == BFD_RELOC_HI16
5504 || *r == BFD_RELOC_GPREL16
5505 || *r == BFD_RELOC_MIPS_GOT_HI16
5506 || *r == BFD_RELOC_MIPS_CALL_HI16))));
5507 continue;
5508
5509 case 'p':
5510 gas_assert (ep != NULL);
5511
5512 /*
5513 * This allows macro() to pass an immediate expression for
5514 * creating short branches without creating a symbol.
5515 *
5516 * We don't allow branch relaxation for these branches, as
5517 * they should only appear in ".set nomacro" anyway.
5518 */
5519 if (ep->X_op == O_constant)
5520 {
5521 /* For microMIPS we always use relocations for branches.
5522 So we should not resolve immediate values. */
5523 gas_assert (!mips_opts.micromips);
5524
5525 if ((ep->X_add_number & 3) != 0)
5526 as_bad (_("branch to misaligned address (0x%lx)"),
5527 (unsigned long) ep->X_add_number);
5528 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5529 as_bad (_("branch address range overflow (0x%lx)"),
5530 (unsigned long) ep->X_add_number);
5531 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5532 ep = NULL;
5533 }
5534 else
5535 *r = BFD_RELOC_16_PCREL_S2;
5536 continue;
5537
5538 case 'a':
5539 gas_assert (ep != NULL);
5540 *r = BFD_RELOC_MIPS_JMP;
5541 continue;
5542
5543 case 'C':
5544 gas_assert (!mips_opts.micromips);
5545 INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5546 continue;
5547
5548 case 'k':
5549 INSERT_OPERAND (mips_opts.micromips,
5550 CACHE, insn, va_arg (args, unsigned long));
5551 continue;
5552
5553 case '|':
5554 gas_assert (mips_opts.micromips);
5555 INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5556 continue;
5557
5558 case '.':
5559 gas_assert (mips_opts.micromips);
5560 INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5561 continue;
5562
5563 case '\\':
5564 INSERT_OPERAND (mips_opts.micromips,
5565 3BITPOS, insn, va_arg (args, unsigned int));
5566 continue;
5567
5568 case '~':
5569 INSERT_OPERAND (mips_opts.micromips,
5570 OFFSET12, insn, va_arg (args, unsigned long));
5571 continue;
5572
5573 case 'N':
5574 gas_assert (mips_opts.micromips);
5575 INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5576 continue;
5577
5578 case 'm': /* Opcode extension character. */
5579 gas_assert (mips_opts.micromips);
5580 switch (*fmt++)
5581 {
5582 case 'j':
5583 INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5584 break;
5585
5586 case 'p':
5587 INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5588 break;
5589
5590 case 'F':
5591 INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5592 break;
5593
5594 default:
5595 abort ();
5596 }
5597 continue;
5598
5599 default:
5600 abort ();
5601 }
5602 break;
5603 }
5604 va_end (args);
5605 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5606
5607 append_insn (&insn, ep, r, TRUE);
5608 }
5609
5610 static void
5611 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5612 va_list *args)
5613 {
5614 struct mips_opcode *mo;
5615 struct mips_cl_insn insn;
5616 bfd_reloc_code_real_type r[3]
5617 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5618
5619 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5620 gas_assert (mo);
5621 gas_assert (strcmp (name, mo->name) == 0);
5622
5623 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5624 {
5625 ++mo;
5626 gas_assert (mo->name);
5627 gas_assert (strcmp (name, mo->name) == 0);
5628 }
5629
5630 create_insn (&insn, mo);
5631 for (;;)
5632 {
5633 int c;
5634
5635 c = *fmt++;
5636 switch (c)
5637 {
5638 case '\0':
5639 break;
5640
5641 case ',':
5642 case '(':
5643 case ')':
5644 continue;
5645
5646 case 'y':
5647 case 'w':
5648 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5649 continue;
5650
5651 case 'x':
5652 case 'v':
5653 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5654 continue;
5655
5656 case 'z':
5657 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5658 continue;
5659
5660 case 'Z':
5661 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5662 continue;
5663
5664 case '0':
5665 case 'S':
5666 case 'P':
5667 case 'R':
5668 continue;
5669
5670 case 'X':
5671 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5672 continue;
5673
5674 case 'Y':
5675 {
5676 int regno;
5677
5678 regno = va_arg (*args, int);
5679 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5680 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5681 }
5682 continue;
5683
5684 case '<':
5685 case '>':
5686 case '4':
5687 case '5':
5688 case 'H':
5689 case 'W':
5690 case 'D':
5691 case 'j':
5692 case '8':
5693 case 'V':
5694 case 'C':
5695 case 'U':
5696 case 'k':
5697 case 'K':
5698 case 'p':
5699 case 'q':
5700 {
5701 offsetT value;
5702
5703 gas_assert (ep != NULL);
5704
5705 if (ep->X_op != O_constant)
5706 *r = (int) BFD_RELOC_UNUSED + c;
5707 else if (calculate_reloc (*r, ep->X_add_number, &value))
5708 {
5709 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5710 ep = NULL;
5711 *r = BFD_RELOC_UNUSED;
5712 }
5713 }
5714 continue;
5715
5716 case '6':
5717 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5718 continue;
5719 }
5720
5721 break;
5722 }
5723
5724 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5725
5726 append_insn (&insn, ep, r, TRUE);
5727 }
5728
5729 /*
5730 * Sign-extend 32-bit mode constants that have bit 31 set and all
5731 * higher bits unset.
5732 */
5733 static void
5734 normalize_constant_expr (expressionS *ex)
5735 {
5736 if (ex->X_op == O_constant
5737 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5738 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5739 - 0x80000000);
5740 }
5741
5742 /*
5743 * Sign-extend 32-bit mode address offsets that have bit 31 set and
5744 * all higher bits unset.
5745 */
5746 static void
5747 normalize_address_expr (expressionS *ex)
5748 {
5749 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5750 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5751 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5752 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5753 - 0x80000000);
5754 }
5755
5756 /*
5757 * Generate a "jalr" instruction with a relocation hint to the called
5758 * function. This occurs in NewABI PIC code.
5759 */
5760 static void
5761 macro_build_jalr (expressionS *ep, int cprestore)
5762 {
5763 static const bfd_reloc_code_real_type jalr_relocs[2]
5764 = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5765 bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5766 const char *jalr;
5767 char *f = NULL;
5768
5769 if (MIPS_JALR_HINT_P (ep))
5770 {
5771 frag_grow (8);
5772 f = frag_more (0);
5773 }
5774 if (mips_opts.micromips)
5775 {
5776 jalr = ((mips_opts.noreorder && !cprestore) || mips_opts.insn32
5777 ? "jalr" : "jalrs");
5778 if (MIPS_JALR_HINT_P (ep)
5779 || mips_opts.insn32
5780 || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5781 macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5782 else
5783 macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5784 }
5785 else
5786 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5787 if (MIPS_JALR_HINT_P (ep))
5788 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5789 }
5790
5791 /*
5792 * Generate a "lui" instruction.
5793 */
5794 static void
5795 macro_build_lui (expressionS *ep, int regnum)
5796 {
5797 gas_assert (! mips_opts.mips16);
5798
5799 if (ep->X_op != O_constant)
5800 {
5801 gas_assert (ep->X_op == O_symbol);
5802 /* _gp_disp is a special case, used from s_cpload.
5803 __gnu_local_gp is used if mips_no_shared. */
5804 gas_assert (mips_pic == NO_PIC
5805 || (! HAVE_NEWABI
5806 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5807 || (! mips_in_shared
5808 && strcmp (S_GET_NAME (ep->X_add_symbol),
5809 "__gnu_local_gp") == 0));
5810 }
5811
5812 macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5813 }
5814
5815 /* Generate a sequence of instructions to do a load or store from a constant
5816 offset off of a base register (breg) into/from a target register (treg),
5817 using AT if necessary. */
5818 static void
5819 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5820 int treg, int breg, int dbl)
5821 {
5822 gas_assert (ep->X_op == O_constant);
5823
5824 /* Sign-extending 32-bit constants makes their handling easier. */
5825 if (!dbl)
5826 normalize_constant_expr (ep);
5827
5828 /* Right now, this routine can only handle signed 32-bit constants. */
5829 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5830 as_warn (_("operand overflow"));
5831
5832 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5833 {
5834 /* Signed 16-bit offset will fit in the op. Easy! */
5835 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5836 }
5837 else
5838 {
5839 /* 32-bit offset, need multiple instructions and AT, like:
5840 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
5841 addu $tempreg,$tempreg,$breg
5842 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
5843 to handle the complete offset. */
5844 macro_build_lui (ep, AT);
5845 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5846 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5847
5848 if (!mips_opts.at)
5849 as_bad (_("Macro used $at after \".set noat\""));
5850 }
5851 }
5852
5853 /* set_at()
5854 * Generates code to set the $at register to true (one)
5855 * if reg is less than the immediate expression.
5856 */
5857 static void
5858 set_at (int reg, int unsignedp)
5859 {
5860 if (imm_expr.X_op == O_constant
5861 && imm_expr.X_add_number >= -0x8000
5862 && imm_expr.X_add_number < 0x8000)
5863 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5864 AT, reg, BFD_RELOC_LO16);
5865 else
5866 {
5867 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5868 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5869 }
5870 }
5871
5872 /* Warn if an expression is not a constant. */
5873
5874 static void
5875 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5876 {
5877 if (ex->X_op == O_big)
5878 as_bad (_("unsupported large constant"));
5879 else if (ex->X_op != O_constant)
5880 as_bad (_("Instruction %s requires absolute expression"),
5881 ip->insn_mo->name);
5882
5883 if (HAVE_32BIT_GPRS)
5884 normalize_constant_expr (ex);
5885 }
5886
5887 /* Count the leading zeroes by performing a binary chop. This is a
5888 bulky bit of source, but performance is a LOT better for the
5889 majority of values than a simple loop to count the bits:
5890 for (lcnt = 0; (lcnt < 32); lcnt++)
5891 if ((v) & (1 << (31 - lcnt)))
5892 break;
5893 However it is not code size friendly, and the gain will drop a bit
5894 on certain cached systems.
5895 */
5896 #define COUNT_TOP_ZEROES(v) \
5897 (((v) & ~0xffff) == 0 \
5898 ? ((v) & ~0xff) == 0 \
5899 ? ((v) & ~0xf) == 0 \
5900 ? ((v) & ~0x3) == 0 \
5901 ? ((v) & ~0x1) == 0 \
5902 ? !(v) \
5903 ? 32 \
5904 : 31 \
5905 : 30 \
5906 : ((v) & ~0x7) == 0 \
5907 ? 29 \
5908 : 28 \
5909 : ((v) & ~0x3f) == 0 \
5910 ? ((v) & ~0x1f) == 0 \
5911 ? 27 \
5912 : 26 \
5913 : ((v) & ~0x7f) == 0 \
5914 ? 25 \
5915 : 24 \
5916 : ((v) & ~0xfff) == 0 \
5917 ? ((v) & ~0x3ff) == 0 \
5918 ? ((v) & ~0x1ff) == 0 \
5919 ? 23 \
5920 : 22 \
5921 : ((v) & ~0x7ff) == 0 \
5922 ? 21 \
5923 : 20 \
5924 : ((v) & ~0x3fff) == 0 \
5925 ? ((v) & ~0x1fff) == 0 \
5926 ? 19 \
5927 : 18 \
5928 : ((v) & ~0x7fff) == 0 \
5929 ? 17 \
5930 : 16 \
5931 : ((v) & ~0xffffff) == 0 \
5932 ? ((v) & ~0xfffff) == 0 \
5933 ? ((v) & ~0x3ffff) == 0 \
5934 ? ((v) & ~0x1ffff) == 0 \
5935 ? 15 \
5936 : 14 \
5937 : ((v) & ~0x7ffff) == 0 \
5938 ? 13 \
5939 : 12 \
5940 : ((v) & ~0x3fffff) == 0 \
5941 ? ((v) & ~0x1fffff) == 0 \
5942 ? 11 \
5943 : 10 \
5944 : ((v) & ~0x7fffff) == 0 \
5945 ? 9 \
5946 : 8 \
5947 : ((v) & ~0xfffffff) == 0 \
5948 ? ((v) & ~0x3ffffff) == 0 \
5949 ? ((v) & ~0x1ffffff) == 0 \
5950 ? 7 \
5951 : 6 \
5952 : ((v) & ~0x7ffffff) == 0 \
5953 ? 5 \
5954 : 4 \
5955 : ((v) & ~0x3fffffff) == 0 \
5956 ? ((v) & ~0x1fffffff) == 0 \
5957 ? 3 \
5958 : 2 \
5959 : ((v) & ~0x7fffffff) == 0 \
5960 ? 1 \
5961 : 0)
5962
5963 /* load_register()
5964 * This routine generates the least number of instructions necessary to load
5965 * an absolute expression value into a register.
5966 */
5967 static void
5968 load_register (int reg, expressionS *ep, int dbl)
5969 {
5970 int freg;
5971 expressionS hi32, lo32;
5972
5973 if (ep->X_op != O_big)
5974 {
5975 gas_assert (ep->X_op == O_constant);
5976
5977 /* Sign-extending 32-bit constants makes their handling easier. */
5978 if (!dbl)
5979 normalize_constant_expr (ep);
5980
5981 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5982 {
5983 /* We can handle 16 bit signed values with an addiu to
5984 $zero. No need to ever use daddiu here, since $zero and
5985 the result are always correct in 32 bit mode. */
5986 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5987 return;
5988 }
5989 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5990 {
5991 /* We can handle 16 bit unsigned values with an ori to
5992 $zero. */
5993 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5994 return;
5995 }
5996 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5997 {
5998 /* 32 bit values require an lui. */
5999 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6000 if ((ep->X_add_number & 0xffff) != 0)
6001 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6002 return;
6003 }
6004 }
6005
6006 /* The value is larger than 32 bits. */
6007
6008 if (!dbl || HAVE_32BIT_GPRS)
6009 {
6010 char value[32];
6011
6012 sprintf_vma (value, ep->X_add_number);
6013 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6014 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6015 return;
6016 }
6017
6018 if (ep->X_op != O_big)
6019 {
6020 hi32 = *ep;
6021 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
6022 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
6023 hi32.X_add_number &= 0xffffffff;
6024 lo32 = *ep;
6025 lo32.X_add_number &= 0xffffffff;
6026 }
6027 else
6028 {
6029 gas_assert (ep->X_add_number > 2);
6030 if (ep->X_add_number == 3)
6031 generic_bignum[3] = 0;
6032 else if (ep->X_add_number > 4)
6033 as_bad (_("Number larger than 64 bits"));
6034 lo32.X_op = O_constant;
6035 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
6036 hi32.X_op = O_constant;
6037 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
6038 }
6039
6040 if (hi32.X_add_number == 0)
6041 freg = 0;
6042 else
6043 {
6044 int shift, bit;
6045 unsigned long hi, lo;
6046
6047 if (hi32.X_add_number == (offsetT) 0xffffffff)
6048 {
6049 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
6050 {
6051 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6052 return;
6053 }
6054 if (lo32.X_add_number & 0x80000000)
6055 {
6056 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6057 if (lo32.X_add_number & 0xffff)
6058 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6059 return;
6060 }
6061 }
6062
6063 /* Check for 16bit shifted constant. We know that hi32 is
6064 non-zero, so start the mask on the first bit of the hi32
6065 value. */
6066 shift = 17;
6067 do
6068 {
6069 unsigned long himask, lomask;
6070
6071 if (shift < 32)
6072 {
6073 himask = 0xffff >> (32 - shift);
6074 lomask = (0xffff << shift) & 0xffffffff;
6075 }
6076 else
6077 {
6078 himask = 0xffff << (shift - 32);
6079 lomask = 0;
6080 }
6081 if ((hi32.X_add_number & ~(offsetT) himask) == 0
6082 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
6083 {
6084 expressionS tmp;
6085
6086 tmp.X_op = O_constant;
6087 if (shift < 32)
6088 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
6089 | (lo32.X_add_number >> shift));
6090 else
6091 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
6092 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
6093 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6094 reg, reg, (shift >= 32) ? shift - 32 : shift);
6095 return;
6096 }
6097 ++shift;
6098 }
6099 while (shift <= (64 - 16));
6100
6101 /* Find the bit number of the lowest one bit, and store the
6102 shifted value in hi/lo. */
6103 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
6104 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
6105 if (lo != 0)
6106 {
6107 bit = 0;
6108 while ((lo & 1) == 0)
6109 {
6110 lo >>= 1;
6111 ++bit;
6112 }
6113 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
6114 hi >>= bit;
6115 }
6116 else
6117 {
6118 bit = 32;
6119 while ((hi & 1) == 0)
6120 {
6121 hi >>= 1;
6122 ++bit;
6123 }
6124 lo = hi;
6125 hi = 0;
6126 }
6127
6128 /* Optimize if the shifted value is a (power of 2) - 1. */
6129 if ((hi == 0 && ((lo + 1) & lo) == 0)
6130 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
6131 {
6132 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
6133 if (shift != 0)
6134 {
6135 expressionS tmp;
6136
6137 /* This instruction will set the register to be all
6138 ones. */
6139 tmp.X_op = O_constant;
6140 tmp.X_add_number = (offsetT) -1;
6141 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6142 if (bit != 0)
6143 {
6144 bit += shift;
6145 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6146 reg, reg, (bit >= 32) ? bit - 32 : bit);
6147 }
6148 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
6149 reg, reg, (shift >= 32) ? shift - 32 : shift);
6150 return;
6151 }
6152 }
6153
6154 /* Sign extend hi32 before calling load_register, because we can
6155 generally get better code when we load a sign extended value. */
6156 if ((hi32.X_add_number & 0x80000000) != 0)
6157 hi32.X_add_number |= ~(offsetT) 0xffffffff;
6158 load_register (reg, &hi32, 0);
6159 freg = reg;
6160 }
6161 if ((lo32.X_add_number & 0xffff0000) == 0)
6162 {
6163 if (freg != 0)
6164 {
6165 macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
6166 freg = reg;
6167 }
6168 }
6169 else
6170 {
6171 expressionS mid16;
6172
6173 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
6174 {
6175 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6176 macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
6177 return;
6178 }
6179
6180 if (freg != 0)
6181 {
6182 macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
6183 freg = reg;
6184 }
6185 mid16 = lo32;
6186 mid16.X_add_number >>= 16;
6187 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6188 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6189 freg = reg;
6190 }
6191 if ((lo32.X_add_number & 0xffff) != 0)
6192 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6193 }
6194
6195 static inline void
6196 load_delay_nop (void)
6197 {
6198 if (!gpr_interlocks)
6199 macro_build (NULL, "nop", "");
6200 }
6201
6202 /* Load an address into a register. */
6203
6204 static void
6205 load_address (int reg, expressionS *ep, int *used_at)
6206 {
6207 if (ep->X_op != O_constant
6208 && ep->X_op != O_symbol)
6209 {
6210 as_bad (_("expression too complex"));
6211 ep->X_op = O_constant;
6212 }
6213
6214 if (ep->X_op == O_constant)
6215 {
6216 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
6217 return;
6218 }
6219
6220 if (mips_pic == NO_PIC)
6221 {
6222 /* If this is a reference to a GP relative symbol, we want
6223 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
6224 Otherwise we want
6225 lui $reg,<sym> (BFD_RELOC_HI16_S)
6226 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6227 If we have an addend, we always use the latter form.
6228
6229 With 64bit address space and a usable $at we want
6230 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6231 lui $at,<sym> (BFD_RELOC_HI16_S)
6232 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6233 daddiu $at,<sym> (BFD_RELOC_LO16)
6234 dsll32 $reg,0
6235 daddu $reg,$reg,$at
6236
6237 If $at is already in use, we use a path which is suboptimal
6238 on superscalar processors.
6239 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6240 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6241 dsll $reg,16
6242 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
6243 dsll $reg,16
6244 daddiu $reg,<sym> (BFD_RELOC_LO16)
6245
6246 For GP relative symbols in 64bit address space we can use
6247 the same sequence as in 32bit address space. */
6248 if (HAVE_64BIT_SYMBOLS)
6249 {
6250 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6251 && !nopic_need_relax (ep->X_add_symbol, 1))
6252 {
6253 relax_start (ep->X_add_symbol);
6254 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6255 mips_gp_register, BFD_RELOC_GPREL16);
6256 relax_switch ();
6257 }
6258
6259 if (*used_at == 0 && mips_opts.at)
6260 {
6261 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6262 macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
6263 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6264 BFD_RELOC_MIPS_HIGHER);
6265 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
6266 macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
6267 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
6268 *used_at = 1;
6269 }
6270 else
6271 {
6272 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6273 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6274 BFD_RELOC_MIPS_HIGHER);
6275 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6276 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
6277 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6278 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
6279 }
6280
6281 if (mips_relax.sequence)
6282 relax_end ();
6283 }
6284 else
6285 {
6286 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6287 && !nopic_need_relax (ep->X_add_symbol, 1))
6288 {
6289 relax_start (ep->X_add_symbol);
6290 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6291 mips_gp_register, BFD_RELOC_GPREL16);
6292 relax_switch ();
6293 }
6294 macro_build_lui (ep, reg);
6295 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
6296 reg, reg, BFD_RELOC_LO16);
6297 if (mips_relax.sequence)
6298 relax_end ();
6299 }
6300 }
6301 else if (!mips_big_got)
6302 {
6303 expressionS ex;
6304
6305 /* If this is a reference to an external symbol, we want
6306 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6307 Otherwise we want
6308 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6309 nop
6310 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6311 If there is a constant, it must be added in after.
6312
6313 If we have NewABI, we want
6314 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6315 unless we're referencing a global symbol with a non-zero
6316 offset, in which case cst must be added separately. */
6317 if (HAVE_NEWABI)
6318 {
6319 if (ep->X_add_number)
6320 {
6321 ex.X_add_number = ep->X_add_number;
6322 ep->X_add_number = 0;
6323 relax_start (ep->X_add_symbol);
6324 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6325 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6326 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6327 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6328 ex.X_op = O_constant;
6329 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6330 reg, reg, BFD_RELOC_LO16);
6331 ep->X_add_number = ex.X_add_number;
6332 relax_switch ();
6333 }
6334 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6335 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6336 if (mips_relax.sequence)
6337 relax_end ();
6338 }
6339 else
6340 {
6341 ex.X_add_number = ep->X_add_number;
6342 ep->X_add_number = 0;
6343 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6344 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6345 load_delay_nop ();
6346 relax_start (ep->X_add_symbol);
6347 relax_switch ();
6348 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6349 BFD_RELOC_LO16);
6350 relax_end ();
6351
6352 if (ex.X_add_number != 0)
6353 {
6354 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6355 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6356 ex.X_op = O_constant;
6357 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6358 reg, reg, BFD_RELOC_LO16);
6359 }
6360 }
6361 }
6362 else if (mips_big_got)
6363 {
6364 expressionS ex;
6365
6366 /* This is the large GOT case. If this is a reference to an
6367 external symbol, we want
6368 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6369 addu $reg,$reg,$gp
6370 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
6371
6372 Otherwise, for a reference to a local symbol in old ABI, we want
6373 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6374 nop
6375 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6376 If there is a constant, it must be added in after.
6377
6378 In the NewABI, for local symbols, with or without offsets, we want:
6379 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6380 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6381 */
6382 if (HAVE_NEWABI)
6383 {
6384 ex.X_add_number = ep->X_add_number;
6385 ep->X_add_number = 0;
6386 relax_start (ep->X_add_symbol);
6387 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6388 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6389 reg, reg, mips_gp_register);
6390 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6391 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6392 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6393 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6394 else if (ex.X_add_number)
6395 {
6396 ex.X_op = O_constant;
6397 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6398 BFD_RELOC_LO16);
6399 }
6400
6401 ep->X_add_number = ex.X_add_number;
6402 relax_switch ();
6403 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6404 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6405 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6406 BFD_RELOC_MIPS_GOT_OFST);
6407 relax_end ();
6408 }
6409 else
6410 {
6411 ex.X_add_number = ep->X_add_number;
6412 ep->X_add_number = 0;
6413 relax_start (ep->X_add_symbol);
6414 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6415 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6416 reg, reg, mips_gp_register);
6417 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6418 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6419 relax_switch ();
6420 if (reg_needs_delay (mips_gp_register))
6421 {
6422 /* We need a nop before loading from $gp. This special
6423 check is required because the lui which starts the main
6424 instruction stream does not refer to $gp, and so will not
6425 insert the nop which may be required. */
6426 macro_build (NULL, "nop", "");
6427 }
6428 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6429 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6430 load_delay_nop ();
6431 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6432 BFD_RELOC_LO16);
6433 relax_end ();
6434
6435 if (ex.X_add_number != 0)
6436 {
6437 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6438 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6439 ex.X_op = O_constant;
6440 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6441 BFD_RELOC_LO16);
6442 }
6443 }
6444 }
6445 else
6446 abort ();
6447
6448 if (!mips_opts.at && *used_at == 1)
6449 as_bad (_("Macro used $at after \".set noat\""));
6450 }
6451
6452 /* Move the contents of register SOURCE into register DEST. */
6453
6454 static void
6455 move_register (int dest, int source)
6456 {
6457 /* Prefer to use a 16-bit microMIPS instruction unless the previous
6458 instruction specifically requires a 32-bit one. */
6459 if (mips_opts.micromips
6460 && !mips_opts.insn32
6461 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6462 macro_build (NULL, "move", "mp,mj", dest, source);
6463 else
6464 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6465 dest, source, 0);
6466 }
6467
6468 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6469 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6470 The two alternatives are:
6471
6472 Global symbol Local sybmol
6473 ------------- ------------
6474 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
6475 ... ...
6476 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6477
6478 load_got_offset emits the first instruction and add_got_offset
6479 emits the second for a 16-bit offset or add_got_offset_hilo emits
6480 a sequence to add a 32-bit offset using a scratch register. */
6481
6482 static void
6483 load_got_offset (int dest, expressionS *local)
6484 {
6485 expressionS global;
6486
6487 global = *local;
6488 global.X_add_number = 0;
6489
6490 relax_start (local->X_add_symbol);
6491 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6492 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6493 relax_switch ();
6494 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6495 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6496 relax_end ();
6497 }
6498
6499 static void
6500 add_got_offset (int dest, expressionS *local)
6501 {
6502 expressionS global;
6503
6504 global.X_op = O_constant;
6505 global.X_op_symbol = NULL;
6506 global.X_add_symbol = NULL;
6507 global.X_add_number = local->X_add_number;
6508
6509 relax_start (local->X_add_symbol);
6510 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6511 dest, dest, BFD_RELOC_LO16);
6512 relax_switch ();
6513 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6514 relax_end ();
6515 }
6516
6517 static void
6518 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6519 {
6520 expressionS global;
6521 int hold_mips_optimize;
6522
6523 global.X_op = O_constant;
6524 global.X_op_symbol = NULL;
6525 global.X_add_symbol = NULL;
6526 global.X_add_number = local->X_add_number;
6527
6528 relax_start (local->X_add_symbol);
6529 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6530 relax_switch ();
6531 /* Set mips_optimize around the lui instruction to avoid
6532 inserting an unnecessary nop after the lw. */
6533 hold_mips_optimize = mips_optimize;
6534 mips_optimize = 2;
6535 macro_build_lui (&global, tmp);
6536 mips_optimize = hold_mips_optimize;
6537 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6538 relax_end ();
6539
6540 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6541 }
6542
6543 /* Emit a sequence of instructions to emulate a branch likely operation.
6544 BR is an ordinary branch corresponding to one to be emulated. BRNEG
6545 is its complementing branch with the original condition negated.
6546 CALL is set if the original branch specified the link operation.
6547 EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6548
6549 Code like this is produced in the noreorder mode:
6550
6551 BRNEG <args>, 1f
6552 nop
6553 b <sym>
6554 delay slot (executed only if branch taken)
6555 1:
6556
6557 or, if CALL is set:
6558
6559 BRNEG <args>, 1f
6560 nop
6561 bal <sym>
6562 delay slot (executed only if branch taken)
6563 1:
6564
6565 In the reorder mode the delay slot would be filled with a nop anyway,
6566 so code produced is simply:
6567
6568 BR <args>, <sym>
6569 nop
6570
6571 This function is used when producing code for the microMIPS ASE that
6572 does not implement branch likely instructions in hardware. */
6573
6574 static void
6575 macro_build_branch_likely (const char *br, const char *brneg,
6576 int call, expressionS *ep, const char *fmt,
6577 unsigned int sreg, unsigned int treg)
6578 {
6579 int noreorder = mips_opts.noreorder;
6580 expressionS expr1;
6581
6582 gas_assert (mips_opts.micromips);
6583 start_noreorder ();
6584 if (noreorder)
6585 {
6586 micromips_label_expr (&expr1);
6587 macro_build (&expr1, brneg, fmt, sreg, treg);
6588 macro_build (NULL, "nop", "");
6589 macro_build (ep, call ? "bal" : "b", "p");
6590
6591 /* Set to true so that append_insn adds a label. */
6592 emit_branch_likely_macro = TRUE;
6593 }
6594 else
6595 {
6596 macro_build (ep, br, fmt, sreg, treg);
6597 macro_build (NULL, "nop", "");
6598 }
6599 end_noreorder ();
6600 }
6601
6602 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6603 the condition code tested. EP specifies the branch target. */
6604
6605 static void
6606 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6607 {
6608 const int call = 0;
6609 const char *brneg;
6610 const char *br;
6611
6612 switch (type)
6613 {
6614 case M_BC1FL:
6615 br = "bc1f";
6616 brneg = "bc1t";
6617 break;
6618 case M_BC1TL:
6619 br = "bc1t";
6620 brneg = "bc1f";
6621 break;
6622 case M_BC2FL:
6623 br = "bc2f";
6624 brneg = "bc2t";
6625 break;
6626 case M_BC2TL:
6627 br = "bc2t";
6628 brneg = "bc2f";
6629 break;
6630 default:
6631 abort ();
6632 }
6633 macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6634 }
6635
6636 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6637 the register tested. EP specifies the branch target. */
6638
6639 static void
6640 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6641 {
6642 const char *brneg = NULL;
6643 const char *br;
6644 int call = 0;
6645
6646 switch (type)
6647 {
6648 case M_BGEZ:
6649 br = "bgez";
6650 break;
6651 case M_BGEZL:
6652 br = mips_opts.micromips ? "bgez" : "bgezl";
6653 brneg = "bltz";
6654 break;
6655 case M_BGEZALL:
6656 gas_assert (mips_opts.micromips);
6657 br = mips_opts.insn32 ? "bgezal" : "bgezals";
6658 brneg = "bltz";
6659 call = 1;
6660 break;
6661 case M_BGTZ:
6662 br = "bgtz";
6663 break;
6664 case M_BGTZL:
6665 br = mips_opts.micromips ? "bgtz" : "bgtzl";
6666 brneg = "blez";
6667 break;
6668 case M_BLEZ:
6669 br = "blez";
6670 break;
6671 case M_BLEZL:
6672 br = mips_opts.micromips ? "blez" : "blezl";
6673 brneg = "bgtz";
6674 break;
6675 case M_BLTZ:
6676 br = "bltz";
6677 break;
6678 case M_BLTZL:
6679 br = mips_opts.micromips ? "bltz" : "bltzl";
6680 brneg = "bgez";
6681 break;
6682 case M_BLTZALL:
6683 gas_assert (mips_opts.micromips);
6684 br = mips_opts.insn32 ? "bltzal" : "bltzals";
6685 brneg = "bgez";
6686 call = 1;
6687 break;
6688 default:
6689 abort ();
6690 }
6691 if (mips_opts.micromips && brneg)
6692 macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6693 else
6694 macro_build (ep, br, "s,p", sreg);
6695 }
6696
6697 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6698 TREG as the registers tested. EP specifies the branch target. */
6699
6700 static void
6701 macro_build_branch_rsrt (int type, expressionS *ep,
6702 unsigned int sreg, unsigned int treg)
6703 {
6704 const char *brneg = NULL;
6705 const int call = 0;
6706 const char *br;
6707
6708 switch (type)
6709 {
6710 case M_BEQ:
6711 case M_BEQ_I:
6712 br = "beq";
6713 break;
6714 case M_BEQL:
6715 case M_BEQL_I:
6716 br = mips_opts.micromips ? "beq" : "beql";
6717 brneg = "bne";
6718 break;
6719 case M_BNE:
6720 case M_BNE_I:
6721 br = "bne";
6722 break;
6723 case M_BNEL:
6724 case M_BNEL_I:
6725 br = mips_opts.micromips ? "bne" : "bnel";
6726 brneg = "beq";
6727 break;
6728 default:
6729 abort ();
6730 }
6731 if (mips_opts.micromips && brneg)
6732 macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6733 else
6734 macro_build (ep, br, "s,t,p", sreg, treg);
6735 }
6736
6737 /*
6738 * Build macros
6739 * This routine implements the seemingly endless macro or synthesized
6740 * instructions and addressing modes in the mips assembly language. Many
6741 * of these macros are simple and are similar to each other. These could
6742 * probably be handled by some kind of table or grammar approach instead of
6743 * this verbose method. Others are not simple macros but are more like
6744 * optimizing code generation.
6745 * One interesting optimization is when several store macros appear
6746 * consecutively that would load AT with the upper half of the same address.
6747 * The ensuing load upper instructions are ommited. This implies some kind
6748 * of global optimization. We currently only optimize within a single macro.
6749 * For many of the load and store macros if the address is specified as a
6750 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6751 * first load register 'at' with zero and use it as the base register. The
6752 * mips assembler simply uses register $zero. Just one tiny optimization
6753 * we're missing.
6754 */
6755 static void
6756 macro (struct mips_cl_insn *ip, char *str)
6757 {
6758 unsigned int treg, sreg, dreg, breg;
6759 unsigned int tempreg;
6760 int mask;
6761 int used_at = 0;
6762 expressionS label_expr;
6763 expressionS expr1;
6764 expressionS *ep;
6765 const char *s;
6766 const char *s2;
6767 const char *fmt;
6768 int likely = 0;
6769 int coproc = 0;
6770 int offbits = 16;
6771 int call = 0;
6772 int jals = 0;
6773 int dbl = 0;
6774 int imm = 0;
6775 int ust = 0;
6776 int lp = 0;
6777 int ab = 0;
6778 int off;
6779 bfd_reloc_code_real_type r;
6780 int hold_mips_optimize;
6781
6782 gas_assert (! mips_opts.mips16);
6783
6784 treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6785 dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6786 sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6787 mask = ip->insn_mo->mask;
6788
6789 label_expr.X_op = O_constant;
6790 label_expr.X_op_symbol = NULL;
6791 label_expr.X_add_symbol = NULL;
6792 label_expr.X_add_number = 0;
6793
6794 expr1.X_op = O_constant;
6795 expr1.X_op_symbol = NULL;
6796 expr1.X_add_symbol = NULL;
6797 expr1.X_add_number = 1;
6798
6799 switch (mask)
6800 {
6801 case M_DABS:
6802 dbl = 1;
6803 case M_ABS:
6804 /* bgez $a0,1f
6805 move v0,$a0
6806 sub v0,$zero,$a0
6807 1:
6808 */
6809
6810 start_noreorder ();
6811
6812 if (mips_opts.micromips)
6813 micromips_label_expr (&label_expr);
6814 else
6815 label_expr.X_add_number = 8;
6816 macro_build (&label_expr, "bgez", "s,p", sreg);
6817 if (dreg == sreg)
6818 macro_build (NULL, "nop", "");
6819 else
6820 move_register (dreg, sreg);
6821 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6822 if (mips_opts.micromips)
6823 micromips_add_label ();
6824
6825 end_noreorder ();
6826 break;
6827
6828 case M_ADD_I:
6829 s = "addi";
6830 s2 = "add";
6831 goto do_addi;
6832 case M_ADDU_I:
6833 s = "addiu";
6834 s2 = "addu";
6835 goto do_addi;
6836 case M_DADD_I:
6837 dbl = 1;
6838 s = "daddi";
6839 s2 = "dadd";
6840 if (!mips_opts.micromips)
6841 goto do_addi;
6842 if (imm_expr.X_op == O_constant
6843 && imm_expr.X_add_number >= -0x200
6844 && imm_expr.X_add_number < 0x200)
6845 {
6846 macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6847 break;
6848 }
6849 goto do_addi_i;
6850 case M_DADDU_I:
6851 dbl = 1;
6852 s = "daddiu";
6853 s2 = "daddu";
6854 do_addi:
6855 if (imm_expr.X_op == O_constant
6856 && imm_expr.X_add_number >= -0x8000
6857 && imm_expr.X_add_number < 0x8000)
6858 {
6859 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6860 break;
6861 }
6862 do_addi_i:
6863 used_at = 1;
6864 load_register (AT, &imm_expr, dbl);
6865 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6866 break;
6867
6868 case M_AND_I:
6869 s = "andi";
6870 s2 = "and";
6871 goto do_bit;
6872 case M_OR_I:
6873 s = "ori";
6874 s2 = "or";
6875 goto do_bit;
6876 case M_NOR_I:
6877 s = "";
6878 s2 = "nor";
6879 goto do_bit;
6880 case M_XOR_I:
6881 s = "xori";
6882 s2 = "xor";
6883 do_bit:
6884 if (imm_expr.X_op == O_constant
6885 && imm_expr.X_add_number >= 0
6886 && imm_expr.X_add_number < 0x10000)
6887 {
6888 if (mask != M_NOR_I)
6889 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6890 else
6891 {
6892 macro_build (&imm_expr, "ori", "t,r,i",
6893 treg, sreg, BFD_RELOC_LO16);
6894 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6895 }
6896 break;
6897 }
6898
6899 used_at = 1;
6900 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6901 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6902 break;
6903
6904 case M_BALIGN:
6905 switch (imm_expr.X_add_number)
6906 {
6907 case 0:
6908 macro_build (NULL, "nop", "");
6909 break;
6910 case 2:
6911 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6912 break;
6913 case 1:
6914 case 3:
6915 macro_build (NULL, "balign", "t,s,2", treg, sreg,
6916 (int) imm_expr.X_add_number);
6917 break;
6918 default:
6919 as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6920 (unsigned long) imm_expr.X_add_number);
6921 break;
6922 }
6923 break;
6924
6925 case M_BC1FL:
6926 case M_BC1TL:
6927 case M_BC2FL:
6928 case M_BC2TL:
6929 gas_assert (mips_opts.micromips);
6930 macro_build_branch_ccl (mask, &offset_expr,
6931 EXTRACT_OPERAND (1, BCC, *ip));
6932 break;
6933
6934 case M_BEQ_I:
6935 case M_BEQL_I:
6936 case M_BNE_I:
6937 case M_BNEL_I:
6938 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6939 treg = 0;
6940 else
6941 {
6942 treg = AT;
6943 used_at = 1;
6944 load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6945 }
6946 /* Fall through. */
6947 case M_BEQL:
6948 case M_BNEL:
6949 macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6950 break;
6951
6952 case M_BGEL:
6953 likely = 1;
6954 case M_BGE:
6955 if (treg == 0)
6956 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6957 else if (sreg == 0)
6958 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6959 else
6960 {
6961 used_at = 1;
6962 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6963 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6964 &offset_expr, AT, ZERO);
6965 }
6966 break;
6967
6968 case M_BGEZL:
6969 case M_BGEZALL:
6970 case M_BGTZL:
6971 case M_BLEZL:
6972 case M_BLTZL:
6973 case M_BLTZALL:
6974 macro_build_branch_rs (mask, &offset_expr, sreg);
6975 break;
6976
6977 case M_BGTL_I:
6978 likely = 1;
6979 case M_BGT_I:
6980 /* Check for > max integer. */
6981 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
6982 {
6983 do_false:
6984 /* Result is always false. */
6985 if (! likely)
6986 macro_build (NULL, "nop", "");
6987 else
6988 macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6989 break;
6990 }
6991 if (imm_expr.X_op != O_constant)
6992 as_bad (_("Unsupported large constant"));
6993 ++imm_expr.X_add_number;
6994 /* FALLTHROUGH */
6995 case M_BGE_I:
6996 case M_BGEL_I:
6997 if (mask == M_BGEL_I)
6998 likely = 1;
6999 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7000 {
7001 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
7002 &offset_expr, sreg);
7003 break;
7004 }
7005 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7006 {
7007 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
7008 &offset_expr, sreg);
7009 break;
7010 }
7011 if (imm_expr.X_op == O_constant && imm_expr.X_add_number <= GPR_SMIN)
7012 {
7013 do_true:
7014 /* result is always true */
7015 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
7016 macro_build (&offset_expr, "b", "p");
7017 break;
7018 }
7019 used_at = 1;
7020 set_at (sreg, 0);
7021 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7022 &offset_expr, AT, ZERO);
7023 break;
7024
7025 case M_BGEUL:
7026 likely = 1;
7027 case M_BGEU:
7028 if (treg == 0)
7029 goto do_true;
7030 else if (sreg == 0)
7031 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7032 &offset_expr, ZERO, treg);
7033 else
7034 {
7035 used_at = 1;
7036 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7037 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7038 &offset_expr, AT, ZERO);
7039 }
7040 break;
7041
7042 case M_BGTUL_I:
7043 likely = 1;
7044 case M_BGTU_I:
7045 if (sreg == 0
7046 || (HAVE_32BIT_GPRS
7047 && imm_expr.X_op == O_constant
7048 && imm_expr.X_add_number == -1))
7049 goto do_false;
7050 if (imm_expr.X_op != O_constant)
7051 as_bad (_("Unsupported large constant"));
7052 ++imm_expr.X_add_number;
7053 /* FALLTHROUGH */
7054 case M_BGEU_I:
7055 case M_BGEUL_I:
7056 if (mask == M_BGEUL_I)
7057 likely = 1;
7058 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7059 goto do_true;
7060 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7061 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7062 &offset_expr, sreg, ZERO);
7063 else
7064 {
7065 used_at = 1;
7066 set_at (sreg, 1);
7067 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7068 &offset_expr, AT, ZERO);
7069 }
7070 break;
7071
7072 case M_BGTL:
7073 likely = 1;
7074 case M_BGT:
7075 if (treg == 0)
7076 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
7077 else if (sreg == 0)
7078 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
7079 else
7080 {
7081 used_at = 1;
7082 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7083 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7084 &offset_expr, AT, ZERO);
7085 }
7086 break;
7087
7088 case M_BGTUL:
7089 likely = 1;
7090 case M_BGTU:
7091 if (treg == 0)
7092 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7093 &offset_expr, sreg, ZERO);
7094 else if (sreg == 0)
7095 goto do_false;
7096 else
7097 {
7098 used_at = 1;
7099 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7100 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7101 &offset_expr, AT, ZERO);
7102 }
7103 break;
7104
7105 case M_BLEL:
7106 likely = 1;
7107 case M_BLE:
7108 if (treg == 0)
7109 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7110 else if (sreg == 0)
7111 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
7112 else
7113 {
7114 used_at = 1;
7115 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7116 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7117 &offset_expr, AT, ZERO);
7118 }
7119 break;
7120
7121 case M_BLEL_I:
7122 likely = 1;
7123 case M_BLE_I:
7124 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
7125 goto do_true;
7126 if (imm_expr.X_op != O_constant)
7127 as_bad (_("Unsupported large constant"));
7128 ++imm_expr.X_add_number;
7129 /* FALLTHROUGH */
7130 case M_BLT_I:
7131 case M_BLTL_I:
7132 if (mask == M_BLTL_I)
7133 likely = 1;
7134 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7135 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7136 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7137 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7138 else
7139 {
7140 used_at = 1;
7141 set_at (sreg, 0);
7142 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7143 &offset_expr, AT, ZERO);
7144 }
7145 break;
7146
7147 case M_BLEUL:
7148 likely = 1;
7149 case M_BLEU:
7150 if (treg == 0)
7151 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7152 &offset_expr, sreg, ZERO);
7153 else if (sreg == 0)
7154 goto do_true;
7155 else
7156 {
7157 used_at = 1;
7158 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7159 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7160 &offset_expr, AT, ZERO);
7161 }
7162 break;
7163
7164 case M_BLEUL_I:
7165 likely = 1;
7166 case M_BLEU_I:
7167 if (sreg == 0
7168 || (HAVE_32BIT_GPRS
7169 && imm_expr.X_op == O_constant
7170 && imm_expr.X_add_number == -1))
7171 goto do_true;
7172 if (imm_expr.X_op != O_constant)
7173 as_bad (_("Unsupported large constant"));
7174 ++imm_expr.X_add_number;
7175 /* FALLTHROUGH */
7176 case M_BLTU_I:
7177 case M_BLTUL_I:
7178 if (mask == M_BLTUL_I)
7179 likely = 1;
7180 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7181 goto do_false;
7182 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7183 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7184 &offset_expr, sreg, ZERO);
7185 else
7186 {
7187 used_at = 1;
7188 set_at (sreg, 1);
7189 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7190 &offset_expr, AT, ZERO);
7191 }
7192 break;
7193
7194 case M_BLTL:
7195 likely = 1;
7196 case M_BLT:
7197 if (treg == 0)
7198 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7199 else if (sreg == 0)
7200 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
7201 else
7202 {
7203 used_at = 1;
7204 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
7205 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7206 &offset_expr, AT, ZERO);
7207 }
7208 break;
7209
7210 case M_BLTUL:
7211 likely = 1;
7212 case M_BLTU:
7213 if (treg == 0)
7214 goto do_false;
7215 else if (sreg == 0)
7216 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7217 &offset_expr, ZERO, treg);
7218 else
7219 {
7220 used_at = 1;
7221 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7222 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7223 &offset_expr, AT, ZERO);
7224 }
7225 break;
7226
7227 case M_DEXT:
7228 {
7229 /* Use unsigned arithmetic. */
7230 addressT pos;
7231 addressT size;
7232
7233 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7234 {
7235 as_bad (_("Unsupported large constant"));
7236 pos = size = 1;
7237 }
7238 else
7239 {
7240 pos = imm_expr.X_add_number;
7241 size = imm2_expr.X_add_number;
7242 }
7243
7244 if (pos > 63)
7245 {
7246 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7247 pos = 1;
7248 }
7249 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7250 {
7251 as_bad (_("Improper extract size (%lu, position %lu)"),
7252 (unsigned long) size, (unsigned long) pos);
7253 size = 1;
7254 }
7255
7256 if (size <= 32 && pos < 32)
7257 {
7258 s = "dext";
7259 fmt = "t,r,+A,+C";
7260 }
7261 else if (size <= 32)
7262 {
7263 s = "dextu";
7264 fmt = "t,r,+E,+H";
7265 }
7266 else
7267 {
7268 s = "dextm";
7269 fmt = "t,r,+A,+G";
7270 }
7271 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7272 (int) (size - 1));
7273 }
7274 break;
7275
7276 case M_DINS:
7277 {
7278 /* Use unsigned arithmetic. */
7279 addressT pos;
7280 addressT size;
7281
7282 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7283 {
7284 as_bad (_("Unsupported large constant"));
7285 pos = size = 1;
7286 }
7287 else
7288 {
7289 pos = imm_expr.X_add_number;
7290 size = imm2_expr.X_add_number;
7291 }
7292
7293 if (pos > 63)
7294 {
7295 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7296 pos = 1;
7297 }
7298 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7299 {
7300 as_bad (_("Improper insert size (%lu, position %lu)"),
7301 (unsigned long) size, (unsigned long) pos);
7302 size = 1;
7303 }
7304
7305 if (pos < 32 && (pos + size - 1) < 32)
7306 {
7307 s = "dins";
7308 fmt = "t,r,+A,+B";
7309 }
7310 else if (pos >= 32)
7311 {
7312 s = "dinsu";
7313 fmt = "t,r,+E,+F";
7314 }
7315 else
7316 {
7317 s = "dinsm";
7318 fmt = "t,r,+A,+F";
7319 }
7320 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7321 (int) (pos + size - 1));
7322 }
7323 break;
7324
7325 case M_DDIV_3:
7326 dbl = 1;
7327 case M_DIV_3:
7328 s = "mflo";
7329 goto do_div3;
7330 case M_DREM_3:
7331 dbl = 1;
7332 case M_REM_3:
7333 s = "mfhi";
7334 do_div3:
7335 if (treg == 0)
7336 {
7337 as_warn (_("Divide by zero."));
7338 if (mips_trap)
7339 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7340 else
7341 macro_build (NULL, "break", BRK_FMT, 7);
7342 break;
7343 }
7344
7345 start_noreorder ();
7346 if (mips_trap)
7347 {
7348 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7349 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7350 }
7351 else
7352 {
7353 if (mips_opts.micromips)
7354 micromips_label_expr (&label_expr);
7355 else
7356 label_expr.X_add_number = 8;
7357 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7358 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7359 macro_build (NULL, "break", BRK_FMT, 7);
7360 if (mips_opts.micromips)
7361 micromips_add_label ();
7362 }
7363 expr1.X_add_number = -1;
7364 used_at = 1;
7365 load_register (AT, &expr1, dbl);
7366 if (mips_opts.micromips)
7367 micromips_label_expr (&label_expr);
7368 else
7369 label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7370 macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7371 if (dbl)
7372 {
7373 expr1.X_add_number = 1;
7374 load_register (AT, &expr1, dbl);
7375 macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7376 }
7377 else
7378 {
7379 expr1.X_add_number = 0x80000000;
7380 macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7381 }
7382 if (mips_trap)
7383 {
7384 macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7385 /* We want to close the noreorder block as soon as possible, so
7386 that later insns are available for delay slot filling. */
7387 end_noreorder ();
7388 }
7389 else
7390 {
7391 if (mips_opts.micromips)
7392 micromips_label_expr (&label_expr);
7393 else
7394 label_expr.X_add_number = 8;
7395 macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7396 macro_build (NULL, "nop", "");
7397
7398 /* We want to close the noreorder block as soon as possible, so
7399 that later insns are available for delay slot filling. */
7400 end_noreorder ();
7401
7402 macro_build (NULL, "break", BRK_FMT, 6);
7403 }
7404 if (mips_opts.micromips)
7405 micromips_add_label ();
7406 macro_build (NULL, s, MFHL_FMT, dreg);
7407 break;
7408
7409 case M_DIV_3I:
7410 s = "div";
7411 s2 = "mflo";
7412 goto do_divi;
7413 case M_DIVU_3I:
7414 s = "divu";
7415 s2 = "mflo";
7416 goto do_divi;
7417 case M_REM_3I:
7418 s = "div";
7419 s2 = "mfhi";
7420 goto do_divi;
7421 case M_REMU_3I:
7422 s = "divu";
7423 s2 = "mfhi";
7424 goto do_divi;
7425 case M_DDIV_3I:
7426 dbl = 1;
7427 s = "ddiv";
7428 s2 = "mflo";
7429 goto do_divi;
7430 case M_DDIVU_3I:
7431 dbl = 1;
7432 s = "ddivu";
7433 s2 = "mflo";
7434 goto do_divi;
7435 case M_DREM_3I:
7436 dbl = 1;
7437 s = "ddiv";
7438 s2 = "mfhi";
7439 goto do_divi;
7440 case M_DREMU_3I:
7441 dbl = 1;
7442 s = "ddivu";
7443 s2 = "mfhi";
7444 do_divi:
7445 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7446 {
7447 as_warn (_("Divide by zero."));
7448 if (mips_trap)
7449 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7450 else
7451 macro_build (NULL, "break", BRK_FMT, 7);
7452 break;
7453 }
7454 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7455 {
7456 if (strcmp (s2, "mflo") == 0)
7457 move_register (dreg, sreg);
7458 else
7459 move_register (dreg, ZERO);
7460 break;
7461 }
7462 if (imm_expr.X_op == O_constant
7463 && imm_expr.X_add_number == -1
7464 && s[strlen (s) - 1] != 'u')
7465 {
7466 if (strcmp (s2, "mflo") == 0)
7467 {
7468 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7469 }
7470 else
7471 move_register (dreg, ZERO);
7472 break;
7473 }
7474
7475 used_at = 1;
7476 load_register (AT, &imm_expr, dbl);
7477 macro_build (NULL, s, "z,s,t", sreg, AT);
7478 macro_build (NULL, s2, MFHL_FMT, dreg);
7479 break;
7480
7481 case M_DIVU_3:
7482 s = "divu";
7483 s2 = "mflo";
7484 goto do_divu3;
7485 case M_REMU_3:
7486 s = "divu";
7487 s2 = "mfhi";
7488 goto do_divu3;
7489 case M_DDIVU_3:
7490 s = "ddivu";
7491 s2 = "mflo";
7492 goto do_divu3;
7493 case M_DREMU_3:
7494 s = "ddivu";
7495 s2 = "mfhi";
7496 do_divu3:
7497 start_noreorder ();
7498 if (mips_trap)
7499 {
7500 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7501 macro_build (NULL, s, "z,s,t", sreg, treg);
7502 /* We want to close the noreorder block as soon as possible, so
7503 that later insns are available for delay slot filling. */
7504 end_noreorder ();
7505 }
7506 else
7507 {
7508 if (mips_opts.micromips)
7509 micromips_label_expr (&label_expr);
7510 else
7511 label_expr.X_add_number = 8;
7512 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7513 macro_build (NULL, s, "z,s,t", sreg, treg);
7514
7515 /* We want to close the noreorder block as soon as possible, so
7516 that later insns are available for delay slot filling. */
7517 end_noreorder ();
7518 macro_build (NULL, "break", BRK_FMT, 7);
7519 if (mips_opts.micromips)
7520 micromips_add_label ();
7521 }
7522 macro_build (NULL, s2, MFHL_FMT, dreg);
7523 break;
7524
7525 case M_DLCA_AB:
7526 dbl = 1;
7527 case M_LCA_AB:
7528 call = 1;
7529 goto do_la;
7530 case M_DLA_AB:
7531 dbl = 1;
7532 case M_LA_AB:
7533 do_la:
7534 /* Load the address of a symbol into a register. If breg is not
7535 zero, we then add a base register to it. */
7536
7537 if (dbl && HAVE_32BIT_GPRS)
7538 as_warn (_("dla used to load 32-bit register"));
7539
7540 if (!dbl && HAVE_64BIT_OBJECTS)
7541 as_warn (_("la used to load 64-bit address"));
7542
7543 if (offset_expr.X_op == O_constant
7544 && offset_expr.X_add_number >= -0x8000
7545 && offset_expr.X_add_number < 0x8000)
7546 {
7547 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7548 "t,r,j", treg, sreg, BFD_RELOC_LO16);
7549 break;
7550 }
7551
7552 if (mips_opts.at && (treg == breg))
7553 {
7554 tempreg = AT;
7555 used_at = 1;
7556 }
7557 else
7558 {
7559 tempreg = treg;
7560 }
7561
7562 if (offset_expr.X_op != O_symbol
7563 && offset_expr.X_op != O_constant)
7564 {
7565 as_bad (_("Expression too complex"));
7566 offset_expr.X_op = O_constant;
7567 }
7568
7569 if (offset_expr.X_op == O_constant)
7570 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7571 else if (mips_pic == NO_PIC)
7572 {
7573 /* If this is a reference to a GP relative symbol, we want
7574 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
7575 Otherwise we want
7576 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
7577 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7578 If we have a constant, we need two instructions anyhow,
7579 so we may as well always use the latter form.
7580
7581 With 64bit address space and a usable $at we want
7582 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7583 lui $at,<sym> (BFD_RELOC_HI16_S)
7584 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7585 daddiu $at,<sym> (BFD_RELOC_LO16)
7586 dsll32 $tempreg,0
7587 daddu $tempreg,$tempreg,$at
7588
7589 If $at is already in use, we use a path which is suboptimal
7590 on superscalar processors.
7591 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7592 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7593 dsll $tempreg,16
7594 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
7595 dsll $tempreg,16
7596 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
7597
7598 For GP relative symbols in 64bit address space we can use
7599 the same sequence as in 32bit address space. */
7600 if (HAVE_64BIT_SYMBOLS)
7601 {
7602 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7603 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7604 {
7605 relax_start (offset_expr.X_add_symbol);
7606 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7607 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7608 relax_switch ();
7609 }
7610
7611 if (used_at == 0 && mips_opts.at)
7612 {
7613 macro_build (&offset_expr, "lui", LUI_FMT,
7614 tempreg, BFD_RELOC_MIPS_HIGHEST);
7615 macro_build (&offset_expr, "lui", LUI_FMT,
7616 AT, BFD_RELOC_HI16_S);
7617 macro_build (&offset_expr, "daddiu", "t,r,j",
7618 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7619 macro_build (&offset_expr, "daddiu", "t,r,j",
7620 AT, AT, BFD_RELOC_LO16);
7621 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7622 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7623 used_at = 1;
7624 }
7625 else
7626 {
7627 macro_build (&offset_expr, "lui", LUI_FMT,
7628 tempreg, BFD_RELOC_MIPS_HIGHEST);
7629 macro_build (&offset_expr, "daddiu", "t,r,j",
7630 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7631 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7632 macro_build (&offset_expr, "daddiu", "t,r,j",
7633 tempreg, tempreg, BFD_RELOC_HI16_S);
7634 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7635 macro_build (&offset_expr, "daddiu", "t,r,j",
7636 tempreg, tempreg, BFD_RELOC_LO16);
7637 }
7638
7639 if (mips_relax.sequence)
7640 relax_end ();
7641 }
7642 else
7643 {
7644 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7645 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7646 {
7647 relax_start (offset_expr.X_add_symbol);
7648 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7649 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7650 relax_switch ();
7651 }
7652 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7653 as_bad (_("Offset too large"));
7654 macro_build_lui (&offset_expr, tempreg);
7655 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7656 tempreg, tempreg, BFD_RELOC_LO16);
7657 if (mips_relax.sequence)
7658 relax_end ();
7659 }
7660 }
7661 else if (!mips_big_got && !HAVE_NEWABI)
7662 {
7663 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7664
7665 /* If this is a reference to an external symbol, and there
7666 is no constant, we want
7667 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7668 or for lca or if tempreg is PIC_CALL_REG
7669 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7670 For a local symbol, we want
7671 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7672 nop
7673 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7674
7675 If we have a small constant, and this is a reference to
7676 an external symbol, we want
7677 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7678 nop
7679 addiu $tempreg,$tempreg,<constant>
7680 For a local symbol, we want the same instruction
7681 sequence, but we output a BFD_RELOC_LO16 reloc on the
7682 addiu instruction.
7683
7684 If we have a large constant, and this is a reference to
7685 an external symbol, we want
7686 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7687 lui $at,<hiconstant>
7688 addiu $at,$at,<loconstant>
7689 addu $tempreg,$tempreg,$at
7690 For a local symbol, we want the same instruction
7691 sequence, but we output a BFD_RELOC_LO16 reloc on the
7692 addiu instruction.
7693 */
7694
7695 if (offset_expr.X_add_number == 0)
7696 {
7697 if (mips_pic == SVR4_PIC
7698 && breg == 0
7699 && (call || tempreg == PIC_CALL_REG))
7700 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7701
7702 relax_start (offset_expr.X_add_symbol);
7703 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7704 lw_reloc_type, mips_gp_register);
7705 if (breg != 0)
7706 {
7707 /* We're going to put in an addu instruction using
7708 tempreg, so we may as well insert the nop right
7709 now. */
7710 load_delay_nop ();
7711 }
7712 relax_switch ();
7713 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7714 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7715 load_delay_nop ();
7716 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7717 tempreg, tempreg, BFD_RELOC_LO16);
7718 relax_end ();
7719 /* FIXME: If breg == 0, and the next instruction uses
7720 $tempreg, then if this variant case is used an extra
7721 nop will be generated. */
7722 }
7723 else if (offset_expr.X_add_number >= -0x8000
7724 && offset_expr.X_add_number < 0x8000)
7725 {
7726 load_got_offset (tempreg, &offset_expr);
7727 load_delay_nop ();
7728 add_got_offset (tempreg, &offset_expr);
7729 }
7730 else
7731 {
7732 expr1.X_add_number = offset_expr.X_add_number;
7733 offset_expr.X_add_number =
7734 SEXT_16BIT (offset_expr.X_add_number);
7735 load_got_offset (tempreg, &offset_expr);
7736 offset_expr.X_add_number = expr1.X_add_number;
7737 /* If we are going to add in a base register, and the
7738 target register and the base register are the same,
7739 then we are using AT as a temporary register. Since
7740 we want to load the constant into AT, we add our
7741 current AT (from the global offset table) and the
7742 register into the register now, and pretend we were
7743 not using a base register. */
7744 if (breg == treg)
7745 {
7746 load_delay_nop ();
7747 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7748 treg, AT, breg);
7749 breg = 0;
7750 tempreg = treg;
7751 }
7752 add_got_offset_hilo (tempreg, &offset_expr, AT);
7753 used_at = 1;
7754 }
7755 }
7756 else if (!mips_big_got && HAVE_NEWABI)
7757 {
7758 int add_breg_early = 0;
7759
7760 /* If this is a reference to an external, and there is no
7761 constant, or local symbol (*), with or without a
7762 constant, we want
7763 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7764 or for lca or if tempreg is PIC_CALL_REG
7765 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7766
7767 If we have a small constant, and this is a reference to
7768 an external symbol, we want
7769 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7770 addiu $tempreg,$tempreg,<constant>
7771
7772 If we have a large constant, and this is a reference to
7773 an external symbol, we want
7774 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7775 lui $at,<hiconstant>
7776 addiu $at,$at,<loconstant>
7777 addu $tempreg,$tempreg,$at
7778
7779 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7780 local symbols, even though it introduces an additional
7781 instruction. */
7782
7783 if (offset_expr.X_add_number)
7784 {
7785 expr1.X_add_number = offset_expr.X_add_number;
7786 offset_expr.X_add_number = 0;
7787
7788 relax_start (offset_expr.X_add_symbol);
7789 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7790 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7791
7792 if (expr1.X_add_number >= -0x8000
7793 && expr1.X_add_number < 0x8000)
7794 {
7795 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7796 tempreg, tempreg, BFD_RELOC_LO16);
7797 }
7798 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7799 {
7800 /* If we are going to add in a base register, and the
7801 target register and the base register are the same,
7802 then we are using AT as a temporary register. Since
7803 we want to load the constant into AT, we add our
7804 current AT (from the global offset table) and the
7805 register into the register now, and pretend we were
7806 not using a base register. */
7807 if (breg != treg)
7808 dreg = tempreg;
7809 else
7810 {
7811 gas_assert (tempreg == AT);
7812 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7813 treg, AT, breg);
7814 dreg = treg;
7815 add_breg_early = 1;
7816 }
7817
7818 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7819 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7820 dreg, dreg, AT);
7821
7822 used_at = 1;
7823 }
7824 else
7825 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7826
7827 relax_switch ();
7828 offset_expr.X_add_number = expr1.X_add_number;
7829
7830 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7831 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7832 if (add_breg_early)
7833 {
7834 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7835 treg, tempreg, breg);
7836 breg = 0;
7837 tempreg = treg;
7838 }
7839 relax_end ();
7840 }
7841 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7842 {
7843 relax_start (offset_expr.X_add_symbol);
7844 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7845 BFD_RELOC_MIPS_CALL16, mips_gp_register);
7846 relax_switch ();
7847 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7848 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7849 relax_end ();
7850 }
7851 else
7852 {
7853 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7854 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7855 }
7856 }
7857 else if (mips_big_got && !HAVE_NEWABI)
7858 {
7859 int gpdelay;
7860 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7861 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7862 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7863
7864 /* This is the large GOT case. If this is a reference to an
7865 external symbol, and there is no constant, we want
7866 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7867 addu $tempreg,$tempreg,$gp
7868 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7869 or for lca or if tempreg is PIC_CALL_REG
7870 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
7871 addu $tempreg,$tempreg,$gp
7872 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7873 For a local symbol, we want
7874 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7875 nop
7876 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7877
7878 If we have a small constant, and this is a reference to
7879 an external symbol, we want
7880 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7881 addu $tempreg,$tempreg,$gp
7882 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7883 nop
7884 addiu $tempreg,$tempreg,<constant>
7885 For a local symbol, we want
7886 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7887 nop
7888 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7889
7890 If we have a large constant, and this is a reference to
7891 an external symbol, we want
7892 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7893 addu $tempreg,$tempreg,$gp
7894 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7895 lui $at,<hiconstant>
7896 addiu $at,$at,<loconstant>
7897 addu $tempreg,$tempreg,$at
7898 For a local symbol, we want
7899 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7900 lui $at,<hiconstant>
7901 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
7902 addu $tempreg,$tempreg,$at
7903 */
7904
7905 expr1.X_add_number = offset_expr.X_add_number;
7906 offset_expr.X_add_number = 0;
7907 relax_start (offset_expr.X_add_symbol);
7908 gpdelay = reg_needs_delay (mips_gp_register);
7909 if (expr1.X_add_number == 0 && breg == 0
7910 && (call || tempreg == PIC_CALL_REG))
7911 {
7912 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7913 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7914 }
7915 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7916 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7917 tempreg, tempreg, mips_gp_register);
7918 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7919 tempreg, lw_reloc_type, tempreg);
7920 if (expr1.X_add_number == 0)
7921 {
7922 if (breg != 0)
7923 {
7924 /* We're going to put in an addu instruction using
7925 tempreg, so we may as well insert the nop right
7926 now. */
7927 load_delay_nop ();
7928 }
7929 }
7930 else if (expr1.X_add_number >= -0x8000
7931 && expr1.X_add_number < 0x8000)
7932 {
7933 load_delay_nop ();
7934 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7935 tempreg, tempreg, BFD_RELOC_LO16);
7936 }
7937 else
7938 {
7939 /* If we are going to add in a base register, and the
7940 target register and the base register are the same,
7941 then we are using AT as a temporary register. Since
7942 we want to load the constant into AT, we add our
7943 current AT (from the global offset table) and the
7944 register into the register now, and pretend we were
7945 not using a base register. */
7946 if (breg != treg)
7947 dreg = tempreg;
7948 else
7949 {
7950 gas_assert (tempreg == AT);
7951 load_delay_nop ();
7952 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7953 treg, AT, breg);
7954 dreg = treg;
7955 }
7956
7957 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7958 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7959
7960 used_at = 1;
7961 }
7962 offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7963 relax_switch ();
7964
7965 if (gpdelay)
7966 {
7967 /* This is needed because this instruction uses $gp, but
7968 the first instruction on the main stream does not. */
7969 macro_build (NULL, "nop", "");
7970 }
7971
7972 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7973 local_reloc_type, mips_gp_register);
7974 if (expr1.X_add_number >= -0x8000
7975 && expr1.X_add_number < 0x8000)
7976 {
7977 load_delay_nop ();
7978 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7979 tempreg, tempreg, BFD_RELOC_LO16);
7980 /* FIXME: If add_number is 0, and there was no base
7981 register, the external symbol case ended with a load,
7982 so if the symbol turns out to not be external, and
7983 the next instruction uses tempreg, an unnecessary nop
7984 will be inserted. */
7985 }
7986 else
7987 {
7988 if (breg == treg)
7989 {
7990 /* We must add in the base register now, as in the
7991 external symbol case. */
7992 gas_assert (tempreg == AT);
7993 load_delay_nop ();
7994 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7995 treg, AT, breg);
7996 tempreg = treg;
7997 /* We set breg to 0 because we have arranged to add
7998 it in in both cases. */
7999 breg = 0;
8000 }
8001
8002 macro_build_lui (&expr1, AT);
8003 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8004 AT, AT, BFD_RELOC_LO16);
8005 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8006 tempreg, tempreg, AT);
8007 used_at = 1;
8008 }
8009 relax_end ();
8010 }
8011 else if (mips_big_got && HAVE_NEWABI)
8012 {
8013 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
8014 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
8015 int add_breg_early = 0;
8016
8017 /* This is the large GOT case. If this is a reference to an
8018 external symbol, and there is no constant, we want
8019 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8020 add $tempreg,$tempreg,$gp
8021 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8022 or for lca or if tempreg is PIC_CALL_REG
8023 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
8024 add $tempreg,$tempreg,$gp
8025 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
8026
8027 If we have a small constant, and this is a reference to
8028 an external symbol, we want
8029 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8030 add $tempreg,$tempreg,$gp
8031 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8032 addi $tempreg,$tempreg,<constant>
8033
8034 If we have a large constant, and this is a reference to
8035 an external symbol, we want
8036 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8037 addu $tempreg,$tempreg,$gp
8038 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8039 lui $at,<hiconstant>
8040 addi $at,$at,<loconstant>
8041 add $tempreg,$tempreg,$at
8042
8043 If we have NewABI, and we know it's a local symbol, we want
8044 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
8045 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
8046 otherwise we have to resort to GOT_HI16/GOT_LO16. */
8047
8048 relax_start (offset_expr.X_add_symbol);
8049
8050 expr1.X_add_number = offset_expr.X_add_number;
8051 offset_expr.X_add_number = 0;
8052
8053 if (expr1.X_add_number == 0 && breg == 0
8054 && (call || tempreg == PIC_CALL_REG))
8055 {
8056 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
8057 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
8058 }
8059 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
8060 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8061 tempreg, tempreg, mips_gp_register);
8062 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8063 tempreg, lw_reloc_type, tempreg);
8064
8065 if (expr1.X_add_number == 0)
8066 ;
8067 else if (expr1.X_add_number >= -0x8000
8068 && expr1.X_add_number < 0x8000)
8069 {
8070 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
8071 tempreg, tempreg, BFD_RELOC_LO16);
8072 }
8073 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
8074 {
8075 /* If we are going to add in a base register, and the
8076 target register and the base register are the same,
8077 then we are using AT as a temporary register. Since
8078 we want to load the constant into AT, we add our
8079 current AT (from the global offset table) and the
8080 register into the register now, and pretend we were
8081 not using a base register. */
8082 if (breg != treg)
8083 dreg = tempreg;
8084 else
8085 {
8086 gas_assert (tempreg == AT);
8087 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8088 treg, AT, breg);
8089 dreg = treg;
8090 add_breg_early = 1;
8091 }
8092
8093 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
8094 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
8095
8096 used_at = 1;
8097 }
8098 else
8099 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
8100
8101 relax_switch ();
8102 offset_expr.X_add_number = expr1.X_add_number;
8103 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8104 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8105 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8106 tempreg, BFD_RELOC_MIPS_GOT_OFST);
8107 if (add_breg_early)
8108 {
8109 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8110 treg, tempreg, breg);
8111 breg = 0;
8112 tempreg = treg;
8113 }
8114 relax_end ();
8115 }
8116 else
8117 abort ();
8118
8119 if (breg != 0)
8120 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
8121 break;
8122
8123 case M_MSGSND:
8124 gas_assert (!mips_opts.micromips);
8125 {
8126 unsigned long temp = (treg << 16) | (0x01);
8127 macro_build (NULL, "c2", "C", temp);
8128 }
8129 break;
8130
8131 case M_MSGLD:
8132 gas_assert (!mips_opts.micromips);
8133 {
8134 unsigned long temp = (0x02);
8135 macro_build (NULL, "c2", "C", temp);
8136 }
8137 break;
8138
8139 case M_MSGLD_T:
8140 gas_assert (!mips_opts.micromips);
8141 {
8142 unsigned long temp = (treg << 16) | (0x02);
8143 macro_build (NULL, "c2", "C", temp);
8144 }
8145 break;
8146
8147 case M_MSGWAIT:
8148 gas_assert (!mips_opts.micromips);
8149 macro_build (NULL, "c2", "C", 3);
8150 break;
8151
8152 case M_MSGWAIT_T:
8153 gas_assert (!mips_opts.micromips);
8154 {
8155 unsigned long temp = (treg << 16) | 0x03;
8156 macro_build (NULL, "c2", "C", temp);
8157 }
8158 break;
8159
8160 case M_J_A:
8161 /* The j instruction may not be used in PIC code, since it
8162 requires an absolute address. We convert it to a b
8163 instruction. */
8164 if (mips_pic == NO_PIC)
8165 macro_build (&offset_expr, "j", "a");
8166 else
8167 macro_build (&offset_expr, "b", "p");
8168 break;
8169
8170 /* The jal instructions must be handled as macros because when
8171 generating PIC code they expand to multi-instruction
8172 sequences. Normally they are simple instructions. */
8173 case M_JALS_1:
8174 dreg = RA;
8175 /* Fall through. */
8176 case M_JALS_2:
8177 gas_assert (mips_opts.micromips);
8178 if (mips_opts.insn32)
8179 {
8180 as_bad (_("Opcode not supported in the `insn32' mode `%s'"), str);
8181 break;
8182 }
8183 jals = 1;
8184 goto jal;
8185 case M_JAL_1:
8186 dreg = RA;
8187 /* Fall through. */
8188 case M_JAL_2:
8189 jal:
8190 if (mips_pic == NO_PIC)
8191 {
8192 s = jals ? "jalrs" : "jalr";
8193 if (mips_opts.micromips
8194 && !mips_opts.insn32
8195 && dreg == RA
8196 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8197 macro_build (NULL, s, "mj", sreg);
8198 else
8199 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8200 }
8201 else
8202 {
8203 int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
8204 && mips_cprestore_offset >= 0);
8205
8206 if (sreg != PIC_CALL_REG)
8207 as_warn (_("MIPS PIC call to register other than $25"));
8208
8209 s = ((mips_opts.micromips
8210 && !mips_opts.insn32
8211 && (!mips_opts.noreorder || cprestore))
8212 ? "jalrs" : "jalr");
8213 if (mips_opts.micromips
8214 && !mips_opts.insn32
8215 && dreg == RA
8216 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8217 macro_build (NULL, s, "mj", sreg);
8218 else
8219 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8220 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
8221 {
8222 if (mips_cprestore_offset < 0)
8223 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8224 else
8225 {
8226 if (!mips_frame_reg_valid)
8227 {
8228 as_warn (_("No .frame pseudo-op used in PIC code"));
8229 /* Quiet this warning. */
8230 mips_frame_reg_valid = 1;
8231 }
8232 if (!mips_cprestore_valid)
8233 {
8234 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8235 /* Quiet this warning. */
8236 mips_cprestore_valid = 1;
8237 }
8238 if (mips_opts.noreorder)
8239 macro_build (NULL, "nop", "");
8240 expr1.X_add_number = mips_cprestore_offset;
8241 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8242 mips_gp_register,
8243 mips_frame_reg,
8244 HAVE_64BIT_ADDRESSES);
8245 }
8246 }
8247 }
8248
8249 break;
8250
8251 case M_JALS_A:
8252 gas_assert (mips_opts.micromips);
8253 if (mips_opts.insn32)
8254 {
8255 as_bad (_("Opcode not supported in the `insn32' mode `%s'"), str);
8256 break;
8257 }
8258 jals = 1;
8259 /* Fall through. */
8260 case M_JAL_A:
8261 if (mips_pic == NO_PIC)
8262 macro_build (&offset_expr, jals ? "jals" : "jal", "a");
8263 else if (mips_pic == SVR4_PIC)
8264 {
8265 /* If this is a reference to an external symbol, and we are
8266 using a small GOT, we want
8267 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
8268 nop
8269 jalr $ra,$25
8270 nop
8271 lw $gp,cprestore($sp)
8272 The cprestore value is set using the .cprestore
8273 pseudo-op. If we are using a big GOT, we want
8274 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
8275 addu $25,$25,$gp
8276 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
8277 nop
8278 jalr $ra,$25
8279 nop
8280 lw $gp,cprestore($sp)
8281 If the symbol is not external, we want
8282 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
8283 nop
8284 addiu $25,$25,<sym> (BFD_RELOC_LO16)
8285 jalr $ra,$25
8286 nop
8287 lw $gp,cprestore($sp)
8288
8289 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
8290 sequences above, minus nops, unless the symbol is local,
8291 which enables us to use GOT_PAGE/GOT_OFST (big got) or
8292 GOT_DISP. */
8293 if (HAVE_NEWABI)
8294 {
8295 if (!mips_big_got)
8296 {
8297 relax_start (offset_expr.X_add_symbol);
8298 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8299 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8300 mips_gp_register);
8301 relax_switch ();
8302 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8303 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
8304 mips_gp_register);
8305 relax_end ();
8306 }
8307 else
8308 {
8309 relax_start (offset_expr.X_add_symbol);
8310 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8311 BFD_RELOC_MIPS_CALL_HI16);
8312 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8313 PIC_CALL_REG, mips_gp_register);
8314 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8315 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8316 PIC_CALL_REG);
8317 relax_switch ();
8318 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8319 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8320 mips_gp_register);
8321 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8322 PIC_CALL_REG, PIC_CALL_REG,
8323 BFD_RELOC_MIPS_GOT_OFST);
8324 relax_end ();
8325 }
8326
8327 macro_build_jalr (&offset_expr, 0);
8328 }
8329 else
8330 {
8331 relax_start (offset_expr.X_add_symbol);
8332 if (!mips_big_got)
8333 {
8334 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8335 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8336 mips_gp_register);
8337 load_delay_nop ();
8338 relax_switch ();
8339 }
8340 else
8341 {
8342 int gpdelay;
8343
8344 gpdelay = reg_needs_delay (mips_gp_register);
8345 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8346 BFD_RELOC_MIPS_CALL_HI16);
8347 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8348 PIC_CALL_REG, mips_gp_register);
8349 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8350 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8351 PIC_CALL_REG);
8352 load_delay_nop ();
8353 relax_switch ();
8354 if (gpdelay)
8355 macro_build (NULL, "nop", "");
8356 }
8357 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8358 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8359 mips_gp_register);
8360 load_delay_nop ();
8361 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8362 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8363 relax_end ();
8364 macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8365
8366 if (mips_cprestore_offset < 0)
8367 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8368 else
8369 {
8370 if (!mips_frame_reg_valid)
8371 {
8372 as_warn (_("No .frame pseudo-op used in PIC code"));
8373 /* Quiet this warning. */
8374 mips_frame_reg_valid = 1;
8375 }
8376 if (!mips_cprestore_valid)
8377 {
8378 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8379 /* Quiet this warning. */
8380 mips_cprestore_valid = 1;
8381 }
8382 if (mips_opts.noreorder)
8383 macro_build (NULL, "nop", "");
8384 expr1.X_add_number = mips_cprestore_offset;
8385 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8386 mips_gp_register,
8387 mips_frame_reg,
8388 HAVE_64BIT_ADDRESSES);
8389 }
8390 }
8391 }
8392 else if (mips_pic == VXWORKS_PIC)
8393 as_bad (_("Non-PIC jump used in PIC library"));
8394 else
8395 abort ();
8396
8397 break;
8398
8399 case M_LBUE_AB:
8400 ab = 1;
8401 case M_LBUE_OB:
8402 s = "lbue";
8403 fmt = "t,+j(b)";
8404 offbits = 9;
8405 goto ld_st;
8406 case M_LHUE_AB:
8407 ab = 1;
8408 case M_LHUE_OB:
8409 s = "lhue";
8410 fmt = "t,+j(b)";
8411 offbits = 9;
8412 goto ld_st;
8413 case M_LBE_AB:
8414 ab = 1;
8415 case M_LBE_OB:
8416 s = "lbe";
8417 fmt = "t,+j(b)";
8418 offbits = 9;
8419 goto ld_st;
8420 case M_LHE_AB:
8421 ab = 1;
8422 case M_LHE_OB:
8423 s = "lhe";
8424 fmt = "t,+j(b)";
8425 offbits = 9;
8426 goto ld_st;
8427 case M_LLE_AB:
8428 ab = 1;
8429 case M_LLE_OB:
8430 s = "lle";
8431 fmt = "t,+j(b)";
8432 offbits = 9;
8433 goto ld_st;
8434 case M_LWE_AB:
8435 ab = 1;
8436 case M_LWE_OB:
8437 s = "lwe";
8438 fmt = "t,+j(b)";
8439 offbits = 9;
8440 goto ld_st;
8441 case M_LWLE_AB:
8442 ab = 1;
8443 case M_LWLE_OB:
8444 s = "lwle";
8445 fmt = "t,+j(b)";
8446 offbits = 9;
8447 goto ld_st;
8448 case M_LWRE_AB:
8449 ab = 1;
8450 case M_LWRE_OB:
8451 s = "lwre";
8452 fmt = "t,+j(b)";
8453 offbits = 9;
8454 goto ld_st;
8455 case M_SBE_AB:
8456 ab = 1;
8457 case M_SBE_OB:
8458 s = "sbe";
8459 fmt = "t,+j(b)";
8460 offbits = 9;
8461 goto ld_st;
8462 case M_SCE_AB:
8463 ab = 1;
8464 case M_SCE_OB:
8465 s = "sce";
8466 fmt = "t,+j(b)";
8467 offbits = 9;
8468 goto ld_st;
8469 case M_SHE_AB:
8470 ab = 1;
8471 case M_SHE_OB:
8472 s = "she";
8473 fmt = "t,+j(b)";
8474 offbits = 9;
8475 goto ld_st;
8476 case M_SWE_AB:
8477 ab = 1;
8478 case M_SWE_OB:
8479 s = "swe";
8480 fmt = "t,+j(b)";
8481 offbits = 9;
8482 goto ld_st;
8483 case M_SWLE_AB:
8484 ab = 1;
8485 case M_SWLE_OB:
8486 s = "swle";
8487 fmt = "t,+j(b)";
8488 offbits = 9;
8489 goto ld_st;
8490 case M_SWRE_AB:
8491 ab = 1;
8492 case M_SWRE_OB:
8493 s = "swre";
8494 fmt = "t,+j(b)";
8495 offbits = 9;
8496 goto ld_st;
8497 case M_ACLR_AB:
8498 ab = 1;
8499 case M_ACLR_OB:
8500 s = "aclr";
8501 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8502 fmt = "\\,~(b)";
8503 offbits = 12;
8504 goto ld_st;
8505 case M_ASET_AB:
8506 ab = 1;
8507 case M_ASET_OB:
8508 s = "aset";
8509 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8510 fmt = "\\,~(b)";
8511 offbits = 12;
8512 goto ld_st;
8513 case M_LB_AB:
8514 ab = 1;
8515 s = "lb";
8516 fmt = "t,o(b)";
8517 goto ld;
8518 case M_LBU_AB:
8519 ab = 1;
8520 s = "lbu";
8521 fmt = "t,o(b)";
8522 goto ld;
8523 case M_LH_AB:
8524 ab = 1;
8525 s = "lh";
8526 fmt = "t,o(b)";
8527 goto ld;
8528 case M_LHU_AB:
8529 ab = 1;
8530 s = "lhu";
8531 fmt = "t,o(b)";
8532 goto ld;
8533 case M_LW_AB:
8534 ab = 1;
8535 s = "lw";
8536 fmt = "t,o(b)";
8537 goto ld;
8538 case M_LWC0_AB:
8539 ab = 1;
8540 gas_assert (!mips_opts.micromips);
8541 s = "lwc0";
8542 fmt = "E,o(b)";
8543 /* Itbl support may require additional care here. */
8544 coproc = 1;
8545 goto ld_st;
8546 case M_LWC1_AB:
8547 ab = 1;
8548 s = "lwc1";
8549 fmt = "T,o(b)";
8550 /* Itbl support may require additional care here. */
8551 coproc = 1;
8552 goto ld_st;
8553 case M_LWC2_AB:
8554 ab = 1;
8555 case M_LWC2_OB:
8556 s = "lwc2";
8557 fmt = COP12_FMT;
8558 offbits = (mips_opts.micromips ? 12 : 16);
8559 /* Itbl support may require additional care here. */
8560 coproc = 1;
8561 goto ld_st;
8562 case M_LWC3_AB:
8563 ab = 1;
8564 gas_assert (!mips_opts.micromips);
8565 s = "lwc3";
8566 fmt = "E,o(b)";
8567 /* Itbl support may require additional care here. */
8568 coproc = 1;
8569 goto ld_st;
8570 case M_LWL_AB:
8571 ab = 1;
8572 case M_LWL_OB:
8573 s = "lwl";
8574 fmt = MEM12_FMT;
8575 offbits = (mips_opts.micromips ? 12 : 16);
8576 goto ld_st;
8577 case M_LWR_AB:
8578 ab = 1;
8579 case M_LWR_OB:
8580 s = "lwr";
8581 fmt = MEM12_FMT;
8582 offbits = (mips_opts.micromips ? 12 : 16);
8583 goto ld_st;
8584 case M_LDC1_AB:
8585 ab = 1;
8586 s = "ldc1";
8587 fmt = "T,o(b)";
8588 /* Itbl support may require additional care here. */
8589 coproc = 1;
8590 goto ld_st;
8591 case M_LDC2_AB:
8592 ab = 1;
8593 case M_LDC2_OB:
8594 s = "ldc2";
8595 fmt = COP12_FMT;
8596 offbits = (mips_opts.micromips ? 12 : 16);
8597 /* Itbl support may require additional care here. */
8598 coproc = 1;
8599 goto ld_st;
8600 case M_LQC2_AB:
8601 ab = 1;
8602 s = "lqc2";
8603 fmt = "E,o(b)";
8604 /* Itbl support may require additional care here. */
8605 coproc = 1;
8606 goto ld_st;
8607 case M_LDC3_AB:
8608 ab = 1;
8609 s = "ldc3";
8610 fmt = "E,o(b)";
8611 /* Itbl support may require additional care here. */
8612 coproc = 1;
8613 goto ld_st;
8614 case M_LDL_AB:
8615 ab = 1;
8616 case M_LDL_OB:
8617 s = "ldl";
8618 fmt = MEM12_FMT;
8619 offbits = (mips_opts.micromips ? 12 : 16);
8620 goto ld_st;
8621 case M_LDR_AB:
8622 ab = 1;
8623 case M_LDR_OB:
8624 s = "ldr";
8625 fmt = MEM12_FMT;
8626 offbits = (mips_opts.micromips ? 12 : 16);
8627 goto ld_st;
8628 case M_LL_AB:
8629 ab = 1;
8630 case M_LL_OB:
8631 s = "ll";
8632 fmt = MEM12_FMT;
8633 offbits = (mips_opts.micromips ? 12 : 16);
8634 goto ld;
8635 case M_LLD_AB:
8636 ab = 1;
8637 case M_LLD_OB:
8638 s = "lld";
8639 fmt = MEM12_FMT;
8640 offbits = (mips_opts.micromips ? 12 : 16);
8641 goto ld;
8642 case M_LWU_AB:
8643 ab = 1;
8644 case M_LWU_OB:
8645 s = "lwu";
8646 fmt = MEM12_FMT;
8647 offbits = (mips_opts.micromips ? 12 : 16);
8648 goto ld;
8649 case M_LWP_AB:
8650 ab = 1;
8651 case M_LWP_OB:
8652 gas_assert (mips_opts.micromips);
8653 s = "lwp";
8654 fmt = "t,~(b)";
8655 offbits = 12;
8656 lp = 1;
8657 goto ld;
8658 case M_LDP_AB:
8659 ab = 1;
8660 case M_LDP_OB:
8661 gas_assert (mips_opts.micromips);
8662 s = "ldp";
8663 fmt = "t,~(b)";
8664 offbits = 12;
8665 lp = 1;
8666 goto ld;
8667 case M_LWM_AB:
8668 ab = 1;
8669 case M_LWM_OB:
8670 gas_assert (mips_opts.micromips);
8671 s = "lwm";
8672 fmt = "n,~(b)";
8673 offbits = 12;
8674 goto ld_st;
8675 case M_LDM_AB:
8676 ab = 1;
8677 case M_LDM_OB:
8678 gas_assert (mips_opts.micromips);
8679 s = "ldm";
8680 fmt = "n,~(b)";
8681 offbits = 12;
8682 goto ld_st;
8683
8684 ld:
8685 /* We don't want to use $0 as tempreg. */
8686 if (breg == treg + lp || treg + lp == ZERO)
8687 goto ld_st;
8688 else
8689 tempreg = treg + lp;
8690 goto ld_noat;
8691
8692 case M_SB_AB:
8693 ab = 1;
8694 s = "sb";
8695 fmt = "t,o(b)";
8696 goto ld_st;
8697 case M_SH_AB:
8698 ab = 1;
8699 s = "sh";
8700 fmt = "t,o(b)";
8701 goto ld_st;
8702 case M_SW_AB:
8703 ab = 1;
8704 s = "sw";
8705 fmt = "t,o(b)";
8706 goto ld_st;
8707 case M_SWC0_AB:
8708 ab = 1;
8709 gas_assert (!mips_opts.micromips);
8710 s = "swc0";
8711 fmt = "E,o(b)";
8712 /* Itbl support may require additional care here. */
8713 coproc = 1;
8714 goto ld_st;
8715 case M_SWC1_AB:
8716 ab = 1;
8717 s = "swc1";
8718 fmt = "T,o(b)";
8719 /* Itbl support may require additional care here. */
8720 coproc = 1;
8721 goto ld_st;
8722 case M_SWC2_AB:
8723 ab = 1;
8724 case M_SWC2_OB:
8725 s = "swc2";
8726 fmt = COP12_FMT;
8727 offbits = (mips_opts.micromips ? 12 : 16);
8728 /* Itbl support may require additional care here. */
8729 coproc = 1;
8730 goto ld_st;
8731 case M_SWC3_AB:
8732 ab = 1;
8733 gas_assert (!mips_opts.micromips);
8734 s = "swc3";
8735 fmt = "E,o(b)";
8736 /* Itbl support may require additional care here. */
8737 coproc = 1;
8738 goto ld_st;
8739 case M_SWL_AB:
8740 ab = 1;
8741 case M_SWL_OB:
8742 s = "swl";
8743 fmt = MEM12_FMT;
8744 offbits = (mips_opts.micromips ? 12 : 16);
8745 goto ld_st;
8746 case M_SWR_AB:
8747 ab = 1;
8748 case M_SWR_OB:
8749 s = "swr";
8750 fmt = MEM12_FMT;
8751 offbits = (mips_opts.micromips ? 12 : 16);
8752 goto ld_st;
8753 case M_SC_AB:
8754 ab = 1;
8755 case M_SC_OB:
8756 s = "sc";
8757 fmt = MEM12_FMT;
8758 offbits = (mips_opts.micromips ? 12 : 16);
8759 goto ld_st;
8760 case M_SCD_AB:
8761 ab = 1;
8762 case M_SCD_OB:
8763 s = "scd";
8764 fmt = MEM12_FMT;
8765 offbits = (mips_opts.micromips ? 12 : 16);
8766 goto ld_st;
8767 case M_CACHE_AB:
8768 ab = 1;
8769 case M_CACHE_OB:
8770 s = "cache";
8771 fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8772 offbits = (mips_opts.micromips ? 12 : 16);
8773 goto ld_st;
8774 case M_CACHEE_AB:
8775 ab = 1;
8776 case M_CACHEE_OB:
8777 s = "cachee";
8778 fmt = "k,+j(b)";
8779 offbits = 9;
8780 goto ld_st;
8781 case M_PREF_AB:
8782 ab = 1;
8783 case M_PREF_OB:
8784 s = "pref";
8785 fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8786 offbits = (mips_opts.micromips ? 12 : 16);
8787 goto ld_st;
8788 case M_PREFE_AB:
8789 ab = 1;
8790 case M_PREFE_OB:
8791 s = "prefe";
8792 fmt = "k,+j(b)";
8793 offbits = 9;
8794 goto ld_st;
8795 case M_SDC1_AB:
8796 ab = 1;
8797 s = "sdc1";
8798 fmt = "T,o(b)";
8799 coproc = 1;
8800 /* Itbl support may require additional care here. */
8801 goto ld_st;
8802 case M_SDC2_AB:
8803 ab = 1;
8804 case M_SDC2_OB:
8805 s = "sdc2";
8806 fmt = COP12_FMT;
8807 offbits = (mips_opts.micromips ? 12 : 16);
8808 /* Itbl support may require additional care here. */
8809 coproc = 1;
8810 goto ld_st;
8811 case M_SQC2_AB:
8812 ab = 1;
8813 s = "sqc2";
8814 fmt = "E,o(b)";
8815 /* Itbl support may require additional care here. */
8816 coproc = 1;
8817 goto ld_st;
8818 case M_SDC3_AB:
8819 ab = 1;
8820 gas_assert (!mips_opts.micromips);
8821 s = "sdc3";
8822 fmt = "E,o(b)";
8823 /* Itbl support may require additional care here. */
8824 coproc = 1;
8825 goto ld_st;
8826 case M_SDL_AB:
8827 ab = 1;
8828 case M_SDL_OB:
8829 s = "sdl";
8830 fmt = MEM12_FMT;
8831 offbits = (mips_opts.micromips ? 12 : 16);
8832 goto ld_st;
8833 case M_SDR_AB:
8834 ab = 1;
8835 case M_SDR_OB:
8836 s = "sdr";
8837 fmt = MEM12_FMT;
8838 offbits = (mips_opts.micromips ? 12 : 16);
8839 goto ld_st;
8840 case M_SWP_AB:
8841 ab = 1;
8842 case M_SWP_OB:
8843 gas_assert (mips_opts.micromips);
8844 s = "swp";
8845 fmt = "t,~(b)";
8846 offbits = 12;
8847 goto ld_st;
8848 case M_SDP_AB:
8849 ab = 1;
8850 case M_SDP_OB:
8851 gas_assert (mips_opts.micromips);
8852 s = "sdp";
8853 fmt = "t,~(b)";
8854 offbits = 12;
8855 goto ld_st;
8856 case M_SWM_AB:
8857 ab = 1;
8858 case M_SWM_OB:
8859 gas_assert (mips_opts.micromips);
8860 s = "swm";
8861 fmt = "n,~(b)";
8862 offbits = 12;
8863 goto ld_st;
8864 case M_SDM_AB:
8865 ab = 1;
8866 case M_SDM_OB:
8867 gas_assert (mips_opts.micromips);
8868 s = "sdm";
8869 fmt = "n,~(b)";
8870 offbits = 12;
8871
8872 ld_st:
8873 tempreg = AT;
8874 used_at = 1;
8875 ld_noat:
8876 if (offset_expr.X_op != O_constant
8877 && offset_expr.X_op != O_symbol)
8878 {
8879 as_bad (_("Expression too complex"));
8880 offset_expr.X_op = O_constant;
8881 }
8882
8883 if (HAVE_32BIT_ADDRESSES
8884 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8885 {
8886 char value [32];
8887
8888 sprintf_vma (value, offset_expr.X_add_number);
8889 as_bad (_("Number (0x%s) larger than 32 bits"), value);
8890 }
8891
8892 /* A constant expression in PIC code can be handled just as it
8893 is in non PIC code. */
8894 if (offset_expr.X_op == O_constant)
8895 {
8896 int hipart = 0;
8897
8898 expr1.X_add_number = offset_expr.X_add_number;
8899 normalize_address_expr (&expr1);
8900 if ((offbits == 0 || offbits == 16)
8901 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8902 {
8903 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8904 & ~(bfd_vma) 0xffff);
8905 hipart = 1;
8906 }
8907 else if (offbits == 12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8908 {
8909 expr1.X_add_number = ((expr1.X_add_number + 0x800)
8910 & ~(bfd_vma) 0xfff);
8911 hipart = 1;
8912 }
8913 else if (offbits == 9 && !IS_SEXT_9BIT_NUM (expr1.X_add_number))
8914 {
8915 expr1.X_add_number = ((expr1.X_add_number + 0x100)
8916 & ~(bfd_vma) 0x1ff);
8917 hipart = 1;
8918 }
8919 if (hipart)
8920 {
8921 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8922 if (breg != 0)
8923 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8924 tempreg, tempreg, breg);
8925 breg = tempreg;
8926 }
8927 if (offbits == 0)
8928 {
8929 if (offset_expr.X_add_number == 0)
8930 tempreg = breg;
8931 else
8932 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8933 "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8934 macro_build (NULL, s, fmt, treg, tempreg);
8935 }
8936 else if (offbits == 16)
8937 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8938 else
8939 macro_build (NULL, s, fmt,
8940 treg, (unsigned long) offset_expr.X_add_number, breg);
8941 }
8942 else if (offbits != 16)
8943 {
8944 /* The offset field is too narrow to be used for a low-part
8945 relocation, so load the whole address into the auxillary
8946 register. In the case of "A(b)" addresses, we first load
8947 absolute address "A" into the register and then add base
8948 register "b". In the case of "o(b)" addresses, we simply
8949 need to add 16-bit offset "o" to base register "b", and
8950 offset_reloc already contains the relocations associated
8951 with "o". */
8952 if (ab)
8953 {
8954 load_address (tempreg, &offset_expr, &used_at);
8955 if (breg != 0)
8956 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8957 tempreg, tempreg, breg);
8958 }
8959 else
8960 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8961 tempreg, breg, -1,
8962 offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8963 expr1.X_add_number = 0;
8964 if (offbits == 0)
8965 macro_build (NULL, s, fmt, treg, tempreg);
8966 else
8967 macro_build (NULL, s, fmt,
8968 treg, (unsigned long) expr1.X_add_number, tempreg);
8969 }
8970 else if (mips_pic == NO_PIC)
8971 {
8972 /* If this is a reference to a GP relative symbol, and there
8973 is no base register, we want
8974 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
8975 Otherwise, if there is no base register, we want
8976 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8977 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8978 If we have a constant, we need two instructions anyhow,
8979 so we always use the latter form.
8980
8981 If we have a base register, and this is a reference to a
8982 GP relative symbol, we want
8983 addu $tempreg,$breg,$gp
8984 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
8985 Otherwise we want
8986 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8987 addu $tempreg,$tempreg,$breg
8988 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8989 With a constant we always use the latter case.
8990
8991 With 64bit address space and no base register and $at usable,
8992 we want
8993 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8994 lui $at,<sym> (BFD_RELOC_HI16_S)
8995 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8996 dsll32 $tempreg,0
8997 daddu $tempreg,$at
8998 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8999 If we have a base register, we want
9000 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
9001 lui $at,<sym> (BFD_RELOC_HI16_S)
9002 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9003 daddu $at,$breg
9004 dsll32 $tempreg,0
9005 daddu $tempreg,$at
9006 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9007
9008 Without $at we can't generate the optimal path for superscalar
9009 processors here since this would require two temporary registers.
9010 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
9011 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9012 dsll $tempreg,16
9013 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
9014 dsll $tempreg,16
9015 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9016 If we have a base register, we want
9017 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
9018 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9019 dsll $tempreg,16
9020 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
9021 dsll $tempreg,16
9022 daddu $tempreg,$tempreg,$breg
9023 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9024
9025 For GP relative symbols in 64bit address space we can use
9026 the same sequence as in 32bit address space. */
9027 if (HAVE_64BIT_SYMBOLS)
9028 {
9029 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9030 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9031 {
9032 relax_start (offset_expr.X_add_symbol);
9033 if (breg == 0)
9034 {
9035 macro_build (&offset_expr, s, fmt, treg,
9036 BFD_RELOC_GPREL16, mips_gp_register);
9037 }
9038 else
9039 {
9040 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9041 tempreg, breg, mips_gp_register);
9042 macro_build (&offset_expr, s, fmt, treg,
9043 BFD_RELOC_GPREL16, tempreg);
9044 }
9045 relax_switch ();
9046 }
9047
9048 if (used_at == 0 && mips_opts.at)
9049 {
9050 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9051 BFD_RELOC_MIPS_HIGHEST);
9052 macro_build (&offset_expr, "lui", LUI_FMT, AT,
9053 BFD_RELOC_HI16_S);
9054 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9055 tempreg, BFD_RELOC_MIPS_HIGHER);
9056 if (breg != 0)
9057 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
9058 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
9059 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
9060 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
9061 tempreg);
9062 used_at = 1;
9063 }
9064 else
9065 {
9066 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9067 BFD_RELOC_MIPS_HIGHEST);
9068 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9069 tempreg, BFD_RELOC_MIPS_HIGHER);
9070 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9071 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9072 tempreg, BFD_RELOC_HI16_S);
9073 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9074 if (breg != 0)
9075 macro_build (NULL, "daddu", "d,v,t",
9076 tempreg, tempreg, breg);
9077 macro_build (&offset_expr, s, fmt, treg,
9078 BFD_RELOC_LO16, tempreg);
9079 }
9080
9081 if (mips_relax.sequence)
9082 relax_end ();
9083 break;
9084 }
9085
9086 if (breg == 0)
9087 {
9088 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9089 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9090 {
9091 relax_start (offset_expr.X_add_symbol);
9092 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
9093 mips_gp_register);
9094 relax_switch ();
9095 }
9096 macro_build_lui (&offset_expr, tempreg);
9097 macro_build (&offset_expr, s, fmt, treg,
9098 BFD_RELOC_LO16, tempreg);
9099 if (mips_relax.sequence)
9100 relax_end ();
9101 }
9102 else
9103 {
9104 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9105 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9106 {
9107 relax_start (offset_expr.X_add_symbol);
9108 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9109 tempreg, breg, mips_gp_register);
9110 macro_build (&offset_expr, s, fmt, treg,
9111 BFD_RELOC_GPREL16, tempreg);
9112 relax_switch ();
9113 }
9114 macro_build_lui (&offset_expr, tempreg);
9115 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9116 tempreg, tempreg, breg);
9117 macro_build (&offset_expr, s, fmt, treg,
9118 BFD_RELOC_LO16, tempreg);
9119 if (mips_relax.sequence)
9120 relax_end ();
9121 }
9122 }
9123 else if (!mips_big_got)
9124 {
9125 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
9126
9127 /* If this is a reference to an external symbol, we want
9128 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9129 nop
9130 <op> $treg,0($tempreg)
9131 Otherwise we want
9132 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9133 nop
9134 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9135 <op> $treg,0($tempreg)
9136
9137 For NewABI, we want
9138 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9139 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
9140
9141 If there is a base register, we add it to $tempreg before
9142 the <op>. If there is a constant, we stick it in the
9143 <op> instruction. We don't handle constants larger than
9144 16 bits, because we have no way to load the upper 16 bits
9145 (actually, we could handle them for the subset of cases
9146 in which we are not using $at). */
9147 gas_assert (offset_expr.X_op == O_symbol);
9148 if (HAVE_NEWABI)
9149 {
9150 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9151 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9152 if (breg != 0)
9153 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9154 tempreg, tempreg, breg);
9155 macro_build (&offset_expr, s, fmt, treg,
9156 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9157 break;
9158 }
9159 expr1.X_add_number = offset_expr.X_add_number;
9160 offset_expr.X_add_number = 0;
9161 if (expr1.X_add_number < -0x8000
9162 || expr1.X_add_number >= 0x8000)
9163 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9164 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9165 lw_reloc_type, mips_gp_register);
9166 load_delay_nop ();
9167 relax_start (offset_expr.X_add_symbol);
9168 relax_switch ();
9169 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9170 tempreg, BFD_RELOC_LO16);
9171 relax_end ();
9172 if (breg != 0)
9173 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9174 tempreg, tempreg, breg);
9175 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9176 }
9177 else if (mips_big_got && !HAVE_NEWABI)
9178 {
9179 int gpdelay;
9180
9181 /* If this is a reference to an external symbol, we want
9182 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9183 addu $tempreg,$tempreg,$gp
9184 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9185 <op> $treg,0($tempreg)
9186 Otherwise we want
9187 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9188 nop
9189 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9190 <op> $treg,0($tempreg)
9191 If there is a base register, we add it to $tempreg before
9192 the <op>. If there is a constant, we stick it in the
9193 <op> instruction. We don't handle constants larger than
9194 16 bits, because we have no way to load the upper 16 bits
9195 (actually, we could handle them for the subset of cases
9196 in which we are not using $at). */
9197 gas_assert (offset_expr.X_op == O_symbol);
9198 expr1.X_add_number = offset_expr.X_add_number;
9199 offset_expr.X_add_number = 0;
9200 if (expr1.X_add_number < -0x8000
9201 || expr1.X_add_number >= 0x8000)
9202 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9203 gpdelay = reg_needs_delay (mips_gp_register);
9204 relax_start (offset_expr.X_add_symbol);
9205 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9206 BFD_RELOC_MIPS_GOT_HI16);
9207 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9208 mips_gp_register);
9209 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9210 BFD_RELOC_MIPS_GOT_LO16, tempreg);
9211 relax_switch ();
9212 if (gpdelay)
9213 macro_build (NULL, "nop", "");
9214 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9215 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9216 load_delay_nop ();
9217 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9218 tempreg, BFD_RELOC_LO16);
9219 relax_end ();
9220
9221 if (breg != 0)
9222 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9223 tempreg, tempreg, breg);
9224 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9225 }
9226 else if (mips_big_got && HAVE_NEWABI)
9227 {
9228 /* If this is a reference to an external symbol, we want
9229 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9230 add $tempreg,$tempreg,$gp
9231 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9232 <op> $treg,<ofst>($tempreg)
9233 Otherwise, for local symbols, we want:
9234 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9235 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
9236 gas_assert (offset_expr.X_op == O_symbol);
9237 expr1.X_add_number = offset_expr.X_add_number;
9238 offset_expr.X_add_number = 0;
9239 if (expr1.X_add_number < -0x8000
9240 || expr1.X_add_number >= 0x8000)
9241 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9242 relax_start (offset_expr.X_add_symbol);
9243 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9244 BFD_RELOC_MIPS_GOT_HI16);
9245 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9246 mips_gp_register);
9247 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9248 BFD_RELOC_MIPS_GOT_LO16, tempreg);
9249 if (breg != 0)
9250 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9251 tempreg, tempreg, breg);
9252 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9253
9254 relax_switch ();
9255 offset_expr.X_add_number = expr1.X_add_number;
9256 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9257 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9258 if (breg != 0)
9259 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9260 tempreg, tempreg, breg);
9261 macro_build (&offset_expr, s, fmt, treg,
9262 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9263 relax_end ();
9264 }
9265 else
9266 abort ();
9267
9268 break;
9269
9270 case M_JRADDIUSP:
9271 gas_assert (mips_opts.micromips);
9272 gas_assert (mips_opts.insn32);
9273 start_noreorder ();
9274 macro_build (NULL, "jr", "s", RA);
9275 expr1.X_add_number = EXTRACT_OPERAND (1, IMMP, *ip) << 2;
9276 macro_build (&expr1, "addiu", "t,r,j", SP, SP, BFD_RELOC_LO16);
9277 end_noreorder ();
9278 break;
9279
9280 case M_JRC:
9281 gas_assert (mips_opts.micromips);
9282 gas_assert (mips_opts.insn32);
9283 macro_build (NULL, "jr", "s", sreg);
9284 if (mips_opts.noreorder)
9285 macro_build (NULL, "nop", "");
9286 break;
9287
9288 case M_LI:
9289 case M_LI_S:
9290 load_register (treg, &imm_expr, 0);
9291 break;
9292
9293 case M_DLI:
9294 load_register (treg, &imm_expr, 1);
9295 break;
9296
9297 case M_LI_SS:
9298 if (imm_expr.X_op == O_constant)
9299 {
9300 used_at = 1;
9301 load_register (AT, &imm_expr, 0);
9302 macro_build (NULL, "mtc1", "t,G", AT, treg);
9303 break;
9304 }
9305 else
9306 {
9307 gas_assert (offset_expr.X_op == O_symbol
9308 && strcmp (segment_name (S_GET_SEGMENT
9309 (offset_expr.X_add_symbol)),
9310 ".lit4") == 0
9311 && offset_expr.X_add_number == 0);
9312 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
9313 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9314 break;
9315 }
9316
9317 case M_LI_D:
9318 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
9319 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
9320 order 32 bits of the value and the low order 32 bits are either
9321 zero or in OFFSET_EXPR. */
9322 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9323 {
9324 if (HAVE_64BIT_GPRS)
9325 load_register (treg, &imm_expr, 1);
9326 else
9327 {
9328 int hreg, lreg;
9329
9330 if (target_big_endian)
9331 {
9332 hreg = treg;
9333 lreg = treg + 1;
9334 }
9335 else
9336 {
9337 hreg = treg + 1;
9338 lreg = treg;
9339 }
9340
9341 if (hreg <= 31)
9342 load_register (hreg, &imm_expr, 0);
9343 if (lreg <= 31)
9344 {
9345 if (offset_expr.X_op == O_absent)
9346 move_register (lreg, 0);
9347 else
9348 {
9349 gas_assert (offset_expr.X_op == O_constant);
9350 load_register (lreg, &offset_expr, 0);
9351 }
9352 }
9353 }
9354 break;
9355 }
9356
9357 /* We know that sym is in the .rdata section. First we get the
9358 upper 16 bits of the address. */
9359 if (mips_pic == NO_PIC)
9360 {
9361 macro_build_lui (&offset_expr, AT);
9362 used_at = 1;
9363 }
9364 else
9365 {
9366 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9367 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9368 used_at = 1;
9369 }
9370
9371 /* Now we load the register(s). */
9372 if (HAVE_64BIT_GPRS)
9373 {
9374 used_at = 1;
9375 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9376 }
9377 else
9378 {
9379 used_at = 1;
9380 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9381 if (treg != RA)
9382 {
9383 /* FIXME: How in the world do we deal with the possible
9384 overflow here? */
9385 offset_expr.X_add_number += 4;
9386 macro_build (&offset_expr, "lw", "t,o(b)",
9387 treg + 1, BFD_RELOC_LO16, AT);
9388 }
9389 }
9390 break;
9391
9392 case M_LI_DD:
9393 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
9394 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
9395 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
9396 the value and the low order 32 bits are either zero or in
9397 OFFSET_EXPR. */
9398 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9399 {
9400 used_at = 1;
9401 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
9402 if (HAVE_64BIT_FPRS)
9403 {
9404 gas_assert (HAVE_64BIT_GPRS);
9405 macro_build (NULL, "dmtc1", "t,S", AT, treg);
9406 }
9407 else
9408 {
9409 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
9410 if (offset_expr.X_op == O_absent)
9411 macro_build (NULL, "mtc1", "t,G", 0, treg);
9412 else
9413 {
9414 gas_assert (offset_expr.X_op == O_constant);
9415 load_register (AT, &offset_expr, 0);
9416 macro_build (NULL, "mtc1", "t,G", AT, treg);
9417 }
9418 }
9419 break;
9420 }
9421
9422 gas_assert (offset_expr.X_op == O_symbol
9423 && offset_expr.X_add_number == 0);
9424 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
9425 if (strcmp (s, ".lit8") == 0)
9426 {
9427 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9428 {
9429 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
9430 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9431 break;
9432 }
9433 breg = mips_gp_register;
9434 r = BFD_RELOC_MIPS_LITERAL;
9435 goto dob;
9436 }
9437 else
9438 {
9439 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
9440 used_at = 1;
9441 if (mips_pic != NO_PIC)
9442 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9443 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9444 else
9445 {
9446 /* FIXME: This won't work for a 64 bit address. */
9447 macro_build_lui (&offset_expr, AT);
9448 }
9449
9450 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9451 {
9452 macro_build (&offset_expr, "ldc1", "T,o(b)",
9453 treg, BFD_RELOC_LO16, AT);
9454 break;
9455 }
9456 breg = AT;
9457 r = BFD_RELOC_LO16;
9458 goto dob;
9459 }
9460
9461 case M_L_DOB:
9462 /* Even on a big endian machine $fn comes before $fn+1. We have
9463 to adjust when loading from memory. */
9464 r = BFD_RELOC_LO16;
9465 dob:
9466 gas_assert (!mips_opts.micromips);
9467 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9468 macro_build (&offset_expr, "lwc1", "T,o(b)",
9469 target_big_endian ? treg + 1 : treg, r, breg);
9470 /* FIXME: A possible overflow which I don't know how to deal
9471 with. */
9472 offset_expr.X_add_number += 4;
9473 macro_build (&offset_expr, "lwc1", "T,o(b)",
9474 target_big_endian ? treg : treg + 1, r, breg);
9475 break;
9476
9477 case M_S_DOB:
9478 gas_assert (!mips_opts.micromips);
9479 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9480 /* Even on a big endian machine $fn comes before $fn+1. We have
9481 to adjust when storing to memory. */
9482 macro_build (&offset_expr, "swc1", "T,o(b)",
9483 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9484 offset_expr.X_add_number += 4;
9485 macro_build (&offset_expr, "swc1", "T,o(b)",
9486 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9487 break;
9488
9489 case M_L_DAB:
9490 gas_assert (!mips_opts.micromips);
9491 /*
9492 * The MIPS assembler seems to check for X_add_number not
9493 * being double aligned and generating:
9494 * lui at,%hi(foo+1)
9495 * addu at,at,v1
9496 * addiu at,at,%lo(foo+1)
9497 * lwc1 f2,0(at)
9498 * lwc1 f3,4(at)
9499 * But, the resulting address is the same after relocation so why
9500 * generate the extra instruction?
9501 */
9502 /* Itbl support may require additional care here. */
9503 coproc = 1;
9504 fmt = "T,o(b)";
9505 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9506 {
9507 s = "ldc1";
9508 goto ld_st;
9509 }
9510 s = "lwc1";
9511 goto ldd_std;
9512
9513 case M_S_DAB:
9514 gas_assert (!mips_opts.micromips);
9515 /* Itbl support may require additional care here. */
9516 coproc = 1;
9517 fmt = "T,o(b)";
9518 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9519 {
9520 s = "sdc1";
9521 goto ld_st;
9522 }
9523 s = "swc1";
9524 goto ldd_std;
9525
9526 case M_LQ_AB:
9527 fmt = "t,o(b)";
9528 s = "lq";
9529 goto ld;
9530
9531 case M_SQ_AB:
9532 fmt = "t,o(b)";
9533 s = "sq";
9534 goto ld_st;
9535
9536 case M_LD_AB:
9537 fmt = "t,o(b)";
9538 if (HAVE_64BIT_GPRS)
9539 {
9540 s = "ld";
9541 goto ld;
9542 }
9543 s = "lw";
9544 goto ldd_std;
9545
9546 case M_SD_AB:
9547 fmt = "t,o(b)";
9548 if (HAVE_64BIT_GPRS)
9549 {
9550 s = "sd";
9551 goto ld_st;
9552 }
9553 s = "sw";
9554
9555 ldd_std:
9556 if (offset_expr.X_op != O_symbol
9557 && offset_expr.X_op != O_constant)
9558 {
9559 as_bad (_("Expression too complex"));
9560 offset_expr.X_op = O_constant;
9561 }
9562
9563 if (HAVE_32BIT_ADDRESSES
9564 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9565 {
9566 char value [32];
9567
9568 sprintf_vma (value, offset_expr.X_add_number);
9569 as_bad (_("Number (0x%s) larger than 32 bits"), value);
9570 }
9571
9572 /* Even on a big endian machine $fn comes before $fn+1. We have
9573 to adjust when loading from memory. We set coproc if we must
9574 load $fn+1 first. */
9575 /* Itbl support may require additional care here. */
9576 if (!target_big_endian)
9577 coproc = 0;
9578
9579 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9580 {
9581 /* If this is a reference to a GP relative symbol, we want
9582 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
9583 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
9584 If we have a base register, we use this
9585 addu $at,$breg,$gp
9586 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
9587 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
9588 If this is not a GP relative symbol, we want
9589 lui $at,<sym> (BFD_RELOC_HI16_S)
9590 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9591 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9592 If there is a base register, we add it to $at after the
9593 lui instruction. If there is a constant, we always use
9594 the last case. */
9595 if (offset_expr.X_op == O_symbol
9596 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9597 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9598 {
9599 relax_start (offset_expr.X_add_symbol);
9600 if (breg == 0)
9601 {
9602 tempreg = mips_gp_register;
9603 }
9604 else
9605 {
9606 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9607 AT, breg, mips_gp_register);
9608 tempreg = AT;
9609 used_at = 1;
9610 }
9611
9612 /* Itbl support may require additional care here. */
9613 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9614 BFD_RELOC_GPREL16, tempreg);
9615 offset_expr.X_add_number += 4;
9616
9617 /* Set mips_optimize to 2 to avoid inserting an
9618 undesired nop. */
9619 hold_mips_optimize = mips_optimize;
9620 mips_optimize = 2;
9621 /* Itbl support may require additional care here. */
9622 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9623 BFD_RELOC_GPREL16, tempreg);
9624 mips_optimize = hold_mips_optimize;
9625
9626 relax_switch ();
9627
9628 offset_expr.X_add_number -= 4;
9629 }
9630 used_at = 1;
9631 macro_build_lui (&offset_expr, AT);
9632 if (breg != 0)
9633 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9634 /* Itbl support may require additional care here. */
9635 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9636 BFD_RELOC_LO16, AT);
9637 /* FIXME: How do we handle overflow here? */
9638 offset_expr.X_add_number += 4;
9639 /* Itbl support may require additional care here. */
9640 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9641 BFD_RELOC_LO16, AT);
9642 if (mips_relax.sequence)
9643 relax_end ();
9644 }
9645 else if (!mips_big_got)
9646 {
9647 /* If this is a reference to an external symbol, we want
9648 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9649 nop
9650 <op> $treg,0($at)
9651 <op> $treg+1,4($at)
9652 Otherwise we want
9653 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9654 nop
9655 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9656 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9657 If there is a base register we add it to $at before the
9658 lwc1 instructions. If there is a constant we include it
9659 in the lwc1 instructions. */
9660 used_at = 1;
9661 expr1.X_add_number = offset_expr.X_add_number;
9662 if (expr1.X_add_number < -0x8000
9663 || expr1.X_add_number >= 0x8000 - 4)
9664 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9665 load_got_offset (AT, &offset_expr);
9666 load_delay_nop ();
9667 if (breg != 0)
9668 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9669
9670 /* Set mips_optimize to 2 to avoid inserting an undesired
9671 nop. */
9672 hold_mips_optimize = mips_optimize;
9673 mips_optimize = 2;
9674
9675 /* Itbl support may require additional care here. */
9676 relax_start (offset_expr.X_add_symbol);
9677 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9678 BFD_RELOC_LO16, AT);
9679 expr1.X_add_number += 4;
9680 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9681 BFD_RELOC_LO16, AT);
9682 relax_switch ();
9683 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9684 BFD_RELOC_LO16, AT);
9685 offset_expr.X_add_number += 4;
9686 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9687 BFD_RELOC_LO16, AT);
9688 relax_end ();
9689
9690 mips_optimize = hold_mips_optimize;
9691 }
9692 else if (mips_big_got)
9693 {
9694 int gpdelay;
9695
9696 /* If this is a reference to an external symbol, we want
9697 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9698 addu $at,$at,$gp
9699 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
9700 nop
9701 <op> $treg,0($at)
9702 <op> $treg+1,4($at)
9703 Otherwise we want
9704 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9705 nop
9706 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9707 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9708 If there is a base register we add it to $at before the
9709 lwc1 instructions. If there is a constant we include it
9710 in the lwc1 instructions. */
9711 used_at = 1;
9712 expr1.X_add_number = offset_expr.X_add_number;
9713 offset_expr.X_add_number = 0;
9714 if (expr1.X_add_number < -0x8000
9715 || expr1.X_add_number >= 0x8000 - 4)
9716 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9717 gpdelay = reg_needs_delay (mips_gp_register);
9718 relax_start (offset_expr.X_add_symbol);
9719 macro_build (&offset_expr, "lui", LUI_FMT,
9720 AT, BFD_RELOC_MIPS_GOT_HI16);
9721 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9722 AT, AT, mips_gp_register);
9723 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9724 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9725 load_delay_nop ();
9726 if (breg != 0)
9727 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9728 /* Itbl support may require additional care here. */
9729 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9730 BFD_RELOC_LO16, AT);
9731 expr1.X_add_number += 4;
9732
9733 /* Set mips_optimize to 2 to avoid inserting an undesired
9734 nop. */
9735 hold_mips_optimize = mips_optimize;
9736 mips_optimize = 2;
9737 /* Itbl support may require additional care here. */
9738 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9739 BFD_RELOC_LO16, AT);
9740 mips_optimize = hold_mips_optimize;
9741 expr1.X_add_number -= 4;
9742
9743 relax_switch ();
9744 offset_expr.X_add_number = expr1.X_add_number;
9745 if (gpdelay)
9746 macro_build (NULL, "nop", "");
9747 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9748 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9749 load_delay_nop ();
9750 if (breg != 0)
9751 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9752 /* Itbl support may require additional care here. */
9753 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9754 BFD_RELOC_LO16, AT);
9755 offset_expr.X_add_number += 4;
9756
9757 /* Set mips_optimize to 2 to avoid inserting an undesired
9758 nop. */
9759 hold_mips_optimize = mips_optimize;
9760 mips_optimize = 2;
9761 /* Itbl support may require additional care here. */
9762 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9763 BFD_RELOC_LO16, AT);
9764 mips_optimize = hold_mips_optimize;
9765 relax_end ();
9766 }
9767 else
9768 abort ();
9769
9770 break;
9771
9772 case M_LD_OB:
9773 s = HAVE_64BIT_GPRS ? "ld" : "lw";
9774 goto sd_ob;
9775 case M_SD_OB:
9776 s = HAVE_64BIT_GPRS ? "sd" : "sw";
9777 sd_ob:
9778 macro_build (&offset_expr, s, "t,o(b)", treg,
9779 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9780 breg);
9781 if (!HAVE_64BIT_GPRS)
9782 {
9783 offset_expr.X_add_number += 4;
9784 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9785 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9786 breg);
9787 }
9788 break;
9789
9790
9791 case M_SAA_AB:
9792 ab = 1;
9793 case M_SAA_OB:
9794 s = "saa";
9795 offbits = 0;
9796 fmt = "t,(b)";
9797 goto ld_st;
9798 case M_SAAD_AB:
9799 ab = 1;
9800 case M_SAAD_OB:
9801 s = "saad";
9802 offbits = 0;
9803 fmt = "t,(b)";
9804 goto ld_st;
9805
9806 /* New code added to support COPZ instructions.
9807 This code builds table entries out of the macros in mip_opcodes.
9808 R4000 uses interlocks to handle coproc delays.
9809 Other chips (like the R3000) require nops to be inserted for delays.
9810
9811 FIXME: Currently, we require that the user handle delays.
9812 In order to fill delay slots for non-interlocked chips,
9813 we must have a way to specify delays based on the coprocessor.
9814 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9815 What are the side-effects of the cop instruction?
9816 What cache support might we have and what are its effects?
9817 Both coprocessor & memory require delays. how long???
9818 What registers are read/set/modified?
9819
9820 If an itbl is provided to interpret cop instructions,
9821 this knowledge can be encoded in the itbl spec. */
9822
9823 case M_COP0:
9824 s = "c0";
9825 goto copz;
9826 case M_COP1:
9827 s = "c1";
9828 goto copz;
9829 case M_COP2:
9830 s = "c2";
9831 goto copz;
9832 case M_COP3:
9833 s = "c3";
9834 copz:
9835 gas_assert (!mips_opts.micromips);
9836 /* For now we just do C (same as Cz). The parameter will be
9837 stored in insn_opcode by mips_ip. */
9838 macro_build (NULL, s, "C", ip->insn_opcode);
9839 break;
9840
9841 case M_MOVE:
9842 move_register (dreg, sreg);
9843 break;
9844
9845 case M_MOVEP:
9846 gas_assert (mips_opts.micromips);
9847 gas_assert (mips_opts.insn32);
9848 dreg = micromips_to_32_reg_h_map1[EXTRACT_OPERAND (1, MH, *ip)];
9849 breg = micromips_to_32_reg_h_map2[EXTRACT_OPERAND (1, MH, *ip)];
9850 sreg = micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
9851 treg = micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
9852 move_register (dreg, sreg);
9853 move_register (breg, treg);
9854 break;
9855
9856 case M_DMUL:
9857 dbl = 1;
9858 case M_MUL:
9859 if (mips_opts.arch == CPU_R5900)
9860 {
9861 macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9862 }
9863 else
9864 {
9865 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9866 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9867 }
9868 break;
9869
9870 case M_DMUL_I:
9871 dbl = 1;
9872 case M_MUL_I:
9873 /* The MIPS assembler some times generates shifts and adds. I'm
9874 not trying to be that fancy. GCC should do this for us
9875 anyway. */
9876 used_at = 1;
9877 load_register (AT, &imm_expr, dbl);
9878 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9879 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9880 break;
9881
9882 case M_DMULO_I:
9883 dbl = 1;
9884 case M_MULO_I:
9885 imm = 1;
9886 goto do_mulo;
9887
9888 case M_DMULO:
9889 dbl = 1;
9890 case M_MULO:
9891 do_mulo:
9892 start_noreorder ();
9893 used_at = 1;
9894 if (imm)
9895 load_register (AT, &imm_expr, dbl);
9896 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9897 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9898 macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9899 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9900 if (mips_trap)
9901 macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9902 else
9903 {
9904 if (mips_opts.micromips)
9905 micromips_label_expr (&label_expr);
9906 else
9907 label_expr.X_add_number = 8;
9908 macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9909 macro_build (NULL, "nop", "");
9910 macro_build (NULL, "break", BRK_FMT, 6);
9911 if (mips_opts.micromips)
9912 micromips_add_label ();
9913 }
9914 end_noreorder ();
9915 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9916 break;
9917
9918 case M_DMULOU_I:
9919 dbl = 1;
9920 case M_MULOU_I:
9921 imm = 1;
9922 goto do_mulou;
9923
9924 case M_DMULOU:
9925 dbl = 1;
9926 case M_MULOU:
9927 do_mulou:
9928 start_noreorder ();
9929 used_at = 1;
9930 if (imm)
9931 load_register (AT, &imm_expr, dbl);
9932 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9933 sreg, imm ? AT : treg);
9934 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9935 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9936 if (mips_trap)
9937 macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9938 else
9939 {
9940 if (mips_opts.micromips)
9941 micromips_label_expr (&label_expr);
9942 else
9943 label_expr.X_add_number = 8;
9944 macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9945 macro_build (NULL, "nop", "");
9946 macro_build (NULL, "break", BRK_FMT, 6);
9947 if (mips_opts.micromips)
9948 micromips_add_label ();
9949 }
9950 end_noreorder ();
9951 break;
9952
9953 case M_DROL:
9954 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9955 {
9956 if (dreg == sreg)
9957 {
9958 tempreg = AT;
9959 used_at = 1;
9960 }
9961 else
9962 {
9963 tempreg = dreg;
9964 }
9965 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9966 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9967 break;
9968 }
9969 used_at = 1;
9970 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9971 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9972 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9973 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9974 break;
9975
9976 case M_ROL:
9977 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9978 {
9979 if (dreg == sreg)
9980 {
9981 tempreg = AT;
9982 used_at = 1;
9983 }
9984 else
9985 {
9986 tempreg = dreg;
9987 }
9988 macro_build (NULL, "negu", "d,w", tempreg, treg);
9989 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9990 break;
9991 }
9992 used_at = 1;
9993 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9994 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9995 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9996 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9997 break;
9998
9999 case M_DROL_I:
10000 {
10001 unsigned int rot;
10002 char *l;
10003 char *rr;
10004
10005 if (imm_expr.X_op != O_constant)
10006 as_bad (_("Improper rotate count"));
10007 rot = imm_expr.X_add_number & 0x3f;
10008 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10009 {
10010 rot = (64 - rot) & 0x3f;
10011 if (rot >= 32)
10012 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10013 else
10014 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10015 break;
10016 }
10017 if (rot == 0)
10018 {
10019 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10020 break;
10021 }
10022 l = (rot < 0x20) ? "dsll" : "dsll32";
10023 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
10024 rot &= 0x1f;
10025 used_at = 1;
10026 macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
10027 macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10028 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10029 }
10030 break;
10031
10032 case M_ROL_I:
10033 {
10034 unsigned int rot;
10035
10036 if (imm_expr.X_op != O_constant)
10037 as_bad (_("Improper rotate count"));
10038 rot = imm_expr.X_add_number & 0x1f;
10039 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10040 {
10041 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
10042 break;
10043 }
10044 if (rot == 0)
10045 {
10046 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10047 break;
10048 }
10049 used_at = 1;
10050 macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
10051 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10052 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10053 }
10054 break;
10055
10056 case M_DROR:
10057 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10058 {
10059 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
10060 break;
10061 }
10062 used_at = 1;
10063 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
10064 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
10065 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
10066 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10067 break;
10068
10069 case M_ROR:
10070 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10071 {
10072 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
10073 break;
10074 }
10075 used_at = 1;
10076 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
10077 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
10078 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
10079 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10080 break;
10081
10082 case M_DROR_I:
10083 {
10084 unsigned int rot;
10085 char *l;
10086 char *rr;
10087
10088 if (imm_expr.X_op != O_constant)
10089 as_bad (_("Improper rotate count"));
10090 rot = imm_expr.X_add_number & 0x3f;
10091 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10092 {
10093 if (rot >= 32)
10094 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10095 else
10096 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10097 break;
10098 }
10099 if (rot == 0)
10100 {
10101 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10102 break;
10103 }
10104 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
10105 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
10106 rot &= 0x1f;
10107 used_at = 1;
10108 macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
10109 macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10110 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10111 }
10112 break;
10113
10114 case M_ROR_I:
10115 {
10116 unsigned int rot;
10117
10118 if (imm_expr.X_op != O_constant)
10119 as_bad (_("Improper rotate count"));
10120 rot = imm_expr.X_add_number & 0x1f;
10121 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10122 {
10123 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
10124 break;
10125 }
10126 if (rot == 0)
10127 {
10128 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10129 break;
10130 }
10131 used_at = 1;
10132 macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
10133 macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10134 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10135 }
10136 break;
10137
10138 case M_SEQ:
10139 if (sreg == 0)
10140 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
10141 else if (treg == 0)
10142 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10143 else
10144 {
10145 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10146 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10147 }
10148 break;
10149
10150 case M_SEQ_I:
10151 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10152 {
10153 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10154 break;
10155 }
10156 if (sreg == 0)
10157 {
10158 as_warn (_("Instruction %s: result is always false"),
10159 ip->insn_mo->name);
10160 move_register (dreg, 0);
10161 break;
10162 }
10163 if (CPU_HAS_SEQ (mips_opts.arch)
10164 && -512 <= imm_expr.X_add_number
10165 && imm_expr.X_add_number < 512)
10166 {
10167 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
10168 (int) imm_expr.X_add_number);
10169 break;
10170 }
10171 if (imm_expr.X_op == O_constant
10172 && imm_expr.X_add_number >= 0
10173 && imm_expr.X_add_number < 0x10000)
10174 {
10175 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10176 }
10177 else if (imm_expr.X_op == O_constant
10178 && imm_expr.X_add_number > -0x8000
10179 && imm_expr.X_add_number < 0)
10180 {
10181 imm_expr.X_add_number = -imm_expr.X_add_number;
10182 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10183 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10184 }
10185 else if (CPU_HAS_SEQ (mips_opts.arch))
10186 {
10187 used_at = 1;
10188 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10189 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
10190 break;
10191 }
10192 else
10193 {
10194 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10195 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10196 used_at = 1;
10197 }
10198 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10199 break;
10200
10201 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
10202 s = "slt";
10203 goto sge;
10204 case M_SGEU:
10205 s = "sltu";
10206 sge:
10207 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
10208 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10209 break;
10210
10211 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
10212 case M_SGEU_I:
10213 if (imm_expr.X_op == O_constant
10214 && imm_expr.X_add_number >= -0x8000
10215 && imm_expr.X_add_number < 0x8000)
10216 {
10217 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
10218 dreg, sreg, BFD_RELOC_LO16);
10219 }
10220 else
10221 {
10222 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10223 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
10224 dreg, sreg, AT);
10225 used_at = 1;
10226 }
10227 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10228 break;
10229
10230 case M_SGT: /* sreg > treg <==> treg < sreg */
10231 s = "slt";
10232 goto sgt;
10233 case M_SGTU:
10234 s = "sltu";
10235 sgt:
10236 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10237 break;
10238
10239 case M_SGT_I: /* sreg > I <==> I < sreg */
10240 s = "slt";
10241 goto sgti;
10242 case M_SGTU_I:
10243 s = "sltu";
10244 sgti:
10245 used_at = 1;
10246 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10247 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10248 break;
10249
10250 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
10251 s = "slt";
10252 goto sle;
10253 case M_SLEU:
10254 s = "sltu";
10255 sle:
10256 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10257 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10258 break;
10259
10260 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
10261 s = "slt";
10262 goto slei;
10263 case M_SLEU_I:
10264 s = "sltu";
10265 slei:
10266 used_at = 1;
10267 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10268 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10269 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10270 break;
10271
10272 case M_SLT_I:
10273 if (imm_expr.X_op == O_constant
10274 && imm_expr.X_add_number >= -0x8000
10275 && imm_expr.X_add_number < 0x8000)
10276 {
10277 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10278 break;
10279 }
10280 used_at = 1;
10281 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10282 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
10283 break;
10284
10285 case M_SLTU_I:
10286 if (imm_expr.X_op == O_constant
10287 && imm_expr.X_add_number >= -0x8000
10288 && imm_expr.X_add_number < 0x8000)
10289 {
10290 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
10291 BFD_RELOC_LO16);
10292 break;
10293 }
10294 used_at = 1;
10295 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10296 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
10297 break;
10298
10299 case M_SNE:
10300 if (sreg == 0)
10301 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
10302 else if (treg == 0)
10303 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10304 else
10305 {
10306 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10307 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10308 }
10309 break;
10310
10311 case M_SNE_I:
10312 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10313 {
10314 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10315 break;
10316 }
10317 if (sreg == 0)
10318 {
10319 as_warn (_("Instruction %s: result is always true"),
10320 ip->insn_mo->name);
10321 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
10322 dreg, 0, BFD_RELOC_LO16);
10323 break;
10324 }
10325 if (CPU_HAS_SEQ (mips_opts.arch)
10326 && -512 <= imm_expr.X_add_number
10327 && imm_expr.X_add_number < 512)
10328 {
10329 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
10330 (int) imm_expr.X_add_number);
10331 break;
10332 }
10333 if (imm_expr.X_op == O_constant
10334 && imm_expr.X_add_number >= 0
10335 && imm_expr.X_add_number < 0x10000)
10336 {
10337 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10338 }
10339 else if (imm_expr.X_op == O_constant
10340 && imm_expr.X_add_number > -0x8000
10341 && imm_expr.X_add_number < 0)
10342 {
10343 imm_expr.X_add_number = -imm_expr.X_add_number;
10344 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10345 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10346 }
10347 else if (CPU_HAS_SEQ (mips_opts.arch))
10348 {
10349 used_at = 1;
10350 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10351 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
10352 break;
10353 }
10354 else
10355 {
10356 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10357 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10358 used_at = 1;
10359 }
10360 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10361 break;
10362
10363 case M_SUB_I:
10364 s = "addi";
10365 s2 = "sub";
10366 goto do_subi;
10367 case M_SUBU_I:
10368 s = "addiu";
10369 s2 = "subu";
10370 goto do_subi;
10371 case M_DSUB_I:
10372 dbl = 1;
10373 s = "daddi";
10374 s2 = "dsub";
10375 if (!mips_opts.micromips)
10376 goto do_subi;
10377 if (imm_expr.X_op == O_constant
10378 && imm_expr.X_add_number > -0x200
10379 && imm_expr.X_add_number <= 0x200)
10380 {
10381 macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
10382 break;
10383 }
10384 goto do_subi_i;
10385 case M_DSUBU_I:
10386 dbl = 1;
10387 s = "daddiu";
10388 s2 = "dsubu";
10389 do_subi:
10390 if (imm_expr.X_op == O_constant
10391 && imm_expr.X_add_number > -0x8000
10392 && imm_expr.X_add_number <= 0x8000)
10393 {
10394 imm_expr.X_add_number = -imm_expr.X_add_number;
10395 macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10396 break;
10397 }
10398 do_subi_i:
10399 used_at = 1;
10400 load_register (AT, &imm_expr, dbl);
10401 macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
10402 break;
10403
10404 case M_TEQ_I:
10405 s = "teq";
10406 goto trap;
10407 case M_TGE_I:
10408 s = "tge";
10409 goto trap;
10410 case M_TGEU_I:
10411 s = "tgeu";
10412 goto trap;
10413 case M_TLT_I:
10414 s = "tlt";
10415 goto trap;
10416 case M_TLTU_I:
10417 s = "tltu";
10418 goto trap;
10419 case M_TNE_I:
10420 s = "tne";
10421 trap:
10422 used_at = 1;
10423 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10424 macro_build (NULL, s, "s,t", sreg, AT);
10425 break;
10426
10427 case M_TRUNCWS:
10428 case M_TRUNCWD:
10429 gas_assert (!mips_opts.micromips);
10430 gas_assert (mips_opts.isa == ISA_MIPS1);
10431 used_at = 1;
10432 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
10433 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
10434
10435 /*
10436 * Is the double cfc1 instruction a bug in the mips assembler;
10437 * or is there a reason for it?
10438 */
10439 start_noreorder ();
10440 macro_build (NULL, "cfc1", "t,G", treg, RA);
10441 macro_build (NULL, "cfc1", "t,G", treg, RA);
10442 macro_build (NULL, "nop", "");
10443 expr1.X_add_number = 3;
10444 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
10445 expr1.X_add_number = 2;
10446 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
10447 macro_build (NULL, "ctc1", "t,G", AT, RA);
10448 macro_build (NULL, "nop", "");
10449 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
10450 dreg, sreg);
10451 macro_build (NULL, "ctc1", "t,G", treg, RA);
10452 macro_build (NULL, "nop", "");
10453 end_noreorder ();
10454 break;
10455
10456 case M_ULH_A:
10457 ab = 1;
10458 case M_ULH:
10459 s = "lb";
10460 s2 = "lbu";
10461 off = 1;
10462 goto uld_st;
10463 case M_ULHU_A:
10464 ab = 1;
10465 case M_ULHU:
10466 s = "lbu";
10467 s2 = "lbu";
10468 off = 1;
10469 goto uld_st;
10470 case M_ULW_A:
10471 ab = 1;
10472 case M_ULW:
10473 s = "lwl";
10474 s2 = "lwr";
10475 offbits = (mips_opts.micromips ? 12 : 16);
10476 off = 3;
10477 goto uld_st;
10478 case M_ULD_A:
10479 ab = 1;
10480 case M_ULD:
10481 s = "ldl";
10482 s2 = "ldr";
10483 offbits = (mips_opts.micromips ? 12 : 16);
10484 off = 7;
10485 goto uld_st;
10486 case M_USH_A:
10487 ab = 1;
10488 case M_USH:
10489 s = "sb";
10490 s2 = "sb";
10491 off = 1;
10492 ust = 1;
10493 goto uld_st;
10494 case M_USW_A:
10495 ab = 1;
10496 case M_USW:
10497 s = "swl";
10498 s2 = "swr";
10499 offbits = (mips_opts.micromips ? 12 : 16);
10500 off = 3;
10501 ust = 1;
10502 goto uld_st;
10503 case M_USD_A:
10504 ab = 1;
10505 case M_USD:
10506 s = "sdl";
10507 s2 = "sdr";
10508 offbits = (mips_opts.micromips ? 12 : 16);
10509 off = 7;
10510 ust = 1;
10511
10512 uld_st:
10513 if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10514 as_bad (_("Operand overflow"));
10515
10516 ep = &offset_expr;
10517 expr1.X_add_number = 0;
10518 if (ab)
10519 {
10520 used_at = 1;
10521 tempreg = AT;
10522 load_address (tempreg, ep, &used_at);
10523 if (breg != 0)
10524 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10525 tempreg, tempreg, breg);
10526 breg = tempreg;
10527 tempreg = treg;
10528 ep = &expr1;
10529 }
10530 else if (offbits == 12
10531 && (offset_expr.X_op != O_constant
10532 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10533 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10534 {
10535 used_at = 1;
10536 tempreg = AT;
10537 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10538 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10539 breg = tempreg;
10540 tempreg = treg;
10541 ep = &expr1;
10542 }
10543 else if (!ust && treg == breg)
10544 {
10545 used_at = 1;
10546 tempreg = AT;
10547 }
10548 else
10549 tempreg = treg;
10550
10551 if (off == 1)
10552 goto ulh_sh;
10553
10554 if (!target_big_endian)
10555 ep->X_add_number += off;
10556 if (offbits != 12)
10557 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10558 else
10559 macro_build (NULL, s, "t,~(b)",
10560 tempreg, (unsigned long) ep->X_add_number, breg);
10561
10562 if (!target_big_endian)
10563 ep->X_add_number -= off;
10564 else
10565 ep->X_add_number += off;
10566 if (offbits != 12)
10567 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10568 else
10569 macro_build (NULL, s2, "t,~(b)",
10570 tempreg, (unsigned long) ep->X_add_number, breg);
10571
10572 /* If necessary, move the result in tempreg to the final destination. */
10573 if (!ust && treg != tempreg)
10574 {
10575 /* Protect second load's delay slot. */
10576 load_delay_nop ();
10577 move_register (treg, tempreg);
10578 }
10579 break;
10580
10581 ulh_sh:
10582 used_at = 1;
10583 if (target_big_endian == ust)
10584 ep->X_add_number += off;
10585 tempreg = ust || ab ? treg : AT;
10586 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10587
10588 /* For halfword transfers we need a temporary register to shuffle
10589 bytes. Unfortunately for M_USH_A we have none available before
10590 the next store as AT holds the base address. We deal with this
10591 case by clobbering TREG and then restoring it as with ULH. */
10592 tempreg = ust == ab ? treg : AT;
10593 if (ust)
10594 macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10595
10596 if (target_big_endian == ust)
10597 ep->X_add_number -= off;
10598 else
10599 ep->X_add_number += off;
10600 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10601
10602 /* For M_USH_A re-retrieve the LSB. */
10603 if (ust && ab)
10604 {
10605 if (target_big_endian)
10606 ep->X_add_number += off;
10607 else
10608 ep->X_add_number -= off;
10609 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10610 }
10611 /* For ULH and M_USH_A OR the LSB in. */
10612 if (!ust || ab)
10613 {
10614 tempreg = !ab ? AT : treg;
10615 macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10616 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10617 }
10618 break;
10619
10620 default:
10621 /* FIXME: Check if this is one of the itbl macros, since they
10622 are added dynamically. */
10623 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10624 break;
10625 }
10626 if (!mips_opts.at && used_at)
10627 as_bad (_("Macro used $at after \".set noat\""));
10628 }
10629
10630 /* Implement macros in mips16 mode. */
10631
10632 static void
10633 mips16_macro (struct mips_cl_insn *ip)
10634 {
10635 int mask;
10636 int xreg, yreg, zreg, tmp;
10637 expressionS expr1;
10638 int dbl;
10639 const char *s, *s2, *s3;
10640
10641 mask = ip->insn_mo->mask;
10642
10643 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10644 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10645 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10646
10647 expr1.X_op = O_constant;
10648 expr1.X_op_symbol = NULL;
10649 expr1.X_add_symbol = NULL;
10650 expr1.X_add_number = 1;
10651
10652 dbl = 0;
10653
10654 switch (mask)
10655 {
10656 default:
10657 abort ();
10658
10659 case M_DDIV_3:
10660 dbl = 1;
10661 case M_DIV_3:
10662 s = "mflo";
10663 goto do_div3;
10664 case M_DREM_3:
10665 dbl = 1;
10666 case M_REM_3:
10667 s = "mfhi";
10668 do_div3:
10669 start_noreorder ();
10670 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10671 expr1.X_add_number = 2;
10672 macro_build (&expr1, "bnez", "x,p", yreg);
10673 macro_build (NULL, "break", "6", 7);
10674
10675 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10676 since that causes an overflow. We should do that as well,
10677 but I don't see how to do the comparisons without a temporary
10678 register. */
10679 end_noreorder ();
10680 macro_build (NULL, s, "x", zreg);
10681 break;
10682
10683 case M_DIVU_3:
10684 s = "divu";
10685 s2 = "mflo";
10686 goto do_divu3;
10687 case M_REMU_3:
10688 s = "divu";
10689 s2 = "mfhi";
10690 goto do_divu3;
10691 case M_DDIVU_3:
10692 s = "ddivu";
10693 s2 = "mflo";
10694 goto do_divu3;
10695 case M_DREMU_3:
10696 s = "ddivu";
10697 s2 = "mfhi";
10698 do_divu3:
10699 start_noreorder ();
10700 macro_build (NULL, s, "0,x,y", xreg, yreg);
10701 expr1.X_add_number = 2;
10702 macro_build (&expr1, "bnez", "x,p", yreg);
10703 macro_build (NULL, "break", "6", 7);
10704 end_noreorder ();
10705 macro_build (NULL, s2, "x", zreg);
10706 break;
10707
10708 case M_DMUL:
10709 dbl = 1;
10710 case M_MUL:
10711 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10712 macro_build (NULL, "mflo", "x", zreg);
10713 break;
10714
10715 case M_DSUBU_I:
10716 dbl = 1;
10717 goto do_subu;
10718 case M_SUBU_I:
10719 do_subu:
10720 if (imm_expr.X_op != O_constant)
10721 as_bad (_("Unsupported large constant"));
10722 imm_expr.X_add_number = -imm_expr.X_add_number;
10723 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10724 break;
10725
10726 case M_SUBU_I_2:
10727 if (imm_expr.X_op != O_constant)
10728 as_bad (_("Unsupported large constant"));
10729 imm_expr.X_add_number = -imm_expr.X_add_number;
10730 macro_build (&imm_expr, "addiu", "x,k", xreg);
10731 break;
10732
10733 case M_DSUBU_I_2:
10734 if (imm_expr.X_op != O_constant)
10735 as_bad (_("Unsupported large constant"));
10736 imm_expr.X_add_number = -imm_expr.X_add_number;
10737 macro_build (&imm_expr, "daddiu", "y,j", yreg);
10738 break;
10739
10740 case M_BEQ:
10741 s = "cmp";
10742 s2 = "bteqz";
10743 goto do_branch;
10744 case M_BNE:
10745 s = "cmp";
10746 s2 = "btnez";
10747 goto do_branch;
10748 case M_BLT:
10749 s = "slt";
10750 s2 = "btnez";
10751 goto do_branch;
10752 case M_BLTU:
10753 s = "sltu";
10754 s2 = "btnez";
10755 goto do_branch;
10756 case M_BLE:
10757 s = "slt";
10758 s2 = "bteqz";
10759 goto do_reverse_branch;
10760 case M_BLEU:
10761 s = "sltu";
10762 s2 = "bteqz";
10763 goto do_reverse_branch;
10764 case M_BGE:
10765 s = "slt";
10766 s2 = "bteqz";
10767 goto do_branch;
10768 case M_BGEU:
10769 s = "sltu";
10770 s2 = "bteqz";
10771 goto do_branch;
10772 case M_BGT:
10773 s = "slt";
10774 s2 = "btnez";
10775 goto do_reverse_branch;
10776 case M_BGTU:
10777 s = "sltu";
10778 s2 = "btnez";
10779
10780 do_reverse_branch:
10781 tmp = xreg;
10782 xreg = yreg;
10783 yreg = tmp;
10784
10785 do_branch:
10786 macro_build (NULL, s, "x,y", xreg, yreg);
10787 macro_build (&offset_expr, s2, "p");
10788 break;
10789
10790 case M_BEQ_I:
10791 s = "cmpi";
10792 s2 = "bteqz";
10793 s3 = "x,U";
10794 goto do_branch_i;
10795 case M_BNE_I:
10796 s = "cmpi";
10797 s2 = "btnez";
10798 s3 = "x,U";
10799 goto do_branch_i;
10800 case M_BLT_I:
10801 s = "slti";
10802 s2 = "btnez";
10803 s3 = "x,8";
10804 goto do_branch_i;
10805 case M_BLTU_I:
10806 s = "sltiu";
10807 s2 = "btnez";
10808 s3 = "x,8";
10809 goto do_branch_i;
10810 case M_BLE_I:
10811 s = "slti";
10812 s2 = "btnez";
10813 s3 = "x,8";
10814 goto do_addone_branch_i;
10815 case M_BLEU_I:
10816 s = "sltiu";
10817 s2 = "btnez";
10818 s3 = "x,8";
10819 goto do_addone_branch_i;
10820 case M_BGE_I:
10821 s = "slti";
10822 s2 = "bteqz";
10823 s3 = "x,8";
10824 goto do_branch_i;
10825 case M_BGEU_I:
10826 s = "sltiu";
10827 s2 = "bteqz";
10828 s3 = "x,8";
10829 goto do_branch_i;
10830 case M_BGT_I:
10831 s = "slti";
10832 s2 = "bteqz";
10833 s3 = "x,8";
10834 goto do_addone_branch_i;
10835 case M_BGTU_I:
10836 s = "sltiu";
10837 s2 = "bteqz";
10838 s3 = "x,8";
10839
10840 do_addone_branch_i:
10841 if (imm_expr.X_op != O_constant)
10842 as_bad (_("Unsupported large constant"));
10843 ++imm_expr.X_add_number;
10844
10845 do_branch_i:
10846 macro_build (&imm_expr, s, s3, xreg);
10847 macro_build (&offset_expr, s2, "p");
10848 break;
10849
10850 case M_ABS:
10851 expr1.X_add_number = 0;
10852 macro_build (&expr1, "slti", "x,8", yreg);
10853 if (xreg != yreg)
10854 move_register (xreg, yreg);
10855 expr1.X_add_number = 2;
10856 macro_build (&expr1, "bteqz", "p");
10857 macro_build (NULL, "neg", "x,w", xreg, xreg);
10858 }
10859 }
10860
10861 /* For consistency checking, verify that all bits are specified either
10862 by the match/mask part of the instruction definition, or by the
10863 operand list. */
10864 static int
10865 validate_mips_insn (const struct mips_opcode *opc)
10866 {
10867 const char *p = opc->args;
10868 char c;
10869 unsigned long used_bits = opc->mask;
10870
10871 if ((used_bits & opc->match) != opc->match)
10872 {
10873 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10874 opc->name, opc->args);
10875 return 0;
10876 }
10877 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
10878 while (*p)
10879 switch (c = *p++)
10880 {
10881 case ',': break;
10882 case '(': break;
10883 case ')': break;
10884 case '+':
10885 switch (c = *p++)
10886 {
10887 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
10888 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
10889 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
10890 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
10891 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10892 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10893 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10894 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10895 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10896 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10897 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10898 case 'I': break;
10899 case 'J': USE_BITS (OP_MASK_CODE10, OP_SH_CODE10); break;
10900 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10901 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10902 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10903 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10904 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10905 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
10906 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10907 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10908 case 'z': USE_BITS (OP_MASK_RZ, OP_SH_RZ); break;
10909 case 'Z': USE_BITS (OP_MASK_FZ, OP_SH_FZ); break;
10910 case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10911 case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10912 case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10913 case 'i': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
10914 case 'j': USE_BITS (OP_MASK_EVAOFFSET, OP_SH_EVAOFFSET); break;
10915
10916 default:
10917 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10918 c, opc->name, opc->args);
10919 return 0;
10920 }
10921 break;
10922 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10923 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10924 case 'A': break;
10925 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
10926 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
10927 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10928 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10929 case 'F': break;
10930 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10931 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10932 case 'I': break;
10933 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
10934 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10935 case 'L': break;
10936 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
10937 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
10938 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
10939 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
10940 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10941 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
10942 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10943 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10944 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10945 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10946 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10947 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10948 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10949 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
10950 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10951 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
10952 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10953 case 'f': break;
10954 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
10955 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10956 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10957 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
10958 case 'l': break;
10959 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10960 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10961 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
10962 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10963 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10964 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10965 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10966 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10967 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10968 case 'x': break;
10969 case 'z': break;
10970 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
10971 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
10972 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10973 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
10974 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
10975 case '[': break;
10976 case ']': break;
10977 case '1': USE_BITS (OP_MASK_STYPE, OP_SH_STYPE); break;
10978 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
10979 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
10980 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
10981 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
10982 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10983 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
10984 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
10985 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
10986 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
10987 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
10988 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
10989 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
10990 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
10991 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
10992 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
10993 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
10994 case '\\': USE_BITS (OP_MASK_3BITPOS, OP_SH_3BITPOS); break;
10995 case '~': USE_BITS (OP_MASK_OFFSET12, OP_SH_OFFSET12); break;
10996 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10997 default:
10998 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10999 c, opc->name, opc->args);
11000 return 0;
11001 }
11002 #undef USE_BITS
11003 if (used_bits != 0xffffffff)
11004 {
11005 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
11006 ~used_bits & 0xffffffff, opc->name, opc->args);
11007 return 0;
11008 }
11009 return 1;
11010 }
11011
11012 /* For consistency checking, verify that the length implied matches the
11013 major opcode and that all bits are specified either by the match/mask
11014 part of the instruction definition, or by the operand list. */
11015
11016 static int
11017 validate_micromips_insn (const struct mips_opcode *opc)
11018 {
11019 unsigned long match = opc->match;
11020 unsigned long mask = opc->mask;
11021 const char *p = opc->args;
11022 unsigned long insn_bits;
11023 unsigned long used_bits;
11024 unsigned long major;
11025 unsigned int length;
11026 char e;
11027 char c;
11028
11029 if ((mask & match) != match)
11030 {
11031 as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
11032 opc->name, opc->args);
11033 return 0;
11034 }
11035 length = micromips_insn_length (opc);
11036 if (length != 2 && length != 4)
11037 {
11038 as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
11039 "%s %s"), length, opc->name, opc->args);
11040 return 0;
11041 }
11042 major = match >> (10 + 8 * (length - 2));
11043 if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
11044 || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
11045 {
11046 as_bad (_("Internal error: bad microMIPS opcode "
11047 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
11048 return 0;
11049 }
11050
11051 /* Shift piecewise to avoid an overflow where unsigned long is 32-bit. */
11052 insn_bits = 1 << 4 * length;
11053 insn_bits <<= 4 * length;
11054 insn_bits -= 1;
11055 used_bits = mask;
11056 #define USE_BITS(field) \
11057 (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
11058 while (*p)
11059 switch (c = *p++)
11060 {
11061 case ',': break;
11062 case '(': break;
11063 case ')': break;
11064 case '+':
11065 e = c;
11066 switch (c = *p++)
11067 {
11068 case 'A': USE_BITS (EXTLSB); break;
11069 case 'B': USE_BITS (INSMSB); break;
11070 case 'C': USE_BITS (EXTMSBD); break;
11071 case 'E': USE_BITS (EXTLSB); break;
11072 case 'F': USE_BITS (INSMSB); break;
11073 case 'G': USE_BITS (EXTMSBD); break;
11074 case 'H': USE_BITS (EXTMSBD); break;
11075 case 'i': USE_BITS (TARGET); break;
11076 case 'j': USE_BITS (EVAOFFSET); break;
11077 default:
11078 as_bad (_("Internal error: bad mips opcode "
11079 "(unknown extension operand type `%c%c'): %s %s"),
11080 e, c, opc->name, opc->args);
11081 return 0;
11082 }
11083 break;
11084 case 'm':
11085 e = c;
11086 switch (c = *p++)
11087 {
11088 case 'A': USE_BITS (IMMA); break;
11089 case 'B': USE_BITS (IMMB); break;
11090 case 'C': USE_BITS (IMMC); break;
11091 case 'D': USE_BITS (IMMD); break;
11092 case 'E': USE_BITS (IMME); break;
11093 case 'F': USE_BITS (IMMF); break;
11094 case 'G': USE_BITS (IMMG); break;
11095 case 'H': USE_BITS (IMMH); break;
11096 case 'I': USE_BITS (IMMI); break;
11097 case 'J': USE_BITS (IMMJ); break;
11098 case 'L': USE_BITS (IMML); break;
11099 case 'M': USE_BITS (IMMM); break;
11100 case 'N': USE_BITS (IMMN); break;
11101 case 'O': USE_BITS (IMMO); break;
11102 case 'P': USE_BITS (IMMP); break;
11103 case 'Q': USE_BITS (IMMQ); break;
11104 case 'U': USE_BITS (IMMU); break;
11105 case 'W': USE_BITS (IMMW); break;
11106 case 'X': USE_BITS (IMMX); break;
11107 case 'Y': USE_BITS (IMMY); break;
11108 case 'Z': break;
11109 case 'a': break;
11110 case 'b': USE_BITS (MB); break;
11111 case 'c': USE_BITS (MC); break;
11112 case 'd': USE_BITS (MD); break;
11113 case 'e': USE_BITS (ME); break;
11114 case 'f': USE_BITS (MF); break;
11115 case 'g': USE_BITS (MG); break;
11116 case 'h': USE_BITS (MH); break;
11117 case 'j': USE_BITS (MJ); break;
11118 case 'l': USE_BITS (ML); break;
11119 case 'm': USE_BITS (MM); break;
11120 case 'n': USE_BITS (MN); break;
11121 case 'p': USE_BITS (MP); break;
11122 case 'q': USE_BITS (MQ); break;
11123 case 'r': break;
11124 case 's': break;
11125 case 't': break;
11126 case 'x': break;
11127 case 'y': break;
11128 case 'z': break;
11129 default:
11130 as_bad (_("Internal error: bad mips opcode "
11131 "(unknown extension operand type `%c%c'): %s %s"),
11132 e, c, opc->name, opc->args);
11133 return 0;
11134 }
11135 break;
11136 case '.': USE_BITS (OFFSET10); break;
11137 case '1': USE_BITS (STYPE); break;
11138 case '2': USE_BITS (BP); break;
11139 case '3': USE_BITS (SA3); break;
11140 case '4': USE_BITS (SA4); break;
11141 case '5': USE_BITS (IMM8); break;
11142 case '6': USE_BITS (RS); break;
11143 case '7': USE_BITS (DSPACC); break;
11144 case '8': USE_BITS (WRDSP); break;
11145 case '0': USE_BITS (DSPSFT); break;
11146 case '<': USE_BITS (SHAMT); break;
11147 case '>': USE_BITS (SHAMT); break;
11148 case '@': USE_BITS (IMM10); break;
11149 case 'B': USE_BITS (CODE10); break;
11150 case 'C': USE_BITS (COPZ); break;
11151 case 'D': USE_BITS (FD); break;
11152 case 'E': USE_BITS (RT); break;
11153 case 'G': USE_BITS (RS); break;
11154 case 'H': USE_BITS (SEL); break;
11155 case 'K': USE_BITS (RS); break;
11156 case 'M': USE_BITS (CCC); break;
11157 case 'N': USE_BITS (BCC); break;
11158 case 'R': USE_BITS (FR); break;
11159 case 'S': USE_BITS (FS); break;
11160 case 'T': USE_BITS (FT); break;
11161 case 'V': USE_BITS (FS); break;
11162 case '\\': USE_BITS (3BITPOS); break;
11163 case '^': USE_BITS (RD); break;
11164 case 'a': USE_BITS (TARGET); break;
11165 case 'b': USE_BITS (RS); break;
11166 case 'c': USE_BITS (CODE); break;
11167 case 'd': USE_BITS (RD); break;
11168 case 'h': USE_BITS (PREFX); break;
11169 case 'i': USE_BITS (IMMEDIATE); break;
11170 case 'j': USE_BITS (DELTA); break;
11171 case 'k': USE_BITS (CACHE); break;
11172 case 'n': USE_BITS (RT); break;
11173 case 'o': USE_BITS (DELTA); break;
11174 case 'p': USE_BITS (DELTA); break;
11175 case 'q': USE_BITS (CODE2); break;
11176 case 'r': USE_BITS (RS); break;
11177 case 's': USE_BITS (RS); break;
11178 case 't': USE_BITS (RT); break;
11179 case 'u': USE_BITS (IMMEDIATE); break;
11180 case 'v': USE_BITS (RS); break;
11181 case 'w': USE_BITS (RT); break;
11182 case 'y': USE_BITS (RS3); break;
11183 case 'z': break;
11184 case '|': USE_BITS (TRAP); break;
11185 case '~': USE_BITS (OFFSET12); break;
11186 default:
11187 as_bad (_("Internal error: bad microMIPS opcode "
11188 "(unknown operand type `%c'): %s %s"),
11189 c, opc->name, opc->args);
11190 return 0;
11191 }
11192 #undef USE_BITS
11193 if (used_bits != insn_bits)
11194 {
11195 if (~used_bits & insn_bits)
11196 as_bad (_("Internal error: bad microMIPS opcode "
11197 "(bits 0x%lx undefined): %s %s"),
11198 ~used_bits & insn_bits, opc->name, opc->args);
11199 if (used_bits & ~insn_bits)
11200 as_bad (_("Internal error: bad microMIPS opcode "
11201 "(bits 0x%lx defined): %s %s"),
11202 used_bits & ~insn_bits, opc->name, opc->args);
11203 return 0;
11204 }
11205 return 1;
11206 }
11207
11208 /* UDI immediates. */
11209 struct mips_immed {
11210 char type;
11211 unsigned int shift;
11212 unsigned long mask;
11213 const char * desc;
11214 };
11215
11216 static const struct mips_immed mips_immed[] = {
11217 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
11218 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
11219 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
11220 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
11221 { 0,0,0,0 }
11222 };
11223
11224 /* Check whether an odd floating-point register is allowed. */
11225 static int
11226 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
11227 {
11228 const char *s = insn->name;
11229
11230 if (insn->pinfo == INSN_MACRO)
11231 /* Let a macro pass, we'll catch it later when it is expanded. */
11232 return 1;
11233
11234 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
11235 {
11236 /* Allow odd registers for single-precision ops. */
11237 switch (insn->pinfo & (FP_S | FP_D))
11238 {
11239 case FP_S:
11240 case 0:
11241 return 1; /* both single precision - ok */
11242 case FP_D:
11243 return 0; /* both double precision - fail */
11244 default:
11245 break;
11246 }
11247
11248 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
11249 s = strchr (insn->name, '.');
11250 if (argnum == 2)
11251 s = s != NULL ? strchr (s + 1, '.') : NULL;
11252 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
11253 }
11254
11255 /* Single-precision coprocessor loads and moves are OK too. */
11256 if ((insn->pinfo & FP_S)
11257 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
11258 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
11259 return 1;
11260
11261 return 0;
11262 }
11263
11264 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
11265 taking bits from BIT up. */
11266 static int
11267 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
11268 {
11269 return (ep->X_op == O_constant
11270 && (ep->X_add_number & ((1 << bit) - 1)) == 0
11271 && ep->X_add_number >= min << bit
11272 && ep->X_add_number < max << bit);
11273 }
11274
11275 /* This routine assembles an instruction into its binary format. As a
11276 side effect, it sets one of the global variables imm_reloc or
11277 offset_reloc to the type of relocation to do if one of the operands
11278 is an address expression. */
11279
11280 static void
11281 mips_ip (char *str, struct mips_cl_insn *ip)
11282 {
11283 bfd_boolean wrong_delay_slot_insns = FALSE;
11284 bfd_boolean need_delay_slot_ok = TRUE;
11285 struct mips_opcode *firstinsn = NULL;
11286 const struct mips_opcode *past;
11287 struct hash_control *hash;
11288 char *s;
11289 const char *args;
11290 char c = 0;
11291 struct mips_opcode *insn;
11292 char *argsStart;
11293 unsigned int regno, regno2;
11294 unsigned int lastregno;
11295 unsigned int destregno = 0;
11296 unsigned int lastpos = 0;
11297 unsigned int limlo, limhi;
11298 int sizelo;
11299 char *s_reset;
11300 offsetT min_range, max_range;
11301 long opend;
11302 char *name;
11303 int argnum;
11304 unsigned int rtype;
11305 char *dot;
11306 long end;
11307
11308 insn_error = NULL;
11309
11310 if (mips_opts.micromips)
11311 {
11312 hash = micromips_op_hash;
11313 past = &micromips_opcodes[bfd_micromips_num_opcodes];
11314 }
11315 else
11316 {
11317 hash = op_hash;
11318 past = &mips_opcodes[NUMOPCODES];
11319 }
11320 forced_insn_length = 0;
11321 insn = NULL;
11322
11323 /* We first try to match an instruction up to a space or to the end. */
11324 for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
11325 continue;
11326
11327 /* Make a copy of the instruction so that we can fiddle with it. */
11328 name = alloca (end + 1);
11329 memcpy (name, str, end);
11330 name[end] = '\0';
11331
11332 for (;;)
11333 {
11334 insn = (struct mips_opcode *) hash_find (hash, name);
11335
11336 if (insn != NULL || !mips_opts.micromips)
11337 break;
11338 if (forced_insn_length)
11339 break;
11340
11341 /* See if there's an instruction size override suffix,
11342 either `16' or `32', at the end of the mnemonic proper,
11343 that defines the operation, i.e. before the first `.'
11344 character if any. Strip it and retry. */
11345 dot = strchr (name, '.');
11346 opend = dot != NULL ? dot - name : end;
11347 if (opend < 3)
11348 break;
11349 if (name[opend - 2] == '1' && name[opend - 1] == '6')
11350 forced_insn_length = 2;
11351 else if (name[opend - 2] == '3' && name[opend - 1] == '2')
11352 forced_insn_length = 4;
11353 else
11354 break;
11355 memcpy (name + opend - 2, name + opend, end - opend + 1);
11356 }
11357 if (insn == NULL)
11358 {
11359 insn_error = _("Unrecognized opcode");
11360 return;
11361 }
11362
11363 /* For microMIPS instructions placed in a fixed-length branch delay slot
11364 we make up to two passes over the relevant fragment of the opcode
11365 table. First we try instructions that meet the delay slot's length
11366 requirement. If none matched, then we retry with the remaining ones
11367 and if one matches, then we use it and then issue an appropriate
11368 warning later on. */
11369 argsStart = s = str + end;
11370 for (;;)
11371 {
11372 bfd_boolean delay_slot_ok;
11373 bfd_boolean size_ok;
11374 bfd_boolean ok;
11375
11376 gas_assert (strcmp (insn->name, name) == 0);
11377
11378 ok = is_opcode_valid (insn);
11379 size_ok = is_size_valid (insn);
11380 delay_slot_ok = is_delay_slot_valid (insn);
11381 if (!delay_slot_ok && !wrong_delay_slot_insns)
11382 {
11383 firstinsn = insn;
11384 wrong_delay_slot_insns = TRUE;
11385 }
11386 if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
11387 {
11388 static char buf[256];
11389
11390 if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
11391 {
11392 ++insn;
11393 continue;
11394 }
11395 if (wrong_delay_slot_insns && need_delay_slot_ok)
11396 {
11397 gas_assert (firstinsn);
11398 need_delay_slot_ok = FALSE;
11399 past = insn + 1;
11400 insn = firstinsn;
11401 continue;
11402 }
11403
11404 if (insn_error)
11405 return;
11406
11407 if (!ok)
11408 sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
11409 mips_cpu_info_from_arch (mips_opts.arch)->name,
11410 mips_cpu_info_from_isa (mips_opts.isa)->name);
11411 else if (mips_opts.insn32)
11412 sprintf (buf, _("Opcode not supported in the `insn32' mode"));
11413 else
11414 sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
11415 8 * forced_insn_length);
11416 insn_error = buf;
11417
11418 return;
11419 }
11420
11421 create_insn (ip, insn);
11422 insn_error = NULL;
11423 argnum = 1;
11424 lastregno = 0xffffffff;
11425 for (args = insn->args;; ++args)
11426 {
11427 int is_mdmx;
11428
11429 s += strspn (s, " \t");
11430 is_mdmx = 0;
11431 switch (*args)
11432 {
11433 case '\0': /* end of args */
11434 if (*s == '\0')
11435 return;
11436 break;
11437
11438 case '2':
11439 /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
11440 code) or 14 (for microMIPS code). */
11441 my_getExpression (&imm_expr, s);
11442 check_absolute_expr (ip, &imm_expr);
11443 if ((unsigned long) imm_expr.X_add_number != 1
11444 && (unsigned long) imm_expr.X_add_number != 3)
11445 {
11446 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
11447 (unsigned long) imm_expr.X_add_number);
11448 }
11449 INSERT_OPERAND (mips_opts.micromips,
11450 BP, *ip, imm_expr.X_add_number);
11451 imm_expr.X_op = O_absent;
11452 s = expr_end;
11453 continue;
11454
11455 case '3':
11456 /* DSP 3-bit unsigned immediate in bit 21 (for standard MIPS
11457 code) or 13 (for microMIPS code). */
11458 {
11459 unsigned long mask = (mips_opts.micromips
11460 ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
11461
11462 my_getExpression (&imm_expr, s);
11463 check_absolute_expr (ip, &imm_expr);
11464 if ((unsigned long) imm_expr.X_add_number > mask)
11465 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11466 mask, (unsigned long) imm_expr.X_add_number);
11467 INSERT_OPERAND (mips_opts.micromips,
11468 SA3, *ip, imm_expr.X_add_number);
11469 imm_expr.X_op = O_absent;
11470 s = expr_end;
11471 }
11472 continue;
11473
11474 case '4':
11475 /* DSP 4-bit unsigned immediate in bit 21 (for standard MIPS
11476 code) or 12 (for microMIPS code). */
11477 {
11478 unsigned long mask = (mips_opts.micromips
11479 ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
11480
11481 my_getExpression (&imm_expr, s);
11482 check_absolute_expr (ip, &imm_expr);
11483 if ((unsigned long) imm_expr.X_add_number > mask)
11484 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11485 mask, (unsigned long) imm_expr.X_add_number);
11486 INSERT_OPERAND (mips_opts.micromips,
11487 SA4, *ip, imm_expr.X_add_number);
11488 imm_expr.X_op = O_absent;
11489 s = expr_end;
11490 }
11491 continue;
11492
11493 case '5':
11494 /* DSP 8-bit unsigned immediate in bit 16 (for standard MIPS
11495 code) or 13 (for microMIPS code). */
11496 {
11497 unsigned long mask = (mips_opts.micromips
11498 ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11499
11500 my_getExpression (&imm_expr, s);
11501 check_absolute_expr (ip, &imm_expr);
11502 if ((unsigned long) imm_expr.X_add_number > mask)
11503 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11504 mask, (unsigned long) imm_expr.X_add_number);
11505 INSERT_OPERAND (mips_opts.micromips,
11506 IMM8, *ip, imm_expr.X_add_number);
11507 imm_expr.X_op = O_absent;
11508 s = expr_end;
11509 }
11510 continue;
11511
11512 case '6':
11513 /* DSP 5-bit unsigned immediate in bit 21 (for standard MIPS
11514 code) or 16 (for microMIPS code). */
11515 {
11516 unsigned long mask = (mips_opts.micromips
11517 ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11518
11519 my_getExpression (&imm_expr, s);
11520 check_absolute_expr (ip, &imm_expr);
11521 if ((unsigned long) imm_expr.X_add_number > mask)
11522 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11523 mask, (unsigned long) imm_expr.X_add_number);
11524 INSERT_OPERAND (mips_opts.micromips,
11525 RS, *ip, imm_expr.X_add_number);
11526 imm_expr.X_op = O_absent;
11527 s = expr_end;
11528 }
11529 continue;
11530
11531 case '7':
11532 /* Four DSP accumulators in bit 11 (for standard MIPS code)
11533 or 14 (for microMIPS code). */
11534 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11535 && s[3] >= '0' && s[3] <= '3')
11536 {
11537 regno = s[3] - '0';
11538 s += 4;
11539 INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11540 continue;
11541 }
11542 else
11543 as_bad (_("Invalid dsp acc register"));
11544 break;
11545
11546 case '8':
11547 /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11548 code) or 14 (for microMIPS code). */
11549 {
11550 unsigned long mask = (mips_opts.micromips
11551 ? MICROMIPSOP_MASK_WRDSP
11552 : OP_MASK_WRDSP);
11553
11554 my_getExpression (&imm_expr, s);
11555 check_absolute_expr (ip, &imm_expr);
11556 if ((unsigned long) imm_expr.X_add_number > mask)
11557 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11558 mask, (unsigned long) imm_expr.X_add_number);
11559 INSERT_OPERAND (mips_opts.micromips,
11560 WRDSP, *ip, imm_expr.X_add_number);
11561 imm_expr.X_op = O_absent;
11562 s = expr_end;
11563 }
11564 continue;
11565
11566 case '9': /* Four DSP accumulators in bits 21,22. */
11567 gas_assert (!mips_opts.micromips);
11568 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11569 && s[3] >= '0' && s[3] <= '3')
11570 {
11571 regno = s[3] - '0';
11572 s += 4;
11573 INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11574 continue;
11575 }
11576 else
11577 as_bad (_("Invalid dsp acc register"));
11578 break;
11579
11580 case '0':
11581 /* DSP 6-bit signed immediate in bit 20 (for standard MIPS
11582 code) or 16 (for microMIPS code). */
11583 {
11584 long mask = (mips_opts.micromips
11585 ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11586
11587 my_getExpression (&imm_expr, s);
11588 check_absolute_expr (ip, &imm_expr);
11589 min_range = -((mask + 1) >> 1);
11590 max_range = ((mask + 1) >> 1) - 1;
11591 if (imm_expr.X_add_number < min_range
11592 || imm_expr.X_add_number > max_range)
11593 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11594 (long) min_range, (long) max_range,
11595 (long) imm_expr.X_add_number);
11596 INSERT_OPERAND (mips_opts.micromips,
11597 DSPSFT, *ip, imm_expr.X_add_number);
11598 imm_expr.X_op = O_absent;
11599 s = expr_end;
11600 }
11601 continue;
11602
11603 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
11604 gas_assert (!mips_opts.micromips);
11605 my_getExpression (&imm_expr, s);
11606 check_absolute_expr (ip, &imm_expr);
11607 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11608 {
11609 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11610 OP_MASK_RDDSP,
11611 (unsigned long) imm_expr.X_add_number);
11612 }
11613 INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11614 imm_expr.X_op = O_absent;
11615 s = expr_end;
11616 continue;
11617
11618 case ':': /* DSP 7-bit signed immediate in bit 19. */
11619 gas_assert (!mips_opts.micromips);
11620 my_getExpression (&imm_expr, s);
11621 check_absolute_expr (ip, &imm_expr);
11622 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11623 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11624 if (imm_expr.X_add_number < min_range ||
11625 imm_expr.X_add_number > max_range)
11626 {
11627 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11628 (long) min_range, (long) max_range,
11629 (long) imm_expr.X_add_number);
11630 }
11631 INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11632 imm_expr.X_op = O_absent;
11633 s = expr_end;
11634 continue;
11635
11636 case '@': /* DSP 10-bit signed immediate in bit 16. */
11637 {
11638 long mask = (mips_opts.micromips
11639 ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11640
11641 my_getExpression (&imm_expr, s);
11642 check_absolute_expr (ip, &imm_expr);
11643 min_range = -((mask + 1) >> 1);
11644 max_range = ((mask + 1) >> 1) - 1;
11645 if (imm_expr.X_add_number < min_range
11646 || imm_expr.X_add_number > max_range)
11647 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11648 (long) min_range, (long) max_range,
11649 (long) imm_expr.X_add_number);
11650 INSERT_OPERAND (mips_opts.micromips,
11651 IMM10, *ip, imm_expr.X_add_number);
11652 imm_expr.X_op = O_absent;
11653 s = expr_end;
11654 }
11655 continue;
11656
11657 case '^': /* DSP 5-bit unsigned immediate in bit 11. */
11658 gas_assert (mips_opts.micromips);
11659 my_getExpression (&imm_expr, s);
11660 check_absolute_expr (ip, &imm_expr);
11661 if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11662 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11663 MICROMIPSOP_MASK_RD,
11664 (unsigned long) imm_expr.X_add_number);
11665 INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11666 imm_expr.X_op = O_absent;
11667 s = expr_end;
11668 continue;
11669
11670 case '!': /* MT usermode flag bit. */
11671 gas_assert (!mips_opts.micromips);
11672 my_getExpression (&imm_expr, s);
11673 check_absolute_expr (ip, &imm_expr);
11674 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11675 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11676 (unsigned long) imm_expr.X_add_number);
11677 INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11678 imm_expr.X_op = O_absent;
11679 s = expr_end;
11680 continue;
11681
11682 case '$': /* MT load high flag bit. */
11683 gas_assert (!mips_opts.micromips);
11684 my_getExpression (&imm_expr, s);
11685 check_absolute_expr (ip, &imm_expr);
11686 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11687 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11688 (unsigned long) imm_expr.X_add_number);
11689 INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11690 imm_expr.X_op = O_absent;
11691 s = expr_end;
11692 continue;
11693
11694 case '*': /* Four DSP accumulators in bits 18,19. */
11695 gas_assert (!mips_opts.micromips);
11696 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11697 s[3] >= '0' && s[3] <= '3')
11698 {
11699 regno = s[3] - '0';
11700 s += 4;
11701 INSERT_OPERAND (0, MTACC_T, *ip, regno);
11702 continue;
11703 }
11704 else
11705 as_bad (_("Invalid dsp/smartmips acc register"));
11706 break;
11707
11708 case '&': /* Four DSP accumulators in bits 13,14. */
11709 gas_assert (!mips_opts.micromips);
11710 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11711 s[3] >= '0' && s[3] <= '3')
11712 {
11713 regno = s[3] - '0';
11714 s += 4;
11715 INSERT_OPERAND (0, MTACC_D, *ip, regno);
11716 continue;
11717 }
11718 else
11719 as_bad (_("Invalid dsp/smartmips acc register"));
11720 break;
11721
11722 case '\\': /* 3-bit bit position. */
11723 {
11724 unsigned long mask = (mips_opts.micromips
11725 ? MICROMIPSOP_MASK_3BITPOS
11726 : OP_MASK_3BITPOS);
11727
11728 my_getExpression (&imm_expr, s);
11729 check_absolute_expr (ip, &imm_expr);
11730 if ((unsigned long) imm_expr.X_add_number > mask)
11731 as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11732 ip->insn_mo->name,
11733 mask, (unsigned long) imm_expr.X_add_number);
11734 INSERT_OPERAND (mips_opts.micromips,
11735 3BITPOS, *ip, imm_expr.X_add_number);
11736 imm_expr.X_op = O_absent;
11737 s = expr_end;
11738 }
11739 continue;
11740
11741 case ',':
11742 ++argnum;
11743 if (*s++ == *args)
11744 continue;
11745 s--;
11746 switch (*++args)
11747 {
11748 case 'r':
11749 case 'v':
11750 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11751 continue;
11752
11753 case 'w':
11754 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11755 continue;
11756
11757 case 'W':
11758 gas_assert (!mips_opts.micromips);
11759 INSERT_OPERAND (0, FT, *ip, lastregno);
11760 continue;
11761
11762 case 'V':
11763 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11764 continue;
11765 }
11766 break;
11767
11768 case '(':
11769 /* Handle optional base register.
11770 Either the base register is omitted or
11771 we must have a left paren. */
11772 /* This is dependent on the next operand specifier
11773 is a base register specification. */
11774 gas_assert (args[1] == 'b'
11775 || (mips_opts.micromips
11776 && args[1] == 'm'
11777 && (args[2] == 'l' || args[2] == 'n'
11778 || args[2] == 's' || args[2] == 'a')));
11779 if (*s == '\0' && args[1] == 'b')
11780 return;
11781 /* Fall through. */
11782
11783 case ')': /* These must match exactly. */
11784 if (*s++ == *args)
11785 continue;
11786 break;
11787
11788 case '[': /* These must match exactly. */
11789 case ']':
11790 gas_assert (!mips_opts.micromips);
11791 if (*s++ == *args)
11792 continue;
11793 break;
11794
11795 case '+': /* Opcode extension character. */
11796 switch (*++args)
11797 {
11798 case '1': /* UDI immediates. */
11799 case '2':
11800 case '3':
11801 case '4':
11802 gas_assert (!mips_opts.micromips);
11803 {
11804 const struct mips_immed *imm = mips_immed;
11805
11806 while (imm->type && imm->type != *args)
11807 ++imm;
11808 if (! imm->type)
11809 abort ();
11810 my_getExpression (&imm_expr, s);
11811 check_absolute_expr (ip, &imm_expr);
11812 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11813 {
11814 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11815 imm->desc ? imm->desc : ip->insn_mo->name,
11816 (unsigned long) imm_expr.X_add_number,
11817 (unsigned long) imm_expr.X_add_number);
11818 imm_expr.X_add_number &= imm->mask;
11819 }
11820 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11821 << imm->shift);
11822 imm_expr.X_op = O_absent;
11823 s = expr_end;
11824 }
11825 continue;
11826
11827 case 'J': /* 10-bit hypcall code. */
11828 gas_assert (!mips_opts.micromips);
11829 {
11830 unsigned long mask = OP_MASK_CODE10;
11831
11832 my_getExpression (&imm_expr, s);
11833 check_absolute_expr (ip, &imm_expr);
11834 if ((unsigned long) imm_expr.X_add_number > mask)
11835 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11836 ip->insn_mo->name,
11837 mask, (unsigned long) imm_expr.X_add_number);
11838 INSERT_OPERAND (0, CODE10, *ip, imm_expr.X_add_number);
11839 imm_expr.X_op = O_absent;
11840 s = expr_end;
11841 }
11842 continue;
11843
11844 case 'A': /* ins/ext position, becomes LSB. */
11845 limlo = 0;
11846 limhi = 31;
11847 goto do_lsb;
11848 case 'E':
11849 limlo = 32;
11850 limhi = 63;
11851 goto do_lsb;
11852 do_lsb:
11853 my_getExpression (&imm_expr, s);
11854 check_absolute_expr (ip, &imm_expr);
11855 if ((unsigned long) imm_expr.X_add_number < limlo
11856 || (unsigned long) imm_expr.X_add_number > limhi)
11857 {
11858 as_bad (_("Improper position (%lu)"),
11859 (unsigned long) imm_expr.X_add_number);
11860 imm_expr.X_add_number = limlo;
11861 }
11862 lastpos = imm_expr.X_add_number;
11863 INSERT_OPERAND (mips_opts.micromips,
11864 EXTLSB, *ip, imm_expr.X_add_number);
11865 imm_expr.X_op = O_absent;
11866 s = expr_end;
11867 continue;
11868
11869 case 'B': /* ins size, becomes MSB. */
11870 limlo = 1;
11871 limhi = 32;
11872 goto do_msb;
11873 case 'F':
11874 limlo = 33;
11875 limhi = 64;
11876 goto do_msb;
11877 do_msb:
11878 my_getExpression (&imm_expr, s);
11879 check_absolute_expr (ip, &imm_expr);
11880 /* Check for negative input so that small negative numbers
11881 will not succeed incorrectly. The checks against
11882 (pos+size) transitively check "size" itself,
11883 assuming that "pos" is reasonable. */
11884 if ((long) imm_expr.X_add_number < 0
11885 || ((unsigned long) imm_expr.X_add_number
11886 + lastpos) < limlo
11887 || ((unsigned long) imm_expr.X_add_number
11888 + lastpos) > limhi)
11889 {
11890 as_bad (_("Improper insert size (%lu, position %lu)"),
11891 (unsigned long) imm_expr.X_add_number,
11892 (unsigned long) lastpos);
11893 imm_expr.X_add_number = limlo - lastpos;
11894 }
11895 INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11896 lastpos + imm_expr.X_add_number - 1);
11897 imm_expr.X_op = O_absent;
11898 s = expr_end;
11899 continue;
11900
11901 case 'C': /* ext size, becomes MSBD. */
11902 limlo = 1;
11903 limhi = 32;
11904 sizelo = 1;
11905 goto do_msbd;
11906 case 'G':
11907 limlo = 33;
11908 limhi = 64;
11909 sizelo = 33;
11910 goto do_msbd;
11911 case 'H':
11912 limlo = 33;
11913 limhi = 64;
11914 sizelo = 1;
11915 goto do_msbd;
11916 do_msbd:
11917 my_getExpression (&imm_expr, s);
11918 check_absolute_expr (ip, &imm_expr);
11919 /* The checks against (pos+size) don't transitively check
11920 "size" itself, assuming that "pos" is reasonable.
11921 We also need to check the lower bound of "size". */
11922 if ((long) imm_expr.X_add_number < sizelo
11923 || ((unsigned long) imm_expr.X_add_number
11924 + lastpos) < limlo
11925 || ((unsigned long) imm_expr.X_add_number
11926 + lastpos) > limhi)
11927 {
11928 as_bad (_("Improper extract size (%lu, position %lu)"),
11929 (unsigned long) imm_expr.X_add_number,
11930 (unsigned long) lastpos);
11931 imm_expr.X_add_number = limlo - lastpos;
11932 }
11933 INSERT_OPERAND (mips_opts.micromips,
11934 EXTMSBD, *ip, imm_expr.X_add_number - 1);
11935 imm_expr.X_op = O_absent;
11936 s = expr_end;
11937 continue;
11938
11939 case 'I':
11940 /* "+I" is like "I", except that imm2_expr is used. */
11941 my_getExpression (&imm2_expr, s);
11942 if (imm2_expr.X_op != O_big
11943 && imm2_expr.X_op != O_constant)
11944 insn_error = _("absolute expression required");
11945 if (HAVE_32BIT_GPRS)
11946 normalize_constant_expr (&imm2_expr);
11947 s = expr_end;
11948 continue;
11949
11950 case 't': /* Coprocessor register number. */
11951 gas_assert (!mips_opts.micromips);
11952 if (s[0] == '$' && ISDIGIT (s[1]))
11953 {
11954 ++s;
11955 regno = 0;
11956 do
11957 {
11958 regno *= 10;
11959 regno += *s - '0';
11960 ++s;
11961 }
11962 while (ISDIGIT (*s));
11963 if (regno > 31)
11964 as_bad (_("Invalid register number (%d)"), regno);
11965 else
11966 {
11967 INSERT_OPERAND (0, RT, *ip, regno);
11968 continue;
11969 }
11970 }
11971 else
11972 as_bad (_("Invalid coprocessor 0 register number"));
11973 break;
11974
11975 case 'x':
11976 /* bbit[01] and bbit[01]32 bit index. Give error if index
11977 is not in the valid range. */
11978 gas_assert (!mips_opts.micromips);
11979 my_getExpression (&imm_expr, s);
11980 check_absolute_expr (ip, &imm_expr);
11981 if ((unsigned) imm_expr.X_add_number > 31)
11982 {
11983 as_bad (_("Improper bit index (%lu)"),
11984 (unsigned long) imm_expr.X_add_number);
11985 imm_expr.X_add_number = 0;
11986 }
11987 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11988 imm_expr.X_op = O_absent;
11989 s = expr_end;
11990 continue;
11991
11992 case 'X':
11993 /* bbit[01] bit index when bbit is used but we generate
11994 bbit[01]32 because the index is over 32. Move to the
11995 next candidate if index is not in the valid range. */
11996 gas_assert (!mips_opts.micromips);
11997 my_getExpression (&imm_expr, s);
11998 check_absolute_expr (ip, &imm_expr);
11999 if ((unsigned) imm_expr.X_add_number < 32
12000 || (unsigned) imm_expr.X_add_number > 63)
12001 break;
12002 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
12003 imm_expr.X_op = O_absent;
12004 s = expr_end;
12005 continue;
12006
12007 case 'p':
12008 /* cins, cins32, exts and exts32 position field. Give error
12009 if it's not in the valid range. */
12010 gas_assert (!mips_opts.micromips);
12011 my_getExpression (&imm_expr, s);
12012 check_absolute_expr (ip, &imm_expr);
12013 if ((unsigned) imm_expr.X_add_number > 31)
12014 {
12015 as_bad (_("Improper position (%lu)"),
12016 (unsigned long) imm_expr.X_add_number);
12017 imm_expr.X_add_number = 0;
12018 }
12019 /* Make the pos explicit to simplify +S. */
12020 lastpos = imm_expr.X_add_number + 32;
12021 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
12022 imm_expr.X_op = O_absent;
12023 s = expr_end;
12024 continue;
12025
12026 case 'P':
12027 /* cins, cins32, exts and exts32 position field. Move to
12028 the next candidate if it's not in the valid range. */
12029 gas_assert (!mips_opts.micromips);
12030 my_getExpression (&imm_expr, s);
12031 check_absolute_expr (ip, &imm_expr);
12032 if ((unsigned) imm_expr.X_add_number < 32
12033 || (unsigned) imm_expr.X_add_number > 63)
12034 break;
12035 lastpos = imm_expr.X_add_number;
12036 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
12037 imm_expr.X_op = O_absent;
12038 s = expr_end;
12039 continue;
12040
12041 case 's':
12042 /* cins and exts length-minus-one field. */
12043 gas_assert (!mips_opts.micromips);
12044 my_getExpression (&imm_expr, s);
12045 check_absolute_expr (ip, &imm_expr);
12046 if ((unsigned long) imm_expr.X_add_number > 31)
12047 {
12048 as_bad (_("Improper size (%lu)"),
12049 (unsigned long) imm_expr.X_add_number);
12050 imm_expr.X_add_number = 0;
12051 }
12052 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12053 imm_expr.X_op = O_absent;
12054 s = expr_end;
12055 continue;
12056
12057 case 'S':
12058 /* cins32/exts32 and cins/exts aliasing cint32/exts32
12059 length-minus-one field. */
12060 gas_assert (!mips_opts.micromips);
12061 my_getExpression (&imm_expr, s);
12062 check_absolute_expr (ip, &imm_expr);
12063 if ((long) imm_expr.X_add_number < 0
12064 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
12065 {
12066 as_bad (_("Improper size (%lu)"),
12067 (unsigned long) imm_expr.X_add_number);
12068 imm_expr.X_add_number = 0;
12069 }
12070 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12071 imm_expr.X_op = O_absent;
12072 s = expr_end;
12073 continue;
12074
12075 case 'Q':
12076 /* seqi/snei immediate field. */
12077 gas_assert (!mips_opts.micromips);
12078 my_getExpression (&imm_expr, s);
12079 check_absolute_expr (ip, &imm_expr);
12080 if ((long) imm_expr.X_add_number < -512
12081 || (long) imm_expr.X_add_number >= 512)
12082 {
12083 as_bad (_("Improper immediate (%ld)"),
12084 (long) imm_expr.X_add_number);
12085 imm_expr.X_add_number = 0;
12086 }
12087 INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
12088 imm_expr.X_op = O_absent;
12089 s = expr_end;
12090 continue;
12091
12092 case 'a': /* 8-bit signed offset in bit 6 */
12093 gas_assert (!mips_opts.micromips);
12094 my_getExpression (&imm_expr, s);
12095 check_absolute_expr (ip, &imm_expr);
12096 min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
12097 max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
12098 if (imm_expr.X_add_number < min_range
12099 || imm_expr.X_add_number > max_range)
12100 {
12101 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12102 (long) min_range, (long) max_range,
12103 (long) imm_expr.X_add_number);
12104 }
12105 INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
12106 imm_expr.X_op = O_absent;
12107 s = expr_end;
12108 continue;
12109
12110 case 'b': /* 8-bit signed offset in bit 3 */
12111 gas_assert (!mips_opts.micromips);
12112 my_getExpression (&imm_expr, s);
12113 check_absolute_expr (ip, &imm_expr);
12114 min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
12115 max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
12116 if (imm_expr.X_add_number < min_range
12117 || imm_expr.X_add_number > max_range)
12118 {
12119 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12120 (long) min_range, (long) max_range,
12121 (long) imm_expr.X_add_number);
12122 }
12123 INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
12124 imm_expr.X_op = O_absent;
12125 s = expr_end;
12126 continue;
12127
12128 case 'c': /* 9-bit signed offset in bit 6 */
12129 gas_assert (!mips_opts.micromips);
12130 my_getExpression (&imm_expr, s);
12131 check_absolute_expr (ip, &imm_expr);
12132 min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
12133 max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
12134 /* We check the offset range before adjusted. */
12135 min_range <<= 4;
12136 max_range <<= 4;
12137 if (imm_expr.X_add_number < min_range
12138 || imm_expr.X_add_number > max_range)
12139 {
12140 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12141 (long) min_range, (long) max_range,
12142 (long) imm_expr.X_add_number);
12143 }
12144 if (imm_expr.X_add_number & 0xf)
12145 {
12146 as_bad (_("Offset not 16 bytes alignment (%ld)"),
12147 (long) imm_expr.X_add_number);
12148 }
12149 /* Right shift 4 bits to adjust the offset operand. */
12150 INSERT_OPERAND (0, OFFSET_C, *ip,
12151 imm_expr.X_add_number >> 4);
12152 imm_expr.X_op = O_absent;
12153 s = expr_end;
12154 continue;
12155
12156 case 'z':
12157 gas_assert (!mips_opts.micromips);
12158 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
12159 break;
12160 if (regno == AT && mips_opts.at)
12161 {
12162 if (mips_opts.at == ATREG)
12163 as_warn (_("used $at without \".set noat\""));
12164 else
12165 as_warn (_("used $%u with \".set at=$%u\""),
12166 regno, mips_opts.at);
12167 }
12168 INSERT_OPERAND (0, RZ, *ip, regno);
12169 continue;
12170
12171 case 'Z':
12172 gas_assert (!mips_opts.micromips);
12173 if (!reg_lookup (&s, RTYPE_FPU, &regno))
12174 break;
12175 INSERT_OPERAND (0, FZ, *ip, regno);
12176 continue;
12177
12178 case 'i':
12179 goto jump;
12180
12181 case 'j':
12182 {
12183 int shift = 8;
12184 size_t i;
12185 /* Check whether there is only a single bracketed expression
12186 left. If so, it must be the base register and the
12187 constant must be zero. */
12188 if (*s == '(' && strchr (s + 1, '(') == 0)
12189 continue;
12190
12191 /* If this value won't fit into the offset, then go find
12192 a macro that will generate a 16- or 32-bit offset code
12193 pattern. */
12194 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12195 if ((i == 0 && (imm_expr.X_op != O_constant
12196 || imm_expr.X_add_number >= 1 << shift
12197 || imm_expr.X_add_number < -1 << shift))
12198 || i > 0)
12199 {
12200 imm_expr.X_op = O_absent;
12201 break;
12202 }
12203 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, *ip,
12204 imm_expr.X_add_number);
12205 imm_expr.X_op = O_absent;
12206 s = expr_end;
12207 }
12208 continue;
12209
12210 default:
12211 as_bad (_("Internal error: bad %s opcode "
12212 "(unknown extension operand type `+%c'): %s %s"),
12213 mips_opts.micromips ? "microMIPS" : "MIPS",
12214 *args, insn->name, insn->args);
12215 /* Further processing is fruitless. */
12216 return;
12217 }
12218 break;
12219
12220 case '.': /* 10-bit offset. */
12221 gas_assert (mips_opts.micromips);
12222 case '~': /* 12-bit offset. */
12223 {
12224 int shift = *args == '.' ? 9 : 11;
12225 size_t i;
12226
12227 /* Check whether there is only a single bracketed expression
12228 left. If so, it must be the base register and the
12229 constant must be zero. */
12230 if (*s == '(' && strchr (s + 1, '(') == 0)
12231 continue;
12232
12233 /* If this value won't fit into the offset, then go find
12234 a macro that will generate a 16- or 32-bit offset code
12235 pattern. */
12236 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12237 if ((i == 0 && (imm_expr.X_op != O_constant
12238 || imm_expr.X_add_number >= 1 << shift
12239 || imm_expr.X_add_number < -1 << shift))
12240 || i > 0)
12241 {
12242 imm_expr.X_op = O_absent;
12243 break;
12244 }
12245 if (shift == 9)
12246 INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
12247 else
12248 INSERT_OPERAND (mips_opts.micromips,
12249 OFFSET12, *ip, imm_expr.X_add_number);
12250 imm_expr.X_op = O_absent;
12251 s = expr_end;
12252 }
12253 continue;
12254
12255 case '<': /* must be at least one digit */
12256 /*
12257 * According to the manual, if the shift amount is greater
12258 * than 31 or less than 0, then the shift amount should be
12259 * mod 32. In reality the mips assembler issues an error.
12260 * We issue a warning and mask out all but the low 5 bits.
12261 */
12262 my_getExpression (&imm_expr, s);
12263 check_absolute_expr (ip, &imm_expr);
12264 if ((unsigned long) imm_expr.X_add_number > 31)
12265 as_warn (_("Improper shift amount (%lu)"),
12266 (unsigned long) imm_expr.X_add_number);
12267 INSERT_OPERAND (mips_opts.micromips,
12268 SHAMT, *ip, imm_expr.X_add_number);
12269 imm_expr.X_op = O_absent;
12270 s = expr_end;
12271 continue;
12272
12273 case '>': /* shift amount minus 32 */
12274 my_getExpression (&imm_expr, s);
12275 check_absolute_expr (ip, &imm_expr);
12276 if ((unsigned long) imm_expr.X_add_number < 32
12277 || (unsigned long) imm_expr.X_add_number > 63)
12278 break;
12279 INSERT_OPERAND (mips_opts.micromips,
12280 SHAMT, *ip, imm_expr.X_add_number - 32);
12281 imm_expr.X_op = O_absent;
12282 s = expr_end;
12283 continue;
12284
12285 case 'k': /* CACHE code. */
12286 case 'h': /* PREFX code. */
12287 case '1': /* SYNC type. */
12288 my_getExpression (&imm_expr, s);
12289 check_absolute_expr (ip, &imm_expr);
12290 if ((unsigned long) imm_expr.X_add_number > 31)
12291 as_warn (_("Invalid value for `%s' (%lu)"),
12292 ip->insn_mo->name,
12293 (unsigned long) imm_expr.X_add_number);
12294 switch (*args)
12295 {
12296 case 'k':
12297 if (mips_fix_cn63xxp1
12298 && !mips_opts.micromips
12299 && strcmp ("pref", insn->name) == 0)
12300 switch (imm_expr.X_add_number)
12301 {
12302 case 5:
12303 case 25:
12304 case 26:
12305 case 27:
12306 case 28:
12307 case 29:
12308 case 30:
12309 case 31: /* These are ok. */
12310 break;
12311
12312 default: /* The rest must be changed to 28. */
12313 imm_expr.X_add_number = 28;
12314 break;
12315 }
12316 INSERT_OPERAND (mips_opts.micromips,
12317 CACHE, *ip, imm_expr.X_add_number);
12318 break;
12319 case 'h':
12320 INSERT_OPERAND (mips_opts.micromips,
12321 PREFX, *ip, imm_expr.X_add_number);
12322 break;
12323 case '1':
12324 INSERT_OPERAND (mips_opts.micromips,
12325 STYPE, *ip, imm_expr.X_add_number);
12326 break;
12327 }
12328 imm_expr.X_op = O_absent;
12329 s = expr_end;
12330 continue;
12331
12332 case 'c': /* BREAK code. */
12333 {
12334 unsigned long mask = (mips_opts.micromips
12335 ? MICROMIPSOP_MASK_CODE
12336 : OP_MASK_CODE);
12337
12338 my_getExpression (&imm_expr, s);
12339 check_absolute_expr (ip, &imm_expr);
12340 if ((unsigned long) imm_expr.X_add_number > mask)
12341 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12342 ip->insn_mo->name,
12343 mask, (unsigned long) imm_expr.X_add_number);
12344 INSERT_OPERAND (mips_opts.micromips,
12345 CODE, *ip, imm_expr.X_add_number);
12346 imm_expr.X_op = O_absent;
12347 s = expr_end;
12348 }
12349 continue;
12350
12351 case 'q': /* Lower BREAK code. */
12352 {
12353 unsigned long mask = (mips_opts.micromips
12354 ? MICROMIPSOP_MASK_CODE2
12355 : OP_MASK_CODE2);
12356
12357 my_getExpression (&imm_expr, s);
12358 check_absolute_expr (ip, &imm_expr);
12359 if ((unsigned long) imm_expr.X_add_number > mask)
12360 as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
12361 ip->insn_mo->name,
12362 mask, (unsigned long) imm_expr.X_add_number);
12363 INSERT_OPERAND (mips_opts.micromips,
12364 CODE2, *ip, imm_expr.X_add_number);
12365 imm_expr.X_op = O_absent;
12366 s = expr_end;
12367 }
12368 continue;
12369
12370 case 'B': /* 20- or 10-bit syscall/break/wait code. */
12371 {
12372 unsigned long mask = (mips_opts.micromips
12373 ? MICROMIPSOP_MASK_CODE10
12374 : OP_MASK_CODE20);
12375
12376 my_getExpression (&imm_expr, s);
12377 check_absolute_expr (ip, &imm_expr);
12378 if ((unsigned long) imm_expr.X_add_number > mask)
12379 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12380 ip->insn_mo->name,
12381 mask, (unsigned long) imm_expr.X_add_number);
12382 if (mips_opts.micromips)
12383 INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
12384 else
12385 INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
12386 imm_expr.X_op = O_absent;
12387 s = expr_end;
12388 }
12389 continue;
12390
12391 case 'C': /* 25- or 23-bit coprocessor code. */
12392 {
12393 unsigned long mask = (mips_opts.micromips
12394 ? MICROMIPSOP_MASK_COPZ
12395 : OP_MASK_COPZ);
12396
12397 my_getExpression (&imm_expr, s);
12398 check_absolute_expr (ip, &imm_expr);
12399 if ((unsigned long) imm_expr.X_add_number > mask)
12400 as_warn (_("Coproccesor code > %u bits (%lu)"),
12401 mips_opts.micromips ? 23U : 25U,
12402 (unsigned long) imm_expr.X_add_number);
12403 INSERT_OPERAND (mips_opts.micromips,
12404 COPZ, *ip, imm_expr.X_add_number);
12405 imm_expr.X_op = O_absent;
12406 s = expr_end;
12407 }
12408 continue;
12409
12410 case 'J': /* 19-bit WAIT code. */
12411 gas_assert (!mips_opts.micromips);
12412 my_getExpression (&imm_expr, s);
12413 check_absolute_expr (ip, &imm_expr);
12414 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
12415 {
12416 as_warn (_("Illegal 19-bit code (%lu)"),
12417 (unsigned long) imm_expr.X_add_number);
12418 imm_expr.X_add_number &= OP_MASK_CODE19;
12419 }
12420 INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
12421 imm_expr.X_op = O_absent;
12422 s = expr_end;
12423 continue;
12424
12425 case 'P': /* Performance register. */
12426 gas_assert (!mips_opts.micromips);
12427 my_getExpression (&imm_expr, s);
12428 check_absolute_expr (ip, &imm_expr);
12429 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
12430 as_warn (_("Invalid performance register (%lu)"),
12431 (unsigned long) imm_expr.X_add_number);
12432 if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
12433 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
12434 as_warn (_("Invalid performance register (%lu)"),
12435 (unsigned long) imm_expr.X_add_number);
12436 INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
12437 imm_expr.X_op = O_absent;
12438 s = expr_end;
12439 continue;
12440
12441 case 'G': /* Coprocessor destination register. */
12442 {
12443 unsigned long opcode = ip->insn_opcode;
12444 unsigned long mask;
12445 unsigned int types;
12446 int cop0;
12447
12448 if (mips_opts.micromips)
12449 {
12450 mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
12451 | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
12452 | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
12453 opcode &= mask;
12454 switch (opcode)
12455 {
12456 case 0x000000fc: /* mfc0 */
12457 case 0x000002fc: /* mtc0 */
12458 case 0x580000fc: /* dmfc0 */
12459 case 0x580002fc: /* dmtc0 */
12460 cop0 = 1;
12461 break;
12462 default:
12463 cop0 = 0;
12464 break;
12465 }
12466 }
12467 else
12468 {
12469 opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
12470 cop0 = opcode == OP_OP_COP0;
12471 }
12472 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
12473 ok = reg_lookup (&s, types, &regno);
12474 if (mips_opts.micromips)
12475 INSERT_OPERAND (1, RS, *ip, regno);
12476 else
12477 INSERT_OPERAND (0, RD, *ip, regno);
12478 if (ok)
12479 {
12480 lastregno = regno;
12481 continue;
12482 }
12483 }
12484 break;
12485
12486 case 'y': /* ALNV.PS source register. */
12487 gas_assert (mips_opts.micromips);
12488 goto do_reg;
12489 case 'x': /* Ignore register name. */
12490 case 'U': /* Destination register (CLO/CLZ). */
12491 case 'g': /* Coprocessor destination register. */
12492 gas_assert (!mips_opts.micromips);
12493 case 'b': /* Base register. */
12494 case 'd': /* Destination register. */
12495 case 's': /* Source register. */
12496 case 't': /* Target register. */
12497 case 'r': /* Both target and source. */
12498 case 'v': /* Both dest and source. */
12499 case 'w': /* Both dest and target. */
12500 case 'E': /* Coprocessor target register. */
12501 case 'K': /* RDHWR destination register. */
12502 case 'z': /* Must be zero register. */
12503 do_reg:
12504 s_reset = s;
12505 if (*args == 'E' || *args == 'K')
12506 ok = reg_lookup (&s, RTYPE_NUM, &regno);
12507 else
12508 {
12509 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12510 if (regno == AT && mips_opts.at)
12511 {
12512 if (mips_opts.at == ATREG)
12513 as_warn (_("Used $at without \".set noat\""));
12514 else
12515 as_warn (_("Used $%u with \".set at=$%u\""),
12516 regno, mips_opts.at);
12517 }
12518 }
12519 if (ok)
12520 {
12521 c = *args;
12522 if (*s == ' ')
12523 ++s;
12524 if (args[1] != *s)
12525 {
12526 if (c == 'r' || c == 'v' || c == 'w')
12527 {
12528 regno = lastregno;
12529 s = s_reset;
12530 ++args;
12531 }
12532 }
12533 /* 'z' only matches $0. */
12534 if (c == 'z' && regno != 0)
12535 break;
12536
12537 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12538 {
12539 if (regno == lastregno)
12540 {
12541 insn_error
12542 = _("Source and destination must be different");
12543 continue;
12544 }
12545 if (regno == 31 && lastregno == 0xffffffff)
12546 {
12547 insn_error
12548 = _("A destination register must be supplied");
12549 continue;
12550 }
12551 }
12552 /* Now that we have assembled one operand, we use the args
12553 string to figure out where it goes in the instruction. */
12554 switch (c)
12555 {
12556 case 'r':
12557 case 's':
12558 case 'v':
12559 case 'b':
12560 INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12561 break;
12562
12563 case 'K':
12564 if (mips_opts.micromips)
12565 INSERT_OPERAND (1, RS, *ip, regno);
12566 else
12567 INSERT_OPERAND (0, RD, *ip, regno);
12568 break;
12569
12570 case 'd':
12571 case 'g':
12572 INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12573 break;
12574
12575 case 'U':
12576 gas_assert (!mips_opts.micromips);
12577 INSERT_OPERAND (0, RD, *ip, regno);
12578 INSERT_OPERAND (0, RT, *ip, regno);
12579 break;
12580
12581 case 'w':
12582 case 't':
12583 case 'E':
12584 INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12585 break;
12586
12587 case 'y':
12588 gas_assert (mips_opts.micromips);
12589 INSERT_OPERAND (1, RS3, *ip, regno);
12590 break;
12591
12592 case 'x':
12593 /* This case exists because on the r3000 trunc
12594 expands into a macro which requires a gp
12595 register. On the r6000 or r4000 it is
12596 assembled into a single instruction which
12597 ignores the register. Thus the insn version
12598 is MIPS_ISA2 and uses 'x', and the macro
12599 version is MIPS_ISA1 and uses 't'. */
12600 break;
12601
12602 case 'z':
12603 /* This case is for the div instruction, which
12604 acts differently if the destination argument
12605 is $0. This only matches $0, and is checked
12606 outside the switch. */
12607 break;
12608 }
12609 lastregno = regno;
12610 continue;
12611 }
12612 switch (*args++)
12613 {
12614 case 'r':
12615 case 'v':
12616 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12617 continue;
12618
12619 case 'w':
12620 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12621 continue;
12622 }
12623 break;
12624
12625 case 'O': /* MDMX alignment immediate constant. */
12626 gas_assert (!mips_opts.micromips);
12627 my_getExpression (&imm_expr, s);
12628 check_absolute_expr (ip, &imm_expr);
12629 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12630 as_warn (_("Improper align amount (%ld), using low bits"),
12631 (long) imm_expr.X_add_number);
12632 INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12633 imm_expr.X_op = O_absent;
12634 s = expr_end;
12635 continue;
12636
12637 case 'Q': /* MDMX vector, element sel, or const. */
12638 if (s[0] != '$')
12639 {
12640 /* MDMX Immediate. */
12641 gas_assert (!mips_opts.micromips);
12642 my_getExpression (&imm_expr, s);
12643 check_absolute_expr (ip, &imm_expr);
12644 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12645 as_warn (_("Invalid MDMX Immediate (%ld)"),
12646 (long) imm_expr.X_add_number);
12647 INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12648 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12649 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12650 else
12651 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12652 imm_expr.X_op = O_absent;
12653 s = expr_end;
12654 continue;
12655 }
12656 /* Not MDMX Immediate. Fall through. */
12657 case 'X': /* MDMX destination register. */
12658 case 'Y': /* MDMX source register. */
12659 case 'Z': /* MDMX target register. */
12660 is_mdmx = 1;
12661 case 'W':
12662 gas_assert (!mips_opts.micromips);
12663 case 'D': /* Floating point destination register. */
12664 case 'S': /* Floating point source register. */
12665 case 'T': /* Floating point target register. */
12666 case 'R': /* Floating point source register. */
12667 case 'V':
12668 rtype = RTYPE_FPU;
12669 if (is_mdmx
12670 || ((mips_opts.ase & ASE_MDMX)
12671 && (ip->insn_mo->pinfo & FP_D)
12672 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12673 | INSN_COPROC_MEMORY_DELAY
12674 | INSN_LOAD_COPROC_DELAY
12675 | INSN_LOAD_MEMORY_DELAY
12676 | INSN_STORE_MEMORY))))
12677 rtype |= RTYPE_VEC;
12678 s_reset = s;
12679 if (reg_lookup (&s, rtype, &regno))
12680 {
12681 if ((regno & 1) != 0
12682 && HAVE_32BIT_FPRS
12683 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12684 as_warn (_("Float register should be even, was %d"),
12685 regno);
12686
12687 c = *args;
12688 if (*s == ' ')
12689 ++s;
12690 if (args[1] != *s)
12691 {
12692 if (c == 'V' || c == 'W')
12693 {
12694 regno = lastregno;
12695 s = s_reset;
12696 ++args;
12697 }
12698 }
12699 switch (c)
12700 {
12701 case 'D':
12702 case 'X':
12703 INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12704 break;
12705
12706 case 'V':
12707 case 'S':
12708 case 'Y':
12709 INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12710 break;
12711
12712 case 'Q':
12713 /* This is like 'Z', but also needs to fix the MDMX
12714 vector/scalar select bits. Note that the
12715 scalar immediate case is handled above. */
12716 if (*s == '[')
12717 {
12718 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12719 int max_el = (is_qh ? 3 : 7);
12720 s++;
12721 my_getExpression(&imm_expr, s);
12722 check_absolute_expr (ip, &imm_expr);
12723 s = expr_end;
12724 if (imm_expr.X_add_number > max_el)
12725 as_bad (_("Bad element selector %ld"),
12726 (long) imm_expr.X_add_number);
12727 imm_expr.X_add_number &= max_el;
12728 ip->insn_opcode |= (imm_expr.X_add_number
12729 << (OP_SH_VSEL +
12730 (is_qh ? 2 : 1)));
12731 imm_expr.X_op = O_absent;
12732 if (*s != ']')
12733 as_warn (_("Expecting ']' found '%s'"), s);
12734 else
12735 s++;
12736 }
12737 else
12738 {
12739 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12740 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12741 << OP_SH_VSEL);
12742 else
12743 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12744 OP_SH_VSEL);
12745 }
12746 /* Fall through. */
12747 case 'W':
12748 case 'T':
12749 case 'Z':
12750 INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12751 break;
12752
12753 case 'R':
12754 INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12755 break;
12756 }
12757 lastregno = regno;
12758 continue;
12759 }
12760
12761 switch (*args++)
12762 {
12763 case 'V':
12764 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12765 continue;
12766
12767 case 'W':
12768 INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12769 continue;
12770 }
12771 break;
12772
12773 case 'I':
12774 my_getExpression (&imm_expr, s);
12775 if (imm_expr.X_op != O_big
12776 && imm_expr.X_op != O_constant)
12777 insn_error = _("absolute expression required");
12778 if (HAVE_32BIT_GPRS)
12779 normalize_constant_expr (&imm_expr);
12780 s = expr_end;
12781 continue;
12782
12783 case 'A':
12784 my_getExpression (&offset_expr, s);
12785 normalize_address_expr (&offset_expr);
12786 *imm_reloc = BFD_RELOC_32;
12787 s = expr_end;
12788 continue;
12789
12790 case 'F':
12791 case 'L':
12792 case 'f':
12793 case 'l':
12794 {
12795 int f64;
12796 int using_gprs;
12797 char *save_in;
12798 char *err;
12799 unsigned char temp[8];
12800 int len;
12801 unsigned int length;
12802 segT seg;
12803 subsegT subseg;
12804 char *p;
12805
12806 /* These only appear as the last operand in an
12807 instruction, and every instruction that accepts
12808 them in any variant accepts them in all variants.
12809 This means we don't have to worry about backing out
12810 any changes if the instruction does not match.
12811
12812 The difference between them is the size of the
12813 floating point constant and where it goes. For 'F'
12814 and 'L' the constant is 64 bits; for 'f' and 'l' it
12815 is 32 bits. Where the constant is placed is based
12816 on how the MIPS assembler does things:
12817 F -- .rdata
12818 L -- .lit8
12819 f -- immediate value
12820 l -- .lit4
12821
12822 The .lit4 and .lit8 sections are only used if
12823 permitted by the -G argument.
12824
12825 The code below needs to know whether the target register
12826 is 32 or 64 bits wide. It relies on the fact 'f' and
12827 'F' are used with GPR-based instructions and 'l' and
12828 'L' are used with FPR-based instructions. */
12829
12830 f64 = *args == 'F' || *args == 'L';
12831 using_gprs = *args == 'F' || *args == 'f';
12832
12833 save_in = input_line_pointer;
12834 input_line_pointer = s;
12835 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12836 length = len;
12837 s = input_line_pointer;
12838 input_line_pointer = save_in;
12839 if (err != NULL && *err != '\0')
12840 {
12841 as_bad (_("Bad floating point constant: %s"), err);
12842 memset (temp, '\0', sizeof temp);
12843 length = f64 ? 8 : 4;
12844 }
12845
12846 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12847
12848 if (*args == 'f'
12849 || (*args == 'l'
12850 && (g_switch_value < 4
12851 || (temp[0] == 0 && temp[1] == 0)
12852 || (temp[2] == 0 && temp[3] == 0))))
12853 {
12854 imm_expr.X_op = O_constant;
12855 if (!target_big_endian)
12856 imm_expr.X_add_number = bfd_getl32 (temp);
12857 else
12858 imm_expr.X_add_number = bfd_getb32 (temp);
12859 }
12860 else if (length > 4
12861 && !mips_disable_float_construction
12862 /* Constants can only be constructed in GPRs and
12863 copied to FPRs if the GPRs are at least as wide
12864 as the FPRs. Force the constant into memory if
12865 we are using 64-bit FPRs but the GPRs are only
12866 32 bits wide. */
12867 && (using_gprs
12868 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12869 && ((temp[0] == 0 && temp[1] == 0)
12870 || (temp[2] == 0 && temp[3] == 0))
12871 && ((temp[4] == 0 && temp[5] == 0)
12872 || (temp[6] == 0 && temp[7] == 0)))
12873 {
12874 /* The value is simple enough to load with a couple of
12875 instructions. If using 32-bit registers, set
12876 imm_expr to the high order 32 bits and offset_expr to
12877 the low order 32 bits. Otherwise, set imm_expr to
12878 the entire 64 bit constant. */
12879 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12880 {
12881 imm_expr.X_op = O_constant;
12882 offset_expr.X_op = O_constant;
12883 if (!target_big_endian)
12884 {
12885 imm_expr.X_add_number = bfd_getl32 (temp + 4);
12886 offset_expr.X_add_number = bfd_getl32 (temp);
12887 }
12888 else
12889 {
12890 imm_expr.X_add_number = bfd_getb32 (temp);
12891 offset_expr.X_add_number = bfd_getb32 (temp + 4);
12892 }
12893 if (offset_expr.X_add_number == 0)
12894 offset_expr.X_op = O_absent;
12895 }
12896 else
12897 {
12898 imm_expr.X_op = O_constant;
12899 if (!target_big_endian)
12900 imm_expr.X_add_number = bfd_getl64 (temp);
12901 else
12902 imm_expr.X_add_number = bfd_getb64 (temp);
12903 }
12904 }
12905 else
12906 {
12907 const char *newname;
12908 segT new_seg;
12909
12910 /* Switch to the right section. */
12911 seg = now_seg;
12912 subseg = now_subseg;
12913 switch (*args)
12914 {
12915 default: /* unused default case avoids warnings. */
12916 case 'L':
12917 newname = RDATA_SECTION_NAME;
12918 if (g_switch_value >= 8)
12919 newname = ".lit8";
12920 break;
12921 case 'F':
12922 newname = RDATA_SECTION_NAME;
12923 break;
12924 case 'l':
12925 gas_assert (g_switch_value >= 4);
12926 newname = ".lit4";
12927 break;
12928 }
12929 new_seg = subseg_new (newname, (subsegT) 0);
12930 bfd_set_section_flags (stdoutput, new_seg,
12931 (SEC_ALLOC
12932 | SEC_LOAD
12933 | SEC_READONLY
12934 | SEC_DATA));
12935 frag_align (*args == 'l' ? 2 : 3, 0, 0);
12936 if (strncmp (TARGET_OS, "elf", 3) != 0)
12937 record_alignment (new_seg, 4);
12938 else
12939 record_alignment (new_seg, *args == 'l' ? 2 : 3);
12940 if (seg == now_seg)
12941 as_bad (_("Can't use floating point insn in this section"));
12942
12943 /* Set the argument to the current address in the
12944 section. */
12945 offset_expr.X_op = O_symbol;
12946 offset_expr.X_add_symbol = symbol_temp_new_now ();
12947 offset_expr.X_add_number = 0;
12948
12949 /* Put the floating point number into the section. */
12950 p = frag_more ((int) length);
12951 memcpy (p, temp, length);
12952
12953 /* Switch back to the original section. */
12954 subseg_set (seg, subseg);
12955 }
12956 }
12957 continue;
12958
12959 case 'i': /* 16-bit unsigned immediate. */
12960 case 'j': /* 16-bit signed immediate. */
12961 *imm_reloc = BFD_RELOC_LO16;
12962 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12963 {
12964 int more;
12965 offsetT minval, maxval;
12966
12967 more = (insn + 1 < past
12968 && strcmp (insn->name, insn[1].name) == 0);
12969
12970 /* For compatibility with older assemblers, we accept
12971 0x8000-0xffff as signed 16-bit numbers when only
12972 signed numbers are allowed. */
12973 if (*args == 'i')
12974 minval = 0, maxval = 0xffff;
12975 else if (more)
12976 minval = -0x8000, maxval = 0x7fff;
12977 else
12978 minval = -0x8000, maxval = 0xffff;
12979
12980 if (imm_expr.X_op != O_constant
12981 || imm_expr.X_add_number < minval
12982 || imm_expr.X_add_number > maxval)
12983 {
12984 if (more)
12985 break;
12986 if (imm_expr.X_op == O_constant
12987 || imm_expr.X_op == O_big)
12988 as_bad (_("Expression out of range"));
12989 }
12990 }
12991 s = expr_end;
12992 continue;
12993
12994 case 'o': /* 16-bit offset. */
12995 offset_reloc[0] = BFD_RELOC_LO16;
12996 offset_reloc[1] = BFD_RELOC_UNUSED;
12997 offset_reloc[2] = BFD_RELOC_UNUSED;
12998
12999 /* Check whether there is only a single bracketed expression
13000 left. If so, it must be the base register and the
13001 constant must be zero. */
13002 if (*s == '(' && strchr (s + 1, '(') == 0)
13003 {
13004 offset_expr.X_op = O_constant;
13005 offset_expr.X_add_number = 0;
13006 continue;
13007 }
13008
13009 /* If this value won't fit into a 16 bit offset, then go
13010 find a macro that will generate the 32 bit offset
13011 code pattern. */
13012 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
13013 && (offset_expr.X_op != O_constant
13014 || offset_expr.X_add_number >= 0x8000
13015 || offset_expr.X_add_number < -0x8000))
13016 break;
13017
13018 s = expr_end;
13019 continue;
13020
13021 case 'p': /* PC-relative offset. */
13022 *offset_reloc = BFD_RELOC_16_PCREL_S2;
13023 my_getExpression (&offset_expr, s);
13024 s = expr_end;
13025 continue;
13026
13027 case 'u': /* Upper 16 bits. */
13028 *imm_reloc = BFD_RELOC_LO16;
13029 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
13030 && imm_expr.X_op == O_constant
13031 && (imm_expr.X_add_number < 0
13032 || imm_expr.X_add_number >= 0x10000))
13033 as_bad (_("lui expression (%lu) not in range 0..65535"),
13034 (unsigned long) imm_expr.X_add_number);
13035 s = expr_end;
13036 continue;
13037
13038 case 'a': /* 26-bit address. */
13039 jump:
13040 *offset_reloc = BFD_RELOC_MIPS_JMP;
13041 my_getExpression (&offset_expr, s);
13042 s = expr_end;
13043 continue;
13044
13045 case 'N': /* 3-bit branch condition code. */
13046 case 'M': /* 3-bit compare condition code. */
13047 rtype = RTYPE_CCC;
13048 if (ip->insn_mo->pinfo & (FP_D | FP_S))
13049 rtype |= RTYPE_FCC;
13050 if (!reg_lookup (&s, rtype, &regno))
13051 break;
13052 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
13053 || strcmp (str + strlen (str) - 5, "any2f") == 0
13054 || strcmp (str + strlen (str) - 5, "any2t") == 0)
13055 && (regno & 1) != 0)
13056 as_warn (_("Condition code register should be even for %s, "
13057 "was %d"),
13058 str, regno);
13059 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
13060 || strcmp (str + strlen (str) - 5, "any4t") == 0)
13061 && (regno & 3) != 0)
13062 as_warn (_("Condition code register should be 0 or 4 for %s, "
13063 "was %d"),
13064 str, regno);
13065 if (*args == 'N')
13066 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
13067 else
13068 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
13069 continue;
13070
13071 case 'H':
13072 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
13073 s += 2;
13074 if (ISDIGIT (*s))
13075 {
13076 c = 0;
13077 do
13078 {
13079 c *= 10;
13080 c += *s - '0';
13081 ++s;
13082 }
13083 while (ISDIGIT (*s));
13084 }
13085 else
13086 c = 8; /* Invalid sel value. */
13087
13088 if (c > 7)
13089 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
13090 INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
13091 continue;
13092
13093 case 'e':
13094 gas_assert (!mips_opts.micromips);
13095 /* Must be at least one digit. */
13096 my_getExpression (&imm_expr, s);
13097 check_absolute_expr (ip, &imm_expr);
13098
13099 if ((unsigned long) imm_expr.X_add_number
13100 > (unsigned long) OP_MASK_VECBYTE)
13101 {
13102 as_bad (_("bad byte vector index (%ld)"),
13103 (long) imm_expr.X_add_number);
13104 imm_expr.X_add_number = 0;
13105 }
13106
13107 INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
13108 imm_expr.X_op = O_absent;
13109 s = expr_end;
13110 continue;
13111
13112 case '%':
13113 gas_assert (!mips_opts.micromips);
13114 my_getExpression (&imm_expr, s);
13115 check_absolute_expr (ip, &imm_expr);
13116
13117 if ((unsigned long) imm_expr.X_add_number
13118 > (unsigned long) OP_MASK_VECALIGN)
13119 {
13120 as_bad (_("bad byte vector index (%ld)"),
13121 (long) imm_expr.X_add_number);
13122 imm_expr.X_add_number = 0;
13123 }
13124
13125 INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
13126 imm_expr.X_op = O_absent;
13127 s = expr_end;
13128 continue;
13129
13130 case 'm': /* Opcode extension character. */
13131 gas_assert (mips_opts.micromips);
13132 c = *++args;
13133 switch (c)
13134 {
13135 case 'r':
13136 if (strncmp (s, "$pc", 3) == 0)
13137 {
13138 s += 3;
13139 continue;
13140 }
13141 break;
13142
13143 case 'a':
13144 case 'b':
13145 case 'c':
13146 case 'd':
13147 case 'e':
13148 case 'f':
13149 case 'g':
13150 case 'h':
13151 case 'j':
13152 case 'l':
13153 case 'm':
13154 case 'n':
13155 case 'p':
13156 case 'q':
13157 case 's':
13158 case 't':
13159 case 'x':
13160 case 'y':
13161 case 'z':
13162 s_reset = s;
13163 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
13164 if (regno == AT && mips_opts.at)
13165 {
13166 if (mips_opts.at == ATREG)
13167 as_warn (_("Used $at without \".set noat\""));
13168 else
13169 as_warn (_("Used $%u with \".set at=$%u\""),
13170 regno, mips_opts.at);
13171 }
13172 if (!ok)
13173 {
13174 if (c == 'c')
13175 {
13176 gas_assert (args[1] == ',');
13177 regno = lastregno;
13178 ++args;
13179 }
13180 else if (c == 't')
13181 {
13182 gas_assert (args[1] == ',');
13183 ++args;
13184 continue; /* Nothing to do. */
13185 }
13186 else
13187 break;
13188 }
13189
13190 if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
13191 {
13192 if (regno == lastregno)
13193 {
13194 insn_error
13195 = _("Source and destination must be different");
13196 continue;
13197 }
13198 if (regno == 31 && lastregno == 0xffffffff)
13199 {
13200 insn_error
13201 = _("A destination register must be supplied");
13202 continue;
13203 }
13204 }
13205
13206 if (*s == ' ')
13207 ++s;
13208 if (args[1] != *s)
13209 {
13210 if (c == 'e')
13211 {
13212 gas_assert (args[1] == ',');
13213 regno = lastregno;
13214 s = s_reset;
13215 ++args;
13216 }
13217 else if (c == 't')
13218 {
13219 gas_assert (args[1] == ',');
13220 s = s_reset;
13221 ++args;
13222 continue; /* Nothing to do. */
13223 }
13224 }
13225
13226 /* Make sure regno is the same as lastregno. */
13227 if (c == 't' && regno != lastregno)
13228 break;
13229
13230 /* Make sure regno is the same as destregno. */
13231 if (c == 'x' && regno != destregno)
13232 break;
13233
13234 /* We need to save regno, before regno maps to the
13235 microMIPS register encoding. */
13236 lastregno = regno;
13237
13238 if (c == 'f')
13239 destregno = regno;
13240
13241 switch (c)
13242 {
13243 case 'a':
13244 if (regno != GP)
13245 regno = ILLEGAL_REG;
13246 break;
13247
13248 case 'b':
13249 regno = mips32_to_micromips_reg_b_map[regno];
13250 break;
13251
13252 case 'c':
13253 regno = mips32_to_micromips_reg_c_map[regno];
13254 break;
13255
13256 case 'd':
13257 regno = mips32_to_micromips_reg_d_map[regno];
13258 break;
13259
13260 case 'e':
13261 regno = mips32_to_micromips_reg_e_map[regno];
13262 break;
13263
13264 case 'f':
13265 regno = mips32_to_micromips_reg_f_map[regno];
13266 break;
13267
13268 case 'g':
13269 regno = mips32_to_micromips_reg_g_map[regno];
13270 break;
13271
13272 case 'h':
13273 s += strspn (s, " \t");
13274 if (*s != ',')
13275 {
13276 regno = ILLEGAL_REG;
13277 break;
13278 }
13279 ++s;
13280 s += strspn (s, " \t");
13281 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno2);
13282 if (!ok)
13283 {
13284 regno = ILLEGAL_REG;
13285 break;
13286 }
13287 if (regno2 == AT && mips_opts.at)
13288 {
13289 if (mips_opts.at == ATREG)
13290 as_warn (_("Used $at without \".set noat\""));
13291 else
13292 as_warn (_("Used $%u with \".set at=$%u\""),
13293 regno2, mips_opts.at);
13294 }
13295 regno = (mips_lookup_reg_pair
13296 (regno, regno2,
13297 micromips_to_32_reg_h_map1,
13298 micromips_to_32_reg_h_map2, 8));
13299 break;
13300
13301 case 'l':
13302 regno = mips32_to_micromips_reg_l_map[regno];
13303 break;
13304
13305 case 'm':
13306 regno = mips32_to_micromips_reg_m_map[regno];
13307 break;
13308
13309 case 'n':
13310 regno = mips32_to_micromips_reg_n_map[regno];
13311 break;
13312
13313 case 'q':
13314 regno = mips32_to_micromips_reg_q_map[regno];
13315 break;
13316
13317 case 's':
13318 if (regno != SP)
13319 regno = ILLEGAL_REG;
13320 break;
13321
13322 case 'y':
13323 if (regno != 31)
13324 regno = ILLEGAL_REG;
13325 break;
13326
13327 case 'z':
13328 if (regno != ZERO)
13329 regno = ILLEGAL_REG;
13330 break;
13331
13332 case 'j': /* Do nothing. */
13333 case 'p':
13334 case 't':
13335 case 'x':
13336 break;
13337
13338 default:
13339 abort ();
13340 }
13341
13342 if (regno == ILLEGAL_REG)
13343 break;
13344
13345 switch (c)
13346 {
13347 case 'b':
13348 INSERT_OPERAND (1, MB, *ip, regno);
13349 break;
13350
13351 case 'c':
13352 INSERT_OPERAND (1, MC, *ip, regno);
13353 break;
13354
13355 case 'd':
13356 INSERT_OPERAND (1, MD, *ip, regno);
13357 break;
13358
13359 case 'e':
13360 INSERT_OPERAND (1, ME, *ip, regno);
13361 break;
13362
13363 case 'f':
13364 INSERT_OPERAND (1, MF, *ip, regno);
13365 break;
13366
13367 case 'g':
13368 INSERT_OPERAND (1, MG, *ip, regno);
13369 break;
13370
13371 case 'h':
13372 INSERT_OPERAND (1, MH, *ip, regno);
13373 break;
13374
13375 case 'j':
13376 INSERT_OPERAND (1, MJ, *ip, regno);
13377 break;
13378
13379 case 'l':
13380 INSERT_OPERAND (1, ML, *ip, regno);
13381 break;
13382
13383 case 'm':
13384 INSERT_OPERAND (1, MM, *ip, regno);
13385 break;
13386
13387 case 'n':
13388 INSERT_OPERAND (1, MN, *ip, regno);
13389 break;
13390
13391 case 'p':
13392 INSERT_OPERAND (1, MP, *ip, regno);
13393 break;
13394
13395 case 'q':
13396 INSERT_OPERAND (1, MQ, *ip, regno);
13397 break;
13398
13399 case 'a': /* Do nothing. */
13400 case 's': /* Do nothing. */
13401 case 't': /* Do nothing. */
13402 case 'x': /* Do nothing. */
13403 case 'y': /* Do nothing. */
13404 case 'z': /* Do nothing. */
13405 break;
13406
13407 default:
13408 abort ();
13409 }
13410 continue;
13411
13412 case 'A':
13413 {
13414 bfd_reloc_code_real_type r[3];
13415 expressionS ep;
13416 int imm;
13417
13418 /* Check whether there is only a single bracketed
13419 expression left. If so, it must be the base register
13420 and the constant must be zero. */
13421 if (*s == '(' && strchr (s + 1, '(') == 0)
13422 {
13423 INSERT_OPERAND (1, IMMA, *ip, 0);
13424 continue;
13425 }
13426
13427 if (my_getSmallExpression (&ep, r, s) > 0
13428 || !expr_const_in_range (&ep, -64, 64, 2))
13429 break;
13430
13431 imm = ep.X_add_number >> 2;
13432 INSERT_OPERAND (1, IMMA, *ip, imm);
13433 }
13434 s = expr_end;
13435 continue;
13436
13437 case 'B':
13438 {
13439 bfd_reloc_code_real_type r[3];
13440 expressionS ep;
13441 int imm;
13442
13443 if (my_getSmallExpression (&ep, r, s) > 0
13444 || ep.X_op != O_constant)
13445 break;
13446
13447 for (imm = 0; imm < 8; imm++)
13448 if (micromips_imm_b_map[imm] == ep.X_add_number)
13449 break;
13450 if (imm >= 8)
13451 break;
13452
13453 INSERT_OPERAND (1, IMMB, *ip, imm);
13454 }
13455 s = expr_end;
13456 continue;
13457
13458 case 'C':
13459 {
13460 bfd_reloc_code_real_type r[3];
13461 expressionS ep;
13462 int imm;
13463
13464 if (my_getSmallExpression (&ep, r, s) > 0
13465 || ep.X_op != O_constant)
13466 break;
13467
13468 for (imm = 0; imm < 16; imm++)
13469 if (micromips_imm_c_map[imm] == ep.X_add_number)
13470 break;
13471 if (imm >= 16)
13472 break;
13473
13474 INSERT_OPERAND (1, IMMC, *ip, imm);
13475 }
13476 s = expr_end;
13477 continue;
13478
13479 case 'D': /* pc relative offset */
13480 case 'E': /* pc relative offset */
13481 my_getExpression (&offset_expr, s);
13482 if (offset_expr.X_op == O_register)
13483 break;
13484
13485 if (!forced_insn_length)
13486 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13487 else if (c == 'D')
13488 *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13489 else
13490 *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13491 s = expr_end;
13492 continue;
13493
13494 case 'F':
13495 {
13496 bfd_reloc_code_real_type r[3];
13497 expressionS ep;
13498 int imm;
13499
13500 if (my_getSmallExpression (&ep, r, s) > 0
13501 || !expr_const_in_range (&ep, 0, 16, 0))
13502 break;
13503
13504 imm = ep.X_add_number;
13505 INSERT_OPERAND (1, IMMF, *ip, imm);
13506 }
13507 s = expr_end;
13508 continue;
13509
13510 case 'G':
13511 {
13512 bfd_reloc_code_real_type r[3];
13513 expressionS ep;
13514 int imm;
13515
13516 /* Check whether there is only a single bracketed
13517 expression left. If so, it must be the base register
13518 and the constant must be zero. */
13519 if (*s == '(' && strchr (s + 1, '(') == 0)
13520 {
13521 INSERT_OPERAND (1, IMMG, *ip, 0);
13522 continue;
13523 }
13524
13525 if (my_getSmallExpression (&ep, r, s) > 0
13526 || !expr_const_in_range (&ep, -1, 15, 0))
13527 break;
13528
13529 imm = ep.X_add_number & 15;
13530 INSERT_OPERAND (1, IMMG, *ip, imm);
13531 }
13532 s = expr_end;
13533 continue;
13534
13535 case 'H':
13536 {
13537 bfd_reloc_code_real_type r[3];
13538 expressionS ep;
13539 int imm;
13540
13541 /* Check whether there is only a single bracketed
13542 expression left. If so, it must be the base register
13543 and the constant must be zero. */
13544 if (*s == '(' && strchr (s + 1, '(') == 0)
13545 {
13546 INSERT_OPERAND (1, IMMH, *ip, 0);
13547 continue;
13548 }
13549
13550 if (my_getSmallExpression (&ep, r, s) > 0
13551 || !expr_const_in_range (&ep, 0, 16, 1))
13552 break;
13553
13554 imm = ep.X_add_number >> 1;
13555 INSERT_OPERAND (1, IMMH, *ip, imm);
13556 }
13557 s = expr_end;
13558 continue;
13559
13560 case 'I':
13561 {
13562 bfd_reloc_code_real_type r[3];
13563 expressionS ep;
13564 int imm;
13565
13566 if (my_getSmallExpression (&ep, r, s) > 0
13567 || !expr_const_in_range (&ep, -1, 127, 0))
13568 break;
13569
13570 imm = ep.X_add_number & 127;
13571 INSERT_OPERAND (1, IMMI, *ip, imm);
13572 }
13573 s = expr_end;
13574 continue;
13575
13576 case 'J':
13577 {
13578 bfd_reloc_code_real_type r[3];
13579 expressionS ep;
13580 int imm;
13581
13582 /* Check whether there is only a single bracketed
13583 expression left. If so, it must be the base register
13584 and the constant must be zero. */
13585 if (*s == '(' && strchr (s + 1, '(') == 0)
13586 {
13587 INSERT_OPERAND (1, IMMJ, *ip, 0);
13588 continue;
13589 }
13590
13591 if (my_getSmallExpression (&ep, r, s) > 0
13592 || !expr_const_in_range (&ep, 0, 16, 2))
13593 break;
13594
13595 imm = ep.X_add_number >> 2;
13596 INSERT_OPERAND (1, IMMJ, *ip, imm);
13597 }
13598 s = expr_end;
13599 continue;
13600
13601 case 'L':
13602 {
13603 bfd_reloc_code_real_type r[3];
13604 expressionS ep;
13605 int imm;
13606
13607 /* Check whether there is only a single bracketed
13608 expression left. If so, it must be the base register
13609 and the constant must be zero. */
13610 if (*s == '(' && strchr (s + 1, '(') == 0)
13611 {
13612 INSERT_OPERAND (1, IMML, *ip, 0);
13613 continue;
13614 }
13615
13616 if (my_getSmallExpression (&ep, r, s) > 0
13617 || !expr_const_in_range (&ep, 0, 16, 0))
13618 break;
13619
13620 imm = ep.X_add_number;
13621 INSERT_OPERAND (1, IMML, *ip, imm);
13622 }
13623 s = expr_end;
13624 continue;
13625
13626 case 'M':
13627 {
13628 bfd_reloc_code_real_type r[3];
13629 expressionS ep;
13630 int imm;
13631
13632 if (my_getSmallExpression (&ep, r, s) > 0
13633 || !expr_const_in_range (&ep, 1, 9, 0))
13634 break;
13635
13636 imm = ep.X_add_number & 7;
13637 INSERT_OPERAND (1, IMMM, *ip, imm);
13638 }
13639 s = expr_end;
13640 continue;
13641
13642 case 'N': /* Register list for lwm and swm. */
13643 {
13644 /* A comma-separated list of registers and/or
13645 dash-separated contiguous ranges including
13646 both ra and a set of one or more registers
13647 starting at s0 up to s3 which have to be
13648 consecutive, e.g.:
13649
13650 s0, ra
13651 s0, s1, ra, s2, s3
13652 s0-s2, ra
13653
13654 and any permutations of these. */
13655 unsigned int reglist;
13656 int imm;
13657
13658 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13659 break;
13660
13661 if ((reglist & 0xfff1ffff) != 0x80010000)
13662 break;
13663
13664 reglist = (reglist >> 17) & 7;
13665 reglist += 1;
13666 if ((reglist & -reglist) != reglist)
13667 break;
13668
13669 imm = ffs (reglist) - 1;
13670 INSERT_OPERAND (1, IMMN, *ip, imm);
13671 }
13672 continue;
13673
13674 case 'O': /* sdbbp 4-bit code. */
13675 {
13676 bfd_reloc_code_real_type r[3];
13677 expressionS ep;
13678 int imm;
13679
13680 if (my_getSmallExpression (&ep, r, s) > 0
13681 || !expr_const_in_range (&ep, 0, 16, 0))
13682 break;
13683
13684 imm = ep.X_add_number;
13685 INSERT_OPERAND (1, IMMO, *ip, imm);
13686 }
13687 s = expr_end;
13688 continue;
13689
13690 case 'P':
13691 {
13692 bfd_reloc_code_real_type r[3];
13693 expressionS ep;
13694 int imm;
13695
13696 if (my_getSmallExpression (&ep, r, s) > 0
13697 || !expr_const_in_range (&ep, 0, 32, 2))
13698 break;
13699
13700 imm = ep.X_add_number >> 2;
13701 INSERT_OPERAND (1, IMMP, *ip, imm);
13702 }
13703 s = expr_end;
13704 continue;
13705
13706 case 'Q':
13707 {
13708 bfd_reloc_code_real_type r[3];
13709 expressionS ep;
13710 int imm;
13711
13712 if (my_getSmallExpression (&ep, r, s) > 0
13713 || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13714 break;
13715
13716 imm = ep.X_add_number >> 2;
13717 INSERT_OPERAND (1, IMMQ, *ip, imm);
13718 }
13719 s = expr_end;
13720 continue;
13721
13722 case 'U':
13723 {
13724 bfd_reloc_code_real_type r[3];
13725 expressionS ep;
13726 int imm;
13727
13728 /* Check whether there is only a single bracketed
13729 expression left. If so, it must be the base register
13730 and the constant must be zero. */
13731 if (*s == '(' && strchr (s + 1, '(') == 0)
13732 {
13733 INSERT_OPERAND (1, IMMU, *ip, 0);
13734 continue;
13735 }
13736
13737 if (my_getSmallExpression (&ep, r, s) > 0
13738 || !expr_const_in_range (&ep, 0, 32, 2))
13739 break;
13740
13741 imm = ep.X_add_number >> 2;
13742 INSERT_OPERAND (1, IMMU, *ip, imm);
13743 }
13744 s = expr_end;
13745 continue;
13746
13747 case 'W':
13748 {
13749 bfd_reloc_code_real_type r[3];
13750 expressionS ep;
13751 int imm;
13752
13753 if (my_getSmallExpression (&ep, r, s) > 0
13754 || !expr_const_in_range (&ep, 0, 64, 2))
13755 break;
13756
13757 imm = ep.X_add_number >> 2;
13758 INSERT_OPERAND (1, IMMW, *ip, imm);
13759 }
13760 s = expr_end;
13761 continue;
13762
13763 case 'X':
13764 {
13765 bfd_reloc_code_real_type r[3];
13766 expressionS ep;
13767 int imm;
13768
13769 if (my_getSmallExpression (&ep, r, s) > 0
13770 || !expr_const_in_range (&ep, -8, 8, 0))
13771 break;
13772
13773 imm = ep.X_add_number;
13774 INSERT_OPERAND (1, IMMX, *ip, imm);
13775 }
13776 s = expr_end;
13777 continue;
13778
13779 case 'Y':
13780 {
13781 bfd_reloc_code_real_type r[3];
13782 expressionS ep;
13783 int imm;
13784
13785 if (my_getSmallExpression (&ep, r, s) > 0
13786 || expr_const_in_range (&ep, -2, 2, 2)
13787 || !expr_const_in_range (&ep, -258, 258, 2))
13788 break;
13789
13790 imm = ep.X_add_number >> 2;
13791 imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13792 INSERT_OPERAND (1, IMMY, *ip, imm);
13793 }
13794 s = expr_end;
13795 continue;
13796
13797 case 'Z':
13798 {
13799 bfd_reloc_code_real_type r[3];
13800 expressionS ep;
13801
13802 if (my_getSmallExpression (&ep, r, s) > 0
13803 || !expr_const_in_range (&ep, 0, 1, 0))
13804 break;
13805 }
13806 s = expr_end;
13807 continue;
13808
13809 default:
13810 as_bad (_("Internal error: bad microMIPS opcode "
13811 "(unknown extension operand type `m%c'): %s %s"),
13812 *args, insn->name, insn->args);
13813 /* Further processing is fruitless. */
13814 return;
13815 }
13816 break;
13817
13818 case 'n': /* Register list for 32-bit lwm and swm. */
13819 gas_assert (mips_opts.micromips);
13820 {
13821 /* A comma-separated list of registers and/or
13822 dash-separated contiguous ranges including
13823 at least one of ra and a set of one or more
13824 registers starting at s0 up to s7 and then
13825 s8 which have to be consecutive, e.g.:
13826
13827 ra
13828 s0
13829 ra, s0, s1, s2
13830 s0-s8
13831 s0-s5, ra
13832
13833 and any permutations of these. */
13834 unsigned int reglist;
13835 int imm;
13836 int ra;
13837
13838 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13839 break;
13840
13841 if ((reglist & 0x3f00ffff) != 0)
13842 break;
13843
13844 ra = (reglist >> 27) & 0x10;
13845 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13846 reglist += 1;
13847 if ((reglist & -reglist) != reglist)
13848 break;
13849
13850 imm = (ffs (reglist) - 1) | ra;
13851 INSERT_OPERAND (1, RT, *ip, imm);
13852 imm_expr.X_op = O_absent;
13853 }
13854 continue;
13855
13856 case '|': /* 4-bit trap code. */
13857 gas_assert (mips_opts.micromips);
13858 my_getExpression (&imm_expr, s);
13859 check_absolute_expr (ip, &imm_expr);
13860 if ((unsigned long) imm_expr.X_add_number
13861 > MICROMIPSOP_MASK_TRAP)
13862 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13863 (unsigned long) imm_expr.X_add_number,
13864 ip->insn_mo->name);
13865 INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13866 imm_expr.X_op = O_absent;
13867 s = expr_end;
13868 continue;
13869
13870 default:
13871 as_bad (_("Bad char = '%c'\n"), *args);
13872 abort ();
13873 }
13874 break;
13875 }
13876 /* Args don't match. */
13877 s = argsStart;
13878 insn_error = _("Illegal operands");
13879 if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13880 {
13881 ++insn;
13882 continue;
13883 }
13884 else if (wrong_delay_slot_insns && need_delay_slot_ok)
13885 {
13886 gas_assert (firstinsn);
13887 need_delay_slot_ok = FALSE;
13888 past = insn + 1;
13889 insn = firstinsn;
13890 continue;
13891 }
13892 return;
13893 }
13894 }
13895
13896 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13897
13898 /* This routine assembles an instruction into its binary format when
13899 assembling for the mips16. As a side effect, it sets one of the
13900 global variables imm_reloc or offset_reloc to the type of relocation
13901 to do if one of the operands is an address expression. It also sets
13902 forced_insn_length to the resulting instruction size in bytes if the
13903 user explicitly requested a small or extended instruction. */
13904
13905 static void
13906 mips16_ip (char *str, struct mips_cl_insn *ip)
13907 {
13908 char *s;
13909 const char *args;
13910 struct mips_opcode *insn;
13911 char *argsstart;
13912 unsigned int regno;
13913 unsigned int lastregno = 0;
13914 char *s_reset;
13915 size_t i;
13916
13917 insn_error = NULL;
13918
13919 forced_insn_length = 0;
13920
13921 for (s = str; ISLOWER (*s); ++s)
13922 ;
13923 switch (*s)
13924 {
13925 case '\0':
13926 break;
13927
13928 case ' ':
13929 *s++ = '\0';
13930 break;
13931
13932 case '.':
13933 if (s[1] == 't' && s[2] == ' ')
13934 {
13935 *s = '\0';
13936 forced_insn_length = 2;
13937 s += 3;
13938 break;
13939 }
13940 else if (s[1] == 'e' && s[2] == ' ')
13941 {
13942 *s = '\0';
13943 forced_insn_length = 4;
13944 s += 3;
13945 break;
13946 }
13947 /* Fall through. */
13948 default:
13949 insn_error = _("unknown opcode");
13950 return;
13951 }
13952
13953 if (mips_opts.noautoextend && !forced_insn_length)
13954 forced_insn_length = 2;
13955
13956 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13957 {
13958 insn_error = _("unrecognized opcode");
13959 return;
13960 }
13961
13962 argsstart = s;
13963 for (;;)
13964 {
13965 bfd_boolean ok;
13966
13967 gas_assert (strcmp (insn->name, str) == 0);
13968
13969 ok = is_opcode_valid_16 (insn);
13970 if (! ok)
13971 {
13972 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13973 && strcmp (insn->name, insn[1].name) == 0)
13974 {
13975 ++insn;
13976 continue;
13977 }
13978 else
13979 {
13980 if (!insn_error)
13981 {
13982 static char buf[100];
13983 sprintf (buf,
13984 _("Opcode not supported on this processor: %s (%s)"),
13985 mips_cpu_info_from_arch (mips_opts.arch)->name,
13986 mips_cpu_info_from_isa (mips_opts.isa)->name);
13987 insn_error = buf;
13988 }
13989 return;
13990 }
13991 }
13992
13993 create_insn (ip, insn);
13994 imm_expr.X_op = O_absent;
13995 imm_reloc[0] = BFD_RELOC_UNUSED;
13996 imm_reloc[1] = BFD_RELOC_UNUSED;
13997 imm_reloc[2] = BFD_RELOC_UNUSED;
13998 imm2_expr.X_op = O_absent;
13999 offset_expr.X_op = O_absent;
14000 offset_reloc[0] = BFD_RELOC_UNUSED;
14001 offset_reloc[1] = BFD_RELOC_UNUSED;
14002 offset_reloc[2] = BFD_RELOC_UNUSED;
14003 for (args = insn->args; 1; ++args)
14004 {
14005 int c;
14006
14007 if (*s == ' ')
14008 ++s;
14009
14010 /* In this switch statement we call break if we did not find
14011 a match, continue if we did find a match, or return if we
14012 are done. */
14013
14014 c = *args;
14015 switch (c)
14016 {
14017 case '\0':
14018 if (*s == '\0')
14019 {
14020 offsetT value;
14021
14022 /* Stuff the immediate value in now, if we can. */
14023 if (imm_expr.X_op == O_constant
14024 && *imm_reloc > BFD_RELOC_UNUSED
14025 && insn->pinfo != INSN_MACRO
14026 && calculate_reloc (*offset_reloc,
14027 imm_expr.X_add_number, &value))
14028 {
14029 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
14030 *offset_reloc, value, forced_insn_length,
14031 &ip->insn_opcode);
14032 imm_expr.X_op = O_absent;
14033 *imm_reloc = BFD_RELOC_UNUSED;
14034 *offset_reloc = BFD_RELOC_UNUSED;
14035 }
14036
14037 return;
14038 }
14039 break;
14040
14041 case ',':
14042 if (*s++ == c)
14043 continue;
14044 s--;
14045 switch (*++args)
14046 {
14047 case 'v':
14048 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14049 continue;
14050 case 'w':
14051 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14052 continue;
14053 }
14054 break;
14055
14056 case '(':
14057 case ')':
14058 if (*s++ == c)
14059 continue;
14060 break;
14061
14062 case 'v':
14063 case 'w':
14064 if (s[0] != '$')
14065 {
14066 if (c == 'v')
14067 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14068 else
14069 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14070 ++args;
14071 continue;
14072 }
14073 /* Fall through. */
14074 case 'x':
14075 case 'y':
14076 case 'z':
14077 case 'Z':
14078 case '0':
14079 case 'S':
14080 case 'R':
14081 case 'X':
14082 case 'Y':
14083 s_reset = s;
14084 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
14085 {
14086 if (c == 'v' || c == 'w')
14087 {
14088 if (c == 'v')
14089 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14090 else
14091 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14092 ++args;
14093 continue;
14094 }
14095 break;
14096 }
14097
14098 if (*s == ' ')
14099 ++s;
14100 if (args[1] != *s)
14101 {
14102 if (c == 'v' || c == 'w')
14103 {
14104 regno = mips16_to_32_reg_map[lastregno];
14105 s = s_reset;
14106 ++args;
14107 }
14108 }
14109
14110 switch (c)
14111 {
14112 case 'x':
14113 case 'y':
14114 case 'z':
14115 case 'v':
14116 case 'w':
14117 case 'Z':
14118 regno = mips32_to_16_reg_map[regno];
14119 break;
14120
14121 case '0':
14122 if (regno != 0)
14123 regno = ILLEGAL_REG;
14124 break;
14125
14126 case 'S':
14127 if (regno != SP)
14128 regno = ILLEGAL_REG;
14129 break;
14130
14131 case 'R':
14132 if (regno != RA)
14133 regno = ILLEGAL_REG;
14134 break;
14135
14136 case 'X':
14137 case 'Y':
14138 if (regno == AT && mips_opts.at)
14139 {
14140 if (mips_opts.at == ATREG)
14141 as_warn (_("used $at without \".set noat\""));
14142 else
14143 as_warn (_("used $%u with \".set at=$%u\""),
14144 regno, mips_opts.at);
14145 }
14146 break;
14147
14148 default:
14149 abort ();
14150 }
14151
14152 if (regno == ILLEGAL_REG)
14153 break;
14154
14155 switch (c)
14156 {
14157 case 'x':
14158 case 'v':
14159 MIPS16_INSERT_OPERAND (RX, *ip, regno);
14160 break;
14161 case 'y':
14162 case 'w':
14163 MIPS16_INSERT_OPERAND (RY, *ip, regno);
14164 break;
14165 case 'z':
14166 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
14167 break;
14168 case 'Z':
14169 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
14170 case '0':
14171 case 'S':
14172 case 'R':
14173 break;
14174 case 'X':
14175 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
14176 break;
14177 case 'Y':
14178 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
14179 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
14180 break;
14181 default:
14182 abort ();
14183 }
14184
14185 lastregno = regno;
14186 continue;
14187
14188 case 'P':
14189 if (strncmp (s, "$pc", 3) == 0)
14190 {
14191 s += 3;
14192 continue;
14193 }
14194 break;
14195
14196 case '5':
14197 case 'H':
14198 case 'W':
14199 case 'D':
14200 case 'j':
14201 case 'V':
14202 case 'C':
14203 case 'U':
14204 case 'k':
14205 case 'K':
14206 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
14207 if (i > 0)
14208 {
14209 if (imm_expr.X_op != O_constant)
14210 {
14211 forced_insn_length = 4;
14212 ip->insn_opcode |= MIPS16_EXTEND;
14213 }
14214 else
14215 {
14216 /* We need to relax this instruction. */
14217 *offset_reloc = *imm_reloc;
14218 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14219 }
14220 s = expr_end;
14221 continue;
14222 }
14223 *imm_reloc = BFD_RELOC_UNUSED;
14224 /* Fall through. */
14225 case '<':
14226 case '>':
14227 case '[':
14228 case ']':
14229 case '4':
14230 case '8':
14231 my_getExpression (&imm_expr, s);
14232 if (imm_expr.X_op == O_register)
14233 {
14234 /* What we thought was an expression turned out to
14235 be a register. */
14236
14237 if (s[0] == '(' && args[1] == '(')
14238 {
14239 /* It looks like the expression was omitted
14240 before a register indirection, which means
14241 that the expression is implicitly zero. We
14242 still set up imm_expr, so that we handle
14243 explicit extensions correctly. */
14244 imm_expr.X_op = O_constant;
14245 imm_expr.X_add_number = 0;
14246 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14247 continue;
14248 }
14249
14250 break;
14251 }
14252
14253 /* We need to relax this instruction. */
14254 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14255 s = expr_end;
14256 continue;
14257
14258 case 'p':
14259 case 'q':
14260 case 'A':
14261 case 'B':
14262 case 'E':
14263 /* We use offset_reloc rather than imm_reloc for the PC
14264 relative operands. This lets macros with both
14265 immediate and address operands work correctly. */
14266 my_getExpression (&offset_expr, s);
14267
14268 if (offset_expr.X_op == O_register)
14269 break;
14270
14271 /* We need to relax this instruction. */
14272 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
14273 s = expr_end;
14274 continue;
14275
14276 case '6': /* break code */
14277 my_getExpression (&imm_expr, s);
14278 check_absolute_expr (ip, &imm_expr);
14279 if ((unsigned long) imm_expr.X_add_number > 63)
14280 as_warn (_("Invalid value for `%s' (%lu)"),
14281 ip->insn_mo->name,
14282 (unsigned long) imm_expr.X_add_number);
14283 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
14284 imm_expr.X_op = O_absent;
14285 s = expr_end;
14286 continue;
14287
14288 case 'a': /* 26 bit address */
14289 case 'i':
14290 my_getExpression (&offset_expr, s);
14291 s = expr_end;
14292 *offset_reloc = BFD_RELOC_MIPS16_JMP;
14293 ip->insn_opcode <<= 16;
14294 continue;
14295
14296 case 'l': /* register list for entry macro */
14297 case 'L': /* register list for exit macro */
14298 {
14299 int mask;
14300
14301 if (c == 'l')
14302 mask = 0;
14303 else
14304 mask = 7 << 3;
14305 while (*s != '\0')
14306 {
14307 unsigned int freg, reg1, reg2;
14308
14309 while (*s == ' ' || *s == ',')
14310 ++s;
14311 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14312 freg = 0;
14313 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
14314 freg = 1;
14315 else
14316 {
14317 as_bad (_("can't parse register list"));
14318 break;
14319 }
14320 if (*s == ' ')
14321 ++s;
14322 if (*s != '-')
14323 reg2 = reg1;
14324 else
14325 {
14326 ++s;
14327 if (!reg_lookup (&s, freg ? RTYPE_FPU
14328 : (RTYPE_GP | RTYPE_NUM), &reg2))
14329 {
14330 as_bad (_("invalid register list"));
14331 break;
14332 }
14333 }
14334 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
14335 {
14336 mask &= ~ (7 << 3);
14337 mask |= 5 << 3;
14338 }
14339 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
14340 {
14341 mask &= ~ (7 << 3);
14342 mask |= 6 << 3;
14343 }
14344 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
14345 mask |= (reg2 - 3) << 3;
14346 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
14347 mask |= (reg2 - 15) << 1;
14348 else if (reg1 == RA && reg2 == RA)
14349 mask |= 1;
14350 else
14351 {
14352 as_bad (_("invalid register list"));
14353 break;
14354 }
14355 }
14356 /* The mask is filled in in the opcode table for the
14357 benefit of the disassembler. We remove it before
14358 applying the actual mask. */
14359 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
14360 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
14361 }
14362 continue;
14363
14364 case 'm': /* Register list for save insn. */
14365 case 'M': /* Register list for restore insn. */
14366 {
14367 int opcode = ip->insn_opcode;
14368 int framesz = 0, seen_framesz = 0;
14369 int nargs = 0, statics = 0, sregs = 0;
14370
14371 while (*s != '\0')
14372 {
14373 unsigned int reg1, reg2;
14374
14375 SKIP_SPACE_TABS (s);
14376 while (*s == ',')
14377 ++s;
14378 SKIP_SPACE_TABS (s);
14379
14380 my_getExpression (&imm_expr, s);
14381 if (imm_expr.X_op == O_constant)
14382 {
14383 /* Handle the frame size. */
14384 if (seen_framesz)
14385 {
14386 as_bad (_("more than one frame size in list"));
14387 break;
14388 }
14389 seen_framesz = 1;
14390 framesz = imm_expr.X_add_number;
14391 imm_expr.X_op = O_absent;
14392 s = expr_end;
14393 continue;
14394 }
14395
14396 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14397 {
14398 as_bad (_("can't parse register list"));
14399 break;
14400 }
14401
14402 while (*s == ' ')
14403 ++s;
14404
14405 if (*s != '-')
14406 reg2 = reg1;
14407 else
14408 {
14409 ++s;
14410 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
14411 || reg2 < reg1)
14412 {
14413 as_bad (_("can't parse register list"));
14414 break;
14415 }
14416 }
14417
14418 while (reg1 <= reg2)
14419 {
14420 if (reg1 >= 4 && reg1 <= 7)
14421 {
14422 if (!seen_framesz)
14423 /* args $a0-$a3 */
14424 nargs |= 1 << (reg1 - 4);
14425 else
14426 /* statics $a0-$a3 */
14427 statics |= 1 << (reg1 - 4);
14428 }
14429 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
14430 {
14431 /* $s0-$s8 */
14432 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
14433 }
14434 else if (reg1 == 31)
14435 {
14436 /* Add $ra to insn. */
14437 opcode |= 0x40;
14438 }
14439 else
14440 {
14441 as_bad (_("unexpected register in list"));
14442 break;
14443 }
14444 if (++reg1 == 24)
14445 reg1 = 30;
14446 }
14447 }
14448
14449 /* Encode args/statics combination. */
14450 if (nargs & statics)
14451 as_bad (_("arg/static registers overlap"));
14452 else if (nargs == 0xf)
14453 /* All $a0-$a3 are args. */
14454 opcode |= MIPS16_ALL_ARGS << 16;
14455 else if (statics == 0xf)
14456 /* All $a0-$a3 are statics. */
14457 opcode |= MIPS16_ALL_STATICS << 16;
14458 else
14459 {
14460 int narg = 0, nstat = 0;
14461
14462 /* Count arg registers. */
14463 while (nargs & 0x1)
14464 {
14465 nargs >>= 1;
14466 narg++;
14467 }
14468 if (nargs != 0)
14469 as_bad (_("invalid arg register list"));
14470
14471 /* Count static registers. */
14472 while (statics & 0x8)
14473 {
14474 statics = (statics << 1) & 0xf;
14475 nstat++;
14476 }
14477 if (statics != 0)
14478 as_bad (_("invalid static register list"));
14479
14480 /* Encode args/statics. */
14481 opcode |= ((narg << 2) | nstat) << 16;
14482 }
14483
14484 /* Encode $s0/$s1. */
14485 if (sregs & (1 << 0)) /* $s0 */
14486 opcode |= 0x20;
14487 if (sregs & (1 << 1)) /* $s1 */
14488 opcode |= 0x10;
14489 sregs >>= 2;
14490
14491 if (sregs != 0)
14492 {
14493 /* Count regs $s2-$s8. */
14494 int nsreg = 0;
14495 while (sregs & 1)
14496 {
14497 sregs >>= 1;
14498 nsreg++;
14499 }
14500 if (sregs != 0)
14501 as_bad (_("invalid static register list"));
14502 /* Encode $s2-$s8. */
14503 opcode |= nsreg << 24;
14504 }
14505
14506 /* Encode frame size. */
14507 if (!seen_framesz)
14508 as_bad (_("missing frame size"));
14509 else if ((framesz & 7) != 0 || framesz < 0
14510 || framesz > 0xff * 8)
14511 as_bad (_("invalid frame size"));
14512 else if (framesz != 128 || (opcode >> 16) != 0)
14513 {
14514 framesz /= 8;
14515 opcode |= (((framesz & 0xf0) << 16)
14516 | (framesz & 0x0f));
14517 }
14518
14519 /* Finally build the instruction. */
14520 if ((opcode >> 16) != 0 || framesz == 0)
14521 opcode |= MIPS16_EXTEND;
14522 ip->insn_opcode = opcode;
14523 }
14524 continue;
14525
14526 case 'e': /* extend code */
14527 my_getExpression (&imm_expr, s);
14528 check_absolute_expr (ip, &imm_expr);
14529 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14530 {
14531 as_warn (_("Invalid value for `%s' (%lu)"),
14532 ip->insn_mo->name,
14533 (unsigned long) imm_expr.X_add_number);
14534 imm_expr.X_add_number &= 0x7ff;
14535 }
14536 ip->insn_opcode |= imm_expr.X_add_number;
14537 imm_expr.X_op = O_absent;
14538 s = expr_end;
14539 continue;
14540
14541 default:
14542 abort ();
14543 }
14544 break;
14545 }
14546
14547 /* Args don't match. */
14548 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14549 strcmp (insn->name, insn[1].name) == 0)
14550 {
14551 ++insn;
14552 s = argsstart;
14553 continue;
14554 }
14555
14556 insn_error = _("illegal operands");
14557
14558 return;
14559 }
14560 }
14561
14562 /* This structure holds information we know about a mips16 immediate
14563 argument type. */
14564
14565 struct mips16_immed_operand
14566 {
14567 /* The type code used in the argument string in the opcode table. */
14568 int type;
14569 /* The number of bits in the short form of the opcode. */
14570 int nbits;
14571 /* The number of bits in the extended form of the opcode. */
14572 int extbits;
14573 /* The amount by which the short form is shifted when it is used;
14574 for example, the sw instruction has a shift count of 2. */
14575 int shift;
14576 /* The amount by which the short form is shifted when it is stored
14577 into the instruction code. */
14578 int op_shift;
14579 /* Non-zero if the short form is unsigned. */
14580 int unsp;
14581 /* Non-zero if the extended form is unsigned. */
14582 int extu;
14583 /* Non-zero if the value is PC relative. */
14584 int pcrel;
14585 };
14586
14587 /* The mips16 immediate operand types. */
14588
14589 static const struct mips16_immed_operand mips16_immed_operands[] =
14590 {
14591 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14592 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14593 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14594 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14595 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14596 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14597 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14598 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14599 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14600 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14601 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14602 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14603 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14604 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14605 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14606 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14607 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14608 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14609 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14610 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14611 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14612 };
14613
14614 #define MIPS16_NUM_IMMED \
14615 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14616
14617 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14618 NBITS is the number of significant bits in VAL. */
14619
14620 static unsigned long
14621 mips16_immed_extend (offsetT val, unsigned int nbits)
14622 {
14623 int extval;
14624 if (nbits == 16)
14625 {
14626 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14627 val &= 0x1f;
14628 }
14629 else if (nbits == 15)
14630 {
14631 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14632 val &= 0xf;
14633 }
14634 else
14635 {
14636 extval = ((val & 0x1f) << 6) | (val & 0x20);
14637 val = 0;
14638 }
14639 return (extval << 16) | val;
14640 }
14641
14642 /* Install immediate value VAL into MIPS16 instruction *INSN,
14643 extending it if necessary. The instruction in *INSN may
14644 already be extended.
14645
14646 RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14647 if none. In the former case, VAL is a 16-bit number with no
14648 defined signedness.
14649
14650 TYPE is the type of the immediate field. USER_INSN_LENGTH
14651 is the length that the user requested, or 0 if none. */
14652
14653 static void
14654 mips16_immed (char *file, unsigned int line, int type,
14655 bfd_reloc_code_real_type reloc, offsetT val,
14656 unsigned int user_insn_length, unsigned long *insn)
14657 {
14658 const struct mips16_immed_operand *op;
14659 int mintiny, maxtiny;
14660
14661 op = mips16_immed_operands;
14662 while (op->type != type)
14663 {
14664 ++op;
14665 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14666 }
14667
14668 if (op->unsp)
14669 {
14670 if (type == '<' || type == '>' || type == '[' || type == ']')
14671 {
14672 mintiny = 1;
14673 maxtiny = 1 << op->nbits;
14674 }
14675 else
14676 {
14677 mintiny = 0;
14678 maxtiny = (1 << op->nbits) - 1;
14679 }
14680 if (reloc != BFD_RELOC_UNUSED)
14681 val &= 0xffff;
14682 }
14683 else
14684 {
14685 mintiny = - (1 << (op->nbits - 1));
14686 maxtiny = (1 << (op->nbits - 1)) - 1;
14687 if (reloc != BFD_RELOC_UNUSED)
14688 val = SEXT_16BIT (val);
14689 }
14690
14691 /* Branch offsets have an implicit 0 in the lowest bit. */
14692 if (type == 'p' || type == 'q')
14693 val /= 2;
14694
14695 if ((val & ((1 << op->shift) - 1)) != 0
14696 || val < (mintiny << op->shift)
14697 || val > (maxtiny << op->shift))
14698 {
14699 /* We need an extended instruction. */
14700 if (user_insn_length == 2)
14701 as_bad_where (file, line, _("invalid unextended operand value"));
14702 else
14703 *insn |= MIPS16_EXTEND;
14704 }
14705 else if (user_insn_length == 4)
14706 {
14707 /* The operand doesn't force an unextended instruction to be extended.
14708 Warn if the user wanted an extended instruction anyway. */
14709 *insn |= MIPS16_EXTEND;
14710 as_warn_where (file, line,
14711 _("extended operand requested but not required"));
14712 }
14713
14714 if (mips16_opcode_length (*insn) == 2)
14715 {
14716 int insnval;
14717
14718 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14719 insnval <<= op->op_shift;
14720 *insn |= insnval;
14721 }
14722 else
14723 {
14724 long minext, maxext;
14725
14726 if (reloc == BFD_RELOC_UNUSED)
14727 {
14728 if (op->extu)
14729 {
14730 minext = 0;
14731 maxext = (1 << op->extbits) - 1;
14732 }
14733 else
14734 {
14735 minext = - (1 << (op->extbits - 1));
14736 maxext = (1 << (op->extbits - 1)) - 1;
14737 }
14738 if (val < minext || val > maxext)
14739 as_bad_where (file, line,
14740 _("operand value out of range for instruction"));
14741 }
14742
14743 *insn |= mips16_immed_extend (val, op->extbits);
14744 }
14745 }
14746 \f
14747 struct percent_op_match
14748 {
14749 const char *str;
14750 bfd_reloc_code_real_type reloc;
14751 };
14752
14753 static const struct percent_op_match mips_percent_op[] =
14754 {
14755 {"%lo", BFD_RELOC_LO16},
14756 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14757 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14758 {"%call16", BFD_RELOC_MIPS_CALL16},
14759 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14760 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14761 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14762 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14763 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14764 {"%got", BFD_RELOC_MIPS_GOT16},
14765 {"%gp_rel", BFD_RELOC_GPREL16},
14766 {"%half", BFD_RELOC_16},
14767 {"%highest", BFD_RELOC_MIPS_HIGHEST},
14768 {"%higher", BFD_RELOC_MIPS_HIGHER},
14769 {"%neg", BFD_RELOC_MIPS_SUB},
14770 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14771 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14772 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14773 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14774 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14775 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14776 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14777 {"%hi", BFD_RELOC_HI16_S}
14778 };
14779
14780 static const struct percent_op_match mips16_percent_op[] =
14781 {
14782 {"%lo", BFD_RELOC_MIPS16_LO16},
14783 {"%gprel", BFD_RELOC_MIPS16_GPREL},
14784 {"%got", BFD_RELOC_MIPS16_GOT16},
14785 {"%call16", BFD_RELOC_MIPS16_CALL16},
14786 {"%hi", BFD_RELOC_MIPS16_HI16_S},
14787 {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14788 {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14789 {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14790 {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14791 {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14792 {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14793 {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14794 };
14795
14796
14797 /* Return true if *STR points to a relocation operator. When returning true,
14798 move *STR over the operator and store its relocation code in *RELOC.
14799 Leave both *STR and *RELOC alone when returning false. */
14800
14801 static bfd_boolean
14802 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14803 {
14804 const struct percent_op_match *percent_op;
14805 size_t limit, i;
14806
14807 if (mips_opts.mips16)
14808 {
14809 percent_op = mips16_percent_op;
14810 limit = ARRAY_SIZE (mips16_percent_op);
14811 }
14812 else
14813 {
14814 percent_op = mips_percent_op;
14815 limit = ARRAY_SIZE (mips_percent_op);
14816 }
14817
14818 for (i = 0; i < limit; i++)
14819 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14820 {
14821 int len = strlen (percent_op[i].str);
14822
14823 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14824 continue;
14825
14826 *str += strlen (percent_op[i].str);
14827 *reloc = percent_op[i].reloc;
14828
14829 /* Check whether the output BFD supports this relocation.
14830 If not, issue an error and fall back on something safe. */
14831 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14832 {
14833 as_bad (_("relocation %s isn't supported by the current ABI"),
14834 percent_op[i].str);
14835 *reloc = BFD_RELOC_UNUSED;
14836 }
14837 return TRUE;
14838 }
14839 return FALSE;
14840 }
14841
14842
14843 /* Parse string STR as a 16-bit relocatable operand. Store the
14844 expression in *EP and the relocations in the array starting
14845 at RELOC. Return the number of relocation operators used.
14846
14847 On exit, EXPR_END points to the first character after the expression. */
14848
14849 static size_t
14850 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14851 char *str)
14852 {
14853 bfd_reloc_code_real_type reversed_reloc[3];
14854 size_t reloc_index, i;
14855 int crux_depth, str_depth;
14856 char *crux;
14857
14858 /* Search for the start of the main expression, recoding relocations
14859 in REVERSED_RELOC. End the loop with CRUX pointing to the start
14860 of the main expression and with CRUX_DEPTH containing the number
14861 of open brackets at that point. */
14862 reloc_index = -1;
14863 str_depth = 0;
14864 do
14865 {
14866 reloc_index++;
14867 crux = str;
14868 crux_depth = str_depth;
14869
14870 /* Skip over whitespace and brackets, keeping count of the number
14871 of brackets. */
14872 while (*str == ' ' || *str == '\t' || *str == '(')
14873 if (*str++ == '(')
14874 str_depth++;
14875 }
14876 while (*str == '%'
14877 && reloc_index < (HAVE_NEWABI ? 3 : 1)
14878 && parse_relocation (&str, &reversed_reloc[reloc_index]));
14879
14880 my_getExpression (ep, crux);
14881 str = expr_end;
14882
14883 /* Match every open bracket. */
14884 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14885 if (*str++ == ')')
14886 crux_depth--;
14887
14888 if (crux_depth > 0)
14889 as_bad (_("unclosed '('"));
14890
14891 expr_end = str;
14892
14893 if (reloc_index != 0)
14894 {
14895 prev_reloc_op_frag = frag_now;
14896 for (i = 0; i < reloc_index; i++)
14897 reloc[i] = reversed_reloc[reloc_index - 1 - i];
14898 }
14899
14900 return reloc_index;
14901 }
14902
14903 static void
14904 my_getExpression (expressionS *ep, char *str)
14905 {
14906 char *save_in;
14907
14908 save_in = input_line_pointer;
14909 input_line_pointer = str;
14910 expression (ep);
14911 expr_end = input_line_pointer;
14912 input_line_pointer = save_in;
14913 }
14914
14915 char *
14916 md_atof (int type, char *litP, int *sizeP)
14917 {
14918 return ieee_md_atof (type, litP, sizeP, target_big_endian);
14919 }
14920
14921 void
14922 md_number_to_chars (char *buf, valueT val, int n)
14923 {
14924 if (target_big_endian)
14925 number_to_chars_bigendian (buf, val, n);
14926 else
14927 number_to_chars_littleendian (buf, val, n);
14928 }
14929 \f
14930 static int support_64bit_objects(void)
14931 {
14932 const char **list, **l;
14933 int yes;
14934
14935 list = bfd_target_list ();
14936 for (l = list; *l != NULL; l++)
14937 if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14938 || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14939 break;
14940 yes = (*l != NULL);
14941 free (list);
14942 return yes;
14943 }
14944
14945 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14946 NEW_VALUE. Warn if another value was already specified. Note:
14947 we have to defer parsing the -march and -mtune arguments in order
14948 to handle 'from-abi' correctly, since the ABI might be specified
14949 in a later argument. */
14950
14951 static void
14952 mips_set_option_string (const char **string_ptr, const char *new_value)
14953 {
14954 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14955 as_warn (_("A different %s was already specified, is now %s"),
14956 string_ptr == &mips_arch_string ? "-march" : "-mtune",
14957 new_value);
14958
14959 *string_ptr = new_value;
14960 }
14961
14962 int
14963 md_parse_option (int c, char *arg)
14964 {
14965 unsigned int i;
14966
14967 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
14968 if (c == mips_ases[i].option_on || c == mips_ases[i].option_off)
14969 {
14970 file_ase_explicit |= mips_set_ase (&mips_ases[i],
14971 c == mips_ases[i].option_on);
14972 return 1;
14973 }
14974
14975 switch (c)
14976 {
14977 case OPTION_CONSTRUCT_FLOATS:
14978 mips_disable_float_construction = 0;
14979 break;
14980
14981 case OPTION_NO_CONSTRUCT_FLOATS:
14982 mips_disable_float_construction = 1;
14983 break;
14984
14985 case OPTION_TRAP:
14986 mips_trap = 1;
14987 break;
14988
14989 case OPTION_BREAK:
14990 mips_trap = 0;
14991 break;
14992
14993 case OPTION_EB:
14994 target_big_endian = 1;
14995 break;
14996
14997 case OPTION_EL:
14998 target_big_endian = 0;
14999 break;
15000
15001 case 'O':
15002 if (arg == NULL)
15003 mips_optimize = 1;
15004 else if (arg[0] == '0')
15005 mips_optimize = 0;
15006 else if (arg[0] == '1')
15007 mips_optimize = 1;
15008 else
15009 mips_optimize = 2;
15010 break;
15011
15012 case 'g':
15013 if (arg == NULL)
15014 mips_debug = 2;
15015 else
15016 mips_debug = atoi (arg);
15017 break;
15018
15019 case OPTION_MIPS1:
15020 file_mips_isa = ISA_MIPS1;
15021 break;
15022
15023 case OPTION_MIPS2:
15024 file_mips_isa = ISA_MIPS2;
15025 break;
15026
15027 case OPTION_MIPS3:
15028 file_mips_isa = ISA_MIPS3;
15029 break;
15030
15031 case OPTION_MIPS4:
15032 file_mips_isa = ISA_MIPS4;
15033 break;
15034
15035 case OPTION_MIPS5:
15036 file_mips_isa = ISA_MIPS5;
15037 break;
15038
15039 case OPTION_MIPS32:
15040 file_mips_isa = ISA_MIPS32;
15041 break;
15042
15043 case OPTION_MIPS32R2:
15044 file_mips_isa = ISA_MIPS32R2;
15045 break;
15046
15047 case OPTION_MIPS64R2:
15048 file_mips_isa = ISA_MIPS64R2;
15049 break;
15050
15051 case OPTION_MIPS64:
15052 file_mips_isa = ISA_MIPS64;
15053 break;
15054
15055 case OPTION_MTUNE:
15056 mips_set_option_string (&mips_tune_string, arg);
15057 break;
15058
15059 case OPTION_MARCH:
15060 mips_set_option_string (&mips_arch_string, arg);
15061 break;
15062
15063 case OPTION_M4650:
15064 mips_set_option_string (&mips_arch_string, "4650");
15065 mips_set_option_string (&mips_tune_string, "4650");
15066 break;
15067
15068 case OPTION_NO_M4650:
15069 break;
15070
15071 case OPTION_M4010:
15072 mips_set_option_string (&mips_arch_string, "4010");
15073 mips_set_option_string (&mips_tune_string, "4010");
15074 break;
15075
15076 case OPTION_NO_M4010:
15077 break;
15078
15079 case OPTION_M4100:
15080 mips_set_option_string (&mips_arch_string, "4100");
15081 mips_set_option_string (&mips_tune_string, "4100");
15082 break;
15083
15084 case OPTION_NO_M4100:
15085 break;
15086
15087 case OPTION_M3900:
15088 mips_set_option_string (&mips_arch_string, "3900");
15089 mips_set_option_string (&mips_tune_string, "3900");
15090 break;
15091
15092 case OPTION_NO_M3900:
15093 break;
15094
15095 case OPTION_MICROMIPS:
15096 if (mips_opts.mips16 == 1)
15097 {
15098 as_bad (_("-mmicromips cannot be used with -mips16"));
15099 return 0;
15100 }
15101 mips_opts.micromips = 1;
15102 mips_no_prev_insn ();
15103 break;
15104
15105 case OPTION_NO_MICROMIPS:
15106 mips_opts.micromips = 0;
15107 mips_no_prev_insn ();
15108 break;
15109
15110 case OPTION_MIPS16:
15111 if (mips_opts.micromips == 1)
15112 {
15113 as_bad (_("-mips16 cannot be used with -micromips"));
15114 return 0;
15115 }
15116 mips_opts.mips16 = 1;
15117 mips_no_prev_insn ();
15118 break;
15119
15120 case OPTION_NO_MIPS16:
15121 mips_opts.mips16 = 0;
15122 mips_no_prev_insn ();
15123 break;
15124
15125 case OPTION_FIX_24K:
15126 mips_fix_24k = 1;
15127 break;
15128
15129 case OPTION_NO_FIX_24K:
15130 mips_fix_24k = 0;
15131 break;
15132
15133 case OPTION_FIX_LOONGSON2F_JUMP:
15134 mips_fix_loongson2f_jump = TRUE;
15135 break;
15136
15137 case OPTION_NO_FIX_LOONGSON2F_JUMP:
15138 mips_fix_loongson2f_jump = FALSE;
15139 break;
15140
15141 case OPTION_FIX_LOONGSON2F_NOP:
15142 mips_fix_loongson2f_nop = TRUE;
15143 break;
15144
15145 case OPTION_NO_FIX_LOONGSON2F_NOP:
15146 mips_fix_loongson2f_nop = FALSE;
15147 break;
15148
15149 case OPTION_FIX_VR4120:
15150 mips_fix_vr4120 = 1;
15151 break;
15152
15153 case OPTION_NO_FIX_VR4120:
15154 mips_fix_vr4120 = 0;
15155 break;
15156
15157 case OPTION_FIX_VR4130:
15158 mips_fix_vr4130 = 1;
15159 break;
15160
15161 case OPTION_NO_FIX_VR4130:
15162 mips_fix_vr4130 = 0;
15163 break;
15164
15165 case OPTION_FIX_CN63XXP1:
15166 mips_fix_cn63xxp1 = TRUE;
15167 break;
15168
15169 case OPTION_NO_FIX_CN63XXP1:
15170 mips_fix_cn63xxp1 = FALSE;
15171 break;
15172
15173 case OPTION_RELAX_BRANCH:
15174 mips_relax_branch = 1;
15175 break;
15176
15177 case OPTION_NO_RELAX_BRANCH:
15178 mips_relax_branch = 0;
15179 break;
15180
15181 case OPTION_INSN32:
15182 mips_opts.insn32 = TRUE;
15183 break;
15184
15185 case OPTION_NO_INSN32:
15186 mips_opts.insn32 = FALSE;
15187 break;
15188
15189 case OPTION_MSHARED:
15190 mips_in_shared = TRUE;
15191 break;
15192
15193 case OPTION_MNO_SHARED:
15194 mips_in_shared = FALSE;
15195 break;
15196
15197 case OPTION_MSYM32:
15198 mips_opts.sym32 = TRUE;
15199 break;
15200
15201 case OPTION_MNO_SYM32:
15202 mips_opts.sym32 = FALSE;
15203 break;
15204
15205 /* When generating ELF code, we permit -KPIC and -call_shared to
15206 select SVR4_PIC, and -non_shared to select no PIC. This is
15207 intended to be compatible with Irix 5. */
15208 case OPTION_CALL_SHARED:
15209 mips_pic = SVR4_PIC;
15210 mips_abicalls = TRUE;
15211 break;
15212
15213 case OPTION_CALL_NONPIC:
15214 mips_pic = NO_PIC;
15215 mips_abicalls = TRUE;
15216 break;
15217
15218 case OPTION_NON_SHARED:
15219 mips_pic = NO_PIC;
15220 mips_abicalls = FALSE;
15221 break;
15222
15223 /* The -xgot option tells the assembler to use 32 bit offsets
15224 when accessing the got in SVR4_PIC mode. It is for Irix
15225 compatibility. */
15226 case OPTION_XGOT:
15227 mips_big_got = 1;
15228 break;
15229
15230 case 'G':
15231 g_switch_value = atoi (arg);
15232 g_switch_seen = 1;
15233 break;
15234
15235 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15236 and -mabi=64. */
15237 case OPTION_32:
15238 mips_abi = O32_ABI;
15239 break;
15240
15241 case OPTION_N32:
15242 mips_abi = N32_ABI;
15243 break;
15244
15245 case OPTION_64:
15246 mips_abi = N64_ABI;
15247 if (!support_64bit_objects())
15248 as_fatal (_("No compiled in support for 64 bit object file format"));
15249 break;
15250
15251 case OPTION_GP32:
15252 file_mips_gp32 = 1;
15253 break;
15254
15255 case OPTION_GP64:
15256 file_mips_gp32 = 0;
15257 break;
15258
15259 case OPTION_FP32:
15260 file_mips_fp32 = 1;
15261 break;
15262
15263 case OPTION_FP64:
15264 file_mips_fp32 = 0;
15265 break;
15266
15267 case OPTION_SINGLE_FLOAT:
15268 file_mips_single_float = 1;
15269 break;
15270
15271 case OPTION_DOUBLE_FLOAT:
15272 file_mips_single_float = 0;
15273 break;
15274
15275 case OPTION_SOFT_FLOAT:
15276 file_mips_soft_float = 1;
15277 break;
15278
15279 case OPTION_HARD_FLOAT:
15280 file_mips_soft_float = 0;
15281 break;
15282
15283 case OPTION_MABI:
15284 if (strcmp (arg, "32") == 0)
15285 mips_abi = O32_ABI;
15286 else if (strcmp (arg, "o64") == 0)
15287 mips_abi = O64_ABI;
15288 else if (strcmp (arg, "n32") == 0)
15289 mips_abi = N32_ABI;
15290 else if (strcmp (arg, "64") == 0)
15291 {
15292 mips_abi = N64_ABI;
15293 if (! support_64bit_objects())
15294 as_fatal (_("No compiled in support for 64 bit object file "
15295 "format"));
15296 }
15297 else if (strcmp (arg, "eabi") == 0)
15298 mips_abi = EABI_ABI;
15299 else
15300 {
15301 as_fatal (_("invalid abi -mabi=%s"), arg);
15302 return 0;
15303 }
15304 break;
15305
15306 case OPTION_M7000_HILO_FIX:
15307 mips_7000_hilo_fix = TRUE;
15308 break;
15309
15310 case OPTION_MNO_7000_HILO_FIX:
15311 mips_7000_hilo_fix = FALSE;
15312 break;
15313
15314 case OPTION_MDEBUG:
15315 mips_flag_mdebug = TRUE;
15316 break;
15317
15318 case OPTION_NO_MDEBUG:
15319 mips_flag_mdebug = FALSE;
15320 break;
15321
15322 case OPTION_PDR:
15323 mips_flag_pdr = TRUE;
15324 break;
15325
15326 case OPTION_NO_PDR:
15327 mips_flag_pdr = FALSE;
15328 break;
15329
15330 case OPTION_MVXWORKS_PIC:
15331 mips_pic = VXWORKS_PIC;
15332 break;
15333
15334 default:
15335 return 0;
15336 }
15337
15338 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15339
15340 return 1;
15341 }
15342 \f
15343 /* Set up globals to generate code for the ISA or processor
15344 described by INFO. */
15345
15346 static void
15347 mips_set_architecture (const struct mips_cpu_info *info)
15348 {
15349 if (info != 0)
15350 {
15351 file_mips_arch = info->cpu;
15352 mips_opts.arch = info->cpu;
15353 mips_opts.isa = info->isa;
15354 }
15355 }
15356
15357
15358 /* Likewise for tuning. */
15359
15360 static void
15361 mips_set_tune (const struct mips_cpu_info *info)
15362 {
15363 if (info != 0)
15364 mips_tune = info->cpu;
15365 }
15366
15367
15368 void
15369 mips_after_parse_args (void)
15370 {
15371 const struct mips_cpu_info *arch_info = 0;
15372 const struct mips_cpu_info *tune_info = 0;
15373
15374 /* GP relative stuff not working for PE */
15375 if (strncmp (TARGET_OS, "pe", 2) == 0)
15376 {
15377 if (g_switch_seen && g_switch_value != 0)
15378 as_bad (_("-G not supported in this configuration."));
15379 g_switch_value = 0;
15380 }
15381
15382 if (mips_abi == NO_ABI)
15383 mips_abi = MIPS_DEFAULT_ABI;
15384
15385 /* The following code determines the architecture and register size.
15386 Similar code was added to GCC 3.3 (see override_options() in
15387 config/mips/mips.c). The GAS and GCC code should be kept in sync
15388 as much as possible. */
15389
15390 if (mips_arch_string != 0)
15391 arch_info = mips_parse_cpu ("-march", mips_arch_string);
15392
15393 if (file_mips_isa != ISA_UNKNOWN)
15394 {
15395 /* Handle -mipsN. At this point, file_mips_isa contains the
15396 ISA level specified by -mipsN, while arch_info->isa contains
15397 the -march selection (if any). */
15398 if (arch_info != 0)
15399 {
15400 /* -march takes precedence over -mipsN, since it is more descriptive.
15401 There's no harm in specifying both as long as the ISA levels
15402 are the same. */
15403 if (file_mips_isa != arch_info->isa)
15404 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15405 mips_cpu_info_from_isa (file_mips_isa)->name,
15406 mips_cpu_info_from_isa (arch_info->isa)->name);
15407 }
15408 else
15409 arch_info = mips_cpu_info_from_isa (file_mips_isa);
15410 }
15411
15412 if (arch_info == 0)
15413 {
15414 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15415 gas_assert (arch_info);
15416 }
15417
15418 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15419 as_bad (_("-march=%s is not compatible with the selected ABI"),
15420 arch_info->name);
15421
15422 mips_set_architecture (arch_info);
15423
15424 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
15425 if (mips_tune_string != 0)
15426 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15427
15428 if (tune_info == 0)
15429 mips_set_tune (arch_info);
15430 else
15431 mips_set_tune (tune_info);
15432
15433 if (file_mips_gp32 >= 0)
15434 {
15435 /* The user specified the size of the integer registers. Make sure
15436 it agrees with the ABI and ISA. */
15437 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15438 as_bad (_("-mgp64 used with a 32-bit processor"));
15439 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15440 as_bad (_("-mgp32 used with a 64-bit ABI"));
15441 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15442 as_bad (_("-mgp64 used with a 32-bit ABI"));
15443 }
15444 else
15445 {
15446 /* Infer the integer register size from the ABI and processor.
15447 Restrict ourselves to 32-bit registers if that's all the
15448 processor has, or if the ABI cannot handle 64-bit registers. */
15449 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15450 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15451 }
15452
15453 switch (file_mips_fp32)
15454 {
15455 default:
15456 case -1:
15457 /* No user specified float register size.
15458 ??? GAS treats single-float processors as though they had 64-bit
15459 float registers (although it complains when double-precision
15460 instructions are used). As things stand, saying they have 32-bit
15461 registers would lead to spurious "register must be even" messages.
15462 So here we assume float registers are never smaller than the
15463 integer ones. */
15464 if (file_mips_gp32 == 0)
15465 /* 64-bit integer registers implies 64-bit float registers. */
15466 file_mips_fp32 = 0;
15467 else if ((mips_opts.ase & FP64_ASES)
15468 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15469 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
15470 file_mips_fp32 = 0;
15471 else
15472 /* 32-bit float registers. */
15473 file_mips_fp32 = 1;
15474 break;
15475
15476 /* The user specified the size of the float registers. Check if it
15477 agrees with the ABI and ISA. */
15478 case 0:
15479 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15480 as_bad (_("-mfp64 used with a 32-bit fpu"));
15481 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15482 && !ISA_HAS_MXHC1 (mips_opts.isa))
15483 as_warn (_("-mfp64 used with a 32-bit ABI"));
15484 break;
15485 case 1:
15486 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15487 as_warn (_("-mfp32 used with a 64-bit ABI"));
15488 break;
15489 }
15490
15491 /* End of GCC-shared inference code. */
15492
15493 /* This flag is set when we have a 64-bit capable CPU but use only
15494 32-bit wide registers. Note that EABI does not use it. */
15495 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15496 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15497 || mips_abi == O32_ABI))
15498 mips_32bitmode = 1;
15499
15500 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15501 as_bad (_("trap exception not supported at ISA 1"));
15502
15503 /* If the selected architecture includes support for ASEs, enable
15504 generation of code for them. */
15505 if (mips_opts.mips16 == -1)
15506 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15507 if (mips_opts.micromips == -1)
15508 mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15509
15510 /* MIPS3D and MDMX require 64-bit FPRs, so -mfp32 should stop those
15511 ASEs from being selected implicitly. */
15512 if (file_mips_fp32 == 1)
15513 file_ase_explicit |= ASE_MIPS3D | ASE_MDMX;
15514
15515 /* If the user didn't explicitly select or deselect a particular ASE,
15516 use the default setting for the CPU. */
15517 mips_opts.ase |= (arch_info->ase & ~file_ase_explicit);
15518
15519 file_mips_isa = mips_opts.isa;
15520 file_ase = mips_opts.ase;
15521 mips_opts.gp32 = file_mips_gp32;
15522 mips_opts.fp32 = file_mips_fp32;
15523 mips_opts.soft_float = file_mips_soft_float;
15524 mips_opts.single_float = file_mips_single_float;
15525
15526 mips_check_isa_supports_ases ();
15527
15528 if (mips_flag_mdebug < 0)
15529 mips_flag_mdebug = 0;
15530 }
15531 \f
15532 void
15533 mips_init_after_args (void)
15534 {
15535 /* initialize opcodes */
15536 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15537 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15538 }
15539
15540 long
15541 md_pcrel_from (fixS *fixP)
15542 {
15543 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15544 switch (fixP->fx_r_type)
15545 {
15546 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15547 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15548 /* Return the address of the delay slot. */
15549 return addr + 2;
15550
15551 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15552 case BFD_RELOC_MICROMIPS_JMP:
15553 case BFD_RELOC_16_PCREL_S2:
15554 case BFD_RELOC_MIPS_JMP:
15555 /* Return the address of the delay slot. */
15556 return addr + 4;
15557
15558 case BFD_RELOC_32_PCREL:
15559 return addr;
15560
15561 default:
15562 /* We have no relocation type for PC relative MIPS16 instructions. */
15563 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15564 as_bad_where (fixP->fx_file, fixP->fx_line,
15565 _("PC relative MIPS16 instruction references a different section"));
15566 return addr;
15567 }
15568 }
15569
15570 /* This is called before the symbol table is processed. In order to
15571 work with gcc when using mips-tfile, we must keep all local labels.
15572 However, in other cases, we want to discard them. If we were
15573 called with -g, but we didn't see any debugging information, it may
15574 mean that gcc is smuggling debugging information through to
15575 mips-tfile, in which case we must generate all local labels. */
15576
15577 void
15578 mips_frob_file_before_adjust (void)
15579 {
15580 #ifndef NO_ECOFF_DEBUGGING
15581 if (ECOFF_DEBUGGING
15582 && mips_debug != 0
15583 && ! ecoff_debugging_seen)
15584 flag_keep_locals = 1;
15585 #endif
15586 }
15587
15588 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15589 the corresponding LO16 reloc. This is called before md_apply_fix and
15590 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
15591 relocation operators.
15592
15593 For our purposes, a %lo() expression matches a %got() or %hi()
15594 expression if:
15595
15596 (a) it refers to the same symbol; and
15597 (b) the offset applied in the %lo() expression is no lower than
15598 the offset applied in the %got() or %hi().
15599
15600 (b) allows us to cope with code like:
15601
15602 lui $4,%hi(foo)
15603 lh $4,%lo(foo+2)($4)
15604
15605 ...which is legal on RELA targets, and has a well-defined behaviour
15606 if the user knows that adding 2 to "foo" will not induce a carry to
15607 the high 16 bits.
15608
15609 When several %lo()s match a particular %got() or %hi(), we use the
15610 following rules to distinguish them:
15611
15612 (1) %lo()s with smaller offsets are a better match than %lo()s with
15613 higher offsets.
15614
15615 (2) %lo()s with no matching %got() or %hi() are better than those
15616 that already have a matching %got() or %hi().
15617
15618 (3) later %lo()s are better than earlier %lo()s.
15619
15620 These rules are applied in order.
15621
15622 (1) means, among other things, that %lo()s with identical offsets are
15623 chosen if they exist.
15624
15625 (2) means that we won't associate several high-part relocations with
15626 the same low-part relocation unless there's no alternative. Having
15627 several high parts for the same low part is a GNU extension; this rule
15628 allows careful users to avoid it.
15629
15630 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
15631 with the last high-part relocation being at the front of the list.
15632 It therefore makes sense to choose the last matching low-part
15633 relocation, all other things being equal. It's also easier
15634 to code that way. */
15635
15636 void
15637 mips_frob_file (void)
15638 {
15639 struct mips_hi_fixup *l;
15640 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15641
15642 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15643 {
15644 segment_info_type *seginfo;
15645 bfd_boolean matched_lo_p;
15646 fixS **hi_pos, **lo_pos, **pos;
15647
15648 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15649
15650 /* If a GOT16 relocation turns out to be against a global symbol,
15651 there isn't supposed to be a matching LO. Ignore %gots against
15652 constants; we'll report an error for those later. */
15653 if (got16_reloc_p (l->fixp->fx_r_type)
15654 && !(l->fixp->fx_addsy
15655 && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15656 continue;
15657
15658 /* Check quickly whether the next fixup happens to be a matching %lo. */
15659 if (fixup_has_matching_lo_p (l->fixp))
15660 continue;
15661
15662 seginfo = seg_info (l->seg);
15663
15664 /* Set HI_POS to the position of this relocation in the chain.
15665 Set LO_POS to the position of the chosen low-part relocation.
15666 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15667 relocation that matches an immediately-preceding high-part
15668 relocation. */
15669 hi_pos = NULL;
15670 lo_pos = NULL;
15671 matched_lo_p = FALSE;
15672 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15673
15674 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15675 {
15676 if (*pos == l->fixp)
15677 hi_pos = pos;
15678
15679 if ((*pos)->fx_r_type == looking_for_rtype
15680 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15681 && (*pos)->fx_offset >= l->fixp->fx_offset
15682 && (lo_pos == NULL
15683 || (*pos)->fx_offset < (*lo_pos)->fx_offset
15684 || (!matched_lo_p
15685 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15686 lo_pos = pos;
15687
15688 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15689 && fixup_has_matching_lo_p (*pos));
15690 }
15691
15692 /* If we found a match, remove the high-part relocation from its
15693 current position and insert it before the low-part relocation.
15694 Make the offsets match so that fixup_has_matching_lo_p()
15695 will return true.
15696
15697 We don't warn about unmatched high-part relocations since some
15698 versions of gcc have been known to emit dead "lui ...%hi(...)"
15699 instructions. */
15700 if (lo_pos != NULL)
15701 {
15702 l->fixp->fx_offset = (*lo_pos)->fx_offset;
15703 if (l->fixp->fx_next != *lo_pos)
15704 {
15705 *hi_pos = l->fixp->fx_next;
15706 l->fixp->fx_next = *lo_pos;
15707 *lo_pos = l->fixp;
15708 }
15709 }
15710 }
15711 }
15712
15713 int
15714 mips_force_relocation (fixS *fixp)
15715 {
15716 if (generic_force_reloc (fixp))
15717 return 1;
15718
15719 /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15720 so that the linker relaxation can update targets. */
15721 if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15722 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15723 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15724 return 1;
15725
15726 return 0;
15727 }
15728
15729 /* Read the instruction associated with RELOC from BUF. */
15730
15731 static unsigned int
15732 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15733 {
15734 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15735 return read_compressed_insn (buf, 4);
15736 else
15737 return read_insn (buf);
15738 }
15739
15740 /* Write instruction INSN to BUF, given that it has been relocated
15741 by RELOC. */
15742
15743 static void
15744 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15745 unsigned long insn)
15746 {
15747 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15748 write_compressed_insn (buf, insn, 4);
15749 else
15750 write_insn (buf, insn);
15751 }
15752
15753 /* Apply a fixup to the object file. */
15754
15755 void
15756 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15757 {
15758 char *buf;
15759 unsigned long insn;
15760 reloc_howto_type *howto;
15761
15762 /* We ignore generic BFD relocations we don't know about. */
15763 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15764 if (! howto)
15765 return;
15766
15767 gas_assert (fixP->fx_size == 2
15768 || fixP->fx_size == 4
15769 || fixP->fx_r_type == BFD_RELOC_16
15770 || fixP->fx_r_type == BFD_RELOC_64
15771 || fixP->fx_r_type == BFD_RELOC_CTOR
15772 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15773 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15774 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15775 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15776 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15777
15778 buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15779
15780 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15781 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15782 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15783 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15784 || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15785
15786 /* Don't treat parts of a composite relocation as done. There are two
15787 reasons for this:
15788
15789 (1) The second and third parts will be against 0 (RSS_UNDEF) but
15790 should nevertheless be emitted if the first part is.
15791
15792 (2) In normal usage, composite relocations are never assembly-time
15793 constants. The easiest way of dealing with the pathological
15794 exceptions is to generate a relocation against STN_UNDEF and
15795 leave everything up to the linker. */
15796 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15797 fixP->fx_done = 1;
15798
15799 switch (fixP->fx_r_type)
15800 {
15801 case BFD_RELOC_MIPS_TLS_GD:
15802 case BFD_RELOC_MIPS_TLS_LDM:
15803 case BFD_RELOC_MIPS_TLS_DTPREL32:
15804 case BFD_RELOC_MIPS_TLS_DTPREL64:
15805 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15806 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15807 case BFD_RELOC_MIPS_TLS_GOTTPREL:
15808 case BFD_RELOC_MIPS_TLS_TPREL32:
15809 case BFD_RELOC_MIPS_TLS_TPREL64:
15810 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15811 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15812 case BFD_RELOC_MICROMIPS_TLS_GD:
15813 case BFD_RELOC_MICROMIPS_TLS_LDM:
15814 case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15815 case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15816 case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15817 case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15818 case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15819 case BFD_RELOC_MIPS16_TLS_GD:
15820 case BFD_RELOC_MIPS16_TLS_LDM:
15821 case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15822 case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15823 case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15824 case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15825 case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15826 if (!fixP->fx_addsy)
15827 {
15828 as_bad_where (fixP->fx_file, fixP->fx_line,
15829 _("TLS relocation against a constant"));
15830 break;
15831 }
15832 S_SET_THREAD_LOCAL (fixP->fx_addsy);
15833 /* fall through */
15834
15835 case BFD_RELOC_MIPS_JMP:
15836 case BFD_RELOC_MIPS_SHIFT5:
15837 case BFD_RELOC_MIPS_SHIFT6:
15838 case BFD_RELOC_MIPS_GOT_DISP:
15839 case BFD_RELOC_MIPS_GOT_PAGE:
15840 case BFD_RELOC_MIPS_GOT_OFST:
15841 case BFD_RELOC_MIPS_SUB:
15842 case BFD_RELOC_MIPS_INSERT_A:
15843 case BFD_RELOC_MIPS_INSERT_B:
15844 case BFD_RELOC_MIPS_DELETE:
15845 case BFD_RELOC_MIPS_HIGHEST:
15846 case BFD_RELOC_MIPS_HIGHER:
15847 case BFD_RELOC_MIPS_SCN_DISP:
15848 case BFD_RELOC_MIPS_REL16:
15849 case BFD_RELOC_MIPS_RELGOT:
15850 case BFD_RELOC_MIPS_JALR:
15851 case BFD_RELOC_HI16:
15852 case BFD_RELOC_HI16_S:
15853 case BFD_RELOC_LO16:
15854 case BFD_RELOC_GPREL16:
15855 case BFD_RELOC_MIPS_LITERAL:
15856 case BFD_RELOC_MIPS_CALL16:
15857 case BFD_RELOC_MIPS_GOT16:
15858 case BFD_RELOC_GPREL32:
15859 case BFD_RELOC_MIPS_GOT_HI16:
15860 case BFD_RELOC_MIPS_GOT_LO16:
15861 case BFD_RELOC_MIPS_CALL_HI16:
15862 case BFD_RELOC_MIPS_CALL_LO16:
15863 case BFD_RELOC_MIPS16_GPREL:
15864 case BFD_RELOC_MIPS16_GOT16:
15865 case BFD_RELOC_MIPS16_CALL16:
15866 case BFD_RELOC_MIPS16_HI16:
15867 case BFD_RELOC_MIPS16_HI16_S:
15868 case BFD_RELOC_MIPS16_LO16:
15869 case BFD_RELOC_MIPS16_JMP:
15870 case BFD_RELOC_MICROMIPS_JMP:
15871 case BFD_RELOC_MICROMIPS_GOT_DISP:
15872 case BFD_RELOC_MICROMIPS_GOT_PAGE:
15873 case BFD_RELOC_MICROMIPS_GOT_OFST:
15874 case BFD_RELOC_MICROMIPS_SUB:
15875 case BFD_RELOC_MICROMIPS_HIGHEST:
15876 case BFD_RELOC_MICROMIPS_HIGHER:
15877 case BFD_RELOC_MICROMIPS_SCN_DISP:
15878 case BFD_RELOC_MICROMIPS_JALR:
15879 case BFD_RELOC_MICROMIPS_HI16:
15880 case BFD_RELOC_MICROMIPS_HI16_S:
15881 case BFD_RELOC_MICROMIPS_LO16:
15882 case BFD_RELOC_MICROMIPS_GPREL16:
15883 case BFD_RELOC_MICROMIPS_LITERAL:
15884 case BFD_RELOC_MICROMIPS_CALL16:
15885 case BFD_RELOC_MICROMIPS_GOT16:
15886 case BFD_RELOC_MICROMIPS_GOT_HI16:
15887 case BFD_RELOC_MICROMIPS_GOT_LO16:
15888 case BFD_RELOC_MICROMIPS_CALL_HI16:
15889 case BFD_RELOC_MICROMIPS_CALL_LO16:
15890 case BFD_RELOC_MIPS_EH:
15891 if (fixP->fx_done)
15892 {
15893 offsetT value;
15894
15895 if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15896 {
15897 insn = read_reloc_insn (buf, fixP->fx_r_type);
15898 if (mips16_reloc_p (fixP->fx_r_type))
15899 insn |= mips16_immed_extend (value, 16);
15900 else
15901 insn |= (value & 0xffff);
15902 write_reloc_insn (buf, fixP->fx_r_type, insn);
15903 }
15904 else
15905 as_bad_where (fixP->fx_file, fixP->fx_line,
15906 _("Unsupported constant in relocation"));
15907 }
15908 break;
15909
15910 case BFD_RELOC_64:
15911 /* This is handled like BFD_RELOC_32, but we output a sign
15912 extended value if we are only 32 bits. */
15913 if (fixP->fx_done)
15914 {
15915 if (8 <= sizeof (valueT))
15916 md_number_to_chars (buf, *valP, 8);
15917 else
15918 {
15919 valueT hiv;
15920
15921 if ((*valP & 0x80000000) != 0)
15922 hiv = 0xffffffff;
15923 else
15924 hiv = 0;
15925 md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15926 md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15927 }
15928 }
15929 break;
15930
15931 case BFD_RELOC_RVA:
15932 case BFD_RELOC_32:
15933 case BFD_RELOC_32_PCREL:
15934 case BFD_RELOC_16:
15935 /* If we are deleting this reloc entry, we must fill in the
15936 value now. This can happen if we have a .word which is not
15937 resolved when it appears but is later defined. */
15938 if (fixP->fx_done)
15939 md_number_to_chars (buf, *valP, fixP->fx_size);
15940 break;
15941
15942 case BFD_RELOC_16_PCREL_S2:
15943 if ((*valP & 0x3) != 0)
15944 as_bad_where (fixP->fx_file, fixP->fx_line,
15945 _("Branch to misaligned address (%lx)"), (long) *valP);
15946
15947 /* We need to save the bits in the instruction since fixup_segment()
15948 might be deleting the relocation entry (i.e., a branch within
15949 the current segment). */
15950 if (! fixP->fx_done)
15951 break;
15952
15953 /* Update old instruction data. */
15954 insn = read_insn (buf);
15955
15956 if (*valP + 0x20000 <= 0x3ffff)
15957 {
15958 insn |= (*valP >> 2) & 0xffff;
15959 write_insn (buf, insn);
15960 }
15961 else if (mips_pic == NO_PIC
15962 && fixP->fx_done
15963 && fixP->fx_frag->fr_address >= text_section->vma
15964 && (fixP->fx_frag->fr_address
15965 < text_section->vma + bfd_get_section_size (text_section))
15966 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
15967 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
15968 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15969 {
15970 /* The branch offset is too large. If this is an
15971 unconditional branch, and we are not generating PIC code,
15972 we can convert it to an absolute jump instruction. */
15973 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
15974 insn = 0x0c000000; /* jal */
15975 else
15976 insn = 0x08000000; /* j */
15977 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15978 fixP->fx_done = 0;
15979 fixP->fx_addsy = section_symbol (text_section);
15980 *valP += md_pcrel_from (fixP);
15981 write_insn (buf, insn);
15982 }
15983 else
15984 {
15985 /* If we got here, we have branch-relaxation disabled,
15986 and there's nothing we can do to fix this instruction
15987 without turning it into a longer sequence. */
15988 as_bad_where (fixP->fx_file, fixP->fx_line,
15989 _("Branch out of range"));
15990 }
15991 break;
15992
15993 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15994 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15995 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15996 /* We adjust the offset back to even. */
15997 if ((*valP & 0x1) != 0)
15998 --(*valP);
15999
16000 if (! fixP->fx_done)
16001 break;
16002
16003 /* Should never visit here, because we keep the relocation. */
16004 abort ();
16005 break;
16006
16007 case BFD_RELOC_VTABLE_INHERIT:
16008 fixP->fx_done = 0;
16009 if (fixP->fx_addsy
16010 && !S_IS_DEFINED (fixP->fx_addsy)
16011 && !S_IS_WEAK (fixP->fx_addsy))
16012 S_SET_WEAK (fixP->fx_addsy);
16013 break;
16014
16015 case BFD_RELOC_VTABLE_ENTRY:
16016 fixP->fx_done = 0;
16017 break;
16018
16019 default:
16020 abort ();
16021 }
16022
16023 /* Remember value for tc_gen_reloc. */
16024 fixP->fx_addnumber = *valP;
16025 }
16026
16027 static symbolS *
16028 get_symbol (void)
16029 {
16030 int c;
16031 char *name;
16032 symbolS *p;
16033
16034 name = input_line_pointer;
16035 c = get_symbol_end ();
16036 p = (symbolS *) symbol_find_or_make (name);
16037 *input_line_pointer = c;
16038 return p;
16039 }
16040
16041 /* Align the current frag to a given power of two. If a particular
16042 fill byte should be used, FILL points to an integer that contains
16043 that byte, otherwise FILL is null.
16044
16045 This function used to have the comment:
16046
16047 The MIPS assembler also automatically adjusts any preceding label.
16048
16049 The implementation therefore applied the adjustment to a maximum of
16050 one label. However, other label adjustments are applied to batches
16051 of labels, and adjusting just one caused problems when new labels
16052 were added for the sake of debugging or unwind information.
16053 We therefore adjust all preceding labels (given as LABELS) instead. */
16054
16055 static void
16056 mips_align (int to, int *fill, struct insn_label_list *labels)
16057 {
16058 mips_emit_delays ();
16059 mips_record_compressed_mode ();
16060 if (fill == NULL && subseg_text_p (now_seg))
16061 frag_align_code (to, 0);
16062 else
16063 frag_align (to, fill ? *fill : 0, 0);
16064 record_alignment (now_seg, to);
16065 mips_move_labels (labels, FALSE);
16066 }
16067
16068 /* Align to a given power of two. .align 0 turns off the automatic
16069 alignment used by the data creating pseudo-ops. */
16070
16071 static void
16072 s_align (int x ATTRIBUTE_UNUSED)
16073 {
16074 int temp, fill_value, *fill_ptr;
16075 long max_alignment = 28;
16076
16077 /* o Note that the assembler pulls down any immediately preceding label
16078 to the aligned address.
16079 o It's not documented but auto alignment is reinstated by
16080 a .align pseudo instruction.
16081 o Note also that after auto alignment is turned off the mips assembler
16082 issues an error on attempt to assemble an improperly aligned data item.
16083 We don't. */
16084
16085 temp = get_absolute_expression ();
16086 if (temp > max_alignment)
16087 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
16088 else if (temp < 0)
16089 {
16090 as_warn (_("Alignment negative: 0 assumed."));
16091 temp = 0;
16092 }
16093 if (*input_line_pointer == ',')
16094 {
16095 ++input_line_pointer;
16096 fill_value = get_absolute_expression ();
16097 fill_ptr = &fill_value;
16098 }
16099 else
16100 fill_ptr = 0;
16101 if (temp)
16102 {
16103 segment_info_type *si = seg_info (now_seg);
16104 struct insn_label_list *l = si->label_list;
16105 /* Auto alignment should be switched on by next section change. */
16106 auto_align = 1;
16107 mips_align (temp, fill_ptr, l);
16108 }
16109 else
16110 {
16111 auto_align = 0;
16112 }
16113
16114 demand_empty_rest_of_line ();
16115 }
16116
16117 static void
16118 s_change_sec (int sec)
16119 {
16120 segT seg;
16121
16122 /* The ELF backend needs to know that we are changing sections, so
16123 that .previous works correctly. We could do something like check
16124 for an obj_section_change_hook macro, but that might be confusing
16125 as it would not be appropriate to use it in the section changing
16126 functions in read.c, since obj-elf.c intercepts those. FIXME:
16127 This should be cleaner, somehow. */
16128 obj_elf_section_change_hook ();
16129
16130 mips_emit_delays ();
16131
16132 switch (sec)
16133 {
16134 case 't':
16135 s_text (0);
16136 break;
16137 case 'd':
16138 s_data (0);
16139 break;
16140 case 'b':
16141 subseg_set (bss_section, (subsegT) get_absolute_expression ());
16142 demand_empty_rest_of_line ();
16143 break;
16144
16145 case 'r':
16146 seg = subseg_new (RDATA_SECTION_NAME,
16147 (subsegT) get_absolute_expression ());
16148 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16149 | SEC_READONLY | SEC_RELOC
16150 | SEC_DATA));
16151 if (strncmp (TARGET_OS, "elf", 3) != 0)
16152 record_alignment (seg, 4);
16153 demand_empty_rest_of_line ();
16154 break;
16155
16156 case 's':
16157 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16158 bfd_set_section_flags (stdoutput, seg,
16159 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16160 if (strncmp (TARGET_OS, "elf", 3) != 0)
16161 record_alignment (seg, 4);
16162 demand_empty_rest_of_line ();
16163 break;
16164
16165 case 'B':
16166 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16167 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16168 if (strncmp (TARGET_OS, "elf", 3) != 0)
16169 record_alignment (seg, 4);
16170 demand_empty_rest_of_line ();
16171 break;
16172 }
16173
16174 auto_align = 1;
16175 }
16176
16177 void
16178 s_change_section (int ignore ATTRIBUTE_UNUSED)
16179 {
16180 char *section_name;
16181 char c;
16182 char next_c = 0;
16183 int section_type;
16184 int section_flag;
16185 int section_entry_size;
16186 int section_alignment;
16187
16188 section_name = input_line_pointer;
16189 c = get_symbol_end ();
16190 if (c)
16191 next_c = *(input_line_pointer + 1);
16192
16193 /* Do we have .section Name<,"flags">? */
16194 if (c != ',' || (c == ',' && next_c == '"'))
16195 {
16196 /* just after name is now '\0'. */
16197 *input_line_pointer = c;
16198 input_line_pointer = section_name;
16199 obj_elf_section (ignore);
16200 return;
16201 }
16202 input_line_pointer++;
16203
16204 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
16205 if (c == ',')
16206 section_type = get_absolute_expression ();
16207 else
16208 section_type = 0;
16209 if (*input_line_pointer++ == ',')
16210 section_flag = get_absolute_expression ();
16211 else
16212 section_flag = 0;
16213 if (*input_line_pointer++ == ',')
16214 section_entry_size = get_absolute_expression ();
16215 else
16216 section_entry_size = 0;
16217 if (*input_line_pointer++ == ',')
16218 section_alignment = get_absolute_expression ();
16219 else
16220 section_alignment = 0;
16221 /* FIXME: really ignore? */
16222 (void) section_alignment;
16223
16224 section_name = xstrdup (section_name);
16225
16226 /* When using the generic form of .section (as implemented by obj-elf.c),
16227 there's no way to set the section type to SHT_MIPS_DWARF. Users have
16228 traditionally had to fall back on the more common @progbits instead.
16229
16230 There's nothing really harmful in this, since bfd will correct
16231 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
16232 means that, for backwards compatibility, the special_section entries
16233 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16234
16235 Even so, we shouldn't force users of the MIPS .section syntax to
16236 incorrectly label the sections as SHT_PROGBITS. The best compromise
16237 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16238 generic type-checking code. */
16239 if (section_type == SHT_MIPS_DWARF)
16240 section_type = SHT_PROGBITS;
16241
16242 obj_elf_change_section (section_name, section_type, section_flag,
16243 section_entry_size, 0, 0, 0);
16244
16245 if (now_seg->name != section_name)
16246 free (section_name);
16247 }
16248
16249 void
16250 mips_enable_auto_align (void)
16251 {
16252 auto_align = 1;
16253 }
16254
16255 static void
16256 s_cons (int log_size)
16257 {
16258 segment_info_type *si = seg_info (now_seg);
16259 struct insn_label_list *l = si->label_list;
16260
16261 mips_emit_delays ();
16262 if (log_size > 0 && auto_align)
16263 mips_align (log_size, 0, l);
16264 cons (1 << log_size);
16265 mips_clear_insn_labels ();
16266 }
16267
16268 static void
16269 s_float_cons (int type)
16270 {
16271 segment_info_type *si = seg_info (now_seg);
16272 struct insn_label_list *l = si->label_list;
16273
16274 mips_emit_delays ();
16275
16276 if (auto_align)
16277 {
16278 if (type == 'd')
16279 mips_align (3, 0, l);
16280 else
16281 mips_align (2, 0, l);
16282 }
16283
16284 float_cons (type);
16285 mips_clear_insn_labels ();
16286 }
16287
16288 /* Handle .globl. We need to override it because on Irix 5 you are
16289 permitted to say
16290 .globl foo .text
16291 where foo is an undefined symbol, to mean that foo should be
16292 considered to be the address of a function. */
16293
16294 static void
16295 s_mips_globl (int x ATTRIBUTE_UNUSED)
16296 {
16297 char *name;
16298 int c;
16299 symbolS *symbolP;
16300 flagword flag;
16301
16302 do
16303 {
16304 name = input_line_pointer;
16305 c = get_symbol_end ();
16306 symbolP = symbol_find_or_make (name);
16307 S_SET_EXTERNAL (symbolP);
16308
16309 *input_line_pointer = c;
16310 SKIP_WHITESPACE ();
16311
16312 /* On Irix 5, every global symbol that is not explicitly labelled as
16313 being a function is apparently labelled as being an object. */
16314 flag = BSF_OBJECT;
16315
16316 if (!is_end_of_line[(unsigned char) *input_line_pointer]
16317 && (*input_line_pointer != ','))
16318 {
16319 char *secname;
16320 asection *sec;
16321
16322 secname = input_line_pointer;
16323 c = get_symbol_end ();
16324 sec = bfd_get_section_by_name (stdoutput, secname);
16325 if (sec == NULL)
16326 as_bad (_("%s: no such section"), secname);
16327 *input_line_pointer = c;
16328
16329 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16330 flag = BSF_FUNCTION;
16331 }
16332
16333 symbol_get_bfdsym (symbolP)->flags |= flag;
16334
16335 c = *input_line_pointer;
16336 if (c == ',')
16337 {
16338 input_line_pointer++;
16339 SKIP_WHITESPACE ();
16340 if (is_end_of_line[(unsigned char) *input_line_pointer])
16341 c = '\n';
16342 }
16343 }
16344 while (c == ',');
16345
16346 demand_empty_rest_of_line ();
16347 }
16348
16349 static void
16350 s_option (int x ATTRIBUTE_UNUSED)
16351 {
16352 char *opt;
16353 char c;
16354
16355 opt = input_line_pointer;
16356 c = get_symbol_end ();
16357
16358 if (*opt == 'O')
16359 {
16360 /* FIXME: What does this mean? */
16361 }
16362 else if (strncmp (opt, "pic", 3) == 0)
16363 {
16364 int i;
16365
16366 i = atoi (opt + 3);
16367 if (i == 0)
16368 mips_pic = NO_PIC;
16369 else if (i == 2)
16370 {
16371 mips_pic = SVR4_PIC;
16372 mips_abicalls = TRUE;
16373 }
16374 else
16375 as_bad (_(".option pic%d not supported"), i);
16376
16377 if (mips_pic == SVR4_PIC)
16378 {
16379 if (g_switch_seen && g_switch_value != 0)
16380 as_warn (_("-G may not be used with SVR4 PIC code"));
16381 g_switch_value = 0;
16382 bfd_set_gp_size (stdoutput, 0);
16383 }
16384 }
16385 else
16386 as_warn (_("Unrecognized option \"%s\""), opt);
16387
16388 *input_line_pointer = c;
16389 demand_empty_rest_of_line ();
16390 }
16391
16392 /* This structure is used to hold a stack of .set values. */
16393
16394 struct mips_option_stack
16395 {
16396 struct mips_option_stack *next;
16397 struct mips_set_options options;
16398 };
16399
16400 static struct mips_option_stack *mips_opts_stack;
16401
16402 /* Handle the .set pseudo-op. */
16403
16404 static void
16405 s_mipsset (int x ATTRIBUTE_UNUSED)
16406 {
16407 char *name = input_line_pointer, ch;
16408 const struct mips_ase *ase;
16409
16410 while (!is_end_of_line[(unsigned char) *input_line_pointer])
16411 ++input_line_pointer;
16412 ch = *input_line_pointer;
16413 *input_line_pointer = '\0';
16414
16415 if (strcmp (name, "reorder") == 0)
16416 {
16417 if (mips_opts.noreorder)
16418 end_noreorder ();
16419 }
16420 else if (strcmp (name, "noreorder") == 0)
16421 {
16422 if (!mips_opts.noreorder)
16423 start_noreorder ();
16424 }
16425 else if (strncmp (name, "at=", 3) == 0)
16426 {
16427 char *s = name + 3;
16428
16429 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16430 as_bad (_("Unrecognized register name `%s'"), s);
16431 }
16432 else if (strcmp (name, "at") == 0)
16433 {
16434 mips_opts.at = ATREG;
16435 }
16436 else if (strcmp (name, "noat") == 0)
16437 {
16438 mips_opts.at = ZERO;
16439 }
16440 else if (strcmp (name, "macro") == 0)
16441 {
16442 mips_opts.warn_about_macros = 0;
16443 }
16444 else if (strcmp (name, "nomacro") == 0)
16445 {
16446 if (mips_opts.noreorder == 0)
16447 as_bad (_("`noreorder' must be set before `nomacro'"));
16448 mips_opts.warn_about_macros = 1;
16449 }
16450 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16451 {
16452 mips_opts.nomove = 0;
16453 }
16454 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16455 {
16456 mips_opts.nomove = 1;
16457 }
16458 else if (strcmp (name, "bopt") == 0)
16459 {
16460 mips_opts.nobopt = 0;
16461 }
16462 else if (strcmp (name, "nobopt") == 0)
16463 {
16464 mips_opts.nobopt = 1;
16465 }
16466 else if (strcmp (name, "gp=default") == 0)
16467 mips_opts.gp32 = file_mips_gp32;
16468 else if (strcmp (name, "gp=32") == 0)
16469 mips_opts.gp32 = 1;
16470 else if (strcmp (name, "gp=64") == 0)
16471 {
16472 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16473 as_warn (_("%s isa does not support 64-bit registers"),
16474 mips_cpu_info_from_isa (mips_opts.isa)->name);
16475 mips_opts.gp32 = 0;
16476 }
16477 else if (strcmp (name, "fp=default") == 0)
16478 mips_opts.fp32 = file_mips_fp32;
16479 else if (strcmp (name, "fp=32") == 0)
16480 mips_opts.fp32 = 1;
16481 else if (strcmp (name, "fp=64") == 0)
16482 {
16483 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16484 as_warn (_("%s isa does not support 64-bit floating point registers"),
16485 mips_cpu_info_from_isa (mips_opts.isa)->name);
16486 mips_opts.fp32 = 0;
16487 }
16488 else if (strcmp (name, "softfloat") == 0)
16489 mips_opts.soft_float = 1;
16490 else if (strcmp (name, "hardfloat") == 0)
16491 mips_opts.soft_float = 0;
16492 else if (strcmp (name, "singlefloat") == 0)
16493 mips_opts.single_float = 1;
16494 else if (strcmp (name, "doublefloat") == 0)
16495 mips_opts.single_float = 0;
16496 else if (strcmp (name, "mips16") == 0
16497 || strcmp (name, "MIPS-16") == 0)
16498 {
16499 if (mips_opts.micromips == 1)
16500 as_fatal (_("`mips16' cannot be used with `micromips'"));
16501 mips_opts.mips16 = 1;
16502 }
16503 else if (strcmp (name, "nomips16") == 0
16504 || strcmp (name, "noMIPS-16") == 0)
16505 mips_opts.mips16 = 0;
16506 else if (strcmp (name, "micromips") == 0)
16507 {
16508 if (mips_opts.mips16 == 1)
16509 as_fatal (_("`micromips' cannot be used with `mips16'"));
16510 mips_opts.micromips = 1;
16511 }
16512 else if (strcmp (name, "nomicromips") == 0)
16513 mips_opts.micromips = 0;
16514 else if (name[0] == 'n'
16515 && name[1] == 'o'
16516 && (ase = mips_lookup_ase (name + 2)))
16517 mips_set_ase (ase, FALSE);
16518 else if ((ase = mips_lookup_ase (name)))
16519 mips_set_ase (ase, TRUE);
16520 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16521 {
16522 int reset = 0;
16523
16524 /* Permit the user to change the ISA and architecture on the fly.
16525 Needless to say, misuse can cause serious problems. */
16526 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16527 {
16528 reset = 1;
16529 mips_opts.isa = file_mips_isa;
16530 mips_opts.arch = file_mips_arch;
16531 }
16532 else if (strncmp (name, "arch=", 5) == 0)
16533 {
16534 const struct mips_cpu_info *p;
16535
16536 p = mips_parse_cpu("internal use", name + 5);
16537 if (!p)
16538 as_bad (_("unknown architecture %s"), name + 5);
16539 else
16540 {
16541 mips_opts.arch = p->cpu;
16542 mips_opts.isa = p->isa;
16543 }
16544 }
16545 else if (strncmp (name, "mips", 4) == 0)
16546 {
16547 const struct mips_cpu_info *p;
16548
16549 p = mips_parse_cpu("internal use", name);
16550 if (!p)
16551 as_bad (_("unknown ISA level %s"), name + 4);
16552 else
16553 {
16554 mips_opts.arch = p->cpu;
16555 mips_opts.isa = p->isa;
16556 }
16557 }
16558 else
16559 as_bad (_("unknown ISA or architecture %s"), name);
16560
16561 switch (mips_opts.isa)
16562 {
16563 case 0:
16564 break;
16565 case ISA_MIPS1:
16566 case ISA_MIPS2:
16567 case ISA_MIPS32:
16568 case ISA_MIPS32R2:
16569 mips_opts.gp32 = 1;
16570 mips_opts.fp32 = 1;
16571 break;
16572 case ISA_MIPS3:
16573 case ISA_MIPS4:
16574 case ISA_MIPS5:
16575 case ISA_MIPS64:
16576 case ISA_MIPS64R2:
16577 mips_opts.gp32 = 0;
16578 if (mips_opts.arch == CPU_R5900)
16579 {
16580 mips_opts.fp32 = 1;
16581 }
16582 else
16583 {
16584 mips_opts.fp32 = 0;
16585 }
16586 break;
16587 default:
16588 as_bad (_("unknown ISA level %s"), name + 4);
16589 break;
16590 }
16591 if (reset)
16592 {
16593 mips_opts.gp32 = file_mips_gp32;
16594 mips_opts.fp32 = file_mips_fp32;
16595 }
16596 }
16597 else if (strcmp (name, "autoextend") == 0)
16598 mips_opts.noautoextend = 0;
16599 else if (strcmp (name, "noautoextend") == 0)
16600 mips_opts.noautoextend = 1;
16601 else if (strcmp (name, "insn32") == 0)
16602 mips_opts.insn32 = TRUE;
16603 else if (strcmp (name, "noinsn32") == 0)
16604 mips_opts.insn32 = FALSE;
16605 else if (strcmp (name, "push") == 0)
16606 {
16607 struct mips_option_stack *s;
16608
16609 s = (struct mips_option_stack *) xmalloc (sizeof *s);
16610 s->next = mips_opts_stack;
16611 s->options = mips_opts;
16612 mips_opts_stack = s;
16613 }
16614 else if (strcmp (name, "pop") == 0)
16615 {
16616 struct mips_option_stack *s;
16617
16618 s = mips_opts_stack;
16619 if (s == NULL)
16620 as_bad (_(".set pop with no .set push"));
16621 else
16622 {
16623 /* If we're changing the reorder mode we need to handle
16624 delay slots correctly. */
16625 if (s->options.noreorder && ! mips_opts.noreorder)
16626 start_noreorder ();
16627 else if (! s->options.noreorder && mips_opts.noreorder)
16628 end_noreorder ();
16629
16630 mips_opts = s->options;
16631 mips_opts_stack = s->next;
16632 free (s);
16633 }
16634 }
16635 else if (strcmp (name, "sym32") == 0)
16636 mips_opts.sym32 = TRUE;
16637 else if (strcmp (name, "nosym32") == 0)
16638 mips_opts.sym32 = FALSE;
16639 else if (strchr (name, ','))
16640 {
16641 /* Generic ".set" directive; use the generic handler. */
16642 *input_line_pointer = ch;
16643 input_line_pointer = name;
16644 s_set (0);
16645 return;
16646 }
16647 else
16648 {
16649 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16650 }
16651 mips_check_isa_supports_ases ();
16652 *input_line_pointer = ch;
16653 demand_empty_rest_of_line ();
16654 }
16655
16656 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
16657 .option pic2. It means to generate SVR4 PIC calls. */
16658
16659 static void
16660 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16661 {
16662 mips_pic = SVR4_PIC;
16663 mips_abicalls = TRUE;
16664
16665 if (g_switch_seen && g_switch_value != 0)
16666 as_warn (_("-G may not be used with SVR4 PIC code"));
16667 g_switch_value = 0;
16668
16669 bfd_set_gp_size (stdoutput, 0);
16670 demand_empty_rest_of_line ();
16671 }
16672
16673 /* Handle the .cpload pseudo-op. This is used when generating SVR4
16674 PIC code. It sets the $gp register for the function based on the
16675 function address, which is in the register named in the argument.
16676 This uses a relocation against _gp_disp, which is handled specially
16677 by the linker. The result is:
16678 lui $gp,%hi(_gp_disp)
16679 addiu $gp,$gp,%lo(_gp_disp)
16680 addu $gp,$gp,.cpload argument
16681 The .cpload argument is normally $25 == $t9.
16682
16683 The -mno-shared option changes this to:
16684 lui $gp,%hi(__gnu_local_gp)
16685 addiu $gp,$gp,%lo(__gnu_local_gp)
16686 and the argument is ignored. This saves an instruction, but the
16687 resulting code is not position independent; it uses an absolute
16688 address for __gnu_local_gp. Thus code assembled with -mno-shared
16689 can go into an ordinary executable, but not into a shared library. */
16690
16691 static void
16692 s_cpload (int ignore ATTRIBUTE_UNUSED)
16693 {
16694 expressionS ex;
16695 int reg;
16696 int in_shared;
16697
16698 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16699 .cpload is ignored. */
16700 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16701 {
16702 s_ignore (0);
16703 return;
16704 }
16705
16706 if (mips_opts.mips16)
16707 {
16708 as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16709 ignore_rest_of_line ();
16710 return;
16711 }
16712
16713 /* .cpload should be in a .set noreorder section. */
16714 if (mips_opts.noreorder == 0)
16715 as_warn (_(".cpload not in noreorder section"));
16716
16717 reg = tc_get_register (0);
16718
16719 /* If we need to produce a 64-bit address, we are better off using
16720 the default instruction sequence. */
16721 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16722
16723 ex.X_op = O_symbol;
16724 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16725 "__gnu_local_gp");
16726 ex.X_op_symbol = NULL;
16727 ex.X_add_number = 0;
16728
16729 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16730 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16731
16732 mips_mark_labels ();
16733 mips_assembling_insn = TRUE;
16734
16735 macro_start ();
16736 macro_build_lui (&ex, mips_gp_register);
16737 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16738 mips_gp_register, BFD_RELOC_LO16);
16739 if (in_shared)
16740 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16741 mips_gp_register, reg);
16742 macro_end ();
16743
16744 mips_assembling_insn = FALSE;
16745 demand_empty_rest_of_line ();
16746 }
16747
16748 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
16749 .cpsetup $reg1, offset|$reg2, label
16750
16751 If offset is given, this results in:
16752 sd $gp, offset($sp)
16753 lui $gp, %hi(%neg(%gp_rel(label)))
16754 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16755 daddu $gp, $gp, $reg1
16756
16757 If $reg2 is given, this results in:
16758 daddu $reg2, $gp, $0
16759 lui $gp, %hi(%neg(%gp_rel(label)))
16760 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16761 daddu $gp, $gp, $reg1
16762 $reg1 is normally $25 == $t9.
16763
16764 The -mno-shared option replaces the last three instructions with
16765 lui $gp,%hi(_gp)
16766 addiu $gp,$gp,%lo(_gp) */
16767
16768 static void
16769 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16770 {
16771 expressionS ex_off;
16772 expressionS ex_sym;
16773 int reg1;
16774
16775 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16776 We also need NewABI support. */
16777 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16778 {
16779 s_ignore (0);
16780 return;
16781 }
16782
16783 if (mips_opts.mips16)
16784 {
16785 as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16786 ignore_rest_of_line ();
16787 return;
16788 }
16789
16790 reg1 = tc_get_register (0);
16791 SKIP_WHITESPACE ();
16792 if (*input_line_pointer != ',')
16793 {
16794 as_bad (_("missing argument separator ',' for .cpsetup"));
16795 return;
16796 }
16797 else
16798 ++input_line_pointer;
16799 SKIP_WHITESPACE ();
16800 if (*input_line_pointer == '$')
16801 {
16802 mips_cpreturn_register = tc_get_register (0);
16803 mips_cpreturn_offset = -1;
16804 }
16805 else
16806 {
16807 mips_cpreturn_offset = get_absolute_expression ();
16808 mips_cpreturn_register = -1;
16809 }
16810 SKIP_WHITESPACE ();
16811 if (*input_line_pointer != ',')
16812 {
16813 as_bad (_("missing argument separator ',' for .cpsetup"));
16814 return;
16815 }
16816 else
16817 ++input_line_pointer;
16818 SKIP_WHITESPACE ();
16819 expression (&ex_sym);
16820
16821 mips_mark_labels ();
16822 mips_assembling_insn = TRUE;
16823
16824 macro_start ();
16825 if (mips_cpreturn_register == -1)
16826 {
16827 ex_off.X_op = O_constant;
16828 ex_off.X_add_symbol = NULL;
16829 ex_off.X_op_symbol = NULL;
16830 ex_off.X_add_number = mips_cpreturn_offset;
16831
16832 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16833 BFD_RELOC_LO16, SP);
16834 }
16835 else
16836 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16837 mips_gp_register, 0);
16838
16839 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16840 {
16841 macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16842 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16843 BFD_RELOC_HI16_S);
16844
16845 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16846 mips_gp_register, -1, BFD_RELOC_GPREL16,
16847 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16848
16849 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16850 mips_gp_register, reg1);
16851 }
16852 else
16853 {
16854 expressionS ex;
16855
16856 ex.X_op = O_symbol;
16857 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16858 ex.X_op_symbol = NULL;
16859 ex.X_add_number = 0;
16860
16861 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16862 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16863
16864 macro_build_lui (&ex, mips_gp_register);
16865 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16866 mips_gp_register, BFD_RELOC_LO16);
16867 }
16868
16869 macro_end ();
16870
16871 mips_assembling_insn = FALSE;
16872 demand_empty_rest_of_line ();
16873 }
16874
16875 static void
16876 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16877 {
16878 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16879 .cplocal is ignored. */
16880 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16881 {
16882 s_ignore (0);
16883 return;
16884 }
16885
16886 if (mips_opts.mips16)
16887 {
16888 as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16889 ignore_rest_of_line ();
16890 return;
16891 }
16892
16893 mips_gp_register = tc_get_register (0);
16894 demand_empty_rest_of_line ();
16895 }
16896
16897 /* Handle the .cprestore pseudo-op. This stores $gp into a given
16898 offset from $sp. The offset is remembered, and after making a PIC
16899 call $gp is restored from that location. */
16900
16901 static void
16902 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16903 {
16904 expressionS ex;
16905
16906 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16907 .cprestore is ignored. */
16908 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16909 {
16910 s_ignore (0);
16911 return;
16912 }
16913
16914 if (mips_opts.mips16)
16915 {
16916 as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16917 ignore_rest_of_line ();
16918 return;
16919 }
16920
16921 mips_cprestore_offset = get_absolute_expression ();
16922 mips_cprestore_valid = 1;
16923
16924 ex.X_op = O_constant;
16925 ex.X_add_symbol = NULL;
16926 ex.X_op_symbol = NULL;
16927 ex.X_add_number = mips_cprestore_offset;
16928
16929 mips_mark_labels ();
16930 mips_assembling_insn = TRUE;
16931
16932 macro_start ();
16933 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16934 SP, HAVE_64BIT_ADDRESSES);
16935 macro_end ();
16936
16937 mips_assembling_insn = FALSE;
16938 demand_empty_rest_of_line ();
16939 }
16940
16941 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16942 was given in the preceding .cpsetup, it results in:
16943 ld $gp, offset($sp)
16944
16945 If a register $reg2 was given there, it results in:
16946 daddu $gp, $reg2, $0 */
16947
16948 static void
16949 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16950 {
16951 expressionS ex;
16952
16953 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16954 We also need NewABI support. */
16955 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16956 {
16957 s_ignore (0);
16958 return;
16959 }
16960
16961 if (mips_opts.mips16)
16962 {
16963 as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16964 ignore_rest_of_line ();
16965 return;
16966 }
16967
16968 mips_mark_labels ();
16969 mips_assembling_insn = TRUE;
16970
16971 macro_start ();
16972 if (mips_cpreturn_register == -1)
16973 {
16974 ex.X_op = O_constant;
16975 ex.X_add_symbol = NULL;
16976 ex.X_op_symbol = NULL;
16977 ex.X_add_number = mips_cpreturn_offset;
16978
16979 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16980 }
16981 else
16982 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16983 mips_cpreturn_register, 0);
16984 macro_end ();
16985
16986 mips_assembling_insn = FALSE;
16987 demand_empty_rest_of_line ();
16988 }
16989
16990 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16991 pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16992 DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16993 debug information or MIPS16 TLS. */
16994
16995 static void
16996 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16997 bfd_reloc_code_real_type rtype)
16998 {
16999 expressionS ex;
17000 char *p;
17001
17002 expression (&ex);
17003
17004 if (ex.X_op != O_symbol)
17005 {
17006 as_bad (_("Unsupported use of %s"), dirstr);
17007 ignore_rest_of_line ();
17008 }
17009
17010 p = frag_more (bytes);
17011 md_number_to_chars (p, 0, bytes);
17012 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
17013 demand_empty_rest_of_line ();
17014 mips_clear_insn_labels ();
17015 }
17016
17017 /* Handle .dtprelword. */
17018
17019 static void
17020 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
17021 {
17022 s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
17023 }
17024
17025 /* Handle .dtpreldword. */
17026
17027 static void
17028 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
17029 {
17030 s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
17031 }
17032
17033 /* Handle .tprelword. */
17034
17035 static void
17036 s_tprelword (int ignore ATTRIBUTE_UNUSED)
17037 {
17038 s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
17039 }
17040
17041 /* Handle .tpreldword. */
17042
17043 static void
17044 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
17045 {
17046 s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
17047 }
17048
17049 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
17050 code. It sets the offset to use in gp_rel relocations. */
17051
17052 static void
17053 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
17054 {
17055 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
17056 We also need NewABI support. */
17057 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
17058 {
17059 s_ignore (0);
17060 return;
17061 }
17062
17063 mips_gprel_offset = get_absolute_expression ();
17064
17065 demand_empty_rest_of_line ();
17066 }
17067
17068 /* Handle the .gpword pseudo-op. This is used when generating PIC
17069 code. It generates a 32 bit GP relative reloc. */
17070
17071 static void
17072 s_gpword (int ignore ATTRIBUTE_UNUSED)
17073 {
17074 segment_info_type *si;
17075 struct insn_label_list *l;
17076 expressionS ex;
17077 char *p;
17078
17079 /* When not generating PIC code, this is treated as .word. */
17080 if (mips_pic != SVR4_PIC)
17081 {
17082 s_cons (2);
17083 return;
17084 }
17085
17086 si = seg_info (now_seg);
17087 l = si->label_list;
17088 mips_emit_delays ();
17089 if (auto_align)
17090 mips_align (2, 0, l);
17091
17092 expression (&ex);
17093 mips_clear_insn_labels ();
17094
17095 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17096 {
17097 as_bad (_("Unsupported use of .gpword"));
17098 ignore_rest_of_line ();
17099 }
17100
17101 p = frag_more (4);
17102 md_number_to_chars (p, 0, 4);
17103 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17104 BFD_RELOC_GPREL32);
17105
17106 demand_empty_rest_of_line ();
17107 }
17108
17109 static void
17110 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17111 {
17112 segment_info_type *si;
17113 struct insn_label_list *l;
17114 expressionS ex;
17115 char *p;
17116
17117 /* When not generating PIC code, this is treated as .dword. */
17118 if (mips_pic != SVR4_PIC)
17119 {
17120 s_cons (3);
17121 return;
17122 }
17123
17124 si = seg_info (now_seg);
17125 l = si->label_list;
17126 mips_emit_delays ();
17127 if (auto_align)
17128 mips_align (3, 0, l);
17129
17130 expression (&ex);
17131 mips_clear_insn_labels ();
17132
17133 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17134 {
17135 as_bad (_("Unsupported use of .gpdword"));
17136 ignore_rest_of_line ();
17137 }
17138
17139 p = frag_more (8);
17140 md_number_to_chars (p, 0, 8);
17141 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17142 BFD_RELOC_GPREL32)->fx_tcbit = 1;
17143
17144 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
17145 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17146 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17147
17148 demand_empty_rest_of_line ();
17149 }
17150
17151 /* Handle the .ehword pseudo-op. This is used when generating unwinding
17152 tables. It generates a R_MIPS_EH reloc. */
17153
17154 static void
17155 s_ehword (int ignore ATTRIBUTE_UNUSED)
17156 {
17157 expressionS ex;
17158 char *p;
17159
17160 mips_emit_delays ();
17161
17162 expression (&ex);
17163 mips_clear_insn_labels ();
17164
17165 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17166 {
17167 as_bad (_("Unsupported use of .ehword"));
17168 ignore_rest_of_line ();
17169 }
17170
17171 p = frag_more (4);
17172 md_number_to_chars (p, 0, 4);
17173 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17174 BFD_RELOC_MIPS_EH);
17175
17176 demand_empty_rest_of_line ();
17177 }
17178
17179 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
17180 tables in SVR4 PIC code. */
17181
17182 static void
17183 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17184 {
17185 int reg;
17186
17187 /* This is ignored when not generating SVR4 PIC code. */
17188 if (mips_pic != SVR4_PIC)
17189 {
17190 s_ignore (0);
17191 return;
17192 }
17193
17194 mips_mark_labels ();
17195 mips_assembling_insn = TRUE;
17196
17197 /* Add $gp to the register named as an argument. */
17198 macro_start ();
17199 reg = tc_get_register (0);
17200 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17201 macro_end ();
17202
17203 mips_assembling_insn = FALSE;
17204 demand_empty_rest_of_line ();
17205 }
17206
17207 /* Handle the .insn pseudo-op. This marks instruction labels in
17208 mips16/micromips mode. This permits the linker to handle them specially,
17209 such as generating jalx instructions when needed. We also make
17210 them odd for the duration of the assembly, in order to generate the
17211 right sort of code. We will make them even in the adjust_symtab
17212 routine, while leaving them marked. This is convenient for the
17213 debugger and the disassembler. The linker knows to make them odd
17214 again. */
17215
17216 static void
17217 s_insn (int ignore ATTRIBUTE_UNUSED)
17218 {
17219 mips_mark_labels ();
17220
17221 demand_empty_rest_of_line ();
17222 }
17223
17224 /* Handle a .stab[snd] directive. Ideally these directives would be
17225 implemented in a transparent way, so that removing them would not
17226 have any effect on the generated instructions. However, s_stab
17227 internally changes the section, so in practice we need to decide
17228 now whether the preceding label marks compressed code. We do not
17229 support changing the compression mode of a label after a .stab*
17230 directive, such as in:
17231
17232 foo:
17233 .stabs ...
17234 .set mips16
17235
17236 so the current mode wins. */
17237
17238 static void
17239 s_mips_stab (int type)
17240 {
17241 mips_mark_labels ();
17242 s_stab (type);
17243 }
17244
17245 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
17246
17247 static void
17248 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17249 {
17250 char *name;
17251 int c;
17252 symbolS *symbolP;
17253 expressionS exp;
17254
17255 name = input_line_pointer;
17256 c = get_symbol_end ();
17257 symbolP = symbol_find_or_make (name);
17258 S_SET_WEAK (symbolP);
17259 *input_line_pointer = c;
17260
17261 SKIP_WHITESPACE ();
17262
17263 if (! is_end_of_line[(unsigned char) *input_line_pointer])
17264 {
17265 if (S_IS_DEFINED (symbolP))
17266 {
17267 as_bad (_("ignoring attempt to redefine symbol %s"),
17268 S_GET_NAME (symbolP));
17269 ignore_rest_of_line ();
17270 return;
17271 }
17272
17273 if (*input_line_pointer == ',')
17274 {
17275 ++input_line_pointer;
17276 SKIP_WHITESPACE ();
17277 }
17278
17279 expression (&exp);
17280 if (exp.X_op != O_symbol)
17281 {
17282 as_bad (_("bad .weakext directive"));
17283 ignore_rest_of_line ();
17284 return;
17285 }
17286 symbol_set_value_expression (symbolP, &exp);
17287 }
17288
17289 demand_empty_rest_of_line ();
17290 }
17291
17292 /* Parse a register string into a number. Called from the ECOFF code
17293 to parse .frame. The argument is non-zero if this is the frame
17294 register, so that we can record it in mips_frame_reg. */
17295
17296 int
17297 tc_get_register (int frame)
17298 {
17299 unsigned int reg;
17300
17301 SKIP_WHITESPACE ();
17302 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17303 reg = 0;
17304 if (frame)
17305 {
17306 mips_frame_reg = reg != 0 ? reg : SP;
17307 mips_frame_reg_valid = 1;
17308 mips_cprestore_valid = 0;
17309 }
17310 return reg;
17311 }
17312
17313 valueT
17314 md_section_align (asection *seg, valueT addr)
17315 {
17316 int align = bfd_get_section_alignment (stdoutput, seg);
17317
17318 /* We don't need to align ELF sections to the full alignment.
17319 However, Irix 5 may prefer that we align them at least to a 16
17320 byte boundary. We don't bother to align the sections if we
17321 are targeted for an embedded system. */
17322 if (strncmp (TARGET_OS, "elf", 3) == 0)
17323 return addr;
17324 if (align > 4)
17325 align = 4;
17326
17327 return ((addr + (1 << align) - 1) & (-1 << align));
17328 }
17329
17330 /* Utility routine, called from above as well. If called while the
17331 input file is still being read, it's only an approximation. (For
17332 example, a symbol may later become defined which appeared to be
17333 undefined earlier.) */
17334
17335 static int
17336 nopic_need_relax (symbolS *sym, int before_relaxing)
17337 {
17338 if (sym == 0)
17339 return 0;
17340
17341 if (g_switch_value > 0)
17342 {
17343 const char *symname;
17344 int change;
17345
17346 /* Find out whether this symbol can be referenced off the $gp
17347 register. It can be if it is smaller than the -G size or if
17348 it is in the .sdata or .sbss section. Certain symbols can
17349 not be referenced off the $gp, although it appears as though
17350 they can. */
17351 symname = S_GET_NAME (sym);
17352 if (symname != (const char *) NULL
17353 && (strcmp (symname, "eprol") == 0
17354 || strcmp (symname, "etext") == 0
17355 || strcmp (symname, "_gp") == 0
17356 || strcmp (symname, "edata") == 0
17357 || strcmp (symname, "_fbss") == 0
17358 || strcmp (symname, "_fdata") == 0
17359 || strcmp (symname, "_ftext") == 0
17360 || strcmp (symname, "end") == 0
17361 || strcmp (symname, "_gp_disp") == 0))
17362 change = 1;
17363 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17364 && (0
17365 #ifndef NO_ECOFF_DEBUGGING
17366 || (symbol_get_obj (sym)->ecoff_extern_size != 0
17367 && (symbol_get_obj (sym)->ecoff_extern_size
17368 <= g_switch_value))
17369 #endif
17370 /* We must defer this decision until after the whole
17371 file has been read, since there might be a .extern
17372 after the first use of this symbol. */
17373 || (before_relaxing
17374 #ifndef NO_ECOFF_DEBUGGING
17375 && symbol_get_obj (sym)->ecoff_extern_size == 0
17376 #endif
17377 && S_GET_VALUE (sym) == 0)
17378 || (S_GET_VALUE (sym) != 0
17379 && S_GET_VALUE (sym) <= g_switch_value)))
17380 change = 0;
17381 else
17382 {
17383 const char *segname;
17384
17385 segname = segment_name (S_GET_SEGMENT (sym));
17386 gas_assert (strcmp (segname, ".lit8") != 0
17387 && strcmp (segname, ".lit4") != 0);
17388 change = (strcmp (segname, ".sdata") != 0
17389 && strcmp (segname, ".sbss") != 0
17390 && strncmp (segname, ".sdata.", 7) != 0
17391 && strncmp (segname, ".sbss.", 6) != 0
17392 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17393 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17394 }
17395 return change;
17396 }
17397 else
17398 /* We are not optimizing for the $gp register. */
17399 return 1;
17400 }
17401
17402
17403 /* Return true if the given symbol should be considered local for SVR4 PIC. */
17404
17405 static bfd_boolean
17406 pic_need_relax (symbolS *sym, asection *segtype)
17407 {
17408 asection *symsec;
17409
17410 /* Handle the case of a symbol equated to another symbol. */
17411 while (symbol_equated_reloc_p (sym))
17412 {
17413 symbolS *n;
17414
17415 /* It's possible to get a loop here in a badly written program. */
17416 n = symbol_get_value_expression (sym)->X_add_symbol;
17417 if (n == sym)
17418 break;
17419 sym = n;
17420 }
17421
17422 if (symbol_section_p (sym))
17423 return TRUE;
17424
17425 symsec = S_GET_SEGMENT (sym);
17426
17427 /* This must duplicate the test in adjust_reloc_syms. */
17428 return (!bfd_is_und_section (symsec)
17429 && !bfd_is_abs_section (symsec)
17430 && !bfd_is_com_section (symsec)
17431 && !s_is_linkonce (sym, segtype)
17432 /* A global or weak symbol is treated as external. */
17433 && (!S_IS_WEAK (sym) && !S_IS_EXTERNAL (sym)));
17434 }
17435
17436
17437 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17438 extended opcode. SEC is the section the frag is in. */
17439
17440 static int
17441 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17442 {
17443 int type;
17444 const struct mips16_immed_operand *op;
17445 offsetT val;
17446 int mintiny, maxtiny;
17447 segT symsec;
17448 fragS *sym_frag;
17449
17450 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17451 return 0;
17452 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17453 return 1;
17454
17455 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17456 op = mips16_immed_operands;
17457 while (op->type != type)
17458 {
17459 ++op;
17460 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17461 }
17462
17463 if (op->unsp)
17464 {
17465 if (type == '<' || type == '>' || type == '[' || type == ']')
17466 {
17467 mintiny = 1;
17468 maxtiny = 1 << op->nbits;
17469 }
17470 else
17471 {
17472 mintiny = 0;
17473 maxtiny = (1 << op->nbits) - 1;
17474 }
17475 }
17476 else
17477 {
17478 mintiny = - (1 << (op->nbits - 1));
17479 maxtiny = (1 << (op->nbits - 1)) - 1;
17480 }
17481
17482 sym_frag = symbol_get_frag (fragp->fr_symbol);
17483 val = S_GET_VALUE (fragp->fr_symbol);
17484 symsec = S_GET_SEGMENT (fragp->fr_symbol);
17485
17486 if (op->pcrel)
17487 {
17488 addressT addr;
17489
17490 /* We won't have the section when we are called from
17491 mips_relax_frag. However, we will always have been called
17492 from md_estimate_size_before_relax first. If this is a
17493 branch to a different section, we mark it as such. If SEC is
17494 NULL, and the frag is not marked, then it must be a branch to
17495 the same section. */
17496 if (sec == NULL)
17497 {
17498 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17499 return 1;
17500 }
17501 else
17502 {
17503 /* Must have been called from md_estimate_size_before_relax. */
17504 if (symsec != sec)
17505 {
17506 fragp->fr_subtype =
17507 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17508
17509 /* FIXME: We should support this, and let the linker
17510 catch branches and loads that are out of range. */
17511 as_bad_where (fragp->fr_file, fragp->fr_line,
17512 _("unsupported PC relative reference to different section"));
17513
17514 return 1;
17515 }
17516 if (fragp != sym_frag && sym_frag->fr_address == 0)
17517 /* Assume non-extended on the first relaxation pass.
17518 The address we have calculated will be bogus if this is
17519 a forward branch to another frag, as the forward frag
17520 will have fr_address == 0. */
17521 return 0;
17522 }
17523
17524 /* In this case, we know for sure that the symbol fragment is in
17525 the same section. If the relax_marker of the symbol fragment
17526 differs from the relax_marker of this fragment, we have not
17527 yet adjusted the symbol fragment fr_address. We want to add
17528 in STRETCH in order to get a better estimate of the address.
17529 This particularly matters because of the shift bits. */
17530 if (stretch != 0
17531 && sym_frag->relax_marker != fragp->relax_marker)
17532 {
17533 fragS *f;
17534
17535 /* Adjust stretch for any alignment frag. Note that if have
17536 been expanding the earlier code, the symbol may be
17537 defined in what appears to be an earlier frag. FIXME:
17538 This doesn't handle the fr_subtype field, which specifies
17539 a maximum number of bytes to skip when doing an
17540 alignment. */
17541 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17542 {
17543 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17544 {
17545 if (stretch < 0)
17546 stretch = - ((- stretch)
17547 & ~ ((1 << (int) f->fr_offset) - 1));
17548 else
17549 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17550 if (stretch == 0)
17551 break;
17552 }
17553 }
17554 if (f != NULL)
17555 val += stretch;
17556 }
17557
17558 addr = fragp->fr_address + fragp->fr_fix;
17559
17560 /* The base address rules are complicated. The base address of
17561 a branch is the following instruction. The base address of a
17562 PC relative load or add is the instruction itself, but if it
17563 is in a delay slot (in which case it can not be extended) use
17564 the address of the instruction whose delay slot it is in. */
17565 if (type == 'p' || type == 'q')
17566 {
17567 addr += 2;
17568
17569 /* If we are currently assuming that this frag should be
17570 extended, then, the current address is two bytes
17571 higher. */
17572 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17573 addr += 2;
17574
17575 /* Ignore the low bit in the target, since it will be set
17576 for a text label. */
17577 if ((val & 1) != 0)
17578 --val;
17579 }
17580 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17581 addr -= 4;
17582 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17583 addr -= 2;
17584
17585 val -= addr & ~ ((1 << op->shift) - 1);
17586
17587 /* Branch offsets have an implicit 0 in the lowest bit. */
17588 if (type == 'p' || type == 'q')
17589 val /= 2;
17590
17591 /* If any of the shifted bits are set, we must use an extended
17592 opcode. If the address depends on the size of this
17593 instruction, this can lead to a loop, so we arrange to always
17594 use an extended opcode. We only check this when we are in
17595 the main relaxation loop, when SEC is NULL. */
17596 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17597 {
17598 fragp->fr_subtype =
17599 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17600 return 1;
17601 }
17602
17603 /* If we are about to mark a frag as extended because the value
17604 is precisely maxtiny + 1, then there is a chance of an
17605 infinite loop as in the following code:
17606 la $4,foo
17607 .skip 1020
17608 .align 2
17609 foo:
17610 In this case when the la is extended, foo is 0x3fc bytes
17611 away, so the la can be shrunk, but then foo is 0x400 away, so
17612 the la must be extended. To avoid this loop, we mark the
17613 frag as extended if it was small, and is about to become
17614 extended with a value of maxtiny + 1. */
17615 if (val == ((maxtiny + 1) << op->shift)
17616 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17617 && sec == NULL)
17618 {
17619 fragp->fr_subtype =
17620 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17621 return 1;
17622 }
17623 }
17624 else if (symsec != absolute_section && sec != NULL)
17625 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17626
17627 if ((val & ((1 << op->shift) - 1)) != 0
17628 || val < (mintiny << op->shift)
17629 || val > (maxtiny << op->shift))
17630 return 1;
17631 else
17632 return 0;
17633 }
17634
17635 /* Compute the length of a branch sequence, and adjust the
17636 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
17637 worst-case length is computed, with UPDATE being used to indicate
17638 whether an unconditional (-1), branch-likely (+1) or regular (0)
17639 branch is to be computed. */
17640 static int
17641 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17642 {
17643 bfd_boolean toofar;
17644 int length;
17645
17646 if (fragp
17647 && S_IS_DEFINED (fragp->fr_symbol)
17648 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17649 {
17650 addressT addr;
17651 offsetT val;
17652
17653 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17654
17655 addr = fragp->fr_address + fragp->fr_fix + 4;
17656
17657 val -= addr;
17658
17659 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17660 }
17661 else if (fragp)
17662 /* If the symbol is not defined or it's in a different segment,
17663 assume the user knows what's going on and emit a short
17664 branch. */
17665 toofar = FALSE;
17666 else
17667 toofar = TRUE;
17668
17669 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17670 fragp->fr_subtype
17671 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17672 RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17673 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17674 RELAX_BRANCH_LINK (fragp->fr_subtype),
17675 toofar);
17676
17677 length = 4;
17678 if (toofar)
17679 {
17680 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17681 length += 8;
17682
17683 if (mips_pic != NO_PIC)
17684 {
17685 /* Additional space for PIC loading of target address. */
17686 length += 8;
17687 if (mips_opts.isa == ISA_MIPS1)
17688 /* Additional space for $at-stabilizing nop. */
17689 length += 4;
17690 }
17691
17692 /* If branch is conditional. */
17693 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17694 length += 8;
17695 }
17696
17697 return length;
17698 }
17699
17700 /* Compute the length of a branch sequence, and adjust the
17701 RELAX_MICROMIPS_TOOFAR32 bit accordingly. If FRAGP is NULL, the
17702 worst-case length is computed, with UPDATE being used to indicate
17703 whether an unconditional (-1), or regular (0) branch is to be
17704 computed. */
17705
17706 static int
17707 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17708 {
17709 bfd_boolean toofar;
17710 int length;
17711
17712 if (fragp
17713 && S_IS_DEFINED (fragp->fr_symbol)
17714 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17715 {
17716 addressT addr;
17717 offsetT val;
17718
17719 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17720 /* Ignore the low bit in the target, since it will be set
17721 for a text label. */
17722 if ((val & 1) != 0)
17723 --val;
17724
17725 addr = fragp->fr_address + fragp->fr_fix + 4;
17726
17727 val -= addr;
17728
17729 toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17730 }
17731 else if (fragp)
17732 /* If the symbol is not defined or it's in a different segment,
17733 assume the user knows what's going on and emit a short
17734 branch. */
17735 toofar = FALSE;
17736 else
17737 toofar = TRUE;
17738
17739 if (fragp && update
17740 && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17741 fragp->fr_subtype = (toofar
17742 ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17743 : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17744
17745 length = 4;
17746 if (toofar)
17747 {
17748 bfd_boolean compact_known = fragp != NULL;
17749 bfd_boolean compact = FALSE;
17750 bfd_boolean uncond;
17751
17752 if (compact_known)
17753 compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17754 if (fragp)
17755 uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17756 else
17757 uncond = update < 0;
17758
17759 /* If label is out of range, we turn branch <br>:
17760
17761 <br> label # 4 bytes
17762 0:
17763
17764 into:
17765
17766 j label # 4 bytes
17767 nop # 2 bytes if compact && !PIC
17768 0:
17769 */
17770 if (mips_pic == NO_PIC && (!compact_known || compact))
17771 length += 2;
17772
17773 /* If assembling PIC code, we further turn:
17774
17775 j label # 4 bytes
17776
17777 into:
17778
17779 lw/ld at, %got(label)(gp) # 4 bytes
17780 d/addiu at, %lo(label) # 4 bytes
17781 jr/c at # 2 bytes
17782 */
17783 if (mips_pic != NO_PIC)
17784 length += 6;
17785
17786 /* If branch <br> is conditional, we prepend negated branch <brneg>:
17787
17788 <brneg> 0f # 4 bytes
17789 nop # 2 bytes if !compact
17790 */
17791 if (!uncond)
17792 length += (compact_known && compact) ? 4 : 6;
17793 }
17794
17795 return length;
17796 }
17797
17798 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17799 bit accordingly. */
17800
17801 static int
17802 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17803 {
17804 bfd_boolean toofar;
17805
17806 if (fragp
17807 && S_IS_DEFINED (fragp->fr_symbol)
17808 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17809 {
17810 addressT addr;
17811 offsetT val;
17812 int type;
17813
17814 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17815 /* Ignore the low bit in the target, since it will be set
17816 for a text label. */
17817 if ((val & 1) != 0)
17818 --val;
17819
17820 /* Assume this is a 2-byte branch. */
17821 addr = fragp->fr_address + fragp->fr_fix + 2;
17822
17823 /* We try to avoid the infinite loop by not adding 2 more bytes for
17824 long branches. */
17825
17826 val -= addr;
17827
17828 type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17829 if (type == 'D')
17830 toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17831 else if (type == 'E')
17832 toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17833 else
17834 abort ();
17835 }
17836 else
17837 /* If the symbol is not defined or it's in a different segment,
17838 we emit a normal 32-bit branch. */
17839 toofar = TRUE;
17840
17841 if (fragp && update
17842 && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17843 fragp->fr_subtype
17844 = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17845 : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17846
17847 if (toofar)
17848 return 4;
17849
17850 return 2;
17851 }
17852
17853 /* Estimate the size of a frag before relaxing. Unless this is the
17854 mips16, we are not really relaxing here, and the final size is
17855 encoded in the subtype information. For the mips16, we have to
17856 decide whether we are using an extended opcode or not. */
17857
17858 int
17859 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17860 {
17861 int change;
17862
17863 if (RELAX_BRANCH_P (fragp->fr_subtype))
17864 {
17865
17866 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17867
17868 return fragp->fr_var;
17869 }
17870
17871 if (RELAX_MIPS16_P (fragp->fr_subtype))
17872 /* We don't want to modify the EXTENDED bit here; it might get us
17873 into infinite loops. We change it only in mips_relax_frag(). */
17874 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17875
17876 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17877 {
17878 int length = 4;
17879
17880 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17881 length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17882 if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17883 length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17884 fragp->fr_var = length;
17885
17886 return length;
17887 }
17888
17889 if (mips_pic == NO_PIC)
17890 change = nopic_need_relax (fragp->fr_symbol, 0);
17891 else if (mips_pic == SVR4_PIC)
17892 change = pic_need_relax (fragp->fr_symbol, segtype);
17893 else if (mips_pic == VXWORKS_PIC)
17894 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
17895 change = 0;
17896 else
17897 abort ();
17898
17899 if (change)
17900 {
17901 fragp->fr_subtype |= RELAX_USE_SECOND;
17902 return -RELAX_FIRST (fragp->fr_subtype);
17903 }
17904 else
17905 return -RELAX_SECOND (fragp->fr_subtype);
17906 }
17907
17908 /* This is called to see whether a reloc against a defined symbol
17909 should be converted into a reloc against a section. */
17910
17911 int
17912 mips_fix_adjustable (fixS *fixp)
17913 {
17914 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17915 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17916 return 0;
17917
17918 if (fixp->fx_addsy == NULL)
17919 return 1;
17920
17921 /* If symbol SYM is in a mergeable section, relocations of the form
17922 SYM + 0 can usually be made section-relative. The mergeable data
17923 is then identified by the section offset rather than by the symbol.
17924
17925 However, if we're generating REL LO16 relocations, the offset is split
17926 between the LO16 and parterning high part relocation. The linker will
17927 need to recalculate the complete offset in order to correctly identify
17928 the merge data.
17929
17930 The linker has traditionally not looked for the parterning high part
17931 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17932 placed anywhere. Rather than break backwards compatibility by changing
17933 this, it seems better not to force the issue, and instead keep the
17934 original symbol. This will work with either linker behavior. */
17935 if ((lo16_reloc_p (fixp->fx_r_type)
17936 || reloc_needs_lo_p (fixp->fx_r_type))
17937 && HAVE_IN_PLACE_ADDENDS
17938 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17939 return 0;
17940
17941 /* There is no place to store an in-place offset for JALR relocations.
17942 Likewise an in-range offset of limited PC-relative relocations may
17943 overflow the in-place relocatable field if recalculated against the
17944 start address of the symbol's containing section. */
17945 if (HAVE_IN_PLACE_ADDENDS
17946 && (limited_pcrel_reloc_p (fixp->fx_r_type)
17947 || jalr_reloc_p (fixp->fx_r_type)))
17948 return 0;
17949
17950 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17951 to a floating-point stub. The same is true for non-R_MIPS16_26
17952 relocations against MIPS16 functions; in this case, the stub becomes
17953 the function's canonical address.
17954
17955 Floating-point stubs are stored in unique .mips16.call.* or
17956 .mips16.fn.* sections. If a stub T for function F is in section S,
17957 the first relocation in section S must be against F; this is how the
17958 linker determines the target function. All relocations that might
17959 resolve to T must also be against F. We therefore have the following
17960 restrictions, which are given in an intentionally-redundant way:
17961
17962 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17963 symbols.
17964
17965 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17966 if that stub might be used.
17967
17968 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17969 symbols.
17970
17971 4. We cannot reduce a stub's relocations against MIPS16 symbols if
17972 that stub might be used.
17973
17974 There is a further restriction:
17975
17976 5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17977 R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17978 targets with in-place addends; the relocation field cannot
17979 encode the low bit.
17980
17981 For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17982 against a MIPS16 symbol. We deal with (5) by by not reducing any
17983 such relocations on REL targets.
17984
17985 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17986 relocation against some symbol R, no relocation against R may be
17987 reduced. (Note that this deals with (2) as well as (1) because
17988 relocations against global symbols will never be reduced on ELF
17989 targets.) This approach is a little simpler than trying to detect
17990 stub sections, and gives the "all or nothing" per-symbol consistency
17991 that we have for MIPS16 symbols. */
17992 if (fixp->fx_subsy == NULL
17993 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17994 || *symbol_get_tc (fixp->fx_addsy)
17995 || (HAVE_IN_PLACE_ADDENDS
17996 && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17997 && jmp_reloc_p (fixp->fx_r_type))))
17998 return 0;
17999
18000 return 1;
18001 }
18002
18003 /* Translate internal representation of relocation info to BFD target
18004 format. */
18005
18006 arelent **
18007 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
18008 {
18009 static arelent *retval[4];
18010 arelent *reloc;
18011 bfd_reloc_code_real_type code;
18012
18013 memset (retval, 0, sizeof(retval));
18014 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
18015 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
18016 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
18017 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
18018
18019 if (fixp->fx_pcrel)
18020 {
18021 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
18022 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
18023 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
18024 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
18025 || fixp->fx_r_type == BFD_RELOC_32_PCREL);
18026
18027 /* At this point, fx_addnumber is "symbol offset - pcrel address".
18028 Relocations want only the symbol offset. */
18029 reloc->addend = fixp->fx_addnumber + reloc->address;
18030 }
18031 else
18032 reloc->addend = fixp->fx_addnumber;
18033
18034 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
18035 entry to be used in the relocation's section offset. */
18036 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
18037 {
18038 reloc->address = reloc->addend;
18039 reloc->addend = 0;
18040 }
18041
18042 code = fixp->fx_r_type;
18043
18044 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
18045 if (reloc->howto == NULL)
18046 {
18047 as_bad_where (fixp->fx_file, fixp->fx_line,
18048 _("Can not represent %s relocation in this object file format"),
18049 bfd_get_reloc_code_name (code));
18050 retval[0] = NULL;
18051 }
18052
18053 return retval;
18054 }
18055
18056 /* Relax a machine dependent frag. This returns the amount by which
18057 the current size of the frag should change. */
18058
18059 int
18060 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
18061 {
18062 if (RELAX_BRANCH_P (fragp->fr_subtype))
18063 {
18064 offsetT old_var = fragp->fr_var;
18065
18066 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
18067
18068 return fragp->fr_var - old_var;
18069 }
18070
18071 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18072 {
18073 offsetT old_var = fragp->fr_var;
18074 offsetT new_var = 4;
18075
18076 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
18077 new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
18078 if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
18079 new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
18080 fragp->fr_var = new_var;
18081
18082 return new_var - old_var;
18083 }
18084
18085 if (! RELAX_MIPS16_P (fragp->fr_subtype))
18086 return 0;
18087
18088 if (mips16_extended_frag (fragp, NULL, stretch))
18089 {
18090 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18091 return 0;
18092 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18093 return 2;
18094 }
18095 else
18096 {
18097 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18098 return 0;
18099 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18100 return -2;
18101 }
18102
18103 return 0;
18104 }
18105
18106 /* Convert a machine dependent frag. */
18107
18108 void
18109 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18110 {
18111 if (RELAX_BRANCH_P (fragp->fr_subtype))
18112 {
18113 char *buf;
18114 unsigned long insn;
18115 expressionS exp;
18116 fixS *fixp;
18117
18118 buf = fragp->fr_literal + fragp->fr_fix;
18119 insn = read_insn (buf);
18120
18121 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18122 {
18123 /* We generate a fixup instead of applying it right now
18124 because, if there are linker relaxations, we're going to
18125 need the relocations. */
18126 exp.X_op = O_symbol;
18127 exp.X_add_symbol = fragp->fr_symbol;
18128 exp.X_add_number = fragp->fr_offset;
18129
18130 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18131 BFD_RELOC_16_PCREL_S2);
18132 fixp->fx_file = fragp->fr_file;
18133 fixp->fx_line = fragp->fr_line;
18134
18135 buf = write_insn (buf, insn);
18136 }
18137 else
18138 {
18139 int i;
18140
18141 as_warn_where (fragp->fr_file, fragp->fr_line,
18142 _("Relaxed out-of-range branch into a jump"));
18143
18144 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18145 goto uncond;
18146
18147 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18148 {
18149 /* Reverse the branch. */
18150 switch ((insn >> 28) & 0xf)
18151 {
18152 case 4:
18153 /* bc[0-3][tf]l? instructions can have the condition
18154 reversed by tweaking a single TF bit, and their
18155 opcodes all have 0x4???????. */
18156 gas_assert ((insn & 0xf3e00000) == 0x41000000);
18157 insn ^= 0x00010000;
18158 break;
18159
18160 case 0:
18161 /* bltz 0x04000000 bgez 0x04010000
18162 bltzal 0x04100000 bgezal 0x04110000 */
18163 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18164 insn ^= 0x00010000;
18165 break;
18166
18167 case 1:
18168 /* beq 0x10000000 bne 0x14000000
18169 blez 0x18000000 bgtz 0x1c000000 */
18170 insn ^= 0x04000000;
18171 break;
18172
18173 default:
18174 abort ();
18175 }
18176 }
18177
18178 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18179 {
18180 /* Clear the and-link bit. */
18181 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18182
18183 /* bltzal 0x04100000 bgezal 0x04110000
18184 bltzall 0x04120000 bgezall 0x04130000 */
18185 insn &= ~0x00100000;
18186 }
18187
18188 /* Branch over the branch (if the branch was likely) or the
18189 full jump (not likely case). Compute the offset from the
18190 current instruction to branch to. */
18191 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18192 i = 16;
18193 else
18194 {
18195 /* How many bytes in instructions we've already emitted? */
18196 i = buf - fragp->fr_literal - fragp->fr_fix;
18197 /* How many bytes in instructions from here to the end? */
18198 i = fragp->fr_var - i;
18199 }
18200 /* Convert to instruction count. */
18201 i >>= 2;
18202 /* Branch counts from the next instruction. */
18203 i--;
18204 insn |= i;
18205 /* Branch over the jump. */
18206 buf = write_insn (buf, insn);
18207
18208 /* nop */
18209 buf = write_insn (buf, 0);
18210
18211 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18212 {
18213 /* beql $0, $0, 2f */
18214 insn = 0x50000000;
18215 /* Compute the PC offset from the current instruction to
18216 the end of the variable frag. */
18217 /* How many bytes in instructions we've already emitted? */
18218 i = buf - fragp->fr_literal - fragp->fr_fix;
18219 /* How many bytes in instructions from here to the end? */
18220 i = fragp->fr_var - i;
18221 /* Convert to instruction count. */
18222 i >>= 2;
18223 /* Don't decrement i, because we want to branch over the
18224 delay slot. */
18225 insn |= i;
18226
18227 buf = write_insn (buf, insn);
18228 buf = write_insn (buf, 0);
18229 }
18230
18231 uncond:
18232 if (mips_pic == NO_PIC)
18233 {
18234 /* j or jal. */
18235 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18236 ? 0x0c000000 : 0x08000000);
18237 exp.X_op = O_symbol;
18238 exp.X_add_symbol = fragp->fr_symbol;
18239 exp.X_add_number = fragp->fr_offset;
18240
18241 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18242 FALSE, BFD_RELOC_MIPS_JMP);
18243 fixp->fx_file = fragp->fr_file;
18244 fixp->fx_line = fragp->fr_line;
18245
18246 buf = write_insn (buf, insn);
18247 }
18248 else
18249 {
18250 unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18251
18252 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
18253 insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18254 insn |= at << OP_SH_RT;
18255 exp.X_op = O_symbol;
18256 exp.X_add_symbol = fragp->fr_symbol;
18257 exp.X_add_number = fragp->fr_offset;
18258
18259 if (fragp->fr_offset)
18260 {
18261 exp.X_add_symbol = make_expr_symbol (&exp);
18262 exp.X_add_number = 0;
18263 }
18264
18265 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18266 FALSE, BFD_RELOC_MIPS_GOT16);
18267 fixp->fx_file = fragp->fr_file;
18268 fixp->fx_line = fragp->fr_line;
18269
18270 buf = write_insn (buf, insn);
18271
18272 if (mips_opts.isa == ISA_MIPS1)
18273 /* nop */
18274 buf = write_insn (buf, 0);
18275
18276 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
18277 insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18278 insn |= at << OP_SH_RS | at << OP_SH_RT;
18279
18280 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18281 FALSE, BFD_RELOC_LO16);
18282 fixp->fx_file = fragp->fr_file;
18283 fixp->fx_line = fragp->fr_line;
18284
18285 buf = write_insn (buf, insn);
18286
18287 /* j(al)r $at. */
18288 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18289 insn = 0x0000f809;
18290 else
18291 insn = 0x00000008;
18292 insn |= at << OP_SH_RS;
18293
18294 buf = write_insn (buf, insn);
18295 }
18296 }
18297
18298 fragp->fr_fix += fragp->fr_var;
18299 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18300 return;
18301 }
18302
18303 /* Relax microMIPS branches. */
18304 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18305 {
18306 char *buf = fragp->fr_literal + fragp->fr_fix;
18307 bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18308 bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18309 int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18310 bfd_boolean short_ds;
18311 unsigned long insn;
18312 expressionS exp;
18313 fixS *fixp;
18314
18315 exp.X_op = O_symbol;
18316 exp.X_add_symbol = fragp->fr_symbol;
18317 exp.X_add_number = fragp->fr_offset;
18318
18319 fragp->fr_fix += fragp->fr_var;
18320
18321 /* Handle 16-bit branches that fit or are forced to fit. */
18322 if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18323 {
18324 /* We generate a fixup instead of applying it right now,
18325 because if there is linker relaxation, we're going to
18326 need the relocations. */
18327 if (type == 'D')
18328 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18329 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18330 else if (type == 'E')
18331 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18332 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18333 else
18334 abort ();
18335
18336 fixp->fx_file = fragp->fr_file;
18337 fixp->fx_line = fragp->fr_line;
18338
18339 /* These relocations can have an addend that won't fit in
18340 2 octets. */
18341 fixp->fx_no_overflow = 1;
18342
18343 return;
18344 }
18345
18346 /* Handle 32-bit branches that fit or are forced to fit. */
18347 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18348 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18349 {
18350 /* We generate a fixup instead of applying it right now,
18351 because if there is linker relaxation, we're going to
18352 need the relocations. */
18353 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18354 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18355 fixp->fx_file = fragp->fr_file;
18356 fixp->fx_line = fragp->fr_line;
18357
18358 if (type == 0)
18359 return;
18360 }
18361
18362 /* Relax 16-bit branches to 32-bit branches. */
18363 if (type != 0)
18364 {
18365 insn = read_compressed_insn (buf, 2);
18366
18367 if ((insn & 0xfc00) == 0xcc00) /* b16 */
18368 insn = 0x94000000; /* beq */
18369 else if ((insn & 0xdc00) == 0x8c00) /* beqz16/bnez16 */
18370 {
18371 unsigned long regno;
18372
18373 regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18374 regno = micromips_to_32_reg_d_map [regno];
18375 insn = ((insn & 0x2000) << 16) | 0x94000000; /* beq/bne */
18376 insn |= regno << MICROMIPSOP_SH_RS;
18377 }
18378 else
18379 abort ();
18380
18381 /* Nothing else to do, just write it out. */
18382 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18383 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18384 {
18385 buf = write_compressed_insn (buf, insn, 4);
18386 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18387 return;
18388 }
18389 }
18390 else
18391 insn = read_compressed_insn (buf, 4);
18392
18393 /* Relax 32-bit branches to a sequence of instructions. */
18394 as_warn_where (fragp->fr_file, fragp->fr_line,
18395 _("Relaxed out-of-range branch into a jump"));
18396
18397 /* Set the short-delay-slot bit. */
18398 short_ds = al && (insn & 0x02000000) != 0;
18399
18400 if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18401 {
18402 symbolS *l;
18403
18404 /* Reverse the branch. */
18405 if ((insn & 0xfc000000) == 0x94000000 /* beq */
18406 || (insn & 0xfc000000) == 0xb4000000) /* bne */
18407 insn ^= 0x20000000;
18408 else if ((insn & 0xffe00000) == 0x40000000 /* bltz */
18409 || (insn & 0xffe00000) == 0x40400000 /* bgez */
18410 || (insn & 0xffe00000) == 0x40800000 /* blez */
18411 || (insn & 0xffe00000) == 0x40c00000 /* bgtz */
18412 || (insn & 0xffe00000) == 0x40a00000 /* bnezc */
18413 || (insn & 0xffe00000) == 0x40e00000 /* beqzc */
18414 || (insn & 0xffe00000) == 0x40200000 /* bltzal */
18415 || (insn & 0xffe00000) == 0x40600000 /* bgezal */
18416 || (insn & 0xffe00000) == 0x42200000 /* bltzals */
18417 || (insn & 0xffe00000) == 0x42600000) /* bgezals */
18418 insn ^= 0x00400000;
18419 else if ((insn & 0xffe30000) == 0x43800000 /* bc1f */
18420 || (insn & 0xffe30000) == 0x43a00000 /* bc1t */
18421 || (insn & 0xffe30000) == 0x42800000 /* bc2f */
18422 || (insn & 0xffe30000) == 0x42a00000) /* bc2t */
18423 insn ^= 0x00200000;
18424 else
18425 abort ();
18426
18427 if (al)
18428 {
18429 /* Clear the and-link and short-delay-slot bits. */
18430 gas_assert ((insn & 0xfda00000) == 0x40200000);
18431
18432 /* bltzal 0x40200000 bgezal 0x40600000 */
18433 /* bltzals 0x42200000 bgezals 0x42600000 */
18434 insn &= ~0x02200000;
18435 }
18436
18437 /* Make a label at the end for use with the branch. */
18438 l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18439 micromips_label_inc ();
18440 S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18441
18442 /* Refer to it. */
18443 fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18444 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18445 fixp->fx_file = fragp->fr_file;
18446 fixp->fx_line = fragp->fr_line;
18447
18448 /* Branch over the jump. */
18449 buf = write_compressed_insn (buf, insn, 4);
18450 if (!compact)
18451 /* nop */
18452 buf = write_compressed_insn (buf, 0x0c00, 2);
18453 }
18454
18455 if (mips_pic == NO_PIC)
18456 {
18457 unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s */
18458
18459 /* j/jal/jals <sym> R_MICROMIPS_26_S1 */
18460 insn = al ? jal : 0xd4000000;
18461
18462 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18463 BFD_RELOC_MICROMIPS_JMP);
18464 fixp->fx_file = fragp->fr_file;
18465 fixp->fx_line = fragp->fr_line;
18466
18467 buf = write_compressed_insn (buf, insn, 4);
18468 if (compact)
18469 /* nop */
18470 buf = write_compressed_insn (buf, 0x0c00, 2);
18471 }
18472 else
18473 {
18474 unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18475 unsigned long jalr = short_ds ? 0x45e0 : 0x45c0; /* jalr/s */
18476 unsigned long jr = compact ? 0x45a0 : 0x4580; /* jr/c */
18477
18478 /* lw/ld $at, <sym>($gp) R_MICROMIPS_GOT16 */
18479 insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18480 insn |= at << MICROMIPSOP_SH_RT;
18481
18482 if (exp.X_add_number)
18483 {
18484 exp.X_add_symbol = make_expr_symbol (&exp);
18485 exp.X_add_number = 0;
18486 }
18487
18488 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18489 BFD_RELOC_MICROMIPS_GOT16);
18490 fixp->fx_file = fragp->fr_file;
18491 fixp->fx_line = fragp->fr_line;
18492
18493 buf = write_compressed_insn (buf, insn, 4);
18494
18495 /* d/addiu $at, $at, <sym> R_MICROMIPS_LO16 */
18496 insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18497 insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18498
18499 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18500 BFD_RELOC_MICROMIPS_LO16);
18501 fixp->fx_file = fragp->fr_file;
18502 fixp->fx_line = fragp->fr_line;
18503
18504 buf = write_compressed_insn (buf, insn, 4);
18505
18506 /* jr/jrc/jalr/jalrs $at */
18507 insn = al ? jalr : jr;
18508 insn |= at << MICROMIPSOP_SH_MJ;
18509
18510 buf = write_compressed_insn (buf, insn, 2);
18511 }
18512
18513 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18514 return;
18515 }
18516
18517 if (RELAX_MIPS16_P (fragp->fr_subtype))
18518 {
18519 int type;
18520 const struct mips16_immed_operand *op;
18521 offsetT val;
18522 char *buf;
18523 unsigned int user_length, length;
18524 unsigned long insn;
18525 bfd_boolean ext;
18526
18527 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18528 op = mips16_immed_operands;
18529 while (op->type != type)
18530 ++op;
18531
18532 ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18533 val = resolve_symbol_value (fragp->fr_symbol);
18534 if (op->pcrel)
18535 {
18536 addressT addr;
18537
18538 addr = fragp->fr_address + fragp->fr_fix;
18539
18540 /* The rules for the base address of a PC relative reloc are
18541 complicated; see mips16_extended_frag. */
18542 if (type == 'p' || type == 'q')
18543 {
18544 addr += 2;
18545 if (ext)
18546 addr += 2;
18547 /* Ignore the low bit in the target, since it will be
18548 set for a text label. */
18549 if ((val & 1) != 0)
18550 --val;
18551 }
18552 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18553 addr -= 4;
18554 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18555 addr -= 2;
18556
18557 addr &= ~ (addressT) ((1 << op->shift) - 1);
18558 val -= addr;
18559
18560 /* Make sure the section winds up with the alignment we have
18561 assumed. */
18562 if (op->shift > 0)
18563 record_alignment (asec, op->shift);
18564 }
18565
18566 if (ext
18567 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18568 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18569 as_warn_where (fragp->fr_file, fragp->fr_line,
18570 _("extended instruction in delay slot"));
18571
18572 buf = fragp->fr_literal + fragp->fr_fix;
18573
18574 insn = read_compressed_insn (buf, 2);
18575 if (ext)
18576 insn |= MIPS16_EXTEND;
18577
18578 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18579 user_length = 4;
18580 else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18581 user_length = 2;
18582 else
18583 user_length = 0;
18584
18585 mips16_immed (fragp->fr_file, fragp->fr_line, type,
18586 BFD_RELOC_UNUSED, val, user_length, &insn);
18587
18588 length = (ext ? 4 : 2);
18589 gas_assert (mips16_opcode_length (insn) == length);
18590 write_compressed_insn (buf, insn, length);
18591 fragp->fr_fix += length;
18592 }
18593 else
18594 {
18595 relax_substateT subtype = fragp->fr_subtype;
18596 bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18597 bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18598 int first, second;
18599 fixS *fixp;
18600
18601 first = RELAX_FIRST (subtype);
18602 second = RELAX_SECOND (subtype);
18603 fixp = (fixS *) fragp->fr_opcode;
18604
18605 /* If the delay slot chosen does not match the size of the instruction,
18606 then emit a warning. */
18607 if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18608 || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18609 {
18610 relax_substateT s;
18611 const char *msg;
18612
18613 s = subtype & (RELAX_DELAY_SLOT_16BIT
18614 | RELAX_DELAY_SLOT_SIZE_FIRST
18615 | RELAX_DELAY_SLOT_SIZE_SECOND);
18616 msg = macro_warning (s);
18617 if (msg != NULL)
18618 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18619 subtype &= ~s;
18620 }
18621
18622 /* Possibly emit a warning if we've chosen the longer option. */
18623 if (use_second == second_longer)
18624 {
18625 relax_substateT s;
18626 const char *msg;
18627
18628 s = (subtype
18629 & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18630 msg = macro_warning (s);
18631 if (msg != NULL)
18632 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18633 subtype &= ~s;
18634 }
18635
18636 /* Go through all the fixups for the first sequence. Disable them
18637 (by marking them as done) if we're going to use the second
18638 sequence instead. */
18639 while (fixp
18640 && fixp->fx_frag == fragp
18641 && fixp->fx_where < fragp->fr_fix - second)
18642 {
18643 if (subtype & RELAX_USE_SECOND)
18644 fixp->fx_done = 1;
18645 fixp = fixp->fx_next;
18646 }
18647
18648 /* Go through the fixups for the second sequence. Disable them if
18649 we're going to use the first sequence, otherwise adjust their
18650 addresses to account for the relaxation. */
18651 while (fixp && fixp->fx_frag == fragp)
18652 {
18653 if (subtype & RELAX_USE_SECOND)
18654 fixp->fx_where -= first;
18655 else
18656 fixp->fx_done = 1;
18657 fixp = fixp->fx_next;
18658 }
18659
18660 /* Now modify the frag contents. */
18661 if (subtype & RELAX_USE_SECOND)
18662 {
18663 char *start;
18664
18665 start = fragp->fr_literal + fragp->fr_fix - first - second;
18666 memmove (start, start + first, second);
18667 fragp->fr_fix -= first;
18668 }
18669 else
18670 fragp->fr_fix -= second;
18671 }
18672 }
18673
18674 /* This function is called after the relocs have been generated.
18675 We've been storing mips16 text labels as odd. Here we convert them
18676 back to even for the convenience of the debugger. */
18677
18678 void
18679 mips_frob_file_after_relocs (void)
18680 {
18681 asymbol **syms;
18682 unsigned int count, i;
18683
18684 syms = bfd_get_outsymbols (stdoutput);
18685 count = bfd_get_symcount (stdoutput);
18686 for (i = 0; i < count; i++, syms++)
18687 if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18688 && ((*syms)->value & 1) != 0)
18689 {
18690 (*syms)->value &= ~1;
18691 /* If the symbol has an odd size, it was probably computed
18692 incorrectly, so adjust that as well. */
18693 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18694 ++elf_symbol (*syms)->internal_elf_sym.st_size;
18695 }
18696 }
18697
18698 /* This function is called whenever a label is defined, including fake
18699 labels instantiated off the dot special symbol. It is used when
18700 handling branch delays; if a branch has a label, we assume we cannot
18701 move it. This also bumps the value of the symbol by 1 in compressed
18702 code. */
18703
18704 static void
18705 mips_record_label (symbolS *sym)
18706 {
18707 segment_info_type *si = seg_info (now_seg);
18708 struct insn_label_list *l;
18709
18710 if (free_insn_labels == NULL)
18711 l = (struct insn_label_list *) xmalloc (sizeof *l);
18712 else
18713 {
18714 l = free_insn_labels;
18715 free_insn_labels = l->next;
18716 }
18717
18718 l->label = sym;
18719 l->next = si->label_list;
18720 si->label_list = l;
18721 }
18722
18723 /* This function is called as tc_frob_label() whenever a label is defined
18724 and adds a DWARF-2 record we only want for true labels. */
18725
18726 void
18727 mips_define_label (symbolS *sym)
18728 {
18729 mips_record_label (sym);
18730 dwarf2_emit_label (sym);
18731 }
18732
18733 /* This function is called by tc_new_dot_label whenever a new dot symbol
18734 is defined. */
18735
18736 void
18737 mips_add_dot_label (symbolS *sym)
18738 {
18739 mips_record_label (sym);
18740 if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18741 mips_compressed_mark_label (sym);
18742 }
18743 \f
18744 /* Some special processing for a MIPS ELF file. */
18745
18746 void
18747 mips_elf_final_processing (void)
18748 {
18749 /* Write out the register information. */
18750 if (mips_abi != N64_ABI)
18751 {
18752 Elf32_RegInfo s;
18753
18754 s.ri_gprmask = mips_gprmask;
18755 s.ri_cprmask[0] = mips_cprmask[0];
18756 s.ri_cprmask[1] = mips_cprmask[1];
18757 s.ri_cprmask[2] = mips_cprmask[2];
18758 s.ri_cprmask[3] = mips_cprmask[3];
18759 /* The gp_value field is set by the MIPS ELF backend. */
18760
18761 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18762 ((Elf32_External_RegInfo *)
18763 mips_regmask_frag));
18764 }
18765 else
18766 {
18767 Elf64_Internal_RegInfo s;
18768
18769 s.ri_gprmask = mips_gprmask;
18770 s.ri_pad = 0;
18771 s.ri_cprmask[0] = mips_cprmask[0];
18772 s.ri_cprmask[1] = mips_cprmask[1];
18773 s.ri_cprmask[2] = mips_cprmask[2];
18774 s.ri_cprmask[3] = mips_cprmask[3];
18775 /* The gp_value field is set by the MIPS ELF backend. */
18776
18777 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18778 ((Elf64_External_RegInfo *)
18779 mips_regmask_frag));
18780 }
18781
18782 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
18783 sort of BFD interface for this. */
18784 if (mips_any_noreorder)
18785 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18786 if (mips_pic != NO_PIC)
18787 {
18788 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18789 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18790 }
18791 if (mips_abicalls)
18792 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18793
18794 /* Set MIPS ELF flags for ASEs. Note that not all ASEs have flags
18795 defined at present; this might need to change in future. */
18796 if (file_ase_mips16)
18797 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18798 if (file_ase_micromips)
18799 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18800 if (file_ase & ASE_MDMX)
18801 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18802
18803 /* Set the MIPS ELF ABI flags. */
18804 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18805 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18806 else if (mips_abi == O64_ABI)
18807 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18808 else if (mips_abi == EABI_ABI)
18809 {
18810 if (!file_mips_gp32)
18811 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18812 else
18813 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18814 }
18815 else if (mips_abi == N32_ABI)
18816 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18817
18818 /* Nothing to do for N64_ABI. */
18819
18820 if (mips_32bitmode)
18821 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18822
18823 #if 0 /* XXX FIXME */
18824 /* 32 bit code with 64 bit FP registers. */
18825 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18826 elf_elfheader (stdoutput)->e_flags |= ???;
18827 #endif
18828 }
18829 \f
18830 typedef struct proc {
18831 symbolS *func_sym;
18832 symbolS *func_end_sym;
18833 unsigned long reg_mask;
18834 unsigned long reg_offset;
18835 unsigned long fpreg_mask;
18836 unsigned long fpreg_offset;
18837 unsigned long frame_offset;
18838 unsigned long frame_reg;
18839 unsigned long pc_reg;
18840 } procS;
18841
18842 static procS cur_proc;
18843 static procS *cur_proc_ptr;
18844 static int numprocs;
18845
18846 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1", a microMIPS nop
18847 as "2", and a normal nop as "0". */
18848
18849 #define NOP_OPCODE_MIPS 0
18850 #define NOP_OPCODE_MIPS16 1
18851 #define NOP_OPCODE_MICROMIPS 2
18852
18853 char
18854 mips_nop_opcode (void)
18855 {
18856 if (seg_info (now_seg)->tc_segment_info_data.micromips)
18857 return NOP_OPCODE_MICROMIPS;
18858 else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18859 return NOP_OPCODE_MIPS16;
18860 else
18861 return NOP_OPCODE_MIPS;
18862 }
18863
18864 /* Fill in an rs_align_code fragment. Unlike elsewhere we want to use
18865 32-bit microMIPS NOPs here (if applicable). */
18866
18867 void
18868 mips_handle_align (fragS *fragp)
18869 {
18870 char nop_opcode;
18871 char *p;
18872 int bytes, size, excess;
18873 valueT opcode;
18874
18875 if (fragp->fr_type != rs_align_code)
18876 return;
18877
18878 p = fragp->fr_literal + fragp->fr_fix;
18879 nop_opcode = *p;
18880 switch (nop_opcode)
18881 {
18882 case NOP_OPCODE_MICROMIPS:
18883 opcode = micromips_nop32_insn.insn_opcode;
18884 size = 4;
18885 break;
18886 case NOP_OPCODE_MIPS16:
18887 opcode = mips16_nop_insn.insn_opcode;
18888 size = 2;
18889 break;
18890 case NOP_OPCODE_MIPS:
18891 default:
18892 opcode = nop_insn.insn_opcode;
18893 size = 4;
18894 break;
18895 }
18896
18897 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18898 excess = bytes % size;
18899
18900 /* Handle the leading part if we're not inserting a whole number of
18901 instructions, and make it the end of the fixed part of the frag.
18902 Try to fit in a short microMIPS NOP if applicable and possible,
18903 and use zeroes otherwise. */
18904 gas_assert (excess < 4);
18905 fragp->fr_fix += excess;
18906 switch (excess)
18907 {
18908 case 3:
18909 *p++ = '\0';
18910 /* Fall through. */
18911 case 2:
18912 if (nop_opcode == NOP_OPCODE_MICROMIPS && !mips_opts.insn32)
18913 {
18914 p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18915 break;
18916 }
18917 *p++ = '\0';
18918 /* Fall through. */
18919 case 1:
18920 *p++ = '\0';
18921 /* Fall through. */
18922 case 0:
18923 break;
18924 }
18925
18926 md_number_to_chars (p, opcode, size);
18927 fragp->fr_var = size;
18928 }
18929
18930 static void
18931 md_obj_begin (void)
18932 {
18933 }
18934
18935 static void
18936 md_obj_end (void)
18937 {
18938 /* Check for premature end, nesting errors, etc. */
18939 if (cur_proc_ptr)
18940 as_warn (_("missing .end at end of assembly"));
18941 }
18942
18943 static long
18944 get_number (void)
18945 {
18946 int negative = 0;
18947 long val = 0;
18948
18949 if (*input_line_pointer == '-')
18950 {
18951 ++input_line_pointer;
18952 negative = 1;
18953 }
18954 if (!ISDIGIT (*input_line_pointer))
18955 as_bad (_("expected simple number"));
18956 if (input_line_pointer[0] == '0')
18957 {
18958 if (input_line_pointer[1] == 'x')
18959 {
18960 input_line_pointer += 2;
18961 while (ISXDIGIT (*input_line_pointer))
18962 {
18963 val <<= 4;
18964 val |= hex_value (*input_line_pointer++);
18965 }
18966 return negative ? -val : val;
18967 }
18968 else
18969 {
18970 ++input_line_pointer;
18971 while (ISDIGIT (*input_line_pointer))
18972 {
18973 val <<= 3;
18974 val |= *input_line_pointer++ - '0';
18975 }
18976 return negative ? -val : val;
18977 }
18978 }
18979 if (!ISDIGIT (*input_line_pointer))
18980 {
18981 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18982 *input_line_pointer, *input_line_pointer);
18983 as_warn (_("invalid number"));
18984 return -1;
18985 }
18986 while (ISDIGIT (*input_line_pointer))
18987 {
18988 val *= 10;
18989 val += *input_line_pointer++ - '0';
18990 }
18991 return negative ? -val : val;
18992 }
18993
18994 /* The .file directive; just like the usual .file directive, but there
18995 is an initial number which is the ECOFF file index. In the non-ECOFF
18996 case .file implies DWARF-2. */
18997
18998 static void
18999 s_mips_file (int x ATTRIBUTE_UNUSED)
19000 {
19001 static int first_file_directive = 0;
19002
19003 if (ECOFF_DEBUGGING)
19004 {
19005 get_number ();
19006 s_app_file (0);
19007 }
19008 else
19009 {
19010 char *filename;
19011
19012 filename = dwarf2_directive_file (0);
19013
19014 /* Versions of GCC up to 3.1 start files with a ".file"
19015 directive even for stabs output. Make sure that this
19016 ".file" is handled. Note that you need a version of GCC
19017 after 3.1 in order to support DWARF-2 on MIPS. */
19018 if (filename != NULL && ! first_file_directive)
19019 {
19020 (void) new_logical_line (filename, -1);
19021 s_app_file_string (filename, 0);
19022 }
19023 first_file_directive = 1;
19024 }
19025 }
19026
19027 /* The .loc directive, implying DWARF-2. */
19028
19029 static void
19030 s_mips_loc (int x ATTRIBUTE_UNUSED)
19031 {
19032 if (!ECOFF_DEBUGGING)
19033 dwarf2_directive_loc (0);
19034 }
19035
19036 /* The .end directive. */
19037
19038 static void
19039 s_mips_end (int x ATTRIBUTE_UNUSED)
19040 {
19041 symbolS *p;
19042
19043 /* Following functions need their own .frame and .cprestore directives. */
19044 mips_frame_reg_valid = 0;
19045 mips_cprestore_valid = 0;
19046
19047 if (!is_end_of_line[(unsigned char) *input_line_pointer])
19048 {
19049 p = get_symbol ();
19050 demand_empty_rest_of_line ();
19051 }
19052 else
19053 p = NULL;
19054
19055 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19056 as_warn (_(".end not in text section"));
19057
19058 if (!cur_proc_ptr)
19059 {
19060 as_warn (_(".end directive without a preceding .ent directive."));
19061 demand_empty_rest_of_line ();
19062 return;
19063 }
19064
19065 if (p != NULL)
19066 {
19067 gas_assert (S_GET_NAME (p));
19068 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19069 as_warn (_(".end symbol does not match .ent symbol."));
19070
19071 if (debug_type == DEBUG_STABS)
19072 stabs_generate_asm_endfunc (S_GET_NAME (p),
19073 S_GET_NAME (p));
19074 }
19075 else
19076 as_warn (_(".end directive missing or unknown symbol"));
19077
19078 /* Create an expression to calculate the size of the function. */
19079 if (p && cur_proc_ptr)
19080 {
19081 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19082 expressionS *exp = xmalloc (sizeof (expressionS));
19083
19084 obj->size = exp;
19085 exp->X_op = O_subtract;
19086 exp->X_add_symbol = symbol_temp_new_now ();
19087 exp->X_op_symbol = p;
19088 exp->X_add_number = 0;
19089
19090 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19091 }
19092
19093 /* Generate a .pdr section. */
19094 if (!ECOFF_DEBUGGING && mips_flag_pdr)
19095 {
19096 segT saved_seg = now_seg;
19097 subsegT saved_subseg = now_subseg;
19098 expressionS exp;
19099 char *fragp;
19100
19101 #ifdef md_flush_pending_output
19102 md_flush_pending_output ();
19103 #endif
19104
19105 gas_assert (pdr_seg);
19106 subseg_set (pdr_seg, 0);
19107
19108 /* Write the symbol. */
19109 exp.X_op = O_symbol;
19110 exp.X_add_symbol = p;
19111 exp.X_add_number = 0;
19112 emit_expr (&exp, 4);
19113
19114 fragp = frag_more (7 * 4);
19115
19116 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19117 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19118 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19119 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19120 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19121 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19122 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19123
19124 subseg_set (saved_seg, saved_subseg);
19125 }
19126
19127 cur_proc_ptr = NULL;
19128 }
19129
19130 /* The .aent and .ent directives. */
19131
19132 static void
19133 s_mips_ent (int aent)
19134 {
19135 symbolS *symbolP;
19136
19137 symbolP = get_symbol ();
19138 if (*input_line_pointer == ',')
19139 ++input_line_pointer;
19140 SKIP_WHITESPACE ();
19141 if (ISDIGIT (*input_line_pointer)
19142 || *input_line_pointer == '-')
19143 get_number ();
19144
19145 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19146 as_warn (_(".ent or .aent not in text section."));
19147
19148 if (!aent && cur_proc_ptr)
19149 as_warn (_("missing .end"));
19150
19151 if (!aent)
19152 {
19153 /* This function needs its own .frame and .cprestore directives. */
19154 mips_frame_reg_valid = 0;
19155 mips_cprestore_valid = 0;
19156
19157 cur_proc_ptr = &cur_proc;
19158 memset (cur_proc_ptr, '\0', sizeof (procS));
19159
19160 cur_proc_ptr->func_sym = symbolP;
19161
19162 ++numprocs;
19163
19164 if (debug_type == DEBUG_STABS)
19165 stabs_generate_asm_func (S_GET_NAME (symbolP),
19166 S_GET_NAME (symbolP));
19167 }
19168
19169 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19170
19171 demand_empty_rest_of_line ();
19172 }
19173
19174 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19175 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19176 s_mips_frame is used so that we can set the PDR information correctly.
19177 We can't use the ecoff routines because they make reference to the ecoff
19178 symbol table (in the mdebug section). */
19179
19180 static void
19181 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19182 {
19183 if (ECOFF_DEBUGGING)
19184 s_ignore (ignore);
19185 else
19186 {
19187 long val;
19188
19189 if (cur_proc_ptr == (procS *) NULL)
19190 {
19191 as_warn (_(".frame outside of .ent"));
19192 demand_empty_rest_of_line ();
19193 return;
19194 }
19195
19196 cur_proc_ptr->frame_reg = tc_get_register (1);
19197
19198 SKIP_WHITESPACE ();
19199 if (*input_line_pointer++ != ','
19200 || get_absolute_expression_and_terminator (&val) != ',')
19201 {
19202 as_warn (_("Bad .frame directive"));
19203 --input_line_pointer;
19204 demand_empty_rest_of_line ();
19205 return;
19206 }
19207
19208 cur_proc_ptr->frame_offset = val;
19209 cur_proc_ptr->pc_reg = tc_get_register (0);
19210
19211 demand_empty_rest_of_line ();
19212 }
19213 }
19214
19215 /* The .fmask and .mask directives. If the mdebug section is present
19216 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19217 embedded targets, s_mips_mask is used so that we can set the PDR
19218 information correctly. We can't use the ecoff routines because they
19219 make reference to the ecoff symbol table (in the mdebug section). */
19220
19221 static void
19222 s_mips_mask (int reg_type)
19223 {
19224 if (ECOFF_DEBUGGING)
19225 s_ignore (reg_type);
19226 else
19227 {
19228 long mask, off;
19229
19230 if (cur_proc_ptr == (procS *) NULL)
19231 {
19232 as_warn (_(".mask/.fmask outside of .ent"));
19233 demand_empty_rest_of_line ();
19234 return;
19235 }
19236
19237 if (get_absolute_expression_and_terminator (&mask) != ',')
19238 {
19239 as_warn (_("Bad .mask/.fmask directive"));
19240 --input_line_pointer;
19241 demand_empty_rest_of_line ();
19242 return;
19243 }
19244
19245 off = get_absolute_expression ();
19246
19247 if (reg_type == 'F')
19248 {
19249 cur_proc_ptr->fpreg_mask = mask;
19250 cur_proc_ptr->fpreg_offset = off;
19251 }
19252 else
19253 {
19254 cur_proc_ptr->reg_mask = mask;
19255 cur_proc_ptr->reg_offset = off;
19256 }
19257
19258 demand_empty_rest_of_line ();
19259 }
19260 }
19261
19262 /* A table describing all the processors gas knows about. Names are
19263 matched in the order listed.
19264
19265 To ease comparison, please keep this table in the same order as
19266 gcc's mips_cpu_info_table[]. */
19267 static const struct mips_cpu_info mips_cpu_info_table[] =
19268 {
19269 /* Entries for generic ISAs */
19270 { "mips1", MIPS_CPU_IS_ISA, 0, ISA_MIPS1, CPU_R3000 },
19271 { "mips2", MIPS_CPU_IS_ISA, 0, ISA_MIPS2, CPU_R6000 },
19272 { "mips3", MIPS_CPU_IS_ISA, 0, ISA_MIPS3, CPU_R4000 },
19273 { "mips4", MIPS_CPU_IS_ISA, 0, ISA_MIPS4, CPU_R8000 },
19274 { "mips5", MIPS_CPU_IS_ISA, 0, ISA_MIPS5, CPU_MIPS5 },
19275 { "mips32", MIPS_CPU_IS_ISA, 0, ISA_MIPS32, CPU_MIPS32 },
19276 { "mips32r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19277 { "mips64", MIPS_CPU_IS_ISA, 0, ISA_MIPS64, CPU_MIPS64 },
19278 { "mips64r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS64R2, CPU_MIPS64R2 },
19279
19280 /* MIPS I */
19281 { "r3000", 0, 0, ISA_MIPS1, CPU_R3000 },
19282 { "r2000", 0, 0, ISA_MIPS1, CPU_R3000 },
19283 { "r3900", 0, 0, ISA_MIPS1, CPU_R3900 },
19284
19285 /* MIPS II */
19286 { "r6000", 0, 0, ISA_MIPS2, CPU_R6000 },
19287
19288 /* MIPS III */
19289 { "r4000", 0, 0, ISA_MIPS3, CPU_R4000 },
19290 { "r4010", 0, 0, ISA_MIPS2, CPU_R4010 },
19291 { "vr4100", 0, 0, ISA_MIPS3, CPU_VR4100 },
19292 { "vr4111", 0, 0, ISA_MIPS3, CPU_R4111 },
19293 { "vr4120", 0, 0, ISA_MIPS3, CPU_VR4120 },
19294 { "vr4130", 0, 0, ISA_MIPS3, CPU_VR4120 },
19295 { "vr4181", 0, 0, ISA_MIPS3, CPU_R4111 },
19296 { "vr4300", 0, 0, ISA_MIPS3, CPU_R4300 },
19297 { "r4400", 0, 0, ISA_MIPS3, CPU_R4400 },
19298 { "r4600", 0, 0, ISA_MIPS3, CPU_R4600 },
19299 { "orion", 0, 0, ISA_MIPS3, CPU_R4600 },
19300 { "r4650", 0, 0, ISA_MIPS3, CPU_R4650 },
19301 { "r5900", 0, 0, ISA_MIPS3, CPU_R5900 },
19302 /* ST Microelectronics Loongson 2E and 2F cores */
19303 { "loongson2e", 0, 0, ISA_MIPS3, CPU_LOONGSON_2E },
19304 { "loongson2f", 0, 0, ISA_MIPS3, CPU_LOONGSON_2F },
19305
19306 /* MIPS IV */
19307 { "r8000", 0, 0, ISA_MIPS4, CPU_R8000 },
19308 { "r10000", 0, 0, ISA_MIPS4, CPU_R10000 },
19309 { "r12000", 0, 0, ISA_MIPS4, CPU_R12000 },
19310 { "r14000", 0, 0, ISA_MIPS4, CPU_R14000 },
19311 { "r16000", 0, 0, ISA_MIPS4, CPU_R16000 },
19312 { "vr5000", 0, 0, ISA_MIPS4, CPU_R5000 },
19313 { "vr5400", 0, 0, ISA_MIPS4, CPU_VR5400 },
19314 { "vr5500", 0, 0, ISA_MIPS4, CPU_VR5500 },
19315 { "rm5200", 0, 0, ISA_MIPS4, CPU_R5000 },
19316 { "rm5230", 0, 0, ISA_MIPS4, CPU_R5000 },
19317 { "rm5231", 0, 0, ISA_MIPS4, CPU_R5000 },
19318 { "rm5261", 0, 0, ISA_MIPS4, CPU_R5000 },
19319 { "rm5721", 0, 0, ISA_MIPS4, CPU_R5000 },
19320 { "rm7000", 0, 0, ISA_MIPS4, CPU_RM7000 },
19321 { "rm9000", 0, 0, ISA_MIPS4, CPU_RM9000 },
19322
19323 /* MIPS 32 */
19324 { "4kc", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19325 { "4km", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19326 { "4kp", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19327 { "4ksc", 0, ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
19328
19329 /* MIPS 32 Release 2 */
19330 { "4kec", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19331 { "4kem", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19332 { "4kep", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19333 { "4ksd", 0, ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
19334 { "m4k", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19335 { "m4kp", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19336 { "m14k", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19337 { "m14kc", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19338 { "m14ke", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19339 ISA_MIPS32R2, CPU_MIPS32R2 },
19340 { "m14kec", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19341 ISA_MIPS32R2, CPU_MIPS32R2 },
19342 { "24kc", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19343 { "24kf2_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19344 { "24kf", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19345 { "24kf1_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19346 /* Deprecated forms of the above. */
19347 { "24kfx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19348 { "24kx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19349 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
19350 { "24kec", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19351 { "24kef2_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19352 { "24kef", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19353 { "24kef1_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19354 /* Deprecated forms of the above. */
19355 { "24kefx", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19356 { "24kex", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19357 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
19358 { "34kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19359 { "34kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19360 { "34kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19361 { "34kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19362 /* Deprecated forms of the above. */
19363 { "34kfx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19364 { "34kx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19365 /* 34Kn is a 34kc without DSP. */
19366 { "34kn", 0, ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19367 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
19368 { "74kc", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19369 { "74kf2_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19370 { "74kf", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19371 { "74kf1_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19372 { "74kf3_2", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19373 /* Deprecated forms of the above. */
19374 { "74kfx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19375 { "74kx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19376 /* 1004K cores are multiprocessor versions of the 34K. */
19377 { "1004kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19378 { "1004kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19379 { "1004kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19380 { "1004kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19381
19382 /* MIPS 64 */
19383 { "5kc", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19384 { "5kf", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19385 { "20kc", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19386 { "25kf", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19387
19388 /* Broadcom SB-1 CPU core */
19389 { "sb1", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19390 /* Broadcom SB-1A CPU core */
19391 { "sb1a", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19392
19393 { "loongson3a", 0, 0, ISA_MIPS64, CPU_LOONGSON_3A },
19394
19395 /* MIPS 64 Release 2 */
19396
19397 /* Cavium Networks Octeon CPU core */
19398 { "octeon", 0, 0, ISA_MIPS64R2, CPU_OCTEON },
19399 { "octeon+", 0, 0, ISA_MIPS64R2, CPU_OCTEONP },
19400 { "octeon2", 0, 0, ISA_MIPS64R2, CPU_OCTEON2 },
19401
19402 /* RMI Xlr */
19403 { "xlr", 0, 0, ISA_MIPS64, CPU_XLR },
19404
19405 /* Broadcom XLP.
19406 XLP is mostly like XLR, with the prominent exception that it is
19407 MIPS64R2 rather than MIPS64. */
19408 { "xlp", 0, 0, ISA_MIPS64R2, CPU_XLR },
19409
19410 /* End marker */
19411 { NULL, 0, 0, 0, 0 }
19412 };
19413
19414
19415 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19416 with a final "000" replaced by "k". Ignore case.
19417
19418 Note: this function is shared between GCC and GAS. */
19419
19420 static bfd_boolean
19421 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19422 {
19423 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19424 given++, canonical++;
19425
19426 return ((*given == 0 && *canonical == 0)
19427 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19428 }
19429
19430
19431 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19432 CPU name. We've traditionally allowed a lot of variation here.
19433
19434 Note: this function is shared between GCC and GAS. */
19435
19436 static bfd_boolean
19437 mips_matching_cpu_name_p (const char *canonical, const char *given)
19438 {
19439 /* First see if the name matches exactly, or with a final "000"
19440 turned into "k". */
19441 if (mips_strict_matching_cpu_name_p (canonical, given))
19442 return TRUE;
19443
19444 /* If not, try comparing based on numerical designation alone.
19445 See if GIVEN is an unadorned number, or 'r' followed by a number. */
19446 if (TOLOWER (*given) == 'r')
19447 given++;
19448 if (!ISDIGIT (*given))
19449 return FALSE;
19450
19451 /* Skip over some well-known prefixes in the canonical name,
19452 hoping to find a number there too. */
19453 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19454 canonical += 2;
19455 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19456 canonical += 2;
19457 else if (TOLOWER (canonical[0]) == 'r')
19458 canonical += 1;
19459
19460 return mips_strict_matching_cpu_name_p (canonical, given);
19461 }
19462
19463
19464 /* Parse an option that takes the name of a processor as its argument.
19465 OPTION is the name of the option and CPU_STRING is the argument.
19466 Return the corresponding processor enumeration if the CPU_STRING is
19467 recognized, otherwise report an error and return null.
19468
19469 A similar function exists in GCC. */
19470
19471 static const struct mips_cpu_info *
19472 mips_parse_cpu (const char *option, const char *cpu_string)
19473 {
19474 const struct mips_cpu_info *p;
19475
19476 /* 'from-abi' selects the most compatible architecture for the given
19477 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
19478 EABIs, we have to decide whether we're using the 32-bit or 64-bit
19479 version. Look first at the -mgp options, if given, otherwise base
19480 the choice on MIPS_DEFAULT_64BIT.
19481
19482 Treat NO_ABI like the EABIs. One reason to do this is that the
19483 plain 'mips' and 'mips64' configs have 'from-abi' as their default
19484 architecture. This code picks MIPS I for 'mips' and MIPS III for
19485 'mips64', just as we did in the days before 'from-abi'. */
19486 if (strcasecmp (cpu_string, "from-abi") == 0)
19487 {
19488 if (ABI_NEEDS_32BIT_REGS (mips_abi))
19489 return mips_cpu_info_from_isa (ISA_MIPS1);
19490
19491 if (ABI_NEEDS_64BIT_REGS (mips_abi))
19492 return mips_cpu_info_from_isa (ISA_MIPS3);
19493
19494 if (file_mips_gp32 >= 0)
19495 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19496
19497 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19498 ? ISA_MIPS3
19499 : ISA_MIPS1);
19500 }
19501
19502 /* 'default' has traditionally been a no-op. Probably not very useful. */
19503 if (strcasecmp (cpu_string, "default") == 0)
19504 return 0;
19505
19506 for (p = mips_cpu_info_table; p->name != 0; p++)
19507 if (mips_matching_cpu_name_p (p->name, cpu_string))
19508 return p;
19509
19510 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19511 return 0;
19512 }
19513
19514 /* Return the canonical processor information for ISA (a member of the
19515 ISA_MIPS* enumeration). */
19516
19517 static const struct mips_cpu_info *
19518 mips_cpu_info_from_isa (int isa)
19519 {
19520 int i;
19521
19522 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19523 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19524 && isa == mips_cpu_info_table[i].isa)
19525 return (&mips_cpu_info_table[i]);
19526
19527 return NULL;
19528 }
19529
19530 static const struct mips_cpu_info *
19531 mips_cpu_info_from_arch (int arch)
19532 {
19533 int i;
19534
19535 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19536 if (arch == mips_cpu_info_table[i].cpu)
19537 return (&mips_cpu_info_table[i]);
19538
19539 return NULL;
19540 }
19541 \f
19542 static void
19543 show (FILE *stream, const char *string, int *col_p, int *first_p)
19544 {
19545 if (*first_p)
19546 {
19547 fprintf (stream, "%24s", "");
19548 *col_p = 24;
19549 }
19550 else
19551 {
19552 fprintf (stream, ", ");
19553 *col_p += 2;
19554 }
19555
19556 if (*col_p + strlen (string) > 72)
19557 {
19558 fprintf (stream, "\n%24s", "");
19559 *col_p = 24;
19560 }
19561
19562 fprintf (stream, "%s", string);
19563 *col_p += strlen (string);
19564
19565 *first_p = 0;
19566 }
19567
19568 void
19569 md_show_usage (FILE *stream)
19570 {
19571 int column, first;
19572 size_t i;
19573
19574 fprintf (stream, _("\
19575 MIPS options:\n\
19576 -EB generate big endian output\n\
19577 -EL generate little endian output\n\
19578 -g, -g2 do not remove unneeded NOPs or swap branches\n\
19579 -G NUM allow referencing objects up to NUM bytes\n\
19580 implicitly with the gp register [default 8]\n"));
19581 fprintf (stream, _("\
19582 -mips1 generate MIPS ISA I instructions\n\
19583 -mips2 generate MIPS ISA II instructions\n\
19584 -mips3 generate MIPS ISA III instructions\n\
19585 -mips4 generate MIPS ISA IV instructions\n\
19586 -mips5 generate MIPS ISA V instructions\n\
19587 -mips32 generate MIPS32 ISA instructions\n\
19588 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
19589 -mips64 generate MIPS64 ISA instructions\n\
19590 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
19591 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
19592
19593 first = 1;
19594
19595 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19596 show (stream, mips_cpu_info_table[i].name, &column, &first);
19597 show (stream, "from-abi", &column, &first);
19598 fputc ('\n', stream);
19599
19600 fprintf (stream, _("\
19601 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19602 -no-mCPU don't generate code specific to CPU.\n\
19603 For -mCPU and -no-mCPU, CPU must be one of:\n"));
19604
19605 first = 1;
19606
19607 show (stream, "3900", &column, &first);
19608 show (stream, "4010", &column, &first);
19609 show (stream, "4100", &column, &first);
19610 show (stream, "4650", &column, &first);
19611 fputc ('\n', stream);
19612
19613 fprintf (stream, _("\
19614 -mips16 generate mips16 instructions\n\
19615 -no-mips16 do not generate mips16 instructions\n"));
19616 fprintf (stream, _("\
19617 -mmicromips generate microMIPS instructions\n\
19618 -mno-micromips do not generate microMIPS instructions\n"));
19619 fprintf (stream, _("\
19620 -msmartmips generate smartmips instructions\n\
19621 -mno-smartmips do not generate smartmips instructions\n"));
19622 fprintf (stream, _("\
19623 -mdsp generate DSP instructions\n\
19624 -mno-dsp do not generate DSP instructions\n"));
19625 fprintf (stream, _("\
19626 -mdspr2 generate DSP R2 instructions\n\
19627 -mno-dspr2 do not generate DSP R2 instructions\n"));
19628 fprintf (stream, _("\
19629 -mmt generate MT instructions\n\
19630 -mno-mt do not generate MT instructions\n"));
19631 fprintf (stream, _("\
19632 -mmcu generate MCU instructions\n\
19633 -mno-mcu do not generate MCU instructions\n"));
19634 fprintf (stream, _("\
19635 -mvirt generate Virtualization instructions\n\
19636 -mno-virt do not generate Virtualization instructions\n"));
19637 fprintf (stream, _("\
19638 -minsn32 only generate 32-bit microMIPS instructions\n\
19639 -mno-insn32 generate all microMIPS instructions\n"));
19640 fprintf (stream, _("\
19641 -mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
19642 -mfix-loongson2f-nop work around Loongson2F NOP errata\n\
19643 -mfix-vr4120 work around certain VR4120 errata\n\
19644 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
19645 -mfix-24k insert a nop after ERET and DERET instructions\n\
19646 -mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
19647 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
19648 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
19649 -msym32 assume all symbols have 32-bit values\n\
19650 -O0 remove unneeded NOPs, do not swap branches\n\
19651 -O remove unneeded NOPs and swap branches\n\
19652 --trap, --no-break trap exception on div by 0 and mult overflow\n\
19653 --break, --no-trap break exception on div by 0 and mult overflow\n"));
19654 fprintf (stream, _("\
19655 -mhard-float allow floating-point instructions\n\
19656 -msoft-float do not allow floating-point instructions\n\
19657 -msingle-float only allow 32-bit floating-point operations\n\
19658 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
19659 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
19660 --[no-]relax-branch [dis]allow out-of-range branches to be relaxed\n"
19661 ));
19662 fprintf (stream, _("\
19663 -KPIC, -call_shared generate SVR4 position independent code\n\
19664 -call_nonpic generate non-PIC code that can operate with DSOs\n\
19665 -mvxworks-pic generate VxWorks position independent code\n\
19666 -non_shared do not generate code that can operate with DSOs\n\
19667 -xgot assume a 32 bit GOT\n\
19668 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
19669 -mshared, -mno-shared disable/enable .cpload optimization for\n\
19670 position dependent (non shared) code\n\
19671 -mabi=ABI create ABI conformant object file for:\n"));
19672
19673 first = 1;
19674
19675 show (stream, "32", &column, &first);
19676 show (stream, "o64", &column, &first);
19677 show (stream, "n32", &column, &first);
19678 show (stream, "64", &column, &first);
19679 show (stream, "eabi", &column, &first);
19680
19681 fputc ('\n', stream);
19682
19683 fprintf (stream, _("\
19684 -32 create o32 ABI object file (default)\n\
19685 -n32 create n32 ABI object file\n\
19686 -64 create 64 ABI object file\n"));
19687 }
19688
19689 #ifdef TE_IRIX
19690 enum dwarf2_format
19691 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19692 {
19693 if (HAVE_64BIT_SYMBOLS)
19694 return dwarf2_format_64bit_irix;
19695 else
19696 return dwarf2_format_32bit;
19697 }
19698 #endif
19699
19700 int
19701 mips_dwarf2_addr_size (void)
19702 {
19703 if (HAVE_64BIT_OBJECTS)
19704 return 8;
19705 else
19706 return 4;
19707 }
19708
19709 /* Standard calling conventions leave the CFA at SP on entry. */
19710 void
19711 mips_cfi_frame_initial_instructions (void)
19712 {
19713 cfi_add_CFA_def_cfa_register (SP);
19714 }
19715
19716 int
19717 tc_mips_regname_to_dw2regnum (char *regname)
19718 {
19719 unsigned int regnum = -1;
19720 unsigned int reg;
19721
19722 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19723 regnum = reg;
19724
19725 return regnum;
19726 }
This page took 0.586564 seconds and 5 git commands to generate.