include/opcode/
[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 /* Restrict general purpose registers and floating point registers
235 to 32 bit. This is initially determined when -mgp32 or -mfp32
236 is passed but can changed if the assembler code uses .set mipsN. */
237 int gp32;
238 int fp32;
239 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
240 command line option, and the default CPU. */
241 int arch;
242 /* True if ".set sym32" is in effect. */
243 bfd_boolean sym32;
244 /* True if floating-point operations are not allowed. Changed by .set
245 softfloat or .set hardfloat, by command line options -msoft-float or
246 -mhard-float. The default is false. */
247 bfd_boolean soft_float;
248
249 /* True if only single-precision floating-point operations are allowed.
250 Changed by .set singlefloat or .set doublefloat, command-line options
251 -msingle-float or -mdouble-float. The default is false. */
252 bfd_boolean single_float;
253 };
254
255 /* This is the struct we use to hold the current set of options. Note
256 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
257 -1 to indicate that they have not been initialized. */
258
259 /* True if -mgp32 was passed. */
260 static int file_mips_gp32 = -1;
261
262 /* True if -mfp32 was passed. */
263 static int file_mips_fp32 = -1;
264
265 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
266 static int file_mips_soft_float = 0;
267
268 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
269 static int file_mips_single_float = 0;
270
271 static struct mips_set_options mips_opts =
272 {
273 /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
274 /* noreorder */ 0, /* at */ ATREG, /* warn_about_macros */ 0,
275 /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* gp32 */ 0,
276 /* fp32 */ 0, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
277 /* soft_float */ FALSE, /* single_float */ FALSE
278 };
279
280 /* The set of ASEs that were selected on the command line, either
281 explicitly via ASE options or implicitly through things like -march. */
282 static unsigned int file_ase;
283
284 /* Which bits of file_ase were explicitly set or cleared by ASE options. */
285 static unsigned int file_ase_explicit;
286
287 /* These variables are filled in with the masks of registers used.
288 The object format code reads them and puts them in the appropriate
289 place. */
290 unsigned long mips_gprmask;
291 unsigned long mips_cprmask[4];
292
293 /* MIPS ISA we are using for this output file. */
294 static int file_mips_isa = ISA_UNKNOWN;
295
296 /* True if any MIPS16 code was produced. */
297 static int file_ase_mips16;
298
299 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
300 || mips_opts.isa == ISA_MIPS32R2 \
301 || mips_opts.isa == ISA_MIPS64 \
302 || mips_opts.isa == ISA_MIPS64R2)
303
304 /* True if any microMIPS code was produced. */
305 static int file_ase_micromips;
306
307 /* True if we want to create R_MIPS_JALR for jalr $25. */
308 #ifdef TE_IRIX
309 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
310 #else
311 /* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
312 because there's no place for any addend, the only acceptable
313 expression is a bare symbol. */
314 #define MIPS_JALR_HINT_P(EXPR) \
315 (!HAVE_IN_PLACE_ADDENDS \
316 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
317 #endif
318
319 /* The argument of the -march= flag. The architecture we are assembling. */
320 static int file_mips_arch = CPU_UNKNOWN;
321 static const char *mips_arch_string;
322
323 /* The argument of the -mtune= flag. The architecture for which we
324 are optimizing. */
325 static int mips_tune = CPU_UNKNOWN;
326 static const char *mips_tune_string;
327
328 /* True when generating 32-bit code for a 64-bit processor. */
329 static int mips_32bitmode = 0;
330
331 /* True if the given ABI requires 32-bit registers. */
332 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
333
334 /* Likewise 64-bit registers. */
335 #define ABI_NEEDS_64BIT_REGS(ABI) \
336 ((ABI) == N32_ABI \
337 || (ABI) == N64_ABI \
338 || (ABI) == O64_ABI)
339
340 /* Return true if ISA supports 64 bit wide gp registers. */
341 #define ISA_HAS_64BIT_REGS(ISA) \
342 ((ISA) == ISA_MIPS3 \
343 || (ISA) == ISA_MIPS4 \
344 || (ISA) == ISA_MIPS5 \
345 || (ISA) == ISA_MIPS64 \
346 || (ISA) == ISA_MIPS64R2)
347
348 /* Return true if ISA supports 64 bit wide float registers. */
349 #define ISA_HAS_64BIT_FPRS(ISA) \
350 ((ISA) == ISA_MIPS3 \
351 || (ISA) == ISA_MIPS4 \
352 || (ISA) == ISA_MIPS5 \
353 || (ISA) == ISA_MIPS32R2 \
354 || (ISA) == ISA_MIPS64 \
355 || (ISA) == ISA_MIPS64R2)
356
357 /* Return true if ISA supports 64-bit right rotate (dror et al.)
358 instructions. */
359 #define ISA_HAS_DROR(ISA) \
360 ((ISA) == ISA_MIPS64R2 \
361 || (mips_opts.micromips \
362 && ISA_HAS_64BIT_REGS (ISA)) \
363 )
364
365 /* Return true if ISA supports 32-bit right rotate (ror et al.)
366 instructions. */
367 #define ISA_HAS_ROR(ISA) \
368 ((ISA) == ISA_MIPS32R2 \
369 || (ISA) == ISA_MIPS64R2 \
370 || (mips_opts.ase & ASE_SMARTMIPS) \
371 || mips_opts.micromips \
372 )
373
374 /* Return true if ISA supports single-precision floats in odd registers. */
375 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
376 ((ISA) == ISA_MIPS32 \
377 || (ISA) == ISA_MIPS32R2 \
378 || (ISA) == ISA_MIPS64 \
379 || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports move to/from high part of a 64-bit
382 floating-point register. */
383 #define ISA_HAS_MXHC1(ISA) \
384 ((ISA) == ISA_MIPS32R2 \
385 || (ISA) == ISA_MIPS64R2)
386
387 #define HAVE_32BIT_GPRS \
388 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
389
390 #define HAVE_32BIT_FPRS \
391 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
392
393 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
394 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
395
396 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
397
398 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
399
400 /* True if relocations are stored in-place. */
401 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
402
403 /* The ABI-derived address size. */
404 #define HAVE_64BIT_ADDRESSES \
405 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
406 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
407
408 /* The size of symbolic constants (i.e., expressions of the form
409 "SYMBOL" or "SYMBOL + OFFSET"). */
410 #define HAVE_32BIT_SYMBOLS \
411 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
412 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
413
414 /* Addresses are loaded in different ways, depending on the address size
415 in use. The n32 ABI Documentation also mandates the use of additions
416 with overflow checking, but existing implementations don't follow it. */
417 #define ADDRESS_ADD_INSN \
418 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
419
420 #define ADDRESS_ADDI_INSN \
421 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
422
423 #define ADDRESS_LOAD_INSN \
424 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
425
426 #define ADDRESS_STORE_INSN \
427 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
428
429 /* Return true if the given CPU supports the MIPS16 ASE. */
430 #define CPU_HAS_MIPS16(cpu) \
431 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
432 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
433
434 /* Return true if the given CPU supports the microMIPS ASE. */
435 #define CPU_HAS_MICROMIPS(cpu) 0
436
437 /* True if CPU has a dror instruction. */
438 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
439
440 /* True if CPU has a ror instruction. */
441 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
442
443 /* True if CPU is in the Octeon family */
444 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
445
446 /* True if CPU has seq/sne and seqi/snei instructions. */
447 #define CPU_HAS_SEQ(CPU) (CPU_IS_OCTEON (CPU))
448
449 /* True, if CPU has support for ldc1 and sdc1. */
450 #define CPU_HAS_LDC1_SDC1(CPU) \
451 ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
452
453 /* True if mflo and mfhi can be immediately followed by instructions
454 which write to the HI and LO registers.
455
456 According to MIPS specifications, MIPS ISAs I, II, and III need
457 (at least) two instructions between the reads of HI/LO and
458 instructions which write them, and later ISAs do not. Contradicting
459 the MIPS specifications, some MIPS IV processor user manuals (e.g.
460 the UM for the NEC Vr5000) document needing the instructions between
461 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
462 MIPS64 and later ISAs to have the interlocks, plus any specific
463 earlier-ISA CPUs for which CPU documentation declares that the
464 instructions are really interlocked. */
465 #define hilo_interlocks \
466 (mips_opts.isa == ISA_MIPS32 \
467 || mips_opts.isa == ISA_MIPS32R2 \
468 || mips_opts.isa == ISA_MIPS64 \
469 || mips_opts.isa == ISA_MIPS64R2 \
470 || mips_opts.arch == CPU_R4010 \
471 || mips_opts.arch == CPU_R5900 \
472 || mips_opts.arch == CPU_R10000 \
473 || mips_opts.arch == CPU_R12000 \
474 || mips_opts.arch == CPU_R14000 \
475 || mips_opts.arch == CPU_R16000 \
476 || mips_opts.arch == CPU_RM7000 \
477 || mips_opts.arch == CPU_VR5500 \
478 || mips_opts.micromips \
479 )
480
481 /* Whether the processor uses hardware interlocks to protect reads
482 from the GPRs after they are loaded from memory, and thus does not
483 require nops to be inserted. This applies to instructions marked
484 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
485 level I and microMIPS mode instructions are always interlocked. */
486 #define gpr_interlocks \
487 (mips_opts.isa != ISA_MIPS1 \
488 || mips_opts.arch == CPU_R3900 \
489 || mips_opts.arch == CPU_R5900 \
490 || mips_opts.micromips \
491 )
492
493 /* Whether the processor uses hardware interlocks to avoid delays
494 required by coprocessor instructions, and thus does not require
495 nops to be inserted. This applies to instructions marked
496 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
497 between instructions marked INSN_WRITE_COND_CODE and ones marked
498 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
499 levels I, II, and III and microMIPS mode instructions are always
500 interlocked. */
501 /* Itbl support may require additional care here. */
502 #define cop_interlocks \
503 ((mips_opts.isa != ISA_MIPS1 \
504 && mips_opts.isa != ISA_MIPS2 \
505 && mips_opts.isa != ISA_MIPS3) \
506 || mips_opts.arch == CPU_R4300 \
507 || mips_opts.micromips \
508 )
509
510 /* Whether the processor uses hardware interlocks to protect reads
511 from coprocessor registers after they are loaded from memory, and
512 thus does not require nops to be inserted. This applies to
513 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
514 requires at MIPS ISA level I and microMIPS mode instructions are
515 always interlocked. */
516 #define cop_mem_interlocks \
517 (mips_opts.isa != ISA_MIPS1 \
518 || mips_opts.micromips \
519 )
520
521 /* Is this a mfhi or mflo instruction? */
522 #define MF_HILO_INSN(PINFO) \
523 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
524
525 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
526 has been selected. This implies, in particular, that addresses of text
527 labels have their LSB set. */
528 #define HAVE_CODE_COMPRESSION \
529 ((mips_opts.mips16 | mips_opts.micromips) != 0)
530
531 /* The minimum and maximum signed values that can be stored in a GPR. */
532 #define GPR_SMAX ((offsetT) (((valueT) 1 << (HAVE_64BIT_GPRS ? 63 : 31)) - 1))
533 #define GPR_SMIN (-GPR_SMAX - 1)
534
535 /* MIPS PIC level. */
536
537 enum mips_pic_level mips_pic;
538
539 /* 1 if we should generate 32 bit offsets from the $gp register in
540 SVR4_PIC mode. Currently has no meaning in other modes. */
541 static int mips_big_got = 0;
542
543 /* 1 if trap instructions should used for overflow rather than break
544 instructions. */
545 static int mips_trap = 0;
546
547 /* 1 if double width floating point constants should not be constructed
548 by assembling two single width halves into two single width floating
549 point registers which just happen to alias the double width destination
550 register. On some architectures this aliasing can be disabled by a bit
551 in the status register, and the setting of this bit cannot be determined
552 automatically at assemble time. */
553 static int mips_disable_float_construction;
554
555 /* Non-zero if any .set noreorder directives were used. */
556
557 static int mips_any_noreorder;
558
559 /* Non-zero if nops should be inserted when the register referenced in
560 an mfhi/mflo instruction is read in the next two instructions. */
561 static int mips_7000_hilo_fix;
562
563 /* The size of objects in the small data section. */
564 static unsigned int g_switch_value = 8;
565 /* Whether the -G option was used. */
566 static int g_switch_seen = 0;
567
568 #define N_RMASK 0xc4
569 #define N_VFP 0xd4
570
571 /* If we can determine in advance that GP optimization won't be
572 possible, we can skip the relaxation stuff that tries to produce
573 GP-relative references. This makes delay slot optimization work
574 better.
575
576 This function can only provide a guess, but it seems to work for
577 gcc output. It needs to guess right for gcc, otherwise gcc
578 will put what it thinks is a GP-relative instruction in a branch
579 delay slot.
580
581 I don't know if a fix is needed for the SVR4_PIC mode. I've only
582 fixed it for the non-PIC mode. KR 95/04/07 */
583 static int nopic_need_relax (symbolS *, int);
584
585 /* handle of the OPCODE hash table */
586 static struct hash_control *op_hash = NULL;
587
588 /* The opcode hash table we use for the mips16. */
589 static struct hash_control *mips16_op_hash = NULL;
590
591 /* The opcode hash table we use for the microMIPS ASE. */
592 static struct hash_control *micromips_op_hash = NULL;
593
594 /* This array holds the chars that always start a comment. If the
595 pre-processor is disabled, these aren't very useful */
596 const char comment_chars[] = "#";
597
598 /* This array holds the chars that only start a comment at the beginning of
599 a line. If the line seems to have the form '# 123 filename'
600 .line and .file directives will appear in the pre-processed output */
601 /* Note that input_file.c hand checks for '#' at the beginning of the
602 first line of the input file. This is because the compiler outputs
603 #NO_APP at the beginning of its output. */
604 /* Also note that C style comments are always supported. */
605 const char line_comment_chars[] = "#";
606
607 /* This array holds machine specific line separator characters. */
608 const char line_separator_chars[] = ";";
609
610 /* Chars that can be used to separate mant from exp in floating point nums */
611 const char EXP_CHARS[] = "eE";
612
613 /* Chars that mean this number is a floating point constant */
614 /* As in 0f12.456 */
615 /* or 0d1.2345e12 */
616 const char FLT_CHARS[] = "rRsSfFdDxXpP";
617
618 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
619 changed in read.c . Ideally it shouldn't have to know about it at all,
620 but nothing is ideal around here.
621 */
622
623 static char *insn_error;
624
625 static int auto_align = 1;
626
627 /* When outputting SVR4 PIC code, the assembler needs to know the
628 offset in the stack frame from which to restore the $gp register.
629 This is set by the .cprestore pseudo-op, and saved in this
630 variable. */
631 static offsetT mips_cprestore_offset = -1;
632
633 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
634 more optimizations, it can use a register value instead of a memory-saved
635 offset and even an other register than $gp as global pointer. */
636 static offsetT mips_cpreturn_offset = -1;
637 static int mips_cpreturn_register = -1;
638 static int mips_gp_register = GP;
639 static int mips_gprel_offset = 0;
640
641 /* Whether mips_cprestore_offset has been set in the current function
642 (or whether it has already been warned about, if not). */
643 static int mips_cprestore_valid = 0;
644
645 /* This is the register which holds the stack frame, as set by the
646 .frame pseudo-op. This is needed to implement .cprestore. */
647 static int mips_frame_reg = SP;
648
649 /* Whether mips_frame_reg has been set in the current function
650 (or whether it has already been warned about, if not). */
651 static int mips_frame_reg_valid = 0;
652
653 /* To output NOP instructions correctly, we need to keep information
654 about the previous two instructions. */
655
656 /* Whether we are optimizing. The default value of 2 means to remove
657 unneeded NOPs and swap branch instructions when possible. A value
658 of 1 means to not swap branches. A value of 0 means to always
659 insert NOPs. */
660 static int mips_optimize = 2;
661
662 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
663 equivalent to seeing no -g option at all. */
664 static int mips_debug = 0;
665
666 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
667 #define MAX_VR4130_NOPS 4
668
669 /* The maximum number of NOPs needed to fill delay slots. */
670 #define MAX_DELAY_NOPS 2
671
672 /* The maximum number of NOPs needed for any purpose. */
673 #define MAX_NOPS 4
674
675 /* A list of previous instructions, with index 0 being the most recent.
676 We need to look back MAX_NOPS instructions when filling delay slots
677 or working around processor errata. We need to look back one
678 instruction further if we're thinking about using history[0] to
679 fill a branch delay slot. */
680 static struct mips_cl_insn history[1 + MAX_NOPS];
681
682 /* Nop instructions used by emit_nop. */
683 static struct mips_cl_insn nop_insn;
684 static struct mips_cl_insn mips16_nop_insn;
685 static struct mips_cl_insn micromips_nop16_insn;
686 static struct mips_cl_insn micromips_nop32_insn;
687
688 /* The appropriate nop for the current mode. */
689 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
690 : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
691
692 /* The size of NOP_INSN in bytes. */
693 #define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
694
695 /* If this is set, it points to a frag holding nop instructions which
696 were inserted before the start of a noreorder section. If those
697 nops turn out to be unnecessary, the size of the frag can be
698 decreased. */
699 static fragS *prev_nop_frag;
700
701 /* The number of nop instructions we created in prev_nop_frag. */
702 static int prev_nop_frag_holds;
703
704 /* The number of nop instructions that we know we need in
705 prev_nop_frag. */
706 static int prev_nop_frag_required;
707
708 /* The number of instructions we've seen since prev_nop_frag. */
709 static int prev_nop_frag_since;
710
711 /* Relocations against symbols are sometimes done in two parts, with a HI
712 relocation and a LO relocation. Each relocation has only 16 bits of
713 space to store an addend. This means that in order for the linker to
714 handle carries correctly, it must be able to locate both the HI and
715 the LO relocation. This means that the relocations must appear in
716 order in the relocation table.
717
718 In order to implement this, we keep track of each unmatched HI
719 relocation. We then sort them so that they immediately precede the
720 corresponding LO relocation. */
721
722 struct mips_hi_fixup
723 {
724 /* Next HI fixup. */
725 struct mips_hi_fixup *next;
726 /* This fixup. */
727 fixS *fixp;
728 /* The section this fixup is in. */
729 segT seg;
730 };
731
732 /* The list of unmatched HI relocs. */
733
734 static struct mips_hi_fixup *mips_hi_fixup_list;
735
736 /* The frag containing the last explicit relocation operator.
737 Null if explicit relocations have not been used. */
738
739 static fragS *prev_reloc_op_frag;
740
741 /* Map normal MIPS register numbers to mips16 register numbers. */
742
743 #define X ILLEGAL_REG
744 static const int mips32_to_16_reg_map[] =
745 {
746 X, X, 2, 3, 4, 5, 6, 7,
747 X, X, X, X, X, X, X, X,
748 0, 1, X, X, X, X, X, X,
749 X, X, X, X, X, X, X, X
750 };
751 #undef X
752
753 /* Map mips16 register numbers to normal MIPS register numbers. */
754
755 static const unsigned int mips16_to_32_reg_map[] =
756 {
757 16, 17, 2, 3, 4, 5, 6, 7
758 };
759
760 /* Map normal MIPS register numbers to microMIPS register numbers. */
761
762 #define mips32_to_micromips_reg_b_map mips32_to_16_reg_map
763 #define mips32_to_micromips_reg_c_map mips32_to_16_reg_map
764 #define mips32_to_micromips_reg_d_map mips32_to_16_reg_map
765 #define mips32_to_micromips_reg_e_map mips32_to_16_reg_map
766 #define mips32_to_micromips_reg_f_map mips32_to_16_reg_map
767 #define mips32_to_micromips_reg_g_map mips32_to_16_reg_map
768 #define mips32_to_micromips_reg_l_map mips32_to_16_reg_map
769
770 #define X ILLEGAL_REG
771 /* reg type h: 4, 5, 6. */
772 static const int mips32_to_micromips_reg_h_map[] =
773 {
774 X, X, X, X, 4, 5, 6, X,
775 X, X, X, X, X, X, X, X,
776 X, X, X, X, X, X, X, X,
777 X, X, X, X, X, X, X, X
778 };
779
780 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20. */
781 static const int mips32_to_micromips_reg_m_map[] =
782 {
783 0, X, 2, 3, X, X, X, X,
784 X, X, X, X, X, X, X, X,
785 4, 1, 5, 6, 7, X, X, X,
786 X, X, X, X, X, X, X, X
787 };
788
789 /* reg type q: 0, 2-7. 17. */
790 static const int mips32_to_micromips_reg_q_map[] =
791 {
792 0, X, 2, 3, 4, 5, 6, 7,
793 X, X, X, X, X, X, X, X,
794 X, 1, X, X, X, X, X, X,
795 X, X, X, X, X, X, X, X
796 };
797
798 #define mips32_to_micromips_reg_n_map mips32_to_micromips_reg_m_map
799 #undef X
800
801 /* Map microMIPS register numbers to normal MIPS register numbers. */
802
803 #define micromips_to_32_reg_b_map mips16_to_32_reg_map
804 #define micromips_to_32_reg_c_map mips16_to_32_reg_map
805 #define micromips_to_32_reg_d_map mips16_to_32_reg_map
806 #define micromips_to_32_reg_e_map mips16_to_32_reg_map
807 #define micromips_to_32_reg_f_map mips16_to_32_reg_map
808 #define micromips_to_32_reg_g_map mips16_to_32_reg_map
809
810 /* The microMIPS registers with type h. */
811 static const unsigned int micromips_to_32_reg_h_map[] =
812 {
813 5, 5, 6, 4, 4, 4, 4, 4
814 };
815
816 /* The microMIPS registers with type i. */
817 static const unsigned int micromips_to_32_reg_i_map[] =
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);
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_MSHARED,
1422 OPTION_MNO_SHARED,
1423 OPTION_MSYM32,
1424 OPTION_MNO_SYM32,
1425 OPTION_SOFT_FLOAT,
1426 OPTION_HARD_FLOAT,
1427 OPTION_SINGLE_FLOAT,
1428 OPTION_DOUBLE_FLOAT,
1429 OPTION_32,
1430 OPTION_CALL_SHARED,
1431 OPTION_CALL_NONPIC,
1432 OPTION_NON_SHARED,
1433 OPTION_XGOT,
1434 OPTION_MABI,
1435 OPTION_N32,
1436 OPTION_64,
1437 OPTION_MDEBUG,
1438 OPTION_NO_MDEBUG,
1439 OPTION_PDR,
1440 OPTION_NO_PDR,
1441 OPTION_MVXWORKS_PIC,
1442 OPTION_END_OF_ENUM
1443 };
1444
1445 struct option md_longopts[] =
1446 {
1447 /* Options which specify architecture. */
1448 {"march", required_argument, NULL, OPTION_MARCH},
1449 {"mtune", required_argument, NULL, OPTION_MTUNE},
1450 {"mips0", no_argument, NULL, OPTION_MIPS1},
1451 {"mips1", no_argument, NULL, OPTION_MIPS1},
1452 {"mips2", no_argument, NULL, OPTION_MIPS2},
1453 {"mips3", no_argument, NULL, OPTION_MIPS3},
1454 {"mips4", no_argument, NULL, OPTION_MIPS4},
1455 {"mips5", no_argument, NULL, OPTION_MIPS5},
1456 {"mips32", no_argument, NULL, OPTION_MIPS32},
1457 {"mips64", no_argument, NULL, OPTION_MIPS64},
1458 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
1459 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
1460
1461 /* Options which specify Application Specific Extensions (ASEs). */
1462 {"mips16", no_argument, NULL, OPTION_MIPS16},
1463 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
1464 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
1465 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
1466 {"mdmx", no_argument, NULL, OPTION_MDMX},
1467 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
1468 {"mdsp", no_argument, NULL, OPTION_DSP},
1469 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
1470 {"mmt", no_argument, NULL, OPTION_MT},
1471 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
1472 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
1473 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
1474 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
1475 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
1476 {"meva", no_argument, NULL, OPTION_EVA},
1477 {"mno-eva", no_argument, NULL, OPTION_NO_EVA},
1478 {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
1479 {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
1480 {"mmcu", no_argument, NULL, OPTION_MCU},
1481 {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
1482 {"mvirt", no_argument, NULL, OPTION_VIRT},
1483 {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
1484
1485 /* Old-style architecture options. Don't add more of these. */
1486 {"m4650", no_argument, NULL, OPTION_M4650},
1487 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
1488 {"m4010", no_argument, NULL, OPTION_M4010},
1489 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
1490 {"m4100", no_argument, NULL, OPTION_M4100},
1491 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
1492 {"m3900", no_argument, NULL, OPTION_M3900},
1493 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
1494
1495 /* Options which enable bug fixes. */
1496 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
1497 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1498 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1499 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
1500 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
1501 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
1502 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
1503 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
1504 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
1505 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
1506 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
1507 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
1508 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
1509 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
1510 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
1511
1512 /* Miscellaneous options. */
1513 {"trap", no_argument, NULL, OPTION_TRAP},
1514 {"no-break", no_argument, NULL, OPTION_TRAP},
1515 {"break", no_argument, NULL, OPTION_BREAK},
1516 {"no-trap", no_argument, NULL, OPTION_BREAK},
1517 {"EB", no_argument, NULL, OPTION_EB},
1518 {"EL", no_argument, NULL, OPTION_EL},
1519 {"mfp32", no_argument, NULL, OPTION_FP32},
1520 {"mgp32", no_argument, NULL, OPTION_GP32},
1521 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1522 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1523 {"mfp64", no_argument, NULL, OPTION_FP64},
1524 {"mgp64", no_argument, NULL, OPTION_GP64},
1525 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
1526 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
1527 {"mshared", no_argument, NULL, OPTION_MSHARED},
1528 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
1529 {"msym32", no_argument, NULL, OPTION_MSYM32},
1530 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
1531 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
1532 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
1533 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
1534 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
1535
1536 /* Strictly speaking this next option is ELF specific,
1537 but we allow it for other ports as well in order to
1538 make testing easier. */
1539 {"32", no_argument, NULL, OPTION_32},
1540
1541 /* ELF-specific options. */
1542 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
1543 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
1544 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
1545 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
1546 {"xgot", no_argument, NULL, OPTION_XGOT},
1547 {"mabi", required_argument, NULL, OPTION_MABI},
1548 {"n32", no_argument, NULL, OPTION_N32},
1549 {"64", no_argument, NULL, OPTION_64},
1550 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
1551 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
1552 {"mpdr", no_argument, NULL, OPTION_PDR},
1553 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
1554 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
1555
1556 {NULL, no_argument, NULL, 0}
1557 };
1558 size_t md_longopts_size = sizeof (md_longopts);
1559 \f
1560 /* Information about either an Application Specific Extension or an
1561 optional architecture feature that, for simplicity, we treat in the
1562 same way as an ASE. */
1563 struct mips_ase
1564 {
1565 /* The name of the ASE, used in both the command-line and .set options. */
1566 const char *name;
1567
1568 /* The associated ASE_* flags. If the ASE is available on both 32-bit
1569 and 64-bit architectures, the flags here refer to the subset that
1570 is available on both. */
1571 unsigned int flags;
1572
1573 /* The ASE_* flag used for instructions that are available on 64-bit
1574 architectures but that are not included in FLAGS. */
1575 unsigned int flags64;
1576
1577 /* The command-line options that turn the ASE on and off. */
1578 int option_on;
1579 int option_off;
1580
1581 /* The minimum required architecture revisions for MIPS32, MIPS64,
1582 microMIPS32 and microMIPS64, or -1 if the extension isn't supported. */
1583 int mips32_rev;
1584 int mips64_rev;
1585 int micromips32_rev;
1586 int micromips64_rev;
1587 };
1588
1589 /* A table of all supported ASEs. */
1590 static const struct mips_ase mips_ases[] = {
1591 { "dsp", ASE_DSP, ASE_DSP64,
1592 OPTION_DSP, OPTION_NO_DSP,
1593 2, 2, 2, 2 },
1594
1595 { "dspr2", ASE_DSP | ASE_DSPR2, 0,
1596 OPTION_DSPR2, OPTION_NO_DSPR2,
1597 2, 2, 2, 2 },
1598
1599 { "eva", ASE_EVA, 0,
1600 OPTION_EVA, OPTION_NO_EVA,
1601 2, 2, 2, 2 },
1602
1603 { "mcu", ASE_MCU, 0,
1604 OPTION_MCU, OPTION_NO_MCU,
1605 2, 2, 2, 2 },
1606
1607 /* Deprecated in MIPS64r5, but we don't implement that yet. */
1608 { "mdmx", ASE_MDMX, 0,
1609 OPTION_MDMX, OPTION_NO_MDMX,
1610 -1, 1, -1, -1 },
1611
1612 /* Requires 64-bit FPRs, so the minimum MIPS32 revision is 2. */
1613 { "mips3d", ASE_MIPS3D, 0,
1614 OPTION_MIPS3D, OPTION_NO_MIPS3D,
1615 2, 1, -1, -1 },
1616
1617 { "mt", ASE_MT, 0,
1618 OPTION_MT, OPTION_NO_MT,
1619 2, 2, -1, -1 },
1620
1621 { "smartmips", ASE_SMARTMIPS, 0,
1622 OPTION_SMARTMIPS, OPTION_NO_SMARTMIPS,
1623 1, -1, -1, -1 },
1624
1625 { "virt", ASE_VIRT, ASE_VIRT64,
1626 OPTION_VIRT, OPTION_NO_VIRT,
1627 2, 2, 2, 2 }
1628 };
1629
1630 /* The set of ASEs that require -mfp64. */
1631 #define FP64_ASES (ASE_MIPS3D | ASE_MDMX)
1632
1633 /* Groups of ASE_* flags that represent different revisions of an ASE. */
1634 static const unsigned int mips_ase_groups[] = {
1635 ASE_DSP | ASE_DSPR2
1636 };
1637 \f
1638 /* Pseudo-op table.
1639
1640 The following pseudo-ops from the Kane and Heinrich MIPS book
1641 should be defined here, but are currently unsupported: .alias,
1642 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1643
1644 The following pseudo-ops from the Kane and Heinrich MIPS book are
1645 specific to the type of debugging information being generated, and
1646 should be defined by the object format: .aent, .begin, .bend,
1647 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1648 .vreg.
1649
1650 The following pseudo-ops from the Kane and Heinrich MIPS book are
1651 not MIPS CPU specific, but are also not specific to the object file
1652 format. This file is probably the best place to define them, but
1653 they are not currently supported: .asm0, .endr, .lab, .struct. */
1654
1655 static const pseudo_typeS mips_pseudo_table[] =
1656 {
1657 /* MIPS specific pseudo-ops. */
1658 {"option", s_option, 0},
1659 {"set", s_mipsset, 0},
1660 {"rdata", s_change_sec, 'r'},
1661 {"sdata", s_change_sec, 's'},
1662 {"livereg", s_ignore, 0},
1663 {"abicalls", s_abicalls, 0},
1664 {"cpload", s_cpload, 0},
1665 {"cpsetup", s_cpsetup, 0},
1666 {"cplocal", s_cplocal, 0},
1667 {"cprestore", s_cprestore, 0},
1668 {"cpreturn", s_cpreturn, 0},
1669 {"dtprelword", s_dtprelword, 0},
1670 {"dtpreldword", s_dtpreldword, 0},
1671 {"tprelword", s_tprelword, 0},
1672 {"tpreldword", s_tpreldword, 0},
1673 {"gpvalue", s_gpvalue, 0},
1674 {"gpword", s_gpword, 0},
1675 {"gpdword", s_gpdword, 0},
1676 {"ehword", s_ehword, 0},
1677 {"cpadd", s_cpadd, 0},
1678 {"insn", s_insn, 0},
1679
1680 /* Relatively generic pseudo-ops that happen to be used on MIPS
1681 chips. */
1682 {"asciiz", stringer, 8 + 1},
1683 {"bss", s_change_sec, 'b'},
1684 {"err", s_err, 0},
1685 {"half", s_cons, 1},
1686 {"dword", s_cons, 3},
1687 {"weakext", s_mips_weakext, 0},
1688 {"origin", s_org, 0},
1689 {"repeat", s_rept, 0},
1690
1691 /* For MIPS this is non-standard, but we define it for consistency. */
1692 {"sbss", s_change_sec, 'B'},
1693
1694 /* These pseudo-ops are defined in read.c, but must be overridden
1695 here for one reason or another. */
1696 {"align", s_align, 0},
1697 {"byte", s_cons, 0},
1698 {"data", s_change_sec, 'd'},
1699 {"double", s_float_cons, 'd'},
1700 {"float", s_float_cons, 'f'},
1701 {"globl", s_mips_globl, 0},
1702 {"global", s_mips_globl, 0},
1703 {"hword", s_cons, 1},
1704 {"int", s_cons, 2},
1705 {"long", s_cons, 2},
1706 {"octa", s_cons, 4},
1707 {"quad", s_cons, 3},
1708 {"section", s_change_section, 0},
1709 {"short", s_cons, 1},
1710 {"single", s_float_cons, 'f'},
1711 {"stabd", s_mips_stab, 'd'},
1712 {"stabn", s_mips_stab, 'n'},
1713 {"stabs", s_mips_stab, 's'},
1714 {"text", s_change_sec, 't'},
1715 {"word", s_cons, 2},
1716
1717 { "extern", ecoff_directive_extern, 0},
1718
1719 { NULL, NULL, 0 },
1720 };
1721
1722 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1723 {
1724 /* These pseudo-ops should be defined by the object file format.
1725 However, a.out doesn't support them, so we have versions here. */
1726 {"aent", s_mips_ent, 1},
1727 {"bgnb", s_ignore, 0},
1728 {"end", s_mips_end, 0},
1729 {"endb", s_ignore, 0},
1730 {"ent", s_mips_ent, 0},
1731 {"file", s_mips_file, 0},
1732 {"fmask", s_mips_mask, 'F'},
1733 {"frame", s_mips_frame, 0},
1734 {"loc", s_mips_loc, 0},
1735 {"mask", s_mips_mask, 'R'},
1736 {"verstamp", s_ignore, 0},
1737 { NULL, NULL, 0 },
1738 };
1739
1740 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1741 purpose of the `.dc.a' internal pseudo-op. */
1742
1743 int
1744 mips_address_bytes (void)
1745 {
1746 return HAVE_64BIT_ADDRESSES ? 8 : 4;
1747 }
1748
1749 extern void pop_insert (const pseudo_typeS *);
1750
1751 void
1752 mips_pop_insert (void)
1753 {
1754 pop_insert (mips_pseudo_table);
1755 if (! ECOFF_DEBUGGING)
1756 pop_insert (mips_nonecoff_pseudo_table);
1757 }
1758 \f
1759 /* Symbols labelling the current insn. */
1760
1761 struct insn_label_list
1762 {
1763 struct insn_label_list *next;
1764 symbolS *label;
1765 };
1766
1767 static struct insn_label_list *free_insn_labels;
1768 #define label_list tc_segment_info_data.labels
1769
1770 static void mips_clear_insn_labels (void);
1771 static void mips_mark_labels (void);
1772 static void mips_compressed_mark_labels (void);
1773
1774 static inline void
1775 mips_clear_insn_labels (void)
1776 {
1777 register struct insn_label_list **pl;
1778 segment_info_type *si;
1779
1780 if (now_seg)
1781 {
1782 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1783 ;
1784
1785 si = seg_info (now_seg);
1786 *pl = si->label_list;
1787 si->label_list = NULL;
1788 }
1789 }
1790
1791 /* Mark instruction labels in MIPS16/microMIPS mode. */
1792
1793 static inline void
1794 mips_mark_labels (void)
1795 {
1796 if (HAVE_CODE_COMPRESSION)
1797 mips_compressed_mark_labels ();
1798 }
1799 \f
1800 static char *expr_end;
1801
1802 /* Expressions which appear in instructions. These are set by
1803 mips_ip. */
1804
1805 static expressionS imm_expr;
1806 static expressionS imm2_expr;
1807 static expressionS offset_expr;
1808
1809 /* Relocs associated with imm_expr and offset_expr. */
1810
1811 static bfd_reloc_code_real_type imm_reloc[3]
1812 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1813 static bfd_reloc_code_real_type offset_reloc[3]
1814 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1815
1816 /* This is set to the resulting size of the instruction to be produced
1817 by mips16_ip if an explicit extension is used or by mips_ip if an
1818 explicit size is supplied. */
1819
1820 static unsigned int forced_insn_length;
1821
1822 /* True if we are assembling an instruction. All dot symbols defined during
1823 this time should be treated as code labels. */
1824
1825 static bfd_boolean mips_assembling_insn;
1826
1827 /* The pdr segment for per procedure frame/regmask info. Not used for
1828 ECOFF debugging. */
1829
1830 static segT pdr_seg;
1831
1832 /* The default target format to use. */
1833
1834 #if defined (TE_FreeBSD)
1835 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1836 #elif defined (TE_TMIPS)
1837 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1838 #else
1839 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1840 #endif
1841
1842 const char *
1843 mips_target_format (void)
1844 {
1845 switch (OUTPUT_FLAVOR)
1846 {
1847 case bfd_target_elf_flavour:
1848 #ifdef TE_VXWORKS
1849 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1850 return (target_big_endian
1851 ? "elf32-bigmips-vxworks"
1852 : "elf32-littlemips-vxworks");
1853 #endif
1854 return (target_big_endian
1855 ? (HAVE_64BIT_OBJECTS
1856 ? ELF_TARGET ("elf64-", "big")
1857 : (HAVE_NEWABI
1858 ? ELF_TARGET ("elf32-n", "big")
1859 : ELF_TARGET ("elf32-", "big")))
1860 : (HAVE_64BIT_OBJECTS
1861 ? ELF_TARGET ("elf64-", "little")
1862 : (HAVE_NEWABI
1863 ? ELF_TARGET ("elf32-n", "little")
1864 : ELF_TARGET ("elf32-", "little"))));
1865 default:
1866 abort ();
1867 return NULL;
1868 }
1869 }
1870
1871 /* Return the ISA revision that is currently in use, or 0 if we are
1872 generating code for MIPS V or below. */
1873
1874 static int
1875 mips_isa_rev (void)
1876 {
1877 if (mips_opts.isa == ISA_MIPS32R2 || mips_opts.isa == ISA_MIPS64R2)
1878 return 2;
1879
1880 /* microMIPS implies revision 2 or above. */
1881 if (mips_opts.micromips)
1882 return 2;
1883
1884 if (mips_opts.isa == ISA_MIPS32 || mips_opts.isa == ISA_MIPS64)
1885 return 1;
1886
1887 return 0;
1888 }
1889
1890 /* Return the mask of all ASEs that are revisions of those in FLAGS. */
1891
1892 static unsigned int
1893 mips_ase_mask (unsigned int flags)
1894 {
1895 unsigned int i;
1896
1897 for (i = 0; i < ARRAY_SIZE (mips_ase_groups); i++)
1898 if (flags & mips_ase_groups[i])
1899 flags |= mips_ase_groups[i];
1900 return flags;
1901 }
1902
1903 /* Check whether the current ISA supports ASE. Issue a warning if
1904 appropriate. */
1905
1906 static void
1907 mips_check_isa_supports_ase (const struct mips_ase *ase)
1908 {
1909 const char *base;
1910 int min_rev, size;
1911 static unsigned int warned_isa;
1912 static unsigned int warned_fp32;
1913
1914 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1915 min_rev = mips_opts.micromips ? ase->micromips64_rev : ase->mips64_rev;
1916 else
1917 min_rev = mips_opts.micromips ? ase->micromips32_rev : ase->mips32_rev;
1918 if ((min_rev < 0 || mips_isa_rev () < min_rev)
1919 && (warned_isa & ase->flags) != ase->flags)
1920 {
1921 warned_isa |= ase->flags;
1922 base = mips_opts.micromips ? "microMIPS" : "MIPS";
1923 size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
1924 if (min_rev < 0)
1925 as_warn (_("The %d-bit %s architecture does not support the"
1926 " `%s' extension"), size, base, ase->name);
1927 else
1928 as_warn (_("The `%s' extension requires %s%d revision %d or greater"),
1929 ase->name, base, size, min_rev);
1930 }
1931 if ((ase->flags & FP64_ASES)
1932 && mips_opts.fp32
1933 && (warned_fp32 & ase->flags) != ase->flags)
1934 {
1935 warned_fp32 |= ase->flags;
1936 as_warn (_("The `%s' extension requires 64-bit FPRs"), ase->name);
1937 }
1938 }
1939
1940 /* Check all enabled ASEs to see whether they are supported by the
1941 chosen architecture. */
1942
1943 static void
1944 mips_check_isa_supports_ases (void)
1945 {
1946 unsigned int i, mask;
1947
1948 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1949 {
1950 mask = mips_ase_mask (mips_ases[i].flags);
1951 if ((mips_opts.ase & mask) == mips_ases[i].flags)
1952 mips_check_isa_supports_ase (&mips_ases[i]);
1953 }
1954 }
1955
1956 /* Set the state of ASE to ENABLED_P. Return the mask of ASE_* flags
1957 that were affected. */
1958
1959 static unsigned int
1960 mips_set_ase (const struct mips_ase *ase, bfd_boolean enabled_p)
1961 {
1962 unsigned int mask;
1963
1964 mask = mips_ase_mask (ase->flags);
1965 mips_opts.ase &= ~mask;
1966 if (enabled_p)
1967 mips_opts.ase |= ase->flags;
1968 return mask;
1969 }
1970
1971 /* Return the ASE called NAME, or null if none. */
1972
1973 static const struct mips_ase *
1974 mips_lookup_ase (const char *name)
1975 {
1976 unsigned int i;
1977
1978 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1979 if (strcmp (name, mips_ases[i].name) == 0)
1980 return &mips_ases[i];
1981 return NULL;
1982 }
1983
1984 /* Return the length of a microMIPS instruction in bytes. If bits of
1985 the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1986 Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1987 major opcode) will require further modifications to the opcode
1988 table. */
1989
1990 static inline unsigned int
1991 micromips_insn_length (const struct mips_opcode *mo)
1992 {
1993 return (mo->mask >> 16) == 0 ? 2 : 4;
1994 }
1995
1996 /* Return the length of MIPS16 instruction OPCODE. */
1997
1998 static inline unsigned int
1999 mips16_opcode_length (unsigned long opcode)
2000 {
2001 return (opcode >> 16) == 0 ? 2 : 4;
2002 }
2003
2004 /* Return the length of instruction INSN. */
2005
2006 static inline unsigned int
2007 insn_length (const struct mips_cl_insn *insn)
2008 {
2009 if (mips_opts.micromips)
2010 return micromips_insn_length (insn->insn_mo);
2011 else if (mips_opts.mips16)
2012 return mips16_opcode_length (insn->insn_opcode);
2013 else
2014 return 4;
2015 }
2016
2017 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
2018
2019 static void
2020 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
2021 {
2022 size_t i;
2023
2024 insn->insn_mo = mo;
2025 insn->insn_opcode = mo->match;
2026 insn->frag = NULL;
2027 insn->where = 0;
2028 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2029 insn->fixp[i] = NULL;
2030 insn->fixed_p = (mips_opts.noreorder > 0);
2031 insn->noreorder_p = (mips_opts.noreorder > 0);
2032 insn->mips16_absolute_jump_p = 0;
2033 insn->complete_p = 0;
2034 insn->cleared_p = 0;
2035 }
2036
2037 /* Record the current MIPS16/microMIPS mode in now_seg. */
2038
2039 static void
2040 mips_record_compressed_mode (void)
2041 {
2042 segment_info_type *si;
2043
2044 si = seg_info (now_seg);
2045 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
2046 si->tc_segment_info_data.mips16 = mips_opts.mips16;
2047 if (si->tc_segment_info_data.micromips != mips_opts.micromips)
2048 si->tc_segment_info_data.micromips = mips_opts.micromips;
2049 }
2050
2051 /* Read a standard MIPS instruction from BUF. */
2052
2053 static unsigned long
2054 read_insn (char *buf)
2055 {
2056 if (target_big_endian)
2057 return bfd_getb32 ((bfd_byte *) buf);
2058 else
2059 return bfd_getl32 ((bfd_byte *) buf);
2060 }
2061
2062 /* Write standard MIPS instruction INSN to BUF. Return a pointer to
2063 the next byte. */
2064
2065 static char *
2066 write_insn (char *buf, unsigned int insn)
2067 {
2068 md_number_to_chars (buf, insn, 4);
2069 return buf + 4;
2070 }
2071
2072 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
2073 has length LENGTH. */
2074
2075 static unsigned long
2076 read_compressed_insn (char *buf, unsigned int length)
2077 {
2078 unsigned long insn;
2079 unsigned int i;
2080
2081 insn = 0;
2082 for (i = 0; i < length; i += 2)
2083 {
2084 insn <<= 16;
2085 if (target_big_endian)
2086 insn |= bfd_getb16 ((char *) buf);
2087 else
2088 insn |= bfd_getl16 ((char *) buf);
2089 buf += 2;
2090 }
2091 return insn;
2092 }
2093
2094 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
2095 instruction is LENGTH bytes long. Return a pointer to the next byte. */
2096
2097 static char *
2098 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
2099 {
2100 unsigned int i;
2101
2102 for (i = 0; i < length; i += 2)
2103 md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
2104 return buf + length;
2105 }
2106
2107 /* Install INSN at the location specified by its "frag" and "where" fields. */
2108
2109 static void
2110 install_insn (const struct mips_cl_insn *insn)
2111 {
2112 char *f = insn->frag->fr_literal + insn->where;
2113 if (HAVE_CODE_COMPRESSION)
2114 write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
2115 else
2116 write_insn (f, insn->insn_opcode);
2117 mips_record_compressed_mode ();
2118 }
2119
2120 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
2121 and install the opcode in the new location. */
2122
2123 static void
2124 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
2125 {
2126 size_t i;
2127
2128 insn->frag = frag;
2129 insn->where = where;
2130 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2131 if (insn->fixp[i] != NULL)
2132 {
2133 insn->fixp[i]->fx_frag = frag;
2134 insn->fixp[i]->fx_where = where;
2135 }
2136 install_insn (insn);
2137 }
2138
2139 /* Add INSN to the end of the output. */
2140
2141 static void
2142 add_fixed_insn (struct mips_cl_insn *insn)
2143 {
2144 char *f = frag_more (insn_length (insn));
2145 move_insn (insn, frag_now, f - frag_now->fr_literal);
2146 }
2147
2148 /* Start a variant frag and move INSN to the start of the variant part,
2149 marking it as fixed. The other arguments are as for frag_var. */
2150
2151 static void
2152 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
2153 relax_substateT subtype, symbolS *symbol, offsetT offset)
2154 {
2155 frag_grow (max_chars);
2156 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
2157 insn->fixed_p = 1;
2158 frag_var (rs_machine_dependent, max_chars, var,
2159 subtype, symbol, offset, NULL);
2160 }
2161
2162 /* Insert N copies of INSN into the history buffer, starting at
2163 position FIRST. Neither FIRST nor N need to be clipped. */
2164
2165 static void
2166 insert_into_history (unsigned int first, unsigned int n,
2167 const struct mips_cl_insn *insn)
2168 {
2169 if (mips_relax.sequence != 2)
2170 {
2171 unsigned int i;
2172
2173 for (i = ARRAY_SIZE (history); i-- > first;)
2174 if (i >= first + n)
2175 history[i] = history[i - n];
2176 else
2177 history[i] = *insn;
2178 }
2179 }
2180
2181 /* Initialize vr4120_conflicts. There is a bit of duplication here:
2182 the idea is to make it obvious at a glance that each errata is
2183 included. */
2184
2185 static void
2186 init_vr4120_conflicts (void)
2187 {
2188 #define CONFLICT(FIRST, SECOND) \
2189 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
2190
2191 /* Errata 21 - [D]DIV[U] after [D]MACC */
2192 CONFLICT (MACC, DIV);
2193 CONFLICT (DMACC, DIV);
2194
2195 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
2196 CONFLICT (DMULT, DMULT);
2197 CONFLICT (DMULT, DMACC);
2198 CONFLICT (DMACC, DMULT);
2199 CONFLICT (DMACC, DMACC);
2200
2201 /* Errata 24 - MT{LO,HI} after [D]MACC */
2202 CONFLICT (MACC, MTHILO);
2203 CONFLICT (DMACC, MTHILO);
2204
2205 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
2206 instruction is executed immediately after a MACC or DMACC
2207 instruction, the result of [either instruction] is incorrect." */
2208 CONFLICT (MACC, MULT);
2209 CONFLICT (MACC, DMULT);
2210 CONFLICT (DMACC, MULT);
2211 CONFLICT (DMACC, DMULT);
2212
2213 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
2214 executed immediately after a DMULT, DMULTU, DIV, DIVU,
2215 DDIV or DDIVU instruction, the result of the MACC or
2216 DMACC instruction is incorrect.". */
2217 CONFLICT (DMULT, MACC);
2218 CONFLICT (DMULT, DMACC);
2219 CONFLICT (DIV, MACC);
2220 CONFLICT (DIV, DMACC);
2221
2222 #undef CONFLICT
2223 }
2224
2225 struct regname {
2226 const char *name;
2227 unsigned int num;
2228 };
2229
2230 #define RTYPE_MASK 0x1ff00
2231 #define RTYPE_NUM 0x00100
2232 #define RTYPE_FPU 0x00200
2233 #define RTYPE_FCC 0x00400
2234 #define RTYPE_VEC 0x00800
2235 #define RTYPE_GP 0x01000
2236 #define RTYPE_CP0 0x02000
2237 #define RTYPE_PC 0x04000
2238 #define RTYPE_ACC 0x08000
2239 #define RTYPE_CCC 0x10000
2240 #define RNUM_MASK 0x000ff
2241 #define RWARN 0x80000
2242
2243 #define GENERIC_REGISTER_NUMBERS \
2244 {"$0", RTYPE_NUM | 0}, \
2245 {"$1", RTYPE_NUM | 1}, \
2246 {"$2", RTYPE_NUM | 2}, \
2247 {"$3", RTYPE_NUM | 3}, \
2248 {"$4", RTYPE_NUM | 4}, \
2249 {"$5", RTYPE_NUM | 5}, \
2250 {"$6", RTYPE_NUM | 6}, \
2251 {"$7", RTYPE_NUM | 7}, \
2252 {"$8", RTYPE_NUM | 8}, \
2253 {"$9", RTYPE_NUM | 9}, \
2254 {"$10", RTYPE_NUM | 10}, \
2255 {"$11", RTYPE_NUM | 11}, \
2256 {"$12", RTYPE_NUM | 12}, \
2257 {"$13", RTYPE_NUM | 13}, \
2258 {"$14", RTYPE_NUM | 14}, \
2259 {"$15", RTYPE_NUM | 15}, \
2260 {"$16", RTYPE_NUM | 16}, \
2261 {"$17", RTYPE_NUM | 17}, \
2262 {"$18", RTYPE_NUM | 18}, \
2263 {"$19", RTYPE_NUM | 19}, \
2264 {"$20", RTYPE_NUM | 20}, \
2265 {"$21", RTYPE_NUM | 21}, \
2266 {"$22", RTYPE_NUM | 22}, \
2267 {"$23", RTYPE_NUM | 23}, \
2268 {"$24", RTYPE_NUM | 24}, \
2269 {"$25", RTYPE_NUM | 25}, \
2270 {"$26", RTYPE_NUM | 26}, \
2271 {"$27", RTYPE_NUM | 27}, \
2272 {"$28", RTYPE_NUM | 28}, \
2273 {"$29", RTYPE_NUM | 29}, \
2274 {"$30", RTYPE_NUM | 30}, \
2275 {"$31", RTYPE_NUM | 31}
2276
2277 #define FPU_REGISTER_NAMES \
2278 {"$f0", RTYPE_FPU | 0}, \
2279 {"$f1", RTYPE_FPU | 1}, \
2280 {"$f2", RTYPE_FPU | 2}, \
2281 {"$f3", RTYPE_FPU | 3}, \
2282 {"$f4", RTYPE_FPU | 4}, \
2283 {"$f5", RTYPE_FPU | 5}, \
2284 {"$f6", RTYPE_FPU | 6}, \
2285 {"$f7", RTYPE_FPU | 7}, \
2286 {"$f8", RTYPE_FPU | 8}, \
2287 {"$f9", RTYPE_FPU | 9}, \
2288 {"$f10", RTYPE_FPU | 10}, \
2289 {"$f11", RTYPE_FPU | 11}, \
2290 {"$f12", RTYPE_FPU | 12}, \
2291 {"$f13", RTYPE_FPU | 13}, \
2292 {"$f14", RTYPE_FPU | 14}, \
2293 {"$f15", RTYPE_FPU | 15}, \
2294 {"$f16", RTYPE_FPU | 16}, \
2295 {"$f17", RTYPE_FPU | 17}, \
2296 {"$f18", RTYPE_FPU | 18}, \
2297 {"$f19", RTYPE_FPU | 19}, \
2298 {"$f20", RTYPE_FPU | 20}, \
2299 {"$f21", RTYPE_FPU | 21}, \
2300 {"$f22", RTYPE_FPU | 22}, \
2301 {"$f23", RTYPE_FPU | 23}, \
2302 {"$f24", RTYPE_FPU | 24}, \
2303 {"$f25", RTYPE_FPU | 25}, \
2304 {"$f26", RTYPE_FPU | 26}, \
2305 {"$f27", RTYPE_FPU | 27}, \
2306 {"$f28", RTYPE_FPU | 28}, \
2307 {"$f29", RTYPE_FPU | 29}, \
2308 {"$f30", RTYPE_FPU | 30}, \
2309 {"$f31", RTYPE_FPU | 31}
2310
2311 #define FPU_CONDITION_CODE_NAMES \
2312 {"$fcc0", RTYPE_FCC | 0}, \
2313 {"$fcc1", RTYPE_FCC | 1}, \
2314 {"$fcc2", RTYPE_FCC | 2}, \
2315 {"$fcc3", RTYPE_FCC | 3}, \
2316 {"$fcc4", RTYPE_FCC | 4}, \
2317 {"$fcc5", RTYPE_FCC | 5}, \
2318 {"$fcc6", RTYPE_FCC | 6}, \
2319 {"$fcc7", RTYPE_FCC | 7}
2320
2321 #define COPROC_CONDITION_CODE_NAMES \
2322 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
2323 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
2324 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
2325 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
2326 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
2327 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
2328 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
2329 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
2330
2331 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2332 {"$a4", RTYPE_GP | 8}, \
2333 {"$a5", RTYPE_GP | 9}, \
2334 {"$a6", RTYPE_GP | 10}, \
2335 {"$a7", RTYPE_GP | 11}, \
2336 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
2337 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
2338 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
2339 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
2340 {"$t0", RTYPE_GP | 12}, \
2341 {"$t1", RTYPE_GP | 13}, \
2342 {"$t2", RTYPE_GP | 14}, \
2343 {"$t3", RTYPE_GP | 15}
2344
2345 #define O32_SYMBOLIC_REGISTER_NAMES \
2346 {"$t0", RTYPE_GP | 8}, \
2347 {"$t1", RTYPE_GP | 9}, \
2348 {"$t2", RTYPE_GP | 10}, \
2349 {"$t3", RTYPE_GP | 11}, \
2350 {"$t4", RTYPE_GP | 12}, \
2351 {"$t5", RTYPE_GP | 13}, \
2352 {"$t6", RTYPE_GP | 14}, \
2353 {"$t7", RTYPE_GP | 15}, \
2354 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
2355 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
2356 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
2357 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
2358
2359 /* Remaining symbolic register names */
2360 #define SYMBOLIC_REGISTER_NAMES \
2361 {"$zero", RTYPE_GP | 0}, \
2362 {"$at", RTYPE_GP | 1}, \
2363 {"$AT", RTYPE_GP | 1}, \
2364 {"$v0", RTYPE_GP | 2}, \
2365 {"$v1", RTYPE_GP | 3}, \
2366 {"$a0", RTYPE_GP | 4}, \
2367 {"$a1", RTYPE_GP | 5}, \
2368 {"$a2", RTYPE_GP | 6}, \
2369 {"$a3", RTYPE_GP | 7}, \
2370 {"$s0", RTYPE_GP | 16}, \
2371 {"$s1", RTYPE_GP | 17}, \
2372 {"$s2", RTYPE_GP | 18}, \
2373 {"$s3", RTYPE_GP | 19}, \
2374 {"$s4", RTYPE_GP | 20}, \
2375 {"$s5", RTYPE_GP | 21}, \
2376 {"$s6", RTYPE_GP | 22}, \
2377 {"$s7", RTYPE_GP | 23}, \
2378 {"$t8", RTYPE_GP | 24}, \
2379 {"$t9", RTYPE_GP | 25}, \
2380 {"$k0", RTYPE_GP | 26}, \
2381 {"$kt0", RTYPE_GP | 26}, \
2382 {"$k1", RTYPE_GP | 27}, \
2383 {"$kt1", RTYPE_GP | 27}, \
2384 {"$gp", RTYPE_GP | 28}, \
2385 {"$sp", RTYPE_GP | 29}, \
2386 {"$s8", RTYPE_GP | 30}, \
2387 {"$fp", RTYPE_GP | 30}, \
2388 {"$ra", RTYPE_GP | 31}
2389
2390 #define MIPS16_SPECIAL_REGISTER_NAMES \
2391 {"$pc", RTYPE_PC | 0}
2392
2393 #define MDMX_VECTOR_REGISTER_NAMES \
2394 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
2395 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
2396 {"$v2", RTYPE_VEC | 2}, \
2397 {"$v3", RTYPE_VEC | 3}, \
2398 {"$v4", RTYPE_VEC | 4}, \
2399 {"$v5", RTYPE_VEC | 5}, \
2400 {"$v6", RTYPE_VEC | 6}, \
2401 {"$v7", RTYPE_VEC | 7}, \
2402 {"$v8", RTYPE_VEC | 8}, \
2403 {"$v9", RTYPE_VEC | 9}, \
2404 {"$v10", RTYPE_VEC | 10}, \
2405 {"$v11", RTYPE_VEC | 11}, \
2406 {"$v12", RTYPE_VEC | 12}, \
2407 {"$v13", RTYPE_VEC | 13}, \
2408 {"$v14", RTYPE_VEC | 14}, \
2409 {"$v15", RTYPE_VEC | 15}, \
2410 {"$v16", RTYPE_VEC | 16}, \
2411 {"$v17", RTYPE_VEC | 17}, \
2412 {"$v18", RTYPE_VEC | 18}, \
2413 {"$v19", RTYPE_VEC | 19}, \
2414 {"$v20", RTYPE_VEC | 20}, \
2415 {"$v21", RTYPE_VEC | 21}, \
2416 {"$v22", RTYPE_VEC | 22}, \
2417 {"$v23", RTYPE_VEC | 23}, \
2418 {"$v24", RTYPE_VEC | 24}, \
2419 {"$v25", RTYPE_VEC | 25}, \
2420 {"$v26", RTYPE_VEC | 26}, \
2421 {"$v27", RTYPE_VEC | 27}, \
2422 {"$v28", RTYPE_VEC | 28}, \
2423 {"$v29", RTYPE_VEC | 29}, \
2424 {"$v30", RTYPE_VEC | 30}, \
2425 {"$v31", RTYPE_VEC | 31}
2426
2427 #define MIPS_DSP_ACCUMULATOR_NAMES \
2428 {"$ac0", RTYPE_ACC | 0}, \
2429 {"$ac1", RTYPE_ACC | 1}, \
2430 {"$ac2", RTYPE_ACC | 2}, \
2431 {"$ac3", RTYPE_ACC | 3}
2432
2433 static const struct regname reg_names[] = {
2434 GENERIC_REGISTER_NUMBERS,
2435 FPU_REGISTER_NAMES,
2436 FPU_CONDITION_CODE_NAMES,
2437 COPROC_CONDITION_CODE_NAMES,
2438
2439 /* The $txx registers depends on the abi,
2440 these will be added later into the symbol table from
2441 one of the tables below once mips_abi is set after
2442 parsing of arguments from the command line. */
2443 SYMBOLIC_REGISTER_NAMES,
2444
2445 MIPS16_SPECIAL_REGISTER_NAMES,
2446 MDMX_VECTOR_REGISTER_NAMES,
2447 MIPS_DSP_ACCUMULATOR_NAMES,
2448 {0, 0}
2449 };
2450
2451 static const struct regname reg_names_o32[] = {
2452 O32_SYMBOLIC_REGISTER_NAMES,
2453 {0, 0}
2454 };
2455
2456 static const struct regname reg_names_n32n64[] = {
2457 N32N64_SYMBOLIC_REGISTER_NAMES,
2458 {0, 0}
2459 };
2460
2461 /* Check if S points at a valid register specifier according to TYPES.
2462 If so, then return 1, advance S to consume the specifier and store
2463 the register's number in REGNOP, otherwise return 0. */
2464
2465 static int
2466 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2467 {
2468 symbolS *symbolP;
2469 char *e;
2470 char save_c;
2471 int reg = -1;
2472
2473 /* Find end of name. */
2474 e = *s;
2475 if (is_name_beginner (*e))
2476 ++e;
2477 while (is_part_of_name (*e))
2478 ++e;
2479
2480 /* Terminate name. */
2481 save_c = *e;
2482 *e = '\0';
2483
2484 /* Look for a register symbol. */
2485 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2486 {
2487 int r = S_GET_VALUE (symbolP);
2488 if (r & types)
2489 reg = r & RNUM_MASK;
2490 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2491 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
2492 reg = (r & RNUM_MASK) - 2;
2493 }
2494 /* Else see if this is a register defined in an itbl entry. */
2495 else if ((types & RTYPE_GP) && itbl_have_entries)
2496 {
2497 char *n = *s;
2498 unsigned long r;
2499
2500 if (*n == '$')
2501 ++n;
2502 if (itbl_get_reg_val (n, &r))
2503 reg = r & RNUM_MASK;
2504 }
2505
2506 /* Advance to next token if a register was recognised. */
2507 if (reg >= 0)
2508 *s = e;
2509 else if (types & RWARN)
2510 as_warn (_("Unrecognized register name `%s'"), *s);
2511
2512 *e = save_c;
2513 if (regnop)
2514 *regnop = reg;
2515 return reg >= 0;
2516 }
2517
2518 /* Check if S points at a valid register list according to TYPES.
2519 If so, then return 1, advance S to consume the list and store
2520 the registers present on the list as a bitmask of ones in REGLISTP,
2521 otherwise return 0. A valid list comprises a comma-separated
2522 enumeration of valid single registers and/or dash-separated
2523 contiguous register ranges as determined by their numbers.
2524
2525 As a special exception if one of s0-s7 registers is specified as
2526 the range's lower delimiter and s8 (fp) is its upper one, then no
2527 registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2528 are selected; they have to be listed separately if needed. */
2529
2530 static int
2531 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2532 {
2533 unsigned int reglist = 0;
2534 unsigned int lastregno;
2535 bfd_boolean ok = TRUE;
2536 unsigned int regmask;
2537 char *s_endlist = *s;
2538 char *s_reset = *s;
2539 unsigned int regno;
2540
2541 while (reg_lookup (s, types, &regno))
2542 {
2543 lastregno = regno;
2544 if (**s == '-')
2545 {
2546 (*s)++;
2547 ok = reg_lookup (s, types, &lastregno);
2548 if (ok && lastregno < regno)
2549 ok = FALSE;
2550 if (!ok)
2551 break;
2552 }
2553
2554 if (lastregno == FP && regno >= S0 && regno <= S7)
2555 {
2556 lastregno = S7;
2557 reglist |= 1 << FP;
2558 }
2559 regmask = 1 << lastregno;
2560 regmask = (regmask << 1) - 1;
2561 regmask ^= (1 << regno) - 1;
2562 reglist |= regmask;
2563
2564 s_endlist = *s;
2565 if (**s != ',')
2566 break;
2567 (*s)++;
2568 }
2569
2570 if (ok)
2571 *s = s_endlist;
2572 else
2573 *s = s_reset;
2574 if (reglistp)
2575 *reglistp = reglist;
2576 return ok && reglist != 0;
2577 }
2578
2579 /* Return TRUE if opcode MO is valid on the currently selected ISA, ASE
2580 and architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
2581
2582 static bfd_boolean
2583 is_opcode_valid (const struct mips_opcode *mo)
2584 {
2585 int isa = mips_opts.isa;
2586 int ase = mips_opts.ase;
2587 int fp_s, fp_d;
2588 unsigned int i;
2589
2590 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
2591 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2592 if ((ase & mips_ases[i].flags) == mips_ases[i].flags)
2593 ase |= mips_ases[i].flags64;
2594
2595 if (!opcode_is_member (mo, isa, ase, mips_opts.arch))
2596 return FALSE;
2597
2598 /* Check whether the instruction or macro requires single-precision or
2599 double-precision floating-point support. Note that this information is
2600 stored differently in the opcode table for insns and macros. */
2601 if (mo->pinfo == INSN_MACRO)
2602 {
2603 fp_s = mo->pinfo2 & INSN2_M_FP_S;
2604 fp_d = mo->pinfo2 & INSN2_M_FP_D;
2605 }
2606 else
2607 {
2608 fp_s = mo->pinfo & FP_S;
2609 fp_d = mo->pinfo & FP_D;
2610 }
2611
2612 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2613 return FALSE;
2614
2615 if (fp_s && mips_opts.soft_float)
2616 return FALSE;
2617
2618 return TRUE;
2619 }
2620
2621 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2622 selected ISA and architecture. */
2623
2624 static bfd_boolean
2625 is_opcode_valid_16 (const struct mips_opcode *mo)
2626 {
2627 return opcode_is_member (mo, mips_opts.isa, 0, mips_opts.arch);
2628 }
2629
2630 /* Return TRUE if the size of the microMIPS opcode MO matches one
2631 explicitly requested. Always TRUE in the standard MIPS mode. */
2632
2633 static bfd_boolean
2634 is_size_valid (const struct mips_opcode *mo)
2635 {
2636 if (!mips_opts.micromips)
2637 return TRUE;
2638
2639 if (!forced_insn_length)
2640 return TRUE;
2641 if (mo->pinfo == INSN_MACRO)
2642 return FALSE;
2643 return forced_insn_length == micromips_insn_length (mo);
2644 }
2645
2646 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2647 of the preceding instruction. Always TRUE in the standard MIPS mode.
2648
2649 We don't accept macros in 16-bit delay slots to avoid a case where
2650 a macro expansion fails because it relies on a preceding 32-bit real
2651 instruction to have matched and does not handle the operands correctly.
2652 The only macros that may expand to 16-bit instructions are JAL that
2653 cannot be placed in a delay slot anyway, and corner cases of BALIGN
2654 and BGT (that likewise cannot be placed in a delay slot) that decay to
2655 a NOP. In all these cases the macros precede any corresponding real
2656 instruction definitions in the opcode table, so they will match in the
2657 second pass where the size of the delay slot is ignored and therefore
2658 produce correct code. */
2659
2660 static bfd_boolean
2661 is_delay_slot_valid (const struct mips_opcode *mo)
2662 {
2663 if (!mips_opts.micromips)
2664 return TRUE;
2665
2666 if (mo->pinfo == INSN_MACRO)
2667 return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2668 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2669 && micromips_insn_length (mo) != 4)
2670 return FALSE;
2671 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2672 && micromips_insn_length (mo) != 2)
2673 return FALSE;
2674
2675 return TRUE;
2676 }
2677
2678 /* This function is called once, at assembler startup time. It should set up
2679 all the tables, etc. that the MD part of the assembler will need. */
2680
2681 void
2682 md_begin (void)
2683 {
2684 const char *retval = NULL;
2685 int i = 0;
2686 int broken = 0;
2687
2688 if (mips_pic != NO_PIC)
2689 {
2690 if (g_switch_seen && g_switch_value != 0)
2691 as_bad (_("-G may not be used in position-independent code"));
2692 g_switch_value = 0;
2693 }
2694
2695 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2696 as_warn (_("Could not set architecture and machine"));
2697
2698 op_hash = hash_new ();
2699
2700 for (i = 0; i < NUMOPCODES;)
2701 {
2702 const char *name = mips_opcodes[i].name;
2703
2704 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2705 if (retval != NULL)
2706 {
2707 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2708 mips_opcodes[i].name, retval);
2709 /* Probably a memory allocation problem? Give up now. */
2710 as_fatal (_("Broken assembler. No assembly attempted."));
2711 }
2712 do
2713 {
2714 if (mips_opcodes[i].pinfo != INSN_MACRO)
2715 {
2716 if (!validate_mips_insn (&mips_opcodes[i]))
2717 broken = 1;
2718 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2719 {
2720 create_insn (&nop_insn, mips_opcodes + i);
2721 if (mips_fix_loongson2f_nop)
2722 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2723 nop_insn.fixed_p = 1;
2724 }
2725 }
2726 ++i;
2727 }
2728 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2729 }
2730
2731 mips16_op_hash = hash_new ();
2732
2733 i = 0;
2734 while (i < bfd_mips16_num_opcodes)
2735 {
2736 const char *name = mips16_opcodes[i].name;
2737
2738 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2739 if (retval != NULL)
2740 as_fatal (_("internal: can't hash `%s': %s"),
2741 mips16_opcodes[i].name, retval);
2742 do
2743 {
2744 if (mips16_opcodes[i].pinfo != INSN_MACRO
2745 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2746 != mips16_opcodes[i].match))
2747 {
2748 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2749 mips16_opcodes[i].name, mips16_opcodes[i].args);
2750 broken = 1;
2751 }
2752 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2753 {
2754 create_insn (&mips16_nop_insn, mips16_opcodes + i);
2755 mips16_nop_insn.fixed_p = 1;
2756 }
2757 ++i;
2758 }
2759 while (i < bfd_mips16_num_opcodes
2760 && strcmp (mips16_opcodes[i].name, name) == 0);
2761 }
2762
2763 micromips_op_hash = hash_new ();
2764
2765 i = 0;
2766 while (i < bfd_micromips_num_opcodes)
2767 {
2768 const char *name = micromips_opcodes[i].name;
2769
2770 retval = hash_insert (micromips_op_hash, name,
2771 (void *) &micromips_opcodes[i]);
2772 if (retval != NULL)
2773 as_fatal (_("internal: can't hash `%s': %s"),
2774 micromips_opcodes[i].name, retval);
2775 do
2776 if (micromips_opcodes[i].pinfo != INSN_MACRO)
2777 {
2778 struct mips_cl_insn *micromips_nop_insn;
2779
2780 if (!validate_micromips_insn (&micromips_opcodes[i]))
2781 broken = 1;
2782
2783 if (micromips_insn_length (micromips_opcodes + i) == 2)
2784 micromips_nop_insn = &micromips_nop16_insn;
2785 else if (micromips_insn_length (micromips_opcodes + i) == 4)
2786 micromips_nop_insn = &micromips_nop32_insn;
2787 else
2788 continue;
2789
2790 if (micromips_nop_insn->insn_mo == NULL
2791 && strcmp (name, "nop") == 0)
2792 {
2793 create_insn (micromips_nop_insn, micromips_opcodes + i);
2794 micromips_nop_insn->fixed_p = 1;
2795 }
2796 }
2797 while (++i < bfd_micromips_num_opcodes
2798 && strcmp (micromips_opcodes[i].name, name) == 0);
2799 }
2800
2801 if (broken)
2802 as_fatal (_("Broken assembler. No assembly attempted."));
2803
2804 /* We add all the general register names to the symbol table. This
2805 helps us detect invalid uses of them. */
2806 for (i = 0; reg_names[i].name; i++)
2807 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2808 reg_names[i].num, /* & RNUM_MASK, */
2809 &zero_address_frag));
2810 if (HAVE_NEWABI)
2811 for (i = 0; reg_names_n32n64[i].name; i++)
2812 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2813 reg_names_n32n64[i].num, /* & RNUM_MASK, */
2814 &zero_address_frag));
2815 else
2816 for (i = 0; reg_names_o32[i].name; i++)
2817 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2818 reg_names_o32[i].num, /* & RNUM_MASK, */
2819 &zero_address_frag));
2820
2821 mips_no_prev_insn ();
2822
2823 mips_gprmask = 0;
2824 mips_cprmask[0] = 0;
2825 mips_cprmask[1] = 0;
2826 mips_cprmask[2] = 0;
2827 mips_cprmask[3] = 0;
2828
2829 /* set the default alignment for the text section (2**2) */
2830 record_alignment (text_section, 2);
2831
2832 bfd_set_gp_size (stdoutput, g_switch_value);
2833
2834 /* On a native system other than VxWorks, sections must be aligned
2835 to 16 byte boundaries. When configured for an embedded ELF
2836 target, we don't bother. */
2837 if (strncmp (TARGET_OS, "elf", 3) != 0
2838 && strncmp (TARGET_OS, "vxworks", 7) != 0)
2839 {
2840 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2841 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2842 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2843 }
2844
2845 /* Create a .reginfo section for register masks and a .mdebug
2846 section for debugging information. */
2847 {
2848 segT seg;
2849 subsegT subseg;
2850 flagword flags;
2851 segT sec;
2852
2853 seg = now_seg;
2854 subseg = now_subseg;
2855
2856 /* The ABI says this section should be loaded so that the
2857 running program can access it. However, we don't load it
2858 if we are configured for an embedded target */
2859 flags = SEC_READONLY | SEC_DATA;
2860 if (strncmp (TARGET_OS, "elf", 3) != 0)
2861 flags |= SEC_ALLOC | SEC_LOAD;
2862
2863 if (mips_abi != N64_ABI)
2864 {
2865 sec = subseg_new (".reginfo", (subsegT) 0);
2866
2867 bfd_set_section_flags (stdoutput, sec, flags);
2868 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2869
2870 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2871 }
2872 else
2873 {
2874 /* The 64-bit ABI uses a .MIPS.options section rather than
2875 .reginfo section. */
2876 sec = subseg_new (".MIPS.options", (subsegT) 0);
2877 bfd_set_section_flags (stdoutput, sec, flags);
2878 bfd_set_section_alignment (stdoutput, sec, 3);
2879
2880 /* Set up the option header. */
2881 {
2882 Elf_Internal_Options opthdr;
2883 char *f;
2884
2885 opthdr.kind = ODK_REGINFO;
2886 opthdr.size = (sizeof (Elf_External_Options)
2887 + sizeof (Elf64_External_RegInfo));
2888 opthdr.section = 0;
2889 opthdr.info = 0;
2890 f = frag_more (sizeof (Elf_External_Options));
2891 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2892 (Elf_External_Options *) f);
2893
2894 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2895 }
2896 }
2897
2898 if (ECOFF_DEBUGGING)
2899 {
2900 sec = subseg_new (".mdebug", (subsegT) 0);
2901 (void) bfd_set_section_flags (stdoutput, sec,
2902 SEC_HAS_CONTENTS | SEC_READONLY);
2903 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2904 }
2905 else if (mips_flag_pdr)
2906 {
2907 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2908 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2909 SEC_READONLY | SEC_RELOC
2910 | SEC_DEBUGGING);
2911 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2912 }
2913
2914 subseg_set (seg, subseg);
2915 }
2916
2917 if (! ECOFF_DEBUGGING)
2918 md_obj_begin ();
2919
2920 if (mips_fix_vr4120)
2921 init_vr4120_conflicts ();
2922 }
2923
2924 void
2925 md_mips_end (void)
2926 {
2927 mips_emit_delays ();
2928 if (! ECOFF_DEBUGGING)
2929 md_obj_end ();
2930 }
2931
2932 void
2933 md_assemble (char *str)
2934 {
2935 struct mips_cl_insn insn;
2936 bfd_reloc_code_real_type unused_reloc[3]
2937 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2938
2939 imm_expr.X_op = O_absent;
2940 imm2_expr.X_op = O_absent;
2941 offset_expr.X_op = O_absent;
2942 imm_reloc[0] = BFD_RELOC_UNUSED;
2943 imm_reloc[1] = BFD_RELOC_UNUSED;
2944 imm_reloc[2] = BFD_RELOC_UNUSED;
2945 offset_reloc[0] = BFD_RELOC_UNUSED;
2946 offset_reloc[1] = BFD_RELOC_UNUSED;
2947 offset_reloc[2] = BFD_RELOC_UNUSED;
2948
2949 mips_mark_labels ();
2950 mips_assembling_insn = TRUE;
2951
2952 if (mips_opts.mips16)
2953 mips16_ip (str, &insn);
2954 else
2955 {
2956 mips_ip (str, &insn);
2957 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2958 str, insn.insn_opcode));
2959 }
2960
2961 if (insn_error)
2962 as_bad ("%s `%s'", insn_error, str);
2963 else if (insn.insn_mo->pinfo == INSN_MACRO)
2964 {
2965 macro_start ();
2966 if (mips_opts.mips16)
2967 mips16_macro (&insn);
2968 else
2969 macro (&insn);
2970 macro_end ();
2971 }
2972 else
2973 {
2974 if (imm_expr.X_op != O_absent)
2975 append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2976 else if (offset_expr.X_op != O_absent)
2977 append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2978 else
2979 append_insn (&insn, NULL, unused_reloc, FALSE);
2980 }
2981
2982 mips_assembling_insn = FALSE;
2983 }
2984
2985 /* Convenience functions for abstracting away the differences between
2986 MIPS16 and non-MIPS16 relocations. */
2987
2988 static inline bfd_boolean
2989 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2990 {
2991 switch (reloc)
2992 {
2993 case BFD_RELOC_MIPS16_JMP:
2994 case BFD_RELOC_MIPS16_GPREL:
2995 case BFD_RELOC_MIPS16_GOT16:
2996 case BFD_RELOC_MIPS16_CALL16:
2997 case BFD_RELOC_MIPS16_HI16_S:
2998 case BFD_RELOC_MIPS16_HI16:
2999 case BFD_RELOC_MIPS16_LO16:
3000 return TRUE;
3001
3002 default:
3003 return FALSE;
3004 }
3005 }
3006
3007 static inline bfd_boolean
3008 micromips_reloc_p (bfd_reloc_code_real_type reloc)
3009 {
3010 switch (reloc)
3011 {
3012 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3013 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3014 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3015 case BFD_RELOC_MICROMIPS_GPREL16:
3016 case BFD_RELOC_MICROMIPS_JMP:
3017 case BFD_RELOC_MICROMIPS_HI16:
3018 case BFD_RELOC_MICROMIPS_HI16_S:
3019 case BFD_RELOC_MICROMIPS_LO16:
3020 case BFD_RELOC_MICROMIPS_LITERAL:
3021 case BFD_RELOC_MICROMIPS_GOT16:
3022 case BFD_RELOC_MICROMIPS_CALL16:
3023 case BFD_RELOC_MICROMIPS_GOT_HI16:
3024 case BFD_RELOC_MICROMIPS_GOT_LO16:
3025 case BFD_RELOC_MICROMIPS_CALL_HI16:
3026 case BFD_RELOC_MICROMIPS_CALL_LO16:
3027 case BFD_RELOC_MICROMIPS_SUB:
3028 case BFD_RELOC_MICROMIPS_GOT_PAGE:
3029 case BFD_RELOC_MICROMIPS_GOT_OFST:
3030 case BFD_RELOC_MICROMIPS_GOT_DISP:
3031 case BFD_RELOC_MICROMIPS_HIGHEST:
3032 case BFD_RELOC_MICROMIPS_HIGHER:
3033 case BFD_RELOC_MICROMIPS_SCN_DISP:
3034 case BFD_RELOC_MICROMIPS_JALR:
3035 return TRUE;
3036
3037 default:
3038 return FALSE;
3039 }
3040 }
3041
3042 static inline bfd_boolean
3043 jmp_reloc_p (bfd_reloc_code_real_type reloc)
3044 {
3045 return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
3046 }
3047
3048 static inline bfd_boolean
3049 got16_reloc_p (bfd_reloc_code_real_type reloc)
3050 {
3051 return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
3052 || reloc == BFD_RELOC_MICROMIPS_GOT16);
3053 }
3054
3055 static inline bfd_boolean
3056 hi16_reloc_p (bfd_reloc_code_real_type reloc)
3057 {
3058 return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
3059 || reloc == BFD_RELOC_MICROMIPS_HI16_S);
3060 }
3061
3062 static inline bfd_boolean
3063 lo16_reloc_p (bfd_reloc_code_real_type reloc)
3064 {
3065 return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
3066 || reloc == BFD_RELOC_MICROMIPS_LO16);
3067 }
3068
3069 static inline bfd_boolean
3070 jalr_reloc_p (bfd_reloc_code_real_type reloc)
3071 {
3072 return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
3073 }
3074
3075 /* Return true if RELOC is a PC-relative relocation that does not have
3076 full address range. */
3077
3078 static inline bfd_boolean
3079 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
3080 {
3081 switch (reloc)
3082 {
3083 case BFD_RELOC_16_PCREL_S2:
3084 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3085 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3086 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3087 return TRUE;
3088
3089 case BFD_RELOC_32_PCREL:
3090 return HAVE_64BIT_ADDRESSES;
3091
3092 default:
3093 return FALSE;
3094 }
3095 }
3096
3097 /* Return true if the given relocation might need a matching %lo().
3098 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
3099 need a matching %lo() when applied to local symbols. */
3100
3101 static inline bfd_boolean
3102 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
3103 {
3104 return (HAVE_IN_PLACE_ADDENDS
3105 && (hi16_reloc_p (reloc)
3106 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
3107 all GOT16 relocations evaluate to "G". */
3108 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
3109 }
3110
3111 /* Return the type of %lo() reloc needed by RELOC, given that
3112 reloc_needs_lo_p. */
3113
3114 static inline bfd_reloc_code_real_type
3115 matching_lo_reloc (bfd_reloc_code_real_type reloc)
3116 {
3117 return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
3118 : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
3119 : BFD_RELOC_LO16));
3120 }
3121
3122 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
3123 relocation. */
3124
3125 static inline bfd_boolean
3126 fixup_has_matching_lo_p (fixS *fixp)
3127 {
3128 return (fixp->fx_next != NULL
3129 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
3130 && fixp->fx_addsy == fixp->fx_next->fx_addsy
3131 && fixp->fx_offset == fixp->fx_next->fx_offset);
3132 }
3133
3134 /* This function returns true if modifying a register requires a
3135 delay. */
3136
3137 static int
3138 reg_needs_delay (unsigned int reg)
3139 {
3140 unsigned long prev_pinfo;
3141
3142 prev_pinfo = history[0].insn_mo->pinfo;
3143 if (! mips_opts.noreorder
3144 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
3145 && ! gpr_interlocks)
3146 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
3147 && ! cop_interlocks)))
3148 {
3149 /* A load from a coprocessor or from memory. All load delays
3150 delay the use of general register rt for one instruction. */
3151 /* Itbl support may require additional care here. */
3152 know (prev_pinfo & INSN_WRITE_GPR_T);
3153 if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
3154 return 1;
3155 }
3156
3157 return 0;
3158 }
3159
3160 /* Move all labels in LABELS to the current insertion point. TEXT_P
3161 says whether the labels refer to text or data. */
3162
3163 static void
3164 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
3165 {
3166 struct insn_label_list *l;
3167 valueT val;
3168
3169 for (l = labels; l != NULL; l = l->next)
3170 {
3171 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
3172 symbol_set_frag (l->label, frag_now);
3173 val = (valueT) frag_now_fix ();
3174 /* MIPS16/microMIPS text labels are stored as odd. */
3175 if (text_p && HAVE_CODE_COMPRESSION)
3176 ++val;
3177 S_SET_VALUE (l->label, val);
3178 }
3179 }
3180
3181 /* Move all labels in insn_labels to the current insertion point
3182 and treat them as text labels. */
3183
3184 static void
3185 mips_move_text_labels (void)
3186 {
3187 mips_move_labels (seg_info (now_seg)->label_list, TRUE);
3188 }
3189
3190 static bfd_boolean
3191 s_is_linkonce (symbolS *sym, segT from_seg)
3192 {
3193 bfd_boolean linkonce = FALSE;
3194 segT symseg = S_GET_SEGMENT (sym);
3195
3196 if (symseg != from_seg && !S_IS_LOCAL (sym))
3197 {
3198 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
3199 linkonce = TRUE;
3200 /* The GNU toolchain uses an extension for ELF: a section
3201 beginning with the magic string .gnu.linkonce is a
3202 linkonce section. */
3203 if (strncmp (segment_name (symseg), ".gnu.linkonce",
3204 sizeof ".gnu.linkonce" - 1) == 0)
3205 linkonce = TRUE;
3206 }
3207 return linkonce;
3208 }
3209
3210 /* Mark MIPS16 or microMIPS instruction label LABEL. This permits the
3211 linker to handle them specially, such as generating jalx instructions
3212 when needed. We also make them odd for the duration of the assembly,
3213 in order to generate the right sort of code. We will make them even
3214 in the adjust_symtab routine, while leaving them marked. This is
3215 convenient for the debugger and the disassembler. The linker knows
3216 to make them odd again. */
3217
3218 static void
3219 mips_compressed_mark_label (symbolS *label)
3220 {
3221 gas_assert (HAVE_CODE_COMPRESSION);
3222
3223 if (mips_opts.mips16)
3224 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
3225 else
3226 S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
3227 if ((S_GET_VALUE (label) & 1) == 0
3228 /* Don't adjust the address if the label is global or weak, or
3229 in a link-once section, since we'll be emitting symbol reloc
3230 references to it which will be patched up by the linker, and
3231 the final value of the symbol may or may not be MIPS16/microMIPS. */
3232 && !S_IS_WEAK (label)
3233 && !S_IS_EXTERNAL (label)
3234 && !s_is_linkonce (label, now_seg))
3235 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
3236 }
3237
3238 /* Mark preceding MIPS16 or microMIPS instruction labels. */
3239
3240 static void
3241 mips_compressed_mark_labels (void)
3242 {
3243 struct insn_label_list *l;
3244
3245 for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
3246 mips_compressed_mark_label (l->label);
3247 }
3248
3249 /* End the current frag. Make it a variant frag and record the
3250 relaxation info. */
3251
3252 static void
3253 relax_close_frag (void)
3254 {
3255 mips_macro_warning.first_frag = frag_now;
3256 frag_var (rs_machine_dependent, 0, 0,
3257 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
3258 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
3259
3260 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
3261 mips_relax.first_fixup = 0;
3262 }
3263
3264 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
3265 See the comment above RELAX_ENCODE for more details. */
3266
3267 static void
3268 relax_start (symbolS *symbol)
3269 {
3270 gas_assert (mips_relax.sequence == 0);
3271 mips_relax.sequence = 1;
3272 mips_relax.symbol = symbol;
3273 }
3274
3275 /* Start generating the second version of a relaxable sequence.
3276 See the comment above RELAX_ENCODE for more details. */
3277
3278 static void
3279 relax_switch (void)
3280 {
3281 gas_assert (mips_relax.sequence == 1);
3282 mips_relax.sequence = 2;
3283 }
3284
3285 /* End the current relaxable sequence. */
3286
3287 static void
3288 relax_end (void)
3289 {
3290 gas_assert (mips_relax.sequence == 2);
3291 relax_close_frag ();
3292 mips_relax.sequence = 0;
3293 }
3294
3295 /* Return true if IP is a delayed branch or jump. */
3296
3297 static inline bfd_boolean
3298 delayed_branch_p (const struct mips_cl_insn *ip)
3299 {
3300 return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3301 | INSN_COND_BRANCH_DELAY
3302 | INSN_COND_BRANCH_LIKELY)) != 0;
3303 }
3304
3305 /* Return true if IP is a compact branch or jump. */
3306
3307 static inline bfd_boolean
3308 compact_branch_p (const struct mips_cl_insn *ip)
3309 {
3310 if (mips_opts.mips16)
3311 return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3312 | MIPS16_INSN_COND_BRANCH)) != 0;
3313 else
3314 return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
3315 | INSN2_COND_BRANCH)) != 0;
3316 }
3317
3318 /* Return true if IP is an unconditional branch or jump. */
3319
3320 static inline bfd_boolean
3321 uncond_branch_p (const struct mips_cl_insn *ip)
3322 {
3323 return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3324 || (mips_opts.mips16
3325 ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3326 : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3327 }
3328
3329 /* Return true if IP is a branch-likely instruction. */
3330
3331 static inline bfd_boolean
3332 branch_likely_p (const struct mips_cl_insn *ip)
3333 {
3334 return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3335 }
3336
3337 /* Return the type of nop that should be used to fill the delay slot
3338 of delayed branch IP. */
3339
3340 static struct mips_cl_insn *
3341 get_delay_slot_nop (const struct mips_cl_insn *ip)
3342 {
3343 if (mips_opts.micromips
3344 && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3345 return &micromips_nop32_insn;
3346 return NOP_INSN;
3347 }
3348
3349 /* Return the mask of core registers that IP reads or writes. */
3350
3351 static unsigned int
3352 gpr_mod_mask (const struct mips_cl_insn *ip)
3353 {
3354 unsigned long pinfo2;
3355 unsigned int mask;
3356
3357 mask = 0;
3358 pinfo2 = ip->insn_mo->pinfo2;
3359 if (mips_opts.micromips)
3360 {
3361 if (pinfo2 & INSN2_MOD_GPR_MD)
3362 mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3363 if (pinfo2 & INSN2_MOD_GPR_MF)
3364 mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3365 if (pinfo2 & INSN2_MOD_SP)
3366 mask |= 1 << SP;
3367 }
3368 return mask;
3369 }
3370
3371 /* Return the mask of core registers that IP reads. */
3372
3373 static unsigned int
3374 gpr_read_mask (const struct mips_cl_insn *ip)
3375 {
3376 unsigned long pinfo, pinfo2;
3377 unsigned int mask;
3378
3379 mask = gpr_mod_mask (ip);
3380 pinfo = ip->insn_mo->pinfo;
3381 pinfo2 = ip->insn_mo->pinfo2;
3382 if (mips_opts.mips16)
3383 {
3384 if (pinfo & MIPS16_INSN_READ_X)
3385 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3386 if (pinfo & MIPS16_INSN_READ_Y)
3387 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3388 if (pinfo & MIPS16_INSN_READ_T)
3389 mask |= 1 << TREG;
3390 if (pinfo & MIPS16_INSN_READ_SP)
3391 mask |= 1 << SP;
3392 if (pinfo & MIPS16_INSN_READ_31)
3393 mask |= 1 << RA;
3394 if (pinfo & MIPS16_INSN_READ_Z)
3395 mask |= 1 << (mips16_to_32_reg_map
3396 [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3397 if (pinfo & MIPS16_INSN_READ_GPR_X)
3398 mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3399 }
3400 else
3401 {
3402 if (pinfo2 & INSN2_READ_GPR_D)
3403 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3404 if (pinfo & INSN_READ_GPR_T)
3405 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3406 if (pinfo & INSN_READ_GPR_S)
3407 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3408 if (pinfo2 & INSN2_READ_GP)
3409 mask |= 1 << GP;
3410 if (pinfo2 & INSN2_READ_GPR_31)
3411 mask |= 1 << RA;
3412 if (pinfo2 & INSN2_READ_GPR_Z)
3413 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3414 }
3415 if (mips_opts.micromips)
3416 {
3417 if (pinfo2 & INSN2_READ_GPR_MC)
3418 mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3419 if (pinfo2 & INSN2_READ_GPR_ME)
3420 mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3421 if (pinfo2 & INSN2_READ_GPR_MG)
3422 mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3423 if (pinfo2 & INSN2_READ_GPR_MJ)
3424 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3425 if (pinfo2 & INSN2_READ_GPR_MMN)
3426 {
3427 mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3428 mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3429 }
3430 if (pinfo2 & INSN2_READ_GPR_MP)
3431 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3432 if (pinfo2 & INSN2_READ_GPR_MQ)
3433 mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3434 }
3435 /* Don't include register 0. */
3436 return mask & ~1;
3437 }
3438
3439 /* Return the mask of core registers that IP writes. */
3440
3441 static unsigned int
3442 gpr_write_mask (const struct mips_cl_insn *ip)
3443 {
3444 unsigned long pinfo, pinfo2;
3445 unsigned int mask;
3446
3447 mask = gpr_mod_mask (ip);
3448 pinfo = ip->insn_mo->pinfo;
3449 pinfo2 = ip->insn_mo->pinfo2;
3450 if (mips_opts.mips16)
3451 {
3452 if (pinfo & MIPS16_INSN_WRITE_X)
3453 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3454 if (pinfo & MIPS16_INSN_WRITE_Y)
3455 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3456 if (pinfo & MIPS16_INSN_WRITE_Z)
3457 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3458 if (pinfo & MIPS16_INSN_WRITE_T)
3459 mask |= 1 << TREG;
3460 if (pinfo & MIPS16_INSN_WRITE_SP)
3461 mask |= 1 << SP;
3462 if (pinfo & MIPS16_INSN_WRITE_31)
3463 mask |= 1 << RA;
3464 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3465 mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3466 }
3467 else
3468 {
3469 if (pinfo & INSN_WRITE_GPR_D)
3470 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3471 if (pinfo & INSN_WRITE_GPR_T)
3472 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3473 if (pinfo & INSN_WRITE_GPR_S)
3474 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3475 if (pinfo & INSN_WRITE_GPR_31)
3476 mask |= 1 << RA;
3477 if (pinfo2 & INSN2_WRITE_GPR_Z)
3478 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3479 }
3480 if (mips_opts.micromips)
3481 {
3482 if (pinfo2 & INSN2_WRITE_GPR_MB)
3483 mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3484 if (pinfo2 & INSN2_WRITE_GPR_MHI)
3485 {
3486 mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3487 mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3488 }
3489 if (pinfo2 & INSN2_WRITE_GPR_MJ)
3490 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3491 if (pinfo2 & INSN2_WRITE_GPR_MP)
3492 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3493 }
3494 /* Don't include register 0. */
3495 return mask & ~1;
3496 }
3497
3498 /* Return the mask of floating-point registers that IP reads. */
3499
3500 static unsigned int
3501 fpr_read_mask (const struct mips_cl_insn *ip)
3502 {
3503 unsigned long pinfo, pinfo2;
3504 unsigned int mask;
3505
3506 mask = 0;
3507 pinfo = ip->insn_mo->pinfo;
3508 pinfo2 = ip->insn_mo->pinfo2;
3509 if (!mips_opts.mips16)
3510 {
3511 if (pinfo2 & INSN2_READ_FPR_D)
3512 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3513 if (pinfo & INSN_READ_FPR_S)
3514 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3515 if (pinfo & INSN_READ_FPR_T)
3516 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3517 if (pinfo & INSN_READ_FPR_R)
3518 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3519 if (pinfo2 & INSN2_READ_FPR_Z)
3520 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3521 }
3522 /* Conservatively treat all operands to an FP_D instruction are doubles.
3523 (This is overly pessimistic for things like cvt.d.s.) */
3524 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3525 mask |= mask << 1;
3526 return mask;
3527 }
3528
3529 /* Return the mask of floating-point registers that IP writes. */
3530
3531 static unsigned int
3532 fpr_write_mask (const struct mips_cl_insn *ip)
3533 {
3534 unsigned long pinfo, pinfo2;
3535 unsigned int mask;
3536
3537 mask = 0;
3538 pinfo = ip->insn_mo->pinfo;
3539 pinfo2 = ip->insn_mo->pinfo2;
3540 if (!mips_opts.mips16)
3541 {
3542 if (pinfo & INSN_WRITE_FPR_D)
3543 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3544 if (pinfo & INSN_WRITE_FPR_S)
3545 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3546 if (pinfo & INSN_WRITE_FPR_T)
3547 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3548 if (pinfo2 & INSN2_WRITE_FPR_Z)
3549 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3550 }
3551 /* Conservatively treat all operands to an FP_D instruction are doubles.
3552 (This is overly pessimistic for things like cvt.s.d.) */
3553 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3554 mask |= mask << 1;
3555 return mask;
3556 }
3557
3558 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3559 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3560 by VR4120 errata. */
3561
3562 static unsigned int
3563 classify_vr4120_insn (const char *name)
3564 {
3565 if (strncmp (name, "macc", 4) == 0)
3566 return FIX_VR4120_MACC;
3567 if (strncmp (name, "dmacc", 5) == 0)
3568 return FIX_VR4120_DMACC;
3569 if (strncmp (name, "mult", 4) == 0)
3570 return FIX_VR4120_MULT;
3571 if (strncmp (name, "dmult", 5) == 0)
3572 return FIX_VR4120_DMULT;
3573 if (strstr (name, "div"))
3574 return FIX_VR4120_DIV;
3575 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3576 return FIX_VR4120_MTHILO;
3577 return NUM_FIX_VR4120_CLASSES;
3578 }
3579
3580 #define INSN_ERET 0x42000018
3581 #define INSN_DERET 0x4200001f
3582
3583 /* Return the number of instructions that must separate INSN1 and INSN2,
3584 where INSN1 is the earlier instruction. Return the worst-case value
3585 for any INSN2 if INSN2 is null. */
3586
3587 static unsigned int
3588 insns_between (const struct mips_cl_insn *insn1,
3589 const struct mips_cl_insn *insn2)
3590 {
3591 unsigned long pinfo1, pinfo2;
3592 unsigned int mask;
3593
3594 /* This function needs to know which pinfo flags are set for INSN2
3595 and which registers INSN2 uses. The former is stored in PINFO2 and
3596 the latter is tested via INSN2_USES_GPR. If INSN2 is null, PINFO2
3597 will have every flag set and INSN2_USES_GPR will always return true. */
3598 pinfo1 = insn1->insn_mo->pinfo;
3599 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3600
3601 #define INSN2_USES_GPR(REG) \
3602 (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3603
3604 /* For most targets, write-after-read dependencies on the HI and LO
3605 registers must be separated by at least two instructions. */
3606 if (!hilo_interlocks)
3607 {
3608 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3609 return 2;
3610 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3611 return 2;
3612 }
3613
3614 /* If we're working around r7000 errata, there must be two instructions
3615 between an mfhi or mflo and any instruction that uses the result. */
3616 if (mips_7000_hilo_fix
3617 && !mips_opts.micromips
3618 && MF_HILO_INSN (pinfo1)
3619 && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3620 return 2;
3621
3622 /* If we're working around 24K errata, one instruction is required
3623 if an ERET or DERET is followed by a branch instruction. */
3624 if (mips_fix_24k && !mips_opts.micromips)
3625 {
3626 if (insn1->insn_opcode == INSN_ERET
3627 || insn1->insn_opcode == INSN_DERET)
3628 {
3629 if (insn2 == NULL
3630 || insn2->insn_opcode == INSN_ERET
3631 || insn2->insn_opcode == INSN_DERET
3632 || delayed_branch_p (insn2))
3633 return 1;
3634 }
3635 }
3636
3637 /* If working around VR4120 errata, check for combinations that need
3638 a single intervening instruction. */
3639 if (mips_fix_vr4120 && !mips_opts.micromips)
3640 {
3641 unsigned int class1, class2;
3642
3643 class1 = classify_vr4120_insn (insn1->insn_mo->name);
3644 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3645 {
3646 if (insn2 == NULL)
3647 return 1;
3648 class2 = classify_vr4120_insn (insn2->insn_mo->name);
3649 if (vr4120_conflicts[class1] & (1 << class2))
3650 return 1;
3651 }
3652 }
3653
3654 if (!HAVE_CODE_COMPRESSION)
3655 {
3656 /* Check for GPR or coprocessor load delays. All such delays
3657 are on the RT register. */
3658 /* Itbl support may require additional care here. */
3659 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3660 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3661 {
3662 know (pinfo1 & INSN_WRITE_GPR_T);
3663 if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3664 return 1;
3665 }
3666
3667 /* Check for generic coprocessor hazards.
3668
3669 This case is not handled very well. There is no special
3670 knowledge of CP0 handling, and the coprocessors other than
3671 the floating point unit are not distinguished at all. */
3672 /* Itbl support may require additional care here. FIXME!
3673 Need to modify this to include knowledge about
3674 user specified delays! */
3675 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3676 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3677 {
3678 /* Handle cases where INSN1 writes to a known general coprocessor
3679 register. There must be a one instruction delay before INSN2
3680 if INSN2 reads that register, otherwise no delay is needed. */
3681 mask = fpr_write_mask (insn1);
3682 if (mask != 0)
3683 {
3684 if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3685 return 1;
3686 }
3687 else
3688 {
3689 /* Read-after-write dependencies on the control registers
3690 require a two-instruction gap. */
3691 if ((pinfo1 & INSN_WRITE_COND_CODE)
3692 && (pinfo2 & INSN_READ_COND_CODE))
3693 return 2;
3694
3695 /* We don't know exactly what INSN1 does. If INSN2 is
3696 also a coprocessor instruction, assume there must be
3697 a one instruction gap. */
3698 if (pinfo2 & INSN_COP)
3699 return 1;
3700 }
3701 }
3702
3703 /* Check for read-after-write dependencies on the coprocessor
3704 control registers in cases where INSN1 does not need a general
3705 coprocessor delay. This means that INSN1 is a floating point
3706 comparison instruction. */
3707 /* Itbl support may require additional care here. */
3708 else if (!cop_interlocks
3709 && (pinfo1 & INSN_WRITE_COND_CODE)
3710 && (pinfo2 & INSN_READ_COND_CODE))
3711 return 1;
3712 }
3713
3714 #undef INSN2_USES_GPR
3715
3716 return 0;
3717 }
3718
3719 /* Return the number of nops that would be needed to work around the
3720 VR4130 mflo/mfhi errata if instruction INSN immediately followed
3721 the MAX_VR4130_NOPS instructions described by HIST. Ignore hazards
3722 that are contained within the first IGNORE instructions of HIST. */
3723
3724 static int
3725 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3726 const struct mips_cl_insn *insn)
3727 {
3728 int i, j;
3729 unsigned int mask;
3730
3731 /* Check if the instruction writes to HI or LO. MTHI and MTLO
3732 are not affected by the errata. */
3733 if (insn != 0
3734 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3735 || strcmp (insn->insn_mo->name, "mtlo") == 0
3736 || strcmp (insn->insn_mo->name, "mthi") == 0))
3737 return 0;
3738
3739 /* Search for the first MFLO or MFHI. */
3740 for (i = 0; i < MAX_VR4130_NOPS; i++)
3741 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3742 {
3743 /* Extract the destination register. */
3744 mask = gpr_write_mask (&hist[i]);
3745
3746 /* No nops are needed if INSN reads that register. */
3747 if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3748 return 0;
3749
3750 /* ...or if any of the intervening instructions do. */
3751 for (j = 0; j < i; j++)
3752 if (gpr_read_mask (&hist[j]) & mask)
3753 return 0;
3754
3755 if (i >= ignore)
3756 return MAX_VR4130_NOPS - i;
3757 }
3758 return 0;
3759 }
3760
3761 #define BASE_REG_EQ(INSN1, INSN2) \
3762 ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3763 == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3764
3765 /* Return the minimum alignment for this store instruction. */
3766
3767 static int
3768 fix_24k_align_to (const struct mips_opcode *mo)
3769 {
3770 if (strcmp (mo->name, "sh") == 0)
3771 return 2;
3772
3773 if (strcmp (mo->name, "swc1") == 0
3774 || strcmp (mo->name, "swc2") == 0
3775 || strcmp (mo->name, "sw") == 0
3776 || strcmp (mo->name, "sc") == 0
3777 || strcmp (mo->name, "s.s") == 0)
3778 return 4;
3779
3780 if (strcmp (mo->name, "sdc1") == 0
3781 || strcmp (mo->name, "sdc2") == 0
3782 || strcmp (mo->name, "s.d") == 0)
3783 return 8;
3784
3785 /* sb, swl, swr */
3786 return 1;
3787 }
3788
3789 struct fix_24k_store_info
3790 {
3791 /* Immediate offset, if any, for this store instruction. */
3792 short off;
3793 /* Alignment required by this store instruction. */
3794 int align_to;
3795 /* True for register offsets. */
3796 int register_offset;
3797 };
3798
3799 /* Comparison function used by qsort. */
3800
3801 static int
3802 fix_24k_sort (const void *a, const void *b)
3803 {
3804 const struct fix_24k_store_info *pos1 = a;
3805 const struct fix_24k_store_info *pos2 = b;
3806
3807 return (pos1->off - pos2->off);
3808 }
3809
3810 /* INSN is a store instruction. Try to record the store information
3811 in STINFO. Return false if the information isn't known. */
3812
3813 static bfd_boolean
3814 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3815 const struct mips_cl_insn *insn)
3816 {
3817 /* The instruction must have a known offset. */
3818 if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3819 return FALSE;
3820
3821 stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3822 stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3823 return TRUE;
3824 }
3825
3826 /* Return the number of nops that would be needed to work around the 24k
3827 "lost data on stores during refill" errata if instruction INSN
3828 immediately followed the 2 instructions described by HIST.
3829 Ignore hazards that are contained within the first IGNORE
3830 instructions of HIST.
3831
3832 Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3833 for the data cache refills and store data. The following describes
3834 the scenario where the store data could be lost.
3835
3836 * A data cache miss, due to either a load or a store, causing fill
3837 data to be supplied by the memory subsystem
3838 * The first three doublewords of fill data are returned and written
3839 into the cache
3840 * A sequence of four stores occurs in consecutive cycles around the
3841 final doubleword of the fill:
3842 * Store A
3843 * Store B
3844 * Store C
3845 * Zero, One or more instructions
3846 * Store D
3847
3848 The four stores A-D must be to different doublewords of the line that
3849 is being filled. The fourth instruction in the sequence above permits
3850 the fill of the final doubleword to be transferred from the FSB into
3851 the cache. In the sequence above, the stores may be either integer
3852 (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3853 swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3854 different doublewords on the line. If the floating point unit is
3855 running in 1:2 mode, it is not possible to create the sequence above
3856 using only floating point store instructions.
3857
3858 In this case, the cache line being filled is incorrectly marked
3859 invalid, thereby losing the data from any store to the line that
3860 occurs between the original miss and the completion of the five
3861 cycle sequence shown above.
3862
3863 The workarounds are:
3864
3865 * Run the data cache in write-through mode.
3866 * Insert a non-store instruction between
3867 Store A and Store B or Store B and Store C. */
3868
3869 static int
3870 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3871 const struct mips_cl_insn *insn)
3872 {
3873 struct fix_24k_store_info pos[3];
3874 int align, i, base_offset;
3875
3876 if (ignore >= 2)
3877 return 0;
3878
3879 /* If the previous instruction wasn't a store, there's nothing to
3880 worry about. */
3881 if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3882 return 0;
3883
3884 /* If the instructions after the previous one are unknown, we have
3885 to assume the worst. */
3886 if (!insn)
3887 return 1;
3888
3889 /* Check whether we are dealing with three consecutive stores. */
3890 if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3891 || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3892 return 0;
3893
3894 /* If we don't know the relationship between the store addresses,
3895 assume the worst. */
3896 if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3897 || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3898 return 1;
3899
3900 if (!fix_24k_record_store_info (&pos[0], insn)
3901 || !fix_24k_record_store_info (&pos[1], &hist[0])
3902 || !fix_24k_record_store_info (&pos[2], &hist[1]))
3903 return 1;
3904
3905 qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3906
3907 /* Pick a value of ALIGN and X such that all offsets are adjusted by
3908 X bytes and such that the base register + X is known to be aligned
3909 to align bytes. */
3910
3911 if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3912 align = 8;
3913 else
3914 {
3915 align = pos[0].align_to;
3916 base_offset = pos[0].off;
3917 for (i = 1; i < 3; i++)
3918 if (align < pos[i].align_to)
3919 {
3920 align = pos[i].align_to;
3921 base_offset = pos[i].off;
3922 }
3923 for (i = 0; i < 3; i++)
3924 pos[i].off -= base_offset;
3925 }
3926
3927 pos[0].off &= ~align + 1;
3928 pos[1].off &= ~align + 1;
3929 pos[2].off &= ~align + 1;
3930
3931 /* If any two stores write to the same chunk, they also write to the
3932 same doubleword. The offsets are still sorted at this point. */
3933 if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3934 return 0;
3935
3936 /* A range of at least 9 bytes is needed for the stores to be in
3937 non-overlapping doublewords. */
3938 if (pos[2].off - pos[0].off <= 8)
3939 return 0;
3940
3941 if (pos[2].off - pos[1].off >= 24
3942 || pos[1].off - pos[0].off >= 24
3943 || pos[2].off - pos[0].off >= 32)
3944 return 0;
3945
3946 return 1;
3947 }
3948
3949 /* Return the number of nops that would be needed if instruction INSN
3950 immediately followed the MAX_NOPS instructions given by HIST,
3951 where HIST[0] is the most recent instruction. Ignore hazards
3952 between INSN and the first IGNORE instructions in HIST.
3953
3954 If INSN is null, return the worse-case number of nops for any
3955 instruction. */
3956
3957 static int
3958 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3959 const struct mips_cl_insn *insn)
3960 {
3961 int i, nops, tmp_nops;
3962
3963 nops = 0;
3964 for (i = ignore; i < MAX_DELAY_NOPS; i++)
3965 {
3966 tmp_nops = insns_between (hist + i, insn) - i;
3967 if (tmp_nops > nops)
3968 nops = tmp_nops;
3969 }
3970
3971 if (mips_fix_vr4130 && !mips_opts.micromips)
3972 {
3973 tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3974 if (tmp_nops > nops)
3975 nops = tmp_nops;
3976 }
3977
3978 if (mips_fix_24k && !mips_opts.micromips)
3979 {
3980 tmp_nops = nops_for_24k (ignore, hist, insn);
3981 if (tmp_nops > nops)
3982 nops = tmp_nops;
3983 }
3984
3985 return nops;
3986 }
3987
3988 /* The variable arguments provide NUM_INSNS extra instructions that
3989 might be added to HIST. Return the largest number of nops that
3990 would be needed after the extended sequence, ignoring hazards
3991 in the first IGNORE instructions. */
3992
3993 static int
3994 nops_for_sequence (int num_insns, int ignore,
3995 const struct mips_cl_insn *hist, ...)
3996 {
3997 va_list args;
3998 struct mips_cl_insn buffer[MAX_NOPS];
3999 struct mips_cl_insn *cursor;
4000 int nops;
4001
4002 va_start (args, hist);
4003 cursor = buffer + num_insns;
4004 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
4005 while (cursor > buffer)
4006 *--cursor = *va_arg (args, const struct mips_cl_insn *);
4007
4008 nops = nops_for_insn (ignore, buffer, NULL);
4009 va_end (args);
4010 return nops;
4011 }
4012
4013 /* Like nops_for_insn, but if INSN is a branch, take into account the
4014 worst-case delay for the branch target. */
4015
4016 static int
4017 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
4018 const struct mips_cl_insn *insn)
4019 {
4020 int nops, tmp_nops;
4021
4022 nops = nops_for_insn (ignore, hist, insn);
4023 if (delayed_branch_p (insn))
4024 {
4025 tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
4026 hist, insn, get_delay_slot_nop (insn));
4027 if (tmp_nops > nops)
4028 nops = tmp_nops;
4029 }
4030 else if (compact_branch_p (insn))
4031 {
4032 tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
4033 if (tmp_nops > nops)
4034 nops = tmp_nops;
4035 }
4036 return nops;
4037 }
4038
4039 /* Fix NOP issue: Replace nops by "or at,at,zero". */
4040
4041 static void
4042 fix_loongson2f_nop (struct mips_cl_insn * ip)
4043 {
4044 gas_assert (!HAVE_CODE_COMPRESSION);
4045 if (strcmp (ip->insn_mo->name, "nop") == 0)
4046 ip->insn_opcode = LOONGSON2F_NOP_INSN;
4047 }
4048
4049 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
4050 jr target pc &= 'hffff_ffff_cfff_ffff. */
4051
4052 static void
4053 fix_loongson2f_jump (struct mips_cl_insn * ip)
4054 {
4055 gas_assert (!HAVE_CODE_COMPRESSION);
4056 if (strcmp (ip->insn_mo->name, "j") == 0
4057 || strcmp (ip->insn_mo->name, "jr") == 0
4058 || strcmp (ip->insn_mo->name, "jalr") == 0)
4059 {
4060 int sreg;
4061 expressionS ep;
4062
4063 if (! mips_opts.at)
4064 return;
4065
4066 sreg = EXTRACT_OPERAND (0, RS, *ip);
4067 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
4068 return;
4069
4070 ep.X_op = O_constant;
4071 ep.X_add_number = 0xcfff0000;
4072 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
4073 ep.X_add_number = 0xffff;
4074 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
4075 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
4076 }
4077 }
4078
4079 static void
4080 fix_loongson2f (struct mips_cl_insn * ip)
4081 {
4082 if (mips_fix_loongson2f_nop)
4083 fix_loongson2f_nop (ip);
4084
4085 if (mips_fix_loongson2f_jump)
4086 fix_loongson2f_jump (ip);
4087 }
4088
4089 /* IP is a branch that has a delay slot, and we need to fill it
4090 automatically. Return true if we can do that by swapping IP
4091 with the previous instruction.
4092 ADDRESS_EXPR is an operand of the instruction to be used with
4093 RELOC_TYPE. */
4094
4095 static bfd_boolean
4096 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
4097 bfd_reloc_code_real_type *reloc_type)
4098 {
4099 unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
4100 unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
4101
4102 /* -O2 and above is required for this optimization. */
4103 if (mips_optimize < 2)
4104 return FALSE;
4105
4106 /* If we have seen .set volatile or .set nomove, don't optimize. */
4107 if (mips_opts.nomove)
4108 return FALSE;
4109
4110 /* We can't swap if the previous instruction's position is fixed. */
4111 if (history[0].fixed_p)
4112 return FALSE;
4113
4114 /* If the previous previous insn was in a .set noreorder, we can't
4115 swap. Actually, the MIPS assembler will swap in this situation.
4116 However, gcc configured -with-gnu-as will generate code like
4117
4118 .set noreorder
4119 lw $4,XXX
4120 .set reorder
4121 INSN
4122 bne $4,$0,foo
4123
4124 in which we can not swap the bne and INSN. If gcc is not configured
4125 -with-gnu-as, it does not output the .set pseudo-ops. */
4126 if (history[1].noreorder_p)
4127 return FALSE;
4128
4129 /* If the previous instruction had a fixup in mips16 mode, we can not swap.
4130 This means that the previous instruction was a 4-byte one anyhow. */
4131 if (mips_opts.mips16 && history[0].fixp[0])
4132 return FALSE;
4133
4134 /* If the branch is itself the target of a branch, we can not swap.
4135 We cheat on this; all we check for is whether there is a label on
4136 this instruction. If there are any branches to anything other than
4137 a label, users must use .set noreorder. */
4138 if (seg_info (now_seg)->label_list)
4139 return FALSE;
4140
4141 /* If the previous instruction is in a variant frag other than this
4142 branch's one, we cannot do the swap. This does not apply to
4143 MIPS16 code, which uses variant frags for different purposes. */
4144 if (!mips_opts.mips16
4145 && history[0].frag
4146 && history[0].frag->fr_type == rs_machine_dependent)
4147 return FALSE;
4148
4149 /* We do not swap with instructions that cannot architecturally
4150 be placed in a branch delay slot, such as SYNC or ERET. We
4151 also refrain from swapping with a trap instruction, since it
4152 complicates trap handlers to have the trap instruction be in
4153 a delay slot. */
4154 prev_pinfo = history[0].insn_mo->pinfo;
4155 if (prev_pinfo & INSN_NO_DELAY_SLOT)
4156 return FALSE;
4157
4158 /* Check for conflicts between the branch and the instructions
4159 before the candidate delay slot. */
4160 if (nops_for_insn (0, history + 1, ip) > 0)
4161 return FALSE;
4162
4163 /* Check for conflicts between the swapped sequence and the
4164 target of the branch. */
4165 if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
4166 return FALSE;
4167
4168 /* If the branch reads a register that the previous
4169 instruction sets, we can not swap. */
4170 gpr_read = gpr_read_mask (ip);
4171 prev_gpr_write = gpr_write_mask (&history[0]);
4172 if (gpr_read & prev_gpr_write)
4173 return FALSE;
4174
4175 /* If the branch writes a register that the previous
4176 instruction sets, we can not swap. */
4177 gpr_write = gpr_write_mask (ip);
4178 if (gpr_write & prev_gpr_write)
4179 return FALSE;
4180
4181 /* If the branch writes a register that the previous
4182 instruction reads, we can not swap. */
4183 prev_gpr_read = gpr_read_mask (&history[0]);
4184 if (gpr_write & prev_gpr_read)
4185 return FALSE;
4186
4187 /* If one instruction sets a condition code and the
4188 other one uses a condition code, we can not swap. */
4189 pinfo = ip->insn_mo->pinfo;
4190 if ((pinfo & INSN_READ_COND_CODE)
4191 && (prev_pinfo & INSN_WRITE_COND_CODE))
4192 return FALSE;
4193 if ((pinfo & INSN_WRITE_COND_CODE)
4194 && (prev_pinfo & INSN_READ_COND_CODE))
4195 return FALSE;
4196
4197 /* If the previous instruction uses the PC, we can not swap. */
4198 prev_pinfo2 = history[0].insn_mo->pinfo2;
4199 if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
4200 return FALSE;
4201 if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
4202 return FALSE;
4203
4204 /* If the previous instruction has an incorrect size for a fixed
4205 branch delay slot in microMIPS mode, we cannot swap. */
4206 pinfo2 = ip->insn_mo->pinfo2;
4207 if (mips_opts.micromips
4208 && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
4209 && insn_length (history) != 2)
4210 return FALSE;
4211 if (mips_opts.micromips
4212 && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
4213 && insn_length (history) != 4)
4214 return FALSE;
4215
4216 /* On R5900 short loops need to be fixed by inserting a nop in
4217 the branch delay slots.
4218 A short loop can be terminated too early. */
4219 if (mips_opts.arch == CPU_R5900
4220 /* Check if instruction has a parameter, ignore "j $31". */
4221 && (address_expr != NULL)
4222 /* Parameter must be 16 bit. */
4223 && (*reloc_type == BFD_RELOC_16_PCREL_S2)
4224 /* Branch to same segment. */
4225 && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
4226 /* Branch to same code fragment. */
4227 && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
4228 /* Can only calculate branch offset if value is known. */
4229 && symbol_constant_p(address_expr->X_add_symbol)
4230 /* Check if branch is really conditional. */
4231 && !((ip->insn_opcode & 0xffff0000) == 0x10000000 /* beq $0,$0 */
4232 || (ip->insn_opcode & 0xffff0000) == 0x04010000 /* bgez $0 */
4233 || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
4234 {
4235 int distance;
4236 /* Check if loop is shorter than 6 instructions including
4237 branch and delay slot. */
4238 distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
4239 if (distance <= 20)
4240 {
4241 int i;
4242 int rv;
4243
4244 rv = FALSE;
4245 /* When the loop includes branches or jumps,
4246 it is not a short loop. */
4247 for (i = 0; i < (distance / 4); i++)
4248 {
4249 if ((history[i].cleared_p)
4250 || delayed_branch_p(&history[i]))
4251 {
4252 rv = TRUE;
4253 break;
4254 }
4255 }
4256 if (rv == FALSE)
4257 {
4258 /* Insert nop after branch to fix short loop. */
4259 return FALSE;
4260 }
4261 }
4262 }
4263
4264 return TRUE;
4265 }
4266
4267 /* Decide how we should add IP to the instruction stream.
4268 ADDRESS_EXPR is an operand of the instruction to be used with
4269 RELOC_TYPE. */
4270
4271 static enum append_method
4272 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
4273 bfd_reloc_code_real_type *reloc_type)
4274 {
4275 unsigned long pinfo;
4276
4277 /* The relaxed version of a macro sequence must be inherently
4278 hazard-free. */
4279 if (mips_relax.sequence == 2)
4280 return APPEND_ADD;
4281
4282 /* We must not dabble with instructions in a ".set norerorder" block. */
4283 if (mips_opts.noreorder)
4284 return APPEND_ADD;
4285
4286 /* Otherwise, it's our responsibility to fill branch delay slots. */
4287 if (delayed_branch_p (ip))
4288 {
4289 if (!branch_likely_p (ip)
4290 && can_swap_branch_p (ip, address_expr, reloc_type))
4291 return APPEND_SWAP;
4292
4293 pinfo = ip->insn_mo->pinfo;
4294 if (mips_opts.mips16
4295 && ISA_SUPPORTS_MIPS16E
4296 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
4297 return APPEND_ADD_COMPACT;
4298
4299 return APPEND_ADD_WITH_NOP;
4300 }
4301
4302 return APPEND_ADD;
4303 }
4304
4305 /* IP is a MIPS16 instruction whose opcode we have just changed.
4306 Point IP->insn_mo to the new opcode's definition. */
4307
4308 static void
4309 find_altered_mips16_opcode (struct mips_cl_insn *ip)
4310 {
4311 const struct mips_opcode *mo, *end;
4312
4313 end = &mips16_opcodes[bfd_mips16_num_opcodes];
4314 for (mo = ip->insn_mo; mo < end; mo++)
4315 if ((ip->insn_opcode & mo->mask) == mo->match)
4316 {
4317 ip->insn_mo = mo;
4318 return;
4319 }
4320 abort ();
4321 }
4322
4323 /* For microMIPS macros, we need to generate a local number label
4324 as the target of branches. */
4325 #define MICROMIPS_LABEL_CHAR '\037'
4326 static unsigned long micromips_target_label;
4327 static char micromips_target_name[32];
4328
4329 static char *
4330 micromips_label_name (void)
4331 {
4332 char *p = micromips_target_name;
4333 char symbol_name_temporary[24];
4334 unsigned long l;
4335 int i;
4336
4337 if (*p)
4338 return p;
4339
4340 i = 0;
4341 l = micromips_target_label;
4342 #ifdef LOCAL_LABEL_PREFIX
4343 *p++ = LOCAL_LABEL_PREFIX;
4344 #endif
4345 *p++ = 'L';
4346 *p++ = MICROMIPS_LABEL_CHAR;
4347 do
4348 {
4349 symbol_name_temporary[i++] = l % 10 + '0';
4350 l /= 10;
4351 }
4352 while (l != 0);
4353 while (i > 0)
4354 *p++ = symbol_name_temporary[--i];
4355 *p = '\0';
4356
4357 return micromips_target_name;
4358 }
4359
4360 static void
4361 micromips_label_expr (expressionS *label_expr)
4362 {
4363 label_expr->X_op = O_symbol;
4364 label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4365 label_expr->X_add_number = 0;
4366 }
4367
4368 static void
4369 micromips_label_inc (void)
4370 {
4371 micromips_target_label++;
4372 *micromips_target_name = '\0';
4373 }
4374
4375 static void
4376 micromips_add_label (void)
4377 {
4378 symbolS *s;
4379
4380 s = colon (micromips_label_name ());
4381 micromips_label_inc ();
4382 S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4383 }
4384
4385 /* If assembling microMIPS code, then return the microMIPS reloc
4386 corresponding to the requested one if any. Otherwise return
4387 the reloc unchanged. */
4388
4389 static bfd_reloc_code_real_type
4390 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4391 {
4392 static const bfd_reloc_code_real_type relocs[][2] =
4393 {
4394 /* Keep sorted incrementally by the left-hand key. */
4395 { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4396 { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4397 { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4398 { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4399 { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4400 { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4401 { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4402 { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4403 { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4404 { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4405 { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4406 { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4407 { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4408 { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4409 { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4410 { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4411 { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4412 { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4413 { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4414 { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4415 { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4416 { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4417 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4418 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4419 { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4420 { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4421 { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4422 };
4423 bfd_reloc_code_real_type r;
4424 size_t i;
4425
4426 if (!mips_opts.micromips)
4427 return reloc;
4428 for (i = 0; i < ARRAY_SIZE (relocs); i++)
4429 {
4430 r = relocs[i][0];
4431 if (r > reloc)
4432 return reloc;
4433 if (r == reloc)
4434 return relocs[i][1];
4435 }
4436 return reloc;
4437 }
4438
4439 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4440 Return true on success, storing the resolved value in RESULT. */
4441
4442 static bfd_boolean
4443 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4444 offsetT *result)
4445 {
4446 switch (reloc)
4447 {
4448 case BFD_RELOC_MIPS_HIGHEST:
4449 case BFD_RELOC_MICROMIPS_HIGHEST:
4450 *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4451 return TRUE;
4452
4453 case BFD_RELOC_MIPS_HIGHER:
4454 case BFD_RELOC_MICROMIPS_HIGHER:
4455 *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4456 return TRUE;
4457
4458 case BFD_RELOC_HI16_S:
4459 case BFD_RELOC_MICROMIPS_HI16_S:
4460 case BFD_RELOC_MIPS16_HI16_S:
4461 *result = ((operand + 0x8000) >> 16) & 0xffff;
4462 return TRUE;
4463
4464 case BFD_RELOC_HI16:
4465 case BFD_RELOC_MICROMIPS_HI16:
4466 case BFD_RELOC_MIPS16_HI16:
4467 *result = (operand >> 16) & 0xffff;
4468 return TRUE;
4469
4470 case BFD_RELOC_LO16:
4471 case BFD_RELOC_MICROMIPS_LO16:
4472 case BFD_RELOC_MIPS16_LO16:
4473 *result = operand & 0xffff;
4474 return TRUE;
4475
4476 case BFD_RELOC_UNUSED:
4477 *result = operand;
4478 return TRUE;
4479
4480 default:
4481 return FALSE;
4482 }
4483 }
4484
4485 /* Output an instruction. IP is the instruction information.
4486 ADDRESS_EXPR is an operand of the instruction to be used with
4487 RELOC_TYPE. EXPANSIONP is true if the instruction is part of
4488 a macro expansion. */
4489
4490 static void
4491 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4492 bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4493 {
4494 unsigned long prev_pinfo2, pinfo;
4495 bfd_boolean relaxed_branch = FALSE;
4496 enum append_method method;
4497 bfd_boolean relax32;
4498 int branch_disp;
4499
4500 if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4501 fix_loongson2f (ip);
4502
4503 file_ase_mips16 |= mips_opts.mips16;
4504 file_ase_micromips |= mips_opts.micromips;
4505
4506 prev_pinfo2 = history[0].insn_mo->pinfo2;
4507 pinfo = ip->insn_mo->pinfo;
4508
4509 if (mips_opts.micromips
4510 && !expansionp
4511 && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4512 && micromips_insn_length (ip->insn_mo) != 2)
4513 || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4514 && micromips_insn_length (ip->insn_mo) != 4)))
4515 as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4516 (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4517
4518 if (address_expr == NULL)
4519 ip->complete_p = 1;
4520 else if (reloc_type[0] <= BFD_RELOC_UNUSED
4521 && reloc_type[1] == BFD_RELOC_UNUSED
4522 && reloc_type[2] == BFD_RELOC_UNUSED
4523 && address_expr->X_op == O_constant)
4524 {
4525 switch (*reloc_type)
4526 {
4527 case BFD_RELOC_MIPS_JMP:
4528 {
4529 int shift;
4530
4531 shift = mips_opts.micromips ? 1 : 2;
4532 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4533 as_bad (_("jump to misaligned address (0x%lx)"),
4534 (unsigned long) address_expr->X_add_number);
4535 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4536 & 0x3ffffff);
4537 ip->complete_p = 1;
4538 }
4539 break;
4540
4541 case BFD_RELOC_MIPS16_JMP:
4542 if ((address_expr->X_add_number & 3) != 0)
4543 as_bad (_("jump to misaligned address (0x%lx)"),
4544 (unsigned long) address_expr->X_add_number);
4545 ip->insn_opcode |=
4546 (((address_expr->X_add_number & 0x7c0000) << 3)
4547 | ((address_expr->X_add_number & 0xf800000) >> 7)
4548 | ((address_expr->X_add_number & 0x3fffc) >> 2));
4549 ip->complete_p = 1;
4550 break;
4551
4552 case BFD_RELOC_16_PCREL_S2:
4553 {
4554 int shift;
4555
4556 shift = mips_opts.micromips ? 1 : 2;
4557 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4558 as_bad (_("branch to misaligned address (0x%lx)"),
4559 (unsigned long) address_expr->X_add_number);
4560 if (!mips_relax_branch)
4561 {
4562 if ((address_expr->X_add_number + (1 << (shift + 15)))
4563 & ~((1 << (shift + 16)) - 1))
4564 as_bad (_("branch address range overflow (0x%lx)"),
4565 (unsigned long) address_expr->X_add_number);
4566 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4567 & 0xffff);
4568 }
4569 }
4570 break;
4571
4572 default:
4573 {
4574 offsetT value;
4575
4576 if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4577 &value))
4578 {
4579 ip->insn_opcode |= value & 0xffff;
4580 ip->complete_p = 1;
4581 }
4582 }
4583 break;
4584 }
4585 }
4586
4587 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4588 {
4589 /* There are a lot of optimizations we could do that we don't.
4590 In particular, we do not, in general, reorder instructions.
4591 If you use gcc with optimization, it will reorder
4592 instructions and generally do much more optimization then we
4593 do here; repeating all that work in the assembler would only
4594 benefit hand written assembly code, and does not seem worth
4595 it. */
4596 int nops = (mips_optimize == 0
4597 ? nops_for_insn (0, history, NULL)
4598 : nops_for_insn_or_target (0, history, ip));
4599 if (nops > 0)
4600 {
4601 fragS *old_frag;
4602 unsigned long old_frag_offset;
4603 int i;
4604
4605 old_frag = frag_now;
4606 old_frag_offset = frag_now_fix ();
4607
4608 for (i = 0; i < nops; i++)
4609 add_fixed_insn (NOP_INSN);
4610 insert_into_history (0, nops, NOP_INSN);
4611
4612 if (listing)
4613 {
4614 listing_prev_line ();
4615 /* We may be at the start of a variant frag. In case we
4616 are, make sure there is enough space for the frag
4617 after the frags created by listing_prev_line. The
4618 argument to frag_grow here must be at least as large
4619 as the argument to all other calls to frag_grow in
4620 this file. We don't have to worry about being in the
4621 middle of a variant frag, because the variants insert
4622 all needed nop instructions themselves. */
4623 frag_grow (40);
4624 }
4625
4626 mips_move_text_labels ();
4627
4628 #ifndef NO_ECOFF_DEBUGGING
4629 if (ECOFF_DEBUGGING)
4630 ecoff_fix_loc (old_frag, old_frag_offset);
4631 #endif
4632 }
4633 }
4634 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4635 {
4636 int nops;
4637
4638 /* Work out how many nops in prev_nop_frag are needed by IP,
4639 ignoring hazards generated by the first prev_nop_frag_since
4640 instructions. */
4641 nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4642 gas_assert (nops <= prev_nop_frag_holds);
4643
4644 /* Enforce NOPS as a minimum. */
4645 if (nops > prev_nop_frag_required)
4646 prev_nop_frag_required = nops;
4647
4648 if (prev_nop_frag_holds == prev_nop_frag_required)
4649 {
4650 /* Settle for the current number of nops. Update the history
4651 accordingly (for the benefit of any future .set reorder code). */
4652 prev_nop_frag = NULL;
4653 insert_into_history (prev_nop_frag_since,
4654 prev_nop_frag_holds, NOP_INSN);
4655 }
4656 else
4657 {
4658 /* Allow this instruction to replace one of the nops that was
4659 tentatively added to prev_nop_frag. */
4660 prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4661 prev_nop_frag_holds--;
4662 prev_nop_frag_since++;
4663 }
4664 }
4665
4666 method = get_append_method (ip, address_expr, reloc_type);
4667 branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4668
4669 dwarf2_emit_insn (0);
4670 /* We want MIPS16 and microMIPS debug info to use ISA-encoded addresses,
4671 so "move" the instruction address accordingly.
4672
4673 Also, it doesn't seem appropriate for the assembler to reorder .loc
4674 entries. If this instruction is a branch that we are going to swap
4675 with the previous instruction, the two instructions should be
4676 treated as a unit, and the debug information for both instructions
4677 should refer to the start of the branch sequence. Using the
4678 current position is certainly wrong when swapping a 32-bit branch
4679 and a 16-bit delay slot, since the current position would then be
4680 in the middle of a branch. */
4681 dwarf2_move_insn ((HAVE_CODE_COMPRESSION ? 1 : 0) - branch_disp);
4682
4683 relax32 = (mips_relax_branch
4684 /* Don't try branch relaxation within .set nomacro, or within
4685 .set noat if we use $at for PIC computations. If it turns
4686 out that the branch was out-of-range, we'll get an error. */
4687 && !mips_opts.warn_about_macros
4688 && (mips_opts.at || mips_pic == NO_PIC)
4689 /* Don't relax BPOSGE32/64 or BC1ANY2T/F and BC1ANY4T/F
4690 as they have no complementing branches. */
4691 && !(ip->insn_mo->ase & (ASE_MIPS3D | ASE_DSP64 | ASE_DSP)));
4692
4693 if (!HAVE_CODE_COMPRESSION
4694 && address_expr
4695 && relax32
4696 && *reloc_type == BFD_RELOC_16_PCREL_S2
4697 && delayed_branch_p (ip))
4698 {
4699 relaxed_branch = TRUE;
4700 add_relaxed_insn (ip, (relaxed_branch_length
4701 (NULL, NULL,
4702 uncond_branch_p (ip) ? -1
4703 : branch_likely_p (ip) ? 1
4704 : 0)), 4,
4705 RELAX_BRANCH_ENCODE
4706 (AT,
4707 uncond_branch_p (ip),
4708 branch_likely_p (ip),
4709 pinfo & INSN_WRITE_GPR_31,
4710 0),
4711 address_expr->X_add_symbol,
4712 address_expr->X_add_number);
4713 *reloc_type = BFD_RELOC_UNUSED;
4714 }
4715 else if (mips_opts.micromips
4716 && address_expr
4717 && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4718 || *reloc_type > BFD_RELOC_UNUSED)
4719 && (delayed_branch_p (ip) || compact_branch_p (ip))
4720 /* Don't try branch relaxation when users specify
4721 16-bit/32-bit instructions. */
4722 && !forced_insn_length)
4723 {
4724 bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4725 int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4726 int uncond = uncond_branch_p (ip) ? -1 : 0;
4727 int compact = compact_branch_p (ip);
4728 int al = pinfo & INSN_WRITE_GPR_31;
4729 int length32;
4730
4731 gas_assert (address_expr != NULL);
4732 gas_assert (!mips_relax.sequence);
4733
4734 relaxed_branch = TRUE;
4735 length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4736 add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4737 RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4738 relax32, 0, 0),
4739 address_expr->X_add_symbol,
4740 address_expr->X_add_number);
4741 *reloc_type = BFD_RELOC_UNUSED;
4742 }
4743 else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4744 {
4745 /* We need to set up a variant frag. */
4746 gas_assert (address_expr != NULL);
4747 add_relaxed_insn (ip, 4, 0,
4748 RELAX_MIPS16_ENCODE
4749 (*reloc_type - BFD_RELOC_UNUSED,
4750 forced_insn_length == 2, forced_insn_length == 4,
4751 delayed_branch_p (&history[0]),
4752 history[0].mips16_absolute_jump_p),
4753 make_expr_symbol (address_expr), 0);
4754 }
4755 else if (mips_opts.mips16 && insn_length (ip) == 2)
4756 {
4757 if (!delayed_branch_p (ip))
4758 /* Make sure there is enough room to swap this instruction with
4759 a following jump instruction. */
4760 frag_grow (6);
4761 add_fixed_insn (ip);
4762 }
4763 else
4764 {
4765 if (mips_opts.mips16
4766 && mips_opts.noreorder
4767 && delayed_branch_p (&history[0]))
4768 as_warn (_("extended instruction in delay slot"));
4769
4770 if (mips_relax.sequence)
4771 {
4772 /* If we've reached the end of this frag, turn it into a variant
4773 frag and record the information for the instructions we've
4774 written so far. */
4775 if (frag_room () < 4)
4776 relax_close_frag ();
4777 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4778 }
4779
4780 if (mips_relax.sequence != 2)
4781 {
4782 if (mips_macro_warning.first_insn_sizes[0] == 0)
4783 mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4784 mips_macro_warning.sizes[0] += insn_length (ip);
4785 mips_macro_warning.insns[0]++;
4786 }
4787 if (mips_relax.sequence != 1)
4788 {
4789 if (mips_macro_warning.first_insn_sizes[1] == 0)
4790 mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4791 mips_macro_warning.sizes[1] += insn_length (ip);
4792 mips_macro_warning.insns[1]++;
4793 }
4794
4795 if (mips_opts.mips16)
4796 {
4797 ip->fixed_p = 1;
4798 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4799 }
4800 add_fixed_insn (ip);
4801 }
4802
4803 if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4804 {
4805 bfd_reloc_code_real_type final_type[3];
4806 reloc_howto_type *howto0;
4807 reloc_howto_type *howto;
4808 int i;
4809
4810 /* Perform any necessary conversion to microMIPS relocations
4811 and find out how many relocations there actually are. */
4812 for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4813 final_type[i] = micromips_map_reloc (reloc_type[i]);
4814
4815 /* In a compound relocation, it is the final (outermost)
4816 operator that determines the relocated field. */
4817 howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4818 if (!howto)
4819 abort ();
4820
4821 if (i > 1)
4822 howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4823 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4824 bfd_get_reloc_size (howto),
4825 address_expr,
4826 howto0 && howto0->pc_relative,
4827 final_type[0]);
4828
4829 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
4830 if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4831 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4832
4833 /* These relocations can have an addend that won't fit in
4834 4 octets for 64bit assembly. */
4835 if (HAVE_64BIT_GPRS
4836 && ! howto->partial_inplace
4837 && (reloc_type[0] == BFD_RELOC_16
4838 || reloc_type[0] == BFD_RELOC_32
4839 || reloc_type[0] == BFD_RELOC_MIPS_JMP
4840 || reloc_type[0] == BFD_RELOC_GPREL16
4841 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4842 || reloc_type[0] == BFD_RELOC_GPREL32
4843 || reloc_type[0] == BFD_RELOC_64
4844 || reloc_type[0] == BFD_RELOC_CTOR
4845 || reloc_type[0] == BFD_RELOC_MIPS_SUB
4846 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4847 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4848 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4849 || reloc_type[0] == BFD_RELOC_MIPS_REL16
4850 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4851 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4852 || hi16_reloc_p (reloc_type[0])
4853 || lo16_reloc_p (reloc_type[0])))
4854 ip->fixp[0]->fx_no_overflow = 1;
4855
4856 /* These relocations can have an addend that won't fit in 2 octets. */
4857 if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4858 || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4859 ip->fixp[0]->fx_no_overflow = 1;
4860
4861 if (mips_relax.sequence)
4862 {
4863 if (mips_relax.first_fixup == 0)
4864 mips_relax.first_fixup = ip->fixp[0];
4865 }
4866 else if (reloc_needs_lo_p (*reloc_type))
4867 {
4868 struct mips_hi_fixup *hi_fixup;
4869
4870 /* Reuse the last entry if it already has a matching %lo. */
4871 hi_fixup = mips_hi_fixup_list;
4872 if (hi_fixup == 0
4873 || !fixup_has_matching_lo_p (hi_fixup->fixp))
4874 {
4875 hi_fixup = ((struct mips_hi_fixup *)
4876 xmalloc (sizeof (struct mips_hi_fixup)));
4877 hi_fixup->next = mips_hi_fixup_list;
4878 mips_hi_fixup_list = hi_fixup;
4879 }
4880 hi_fixup->fixp = ip->fixp[0];
4881 hi_fixup->seg = now_seg;
4882 }
4883
4884 /* Add fixups for the second and third relocations, if given.
4885 Note that the ABI allows the second relocation to be
4886 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
4887 moment we only use RSS_UNDEF, but we could add support
4888 for the others if it ever becomes necessary. */
4889 for (i = 1; i < 3; i++)
4890 if (reloc_type[i] != BFD_RELOC_UNUSED)
4891 {
4892 ip->fixp[i] = fix_new (ip->frag, ip->where,
4893 ip->fixp[0]->fx_size, NULL, 0,
4894 FALSE, final_type[i]);
4895
4896 /* Use fx_tcbit to mark compound relocs. */
4897 ip->fixp[0]->fx_tcbit = 1;
4898 ip->fixp[i]->fx_tcbit = 1;
4899 }
4900 }
4901 install_insn (ip);
4902
4903 /* Update the register mask information. */
4904 mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4905 mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4906
4907 switch (method)
4908 {
4909 case APPEND_ADD:
4910 insert_into_history (0, 1, ip);
4911 break;
4912
4913 case APPEND_ADD_WITH_NOP:
4914 {
4915 struct mips_cl_insn *nop;
4916
4917 insert_into_history (0, 1, ip);
4918 nop = get_delay_slot_nop (ip);
4919 add_fixed_insn (nop);
4920 insert_into_history (0, 1, nop);
4921 if (mips_relax.sequence)
4922 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4923 }
4924 break;
4925
4926 case APPEND_ADD_COMPACT:
4927 /* Convert MIPS16 jr/jalr into a "compact" jump. */
4928 gas_assert (mips_opts.mips16);
4929 ip->insn_opcode |= 0x0080;
4930 find_altered_mips16_opcode (ip);
4931 install_insn (ip);
4932 insert_into_history (0, 1, ip);
4933 break;
4934
4935 case APPEND_SWAP:
4936 {
4937 struct mips_cl_insn delay = history[0];
4938 if (mips_opts.mips16)
4939 {
4940 know (delay.frag == ip->frag);
4941 move_insn (ip, delay.frag, delay.where);
4942 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4943 }
4944 else if (relaxed_branch || delay.frag != ip->frag)
4945 {
4946 /* Add the delay slot instruction to the end of the
4947 current frag and shrink the fixed part of the
4948 original frag. If the branch occupies the tail of
4949 the latter, move it backwards to cover the gap. */
4950 delay.frag->fr_fix -= branch_disp;
4951 if (delay.frag == ip->frag)
4952 move_insn (ip, ip->frag, ip->where - branch_disp);
4953 add_fixed_insn (&delay);
4954 }
4955 else
4956 {
4957 move_insn (&delay, ip->frag,
4958 ip->where - branch_disp + insn_length (ip));
4959 move_insn (ip, history[0].frag, history[0].where);
4960 }
4961 history[0] = *ip;
4962 delay.fixed_p = 1;
4963 insert_into_history (0, 1, &delay);
4964 }
4965 break;
4966 }
4967
4968 /* If we have just completed an unconditional branch, clear the history. */
4969 if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4970 || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4971 {
4972 unsigned int i;
4973
4974 mips_no_prev_insn ();
4975
4976 for (i = 0; i < ARRAY_SIZE (history); i++)
4977 history[i].cleared_p = 1;
4978 }
4979
4980 /* We need to emit a label at the end of branch-likely macros. */
4981 if (emit_branch_likely_macro)
4982 {
4983 emit_branch_likely_macro = FALSE;
4984 micromips_add_label ();
4985 }
4986
4987 /* We just output an insn, so the next one doesn't have a label. */
4988 mips_clear_insn_labels ();
4989 }
4990
4991 /* Forget that there was any previous instruction or label.
4992 When BRANCH is true, the branch history is also flushed. */
4993
4994 static void
4995 mips_no_prev_insn (void)
4996 {
4997 prev_nop_frag = NULL;
4998 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4999 mips_clear_insn_labels ();
5000 }
5001
5002 /* This function must be called before we emit something other than
5003 instructions. It is like mips_no_prev_insn except that it inserts
5004 any NOPS that might be needed by previous instructions. */
5005
5006 void
5007 mips_emit_delays (void)
5008 {
5009 if (! mips_opts.noreorder)
5010 {
5011 int nops = nops_for_insn (0, history, NULL);
5012 if (nops > 0)
5013 {
5014 while (nops-- > 0)
5015 add_fixed_insn (NOP_INSN);
5016 mips_move_text_labels ();
5017 }
5018 }
5019 mips_no_prev_insn ();
5020 }
5021
5022 /* Start a (possibly nested) noreorder block. */
5023
5024 static void
5025 start_noreorder (void)
5026 {
5027 if (mips_opts.noreorder == 0)
5028 {
5029 unsigned int i;
5030 int nops;
5031
5032 /* None of the instructions before the .set noreorder can be moved. */
5033 for (i = 0; i < ARRAY_SIZE (history); i++)
5034 history[i].fixed_p = 1;
5035
5036 /* Insert any nops that might be needed between the .set noreorder
5037 block and the previous instructions. We will later remove any
5038 nops that turn out not to be needed. */
5039 nops = nops_for_insn (0, history, NULL);
5040 if (nops > 0)
5041 {
5042 if (mips_optimize != 0)
5043 {
5044 /* Record the frag which holds the nop instructions, so
5045 that we can remove them if we don't need them. */
5046 frag_grow (nops * NOP_INSN_SIZE);
5047 prev_nop_frag = frag_now;
5048 prev_nop_frag_holds = nops;
5049 prev_nop_frag_required = 0;
5050 prev_nop_frag_since = 0;
5051 }
5052
5053 for (; nops > 0; --nops)
5054 add_fixed_insn (NOP_INSN);
5055
5056 /* Move on to a new frag, so that it is safe to simply
5057 decrease the size of prev_nop_frag. */
5058 frag_wane (frag_now);
5059 frag_new (0);
5060 mips_move_text_labels ();
5061 }
5062 mips_mark_labels ();
5063 mips_clear_insn_labels ();
5064 }
5065 mips_opts.noreorder++;
5066 mips_any_noreorder = 1;
5067 }
5068
5069 /* End a nested noreorder block. */
5070
5071 static void
5072 end_noreorder (void)
5073 {
5074 mips_opts.noreorder--;
5075 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
5076 {
5077 /* Commit to inserting prev_nop_frag_required nops and go back to
5078 handling nop insertion the .set reorder way. */
5079 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
5080 * NOP_INSN_SIZE);
5081 insert_into_history (prev_nop_frag_since,
5082 prev_nop_frag_required, NOP_INSN);
5083 prev_nop_frag = NULL;
5084 }
5085 }
5086
5087 /* Set up global variables for the start of a new macro. */
5088
5089 static void
5090 macro_start (void)
5091 {
5092 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
5093 memset (&mips_macro_warning.first_insn_sizes, 0,
5094 sizeof (mips_macro_warning.first_insn_sizes));
5095 memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
5096 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
5097 && delayed_branch_p (&history[0]));
5098 switch (history[0].insn_mo->pinfo2
5099 & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
5100 {
5101 case INSN2_BRANCH_DELAY_32BIT:
5102 mips_macro_warning.delay_slot_length = 4;
5103 break;
5104 case INSN2_BRANCH_DELAY_16BIT:
5105 mips_macro_warning.delay_slot_length = 2;
5106 break;
5107 default:
5108 mips_macro_warning.delay_slot_length = 0;
5109 break;
5110 }
5111 mips_macro_warning.first_frag = NULL;
5112 }
5113
5114 /* Given that a macro is longer than one instruction or of the wrong size,
5115 return the appropriate warning for it. Return null if no warning is
5116 needed. SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
5117 RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
5118 and RELAX_NOMACRO. */
5119
5120 static const char *
5121 macro_warning (relax_substateT subtype)
5122 {
5123 if (subtype & RELAX_DELAY_SLOT)
5124 return _("Macro instruction expanded into multiple instructions"
5125 " in a branch delay slot");
5126 else if (subtype & RELAX_NOMACRO)
5127 return _("Macro instruction expanded into multiple instructions");
5128 else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
5129 | RELAX_DELAY_SLOT_SIZE_SECOND))
5130 return ((subtype & RELAX_DELAY_SLOT_16BIT)
5131 ? _("Macro instruction expanded into a wrong size instruction"
5132 " in a 16-bit branch delay slot")
5133 : _("Macro instruction expanded into a wrong size instruction"
5134 " in a 32-bit branch delay slot"));
5135 else
5136 return 0;
5137 }
5138
5139 /* Finish up a macro. Emit warnings as appropriate. */
5140
5141 static void
5142 macro_end (void)
5143 {
5144 /* Relaxation warning flags. */
5145 relax_substateT subtype = 0;
5146
5147 /* Check delay slot size requirements. */
5148 if (mips_macro_warning.delay_slot_length == 2)
5149 subtype |= RELAX_DELAY_SLOT_16BIT;
5150 if (mips_macro_warning.delay_slot_length != 0)
5151 {
5152 if (mips_macro_warning.delay_slot_length
5153 != mips_macro_warning.first_insn_sizes[0])
5154 subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
5155 if (mips_macro_warning.delay_slot_length
5156 != mips_macro_warning.first_insn_sizes[1])
5157 subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
5158 }
5159
5160 /* Check instruction count requirements. */
5161 if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
5162 {
5163 if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
5164 subtype |= RELAX_SECOND_LONGER;
5165 if (mips_opts.warn_about_macros)
5166 subtype |= RELAX_NOMACRO;
5167 if (mips_macro_warning.delay_slot_p)
5168 subtype |= RELAX_DELAY_SLOT;
5169 }
5170
5171 /* If both alternatives fail to fill a delay slot correctly,
5172 emit the warning now. */
5173 if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
5174 && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
5175 {
5176 relax_substateT s;
5177 const char *msg;
5178
5179 s = subtype & (RELAX_DELAY_SLOT_16BIT
5180 | RELAX_DELAY_SLOT_SIZE_FIRST
5181 | RELAX_DELAY_SLOT_SIZE_SECOND);
5182 msg = macro_warning (s);
5183 if (msg != NULL)
5184 as_warn ("%s", msg);
5185 subtype &= ~s;
5186 }
5187
5188 /* If both implementations are longer than 1 instruction, then emit the
5189 warning now. */
5190 if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
5191 {
5192 relax_substateT s;
5193 const char *msg;
5194
5195 s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
5196 msg = macro_warning (s);
5197 if (msg != NULL)
5198 as_warn ("%s", msg);
5199 subtype &= ~s;
5200 }
5201
5202 /* If any flags still set, then one implementation might need a warning
5203 and the other either will need one of a different kind or none at all.
5204 Pass any remaining flags over to relaxation. */
5205 if (mips_macro_warning.first_frag != NULL)
5206 mips_macro_warning.first_frag->fr_subtype |= subtype;
5207 }
5208
5209 /* Instruction operand formats used in macros that vary between
5210 standard MIPS and microMIPS code. */
5211
5212 static const char * const brk_fmt[2] = { "c", "mF" };
5213 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
5214 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
5215 static const char * const lui_fmt[2] = { "t,u", "s,u" };
5216 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
5217 static const char * const mfhl_fmt[2] = { "d", "mj" };
5218 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
5219 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
5220
5221 #define BRK_FMT (brk_fmt[mips_opts.micromips])
5222 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
5223 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
5224 #define LUI_FMT (lui_fmt[mips_opts.micromips])
5225 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
5226 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
5227 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
5228 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
5229
5230 /* Read a macro's relocation codes from *ARGS and store them in *R.
5231 The first argument in *ARGS will be either the code for a single
5232 relocation or -1 followed by the three codes that make up a
5233 composite relocation. */
5234
5235 static void
5236 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
5237 {
5238 int i, next;
5239
5240 next = va_arg (*args, int);
5241 if (next >= 0)
5242 r[0] = (bfd_reloc_code_real_type) next;
5243 else
5244 for (i = 0; i < 3; i++)
5245 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
5246 }
5247
5248 /* Build an instruction created by a macro expansion. This is passed
5249 a pointer to the count of instructions created so far, an
5250 expression, the name of the instruction to build, an operand format
5251 string, and corresponding arguments. */
5252
5253 static void
5254 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
5255 {
5256 const struct mips_opcode *mo = NULL;
5257 bfd_reloc_code_real_type r[3];
5258 const struct mips_opcode *amo;
5259 struct hash_control *hash;
5260 struct mips_cl_insn insn;
5261 va_list args;
5262
5263 va_start (args, fmt);
5264
5265 if (mips_opts.mips16)
5266 {
5267 mips16_macro_build (ep, name, fmt, &args);
5268 va_end (args);
5269 return;
5270 }
5271
5272 r[0] = BFD_RELOC_UNUSED;
5273 r[1] = BFD_RELOC_UNUSED;
5274 r[2] = BFD_RELOC_UNUSED;
5275 hash = mips_opts.micromips ? micromips_op_hash : op_hash;
5276 amo = (struct mips_opcode *) hash_find (hash, name);
5277 gas_assert (amo);
5278 gas_assert (strcmp (name, amo->name) == 0);
5279
5280 do
5281 {
5282 /* Search until we get a match for NAME. It is assumed here that
5283 macros will never generate MDMX, MIPS-3D, or MT instructions.
5284 We try to match an instruction that fulfils the branch delay
5285 slot instruction length requirement (if any) of the previous
5286 instruction. While doing this we record the first instruction
5287 seen that matches all the other conditions and use it anyway
5288 if the requirement cannot be met; we will issue an appropriate
5289 warning later on. */
5290 if (strcmp (fmt, amo->args) == 0
5291 && amo->pinfo != INSN_MACRO
5292 && is_opcode_valid (amo)
5293 && is_size_valid (amo))
5294 {
5295 if (is_delay_slot_valid (amo))
5296 {
5297 mo = amo;
5298 break;
5299 }
5300 else if (!mo)
5301 mo = amo;
5302 }
5303
5304 ++amo;
5305 gas_assert (amo->name);
5306 }
5307 while (strcmp (name, amo->name) == 0);
5308
5309 gas_assert (mo);
5310 create_insn (&insn, mo);
5311 for (;;)
5312 {
5313 switch (*fmt++)
5314 {
5315 case '\0':
5316 break;
5317
5318 case ',':
5319 case '(':
5320 case ')':
5321 continue;
5322
5323 case '+':
5324 switch (*fmt++)
5325 {
5326 case 'A':
5327 case 'E':
5328 INSERT_OPERAND (mips_opts.micromips,
5329 EXTLSB, insn, va_arg (args, int));
5330 continue;
5331
5332 case 'B':
5333 case 'F':
5334 /* Note that in the macro case, these arguments are already
5335 in MSB form. (When handling the instruction in the
5336 non-macro case, these arguments are sizes from which
5337 MSB values must be calculated.) */
5338 INSERT_OPERAND (mips_opts.micromips,
5339 INSMSB, insn, va_arg (args, int));
5340 continue;
5341
5342 case 'J':
5343 gas_assert (!mips_opts.micromips);
5344 INSERT_OPERAND (0, CODE10, insn, va_arg (args, int));
5345 continue;
5346
5347 case 'C':
5348 case 'G':
5349 case 'H':
5350 /* Note that in the macro case, these arguments are already
5351 in MSBD form. (When handling the instruction in the
5352 non-macro case, these arguments are sizes from which
5353 MSBD values must be calculated.) */
5354 INSERT_OPERAND (mips_opts.micromips,
5355 EXTMSBD, insn, va_arg (args, int));
5356 continue;
5357
5358 case 'Q':
5359 gas_assert (!mips_opts.micromips);
5360 INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5361 continue;
5362
5363 case 'j':
5364 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, insn, va_arg (args, int));
5365 continue;
5366
5367 default:
5368 abort ();
5369 }
5370 continue;
5371
5372 case '2':
5373 INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5374 continue;
5375
5376 case 'n':
5377 gas_assert (mips_opts.micromips);
5378 case 't':
5379 case 'w':
5380 case 'E':
5381 INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5382 continue;
5383
5384 case 'c':
5385 gas_assert (!mips_opts.micromips);
5386 INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
5387 continue;
5388
5389 case 'W':
5390 gas_assert (!mips_opts.micromips);
5391 case 'T':
5392 INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5393 continue;
5394
5395 case 'G':
5396 if (mips_opts.micromips)
5397 INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5398 else
5399 INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5400 continue;
5401
5402 case 'K':
5403 gas_assert (!mips_opts.micromips);
5404 case 'd':
5405 INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5406 continue;
5407
5408 case 'U':
5409 gas_assert (!mips_opts.micromips);
5410 {
5411 int tmp = va_arg (args, int);
5412
5413 INSERT_OPERAND (0, RT, insn, tmp);
5414 INSERT_OPERAND (0, RD, insn, tmp);
5415 }
5416 continue;
5417
5418 case 'V':
5419 case 'S':
5420 gas_assert (!mips_opts.micromips);
5421 INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5422 continue;
5423
5424 case 'z':
5425 continue;
5426
5427 case '<':
5428 INSERT_OPERAND (mips_opts.micromips,
5429 SHAMT, insn, va_arg (args, int));
5430 continue;
5431
5432 case 'D':
5433 gas_assert (!mips_opts.micromips);
5434 INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5435 continue;
5436
5437 case 'B':
5438 gas_assert (!mips_opts.micromips);
5439 INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5440 continue;
5441
5442 case 'J':
5443 gas_assert (!mips_opts.micromips);
5444 INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5445 continue;
5446
5447 case 'q':
5448 gas_assert (!mips_opts.micromips);
5449 INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5450 continue;
5451
5452 case 'b':
5453 case 's':
5454 case 'r':
5455 case 'v':
5456 INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5457 continue;
5458
5459 case 'i':
5460 case 'j':
5461 macro_read_relocs (&args, r);
5462 gas_assert (*r == BFD_RELOC_GPREL16
5463 || *r == BFD_RELOC_MIPS_HIGHER
5464 || *r == BFD_RELOC_HI16_S
5465 || *r == BFD_RELOC_LO16
5466 || *r == BFD_RELOC_MIPS_GOT_OFST);
5467 continue;
5468
5469 case 'o':
5470 macro_read_relocs (&args, r);
5471 continue;
5472
5473 case 'u':
5474 macro_read_relocs (&args, r);
5475 gas_assert (ep != NULL
5476 && (ep->X_op == O_constant
5477 || (ep->X_op == O_symbol
5478 && (*r == BFD_RELOC_MIPS_HIGHEST
5479 || *r == BFD_RELOC_HI16_S
5480 || *r == BFD_RELOC_HI16
5481 || *r == BFD_RELOC_GPREL16
5482 || *r == BFD_RELOC_MIPS_GOT_HI16
5483 || *r == BFD_RELOC_MIPS_CALL_HI16))));
5484 continue;
5485
5486 case 'p':
5487 gas_assert (ep != NULL);
5488
5489 /*
5490 * This allows macro() to pass an immediate expression for
5491 * creating short branches without creating a symbol.
5492 *
5493 * We don't allow branch relaxation for these branches, as
5494 * they should only appear in ".set nomacro" anyway.
5495 */
5496 if (ep->X_op == O_constant)
5497 {
5498 /* For microMIPS we always use relocations for branches.
5499 So we should not resolve immediate values. */
5500 gas_assert (!mips_opts.micromips);
5501
5502 if ((ep->X_add_number & 3) != 0)
5503 as_bad (_("branch to misaligned address (0x%lx)"),
5504 (unsigned long) ep->X_add_number);
5505 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5506 as_bad (_("branch address range overflow (0x%lx)"),
5507 (unsigned long) ep->X_add_number);
5508 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5509 ep = NULL;
5510 }
5511 else
5512 *r = BFD_RELOC_16_PCREL_S2;
5513 continue;
5514
5515 case 'a':
5516 gas_assert (ep != NULL);
5517 *r = BFD_RELOC_MIPS_JMP;
5518 continue;
5519
5520 case 'C':
5521 gas_assert (!mips_opts.micromips);
5522 INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5523 continue;
5524
5525 case 'k':
5526 INSERT_OPERAND (mips_opts.micromips,
5527 CACHE, insn, va_arg (args, unsigned long));
5528 continue;
5529
5530 case '|':
5531 gas_assert (mips_opts.micromips);
5532 INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5533 continue;
5534
5535 case '.':
5536 gas_assert (mips_opts.micromips);
5537 INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5538 continue;
5539
5540 case '\\':
5541 INSERT_OPERAND (mips_opts.micromips,
5542 3BITPOS, insn, va_arg (args, unsigned int));
5543 continue;
5544
5545 case '~':
5546 INSERT_OPERAND (mips_opts.micromips,
5547 OFFSET12, insn, va_arg (args, unsigned long));
5548 continue;
5549
5550 case 'N':
5551 gas_assert (mips_opts.micromips);
5552 INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5553 continue;
5554
5555 case 'm': /* Opcode extension character. */
5556 gas_assert (mips_opts.micromips);
5557 switch (*fmt++)
5558 {
5559 case 'j':
5560 INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5561 break;
5562
5563 case 'p':
5564 INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5565 break;
5566
5567 case 'F':
5568 INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5569 break;
5570
5571 default:
5572 abort ();
5573 }
5574 continue;
5575
5576 default:
5577 abort ();
5578 }
5579 break;
5580 }
5581 va_end (args);
5582 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5583
5584 append_insn (&insn, ep, r, TRUE);
5585 }
5586
5587 static void
5588 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5589 va_list *args)
5590 {
5591 struct mips_opcode *mo;
5592 struct mips_cl_insn insn;
5593 bfd_reloc_code_real_type r[3]
5594 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5595
5596 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5597 gas_assert (mo);
5598 gas_assert (strcmp (name, mo->name) == 0);
5599
5600 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5601 {
5602 ++mo;
5603 gas_assert (mo->name);
5604 gas_assert (strcmp (name, mo->name) == 0);
5605 }
5606
5607 create_insn (&insn, mo);
5608 for (;;)
5609 {
5610 int c;
5611
5612 c = *fmt++;
5613 switch (c)
5614 {
5615 case '\0':
5616 break;
5617
5618 case ',':
5619 case '(':
5620 case ')':
5621 continue;
5622
5623 case 'y':
5624 case 'w':
5625 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5626 continue;
5627
5628 case 'x':
5629 case 'v':
5630 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5631 continue;
5632
5633 case 'z':
5634 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5635 continue;
5636
5637 case 'Z':
5638 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5639 continue;
5640
5641 case '0':
5642 case 'S':
5643 case 'P':
5644 case 'R':
5645 continue;
5646
5647 case 'X':
5648 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5649 continue;
5650
5651 case 'Y':
5652 {
5653 int regno;
5654
5655 regno = va_arg (*args, int);
5656 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5657 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5658 }
5659 continue;
5660
5661 case '<':
5662 case '>':
5663 case '4':
5664 case '5':
5665 case 'H':
5666 case 'W':
5667 case 'D':
5668 case 'j':
5669 case '8':
5670 case 'V':
5671 case 'C':
5672 case 'U':
5673 case 'k':
5674 case 'K':
5675 case 'p':
5676 case 'q':
5677 {
5678 offsetT value;
5679
5680 gas_assert (ep != NULL);
5681
5682 if (ep->X_op != O_constant)
5683 *r = (int) BFD_RELOC_UNUSED + c;
5684 else if (calculate_reloc (*r, ep->X_add_number, &value))
5685 {
5686 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5687 ep = NULL;
5688 *r = BFD_RELOC_UNUSED;
5689 }
5690 }
5691 continue;
5692
5693 case '6':
5694 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5695 continue;
5696 }
5697
5698 break;
5699 }
5700
5701 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5702
5703 append_insn (&insn, ep, r, TRUE);
5704 }
5705
5706 /*
5707 * Sign-extend 32-bit mode constants that have bit 31 set and all
5708 * higher bits unset.
5709 */
5710 static void
5711 normalize_constant_expr (expressionS *ex)
5712 {
5713 if (ex->X_op == O_constant
5714 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5715 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5716 - 0x80000000);
5717 }
5718
5719 /*
5720 * Sign-extend 32-bit mode address offsets that have bit 31 set and
5721 * all higher bits unset.
5722 */
5723 static void
5724 normalize_address_expr (expressionS *ex)
5725 {
5726 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5727 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5728 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5729 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5730 - 0x80000000);
5731 }
5732
5733 /*
5734 * Generate a "jalr" instruction with a relocation hint to the called
5735 * function. This occurs in NewABI PIC code.
5736 */
5737 static void
5738 macro_build_jalr (expressionS *ep, int cprestore)
5739 {
5740 static const bfd_reloc_code_real_type jalr_relocs[2]
5741 = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5742 bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5743 const char *jalr;
5744 char *f = NULL;
5745
5746 if (MIPS_JALR_HINT_P (ep))
5747 {
5748 frag_grow (8);
5749 f = frag_more (0);
5750 }
5751 if (mips_opts.micromips)
5752 {
5753 jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5754 if (MIPS_JALR_HINT_P (ep)
5755 || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5756 macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5757 else
5758 macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5759 }
5760 else
5761 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5762 if (MIPS_JALR_HINT_P (ep))
5763 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5764 }
5765
5766 /*
5767 * Generate a "lui" instruction.
5768 */
5769 static void
5770 macro_build_lui (expressionS *ep, int regnum)
5771 {
5772 gas_assert (! mips_opts.mips16);
5773
5774 if (ep->X_op != O_constant)
5775 {
5776 gas_assert (ep->X_op == O_symbol);
5777 /* _gp_disp is a special case, used from s_cpload.
5778 __gnu_local_gp is used if mips_no_shared. */
5779 gas_assert (mips_pic == NO_PIC
5780 || (! HAVE_NEWABI
5781 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5782 || (! mips_in_shared
5783 && strcmp (S_GET_NAME (ep->X_add_symbol),
5784 "__gnu_local_gp") == 0));
5785 }
5786
5787 macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5788 }
5789
5790 /* Generate a sequence of instructions to do a load or store from a constant
5791 offset off of a base register (breg) into/from a target register (treg),
5792 using AT if necessary. */
5793 static void
5794 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5795 int treg, int breg, int dbl)
5796 {
5797 gas_assert (ep->X_op == O_constant);
5798
5799 /* Sign-extending 32-bit constants makes their handling easier. */
5800 if (!dbl)
5801 normalize_constant_expr (ep);
5802
5803 /* Right now, this routine can only handle signed 32-bit constants. */
5804 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5805 as_warn (_("operand overflow"));
5806
5807 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5808 {
5809 /* Signed 16-bit offset will fit in the op. Easy! */
5810 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5811 }
5812 else
5813 {
5814 /* 32-bit offset, need multiple instructions and AT, like:
5815 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
5816 addu $tempreg,$tempreg,$breg
5817 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
5818 to handle the complete offset. */
5819 macro_build_lui (ep, AT);
5820 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5821 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5822
5823 if (!mips_opts.at)
5824 as_bad (_("Macro used $at after \".set noat\""));
5825 }
5826 }
5827
5828 /* set_at()
5829 * Generates code to set the $at register to true (one)
5830 * if reg is less than the immediate expression.
5831 */
5832 static void
5833 set_at (int reg, int unsignedp)
5834 {
5835 if (imm_expr.X_op == O_constant
5836 && imm_expr.X_add_number >= -0x8000
5837 && imm_expr.X_add_number < 0x8000)
5838 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5839 AT, reg, BFD_RELOC_LO16);
5840 else
5841 {
5842 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5843 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5844 }
5845 }
5846
5847 /* Warn if an expression is not a constant. */
5848
5849 static void
5850 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5851 {
5852 if (ex->X_op == O_big)
5853 as_bad (_("unsupported large constant"));
5854 else if (ex->X_op != O_constant)
5855 as_bad (_("Instruction %s requires absolute expression"),
5856 ip->insn_mo->name);
5857
5858 if (HAVE_32BIT_GPRS)
5859 normalize_constant_expr (ex);
5860 }
5861
5862 /* Count the leading zeroes by performing a binary chop. This is a
5863 bulky bit of source, but performance is a LOT better for the
5864 majority of values than a simple loop to count the bits:
5865 for (lcnt = 0; (lcnt < 32); lcnt++)
5866 if ((v) & (1 << (31 - lcnt)))
5867 break;
5868 However it is not code size friendly, and the gain will drop a bit
5869 on certain cached systems.
5870 */
5871 #define COUNT_TOP_ZEROES(v) \
5872 (((v) & ~0xffff) == 0 \
5873 ? ((v) & ~0xff) == 0 \
5874 ? ((v) & ~0xf) == 0 \
5875 ? ((v) & ~0x3) == 0 \
5876 ? ((v) & ~0x1) == 0 \
5877 ? !(v) \
5878 ? 32 \
5879 : 31 \
5880 : 30 \
5881 : ((v) & ~0x7) == 0 \
5882 ? 29 \
5883 : 28 \
5884 : ((v) & ~0x3f) == 0 \
5885 ? ((v) & ~0x1f) == 0 \
5886 ? 27 \
5887 : 26 \
5888 : ((v) & ~0x7f) == 0 \
5889 ? 25 \
5890 : 24 \
5891 : ((v) & ~0xfff) == 0 \
5892 ? ((v) & ~0x3ff) == 0 \
5893 ? ((v) & ~0x1ff) == 0 \
5894 ? 23 \
5895 : 22 \
5896 : ((v) & ~0x7ff) == 0 \
5897 ? 21 \
5898 : 20 \
5899 : ((v) & ~0x3fff) == 0 \
5900 ? ((v) & ~0x1fff) == 0 \
5901 ? 19 \
5902 : 18 \
5903 : ((v) & ~0x7fff) == 0 \
5904 ? 17 \
5905 : 16 \
5906 : ((v) & ~0xffffff) == 0 \
5907 ? ((v) & ~0xfffff) == 0 \
5908 ? ((v) & ~0x3ffff) == 0 \
5909 ? ((v) & ~0x1ffff) == 0 \
5910 ? 15 \
5911 : 14 \
5912 : ((v) & ~0x7ffff) == 0 \
5913 ? 13 \
5914 : 12 \
5915 : ((v) & ~0x3fffff) == 0 \
5916 ? ((v) & ~0x1fffff) == 0 \
5917 ? 11 \
5918 : 10 \
5919 : ((v) & ~0x7fffff) == 0 \
5920 ? 9 \
5921 : 8 \
5922 : ((v) & ~0xfffffff) == 0 \
5923 ? ((v) & ~0x3ffffff) == 0 \
5924 ? ((v) & ~0x1ffffff) == 0 \
5925 ? 7 \
5926 : 6 \
5927 : ((v) & ~0x7ffffff) == 0 \
5928 ? 5 \
5929 : 4 \
5930 : ((v) & ~0x3fffffff) == 0 \
5931 ? ((v) & ~0x1fffffff) == 0 \
5932 ? 3 \
5933 : 2 \
5934 : ((v) & ~0x7fffffff) == 0 \
5935 ? 1 \
5936 : 0)
5937
5938 /* load_register()
5939 * This routine generates the least number of instructions necessary to load
5940 * an absolute expression value into a register.
5941 */
5942 static void
5943 load_register (int reg, expressionS *ep, int dbl)
5944 {
5945 int freg;
5946 expressionS hi32, lo32;
5947
5948 if (ep->X_op != O_big)
5949 {
5950 gas_assert (ep->X_op == O_constant);
5951
5952 /* Sign-extending 32-bit constants makes their handling easier. */
5953 if (!dbl)
5954 normalize_constant_expr (ep);
5955
5956 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5957 {
5958 /* We can handle 16 bit signed values with an addiu to
5959 $zero. No need to ever use daddiu here, since $zero and
5960 the result are always correct in 32 bit mode. */
5961 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5962 return;
5963 }
5964 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5965 {
5966 /* We can handle 16 bit unsigned values with an ori to
5967 $zero. */
5968 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5969 return;
5970 }
5971 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5972 {
5973 /* 32 bit values require an lui. */
5974 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5975 if ((ep->X_add_number & 0xffff) != 0)
5976 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5977 return;
5978 }
5979 }
5980
5981 /* The value is larger than 32 bits. */
5982
5983 if (!dbl || HAVE_32BIT_GPRS)
5984 {
5985 char value[32];
5986
5987 sprintf_vma (value, ep->X_add_number);
5988 as_bad (_("Number (0x%s) larger than 32 bits"), value);
5989 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5990 return;
5991 }
5992
5993 if (ep->X_op != O_big)
5994 {
5995 hi32 = *ep;
5996 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5997 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5998 hi32.X_add_number &= 0xffffffff;
5999 lo32 = *ep;
6000 lo32.X_add_number &= 0xffffffff;
6001 }
6002 else
6003 {
6004 gas_assert (ep->X_add_number > 2);
6005 if (ep->X_add_number == 3)
6006 generic_bignum[3] = 0;
6007 else if (ep->X_add_number > 4)
6008 as_bad (_("Number larger than 64 bits"));
6009 lo32.X_op = O_constant;
6010 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
6011 hi32.X_op = O_constant;
6012 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
6013 }
6014
6015 if (hi32.X_add_number == 0)
6016 freg = 0;
6017 else
6018 {
6019 int shift, bit;
6020 unsigned long hi, lo;
6021
6022 if (hi32.X_add_number == (offsetT) 0xffffffff)
6023 {
6024 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
6025 {
6026 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6027 return;
6028 }
6029 if (lo32.X_add_number & 0x80000000)
6030 {
6031 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6032 if (lo32.X_add_number & 0xffff)
6033 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6034 return;
6035 }
6036 }
6037
6038 /* Check for 16bit shifted constant. We know that hi32 is
6039 non-zero, so start the mask on the first bit of the hi32
6040 value. */
6041 shift = 17;
6042 do
6043 {
6044 unsigned long himask, lomask;
6045
6046 if (shift < 32)
6047 {
6048 himask = 0xffff >> (32 - shift);
6049 lomask = (0xffff << shift) & 0xffffffff;
6050 }
6051 else
6052 {
6053 himask = 0xffff << (shift - 32);
6054 lomask = 0;
6055 }
6056 if ((hi32.X_add_number & ~(offsetT) himask) == 0
6057 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
6058 {
6059 expressionS tmp;
6060
6061 tmp.X_op = O_constant;
6062 if (shift < 32)
6063 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
6064 | (lo32.X_add_number >> shift));
6065 else
6066 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
6067 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
6068 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6069 reg, reg, (shift >= 32) ? shift - 32 : shift);
6070 return;
6071 }
6072 ++shift;
6073 }
6074 while (shift <= (64 - 16));
6075
6076 /* Find the bit number of the lowest one bit, and store the
6077 shifted value in hi/lo. */
6078 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
6079 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
6080 if (lo != 0)
6081 {
6082 bit = 0;
6083 while ((lo & 1) == 0)
6084 {
6085 lo >>= 1;
6086 ++bit;
6087 }
6088 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
6089 hi >>= bit;
6090 }
6091 else
6092 {
6093 bit = 32;
6094 while ((hi & 1) == 0)
6095 {
6096 hi >>= 1;
6097 ++bit;
6098 }
6099 lo = hi;
6100 hi = 0;
6101 }
6102
6103 /* Optimize if the shifted value is a (power of 2) - 1. */
6104 if ((hi == 0 && ((lo + 1) & lo) == 0)
6105 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
6106 {
6107 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
6108 if (shift != 0)
6109 {
6110 expressionS tmp;
6111
6112 /* This instruction will set the register to be all
6113 ones. */
6114 tmp.X_op = O_constant;
6115 tmp.X_add_number = (offsetT) -1;
6116 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6117 if (bit != 0)
6118 {
6119 bit += shift;
6120 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6121 reg, reg, (bit >= 32) ? bit - 32 : bit);
6122 }
6123 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
6124 reg, reg, (shift >= 32) ? shift - 32 : shift);
6125 return;
6126 }
6127 }
6128
6129 /* Sign extend hi32 before calling load_register, because we can
6130 generally get better code when we load a sign extended value. */
6131 if ((hi32.X_add_number & 0x80000000) != 0)
6132 hi32.X_add_number |= ~(offsetT) 0xffffffff;
6133 load_register (reg, &hi32, 0);
6134 freg = reg;
6135 }
6136 if ((lo32.X_add_number & 0xffff0000) == 0)
6137 {
6138 if (freg != 0)
6139 {
6140 macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
6141 freg = reg;
6142 }
6143 }
6144 else
6145 {
6146 expressionS mid16;
6147
6148 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
6149 {
6150 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6151 macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
6152 return;
6153 }
6154
6155 if (freg != 0)
6156 {
6157 macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
6158 freg = reg;
6159 }
6160 mid16 = lo32;
6161 mid16.X_add_number >>= 16;
6162 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6163 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6164 freg = reg;
6165 }
6166 if ((lo32.X_add_number & 0xffff) != 0)
6167 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6168 }
6169
6170 static inline void
6171 load_delay_nop (void)
6172 {
6173 if (!gpr_interlocks)
6174 macro_build (NULL, "nop", "");
6175 }
6176
6177 /* Load an address into a register. */
6178
6179 static void
6180 load_address (int reg, expressionS *ep, int *used_at)
6181 {
6182 if (ep->X_op != O_constant
6183 && ep->X_op != O_symbol)
6184 {
6185 as_bad (_("expression too complex"));
6186 ep->X_op = O_constant;
6187 }
6188
6189 if (ep->X_op == O_constant)
6190 {
6191 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
6192 return;
6193 }
6194
6195 if (mips_pic == NO_PIC)
6196 {
6197 /* If this is a reference to a GP relative symbol, we want
6198 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
6199 Otherwise we want
6200 lui $reg,<sym> (BFD_RELOC_HI16_S)
6201 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6202 If we have an addend, we always use the latter form.
6203
6204 With 64bit address space and a usable $at we want
6205 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6206 lui $at,<sym> (BFD_RELOC_HI16_S)
6207 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6208 daddiu $at,<sym> (BFD_RELOC_LO16)
6209 dsll32 $reg,0
6210 daddu $reg,$reg,$at
6211
6212 If $at is already in use, we use a path which is suboptimal
6213 on superscalar processors.
6214 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6215 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6216 dsll $reg,16
6217 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
6218 dsll $reg,16
6219 daddiu $reg,<sym> (BFD_RELOC_LO16)
6220
6221 For GP relative symbols in 64bit address space we can use
6222 the same sequence as in 32bit address space. */
6223 if (HAVE_64BIT_SYMBOLS)
6224 {
6225 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6226 && !nopic_need_relax (ep->X_add_symbol, 1))
6227 {
6228 relax_start (ep->X_add_symbol);
6229 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6230 mips_gp_register, BFD_RELOC_GPREL16);
6231 relax_switch ();
6232 }
6233
6234 if (*used_at == 0 && mips_opts.at)
6235 {
6236 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6237 macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
6238 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6239 BFD_RELOC_MIPS_HIGHER);
6240 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
6241 macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
6242 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
6243 *used_at = 1;
6244 }
6245 else
6246 {
6247 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6248 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6249 BFD_RELOC_MIPS_HIGHER);
6250 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6251 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
6252 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6253 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
6254 }
6255
6256 if (mips_relax.sequence)
6257 relax_end ();
6258 }
6259 else
6260 {
6261 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6262 && !nopic_need_relax (ep->X_add_symbol, 1))
6263 {
6264 relax_start (ep->X_add_symbol);
6265 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6266 mips_gp_register, BFD_RELOC_GPREL16);
6267 relax_switch ();
6268 }
6269 macro_build_lui (ep, reg);
6270 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
6271 reg, reg, BFD_RELOC_LO16);
6272 if (mips_relax.sequence)
6273 relax_end ();
6274 }
6275 }
6276 else if (!mips_big_got)
6277 {
6278 expressionS ex;
6279
6280 /* If this is a reference to an external symbol, we want
6281 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6282 Otherwise we want
6283 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6284 nop
6285 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6286 If there is a constant, it must be added in after.
6287
6288 If we have NewABI, we want
6289 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6290 unless we're referencing a global symbol with a non-zero
6291 offset, in which case cst must be added separately. */
6292 if (HAVE_NEWABI)
6293 {
6294 if (ep->X_add_number)
6295 {
6296 ex.X_add_number = ep->X_add_number;
6297 ep->X_add_number = 0;
6298 relax_start (ep->X_add_symbol);
6299 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6300 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6301 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6302 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6303 ex.X_op = O_constant;
6304 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6305 reg, reg, BFD_RELOC_LO16);
6306 ep->X_add_number = ex.X_add_number;
6307 relax_switch ();
6308 }
6309 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6310 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6311 if (mips_relax.sequence)
6312 relax_end ();
6313 }
6314 else
6315 {
6316 ex.X_add_number = ep->X_add_number;
6317 ep->X_add_number = 0;
6318 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6319 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6320 load_delay_nop ();
6321 relax_start (ep->X_add_symbol);
6322 relax_switch ();
6323 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6324 BFD_RELOC_LO16);
6325 relax_end ();
6326
6327 if (ex.X_add_number != 0)
6328 {
6329 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6330 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6331 ex.X_op = O_constant;
6332 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6333 reg, reg, BFD_RELOC_LO16);
6334 }
6335 }
6336 }
6337 else if (mips_big_got)
6338 {
6339 expressionS ex;
6340
6341 /* This is the large GOT case. If this is a reference to an
6342 external symbol, we want
6343 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6344 addu $reg,$reg,$gp
6345 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
6346
6347 Otherwise, for a reference to a local symbol in old ABI, we want
6348 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6349 nop
6350 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6351 If there is a constant, it must be added in after.
6352
6353 In the NewABI, for local symbols, with or without offsets, we want:
6354 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6355 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6356 */
6357 if (HAVE_NEWABI)
6358 {
6359 ex.X_add_number = ep->X_add_number;
6360 ep->X_add_number = 0;
6361 relax_start (ep->X_add_symbol);
6362 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6363 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6364 reg, reg, mips_gp_register);
6365 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6366 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6367 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6368 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6369 else if (ex.X_add_number)
6370 {
6371 ex.X_op = O_constant;
6372 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6373 BFD_RELOC_LO16);
6374 }
6375
6376 ep->X_add_number = ex.X_add_number;
6377 relax_switch ();
6378 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6379 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6380 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6381 BFD_RELOC_MIPS_GOT_OFST);
6382 relax_end ();
6383 }
6384 else
6385 {
6386 ex.X_add_number = ep->X_add_number;
6387 ep->X_add_number = 0;
6388 relax_start (ep->X_add_symbol);
6389 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6390 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6391 reg, reg, mips_gp_register);
6392 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6393 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6394 relax_switch ();
6395 if (reg_needs_delay (mips_gp_register))
6396 {
6397 /* We need a nop before loading from $gp. This special
6398 check is required because the lui which starts the main
6399 instruction stream does not refer to $gp, and so will not
6400 insert the nop which may be required. */
6401 macro_build (NULL, "nop", "");
6402 }
6403 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6404 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6405 load_delay_nop ();
6406 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6407 BFD_RELOC_LO16);
6408 relax_end ();
6409
6410 if (ex.X_add_number != 0)
6411 {
6412 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6413 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6414 ex.X_op = O_constant;
6415 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6416 BFD_RELOC_LO16);
6417 }
6418 }
6419 }
6420 else
6421 abort ();
6422
6423 if (!mips_opts.at && *used_at == 1)
6424 as_bad (_("Macro used $at after \".set noat\""));
6425 }
6426
6427 /* Move the contents of register SOURCE into register DEST. */
6428
6429 static void
6430 move_register (int dest, int source)
6431 {
6432 /* Prefer to use a 16-bit microMIPS instruction unless the previous
6433 instruction specifically requires a 32-bit one. */
6434 if (mips_opts.micromips
6435 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6436 macro_build (NULL, "move", "mp,mj", dest, source);
6437 else
6438 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6439 dest, source, 0);
6440 }
6441
6442 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6443 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6444 The two alternatives are:
6445
6446 Global symbol Local sybmol
6447 ------------- ------------
6448 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
6449 ... ...
6450 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6451
6452 load_got_offset emits the first instruction and add_got_offset
6453 emits the second for a 16-bit offset or add_got_offset_hilo emits
6454 a sequence to add a 32-bit offset using a scratch register. */
6455
6456 static void
6457 load_got_offset (int dest, expressionS *local)
6458 {
6459 expressionS global;
6460
6461 global = *local;
6462 global.X_add_number = 0;
6463
6464 relax_start (local->X_add_symbol);
6465 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6466 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6467 relax_switch ();
6468 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6469 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6470 relax_end ();
6471 }
6472
6473 static void
6474 add_got_offset (int dest, expressionS *local)
6475 {
6476 expressionS global;
6477
6478 global.X_op = O_constant;
6479 global.X_op_symbol = NULL;
6480 global.X_add_symbol = NULL;
6481 global.X_add_number = local->X_add_number;
6482
6483 relax_start (local->X_add_symbol);
6484 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6485 dest, dest, BFD_RELOC_LO16);
6486 relax_switch ();
6487 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6488 relax_end ();
6489 }
6490
6491 static void
6492 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6493 {
6494 expressionS global;
6495 int hold_mips_optimize;
6496
6497 global.X_op = O_constant;
6498 global.X_op_symbol = NULL;
6499 global.X_add_symbol = NULL;
6500 global.X_add_number = local->X_add_number;
6501
6502 relax_start (local->X_add_symbol);
6503 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6504 relax_switch ();
6505 /* Set mips_optimize around the lui instruction to avoid
6506 inserting an unnecessary nop after the lw. */
6507 hold_mips_optimize = mips_optimize;
6508 mips_optimize = 2;
6509 macro_build_lui (&global, tmp);
6510 mips_optimize = hold_mips_optimize;
6511 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6512 relax_end ();
6513
6514 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6515 }
6516
6517 /* Emit a sequence of instructions to emulate a branch likely operation.
6518 BR is an ordinary branch corresponding to one to be emulated. BRNEG
6519 is its complementing branch with the original condition negated.
6520 CALL is set if the original branch specified the link operation.
6521 EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6522
6523 Code like this is produced in the noreorder mode:
6524
6525 BRNEG <args>, 1f
6526 nop
6527 b <sym>
6528 delay slot (executed only if branch taken)
6529 1:
6530
6531 or, if CALL is set:
6532
6533 BRNEG <args>, 1f
6534 nop
6535 bal <sym>
6536 delay slot (executed only if branch taken)
6537 1:
6538
6539 In the reorder mode the delay slot would be filled with a nop anyway,
6540 so code produced is simply:
6541
6542 BR <args>, <sym>
6543 nop
6544
6545 This function is used when producing code for the microMIPS ASE that
6546 does not implement branch likely instructions in hardware. */
6547
6548 static void
6549 macro_build_branch_likely (const char *br, const char *brneg,
6550 int call, expressionS *ep, const char *fmt,
6551 unsigned int sreg, unsigned int treg)
6552 {
6553 int noreorder = mips_opts.noreorder;
6554 expressionS expr1;
6555
6556 gas_assert (mips_opts.micromips);
6557 start_noreorder ();
6558 if (noreorder)
6559 {
6560 micromips_label_expr (&expr1);
6561 macro_build (&expr1, brneg, fmt, sreg, treg);
6562 macro_build (NULL, "nop", "");
6563 macro_build (ep, call ? "bal" : "b", "p");
6564
6565 /* Set to true so that append_insn adds a label. */
6566 emit_branch_likely_macro = TRUE;
6567 }
6568 else
6569 {
6570 macro_build (ep, br, fmt, sreg, treg);
6571 macro_build (NULL, "nop", "");
6572 }
6573 end_noreorder ();
6574 }
6575
6576 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6577 the condition code tested. EP specifies the branch target. */
6578
6579 static void
6580 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6581 {
6582 const int call = 0;
6583 const char *brneg;
6584 const char *br;
6585
6586 switch (type)
6587 {
6588 case M_BC1FL:
6589 br = "bc1f";
6590 brneg = "bc1t";
6591 break;
6592 case M_BC1TL:
6593 br = "bc1t";
6594 brneg = "bc1f";
6595 break;
6596 case M_BC2FL:
6597 br = "bc2f";
6598 brneg = "bc2t";
6599 break;
6600 case M_BC2TL:
6601 br = "bc2t";
6602 brneg = "bc2f";
6603 break;
6604 default:
6605 abort ();
6606 }
6607 macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6608 }
6609
6610 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6611 the register tested. EP specifies the branch target. */
6612
6613 static void
6614 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6615 {
6616 const char *brneg = NULL;
6617 const char *br;
6618 int call = 0;
6619
6620 switch (type)
6621 {
6622 case M_BGEZ:
6623 br = "bgez";
6624 break;
6625 case M_BGEZL:
6626 br = mips_opts.micromips ? "bgez" : "bgezl";
6627 brneg = "bltz";
6628 break;
6629 case M_BGEZALL:
6630 gas_assert (mips_opts.micromips);
6631 br = "bgezals";
6632 brneg = "bltz";
6633 call = 1;
6634 break;
6635 case M_BGTZ:
6636 br = "bgtz";
6637 break;
6638 case M_BGTZL:
6639 br = mips_opts.micromips ? "bgtz" : "bgtzl";
6640 brneg = "blez";
6641 break;
6642 case M_BLEZ:
6643 br = "blez";
6644 break;
6645 case M_BLEZL:
6646 br = mips_opts.micromips ? "blez" : "blezl";
6647 brneg = "bgtz";
6648 break;
6649 case M_BLTZ:
6650 br = "bltz";
6651 break;
6652 case M_BLTZL:
6653 br = mips_opts.micromips ? "bltz" : "bltzl";
6654 brneg = "bgez";
6655 break;
6656 case M_BLTZALL:
6657 gas_assert (mips_opts.micromips);
6658 br = "bltzals";
6659 brneg = "bgez";
6660 call = 1;
6661 break;
6662 default:
6663 abort ();
6664 }
6665 if (mips_opts.micromips && brneg)
6666 macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6667 else
6668 macro_build (ep, br, "s,p", sreg);
6669 }
6670
6671 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6672 TREG as the registers tested. EP specifies the branch target. */
6673
6674 static void
6675 macro_build_branch_rsrt (int type, expressionS *ep,
6676 unsigned int sreg, unsigned int treg)
6677 {
6678 const char *brneg = NULL;
6679 const int call = 0;
6680 const char *br;
6681
6682 switch (type)
6683 {
6684 case M_BEQ:
6685 case M_BEQ_I:
6686 br = "beq";
6687 break;
6688 case M_BEQL:
6689 case M_BEQL_I:
6690 br = mips_opts.micromips ? "beq" : "beql";
6691 brneg = "bne";
6692 break;
6693 case M_BNE:
6694 case M_BNE_I:
6695 br = "bne";
6696 break;
6697 case M_BNEL:
6698 case M_BNEL_I:
6699 br = mips_opts.micromips ? "bne" : "bnel";
6700 brneg = "beq";
6701 break;
6702 default:
6703 abort ();
6704 }
6705 if (mips_opts.micromips && brneg)
6706 macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6707 else
6708 macro_build (ep, br, "s,t,p", sreg, treg);
6709 }
6710
6711 /*
6712 * Build macros
6713 * This routine implements the seemingly endless macro or synthesized
6714 * instructions and addressing modes in the mips assembly language. Many
6715 * of these macros are simple and are similar to each other. These could
6716 * probably be handled by some kind of table or grammar approach instead of
6717 * this verbose method. Others are not simple macros but are more like
6718 * optimizing code generation.
6719 * One interesting optimization is when several store macros appear
6720 * consecutively that would load AT with the upper half of the same address.
6721 * The ensuing load upper instructions are ommited. This implies some kind
6722 * of global optimization. We currently only optimize within a single macro.
6723 * For many of the load and store macros if the address is specified as a
6724 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6725 * first load register 'at' with zero and use it as the base register. The
6726 * mips assembler simply uses register $zero. Just one tiny optimization
6727 * we're missing.
6728 */
6729 static void
6730 macro (struct mips_cl_insn *ip)
6731 {
6732 unsigned int treg, sreg, dreg, breg;
6733 unsigned int tempreg;
6734 int mask;
6735 int used_at = 0;
6736 expressionS label_expr;
6737 expressionS expr1;
6738 expressionS *ep;
6739 const char *s;
6740 const char *s2;
6741 const char *fmt;
6742 int likely = 0;
6743 int coproc = 0;
6744 int offbits = 16;
6745 int call = 0;
6746 int jals = 0;
6747 int dbl = 0;
6748 int imm = 0;
6749 int ust = 0;
6750 int lp = 0;
6751 int ab = 0;
6752 int off;
6753 bfd_reloc_code_real_type r;
6754 int hold_mips_optimize;
6755
6756 gas_assert (! mips_opts.mips16);
6757
6758 treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6759 dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6760 sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6761 mask = ip->insn_mo->mask;
6762
6763 label_expr.X_op = O_constant;
6764 label_expr.X_op_symbol = NULL;
6765 label_expr.X_add_symbol = NULL;
6766 label_expr.X_add_number = 0;
6767
6768 expr1.X_op = O_constant;
6769 expr1.X_op_symbol = NULL;
6770 expr1.X_add_symbol = NULL;
6771 expr1.X_add_number = 1;
6772
6773 switch (mask)
6774 {
6775 case M_DABS:
6776 dbl = 1;
6777 case M_ABS:
6778 /* bgez $a0,1f
6779 move v0,$a0
6780 sub v0,$zero,$a0
6781 1:
6782 */
6783
6784 start_noreorder ();
6785
6786 if (mips_opts.micromips)
6787 micromips_label_expr (&label_expr);
6788 else
6789 label_expr.X_add_number = 8;
6790 macro_build (&label_expr, "bgez", "s,p", sreg);
6791 if (dreg == sreg)
6792 macro_build (NULL, "nop", "");
6793 else
6794 move_register (dreg, sreg);
6795 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6796 if (mips_opts.micromips)
6797 micromips_add_label ();
6798
6799 end_noreorder ();
6800 break;
6801
6802 case M_ADD_I:
6803 s = "addi";
6804 s2 = "add";
6805 goto do_addi;
6806 case M_ADDU_I:
6807 s = "addiu";
6808 s2 = "addu";
6809 goto do_addi;
6810 case M_DADD_I:
6811 dbl = 1;
6812 s = "daddi";
6813 s2 = "dadd";
6814 if (!mips_opts.micromips)
6815 goto do_addi;
6816 if (imm_expr.X_op == O_constant
6817 && imm_expr.X_add_number >= -0x200
6818 && imm_expr.X_add_number < 0x200)
6819 {
6820 macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6821 break;
6822 }
6823 goto do_addi_i;
6824 case M_DADDU_I:
6825 dbl = 1;
6826 s = "daddiu";
6827 s2 = "daddu";
6828 do_addi:
6829 if (imm_expr.X_op == O_constant
6830 && imm_expr.X_add_number >= -0x8000
6831 && imm_expr.X_add_number < 0x8000)
6832 {
6833 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6834 break;
6835 }
6836 do_addi_i:
6837 used_at = 1;
6838 load_register (AT, &imm_expr, dbl);
6839 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6840 break;
6841
6842 case M_AND_I:
6843 s = "andi";
6844 s2 = "and";
6845 goto do_bit;
6846 case M_OR_I:
6847 s = "ori";
6848 s2 = "or";
6849 goto do_bit;
6850 case M_NOR_I:
6851 s = "";
6852 s2 = "nor";
6853 goto do_bit;
6854 case M_XOR_I:
6855 s = "xori";
6856 s2 = "xor";
6857 do_bit:
6858 if (imm_expr.X_op == O_constant
6859 && imm_expr.X_add_number >= 0
6860 && imm_expr.X_add_number < 0x10000)
6861 {
6862 if (mask != M_NOR_I)
6863 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6864 else
6865 {
6866 macro_build (&imm_expr, "ori", "t,r,i",
6867 treg, sreg, BFD_RELOC_LO16);
6868 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6869 }
6870 break;
6871 }
6872
6873 used_at = 1;
6874 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6875 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6876 break;
6877
6878 case M_BALIGN:
6879 switch (imm_expr.X_add_number)
6880 {
6881 case 0:
6882 macro_build (NULL, "nop", "");
6883 break;
6884 case 2:
6885 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6886 break;
6887 case 1:
6888 case 3:
6889 macro_build (NULL, "balign", "t,s,2", treg, sreg,
6890 (int) imm_expr.X_add_number);
6891 break;
6892 default:
6893 as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6894 (unsigned long) imm_expr.X_add_number);
6895 break;
6896 }
6897 break;
6898
6899 case M_BC1FL:
6900 case M_BC1TL:
6901 case M_BC2FL:
6902 case M_BC2TL:
6903 gas_assert (mips_opts.micromips);
6904 macro_build_branch_ccl (mask, &offset_expr,
6905 EXTRACT_OPERAND (1, BCC, *ip));
6906 break;
6907
6908 case M_BEQ_I:
6909 case M_BEQL_I:
6910 case M_BNE_I:
6911 case M_BNEL_I:
6912 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6913 treg = 0;
6914 else
6915 {
6916 treg = AT;
6917 used_at = 1;
6918 load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6919 }
6920 /* Fall through. */
6921 case M_BEQL:
6922 case M_BNEL:
6923 macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6924 break;
6925
6926 case M_BGEL:
6927 likely = 1;
6928 case M_BGE:
6929 if (treg == 0)
6930 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6931 else if (sreg == 0)
6932 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6933 else
6934 {
6935 used_at = 1;
6936 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6937 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6938 &offset_expr, AT, ZERO);
6939 }
6940 break;
6941
6942 case M_BGEZL:
6943 case M_BGEZALL:
6944 case M_BGTZL:
6945 case M_BLEZL:
6946 case M_BLTZL:
6947 case M_BLTZALL:
6948 macro_build_branch_rs (mask, &offset_expr, sreg);
6949 break;
6950
6951 case M_BGTL_I:
6952 likely = 1;
6953 case M_BGT_I:
6954 /* Check for > max integer. */
6955 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
6956 {
6957 do_false:
6958 /* Result is always false. */
6959 if (! likely)
6960 macro_build (NULL, "nop", "");
6961 else
6962 macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6963 break;
6964 }
6965 if (imm_expr.X_op != O_constant)
6966 as_bad (_("Unsupported large constant"));
6967 ++imm_expr.X_add_number;
6968 /* FALLTHROUGH */
6969 case M_BGE_I:
6970 case M_BGEL_I:
6971 if (mask == M_BGEL_I)
6972 likely = 1;
6973 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6974 {
6975 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6976 &offset_expr, sreg);
6977 break;
6978 }
6979 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6980 {
6981 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6982 &offset_expr, sreg);
6983 break;
6984 }
6985 if (imm_expr.X_op == O_constant && imm_expr.X_add_number <= GPR_SMIN)
6986 {
6987 do_true:
6988 /* result is always true */
6989 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6990 macro_build (&offset_expr, "b", "p");
6991 break;
6992 }
6993 used_at = 1;
6994 set_at (sreg, 0);
6995 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6996 &offset_expr, AT, ZERO);
6997 break;
6998
6999 case M_BGEUL:
7000 likely = 1;
7001 case M_BGEU:
7002 if (treg == 0)
7003 goto do_true;
7004 else if (sreg == 0)
7005 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7006 &offset_expr, ZERO, treg);
7007 else
7008 {
7009 used_at = 1;
7010 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7011 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7012 &offset_expr, AT, ZERO);
7013 }
7014 break;
7015
7016 case M_BGTUL_I:
7017 likely = 1;
7018 case M_BGTU_I:
7019 if (sreg == 0
7020 || (HAVE_32BIT_GPRS
7021 && imm_expr.X_op == O_constant
7022 && imm_expr.X_add_number == -1))
7023 goto do_false;
7024 if (imm_expr.X_op != O_constant)
7025 as_bad (_("Unsupported large constant"));
7026 ++imm_expr.X_add_number;
7027 /* FALLTHROUGH */
7028 case M_BGEU_I:
7029 case M_BGEUL_I:
7030 if (mask == M_BGEUL_I)
7031 likely = 1;
7032 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7033 goto do_true;
7034 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7035 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7036 &offset_expr, sreg, ZERO);
7037 else
7038 {
7039 used_at = 1;
7040 set_at (sreg, 1);
7041 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7042 &offset_expr, AT, ZERO);
7043 }
7044 break;
7045
7046 case M_BGTL:
7047 likely = 1;
7048 case M_BGT:
7049 if (treg == 0)
7050 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
7051 else if (sreg == 0)
7052 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
7053 else
7054 {
7055 used_at = 1;
7056 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7057 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7058 &offset_expr, AT, ZERO);
7059 }
7060 break;
7061
7062 case M_BGTUL:
7063 likely = 1;
7064 case M_BGTU:
7065 if (treg == 0)
7066 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7067 &offset_expr, sreg, ZERO);
7068 else if (sreg == 0)
7069 goto do_false;
7070 else
7071 {
7072 used_at = 1;
7073 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7074 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7075 &offset_expr, AT, ZERO);
7076 }
7077 break;
7078
7079 case M_BLEL:
7080 likely = 1;
7081 case M_BLE:
7082 if (treg == 0)
7083 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7084 else if (sreg == 0)
7085 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
7086 else
7087 {
7088 used_at = 1;
7089 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7090 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7091 &offset_expr, AT, ZERO);
7092 }
7093 break;
7094
7095 case M_BLEL_I:
7096 likely = 1;
7097 case M_BLE_I:
7098 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
7099 goto do_true;
7100 if (imm_expr.X_op != O_constant)
7101 as_bad (_("Unsupported large constant"));
7102 ++imm_expr.X_add_number;
7103 /* FALLTHROUGH */
7104 case M_BLT_I:
7105 case M_BLTL_I:
7106 if (mask == M_BLTL_I)
7107 likely = 1;
7108 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7109 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7110 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7111 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7112 else
7113 {
7114 used_at = 1;
7115 set_at (sreg, 0);
7116 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7117 &offset_expr, AT, ZERO);
7118 }
7119 break;
7120
7121 case M_BLEUL:
7122 likely = 1;
7123 case M_BLEU:
7124 if (treg == 0)
7125 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7126 &offset_expr, sreg, ZERO);
7127 else if (sreg == 0)
7128 goto do_true;
7129 else
7130 {
7131 used_at = 1;
7132 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7133 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7134 &offset_expr, AT, ZERO);
7135 }
7136 break;
7137
7138 case M_BLEUL_I:
7139 likely = 1;
7140 case M_BLEU_I:
7141 if (sreg == 0
7142 || (HAVE_32BIT_GPRS
7143 && imm_expr.X_op == O_constant
7144 && imm_expr.X_add_number == -1))
7145 goto do_true;
7146 if (imm_expr.X_op != O_constant)
7147 as_bad (_("Unsupported large constant"));
7148 ++imm_expr.X_add_number;
7149 /* FALLTHROUGH */
7150 case M_BLTU_I:
7151 case M_BLTUL_I:
7152 if (mask == M_BLTUL_I)
7153 likely = 1;
7154 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7155 goto do_false;
7156 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7157 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7158 &offset_expr, sreg, ZERO);
7159 else
7160 {
7161 used_at = 1;
7162 set_at (sreg, 1);
7163 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7164 &offset_expr, AT, ZERO);
7165 }
7166 break;
7167
7168 case M_BLTL:
7169 likely = 1;
7170 case M_BLT:
7171 if (treg == 0)
7172 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7173 else if (sreg == 0)
7174 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
7175 else
7176 {
7177 used_at = 1;
7178 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
7179 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7180 &offset_expr, AT, ZERO);
7181 }
7182 break;
7183
7184 case M_BLTUL:
7185 likely = 1;
7186 case M_BLTU:
7187 if (treg == 0)
7188 goto do_false;
7189 else if (sreg == 0)
7190 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7191 &offset_expr, ZERO, treg);
7192 else
7193 {
7194 used_at = 1;
7195 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7196 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7197 &offset_expr, AT, ZERO);
7198 }
7199 break;
7200
7201 case M_DEXT:
7202 {
7203 /* Use unsigned arithmetic. */
7204 addressT pos;
7205 addressT size;
7206
7207 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7208 {
7209 as_bad (_("Unsupported large constant"));
7210 pos = size = 1;
7211 }
7212 else
7213 {
7214 pos = imm_expr.X_add_number;
7215 size = imm2_expr.X_add_number;
7216 }
7217
7218 if (pos > 63)
7219 {
7220 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7221 pos = 1;
7222 }
7223 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7224 {
7225 as_bad (_("Improper extract size (%lu, position %lu)"),
7226 (unsigned long) size, (unsigned long) pos);
7227 size = 1;
7228 }
7229
7230 if (size <= 32 && pos < 32)
7231 {
7232 s = "dext";
7233 fmt = "t,r,+A,+C";
7234 }
7235 else if (size <= 32)
7236 {
7237 s = "dextu";
7238 fmt = "t,r,+E,+H";
7239 }
7240 else
7241 {
7242 s = "dextm";
7243 fmt = "t,r,+A,+G";
7244 }
7245 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7246 (int) (size - 1));
7247 }
7248 break;
7249
7250 case M_DINS:
7251 {
7252 /* Use unsigned arithmetic. */
7253 addressT pos;
7254 addressT size;
7255
7256 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7257 {
7258 as_bad (_("Unsupported large constant"));
7259 pos = size = 1;
7260 }
7261 else
7262 {
7263 pos = imm_expr.X_add_number;
7264 size = imm2_expr.X_add_number;
7265 }
7266
7267 if (pos > 63)
7268 {
7269 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7270 pos = 1;
7271 }
7272 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7273 {
7274 as_bad (_("Improper insert size (%lu, position %lu)"),
7275 (unsigned long) size, (unsigned long) pos);
7276 size = 1;
7277 }
7278
7279 if (pos < 32 && (pos + size - 1) < 32)
7280 {
7281 s = "dins";
7282 fmt = "t,r,+A,+B";
7283 }
7284 else if (pos >= 32)
7285 {
7286 s = "dinsu";
7287 fmt = "t,r,+E,+F";
7288 }
7289 else
7290 {
7291 s = "dinsm";
7292 fmt = "t,r,+A,+F";
7293 }
7294 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7295 (int) (pos + size - 1));
7296 }
7297 break;
7298
7299 case M_DDIV_3:
7300 dbl = 1;
7301 case M_DIV_3:
7302 s = "mflo";
7303 goto do_div3;
7304 case M_DREM_3:
7305 dbl = 1;
7306 case M_REM_3:
7307 s = "mfhi";
7308 do_div3:
7309 if (treg == 0)
7310 {
7311 as_warn (_("Divide by zero."));
7312 if (mips_trap)
7313 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7314 else
7315 macro_build (NULL, "break", BRK_FMT, 7);
7316 break;
7317 }
7318
7319 start_noreorder ();
7320 if (mips_trap)
7321 {
7322 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7323 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7324 }
7325 else
7326 {
7327 if (mips_opts.micromips)
7328 micromips_label_expr (&label_expr);
7329 else
7330 label_expr.X_add_number = 8;
7331 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7332 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7333 macro_build (NULL, "break", BRK_FMT, 7);
7334 if (mips_opts.micromips)
7335 micromips_add_label ();
7336 }
7337 expr1.X_add_number = -1;
7338 used_at = 1;
7339 load_register (AT, &expr1, dbl);
7340 if (mips_opts.micromips)
7341 micromips_label_expr (&label_expr);
7342 else
7343 label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7344 macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7345 if (dbl)
7346 {
7347 expr1.X_add_number = 1;
7348 load_register (AT, &expr1, dbl);
7349 macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7350 }
7351 else
7352 {
7353 expr1.X_add_number = 0x80000000;
7354 macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7355 }
7356 if (mips_trap)
7357 {
7358 macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7359 /* We want to close the noreorder block as soon as possible, so
7360 that later insns are available for delay slot filling. */
7361 end_noreorder ();
7362 }
7363 else
7364 {
7365 if (mips_opts.micromips)
7366 micromips_label_expr (&label_expr);
7367 else
7368 label_expr.X_add_number = 8;
7369 macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7370 macro_build (NULL, "nop", "");
7371
7372 /* We want to close the noreorder block as soon as possible, so
7373 that later insns are available for delay slot filling. */
7374 end_noreorder ();
7375
7376 macro_build (NULL, "break", BRK_FMT, 6);
7377 }
7378 if (mips_opts.micromips)
7379 micromips_add_label ();
7380 macro_build (NULL, s, MFHL_FMT, dreg);
7381 break;
7382
7383 case M_DIV_3I:
7384 s = "div";
7385 s2 = "mflo";
7386 goto do_divi;
7387 case M_DIVU_3I:
7388 s = "divu";
7389 s2 = "mflo";
7390 goto do_divi;
7391 case M_REM_3I:
7392 s = "div";
7393 s2 = "mfhi";
7394 goto do_divi;
7395 case M_REMU_3I:
7396 s = "divu";
7397 s2 = "mfhi";
7398 goto do_divi;
7399 case M_DDIV_3I:
7400 dbl = 1;
7401 s = "ddiv";
7402 s2 = "mflo";
7403 goto do_divi;
7404 case M_DDIVU_3I:
7405 dbl = 1;
7406 s = "ddivu";
7407 s2 = "mflo";
7408 goto do_divi;
7409 case M_DREM_3I:
7410 dbl = 1;
7411 s = "ddiv";
7412 s2 = "mfhi";
7413 goto do_divi;
7414 case M_DREMU_3I:
7415 dbl = 1;
7416 s = "ddivu";
7417 s2 = "mfhi";
7418 do_divi:
7419 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7420 {
7421 as_warn (_("Divide by zero."));
7422 if (mips_trap)
7423 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7424 else
7425 macro_build (NULL, "break", BRK_FMT, 7);
7426 break;
7427 }
7428 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7429 {
7430 if (strcmp (s2, "mflo") == 0)
7431 move_register (dreg, sreg);
7432 else
7433 move_register (dreg, ZERO);
7434 break;
7435 }
7436 if (imm_expr.X_op == O_constant
7437 && imm_expr.X_add_number == -1
7438 && s[strlen (s) - 1] != 'u')
7439 {
7440 if (strcmp (s2, "mflo") == 0)
7441 {
7442 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7443 }
7444 else
7445 move_register (dreg, ZERO);
7446 break;
7447 }
7448
7449 used_at = 1;
7450 load_register (AT, &imm_expr, dbl);
7451 macro_build (NULL, s, "z,s,t", sreg, AT);
7452 macro_build (NULL, s2, MFHL_FMT, dreg);
7453 break;
7454
7455 case M_DIVU_3:
7456 s = "divu";
7457 s2 = "mflo";
7458 goto do_divu3;
7459 case M_REMU_3:
7460 s = "divu";
7461 s2 = "mfhi";
7462 goto do_divu3;
7463 case M_DDIVU_3:
7464 s = "ddivu";
7465 s2 = "mflo";
7466 goto do_divu3;
7467 case M_DREMU_3:
7468 s = "ddivu";
7469 s2 = "mfhi";
7470 do_divu3:
7471 start_noreorder ();
7472 if (mips_trap)
7473 {
7474 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7475 macro_build (NULL, s, "z,s,t", sreg, treg);
7476 /* We want to close the noreorder block as soon as possible, so
7477 that later insns are available for delay slot filling. */
7478 end_noreorder ();
7479 }
7480 else
7481 {
7482 if (mips_opts.micromips)
7483 micromips_label_expr (&label_expr);
7484 else
7485 label_expr.X_add_number = 8;
7486 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7487 macro_build (NULL, s, "z,s,t", sreg, treg);
7488
7489 /* We want to close the noreorder block as soon as possible, so
7490 that later insns are available for delay slot filling. */
7491 end_noreorder ();
7492 macro_build (NULL, "break", BRK_FMT, 7);
7493 if (mips_opts.micromips)
7494 micromips_add_label ();
7495 }
7496 macro_build (NULL, s2, MFHL_FMT, dreg);
7497 break;
7498
7499 case M_DLCA_AB:
7500 dbl = 1;
7501 case M_LCA_AB:
7502 call = 1;
7503 goto do_la;
7504 case M_DLA_AB:
7505 dbl = 1;
7506 case M_LA_AB:
7507 do_la:
7508 /* Load the address of a symbol into a register. If breg is not
7509 zero, we then add a base register to it. */
7510
7511 if (dbl && HAVE_32BIT_GPRS)
7512 as_warn (_("dla used to load 32-bit register"));
7513
7514 if (!dbl && HAVE_64BIT_OBJECTS)
7515 as_warn (_("la used to load 64-bit address"));
7516
7517 if (offset_expr.X_op == O_constant
7518 && offset_expr.X_add_number >= -0x8000
7519 && offset_expr.X_add_number < 0x8000)
7520 {
7521 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7522 "t,r,j", treg, sreg, BFD_RELOC_LO16);
7523 break;
7524 }
7525
7526 if (mips_opts.at && (treg == breg))
7527 {
7528 tempreg = AT;
7529 used_at = 1;
7530 }
7531 else
7532 {
7533 tempreg = treg;
7534 }
7535
7536 if (offset_expr.X_op != O_symbol
7537 && offset_expr.X_op != O_constant)
7538 {
7539 as_bad (_("Expression too complex"));
7540 offset_expr.X_op = O_constant;
7541 }
7542
7543 if (offset_expr.X_op == O_constant)
7544 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7545 else if (mips_pic == NO_PIC)
7546 {
7547 /* If this is a reference to a GP relative symbol, we want
7548 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
7549 Otherwise we want
7550 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
7551 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7552 If we have a constant, we need two instructions anyhow,
7553 so we may as well always use the latter form.
7554
7555 With 64bit address space and a usable $at we want
7556 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7557 lui $at,<sym> (BFD_RELOC_HI16_S)
7558 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7559 daddiu $at,<sym> (BFD_RELOC_LO16)
7560 dsll32 $tempreg,0
7561 daddu $tempreg,$tempreg,$at
7562
7563 If $at is already in use, we use a path which is suboptimal
7564 on superscalar processors.
7565 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7566 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7567 dsll $tempreg,16
7568 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
7569 dsll $tempreg,16
7570 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
7571
7572 For GP relative symbols in 64bit address space we can use
7573 the same sequence as in 32bit address space. */
7574 if (HAVE_64BIT_SYMBOLS)
7575 {
7576 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7577 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7578 {
7579 relax_start (offset_expr.X_add_symbol);
7580 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7581 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7582 relax_switch ();
7583 }
7584
7585 if (used_at == 0 && mips_opts.at)
7586 {
7587 macro_build (&offset_expr, "lui", LUI_FMT,
7588 tempreg, BFD_RELOC_MIPS_HIGHEST);
7589 macro_build (&offset_expr, "lui", LUI_FMT,
7590 AT, BFD_RELOC_HI16_S);
7591 macro_build (&offset_expr, "daddiu", "t,r,j",
7592 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7593 macro_build (&offset_expr, "daddiu", "t,r,j",
7594 AT, AT, BFD_RELOC_LO16);
7595 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7596 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7597 used_at = 1;
7598 }
7599 else
7600 {
7601 macro_build (&offset_expr, "lui", LUI_FMT,
7602 tempreg, BFD_RELOC_MIPS_HIGHEST);
7603 macro_build (&offset_expr, "daddiu", "t,r,j",
7604 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7605 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7606 macro_build (&offset_expr, "daddiu", "t,r,j",
7607 tempreg, tempreg, BFD_RELOC_HI16_S);
7608 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7609 macro_build (&offset_expr, "daddiu", "t,r,j",
7610 tempreg, tempreg, BFD_RELOC_LO16);
7611 }
7612
7613 if (mips_relax.sequence)
7614 relax_end ();
7615 }
7616 else
7617 {
7618 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7619 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7620 {
7621 relax_start (offset_expr.X_add_symbol);
7622 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7623 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7624 relax_switch ();
7625 }
7626 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7627 as_bad (_("Offset too large"));
7628 macro_build_lui (&offset_expr, tempreg);
7629 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7630 tempreg, tempreg, BFD_RELOC_LO16);
7631 if (mips_relax.sequence)
7632 relax_end ();
7633 }
7634 }
7635 else if (!mips_big_got && !HAVE_NEWABI)
7636 {
7637 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7638
7639 /* If this is a reference to an external symbol, and there
7640 is no constant, we want
7641 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7642 or for lca or if tempreg is PIC_CALL_REG
7643 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7644 For a local symbol, we want
7645 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7646 nop
7647 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7648
7649 If we have a small constant, and this is a reference to
7650 an external symbol, we want
7651 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7652 nop
7653 addiu $tempreg,$tempreg,<constant>
7654 For a local symbol, we want the same instruction
7655 sequence, but we output a BFD_RELOC_LO16 reloc on the
7656 addiu instruction.
7657
7658 If we have a large constant, and this is a reference to
7659 an external symbol, we want
7660 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7661 lui $at,<hiconstant>
7662 addiu $at,$at,<loconstant>
7663 addu $tempreg,$tempreg,$at
7664 For a local symbol, we want the same instruction
7665 sequence, but we output a BFD_RELOC_LO16 reloc on the
7666 addiu instruction.
7667 */
7668
7669 if (offset_expr.X_add_number == 0)
7670 {
7671 if (mips_pic == SVR4_PIC
7672 && breg == 0
7673 && (call || tempreg == PIC_CALL_REG))
7674 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7675
7676 relax_start (offset_expr.X_add_symbol);
7677 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7678 lw_reloc_type, mips_gp_register);
7679 if (breg != 0)
7680 {
7681 /* We're going to put in an addu instruction using
7682 tempreg, so we may as well insert the nop right
7683 now. */
7684 load_delay_nop ();
7685 }
7686 relax_switch ();
7687 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7688 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7689 load_delay_nop ();
7690 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7691 tempreg, tempreg, BFD_RELOC_LO16);
7692 relax_end ();
7693 /* FIXME: If breg == 0, and the next instruction uses
7694 $tempreg, then if this variant case is used an extra
7695 nop will be generated. */
7696 }
7697 else if (offset_expr.X_add_number >= -0x8000
7698 && offset_expr.X_add_number < 0x8000)
7699 {
7700 load_got_offset (tempreg, &offset_expr);
7701 load_delay_nop ();
7702 add_got_offset (tempreg, &offset_expr);
7703 }
7704 else
7705 {
7706 expr1.X_add_number = offset_expr.X_add_number;
7707 offset_expr.X_add_number =
7708 SEXT_16BIT (offset_expr.X_add_number);
7709 load_got_offset (tempreg, &offset_expr);
7710 offset_expr.X_add_number = expr1.X_add_number;
7711 /* If we are going to add in a base register, and the
7712 target register and the base register are the same,
7713 then we are using AT as a temporary register. Since
7714 we want to load the constant into AT, we add our
7715 current AT (from the global offset table) and the
7716 register into the register now, and pretend we were
7717 not using a base register. */
7718 if (breg == treg)
7719 {
7720 load_delay_nop ();
7721 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7722 treg, AT, breg);
7723 breg = 0;
7724 tempreg = treg;
7725 }
7726 add_got_offset_hilo (tempreg, &offset_expr, AT);
7727 used_at = 1;
7728 }
7729 }
7730 else if (!mips_big_got && HAVE_NEWABI)
7731 {
7732 int add_breg_early = 0;
7733
7734 /* If this is a reference to an external, and there is no
7735 constant, or local symbol (*), with or without a
7736 constant, we want
7737 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7738 or for lca or if tempreg is PIC_CALL_REG
7739 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7740
7741 If we have a small constant, and this is a reference to
7742 an external symbol, we want
7743 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7744 addiu $tempreg,$tempreg,<constant>
7745
7746 If we have a large constant, and this is a reference to
7747 an external symbol, we want
7748 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7749 lui $at,<hiconstant>
7750 addiu $at,$at,<loconstant>
7751 addu $tempreg,$tempreg,$at
7752
7753 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7754 local symbols, even though it introduces an additional
7755 instruction. */
7756
7757 if (offset_expr.X_add_number)
7758 {
7759 expr1.X_add_number = offset_expr.X_add_number;
7760 offset_expr.X_add_number = 0;
7761
7762 relax_start (offset_expr.X_add_symbol);
7763 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7764 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7765
7766 if (expr1.X_add_number >= -0x8000
7767 && expr1.X_add_number < 0x8000)
7768 {
7769 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7770 tempreg, tempreg, BFD_RELOC_LO16);
7771 }
7772 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7773 {
7774 /* If we are going to add in a base register, and the
7775 target register and the base register are the same,
7776 then we are using AT as a temporary register. Since
7777 we want to load the constant into AT, we add our
7778 current AT (from the global offset table) and the
7779 register into the register now, and pretend we were
7780 not using a base register. */
7781 if (breg != treg)
7782 dreg = tempreg;
7783 else
7784 {
7785 gas_assert (tempreg == AT);
7786 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7787 treg, AT, breg);
7788 dreg = treg;
7789 add_breg_early = 1;
7790 }
7791
7792 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7793 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7794 dreg, dreg, AT);
7795
7796 used_at = 1;
7797 }
7798 else
7799 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7800
7801 relax_switch ();
7802 offset_expr.X_add_number = expr1.X_add_number;
7803
7804 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7805 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7806 if (add_breg_early)
7807 {
7808 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7809 treg, tempreg, breg);
7810 breg = 0;
7811 tempreg = treg;
7812 }
7813 relax_end ();
7814 }
7815 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7816 {
7817 relax_start (offset_expr.X_add_symbol);
7818 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7819 BFD_RELOC_MIPS_CALL16, mips_gp_register);
7820 relax_switch ();
7821 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7822 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7823 relax_end ();
7824 }
7825 else
7826 {
7827 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7828 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7829 }
7830 }
7831 else if (mips_big_got && !HAVE_NEWABI)
7832 {
7833 int gpdelay;
7834 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7835 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7836 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7837
7838 /* This is the large GOT case. If this is a reference to an
7839 external symbol, and there is no constant, we want
7840 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7841 addu $tempreg,$tempreg,$gp
7842 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7843 or for lca or if tempreg is PIC_CALL_REG
7844 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
7845 addu $tempreg,$tempreg,$gp
7846 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7847 For a local symbol, we want
7848 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7849 nop
7850 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7851
7852 If we have a small constant, and this is a reference to
7853 an external symbol, we want
7854 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7855 addu $tempreg,$tempreg,$gp
7856 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7857 nop
7858 addiu $tempreg,$tempreg,<constant>
7859 For a local symbol, we want
7860 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7861 nop
7862 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7863
7864 If we have a large constant, and this is a reference to
7865 an external symbol, 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 lui $at,<hiconstant>
7870 addiu $at,$at,<loconstant>
7871 addu $tempreg,$tempreg,$at
7872 For a local symbol, we want
7873 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7874 lui $at,<hiconstant>
7875 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
7876 addu $tempreg,$tempreg,$at
7877 */
7878
7879 expr1.X_add_number = offset_expr.X_add_number;
7880 offset_expr.X_add_number = 0;
7881 relax_start (offset_expr.X_add_symbol);
7882 gpdelay = reg_needs_delay (mips_gp_register);
7883 if (expr1.X_add_number == 0 && breg == 0
7884 && (call || tempreg == PIC_CALL_REG))
7885 {
7886 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7887 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7888 }
7889 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7890 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7891 tempreg, tempreg, mips_gp_register);
7892 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7893 tempreg, lw_reloc_type, tempreg);
7894 if (expr1.X_add_number == 0)
7895 {
7896 if (breg != 0)
7897 {
7898 /* We're going to put in an addu instruction using
7899 tempreg, so we may as well insert the nop right
7900 now. */
7901 load_delay_nop ();
7902 }
7903 }
7904 else if (expr1.X_add_number >= -0x8000
7905 && expr1.X_add_number < 0x8000)
7906 {
7907 load_delay_nop ();
7908 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7909 tempreg, tempreg, BFD_RELOC_LO16);
7910 }
7911 else
7912 {
7913 /* If we are going to add in a base register, and the
7914 target register and the base register are the same,
7915 then we are using AT as a temporary register. Since
7916 we want to load the constant into AT, we add our
7917 current AT (from the global offset table) and the
7918 register into the register now, and pretend we were
7919 not using a base register. */
7920 if (breg != treg)
7921 dreg = tempreg;
7922 else
7923 {
7924 gas_assert (tempreg == AT);
7925 load_delay_nop ();
7926 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7927 treg, AT, breg);
7928 dreg = treg;
7929 }
7930
7931 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7932 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7933
7934 used_at = 1;
7935 }
7936 offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7937 relax_switch ();
7938
7939 if (gpdelay)
7940 {
7941 /* This is needed because this instruction uses $gp, but
7942 the first instruction on the main stream does not. */
7943 macro_build (NULL, "nop", "");
7944 }
7945
7946 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7947 local_reloc_type, mips_gp_register);
7948 if (expr1.X_add_number >= -0x8000
7949 && expr1.X_add_number < 0x8000)
7950 {
7951 load_delay_nop ();
7952 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7953 tempreg, tempreg, BFD_RELOC_LO16);
7954 /* FIXME: If add_number is 0, and there was no base
7955 register, the external symbol case ended with a load,
7956 so if the symbol turns out to not be external, and
7957 the next instruction uses tempreg, an unnecessary nop
7958 will be inserted. */
7959 }
7960 else
7961 {
7962 if (breg == treg)
7963 {
7964 /* We must add in the base register now, as in the
7965 external symbol case. */
7966 gas_assert (tempreg == AT);
7967 load_delay_nop ();
7968 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7969 treg, AT, breg);
7970 tempreg = treg;
7971 /* We set breg to 0 because we have arranged to add
7972 it in in both cases. */
7973 breg = 0;
7974 }
7975
7976 macro_build_lui (&expr1, AT);
7977 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7978 AT, AT, BFD_RELOC_LO16);
7979 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7980 tempreg, tempreg, AT);
7981 used_at = 1;
7982 }
7983 relax_end ();
7984 }
7985 else if (mips_big_got && HAVE_NEWABI)
7986 {
7987 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7988 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7989 int add_breg_early = 0;
7990
7991 /* This is the large GOT case. If this is a reference to an
7992 external symbol, and there is no constant, we want
7993 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7994 add $tempreg,$tempreg,$gp
7995 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7996 or for lca or if tempreg is PIC_CALL_REG
7997 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
7998 add $tempreg,$tempreg,$gp
7999 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
8000
8001 If we have a small constant, and this is a reference to
8002 an external symbol, we want
8003 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8004 add $tempreg,$tempreg,$gp
8005 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8006 addi $tempreg,$tempreg,<constant>
8007
8008 If we have a large constant, and this is a reference to
8009 an external symbol, we want
8010 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8011 addu $tempreg,$tempreg,$gp
8012 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8013 lui $at,<hiconstant>
8014 addi $at,$at,<loconstant>
8015 add $tempreg,$tempreg,$at
8016
8017 If we have NewABI, and we know it's a local symbol, we want
8018 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
8019 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
8020 otherwise we have to resort to GOT_HI16/GOT_LO16. */
8021
8022 relax_start (offset_expr.X_add_symbol);
8023
8024 expr1.X_add_number = offset_expr.X_add_number;
8025 offset_expr.X_add_number = 0;
8026
8027 if (expr1.X_add_number == 0 && breg == 0
8028 && (call || tempreg == PIC_CALL_REG))
8029 {
8030 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
8031 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
8032 }
8033 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
8034 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8035 tempreg, tempreg, mips_gp_register);
8036 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8037 tempreg, lw_reloc_type, tempreg);
8038
8039 if (expr1.X_add_number == 0)
8040 ;
8041 else if (expr1.X_add_number >= -0x8000
8042 && expr1.X_add_number < 0x8000)
8043 {
8044 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
8045 tempreg, tempreg, BFD_RELOC_LO16);
8046 }
8047 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
8048 {
8049 /* If we are going to add in a base register, and the
8050 target register and the base register are the same,
8051 then we are using AT as a temporary register. Since
8052 we want to load the constant into AT, we add our
8053 current AT (from the global offset table) and the
8054 register into the register now, and pretend we were
8055 not using a base register. */
8056 if (breg != treg)
8057 dreg = tempreg;
8058 else
8059 {
8060 gas_assert (tempreg == AT);
8061 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8062 treg, AT, breg);
8063 dreg = treg;
8064 add_breg_early = 1;
8065 }
8066
8067 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
8068 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
8069
8070 used_at = 1;
8071 }
8072 else
8073 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
8074
8075 relax_switch ();
8076 offset_expr.X_add_number = expr1.X_add_number;
8077 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8078 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8079 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8080 tempreg, BFD_RELOC_MIPS_GOT_OFST);
8081 if (add_breg_early)
8082 {
8083 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8084 treg, tempreg, breg);
8085 breg = 0;
8086 tempreg = treg;
8087 }
8088 relax_end ();
8089 }
8090 else
8091 abort ();
8092
8093 if (breg != 0)
8094 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
8095 break;
8096
8097 case M_MSGSND:
8098 gas_assert (!mips_opts.micromips);
8099 {
8100 unsigned long temp = (treg << 16) | (0x01);
8101 macro_build (NULL, "c2", "C", temp);
8102 }
8103 break;
8104
8105 case M_MSGLD:
8106 gas_assert (!mips_opts.micromips);
8107 {
8108 unsigned long temp = (0x02);
8109 macro_build (NULL, "c2", "C", temp);
8110 }
8111 break;
8112
8113 case M_MSGLD_T:
8114 gas_assert (!mips_opts.micromips);
8115 {
8116 unsigned long temp = (treg << 16) | (0x02);
8117 macro_build (NULL, "c2", "C", temp);
8118 }
8119 break;
8120
8121 case M_MSGWAIT:
8122 gas_assert (!mips_opts.micromips);
8123 macro_build (NULL, "c2", "C", 3);
8124 break;
8125
8126 case M_MSGWAIT_T:
8127 gas_assert (!mips_opts.micromips);
8128 {
8129 unsigned long temp = (treg << 16) | 0x03;
8130 macro_build (NULL, "c2", "C", temp);
8131 }
8132 break;
8133
8134 case M_J_A:
8135 /* The j instruction may not be used in PIC code, since it
8136 requires an absolute address. We convert it to a b
8137 instruction. */
8138 if (mips_pic == NO_PIC)
8139 macro_build (&offset_expr, "j", "a");
8140 else
8141 macro_build (&offset_expr, "b", "p");
8142 break;
8143
8144 /* The jal instructions must be handled as macros because when
8145 generating PIC code they expand to multi-instruction
8146 sequences. Normally they are simple instructions. */
8147 case M_JALS_1:
8148 dreg = RA;
8149 /* Fall through. */
8150 case M_JALS_2:
8151 gas_assert (mips_opts.micromips);
8152 jals = 1;
8153 goto jal;
8154 case M_JAL_1:
8155 dreg = RA;
8156 /* Fall through. */
8157 case M_JAL_2:
8158 jal:
8159 if (mips_pic == NO_PIC)
8160 {
8161 s = jals ? "jalrs" : "jalr";
8162 if (mips_opts.micromips
8163 && dreg == RA
8164 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8165 macro_build (NULL, s, "mj", sreg);
8166 else
8167 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8168 }
8169 else
8170 {
8171 int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
8172 && mips_cprestore_offset >= 0);
8173
8174 if (sreg != PIC_CALL_REG)
8175 as_warn (_("MIPS PIC call to register other than $25"));
8176
8177 s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
8178 ? "jalrs" : "jalr");
8179 if (mips_opts.micromips
8180 && dreg == RA
8181 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8182 macro_build (NULL, s, "mj", sreg);
8183 else
8184 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8185 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
8186 {
8187 if (mips_cprestore_offset < 0)
8188 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8189 else
8190 {
8191 if (!mips_frame_reg_valid)
8192 {
8193 as_warn (_("No .frame pseudo-op used in PIC code"));
8194 /* Quiet this warning. */
8195 mips_frame_reg_valid = 1;
8196 }
8197 if (!mips_cprestore_valid)
8198 {
8199 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8200 /* Quiet this warning. */
8201 mips_cprestore_valid = 1;
8202 }
8203 if (mips_opts.noreorder)
8204 macro_build (NULL, "nop", "");
8205 expr1.X_add_number = mips_cprestore_offset;
8206 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8207 mips_gp_register,
8208 mips_frame_reg,
8209 HAVE_64BIT_ADDRESSES);
8210 }
8211 }
8212 }
8213
8214 break;
8215
8216 case M_JALS_A:
8217 gas_assert (mips_opts.micromips);
8218 jals = 1;
8219 /* Fall through. */
8220 case M_JAL_A:
8221 if (mips_pic == NO_PIC)
8222 macro_build (&offset_expr, jals ? "jals" : "jal", "a");
8223 else if (mips_pic == SVR4_PIC)
8224 {
8225 /* If this is a reference to an external symbol, and we are
8226 using a small GOT, we want
8227 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
8228 nop
8229 jalr $ra,$25
8230 nop
8231 lw $gp,cprestore($sp)
8232 The cprestore value is set using the .cprestore
8233 pseudo-op. If we are using a big GOT, we want
8234 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
8235 addu $25,$25,$gp
8236 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
8237 nop
8238 jalr $ra,$25
8239 nop
8240 lw $gp,cprestore($sp)
8241 If the symbol is not external, we want
8242 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
8243 nop
8244 addiu $25,$25,<sym> (BFD_RELOC_LO16)
8245 jalr $ra,$25
8246 nop
8247 lw $gp,cprestore($sp)
8248
8249 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
8250 sequences above, minus nops, unless the symbol is local,
8251 which enables us to use GOT_PAGE/GOT_OFST (big got) or
8252 GOT_DISP. */
8253 if (HAVE_NEWABI)
8254 {
8255 if (!mips_big_got)
8256 {
8257 relax_start (offset_expr.X_add_symbol);
8258 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8259 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8260 mips_gp_register);
8261 relax_switch ();
8262 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8263 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
8264 mips_gp_register);
8265 relax_end ();
8266 }
8267 else
8268 {
8269 relax_start (offset_expr.X_add_symbol);
8270 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8271 BFD_RELOC_MIPS_CALL_HI16);
8272 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8273 PIC_CALL_REG, mips_gp_register);
8274 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8275 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8276 PIC_CALL_REG);
8277 relax_switch ();
8278 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8279 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8280 mips_gp_register);
8281 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8282 PIC_CALL_REG, PIC_CALL_REG,
8283 BFD_RELOC_MIPS_GOT_OFST);
8284 relax_end ();
8285 }
8286
8287 macro_build_jalr (&offset_expr, 0);
8288 }
8289 else
8290 {
8291 relax_start (offset_expr.X_add_symbol);
8292 if (!mips_big_got)
8293 {
8294 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8295 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8296 mips_gp_register);
8297 load_delay_nop ();
8298 relax_switch ();
8299 }
8300 else
8301 {
8302 int gpdelay;
8303
8304 gpdelay = reg_needs_delay (mips_gp_register);
8305 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8306 BFD_RELOC_MIPS_CALL_HI16);
8307 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8308 PIC_CALL_REG, mips_gp_register);
8309 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8310 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8311 PIC_CALL_REG);
8312 load_delay_nop ();
8313 relax_switch ();
8314 if (gpdelay)
8315 macro_build (NULL, "nop", "");
8316 }
8317 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8318 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8319 mips_gp_register);
8320 load_delay_nop ();
8321 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8322 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8323 relax_end ();
8324 macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8325
8326 if (mips_cprestore_offset < 0)
8327 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8328 else
8329 {
8330 if (!mips_frame_reg_valid)
8331 {
8332 as_warn (_("No .frame pseudo-op used in PIC code"));
8333 /* Quiet this warning. */
8334 mips_frame_reg_valid = 1;
8335 }
8336 if (!mips_cprestore_valid)
8337 {
8338 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8339 /* Quiet this warning. */
8340 mips_cprestore_valid = 1;
8341 }
8342 if (mips_opts.noreorder)
8343 macro_build (NULL, "nop", "");
8344 expr1.X_add_number = mips_cprestore_offset;
8345 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8346 mips_gp_register,
8347 mips_frame_reg,
8348 HAVE_64BIT_ADDRESSES);
8349 }
8350 }
8351 }
8352 else if (mips_pic == VXWORKS_PIC)
8353 as_bad (_("Non-PIC jump used in PIC library"));
8354 else
8355 abort ();
8356
8357 break;
8358
8359 case M_LBUE_AB:
8360 ab = 1;
8361 case M_LBUE_OB:
8362 s = "lbue";
8363 fmt = "t,+j(b)";
8364 offbits = 9;
8365 goto ld_st;
8366 case M_LHUE_AB:
8367 ab = 1;
8368 case M_LHUE_OB:
8369 s = "lhue";
8370 fmt = "t,+j(b)";
8371 offbits = 9;
8372 goto ld_st;
8373 case M_LBE_AB:
8374 ab = 1;
8375 case M_LBE_OB:
8376 s = "lbe";
8377 fmt = "t,+j(b)";
8378 offbits = 9;
8379 goto ld_st;
8380 case M_LHE_AB:
8381 ab = 1;
8382 case M_LHE_OB:
8383 s = "lhe";
8384 fmt = "t,+j(b)";
8385 offbits = 9;
8386 goto ld_st;
8387 case M_LLE_AB:
8388 ab = 1;
8389 case M_LLE_OB:
8390 s = "lle";
8391 fmt = "t,+j(b)";
8392 offbits = 9;
8393 goto ld_st;
8394 case M_LWE_AB:
8395 ab = 1;
8396 case M_LWE_OB:
8397 s = "lwe";
8398 fmt = "t,+j(b)";
8399 offbits = 9;
8400 goto ld_st;
8401 case M_LWLE_AB:
8402 ab = 1;
8403 case M_LWLE_OB:
8404 s = "lwle";
8405 fmt = "t,+j(b)";
8406 offbits = 9;
8407 goto ld_st;
8408 case M_LWRE_AB:
8409 ab = 1;
8410 case M_LWRE_OB:
8411 s = "lwre";
8412 fmt = "t,+j(b)";
8413 offbits = 9;
8414 goto ld_st;
8415 case M_SBE_AB:
8416 ab = 1;
8417 case M_SBE_OB:
8418 s = "sbe";
8419 fmt = "t,+j(b)";
8420 offbits = 9;
8421 goto ld_st;
8422 case M_SCE_AB:
8423 ab = 1;
8424 case M_SCE_OB:
8425 s = "sce";
8426 fmt = "t,+j(b)";
8427 offbits = 9;
8428 goto ld_st;
8429 case M_SHE_AB:
8430 ab = 1;
8431 case M_SHE_OB:
8432 s = "she";
8433 fmt = "t,+j(b)";
8434 offbits = 9;
8435 goto ld_st;
8436 case M_SWE_AB:
8437 ab = 1;
8438 case M_SWE_OB:
8439 s = "swe";
8440 fmt = "t,+j(b)";
8441 offbits = 9;
8442 goto ld_st;
8443 case M_SWLE_AB:
8444 ab = 1;
8445 case M_SWLE_OB:
8446 s = "swle";
8447 fmt = "t,+j(b)";
8448 offbits = 9;
8449 goto ld_st;
8450 case M_SWRE_AB:
8451 ab = 1;
8452 case M_SWRE_OB:
8453 s = "swre";
8454 fmt = "t,+j(b)";
8455 offbits = 9;
8456 goto ld_st;
8457 case M_ACLR_AB:
8458 ab = 1;
8459 case M_ACLR_OB:
8460 s = "aclr";
8461 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8462 fmt = "\\,~(b)";
8463 offbits = 12;
8464 goto ld_st;
8465 case M_ASET_AB:
8466 ab = 1;
8467 case M_ASET_OB:
8468 s = "aset";
8469 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8470 fmt = "\\,~(b)";
8471 offbits = 12;
8472 goto ld_st;
8473 case M_LB_AB:
8474 ab = 1;
8475 s = "lb";
8476 fmt = "t,o(b)";
8477 goto ld;
8478 case M_LBU_AB:
8479 ab = 1;
8480 s = "lbu";
8481 fmt = "t,o(b)";
8482 goto ld;
8483 case M_LH_AB:
8484 ab = 1;
8485 s = "lh";
8486 fmt = "t,o(b)";
8487 goto ld;
8488 case M_LHU_AB:
8489 ab = 1;
8490 s = "lhu";
8491 fmt = "t,o(b)";
8492 goto ld;
8493 case M_LW_AB:
8494 ab = 1;
8495 s = "lw";
8496 fmt = "t,o(b)";
8497 goto ld;
8498 case M_LWC0_AB:
8499 ab = 1;
8500 gas_assert (!mips_opts.micromips);
8501 s = "lwc0";
8502 fmt = "E,o(b)";
8503 /* Itbl support may require additional care here. */
8504 coproc = 1;
8505 goto ld_st;
8506 case M_LWC1_AB:
8507 ab = 1;
8508 s = "lwc1";
8509 fmt = "T,o(b)";
8510 /* Itbl support may require additional care here. */
8511 coproc = 1;
8512 goto ld_st;
8513 case M_LWC2_AB:
8514 ab = 1;
8515 case M_LWC2_OB:
8516 s = "lwc2";
8517 fmt = COP12_FMT;
8518 offbits = (mips_opts.micromips ? 12 : 16);
8519 /* Itbl support may require additional care here. */
8520 coproc = 1;
8521 goto ld_st;
8522 case M_LWC3_AB:
8523 ab = 1;
8524 gas_assert (!mips_opts.micromips);
8525 s = "lwc3";
8526 fmt = "E,o(b)";
8527 /* Itbl support may require additional care here. */
8528 coproc = 1;
8529 goto ld_st;
8530 case M_LWL_AB:
8531 ab = 1;
8532 case M_LWL_OB:
8533 s = "lwl";
8534 fmt = MEM12_FMT;
8535 offbits = (mips_opts.micromips ? 12 : 16);
8536 goto ld_st;
8537 case M_LWR_AB:
8538 ab = 1;
8539 case M_LWR_OB:
8540 s = "lwr";
8541 fmt = MEM12_FMT;
8542 offbits = (mips_opts.micromips ? 12 : 16);
8543 goto ld_st;
8544 case M_LDC1_AB:
8545 ab = 1;
8546 s = "ldc1";
8547 fmt = "T,o(b)";
8548 /* Itbl support may require additional care here. */
8549 coproc = 1;
8550 goto ld_st;
8551 case M_LDC2_AB:
8552 ab = 1;
8553 case M_LDC2_OB:
8554 s = "ldc2";
8555 fmt = COP12_FMT;
8556 offbits = (mips_opts.micromips ? 12 : 16);
8557 /* Itbl support may require additional care here. */
8558 coproc = 1;
8559 goto ld_st;
8560 case M_LQC2_AB:
8561 ab = 1;
8562 s = "lqc2";
8563 fmt = "E,o(b)";
8564 /* Itbl support may require additional care here. */
8565 coproc = 1;
8566 goto ld_st;
8567 case M_LDC3_AB:
8568 ab = 1;
8569 s = "ldc3";
8570 fmt = "E,o(b)";
8571 /* Itbl support may require additional care here. */
8572 coproc = 1;
8573 goto ld_st;
8574 case M_LDL_AB:
8575 ab = 1;
8576 case M_LDL_OB:
8577 s = "ldl";
8578 fmt = MEM12_FMT;
8579 offbits = (mips_opts.micromips ? 12 : 16);
8580 goto ld_st;
8581 case M_LDR_AB:
8582 ab = 1;
8583 case M_LDR_OB:
8584 s = "ldr";
8585 fmt = MEM12_FMT;
8586 offbits = (mips_opts.micromips ? 12 : 16);
8587 goto ld_st;
8588 case M_LL_AB:
8589 ab = 1;
8590 case M_LL_OB:
8591 s = "ll";
8592 fmt = MEM12_FMT;
8593 offbits = (mips_opts.micromips ? 12 : 16);
8594 goto ld;
8595 case M_LLD_AB:
8596 ab = 1;
8597 case M_LLD_OB:
8598 s = "lld";
8599 fmt = MEM12_FMT;
8600 offbits = (mips_opts.micromips ? 12 : 16);
8601 goto ld;
8602 case M_LWU_AB:
8603 ab = 1;
8604 case M_LWU_OB:
8605 s = "lwu";
8606 fmt = MEM12_FMT;
8607 offbits = (mips_opts.micromips ? 12 : 16);
8608 goto ld;
8609 case M_LWP_AB:
8610 ab = 1;
8611 case M_LWP_OB:
8612 gas_assert (mips_opts.micromips);
8613 s = "lwp";
8614 fmt = "t,~(b)";
8615 offbits = 12;
8616 lp = 1;
8617 goto ld;
8618 case M_LDP_AB:
8619 ab = 1;
8620 case M_LDP_OB:
8621 gas_assert (mips_opts.micromips);
8622 s = "ldp";
8623 fmt = "t,~(b)";
8624 offbits = 12;
8625 lp = 1;
8626 goto ld;
8627 case M_LWM_AB:
8628 ab = 1;
8629 case M_LWM_OB:
8630 gas_assert (mips_opts.micromips);
8631 s = "lwm";
8632 fmt = "n,~(b)";
8633 offbits = 12;
8634 goto ld_st;
8635 case M_LDM_AB:
8636 ab = 1;
8637 case M_LDM_OB:
8638 gas_assert (mips_opts.micromips);
8639 s = "ldm";
8640 fmt = "n,~(b)";
8641 offbits = 12;
8642 goto ld_st;
8643
8644 ld:
8645 /* We don't want to use $0 as tempreg. */
8646 if (breg == treg + lp || treg + lp == ZERO)
8647 goto ld_st;
8648 else
8649 tempreg = treg + lp;
8650 goto ld_noat;
8651
8652 case M_SB_AB:
8653 ab = 1;
8654 s = "sb";
8655 fmt = "t,o(b)";
8656 goto ld_st;
8657 case M_SH_AB:
8658 ab = 1;
8659 s = "sh";
8660 fmt = "t,o(b)";
8661 goto ld_st;
8662 case M_SW_AB:
8663 ab = 1;
8664 s = "sw";
8665 fmt = "t,o(b)";
8666 goto ld_st;
8667 case M_SWC0_AB:
8668 ab = 1;
8669 gas_assert (!mips_opts.micromips);
8670 s = "swc0";
8671 fmt = "E,o(b)";
8672 /* Itbl support may require additional care here. */
8673 coproc = 1;
8674 goto ld_st;
8675 case M_SWC1_AB:
8676 ab = 1;
8677 s = "swc1";
8678 fmt = "T,o(b)";
8679 /* Itbl support may require additional care here. */
8680 coproc = 1;
8681 goto ld_st;
8682 case M_SWC2_AB:
8683 ab = 1;
8684 case M_SWC2_OB:
8685 s = "swc2";
8686 fmt = COP12_FMT;
8687 offbits = (mips_opts.micromips ? 12 : 16);
8688 /* Itbl support may require additional care here. */
8689 coproc = 1;
8690 goto ld_st;
8691 case M_SWC3_AB:
8692 ab = 1;
8693 gas_assert (!mips_opts.micromips);
8694 s = "swc3";
8695 fmt = "E,o(b)";
8696 /* Itbl support may require additional care here. */
8697 coproc = 1;
8698 goto ld_st;
8699 case M_SWL_AB:
8700 ab = 1;
8701 case M_SWL_OB:
8702 s = "swl";
8703 fmt = MEM12_FMT;
8704 offbits = (mips_opts.micromips ? 12 : 16);
8705 goto ld_st;
8706 case M_SWR_AB:
8707 ab = 1;
8708 case M_SWR_OB:
8709 s = "swr";
8710 fmt = MEM12_FMT;
8711 offbits = (mips_opts.micromips ? 12 : 16);
8712 goto ld_st;
8713 case M_SC_AB:
8714 ab = 1;
8715 case M_SC_OB:
8716 s = "sc";
8717 fmt = MEM12_FMT;
8718 offbits = (mips_opts.micromips ? 12 : 16);
8719 goto ld_st;
8720 case M_SCD_AB:
8721 ab = 1;
8722 case M_SCD_OB:
8723 s = "scd";
8724 fmt = MEM12_FMT;
8725 offbits = (mips_opts.micromips ? 12 : 16);
8726 goto ld_st;
8727 case M_CACHE_AB:
8728 ab = 1;
8729 case M_CACHE_OB:
8730 s = "cache";
8731 fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8732 offbits = (mips_opts.micromips ? 12 : 16);
8733 goto ld_st;
8734 case M_CACHEE_AB:
8735 ab = 1;
8736 case M_CACHEE_OB:
8737 s = "cachee";
8738 fmt = "k,+j(b)";
8739 offbits = 9;
8740 goto ld_st;
8741 case M_PREF_AB:
8742 ab = 1;
8743 case M_PREF_OB:
8744 s = "pref";
8745 fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8746 offbits = (mips_opts.micromips ? 12 : 16);
8747 goto ld_st;
8748 case M_PREFE_AB:
8749 ab = 1;
8750 case M_PREFE_OB:
8751 s = "prefe";
8752 fmt = "k,+j(b)";
8753 offbits = 9;
8754 goto ld_st;
8755 case M_SDC1_AB:
8756 ab = 1;
8757 s = "sdc1";
8758 fmt = "T,o(b)";
8759 coproc = 1;
8760 /* Itbl support may require additional care here. */
8761 goto ld_st;
8762 case M_SDC2_AB:
8763 ab = 1;
8764 case M_SDC2_OB:
8765 s = "sdc2";
8766 fmt = COP12_FMT;
8767 offbits = (mips_opts.micromips ? 12 : 16);
8768 /* Itbl support may require additional care here. */
8769 coproc = 1;
8770 goto ld_st;
8771 case M_SQC2_AB:
8772 ab = 1;
8773 s = "sqc2";
8774 fmt = "E,o(b)";
8775 /* Itbl support may require additional care here. */
8776 coproc = 1;
8777 goto ld_st;
8778 case M_SDC3_AB:
8779 ab = 1;
8780 gas_assert (!mips_opts.micromips);
8781 s = "sdc3";
8782 fmt = "E,o(b)";
8783 /* Itbl support may require additional care here. */
8784 coproc = 1;
8785 goto ld_st;
8786 case M_SDL_AB:
8787 ab = 1;
8788 case M_SDL_OB:
8789 s = "sdl";
8790 fmt = MEM12_FMT;
8791 offbits = (mips_opts.micromips ? 12 : 16);
8792 goto ld_st;
8793 case M_SDR_AB:
8794 ab = 1;
8795 case M_SDR_OB:
8796 s = "sdr";
8797 fmt = MEM12_FMT;
8798 offbits = (mips_opts.micromips ? 12 : 16);
8799 goto ld_st;
8800 case M_SWP_AB:
8801 ab = 1;
8802 case M_SWP_OB:
8803 gas_assert (mips_opts.micromips);
8804 s = "swp";
8805 fmt = "t,~(b)";
8806 offbits = 12;
8807 goto ld_st;
8808 case M_SDP_AB:
8809 ab = 1;
8810 case M_SDP_OB:
8811 gas_assert (mips_opts.micromips);
8812 s = "sdp";
8813 fmt = "t,~(b)";
8814 offbits = 12;
8815 goto ld_st;
8816 case M_SWM_AB:
8817 ab = 1;
8818 case M_SWM_OB:
8819 gas_assert (mips_opts.micromips);
8820 s = "swm";
8821 fmt = "n,~(b)";
8822 offbits = 12;
8823 goto ld_st;
8824 case M_SDM_AB:
8825 ab = 1;
8826 case M_SDM_OB:
8827 gas_assert (mips_opts.micromips);
8828 s = "sdm";
8829 fmt = "n,~(b)";
8830 offbits = 12;
8831
8832 ld_st:
8833 tempreg = AT;
8834 used_at = 1;
8835 ld_noat:
8836 if (offset_expr.X_op != O_constant
8837 && offset_expr.X_op != O_symbol)
8838 {
8839 as_bad (_("Expression too complex"));
8840 offset_expr.X_op = O_constant;
8841 }
8842
8843 if (HAVE_32BIT_ADDRESSES
8844 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8845 {
8846 char value [32];
8847
8848 sprintf_vma (value, offset_expr.X_add_number);
8849 as_bad (_("Number (0x%s) larger than 32 bits"), value);
8850 }
8851
8852 /* A constant expression in PIC code can be handled just as it
8853 is in non PIC code. */
8854 if (offset_expr.X_op == O_constant)
8855 {
8856 int hipart = 0;
8857
8858 expr1.X_add_number = offset_expr.X_add_number;
8859 normalize_address_expr (&expr1);
8860 if ((offbits == 0 || offbits == 16)
8861 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8862 {
8863 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8864 & ~(bfd_vma) 0xffff);
8865 hipart = 1;
8866 }
8867 else if (offbits == 12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8868 {
8869 expr1.X_add_number = ((expr1.X_add_number + 0x800)
8870 & ~(bfd_vma) 0xfff);
8871 hipart = 1;
8872 }
8873 else if (offbits == 9 && !IS_SEXT_9BIT_NUM (expr1.X_add_number))
8874 {
8875 expr1.X_add_number = ((expr1.X_add_number + 0x100)
8876 & ~(bfd_vma) 0x1ff);
8877 hipart = 1;
8878 }
8879 if (hipart)
8880 {
8881 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8882 if (breg != 0)
8883 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8884 tempreg, tempreg, breg);
8885 breg = tempreg;
8886 }
8887 if (offbits == 0)
8888 {
8889 if (offset_expr.X_add_number == 0)
8890 tempreg = breg;
8891 else
8892 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8893 "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8894 macro_build (NULL, s, fmt, treg, tempreg);
8895 }
8896 else if (offbits == 16)
8897 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8898 else
8899 macro_build (NULL, s, fmt,
8900 treg, (unsigned long) offset_expr.X_add_number, breg);
8901 }
8902 else if (offbits != 16)
8903 {
8904 /* The offset field is too narrow to be used for a low-part
8905 relocation, so load the whole address into the auxillary
8906 register. In the case of "A(b)" addresses, we first load
8907 absolute address "A" into the register and then add base
8908 register "b". In the case of "o(b)" addresses, we simply
8909 need to add 16-bit offset "o" to base register "b", and
8910 offset_reloc already contains the relocations associated
8911 with "o". */
8912 if (ab)
8913 {
8914 load_address (tempreg, &offset_expr, &used_at);
8915 if (breg != 0)
8916 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8917 tempreg, tempreg, breg);
8918 }
8919 else
8920 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8921 tempreg, breg, -1,
8922 offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8923 expr1.X_add_number = 0;
8924 if (offbits == 0)
8925 macro_build (NULL, s, fmt, treg, tempreg);
8926 else
8927 macro_build (NULL, s, fmt,
8928 treg, (unsigned long) expr1.X_add_number, tempreg);
8929 }
8930 else if (mips_pic == NO_PIC)
8931 {
8932 /* If this is a reference to a GP relative symbol, and there
8933 is no base register, we want
8934 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
8935 Otherwise, if there is no base register, we want
8936 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8937 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8938 If we have a constant, we need two instructions anyhow,
8939 so we always use the latter form.
8940
8941 If we have a base register, and this is a reference to a
8942 GP relative symbol, we want
8943 addu $tempreg,$breg,$gp
8944 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
8945 Otherwise we want
8946 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8947 addu $tempreg,$tempreg,$breg
8948 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8949 With a constant we always use the latter case.
8950
8951 With 64bit address space and no base register and $at usable,
8952 we want
8953 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8954 lui $at,<sym> (BFD_RELOC_HI16_S)
8955 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8956 dsll32 $tempreg,0
8957 daddu $tempreg,$at
8958 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8959 If we have a base register, we want
8960 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8961 lui $at,<sym> (BFD_RELOC_HI16_S)
8962 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8963 daddu $at,$breg
8964 dsll32 $tempreg,0
8965 daddu $tempreg,$at
8966 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8967
8968 Without $at we can't generate the optimal path for superscalar
8969 processors here since this would require two temporary registers.
8970 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8971 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8972 dsll $tempreg,16
8973 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
8974 dsll $tempreg,16
8975 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8976 If we have a base register, we want
8977 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8978 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8979 dsll $tempreg,16
8980 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
8981 dsll $tempreg,16
8982 daddu $tempreg,$tempreg,$breg
8983 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8984
8985 For GP relative symbols in 64bit address space we can use
8986 the same sequence as in 32bit address space. */
8987 if (HAVE_64BIT_SYMBOLS)
8988 {
8989 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8990 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8991 {
8992 relax_start (offset_expr.X_add_symbol);
8993 if (breg == 0)
8994 {
8995 macro_build (&offset_expr, s, fmt, treg,
8996 BFD_RELOC_GPREL16, mips_gp_register);
8997 }
8998 else
8999 {
9000 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9001 tempreg, breg, mips_gp_register);
9002 macro_build (&offset_expr, s, fmt, treg,
9003 BFD_RELOC_GPREL16, tempreg);
9004 }
9005 relax_switch ();
9006 }
9007
9008 if (used_at == 0 && mips_opts.at)
9009 {
9010 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9011 BFD_RELOC_MIPS_HIGHEST);
9012 macro_build (&offset_expr, "lui", LUI_FMT, AT,
9013 BFD_RELOC_HI16_S);
9014 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9015 tempreg, BFD_RELOC_MIPS_HIGHER);
9016 if (breg != 0)
9017 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
9018 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
9019 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
9020 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
9021 tempreg);
9022 used_at = 1;
9023 }
9024 else
9025 {
9026 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9027 BFD_RELOC_MIPS_HIGHEST);
9028 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9029 tempreg, BFD_RELOC_MIPS_HIGHER);
9030 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9031 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9032 tempreg, BFD_RELOC_HI16_S);
9033 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9034 if (breg != 0)
9035 macro_build (NULL, "daddu", "d,v,t",
9036 tempreg, tempreg, breg);
9037 macro_build (&offset_expr, s, fmt, treg,
9038 BFD_RELOC_LO16, tempreg);
9039 }
9040
9041 if (mips_relax.sequence)
9042 relax_end ();
9043 break;
9044 }
9045
9046 if (breg == 0)
9047 {
9048 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9049 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9050 {
9051 relax_start (offset_expr.X_add_symbol);
9052 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
9053 mips_gp_register);
9054 relax_switch ();
9055 }
9056 macro_build_lui (&offset_expr, tempreg);
9057 macro_build (&offset_expr, s, fmt, treg,
9058 BFD_RELOC_LO16, tempreg);
9059 if (mips_relax.sequence)
9060 relax_end ();
9061 }
9062 else
9063 {
9064 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9065 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9066 {
9067 relax_start (offset_expr.X_add_symbol);
9068 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9069 tempreg, breg, mips_gp_register);
9070 macro_build (&offset_expr, s, fmt, treg,
9071 BFD_RELOC_GPREL16, tempreg);
9072 relax_switch ();
9073 }
9074 macro_build_lui (&offset_expr, tempreg);
9075 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9076 tempreg, tempreg, breg);
9077 macro_build (&offset_expr, s, fmt, treg,
9078 BFD_RELOC_LO16, tempreg);
9079 if (mips_relax.sequence)
9080 relax_end ();
9081 }
9082 }
9083 else if (!mips_big_got)
9084 {
9085 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
9086
9087 /* If this is a reference to an external symbol, we want
9088 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9089 nop
9090 <op> $treg,0($tempreg)
9091 Otherwise we want
9092 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9093 nop
9094 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9095 <op> $treg,0($tempreg)
9096
9097 For NewABI, we want
9098 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9099 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
9100
9101 If there is a base register, we add it to $tempreg before
9102 the <op>. If there is a constant, we stick it in the
9103 <op> instruction. We don't handle constants larger than
9104 16 bits, because we have no way to load the upper 16 bits
9105 (actually, we could handle them for the subset of cases
9106 in which we are not using $at). */
9107 gas_assert (offset_expr.X_op == O_symbol);
9108 if (HAVE_NEWABI)
9109 {
9110 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9111 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9112 if (breg != 0)
9113 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9114 tempreg, tempreg, breg);
9115 macro_build (&offset_expr, s, fmt, treg,
9116 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9117 break;
9118 }
9119 expr1.X_add_number = offset_expr.X_add_number;
9120 offset_expr.X_add_number = 0;
9121 if (expr1.X_add_number < -0x8000
9122 || expr1.X_add_number >= 0x8000)
9123 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9124 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9125 lw_reloc_type, mips_gp_register);
9126 load_delay_nop ();
9127 relax_start (offset_expr.X_add_symbol);
9128 relax_switch ();
9129 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9130 tempreg, BFD_RELOC_LO16);
9131 relax_end ();
9132 if (breg != 0)
9133 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9134 tempreg, tempreg, breg);
9135 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9136 }
9137 else if (mips_big_got && !HAVE_NEWABI)
9138 {
9139 int gpdelay;
9140
9141 /* If this is a reference to an external symbol, we want
9142 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9143 addu $tempreg,$tempreg,$gp
9144 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9145 <op> $treg,0($tempreg)
9146 Otherwise we want
9147 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9148 nop
9149 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9150 <op> $treg,0($tempreg)
9151 If there is a base register, we add it to $tempreg before
9152 the <op>. If there is a constant, we stick it in the
9153 <op> instruction. We don't handle constants larger than
9154 16 bits, because we have no way to load the upper 16 bits
9155 (actually, we could handle them for the subset of cases
9156 in which we are not using $at). */
9157 gas_assert (offset_expr.X_op == O_symbol);
9158 expr1.X_add_number = offset_expr.X_add_number;
9159 offset_expr.X_add_number = 0;
9160 if (expr1.X_add_number < -0x8000
9161 || expr1.X_add_number >= 0x8000)
9162 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9163 gpdelay = reg_needs_delay (mips_gp_register);
9164 relax_start (offset_expr.X_add_symbol);
9165 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9166 BFD_RELOC_MIPS_GOT_HI16);
9167 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9168 mips_gp_register);
9169 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9170 BFD_RELOC_MIPS_GOT_LO16, tempreg);
9171 relax_switch ();
9172 if (gpdelay)
9173 macro_build (NULL, "nop", "");
9174 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9175 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9176 load_delay_nop ();
9177 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9178 tempreg, BFD_RELOC_LO16);
9179 relax_end ();
9180
9181 if (breg != 0)
9182 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9183 tempreg, tempreg, breg);
9184 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9185 }
9186 else if (mips_big_got && HAVE_NEWABI)
9187 {
9188 /* If this is a reference to an external symbol, we want
9189 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9190 add $tempreg,$tempreg,$gp
9191 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9192 <op> $treg,<ofst>($tempreg)
9193 Otherwise, for local symbols, we want:
9194 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9195 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
9196 gas_assert (offset_expr.X_op == O_symbol);
9197 expr1.X_add_number = offset_expr.X_add_number;
9198 offset_expr.X_add_number = 0;
9199 if (expr1.X_add_number < -0x8000
9200 || expr1.X_add_number >= 0x8000)
9201 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9202 relax_start (offset_expr.X_add_symbol);
9203 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9204 BFD_RELOC_MIPS_GOT_HI16);
9205 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9206 mips_gp_register);
9207 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9208 BFD_RELOC_MIPS_GOT_LO16, tempreg);
9209 if (breg != 0)
9210 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9211 tempreg, tempreg, breg);
9212 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9213
9214 relax_switch ();
9215 offset_expr.X_add_number = expr1.X_add_number;
9216 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9217 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9218 if (breg != 0)
9219 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9220 tempreg, tempreg, breg);
9221 macro_build (&offset_expr, s, fmt, treg,
9222 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9223 relax_end ();
9224 }
9225 else
9226 abort ();
9227
9228 break;
9229
9230 case M_LI:
9231 case M_LI_S:
9232 load_register (treg, &imm_expr, 0);
9233 break;
9234
9235 case M_DLI:
9236 load_register (treg, &imm_expr, 1);
9237 break;
9238
9239 case M_LI_SS:
9240 if (imm_expr.X_op == O_constant)
9241 {
9242 used_at = 1;
9243 load_register (AT, &imm_expr, 0);
9244 macro_build (NULL, "mtc1", "t,G", AT, treg);
9245 break;
9246 }
9247 else
9248 {
9249 gas_assert (offset_expr.X_op == O_symbol
9250 && strcmp (segment_name (S_GET_SEGMENT
9251 (offset_expr.X_add_symbol)),
9252 ".lit4") == 0
9253 && offset_expr.X_add_number == 0);
9254 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
9255 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9256 break;
9257 }
9258
9259 case M_LI_D:
9260 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
9261 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
9262 order 32 bits of the value and the low order 32 bits are either
9263 zero or in OFFSET_EXPR. */
9264 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9265 {
9266 if (HAVE_64BIT_GPRS)
9267 load_register (treg, &imm_expr, 1);
9268 else
9269 {
9270 int hreg, lreg;
9271
9272 if (target_big_endian)
9273 {
9274 hreg = treg;
9275 lreg = treg + 1;
9276 }
9277 else
9278 {
9279 hreg = treg + 1;
9280 lreg = treg;
9281 }
9282
9283 if (hreg <= 31)
9284 load_register (hreg, &imm_expr, 0);
9285 if (lreg <= 31)
9286 {
9287 if (offset_expr.X_op == O_absent)
9288 move_register (lreg, 0);
9289 else
9290 {
9291 gas_assert (offset_expr.X_op == O_constant);
9292 load_register (lreg, &offset_expr, 0);
9293 }
9294 }
9295 }
9296 break;
9297 }
9298
9299 /* We know that sym is in the .rdata section. First we get the
9300 upper 16 bits of the address. */
9301 if (mips_pic == NO_PIC)
9302 {
9303 macro_build_lui (&offset_expr, AT);
9304 used_at = 1;
9305 }
9306 else
9307 {
9308 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9309 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9310 used_at = 1;
9311 }
9312
9313 /* Now we load the register(s). */
9314 if (HAVE_64BIT_GPRS)
9315 {
9316 used_at = 1;
9317 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9318 }
9319 else
9320 {
9321 used_at = 1;
9322 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9323 if (treg != RA)
9324 {
9325 /* FIXME: How in the world do we deal with the possible
9326 overflow here? */
9327 offset_expr.X_add_number += 4;
9328 macro_build (&offset_expr, "lw", "t,o(b)",
9329 treg + 1, BFD_RELOC_LO16, AT);
9330 }
9331 }
9332 break;
9333
9334 case M_LI_DD:
9335 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
9336 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
9337 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
9338 the value and the low order 32 bits are either zero or in
9339 OFFSET_EXPR. */
9340 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9341 {
9342 used_at = 1;
9343 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
9344 if (HAVE_64BIT_FPRS)
9345 {
9346 gas_assert (HAVE_64BIT_GPRS);
9347 macro_build (NULL, "dmtc1", "t,S", AT, treg);
9348 }
9349 else
9350 {
9351 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
9352 if (offset_expr.X_op == O_absent)
9353 macro_build (NULL, "mtc1", "t,G", 0, treg);
9354 else
9355 {
9356 gas_assert (offset_expr.X_op == O_constant);
9357 load_register (AT, &offset_expr, 0);
9358 macro_build (NULL, "mtc1", "t,G", AT, treg);
9359 }
9360 }
9361 break;
9362 }
9363
9364 gas_assert (offset_expr.X_op == O_symbol
9365 && offset_expr.X_add_number == 0);
9366 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
9367 if (strcmp (s, ".lit8") == 0)
9368 {
9369 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9370 {
9371 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
9372 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9373 break;
9374 }
9375 breg = mips_gp_register;
9376 r = BFD_RELOC_MIPS_LITERAL;
9377 goto dob;
9378 }
9379 else
9380 {
9381 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
9382 used_at = 1;
9383 if (mips_pic != NO_PIC)
9384 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9385 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9386 else
9387 {
9388 /* FIXME: This won't work for a 64 bit address. */
9389 macro_build_lui (&offset_expr, AT);
9390 }
9391
9392 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9393 {
9394 macro_build (&offset_expr, "ldc1", "T,o(b)",
9395 treg, BFD_RELOC_LO16, AT);
9396 break;
9397 }
9398 breg = AT;
9399 r = BFD_RELOC_LO16;
9400 goto dob;
9401 }
9402
9403 case M_L_DOB:
9404 /* Even on a big endian machine $fn comes before $fn+1. We have
9405 to adjust when loading from memory. */
9406 r = BFD_RELOC_LO16;
9407 dob:
9408 gas_assert (!mips_opts.micromips);
9409 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9410 macro_build (&offset_expr, "lwc1", "T,o(b)",
9411 target_big_endian ? treg + 1 : treg, r, breg);
9412 /* FIXME: A possible overflow which I don't know how to deal
9413 with. */
9414 offset_expr.X_add_number += 4;
9415 macro_build (&offset_expr, "lwc1", "T,o(b)",
9416 target_big_endian ? treg : treg + 1, r, breg);
9417 break;
9418
9419 case M_S_DOB:
9420 gas_assert (!mips_opts.micromips);
9421 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9422 /* Even on a big endian machine $fn comes before $fn+1. We have
9423 to adjust when storing to memory. */
9424 macro_build (&offset_expr, "swc1", "T,o(b)",
9425 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9426 offset_expr.X_add_number += 4;
9427 macro_build (&offset_expr, "swc1", "T,o(b)",
9428 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9429 break;
9430
9431 case M_L_DAB:
9432 gas_assert (!mips_opts.micromips);
9433 /*
9434 * The MIPS assembler seems to check for X_add_number not
9435 * being double aligned and generating:
9436 * lui at,%hi(foo+1)
9437 * addu at,at,v1
9438 * addiu at,at,%lo(foo+1)
9439 * lwc1 f2,0(at)
9440 * lwc1 f3,4(at)
9441 * But, the resulting address is the same after relocation so why
9442 * generate the extra instruction?
9443 */
9444 /* Itbl support may require additional care here. */
9445 coproc = 1;
9446 fmt = "T,o(b)";
9447 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9448 {
9449 s = "ldc1";
9450 goto ld_st;
9451 }
9452 s = "lwc1";
9453 goto ldd_std;
9454
9455 case M_S_DAB:
9456 gas_assert (!mips_opts.micromips);
9457 /* Itbl support may require additional care here. */
9458 coproc = 1;
9459 fmt = "T,o(b)";
9460 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9461 {
9462 s = "sdc1";
9463 goto ld_st;
9464 }
9465 s = "swc1";
9466 goto ldd_std;
9467
9468 case M_LQ_AB:
9469 fmt = "t,o(b)";
9470 s = "lq";
9471 goto ld;
9472
9473 case M_SQ_AB:
9474 fmt = "t,o(b)";
9475 s = "sq";
9476 goto ld_st;
9477
9478 case M_LD_AB:
9479 fmt = "t,o(b)";
9480 if (HAVE_64BIT_GPRS)
9481 {
9482 s = "ld";
9483 goto ld;
9484 }
9485 s = "lw";
9486 goto ldd_std;
9487
9488 case M_SD_AB:
9489 fmt = "t,o(b)";
9490 if (HAVE_64BIT_GPRS)
9491 {
9492 s = "sd";
9493 goto ld_st;
9494 }
9495 s = "sw";
9496
9497 ldd_std:
9498 if (offset_expr.X_op != O_symbol
9499 && offset_expr.X_op != O_constant)
9500 {
9501 as_bad (_("Expression too complex"));
9502 offset_expr.X_op = O_constant;
9503 }
9504
9505 if (HAVE_32BIT_ADDRESSES
9506 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9507 {
9508 char value [32];
9509
9510 sprintf_vma (value, offset_expr.X_add_number);
9511 as_bad (_("Number (0x%s) larger than 32 bits"), value);
9512 }
9513
9514 /* Even on a big endian machine $fn comes before $fn+1. We have
9515 to adjust when loading from memory. We set coproc if we must
9516 load $fn+1 first. */
9517 /* Itbl support may require additional care here. */
9518 if (!target_big_endian)
9519 coproc = 0;
9520
9521 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9522 {
9523 /* If this is a reference to a GP relative symbol, we want
9524 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
9525 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
9526 If we have a base register, we use this
9527 addu $at,$breg,$gp
9528 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
9529 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
9530 If this is not a GP relative symbol, we want
9531 lui $at,<sym> (BFD_RELOC_HI16_S)
9532 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9533 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9534 If there is a base register, we add it to $at after the
9535 lui instruction. If there is a constant, we always use
9536 the last case. */
9537 if (offset_expr.X_op == O_symbol
9538 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9539 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9540 {
9541 relax_start (offset_expr.X_add_symbol);
9542 if (breg == 0)
9543 {
9544 tempreg = mips_gp_register;
9545 }
9546 else
9547 {
9548 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9549 AT, breg, mips_gp_register);
9550 tempreg = AT;
9551 used_at = 1;
9552 }
9553
9554 /* Itbl support may require additional care here. */
9555 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9556 BFD_RELOC_GPREL16, tempreg);
9557 offset_expr.X_add_number += 4;
9558
9559 /* Set mips_optimize to 2 to avoid inserting an
9560 undesired nop. */
9561 hold_mips_optimize = mips_optimize;
9562 mips_optimize = 2;
9563 /* Itbl support may require additional care here. */
9564 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9565 BFD_RELOC_GPREL16, tempreg);
9566 mips_optimize = hold_mips_optimize;
9567
9568 relax_switch ();
9569
9570 offset_expr.X_add_number -= 4;
9571 }
9572 used_at = 1;
9573 macro_build_lui (&offset_expr, AT);
9574 if (breg != 0)
9575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9576 /* Itbl support may require additional care here. */
9577 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9578 BFD_RELOC_LO16, AT);
9579 /* FIXME: How do we handle overflow here? */
9580 offset_expr.X_add_number += 4;
9581 /* Itbl support may require additional care here. */
9582 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9583 BFD_RELOC_LO16, AT);
9584 if (mips_relax.sequence)
9585 relax_end ();
9586 }
9587 else if (!mips_big_got)
9588 {
9589 /* If this is a reference to an external symbol, we want
9590 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9591 nop
9592 <op> $treg,0($at)
9593 <op> $treg+1,4($at)
9594 Otherwise we want
9595 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9596 nop
9597 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9598 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9599 If there is a base register we add it to $at before the
9600 lwc1 instructions. If there is a constant we include it
9601 in the lwc1 instructions. */
9602 used_at = 1;
9603 expr1.X_add_number = offset_expr.X_add_number;
9604 if (expr1.X_add_number < -0x8000
9605 || expr1.X_add_number >= 0x8000 - 4)
9606 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9607 load_got_offset (AT, &offset_expr);
9608 load_delay_nop ();
9609 if (breg != 0)
9610 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9611
9612 /* Set mips_optimize to 2 to avoid inserting an undesired
9613 nop. */
9614 hold_mips_optimize = mips_optimize;
9615 mips_optimize = 2;
9616
9617 /* Itbl support may require additional care here. */
9618 relax_start (offset_expr.X_add_symbol);
9619 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9620 BFD_RELOC_LO16, AT);
9621 expr1.X_add_number += 4;
9622 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9623 BFD_RELOC_LO16, AT);
9624 relax_switch ();
9625 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9626 BFD_RELOC_LO16, AT);
9627 offset_expr.X_add_number += 4;
9628 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9629 BFD_RELOC_LO16, AT);
9630 relax_end ();
9631
9632 mips_optimize = hold_mips_optimize;
9633 }
9634 else if (mips_big_got)
9635 {
9636 int gpdelay;
9637
9638 /* If this is a reference to an external symbol, we want
9639 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9640 addu $at,$at,$gp
9641 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
9642 nop
9643 <op> $treg,0($at)
9644 <op> $treg+1,4($at)
9645 Otherwise we want
9646 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9647 nop
9648 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9649 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9650 If there is a base register we add it to $at before the
9651 lwc1 instructions. If there is a constant we include it
9652 in the lwc1 instructions. */
9653 used_at = 1;
9654 expr1.X_add_number = offset_expr.X_add_number;
9655 offset_expr.X_add_number = 0;
9656 if (expr1.X_add_number < -0x8000
9657 || expr1.X_add_number >= 0x8000 - 4)
9658 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9659 gpdelay = reg_needs_delay (mips_gp_register);
9660 relax_start (offset_expr.X_add_symbol);
9661 macro_build (&offset_expr, "lui", LUI_FMT,
9662 AT, BFD_RELOC_MIPS_GOT_HI16);
9663 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9664 AT, AT, mips_gp_register);
9665 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9666 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9667 load_delay_nop ();
9668 if (breg != 0)
9669 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9670 /* Itbl support may require additional care here. */
9671 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9672 BFD_RELOC_LO16, AT);
9673 expr1.X_add_number += 4;
9674
9675 /* Set mips_optimize to 2 to avoid inserting an undesired
9676 nop. */
9677 hold_mips_optimize = mips_optimize;
9678 mips_optimize = 2;
9679 /* Itbl support may require additional care here. */
9680 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9681 BFD_RELOC_LO16, AT);
9682 mips_optimize = hold_mips_optimize;
9683 expr1.X_add_number -= 4;
9684
9685 relax_switch ();
9686 offset_expr.X_add_number = expr1.X_add_number;
9687 if (gpdelay)
9688 macro_build (NULL, "nop", "");
9689 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9690 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9691 load_delay_nop ();
9692 if (breg != 0)
9693 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9694 /* Itbl support may require additional care here. */
9695 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9696 BFD_RELOC_LO16, AT);
9697 offset_expr.X_add_number += 4;
9698
9699 /* Set mips_optimize to 2 to avoid inserting an undesired
9700 nop. */
9701 hold_mips_optimize = mips_optimize;
9702 mips_optimize = 2;
9703 /* Itbl support may require additional care here. */
9704 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9705 BFD_RELOC_LO16, AT);
9706 mips_optimize = hold_mips_optimize;
9707 relax_end ();
9708 }
9709 else
9710 abort ();
9711
9712 break;
9713
9714 case M_LD_OB:
9715 s = HAVE_64BIT_GPRS ? "ld" : "lw";
9716 goto sd_ob;
9717 case M_SD_OB:
9718 s = HAVE_64BIT_GPRS ? "sd" : "sw";
9719 sd_ob:
9720 macro_build (&offset_expr, s, "t,o(b)", treg,
9721 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9722 breg);
9723 if (!HAVE_64BIT_GPRS)
9724 {
9725 offset_expr.X_add_number += 4;
9726 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9727 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9728 breg);
9729 }
9730 break;
9731
9732
9733 case M_SAA_AB:
9734 ab = 1;
9735 case M_SAA_OB:
9736 s = "saa";
9737 offbits = 0;
9738 fmt = "t,(b)";
9739 goto ld_st;
9740 case M_SAAD_AB:
9741 ab = 1;
9742 case M_SAAD_OB:
9743 s = "saad";
9744 offbits = 0;
9745 fmt = "t,(b)";
9746 goto ld_st;
9747
9748 /* New code added to support COPZ instructions.
9749 This code builds table entries out of the macros in mip_opcodes.
9750 R4000 uses interlocks to handle coproc delays.
9751 Other chips (like the R3000) require nops to be inserted for delays.
9752
9753 FIXME: Currently, we require that the user handle delays.
9754 In order to fill delay slots for non-interlocked chips,
9755 we must have a way to specify delays based on the coprocessor.
9756 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9757 What are the side-effects of the cop instruction?
9758 What cache support might we have and what are its effects?
9759 Both coprocessor & memory require delays. how long???
9760 What registers are read/set/modified?
9761
9762 If an itbl is provided to interpret cop instructions,
9763 this knowledge can be encoded in the itbl spec. */
9764
9765 case M_COP0:
9766 s = "c0";
9767 goto copz;
9768 case M_COP1:
9769 s = "c1";
9770 goto copz;
9771 case M_COP2:
9772 s = "c2";
9773 goto copz;
9774 case M_COP3:
9775 s = "c3";
9776 copz:
9777 gas_assert (!mips_opts.micromips);
9778 /* For now we just do C (same as Cz). The parameter will be
9779 stored in insn_opcode by mips_ip. */
9780 macro_build (NULL, s, "C", ip->insn_opcode);
9781 break;
9782
9783 case M_MOVE:
9784 move_register (dreg, sreg);
9785 break;
9786
9787 case M_DMUL:
9788 dbl = 1;
9789 case M_MUL:
9790 if (mips_opts.arch == CPU_R5900)
9791 {
9792 macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9793 }
9794 else
9795 {
9796 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9797 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9798 }
9799 break;
9800
9801 case M_DMUL_I:
9802 dbl = 1;
9803 case M_MUL_I:
9804 /* The MIPS assembler some times generates shifts and adds. I'm
9805 not trying to be that fancy. GCC should do this for us
9806 anyway. */
9807 used_at = 1;
9808 load_register (AT, &imm_expr, dbl);
9809 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9810 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9811 break;
9812
9813 case M_DMULO_I:
9814 dbl = 1;
9815 case M_MULO_I:
9816 imm = 1;
9817 goto do_mulo;
9818
9819 case M_DMULO:
9820 dbl = 1;
9821 case M_MULO:
9822 do_mulo:
9823 start_noreorder ();
9824 used_at = 1;
9825 if (imm)
9826 load_register (AT, &imm_expr, dbl);
9827 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9828 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9829 macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9830 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9831 if (mips_trap)
9832 macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9833 else
9834 {
9835 if (mips_opts.micromips)
9836 micromips_label_expr (&label_expr);
9837 else
9838 label_expr.X_add_number = 8;
9839 macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9840 macro_build (NULL, "nop", "");
9841 macro_build (NULL, "break", BRK_FMT, 6);
9842 if (mips_opts.micromips)
9843 micromips_add_label ();
9844 }
9845 end_noreorder ();
9846 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9847 break;
9848
9849 case M_DMULOU_I:
9850 dbl = 1;
9851 case M_MULOU_I:
9852 imm = 1;
9853 goto do_mulou;
9854
9855 case M_DMULOU:
9856 dbl = 1;
9857 case M_MULOU:
9858 do_mulou:
9859 start_noreorder ();
9860 used_at = 1;
9861 if (imm)
9862 load_register (AT, &imm_expr, dbl);
9863 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9864 sreg, imm ? AT : treg);
9865 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9866 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9867 if (mips_trap)
9868 macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9869 else
9870 {
9871 if (mips_opts.micromips)
9872 micromips_label_expr (&label_expr);
9873 else
9874 label_expr.X_add_number = 8;
9875 macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9876 macro_build (NULL, "nop", "");
9877 macro_build (NULL, "break", BRK_FMT, 6);
9878 if (mips_opts.micromips)
9879 micromips_add_label ();
9880 }
9881 end_noreorder ();
9882 break;
9883
9884 case M_DROL:
9885 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9886 {
9887 if (dreg == sreg)
9888 {
9889 tempreg = AT;
9890 used_at = 1;
9891 }
9892 else
9893 {
9894 tempreg = dreg;
9895 }
9896 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9897 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9898 break;
9899 }
9900 used_at = 1;
9901 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9902 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9903 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9904 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9905 break;
9906
9907 case M_ROL:
9908 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9909 {
9910 if (dreg == sreg)
9911 {
9912 tempreg = AT;
9913 used_at = 1;
9914 }
9915 else
9916 {
9917 tempreg = dreg;
9918 }
9919 macro_build (NULL, "negu", "d,w", tempreg, treg);
9920 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9921 break;
9922 }
9923 used_at = 1;
9924 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9925 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9926 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9927 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9928 break;
9929
9930 case M_DROL_I:
9931 {
9932 unsigned int rot;
9933 char *l;
9934 char *rr;
9935
9936 if (imm_expr.X_op != O_constant)
9937 as_bad (_("Improper rotate count"));
9938 rot = imm_expr.X_add_number & 0x3f;
9939 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9940 {
9941 rot = (64 - rot) & 0x3f;
9942 if (rot >= 32)
9943 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9944 else
9945 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9946 break;
9947 }
9948 if (rot == 0)
9949 {
9950 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9951 break;
9952 }
9953 l = (rot < 0x20) ? "dsll" : "dsll32";
9954 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9955 rot &= 0x1f;
9956 used_at = 1;
9957 macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9958 macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9959 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9960 }
9961 break;
9962
9963 case M_ROL_I:
9964 {
9965 unsigned int rot;
9966
9967 if (imm_expr.X_op != O_constant)
9968 as_bad (_("Improper rotate count"));
9969 rot = imm_expr.X_add_number & 0x1f;
9970 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9971 {
9972 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9973 break;
9974 }
9975 if (rot == 0)
9976 {
9977 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9978 break;
9979 }
9980 used_at = 1;
9981 macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9982 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9983 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9984 }
9985 break;
9986
9987 case M_DROR:
9988 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9989 {
9990 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9991 break;
9992 }
9993 used_at = 1;
9994 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9995 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9996 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9997 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9998 break;
9999
10000 case M_ROR:
10001 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10002 {
10003 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
10004 break;
10005 }
10006 used_at = 1;
10007 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
10008 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
10009 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
10010 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10011 break;
10012
10013 case M_DROR_I:
10014 {
10015 unsigned int rot;
10016 char *l;
10017 char *rr;
10018
10019 if (imm_expr.X_op != O_constant)
10020 as_bad (_("Improper rotate count"));
10021 rot = imm_expr.X_add_number & 0x3f;
10022 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10023 {
10024 if (rot >= 32)
10025 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10026 else
10027 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10028 break;
10029 }
10030 if (rot == 0)
10031 {
10032 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10033 break;
10034 }
10035 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
10036 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
10037 rot &= 0x1f;
10038 used_at = 1;
10039 macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
10040 macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10041 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10042 }
10043 break;
10044
10045 case M_ROR_I:
10046 {
10047 unsigned int rot;
10048
10049 if (imm_expr.X_op != O_constant)
10050 as_bad (_("Improper rotate count"));
10051 rot = imm_expr.X_add_number & 0x1f;
10052 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10053 {
10054 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
10055 break;
10056 }
10057 if (rot == 0)
10058 {
10059 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10060 break;
10061 }
10062 used_at = 1;
10063 macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
10064 macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10065 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10066 }
10067 break;
10068
10069 case M_SEQ:
10070 if (sreg == 0)
10071 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
10072 else if (treg == 0)
10073 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10074 else
10075 {
10076 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10077 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10078 }
10079 break;
10080
10081 case M_SEQ_I:
10082 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10083 {
10084 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10085 break;
10086 }
10087 if (sreg == 0)
10088 {
10089 as_warn (_("Instruction %s: result is always false"),
10090 ip->insn_mo->name);
10091 move_register (dreg, 0);
10092 break;
10093 }
10094 if (CPU_HAS_SEQ (mips_opts.arch)
10095 && -512 <= imm_expr.X_add_number
10096 && imm_expr.X_add_number < 512)
10097 {
10098 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
10099 (int) imm_expr.X_add_number);
10100 break;
10101 }
10102 if (imm_expr.X_op == O_constant
10103 && imm_expr.X_add_number >= 0
10104 && imm_expr.X_add_number < 0x10000)
10105 {
10106 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10107 }
10108 else if (imm_expr.X_op == O_constant
10109 && imm_expr.X_add_number > -0x8000
10110 && imm_expr.X_add_number < 0)
10111 {
10112 imm_expr.X_add_number = -imm_expr.X_add_number;
10113 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10114 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10115 }
10116 else if (CPU_HAS_SEQ (mips_opts.arch))
10117 {
10118 used_at = 1;
10119 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10120 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
10121 break;
10122 }
10123 else
10124 {
10125 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10126 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10127 used_at = 1;
10128 }
10129 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10130 break;
10131
10132 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
10133 s = "slt";
10134 goto sge;
10135 case M_SGEU:
10136 s = "sltu";
10137 sge:
10138 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
10139 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10140 break;
10141
10142 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
10143 case M_SGEU_I:
10144 if (imm_expr.X_op == O_constant
10145 && imm_expr.X_add_number >= -0x8000
10146 && imm_expr.X_add_number < 0x8000)
10147 {
10148 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
10149 dreg, sreg, BFD_RELOC_LO16);
10150 }
10151 else
10152 {
10153 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10154 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
10155 dreg, sreg, AT);
10156 used_at = 1;
10157 }
10158 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10159 break;
10160
10161 case M_SGT: /* sreg > treg <==> treg < sreg */
10162 s = "slt";
10163 goto sgt;
10164 case M_SGTU:
10165 s = "sltu";
10166 sgt:
10167 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10168 break;
10169
10170 case M_SGT_I: /* sreg > I <==> I < sreg */
10171 s = "slt";
10172 goto sgti;
10173 case M_SGTU_I:
10174 s = "sltu";
10175 sgti:
10176 used_at = 1;
10177 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10178 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10179 break;
10180
10181 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
10182 s = "slt";
10183 goto sle;
10184 case M_SLEU:
10185 s = "sltu";
10186 sle:
10187 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10188 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10189 break;
10190
10191 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
10192 s = "slt";
10193 goto slei;
10194 case M_SLEU_I:
10195 s = "sltu";
10196 slei:
10197 used_at = 1;
10198 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10199 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10200 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10201 break;
10202
10203 case M_SLT_I:
10204 if (imm_expr.X_op == O_constant
10205 && imm_expr.X_add_number >= -0x8000
10206 && imm_expr.X_add_number < 0x8000)
10207 {
10208 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10209 break;
10210 }
10211 used_at = 1;
10212 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10213 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
10214 break;
10215
10216 case M_SLTU_I:
10217 if (imm_expr.X_op == O_constant
10218 && imm_expr.X_add_number >= -0x8000
10219 && imm_expr.X_add_number < 0x8000)
10220 {
10221 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
10222 BFD_RELOC_LO16);
10223 break;
10224 }
10225 used_at = 1;
10226 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10227 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
10228 break;
10229
10230 case M_SNE:
10231 if (sreg == 0)
10232 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
10233 else if (treg == 0)
10234 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10235 else
10236 {
10237 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10238 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10239 }
10240 break;
10241
10242 case M_SNE_I:
10243 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10244 {
10245 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10246 break;
10247 }
10248 if (sreg == 0)
10249 {
10250 as_warn (_("Instruction %s: result is always true"),
10251 ip->insn_mo->name);
10252 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
10253 dreg, 0, BFD_RELOC_LO16);
10254 break;
10255 }
10256 if (CPU_HAS_SEQ (mips_opts.arch)
10257 && -512 <= imm_expr.X_add_number
10258 && imm_expr.X_add_number < 512)
10259 {
10260 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
10261 (int) imm_expr.X_add_number);
10262 break;
10263 }
10264 if (imm_expr.X_op == O_constant
10265 && imm_expr.X_add_number >= 0
10266 && imm_expr.X_add_number < 0x10000)
10267 {
10268 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10269 }
10270 else if (imm_expr.X_op == O_constant
10271 && imm_expr.X_add_number > -0x8000
10272 && imm_expr.X_add_number < 0)
10273 {
10274 imm_expr.X_add_number = -imm_expr.X_add_number;
10275 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10276 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10277 }
10278 else if (CPU_HAS_SEQ (mips_opts.arch))
10279 {
10280 used_at = 1;
10281 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10282 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
10283 break;
10284 }
10285 else
10286 {
10287 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10288 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10289 used_at = 1;
10290 }
10291 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10292 break;
10293
10294 case M_SUB_I:
10295 s = "addi";
10296 s2 = "sub";
10297 goto do_subi;
10298 case M_SUBU_I:
10299 s = "addiu";
10300 s2 = "subu";
10301 goto do_subi;
10302 case M_DSUB_I:
10303 dbl = 1;
10304 s = "daddi";
10305 s2 = "dsub";
10306 if (!mips_opts.micromips)
10307 goto do_subi;
10308 if (imm_expr.X_op == O_constant
10309 && imm_expr.X_add_number > -0x200
10310 && imm_expr.X_add_number <= 0x200)
10311 {
10312 macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
10313 break;
10314 }
10315 goto do_subi_i;
10316 case M_DSUBU_I:
10317 dbl = 1;
10318 s = "daddiu";
10319 s2 = "dsubu";
10320 do_subi:
10321 if (imm_expr.X_op == O_constant
10322 && imm_expr.X_add_number > -0x8000
10323 && imm_expr.X_add_number <= 0x8000)
10324 {
10325 imm_expr.X_add_number = -imm_expr.X_add_number;
10326 macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10327 break;
10328 }
10329 do_subi_i:
10330 used_at = 1;
10331 load_register (AT, &imm_expr, dbl);
10332 macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
10333 break;
10334
10335 case M_TEQ_I:
10336 s = "teq";
10337 goto trap;
10338 case M_TGE_I:
10339 s = "tge";
10340 goto trap;
10341 case M_TGEU_I:
10342 s = "tgeu";
10343 goto trap;
10344 case M_TLT_I:
10345 s = "tlt";
10346 goto trap;
10347 case M_TLTU_I:
10348 s = "tltu";
10349 goto trap;
10350 case M_TNE_I:
10351 s = "tne";
10352 trap:
10353 used_at = 1;
10354 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10355 macro_build (NULL, s, "s,t", sreg, AT);
10356 break;
10357
10358 case M_TRUNCWS:
10359 case M_TRUNCWD:
10360 gas_assert (!mips_opts.micromips);
10361 gas_assert (mips_opts.isa == ISA_MIPS1);
10362 used_at = 1;
10363 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
10364 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
10365
10366 /*
10367 * Is the double cfc1 instruction a bug in the mips assembler;
10368 * or is there a reason for it?
10369 */
10370 start_noreorder ();
10371 macro_build (NULL, "cfc1", "t,G", treg, RA);
10372 macro_build (NULL, "cfc1", "t,G", treg, RA);
10373 macro_build (NULL, "nop", "");
10374 expr1.X_add_number = 3;
10375 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
10376 expr1.X_add_number = 2;
10377 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
10378 macro_build (NULL, "ctc1", "t,G", AT, RA);
10379 macro_build (NULL, "nop", "");
10380 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
10381 dreg, sreg);
10382 macro_build (NULL, "ctc1", "t,G", treg, RA);
10383 macro_build (NULL, "nop", "");
10384 end_noreorder ();
10385 break;
10386
10387 case M_ULH_A:
10388 ab = 1;
10389 case M_ULH:
10390 s = "lb";
10391 s2 = "lbu";
10392 off = 1;
10393 goto uld_st;
10394 case M_ULHU_A:
10395 ab = 1;
10396 case M_ULHU:
10397 s = "lbu";
10398 s2 = "lbu";
10399 off = 1;
10400 goto uld_st;
10401 case M_ULW_A:
10402 ab = 1;
10403 case M_ULW:
10404 s = "lwl";
10405 s2 = "lwr";
10406 offbits = (mips_opts.micromips ? 12 : 16);
10407 off = 3;
10408 goto uld_st;
10409 case M_ULD_A:
10410 ab = 1;
10411 case M_ULD:
10412 s = "ldl";
10413 s2 = "ldr";
10414 offbits = (mips_opts.micromips ? 12 : 16);
10415 off = 7;
10416 goto uld_st;
10417 case M_USH_A:
10418 ab = 1;
10419 case M_USH:
10420 s = "sb";
10421 s2 = "sb";
10422 off = 1;
10423 ust = 1;
10424 goto uld_st;
10425 case M_USW_A:
10426 ab = 1;
10427 case M_USW:
10428 s = "swl";
10429 s2 = "swr";
10430 offbits = (mips_opts.micromips ? 12 : 16);
10431 off = 3;
10432 ust = 1;
10433 goto uld_st;
10434 case M_USD_A:
10435 ab = 1;
10436 case M_USD:
10437 s = "sdl";
10438 s2 = "sdr";
10439 offbits = (mips_opts.micromips ? 12 : 16);
10440 off = 7;
10441 ust = 1;
10442
10443 uld_st:
10444 if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10445 as_bad (_("Operand overflow"));
10446
10447 ep = &offset_expr;
10448 expr1.X_add_number = 0;
10449 if (ab)
10450 {
10451 used_at = 1;
10452 tempreg = AT;
10453 load_address (tempreg, ep, &used_at);
10454 if (breg != 0)
10455 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10456 tempreg, tempreg, breg);
10457 breg = tempreg;
10458 tempreg = treg;
10459 ep = &expr1;
10460 }
10461 else if (offbits == 12
10462 && (offset_expr.X_op != O_constant
10463 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10464 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10465 {
10466 used_at = 1;
10467 tempreg = AT;
10468 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10469 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10470 breg = tempreg;
10471 tempreg = treg;
10472 ep = &expr1;
10473 }
10474 else if (!ust && treg == breg)
10475 {
10476 used_at = 1;
10477 tempreg = AT;
10478 }
10479 else
10480 tempreg = treg;
10481
10482 if (off == 1)
10483 goto ulh_sh;
10484
10485 if (!target_big_endian)
10486 ep->X_add_number += off;
10487 if (offbits != 12)
10488 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10489 else
10490 macro_build (NULL, s, "t,~(b)",
10491 tempreg, (unsigned long) ep->X_add_number, breg);
10492
10493 if (!target_big_endian)
10494 ep->X_add_number -= off;
10495 else
10496 ep->X_add_number += off;
10497 if (offbits != 12)
10498 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10499 else
10500 macro_build (NULL, s2, "t,~(b)",
10501 tempreg, (unsigned long) ep->X_add_number, breg);
10502
10503 /* If necessary, move the result in tempreg to the final destination. */
10504 if (!ust && treg != tempreg)
10505 {
10506 /* Protect second load's delay slot. */
10507 load_delay_nop ();
10508 move_register (treg, tempreg);
10509 }
10510 break;
10511
10512 ulh_sh:
10513 used_at = 1;
10514 if (target_big_endian == ust)
10515 ep->X_add_number += off;
10516 tempreg = ust || ab ? treg : AT;
10517 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10518
10519 /* For halfword transfers we need a temporary register to shuffle
10520 bytes. Unfortunately for M_USH_A we have none available before
10521 the next store as AT holds the base address. We deal with this
10522 case by clobbering TREG and then restoring it as with ULH. */
10523 tempreg = ust == ab ? treg : AT;
10524 if (ust)
10525 macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10526
10527 if (target_big_endian == ust)
10528 ep->X_add_number -= off;
10529 else
10530 ep->X_add_number += off;
10531 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10532
10533 /* For M_USH_A re-retrieve the LSB. */
10534 if (ust && ab)
10535 {
10536 if (target_big_endian)
10537 ep->X_add_number += off;
10538 else
10539 ep->X_add_number -= off;
10540 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10541 }
10542 /* For ULH and M_USH_A OR the LSB in. */
10543 if (!ust || ab)
10544 {
10545 tempreg = !ab ? AT : treg;
10546 macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10547 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10548 }
10549 break;
10550
10551 default:
10552 /* FIXME: Check if this is one of the itbl macros, since they
10553 are added dynamically. */
10554 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10555 break;
10556 }
10557 if (!mips_opts.at && used_at)
10558 as_bad (_("Macro used $at after \".set noat\""));
10559 }
10560
10561 /* Implement macros in mips16 mode. */
10562
10563 static void
10564 mips16_macro (struct mips_cl_insn *ip)
10565 {
10566 int mask;
10567 int xreg, yreg, zreg, tmp;
10568 expressionS expr1;
10569 int dbl;
10570 const char *s, *s2, *s3;
10571
10572 mask = ip->insn_mo->mask;
10573
10574 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10575 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10576 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10577
10578 expr1.X_op = O_constant;
10579 expr1.X_op_symbol = NULL;
10580 expr1.X_add_symbol = NULL;
10581 expr1.X_add_number = 1;
10582
10583 dbl = 0;
10584
10585 switch (mask)
10586 {
10587 default:
10588 abort ();
10589
10590 case M_DDIV_3:
10591 dbl = 1;
10592 case M_DIV_3:
10593 s = "mflo";
10594 goto do_div3;
10595 case M_DREM_3:
10596 dbl = 1;
10597 case M_REM_3:
10598 s = "mfhi";
10599 do_div3:
10600 start_noreorder ();
10601 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10602 expr1.X_add_number = 2;
10603 macro_build (&expr1, "bnez", "x,p", yreg);
10604 macro_build (NULL, "break", "6", 7);
10605
10606 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10607 since that causes an overflow. We should do that as well,
10608 but I don't see how to do the comparisons without a temporary
10609 register. */
10610 end_noreorder ();
10611 macro_build (NULL, s, "x", zreg);
10612 break;
10613
10614 case M_DIVU_3:
10615 s = "divu";
10616 s2 = "mflo";
10617 goto do_divu3;
10618 case M_REMU_3:
10619 s = "divu";
10620 s2 = "mfhi";
10621 goto do_divu3;
10622 case M_DDIVU_3:
10623 s = "ddivu";
10624 s2 = "mflo";
10625 goto do_divu3;
10626 case M_DREMU_3:
10627 s = "ddivu";
10628 s2 = "mfhi";
10629 do_divu3:
10630 start_noreorder ();
10631 macro_build (NULL, s, "0,x,y", xreg, yreg);
10632 expr1.X_add_number = 2;
10633 macro_build (&expr1, "bnez", "x,p", yreg);
10634 macro_build (NULL, "break", "6", 7);
10635 end_noreorder ();
10636 macro_build (NULL, s2, "x", zreg);
10637 break;
10638
10639 case M_DMUL:
10640 dbl = 1;
10641 case M_MUL:
10642 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10643 macro_build (NULL, "mflo", "x", zreg);
10644 break;
10645
10646 case M_DSUBU_I:
10647 dbl = 1;
10648 goto do_subu;
10649 case M_SUBU_I:
10650 do_subu:
10651 if (imm_expr.X_op != O_constant)
10652 as_bad (_("Unsupported large constant"));
10653 imm_expr.X_add_number = -imm_expr.X_add_number;
10654 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10655 break;
10656
10657 case M_SUBU_I_2:
10658 if (imm_expr.X_op != O_constant)
10659 as_bad (_("Unsupported large constant"));
10660 imm_expr.X_add_number = -imm_expr.X_add_number;
10661 macro_build (&imm_expr, "addiu", "x,k", xreg);
10662 break;
10663
10664 case M_DSUBU_I_2:
10665 if (imm_expr.X_op != O_constant)
10666 as_bad (_("Unsupported large constant"));
10667 imm_expr.X_add_number = -imm_expr.X_add_number;
10668 macro_build (&imm_expr, "daddiu", "y,j", yreg);
10669 break;
10670
10671 case M_BEQ:
10672 s = "cmp";
10673 s2 = "bteqz";
10674 goto do_branch;
10675 case M_BNE:
10676 s = "cmp";
10677 s2 = "btnez";
10678 goto do_branch;
10679 case M_BLT:
10680 s = "slt";
10681 s2 = "btnez";
10682 goto do_branch;
10683 case M_BLTU:
10684 s = "sltu";
10685 s2 = "btnez";
10686 goto do_branch;
10687 case M_BLE:
10688 s = "slt";
10689 s2 = "bteqz";
10690 goto do_reverse_branch;
10691 case M_BLEU:
10692 s = "sltu";
10693 s2 = "bteqz";
10694 goto do_reverse_branch;
10695 case M_BGE:
10696 s = "slt";
10697 s2 = "bteqz";
10698 goto do_branch;
10699 case M_BGEU:
10700 s = "sltu";
10701 s2 = "bteqz";
10702 goto do_branch;
10703 case M_BGT:
10704 s = "slt";
10705 s2 = "btnez";
10706 goto do_reverse_branch;
10707 case M_BGTU:
10708 s = "sltu";
10709 s2 = "btnez";
10710
10711 do_reverse_branch:
10712 tmp = xreg;
10713 xreg = yreg;
10714 yreg = tmp;
10715
10716 do_branch:
10717 macro_build (NULL, s, "x,y", xreg, yreg);
10718 macro_build (&offset_expr, s2, "p");
10719 break;
10720
10721 case M_BEQ_I:
10722 s = "cmpi";
10723 s2 = "bteqz";
10724 s3 = "x,U";
10725 goto do_branch_i;
10726 case M_BNE_I:
10727 s = "cmpi";
10728 s2 = "btnez";
10729 s3 = "x,U";
10730 goto do_branch_i;
10731 case M_BLT_I:
10732 s = "slti";
10733 s2 = "btnez";
10734 s3 = "x,8";
10735 goto do_branch_i;
10736 case M_BLTU_I:
10737 s = "sltiu";
10738 s2 = "btnez";
10739 s3 = "x,8";
10740 goto do_branch_i;
10741 case M_BLE_I:
10742 s = "slti";
10743 s2 = "btnez";
10744 s3 = "x,8";
10745 goto do_addone_branch_i;
10746 case M_BLEU_I:
10747 s = "sltiu";
10748 s2 = "btnez";
10749 s3 = "x,8";
10750 goto do_addone_branch_i;
10751 case M_BGE_I:
10752 s = "slti";
10753 s2 = "bteqz";
10754 s3 = "x,8";
10755 goto do_branch_i;
10756 case M_BGEU_I:
10757 s = "sltiu";
10758 s2 = "bteqz";
10759 s3 = "x,8";
10760 goto do_branch_i;
10761 case M_BGT_I:
10762 s = "slti";
10763 s2 = "bteqz";
10764 s3 = "x,8";
10765 goto do_addone_branch_i;
10766 case M_BGTU_I:
10767 s = "sltiu";
10768 s2 = "bteqz";
10769 s3 = "x,8";
10770
10771 do_addone_branch_i:
10772 if (imm_expr.X_op != O_constant)
10773 as_bad (_("Unsupported large constant"));
10774 ++imm_expr.X_add_number;
10775
10776 do_branch_i:
10777 macro_build (&imm_expr, s, s3, xreg);
10778 macro_build (&offset_expr, s2, "p");
10779 break;
10780
10781 case M_ABS:
10782 expr1.X_add_number = 0;
10783 macro_build (&expr1, "slti", "x,8", yreg);
10784 if (xreg != yreg)
10785 move_register (xreg, yreg);
10786 expr1.X_add_number = 2;
10787 macro_build (&expr1, "bteqz", "p");
10788 macro_build (NULL, "neg", "x,w", xreg, xreg);
10789 }
10790 }
10791
10792 /* For consistency checking, verify that all bits are specified either
10793 by the match/mask part of the instruction definition, or by the
10794 operand list. */
10795 static int
10796 validate_mips_insn (const struct mips_opcode *opc)
10797 {
10798 const char *p = opc->args;
10799 char c;
10800 unsigned long used_bits = opc->mask;
10801
10802 if ((used_bits & opc->match) != opc->match)
10803 {
10804 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10805 opc->name, opc->args);
10806 return 0;
10807 }
10808 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
10809 while (*p)
10810 switch (c = *p++)
10811 {
10812 case ',': break;
10813 case '(': break;
10814 case ')': break;
10815 case '+':
10816 switch (c = *p++)
10817 {
10818 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
10819 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
10820 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
10821 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
10822 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10823 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10824 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10825 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
10826 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10827 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10828 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10829 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10830 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10831 case 'I': break;
10832 case 'J': USE_BITS (OP_MASK_CODE10, OP_SH_CODE10); break;
10833 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10834 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
10835 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10836 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10837 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10838 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10839 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10840 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
10841 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10842 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10843 case 'z': USE_BITS (OP_MASK_RZ, OP_SH_RZ); break;
10844 case 'Z': USE_BITS (OP_MASK_FZ, OP_SH_FZ); break;
10845 case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10846 case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10847 case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10848 case 'j': USE_BITS (OP_MASK_EVAOFFSET, OP_SH_EVAOFFSET); break;
10849
10850 default:
10851 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10852 c, opc->name, opc->args);
10853 return 0;
10854 }
10855 break;
10856 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10857 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10858 case 'A': break;
10859 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
10860 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
10861 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10862 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10863 case 'F': break;
10864 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10865 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10866 case 'I': break;
10867 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
10868 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10869 case 'L': break;
10870 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
10871 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
10872 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
10873 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
10874 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10875 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
10876 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10877 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10878 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10879 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10880 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10881 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10882 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10883 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
10884 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10885 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
10886 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10887 case 'f': break;
10888 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
10889 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10890 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10891 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
10892 case 'l': break;
10893 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10894 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10895 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
10896 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10897 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10898 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10899 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10900 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10901 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10902 case 'x': break;
10903 case 'z': break;
10904 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
10905 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
10906 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10907 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
10908 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
10909 case '[': break;
10910 case ']': break;
10911 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10912 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
10913 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
10914 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
10915 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
10916 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10917 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
10918 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
10919 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
10920 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
10921 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
10922 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
10923 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
10924 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
10925 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
10926 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
10927 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
10928 case '\\': USE_BITS (OP_MASK_3BITPOS, OP_SH_3BITPOS); break;
10929 case '~': USE_BITS (OP_MASK_OFFSET12, OP_SH_OFFSET12); break;
10930 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10931 default:
10932 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10933 c, opc->name, opc->args);
10934 return 0;
10935 }
10936 #undef USE_BITS
10937 if (used_bits != 0xffffffff)
10938 {
10939 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10940 ~used_bits & 0xffffffff, opc->name, opc->args);
10941 return 0;
10942 }
10943 return 1;
10944 }
10945
10946 /* For consistency checking, verify that the length implied matches the
10947 major opcode and that all bits are specified either by the match/mask
10948 part of the instruction definition, or by the operand list. */
10949
10950 static int
10951 validate_micromips_insn (const struct mips_opcode *opc)
10952 {
10953 unsigned long match = opc->match;
10954 unsigned long mask = opc->mask;
10955 const char *p = opc->args;
10956 unsigned long insn_bits;
10957 unsigned long used_bits;
10958 unsigned long major;
10959 unsigned int length;
10960 char e;
10961 char c;
10962
10963 if ((mask & match) != match)
10964 {
10965 as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10966 opc->name, opc->args);
10967 return 0;
10968 }
10969 length = micromips_insn_length (opc);
10970 if (length != 2 && length != 4)
10971 {
10972 as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10973 "%s %s"), length, opc->name, opc->args);
10974 return 0;
10975 }
10976 major = match >> (10 + 8 * (length - 2));
10977 if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10978 || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10979 {
10980 as_bad (_("Internal error: bad microMIPS opcode "
10981 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10982 return 0;
10983 }
10984
10985 /* Shift piecewise to avoid an overflow where unsigned long is 32-bit. */
10986 insn_bits = 1 << 4 * length;
10987 insn_bits <<= 4 * length;
10988 insn_bits -= 1;
10989 used_bits = mask;
10990 #define USE_BITS(field) \
10991 (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10992 while (*p)
10993 switch (c = *p++)
10994 {
10995 case ',': break;
10996 case '(': break;
10997 case ')': break;
10998 case '+':
10999 e = c;
11000 switch (c = *p++)
11001 {
11002 case 'A': USE_BITS (EXTLSB); break;
11003 case 'B': USE_BITS (INSMSB); break;
11004 case 'C': USE_BITS (EXTMSBD); break;
11005 case 'D': USE_BITS (RS); USE_BITS (SEL); break;
11006 case 'E': USE_BITS (EXTLSB); break;
11007 case 'F': USE_BITS (INSMSB); break;
11008 case 'G': USE_BITS (EXTMSBD); break;
11009 case 'H': USE_BITS (EXTMSBD); break;
11010 case 'j': USE_BITS (EVAOFFSET); break;
11011 default:
11012 as_bad (_("Internal error: bad mips opcode "
11013 "(unknown extension operand type `%c%c'): %s %s"),
11014 e, c, opc->name, opc->args);
11015 return 0;
11016 }
11017 break;
11018 case 'm':
11019 e = c;
11020 switch (c = *p++)
11021 {
11022 case 'A': USE_BITS (IMMA); break;
11023 case 'B': USE_BITS (IMMB); break;
11024 case 'C': USE_BITS (IMMC); break;
11025 case 'D': USE_BITS (IMMD); break;
11026 case 'E': USE_BITS (IMME); break;
11027 case 'F': USE_BITS (IMMF); break;
11028 case 'G': USE_BITS (IMMG); break;
11029 case 'H': USE_BITS (IMMH); break;
11030 case 'I': USE_BITS (IMMI); break;
11031 case 'J': USE_BITS (IMMJ); break;
11032 case 'L': USE_BITS (IMML); break;
11033 case 'M': USE_BITS (IMMM); break;
11034 case 'N': USE_BITS (IMMN); break;
11035 case 'O': USE_BITS (IMMO); break;
11036 case 'P': USE_BITS (IMMP); break;
11037 case 'Q': USE_BITS (IMMQ); break;
11038 case 'U': USE_BITS (IMMU); break;
11039 case 'W': USE_BITS (IMMW); break;
11040 case 'X': USE_BITS (IMMX); break;
11041 case 'Y': USE_BITS (IMMY); break;
11042 case 'Z': break;
11043 case 'a': break;
11044 case 'b': USE_BITS (MB); break;
11045 case 'c': USE_BITS (MC); break;
11046 case 'd': USE_BITS (MD); break;
11047 case 'e': USE_BITS (ME); break;
11048 case 'f': USE_BITS (MF); break;
11049 case 'g': USE_BITS (MG); break;
11050 case 'h': USE_BITS (MH); break;
11051 case 'i': USE_BITS (MI); break;
11052 case 'j': USE_BITS (MJ); break;
11053 case 'l': USE_BITS (ML); break;
11054 case 'm': USE_BITS (MM); break;
11055 case 'n': USE_BITS (MN); break;
11056 case 'p': USE_BITS (MP); break;
11057 case 'q': USE_BITS (MQ); break;
11058 case 'r': break;
11059 case 's': break;
11060 case 't': break;
11061 case 'x': break;
11062 case 'y': break;
11063 case 'z': break;
11064 default:
11065 as_bad (_("Internal error: bad mips opcode "
11066 "(unknown extension operand type `%c%c'): %s %s"),
11067 e, c, opc->name, opc->args);
11068 return 0;
11069 }
11070 break;
11071 case '.': USE_BITS (OFFSET10); break;
11072 case '1': USE_BITS (STYPE); break;
11073 case '2': USE_BITS (BP); break;
11074 case '3': USE_BITS (SA3); break;
11075 case '4': USE_BITS (SA4); break;
11076 case '5': USE_BITS (IMM8); break;
11077 case '6': USE_BITS (RS); break;
11078 case '7': USE_BITS (DSPACC); break;
11079 case '8': USE_BITS (WRDSP); break;
11080 case '0': USE_BITS (DSPSFT); break;
11081 case '<': USE_BITS (SHAMT); break;
11082 case '>': USE_BITS (SHAMT); break;
11083 case '@': USE_BITS (IMM10); break;
11084 case 'B': USE_BITS (CODE10); break;
11085 case 'C': USE_BITS (COPZ); break;
11086 case 'D': USE_BITS (FD); break;
11087 case 'E': USE_BITS (RT); break;
11088 case 'G': USE_BITS (RS); break;
11089 case 'H': USE_BITS (SEL); break;
11090 case 'K': USE_BITS (RS); break;
11091 case 'M': USE_BITS (CCC); break;
11092 case 'N': USE_BITS (BCC); break;
11093 case 'R': USE_BITS (FR); break;
11094 case 'S': USE_BITS (FS); break;
11095 case 'T': USE_BITS (FT); break;
11096 case 'V': USE_BITS (FS); break;
11097 case '\\': USE_BITS (3BITPOS); break;
11098 case '^': USE_BITS (RD); break;
11099 case 'a': USE_BITS (TARGET); break;
11100 case 'b': USE_BITS (RS); break;
11101 case 'c': USE_BITS (CODE); break;
11102 case 'd': USE_BITS (RD); break;
11103 case 'h': USE_BITS (PREFX); break;
11104 case 'i': USE_BITS (IMMEDIATE); break;
11105 case 'j': USE_BITS (DELTA); break;
11106 case 'k': USE_BITS (CACHE); break;
11107 case 'n': USE_BITS (RT); break;
11108 case 'o': USE_BITS (DELTA); break;
11109 case 'p': USE_BITS (DELTA); break;
11110 case 'q': USE_BITS (CODE2); break;
11111 case 'r': USE_BITS (RS); break;
11112 case 's': USE_BITS (RS); break;
11113 case 't': USE_BITS (RT); break;
11114 case 'u': USE_BITS (IMMEDIATE); break;
11115 case 'v': USE_BITS (RS); break;
11116 case 'w': USE_BITS (RT); break;
11117 case 'y': USE_BITS (RS3); break;
11118 case 'z': break;
11119 case '|': USE_BITS (TRAP); break;
11120 case '~': USE_BITS (OFFSET12); break;
11121 default:
11122 as_bad (_("Internal error: bad microMIPS opcode "
11123 "(unknown operand type `%c'): %s %s"),
11124 c, opc->name, opc->args);
11125 return 0;
11126 }
11127 #undef USE_BITS
11128 if (used_bits != insn_bits)
11129 {
11130 if (~used_bits & insn_bits)
11131 as_bad (_("Internal error: bad microMIPS opcode "
11132 "(bits 0x%lx undefined): %s %s"),
11133 ~used_bits & insn_bits, opc->name, opc->args);
11134 if (used_bits & ~insn_bits)
11135 as_bad (_("Internal error: bad microMIPS opcode "
11136 "(bits 0x%lx defined): %s %s"),
11137 used_bits & ~insn_bits, opc->name, opc->args);
11138 return 0;
11139 }
11140 return 1;
11141 }
11142
11143 /* UDI immediates. */
11144 struct mips_immed {
11145 char type;
11146 unsigned int shift;
11147 unsigned long mask;
11148 const char * desc;
11149 };
11150
11151 static const struct mips_immed mips_immed[] = {
11152 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
11153 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
11154 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
11155 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
11156 { 0,0,0,0 }
11157 };
11158
11159 /* Check whether an odd floating-point register is allowed. */
11160 static int
11161 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
11162 {
11163 const char *s = insn->name;
11164
11165 if (insn->pinfo == INSN_MACRO)
11166 /* Let a macro pass, we'll catch it later when it is expanded. */
11167 return 1;
11168
11169 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
11170 {
11171 /* Allow odd registers for single-precision ops. */
11172 switch (insn->pinfo & (FP_S | FP_D))
11173 {
11174 case FP_S:
11175 case 0:
11176 return 1; /* both single precision - ok */
11177 case FP_D:
11178 return 0; /* both double precision - fail */
11179 default:
11180 break;
11181 }
11182
11183 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
11184 s = strchr (insn->name, '.');
11185 if (argnum == 2)
11186 s = s != NULL ? strchr (s + 1, '.') : NULL;
11187 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
11188 }
11189
11190 /* Single-precision coprocessor loads and moves are OK too. */
11191 if ((insn->pinfo & FP_S)
11192 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
11193 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
11194 return 1;
11195
11196 return 0;
11197 }
11198
11199 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
11200 taking bits from BIT up. */
11201 static int
11202 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
11203 {
11204 return (ep->X_op == O_constant
11205 && (ep->X_add_number & ((1 << bit) - 1)) == 0
11206 && ep->X_add_number >= min << bit
11207 && ep->X_add_number < max << bit);
11208 }
11209
11210 /* This routine assembles an instruction into its binary format. As a
11211 side effect, it sets one of the global variables imm_reloc or
11212 offset_reloc to the type of relocation to do if one of the operands
11213 is an address expression. */
11214
11215 static void
11216 mips_ip (char *str, struct mips_cl_insn *ip)
11217 {
11218 bfd_boolean wrong_delay_slot_insns = FALSE;
11219 bfd_boolean need_delay_slot_ok = TRUE;
11220 struct mips_opcode *firstinsn = NULL;
11221 const struct mips_opcode *past;
11222 struct hash_control *hash;
11223 char *s;
11224 const char *args;
11225 char c = 0;
11226 struct mips_opcode *insn;
11227 char *argsStart;
11228 unsigned int regno;
11229 unsigned int lastregno;
11230 unsigned int destregno = 0;
11231 unsigned int lastpos = 0;
11232 unsigned int limlo, limhi;
11233 int sizelo;
11234 char *s_reset;
11235 offsetT min_range, max_range;
11236 long opend;
11237 char *name;
11238 int argnum;
11239 unsigned int rtype;
11240 char *dot;
11241 long end;
11242
11243 insn_error = NULL;
11244
11245 if (mips_opts.micromips)
11246 {
11247 hash = micromips_op_hash;
11248 past = &micromips_opcodes[bfd_micromips_num_opcodes];
11249 }
11250 else
11251 {
11252 hash = op_hash;
11253 past = &mips_opcodes[NUMOPCODES];
11254 }
11255 forced_insn_length = 0;
11256 insn = NULL;
11257
11258 /* We first try to match an instruction up to a space or to the end. */
11259 for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
11260 continue;
11261
11262 /* Make a copy of the instruction so that we can fiddle with it. */
11263 name = alloca (end + 1);
11264 memcpy (name, str, end);
11265 name[end] = '\0';
11266
11267 for (;;)
11268 {
11269 insn = (struct mips_opcode *) hash_find (hash, name);
11270
11271 if (insn != NULL || !mips_opts.micromips)
11272 break;
11273 if (forced_insn_length)
11274 break;
11275
11276 /* See if there's an instruction size override suffix,
11277 either `16' or `32', at the end of the mnemonic proper,
11278 that defines the operation, i.e. before the first `.'
11279 character if any. Strip it and retry. */
11280 dot = strchr (name, '.');
11281 opend = dot != NULL ? dot - name : end;
11282 if (opend < 3)
11283 break;
11284 if (name[opend - 2] == '1' && name[opend - 1] == '6')
11285 forced_insn_length = 2;
11286 else if (name[opend - 2] == '3' && name[opend - 1] == '2')
11287 forced_insn_length = 4;
11288 else
11289 break;
11290 memcpy (name + opend - 2, name + opend, end - opend + 1);
11291 }
11292 if (insn == NULL)
11293 {
11294 insn_error = _("Unrecognized opcode");
11295 return;
11296 }
11297
11298 /* For microMIPS instructions placed in a fixed-length branch delay slot
11299 we make up to two passes over the relevant fragment of the opcode
11300 table. First we try instructions that meet the delay slot's length
11301 requirement. If none matched, then we retry with the remaining ones
11302 and if one matches, then we use it and then issue an appropriate
11303 warning later on. */
11304 argsStart = s = str + end;
11305 for (;;)
11306 {
11307 bfd_boolean delay_slot_ok;
11308 bfd_boolean size_ok;
11309 bfd_boolean ok;
11310
11311 gas_assert (strcmp (insn->name, name) == 0);
11312
11313 ok = is_opcode_valid (insn);
11314 size_ok = is_size_valid (insn);
11315 delay_slot_ok = is_delay_slot_valid (insn);
11316 if (!delay_slot_ok && !wrong_delay_slot_insns)
11317 {
11318 firstinsn = insn;
11319 wrong_delay_slot_insns = TRUE;
11320 }
11321 if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
11322 {
11323 static char buf[256];
11324
11325 if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
11326 {
11327 ++insn;
11328 continue;
11329 }
11330 if (wrong_delay_slot_insns && need_delay_slot_ok)
11331 {
11332 gas_assert (firstinsn);
11333 need_delay_slot_ok = FALSE;
11334 past = insn + 1;
11335 insn = firstinsn;
11336 continue;
11337 }
11338
11339 if (insn_error)
11340 return;
11341
11342 if (!ok)
11343 sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
11344 mips_cpu_info_from_arch (mips_opts.arch)->name,
11345 mips_cpu_info_from_isa (mips_opts.isa)->name);
11346 else
11347 sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
11348 8 * forced_insn_length);
11349 insn_error = buf;
11350
11351 return;
11352 }
11353
11354 create_insn (ip, insn);
11355 insn_error = NULL;
11356 argnum = 1;
11357 lastregno = 0xffffffff;
11358 for (args = insn->args;; ++args)
11359 {
11360 int is_mdmx;
11361
11362 s += strspn (s, " \t");
11363 is_mdmx = 0;
11364 switch (*args)
11365 {
11366 case '\0': /* end of args */
11367 if (*s == '\0')
11368 return;
11369 break;
11370
11371 case '2':
11372 /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
11373 code) or 14 (for microMIPS code). */
11374 my_getExpression (&imm_expr, s);
11375 check_absolute_expr (ip, &imm_expr);
11376 if ((unsigned long) imm_expr.X_add_number != 1
11377 && (unsigned long) imm_expr.X_add_number != 3)
11378 {
11379 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
11380 (unsigned long) imm_expr.X_add_number);
11381 }
11382 INSERT_OPERAND (mips_opts.micromips,
11383 BP, *ip, imm_expr.X_add_number);
11384 imm_expr.X_op = O_absent;
11385 s = expr_end;
11386 continue;
11387
11388 case '3':
11389 /* DSP 3-bit unsigned immediate in bit 21 (for standard MIPS
11390 code) or 13 (for microMIPS code). */
11391 {
11392 unsigned long mask = (mips_opts.micromips
11393 ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
11394
11395 my_getExpression (&imm_expr, s);
11396 check_absolute_expr (ip, &imm_expr);
11397 if ((unsigned long) imm_expr.X_add_number > mask)
11398 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11399 mask, (unsigned long) imm_expr.X_add_number);
11400 INSERT_OPERAND (mips_opts.micromips,
11401 SA3, *ip, imm_expr.X_add_number);
11402 imm_expr.X_op = O_absent;
11403 s = expr_end;
11404 }
11405 continue;
11406
11407 case '4':
11408 /* DSP 4-bit unsigned immediate in bit 21 (for standard MIPS
11409 code) or 12 (for microMIPS code). */
11410 {
11411 unsigned long mask = (mips_opts.micromips
11412 ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
11413
11414 my_getExpression (&imm_expr, s);
11415 check_absolute_expr (ip, &imm_expr);
11416 if ((unsigned long) imm_expr.X_add_number > mask)
11417 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11418 mask, (unsigned long) imm_expr.X_add_number);
11419 INSERT_OPERAND (mips_opts.micromips,
11420 SA4, *ip, imm_expr.X_add_number);
11421 imm_expr.X_op = O_absent;
11422 s = expr_end;
11423 }
11424 continue;
11425
11426 case '5':
11427 /* DSP 8-bit unsigned immediate in bit 16 (for standard MIPS
11428 code) or 13 (for microMIPS code). */
11429 {
11430 unsigned long mask = (mips_opts.micromips
11431 ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11432
11433 my_getExpression (&imm_expr, s);
11434 check_absolute_expr (ip, &imm_expr);
11435 if ((unsigned long) imm_expr.X_add_number > mask)
11436 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11437 mask, (unsigned long) imm_expr.X_add_number);
11438 INSERT_OPERAND (mips_opts.micromips,
11439 IMM8, *ip, imm_expr.X_add_number);
11440 imm_expr.X_op = O_absent;
11441 s = expr_end;
11442 }
11443 continue;
11444
11445 case '6':
11446 /* DSP 5-bit unsigned immediate in bit 21 (for standard MIPS
11447 code) or 16 (for microMIPS code). */
11448 {
11449 unsigned long mask = (mips_opts.micromips
11450 ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11451
11452 my_getExpression (&imm_expr, s);
11453 check_absolute_expr (ip, &imm_expr);
11454 if ((unsigned long) imm_expr.X_add_number > mask)
11455 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11456 mask, (unsigned long) imm_expr.X_add_number);
11457 INSERT_OPERAND (mips_opts.micromips,
11458 RS, *ip, imm_expr.X_add_number);
11459 imm_expr.X_op = O_absent;
11460 s = expr_end;
11461 }
11462 continue;
11463
11464 case '7':
11465 /* Four DSP accumulators in bit 11 (for standard MIPS code)
11466 or 14 (for microMIPS code). */
11467 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11468 && s[3] >= '0' && s[3] <= '3')
11469 {
11470 regno = s[3] - '0';
11471 s += 4;
11472 INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11473 continue;
11474 }
11475 else
11476 as_bad (_("Invalid dsp acc register"));
11477 break;
11478
11479 case '8':
11480 /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11481 code) or 14 (for microMIPS code). */
11482 {
11483 unsigned long mask = (mips_opts.micromips
11484 ? MICROMIPSOP_MASK_WRDSP
11485 : OP_MASK_WRDSP);
11486
11487 my_getExpression (&imm_expr, s);
11488 check_absolute_expr (ip, &imm_expr);
11489 if ((unsigned long) imm_expr.X_add_number > mask)
11490 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11491 mask, (unsigned long) imm_expr.X_add_number);
11492 INSERT_OPERAND (mips_opts.micromips,
11493 WRDSP, *ip, imm_expr.X_add_number);
11494 imm_expr.X_op = O_absent;
11495 s = expr_end;
11496 }
11497 continue;
11498
11499 case '9': /* Four DSP accumulators in bits 21,22. */
11500 gas_assert (!mips_opts.micromips);
11501 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11502 && s[3] >= '0' && s[3] <= '3')
11503 {
11504 regno = s[3] - '0';
11505 s += 4;
11506 INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11507 continue;
11508 }
11509 else
11510 as_bad (_("Invalid dsp acc register"));
11511 break;
11512
11513 case '0':
11514 /* DSP 6-bit signed immediate in bit 20 (for standard MIPS
11515 code) or 16 (for microMIPS code). */
11516 {
11517 long mask = (mips_opts.micromips
11518 ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11519
11520 my_getExpression (&imm_expr, s);
11521 check_absolute_expr (ip, &imm_expr);
11522 min_range = -((mask + 1) >> 1);
11523 max_range = ((mask + 1) >> 1) - 1;
11524 if (imm_expr.X_add_number < min_range
11525 || imm_expr.X_add_number > max_range)
11526 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11527 (long) min_range, (long) max_range,
11528 (long) imm_expr.X_add_number);
11529 INSERT_OPERAND (mips_opts.micromips,
11530 DSPSFT, *ip, imm_expr.X_add_number);
11531 imm_expr.X_op = O_absent;
11532 s = expr_end;
11533 }
11534 continue;
11535
11536 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
11537 gas_assert (!mips_opts.micromips);
11538 my_getExpression (&imm_expr, s);
11539 check_absolute_expr (ip, &imm_expr);
11540 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11541 {
11542 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11543 OP_MASK_RDDSP,
11544 (unsigned long) imm_expr.X_add_number);
11545 }
11546 INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11547 imm_expr.X_op = O_absent;
11548 s = expr_end;
11549 continue;
11550
11551 case ':': /* DSP 7-bit signed immediate in bit 19. */
11552 gas_assert (!mips_opts.micromips);
11553 my_getExpression (&imm_expr, s);
11554 check_absolute_expr (ip, &imm_expr);
11555 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11556 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11557 if (imm_expr.X_add_number < min_range ||
11558 imm_expr.X_add_number > max_range)
11559 {
11560 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11561 (long) min_range, (long) max_range,
11562 (long) imm_expr.X_add_number);
11563 }
11564 INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11565 imm_expr.X_op = O_absent;
11566 s = expr_end;
11567 continue;
11568
11569 case '@': /* DSP 10-bit signed immediate in bit 16. */
11570 {
11571 long mask = (mips_opts.micromips
11572 ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11573
11574 my_getExpression (&imm_expr, s);
11575 check_absolute_expr (ip, &imm_expr);
11576 min_range = -((mask + 1) >> 1);
11577 max_range = ((mask + 1) >> 1) - 1;
11578 if (imm_expr.X_add_number < min_range
11579 || imm_expr.X_add_number > max_range)
11580 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11581 (long) min_range, (long) max_range,
11582 (long) imm_expr.X_add_number);
11583 INSERT_OPERAND (mips_opts.micromips,
11584 IMM10, *ip, imm_expr.X_add_number);
11585 imm_expr.X_op = O_absent;
11586 s = expr_end;
11587 }
11588 continue;
11589
11590 case '^': /* DSP 5-bit unsigned immediate in bit 11. */
11591 gas_assert (mips_opts.micromips);
11592 my_getExpression (&imm_expr, s);
11593 check_absolute_expr (ip, &imm_expr);
11594 if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11595 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11596 MICROMIPSOP_MASK_RD,
11597 (unsigned long) imm_expr.X_add_number);
11598 INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11599 imm_expr.X_op = O_absent;
11600 s = expr_end;
11601 continue;
11602
11603 case '!': /* MT usermode flag bit. */
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_MT_U)
11608 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11609 (unsigned long) imm_expr.X_add_number);
11610 INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11611 imm_expr.X_op = O_absent;
11612 s = expr_end;
11613 continue;
11614
11615 case '$': /* MT load high flag bit. */
11616 gas_assert (!mips_opts.micromips);
11617 my_getExpression (&imm_expr, s);
11618 check_absolute_expr (ip, &imm_expr);
11619 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11620 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11621 (unsigned long) imm_expr.X_add_number);
11622 INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11623 imm_expr.X_op = O_absent;
11624 s = expr_end;
11625 continue;
11626
11627 case '*': /* Four DSP accumulators in bits 18,19. */
11628 gas_assert (!mips_opts.micromips);
11629 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11630 s[3] >= '0' && s[3] <= '3')
11631 {
11632 regno = s[3] - '0';
11633 s += 4;
11634 INSERT_OPERAND (0, MTACC_T, *ip, regno);
11635 continue;
11636 }
11637 else
11638 as_bad (_("Invalid dsp/smartmips acc register"));
11639 break;
11640
11641 case '&': /* Four DSP accumulators in bits 13,14. */
11642 gas_assert (!mips_opts.micromips);
11643 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11644 s[3] >= '0' && s[3] <= '3')
11645 {
11646 regno = s[3] - '0';
11647 s += 4;
11648 INSERT_OPERAND (0, MTACC_D, *ip, regno);
11649 continue;
11650 }
11651 else
11652 as_bad (_("Invalid dsp/smartmips acc register"));
11653 break;
11654
11655 case '\\': /* 3-bit bit position. */
11656 {
11657 unsigned long mask = (mips_opts.micromips
11658 ? MICROMIPSOP_MASK_3BITPOS
11659 : OP_MASK_3BITPOS);
11660
11661 my_getExpression (&imm_expr, s);
11662 check_absolute_expr (ip, &imm_expr);
11663 if ((unsigned long) imm_expr.X_add_number > mask)
11664 as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11665 ip->insn_mo->name,
11666 mask, (unsigned long) imm_expr.X_add_number);
11667 INSERT_OPERAND (mips_opts.micromips,
11668 3BITPOS, *ip, imm_expr.X_add_number);
11669 imm_expr.X_op = O_absent;
11670 s = expr_end;
11671 }
11672 continue;
11673
11674 case ',':
11675 ++argnum;
11676 if (*s++ == *args)
11677 continue;
11678 s--;
11679 switch (*++args)
11680 {
11681 case 'r':
11682 case 'v':
11683 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11684 continue;
11685
11686 case 'w':
11687 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11688 continue;
11689
11690 case 'W':
11691 gas_assert (!mips_opts.micromips);
11692 INSERT_OPERAND (0, FT, *ip, lastregno);
11693 continue;
11694
11695 case 'V':
11696 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11697 continue;
11698 }
11699 break;
11700
11701 case '(':
11702 /* Handle optional base register.
11703 Either the base register is omitted or
11704 we must have a left paren. */
11705 /* This is dependent on the next operand specifier
11706 is a base register specification. */
11707 gas_assert (args[1] == 'b'
11708 || (mips_opts.micromips
11709 && args[1] == 'm'
11710 && (args[2] == 'l' || args[2] == 'n'
11711 || args[2] == 's' || args[2] == 'a')));
11712 if (*s == '\0' && args[1] == 'b')
11713 return;
11714 /* Fall through. */
11715
11716 case ')': /* These must match exactly. */
11717 if (*s++ == *args)
11718 continue;
11719 break;
11720
11721 case '[': /* These must match exactly. */
11722 case ']':
11723 gas_assert (!mips_opts.micromips);
11724 if (*s++ == *args)
11725 continue;
11726 break;
11727
11728 case '+': /* Opcode extension character. */
11729 switch (*++args)
11730 {
11731 case '1': /* UDI immediates. */
11732 case '2':
11733 case '3':
11734 case '4':
11735 gas_assert (!mips_opts.micromips);
11736 {
11737 const struct mips_immed *imm = mips_immed;
11738
11739 while (imm->type && imm->type != *args)
11740 ++imm;
11741 if (! imm->type)
11742 abort ();
11743 my_getExpression (&imm_expr, s);
11744 check_absolute_expr (ip, &imm_expr);
11745 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11746 {
11747 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11748 imm->desc ? imm->desc : ip->insn_mo->name,
11749 (unsigned long) imm_expr.X_add_number,
11750 (unsigned long) imm_expr.X_add_number);
11751 imm_expr.X_add_number &= imm->mask;
11752 }
11753 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11754 << imm->shift);
11755 imm_expr.X_op = O_absent;
11756 s = expr_end;
11757 }
11758 continue;
11759
11760 case 'J': /* 10-bit hypcall code. */
11761 gas_assert (!mips_opts.micromips);
11762 {
11763 unsigned long mask = OP_MASK_CODE10;
11764
11765 my_getExpression (&imm_expr, s);
11766 check_absolute_expr (ip, &imm_expr);
11767 if ((unsigned long) imm_expr.X_add_number > mask)
11768 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11769 ip->insn_mo->name,
11770 mask, (unsigned long) imm_expr.X_add_number);
11771 INSERT_OPERAND (0, CODE10, *ip, imm_expr.X_add_number);
11772 imm_expr.X_op = O_absent;
11773 s = expr_end;
11774 }
11775 continue;
11776
11777 case 'A': /* ins/ext position, becomes LSB. */
11778 limlo = 0;
11779 limhi = 31;
11780 goto do_lsb;
11781 case 'E':
11782 limlo = 32;
11783 limhi = 63;
11784 goto do_lsb;
11785 do_lsb:
11786 my_getExpression (&imm_expr, s);
11787 check_absolute_expr (ip, &imm_expr);
11788 if ((unsigned long) imm_expr.X_add_number < limlo
11789 || (unsigned long) imm_expr.X_add_number > limhi)
11790 {
11791 as_bad (_("Improper position (%lu)"),
11792 (unsigned long) imm_expr.X_add_number);
11793 imm_expr.X_add_number = limlo;
11794 }
11795 lastpos = imm_expr.X_add_number;
11796 INSERT_OPERAND (mips_opts.micromips,
11797 EXTLSB, *ip, imm_expr.X_add_number);
11798 imm_expr.X_op = O_absent;
11799 s = expr_end;
11800 continue;
11801
11802 case 'B': /* ins size, becomes MSB. */
11803 limlo = 1;
11804 limhi = 32;
11805 goto do_msb;
11806 case 'F':
11807 limlo = 33;
11808 limhi = 64;
11809 goto do_msb;
11810 do_msb:
11811 my_getExpression (&imm_expr, s);
11812 check_absolute_expr (ip, &imm_expr);
11813 /* Check for negative input so that small negative numbers
11814 will not succeed incorrectly. The checks against
11815 (pos+size) transitively check "size" itself,
11816 assuming that "pos" is reasonable. */
11817 if ((long) imm_expr.X_add_number < 0
11818 || ((unsigned long) imm_expr.X_add_number
11819 + lastpos) < limlo
11820 || ((unsigned long) imm_expr.X_add_number
11821 + lastpos) > limhi)
11822 {
11823 as_bad (_("Improper insert size (%lu, position %lu)"),
11824 (unsigned long) imm_expr.X_add_number,
11825 (unsigned long) lastpos);
11826 imm_expr.X_add_number = limlo - lastpos;
11827 }
11828 INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11829 lastpos + imm_expr.X_add_number - 1);
11830 imm_expr.X_op = O_absent;
11831 s = expr_end;
11832 continue;
11833
11834 case 'C': /* ext size, becomes MSBD. */
11835 limlo = 1;
11836 limhi = 32;
11837 sizelo = 1;
11838 goto do_msbd;
11839 case 'G':
11840 limlo = 33;
11841 limhi = 64;
11842 sizelo = 33;
11843 goto do_msbd;
11844 case 'H':
11845 limlo = 33;
11846 limhi = 64;
11847 sizelo = 1;
11848 goto do_msbd;
11849 do_msbd:
11850 my_getExpression (&imm_expr, s);
11851 check_absolute_expr (ip, &imm_expr);
11852 /* The checks against (pos+size) don't transitively check
11853 "size" itself, assuming that "pos" is reasonable.
11854 We also need to check the lower bound of "size". */
11855 if ((long) imm_expr.X_add_number < sizelo
11856 || ((unsigned long) imm_expr.X_add_number
11857 + lastpos) < limlo
11858 || ((unsigned long) imm_expr.X_add_number
11859 + lastpos) > limhi)
11860 {
11861 as_bad (_("Improper extract size (%lu, position %lu)"),
11862 (unsigned long) imm_expr.X_add_number,
11863 (unsigned long) lastpos);
11864 imm_expr.X_add_number = limlo - lastpos;
11865 }
11866 INSERT_OPERAND (mips_opts.micromips,
11867 EXTMSBD, *ip, imm_expr.X_add_number - 1);
11868 imm_expr.X_op = O_absent;
11869 s = expr_end;
11870 continue;
11871
11872 case 'D':
11873 /* +D is for disassembly only; never match. */
11874 break;
11875
11876 case 'I':
11877 /* "+I" is like "I", except that imm2_expr is used. */
11878 my_getExpression (&imm2_expr, s);
11879 if (imm2_expr.X_op != O_big
11880 && imm2_expr.X_op != O_constant)
11881 insn_error = _("absolute expression required");
11882 if (HAVE_32BIT_GPRS)
11883 normalize_constant_expr (&imm2_expr);
11884 s = expr_end;
11885 continue;
11886
11887 case 'T': /* Coprocessor register. */
11888 gas_assert (!mips_opts.micromips);
11889 /* +T is for disassembly only; never match. */
11890 break;
11891
11892 case 't': /* Coprocessor register number. */
11893 gas_assert (!mips_opts.micromips);
11894 if (s[0] == '$' && ISDIGIT (s[1]))
11895 {
11896 ++s;
11897 regno = 0;
11898 do
11899 {
11900 regno *= 10;
11901 regno += *s - '0';
11902 ++s;
11903 }
11904 while (ISDIGIT (*s));
11905 if (regno > 31)
11906 as_bad (_("Invalid register number (%d)"), regno);
11907 else
11908 {
11909 INSERT_OPERAND (0, RT, *ip, regno);
11910 continue;
11911 }
11912 }
11913 else
11914 as_bad (_("Invalid coprocessor 0 register number"));
11915 break;
11916
11917 case 'x':
11918 /* bbit[01] and bbit[01]32 bit index. Give error if index
11919 is not in the valid range. */
11920 gas_assert (!mips_opts.micromips);
11921 my_getExpression (&imm_expr, s);
11922 check_absolute_expr (ip, &imm_expr);
11923 if ((unsigned) imm_expr.X_add_number > 31)
11924 {
11925 as_bad (_("Improper bit index (%lu)"),
11926 (unsigned long) imm_expr.X_add_number);
11927 imm_expr.X_add_number = 0;
11928 }
11929 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11930 imm_expr.X_op = O_absent;
11931 s = expr_end;
11932 continue;
11933
11934 case 'X':
11935 /* bbit[01] bit index when bbit is used but we generate
11936 bbit[01]32 because the index is over 32. Move to the
11937 next candidate if index is not in the valid range. */
11938 gas_assert (!mips_opts.micromips);
11939 my_getExpression (&imm_expr, s);
11940 check_absolute_expr (ip, &imm_expr);
11941 if ((unsigned) imm_expr.X_add_number < 32
11942 || (unsigned) imm_expr.X_add_number > 63)
11943 break;
11944 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11945 imm_expr.X_op = O_absent;
11946 s = expr_end;
11947 continue;
11948
11949 case 'p':
11950 /* cins, cins32, exts and exts32 position field. Give error
11951 if it's not in the valid range. */
11952 gas_assert (!mips_opts.micromips);
11953 my_getExpression (&imm_expr, s);
11954 check_absolute_expr (ip, &imm_expr);
11955 if ((unsigned) imm_expr.X_add_number > 31)
11956 {
11957 as_bad (_("Improper position (%lu)"),
11958 (unsigned long) imm_expr.X_add_number);
11959 imm_expr.X_add_number = 0;
11960 }
11961 /* Make the pos explicit to simplify +S. */
11962 lastpos = imm_expr.X_add_number + 32;
11963 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11964 imm_expr.X_op = O_absent;
11965 s = expr_end;
11966 continue;
11967
11968 case 'P':
11969 /* cins, cins32, exts and exts32 position field. Move to
11970 the next candidate if it's not in the valid range. */
11971 gas_assert (!mips_opts.micromips);
11972 my_getExpression (&imm_expr, s);
11973 check_absolute_expr (ip, &imm_expr);
11974 if ((unsigned) imm_expr.X_add_number < 32
11975 || (unsigned) imm_expr.X_add_number > 63)
11976 break;
11977 lastpos = imm_expr.X_add_number;
11978 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11979 imm_expr.X_op = O_absent;
11980 s = expr_end;
11981 continue;
11982
11983 case 's':
11984 /* cins and exts length-minus-one field. */
11985 gas_assert (!mips_opts.micromips);
11986 my_getExpression (&imm_expr, s);
11987 check_absolute_expr (ip, &imm_expr);
11988 if ((unsigned long) imm_expr.X_add_number > 31)
11989 {
11990 as_bad (_("Improper size (%lu)"),
11991 (unsigned long) imm_expr.X_add_number);
11992 imm_expr.X_add_number = 0;
11993 }
11994 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11995 imm_expr.X_op = O_absent;
11996 s = expr_end;
11997 continue;
11998
11999 case 'S':
12000 /* cins32/exts32 and cins/exts aliasing cint32/exts32
12001 length-minus-one field. */
12002 gas_assert (!mips_opts.micromips);
12003 my_getExpression (&imm_expr, s);
12004 check_absolute_expr (ip, &imm_expr);
12005 if ((long) imm_expr.X_add_number < 0
12006 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
12007 {
12008 as_bad (_("Improper size (%lu)"),
12009 (unsigned long) imm_expr.X_add_number);
12010 imm_expr.X_add_number = 0;
12011 }
12012 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12013 imm_expr.X_op = O_absent;
12014 s = expr_end;
12015 continue;
12016
12017 case 'Q':
12018 /* seqi/snei immediate field. */
12019 gas_assert (!mips_opts.micromips);
12020 my_getExpression (&imm_expr, s);
12021 check_absolute_expr (ip, &imm_expr);
12022 if ((long) imm_expr.X_add_number < -512
12023 || (long) imm_expr.X_add_number >= 512)
12024 {
12025 as_bad (_("Improper immediate (%ld)"),
12026 (long) imm_expr.X_add_number);
12027 imm_expr.X_add_number = 0;
12028 }
12029 INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
12030 imm_expr.X_op = O_absent;
12031 s = expr_end;
12032 continue;
12033
12034 case 'a': /* 8-bit signed offset in bit 6 */
12035 gas_assert (!mips_opts.micromips);
12036 my_getExpression (&imm_expr, s);
12037 check_absolute_expr (ip, &imm_expr);
12038 min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
12039 max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
12040 if (imm_expr.X_add_number < min_range
12041 || imm_expr.X_add_number > max_range)
12042 {
12043 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12044 (long) min_range, (long) max_range,
12045 (long) imm_expr.X_add_number);
12046 }
12047 INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
12048 imm_expr.X_op = O_absent;
12049 s = expr_end;
12050 continue;
12051
12052 case 'b': /* 8-bit signed offset in bit 3 */
12053 gas_assert (!mips_opts.micromips);
12054 my_getExpression (&imm_expr, s);
12055 check_absolute_expr (ip, &imm_expr);
12056 min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
12057 max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
12058 if (imm_expr.X_add_number < min_range
12059 || imm_expr.X_add_number > max_range)
12060 {
12061 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12062 (long) min_range, (long) max_range,
12063 (long) imm_expr.X_add_number);
12064 }
12065 INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
12066 imm_expr.X_op = O_absent;
12067 s = expr_end;
12068 continue;
12069
12070 case 'c': /* 9-bit signed offset in bit 6 */
12071 gas_assert (!mips_opts.micromips);
12072 my_getExpression (&imm_expr, s);
12073 check_absolute_expr (ip, &imm_expr);
12074 min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
12075 max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
12076 /* We check the offset range before adjusted. */
12077 min_range <<= 4;
12078 max_range <<= 4;
12079 if (imm_expr.X_add_number < min_range
12080 || imm_expr.X_add_number > max_range)
12081 {
12082 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12083 (long) min_range, (long) max_range,
12084 (long) imm_expr.X_add_number);
12085 }
12086 if (imm_expr.X_add_number & 0xf)
12087 {
12088 as_bad (_("Offset not 16 bytes alignment (%ld)"),
12089 (long) imm_expr.X_add_number);
12090 }
12091 /* Right shift 4 bits to adjust the offset operand. */
12092 INSERT_OPERAND (0, OFFSET_C, *ip,
12093 imm_expr.X_add_number >> 4);
12094 imm_expr.X_op = O_absent;
12095 s = expr_end;
12096 continue;
12097
12098 case 'z':
12099 gas_assert (!mips_opts.micromips);
12100 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
12101 break;
12102 if (regno == AT && mips_opts.at)
12103 {
12104 if (mips_opts.at == ATREG)
12105 as_warn (_("used $at without \".set noat\""));
12106 else
12107 as_warn (_("used $%u with \".set at=$%u\""),
12108 regno, mips_opts.at);
12109 }
12110 INSERT_OPERAND (0, RZ, *ip, regno);
12111 continue;
12112
12113 case 'Z':
12114 gas_assert (!mips_opts.micromips);
12115 if (!reg_lookup (&s, RTYPE_FPU, &regno))
12116 break;
12117 INSERT_OPERAND (0, FZ, *ip, regno);
12118 continue;
12119
12120 case 'j':
12121 {
12122 int shift = 8;
12123 size_t i;
12124 /* Check whether there is only a single bracketed expression
12125 left. If so, it must be the base register and the
12126 constant must be zero. */
12127 if (*s == '(' && strchr (s + 1, '(') == 0)
12128 continue;
12129
12130 /* If this value won't fit into the offset, then go find
12131 a macro that will generate a 16- or 32-bit offset code
12132 pattern. */
12133 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12134 if ((i == 0 && (imm_expr.X_op != O_constant
12135 || imm_expr.X_add_number >= 1 << shift
12136 || imm_expr.X_add_number < -1 << shift))
12137 || i > 0)
12138 {
12139 imm_expr.X_op = O_absent;
12140 break;
12141 }
12142 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, *ip,
12143 imm_expr.X_add_number);
12144 imm_expr.X_op = O_absent;
12145 s = expr_end;
12146 }
12147 continue;
12148
12149 default:
12150 as_bad (_("Internal error: bad %s opcode "
12151 "(unknown extension operand type `+%c'): %s %s"),
12152 mips_opts.micromips ? "microMIPS" : "MIPS",
12153 *args, insn->name, insn->args);
12154 /* Further processing is fruitless. */
12155 return;
12156 }
12157 break;
12158
12159 case '.': /* 10-bit offset. */
12160 gas_assert (mips_opts.micromips);
12161 case '~': /* 12-bit offset. */
12162 {
12163 int shift = *args == '.' ? 9 : 11;
12164 size_t i;
12165
12166 /* Check whether there is only a single bracketed expression
12167 left. If so, it must be the base register and the
12168 constant must be zero. */
12169 if (*s == '(' && strchr (s + 1, '(') == 0)
12170 continue;
12171
12172 /* If this value won't fit into the offset, then go find
12173 a macro that will generate a 16- or 32-bit offset code
12174 pattern. */
12175 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12176 if ((i == 0 && (imm_expr.X_op != O_constant
12177 || imm_expr.X_add_number >= 1 << shift
12178 || imm_expr.X_add_number < -1 << shift))
12179 || i > 0)
12180 {
12181 imm_expr.X_op = O_absent;
12182 break;
12183 }
12184 if (shift == 9)
12185 INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
12186 else
12187 INSERT_OPERAND (mips_opts.micromips,
12188 OFFSET12, *ip, imm_expr.X_add_number);
12189 imm_expr.X_op = O_absent;
12190 s = expr_end;
12191 }
12192 continue;
12193
12194 case '<': /* must be at least one digit */
12195 /*
12196 * According to the manual, if the shift amount is greater
12197 * than 31 or less than 0, then the shift amount should be
12198 * mod 32. In reality the mips assembler issues an error.
12199 * We issue a warning and mask out all but the low 5 bits.
12200 */
12201 my_getExpression (&imm_expr, s);
12202 check_absolute_expr (ip, &imm_expr);
12203 if ((unsigned long) imm_expr.X_add_number > 31)
12204 as_warn (_("Improper shift amount (%lu)"),
12205 (unsigned long) imm_expr.X_add_number);
12206 INSERT_OPERAND (mips_opts.micromips,
12207 SHAMT, *ip, imm_expr.X_add_number);
12208 imm_expr.X_op = O_absent;
12209 s = expr_end;
12210 continue;
12211
12212 case '>': /* shift amount minus 32 */
12213 my_getExpression (&imm_expr, s);
12214 check_absolute_expr (ip, &imm_expr);
12215 if ((unsigned long) imm_expr.X_add_number < 32
12216 || (unsigned long) imm_expr.X_add_number > 63)
12217 break;
12218 INSERT_OPERAND (mips_opts.micromips,
12219 SHAMT, *ip, imm_expr.X_add_number - 32);
12220 imm_expr.X_op = O_absent;
12221 s = expr_end;
12222 continue;
12223
12224 case 'k': /* CACHE code. */
12225 case 'h': /* PREFX code. */
12226 case '1': /* SYNC type. */
12227 my_getExpression (&imm_expr, s);
12228 check_absolute_expr (ip, &imm_expr);
12229 if ((unsigned long) imm_expr.X_add_number > 31)
12230 as_warn (_("Invalid value for `%s' (%lu)"),
12231 ip->insn_mo->name,
12232 (unsigned long) imm_expr.X_add_number);
12233 switch (*args)
12234 {
12235 case 'k':
12236 if (mips_fix_cn63xxp1
12237 && !mips_opts.micromips
12238 && strcmp ("pref", insn->name) == 0)
12239 switch (imm_expr.X_add_number)
12240 {
12241 case 5:
12242 case 25:
12243 case 26:
12244 case 27:
12245 case 28:
12246 case 29:
12247 case 30:
12248 case 31: /* These are ok. */
12249 break;
12250
12251 default: /* The rest must be changed to 28. */
12252 imm_expr.X_add_number = 28;
12253 break;
12254 }
12255 INSERT_OPERAND (mips_opts.micromips,
12256 CACHE, *ip, imm_expr.X_add_number);
12257 break;
12258 case 'h':
12259 INSERT_OPERAND (mips_opts.micromips,
12260 PREFX, *ip, imm_expr.X_add_number);
12261 break;
12262 case '1':
12263 INSERT_OPERAND (mips_opts.micromips,
12264 STYPE, *ip, imm_expr.X_add_number);
12265 break;
12266 }
12267 imm_expr.X_op = O_absent;
12268 s = expr_end;
12269 continue;
12270
12271 case 'c': /* BREAK code. */
12272 {
12273 unsigned long mask = (mips_opts.micromips
12274 ? MICROMIPSOP_MASK_CODE
12275 : OP_MASK_CODE);
12276
12277 my_getExpression (&imm_expr, s);
12278 check_absolute_expr (ip, &imm_expr);
12279 if ((unsigned long) imm_expr.X_add_number > mask)
12280 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12281 ip->insn_mo->name,
12282 mask, (unsigned long) imm_expr.X_add_number);
12283 INSERT_OPERAND (mips_opts.micromips,
12284 CODE, *ip, imm_expr.X_add_number);
12285 imm_expr.X_op = O_absent;
12286 s = expr_end;
12287 }
12288 continue;
12289
12290 case 'q': /* Lower BREAK code. */
12291 {
12292 unsigned long mask = (mips_opts.micromips
12293 ? MICROMIPSOP_MASK_CODE2
12294 : OP_MASK_CODE2);
12295
12296 my_getExpression (&imm_expr, s);
12297 check_absolute_expr (ip, &imm_expr);
12298 if ((unsigned long) imm_expr.X_add_number > mask)
12299 as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
12300 ip->insn_mo->name,
12301 mask, (unsigned long) imm_expr.X_add_number);
12302 INSERT_OPERAND (mips_opts.micromips,
12303 CODE2, *ip, imm_expr.X_add_number);
12304 imm_expr.X_op = O_absent;
12305 s = expr_end;
12306 }
12307 continue;
12308
12309 case 'B': /* 20- or 10-bit syscall/break/wait code. */
12310 {
12311 unsigned long mask = (mips_opts.micromips
12312 ? MICROMIPSOP_MASK_CODE10
12313 : OP_MASK_CODE20);
12314
12315 my_getExpression (&imm_expr, s);
12316 check_absolute_expr (ip, &imm_expr);
12317 if ((unsigned long) imm_expr.X_add_number > mask)
12318 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12319 ip->insn_mo->name,
12320 mask, (unsigned long) imm_expr.X_add_number);
12321 if (mips_opts.micromips)
12322 INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
12323 else
12324 INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
12325 imm_expr.X_op = O_absent;
12326 s = expr_end;
12327 }
12328 continue;
12329
12330 case 'C': /* 25- or 23-bit coprocessor code. */
12331 {
12332 unsigned long mask = (mips_opts.micromips
12333 ? MICROMIPSOP_MASK_COPZ
12334 : OP_MASK_COPZ);
12335
12336 my_getExpression (&imm_expr, s);
12337 check_absolute_expr (ip, &imm_expr);
12338 if ((unsigned long) imm_expr.X_add_number > mask)
12339 as_warn (_("Coproccesor code > %u bits (%lu)"),
12340 mips_opts.micromips ? 23U : 25U,
12341 (unsigned long) imm_expr.X_add_number);
12342 INSERT_OPERAND (mips_opts.micromips,
12343 COPZ, *ip, imm_expr.X_add_number);
12344 imm_expr.X_op = O_absent;
12345 s = expr_end;
12346 }
12347 continue;
12348
12349 case 'J': /* 19-bit WAIT code. */
12350 gas_assert (!mips_opts.micromips);
12351 my_getExpression (&imm_expr, s);
12352 check_absolute_expr (ip, &imm_expr);
12353 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
12354 {
12355 as_warn (_("Illegal 19-bit code (%lu)"),
12356 (unsigned long) imm_expr.X_add_number);
12357 imm_expr.X_add_number &= OP_MASK_CODE19;
12358 }
12359 INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
12360 imm_expr.X_op = O_absent;
12361 s = expr_end;
12362 continue;
12363
12364 case 'P': /* Performance register. */
12365 gas_assert (!mips_opts.micromips);
12366 my_getExpression (&imm_expr, s);
12367 check_absolute_expr (ip, &imm_expr);
12368 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
12369 as_warn (_("Invalid performance register (%lu)"),
12370 (unsigned long) imm_expr.X_add_number);
12371 if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
12372 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
12373 as_warn (_("Invalid performance register (%lu)"),
12374 (unsigned long) imm_expr.X_add_number);
12375 INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
12376 imm_expr.X_op = O_absent;
12377 s = expr_end;
12378 continue;
12379
12380 case 'G': /* Coprocessor destination register. */
12381 {
12382 unsigned long opcode = ip->insn_opcode;
12383 unsigned long mask;
12384 unsigned int types;
12385 int cop0;
12386
12387 if (mips_opts.micromips)
12388 {
12389 mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
12390 | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
12391 | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
12392 opcode &= mask;
12393 switch (opcode)
12394 {
12395 case 0x000000fc: /* mfc0 */
12396 case 0x000002fc: /* mtc0 */
12397 case 0x580000fc: /* dmfc0 */
12398 case 0x580002fc: /* dmtc0 */
12399 cop0 = 1;
12400 break;
12401 default:
12402 cop0 = 0;
12403 break;
12404 }
12405 }
12406 else
12407 {
12408 opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
12409 cop0 = opcode == OP_OP_COP0;
12410 }
12411 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
12412 ok = reg_lookup (&s, types, &regno);
12413 if (mips_opts.micromips)
12414 INSERT_OPERAND (1, RS, *ip, regno);
12415 else
12416 INSERT_OPERAND (0, RD, *ip, regno);
12417 if (ok)
12418 {
12419 lastregno = regno;
12420 continue;
12421 }
12422 }
12423 break;
12424
12425 case 'y': /* ALNV.PS source register. */
12426 gas_assert (mips_opts.micromips);
12427 goto do_reg;
12428 case 'x': /* Ignore register name. */
12429 case 'U': /* Destination register (CLO/CLZ). */
12430 case 'g': /* Coprocessor destination register. */
12431 gas_assert (!mips_opts.micromips);
12432 case 'b': /* Base register. */
12433 case 'd': /* Destination register. */
12434 case 's': /* Source register. */
12435 case 't': /* Target register. */
12436 case 'r': /* Both target and source. */
12437 case 'v': /* Both dest and source. */
12438 case 'w': /* Both dest and target. */
12439 case 'E': /* Coprocessor target register. */
12440 case 'K': /* RDHWR destination register. */
12441 case 'z': /* Must be zero register. */
12442 do_reg:
12443 s_reset = s;
12444 if (*args == 'E' || *args == 'K')
12445 ok = reg_lookup (&s, RTYPE_NUM, &regno);
12446 else
12447 {
12448 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12449 if (regno == AT && mips_opts.at)
12450 {
12451 if (mips_opts.at == ATREG)
12452 as_warn (_("Used $at without \".set noat\""));
12453 else
12454 as_warn (_("Used $%u with \".set at=$%u\""),
12455 regno, mips_opts.at);
12456 }
12457 }
12458 if (ok)
12459 {
12460 c = *args;
12461 if (*s == ' ')
12462 ++s;
12463 if (args[1] != *s)
12464 {
12465 if (c == 'r' || c == 'v' || c == 'w')
12466 {
12467 regno = lastregno;
12468 s = s_reset;
12469 ++args;
12470 }
12471 }
12472 /* 'z' only matches $0. */
12473 if (c == 'z' && regno != 0)
12474 break;
12475
12476 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12477 {
12478 if (regno == lastregno)
12479 {
12480 insn_error
12481 = _("Source and destination must be different");
12482 continue;
12483 }
12484 if (regno == 31 && lastregno == 0xffffffff)
12485 {
12486 insn_error
12487 = _("A destination register must be supplied");
12488 continue;
12489 }
12490 }
12491 /* Now that we have assembled one operand, we use the args
12492 string to figure out where it goes in the instruction. */
12493 switch (c)
12494 {
12495 case 'r':
12496 case 's':
12497 case 'v':
12498 case 'b':
12499 INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12500 break;
12501
12502 case 'K':
12503 if (mips_opts.micromips)
12504 INSERT_OPERAND (1, RS, *ip, regno);
12505 else
12506 INSERT_OPERAND (0, RD, *ip, regno);
12507 break;
12508
12509 case 'd':
12510 case 'g':
12511 INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12512 break;
12513
12514 case 'U':
12515 gas_assert (!mips_opts.micromips);
12516 INSERT_OPERAND (0, RD, *ip, regno);
12517 INSERT_OPERAND (0, RT, *ip, regno);
12518 break;
12519
12520 case 'w':
12521 case 't':
12522 case 'E':
12523 INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12524 break;
12525
12526 case 'y':
12527 gas_assert (mips_opts.micromips);
12528 INSERT_OPERAND (1, RS3, *ip, regno);
12529 break;
12530
12531 case 'x':
12532 /* This case exists because on the r3000 trunc
12533 expands into a macro which requires a gp
12534 register. On the r6000 or r4000 it is
12535 assembled into a single instruction which
12536 ignores the register. Thus the insn version
12537 is MIPS_ISA2 and uses 'x', and the macro
12538 version is MIPS_ISA1 and uses 't'. */
12539 break;
12540
12541 case 'z':
12542 /* This case is for the div instruction, which
12543 acts differently if the destination argument
12544 is $0. This only matches $0, and is checked
12545 outside the switch. */
12546 break;
12547 }
12548 lastregno = regno;
12549 continue;
12550 }
12551 switch (*args++)
12552 {
12553 case 'r':
12554 case 'v':
12555 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12556 continue;
12557
12558 case 'w':
12559 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12560 continue;
12561 }
12562 break;
12563
12564 case 'O': /* MDMX alignment immediate constant. */
12565 gas_assert (!mips_opts.micromips);
12566 my_getExpression (&imm_expr, s);
12567 check_absolute_expr (ip, &imm_expr);
12568 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12569 as_warn (_("Improper align amount (%ld), using low bits"),
12570 (long) imm_expr.X_add_number);
12571 INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12572 imm_expr.X_op = O_absent;
12573 s = expr_end;
12574 continue;
12575
12576 case 'Q': /* MDMX vector, element sel, or const. */
12577 if (s[0] != '$')
12578 {
12579 /* MDMX Immediate. */
12580 gas_assert (!mips_opts.micromips);
12581 my_getExpression (&imm_expr, s);
12582 check_absolute_expr (ip, &imm_expr);
12583 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12584 as_warn (_("Invalid MDMX Immediate (%ld)"),
12585 (long) imm_expr.X_add_number);
12586 INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12587 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12588 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12589 else
12590 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12591 imm_expr.X_op = O_absent;
12592 s = expr_end;
12593 continue;
12594 }
12595 /* Not MDMX Immediate. Fall through. */
12596 case 'X': /* MDMX destination register. */
12597 case 'Y': /* MDMX source register. */
12598 case 'Z': /* MDMX target register. */
12599 is_mdmx = 1;
12600 case 'W':
12601 gas_assert (!mips_opts.micromips);
12602 case 'D': /* Floating point destination register. */
12603 case 'S': /* Floating point source register. */
12604 case 'T': /* Floating point target register. */
12605 case 'R': /* Floating point source register. */
12606 case 'V':
12607 rtype = RTYPE_FPU;
12608 if (is_mdmx
12609 || ((mips_opts.ase & ASE_MDMX)
12610 && (ip->insn_mo->pinfo & FP_D)
12611 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12612 | INSN_COPROC_MEMORY_DELAY
12613 | INSN_LOAD_COPROC_DELAY
12614 | INSN_LOAD_MEMORY_DELAY
12615 | INSN_STORE_MEMORY))))
12616 rtype |= RTYPE_VEC;
12617 s_reset = s;
12618 if (reg_lookup (&s, rtype, &regno))
12619 {
12620 if ((regno & 1) != 0
12621 && HAVE_32BIT_FPRS
12622 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12623 as_warn (_("Float register should be even, was %d"),
12624 regno);
12625
12626 c = *args;
12627 if (*s == ' ')
12628 ++s;
12629 if (args[1] != *s)
12630 {
12631 if (c == 'V' || c == 'W')
12632 {
12633 regno = lastregno;
12634 s = s_reset;
12635 ++args;
12636 }
12637 }
12638 switch (c)
12639 {
12640 case 'D':
12641 case 'X':
12642 INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12643 break;
12644
12645 case 'V':
12646 case 'S':
12647 case 'Y':
12648 INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12649 break;
12650
12651 case 'Q':
12652 /* This is like 'Z', but also needs to fix the MDMX
12653 vector/scalar select bits. Note that the
12654 scalar immediate case is handled above. */
12655 if (*s == '[')
12656 {
12657 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12658 int max_el = (is_qh ? 3 : 7);
12659 s++;
12660 my_getExpression(&imm_expr, s);
12661 check_absolute_expr (ip, &imm_expr);
12662 s = expr_end;
12663 if (imm_expr.X_add_number > max_el)
12664 as_bad (_("Bad element selector %ld"),
12665 (long) imm_expr.X_add_number);
12666 imm_expr.X_add_number &= max_el;
12667 ip->insn_opcode |= (imm_expr.X_add_number
12668 << (OP_SH_VSEL +
12669 (is_qh ? 2 : 1)));
12670 imm_expr.X_op = O_absent;
12671 if (*s != ']')
12672 as_warn (_("Expecting ']' found '%s'"), s);
12673 else
12674 s++;
12675 }
12676 else
12677 {
12678 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12679 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12680 << OP_SH_VSEL);
12681 else
12682 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12683 OP_SH_VSEL);
12684 }
12685 /* Fall through. */
12686 case 'W':
12687 case 'T':
12688 case 'Z':
12689 INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12690 break;
12691
12692 case 'R':
12693 INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12694 break;
12695 }
12696 lastregno = regno;
12697 continue;
12698 }
12699
12700 switch (*args++)
12701 {
12702 case 'V':
12703 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12704 continue;
12705
12706 case 'W':
12707 INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12708 continue;
12709 }
12710 break;
12711
12712 case 'I':
12713 my_getExpression (&imm_expr, s);
12714 if (imm_expr.X_op != O_big
12715 && imm_expr.X_op != O_constant)
12716 insn_error = _("absolute expression required");
12717 if (HAVE_32BIT_GPRS)
12718 normalize_constant_expr (&imm_expr);
12719 s = expr_end;
12720 continue;
12721
12722 case 'A':
12723 my_getExpression (&offset_expr, s);
12724 normalize_address_expr (&offset_expr);
12725 *imm_reloc = BFD_RELOC_32;
12726 s = expr_end;
12727 continue;
12728
12729 case 'F':
12730 case 'L':
12731 case 'f':
12732 case 'l':
12733 {
12734 int f64;
12735 int using_gprs;
12736 char *save_in;
12737 char *err;
12738 unsigned char temp[8];
12739 int len;
12740 unsigned int length;
12741 segT seg;
12742 subsegT subseg;
12743 char *p;
12744
12745 /* These only appear as the last operand in an
12746 instruction, and every instruction that accepts
12747 them in any variant accepts them in all variants.
12748 This means we don't have to worry about backing out
12749 any changes if the instruction does not match.
12750
12751 The difference between them is the size of the
12752 floating point constant and where it goes. For 'F'
12753 and 'L' the constant is 64 bits; for 'f' and 'l' it
12754 is 32 bits. Where the constant is placed is based
12755 on how the MIPS assembler does things:
12756 F -- .rdata
12757 L -- .lit8
12758 f -- immediate value
12759 l -- .lit4
12760
12761 The .lit4 and .lit8 sections are only used if
12762 permitted by the -G argument.
12763
12764 The code below needs to know whether the target register
12765 is 32 or 64 bits wide. It relies on the fact 'f' and
12766 'F' are used with GPR-based instructions and 'l' and
12767 'L' are used with FPR-based instructions. */
12768
12769 f64 = *args == 'F' || *args == 'L';
12770 using_gprs = *args == 'F' || *args == 'f';
12771
12772 save_in = input_line_pointer;
12773 input_line_pointer = s;
12774 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12775 length = len;
12776 s = input_line_pointer;
12777 input_line_pointer = save_in;
12778 if (err != NULL && *err != '\0')
12779 {
12780 as_bad (_("Bad floating point constant: %s"), err);
12781 memset (temp, '\0', sizeof temp);
12782 length = f64 ? 8 : 4;
12783 }
12784
12785 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12786
12787 if (*args == 'f'
12788 || (*args == 'l'
12789 && (g_switch_value < 4
12790 || (temp[0] == 0 && temp[1] == 0)
12791 || (temp[2] == 0 && temp[3] == 0))))
12792 {
12793 imm_expr.X_op = O_constant;
12794 if (!target_big_endian)
12795 imm_expr.X_add_number = bfd_getl32 (temp);
12796 else
12797 imm_expr.X_add_number = bfd_getb32 (temp);
12798 }
12799 else if (length > 4
12800 && !mips_disable_float_construction
12801 /* Constants can only be constructed in GPRs and
12802 copied to FPRs if the GPRs are at least as wide
12803 as the FPRs. Force the constant into memory if
12804 we are using 64-bit FPRs but the GPRs are only
12805 32 bits wide. */
12806 && (using_gprs
12807 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12808 && ((temp[0] == 0 && temp[1] == 0)
12809 || (temp[2] == 0 && temp[3] == 0))
12810 && ((temp[4] == 0 && temp[5] == 0)
12811 || (temp[6] == 0 && temp[7] == 0)))
12812 {
12813 /* The value is simple enough to load with a couple of
12814 instructions. If using 32-bit registers, set
12815 imm_expr to the high order 32 bits and offset_expr to
12816 the low order 32 bits. Otherwise, set imm_expr to
12817 the entire 64 bit constant. */
12818 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12819 {
12820 imm_expr.X_op = O_constant;
12821 offset_expr.X_op = O_constant;
12822 if (!target_big_endian)
12823 {
12824 imm_expr.X_add_number = bfd_getl32 (temp + 4);
12825 offset_expr.X_add_number = bfd_getl32 (temp);
12826 }
12827 else
12828 {
12829 imm_expr.X_add_number = bfd_getb32 (temp);
12830 offset_expr.X_add_number = bfd_getb32 (temp + 4);
12831 }
12832 if (offset_expr.X_add_number == 0)
12833 offset_expr.X_op = O_absent;
12834 }
12835 else
12836 {
12837 imm_expr.X_op = O_constant;
12838 if (!target_big_endian)
12839 imm_expr.X_add_number = bfd_getl64 (temp);
12840 else
12841 imm_expr.X_add_number = bfd_getb64 (temp);
12842 }
12843 }
12844 else
12845 {
12846 const char *newname;
12847 segT new_seg;
12848
12849 /* Switch to the right section. */
12850 seg = now_seg;
12851 subseg = now_subseg;
12852 switch (*args)
12853 {
12854 default: /* unused default case avoids warnings. */
12855 case 'L':
12856 newname = RDATA_SECTION_NAME;
12857 if (g_switch_value >= 8)
12858 newname = ".lit8";
12859 break;
12860 case 'F':
12861 newname = RDATA_SECTION_NAME;
12862 break;
12863 case 'l':
12864 gas_assert (g_switch_value >= 4);
12865 newname = ".lit4";
12866 break;
12867 }
12868 new_seg = subseg_new (newname, (subsegT) 0);
12869 bfd_set_section_flags (stdoutput, new_seg,
12870 (SEC_ALLOC
12871 | SEC_LOAD
12872 | SEC_READONLY
12873 | SEC_DATA));
12874 frag_align (*args == 'l' ? 2 : 3, 0, 0);
12875 if (strncmp (TARGET_OS, "elf", 3) != 0)
12876 record_alignment (new_seg, 4);
12877 else
12878 record_alignment (new_seg, *args == 'l' ? 2 : 3);
12879 if (seg == now_seg)
12880 as_bad (_("Can't use floating point insn in this section"));
12881
12882 /* Set the argument to the current address in the
12883 section. */
12884 offset_expr.X_op = O_symbol;
12885 offset_expr.X_add_symbol = symbol_temp_new_now ();
12886 offset_expr.X_add_number = 0;
12887
12888 /* Put the floating point number into the section. */
12889 p = frag_more ((int) length);
12890 memcpy (p, temp, length);
12891
12892 /* Switch back to the original section. */
12893 subseg_set (seg, subseg);
12894 }
12895 }
12896 continue;
12897
12898 case 'i': /* 16-bit unsigned immediate. */
12899 case 'j': /* 16-bit signed immediate. */
12900 *imm_reloc = BFD_RELOC_LO16;
12901 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12902 {
12903 int more;
12904 offsetT minval, maxval;
12905
12906 more = (insn + 1 < past
12907 && strcmp (insn->name, insn[1].name) == 0);
12908
12909 /* For compatibility with older assemblers, we accept
12910 0x8000-0xffff as signed 16-bit numbers when only
12911 signed numbers are allowed. */
12912 if (*args == 'i')
12913 minval = 0, maxval = 0xffff;
12914 else if (more)
12915 minval = -0x8000, maxval = 0x7fff;
12916 else
12917 minval = -0x8000, maxval = 0xffff;
12918
12919 if (imm_expr.X_op != O_constant
12920 || imm_expr.X_add_number < minval
12921 || imm_expr.X_add_number > maxval)
12922 {
12923 if (more)
12924 break;
12925 if (imm_expr.X_op == O_constant
12926 || imm_expr.X_op == O_big)
12927 as_bad (_("Expression out of range"));
12928 }
12929 }
12930 s = expr_end;
12931 continue;
12932
12933 case 'o': /* 16-bit offset. */
12934 offset_reloc[0] = BFD_RELOC_LO16;
12935 offset_reloc[1] = BFD_RELOC_UNUSED;
12936 offset_reloc[2] = BFD_RELOC_UNUSED;
12937
12938 /* Check whether there is only a single bracketed expression
12939 left. If so, it must be the base register and the
12940 constant must be zero. */
12941 if (*s == '(' && strchr (s + 1, '(') == 0)
12942 {
12943 offset_expr.X_op = O_constant;
12944 offset_expr.X_add_number = 0;
12945 continue;
12946 }
12947
12948 /* If this value won't fit into a 16 bit offset, then go
12949 find a macro that will generate the 32 bit offset
12950 code pattern. */
12951 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12952 && (offset_expr.X_op != O_constant
12953 || offset_expr.X_add_number >= 0x8000
12954 || offset_expr.X_add_number < -0x8000))
12955 break;
12956
12957 s = expr_end;
12958 continue;
12959
12960 case 'p': /* PC-relative offset. */
12961 *offset_reloc = BFD_RELOC_16_PCREL_S2;
12962 my_getExpression (&offset_expr, s);
12963 s = expr_end;
12964 continue;
12965
12966 case 'u': /* Upper 16 bits. */
12967 *imm_reloc = BFD_RELOC_LO16;
12968 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12969 && imm_expr.X_op == O_constant
12970 && (imm_expr.X_add_number < 0
12971 || imm_expr.X_add_number >= 0x10000))
12972 as_bad (_("lui expression (%lu) not in range 0..65535"),
12973 (unsigned long) imm_expr.X_add_number);
12974 s = expr_end;
12975 continue;
12976
12977 case 'a': /* 26-bit address. */
12978 *offset_reloc = BFD_RELOC_MIPS_JMP;
12979 my_getExpression (&offset_expr, s);
12980 s = expr_end;
12981 continue;
12982
12983 case 'N': /* 3-bit branch condition code. */
12984 case 'M': /* 3-bit compare condition code. */
12985 rtype = RTYPE_CCC;
12986 if (ip->insn_mo->pinfo & (FP_D | FP_S))
12987 rtype |= RTYPE_FCC;
12988 if (!reg_lookup (&s, rtype, &regno))
12989 break;
12990 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12991 || strcmp (str + strlen (str) - 5, "any2f") == 0
12992 || strcmp (str + strlen (str) - 5, "any2t") == 0)
12993 && (regno & 1) != 0)
12994 as_warn (_("Condition code register should be even for %s, "
12995 "was %d"),
12996 str, regno);
12997 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12998 || strcmp (str + strlen (str) - 5, "any4t") == 0)
12999 && (regno & 3) != 0)
13000 as_warn (_("Condition code register should be 0 or 4 for %s, "
13001 "was %d"),
13002 str, regno);
13003 if (*args == 'N')
13004 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
13005 else
13006 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
13007 continue;
13008
13009 case 'H':
13010 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
13011 s += 2;
13012 if (ISDIGIT (*s))
13013 {
13014 c = 0;
13015 do
13016 {
13017 c *= 10;
13018 c += *s - '0';
13019 ++s;
13020 }
13021 while (ISDIGIT (*s));
13022 }
13023 else
13024 c = 8; /* Invalid sel value. */
13025
13026 if (c > 7)
13027 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
13028 INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
13029 continue;
13030
13031 case 'e':
13032 gas_assert (!mips_opts.micromips);
13033 /* Must be at least one digit. */
13034 my_getExpression (&imm_expr, s);
13035 check_absolute_expr (ip, &imm_expr);
13036
13037 if ((unsigned long) imm_expr.X_add_number
13038 > (unsigned long) OP_MASK_VECBYTE)
13039 {
13040 as_bad (_("bad byte vector index (%ld)"),
13041 (long) imm_expr.X_add_number);
13042 imm_expr.X_add_number = 0;
13043 }
13044
13045 INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
13046 imm_expr.X_op = O_absent;
13047 s = expr_end;
13048 continue;
13049
13050 case '%':
13051 gas_assert (!mips_opts.micromips);
13052 my_getExpression (&imm_expr, s);
13053 check_absolute_expr (ip, &imm_expr);
13054
13055 if ((unsigned long) imm_expr.X_add_number
13056 > (unsigned long) OP_MASK_VECALIGN)
13057 {
13058 as_bad (_("bad byte vector index (%ld)"),
13059 (long) imm_expr.X_add_number);
13060 imm_expr.X_add_number = 0;
13061 }
13062
13063 INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
13064 imm_expr.X_op = O_absent;
13065 s = expr_end;
13066 continue;
13067
13068 case 'm': /* Opcode extension character. */
13069 gas_assert (mips_opts.micromips);
13070 c = *++args;
13071 switch (c)
13072 {
13073 case 'r':
13074 if (strncmp (s, "$pc", 3) == 0)
13075 {
13076 s += 3;
13077 continue;
13078 }
13079 break;
13080
13081 case 'a':
13082 case 'b':
13083 case 'c':
13084 case 'd':
13085 case 'e':
13086 case 'f':
13087 case 'g':
13088 case 'h':
13089 case 'i':
13090 case 'j':
13091 case 'l':
13092 case 'm':
13093 case 'n':
13094 case 'p':
13095 case 'q':
13096 case 's':
13097 case 't':
13098 case 'x':
13099 case 'y':
13100 case 'z':
13101 s_reset = s;
13102 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
13103 if (regno == AT && mips_opts.at)
13104 {
13105 if (mips_opts.at == ATREG)
13106 as_warn (_("Used $at without \".set noat\""));
13107 else
13108 as_warn (_("Used $%u with \".set at=$%u\""),
13109 regno, mips_opts.at);
13110 }
13111 if (!ok)
13112 {
13113 if (c == 'c')
13114 {
13115 gas_assert (args[1] == ',');
13116 regno = lastregno;
13117 ++args;
13118 }
13119 else if (c == 't')
13120 {
13121 gas_assert (args[1] == ',');
13122 ++args;
13123 continue; /* Nothing to do. */
13124 }
13125 else
13126 break;
13127 }
13128
13129 if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
13130 {
13131 if (regno == lastregno)
13132 {
13133 insn_error
13134 = _("Source and destination must be different");
13135 continue;
13136 }
13137 if (regno == 31 && lastregno == 0xffffffff)
13138 {
13139 insn_error
13140 = _("A destination register must be supplied");
13141 continue;
13142 }
13143 }
13144
13145 if (*s == ' ')
13146 ++s;
13147 if (args[1] != *s)
13148 {
13149 if (c == 'e')
13150 {
13151 gas_assert (args[1] == ',');
13152 regno = lastregno;
13153 s = s_reset;
13154 ++args;
13155 }
13156 else if (c == 't')
13157 {
13158 gas_assert (args[1] == ',');
13159 s = s_reset;
13160 ++args;
13161 continue; /* Nothing to do. */
13162 }
13163 }
13164
13165 /* Make sure regno is the same as lastregno. */
13166 if (c == 't' && regno != lastregno)
13167 break;
13168
13169 /* Make sure regno is the same as destregno. */
13170 if (c == 'x' && regno != destregno)
13171 break;
13172
13173 /* We need to save regno, before regno maps to the
13174 microMIPS register encoding. */
13175 lastregno = regno;
13176
13177 if (c == 'f')
13178 destregno = regno;
13179
13180 switch (c)
13181 {
13182 case 'a':
13183 if (regno != GP)
13184 regno = ILLEGAL_REG;
13185 break;
13186
13187 case 'b':
13188 regno = mips32_to_micromips_reg_b_map[regno];
13189 break;
13190
13191 case 'c':
13192 regno = mips32_to_micromips_reg_c_map[regno];
13193 break;
13194
13195 case 'd':
13196 regno = mips32_to_micromips_reg_d_map[regno];
13197 break;
13198
13199 case 'e':
13200 regno = mips32_to_micromips_reg_e_map[regno];
13201 break;
13202
13203 case 'f':
13204 regno = mips32_to_micromips_reg_f_map[regno];
13205 break;
13206
13207 case 'g':
13208 regno = mips32_to_micromips_reg_g_map[regno];
13209 break;
13210
13211 case 'h':
13212 regno = mips32_to_micromips_reg_h_map[regno];
13213 break;
13214
13215 case 'i':
13216 switch (EXTRACT_OPERAND (1, MI, *ip))
13217 {
13218 case 4:
13219 if (regno == 21)
13220 regno = 3;
13221 else if (regno == 22)
13222 regno = 4;
13223 else if (regno == 5)
13224 regno = 5;
13225 else if (regno == 6)
13226 regno = 6;
13227 else if (regno == 7)
13228 regno = 7;
13229 else
13230 regno = ILLEGAL_REG;
13231 break;
13232
13233 case 5:
13234 if (regno == 6)
13235 regno = 0;
13236 else if (regno == 7)
13237 regno = 1;
13238 else
13239 regno = ILLEGAL_REG;
13240 break;
13241
13242 case 6:
13243 if (regno == 7)
13244 regno = 2;
13245 else
13246 regno = ILLEGAL_REG;
13247 break;
13248
13249 default:
13250 regno = ILLEGAL_REG;
13251 break;
13252 }
13253 break;
13254
13255 case 'l':
13256 regno = mips32_to_micromips_reg_l_map[regno];
13257 break;
13258
13259 case 'm':
13260 regno = mips32_to_micromips_reg_m_map[regno];
13261 break;
13262
13263 case 'n':
13264 regno = mips32_to_micromips_reg_n_map[regno];
13265 break;
13266
13267 case 'q':
13268 regno = mips32_to_micromips_reg_q_map[regno];
13269 break;
13270
13271 case 's':
13272 if (regno != SP)
13273 regno = ILLEGAL_REG;
13274 break;
13275
13276 case 'y':
13277 if (regno != 31)
13278 regno = ILLEGAL_REG;
13279 break;
13280
13281 case 'z':
13282 if (regno != ZERO)
13283 regno = ILLEGAL_REG;
13284 break;
13285
13286 case 'j': /* Do nothing. */
13287 case 'p':
13288 case 't':
13289 case 'x':
13290 break;
13291
13292 default:
13293 abort ();
13294 }
13295
13296 if (regno == ILLEGAL_REG)
13297 break;
13298
13299 switch (c)
13300 {
13301 case 'b':
13302 INSERT_OPERAND (1, MB, *ip, regno);
13303 break;
13304
13305 case 'c':
13306 INSERT_OPERAND (1, MC, *ip, regno);
13307 break;
13308
13309 case 'd':
13310 INSERT_OPERAND (1, MD, *ip, regno);
13311 break;
13312
13313 case 'e':
13314 INSERT_OPERAND (1, ME, *ip, regno);
13315 break;
13316
13317 case 'f':
13318 INSERT_OPERAND (1, MF, *ip, regno);
13319 break;
13320
13321 case 'g':
13322 INSERT_OPERAND (1, MG, *ip, regno);
13323 break;
13324
13325 case 'h':
13326 INSERT_OPERAND (1, MH, *ip, regno);
13327 break;
13328
13329 case 'i':
13330 INSERT_OPERAND (1, MI, *ip, regno);
13331 break;
13332
13333 case 'j':
13334 INSERT_OPERAND (1, MJ, *ip, regno);
13335 break;
13336
13337 case 'l':
13338 INSERT_OPERAND (1, ML, *ip, regno);
13339 break;
13340
13341 case 'm':
13342 INSERT_OPERAND (1, MM, *ip, regno);
13343 break;
13344
13345 case 'n':
13346 INSERT_OPERAND (1, MN, *ip, regno);
13347 break;
13348
13349 case 'p':
13350 INSERT_OPERAND (1, MP, *ip, regno);
13351 break;
13352
13353 case 'q':
13354 INSERT_OPERAND (1, MQ, *ip, regno);
13355 break;
13356
13357 case 'a': /* Do nothing. */
13358 case 's': /* Do nothing. */
13359 case 't': /* Do nothing. */
13360 case 'x': /* Do nothing. */
13361 case 'y': /* Do nothing. */
13362 case 'z': /* Do nothing. */
13363 break;
13364
13365 default:
13366 abort ();
13367 }
13368 continue;
13369
13370 case 'A':
13371 {
13372 bfd_reloc_code_real_type r[3];
13373 expressionS ep;
13374 int imm;
13375
13376 /* Check whether there is only a single bracketed
13377 expression left. If so, it must be the base register
13378 and the constant must be zero. */
13379 if (*s == '(' && strchr (s + 1, '(') == 0)
13380 {
13381 INSERT_OPERAND (1, IMMA, *ip, 0);
13382 continue;
13383 }
13384
13385 if (my_getSmallExpression (&ep, r, s) > 0
13386 || !expr_const_in_range (&ep, -64, 64, 2))
13387 break;
13388
13389 imm = ep.X_add_number >> 2;
13390 INSERT_OPERAND (1, IMMA, *ip, imm);
13391 }
13392 s = expr_end;
13393 continue;
13394
13395 case 'B':
13396 {
13397 bfd_reloc_code_real_type r[3];
13398 expressionS ep;
13399 int imm;
13400
13401 if (my_getSmallExpression (&ep, r, s) > 0
13402 || ep.X_op != O_constant)
13403 break;
13404
13405 for (imm = 0; imm < 8; imm++)
13406 if (micromips_imm_b_map[imm] == ep.X_add_number)
13407 break;
13408 if (imm >= 8)
13409 break;
13410
13411 INSERT_OPERAND (1, IMMB, *ip, imm);
13412 }
13413 s = expr_end;
13414 continue;
13415
13416 case 'C':
13417 {
13418 bfd_reloc_code_real_type r[3];
13419 expressionS ep;
13420 int imm;
13421
13422 if (my_getSmallExpression (&ep, r, s) > 0
13423 || ep.X_op != O_constant)
13424 break;
13425
13426 for (imm = 0; imm < 16; imm++)
13427 if (micromips_imm_c_map[imm] == ep.X_add_number)
13428 break;
13429 if (imm >= 16)
13430 break;
13431
13432 INSERT_OPERAND (1, IMMC, *ip, imm);
13433 }
13434 s = expr_end;
13435 continue;
13436
13437 case 'D': /* pc relative offset */
13438 case 'E': /* pc relative offset */
13439 my_getExpression (&offset_expr, s);
13440 if (offset_expr.X_op == O_register)
13441 break;
13442
13443 if (!forced_insn_length)
13444 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13445 else if (c == 'D')
13446 *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13447 else
13448 *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13449 s = expr_end;
13450 continue;
13451
13452 case 'F':
13453 {
13454 bfd_reloc_code_real_type r[3];
13455 expressionS ep;
13456 int imm;
13457
13458 if (my_getSmallExpression (&ep, r, s) > 0
13459 || !expr_const_in_range (&ep, 0, 16, 0))
13460 break;
13461
13462 imm = ep.X_add_number;
13463 INSERT_OPERAND (1, IMMF, *ip, imm);
13464 }
13465 s = expr_end;
13466 continue;
13467
13468 case 'G':
13469 {
13470 bfd_reloc_code_real_type r[3];
13471 expressionS ep;
13472 int imm;
13473
13474 /* Check whether there is only a single bracketed
13475 expression left. If so, it must be the base register
13476 and the constant must be zero. */
13477 if (*s == '(' && strchr (s + 1, '(') == 0)
13478 {
13479 INSERT_OPERAND (1, IMMG, *ip, 0);
13480 continue;
13481 }
13482
13483 if (my_getSmallExpression (&ep, r, s) > 0
13484 || !expr_const_in_range (&ep, -1, 15, 0))
13485 break;
13486
13487 imm = ep.X_add_number & 15;
13488 INSERT_OPERAND (1, IMMG, *ip, imm);
13489 }
13490 s = expr_end;
13491 continue;
13492
13493 case 'H':
13494 {
13495 bfd_reloc_code_real_type r[3];
13496 expressionS ep;
13497 int imm;
13498
13499 /* Check whether there is only a single bracketed
13500 expression left. If so, it must be the base register
13501 and the constant must be zero. */
13502 if (*s == '(' && strchr (s + 1, '(') == 0)
13503 {
13504 INSERT_OPERAND (1, IMMH, *ip, 0);
13505 continue;
13506 }
13507
13508 if (my_getSmallExpression (&ep, r, s) > 0
13509 || !expr_const_in_range (&ep, 0, 16, 1))
13510 break;
13511
13512 imm = ep.X_add_number >> 1;
13513 INSERT_OPERAND (1, IMMH, *ip, imm);
13514 }
13515 s = expr_end;
13516 continue;
13517
13518 case 'I':
13519 {
13520 bfd_reloc_code_real_type r[3];
13521 expressionS ep;
13522 int imm;
13523
13524 if (my_getSmallExpression (&ep, r, s) > 0
13525 || !expr_const_in_range (&ep, -1, 127, 0))
13526 break;
13527
13528 imm = ep.X_add_number & 127;
13529 INSERT_OPERAND (1, IMMI, *ip, imm);
13530 }
13531 s = expr_end;
13532 continue;
13533
13534 case 'J':
13535 {
13536 bfd_reloc_code_real_type r[3];
13537 expressionS ep;
13538 int imm;
13539
13540 /* Check whether there is only a single bracketed
13541 expression left. If so, it must be the base register
13542 and the constant must be zero. */
13543 if (*s == '(' && strchr (s + 1, '(') == 0)
13544 {
13545 INSERT_OPERAND (1, IMMJ, *ip, 0);
13546 continue;
13547 }
13548
13549 if (my_getSmallExpression (&ep, r, s) > 0
13550 || !expr_const_in_range (&ep, 0, 16, 2))
13551 break;
13552
13553 imm = ep.X_add_number >> 2;
13554 INSERT_OPERAND (1, IMMJ, *ip, imm);
13555 }
13556 s = expr_end;
13557 continue;
13558
13559 case 'L':
13560 {
13561 bfd_reloc_code_real_type r[3];
13562 expressionS ep;
13563 int imm;
13564
13565 /* Check whether there is only a single bracketed
13566 expression left. If so, it must be the base register
13567 and the constant must be zero. */
13568 if (*s == '(' && strchr (s + 1, '(') == 0)
13569 {
13570 INSERT_OPERAND (1, IMML, *ip, 0);
13571 continue;
13572 }
13573
13574 if (my_getSmallExpression (&ep, r, s) > 0
13575 || !expr_const_in_range (&ep, 0, 16, 0))
13576 break;
13577
13578 imm = ep.X_add_number;
13579 INSERT_OPERAND (1, IMML, *ip, imm);
13580 }
13581 s = expr_end;
13582 continue;
13583
13584 case 'M':
13585 {
13586 bfd_reloc_code_real_type r[3];
13587 expressionS ep;
13588 int imm;
13589
13590 if (my_getSmallExpression (&ep, r, s) > 0
13591 || !expr_const_in_range (&ep, 1, 9, 0))
13592 break;
13593
13594 imm = ep.X_add_number & 7;
13595 INSERT_OPERAND (1, IMMM, *ip, imm);
13596 }
13597 s = expr_end;
13598 continue;
13599
13600 case 'N': /* Register list for lwm and swm. */
13601 {
13602 /* A comma-separated list of registers and/or
13603 dash-separated contiguous ranges including
13604 both ra and a set of one or more registers
13605 starting at s0 up to s3 which have to be
13606 consecutive, e.g.:
13607
13608 s0, ra
13609 s0, s1, ra, s2, s3
13610 s0-s2, ra
13611
13612 and any permutations of these. */
13613 unsigned int reglist;
13614 int imm;
13615
13616 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13617 break;
13618
13619 if ((reglist & 0xfff1ffff) != 0x80010000)
13620 break;
13621
13622 reglist = (reglist >> 17) & 7;
13623 reglist += 1;
13624 if ((reglist & -reglist) != reglist)
13625 break;
13626
13627 imm = ffs (reglist) - 1;
13628 INSERT_OPERAND (1, IMMN, *ip, imm);
13629 }
13630 continue;
13631
13632 case 'O': /* sdbbp 4-bit code. */
13633 {
13634 bfd_reloc_code_real_type r[3];
13635 expressionS ep;
13636 int imm;
13637
13638 if (my_getSmallExpression (&ep, r, s) > 0
13639 || !expr_const_in_range (&ep, 0, 16, 0))
13640 break;
13641
13642 imm = ep.X_add_number;
13643 INSERT_OPERAND (1, IMMO, *ip, imm);
13644 }
13645 s = expr_end;
13646 continue;
13647
13648 case 'P':
13649 {
13650 bfd_reloc_code_real_type r[3];
13651 expressionS ep;
13652 int imm;
13653
13654 if (my_getSmallExpression (&ep, r, s) > 0
13655 || !expr_const_in_range (&ep, 0, 32, 2))
13656 break;
13657
13658 imm = ep.X_add_number >> 2;
13659 INSERT_OPERAND (1, IMMP, *ip, imm);
13660 }
13661 s = expr_end;
13662 continue;
13663
13664 case 'Q':
13665 {
13666 bfd_reloc_code_real_type r[3];
13667 expressionS ep;
13668 int imm;
13669
13670 if (my_getSmallExpression (&ep, r, s) > 0
13671 || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13672 break;
13673
13674 imm = ep.X_add_number >> 2;
13675 INSERT_OPERAND (1, IMMQ, *ip, imm);
13676 }
13677 s = expr_end;
13678 continue;
13679
13680 case 'U':
13681 {
13682 bfd_reloc_code_real_type r[3];
13683 expressionS ep;
13684 int imm;
13685
13686 /* Check whether there is only a single bracketed
13687 expression left. If so, it must be the base register
13688 and the constant must be zero. */
13689 if (*s == '(' && strchr (s + 1, '(') == 0)
13690 {
13691 INSERT_OPERAND (1, IMMU, *ip, 0);
13692 continue;
13693 }
13694
13695 if (my_getSmallExpression (&ep, r, s) > 0
13696 || !expr_const_in_range (&ep, 0, 32, 2))
13697 break;
13698
13699 imm = ep.X_add_number >> 2;
13700 INSERT_OPERAND (1, IMMU, *ip, imm);
13701 }
13702 s = expr_end;
13703 continue;
13704
13705 case 'W':
13706 {
13707 bfd_reloc_code_real_type r[3];
13708 expressionS ep;
13709 int imm;
13710
13711 if (my_getSmallExpression (&ep, r, s) > 0
13712 || !expr_const_in_range (&ep, 0, 64, 2))
13713 break;
13714
13715 imm = ep.X_add_number >> 2;
13716 INSERT_OPERAND (1, IMMW, *ip, imm);
13717 }
13718 s = expr_end;
13719 continue;
13720
13721 case 'X':
13722 {
13723 bfd_reloc_code_real_type r[3];
13724 expressionS ep;
13725 int imm;
13726
13727 if (my_getSmallExpression (&ep, r, s) > 0
13728 || !expr_const_in_range (&ep, -8, 8, 0))
13729 break;
13730
13731 imm = ep.X_add_number;
13732 INSERT_OPERAND (1, IMMX, *ip, imm);
13733 }
13734 s = expr_end;
13735 continue;
13736
13737 case 'Y':
13738 {
13739 bfd_reloc_code_real_type r[3];
13740 expressionS ep;
13741 int imm;
13742
13743 if (my_getSmallExpression (&ep, r, s) > 0
13744 || expr_const_in_range (&ep, -2, 2, 2)
13745 || !expr_const_in_range (&ep, -258, 258, 2))
13746 break;
13747
13748 imm = ep.X_add_number >> 2;
13749 imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13750 INSERT_OPERAND (1, IMMY, *ip, imm);
13751 }
13752 s = expr_end;
13753 continue;
13754
13755 case 'Z':
13756 {
13757 bfd_reloc_code_real_type r[3];
13758 expressionS ep;
13759
13760 if (my_getSmallExpression (&ep, r, s) > 0
13761 || !expr_const_in_range (&ep, 0, 1, 0))
13762 break;
13763 }
13764 s = expr_end;
13765 continue;
13766
13767 default:
13768 as_bad (_("Internal error: bad microMIPS opcode "
13769 "(unknown extension operand type `m%c'): %s %s"),
13770 *args, insn->name, insn->args);
13771 /* Further processing is fruitless. */
13772 return;
13773 }
13774 break;
13775
13776 case 'n': /* Register list for 32-bit lwm and swm. */
13777 gas_assert (mips_opts.micromips);
13778 {
13779 /* A comma-separated list of registers and/or
13780 dash-separated contiguous ranges including
13781 at least one of ra and a set of one or more
13782 registers starting at s0 up to s7 and then
13783 s8 which have to be consecutive, e.g.:
13784
13785 ra
13786 s0
13787 ra, s0, s1, s2
13788 s0-s8
13789 s0-s5, ra
13790
13791 and any permutations of these. */
13792 unsigned int reglist;
13793 int imm;
13794 int ra;
13795
13796 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13797 break;
13798
13799 if ((reglist & 0x3f00ffff) != 0)
13800 break;
13801
13802 ra = (reglist >> 27) & 0x10;
13803 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13804 reglist += 1;
13805 if ((reglist & -reglist) != reglist)
13806 break;
13807
13808 imm = (ffs (reglist) - 1) | ra;
13809 INSERT_OPERAND (1, RT, *ip, imm);
13810 imm_expr.X_op = O_absent;
13811 }
13812 continue;
13813
13814 case '|': /* 4-bit trap code. */
13815 gas_assert (mips_opts.micromips);
13816 my_getExpression (&imm_expr, s);
13817 check_absolute_expr (ip, &imm_expr);
13818 if ((unsigned long) imm_expr.X_add_number
13819 > MICROMIPSOP_MASK_TRAP)
13820 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13821 (unsigned long) imm_expr.X_add_number,
13822 ip->insn_mo->name);
13823 INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13824 imm_expr.X_op = O_absent;
13825 s = expr_end;
13826 continue;
13827
13828 default:
13829 as_bad (_("Bad char = '%c'\n"), *args);
13830 abort ();
13831 }
13832 break;
13833 }
13834 /* Args don't match. */
13835 s = argsStart;
13836 insn_error = _("Illegal operands");
13837 if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13838 {
13839 ++insn;
13840 continue;
13841 }
13842 else if (wrong_delay_slot_insns && need_delay_slot_ok)
13843 {
13844 gas_assert (firstinsn);
13845 need_delay_slot_ok = FALSE;
13846 past = insn + 1;
13847 insn = firstinsn;
13848 continue;
13849 }
13850 return;
13851 }
13852 }
13853
13854 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13855
13856 /* This routine assembles an instruction into its binary format when
13857 assembling for the mips16. As a side effect, it sets one of the
13858 global variables imm_reloc or offset_reloc to the type of relocation
13859 to do if one of the operands is an address expression. It also sets
13860 forced_insn_length to the resulting instruction size in bytes if the
13861 user explicitly requested a small or extended instruction. */
13862
13863 static void
13864 mips16_ip (char *str, struct mips_cl_insn *ip)
13865 {
13866 char *s;
13867 const char *args;
13868 struct mips_opcode *insn;
13869 char *argsstart;
13870 unsigned int regno;
13871 unsigned int lastregno = 0;
13872 char *s_reset;
13873 size_t i;
13874
13875 insn_error = NULL;
13876
13877 forced_insn_length = 0;
13878
13879 for (s = str; ISLOWER (*s); ++s)
13880 ;
13881 switch (*s)
13882 {
13883 case '\0':
13884 break;
13885
13886 case ' ':
13887 *s++ = '\0';
13888 break;
13889
13890 case '.':
13891 if (s[1] == 't' && s[2] == ' ')
13892 {
13893 *s = '\0';
13894 forced_insn_length = 2;
13895 s += 3;
13896 break;
13897 }
13898 else if (s[1] == 'e' && s[2] == ' ')
13899 {
13900 *s = '\0';
13901 forced_insn_length = 4;
13902 s += 3;
13903 break;
13904 }
13905 /* Fall through. */
13906 default:
13907 insn_error = _("unknown opcode");
13908 return;
13909 }
13910
13911 if (mips_opts.noautoextend && !forced_insn_length)
13912 forced_insn_length = 2;
13913
13914 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13915 {
13916 insn_error = _("unrecognized opcode");
13917 return;
13918 }
13919
13920 argsstart = s;
13921 for (;;)
13922 {
13923 bfd_boolean ok;
13924
13925 gas_assert (strcmp (insn->name, str) == 0);
13926
13927 ok = is_opcode_valid_16 (insn);
13928 if (! ok)
13929 {
13930 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13931 && strcmp (insn->name, insn[1].name) == 0)
13932 {
13933 ++insn;
13934 continue;
13935 }
13936 else
13937 {
13938 if (!insn_error)
13939 {
13940 static char buf[100];
13941 sprintf (buf,
13942 _("Opcode not supported on this processor: %s (%s)"),
13943 mips_cpu_info_from_arch (mips_opts.arch)->name,
13944 mips_cpu_info_from_isa (mips_opts.isa)->name);
13945 insn_error = buf;
13946 }
13947 return;
13948 }
13949 }
13950
13951 create_insn (ip, insn);
13952 imm_expr.X_op = O_absent;
13953 imm_reloc[0] = BFD_RELOC_UNUSED;
13954 imm_reloc[1] = BFD_RELOC_UNUSED;
13955 imm_reloc[2] = BFD_RELOC_UNUSED;
13956 imm2_expr.X_op = O_absent;
13957 offset_expr.X_op = O_absent;
13958 offset_reloc[0] = BFD_RELOC_UNUSED;
13959 offset_reloc[1] = BFD_RELOC_UNUSED;
13960 offset_reloc[2] = BFD_RELOC_UNUSED;
13961 for (args = insn->args; 1; ++args)
13962 {
13963 int c;
13964
13965 if (*s == ' ')
13966 ++s;
13967
13968 /* In this switch statement we call break if we did not find
13969 a match, continue if we did find a match, or return if we
13970 are done. */
13971
13972 c = *args;
13973 switch (c)
13974 {
13975 case '\0':
13976 if (*s == '\0')
13977 {
13978 offsetT value;
13979
13980 /* Stuff the immediate value in now, if we can. */
13981 if (imm_expr.X_op == O_constant
13982 && *imm_reloc > BFD_RELOC_UNUSED
13983 && insn->pinfo != INSN_MACRO
13984 && calculate_reloc (*offset_reloc,
13985 imm_expr.X_add_number, &value))
13986 {
13987 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13988 *offset_reloc, value, forced_insn_length,
13989 &ip->insn_opcode);
13990 imm_expr.X_op = O_absent;
13991 *imm_reloc = BFD_RELOC_UNUSED;
13992 *offset_reloc = BFD_RELOC_UNUSED;
13993 }
13994
13995 return;
13996 }
13997 break;
13998
13999 case ',':
14000 if (*s++ == c)
14001 continue;
14002 s--;
14003 switch (*++args)
14004 {
14005 case 'v':
14006 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14007 continue;
14008 case 'w':
14009 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14010 continue;
14011 }
14012 break;
14013
14014 case '(':
14015 case ')':
14016 if (*s++ == c)
14017 continue;
14018 break;
14019
14020 case 'v':
14021 case 'w':
14022 if (s[0] != '$')
14023 {
14024 if (c == 'v')
14025 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14026 else
14027 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14028 ++args;
14029 continue;
14030 }
14031 /* Fall through. */
14032 case 'x':
14033 case 'y':
14034 case 'z':
14035 case 'Z':
14036 case '0':
14037 case 'S':
14038 case 'R':
14039 case 'X':
14040 case 'Y':
14041 s_reset = s;
14042 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
14043 {
14044 if (c == 'v' || c == 'w')
14045 {
14046 if (c == 'v')
14047 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14048 else
14049 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14050 ++args;
14051 continue;
14052 }
14053 break;
14054 }
14055
14056 if (*s == ' ')
14057 ++s;
14058 if (args[1] != *s)
14059 {
14060 if (c == 'v' || c == 'w')
14061 {
14062 regno = mips16_to_32_reg_map[lastregno];
14063 s = s_reset;
14064 ++args;
14065 }
14066 }
14067
14068 switch (c)
14069 {
14070 case 'x':
14071 case 'y':
14072 case 'z':
14073 case 'v':
14074 case 'w':
14075 case 'Z':
14076 regno = mips32_to_16_reg_map[regno];
14077 break;
14078
14079 case '0':
14080 if (regno != 0)
14081 regno = ILLEGAL_REG;
14082 break;
14083
14084 case 'S':
14085 if (regno != SP)
14086 regno = ILLEGAL_REG;
14087 break;
14088
14089 case 'R':
14090 if (regno != RA)
14091 regno = ILLEGAL_REG;
14092 break;
14093
14094 case 'X':
14095 case 'Y':
14096 if (regno == AT && mips_opts.at)
14097 {
14098 if (mips_opts.at == ATREG)
14099 as_warn (_("used $at without \".set noat\""));
14100 else
14101 as_warn (_("used $%u with \".set at=$%u\""),
14102 regno, mips_opts.at);
14103 }
14104 break;
14105
14106 default:
14107 abort ();
14108 }
14109
14110 if (regno == ILLEGAL_REG)
14111 break;
14112
14113 switch (c)
14114 {
14115 case 'x':
14116 case 'v':
14117 MIPS16_INSERT_OPERAND (RX, *ip, regno);
14118 break;
14119 case 'y':
14120 case 'w':
14121 MIPS16_INSERT_OPERAND (RY, *ip, regno);
14122 break;
14123 case 'z':
14124 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
14125 break;
14126 case 'Z':
14127 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
14128 case '0':
14129 case 'S':
14130 case 'R':
14131 break;
14132 case 'X':
14133 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
14134 break;
14135 case 'Y':
14136 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
14137 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
14138 break;
14139 default:
14140 abort ();
14141 }
14142
14143 lastregno = regno;
14144 continue;
14145
14146 case 'P':
14147 if (strncmp (s, "$pc", 3) == 0)
14148 {
14149 s += 3;
14150 continue;
14151 }
14152 break;
14153
14154 case '5':
14155 case 'H':
14156 case 'W':
14157 case 'D':
14158 case 'j':
14159 case 'V':
14160 case 'C':
14161 case 'U':
14162 case 'k':
14163 case 'K':
14164 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
14165 if (i > 0)
14166 {
14167 if (imm_expr.X_op != O_constant)
14168 {
14169 forced_insn_length = 4;
14170 ip->insn_opcode |= MIPS16_EXTEND;
14171 }
14172 else
14173 {
14174 /* We need to relax this instruction. */
14175 *offset_reloc = *imm_reloc;
14176 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14177 }
14178 s = expr_end;
14179 continue;
14180 }
14181 *imm_reloc = BFD_RELOC_UNUSED;
14182 /* Fall through. */
14183 case '<':
14184 case '>':
14185 case '[':
14186 case ']':
14187 case '4':
14188 case '8':
14189 my_getExpression (&imm_expr, s);
14190 if (imm_expr.X_op == O_register)
14191 {
14192 /* What we thought was an expression turned out to
14193 be a register. */
14194
14195 if (s[0] == '(' && args[1] == '(')
14196 {
14197 /* It looks like the expression was omitted
14198 before a register indirection, which means
14199 that the expression is implicitly zero. We
14200 still set up imm_expr, so that we handle
14201 explicit extensions correctly. */
14202 imm_expr.X_op = O_constant;
14203 imm_expr.X_add_number = 0;
14204 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14205 continue;
14206 }
14207
14208 break;
14209 }
14210
14211 /* We need to relax this instruction. */
14212 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14213 s = expr_end;
14214 continue;
14215
14216 case 'p':
14217 case 'q':
14218 case 'A':
14219 case 'B':
14220 case 'E':
14221 /* We use offset_reloc rather than imm_reloc for the PC
14222 relative operands. This lets macros with both
14223 immediate and address operands work correctly. */
14224 my_getExpression (&offset_expr, s);
14225
14226 if (offset_expr.X_op == O_register)
14227 break;
14228
14229 /* We need to relax this instruction. */
14230 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
14231 s = expr_end;
14232 continue;
14233
14234 case '6': /* break code */
14235 my_getExpression (&imm_expr, s);
14236 check_absolute_expr (ip, &imm_expr);
14237 if ((unsigned long) imm_expr.X_add_number > 63)
14238 as_warn (_("Invalid value for `%s' (%lu)"),
14239 ip->insn_mo->name,
14240 (unsigned long) imm_expr.X_add_number);
14241 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
14242 imm_expr.X_op = O_absent;
14243 s = expr_end;
14244 continue;
14245
14246 case 'a': /* 26 bit address */
14247 my_getExpression (&offset_expr, s);
14248 s = expr_end;
14249 *offset_reloc = BFD_RELOC_MIPS16_JMP;
14250 ip->insn_opcode <<= 16;
14251 continue;
14252
14253 case 'l': /* register list for entry macro */
14254 case 'L': /* register list for exit macro */
14255 {
14256 int mask;
14257
14258 if (c == 'l')
14259 mask = 0;
14260 else
14261 mask = 7 << 3;
14262 while (*s != '\0')
14263 {
14264 unsigned int freg, reg1, reg2;
14265
14266 while (*s == ' ' || *s == ',')
14267 ++s;
14268 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14269 freg = 0;
14270 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
14271 freg = 1;
14272 else
14273 {
14274 as_bad (_("can't parse register list"));
14275 break;
14276 }
14277 if (*s == ' ')
14278 ++s;
14279 if (*s != '-')
14280 reg2 = reg1;
14281 else
14282 {
14283 ++s;
14284 if (!reg_lookup (&s, freg ? RTYPE_FPU
14285 : (RTYPE_GP | RTYPE_NUM), &reg2))
14286 {
14287 as_bad (_("invalid register list"));
14288 break;
14289 }
14290 }
14291 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
14292 {
14293 mask &= ~ (7 << 3);
14294 mask |= 5 << 3;
14295 }
14296 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
14297 {
14298 mask &= ~ (7 << 3);
14299 mask |= 6 << 3;
14300 }
14301 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
14302 mask |= (reg2 - 3) << 3;
14303 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
14304 mask |= (reg2 - 15) << 1;
14305 else if (reg1 == RA && reg2 == RA)
14306 mask |= 1;
14307 else
14308 {
14309 as_bad (_("invalid register list"));
14310 break;
14311 }
14312 }
14313 /* The mask is filled in in the opcode table for the
14314 benefit of the disassembler. We remove it before
14315 applying the actual mask. */
14316 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
14317 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
14318 }
14319 continue;
14320
14321 case 'm': /* Register list for save insn. */
14322 case 'M': /* Register list for restore insn. */
14323 {
14324 int opcode = ip->insn_opcode;
14325 int framesz = 0, seen_framesz = 0;
14326 int nargs = 0, statics = 0, sregs = 0;
14327
14328 while (*s != '\0')
14329 {
14330 unsigned int reg1, reg2;
14331
14332 SKIP_SPACE_TABS (s);
14333 while (*s == ',')
14334 ++s;
14335 SKIP_SPACE_TABS (s);
14336
14337 my_getExpression (&imm_expr, s);
14338 if (imm_expr.X_op == O_constant)
14339 {
14340 /* Handle the frame size. */
14341 if (seen_framesz)
14342 {
14343 as_bad (_("more than one frame size in list"));
14344 break;
14345 }
14346 seen_framesz = 1;
14347 framesz = imm_expr.X_add_number;
14348 imm_expr.X_op = O_absent;
14349 s = expr_end;
14350 continue;
14351 }
14352
14353 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14354 {
14355 as_bad (_("can't parse register list"));
14356 break;
14357 }
14358
14359 while (*s == ' ')
14360 ++s;
14361
14362 if (*s != '-')
14363 reg2 = reg1;
14364 else
14365 {
14366 ++s;
14367 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
14368 || reg2 < reg1)
14369 {
14370 as_bad (_("can't parse register list"));
14371 break;
14372 }
14373 }
14374
14375 while (reg1 <= reg2)
14376 {
14377 if (reg1 >= 4 && reg1 <= 7)
14378 {
14379 if (!seen_framesz)
14380 /* args $a0-$a3 */
14381 nargs |= 1 << (reg1 - 4);
14382 else
14383 /* statics $a0-$a3 */
14384 statics |= 1 << (reg1 - 4);
14385 }
14386 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
14387 {
14388 /* $s0-$s8 */
14389 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
14390 }
14391 else if (reg1 == 31)
14392 {
14393 /* Add $ra to insn. */
14394 opcode |= 0x40;
14395 }
14396 else
14397 {
14398 as_bad (_("unexpected register in list"));
14399 break;
14400 }
14401 if (++reg1 == 24)
14402 reg1 = 30;
14403 }
14404 }
14405
14406 /* Encode args/statics combination. */
14407 if (nargs & statics)
14408 as_bad (_("arg/static registers overlap"));
14409 else if (nargs == 0xf)
14410 /* All $a0-$a3 are args. */
14411 opcode |= MIPS16_ALL_ARGS << 16;
14412 else if (statics == 0xf)
14413 /* All $a0-$a3 are statics. */
14414 opcode |= MIPS16_ALL_STATICS << 16;
14415 else
14416 {
14417 int narg = 0, nstat = 0;
14418
14419 /* Count arg registers. */
14420 while (nargs & 0x1)
14421 {
14422 nargs >>= 1;
14423 narg++;
14424 }
14425 if (nargs != 0)
14426 as_bad (_("invalid arg register list"));
14427
14428 /* Count static registers. */
14429 while (statics & 0x8)
14430 {
14431 statics = (statics << 1) & 0xf;
14432 nstat++;
14433 }
14434 if (statics != 0)
14435 as_bad (_("invalid static register list"));
14436
14437 /* Encode args/statics. */
14438 opcode |= ((narg << 2) | nstat) << 16;
14439 }
14440
14441 /* Encode $s0/$s1. */
14442 if (sregs & (1 << 0)) /* $s0 */
14443 opcode |= 0x20;
14444 if (sregs & (1 << 1)) /* $s1 */
14445 opcode |= 0x10;
14446 sregs >>= 2;
14447
14448 if (sregs != 0)
14449 {
14450 /* Count regs $s2-$s8. */
14451 int nsreg = 0;
14452 while (sregs & 1)
14453 {
14454 sregs >>= 1;
14455 nsreg++;
14456 }
14457 if (sregs != 0)
14458 as_bad (_("invalid static register list"));
14459 /* Encode $s2-$s8. */
14460 opcode |= nsreg << 24;
14461 }
14462
14463 /* Encode frame size. */
14464 if (!seen_framesz)
14465 as_bad (_("missing frame size"));
14466 else if ((framesz & 7) != 0 || framesz < 0
14467 || framesz > 0xff * 8)
14468 as_bad (_("invalid frame size"));
14469 else if (framesz != 128 || (opcode >> 16) != 0)
14470 {
14471 framesz /= 8;
14472 opcode |= (((framesz & 0xf0) << 16)
14473 | (framesz & 0x0f));
14474 }
14475
14476 /* Finally build the instruction. */
14477 if ((opcode >> 16) != 0 || framesz == 0)
14478 opcode |= MIPS16_EXTEND;
14479 ip->insn_opcode = opcode;
14480 }
14481 continue;
14482
14483 case 'e': /* extend code */
14484 my_getExpression (&imm_expr, s);
14485 check_absolute_expr (ip, &imm_expr);
14486 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14487 {
14488 as_warn (_("Invalid value for `%s' (%lu)"),
14489 ip->insn_mo->name,
14490 (unsigned long) imm_expr.X_add_number);
14491 imm_expr.X_add_number &= 0x7ff;
14492 }
14493 ip->insn_opcode |= imm_expr.X_add_number;
14494 imm_expr.X_op = O_absent;
14495 s = expr_end;
14496 continue;
14497
14498 default:
14499 abort ();
14500 }
14501 break;
14502 }
14503
14504 /* Args don't match. */
14505 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14506 strcmp (insn->name, insn[1].name) == 0)
14507 {
14508 ++insn;
14509 s = argsstart;
14510 continue;
14511 }
14512
14513 insn_error = _("illegal operands");
14514
14515 return;
14516 }
14517 }
14518
14519 /* This structure holds information we know about a mips16 immediate
14520 argument type. */
14521
14522 struct mips16_immed_operand
14523 {
14524 /* The type code used in the argument string in the opcode table. */
14525 int type;
14526 /* The number of bits in the short form of the opcode. */
14527 int nbits;
14528 /* The number of bits in the extended form of the opcode. */
14529 int extbits;
14530 /* The amount by which the short form is shifted when it is used;
14531 for example, the sw instruction has a shift count of 2. */
14532 int shift;
14533 /* The amount by which the short form is shifted when it is stored
14534 into the instruction code. */
14535 int op_shift;
14536 /* Non-zero if the short form is unsigned. */
14537 int unsp;
14538 /* Non-zero if the extended form is unsigned. */
14539 int extu;
14540 /* Non-zero if the value is PC relative. */
14541 int pcrel;
14542 };
14543
14544 /* The mips16 immediate operand types. */
14545
14546 static const struct mips16_immed_operand mips16_immed_operands[] =
14547 {
14548 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14549 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14550 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14551 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14552 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14553 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14554 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14555 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14556 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14557 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14558 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14559 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14560 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14561 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14562 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14563 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14564 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14565 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14566 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14567 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14568 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14569 };
14570
14571 #define MIPS16_NUM_IMMED \
14572 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14573
14574 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14575 NBITS is the number of significant bits in VAL. */
14576
14577 static unsigned long
14578 mips16_immed_extend (offsetT val, unsigned int nbits)
14579 {
14580 int extval;
14581 if (nbits == 16)
14582 {
14583 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14584 val &= 0x1f;
14585 }
14586 else if (nbits == 15)
14587 {
14588 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14589 val &= 0xf;
14590 }
14591 else
14592 {
14593 extval = ((val & 0x1f) << 6) | (val & 0x20);
14594 val = 0;
14595 }
14596 return (extval << 16) | val;
14597 }
14598
14599 /* Install immediate value VAL into MIPS16 instruction *INSN,
14600 extending it if necessary. The instruction in *INSN may
14601 already be extended.
14602
14603 RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14604 if none. In the former case, VAL is a 16-bit number with no
14605 defined signedness.
14606
14607 TYPE is the type of the immediate field. USER_INSN_LENGTH
14608 is the length that the user requested, or 0 if none. */
14609
14610 static void
14611 mips16_immed (char *file, unsigned int line, int type,
14612 bfd_reloc_code_real_type reloc, offsetT val,
14613 unsigned int user_insn_length, unsigned long *insn)
14614 {
14615 const struct mips16_immed_operand *op;
14616 int mintiny, maxtiny;
14617
14618 op = mips16_immed_operands;
14619 while (op->type != type)
14620 {
14621 ++op;
14622 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14623 }
14624
14625 if (op->unsp)
14626 {
14627 if (type == '<' || type == '>' || type == '[' || type == ']')
14628 {
14629 mintiny = 1;
14630 maxtiny = 1 << op->nbits;
14631 }
14632 else
14633 {
14634 mintiny = 0;
14635 maxtiny = (1 << op->nbits) - 1;
14636 }
14637 if (reloc != BFD_RELOC_UNUSED)
14638 val &= 0xffff;
14639 }
14640 else
14641 {
14642 mintiny = - (1 << (op->nbits - 1));
14643 maxtiny = (1 << (op->nbits - 1)) - 1;
14644 if (reloc != BFD_RELOC_UNUSED)
14645 val = SEXT_16BIT (val);
14646 }
14647
14648 /* Branch offsets have an implicit 0 in the lowest bit. */
14649 if (type == 'p' || type == 'q')
14650 val /= 2;
14651
14652 if ((val & ((1 << op->shift) - 1)) != 0
14653 || val < (mintiny << op->shift)
14654 || val > (maxtiny << op->shift))
14655 {
14656 /* We need an extended instruction. */
14657 if (user_insn_length == 2)
14658 as_bad_where (file, line, _("invalid unextended operand value"));
14659 else
14660 *insn |= MIPS16_EXTEND;
14661 }
14662 else if (user_insn_length == 4)
14663 {
14664 /* The operand doesn't force an unextended instruction to be extended.
14665 Warn if the user wanted an extended instruction anyway. */
14666 *insn |= MIPS16_EXTEND;
14667 as_warn_where (file, line,
14668 _("extended operand requested but not required"));
14669 }
14670
14671 if (mips16_opcode_length (*insn) == 2)
14672 {
14673 int insnval;
14674
14675 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14676 insnval <<= op->op_shift;
14677 *insn |= insnval;
14678 }
14679 else
14680 {
14681 long minext, maxext;
14682
14683 if (reloc == BFD_RELOC_UNUSED)
14684 {
14685 if (op->extu)
14686 {
14687 minext = 0;
14688 maxext = (1 << op->extbits) - 1;
14689 }
14690 else
14691 {
14692 minext = - (1 << (op->extbits - 1));
14693 maxext = (1 << (op->extbits - 1)) - 1;
14694 }
14695 if (val < minext || val > maxext)
14696 as_bad_where (file, line,
14697 _("operand value out of range for instruction"));
14698 }
14699
14700 *insn |= mips16_immed_extend (val, op->extbits);
14701 }
14702 }
14703 \f
14704 struct percent_op_match
14705 {
14706 const char *str;
14707 bfd_reloc_code_real_type reloc;
14708 };
14709
14710 static const struct percent_op_match mips_percent_op[] =
14711 {
14712 {"%lo", BFD_RELOC_LO16},
14713 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14714 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14715 {"%call16", BFD_RELOC_MIPS_CALL16},
14716 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14717 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14718 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14719 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14720 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14721 {"%got", BFD_RELOC_MIPS_GOT16},
14722 {"%gp_rel", BFD_RELOC_GPREL16},
14723 {"%half", BFD_RELOC_16},
14724 {"%highest", BFD_RELOC_MIPS_HIGHEST},
14725 {"%higher", BFD_RELOC_MIPS_HIGHER},
14726 {"%neg", BFD_RELOC_MIPS_SUB},
14727 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14728 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14729 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14730 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14731 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14732 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14733 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14734 {"%hi", BFD_RELOC_HI16_S}
14735 };
14736
14737 static const struct percent_op_match mips16_percent_op[] =
14738 {
14739 {"%lo", BFD_RELOC_MIPS16_LO16},
14740 {"%gprel", BFD_RELOC_MIPS16_GPREL},
14741 {"%got", BFD_RELOC_MIPS16_GOT16},
14742 {"%call16", BFD_RELOC_MIPS16_CALL16},
14743 {"%hi", BFD_RELOC_MIPS16_HI16_S},
14744 {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14745 {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14746 {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14747 {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14748 {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14749 {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14750 {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14751 };
14752
14753
14754 /* Return true if *STR points to a relocation operator. When returning true,
14755 move *STR over the operator and store its relocation code in *RELOC.
14756 Leave both *STR and *RELOC alone when returning false. */
14757
14758 static bfd_boolean
14759 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14760 {
14761 const struct percent_op_match *percent_op;
14762 size_t limit, i;
14763
14764 if (mips_opts.mips16)
14765 {
14766 percent_op = mips16_percent_op;
14767 limit = ARRAY_SIZE (mips16_percent_op);
14768 }
14769 else
14770 {
14771 percent_op = mips_percent_op;
14772 limit = ARRAY_SIZE (mips_percent_op);
14773 }
14774
14775 for (i = 0; i < limit; i++)
14776 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14777 {
14778 int len = strlen (percent_op[i].str);
14779
14780 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14781 continue;
14782
14783 *str += strlen (percent_op[i].str);
14784 *reloc = percent_op[i].reloc;
14785
14786 /* Check whether the output BFD supports this relocation.
14787 If not, issue an error and fall back on something safe. */
14788 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14789 {
14790 as_bad (_("relocation %s isn't supported by the current ABI"),
14791 percent_op[i].str);
14792 *reloc = BFD_RELOC_UNUSED;
14793 }
14794 return TRUE;
14795 }
14796 return FALSE;
14797 }
14798
14799
14800 /* Parse string STR as a 16-bit relocatable operand. Store the
14801 expression in *EP and the relocations in the array starting
14802 at RELOC. Return the number of relocation operators used.
14803
14804 On exit, EXPR_END points to the first character after the expression. */
14805
14806 static size_t
14807 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14808 char *str)
14809 {
14810 bfd_reloc_code_real_type reversed_reloc[3];
14811 size_t reloc_index, i;
14812 int crux_depth, str_depth;
14813 char *crux;
14814
14815 /* Search for the start of the main expression, recoding relocations
14816 in REVERSED_RELOC. End the loop with CRUX pointing to the start
14817 of the main expression and with CRUX_DEPTH containing the number
14818 of open brackets at that point. */
14819 reloc_index = -1;
14820 str_depth = 0;
14821 do
14822 {
14823 reloc_index++;
14824 crux = str;
14825 crux_depth = str_depth;
14826
14827 /* Skip over whitespace and brackets, keeping count of the number
14828 of brackets. */
14829 while (*str == ' ' || *str == '\t' || *str == '(')
14830 if (*str++ == '(')
14831 str_depth++;
14832 }
14833 while (*str == '%'
14834 && reloc_index < (HAVE_NEWABI ? 3 : 1)
14835 && parse_relocation (&str, &reversed_reloc[reloc_index]));
14836
14837 my_getExpression (ep, crux);
14838 str = expr_end;
14839
14840 /* Match every open bracket. */
14841 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14842 if (*str++ == ')')
14843 crux_depth--;
14844
14845 if (crux_depth > 0)
14846 as_bad (_("unclosed '('"));
14847
14848 expr_end = str;
14849
14850 if (reloc_index != 0)
14851 {
14852 prev_reloc_op_frag = frag_now;
14853 for (i = 0; i < reloc_index; i++)
14854 reloc[i] = reversed_reloc[reloc_index - 1 - i];
14855 }
14856
14857 return reloc_index;
14858 }
14859
14860 static void
14861 my_getExpression (expressionS *ep, char *str)
14862 {
14863 char *save_in;
14864
14865 save_in = input_line_pointer;
14866 input_line_pointer = str;
14867 expression (ep);
14868 expr_end = input_line_pointer;
14869 input_line_pointer = save_in;
14870 }
14871
14872 char *
14873 md_atof (int type, char *litP, int *sizeP)
14874 {
14875 return ieee_md_atof (type, litP, sizeP, target_big_endian);
14876 }
14877
14878 void
14879 md_number_to_chars (char *buf, valueT val, int n)
14880 {
14881 if (target_big_endian)
14882 number_to_chars_bigendian (buf, val, n);
14883 else
14884 number_to_chars_littleendian (buf, val, n);
14885 }
14886 \f
14887 static int support_64bit_objects(void)
14888 {
14889 const char **list, **l;
14890 int yes;
14891
14892 list = bfd_target_list ();
14893 for (l = list; *l != NULL; l++)
14894 if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14895 || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14896 break;
14897 yes = (*l != NULL);
14898 free (list);
14899 return yes;
14900 }
14901
14902 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14903 NEW_VALUE. Warn if another value was already specified. Note:
14904 we have to defer parsing the -march and -mtune arguments in order
14905 to handle 'from-abi' correctly, since the ABI might be specified
14906 in a later argument. */
14907
14908 static void
14909 mips_set_option_string (const char **string_ptr, const char *new_value)
14910 {
14911 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14912 as_warn (_("A different %s was already specified, is now %s"),
14913 string_ptr == &mips_arch_string ? "-march" : "-mtune",
14914 new_value);
14915
14916 *string_ptr = new_value;
14917 }
14918
14919 int
14920 md_parse_option (int c, char *arg)
14921 {
14922 unsigned int i;
14923
14924 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
14925 if (c == mips_ases[i].option_on || c == mips_ases[i].option_off)
14926 {
14927 file_ase_explicit |= mips_set_ase (&mips_ases[i],
14928 c == mips_ases[i].option_on);
14929 return 1;
14930 }
14931
14932 switch (c)
14933 {
14934 case OPTION_CONSTRUCT_FLOATS:
14935 mips_disable_float_construction = 0;
14936 break;
14937
14938 case OPTION_NO_CONSTRUCT_FLOATS:
14939 mips_disable_float_construction = 1;
14940 break;
14941
14942 case OPTION_TRAP:
14943 mips_trap = 1;
14944 break;
14945
14946 case OPTION_BREAK:
14947 mips_trap = 0;
14948 break;
14949
14950 case OPTION_EB:
14951 target_big_endian = 1;
14952 break;
14953
14954 case OPTION_EL:
14955 target_big_endian = 0;
14956 break;
14957
14958 case 'O':
14959 if (arg == NULL)
14960 mips_optimize = 1;
14961 else if (arg[0] == '0')
14962 mips_optimize = 0;
14963 else if (arg[0] == '1')
14964 mips_optimize = 1;
14965 else
14966 mips_optimize = 2;
14967 break;
14968
14969 case 'g':
14970 if (arg == NULL)
14971 mips_debug = 2;
14972 else
14973 mips_debug = atoi (arg);
14974 break;
14975
14976 case OPTION_MIPS1:
14977 file_mips_isa = ISA_MIPS1;
14978 break;
14979
14980 case OPTION_MIPS2:
14981 file_mips_isa = ISA_MIPS2;
14982 break;
14983
14984 case OPTION_MIPS3:
14985 file_mips_isa = ISA_MIPS3;
14986 break;
14987
14988 case OPTION_MIPS4:
14989 file_mips_isa = ISA_MIPS4;
14990 break;
14991
14992 case OPTION_MIPS5:
14993 file_mips_isa = ISA_MIPS5;
14994 break;
14995
14996 case OPTION_MIPS32:
14997 file_mips_isa = ISA_MIPS32;
14998 break;
14999
15000 case OPTION_MIPS32R2:
15001 file_mips_isa = ISA_MIPS32R2;
15002 break;
15003
15004 case OPTION_MIPS64R2:
15005 file_mips_isa = ISA_MIPS64R2;
15006 break;
15007
15008 case OPTION_MIPS64:
15009 file_mips_isa = ISA_MIPS64;
15010 break;
15011
15012 case OPTION_MTUNE:
15013 mips_set_option_string (&mips_tune_string, arg);
15014 break;
15015
15016 case OPTION_MARCH:
15017 mips_set_option_string (&mips_arch_string, arg);
15018 break;
15019
15020 case OPTION_M4650:
15021 mips_set_option_string (&mips_arch_string, "4650");
15022 mips_set_option_string (&mips_tune_string, "4650");
15023 break;
15024
15025 case OPTION_NO_M4650:
15026 break;
15027
15028 case OPTION_M4010:
15029 mips_set_option_string (&mips_arch_string, "4010");
15030 mips_set_option_string (&mips_tune_string, "4010");
15031 break;
15032
15033 case OPTION_NO_M4010:
15034 break;
15035
15036 case OPTION_M4100:
15037 mips_set_option_string (&mips_arch_string, "4100");
15038 mips_set_option_string (&mips_tune_string, "4100");
15039 break;
15040
15041 case OPTION_NO_M4100:
15042 break;
15043
15044 case OPTION_M3900:
15045 mips_set_option_string (&mips_arch_string, "3900");
15046 mips_set_option_string (&mips_tune_string, "3900");
15047 break;
15048
15049 case OPTION_NO_M3900:
15050 break;
15051
15052 case OPTION_MICROMIPS:
15053 if (mips_opts.mips16 == 1)
15054 {
15055 as_bad (_("-mmicromips cannot be used with -mips16"));
15056 return 0;
15057 }
15058 mips_opts.micromips = 1;
15059 mips_no_prev_insn ();
15060 break;
15061
15062 case OPTION_NO_MICROMIPS:
15063 mips_opts.micromips = 0;
15064 mips_no_prev_insn ();
15065 break;
15066
15067 case OPTION_MIPS16:
15068 if (mips_opts.micromips == 1)
15069 {
15070 as_bad (_("-mips16 cannot be used with -micromips"));
15071 return 0;
15072 }
15073 mips_opts.mips16 = 1;
15074 mips_no_prev_insn ();
15075 break;
15076
15077 case OPTION_NO_MIPS16:
15078 mips_opts.mips16 = 0;
15079 mips_no_prev_insn ();
15080 break;
15081
15082 case OPTION_FIX_24K:
15083 mips_fix_24k = 1;
15084 break;
15085
15086 case OPTION_NO_FIX_24K:
15087 mips_fix_24k = 0;
15088 break;
15089
15090 case OPTION_FIX_LOONGSON2F_JUMP:
15091 mips_fix_loongson2f_jump = TRUE;
15092 break;
15093
15094 case OPTION_NO_FIX_LOONGSON2F_JUMP:
15095 mips_fix_loongson2f_jump = FALSE;
15096 break;
15097
15098 case OPTION_FIX_LOONGSON2F_NOP:
15099 mips_fix_loongson2f_nop = TRUE;
15100 break;
15101
15102 case OPTION_NO_FIX_LOONGSON2F_NOP:
15103 mips_fix_loongson2f_nop = FALSE;
15104 break;
15105
15106 case OPTION_FIX_VR4120:
15107 mips_fix_vr4120 = 1;
15108 break;
15109
15110 case OPTION_NO_FIX_VR4120:
15111 mips_fix_vr4120 = 0;
15112 break;
15113
15114 case OPTION_FIX_VR4130:
15115 mips_fix_vr4130 = 1;
15116 break;
15117
15118 case OPTION_NO_FIX_VR4130:
15119 mips_fix_vr4130 = 0;
15120 break;
15121
15122 case OPTION_FIX_CN63XXP1:
15123 mips_fix_cn63xxp1 = TRUE;
15124 break;
15125
15126 case OPTION_NO_FIX_CN63XXP1:
15127 mips_fix_cn63xxp1 = FALSE;
15128 break;
15129
15130 case OPTION_RELAX_BRANCH:
15131 mips_relax_branch = 1;
15132 break;
15133
15134 case OPTION_NO_RELAX_BRANCH:
15135 mips_relax_branch = 0;
15136 break;
15137
15138 case OPTION_MSHARED:
15139 mips_in_shared = TRUE;
15140 break;
15141
15142 case OPTION_MNO_SHARED:
15143 mips_in_shared = FALSE;
15144 break;
15145
15146 case OPTION_MSYM32:
15147 mips_opts.sym32 = TRUE;
15148 break;
15149
15150 case OPTION_MNO_SYM32:
15151 mips_opts.sym32 = FALSE;
15152 break;
15153
15154 /* When generating ELF code, we permit -KPIC and -call_shared to
15155 select SVR4_PIC, and -non_shared to select no PIC. This is
15156 intended to be compatible with Irix 5. */
15157 case OPTION_CALL_SHARED:
15158 mips_pic = SVR4_PIC;
15159 mips_abicalls = TRUE;
15160 break;
15161
15162 case OPTION_CALL_NONPIC:
15163 mips_pic = NO_PIC;
15164 mips_abicalls = TRUE;
15165 break;
15166
15167 case OPTION_NON_SHARED:
15168 mips_pic = NO_PIC;
15169 mips_abicalls = FALSE;
15170 break;
15171
15172 /* The -xgot option tells the assembler to use 32 bit offsets
15173 when accessing the got in SVR4_PIC mode. It is for Irix
15174 compatibility. */
15175 case OPTION_XGOT:
15176 mips_big_got = 1;
15177 break;
15178
15179 case 'G':
15180 g_switch_value = atoi (arg);
15181 g_switch_seen = 1;
15182 break;
15183
15184 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15185 and -mabi=64. */
15186 case OPTION_32:
15187 mips_abi = O32_ABI;
15188 break;
15189
15190 case OPTION_N32:
15191 mips_abi = N32_ABI;
15192 break;
15193
15194 case OPTION_64:
15195 mips_abi = N64_ABI;
15196 if (!support_64bit_objects())
15197 as_fatal (_("No compiled in support for 64 bit object file format"));
15198 break;
15199
15200 case OPTION_GP32:
15201 file_mips_gp32 = 1;
15202 break;
15203
15204 case OPTION_GP64:
15205 file_mips_gp32 = 0;
15206 break;
15207
15208 case OPTION_FP32:
15209 file_mips_fp32 = 1;
15210 break;
15211
15212 case OPTION_FP64:
15213 file_mips_fp32 = 0;
15214 break;
15215
15216 case OPTION_SINGLE_FLOAT:
15217 file_mips_single_float = 1;
15218 break;
15219
15220 case OPTION_DOUBLE_FLOAT:
15221 file_mips_single_float = 0;
15222 break;
15223
15224 case OPTION_SOFT_FLOAT:
15225 file_mips_soft_float = 1;
15226 break;
15227
15228 case OPTION_HARD_FLOAT:
15229 file_mips_soft_float = 0;
15230 break;
15231
15232 case OPTION_MABI:
15233 if (strcmp (arg, "32") == 0)
15234 mips_abi = O32_ABI;
15235 else if (strcmp (arg, "o64") == 0)
15236 mips_abi = O64_ABI;
15237 else if (strcmp (arg, "n32") == 0)
15238 mips_abi = N32_ABI;
15239 else if (strcmp (arg, "64") == 0)
15240 {
15241 mips_abi = N64_ABI;
15242 if (! support_64bit_objects())
15243 as_fatal (_("No compiled in support for 64 bit object file "
15244 "format"));
15245 }
15246 else if (strcmp (arg, "eabi") == 0)
15247 mips_abi = EABI_ABI;
15248 else
15249 {
15250 as_fatal (_("invalid abi -mabi=%s"), arg);
15251 return 0;
15252 }
15253 break;
15254
15255 case OPTION_M7000_HILO_FIX:
15256 mips_7000_hilo_fix = TRUE;
15257 break;
15258
15259 case OPTION_MNO_7000_HILO_FIX:
15260 mips_7000_hilo_fix = FALSE;
15261 break;
15262
15263 case OPTION_MDEBUG:
15264 mips_flag_mdebug = TRUE;
15265 break;
15266
15267 case OPTION_NO_MDEBUG:
15268 mips_flag_mdebug = FALSE;
15269 break;
15270
15271 case OPTION_PDR:
15272 mips_flag_pdr = TRUE;
15273 break;
15274
15275 case OPTION_NO_PDR:
15276 mips_flag_pdr = FALSE;
15277 break;
15278
15279 case OPTION_MVXWORKS_PIC:
15280 mips_pic = VXWORKS_PIC;
15281 break;
15282
15283 default:
15284 return 0;
15285 }
15286
15287 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15288
15289 return 1;
15290 }
15291 \f
15292 /* Set up globals to generate code for the ISA or processor
15293 described by INFO. */
15294
15295 static void
15296 mips_set_architecture (const struct mips_cpu_info *info)
15297 {
15298 if (info != 0)
15299 {
15300 file_mips_arch = info->cpu;
15301 mips_opts.arch = info->cpu;
15302 mips_opts.isa = info->isa;
15303 }
15304 }
15305
15306
15307 /* Likewise for tuning. */
15308
15309 static void
15310 mips_set_tune (const struct mips_cpu_info *info)
15311 {
15312 if (info != 0)
15313 mips_tune = info->cpu;
15314 }
15315
15316
15317 void
15318 mips_after_parse_args (void)
15319 {
15320 const struct mips_cpu_info *arch_info = 0;
15321 const struct mips_cpu_info *tune_info = 0;
15322
15323 /* GP relative stuff not working for PE */
15324 if (strncmp (TARGET_OS, "pe", 2) == 0)
15325 {
15326 if (g_switch_seen && g_switch_value != 0)
15327 as_bad (_("-G not supported in this configuration."));
15328 g_switch_value = 0;
15329 }
15330
15331 if (mips_abi == NO_ABI)
15332 mips_abi = MIPS_DEFAULT_ABI;
15333
15334 /* The following code determines the architecture and register size.
15335 Similar code was added to GCC 3.3 (see override_options() in
15336 config/mips/mips.c). The GAS and GCC code should be kept in sync
15337 as much as possible. */
15338
15339 if (mips_arch_string != 0)
15340 arch_info = mips_parse_cpu ("-march", mips_arch_string);
15341
15342 if (file_mips_isa != ISA_UNKNOWN)
15343 {
15344 /* Handle -mipsN. At this point, file_mips_isa contains the
15345 ISA level specified by -mipsN, while arch_info->isa contains
15346 the -march selection (if any). */
15347 if (arch_info != 0)
15348 {
15349 /* -march takes precedence over -mipsN, since it is more descriptive.
15350 There's no harm in specifying both as long as the ISA levels
15351 are the same. */
15352 if (file_mips_isa != arch_info->isa)
15353 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15354 mips_cpu_info_from_isa (file_mips_isa)->name,
15355 mips_cpu_info_from_isa (arch_info->isa)->name);
15356 }
15357 else
15358 arch_info = mips_cpu_info_from_isa (file_mips_isa);
15359 }
15360
15361 if (arch_info == 0)
15362 {
15363 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15364 gas_assert (arch_info);
15365 }
15366
15367 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15368 as_bad (_("-march=%s is not compatible with the selected ABI"),
15369 arch_info->name);
15370
15371 mips_set_architecture (arch_info);
15372
15373 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
15374 if (mips_tune_string != 0)
15375 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15376
15377 if (tune_info == 0)
15378 mips_set_tune (arch_info);
15379 else
15380 mips_set_tune (tune_info);
15381
15382 if (file_mips_gp32 >= 0)
15383 {
15384 /* The user specified the size of the integer registers. Make sure
15385 it agrees with the ABI and ISA. */
15386 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15387 as_bad (_("-mgp64 used with a 32-bit processor"));
15388 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15389 as_bad (_("-mgp32 used with a 64-bit ABI"));
15390 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15391 as_bad (_("-mgp64 used with a 32-bit ABI"));
15392 }
15393 else
15394 {
15395 /* Infer the integer register size from the ABI and processor.
15396 Restrict ourselves to 32-bit registers if that's all the
15397 processor has, or if the ABI cannot handle 64-bit registers. */
15398 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15399 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15400 }
15401
15402 switch (file_mips_fp32)
15403 {
15404 default:
15405 case -1:
15406 /* No user specified float register size.
15407 ??? GAS treats single-float processors as though they had 64-bit
15408 float registers (although it complains when double-precision
15409 instructions are used). As things stand, saying they have 32-bit
15410 registers would lead to spurious "register must be even" messages.
15411 So here we assume float registers are never smaller than the
15412 integer ones. */
15413 if (file_mips_gp32 == 0)
15414 /* 64-bit integer registers implies 64-bit float registers. */
15415 file_mips_fp32 = 0;
15416 else if ((mips_opts.ase & FP64_ASES)
15417 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15418 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
15419 file_mips_fp32 = 0;
15420 else
15421 /* 32-bit float registers. */
15422 file_mips_fp32 = 1;
15423 break;
15424
15425 /* The user specified the size of the float registers. Check if it
15426 agrees with the ABI and ISA. */
15427 case 0:
15428 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15429 as_bad (_("-mfp64 used with a 32-bit fpu"));
15430 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15431 && !ISA_HAS_MXHC1 (mips_opts.isa))
15432 as_warn (_("-mfp64 used with a 32-bit ABI"));
15433 break;
15434 case 1:
15435 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15436 as_warn (_("-mfp32 used with a 64-bit ABI"));
15437 break;
15438 }
15439
15440 /* End of GCC-shared inference code. */
15441
15442 /* This flag is set when we have a 64-bit capable CPU but use only
15443 32-bit wide registers. Note that EABI does not use it. */
15444 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15445 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15446 || mips_abi == O32_ABI))
15447 mips_32bitmode = 1;
15448
15449 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15450 as_bad (_("trap exception not supported at ISA 1"));
15451
15452 /* If the selected architecture includes support for ASEs, enable
15453 generation of code for them. */
15454 if (mips_opts.mips16 == -1)
15455 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15456 if (mips_opts.micromips == -1)
15457 mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15458
15459 /* MIPS3D and MDMX require 64-bit FPRs, so -mfp32 should stop those
15460 ASEs from being selected implicitly. */
15461 if (file_mips_fp32 == 1)
15462 file_ase_explicit |= ASE_MIPS3D | ASE_MDMX;
15463
15464 /* If the user didn't explicitly select or deselect a particular ASE,
15465 use the default setting for the CPU. */
15466 mips_opts.ase |= (arch_info->ase & ~file_ase_explicit);
15467
15468 file_mips_isa = mips_opts.isa;
15469 file_ase = mips_opts.ase;
15470 mips_opts.gp32 = file_mips_gp32;
15471 mips_opts.fp32 = file_mips_fp32;
15472 mips_opts.soft_float = file_mips_soft_float;
15473 mips_opts.single_float = file_mips_single_float;
15474
15475 mips_check_isa_supports_ases ();
15476
15477 if (mips_flag_mdebug < 0)
15478 mips_flag_mdebug = 0;
15479 }
15480 \f
15481 void
15482 mips_init_after_args (void)
15483 {
15484 /* initialize opcodes */
15485 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15486 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15487 }
15488
15489 long
15490 md_pcrel_from (fixS *fixP)
15491 {
15492 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15493 switch (fixP->fx_r_type)
15494 {
15495 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15496 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15497 /* Return the address of the delay slot. */
15498 return addr + 2;
15499
15500 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15501 case BFD_RELOC_MICROMIPS_JMP:
15502 case BFD_RELOC_16_PCREL_S2:
15503 case BFD_RELOC_MIPS_JMP:
15504 /* Return the address of the delay slot. */
15505 return addr + 4;
15506
15507 case BFD_RELOC_32_PCREL:
15508 return addr;
15509
15510 default:
15511 /* We have no relocation type for PC relative MIPS16 instructions. */
15512 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15513 as_bad_where (fixP->fx_file, fixP->fx_line,
15514 _("PC relative MIPS16 instruction references a different section"));
15515 return addr;
15516 }
15517 }
15518
15519 /* This is called before the symbol table is processed. In order to
15520 work with gcc when using mips-tfile, we must keep all local labels.
15521 However, in other cases, we want to discard them. If we were
15522 called with -g, but we didn't see any debugging information, it may
15523 mean that gcc is smuggling debugging information through to
15524 mips-tfile, in which case we must generate all local labels. */
15525
15526 void
15527 mips_frob_file_before_adjust (void)
15528 {
15529 #ifndef NO_ECOFF_DEBUGGING
15530 if (ECOFF_DEBUGGING
15531 && mips_debug != 0
15532 && ! ecoff_debugging_seen)
15533 flag_keep_locals = 1;
15534 #endif
15535 }
15536
15537 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15538 the corresponding LO16 reloc. This is called before md_apply_fix and
15539 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
15540 relocation operators.
15541
15542 For our purposes, a %lo() expression matches a %got() or %hi()
15543 expression if:
15544
15545 (a) it refers to the same symbol; and
15546 (b) the offset applied in the %lo() expression is no lower than
15547 the offset applied in the %got() or %hi().
15548
15549 (b) allows us to cope with code like:
15550
15551 lui $4,%hi(foo)
15552 lh $4,%lo(foo+2)($4)
15553
15554 ...which is legal on RELA targets, and has a well-defined behaviour
15555 if the user knows that adding 2 to "foo" will not induce a carry to
15556 the high 16 bits.
15557
15558 When several %lo()s match a particular %got() or %hi(), we use the
15559 following rules to distinguish them:
15560
15561 (1) %lo()s with smaller offsets are a better match than %lo()s with
15562 higher offsets.
15563
15564 (2) %lo()s with no matching %got() or %hi() are better than those
15565 that already have a matching %got() or %hi().
15566
15567 (3) later %lo()s are better than earlier %lo()s.
15568
15569 These rules are applied in order.
15570
15571 (1) means, among other things, that %lo()s with identical offsets are
15572 chosen if they exist.
15573
15574 (2) means that we won't associate several high-part relocations with
15575 the same low-part relocation unless there's no alternative. Having
15576 several high parts for the same low part is a GNU extension; this rule
15577 allows careful users to avoid it.
15578
15579 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
15580 with the last high-part relocation being at the front of the list.
15581 It therefore makes sense to choose the last matching low-part
15582 relocation, all other things being equal. It's also easier
15583 to code that way. */
15584
15585 void
15586 mips_frob_file (void)
15587 {
15588 struct mips_hi_fixup *l;
15589 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15590
15591 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15592 {
15593 segment_info_type *seginfo;
15594 bfd_boolean matched_lo_p;
15595 fixS **hi_pos, **lo_pos, **pos;
15596
15597 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15598
15599 /* If a GOT16 relocation turns out to be against a global symbol,
15600 there isn't supposed to be a matching LO. Ignore %gots against
15601 constants; we'll report an error for those later. */
15602 if (got16_reloc_p (l->fixp->fx_r_type)
15603 && !(l->fixp->fx_addsy
15604 && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15605 continue;
15606
15607 /* Check quickly whether the next fixup happens to be a matching %lo. */
15608 if (fixup_has_matching_lo_p (l->fixp))
15609 continue;
15610
15611 seginfo = seg_info (l->seg);
15612
15613 /* Set HI_POS to the position of this relocation in the chain.
15614 Set LO_POS to the position of the chosen low-part relocation.
15615 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15616 relocation that matches an immediately-preceding high-part
15617 relocation. */
15618 hi_pos = NULL;
15619 lo_pos = NULL;
15620 matched_lo_p = FALSE;
15621 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15622
15623 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15624 {
15625 if (*pos == l->fixp)
15626 hi_pos = pos;
15627
15628 if ((*pos)->fx_r_type == looking_for_rtype
15629 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15630 && (*pos)->fx_offset >= l->fixp->fx_offset
15631 && (lo_pos == NULL
15632 || (*pos)->fx_offset < (*lo_pos)->fx_offset
15633 || (!matched_lo_p
15634 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15635 lo_pos = pos;
15636
15637 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15638 && fixup_has_matching_lo_p (*pos));
15639 }
15640
15641 /* If we found a match, remove the high-part relocation from its
15642 current position and insert it before the low-part relocation.
15643 Make the offsets match so that fixup_has_matching_lo_p()
15644 will return true.
15645
15646 We don't warn about unmatched high-part relocations since some
15647 versions of gcc have been known to emit dead "lui ...%hi(...)"
15648 instructions. */
15649 if (lo_pos != NULL)
15650 {
15651 l->fixp->fx_offset = (*lo_pos)->fx_offset;
15652 if (l->fixp->fx_next != *lo_pos)
15653 {
15654 *hi_pos = l->fixp->fx_next;
15655 l->fixp->fx_next = *lo_pos;
15656 *lo_pos = l->fixp;
15657 }
15658 }
15659 }
15660 }
15661
15662 int
15663 mips_force_relocation (fixS *fixp)
15664 {
15665 if (generic_force_reloc (fixp))
15666 return 1;
15667
15668 /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15669 so that the linker relaxation can update targets. */
15670 if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15671 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15672 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15673 return 1;
15674
15675 return 0;
15676 }
15677
15678 /* Read the instruction associated with RELOC from BUF. */
15679
15680 static unsigned int
15681 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15682 {
15683 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15684 return read_compressed_insn (buf, 4);
15685 else
15686 return read_insn (buf);
15687 }
15688
15689 /* Write instruction INSN to BUF, given that it has been relocated
15690 by RELOC. */
15691
15692 static void
15693 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15694 unsigned long insn)
15695 {
15696 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15697 write_compressed_insn (buf, insn, 4);
15698 else
15699 write_insn (buf, insn);
15700 }
15701
15702 /* Apply a fixup to the object file. */
15703
15704 void
15705 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15706 {
15707 char *buf;
15708 unsigned long insn;
15709 reloc_howto_type *howto;
15710
15711 /* We ignore generic BFD relocations we don't know about. */
15712 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15713 if (! howto)
15714 return;
15715
15716 gas_assert (fixP->fx_size == 2
15717 || fixP->fx_size == 4
15718 || fixP->fx_r_type == BFD_RELOC_16
15719 || fixP->fx_r_type == BFD_RELOC_64
15720 || fixP->fx_r_type == BFD_RELOC_CTOR
15721 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15722 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15723 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15724 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15725 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15726
15727 buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15728
15729 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15730 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15731 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15732 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15733 || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15734
15735 /* Don't treat parts of a composite relocation as done. There are two
15736 reasons for this:
15737
15738 (1) The second and third parts will be against 0 (RSS_UNDEF) but
15739 should nevertheless be emitted if the first part is.
15740
15741 (2) In normal usage, composite relocations are never assembly-time
15742 constants. The easiest way of dealing with the pathological
15743 exceptions is to generate a relocation against STN_UNDEF and
15744 leave everything up to the linker. */
15745 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15746 fixP->fx_done = 1;
15747
15748 switch (fixP->fx_r_type)
15749 {
15750 case BFD_RELOC_MIPS_TLS_GD:
15751 case BFD_RELOC_MIPS_TLS_LDM:
15752 case BFD_RELOC_MIPS_TLS_DTPREL32:
15753 case BFD_RELOC_MIPS_TLS_DTPREL64:
15754 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15755 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15756 case BFD_RELOC_MIPS_TLS_GOTTPREL:
15757 case BFD_RELOC_MIPS_TLS_TPREL32:
15758 case BFD_RELOC_MIPS_TLS_TPREL64:
15759 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15760 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15761 case BFD_RELOC_MICROMIPS_TLS_GD:
15762 case BFD_RELOC_MICROMIPS_TLS_LDM:
15763 case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15764 case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15765 case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15766 case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15767 case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15768 case BFD_RELOC_MIPS16_TLS_GD:
15769 case BFD_RELOC_MIPS16_TLS_LDM:
15770 case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15771 case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15772 case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15773 case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15774 case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15775 if (!fixP->fx_addsy)
15776 {
15777 as_bad_where (fixP->fx_file, fixP->fx_line,
15778 _("TLS relocation against a constant"));
15779 break;
15780 }
15781 S_SET_THREAD_LOCAL (fixP->fx_addsy);
15782 /* fall through */
15783
15784 case BFD_RELOC_MIPS_JMP:
15785 case BFD_RELOC_MIPS_SHIFT5:
15786 case BFD_RELOC_MIPS_SHIFT6:
15787 case BFD_RELOC_MIPS_GOT_DISP:
15788 case BFD_RELOC_MIPS_GOT_PAGE:
15789 case BFD_RELOC_MIPS_GOT_OFST:
15790 case BFD_RELOC_MIPS_SUB:
15791 case BFD_RELOC_MIPS_INSERT_A:
15792 case BFD_RELOC_MIPS_INSERT_B:
15793 case BFD_RELOC_MIPS_DELETE:
15794 case BFD_RELOC_MIPS_HIGHEST:
15795 case BFD_RELOC_MIPS_HIGHER:
15796 case BFD_RELOC_MIPS_SCN_DISP:
15797 case BFD_RELOC_MIPS_REL16:
15798 case BFD_RELOC_MIPS_RELGOT:
15799 case BFD_RELOC_MIPS_JALR:
15800 case BFD_RELOC_HI16:
15801 case BFD_RELOC_HI16_S:
15802 case BFD_RELOC_LO16:
15803 case BFD_RELOC_GPREL16:
15804 case BFD_RELOC_MIPS_LITERAL:
15805 case BFD_RELOC_MIPS_CALL16:
15806 case BFD_RELOC_MIPS_GOT16:
15807 case BFD_RELOC_GPREL32:
15808 case BFD_RELOC_MIPS_GOT_HI16:
15809 case BFD_RELOC_MIPS_GOT_LO16:
15810 case BFD_RELOC_MIPS_CALL_HI16:
15811 case BFD_RELOC_MIPS_CALL_LO16:
15812 case BFD_RELOC_MIPS16_GPREL:
15813 case BFD_RELOC_MIPS16_GOT16:
15814 case BFD_RELOC_MIPS16_CALL16:
15815 case BFD_RELOC_MIPS16_HI16:
15816 case BFD_RELOC_MIPS16_HI16_S:
15817 case BFD_RELOC_MIPS16_LO16:
15818 case BFD_RELOC_MIPS16_JMP:
15819 case BFD_RELOC_MICROMIPS_JMP:
15820 case BFD_RELOC_MICROMIPS_GOT_DISP:
15821 case BFD_RELOC_MICROMIPS_GOT_PAGE:
15822 case BFD_RELOC_MICROMIPS_GOT_OFST:
15823 case BFD_RELOC_MICROMIPS_SUB:
15824 case BFD_RELOC_MICROMIPS_HIGHEST:
15825 case BFD_RELOC_MICROMIPS_HIGHER:
15826 case BFD_RELOC_MICROMIPS_SCN_DISP:
15827 case BFD_RELOC_MICROMIPS_JALR:
15828 case BFD_RELOC_MICROMIPS_HI16:
15829 case BFD_RELOC_MICROMIPS_HI16_S:
15830 case BFD_RELOC_MICROMIPS_LO16:
15831 case BFD_RELOC_MICROMIPS_GPREL16:
15832 case BFD_RELOC_MICROMIPS_LITERAL:
15833 case BFD_RELOC_MICROMIPS_CALL16:
15834 case BFD_RELOC_MICROMIPS_GOT16:
15835 case BFD_RELOC_MICROMIPS_GOT_HI16:
15836 case BFD_RELOC_MICROMIPS_GOT_LO16:
15837 case BFD_RELOC_MICROMIPS_CALL_HI16:
15838 case BFD_RELOC_MICROMIPS_CALL_LO16:
15839 case BFD_RELOC_MIPS_EH:
15840 if (fixP->fx_done)
15841 {
15842 offsetT value;
15843
15844 if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15845 {
15846 insn = read_reloc_insn (buf, fixP->fx_r_type);
15847 if (mips16_reloc_p (fixP->fx_r_type))
15848 insn |= mips16_immed_extend (value, 16);
15849 else
15850 insn |= (value & 0xffff);
15851 write_reloc_insn (buf, fixP->fx_r_type, insn);
15852 }
15853 else
15854 as_bad_where (fixP->fx_file, fixP->fx_line,
15855 _("Unsupported constant in relocation"));
15856 }
15857 break;
15858
15859 case BFD_RELOC_64:
15860 /* This is handled like BFD_RELOC_32, but we output a sign
15861 extended value if we are only 32 bits. */
15862 if (fixP->fx_done)
15863 {
15864 if (8 <= sizeof (valueT))
15865 md_number_to_chars (buf, *valP, 8);
15866 else
15867 {
15868 valueT hiv;
15869
15870 if ((*valP & 0x80000000) != 0)
15871 hiv = 0xffffffff;
15872 else
15873 hiv = 0;
15874 md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15875 md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15876 }
15877 }
15878 break;
15879
15880 case BFD_RELOC_RVA:
15881 case BFD_RELOC_32:
15882 case BFD_RELOC_32_PCREL:
15883 case BFD_RELOC_16:
15884 /* If we are deleting this reloc entry, we must fill in the
15885 value now. This can happen if we have a .word which is not
15886 resolved when it appears but is later defined. */
15887 if (fixP->fx_done)
15888 md_number_to_chars (buf, *valP, fixP->fx_size);
15889 break;
15890
15891 case BFD_RELOC_16_PCREL_S2:
15892 if ((*valP & 0x3) != 0)
15893 as_bad_where (fixP->fx_file, fixP->fx_line,
15894 _("Branch to misaligned address (%lx)"), (long) *valP);
15895
15896 /* We need to save the bits in the instruction since fixup_segment()
15897 might be deleting the relocation entry (i.e., a branch within
15898 the current segment). */
15899 if (! fixP->fx_done)
15900 break;
15901
15902 /* Update old instruction data. */
15903 insn = read_insn (buf);
15904
15905 if (*valP + 0x20000 <= 0x3ffff)
15906 {
15907 insn |= (*valP >> 2) & 0xffff;
15908 write_insn (buf, insn);
15909 }
15910 else if (mips_pic == NO_PIC
15911 && fixP->fx_done
15912 && fixP->fx_frag->fr_address >= text_section->vma
15913 && (fixP->fx_frag->fr_address
15914 < text_section->vma + bfd_get_section_size (text_section))
15915 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
15916 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
15917 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15918 {
15919 /* The branch offset is too large. If this is an
15920 unconditional branch, and we are not generating PIC code,
15921 we can convert it to an absolute jump instruction. */
15922 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
15923 insn = 0x0c000000; /* jal */
15924 else
15925 insn = 0x08000000; /* j */
15926 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15927 fixP->fx_done = 0;
15928 fixP->fx_addsy = section_symbol (text_section);
15929 *valP += md_pcrel_from (fixP);
15930 write_insn (buf, insn);
15931 }
15932 else
15933 {
15934 /* If we got here, we have branch-relaxation disabled,
15935 and there's nothing we can do to fix this instruction
15936 without turning it into a longer sequence. */
15937 as_bad_where (fixP->fx_file, fixP->fx_line,
15938 _("Branch out of range"));
15939 }
15940 break;
15941
15942 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15943 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15944 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15945 /* We adjust the offset back to even. */
15946 if ((*valP & 0x1) != 0)
15947 --(*valP);
15948
15949 if (! fixP->fx_done)
15950 break;
15951
15952 /* Should never visit here, because we keep the relocation. */
15953 abort ();
15954 break;
15955
15956 case BFD_RELOC_VTABLE_INHERIT:
15957 fixP->fx_done = 0;
15958 if (fixP->fx_addsy
15959 && !S_IS_DEFINED (fixP->fx_addsy)
15960 && !S_IS_WEAK (fixP->fx_addsy))
15961 S_SET_WEAK (fixP->fx_addsy);
15962 break;
15963
15964 case BFD_RELOC_VTABLE_ENTRY:
15965 fixP->fx_done = 0;
15966 break;
15967
15968 default:
15969 abort ();
15970 }
15971
15972 /* Remember value for tc_gen_reloc. */
15973 fixP->fx_addnumber = *valP;
15974 }
15975
15976 static symbolS *
15977 get_symbol (void)
15978 {
15979 int c;
15980 char *name;
15981 symbolS *p;
15982
15983 name = input_line_pointer;
15984 c = get_symbol_end ();
15985 p = (symbolS *) symbol_find_or_make (name);
15986 *input_line_pointer = c;
15987 return p;
15988 }
15989
15990 /* Align the current frag to a given power of two. If a particular
15991 fill byte should be used, FILL points to an integer that contains
15992 that byte, otherwise FILL is null.
15993
15994 This function used to have the comment:
15995
15996 The MIPS assembler also automatically adjusts any preceding label.
15997
15998 The implementation therefore applied the adjustment to a maximum of
15999 one label. However, other label adjustments are applied to batches
16000 of labels, and adjusting just one caused problems when new labels
16001 were added for the sake of debugging or unwind information.
16002 We therefore adjust all preceding labels (given as LABELS) instead. */
16003
16004 static void
16005 mips_align (int to, int *fill, struct insn_label_list *labels)
16006 {
16007 mips_emit_delays ();
16008 mips_record_compressed_mode ();
16009 if (fill == NULL && subseg_text_p (now_seg))
16010 frag_align_code (to, 0);
16011 else
16012 frag_align (to, fill ? *fill : 0, 0);
16013 record_alignment (now_seg, to);
16014 mips_move_labels (labels, FALSE);
16015 }
16016
16017 /* Align to a given power of two. .align 0 turns off the automatic
16018 alignment used by the data creating pseudo-ops. */
16019
16020 static void
16021 s_align (int x ATTRIBUTE_UNUSED)
16022 {
16023 int temp, fill_value, *fill_ptr;
16024 long max_alignment = 28;
16025
16026 /* o Note that the assembler pulls down any immediately preceding label
16027 to the aligned address.
16028 o It's not documented but auto alignment is reinstated by
16029 a .align pseudo instruction.
16030 o Note also that after auto alignment is turned off the mips assembler
16031 issues an error on attempt to assemble an improperly aligned data item.
16032 We don't. */
16033
16034 temp = get_absolute_expression ();
16035 if (temp > max_alignment)
16036 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
16037 else if (temp < 0)
16038 {
16039 as_warn (_("Alignment negative: 0 assumed."));
16040 temp = 0;
16041 }
16042 if (*input_line_pointer == ',')
16043 {
16044 ++input_line_pointer;
16045 fill_value = get_absolute_expression ();
16046 fill_ptr = &fill_value;
16047 }
16048 else
16049 fill_ptr = 0;
16050 if (temp)
16051 {
16052 segment_info_type *si = seg_info (now_seg);
16053 struct insn_label_list *l = si->label_list;
16054 /* Auto alignment should be switched on by next section change. */
16055 auto_align = 1;
16056 mips_align (temp, fill_ptr, l);
16057 }
16058 else
16059 {
16060 auto_align = 0;
16061 }
16062
16063 demand_empty_rest_of_line ();
16064 }
16065
16066 static void
16067 s_change_sec (int sec)
16068 {
16069 segT seg;
16070
16071 /* The ELF backend needs to know that we are changing sections, so
16072 that .previous works correctly. We could do something like check
16073 for an obj_section_change_hook macro, but that might be confusing
16074 as it would not be appropriate to use it in the section changing
16075 functions in read.c, since obj-elf.c intercepts those. FIXME:
16076 This should be cleaner, somehow. */
16077 obj_elf_section_change_hook ();
16078
16079 mips_emit_delays ();
16080
16081 switch (sec)
16082 {
16083 case 't':
16084 s_text (0);
16085 break;
16086 case 'd':
16087 s_data (0);
16088 break;
16089 case 'b':
16090 subseg_set (bss_section, (subsegT) get_absolute_expression ());
16091 demand_empty_rest_of_line ();
16092 break;
16093
16094 case 'r':
16095 seg = subseg_new (RDATA_SECTION_NAME,
16096 (subsegT) get_absolute_expression ());
16097 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16098 | SEC_READONLY | SEC_RELOC
16099 | SEC_DATA));
16100 if (strncmp (TARGET_OS, "elf", 3) != 0)
16101 record_alignment (seg, 4);
16102 demand_empty_rest_of_line ();
16103 break;
16104
16105 case 's':
16106 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16107 bfd_set_section_flags (stdoutput, seg,
16108 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16109 if (strncmp (TARGET_OS, "elf", 3) != 0)
16110 record_alignment (seg, 4);
16111 demand_empty_rest_of_line ();
16112 break;
16113
16114 case 'B':
16115 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16116 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16117 if (strncmp (TARGET_OS, "elf", 3) != 0)
16118 record_alignment (seg, 4);
16119 demand_empty_rest_of_line ();
16120 break;
16121 }
16122
16123 auto_align = 1;
16124 }
16125
16126 void
16127 s_change_section (int ignore ATTRIBUTE_UNUSED)
16128 {
16129 char *section_name;
16130 char c;
16131 char next_c = 0;
16132 int section_type;
16133 int section_flag;
16134 int section_entry_size;
16135 int section_alignment;
16136
16137 section_name = input_line_pointer;
16138 c = get_symbol_end ();
16139 if (c)
16140 next_c = *(input_line_pointer + 1);
16141
16142 /* Do we have .section Name<,"flags">? */
16143 if (c != ',' || (c == ',' && next_c == '"'))
16144 {
16145 /* just after name is now '\0'. */
16146 *input_line_pointer = c;
16147 input_line_pointer = section_name;
16148 obj_elf_section (ignore);
16149 return;
16150 }
16151 input_line_pointer++;
16152
16153 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
16154 if (c == ',')
16155 section_type = get_absolute_expression ();
16156 else
16157 section_type = 0;
16158 if (*input_line_pointer++ == ',')
16159 section_flag = get_absolute_expression ();
16160 else
16161 section_flag = 0;
16162 if (*input_line_pointer++ == ',')
16163 section_entry_size = get_absolute_expression ();
16164 else
16165 section_entry_size = 0;
16166 if (*input_line_pointer++ == ',')
16167 section_alignment = get_absolute_expression ();
16168 else
16169 section_alignment = 0;
16170 /* FIXME: really ignore? */
16171 (void) section_alignment;
16172
16173 section_name = xstrdup (section_name);
16174
16175 /* When using the generic form of .section (as implemented by obj-elf.c),
16176 there's no way to set the section type to SHT_MIPS_DWARF. Users have
16177 traditionally had to fall back on the more common @progbits instead.
16178
16179 There's nothing really harmful in this, since bfd will correct
16180 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
16181 means that, for backwards compatibility, the special_section entries
16182 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16183
16184 Even so, we shouldn't force users of the MIPS .section syntax to
16185 incorrectly label the sections as SHT_PROGBITS. The best compromise
16186 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16187 generic type-checking code. */
16188 if (section_type == SHT_MIPS_DWARF)
16189 section_type = SHT_PROGBITS;
16190
16191 obj_elf_change_section (section_name, section_type, section_flag,
16192 section_entry_size, 0, 0, 0);
16193
16194 if (now_seg->name != section_name)
16195 free (section_name);
16196 }
16197
16198 void
16199 mips_enable_auto_align (void)
16200 {
16201 auto_align = 1;
16202 }
16203
16204 static void
16205 s_cons (int log_size)
16206 {
16207 segment_info_type *si = seg_info (now_seg);
16208 struct insn_label_list *l = si->label_list;
16209
16210 mips_emit_delays ();
16211 if (log_size > 0 && auto_align)
16212 mips_align (log_size, 0, l);
16213 cons (1 << log_size);
16214 mips_clear_insn_labels ();
16215 }
16216
16217 static void
16218 s_float_cons (int type)
16219 {
16220 segment_info_type *si = seg_info (now_seg);
16221 struct insn_label_list *l = si->label_list;
16222
16223 mips_emit_delays ();
16224
16225 if (auto_align)
16226 {
16227 if (type == 'd')
16228 mips_align (3, 0, l);
16229 else
16230 mips_align (2, 0, l);
16231 }
16232
16233 float_cons (type);
16234 mips_clear_insn_labels ();
16235 }
16236
16237 /* Handle .globl. We need to override it because on Irix 5 you are
16238 permitted to say
16239 .globl foo .text
16240 where foo is an undefined symbol, to mean that foo should be
16241 considered to be the address of a function. */
16242
16243 static void
16244 s_mips_globl (int x ATTRIBUTE_UNUSED)
16245 {
16246 char *name;
16247 int c;
16248 symbolS *symbolP;
16249 flagword flag;
16250
16251 do
16252 {
16253 name = input_line_pointer;
16254 c = get_symbol_end ();
16255 symbolP = symbol_find_or_make (name);
16256 S_SET_EXTERNAL (symbolP);
16257
16258 *input_line_pointer = c;
16259 SKIP_WHITESPACE ();
16260
16261 /* On Irix 5, every global symbol that is not explicitly labelled as
16262 being a function is apparently labelled as being an object. */
16263 flag = BSF_OBJECT;
16264
16265 if (!is_end_of_line[(unsigned char) *input_line_pointer]
16266 && (*input_line_pointer != ','))
16267 {
16268 char *secname;
16269 asection *sec;
16270
16271 secname = input_line_pointer;
16272 c = get_symbol_end ();
16273 sec = bfd_get_section_by_name (stdoutput, secname);
16274 if (sec == NULL)
16275 as_bad (_("%s: no such section"), secname);
16276 *input_line_pointer = c;
16277
16278 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16279 flag = BSF_FUNCTION;
16280 }
16281
16282 symbol_get_bfdsym (symbolP)->flags |= flag;
16283
16284 c = *input_line_pointer;
16285 if (c == ',')
16286 {
16287 input_line_pointer++;
16288 SKIP_WHITESPACE ();
16289 if (is_end_of_line[(unsigned char) *input_line_pointer])
16290 c = '\n';
16291 }
16292 }
16293 while (c == ',');
16294
16295 demand_empty_rest_of_line ();
16296 }
16297
16298 static void
16299 s_option (int x ATTRIBUTE_UNUSED)
16300 {
16301 char *opt;
16302 char c;
16303
16304 opt = input_line_pointer;
16305 c = get_symbol_end ();
16306
16307 if (*opt == 'O')
16308 {
16309 /* FIXME: What does this mean? */
16310 }
16311 else if (strncmp (opt, "pic", 3) == 0)
16312 {
16313 int i;
16314
16315 i = atoi (opt + 3);
16316 if (i == 0)
16317 mips_pic = NO_PIC;
16318 else if (i == 2)
16319 {
16320 mips_pic = SVR4_PIC;
16321 mips_abicalls = TRUE;
16322 }
16323 else
16324 as_bad (_(".option pic%d not supported"), i);
16325
16326 if (mips_pic == SVR4_PIC)
16327 {
16328 if (g_switch_seen && g_switch_value != 0)
16329 as_warn (_("-G may not be used with SVR4 PIC code"));
16330 g_switch_value = 0;
16331 bfd_set_gp_size (stdoutput, 0);
16332 }
16333 }
16334 else
16335 as_warn (_("Unrecognized option \"%s\""), opt);
16336
16337 *input_line_pointer = c;
16338 demand_empty_rest_of_line ();
16339 }
16340
16341 /* This structure is used to hold a stack of .set values. */
16342
16343 struct mips_option_stack
16344 {
16345 struct mips_option_stack *next;
16346 struct mips_set_options options;
16347 };
16348
16349 static struct mips_option_stack *mips_opts_stack;
16350
16351 /* Handle the .set pseudo-op. */
16352
16353 static void
16354 s_mipsset (int x ATTRIBUTE_UNUSED)
16355 {
16356 char *name = input_line_pointer, ch;
16357 const struct mips_ase *ase;
16358
16359 while (!is_end_of_line[(unsigned char) *input_line_pointer])
16360 ++input_line_pointer;
16361 ch = *input_line_pointer;
16362 *input_line_pointer = '\0';
16363
16364 if (strcmp (name, "reorder") == 0)
16365 {
16366 if (mips_opts.noreorder)
16367 end_noreorder ();
16368 }
16369 else if (strcmp (name, "noreorder") == 0)
16370 {
16371 if (!mips_opts.noreorder)
16372 start_noreorder ();
16373 }
16374 else if (strncmp (name, "at=", 3) == 0)
16375 {
16376 char *s = name + 3;
16377
16378 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16379 as_bad (_("Unrecognized register name `%s'"), s);
16380 }
16381 else if (strcmp (name, "at") == 0)
16382 {
16383 mips_opts.at = ATREG;
16384 }
16385 else if (strcmp (name, "noat") == 0)
16386 {
16387 mips_opts.at = ZERO;
16388 }
16389 else if (strcmp (name, "macro") == 0)
16390 {
16391 mips_opts.warn_about_macros = 0;
16392 }
16393 else if (strcmp (name, "nomacro") == 0)
16394 {
16395 if (mips_opts.noreorder == 0)
16396 as_bad (_("`noreorder' must be set before `nomacro'"));
16397 mips_opts.warn_about_macros = 1;
16398 }
16399 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16400 {
16401 mips_opts.nomove = 0;
16402 }
16403 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16404 {
16405 mips_opts.nomove = 1;
16406 }
16407 else if (strcmp (name, "bopt") == 0)
16408 {
16409 mips_opts.nobopt = 0;
16410 }
16411 else if (strcmp (name, "nobopt") == 0)
16412 {
16413 mips_opts.nobopt = 1;
16414 }
16415 else if (strcmp (name, "gp=default") == 0)
16416 mips_opts.gp32 = file_mips_gp32;
16417 else if (strcmp (name, "gp=32") == 0)
16418 mips_opts.gp32 = 1;
16419 else if (strcmp (name, "gp=64") == 0)
16420 {
16421 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16422 as_warn (_("%s isa does not support 64-bit registers"),
16423 mips_cpu_info_from_isa (mips_opts.isa)->name);
16424 mips_opts.gp32 = 0;
16425 }
16426 else if (strcmp (name, "fp=default") == 0)
16427 mips_opts.fp32 = file_mips_fp32;
16428 else if (strcmp (name, "fp=32") == 0)
16429 mips_opts.fp32 = 1;
16430 else if (strcmp (name, "fp=64") == 0)
16431 {
16432 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16433 as_warn (_("%s isa does not support 64-bit floating point registers"),
16434 mips_cpu_info_from_isa (mips_opts.isa)->name);
16435 mips_opts.fp32 = 0;
16436 }
16437 else if (strcmp (name, "softfloat") == 0)
16438 mips_opts.soft_float = 1;
16439 else if (strcmp (name, "hardfloat") == 0)
16440 mips_opts.soft_float = 0;
16441 else if (strcmp (name, "singlefloat") == 0)
16442 mips_opts.single_float = 1;
16443 else if (strcmp (name, "doublefloat") == 0)
16444 mips_opts.single_float = 0;
16445 else if (strcmp (name, "mips16") == 0
16446 || strcmp (name, "MIPS-16") == 0)
16447 {
16448 if (mips_opts.micromips == 1)
16449 as_fatal (_("`mips16' cannot be used with `micromips'"));
16450 mips_opts.mips16 = 1;
16451 }
16452 else if (strcmp (name, "nomips16") == 0
16453 || strcmp (name, "noMIPS-16") == 0)
16454 mips_opts.mips16 = 0;
16455 else if (strcmp (name, "micromips") == 0)
16456 {
16457 if (mips_opts.mips16 == 1)
16458 as_fatal (_("`micromips' cannot be used with `mips16'"));
16459 mips_opts.micromips = 1;
16460 }
16461 else if (strcmp (name, "nomicromips") == 0)
16462 mips_opts.micromips = 0;
16463 else if (name[0] == 'n'
16464 && name[1] == 'o'
16465 && (ase = mips_lookup_ase (name + 2)))
16466 mips_set_ase (ase, FALSE);
16467 else if ((ase = mips_lookup_ase (name)))
16468 mips_set_ase (ase, TRUE);
16469 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16470 {
16471 int reset = 0;
16472
16473 /* Permit the user to change the ISA and architecture on the fly.
16474 Needless to say, misuse can cause serious problems. */
16475 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16476 {
16477 reset = 1;
16478 mips_opts.isa = file_mips_isa;
16479 mips_opts.arch = file_mips_arch;
16480 }
16481 else if (strncmp (name, "arch=", 5) == 0)
16482 {
16483 const struct mips_cpu_info *p;
16484
16485 p = mips_parse_cpu("internal use", name + 5);
16486 if (!p)
16487 as_bad (_("unknown architecture %s"), name + 5);
16488 else
16489 {
16490 mips_opts.arch = p->cpu;
16491 mips_opts.isa = p->isa;
16492 }
16493 }
16494 else if (strncmp (name, "mips", 4) == 0)
16495 {
16496 const struct mips_cpu_info *p;
16497
16498 p = mips_parse_cpu("internal use", name);
16499 if (!p)
16500 as_bad (_("unknown ISA level %s"), name + 4);
16501 else
16502 {
16503 mips_opts.arch = p->cpu;
16504 mips_opts.isa = p->isa;
16505 }
16506 }
16507 else
16508 as_bad (_("unknown ISA or architecture %s"), name);
16509
16510 switch (mips_opts.isa)
16511 {
16512 case 0:
16513 break;
16514 case ISA_MIPS1:
16515 case ISA_MIPS2:
16516 case ISA_MIPS32:
16517 case ISA_MIPS32R2:
16518 mips_opts.gp32 = 1;
16519 mips_opts.fp32 = 1;
16520 break;
16521 case ISA_MIPS3:
16522 case ISA_MIPS4:
16523 case ISA_MIPS5:
16524 case ISA_MIPS64:
16525 case ISA_MIPS64R2:
16526 mips_opts.gp32 = 0;
16527 if (mips_opts.arch == CPU_R5900)
16528 {
16529 mips_opts.fp32 = 1;
16530 }
16531 else
16532 {
16533 mips_opts.fp32 = 0;
16534 }
16535 break;
16536 default:
16537 as_bad (_("unknown ISA level %s"), name + 4);
16538 break;
16539 }
16540 if (reset)
16541 {
16542 mips_opts.gp32 = file_mips_gp32;
16543 mips_opts.fp32 = file_mips_fp32;
16544 }
16545 }
16546 else if (strcmp (name, "autoextend") == 0)
16547 mips_opts.noautoextend = 0;
16548 else if (strcmp (name, "noautoextend") == 0)
16549 mips_opts.noautoextend = 1;
16550 else if (strcmp (name, "push") == 0)
16551 {
16552 struct mips_option_stack *s;
16553
16554 s = (struct mips_option_stack *) xmalloc (sizeof *s);
16555 s->next = mips_opts_stack;
16556 s->options = mips_opts;
16557 mips_opts_stack = s;
16558 }
16559 else if (strcmp (name, "pop") == 0)
16560 {
16561 struct mips_option_stack *s;
16562
16563 s = mips_opts_stack;
16564 if (s == NULL)
16565 as_bad (_(".set pop with no .set push"));
16566 else
16567 {
16568 /* If we're changing the reorder mode we need to handle
16569 delay slots correctly. */
16570 if (s->options.noreorder && ! mips_opts.noreorder)
16571 start_noreorder ();
16572 else if (! s->options.noreorder && mips_opts.noreorder)
16573 end_noreorder ();
16574
16575 mips_opts = s->options;
16576 mips_opts_stack = s->next;
16577 free (s);
16578 }
16579 }
16580 else if (strcmp (name, "sym32") == 0)
16581 mips_opts.sym32 = TRUE;
16582 else if (strcmp (name, "nosym32") == 0)
16583 mips_opts.sym32 = FALSE;
16584 else if (strchr (name, ','))
16585 {
16586 /* Generic ".set" directive; use the generic handler. */
16587 *input_line_pointer = ch;
16588 input_line_pointer = name;
16589 s_set (0);
16590 return;
16591 }
16592 else
16593 {
16594 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16595 }
16596 mips_check_isa_supports_ases ();
16597 *input_line_pointer = ch;
16598 demand_empty_rest_of_line ();
16599 }
16600
16601 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
16602 .option pic2. It means to generate SVR4 PIC calls. */
16603
16604 static void
16605 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16606 {
16607 mips_pic = SVR4_PIC;
16608 mips_abicalls = TRUE;
16609
16610 if (g_switch_seen && g_switch_value != 0)
16611 as_warn (_("-G may not be used with SVR4 PIC code"));
16612 g_switch_value = 0;
16613
16614 bfd_set_gp_size (stdoutput, 0);
16615 demand_empty_rest_of_line ();
16616 }
16617
16618 /* Handle the .cpload pseudo-op. This is used when generating SVR4
16619 PIC code. It sets the $gp register for the function based on the
16620 function address, which is in the register named in the argument.
16621 This uses a relocation against _gp_disp, which is handled specially
16622 by the linker. The result is:
16623 lui $gp,%hi(_gp_disp)
16624 addiu $gp,$gp,%lo(_gp_disp)
16625 addu $gp,$gp,.cpload argument
16626 The .cpload argument is normally $25 == $t9.
16627
16628 The -mno-shared option changes this to:
16629 lui $gp,%hi(__gnu_local_gp)
16630 addiu $gp,$gp,%lo(__gnu_local_gp)
16631 and the argument is ignored. This saves an instruction, but the
16632 resulting code is not position independent; it uses an absolute
16633 address for __gnu_local_gp. Thus code assembled with -mno-shared
16634 can go into an ordinary executable, but not into a shared library. */
16635
16636 static void
16637 s_cpload (int ignore ATTRIBUTE_UNUSED)
16638 {
16639 expressionS ex;
16640 int reg;
16641 int in_shared;
16642
16643 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16644 .cpload is ignored. */
16645 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16646 {
16647 s_ignore (0);
16648 return;
16649 }
16650
16651 if (mips_opts.mips16)
16652 {
16653 as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16654 ignore_rest_of_line ();
16655 return;
16656 }
16657
16658 /* .cpload should be in a .set noreorder section. */
16659 if (mips_opts.noreorder == 0)
16660 as_warn (_(".cpload not in noreorder section"));
16661
16662 reg = tc_get_register (0);
16663
16664 /* If we need to produce a 64-bit address, we are better off using
16665 the default instruction sequence. */
16666 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16667
16668 ex.X_op = O_symbol;
16669 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16670 "__gnu_local_gp");
16671 ex.X_op_symbol = NULL;
16672 ex.X_add_number = 0;
16673
16674 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16675 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16676
16677 mips_mark_labels ();
16678 mips_assembling_insn = TRUE;
16679
16680 macro_start ();
16681 macro_build_lui (&ex, mips_gp_register);
16682 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16683 mips_gp_register, BFD_RELOC_LO16);
16684 if (in_shared)
16685 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16686 mips_gp_register, reg);
16687 macro_end ();
16688
16689 mips_assembling_insn = FALSE;
16690 demand_empty_rest_of_line ();
16691 }
16692
16693 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
16694 .cpsetup $reg1, offset|$reg2, label
16695
16696 If offset is given, this results in:
16697 sd $gp, offset($sp)
16698 lui $gp, %hi(%neg(%gp_rel(label)))
16699 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16700 daddu $gp, $gp, $reg1
16701
16702 If $reg2 is given, this results in:
16703 daddu $reg2, $gp, $0
16704 lui $gp, %hi(%neg(%gp_rel(label)))
16705 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16706 daddu $gp, $gp, $reg1
16707 $reg1 is normally $25 == $t9.
16708
16709 The -mno-shared option replaces the last three instructions with
16710 lui $gp,%hi(_gp)
16711 addiu $gp,$gp,%lo(_gp) */
16712
16713 static void
16714 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16715 {
16716 expressionS ex_off;
16717 expressionS ex_sym;
16718 int reg1;
16719
16720 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16721 We also need NewABI support. */
16722 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16723 {
16724 s_ignore (0);
16725 return;
16726 }
16727
16728 if (mips_opts.mips16)
16729 {
16730 as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16731 ignore_rest_of_line ();
16732 return;
16733 }
16734
16735 reg1 = tc_get_register (0);
16736 SKIP_WHITESPACE ();
16737 if (*input_line_pointer != ',')
16738 {
16739 as_bad (_("missing argument separator ',' for .cpsetup"));
16740 return;
16741 }
16742 else
16743 ++input_line_pointer;
16744 SKIP_WHITESPACE ();
16745 if (*input_line_pointer == '$')
16746 {
16747 mips_cpreturn_register = tc_get_register (0);
16748 mips_cpreturn_offset = -1;
16749 }
16750 else
16751 {
16752 mips_cpreturn_offset = get_absolute_expression ();
16753 mips_cpreturn_register = -1;
16754 }
16755 SKIP_WHITESPACE ();
16756 if (*input_line_pointer != ',')
16757 {
16758 as_bad (_("missing argument separator ',' for .cpsetup"));
16759 return;
16760 }
16761 else
16762 ++input_line_pointer;
16763 SKIP_WHITESPACE ();
16764 expression (&ex_sym);
16765
16766 mips_mark_labels ();
16767 mips_assembling_insn = TRUE;
16768
16769 macro_start ();
16770 if (mips_cpreturn_register == -1)
16771 {
16772 ex_off.X_op = O_constant;
16773 ex_off.X_add_symbol = NULL;
16774 ex_off.X_op_symbol = NULL;
16775 ex_off.X_add_number = mips_cpreturn_offset;
16776
16777 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16778 BFD_RELOC_LO16, SP);
16779 }
16780 else
16781 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16782 mips_gp_register, 0);
16783
16784 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16785 {
16786 macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16787 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16788 BFD_RELOC_HI16_S);
16789
16790 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16791 mips_gp_register, -1, BFD_RELOC_GPREL16,
16792 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16793
16794 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16795 mips_gp_register, reg1);
16796 }
16797 else
16798 {
16799 expressionS ex;
16800
16801 ex.X_op = O_symbol;
16802 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16803 ex.X_op_symbol = NULL;
16804 ex.X_add_number = 0;
16805
16806 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16807 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16808
16809 macro_build_lui (&ex, mips_gp_register);
16810 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16811 mips_gp_register, BFD_RELOC_LO16);
16812 }
16813
16814 macro_end ();
16815
16816 mips_assembling_insn = FALSE;
16817 demand_empty_rest_of_line ();
16818 }
16819
16820 static void
16821 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16822 {
16823 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16824 .cplocal is ignored. */
16825 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16826 {
16827 s_ignore (0);
16828 return;
16829 }
16830
16831 if (mips_opts.mips16)
16832 {
16833 as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16834 ignore_rest_of_line ();
16835 return;
16836 }
16837
16838 mips_gp_register = tc_get_register (0);
16839 demand_empty_rest_of_line ();
16840 }
16841
16842 /* Handle the .cprestore pseudo-op. This stores $gp into a given
16843 offset from $sp. The offset is remembered, and after making a PIC
16844 call $gp is restored from that location. */
16845
16846 static void
16847 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16848 {
16849 expressionS ex;
16850
16851 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16852 .cprestore is ignored. */
16853 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16854 {
16855 s_ignore (0);
16856 return;
16857 }
16858
16859 if (mips_opts.mips16)
16860 {
16861 as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16862 ignore_rest_of_line ();
16863 return;
16864 }
16865
16866 mips_cprestore_offset = get_absolute_expression ();
16867 mips_cprestore_valid = 1;
16868
16869 ex.X_op = O_constant;
16870 ex.X_add_symbol = NULL;
16871 ex.X_op_symbol = NULL;
16872 ex.X_add_number = mips_cprestore_offset;
16873
16874 mips_mark_labels ();
16875 mips_assembling_insn = TRUE;
16876
16877 macro_start ();
16878 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16879 SP, HAVE_64BIT_ADDRESSES);
16880 macro_end ();
16881
16882 mips_assembling_insn = FALSE;
16883 demand_empty_rest_of_line ();
16884 }
16885
16886 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16887 was given in the preceding .cpsetup, it results in:
16888 ld $gp, offset($sp)
16889
16890 If a register $reg2 was given there, it results in:
16891 daddu $gp, $reg2, $0 */
16892
16893 static void
16894 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16895 {
16896 expressionS ex;
16897
16898 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16899 We also need NewABI support. */
16900 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16901 {
16902 s_ignore (0);
16903 return;
16904 }
16905
16906 if (mips_opts.mips16)
16907 {
16908 as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16909 ignore_rest_of_line ();
16910 return;
16911 }
16912
16913 mips_mark_labels ();
16914 mips_assembling_insn = TRUE;
16915
16916 macro_start ();
16917 if (mips_cpreturn_register == -1)
16918 {
16919 ex.X_op = O_constant;
16920 ex.X_add_symbol = NULL;
16921 ex.X_op_symbol = NULL;
16922 ex.X_add_number = mips_cpreturn_offset;
16923
16924 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16925 }
16926 else
16927 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16928 mips_cpreturn_register, 0);
16929 macro_end ();
16930
16931 mips_assembling_insn = FALSE;
16932 demand_empty_rest_of_line ();
16933 }
16934
16935 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
16936 pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
16937 DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
16938 debug information or MIPS16 TLS. */
16939
16940 static void
16941 s_tls_rel_directive (const size_t bytes, const char *dirstr,
16942 bfd_reloc_code_real_type rtype)
16943 {
16944 expressionS ex;
16945 char *p;
16946
16947 expression (&ex);
16948
16949 if (ex.X_op != O_symbol)
16950 {
16951 as_bad (_("Unsupported use of %s"), dirstr);
16952 ignore_rest_of_line ();
16953 }
16954
16955 p = frag_more (bytes);
16956 md_number_to_chars (p, 0, bytes);
16957 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
16958 demand_empty_rest_of_line ();
16959 mips_clear_insn_labels ();
16960 }
16961
16962 /* Handle .dtprelword. */
16963
16964 static void
16965 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16966 {
16967 s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
16968 }
16969
16970 /* Handle .dtpreldword. */
16971
16972 static void
16973 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16974 {
16975 s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
16976 }
16977
16978 /* Handle .tprelword. */
16979
16980 static void
16981 s_tprelword (int ignore ATTRIBUTE_UNUSED)
16982 {
16983 s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
16984 }
16985
16986 /* Handle .tpreldword. */
16987
16988 static void
16989 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
16990 {
16991 s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
16992 }
16993
16994 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
16995 code. It sets the offset to use in gp_rel relocations. */
16996
16997 static void
16998 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16999 {
17000 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
17001 We also need NewABI support. */
17002 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
17003 {
17004 s_ignore (0);
17005 return;
17006 }
17007
17008 mips_gprel_offset = get_absolute_expression ();
17009
17010 demand_empty_rest_of_line ();
17011 }
17012
17013 /* Handle the .gpword pseudo-op. This is used when generating PIC
17014 code. It generates a 32 bit GP relative reloc. */
17015
17016 static void
17017 s_gpword (int ignore ATTRIBUTE_UNUSED)
17018 {
17019 segment_info_type *si;
17020 struct insn_label_list *l;
17021 expressionS ex;
17022 char *p;
17023
17024 /* When not generating PIC code, this is treated as .word. */
17025 if (mips_pic != SVR4_PIC)
17026 {
17027 s_cons (2);
17028 return;
17029 }
17030
17031 si = seg_info (now_seg);
17032 l = si->label_list;
17033 mips_emit_delays ();
17034 if (auto_align)
17035 mips_align (2, 0, l);
17036
17037 expression (&ex);
17038 mips_clear_insn_labels ();
17039
17040 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17041 {
17042 as_bad (_("Unsupported use of .gpword"));
17043 ignore_rest_of_line ();
17044 }
17045
17046 p = frag_more (4);
17047 md_number_to_chars (p, 0, 4);
17048 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17049 BFD_RELOC_GPREL32);
17050
17051 demand_empty_rest_of_line ();
17052 }
17053
17054 static void
17055 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17056 {
17057 segment_info_type *si;
17058 struct insn_label_list *l;
17059 expressionS ex;
17060 char *p;
17061
17062 /* When not generating PIC code, this is treated as .dword. */
17063 if (mips_pic != SVR4_PIC)
17064 {
17065 s_cons (3);
17066 return;
17067 }
17068
17069 si = seg_info (now_seg);
17070 l = si->label_list;
17071 mips_emit_delays ();
17072 if (auto_align)
17073 mips_align (3, 0, l);
17074
17075 expression (&ex);
17076 mips_clear_insn_labels ();
17077
17078 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17079 {
17080 as_bad (_("Unsupported use of .gpdword"));
17081 ignore_rest_of_line ();
17082 }
17083
17084 p = frag_more (8);
17085 md_number_to_chars (p, 0, 8);
17086 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17087 BFD_RELOC_GPREL32)->fx_tcbit = 1;
17088
17089 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
17090 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17091 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17092
17093 demand_empty_rest_of_line ();
17094 }
17095
17096 /* Handle the .ehword pseudo-op. This is used when generating unwinding
17097 tables. It generates a R_MIPS_EH reloc. */
17098
17099 static void
17100 s_ehword (int ignore ATTRIBUTE_UNUSED)
17101 {
17102 expressionS ex;
17103 char *p;
17104
17105 mips_emit_delays ();
17106
17107 expression (&ex);
17108 mips_clear_insn_labels ();
17109
17110 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17111 {
17112 as_bad (_("Unsupported use of .ehword"));
17113 ignore_rest_of_line ();
17114 }
17115
17116 p = frag_more (4);
17117 md_number_to_chars (p, 0, 4);
17118 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17119 BFD_RELOC_MIPS_EH);
17120
17121 demand_empty_rest_of_line ();
17122 }
17123
17124 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
17125 tables in SVR4 PIC code. */
17126
17127 static void
17128 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17129 {
17130 int reg;
17131
17132 /* This is ignored when not generating SVR4 PIC code. */
17133 if (mips_pic != SVR4_PIC)
17134 {
17135 s_ignore (0);
17136 return;
17137 }
17138
17139 mips_mark_labels ();
17140 mips_assembling_insn = TRUE;
17141
17142 /* Add $gp to the register named as an argument. */
17143 macro_start ();
17144 reg = tc_get_register (0);
17145 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17146 macro_end ();
17147
17148 mips_assembling_insn = FALSE;
17149 demand_empty_rest_of_line ();
17150 }
17151
17152 /* Handle the .insn pseudo-op. This marks instruction labels in
17153 mips16/micromips mode. This permits the linker to handle them specially,
17154 such as generating jalx instructions when needed. We also make
17155 them odd for the duration of the assembly, in order to generate the
17156 right sort of code. We will make them even in the adjust_symtab
17157 routine, while leaving them marked. This is convenient for the
17158 debugger and the disassembler. The linker knows to make them odd
17159 again. */
17160
17161 static void
17162 s_insn (int ignore ATTRIBUTE_UNUSED)
17163 {
17164 mips_mark_labels ();
17165
17166 demand_empty_rest_of_line ();
17167 }
17168
17169 /* Handle a .stab[snd] directive. Ideally these directives would be
17170 implemented in a transparent way, so that removing them would not
17171 have any effect on the generated instructions. However, s_stab
17172 internally changes the section, so in practice we need to decide
17173 now whether the preceding label marks compressed code. We do not
17174 support changing the compression mode of a label after a .stab*
17175 directive, such as in:
17176
17177 foo:
17178 .stabs ...
17179 .set mips16
17180
17181 so the current mode wins. */
17182
17183 static void
17184 s_mips_stab (int type)
17185 {
17186 mips_mark_labels ();
17187 s_stab (type);
17188 }
17189
17190 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
17191
17192 static void
17193 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17194 {
17195 char *name;
17196 int c;
17197 symbolS *symbolP;
17198 expressionS exp;
17199
17200 name = input_line_pointer;
17201 c = get_symbol_end ();
17202 symbolP = symbol_find_or_make (name);
17203 S_SET_WEAK (symbolP);
17204 *input_line_pointer = c;
17205
17206 SKIP_WHITESPACE ();
17207
17208 if (! is_end_of_line[(unsigned char) *input_line_pointer])
17209 {
17210 if (S_IS_DEFINED (symbolP))
17211 {
17212 as_bad (_("ignoring attempt to redefine symbol %s"),
17213 S_GET_NAME (symbolP));
17214 ignore_rest_of_line ();
17215 return;
17216 }
17217
17218 if (*input_line_pointer == ',')
17219 {
17220 ++input_line_pointer;
17221 SKIP_WHITESPACE ();
17222 }
17223
17224 expression (&exp);
17225 if (exp.X_op != O_symbol)
17226 {
17227 as_bad (_("bad .weakext directive"));
17228 ignore_rest_of_line ();
17229 return;
17230 }
17231 symbol_set_value_expression (symbolP, &exp);
17232 }
17233
17234 demand_empty_rest_of_line ();
17235 }
17236
17237 /* Parse a register string into a number. Called from the ECOFF code
17238 to parse .frame. The argument is non-zero if this is the frame
17239 register, so that we can record it in mips_frame_reg. */
17240
17241 int
17242 tc_get_register (int frame)
17243 {
17244 unsigned int reg;
17245
17246 SKIP_WHITESPACE ();
17247 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17248 reg = 0;
17249 if (frame)
17250 {
17251 mips_frame_reg = reg != 0 ? reg : SP;
17252 mips_frame_reg_valid = 1;
17253 mips_cprestore_valid = 0;
17254 }
17255 return reg;
17256 }
17257
17258 valueT
17259 md_section_align (asection *seg, valueT addr)
17260 {
17261 int align = bfd_get_section_alignment (stdoutput, seg);
17262
17263 /* We don't need to align ELF sections to the full alignment.
17264 However, Irix 5 may prefer that we align them at least to a 16
17265 byte boundary. We don't bother to align the sections if we
17266 are targeted for an embedded system. */
17267 if (strncmp (TARGET_OS, "elf", 3) == 0)
17268 return addr;
17269 if (align > 4)
17270 align = 4;
17271
17272 return ((addr + (1 << align) - 1) & (-1 << align));
17273 }
17274
17275 /* Utility routine, called from above as well. If called while the
17276 input file is still being read, it's only an approximation. (For
17277 example, a symbol may later become defined which appeared to be
17278 undefined earlier.) */
17279
17280 static int
17281 nopic_need_relax (symbolS *sym, int before_relaxing)
17282 {
17283 if (sym == 0)
17284 return 0;
17285
17286 if (g_switch_value > 0)
17287 {
17288 const char *symname;
17289 int change;
17290
17291 /* Find out whether this symbol can be referenced off the $gp
17292 register. It can be if it is smaller than the -G size or if
17293 it is in the .sdata or .sbss section. Certain symbols can
17294 not be referenced off the $gp, although it appears as though
17295 they can. */
17296 symname = S_GET_NAME (sym);
17297 if (symname != (const char *) NULL
17298 && (strcmp (symname, "eprol") == 0
17299 || strcmp (symname, "etext") == 0
17300 || strcmp (symname, "_gp") == 0
17301 || strcmp (symname, "edata") == 0
17302 || strcmp (symname, "_fbss") == 0
17303 || strcmp (symname, "_fdata") == 0
17304 || strcmp (symname, "_ftext") == 0
17305 || strcmp (symname, "end") == 0
17306 || strcmp (symname, "_gp_disp") == 0))
17307 change = 1;
17308 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17309 && (0
17310 #ifndef NO_ECOFF_DEBUGGING
17311 || (symbol_get_obj (sym)->ecoff_extern_size != 0
17312 && (symbol_get_obj (sym)->ecoff_extern_size
17313 <= g_switch_value))
17314 #endif
17315 /* We must defer this decision until after the whole
17316 file has been read, since there might be a .extern
17317 after the first use of this symbol. */
17318 || (before_relaxing
17319 #ifndef NO_ECOFF_DEBUGGING
17320 && symbol_get_obj (sym)->ecoff_extern_size == 0
17321 #endif
17322 && S_GET_VALUE (sym) == 0)
17323 || (S_GET_VALUE (sym) != 0
17324 && S_GET_VALUE (sym) <= g_switch_value)))
17325 change = 0;
17326 else
17327 {
17328 const char *segname;
17329
17330 segname = segment_name (S_GET_SEGMENT (sym));
17331 gas_assert (strcmp (segname, ".lit8") != 0
17332 && strcmp (segname, ".lit4") != 0);
17333 change = (strcmp (segname, ".sdata") != 0
17334 && strcmp (segname, ".sbss") != 0
17335 && strncmp (segname, ".sdata.", 7) != 0
17336 && strncmp (segname, ".sbss.", 6) != 0
17337 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17338 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17339 }
17340 return change;
17341 }
17342 else
17343 /* We are not optimizing for the $gp register. */
17344 return 1;
17345 }
17346
17347
17348 /* Return true if the given symbol should be considered local for SVR4 PIC. */
17349
17350 static bfd_boolean
17351 pic_need_relax (symbolS *sym, asection *segtype)
17352 {
17353 asection *symsec;
17354
17355 /* Handle the case of a symbol equated to another symbol. */
17356 while (symbol_equated_reloc_p (sym))
17357 {
17358 symbolS *n;
17359
17360 /* It's possible to get a loop here in a badly written program. */
17361 n = symbol_get_value_expression (sym)->X_add_symbol;
17362 if (n == sym)
17363 break;
17364 sym = n;
17365 }
17366
17367 if (symbol_section_p (sym))
17368 return TRUE;
17369
17370 symsec = S_GET_SEGMENT (sym);
17371
17372 /* This must duplicate the test in adjust_reloc_syms. */
17373 return (!bfd_is_und_section (symsec)
17374 && !bfd_is_abs_section (symsec)
17375 && !bfd_is_com_section (symsec)
17376 && !s_is_linkonce (sym, segtype)
17377 /* A global or weak symbol is treated as external. */
17378 && (!S_IS_WEAK (sym) && !S_IS_EXTERNAL (sym)));
17379 }
17380
17381
17382 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17383 extended opcode. SEC is the section the frag is in. */
17384
17385 static int
17386 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17387 {
17388 int type;
17389 const struct mips16_immed_operand *op;
17390 offsetT val;
17391 int mintiny, maxtiny;
17392 segT symsec;
17393 fragS *sym_frag;
17394
17395 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17396 return 0;
17397 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17398 return 1;
17399
17400 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17401 op = mips16_immed_operands;
17402 while (op->type != type)
17403 {
17404 ++op;
17405 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17406 }
17407
17408 if (op->unsp)
17409 {
17410 if (type == '<' || type == '>' || type == '[' || type == ']')
17411 {
17412 mintiny = 1;
17413 maxtiny = 1 << op->nbits;
17414 }
17415 else
17416 {
17417 mintiny = 0;
17418 maxtiny = (1 << op->nbits) - 1;
17419 }
17420 }
17421 else
17422 {
17423 mintiny = - (1 << (op->nbits - 1));
17424 maxtiny = (1 << (op->nbits - 1)) - 1;
17425 }
17426
17427 sym_frag = symbol_get_frag (fragp->fr_symbol);
17428 val = S_GET_VALUE (fragp->fr_symbol);
17429 symsec = S_GET_SEGMENT (fragp->fr_symbol);
17430
17431 if (op->pcrel)
17432 {
17433 addressT addr;
17434
17435 /* We won't have the section when we are called from
17436 mips_relax_frag. However, we will always have been called
17437 from md_estimate_size_before_relax first. If this is a
17438 branch to a different section, we mark it as such. If SEC is
17439 NULL, and the frag is not marked, then it must be a branch to
17440 the same section. */
17441 if (sec == NULL)
17442 {
17443 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17444 return 1;
17445 }
17446 else
17447 {
17448 /* Must have been called from md_estimate_size_before_relax. */
17449 if (symsec != sec)
17450 {
17451 fragp->fr_subtype =
17452 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17453
17454 /* FIXME: We should support this, and let the linker
17455 catch branches and loads that are out of range. */
17456 as_bad_where (fragp->fr_file, fragp->fr_line,
17457 _("unsupported PC relative reference to different section"));
17458
17459 return 1;
17460 }
17461 if (fragp != sym_frag && sym_frag->fr_address == 0)
17462 /* Assume non-extended on the first relaxation pass.
17463 The address we have calculated will be bogus if this is
17464 a forward branch to another frag, as the forward frag
17465 will have fr_address == 0. */
17466 return 0;
17467 }
17468
17469 /* In this case, we know for sure that the symbol fragment is in
17470 the same section. If the relax_marker of the symbol fragment
17471 differs from the relax_marker of this fragment, we have not
17472 yet adjusted the symbol fragment fr_address. We want to add
17473 in STRETCH in order to get a better estimate of the address.
17474 This particularly matters because of the shift bits. */
17475 if (stretch != 0
17476 && sym_frag->relax_marker != fragp->relax_marker)
17477 {
17478 fragS *f;
17479
17480 /* Adjust stretch for any alignment frag. Note that if have
17481 been expanding the earlier code, the symbol may be
17482 defined in what appears to be an earlier frag. FIXME:
17483 This doesn't handle the fr_subtype field, which specifies
17484 a maximum number of bytes to skip when doing an
17485 alignment. */
17486 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17487 {
17488 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17489 {
17490 if (stretch < 0)
17491 stretch = - ((- stretch)
17492 & ~ ((1 << (int) f->fr_offset) - 1));
17493 else
17494 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17495 if (stretch == 0)
17496 break;
17497 }
17498 }
17499 if (f != NULL)
17500 val += stretch;
17501 }
17502
17503 addr = fragp->fr_address + fragp->fr_fix;
17504
17505 /* The base address rules are complicated. The base address of
17506 a branch is the following instruction. The base address of a
17507 PC relative load or add is the instruction itself, but if it
17508 is in a delay slot (in which case it can not be extended) use
17509 the address of the instruction whose delay slot it is in. */
17510 if (type == 'p' || type == 'q')
17511 {
17512 addr += 2;
17513
17514 /* If we are currently assuming that this frag should be
17515 extended, then, the current address is two bytes
17516 higher. */
17517 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17518 addr += 2;
17519
17520 /* Ignore the low bit in the target, since it will be set
17521 for a text label. */
17522 if ((val & 1) != 0)
17523 --val;
17524 }
17525 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17526 addr -= 4;
17527 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17528 addr -= 2;
17529
17530 val -= addr & ~ ((1 << op->shift) - 1);
17531
17532 /* Branch offsets have an implicit 0 in the lowest bit. */
17533 if (type == 'p' || type == 'q')
17534 val /= 2;
17535
17536 /* If any of the shifted bits are set, we must use an extended
17537 opcode. If the address depends on the size of this
17538 instruction, this can lead to a loop, so we arrange to always
17539 use an extended opcode. We only check this when we are in
17540 the main relaxation loop, when SEC is NULL. */
17541 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17542 {
17543 fragp->fr_subtype =
17544 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17545 return 1;
17546 }
17547
17548 /* If we are about to mark a frag as extended because the value
17549 is precisely maxtiny + 1, then there is a chance of an
17550 infinite loop as in the following code:
17551 la $4,foo
17552 .skip 1020
17553 .align 2
17554 foo:
17555 In this case when the la is extended, foo is 0x3fc bytes
17556 away, so the la can be shrunk, but then foo is 0x400 away, so
17557 the la must be extended. To avoid this loop, we mark the
17558 frag as extended if it was small, and is about to become
17559 extended with a value of maxtiny + 1. */
17560 if (val == ((maxtiny + 1) << op->shift)
17561 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17562 && sec == NULL)
17563 {
17564 fragp->fr_subtype =
17565 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17566 return 1;
17567 }
17568 }
17569 else if (symsec != absolute_section && sec != NULL)
17570 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17571
17572 if ((val & ((1 << op->shift) - 1)) != 0
17573 || val < (mintiny << op->shift)
17574 || val > (maxtiny << op->shift))
17575 return 1;
17576 else
17577 return 0;
17578 }
17579
17580 /* Compute the length of a branch sequence, and adjust the
17581 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
17582 worst-case length is computed, with UPDATE being used to indicate
17583 whether an unconditional (-1), branch-likely (+1) or regular (0)
17584 branch is to be computed. */
17585 static int
17586 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17587 {
17588 bfd_boolean toofar;
17589 int length;
17590
17591 if (fragp
17592 && S_IS_DEFINED (fragp->fr_symbol)
17593 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17594 {
17595 addressT addr;
17596 offsetT val;
17597
17598 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17599
17600 addr = fragp->fr_address + fragp->fr_fix + 4;
17601
17602 val -= addr;
17603
17604 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17605 }
17606 else if (fragp)
17607 /* If the symbol is not defined or it's in a different segment,
17608 assume the user knows what's going on and emit a short
17609 branch. */
17610 toofar = FALSE;
17611 else
17612 toofar = TRUE;
17613
17614 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17615 fragp->fr_subtype
17616 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17617 RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17618 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17619 RELAX_BRANCH_LINK (fragp->fr_subtype),
17620 toofar);
17621
17622 length = 4;
17623 if (toofar)
17624 {
17625 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17626 length += 8;
17627
17628 if (mips_pic != NO_PIC)
17629 {
17630 /* Additional space for PIC loading of target address. */
17631 length += 8;
17632 if (mips_opts.isa == ISA_MIPS1)
17633 /* Additional space for $at-stabilizing nop. */
17634 length += 4;
17635 }
17636
17637 /* If branch is conditional. */
17638 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17639 length += 8;
17640 }
17641
17642 return length;
17643 }
17644
17645 /* Compute the length of a branch sequence, and adjust the
17646 RELAX_MICROMIPS_TOOFAR32 bit accordingly. If FRAGP is NULL, the
17647 worst-case length is computed, with UPDATE being used to indicate
17648 whether an unconditional (-1), or regular (0) branch is to be
17649 computed. */
17650
17651 static int
17652 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17653 {
17654 bfd_boolean toofar;
17655 int length;
17656
17657 if (fragp
17658 && S_IS_DEFINED (fragp->fr_symbol)
17659 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17660 {
17661 addressT addr;
17662 offsetT val;
17663
17664 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17665 /* Ignore the low bit in the target, since it will be set
17666 for a text label. */
17667 if ((val & 1) != 0)
17668 --val;
17669
17670 addr = fragp->fr_address + fragp->fr_fix + 4;
17671
17672 val -= addr;
17673
17674 toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17675 }
17676 else if (fragp)
17677 /* If the symbol is not defined or it's in a different segment,
17678 assume the user knows what's going on and emit a short
17679 branch. */
17680 toofar = FALSE;
17681 else
17682 toofar = TRUE;
17683
17684 if (fragp && update
17685 && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17686 fragp->fr_subtype = (toofar
17687 ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17688 : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17689
17690 length = 4;
17691 if (toofar)
17692 {
17693 bfd_boolean compact_known = fragp != NULL;
17694 bfd_boolean compact = FALSE;
17695 bfd_boolean uncond;
17696
17697 if (compact_known)
17698 compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17699 if (fragp)
17700 uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17701 else
17702 uncond = update < 0;
17703
17704 /* If label is out of range, we turn branch <br>:
17705
17706 <br> label # 4 bytes
17707 0:
17708
17709 into:
17710
17711 j label # 4 bytes
17712 nop # 2 bytes if compact && !PIC
17713 0:
17714 */
17715 if (mips_pic == NO_PIC && (!compact_known || compact))
17716 length += 2;
17717
17718 /* If assembling PIC code, we further turn:
17719
17720 j label # 4 bytes
17721
17722 into:
17723
17724 lw/ld at, %got(label)(gp) # 4 bytes
17725 d/addiu at, %lo(label) # 4 bytes
17726 jr/c at # 2 bytes
17727 */
17728 if (mips_pic != NO_PIC)
17729 length += 6;
17730
17731 /* If branch <br> is conditional, we prepend negated branch <brneg>:
17732
17733 <brneg> 0f # 4 bytes
17734 nop # 2 bytes if !compact
17735 */
17736 if (!uncond)
17737 length += (compact_known && compact) ? 4 : 6;
17738 }
17739
17740 return length;
17741 }
17742
17743 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17744 bit accordingly. */
17745
17746 static int
17747 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17748 {
17749 bfd_boolean toofar;
17750
17751 if (fragp
17752 && S_IS_DEFINED (fragp->fr_symbol)
17753 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17754 {
17755 addressT addr;
17756 offsetT val;
17757 int type;
17758
17759 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17760 /* Ignore the low bit in the target, since it will be set
17761 for a text label. */
17762 if ((val & 1) != 0)
17763 --val;
17764
17765 /* Assume this is a 2-byte branch. */
17766 addr = fragp->fr_address + fragp->fr_fix + 2;
17767
17768 /* We try to avoid the infinite loop by not adding 2 more bytes for
17769 long branches. */
17770
17771 val -= addr;
17772
17773 type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17774 if (type == 'D')
17775 toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17776 else if (type == 'E')
17777 toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17778 else
17779 abort ();
17780 }
17781 else
17782 /* If the symbol is not defined or it's in a different segment,
17783 we emit a normal 32-bit branch. */
17784 toofar = TRUE;
17785
17786 if (fragp && update
17787 && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17788 fragp->fr_subtype
17789 = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17790 : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17791
17792 if (toofar)
17793 return 4;
17794
17795 return 2;
17796 }
17797
17798 /* Estimate the size of a frag before relaxing. Unless this is the
17799 mips16, we are not really relaxing here, and the final size is
17800 encoded in the subtype information. For the mips16, we have to
17801 decide whether we are using an extended opcode or not. */
17802
17803 int
17804 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17805 {
17806 int change;
17807
17808 if (RELAX_BRANCH_P (fragp->fr_subtype))
17809 {
17810
17811 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17812
17813 return fragp->fr_var;
17814 }
17815
17816 if (RELAX_MIPS16_P (fragp->fr_subtype))
17817 /* We don't want to modify the EXTENDED bit here; it might get us
17818 into infinite loops. We change it only in mips_relax_frag(). */
17819 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17820
17821 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17822 {
17823 int length = 4;
17824
17825 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17826 length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17827 if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17828 length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17829 fragp->fr_var = length;
17830
17831 return length;
17832 }
17833
17834 if (mips_pic == NO_PIC)
17835 change = nopic_need_relax (fragp->fr_symbol, 0);
17836 else if (mips_pic == SVR4_PIC)
17837 change = pic_need_relax (fragp->fr_symbol, segtype);
17838 else if (mips_pic == VXWORKS_PIC)
17839 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
17840 change = 0;
17841 else
17842 abort ();
17843
17844 if (change)
17845 {
17846 fragp->fr_subtype |= RELAX_USE_SECOND;
17847 return -RELAX_FIRST (fragp->fr_subtype);
17848 }
17849 else
17850 return -RELAX_SECOND (fragp->fr_subtype);
17851 }
17852
17853 /* This is called to see whether a reloc against a defined symbol
17854 should be converted into a reloc against a section. */
17855
17856 int
17857 mips_fix_adjustable (fixS *fixp)
17858 {
17859 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17860 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17861 return 0;
17862
17863 if (fixp->fx_addsy == NULL)
17864 return 1;
17865
17866 /* If symbol SYM is in a mergeable section, relocations of the form
17867 SYM + 0 can usually be made section-relative. The mergeable data
17868 is then identified by the section offset rather than by the symbol.
17869
17870 However, if we're generating REL LO16 relocations, the offset is split
17871 between the LO16 and parterning high part relocation. The linker will
17872 need to recalculate the complete offset in order to correctly identify
17873 the merge data.
17874
17875 The linker has traditionally not looked for the parterning high part
17876 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17877 placed anywhere. Rather than break backwards compatibility by changing
17878 this, it seems better not to force the issue, and instead keep the
17879 original symbol. This will work with either linker behavior. */
17880 if ((lo16_reloc_p (fixp->fx_r_type)
17881 || reloc_needs_lo_p (fixp->fx_r_type))
17882 && HAVE_IN_PLACE_ADDENDS
17883 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17884 return 0;
17885
17886 /* There is no place to store an in-place offset for JALR relocations.
17887 Likewise an in-range offset of limited PC-relative relocations may
17888 overflow the in-place relocatable field if recalculated against the
17889 start address of the symbol's containing section. */
17890 if (HAVE_IN_PLACE_ADDENDS
17891 && (limited_pcrel_reloc_p (fixp->fx_r_type)
17892 || jalr_reloc_p (fixp->fx_r_type)))
17893 return 0;
17894
17895 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17896 to a floating-point stub. The same is true for non-R_MIPS16_26
17897 relocations against MIPS16 functions; in this case, the stub becomes
17898 the function's canonical address.
17899
17900 Floating-point stubs are stored in unique .mips16.call.* or
17901 .mips16.fn.* sections. If a stub T for function F is in section S,
17902 the first relocation in section S must be against F; this is how the
17903 linker determines the target function. All relocations that might
17904 resolve to T must also be against F. We therefore have the following
17905 restrictions, which are given in an intentionally-redundant way:
17906
17907 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17908 symbols.
17909
17910 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17911 if that stub might be used.
17912
17913 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17914 symbols.
17915
17916 4. We cannot reduce a stub's relocations against MIPS16 symbols if
17917 that stub might be used.
17918
17919 There is a further restriction:
17920
17921 5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17922 R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17923 targets with in-place addends; the relocation field cannot
17924 encode the low bit.
17925
17926 For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17927 against a MIPS16 symbol. We deal with (5) by by not reducing any
17928 such relocations on REL targets.
17929
17930 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17931 relocation against some symbol R, no relocation against R may be
17932 reduced. (Note that this deals with (2) as well as (1) because
17933 relocations against global symbols will never be reduced on ELF
17934 targets.) This approach is a little simpler than trying to detect
17935 stub sections, and gives the "all or nothing" per-symbol consistency
17936 that we have for MIPS16 symbols. */
17937 if (fixp->fx_subsy == NULL
17938 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17939 || *symbol_get_tc (fixp->fx_addsy)
17940 || (HAVE_IN_PLACE_ADDENDS
17941 && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17942 && jmp_reloc_p (fixp->fx_r_type))))
17943 return 0;
17944
17945 return 1;
17946 }
17947
17948 /* Translate internal representation of relocation info to BFD target
17949 format. */
17950
17951 arelent **
17952 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17953 {
17954 static arelent *retval[4];
17955 arelent *reloc;
17956 bfd_reloc_code_real_type code;
17957
17958 memset (retval, 0, sizeof(retval));
17959 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17960 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17961 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17962 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17963
17964 if (fixp->fx_pcrel)
17965 {
17966 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17967 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17968 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17969 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
17970 || fixp->fx_r_type == BFD_RELOC_32_PCREL);
17971
17972 /* At this point, fx_addnumber is "symbol offset - pcrel address".
17973 Relocations want only the symbol offset. */
17974 reloc->addend = fixp->fx_addnumber + reloc->address;
17975 }
17976 else
17977 reloc->addend = fixp->fx_addnumber;
17978
17979 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17980 entry to be used in the relocation's section offset. */
17981 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17982 {
17983 reloc->address = reloc->addend;
17984 reloc->addend = 0;
17985 }
17986
17987 code = fixp->fx_r_type;
17988
17989 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17990 if (reloc->howto == NULL)
17991 {
17992 as_bad_where (fixp->fx_file, fixp->fx_line,
17993 _("Can not represent %s relocation in this object file format"),
17994 bfd_get_reloc_code_name (code));
17995 retval[0] = NULL;
17996 }
17997
17998 return retval;
17999 }
18000
18001 /* Relax a machine dependent frag. This returns the amount by which
18002 the current size of the frag should change. */
18003
18004 int
18005 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
18006 {
18007 if (RELAX_BRANCH_P (fragp->fr_subtype))
18008 {
18009 offsetT old_var = fragp->fr_var;
18010
18011 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
18012
18013 return fragp->fr_var - old_var;
18014 }
18015
18016 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18017 {
18018 offsetT old_var = fragp->fr_var;
18019 offsetT new_var = 4;
18020
18021 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
18022 new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
18023 if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
18024 new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
18025 fragp->fr_var = new_var;
18026
18027 return new_var - old_var;
18028 }
18029
18030 if (! RELAX_MIPS16_P (fragp->fr_subtype))
18031 return 0;
18032
18033 if (mips16_extended_frag (fragp, NULL, stretch))
18034 {
18035 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18036 return 0;
18037 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18038 return 2;
18039 }
18040 else
18041 {
18042 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18043 return 0;
18044 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18045 return -2;
18046 }
18047
18048 return 0;
18049 }
18050
18051 /* Convert a machine dependent frag. */
18052
18053 void
18054 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18055 {
18056 if (RELAX_BRANCH_P (fragp->fr_subtype))
18057 {
18058 char *buf;
18059 unsigned long insn;
18060 expressionS exp;
18061 fixS *fixp;
18062
18063 buf = fragp->fr_literal + fragp->fr_fix;
18064 insn = read_insn (buf);
18065
18066 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18067 {
18068 /* We generate a fixup instead of applying it right now
18069 because, if there are linker relaxations, we're going to
18070 need the relocations. */
18071 exp.X_op = O_symbol;
18072 exp.X_add_symbol = fragp->fr_symbol;
18073 exp.X_add_number = fragp->fr_offset;
18074
18075 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18076 BFD_RELOC_16_PCREL_S2);
18077 fixp->fx_file = fragp->fr_file;
18078 fixp->fx_line = fragp->fr_line;
18079
18080 buf = write_insn (buf, insn);
18081 }
18082 else
18083 {
18084 int i;
18085
18086 as_warn_where (fragp->fr_file, fragp->fr_line,
18087 _("Relaxed out-of-range branch into a jump"));
18088
18089 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18090 goto uncond;
18091
18092 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18093 {
18094 /* Reverse the branch. */
18095 switch ((insn >> 28) & 0xf)
18096 {
18097 case 4:
18098 /* bc[0-3][tf]l? instructions can have the condition
18099 reversed by tweaking a single TF bit, and their
18100 opcodes all have 0x4???????. */
18101 gas_assert ((insn & 0xf3e00000) == 0x41000000);
18102 insn ^= 0x00010000;
18103 break;
18104
18105 case 0:
18106 /* bltz 0x04000000 bgez 0x04010000
18107 bltzal 0x04100000 bgezal 0x04110000 */
18108 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18109 insn ^= 0x00010000;
18110 break;
18111
18112 case 1:
18113 /* beq 0x10000000 bne 0x14000000
18114 blez 0x18000000 bgtz 0x1c000000 */
18115 insn ^= 0x04000000;
18116 break;
18117
18118 default:
18119 abort ();
18120 }
18121 }
18122
18123 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18124 {
18125 /* Clear the and-link bit. */
18126 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18127
18128 /* bltzal 0x04100000 bgezal 0x04110000
18129 bltzall 0x04120000 bgezall 0x04130000 */
18130 insn &= ~0x00100000;
18131 }
18132
18133 /* Branch over the branch (if the branch was likely) or the
18134 full jump (not likely case). Compute the offset from the
18135 current instruction to branch to. */
18136 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18137 i = 16;
18138 else
18139 {
18140 /* How many bytes in instructions we've already emitted? */
18141 i = buf - fragp->fr_literal - fragp->fr_fix;
18142 /* How many bytes in instructions from here to the end? */
18143 i = fragp->fr_var - i;
18144 }
18145 /* Convert to instruction count. */
18146 i >>= 2;
18147 /* Branch counts from the next instruction. */
18148 i--;
18149 insn |= i;
18150 /* Branch over the jump. */
18151 buf = write_insn (buf, insn);
18152
18153 /* nop */
18154 buf = write_insn (buf, 0);
18155
18156 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18157 {
18158 /* beql $0, $0, 2f */
18159 insn = 0x50000000;
18160 /* Compute the PC offset from the current instruction to
18161 the end of the variable frag. */
18162 /* How many bytes in instructions we've already emitted? */
18163 i = buf - fragp->fr_literal - fragp->fr_fix;
18164 /* How many bytes in instructions from here to the end? */
18165 i = fragp->fr_var - i;
18166 /* Convert to instruction count. */
18167 i >>= 2;
18168 /* Don't decrement i, because we want to branch over the
18169 delay slot. */
18170 insn |= i;
18171
18172 buf = write_insn (buf, insn);
18173 buf = write_insn (buf, 0);
18174 }
18175
18176 uncond:
18177 if (mips_pic == NO_PIC)
18178 {
18179 /* j or jal. */
18180 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18181 ? 0x0c000000 : 0x08000000);
18182 exp.X_op = O_symbol;
18183 exp.X_add_symbol = fragp->fr_symbol;
18184 exp.X_add_number = fragp->fr_offset;
18185
18186 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18187 FALSE, BFD_RELOC_MIPS_JMP);
18188 fixp->fx_file = fragp->fr_file;
18189 fixp->fx_line = fragp->fr_line;
18190
18191 buf = write_insn (buf, insn);
18192 }
18193 else
18194 {
18195 unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18196
18197 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
18198 insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18199 insn |= at << OP_SH_RT;
18200 exp.X_op = O_symbol;
18201 exp.X_add_symbol = fragp->fr_symbol;
18202 exp.X_add_number = fragp->fr_offset;
18203
18204 if (fragp->fr_offset)
18205 {
18206 exp.X_add_symbol = make_expr_symbol (&exp);
18207 exp.X_add_number = 0;
18208 }
18209
18210 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18211 FALSE, BFD_RELOC_MIPS_GOT16);
18212 fixp->fx_file = fragp->fr_file;
18213 fixp->fx_line = fragp->fr_line;
18214
18215 buf = write_insn (buf, insn);
18216
18217 if (mips_opts.isa == ISA_MIPS1)
18218 /* nop */
18219 buf = write_insn (buf, 0);
18220
18221 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
18222 insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18223 insn |= at << OP_SH_RS | at << OP_SH_RT;
18224
18225 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18226 FALSE, BFD_RELOC_LO16);
18227 fixp->fx_file = fragp->fr_file;
18228 fixp->fx_line = fragp->fr_line;
18229
18230 buf = write_insn (buf, insn);
18231
18232 /* j(al)r $at. */
18233 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18234 insn = 0x0000f809;
18235 else
18236 insn = 0x00000008;
18237 insn |= at << OP_SH_RS;
18238
18239 buf = write_insn (buf, insn);
18240 }
18241 }
18242
18243 fragp->fr_fix += fragp->fr_var;
18244 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18245 return;
18246 }
18247
18248 /* Relax microMIPS branches. */
18249 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18250 {
18251 char *buf = fragp->fr_literal + fragp->fr_fix;
18252 bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18253 bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18254 int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18255 bfd_boolean short_ds;
18256 unsigned long insn;
18257 expressionS exp;
18258 fixS *fixp;
18259
18260 exp.X_op = O_symbol;
18261 exp.X_add_symbol = fragp->fr_symbol;
18262 exp.X_add_number = fragp->fr_offset;
18263
18264 fragp->fr_fix += fragp->fr_var;
18265
18266 /* Handle 16-bit branches that fit or are forced to fit. */
18267 if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18268 {
18269 /* We generate a fixup instead of applying it right now,
18270 because if there is linker relaxation, we're going to
18271 need the relocations. */
18272 if (type == 'D')
18273 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18274 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18275 else if (type == 'E')
18276 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18277 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18278 else
18279 abort ();
18280
18281 fixp->fx_file = fragp->fr_file;
18282 fixp->fx_line = fragp->fr_line;
18283
18284 /* These relocations can have an addend that won't fit in
18285 2 octets. */
18286 fixp->fx_no_overflow = 1;
18287
18288 return;
18289 }
18290
18291 /* Handle 32-bit branches that fit or are forced to fit. */
18292 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18293 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18294 {
18295 /* We generate a fixup instead of applying it right now,
18296 because if there is linker relaxation, we're going to
18297 need the relocations. */
18298 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18299 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18300 fixp->fx_file = fragp->fr_file;
18301 fixp->fx_line = fragp->fr_line;
18302
18303 if (type == 0)
18304 return;
18305 }
18306
18307 /* Relax 16-bit branches to 32-bit branches. */
18308 if (type != 0)
18309 {
18310 insn = read_compressed_insn (buf, 2);
18311
18312 if ((insn & 0xfc00) == 0xcc00) /* b16 */
18313 insn = 0x94000000; /* beq */
18314 else if ((insn & 0xdc00) == 0x8c00) /* beqz16/bnez16 */
18315 {
18316 unsigned long regno;
18317
18318 regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18319 regno = micromips_to_32_reg_d_map [regno];
18320 insn = ((insn & 0x2000) << 16) | 0x94000000; /* beq/bne */
18321 insn |= regno << MICROMIPSOP_SH_RS;
18322 }
18323 else
18324 abort ();
18325
18326 /* Nothing else to do, just write it out. */
18327 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18328 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18329 {
18330 buf = write_compressed_insn (buf, insn, 4);
18331 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18332 return;
18333 }
18334 }
18335 else
18336 insn = read_compressed_insn (buf, 4);
18337
18338 /* Relax 32-bit branches to a sequence of instructions. */
18339 as_warn_where (fragp->fr_file, fragp->fr_line,
18340 _("Relaxed out-of-range branch into a jump"));
18341
18342 /* Set the short-delay-slot bit. */
18343 short_ds = al && (insn & 0x02000000) != 0;
18344
18345 if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18346 {
18347 symbolS *l;
18348
18349 /* Reverse the branch. */
18350 if ((insn & 0xfc000000) == 0x94000000 /* beq */
18351 || (insn & 0xfc000000) == 0xb4000000) /* bne */
18352 insn ^= 0x20000000;
18353 else if ((insn & 0xffe00000) == 0x40000000 /* bltz */
18354 || (insn & 0xffe00000) == 0x40400000 /* bgez */
18355 || (insn & 0xffe00000) == 0x40800000 /* blez */
18356 || (insn & 0xffe00000) == 0x40c00000 /* bgtz */
18357 || (insn & 0xffe00000) == 0x40a00000 /* bnezc */
18358 || (insn & 0xffe00000) == 0x40e00000 /* beqzc */
18359 || (insn & 0xffe00000) == 0x40200000 /* bltzal */
18360 || (insn & 0xffe00000) == 0x40600000 /* bgezal */
18361 || (insn & 0xffe00000) == 0x42200000 /* bltzals */
18362 || (insn & 0xffe00000) == 0x42600000) /* bgezals */
18363 insn ^= 0x00400000;
18364 else if ((insn & 0xffe30000) == 0x43800000 /* bc1f */
18365 || (insn & 0xffe30000) == 0x43a00000 /* bc1t */
18366 || (insn & 0xffe30000) == 0x42800000 /* bc2f */
18367 || (insn & 0xffe30000) == 0x42a00000) /* bc2t */
18368 insn ^= 0x00200000;
18369 else
18370 abort ();
18371
18372 if (al)
18373 {
18374 /* Clear the and-link and short-delay-slot bits. */
18375 gas_assert ((insn & 0xfda00000) == 0x40200000);
18376
18377 /* bltzal 0x40200000 bgezal 0x40600000 */
18378 /* bltzals 0x42200000 bgezals 0x42600000 */
18379 insn &= ~0x02200000;
18380 }
18381
18382 /* Make a label at the end for use with the branch. */
18383 l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18384 micromips_label_inc ();
18385 S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18386
18387 /* Refer to it. */
18388 fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18389 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18390 fixp->fx_file = fragp->fr_file;
18391 fixp->fx_line = fragp->fr_line;
18392
18393 /* Branch over the jump. */
18394 buf = write_compressed_insn (buf, insn, 4);
18395 if (!compact)
18396 /* nop */
18397 buf = write_compressed_insn (buf, 0x0c00, 2);
18398 }
18399
18400 if (mips_pic == NO_PIC)
18401 {
18402 unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s */
18403
18404 /* j/jal/jals <sym> R_MICROMIPS_26_S1 */
18405 insn = al ? jal : 0xd4000000;
18406
18407 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18408 BFD_RELOC_MICROMIPS_JMP);
18409 fixp->fx_file = fragp->fr_file;
18410 fixp->fx_line = fragp->fr_line;
18411
18412 buf = write_compressed_insn (buf, insn, 4);
18413 if (compact)
18414 /* nop */
18415 buf = write_compressed_insn (buf, 0x0c00, 2);
18416 }
18417 else
18418 {
18419 unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18420 unsigned long jalr = short_ds ? 0x45e0 : 0x45c0; /* jalr/s */
18421 unsigned long jr = compact ? 0x45a0 : 0x4580; /* jr/c */
18422
18423 /* lw/ld $at, <sym>($gp) R_MICROMIPS_GOT16 */
18424 insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18425 insn |= at << MICROMIPSOP_SH_RT;
18426
18427 if (exp.X_add_number)
18428 {
18429 exp.X_add_symbol = make_expr_symbol (&exp);
18430 exp.X_add_number = 0;
18431 }
18432
18433 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18434 BFD_RELOC_MICROMIPS_GOT16);
18435 fixp->fx_file = fragp->fr_file;
18436 fixp->fx_line = fragp->fr_line;
18437
18438 buf = write_compressed_insn (buf, insn, 4);
18439
18440 /* d/addiu $at, $at, <sym> R_MICROMIPS_LO16 */
18441 insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18442 insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18443
18444 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18445 BFD_RELOC_MICROMIPS_LO16);
18446 fixp->fx_file = fragp->fr_file;
18447 fixp->fx_line = fragp->fr_line;
18448
18449 buf = write_compressed_insn (buf, insn, 4);
18450
18451 /* jr/jrc/jalr/jalrs $at */
18452 insn = al ? jalr : jr;
18453 insn |= at << MICROMIPSOP_SH_MJ;
18454
18455 buf = write_compressed_insn (buf, insn, 2);
18456 }
18457
18458 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18459 return;
18460 }
18461
18462 if (RELAX_MIPS16_P (fragp->fr_subtype))
18463 {
18464 int type;
18465 const struct mips16_immed_operand *op;
18466 offsetT val;
18467 char *buf;
18468 unsigned int user_length, length;
18469 unsigned long insn;
18470 bfd_boolean ext;
18471
18472 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18473 op = mips16_immed_operands;
18474 while (op->type != type)
18475 ++op;
18476
18477 ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18478 val = resolve_symbol_value (fragp->fr_symbol);
18479 if (op->pcrel)
18480 {
18481 addressT addr;
18482
18483 addr = fragp->fr_address + fragp->fr_fix;
18484
18485 /* The rules for the base address of a PC relative reloc are
18486 complicated; see mips16_extended_frag. */
18487 if (type == 'p' || type == 'q')
18488 {
18489 addr += 2;
18490 if (ext)
18491 addr += 2;
18492 /* Ignore the low bit in the target, since it will be
18493 set for a text label. */
18494 if ((val & 1) != 0)
18495 --val;
18496 }
18497 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18498 addr -= 4;
18499 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18500 addr -= 2;
18501
18502 addr &= ~ (addressT) ((1 << op->shift) - 1);
18503 val -= addr;
18504
18505 /* Make sure the section winds up with the alignment we have
18506 assumed. */
18507 if (op->shift > 0)
18508 record_alignment (asec, op->shift);
18509 }
18510
18511 if (ext
18512 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18513 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18514 as_warn_where (fragp->fr_file, fragp->fr_line,
18515 _("extended instruction in delay slot"));
18516
18517 buf = fragp->fr_literal + fragp->fr_fix;
18518
18519 insn = read_compressed_insn (buf, 2);
18520 if (ext)
18521 insn |= MIPS16_EXTEND;
18522
18523 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18524 user_length = 4;
18525 else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18526 user_length = 2;
18527 else
18528 user_length = 0;
18529
18530 mips16_immed (fragp->fr_file, fragp->fr_line, type,
18531 BFD_RELOC_UNUSED, val, user_length, &insn);
18532
18533 length = (ext ? 4 : 2);
18534 gas_assert (mips16_opcode_length (insn) == length);
18535 write_compressed_insn (buf, insn, length);
18536 fragp->fr_fix += length;
18537 }
18538 else
18539 {
18540 relax_substateT subtype = fragp->fr_subtype;
18541 bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18542 bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18543 int first, second;
18544 fixS *fixp;
18545
18546 first = RELAX_FIRST (subtype);
18547 second = RELAX_SECOND (subtype);
18548 fixp = (fixS *) fragp->fr_opcode;
18549
18550 /* If the delay slot chosen does not match the size of the instruction,
18551 then emit a warning. */
18552 if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18553 || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18554 {
18555 relax_substateT s;
18556 const char *msg;
18557
18558 s = subtype & (RELAX_DELAY_SLOT_16BIT
18559 | RELAX_DELAY_SLOT_SIZE_FIRST
18560 | RELAX_DELAY_SLOT_SIZE_SECOND);
18561 msg = macro_warning (s);
18562 if (msg != NULL)
18563 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18564 subtype &= ~s;
18565 }
18566
18567 /* Possibly emit a warning if we've chosen the longer option. */
18568 if (use_second == second_longer)
18569 {
18570 relax_substateT s;
18571 const char *msg;
18572
18573 s = (subtype
18574 & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18575 msg = macro_warning (s);
18576 if (msg != NULL)
18577 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18578 subtype &= ~s;
18579 }
18580
18581 /* Go through all the fixups for the first sequence. Disable them
18582 (by marking them as done) if we're going to use the second
18583 sequence instead. */
18584 while (fixp
18585 && fixp->fx_frag == fragp
18586 && fixp->fx_where < fragp->fr_fix - second)
18587 {
18588 if (subtype & RELAX_USE_SECOND)
18589 fixp->fx_done = 1;
18590 fixp = fixp->fx_next;
18591 }
18592
18593 /* Go through the fixups for the second sequence. Disable them if
18594 we're going to use the first sequence, otherwise adjust their
18595 addresses to account for the relaxation. */
18596 while (fixp && fixp->fx_frag == fragp)
18597 {
18598 if (subtype & RELAX_USE_SECOND)
18599 fixp->fx_where -= first;
18600 else
18601 fixp->fx_done = 1;
18602 fixp = fixp->fx_next;
18603 }
18604
18605 /* Now modify the frag contents. */
18606 if (subtype & RELAX_USE_SECOND)
18607 {
18608 char *start;
18609
18610 start = fragp->fr_literal + fragp->fr_fix - first - second;
18611 memmove (start, start + first, second);
18612 fragp->fr_fix -= first;
18613 }
18614 else
18615 fragp->fr_fix -= second;
18616 }
18617 }
18618
18619 /* This function is called after the relocs have been generated.
18620 We've been storing mips16 text labels as odd. Here we convert them
18621 back to even for the convenience of the debugger. */
18622
18623 void
18624 mips_frob_file_after_relocs (void)
18625 {
18626 asymbol **syms;
18627 unsigned int count, i;
18628
18629 syms = bfd_get_outsymbols (stdoutput);
18630 count = bfd_get_symcount (stdoutput);
18631 for (i = 0; i < count; i++, syms++)
18632 if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18633 && ((*syms)->value & 1) != 0)
18634 {
18635 (*syms)->value &= ~1;
18636 /* If the symbol has an odd size, it was probably computed
18637 incorrectly, so adjust that as well. */
18638 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18639 ++elf_symbol (*syms)->internal_elf_sym.st_size;
18640 }
18641 }
18642
18643 /* This function is called whenever a label is defined, including fake
18644 labels instantiated off the dot special symbol. It is used when
18645 handling branch delays; if a branch has a label, we assume we cannot
18646 move it. This also bumps the value of the symbol by 1 in compressed
18647 code. */
18648
18649 static void
18650 mips_record_label (symbolS *sym)
18651 {
18652 segment_info_type *si = seg_info (now_seg);
18653 struct insn_label_list *l;
18654
18655 if (free_insn_labels == NULL)
18656 l = (struct insn_label_list *) xmalloc (sizeof *l);
18657 else
18658 {
18659 l = free_insn_labels;
18660 free_insn_labels = l->next;
18661 }
18662
18663 l->label = sym;
18664 l->next = si->label_list;
18665 si->label_list = l;
18666 }
18667
18668 /* This function is called as tc_frob_label() whenever a label is defined
18669 and adds a DWARF-2 record we only want for true labels. */
18670
18671 void
18672 mips_define_label (symbolS *sym)
18673 {
18674 mips_record_label (sym);
18675 dwarf2_emit_label (sym);
18676 }
18677
18678 /* This function is called by tc_new_dot_label whenever a new dot symbol
18679 is defined. */
18680
18681 void
18682 mips_add_dot_label (symbolS *sym)
18683 {
18684 mips_record_label (sym);
18685 if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18686 mips_compressed_mark_label (sym);
18687 }
18688 \f
18689 /* Some special processing for a MIPS ELF file. */
18690
18691 void
18692 mips_elf_final_processing (void)
18693 {
18694 /* Write out the register information. */
18695 if (mips_abi != N64_ABI)
18696 {
18697 Elf32_RegInfo s;
18698
18699 s.ri_gprmask = mips_gprmask;
18700 s.ri_cprmask[0] = mips_cprmask[0];
18701 s.ri_cprmask[1] = mips_cprmask[1];
18702 s.ri_cprmask[2] = mips_cprmask[2];
18703 s.ri_cprmask[3] = mips_cprmask[3];
18704 /* The gp_value field is set by the MIPS ELF backend. */
18705
18706 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18707 ((Elf32_External_RegInfo *)
18708 mips_regmask_frag));
18709 }
18710 else
18711 {
18712 Elf64_Internal_RegInfo s;
18713
18714 s.ri_gprmask = mips_gprmask;
18715 s.ri_pad = 0;
18716 s.ri_cprmask[0] = mips_cprmask[0];
18717 s.ri_cprmask[1] = mips_cprmask[1];
18718 s.ri_cprmask[2] = mips_cprmask[2];
18719 s.ri_cprmask[3] = mips_cprmask[3];
18720 /* The gp_value field is set by the MIPS ELF backend. */
18721
18722 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18723 ((Elf64_External_RegInfo *)
18724 mips_regmask_frag));
18725 }
18726
18727 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
18728 sort of BFD interface for this. */
18729 if (mips_any_noreorder)
18730 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18731 if (mips_pic != NO_PIC)
18732 {
18733 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18734 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18735 }
18736 if (mips_abicalls)
18737 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18738
18739 /* Set MIPS ELF flags for ASEs. Note that not all ASEs have flags
18740 defined at present; this might need to change in future. */
18741 if (file_ase_mips16)
18742 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18743 if (file_ase_micromips)
18744 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18745 if (file_ase & ASE_MDMX)
18746 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18747
18748 /* Set the MIPS ELF ABI flags. */
18749 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18750 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18751 else if (mips_abi == O64_ABI)
18752 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18753 else if (mips_abi == EABI_ABI)
18754 {
18755 if (!file_mips_gp32)
18756 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18757 else
18758 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18759 }
18760 else if (mips_abi == N32_ABI)
18761 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18762
18763 /* Nothing to do for N64_ABI. */
18764
18765 if (mips_32bitmode)
18766 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18767
18768 #if 0 /* XXX FIXME */
18769 /* 32 bit code with 64 bit FP registers. */
18770 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18771 elf_elfheader (stdoutput)->e_flags |= ???;
18772 #endif
18773 }
18774 \f
18775 typedef struct proc {
18776 symbolS *func_sym;
18777 symbolS *func_end_sym;
18778 unsigned long reg_mask;
18779 unsigned long reg_offset;
18780 unsigned long fpreg_mask;
18781 unsigned long fpreg_offset;
18782 unsigned long frame_offset;
18783 unsigned long frame_reg;
18784 unsigned long pc_reg;
18785 } procS;
18786
18787 static procS cur_proc;
18788 static procS *cur_proc_ptr;
18789 static int numprocs;
18790
18791 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1", a microMIPS nop
18792 as "2", and a normal nop as "0". */
18793
18794 #define NOP_OPCODE_MIPS 0
18795 #define NOP_OPCODE_MIPS16 1
18796 #define NOP_OPCODE_MICROMIPS 2
18797
18798 char
18799 mips_nop_opcode (void)
18800 {
18801 if (seg_info (now_seg)->tc_segment_info_data.micromips)
18802 return NOP_OPCODE_MICROMIPS;
18803 else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18804 return NOP_OPCODE_MIPS16;
18805 else
18806 return NOP_OPCODE_MIPS;
18807 }
18808
18809 /* Fill in an rs_align_code fragment. Unlike elsewhere we want to use
18810 32-bit microMIPS NOPs here (if applicable). */
18811
18812 void
18813 mips_handle_align (fragS *fragp)
18814 {
18815 char nop_opcode;
18816 char *p;
18817 int bytes, size, excess;
18818 valueT opcode;
18819
18820 if (fragp->fr_type != rs_align_code)
18821 return;
18822
18823 p = fragp->fr_literal + fragp->fr_fix;
18824 nop_opcode = *p;
18825 switch (nop_opcode)
18826 {
18827 case NOP_OPCODE_MICROMIPS:
18828 opcode = micromips_nop32_insn.insn_opcode;
18829 size = 4;
18830 break;
18831 case NOP_OPCODE_MIPS16:
18832 opcode = mips16_nop_insn.insn_opcode;
18833 size = 2;
18834 break;
18835 case NOP_OPCODE_MIPS:
18836 default:
18837 opcode = nop_insn.insn_opcode;
18838 size = 4;
18839 break;
18840 }
18841
18842 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18843 excess = bytes % size;
18844
18845 /* Handle the leading part if we're not inserting a whole number of
18846 instructions, and make it the end of the fixed part of the frag.
18847 Try to fit in a short microMIPS NOP if applicable and possible,
18848 and use zeroes otherwise. */
18849 gas_assert (excess < 4);
18850 fragp->fr_fix += excess;
18851 switch (excess)
18852 {
18853 case 3:
18854 *p++ = '\0';
18855 /* Fall through. */
18856 case 2:
18857 if (nop_opcode == NOP_OPCODE_MICROMIPS)
18858 {
18859 p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18860 break;
18861 }
18862 *p++ = '\0';
18863 /* Fall through. */
18864 case 1:
18865 *p++ = '\0';
18866 /* Fall through. */
18867 case 0:
18868 break;
18869 }
18870
18871 md_number_to_chars (p, opcode, size);
18872 fragp->fr_var = size;
18873 }
18874
18875 static void
18876 md_obj_begin (void)
18877 {
18878 }
18879
18880 static void
18881 md_obj_end (void)
18882 {
18883 /* Check for premature end, nesting errors, etc. */
18884 if (cur_proc_ptr)
18885 as_warn (_("missing .end at end of assembly"));
18886 }
18887
18888 static long
18889 get_number (void)
18890 {
18891 int negative = 0;
18892 long val = 0;
18893
18894 if (*input_line_pointer == '-')
18895 {
18896 ++input_line_pointer;
18897 negative = 1;
18898 }
18899 if (!ISDIGIT (*input_line_pointer))
18900 as_bad (_("expected simple number"));
18901 if (input_line_pointer[0] == '0')
18902 {
18903 if (input_line_pointer[1] == 'x')
18904 {
18905 input_line_pointer += 2;
18906 while (ISXDIGIT (*input_line_pointer))
18907 {
18908 val <<= 4;
18909 val |= hex_value (*input_line_pointer++);
18910 }
18911 return negative ? -val : val;
18912 }
18913 else
18914 {
18915 ++input_line_pointer;
18916 while (ISDIGIT (*input_line_pointer))
18917 {
18918 val <<= 3;
18919 val |= *input_line_pointer++ - '0';
18920 }
18921 return negative ? -val : val;
18922 }
18923 }
18924 if (!ISDIGIT (*input_line_pointer))
18925 {
18926 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18927 *input_line_pointer, *input_line_pointer);
18928 as_warn (_("invalid number"));
18929 return -1;
18930 }
18931 while (ISDIGIT (*input_line_pointer))
18932 {
18933 val *= 10;
18934 val += *input_line_pointer++ - '0';
18935 }
18936 return negative ? -val : val;
18937 }
18938
18939 /* The .file directive; just like the usual .file directive, but there
18940 is an initial number which is the ECOFF file index. In the non-ECOFF
18941 case .file implies DWARF-2. */
18942
18943 static void
18944 s_mips_file (int x ATTRIBUTE_UNUSED)
18945 {
18946 static int first_file_directive = 0;
18947
18948 if (ECOFF_DEBUGGING)
18949 {
18950 get_number ();
18951 s_app_file (0);
18952 }
18953 else
18954 {
18955 char *filename;
18956
18957 filename = dwarf2_directive_file (0);
18958
18959 /* Versions of GCC up to 3.1 start files with a ".file"
18960 directive even for stabs output. Make sure that this
18961 ".file" is handled. Note that you need a version of GCC
18962 after 3.1 in order to support DWARF-2 on MIPS. */
18963 if (filename != NULL && ! first_file_directive)
18964 {
18965 (void) new_logical_line (filename, -1);
18966 s_app_file_string (filename, 0);
18967 }
18968 first_file_directive = 1;
18969 }
18970 }
18971
18972 /* The .loc directive, implying DWARF-2. */
18973
18974 static void
18975 s_mips_loc (int x ATTRIBUTE_UNUSED)
18976 {
18977 if (!ECOFF_DEBUGGING)
18978 dwarf2_directive_loc (0);
18979 }
18980
18981 /* The .end directive. */
18982
18983 static void
18984 s_mips_end (int x ATTRIBUTE_UNUSED)
18985 {
18986 symbolS *p;
18987
18988 /* Following functions need their own .frame and .cprestore directives. */
18989 mips_frame_reg_valid = 0;
18990 mips_cprestore_valid = 0;
18991
18992 if (!is_end_of_line[(unsigned char) *input_line_pointer])
18993 {
18994 p = get_symbol ();
18995 demand_empty_rest_of_line ();
18996 }
18997 else
18998 p = NULL;
18999
19000 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19001 as_warn (_(".end not in text section"));
19002
19003 if (!cur_proc_ptr)
19004 {
19005 as_warn (_(".end directive without a preceding .ent directive."));
19006 demand_empty_rest_of_line ();
19007 return;
19008 }
19009
19010 if (p != NULL)
19011 {
19012 gas_assert (S_GET_NAME (p));
19013 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19014 as_warn (_(".end symbol does not match .ent symbol."));
19015
19016 if (debug_type == DEBUG_STABS)
19017 stabs_generate_asm_endfunc (S_GET_NAME (p),
19018 S_GET_NAME (p));
19019 }
19020 else
19021 as_warn (_(".end directive missing or unknown symbol"));
19022
19023 /* Create an expression to calculate the size of the function. */
19024 if (p && cur_proc_ptr)
19025 {
19026 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19027 expressionS *exp = xmalloc (sizeof (expressionS));
19028
19029 obj->size = exp;
19030 exp->X_op = O_subtract;
19031 exp->X_add_symbol = symbol_temp_new_now ();
19032 exp->X_op_symbol = p;
19033 exp->X_add_number = 0;
19034
19035 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19036 }
19037
19038 /* Generate a .pdr section. */
19039 if (!ECOFF_DEBUGGING && mips_flag_pdr)
19040 {
19041 segT saved_seg = now_seg;
19042 subsegT saved_subseg = now_subseg;
19043 expressionS exp;
19044 char *fragp;
19045
19046 #ifdef md_flush_pending_output
19047 md_flush_pending_output ();
19048 #endif
19049
19050 gas_assert (pdr_seg);
19051 subseg_set (pdr_seg, 0);
19052
19053 /* Write the symbol. */
19054 exp.X_op = O_symbol;
19055 exp.X_add_symbol = p;
19056 exp.X_add_number = 0;
19057 emit_expr (&exp, 4);
19058
19059 fragp = frag_more (7 * 4);
19060
19061 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19062 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19063 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19064 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19065 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19066 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19067 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19068
19069 subseg_set (saved_seg, saved_subseg);
19070 }
19071
19072 cur_proc_ptr = NULL;
19073 }
19074
19075 /* The .aent and .ent directives. */
19076
19077 static void
19078 s_mips_ent (int aent)
19079 {
19080 symbolS *symbolP;
19081
19082 symbolP = get_symbol ();
19083 if (*input_line_pointer == ',')
19084 ++input_line_pointer;
19085 SKIP_WHITESPACE ();
19086 if (ISDIGIT (*input_line_pointer)
19087 || *input_line_pointer == '-')
19088 get_number ();
19089
19090 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19091 as_warn (_(".ent or .aent not in text section."));
19092
19093 if (!aent && cur_proc_ptr)
19094 as_warn (_("missing .end"));
19095
19096 if (!aent)
19097 {
19098 /* This function needs its own .frame and .cprestore directives. */
19099 mips_frame_reg_valid = 0;
19100 mips_cprestore_valid = 0;
19101
19102 cur_proc_ptr = &cur_proc;
19103 memset (cur_proc_ptr, '\0', sizeof (procS));
19104
19105 cur_proc_ptr->func_sym = symbolP;
19106
19107 ++numprocs;
19108
19109 if (debug_type == DEBUG_STABS)
19110 stabs_generate_asm_func (S_GET_NAME (symbolP),
19111 S_GET_NAME (symbolP));
19112 }
19113
19114 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19115
19116 demand_empty_rest_of_line ();
19117 }
19118
19119 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19120 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19121 s_mips_frame is used so that we can set the PDR information correctly.
19122 We can't use the ecoff routines because they make reference to the ecoff
19123 symbol table (in the mdebug section). */
19124
19125 static void
19126 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19127 {
19128 if (ECOFF_DEBUGGING)
19129 s_ignore (ignore);
19130 else
19131 {
19132 long val;
19133
19134 if (cur_proc_ptr == (procS *) NULL)
19135 {
19136 as_warn (_(".frame outside of .ent"));
19137 demand_empty_rest_of_line ();
19138 return;
19139 }
19140
19141 cur_proc_ptr->frame_reg = tc_get_register (1);
19142
19143 SKIP_WHITESPACE ();
19144 if (*input_line_pointer++ != ','
19145 || get_absolute_expression_and_terminator (&val) != ',')
19146 {
19147 as_warn (_("Bad .frame directive"));
19148 --input_line_pointer;
19149 demand_empty_rest_of_line ();
19150 return;
19151 }
19152
19153 cur_proc_ptr->frame_offset = val;
19154 cur_proc_ptr->pc_reg = tc_get_register (0);
19155
19156 demand_empty_rest_of_line ();
19157 }
19158 }
19159
19160 /* The .fmask and .mask directives. If the mdebug section is present
19161 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19162 embedded targets, s_mips_mask is used so that we can set the PDR
19163 information correctly. We can't use the ecoff routines because they
19164 make reference to the ecoff symbol table (in the mdebug section). */
19165
19166 static void
19167 s_mips_mask (int reg_type)
19168 {
19169 if (ECOFF_DEBUGGING)
19170 s_ignore (reg_type);
19171 else
19172 {
19173 long mask, off;
19174
19175 if (cur_proc_ptr == (procS *) NULL)
19176 {
19177 as_warn (_(".mask/.fmask outside of .ent"));
19178 demand_empty_rest_of_line ();
19179 return;
19180 }
19181
19182 if (get_absolute_expression_and_terminator (&mask) != ',')
19183 {
19184 as_warn (_("Bad .mask/.fmask directive"));
19185 --input_line_pointer;
19186 demand_empty_rest_of_line ();
19187 return;
19188 }
19189
19190 off = get_absolute_expression ();
19191
19192 if (reg_type == 'F')
19193 {
19194 cur_proc_ptr->fpreg_mask = mask;
19195 cur_proc_ptr->fpreg_offset = off;
19196 }
19197 else
19198 {
19199 cur_proc_ptr->reg_mask = mask;
19200 cur_proc_ptr->reg_offset = off;
19201 }
19202
19203 demand_empty_rest_of_line ();
19204 }
19205 }
19206
19207 /* A table describing all the processors gas knows about. Names are
19208 matched in the order listed.
19209
19210 To ease comparison, please keep this table in the same order as
19211 gcc's mips_cpu_info_table[]. */
19212 static const struct mips_cpu_info mips_cpu_info_table[] =
19213 {
19214 /* Entries for generic ISAs */
19215 { "mips1", MIPS_CPU_IS_ISA, 0, ISA_MIPS1, CPU_R3000 },
19216 { "mips2", MIPS_CPU_IS_ISA, 0, ISA_MIPS2, CPU_R6000 },
19217 { "mips3", MIPS_CPU_IS_ISA, 0, ISA_MIPS3, CPU_R4000 },
19218 { "mips4", MIPS_CPU_IS_ISA, 0, ISA_MIPS4, CPU_R8000 },
19219 { "mips5", MIPS_CPU_IS_ISA, 0, ISA_MIPS5, CPU_MIPS5 },
19220 { "mips32", MIPS_CPU_IS_ISA, 0, ISA_MIPS32, CPU_MIPS32 },
19221 { "mips32r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19222 { "mips64", MIPS_CPU_IS_ISA, 0, ISA_MIPS64, CPU_MIPS64 },
19223 { "mips64r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS64R2, CPU_MIPS64R2 },
19224
19225 /* MIPS I */
19226 { "r3000", 0, 0, ISA_MIPS1, CPU_R3000 },
19227 { "r2000", 0, 0, ISA_MIPS1, CPU_R3000 },
19228 { "r3900", 0, 0, ISA_MIPS1, CPU_R3900 },
19229
19230 /* MIPS II */
19231 { "r6000", 0, 0, ISA_MIPS2, CPU_R6000 },
19232
19233 /* MIPS III */
19234 { "r4000", 0, 0, ISA_MIPS3, CPU_R4000 },
19235 { "r4010", 0, 0, ISA_MIPS2, CPU_R4010 },
19236 { "vr4100", 0, 0, ISA_MIPS3, CPU_VR4100 },
19237 { "vr4111", 0, 0, ISA_MIPS3, CPU_R4111 },
19238 { "vr4120", 0, 0, ISA_MIPS3, CPU_VR4120 },
19239 { "vr4130", 0, 0, ISA_MIPS3, CPU_VR4120 },
19240 { "vr4181", 0, 0, ISA_MIPS3, CPU_R4111 },
19241 { "vr4300", 0, 0, ISA_MIPS3, CPU_R4300 },
19242 { "r4400", 0, 0, ISA_MIPS3, CPU_R4400 },
19243 { "r4600", 0, 0, ISA_MIPS3, CPU_R4600 },
19244 { "orion", 0, 0, ISA_MIPS3, CPU_R4600 },
19245 { "r4650", 0, 0, ISA_MIPS3, CPU_R4650 },
19246 { "r5900", 0, 0, ISA_MIPS3, CPU_R5900 },
19247 /* ST Microelectronics Loongson 2E and 2F cores */
19248 { "loongson2e", 0, 0, ISA_MIPS3, CPU_LOONGSON_2E },
19249 { "loongson2f", 0, 0, ISA_MIPS3, CPU_LOONGSON_2F },
19250
19251 /* MIPS IV */
19252 { "r8000", 0, 0, ISA_MIPS4, CPU_R8000 },
19253 { "r10000", 0, 0, ISA_MIPS4, CPU_R10000 },
19254 { "r12000", 0, 0, ISA_MIPS4, CPU_R12000 },
19255 { "r14000", 0, 0, ISA_MIPS4, CPU_R14000 },
19256 { "r16000", 0, 0, ISA_MIPS4, CPU_R16000 },
19257 { "vr5000", 0, 0, ISA_MIPS4, CPU_R5000 },
19258 { "vr5400", 0, 0, ISA_MIPS4, CPU_VR5400 },
19259 { "vr5500", 0, 0, ISA_MIPS4, CPU_VR5500 },
19260 { "rm5200", 0, 0, ISA_MIPS4, CPU_R5000 },
19261 { "rm5230", 0, 0, ISA_MIPS4, CPU_R5000 },
19262 { "rm5231", 0, 0, ISA_MIPS4, CPU_R5000 },
19263 { "rm5261", 0, 0, ISA_MIPS4, CPU_R5000 },
19264 { "rm5721", 0, 0, ISA_MIPS4, CPU_R5000 },
19265 { "rm7000", 0, 0, ISA_MIPS4, CPU_RM7000 },
19266 { "rm9000", 0, 0, ISA_MIPS4, CPU_RM9000 },
19267
19268 /* MIPS 32 */
19269 { "4kc", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19270 { "4km", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19271 { "4kp", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19272 { "4ksc", 0, ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
19273
19274 /* MIPS 32 Release 2 */
19275 { "4kec", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19276 { "4kem", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19277 { "4kep", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19278 { "4ksd", 0, ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
19279 { "m4k", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19280 { "m4kp", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19281 { "m14k", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19282 { "m14kc", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19283 { "m14ke", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19284 ISA_MIPS32R2, CPU_MIPS32R2 },
19285 { "m14kec", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19286 ISA_MIPS32R2, CPU_MIPS32R2 },
19287 { "24kc", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19288 { "24kf2_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19289 { "24kf", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19290 { "24kf1_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19291 /* Deprecated forms of the above. */
19292 { "24kfx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19293 { "24kx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19294 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
19295 { "24kec", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19296 { "24kef2_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19297 { "24kef", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19298 { "24kef1_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19299 /* Deprecated forms of the above. */
19300 { "24kefx", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19301 { "24kex", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19302 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
19303 { "34kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19304 { "34kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19305 { "34kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19306 { "34kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19307 /* Deprecated forms of the above. */
19308 { "34kfx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19309 { "34kx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19310 /* 34Kn is a 34kc without DSP. */
19311 { "34kn", 0, ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19312 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
19313 { "74kc", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19314 { "74kf2_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19315 { "74kf", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19316 { "74kf1_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19317 { "74kf3_2", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19318 /* Deprecated forms of the above. */
19319 { "74kfx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19320 { "74kx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19321 /* 1004K cores are multiprocessor versions of the 34K. */
19322 { "1004kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19323 { "1004kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19324 { "1004kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19325 { "1004kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19326
19327 /* MIPS 64 */
19328 { "5kc", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19329 { "5kf", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19330 { "20kc", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19331 { "25kf", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19332
19333 /* Broadcom SB-1 CPU core */
19334 { "sb1", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19335 /* Broadcom SB-1A CPU core */
19336 { "sb1a", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19337
19338 { "loongson3a", 0, 0, ISA_MIPS64, CPU_LOONGSON_3A },
19339
19340 /* MIPS 64 Release 2 */
19341
19342 /* Cavium Networks Octeon CPU core */
19343 { "octeon", 0, 0, ISA_MIPS64R2, CPU_OCTEON },
19344 { "octeon+", 0, 0, ISA_MIPS64R2, CPU_OCTEONP },
19345 { "octeon2", 0, 0, ISA_MIPS64R2, CPU_OCTEON2 },
19346
19347 /* RMI Xlr */
19348 { "xlr", 0, 0, ISA_MIPS64, CPU_XLR },
19349
19350 /* Broadcom XLP.
19351 XLP is mostly like XLR, with the prominent exception that it is
19352 MIPS64R2 rather than MIPS64. */
19353 { "xlp", 0, 0, ISA_MIPS64R2, CPU_XLR },
19354
19355 /* End marker */
19356 { NULL, 0, 0, 0, 0 }
19357 };
19358
19359
19360 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19361 with a final "000" replaced by "k". Ignore case.
19362
19363 Note: this function is shared between GCC and GAS. */
19364
19365 static bfd_boolean
19366 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19367 {
19368 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19369 given++, canonical++;
19370
19371 return ((*given == 0 && *canonical == 0)
19372 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19373 }
19374
19375
19376 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19377 CPU name. We've traditionally allowed a lot of variation here.
19378
19379 Note: this function is shared between GCC and GAS. */
19380
19381 static bfd_boolean
19382 mips_matching_cpu_name_p (const char *canonical, const char *given)
19383 {
19384 /* First see if the name matches exactly, or with a final "000"
19385 turned into "k". */
19386 if (mips_strict_matching_cpu_name_p (canonical, given))
19387 return TRUE;
19388
19389 /* If not, try comparing based on numerical designation alone.
19390 See if GIVEN is an unadorned number, or 'r' followed by a number. */
19391 if (TOLOWER (*given) == 'r')
19392 given++;
19393 if (!ISDIGIT (*given))
19394 return FALSE;
19395
19396 /* Skip over some well-known prefixes in the canonical name,
19397 hoping to find a number there too. */
19398 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19399 canonical += 2;
19400 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19401 canonical += 2;
19402 else if (TOLOWER (canonical[0]) == 'r')
19403 canonical += 1;
19404
19405 return mips_strict_matching_cpu_name_p (canonical, given);
19406 }
19407
19408
19409 /* Parse an option that takes the name of a processor as its argument.
19410 OPTION is the name of the option and CPU_STRING is the argument.
19411 Return the corresponding processor enumeration if the CPU_STRING is
19412 recognized, otherwise report an error and return null.
19413
19414 A similar function exists in GCC. */
19415
19416 static const struct mips_cpu_info *
19417 mips_parse_cpu (const char *option, const char *cpu_string)
19418 {
19419 const struct mips_cpu_info *p;
19420
19421 /* 'from-abi' selects the most compatible architecture for the given
19422 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
19423 EABIs, we have to decide whether we're using the 32-bit or 64-bit
19424 version. Look first at the -mgp options, if given, otherwise base
19425 the choice on MIPS_DEFAULT_64BIT.
19426
19427 Treat NO_ABI like the EABIs. One reason to do this is that the
19428 plain 'mips' and 'mips64' configs have 'from-abi' as their default
19429 architecture. This code picks MIPS I for 'mips' and MIPS III for
19430 'mips64', just as we did in the days before 'from-abi'. */
19431 if (strcasecmp (cpu_string, "from-abi") == 0)
19432 {
19433 if (ABI_NEEDS_32BIT_REGS (mips_abi))
19434 return mips_cpu_info_from_isa (ISA_MIPS1);
19435
19436 if (ABI_NEEDS_64BIT_REGS (mips_abi))
19437 return mips_cpu_info_from_isa (ISA_MIPS3);
19438
19439 if (file_mips_gp32 >= 0)
19440 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19441
19442 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19443 ? ISA_MIPS3
19444 : ISA_MIPS1);
19445 }
19446
19447 /* 'default' has traditionally been a no-op. Probably not very useful. */
19448 if (strcasecmp (cpu_string, "default") == 0)
19449 return 0;
19450
19451 for (p = mips_cpu_info_table; p->name != 0; p++)
19452 if (mips_matching_cpu_name_p (p->name, cpu_string))
19453 return p;
19454
19455 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19456 return 0;
19457 }
19458
19459 /* Return the canonical processor information for ISA (a member of the
19460 ISA_MIPS* enumeration). */
19461
19462 static const struct mips_cpu_info *
19463 mips_cpu_info_from_isa (int isa)
19464 {
19465 int i;
19466
19467 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19468 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19469 && isa == mips_cpu_info_table[i].isa)
19470 return (&mips_cpu_info_table[i]);
19471
19472 return NULL;
19473 }
19474
19475 static const struct mips_cpu_info *
19476 mips_cpu_info_from_arch (int arch)
19477 {
19478 int i;
19479
19480 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19481 if (arch == mips_cpu_info_table[i].cpu)
19482 return (&mips_cpu_info_table[i]);
19483
19484 return NULL;
19485 }
19486 \f
19487 static void
19488 show (FILE *stream, const char *string, int *col_p, int *first_p)
19489 {
19490 if (*first_p)
19491 {
19492 fprintf (stream, "%24s", "");
19493 *col_p = 24;
19494 }
19495 else
19496 {
19497 fprintf (stream, ", ");
19498 *col_p += 2;
19499 }
19500
19501 if (*col_p + strlen (string) > 72)
19502 {
19503 fprintf (stream, "\n%24s", "");
19504 *col_p = 24;
19505 }
19506
19507 fprintf (stream, "%s", string);
19508 *col_p += strlen (string);
19509
19510 *first_p = 0;
19511 }
19512
19513 void
19514 md_show_usage (FILE *stream)
19515 {
19516 int column, first;
19517 size_t i;
19518
19519 fprintf (stream, _("\
19520 MIPS options:\n\
19521 -EB generate big endian output\n\
19522 -EL generate little endian output\n\
19523 -g, -g2 do not remove unneeded NOPs or swap branches\n\
19524 -G NUM allow referencing objects up to NUM bytes\n\
19525 implicitly with the gp register [default 8]\n"));
19526 fprintf (stream, _("\
19527 -mips1 generate MIPS ISA I instructions\n\
19528 -mips2 generate MIPS ISA II instructions\n\
19529 -mips3 generate MIPS ISA III instructions\n\
19530 -mips4 generate MIPS ISA IV instructions\n\
19531 -mips5 generate MIPS ISA V instructions\n\
19532 -mips32 generate MIPS32 ISA instructions\n\
19533 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
19534 -mips64 generate MIPS64 ISA instructions\n\
19535 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
19536 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
19537
19538 first = 1;
19539
19540 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19541 show (stream, mips_cpu_info_table[i].name, &column, &first);
19542 show (stream, "from-abi", &column, &first);
19543 fputc ('\n', stream);
19544
19545 fprintf (stream, _("\
19546 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19547 -no-mCPU don't generate code specific to CPU.\n\
19548 For -mCPU and -no-mCPU, CPU must be one of:\n"));
19549
19550 first = 1;
19551
19552 show (stream, "3900", &column, &first);
19553 show (stream, "4010", &column, &first);
19554 show (stream, "4100", &column, &first);
19555 show (stream, "4650", &column, &first);
19556 fputc ('\n', stream);
19557
19558 fprintf (stream, _("\
19559 -mips16 generate mips16 instructions\n\
19560 -no-mips16 do not generate mips16 instructions\n"));
19561 fprintf (stream, _("\
19562 -mmicromips generate microMIPS instructions\n\
19563 -mno-micromips do not generate microMIPS instructions\n"));
19564 fprintf (stream, _("\
19565 -msmartmips generate smartmips instructions\n\
19566 -mno-smartmips do not generate smartmips instructions\n"));
19567 fprintf (stream, _("\
19568 -mdsp generate DSP instructions\n\
19569 -mno-dsp do not generate DSP instructions\n"));
19570 fprintf (stream, _("\
19571 -mdspr2 generate DSP R2 instructions\n\
19572 -mno-dspr2 do not generate DSP R2 instructions\n"));
19573 fprintf (stream, _("\
19574 -mmt generate MT instructions\n\
19575 -mno-mt do not generate MT instructions\n"));
19576 fprintf (stream, _("\
19577 -mmcu generate MCU instructions\n\
19578 -mno-mcu do not generate MCU instructions\n"));
19579 fprintf (stream, _("\
19580 -mvirt generate Virtualization instructions\n\
19581 -mno-virt do not generate Virtualization instructions\n"));
19582 fprintf (stream, _("\
19583 -mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
19584 -mfix-loongson2f-nop work around Loongson2F NOP errata\n\
19585 -mfix-vr4120 work around certain VR4120 errata\n\
19586 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
19587 -mfix-24k insert a nop after ERET and DERET instructions\n\
19588 -mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
19589 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
19590 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
19591 -msym32 assume all symbols have 32-bit values\n\
19592 -O0 remove unneeded NOPs, do not swap branches\n\
19593 -O remove unneeded NOPs and swap branches\n\
19594 --trap, --no-break trap exception on div by 0 and mult overflow\n\
19595 --break, --no-trap break exception on div by 0 and mult overflow\n"));
19596 fprintf (stream, _("\
19597 -mhard-float allow floating-point instructions\n\
19598 -msoft-float do not allow floating-point instructions\n\
19599 -msingle-float only allow 32-bit floating-point operations\n\
19600 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
19601 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
19602 --[no-]relax-branch [dis]allow out-of-range branches to be relaxed\n"
19603 ));
19604 fprintf (stream, _("\
19605 -KPIC, -call_shared generate SVR4 position independent code\n\
19606 -call_nonpic generate non-PIC code that can operate with DSOs\n\
19607 -mvxworks-pic generate VxWorks position independent code\n\
19608 -non_shared do not generate code that can operate with DSOs\n\
19609 -xgot assume a 32 bit GOT\n\
19610 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
19611 -mshared, -mno-shared disable/enable .cpload optimization for\n\
19612 position dependent (non shared) code\n\
19613 -mabi=ABI create ABI conformant object file for:\n"));
19614
19615 first = 1;
19616
19617 show (stream, "32", &column, &first);
19618 show (stream, "o64", &column, &first);
19619 show (stream, "n32", &column, &first);
19620 show (stream, "64", &column, &first);
19621 show (stream, "eabi", &column, &first);
19622
19623 fputc ('\n', stream);
19624
19625 fprintf (stream, _("\
19626 -32 create o32 ABI object file (default)\n\
19627 -n32 create n32 ABI object file\n\
19628 -64 create 64 ABI object file\n"));
19629 }
19630
19631 #ifdef TE_IRIX
19632 enum dwarf2_format
19633 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19634 {
19635 if (HAVE_64BIT_SYMBOLS)
19636 return dwarf2_format_64bit_irix;
19637 else
19638 return dwarf2_format_32bit;
19639 }
19640 #endif
19641
19642 int
19643 mips_dwarf2_addr_size (void)
19644 {
19645 if (HAVE_64BIT_OBJECTS)
19646 return 8;
19647 else
19648 return 4;
19649 }
19650
19651 /* Standard calling conventions leave the CFA at SP on entry. */
19652 void
19653 mips_cfi_frame_initial_instructions (void)
19654 {
19655 cfi_add_CFA_def_cfa_register (SP);
19656 }
19657
19658 int
19659 tc_mips_regname_to_dw2regnum (char *regname)
19660 {
19661 unsigned int regnum = -1;
19662 unsigned int reg;
19663
19664 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19665 regnum = reg;
19666
19667 return regnum;
19668 }