bfd/
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
4 Free Software Foundation, Inc.
5 Contributed by the OSF and Ralph Campbell.
6 Written by Keith Knowles and Ralph Campbell, working independently.
7 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8 Support.
9
10 This file is part of GAS.
11
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
24 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25 02110-1301, USA. */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 /* Check assumptions made in this file. */
38 typedef char static_assert1[sizeof (offsetT) < 8 ? -1 : 1];
39 typedef char static_assert2[sizeof (valueT) < 8 ? -1 : 1];
40
41 #ifdef DEBUG
42 #define DBG(x) printf x
43 #else
44 #define DBG(x)
45 #endif
46
47 /* Clean up namespace so we can include obj-elf.h too. */
48 static int mips_output_flavor (void);
49 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
50 #undef OBJ_PROCESS_STAB
51 #undef OUTPUT_FLAVOR
52 #undef S_GET_ALIGN
53 #undef S_GET_SIZE
54 #undef S_SET_ALIGN
55 #undef S_SET_SIZE
56 #undef obj_frob_file
57 #undef obj_frob_file_after_relocs
58 #undef obj_frob_symbol
59 #undef obj_pop_insert
60 #undef obj_sec_sym_ok_for_reloc
61 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
62
63 #include "obj-elf.h"
64 /* Fix any of them that we actually care about. */
65 #undef OUTPUT_FLAVOR
66 #define OUTPUT_FLAVOR mips_output_flavor()
67
68 #include "elf/mips.h"
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections. Off by default on IRIX: the native
78 linker doesn't know about and discards them, but relocations against them
79 remain, leading to rld crashes. */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 static char *mips_regmask_frag;
89
90 #define ZERO 0
91 #define ATREG 1
92 #define S0 16
93 #define S7 23
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP 28
99 #define SP 29
100 #define FP 30
101 #define RA 31
102
103 #define ILLEGAL_REG (32)
104
105 #define AT mips_opts.at
106
107 extern int target_big_endian;
108
109 /* The name of the readonly data section. */
110 #define RDATA_SECTION_NAME ".rodata"
111
112 /* Ways in which an instruction can be "appended" to the output. */
113 enum append_method {
114 /* Just add it normally. */
115 APPEND_ADD,
116
117 /* Add it normally and then add a nop. */
118 APPEND_ADD_WITH_NOP,
119
120 /* Turn an instruction with a delay slot into a "compact" version. */
121 APPEND_ADD_COMPACT,
122
123 /* Insert the instruction before the last one. */
124 APPEND_SWAP
125 };
126
127 /* Information about an instruction, including its format, operands
128 and fixups. */
129 struct mips_cl_insn
130 {
131 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
132 const struct mips_opcode *insn_mo;
133
134 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
135 a copy of INSN_MO->match with the operands filled in. If we have
136 decided to use an extended MIPS16 instruction, this includes the
137 extension. */
138 unsigned long insn_opcode;
139
140 /* The frag that contains the instruction. */
141 struct frag *frag;
142
143 /* The offset into FRAG of the first instruction byte. */
144 long where;
145
146 /* The relocs associated with the instruction, if any. */
147 fixS *fixp[3];
148
149 /* True if this entry cannot be moved from its current position. */
150 unsigned int fixed_p : 1;
151
152 /* True if this instruction occurred in a .set noreorder block. */
153 unsigned int noreorder_p : 1;
154
155 /* True for mips16 instructions that jump to an absolute address. */
156 unsigned int mips16_absolute_jump_p : 1;
157
158 /* True if this instruction is complete. */
159 unsigned int complete_p : 1;
160
161 /* True if this instruction is cleared from history by unconditional
162 branch. */
163 unsigned int cleared_p : 1;
164 };
165
166 /* The ABI to use. */
167 enum mips_abi_level
168 {
169 NO_ABI = 0,
170 O32_ABI,
171 O64_ABI,
172 N32_ABI,
173 N64_ABI,
174 EABI_ABI
175 };
176
177 /* MIPS ABI we are using for this output file. */
178 static enum mips_abi_level mips_abi = NO_ABI;
179
180 /* Whether or not we have code that can call pic code. */
181 int mips_abicalls = FALSE;
182
183 /* Whether or not we have code which can be put into a shared
184 library. */
185 static bfd_boolean mips_in_shared = TRUE;
186
187 /* This is the set of options which may be modified by the .set
188 pseudo-op. We use a struct so that .set push and .set pop are more
189 reliable. */
190
191 struct mips_set_options
192 {
193 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
194 if it has not been initialized. Changed by `.set mipsN', and the
195 -mipsN command line option, and the default CPU. */
196 int isa;
197 /* Enabled Application Specific Extensions (ASEs). Changed by `.set
198 <asename>', by command line options, and based on the default
199 architecture. */
200 int ase;
201 /* Whether we are assembling for the mips16 processor. 0 if we are
202 not, 1 if we are, and -1 if the value has not been initialized.
203 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
204 -nomips16 command line options, and the default CPU. */
205 int mips16;
206 /* Whether we are assembling for the mipsMIPS ASE. 0 if we are not,
207 1 if we are, and -1 if the value has not been initialized. Changed
208 by `.set micromips' and `.set nomicromips', and the -mmicromips
209 and -mno-micromips command line options, and the default CPU. */
210 int micromips;
211 /* Non-zero if we should not reorder instructions. Changed by `.set
212 reorder' and `.set noreorder'. */
213 int noreorder;
214 /* Non-zero if we should not permit the register designated "assembler
215 temporary" to be used in instructions. The value is the register
216 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
217 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
218 unsigned int at;
219 /* Non-zero if we should warn when a macro instruction expands into
220 more than one machine instruction. Changed by `.set nomacro' and
221 `.set macro'. */
222 int warn_about_macros;
223 /* Non-zero if we should not move instructions. Changed by `.set
224 move', `.set volatile', `.set nomove', and `.set novolatile'. */
225 int nomove;
226 /* Non-zero if we should not optimize branches by moving the target
227 of the branch into the delay slot. Actually, we don't perform
228 this optimization anyhow. Changed by `.set bopt' and `.set
229 nobopt'. */
230 int nobopt;
231 /* Non-zero if we should not autoextend mips16 instructions.
232 Changed by `.set autoextend' and `.set noautoextend'. */
233 int noautoextend;
234 /* True if we should only emit 32-bit microMIPS instructions.
235 Changed by `.set insn32' and `.set noinsn32', and the -minsn32
236 and -mno-insn32 command line options. */
237 bfd_boolean insn32;
238 /* Restrict general purpose registers and floating point registers
239 to 32 bit. This is initially determined when -mgp32 or -mfp32
240 is passed but can changed if the assembler code uses .set mipsN. */
241 int gp32;
242 int fp32;
243 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
244 command line option, and the default CPU. */
245 int arch;
246 /* True if ".set sym32" is in effect. */
247 bfd_boolean sym32;
248 /* True if floating-point operations are not allowed. Changed by .set
249 softfloat or .set hardfloat, by command line options -msoft-float or
250 -mhard-float. The default is false. */
251 bfd_boolean soft_float;
252
253 /* True if only single-precision floating-point operations are allowed.
254 Changed by .set singlefloat or .set doublefloat, command-line options
255 -msingle-float or -mdouble-float. The default is false. */
256 bfd_boolean single_float;
257 };
258
259 /* This is the struct we use to hold the current set of options. Note
260 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
261 -1 to indicate that they have not been initialized. */
262
263 /* True if -mgp32 was passed. */
264 static int file_mips_gp32 = -1;
265
266 /* True if -mfp32 was passed. */
267 static int file_mips_fp32 = -1;
268
269 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
270 static int file_mips_soft_float = 0;
271
272 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
273 static int file_mips_single_float = 0;
274
275 static struct mips_set_options mips_opts =
276 {
277 /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
278 /* noreorder */ 0, /* at */ ATREG, /* warn_about_macros */ 0,
279 /* nomove */ 0, /* nobopt */ 0, /* noautoextend */ 0, /* insn32 */ FALSE,
280 /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN, /* sym32 */ FALSE,
281 /* soft_float */ FALSE, /* single_float */ FALSE
282 };
283
284 /* The set of ASEs that were selected on the command line, either
285 explicitly via ASE options or implicitly through things like -march. */
286 static unsigned int file_ase;
287
288 /* Which bits of file_ase were explicitly set or cleared by ASE options. */
289 static unsigned int file_ase_explicit;
290
291 /* These variables are filled in with the masks of registers used.
292 The object format code reads them and puts them in the appropriate
293 place. */
294 unsigned long mips_gprmask;
295 unsigned long mips_cprmask[4];
296
297 /* MIPS ISA we are using for this output file. */
298 static int file_mips_isa = ISA_UNKNOWN;
299
300 /* True if any MIPS16 code was produced. */
301 static int file_ase_mips16;
302
303 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
304 || mips_opts.isa == ISA_MIPS32R2 \
305 || mips_opts.isa == ISA_MIPS64 \
306 || mips_opts.isa == ISA_MIPS64R2)
307
308 /* True if any microMIPS code was produced. */
309 static int file_ase_micromips;
310
311 /* True if we want to create R_MIPS_JALR for jalr $25. */
312 #ifdef TE_IRIX
313 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
314 #else
315 /* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
316 because there's no place for any addend, the only acceptable
317 expression is a bare symbol. */
318 #define MIPS_JALR_HINT_P(EXPR) \
319 (!HAVE_IN_PLACE_ADDENDS \
320 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
321 #endif
322
323 /* The argument of the -march= flag. The architecture we are assembling. */
324 static int file_mips_arch = CPU_UNKNOWN;
325 static const char *mips_arch_string;
326
327 /* The argument of the -mtune= flag. The architecture for which we
328 are optimizing. */
329 static int mips_tune = CPU_UNKNOWN;
330 static const char *mips_tune_string;
331
332 /* True when generating 32-bit code for a 64-bit processor. */
333 static int mips_32bitmode = 0;
334
335 /* True if the given ABI requires 32-bit registers. */
336 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
337
338 /* Likewise 64-bit registers. */
339 #define ABI_NEEDS_64BIT_REGS(ABI) \
340 ((ABI) == N32_ABI \
341 || (ABI) == N64_ABI \
342 || (ABI) == O64_ABI)
343
344 /* Return true if ISA supports 64 bit wide gp registers. */
345 #define ISA_HAS_64BIT_REGS(ISA) \
346 ((ISA) == ISA_MIPS3 \
347 || (ISA) == ISA_MIPS4 \
348 || (ISA) == ISA_MIPS5 \
349 || (ISA) == ISA_MIPS64 \
350 || (ISA) == ISA_MIPS64R2)
351
352 /* Return true if ISA supports 64 bit wide float registers. */
353 #define ISA_HAS_64BIT_FPRS(ISA) \
354 ((ISA) == ISA_MIPS3 \
355 || (ISA) == ISA_MIPS4 \
356 || (ISA) == ISA_MIPS5 \
357 || (ISA) == ISA_MIPS32R2 \
358 || (ISA) == ISA_MIPS64 \
359 || (ISA) == ISA_MIPS64R2)
360
361 /* Return true if ISA supports 64-bit right rotate (dror et al.)
362 instructions. */
363 #define ISA_HAS_DROR(ISA) \
364 ((ISA) == ISA_MIPS64R2 \
365 || (mips_opts.micromips \
366 && ISA_HAS_64BIT_REGS (ISA)) \
367 )
368
369 /* Return true if ISA supports 32-bit right rotate (ror et al.)
370 instructions. */
371 #define ISA_HAS_ROR(ISA) \
372 ((ISA) == ISA_MIPS32R2 \
373 || (ISA) == ISA_MIPS64R2 \
374 || (mips_opts.ase & ASE_SMARTMIPS) \
375 || mips_opts.micromips \
376 )
377
378 /* Return true if ISA supports single-precision floats in odd registers. */
379 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
380 ((ISA) == ISA_MIPS32 \
381 || (ISA) == ISA_MIPS32R2 \
382 || (ISA) == ISA_MIPS64 \
383 || (ISA) == ISA_MIPS64R2)
384
385 /* Return true if ISA supports move to/from high part of a 64-bit
386 floating-point register. */
387 #define ISA_HAS_MXHC1(ISA) \
388 ((ISA) == ISA_MIPS32R2 \
389 || (ISA) == ISA_MIPS64R2)
390
391 #define HAVE_32BIT_GPRS \
392 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
393
394 #define HAVE_32BIT_FPRS \
395 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
396
397 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
398 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
399
400 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
401
402 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
403
404 /* True if relocations are stored in-place. */
405 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
406
407 /* The ABI-derived address size. */
408 #define HAVE_64BIT_ADDRESSES \
409 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
410 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
411
412 /* The size of symbolic constants (i.e., expressions of the form
413 "SYMBOL" or "SYMBOL + OFFSET"). */
414 #define HAVE_32BIT_SYMBOLS \
415 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
416 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
417
418 /* Addresses are loaded in different ways, depending on the address size
419 in use. The n32 ABI Documentation also mandates the use of additions
420 with overflow checking, but existing implementations don't follow it. */
421 #define ADDRESS_ADD_INSN \
422 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
423
424 #define ADDRESS_ADDI_INSN \
425 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
426
427 #define ADDRESS_LOAD_INSN \
428 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
429
430 #define ADDRESS_STORE_INSN \
431 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
432
433 /* Return true if the given CPU supports the MIPS16 ASE. */
434 #define CPU_HAS_MIPS16(cpu) \
435 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
436 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
437
438 /* Return true if the given CPU supports the microMIPS ASE. */
439 #define CPU_HAS_MICROMIPS(cpu) 0
440
441 /* True if CPU has a dror instruction. */
442 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443
444 /* True if CPU has a ror instruction. */
445 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
446
447 /* True if CPU is in the Octeon family */
448 #define CPU_IS_OCTEON(CPU) ((CPU) == CPU_OCTEON || (CPU) == CPU_OCTEONP || (CPU) == CPU_OCTEON2)
449
450 /* True if CPU has seq/sne and seqi/snei instructions. */
451 #define CPU_HAS_SEQ(CPU) (CPU_IS_OCTEON (CPU))
452
453 /* True, if CPU has support for ldc1 and sdc1. */
454 #define CPU_HAS_LDC1_SDC1(CPU) \
455 ((mips_opts.isa != ISA_MIPS1) && ((CPU) != CPU_R5900))
456
457 /* True if mflo and mfhi can be immediately followed by instructions
458 which write to the HI and LO registers.
459
460 According to MIPS specifications, MIPS ISAs I, II, and III need
461 (at least) two instructions between the reads of HI/LO and
462 instructions which write them, and later ISAs do not. Contradicting
463 the MIPS specifications, some MIPS IV processor user manuals (e.g.
464 the UM for the NEC Vr5000) document needing the instructions between
465 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
466 MIPS64 and later ISAs to have the interlocks, plus any specific
467 earlier-ISA CPUs for which CPU documentation declares that the
468 instructions are really interlocked. */
469 #define hilo_interlocks \
470 (mips_opts.isa == ISA_MIPS32 \
471 || mips_opts.isa == ISA_MIPS32R2 \
472 || mips_opts.isa == ISA_MIPS64 \
473 || mips_opts.isa == ISA_MIPS64R2 \
474 || mips_opts.arch == CPU_R4010 \
475 || mips_opts.arch == CPU_R5900 \
476 || mips_opts.arch == CPU_R10000 \
477 || mips_opts.arch == CPU_R12000 \
478 || mips_opts.arch == CPU_R14000 \
479 || mips_opts.arch == CPU_R16000 \
480 || mips_opts.arch == CPU_RM7000 \
481 || mips_opts.arch == CPU_VR5500 \
482 || mips_opts.micromips \
483 )
484
485 /* Whether the processor uses hardware interlocks to protect reads
486 from the GPRs after they are loaded from memory, and thus does not
487 require nops to be inserted. This applies to instructions marked
488 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
489 level I and microMIPS mode instructions are always interlocked. */
490 #define gpr_interlocks \
491 (mips_opts.isa != ISA_MIPS1 \
492 || mips_opts.arch == CPU_R3900 \
493 || mips_opts.arch == CPU_R5900 \
494 || mips_opts.micromips \
495 )
496
497 /* Whether the processor uses hardware interlocks to avoid delays
498 required by coprocessor instructions, and thus does not require
499 nops to be inserted. This applies to instructions marked
500 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
501 between instructions marked INSN_WRITE_COND_CODE and ones marked
502 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
503 levels I, II, and III and microMIPS mode instructions are always
504 interlocked. */
505 /* Itbl support may require additional care here. */
506 #define cop_interlocks \
507 ((mips_opts.isa != ISA_MIPS1 \
508 && mips_opts.isa != ISA_MIPS2 \
509 && mips_opts.isa != ISA_MIPS3) \
510 || mips_opts.arch == CPU_R4300 \
511 || mips_opts.micromips \
512 )
513
514 /* Whether the processor uses hardware interlocks to protect reads
515 from coprocessor registers after they are loaded from memory, and
516 thus does not require nops to be inserted. This applies to
517 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
518 requires at MIPS ISA level I and microMIPS mode instructions are
519 always interlocked. */
520 #define cop_mem_interlocks \
521 (mips_opts.isa != ISA_MIPS1 \
522 || mips_opts.micromips \
523 )
524
525 /* Is this a mfhi or mflo instruction? */
526 #define MF_HILO_INSN(PINFO) \
527 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
528
529 /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
530 has been selected. This implies, in particular, that addresses of text
531 labels have their LSB set. */
532 #define HAVE_CODE_COMPRESSION \
533 ((mips_opts.mips16 | mips_opts.micromips) != 0)
534
535 /* The minimum and maximum signed values that can be stored in a GPR. */
536 #define GPR_SMAX ((offsetT) (((valueT) 1 << (HAVE_64BIT_GPRS ? 63 : 31)) - 1))
537 #define GPR_SMIN (-GPR_SMAX - 1)
538
539 /* MIPS PIC level. */
540
541 enum mips_pic_level mips_pic;
542
543 /* 1 if we should generate 32 bit offsets from the $gp register in
544 SVR4_PIC mode. Currently has no meaning in other modes. */
545 static int mips_big_got = 0;
546
547 /* 1 if trap instructions should used for overflow rather than break
548 instructions. */
549 static int mips_trap = 0;
550
551 /* 1 if double width floating point constants should not be constructed
552 by assembling two single width halves into two single width floating
553 point registers which just happen to alias the double width destination
554 register. On some architectures this aliasing can be disabled by a bit
555 in the status register, and the setting of this bit cannot be determined
556 automatically at assemble time. */
557 static int mips_disable_float_construction;
558
559 /* Non-zero if any .set noreorder directives were used. */
560
561 static int mips_any_noreorder;
562
563 /* Non-zero if nops should be inserted when the register referenced in
564 an mfhi/mflo instruction is read in the next two instructions. */
565 static int mips_7000_hilo_fix;
566
567 /* The size of objects in the small data section. */
568 static unsigned int g_switch_value = 8;
569 /* Whether the -G option was used. */
570 static int g_switch_seen = 0;
571
572 #define N_RMASK 0xc4
573 #define N_VFP 0xd4
574
575 /* If we can determine in advance that GP optimization won't be
576 possible, we can skip the relaxation stuff that tries to produce
577 GP-relative references. This makes delay slot optimization work
578 better.
579
580 This function can only provide a guess, but it seems to work for
581 gcc output. It needs to guess right for gcc, otherwise gcc
582 will put what it thinks is a GP-relative instruction in a branch
583 delay slot.
584
585 I don't know if a fix is needed for the SVR4_PIC mode. I've only
586 fixed it for the non-PIC mode. KR 95/04/07 */
587 static int nopic_need_relax (symbolS *, int);
588
589 /* handle of the OPCODE hash table */
590 static struct hash_control *op_hash = NULL;
591
592 /* The opcode hash table we use for the mips16. */
593 static struct hash_control *mips16_op_hash = NULL;
594
595 /* The opcode hash table we use for the microMIPS ASE. */
596 static struct hash_control *micromips_op_hash = NULL;
597
598 /* This array holds the chars that always start a comment. If the
599 pre-processor is disabled, these aren't very useful */
600 const char comment_chars[] = "#";
601
602 /* This array holds the chars that only start a comment at the beginning of
603 a line. If the line seems to have the form '# 123 filename'
604 .line and .file directives will appear in the pre-processed output */
605 /* Note that input_file.c hand checks for '#' at the beginning of the
606 first line of the input file. This is because the compiler outputs
607 #NO_APP at the beginning of its output. */
608 /* Also note that C style comments are always supported. */
609 const char line_comment_chars[] = "#";
610
611 /* This array holds machine specific line separator characters. */
612 const char line_separator_chars[] = ";";
613
614 /* Chars that can be used to separate mant from exp in floating point nums */
615 const char EXP_CHARS[] = "eE";
616
617 /* Chars that mean this number is a floating point constant */
618 /* As in 0f12.456 */
619 /* or 0d1.2345e12 */
620 const char FLT_CHARS[] = "rRsSfFdDxXpP";
621
622 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
623 changed in read.c . Ideally it shouldn't have to know about it at all,
624 but nothing is ideal around here.
625 */
626
627 static char *insn_error;
628
629 static int auto_align = 1;
630
631 /* When outputting SVR4 PIC code, the assembler needs to know the
632 offset in the stack frame from which to restore the $gp register.
633 This is set by the .cprestore pseudo-op, and saved in this
634 variable. */
635 static offsetT mips_cprestore_offset = -1;
636
637 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
638 more optimizations, it can use a register value instead of a memory-saved
639 offset and even an other register than $gp as global pointer. */
640 static offsetT mips_cpreturn_offset = -1;
641 static int mips_cpreturn_register = -1;
642 static int mips_gp_register = GP;
643 static int mips_gprel_offset = 0;
644
645 /* Whether mips_cprestore_offset has been set in the current function
646 (or whether it has already been warned about, if not). */
647 static int mips_cprestore_valid = 0;
648
649 /* This is the register which holds the stack frame, as set by the
650 .frame pseudo-op. This is needed to implement .cprestore. */
651 static int mips_frame_reg = SP;
652
653 /* Whether mips_frame_reg has been set in the current function
654 (or whether it has already been warned about, if not). */
655 static int mips_frame_reg_valid = 0;
656
657 /* To output NOP instructions correctly, we need to keep information
658 about the previous two instructions. */
659
660 /* Whether we are optimizing. The default value of 2 means to remove
661 unneeded NOPs and swap branch instructions when possible. A value
662 of 1 means to not swap branches. A value of 0 means to always
663 insert NOPs. */
664 static int mips_optimize = 2;
665
666 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
667 equivalent to seeing no -g option at all. */
668 static int mips_debug = 0;
669
670 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
671 #define MAX_VR4130_NOPS 4
672
673 /* The maximum number of NOPs needed to fill delay slots. */
674 #define MAX_DELAY_NOPS 2
675
676 /* The maximum number of NOPs needed for any purpose. */
677 #define MAX_NOPS 4
678
679 /* A list of previous instructions, with index 0 being the most recent.
680 We need to look back MAX_NOPS instructions when filling delay slots
681 or working around processor errata. We need to look back one
682 instruction further if we're thinking about using history[0] to
683 fill a branch delay slot. */
684 static struct mips_cl_insn history[1 + MAX_NOPS];
685
686 /* Nop instructions used by emit_nop. */
687 static struct mips_cl_insn nop_insn;
688 static struct mips_cl_insn mips16_nop_insn;
689 static struct mips_cl_insn micromips_nop16_insn;
690 static struct mips_cl_insn micromips_nop32_insn;
691
692 /* The appropriate nop for the current mode. */
693 #define NOP_INSN (mips_opts.mips16 \
694 ? &mips16_nop_insn \
695 : (mips_opts.micromips \
696 ? (mips_opts.insn32 \
697 ? &micromips_nop32_insn \
698 : &micromips_nop16_insn) \
699 : &nop_insn))
700
701 /* The size of NOP_INSN in bytes. */
702 #define NOP_INSN_SIZE ((mips_opts.mips16 \
703 || (mips_opts.micromips && !mips_opts.insn32)) \
704 ? 2 : 4)
705
706 /* If this is set, it points to a frag holding nop instructions which
707 were inserted before the start of a noreorder section. If those
708 nops turn out to be unnecessary, the size of the frag can be
709 decreased. */
710 static fragS *prev_nop_frag;
711
712 /* The number of nop instructions we created in prev_nop_frag. */
713 static int prev_nop_frag_holds;
714
715 /* The number of nop instructions that we know we need in
716 prev_nop_frag. */
717 static int prev_nop_frag_required;
718
719 /* The number of instructions we've seen since prev_nop_frag. */
720 static int prev_nop_frag_since;
721
722 /* Relocations against symbols are sometimes done in two parts, with a HI
723 relocation and a LO relocation. Each relocation has only 16 bits of
724 space to store an addend. This means that in order for the linker to
725 handle carries correctly, it must be able to locate both the HI and
726 the LO relocation. This means that the relocations must appear in
727 order in the relocation table.
728
729 In order to implement this, we keep track of each unmatched HI
730 relocation. We then sort them so that they immediately precede the
731 corresponding LO relocation. */
732
733 struct mips_hi_fixup
734 {
735 /* Next HI fixup. */
736 struct mips_hi_fixup *next;
737 /* This fixup. */
738 fixS *fixp;
739 /* The section this fixup is in. */
740 segT seg;
741 };
742
743 /* The list of unmatched HI relocs. */
744
745 static struct mips_hi_fixup *mips_hi_fixup_list;
746
747 /* The frag containing the last explicit relocation operator.
748 Null if explicit relocations have not been used. */
749
750 static fragS *prev_reloc_op_frag;
751
752 /* Map normal MIPS register numbers to mips16 register numbers. */
753
754 #define X ILLEGAL_REG
755 static const int mips32_to_16_reg_map[] =
756 {
757 X, X, 2, 3, 4, 5, 6, 7,
758 X, X, X, X, X, X, X, X,
759 0, 1, X, X, X, X, X, X,
760 X, X, X, X, X, X, X, X
761 };
762 #undef X
763
764 /* Map mips16 register numbers to normal MIPS register numbers. */
765
766 static const unsigned int mips16_to_32_reg_map[] =
767 {
768 16, 17, 2, 3, 4, 5, 6, 7
769 };
770
771 /* Map normal MIPS register numbers to microMIPS register numbers. */
772
773 #define mips32_to_micromips_reg_b_map mips32_to_16_reg_map
774 #define mips32_to_micromips_reg_c_map mips32_to_16_reg_map
775 #define mips32_to_micromips_reg_d_map mips32_to_16_reg_map
776 #define mips32_to_micromips_reg_e_map mips32_to_16_reg_map
777 #define mips32_to_micromips_reg_f_map mips32_to_16_reg_map
778 #define mips32_to_micromips_reg_g_map mips32_to_16_reg_map
779 #define mips32_to_micromips_reg_l_map mips32_to_16_reg_map
780
781 #define X ILLEGAL_REG
782 /* reg type h: 4, 5, 6. */
783 static const int mips32_to_micromips_reg_h_map[] =
784 {
785 X, X, X, X, 4, 5, 6, X,
786 X, X, X, X, X, X, X, X,
787 X, X, X, X, X, X, X, X,
788 X, X, X, X, X, X, X, X
789 };
790
791 /* reg type m: 0, 17, 2, 3, 16, 18, 19, 20. */
792 static const int mips32_to_micromips_reg_m_map[] =
793 {
794 0, X, 2, 3, X, X, X, X,
795 X, X, X, X, X, X, X, X,
796 4, 1, 5, 6, 7, X, X, X,
797 X, X, X, X, X, X, X, X
798 };
799
800 /* reg type q: 0, 2-7. 17. */
801 static const int mips32_to_micromips_reg_q_map[] =
802 {
803 0, X, 2, 3, 4, 5, 6, 7,
804 X, X, X, X, X, X, X, X,
805 X, 1, X, X, X, X, X, X,
806 X, X, X, X, X, X, X, X
807 };
808
809 #define mips32_to_micromips_reg_n_map mips32_to_micromips_reg_m_map
810 #undef X
811
812 /* Map microMIPS register numbers to normal MIPS register numbers. */
813
814 #define micromips_to_32_reg_b_map mips16_to_32_reg_map
815 #define micromips_to_32_reg_c_map mips16_to_32_reg_map
816 #define micromips_to_32_reg_d_map mips16_to_32_reg_map
817 #define micromips_to_32_reg_e_map mips16_to_32_reg_map
818 #define micromips_to_32_reg_f_map mips16_to_32_reg_map
819 #define micromips_to_32_reg_g_map mips16_to_32_reg_map
820
821 /* The microMIPS registers with type h. */
822 static const unsigned int micromips_to_32_reg_h_map[] =
823 {
824 5, 5, 6, 4, 4, 4, 4, 4
825 };
826
827 /* The microMIPS registers with type i. */
828 static const unsigned int micromips_to_32_reg_i_map[] =
829 {
830 6, 7, 7, 21, 22, 5, 6, 7
831 };
832
833 #define micromips_to_32_reg_l_map mips16_to_32_reg_map
834
835 /* The microMIPS registers with type m. */
836 static const unsigned int micromips_to_32_reg_m_map[] =
837 {
838 0, 17, 2, 3, 16, 18, 19, 20
839 };
840
841 #define micromips_to_32_reg_n_map micromips_to_32_reg_m_map
842
843 /* The microMIPS registers with type q. */
844 static const unsigned int micromips_to_32_reg_q_map[] =
845 {
846 0, 17, 2, 3, 4, 5, 6, 7
847 };
848
849 /* microMIPS imm type B. */
850 static const int micromips_imm_b_map[] =
851 {
852 1, 4, 8, 12, 16, 20, 24, -1
853 };
854
855 /* microMIPS imm type C. */
856 static const int micromips_imm_c_map[] =
857 {
858 128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
859 };
860
861 /* Classifies the kind of instructions we're interested in when
862 implementing -mfix-vr4120. */
863 enum fix_vr4120_class
864 {
865 FIX_VR4120_MACC,
866 FIX_VR4120_DMACC,
867 FIX_VR4120_MULT,
868 FIX_VR4120_DMULT,
869 FIX_VR4120_DIV,
870 FIX_VR4120_MTHILO,
871 NUM_FIX_VR4120_CLASSES
872 };
873
874 /* ...likewise -mfix-loongson2f-jump. */
875 static bfd_boolean mips_fix_loongson2f_jump;
876
877 /* ...likewise -mfix-loongson2f-nop. */
878 static bfd_boolean mips_fix_loongson2f_nop;
879
880 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
881 static bfd_boolean mips_fix_loongson2f;
882
883 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
884 there must be at least one other instruction between an instruction
885 of type X and an instruction of type Y. */
886 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
887
888 /* True if -mfix-vr4120 is in force. */
889 static int mips_fix_vr4120;
890
891 /* ...likewise -mfix-vr4130. */
892 static int mips_fix_vr4130;
893
894 /* ...likewise -mfix-24k. */
895 static int mips_fix_24k;
896
897 /* ...likewise -mfix-cn63xxp1 */
898 static bfd_boolean mips_fix_cn63xxp1;
899
900 /* We don't relax branches by default, since this causes us to expand
901 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
902 fail to compute the offset before expanding the macro to the most
903 efficient expansion. */
904
905 static int mips_relax_branch;
906 \f
907 /* The expansion of many macros depends on the type of symbol that
908 they refer to. For example, when generating position-dependent code,
909 a macro that refers to a symbol may have two different expansions,
910 one which uses GP-relative addresses and one which uses absolute
911 addresses. When generating SVR4-style PIC, a macro may have
912 different expansions for local and global symbols.
913
914 We handle these situations by generating both sequences and putting
915 them in variant frags. In position-dependent code, the first sequence
916 will be the GP-relative one and the second sequence will be the
917 absolute one. In SVR4 PIC, the first sequence will be for global
918 symbols and the second will be for local symbols.
919
920 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
921 SECOND are the lengths of the two sequences in bytes. These fields
922 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
923 the subtype has the following flags:
924
925 RELAX_USE_SECOND
926 Set if it has been decided that we should use the second
927 sequence instead of the first.
928
929 RELAX_SECOND_LONGER
930 Set in the first variant frag if the macro's second implementation
931 is longer than its first. This refers to the macro as a whole,
932 not an individual relaxation.
933
934 RELAX_NOMACRO
935 Set in the first variant frag if the macro appeared in a .set nomacro
936 block and if one alternative requires a warning but the other does not.
937
938 RELAX_DELAY_SLOT
939 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
940 delay slot.
941
942 RELAX_DELAY_SLOT_16BIT
943 Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
944 16-bit instruction.
945
946 RELAX_DELAY_SLOT_SIZE_FIRST
947 Like RELAX_DELAY_SLOT, but indicates that the first implementation of
948 the macro is of the wrong size for the branch delay slot.
949
950 RELAX_DELAY_SLOT_SIZE_SECOND
951 Like RELAX_DELAY_SLOT, but indicates that the second implementation of
952 the macro is of the wrong size for the branch delay slot.
953
954 The frag's "opcode" points to the first fixup for relaxable code.
955
956 Relaxable macros are generated using a sequence such as:
957
958 relax_start (SYMBOL);
959 ... generate first expansion ...
960 relax_switch ();
961 ... generate second expansion ...
962 relax_end ();
963
964 The code and fixups for the unwanted alternative are discarded
965 by md_convert_frag. */
966 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
967
968 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
969 #define RELAX_SECOND(X) ((X) & 0xff)
970 #define RELAX_USE_SECOND 0x10000
971 #define RELAX_SECOND_LONGER 0x20000
972 #define RELAX_NOMACRO 0x40000
973 #define RELAX_DELAY_SLOT 0x80000
974 #define RELAX_DELAY_SLOT_16BIT 0x100000
975 #define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
976 #define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
977
978 /* Branch without likely bit. If label is out of range, we turn:
979
980 beq reg1, reg2, label
981 delay slot
982
983 into
984
985 bne reg1, reg2, 0f
986 nop
987 j label
988 0: delay slot
989
990 with the following opcode replacements:
991
992 beq <-> bne
993 blez <-> bgtz
994 bltz <-> bgez
995 bc1f <-> bc1t
996
997 bltzal <-> bgezal (with jal label instead of j label)
998
999 Even though keeping the delay slot instruction in the delay slot of
1000 the branch would be more efficient, it would be very tricky to do
1001 correctly, because we'd have to introduce a variable frag *after*
1002 the delay slot instruction, and expand that instead. Let's do it
1003 the easy way for now, even if the branch-not-taken case now costs
1004 one additional instruction. Out-of-range branches are not supposed
1005 to be common, anyway.
1006
1007 Branch likely. If label is out of range, we turn:
1008
1009 beql reg1, reg2, label
1010 delay slot (annulled if branch not taken)
1011
1012 into
1013
1014 beql reg1, reg2, 1f
1015 nop
1016 beql $0, $0, 2f
1017 nop
1018 1: j[al] label
1019 delay slot (executed only if branch taken)
1020 2:
1021
1022 It would be possible to generate a shorter sequence by losing the
1023 likely bit, generating something like:
1024
1025 bne reg1, reg2, 0f
1026 nop
1027 j[al] label
1028 delay slot (executed only if branch taken)
1029 0:
1030
1031 beql -> bne
1032 bnel -> beq
1033 blezl -> bgtz
1034 bgtzl -> blez
1035 bltzl -> bgez
1036 bgezl -> bltz
1037 bc1fl -> bc1t
1038 bc1tl -> bc1f
1039
1040 bltzall -> bgezal (with jal label instead of j label)
1041 bgezall -> bltzal (ditto)
1042
1043
1044 but it's not clear that it would actually improve performance. */
1045 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar) \
1046 ((relax_substateT) \
1047 (0xc0000000 \
1048 | ((at) & 0x1f) \
1049 | ((toofar) ? 0x20 : 0) \
1050 | ((link) ? 0x40 : 0) \
1051 | ((likely) ? 0x80 : 0) \
1052 | ((uncond) ? 0x100 : 0)))
1053 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1054 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1055 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1056 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1057 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1058 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1059
1060 /* For mips16 code, we use an entirely different form of relaxation.
1061 mips16 supports two versions of most instructions which take
1062 immediate values: a small one which takes some small value, and a
1063 larger one which takes a 16 bit value. Since branches also follow
1064 this pattern, relaxing these values is required.
1065
1066 We can assemble both mips16 and normal MIPS code in a single
1067 object. Therefore, we need to support this type of relaxation at
1068 the same time that we support the relaxation described above. We
1069 use the high bit of the subtype field to distinguish these cases.
1070
1071 The information we store for this type of relaxation is the
1072 argument code found in the opcode file for this relocation, whether
1073 the user explicitly requested a small or extended form, and whether
1074 the relocation is in a jump or jal delay slot. That tells us the
1075 size of the value, and how it should be stored. We also store
1076 whether the fragment is considered to be extended or not. We also
1077 store whether this is known to be a branch to a different section,
1078 whether we have tried to relax this frag yet, and whether we have
1079 ever extended a PC relative fragment because of a shift count. */
1080 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1081 (0x80000000 \
1082 | ((type) & 0xff) \
1083 | ((small) ? 0x100 : 0) \
1084 | ((ext) ? 0x200 : 0) \
1085 | ((dslot) ? 0x400 : 0) \
1086 | ((jal_dslot) ? 0x800 : 0))
1087 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1088 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1089 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1090 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1091 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1092 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1093 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1094 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1095 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1096 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1097 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1098 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1099
1100 /* For microMIPS code, we use relaxation similar to one we use for
1101 MIPS16 code. Some instructions that take immediate values support
1102 two encodings: a small one which takes some small value, and a
1103 larger one which takes a 16 bit value. As some branches also follow
1104 this pattern, relaxing these values is required.
1105
1106 We can assemble both microMIPS and normal MIPS code in a single
1107 object. Therefore, we need to support this type of relaxation at
1108 the same time that we support the relaxation described above. We
1109 use one of the high bits of the subtype field to distinguish these
1110 cases.
1111
1112 The information we store for this type of relaxation is the argument
1113 code found in the opcode file for this relocation, the register
1114 selected as the assembler temporary, whether the branch is
1115 unconditional, whether it is compact, whether it stores the link
1116 address implicitly in $ra, whether relaxation of out-of-range 32-bit
1117 branches to a sequence of instructions is enabled, and whether the
1118 displacement of a branch is too large to fit as an immediate argument
1119 of a 16-bit and a 32-bit branch, respectively. */
1120 #define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1121 relax32, toofar16, toofar32) \
1122 (0x40000000 \
1123 | ((type) & 0xff) \
1124 | (((at) & 0x1f) << 8) \
1125 | ((uncond) ? 0x2000 : 0) \
1126 | ((compact) ? 0x4000 : 0) \
1127 | ((link) ? 0x8000 : 0) \
1128 | ((relax32) ? 0x10000 : 0) \
1129 | ((toofar16) ? 0x20000 : 0) \
1130 | ((toofar32) ? 0x40000 : 0))
1131 #define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1132 #define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1133 #define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1134 #define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1135 #define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1136 #define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1137 #define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1138
1139 #define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1140 #define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1141 #define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1142 #define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1143 #define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1144 #define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1145
1146 /* Sign-extend 16-bit value X. */
1147 #define SEXT_16BIT(X) ((((X) + 0x8000) & 0xffff) - 0x8000)
1148
1149 /* Is the given value a sign-extended 32-bit value? */
1150 #define IS_SEXT_32BIT_NUM(x) \
1151 (((x) &~ (offsetT) 0x7fffffff) == 0 \
1152 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1153
1154 /* Is the given value a sign-extended 16-bit value? */
1155 #define IS_SEXT_16BIT_NUM(x) \
1156 (((x) &~ (offsetT) 0x7fff) == 0 \
1157 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1158
1159 /* Is the given value a sign-extended 12-bit value? */
1160 #define IS_SEXT_12BIT_NUM(x) \
1161 (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1162
1163 /* Is the given value a sign-extended 9-bit value? */
1164 #define IS_SEXT_9BIT_NUM(x) \
1165 (((((x) & 0x1ff) ^ 0x100LL) - 0x100LL) == (x))
1166
1167 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
1168 #define IS_ZEXT_32BIT_NUM(x) \
1169 (((x) &~ (offsetT) 0xffffffff) == 0 \
1170 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1171
1172 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1173 VALUE << SHIFT. VALUE is evaluated exactly once. */
1174 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1175 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1176 | (((VALUE) & (MASK)) << (SHIFT)))
1177
1178 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1179 SHIFT places. */
1180 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1181 (((STRUCT) >> (SHIFT)) & (MASK))
1182
1183 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1184 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1185
1186 include/opcode/mips.h specifies operand fields using the macros
1187 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1188 with "MIPS16OP" instead of "OP". */
1189 #define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1190 do \
1191 if (!(MICROMIPS)) \
1192 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1193 OP_MASK_##FIELD, OP_SH_##FIELD); \
1194 else \
1195 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1196 MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1197 while (0)
1198 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1199 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1200 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1201
1202 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
1203 #define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1204 (!(MICROMIPS) \
1205 ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1206 : EXTRACT_BITS ((INSN).insn_opcode, \
1207 MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1208 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1209 EXTRACT_BITS ((INSN).insn_opcode, \
1210 MIPS16OP_MASK_##FIELD, \
1211 MIPS16OP_SH_##FIELD)
1212
1213 /* The MIPS16 EXTEND opcode, shifted left 16 places. */
1214 #define MIPS16_EXTEND (0xf000U << 16)
1215 \f
1216 /* Whether or not we are emitting a branch-likely macro. */
1217 static bfd_boolean emit_branch_likely_macro = FALSE;
1218
1219 /* Global variables used when generating relaxable macros. See the
1220 comment above RELAX_ENCODE for more details about how relaxation
1221 is used. */
1222 static struct {
1223 /* 0 if we're not emitting a relaxable macro.
1224 1 if we're emitting the first of the two relaxation alternatives.
1225 2 if we're emitting the second alternative. */
1226 int sequence;
1227
1228 /* The first relaxable fixup in the current frag. (In other words,
1229 the first fixup that refers to relaxable code.) */
1230 fixS *first_fixup;
1231
1232 /* sizes[0] says how many bytes of the first alternative are stored in
1233 the current frag. Likewise sizes[1] for the second alternative. */
1234 unsigned int sizes[2];
1235
1236 /* The symbol on which the choice of sequence depends. */
1237 symbolS *symbol;
1238 } mips_relax;
1239 \f
1240 /* Global variables used to decide whether a macro needs a warning. */
1241 static struct {
1242 /* True if the macro is in a branch delay slot. */
1243 bfd_boolean delay_slot_p;
1244
1245 /* Set to the length in bytes required if the macro is in a delay slot
1246 that requires a specific length of instruction, otherwise zero. */
1247 unsigned int delay_slot_length;
1248
1249 /* For relaxable macros, sizes[0] is the length of the first alternative
1250 in bytes and sizes[1] is the length of the second alternative.
1251 For non-relaxable macros, both elements give the length of the
1252 macro in bytes. */
1253 unsigned int sizes[2];
1254
1255 /* For relaxable macros, first_insn_sizes[0] is the length of the first
1256 instruction of the first alternative in bytes and first_insn_sizes[1]
1257 is the length of the first instruction of the second alternative.
1258 For non-relaxable macros, both elements give the length of the first
1259 instruction in bytes.
1260
1261 Set to zero if we haven't yet seen the first instruction. */
1262 unsigned int first_insn_sizes[2];
1263
1264 /* For relaxable macros, insns[0] is the number of instructions for the
1265 first alternative and insns[1] is the number of instructions for the
1266 second alternative.
1267
1268 For non-relaxable macros, both elements give the number of
1269 instructions for the macro. */
1270 unsigned int insns[2];
1271
1272 /* The first variant frag for this macro. */
1273 fragS *first_frag;
1274 } mips_macro_warning;
1275 \f
1276 /* Prototypes for static functions. */
1277
1278 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1279
1280 static void append_insn
1281 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1282 bfd_boolean expansionp);
1283 static void mips_no_prev_insn (void);
1284 static void macro_build (expressionS *, const char *, const char *, ...);
1285 static void mips16_macro_build
1286 (expressionS *, const char *, const char *, va_list *);
1287 static void load_register (int, expressionS *, int);
1288 static void macro_start (void);
1289 static void macro_end (void);
1290 static void macro (struct mips_cl_insn *ip, char *str);
1291 static void mips16_macro (struct mips_cl_insn * ip);
1292 static void mips_ip (char *str, struct mips_cl_insn * ip);
1293 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1294 static void mips16_immed
1295 (char *, unsigned int, int, bfd_reloc_code_real_type, offsetT,
1296 unsigned int, unsigned long *);
1297 static size_t my_getSmallExpression
1298 (expressionS *, bfd_reloc_code_real_type *, char *);
1299 static void my_getExpression (expressionS *, char *);
1300 static void s_align (int);
1301 static void s_change_sec (int);
1302 static void s_change_section (int);
1303 static void s_cons (int);
1304 static void s_float_cons (int);
1305 static void s_mips_globl (int);
1306 static void s_option (int);
1307 static void s_mipsset (int);
1308 static void s_abicalls (int);
1309 static void s_cpload (int);
1310 static void s_cpsetup (int);
1311 static void s_cplocal (int);
1312 static void s_cprestore (int);
1313 static void s_cpreturn (int);
1314 static void s_dtprelword (int);
1315 static void s_dtpreldword (int);
1316 static void s_tprelword (int);
1317 static void s_tpreldword (int);
1318 static void s_gpvalue (int);
1319 static void s_gpword (int);
1320 static void s_gpdword (int);
1321 static void s_ehword (int);
1322 static void s_cpadd (int);
1323 static void s_insn (int);
1324 static void md_obj_begin (void);
1325 static void md_obj_end (void);
1326 static void s_mips_ent (int);
1327 static void s_mips_end (int);
1328 static void s_mips_frame (int);
1329 static void s_mips_mask (int reg_type);
1330 static void s_mips_stab (int);
1331 static void s_mips_weakext (int);
1332 static void s_mips_file (int);
1333 static void s_mips_loc (int);
1334 static bfd_boolean pic_need_relax (symbolS *, asection *);
1335 static int relaxed_branch_length (fragS *, asection *, int);
1336 static int validate_mips_insn (const struct mips_opcode *);
1337 static int validate_micromips_insn (const struct mips_opcode *);
1338 static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1339 static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1340
1341 /* Table and functions used to map between CPU/ISA names, and
1342 ISA levels, and CPU numbers. */
1343
1344 struct mips_cpu_info
1345 {
1346 const char *name; /* CPU or ISA name. */
1347 int flags; /* MIPS_CPU_* flags. */
1348 int ase; /* Set of ASEs implemented by the CPU. */
1349 int isa; /* ISA level. */
1350 int cpu; /* CPU number (default CPU if ISA). */
1351 };
1352
1353 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1354
1355 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1356 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1357 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1358 \f
1359 /* Command-line options. */
1360 const char *md_shortopts = "O::g::G:";
1361
1362 enum options
1363 {
1364 OPTION_MARCH = OPTION_MD_BASE,
1365 OPTION_MTUNE,
1366 OPTION_MIPS1,
1367 OPTION_MIPS2,
1368 OPTION_MIPS3,
1369 OPTION_MIPS4,
1370 OPTION_MIPS5,
1371 OPTION_MIPS32,
1372 OPTION_MIPS64,
1373 OPTION_MIPS32R2,
1374 OPTION_MIPS64R2,
1375 OPTION_MIPS16,
1376 OPTION_NO_MIPS16,
1377 OPTION_MIPS3D,
1378 OPTION_NO_MIPS3D,
1379 OPTION_MDMX,
1380 OPTION_NO_MDMX,
1381 OPTION_DSP,
1382 OPTION_NO_DSP,
1383 OPTION_MT,
1384 OPTION_NO_MT,
1385 OPTION_VIRT,
1386 OPTION_NO_VIRT,
1387 OPTION_SMARTMIPS,
1388 OPTION_NO_SMARTMIPS,
1389 OPTION_DSPR2,
1390 OPTION_NO_DSPR2,
1391 OPTION_EVA,
1392 OPTION_NO_EVA,
1393 OPTION_MICROMIPS,
1394 OPTION_NO_MICROMIPS,
1395 OPTION_MCU,
1396 OPTION_NO_MCU,
1397 OPTION_COMPAT_ARCH_BASE,
1398 OPTION_M4650,
1399 OPTION_NO_M4650,
1400 OPTION_M4010,
1401 OPTION_NO_M4010,
1402 OPTION_M4100,
1403 OPTION_NO_M4100,
1404 OPTION_M3900,
1405 OPTION_NO_M3900,
1406 OPTION_M7000_HILO_FIX,
1407 OPTION_MNO_7000_HILO_FIX,
1408 OPTION_FIX_24K,
1409 OPTION_NO_FIX_24K,
1410 OPTION_FIX_LOONGSON2F_JUMP,
1411 OPTION_NO_FIX_LOONGSON2F_JUMP,
1412 OPTION_FIX_LOONGSON2F_NOP,
1413 OPTION_NO_FIX_LOONGSON2F_NOP,
1414 OPTION_FIX_VR4120,
1415 OPTION_NO_FIX_VR4120,
1416 OPTION_FIX_VR4130,
1417 OPTION_NO_FIX_VR4130,
1418 OPTION_FIX_CN63XXP1,
1419 OPTION_NO_FIX_CN63XXP1,
1420 OPTION_TRAP,
1421 OPTION_BREAK,
1422 OPTION_EB,
1423 OPTION_EL,
1424 OPTION_FP32,
1425 OPTION_GP32,
1426 OPTION_CONSTRUCT_FLOATS,
1427 OPTION_NO_CONSTRUCT_FLOATS,
1428 OPTION_FP64,
1429 OPTION_GP64,
1430 OPTION_RELAX_BRANCH,
1431 OPTION_NO_RELAX_BRANCH,
1432 OPTION_INSN32,
1433 OPTION_NO_INSN32,
1434 OPTION_MSHARED,
1435 OPTION_MNO_SHARED,
1436 OPTION_MSYM32,
1437 OPTION_MNO_SYM32,
1438 OPTION_SOFT_FLOAT,
1439 OPTION_HARD_FLOAT,
1440 OPTION_SINGLE_FLOAT,
1441 OPTION_DOUBLE_FLOAT,
1442 OPTION_32,
1443 OPTION_CALL_SHARED,
1444 OPTION_CALL_NONPIC,
1445 OPTION_NON_SHARED,
1446 OPTION_XGOT,
1447 OPTION_MABI,
1448 OPTION_N32,
1449 OPTION_64,
1450 OPTION_MDEBUG,
1451 OPTION_NO_MDEBUG,
1452 OPTION_PDR,
1453 OPTION_NO_PDR,
1454 OPTION_MVXWORKS_PIC,
1455 OPTION_END_OF_ENUM
1456 };
1457
1458 struct option md_longopts[] =
1459 {
1460 /* Options which specify architecture. */
1461 {"march", required_argument, NULL, OPTION_MARCH},
1462 {"mtune", required_argument, NULL, OPTION_MTUNE},
1463 {"mips0", no_argument, NULL, OPTION_MIPS1},
1464 {"mips1", no_argument, NULL, OPTION_MIPS1},
1465 {"mips2", no_argument, NULL, OPTION_MIPS2},
1466 {"mips3", no_argument, NULL, OPTION_MIPS3},
1467 {"mips4", no_argument, NULL, OPTION_MIPS4},
1468 {"mips5", no_argument, NULL, OPTION_MIPS5},
1469 {"mips32", no_argument, NULL, OPTION_MIPS32},
1470 {"mips64", no_argument, NULL, OPTION_MIPS64},
1471 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
1472 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
1473
1474 /* Options which specify Application Specific Extensions (ASEs). */
1475 {"mips16", no_argument, NULL, OPTION_MIPS16},
1476 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
1477 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
1478 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
1479 {"mdmx", no_argument, NULL, OPTION_MDMX},
1480 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
1481 {"mdsp", no_argument, NULL, OPTION_DSP},
1482 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
1483 {"mmt", no_argument, NULL, OPTION_MT},
1484 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
1485 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
1486 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
1487 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
1488 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
1489 {"meva", no_argument, NULL, OPTION_EVA},
1490 {"mno-eva", no_argument, NULL, OPTION_NO_EVA},
1491 {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
1492 {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
1493 {"mmcu", no_argument, NULL, OPTION_MCU},
1494 {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
1495 {"mvirt", no_argument, NULL, OPTION_VIRT},
1496 {"mno-virt", no_argument, NULL, OPTION_NO_VIRT},
1497
1498 /* Old-style architecture options. Don't add more of these. */
1499 {"m4650", no_argument, NULL, OPTION_M4650},
1500 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
1501 {"m4010", no_argument, NULL, OPTION_M4010},
1502 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
1503 {"m4100", no_argument, NULL, OPTION_M4100},
1504 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
1505 {"m3900", no_argument, NULL, OPTION_M3900},
1506 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
1507
1508 /* Options which enable bug fixes. */
1509 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
1510 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1511 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
1512 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
1513 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
1514 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
1515 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
1516 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
1517 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
1518 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
1519 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
1520 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
1521 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
1522 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
1523 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
1524
1525 /* Miscellaneous options. */
1526 {"trap", no_argument, NULL, OPTION_TRAP},
1527 {"no-break", no_argument, NULL, OPTION_TRAP},
1528 {"break", no_argument, NULL, OPTION_BREAK},
1529 {"no-trap", no_argument, NULL, OPTION_BREAK},
1530 {"EB", no_argument, NULL, OPTION_EB},
1531 {"EL", no_argument, NULL, OPTION_EL},
1532 {"mfp32", no_argument, NULL, OPTION_FP32},
1533 {"mgp32", no_argument, NULL, OPTION_GP32},
1534 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1535 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1536 {"mfp64", no_argument, NULL, OPTION_FP64},
1537 {"mgp64", no_argument, NULL, OPTION_GP64},
1538 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
1539 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
1540 {"minsn32", no_argument, NULL, OPTION_INSN32},
1541 {"mno-insn32", no_argument, NULL, OPTION_NO_INSN32},
1542 {"mshared", no_argument, NULL, OPTION_MSHARED},
1543 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
1544 {"msym32", no_argument, NULL, OPTION_MSYM32},
1545 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
1546 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
1547 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
1548 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
1549 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
1550
1551 /* Strictly speaking this next option is ELF specific,
1552 but we allow it for other ports as well in order to
1553 make testing easier. */
1554 {"32", no_argument, NULL, OPTION_32},
1555
1556 /* ELF-specific options. */
1557 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
1558 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
1559 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
1560 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
1561 {"xgot", no_argument, NULL, OPTION_XGOT},
1562 {"mabi", required_argument, NULL, OPTION_MABI},
1563 {"n32", no_argument, NULL, OPTION_N32},
1564 {"64", no_argument, NULL, OPTION_64},
1565 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
1566 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
1567 {"mpdr", no_argument, NULL, OPTION_PDR},
1568 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
1569 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
1570
1571 {NULL, no_argument, NULL, 0}
1572 };
1573 size_t md_longopts_size = sizeof (md_longopts);
1574 \f
1575 /* Information about either an Application Specific Extension or an
1576 optional architecture feature that, for simplicity, we treat in the
1577 same way as an ASE. */
1578 struct mips_ase
1579 {
1580 /* The name of the ASE, used in both the command-line and .set options. */
1581 const char *name;
1582
1583 /* The associated ASE_* flags. If the ASE is available on both 32-bit
1584 and 64-bit architectures, the flags here refer to the subset that
1585 is available on both. */
1586 unsigned int flags;
1587
1588 /* The ASE_* flag used for instructions that are available on 64-bit
1589 architectures but that are not included in FLAGS. */
1590 unsigned int flags64;
1591
1592 /* The command-line options that turn the ASE on and off. */
1593 int option_on;
1594 int option_off;
1595
1596 /* The minimum required architecture revisions for MIPS32, MIPS64,
1597 microMIPS32 and microMIPS64, or -1 if the extension isn't supported. */
1598 int mips32_rev;
1599 int mips64_rev;
1600 int micromips32_rev;
1601 int micromips64_rev;
1602 };
1603
1604 /* A table of all supported ASEs. */
1605 static const struct mips_ase mips_ases[] = {
1606 { "dsp", ASE_DSP, ASE_DSP64,
1607 OPTION_DSP, OPTION_NO_DSP,
1608 2, 2, 2, 2 },
1609
1610 { "dspr2", ASE_DSP | ASE_DSPR2, 0,
1611 OPTION_DSPR2, OPTION_NO_DSPR2,
1612 2, 2, 2, 2 },
1613
1614 { "eva", ASE_EVA, 0,
1615 OPTION_EVA, OPTION_NO_EVA,
1616 2, 2, 2, 2 },
1617
1618 { "mcu", ASE_MCU, 0,
1619 OPTION_MCU, OPTION_NO_MCU,
1620 2, 2, 2, 2 },
1621
1622 /* Deprecated in MIPS64r5, but we don't implement that yet. */
1623 { "mdmx", ASE_MDMX, 0,
1624 OPTION_MDMX, OPTION_NO_MDMX,
1625 -1, 1, -1, -1 },
1626
1627 /* Requires 64-bit FPRs, so the minimum MIPS32 revision is 2. */
1628 { "mips3d", ASE_MIPS3D, 0,
1629 OPTION_MIPS3D, OPTION_NO_MIPS3D,
1630 2, 1, -1, -1 },
1631
1632 { "mt", ASE_MT, 0,
1633 OPTION_MT, OPTION_NO_MT,
1634 2, 2, -1, -1 },
1635
1636 { "smartmips", ASE_SMARTMIPS, 0,
1637 OPTION_SMARTMIPS, OPTION_NO_SMARTMIPS,
1638 1, -1, -1, -1 },
1639
1640 { "virt", ASE_VIRT, ASE_VIRT64,
1641 OPTION_VIRT, OPTION_NO_VIRT,
1642 2, 2, 2, 2 }
1643 };
1644
1645 /* The set of ASEs that require -mfp64. */
1646 #define FP64_ASES (ASE_MIPS3D | ASE_MDMX)
1647
1648 /* Groups of ASE_* flags that represent different revisions of an ASE. */
1649 static const unsigned int mips_ase_groups[] = {
1650 ASE_DSP | ASE_DSPR2
1651 };
1652 \f
1653 /* Pseudo-op table.
1654
1655 The following pseudo-ops from the Kane and Heinrich MIPS book
1656 should be defined here, but are currently unsupported: .alias,
1657 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1658
1659 The following pseudo-ops from the Kane and Heinrich MIPS book are
1660 specific to the type of debugging information being generated, and
1661 should be defined by the object format: .aent, .begin, .bend,
1662 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1663 .vreg.
1664
1665 The following pseudo-ops from the Kane and Heinrich MIPS book are
1666 not MIPS CPU specific, but are also not specific to the object file
1667 format. This file is probably the best place to define them, but
1668 they are not currently supported: .asm0, .endr, .lab, .struct. */
1669
1670 static const pseudo_typeS mips_pseudo_table[] =
1671 {
1672 /* MIPS specific pseudo-ops. */
1673 {"option", s_option, 0},
1674 {"set", s_mipsset, 0},
1675 {"rdata", s_change_sec, 'r'},
1676 {"sdata", s_change_sec, 's'},
1677 {"livereg", s_ignore, 0},
1678 {"abicalls", s_abicalls, 0},
1679 {"cpload", s_cpload, 0},
1680 {"cpsetup", s_cpsetup, 0},
1681 {"cplocal", s_cplocal, 0},
1682 {"cprestore", s_cprestore, 0},
1683 {"cpreturn", s_cpreturn, 0},
1684 {"dtprelword", s_dtprelword, 0},
1685 {"dtpreldword", s_dtpreldword, 0},
1686 {"tprelword", s_tprelword, 0},
1687 {"tpreldword", s_tpreldword, 0},
1688 {"gpvalue", s_gpvalue, 0},
1689 {"gpword", s_gpword, 0},
1690 {"gpdword", s_gpdword, 0},
1691 {"ehword", s_ehword, 0},
1692 {"cpadd", s_cpadd, 0},
1693 {"insn", s_insn, 0},
1694
1695 /* Relatively generic pseudo-ops that happen to be used on MIPS
1696 chips. */
1697 {"asciiz", stringer, 8 + 1},
1698 {"bss", s_change_sec, 'b'},
1699 {"err", s_err, 0},
1700 {"half", s_cons, 1},
1701 {"dword", s_cons, 3},
1702 {"weakext", s_mips_weakext, 0},
1703 {"origin", s_org, 0},
1704 {"repeat", s_rept, 0},
1705
1706 /* For MIPS this is non-standard, but we define it for consistency. */
1707 {"sbss", s_change_sec, 'B'},
1708
1709 /* These pseudo-ops are defined in read.c, but must be overridden
1710 here for one reason or another. */
1711 {"align", s_align, 0},
1712 {"byte", s_cons, 0},
1713 {"data", s_change_sec, 'd'},
1714 {"double", s_float_cons, 'd'},
1715 {"float", s_float_cons, 'f'},
1716 {"globl", s_mips_globl, 0},
1717 {"global", s_mips_globl, 0},
1718 {"hword", s_cons, 1},
1719 {"int", s_cons, 2},
1720 {"long", s_cons, 2},
1721 {"octa", s_cons, 4},
1722 {"quad", s_cons, 3},
1723 {"section", s_change_section, 0},
1724 {"short", s_cons, 1},
1725 {"single", s_float_cons, 'f'},
1726 {"stabd", s_mips_stab, 'd'},
1727 {"stabn", s_mips_stab, 'n'},
1728 {"stabs", s_mips_stab, 's'},
1729 {"text", s_change_sec, 't'},
1730 {"word", s_cons, 2},
1731
1732 { "extern", ecoff_directive_extern, 0},
1733
1734 { NULL, NULL, 0 },
1735 };
1736
1737 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1738 {
1739 /* These pseudo-ops should be defined by the object file format.
1740 However, a.out doesn't support them, so we have versions here. */
1741 {"aent", s_mips_ent, 1},
1742 {"bgnb", s_ignore, 0},
1743 {"end", s_mips_end, 0},
1744 {"endb", s_ignore, 0},
1745 {"ent", s_mips_ent, 0},
1746 {"file", s_mips_file, 0},
1747 {"fmask", s_mips_mask, 'F'},
1748 {"frame", s_mips_frame, 0},
1749 {"loc", s_mips_loc, 0},
1750 {"mask", s_mips_mask, 'R'},
1751 {"verstamp", s_ignore, 0},
1752 { NULL, NULL, 0 },
1753 };
1754
1755 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1756 purpose of the `.dc.a' internal pseudo-op. */
1757
1758 int
1759 mips_address_bytes (void)
1760 {
1761 return HAVE_64BIT_ADDRESSES ? 8 : 4;
1762 }
1763
1764 extern void pop_insert (const pseudo_typeS *);
1765
1766 void
1767 mips_pop_insert (void)
1768 {
1769 pop_insert (mips_pseudo_table);
1770 if (! ECOFF_DEBUGGING)
1771 pop_insert (mips_nonecoff_pseudo_table);
1772 }
1773 \f
1774 /* Symbols labelling the current insn. */
1775
1776 struct insn_label_list
1777 {
1778 struct insn_label_list *next;
1779 symbolS *label;
1780 };
1781
1782 static struct insn_label_list *free_insn_labels;
1783 #define label_list tc_segment_info_data.labels
1784
1785 static void mips_clear_insn_labels (void);
1786 static void mips_mark_labels (void);
1787 static void mips_compressed_mark_labels (void);
1788
1789 static inline void
1790 mips_clear_insn_labels (void)
1791 {
1792 register struct insn_label_list **pl;
1793 segment_info_type *si;
1794
1795 if (now_seg)
1796 {
1797 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1798 ;
1799
1800 si = seg_info (now_seg);
1801 *pl = si->label_list;
1802 si->label_list = NULL;
1803 }
1804 }
1805
1806 /* Mark instruction labels in MIPS16/microMIPS mode. */
1807
1808 static inline void
1809 mips_mark_labels (void)
1810 {
1811 if (HAVE_CODE_COMPRESSION)
1812 mips_compressed_mark_labels ();
1813 }
1814 \f
1815 static char *expr_end;
1816
1817 /* Expressions which appear in instructions. These are set by
1818 mips_ip. */
1819
1820 static expressionS imm_expr;
1821 static expressionS imm2_expr;
1822 static expressionS offset_expr;
1823
1824 /* Relocs associated with imm_expr and offset_expr. */
1825
1826 static bfd_reloc_code_real_type imm_reloc[3]
1827 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1828 static bfd_reloc_code_real_type offset_reloc[3]
1829 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1830
1831 /* This is set to the resulting size of the instruction to be produced
1832 by mips16_ip if an explicit extension is used or by mips_ip if an
1833 explicit size is supplied. */
1834
1835 static unsigned int forced_insn_length;
1836
1837 /* True if we are assembling an instruction. All dot symbols defined during
1838 this time should be treated as code labels. */
1839
1840 static bfd_boolean mips_assembling_insn;
1841
1842 /* The pdr segment for per procedure frame/regmask info. Not used for
1843 ECOFF debugging. */
1844
1845 static segT pdr_seg;
1846
1847 /* The default target format to use. */
1848
1849 #if defined (TE_FreeBSD)
1850 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1851 #elif defined (TE_TMIPS)
1852 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1853 #else
1854 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1855 #endif
1856
1857 const char *
1858 mips_target_format (void)
1859 {
1860 switch (OUTPUT_FLAVOR)
1861 {
1862 case bfd_target_elf_flavour:
1863 #ifdef TE_VXWORKS
1864 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1865 return (target_big_endian
1866 ? "elf32-bigmips-vxworks"
1867 : "elf32-littlemips-vxworks");
1868 #endif
1869 return (target_big_endian
1870 ? (HAVE_64BIT_OBJECTS
1871 ? ELF_TARGET ("elf64-", "big")
1872 : (HAVE_NEWABI
1873 ? ELF_TARGET ("elf32-n", "big")
1874 : ELF_TARGET ("elf32-", "big")))
1875 : (HAVE_64BIT_OBJECTS
1876 ? ELF_TARGET ("elf64-", "little")
1877 : (HAVE_NEWABI
1878 ? ELF_TARGET ("elf32-n", "little")
1879 : ELF_TARGET ("elf32-", "little"))));
1880 default:
1881 abort ();
1882 return NULL;
1883 }
1884 }
1885
1886 /* Return the ISA revision that is currently in use, or 0 if we are
1887 generating code for MIPS V or below. */
1888
1889 static int
1890 mips_isa_rev (void)
1891 {
1892 if (mips_opts.isa == ISA_MIPS32R2 || mips_opts.isa == ISA_MIPS64R2)
1893 return 2;
1894
1895 /* microMIPS implies revision 2 or above. */
1896 if (mips_opts.micromips)
1897 return 2;
1898
1899 if (mips_opts.isa == ISA_MIPS32 || mips_opts.isa == ISA_MIPS64)
1900 return 1;
1901
1902 return 0;
1903 }
1904
1905 /* Return the mask of all ASEs that are revisions of those in FLAGS. */
1906
1907 static unsigned int
1908 mips_ase_mask (unsigned int flags)
1909 {
1910 unsigned int i;
1911
1912 for (i = 0; i < ARRAY_SIZE (mips_ase_groups); i++)
1913 if (flags & mips_ase_groups[i])
1914 flags |= mips_ase_groups[i];
1915 return flags;
1916 }
1917
1918 /* Check whether the current ISA supports ASE. Issue a warning if
1919 appropriate. */
1920
1921 static void
1922 mips_check_isa_supports_ase (const struct mips_ase *ase)
1923 {
1924 const char *base;
1925 int min_rev, size;
1926 static unsigned int warned_isa;
1927 static unsigned int warned_fp32;
1928
1929 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1930 min_rev = mips_opts.micromips ? ase->micromips64_rev : ase->mips64_rev;
1931 else
1932 min_rev = mips_opts.micromips ? ase->micromips32_rev : ase->mips32_rev;
1933 if ((min_rev < 0 || mips_isa_rev () < min_rev)
1934 && (warned_isa & ase->flags) != ase->flags)
1935 {
1936 warned_isa |= ase->flags;
1937 base = mips_opts.micromips ? "microMIPS" : "MIPS";
1938 size = ISA_HAS_64BIT_REGS (mips_opts.isa) ? 64 : 32;
1939 if (min_rev < 0)
1940 as_warn (_("The %d-bit %s architecture does not support the"
1941 " `%s' extension"), size, base, ase->name);
1942 else
1943 as_warn (_("The `%s' extension requires %s%d revision %d or greater"),
1944 ase->name, base, size, min_rev);
1945 }
1946 if ((ase->flags & FP64_ASES)
1947 && mips_opts.fp32
1948 && (warned_fp32 & ase->flags) != ase->flags)
1949 {
1950 warned_fp32 |= ase->flags;
1951 as_warn (_("The `%s' extension requires 64-bit FPRs"), ase->name);
1952 }
1953 }
1954
1955 /* Check all enabled ASEs to see whether they are supported by the
1956 chosen architecture. */
1957
1958 static void
1959 mips_check_isa_supports_ases (void)
1960 {
1961 unsigned int i, mask;
1962
1963 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1964 {
1965 mask = mips_ase_mask (mips_ases[i].flags);
1966 if ((mips_opts.ase & mask) == mips_ases[i].flags)
1967 mips_check_isa_supports_ase (&mips_ases[i]);
1968 }
1969 }
1970
1971 /* Set the state of ASE to ENABLED_P. Return the mask of ASE_* flags
1972 that were affected. */
1973
1974 static unsigned int
1975 mips_set_ase (const struct mips_ase *ase, bfd_boolean enabled_p)
1976 {
1977 unsigned int mask;
1978
1979 mask = mips_ase_mask (ase->flags);
1980 mips_opts.ase &= ~mask;
1981 if (enabled_p)
1982 mips_opts.ase |= ase->flags;
1983 return mask;
1984 }
1985
1986 /* Return the ASE called NAME, or null if none. */
1987
1988 static const struct mips_ase *
1989 mips_lookup_ase (const char *name)
1990 {
1991 unsigned int i;
1992
1993 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
1994 if (strcmp (name, mips_ases[i].name) == 0)
1995 return &mips_ases[i];
1996 return NULL;
1997 }
1998
1999 /* Return the length of a microMIPS instruction in bytes. If bits of
2000 the mask beyond the low 16 are 0, then it is a 16-bit instruction.
2001 Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
2002 major opcode) will require further modifications to the opcode
2003 table. */
2004
2005 static inline unsigned int
2006 micromips_insn_length (const struct mips_opcode *mo)
2007 {
2008 return (mo->mask >> 16) == 0 ? 2 : 4;
2009 }
2010
2011 /* Return the length of MIPS16 instruction OPCODE. */
2012
2013 static inline unsigned int
2014 mips16_opcode_length (unsigned long opcode)
2015 {
2016 return (opcode >> 16) == 0 ? 2 : 4;
2017 }
2018
2019 /* Return the length of instruction INSN. */
2020
2021 static inline unsigned int
2022 insn_length (const struct mips_cl_insn *insn)
2023 {
2024 if (mips_opts.micromips)
2025 return micromips_insn_length (insn->insn_mo);
2026 else if (mips_opts.mips16)
2027 return mips16_opcode_length (insn->insn_opcode);
2028 else
2029 return 4;
2030 }
2031
2032 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
2033
2034 static void
2035 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
2036 {
2037 size_t i;
2038
2039 insn->insn_mo = mo;
2040 insn->insn_opcode = mo->match;
2041 insn->frag = NULL;
2042 insn->where = 0;
2043 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2044 insn->fixp[i] = NULL;
2045 insn->fixed_p = (mips_opts.noreorder > 0);
2046 insn->noreorder_p = (mips_opts.noreorder > 0);
2047 insn->mips16_absolute_jump_p = 0;
2048 insn->complete_p = 0;
2049 insn->cleared_p = 0;
2050 }
2051
2052 /* Record the current MIPS16/microMIPS mode in now_seg. */
2053
2054 static void
2055 mips_record_compressed_mode (void)
2056 {
2057 segment_info_type *si;
2058
2059 si = seg_info (now_seg);
2060 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
2061 si->tc_segment_info_data.mips16 = mips_opts.mips16;
2062 if (si->tc_segment_info_data.micromips != mips_opts.micromips)
2063 si->tc_segment_info_data.micromips = mips_opts.micromips;
2064 }
2065
2066 /* Read a standard MIPS instruction from BUF. */
2067
2068 static unsigned long
2069 read_insn (char *buf)
2070 {
2071 if (target_big_endian)
2072 return bfd_getb32 ((bfd_byte *) buf);
2073 else
2074 return bfd_getl32 ((bfd_byte *) buf);
2075 }
2076
2077 /* Write standard MIPS instruction INSN to BUF. Return a pointer to
2078 the next byte. */
2079
2080 static char *
2081 write_insn (char *buf, unsigned int insn)
2082 {
2083 md_number_to_chars (buf, insn, 4);
2084 return buf + 4;
2085 }
2086
2087 /* Read a microMIPS or MIPS16 opcode from BUF, given that it
2088 has length LENGTH. */
2089
2090 static unsigned long
2091 read_compressed_insn (char *buf, unsigned int length)
2092 {
2093 unsigned long insn;
2094 unsigned int i;
2095
2096 insn = 0;
2097 for (i = 0; i < length; i += 2)
2098 {
2099 insn <<= 16;
2100 if (target_big_endian)
2101 insn |= bfd_getb16 ((char *) buf);
2102 else
2103 insn |= bfd_getl16 ((char *) buf);
2104 buf += 2;
2105 }
2106 return insn;
2107 }
2108
2109 /* Write microMIPS or MIPS16 instruction INSN to BUF, given that the
2110 instruction is LENGTH bytes long. Return a pointer to the next byte. */
2111
2112 static char *
2113 write_compressed_insn (char *buf, unsigned int insn, unsigned int length)
2114 {
2115 unsigned int i;
2116
2117 for (i = 0; i < length; i += 2)
2118 md_number_to_chars (buf + i, insn >> ((length - i - 2) * 8), 2);
2119 return buf + length;
2120 }
2121
2122 /* Install INSN at the location specified by its "frag" and "where" fields. */
2123
2124 static void
2125 install_insn (const struct mips_cl_insn *insn)
2126 {
2127 char *f = insn->frag->fr_literal + insn->where;
2128 if (HAVE_CODE_COMPRESSION)
2129 write_compressed_insn (f, insn->insn_opcode, insn_length (insn));
2130 else
2131 write_insn (f, insn->insn_opcode);
2132 mips_record_compressed_mode ();
2133 }
2134
2135 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
2136 and install the opcode in the new location. */
2137
2138 static void
2139 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
2140 {
2141 size_t i;
2142
2143 insn->frag = frag;
2144 insn->where = where;
2145 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
2146 if (insn->fixp[i] != NULL)
2147 {
2148 insn->fixp[i]->fx_frag = frag;
2149 insn->fixp[i]->fx_where = where;
2150 }
2151 install_insn (insn);
2152 }
2153
2154 /* Add INSN to the end of the output. */
2155
2156 static void
2157 add_fixed_insn (struct mips_cl_insn *insn)
2158 {
2159 char *f = frag_more (insn_length (insn));
2160 move_insn (insn, frag_now, f - frag_now->fr_literal);
2161 }
2162
2163 /* Start a variant frag and move INSN to the start of the variant part,
2164 marking it as fixed. The other arguments are as for frag_var. */
2165
2166 static void
2167 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
2168 relax_substateT subtype, symbolS *symbol, offsetT offset)
2169 {
2170 frag_grow (max_chars);
2171 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
2172 insn->fixed_p = 1;
2173 frag_var (rs_machine_dependent, max_chars, var,
2174 subtype, symbol, offset, NULL);
2175 }
2176
2177 /* Insert N copies of INSN into the history buffer, starting at
2178 position FIRST. Neither FIRST nor N need to be clipped. */
2179
2180 static void
2181 insert_into_history (unsigned int first, unsigned int n,
2182 const struct mips_cl_insn *insn)
2183 {
2184 if (mips_relax.sequence != 2)
2185 {
2186 unsigned int i;
2187
2188 for (i = ARRAY_SIZE (history); i-- > first;)
2189 if (i >= first + n)
2190 history[i] = history[i - n];
2191 else
2192 history[i] = *insn;
2193 }
2194 }
2195
2196 /* Initialize vr4120_conflicts. There is a bit of duplication here:
2197 the idea is to make it obvious at a glance that each errata is
2198 included. */
2199
2200 static void
2201 init_vr4120_conflicts (void)
2202 {
2203 #define CONFLICT(FIRST, SECOND) \
2204 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
2205
2206 /* Errata 21 - [D]DIV[U] after [D]MACC */
2207 CONFLICT (MACC, DIV);
2208 CONFLICT (DMACC, DIV);
2209
2210 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
2211 CONFLICT (DMULT, DMULT);
2212 CONFLICT (DMULT, DMACC);
2213 CONFLICT (DMACC, DMULT);
2214 CONFLICT (DMACC, DMACC);
2215
2216 /* Errata 24 - MT{LO,HI} after [D]MACC */
2217 CONFLICT (MACC, MTHILO);
2218 CONFLICT (DMACC, MTHILO);
2219
2220 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
2221 instruction is executed immediately after a MACC or DMACC
2222 instruction, the result of [either instruction] is incorrect." */
2223 CONFLICT (MACC, MULT);
2224 CONFLICT (MACC, DMULT);
2225 CONFLICT (DMACC, MULT);
2226 CONFLICT (DMACC, DMULT);
2227
2228 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
2229 executed immediately after a DMULT, DMULTU, DIV, DIVU,
2230 DDIV or DDIVU instruction, the result of the MACC or
2231 DMACC instruction is incorrect.". */
2232 CONFLICT (DMULT, MACC);
2233 CONFLICT (DMULT, DMACC);
2234 CONFLICT (DIV, MACC);
2235 CONFLICT (DIV, DMACC);
2236
2237 #undef CONFLICT
2238 }
2239
2240 struct regname {
2241 const char *name;
2242 unsigned int num;
2243 };
2244
2245 #define RTYPE_MASK 0x1ff00
2246 #define RTYPE_NUM 0x00100
2247 #define RTYPE_FPU 0x00200
2248 #define RTYPE_FCC 0x00400
2249 #define RTYPE_VEC 0x00800
2250 #define RTYPE_GP 0x01000
2251 #define RTYPE_CP0 0x02000
2252 #define RTYPE_PC 0x04000
2253 #define RTYPE_ACC 0x08000
2254 #define RTYPE_CCC 0x10000
2255 #define RNUM_MASK 0x000ff
2256 #define RWARN 0x80000
2257
2258 #define GENERIC_REGISTER_NUMBERS \
2259 {"$0", RTYPE_NUM | 0}, \
2260 {"$1", RTYPE_NUM | 1}, \
2261 {"$2", RTYPE_NUM | 2}, \
2262 {"$3", RTYPE_NUM | 3}, \
2263 {"$4", RTYPE_NUM | 4}, \
2264 {"$5", RTYPE_NUM | 5}, \
2265 {"$6", RTYPE_NUM | 6}, \
2266 {"$7", RTYPE_NUM | 7}, \
2267 {"$8", RTYPE_NUM | 8}, \
2268 {"$9", RTYPE_NUM | 9}, \
2269 {"$10", RTYPE_NUM | 10}, \
2270 {"$11", RTYPE_NUM | 11}, \
2271 {"$12", RTYPE_NUM | 12}, \
2272 {"$13", RTYPE_NUM | 13}, \
2273 {"$14", RTYPE_NUM | 14}, \
2274 {"$15", RTYPE_NUM | 15}, \
2275 {"$16", RTYPE_NUM | 16}, \
2276 {"$17", RTYPE_NUM | 17}, \
2277 {"$18", RTYPE_NUM | 18}, \
2278 {"$19", RTYPE_NUM | 19}, \
2279 {"$20", RTYPE_NUM | 20}, \
2280 {"$21", RTYPE_NUM | 21}, \
2281 {"$22", RTYPE_NUM | 22}, \
2282 {"$23", RTYPE_NUM | 23}, \
2283 {"$24", RTYPE_NUM | 24}, \
2284 {"$25", RTYPE_NUM | 25}, \
2285 {"$26", RTYPE_NUM | 26}, \
2286 {"$27", RTYPE_NUM | 27}, \
2287 {"$28", RTYPE_NUM | 28}, \
2288 {"$29", RTYPE_NUM | 29}, \
2289 {"$30", RTYPE_NUM | 30}, \
2290 {"$31", RTYPE_NUM | 31}
2291
2292 #define FPU_REGISTER_NAMES \
2293 {"$f0", RTYPE_FPU | 0}, \
2294 {"$f1", RTYPE_FPU | 1}, \
2295 {"$f2", RTYPE_FPU | 2}, \
2296 {"$f3", RTYPE_FPU | 3}, \
2297 {"$f4", RTYPE_FPU | 4}, \
2298 {"$f5", RTYPE_FPU | 5}, \
2299 {"$f6", RTYPE_FPU | 6}, \
2300 {"$f7", RTYPE_FPU | 7}, \
2301 {"$f8", RTYPE_FPU | 8}, \
2302 {"$f9", RTYPE_FPU | 9}, \
2303 {"$f10", RTYPE_FPU | 10}, \
2304 {"$f11", RTYPE_FPU | 11}, \
2305 {"$f12", RTYPE_FPU | 12}, \
2306 {"$f13", RTYPE_FPU | 13}, \
2307 {"$f14", RTYPE_FPU | 14}, \
2308 {"$f15", RTYPE_FPU | 15}, \
2309 {"$f16", RTYPE_FPU | 16}, \
2310 {"$f17", RTYPE_FPU | 17}, \
2311 {"$f18", RTYPE_FPU | 18}, \
2312 {"$f19", RTYPE_FPU | 19}, \
2313 {"$f20", RTYPE_FPU | 20}, \
2314 {"$f21", RTYPE_FPU | 21}, \
2315 {"$f22", RTYPE_FPU | 22}, \
2316 {"$f23", RTYPE_FPU | 23}, \
2317 {"$f24", RTYPE_FPU | 24}, \
2318 {"$f25", RTYPE_FPU | 25}, \
2319 {"$f26", RTYPE_FPU | 26}, \
2320 {"$f27", RTYPE_FPU | 27}, \
2321 {"$f28", RTYPE_FPU | 28}, \
2322 {"$f29", RTYPE_FPU | 29}, \
2323 {"$f30", RTYPE_FPU | 30}, \
2324 {"$f31", RTYPE_FPU | 31}
2325
2326 #define FPU_CONDITION_CODE_NAMES \
2327 {"$fcc0", RTYPE_FCC | 0}, \
2328 {"$fcc1", RTYPE_FCC | 1}, \
2329 {"$fcc2", RTYPE_FCC | 2}, \
2330 {"$fcc3", RTYPE_FCC | 3}, \
2331 {"$fcc4", RTYPE_FCC | 4}, \
2332 {"$fcc5", RTYPE_FCC | 5}, \
2333 {"$fcc6", RTYPE_FCC | 6}, \
2334 {"$fcc7", RTYPE_FCC | 7}
2335
2336 #define COPROC_CONDITION_CODE_NAMES \
2337 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
2338 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
2339 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
2340 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
2341 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
2342 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
2343 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
2344 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
2345
2346 #define N32N64_SYMBOLIC_REGISTER_NAMES \
2347 {"$a4", RTYPE_GP | 8}, \
2348 {"$a5", RTYPE_GP | 9}, \
2349 {"$a6", RTYPE_GP | 10}, \
2350 {"$a7", RTYPE_GP | 11}, \
2351 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
2352 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
2353 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
2354 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
2355 {"$t0", RTYPE_GP | 12}, \
2356 {"$t1", RTYPE_GP | 13}, \
2357 {"$t2", RTYPE_GP | 14}, \
2358 {"$t3", RTYPE_GP | 15}
2359
2360 #define O32_SYMBOLIC_REGISTER_NAMES \
2361 {"$t0", RTYPE_GP | 8}, \
2362 {"$t1", RTYPE_GP | 9}, \
2363 {"$t2", RTYPE_GP | 10}, \
2364 {"$t3", RTYPE_GP | 11}, \
2365 {"$t4", RTYPE_GP | 12}, \
2366 {"$t5", RTYPE_GP | 13}, \
2367 {"$t6", RTYPE_GP | 14}, \
2368 {"$t7", RTYPE_GP | 15}, \
2369 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
2370 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
2371 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
2372 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
2373
2374 /* Remaining symbolic register names */
2375 #define SYMBOLIC_REGISTER_NAMES \
2376 {"$zero", RTYPE_GP | 0}, \
2377 {"$at", RTYPE_GP | 1}, \
2378 {"$AT", RTYPE_GP | 1}, \
2379 {"$v0", RTYPE_GP | 2}, \
2380 {"$v1", RTYPE_GP | 3}, \
2381 {"$a0", RTYPE_GP | 4}, \
2382 {"$a1", RTYPE_GP | 5}, \
2383 {"$a2", RTYPE_GP | 6}, \
2384 {"$a3", RTYPE_GP | 7}, \
2385 {"$s0", RTYPE_GP | 16}, \
2386 {"$s1", RTYPE_GP | 17}, \
2387 {"$s2", RTYPE_GP | 18}, \
2388 {"$s3", RTYPE_GP | 19}, \
2389 {"$s4", RTYPE_GP | 20}, \
2390 {"$s5", RTYPE_GP | 21}, \
2391 {"$s6", RTYPE_GP | 22}, \
2392 {"$s7", RTYPE_GP | 23}, \
2393 {"$t8", RTYPE_GP | 24}, \
2394 {"$t9", RTYPE_GP | 25}, \
2395 {"$k0", RTYPE_GP | 26}, \
2396 {"$kt0", RTYPE_GP | 26}, \
2397 {"$k1", RTYPE_GP | 27}, \
2398 {"$kt1", RTYPE_GP | 27}, \
2399 {"$gp", RTYPE_GP | 28}, \
2400 {"$sp", RTYPE_GP | 29}, \
2401 {"$s8", RTYPE_GP | 30}, \
2402 {"$fp", RTYPE_GP | 30}, \
2403 {"$ra", RTYPE_GP | 31}
2404
2405 #define MIPS16_SPECIAL_REGISTER_NAMES \
2406 {"$pc", RTYPE_PC | 0}
2407
2408 #define MDMX_VECTOR_REGISTER_NAMES \
2409 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
2410 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
2411 {"$v2", RTYPE_VEC | 2}, \
2412 {"$v3", RTYPE_VEC | 3}, \
2413 {"$v4", RTYPE_VEC | 4}, \
2414 {"$v5", RTYPE_VEC | 5}, \
2415 {"$v6", RTYPE_VEC | 6}, \
2416 {"$v7", RTYPE_VEC | 7}, \
2417 {"$v8", RTYPE_VEC | 8}, \
2418 {"$v9", RTYPE_VEC | 9}, \
2419 {"$v10", RTYPE_VEC | 10}, \
2420 {"$v11", RTYPE_VEC | 11}, \
2421 {"$v12", RTYPE_VEC | 12}, \
2422 {"$v13", RTYPE_VEC | 13}, \
2423 {"$v14", RTYPE_VEC | 14}, \
2424 {"$v15", RTYPE_VEC | 15}, \
2425 {"$v16", RTYPE_VEC | 16}, \
2426 {"$v17", RTYPE_VEC | 17}, \
2427 {"$v18", RTYPE_VEC | 18}, \
2428 {"$v19", RTYPE_VEC | 19}, \
2429 {"$v20", RTYPE_VEC | 20}, \
2430 {"$v21", RTYPE_VEC | 21}, \
2431 {"$v22", RTYPE_VEC | 22}, \
2432 {"$v23", RTYPE_VEC | 23}, \
2433 {"$v24", RTYPE_VEC | 24}, \
2434 {"$v25", RTYPE_VEC | 25}, \
2435 {"$v26", RTYPE_VEC | 26}, \
2436 {"$v27", RTYPE_VEC | 27}, \
2437 {"$v28", RTYPE_VEC | 28}, \
2438 {"$v29", RTYPE_VEC | 29}, \
2439 {"$v30", RTYPE_VEC | 30}, \
2440 {"$v31", RTYPE_VEC | 31}
2441
2442 #define MIPS_DSP_ACCUMULATOR_NAMES \
2443 {"$ac0", RTYPE_ACC | 0}, \
2444 {"$ac1", RTYPE_ACC | 1}, \
2445 {"$ac2", RTYPE_ACC | 2}, \
2446 {"$ac3", RTYPE_ACC | 3}
2447
2448 static const struct regname reg_names[] = {
2449 GENERIC_REGISTER_NUMBERS,
2450 FPU_REGISTER_NAMES,
2451 FPU_CONDITION_CODE_NAMES,
2452 COPROC_CONDITION_CODE_NAMES,
2453
2454 /* The $txx registers depends on the abi,
2455 these will be added later into the symbol table from
2456 one of the tables below once mips_abi is set after
2457 parsing of arguments from the command line. */
2458 SYMBOLIC_REGISTER_NAMES,
2459
2460 MIPS16_SPECIAL_REGISTER_NAMES,
2461 MDMX_VECTOR_REGISTER_NAMES,
2462 MIPS_DSP_ACCUMULATOR_NAMES,
2463 {0, 0}
2464 };
2465
2466 static const struct regname reg_names_o32[] = {
2467 O32_SYMBOLIC_REGISTER_NAMES,
2468 {0, 0}
2469 };
2470
2471 static const struct regname reg_names_n32n64[] = {
2472 N32N64_SYMBOLIC_REGISTER_NAMES,
2473 {0, 0}
2474 };
2475
2476 /* Check if S points at a valid register specifier according to TYPES.
2477 If so, then return 1, advance S to consume the specifier and store
2478 the register's number in REGNOP, otherwise return 0. */
2479
2480 static int
2481 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2482 {
2483 symbolS *symbolP;
2484 char *e;
2485 char save_c;
2486 int reg = -1;
2487
2488 /* Find end of name. */
2489 e = *s;
2490 if (is_name_beginner (*e))
2491 ++e;
2492 while (is_part_of_name (*e))
2493 ++e;
2494
2495 /* Terminate name. */
2496 save_c = *e;
2497 *e = '\0';
2498
2499 /* Look for a register symbol. */
2500 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2501 {
2502 int r = S_GET_VALUE (symbolP);
2503 if (r & types)
2504 reg = r & RNUM_MASK;
2505 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2506 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
2507 reg = (r & RNUM_MASK) - 2;
2508 }
2509 /* Else see if this is a register defined in an itbl entry. */
2510 else if ((types & RTYPE_GP) && itbl_have_entries)
2511 {
2512 char *n = *s;
2513 unsigned long r;
2514
2515 if (*n == '$')
2516 ++n;
2517 if (itbl_get_reg_val (n, &r))
2518 reg = r & RNUM_MASK;
2519 }
2520
2521 /* Advance to next token if a register was recognised. */
2522 if (reg >= 0)
2523 *s = e;
2524 else if (types & RWARN)
2525 as_warn (_("Unrecognized register name `%s'"), *s);
2526
2527 *e = save_c;
2528 if (regnop)
2529 *regnop = reg;
2530 return reg >= 0;
2531 }
2532
2533 /* Check if S points at a valid register list according to TYPES.
2534 If so, then return 1, advance S to consume the list and store
2535 the registers present on the list as a bitmask of ones in REGLISTP,
2536 otherwise return 0. A valid list comprises a comma-separated
2537 enumeration of valid single registers and/or dash-separated
2538 contiguous register ranges as determined by their numbers.
2539
2540 As a special exception if one of s0-s7 registers is specified as
2541 the range's lower delimiter and s8 (fp) is its upper one, then no
2542 registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2543 are selected; they have to be listed separately if needed. */
2544
2545 static int
2546 reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2547 {
2548 unsigned int reglist = 0;
2549 unsigned int lastregno;
2550 bfd_boolean ok = TRUE;
2551 unsigned int regmask;
2552 char *s_endlist = *s;
2553 char *s_reset = *s;
2554 unsigned int regno;
2555
2556 while (reg_lookup (s, types, &regno))
2557 {
2558 lastregno = regno;
2559 if (**s == '-')
2560 {
2561 (*s)++;
2562 ok = reg_lookup (s, types, &lastregno);
2563 if (ok && lastregno < regno)
2564 ok = FALSE;
2565 if (!ok)
2566 break;
2567 }
2568
2569 if (lastregno == FP && regno >= S0 && regno <= S7)
2570 {
2571 lastregno = S7;
2572 reglist |= 1 << FP;
2573 }
2574 regmask = 1 << lastregno;
2575 regmask = (regmask << 1) - 1;
2576 regmask ^= (1 << regno) - 1;
2577 reglist |= regmask;
2578
2579 s_endlist = *s;
2580 if (**s != ',')
2581 break;
2582 (*s)++;
2583 }
2584
2585 if (ok)
2586 *s = s_endlist;
2587 else
2588 *s = s_reset;
2589 if (reglistp)
2590 *reglistp = reglist;
2591 return ok && reglist != 0;
2592 }
2593
2594 /* Return TRUE if opcode MO is valid on the currently selected ISA, ASE
2595 and architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
2596
2597 static bfd_boolean
2598 is_opcode_valid (const struct mips_opcode *mo)
2599 {
2600 int isa = mips_opts.isa;
2601 int ase = mips_opts.ase;
2602 int fp_s, fp_d;
2603 unsigned int i;
2604
2605 if (ISA_HAS_64BIT_REGS (mips_opts.isa))
2606 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
2607 if ((ase & mips_ases[i].flags) == mips_ases[i].flags)
2608 ase |= mips_ases[i].flags64;
2609
2610 if (!opcode_is_member (mo, isa, ase, mips_opts.arch))
2611 return FALSE;
2612
2613 /* Check whether the instruction or macro requires single-precision or
2614 double-precision floating-point support. Note that this information is
2615 stored differently in the opcode table for insns and macros. */
2616 if (mo->pinfo == INSN_MACRO)
2617 {
2618 fp_s = mo->pinfo2 & INSN2_M_FP_S;
2619 fp_d = mo->pinfo2 & INSN2_M_FP_D;
2620 }
2621 else
2622 {
2623 fp_s = mo->pinfo & FP_S;
2624 fp_d = mo->pinfo & FP_D;
2625 }
2626
2627 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2628 return FALSE;
2629
2630 if (fp_s && mips_opts.soft_float)
2631 return FALSE;
2632
2633 return TRUE;
2634 }
2635
2636 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
2637 selected ISA and architecture. */
2638
2639 static bfd_boolean
2640 is_opcode_valid_16 (const struct mips_opcode *mo)
2641 {
2642 return opcode_is_member (mo, mips_opts.isa, 0, mips_opts.arch);
2643 }
2644
2645 /* Return TRUE if the size of the microMIPS opcode MO matches one
2646 explicitly requested. Always TRUE in the standard MIPS mode. */
2647
2648 static bfd_boolean
2649 is_size_valid (const struct mips_opcode *mo)
2650 {
2651 if (!mips_opts.micromips)
2652 return TRUE;
2653
2654 if (mips_opts.insn32)
2655 {
2656 if (mo->pinfo != INSN_MACRO && micromips_insn_length (mo) != 4)
2657 return FALSE;
2658 if ((mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0)
2659 return FALSE;
2660 }
2661 if (!forced_insn_length)
2662 return TRUE;
2663 if (mo->pinfo == INSN_MACRO)
2664 return FALSE;
2665 return forced_insn_length == micromips_insn_length (mo);
2666 }
2667
2668 /* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2669 of the preceding instruction. Always TRUE in the standard MIPS mode.
2670
2671 We don't accept macros in 16-bit delay slots to avoid a case where
2672 a macro expansion fails because it relies on a preceding 32-bit real
2673 instruction to have matched and does not handle the operands correctly.
2674 The only macros that may expand to 16-bit instructions are JAL that
2675 cannot be placed in a delay slot anyway, and corner cases of BALIGN
2676 and BGT (that likewise cannot be placed in a delay slot) that decay to
2677 a NOP. In all these cases the macros precede any corresponding real
2678 instruction definitions in the opcode table, so they will match in the
2679 second pass where the size of the delay slot is ignored and therefore
2680 produce correct code. */
2681
2682 static bfd_boolean
2683 is_delay_slot_valid (const struct mips_opcode *mo)
2684 {
2685 if (!mips_opts.micromips)
2686 return TRUE;
2687
2688 if (mo->pinfo == INSN_MACRO)
2689 return (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) == 0;
2690 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2691 && micromips_insn_length (mo) != 4)
2692 return FALSE;
2693 if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2694 && micromips_insn_length (mo) != 2)
2695 return FALSE;
2696
2697 return TRUE;
2698 }
2699
2700 /* This function is called once, at assembler startup time. It should set up
2701 all the tables, etc. that the MD part of the assembler will need. */
2702
2703 void
2704 md_begin (void)
2705 {
2706 const char *retval = NULL;
2707 int i = 0;
2708 int broken = 0;
2709
2710 if (mips_pic != NO_PIC)
2711 {
2712 if (g_switch_seen && g_switch_value != 0)
2713 as_bad (_("-G may not be used in position-independent code"));
2714 g_switch_value = 0;
2715 }
2716
2717 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2718 as_warn (_("Could not set architecture and machine"));
2719
2720 op_hash = hash_new ();
2721
2722 for (i = 0; i < NUMOPCODES;)
2723 {
2724 const char *name = mips_opcodes[i].name;
2725
2726 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2727 if (retval != NULL)
2728 {
2729 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2730 mips_opcodes[i].name, retval);
2731 /* Probably a memory allocation problem? Give up now. */
2732 as_fatal (_("Broken assembler. No assembly attempted."));
2733 }
2734 do
2735 {
2736 if (mips_opcodes[i].pinfo != INSN_MACRO)
2737 {
2738 if (!validate_mips_insn (&mips_opcodes[i]))
2739 broken = 1;
2740 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2741 {
2742 create_insn (&nop_insn, mips_opcodes + i);
2743 if (mips_fix_loongson2f_nop)
2744 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2745 nop_insn.fixed_p = 1;
2746 }
2747 }
2748 ++i;
2749 }
2750 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2751 }
2752
2753 mips16_op_hash = hash_new ();
2754
2755 i = 0;
2756 while (i < bfd_mips16_num_opcodes)
2757 {
2758 const char *name = mips16_opcodes[i].name;
2759
2760 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2761 if (retval != NULL)
2762 as_fatal (_("internal: can't hash `%s': %s"),
2763 mips16_opcodes[i].name, retval);
2764 do
2765 {
2766 if (mips16_opcodes[i].pinfo != INSN_MACRO
2767 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2768 != mips16_opcodes[i].match))
2769 {
2770 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2771 mips16_opcodes[i].name, mips16_opcodes[i].args);
2772 broken = 1;
2773 }
2774 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2775 {
2776 create_insn (&mips16_nop_insn, mips16_opcodes + i);
2777 mips16_nop_insn.fixed_p = 1;
2778 }
2779 ++i;
2780 }
2781 while (i < bfd_mips16_num_opcodes
2782 && strcmp (mips16_opcodes[i].name, name) == 0);
2783 }
2784
2785 micromips_op_hash = hash_new ();
2786
2787 i = 0;
2788 while (i < bfd_micromips_num_opcodes)
2789 {
2790 const char *name = micromips_opcodes[i].name;
2791
2792 retval = hash_insert (micromips_op_hash, name,
2793 (void *) &micromips_opcodes[i]);
2794 if (retval != NULL)
2795 as_fatal (_("internal: can't hash `%s': %s"),
2796 micromips_opcodes[i].name, retval);
2797 do
2798 if (micromips_opcodes[i].pinfo != INSN_MACRO)
2799 {
2800 struct mips_cl_insn *micromips_nop_insn;
2801
2802 if (!validate_micromips_insn (&micromips_opcodes[i]))
2803 broken = 1;
2804
2805 if (micromips_insn_length (micromips_opcodes + i) == 2)
2806 micromips_nop_insn = &micromips_nop16_insn;
2807 else if (micromips_insn_length (micromips_opcodes + i) == 4)
2808 micromips_nop_insn = &micromips_nop32_insn;
2809 else
2810 continue;
2811
2812 if (micromips_nop_insn->insn_mo == NULL
2813 && strcmp (name, "nop") == 0)
2814 {
2815 create_insn (micromips_nop_insn, micromips_opcodes + i);
2816 micromips_nop_insn->fixed_p = 1;
2817 }
2818 }
2819 while (++i < bfd_micromips_num_opcodes
2820 && strcmp (micromips_opcodes[i].name, name) == 0);
2821 }
2822
2823 if (broken)
2824 as_fatal (_("Broken assembler. No assembly attempted."));
2825
2826 /* We add all the general register names to the symbol table. This
2827 helps us detect invalid uses of them. */
2828 for (i = 0; reg_names[i].name; i++)
2829 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2830 reg_names[i].num, /* & RNUM_MASK, */
2831 &zero_address_frag));
2832 if (HAVE_NEWABI)
2833 for (i = 0; reg_names_n32n64[i].name; i++)
2834 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2835 reg_names_n32n64[i].num, /* & RNUM_MASK, */
2836 &zero_address_frag));
2837 else
2838 for (i = 0; reg_names_o32[i].name; i++)
2839 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2840 reg_names_o32[i].num, /* & RNUM_MASK, */
2841 &zero_address_frag));
2842
2843 mips_no_prev_insn ();
2844
2845 mips_gprmask = 0;
2846 mips_cprmask[0] = 0;
2847 mips_cprmask[1] = 0;
2848 mips_cprmask[2] = 0;
2849 mips_cprmask[3] = 0;
2850
2851 /* set the default alignment for the text section (2**2) */
2852 record_alignment (text_section, 2);
2853
2854 bfd_set_gp_size (stdoutput, g_switch_value);
2855
2856 /* On a native system other than VxWorks, sections must be aligned
2857 to 16 byte boundaries. When configured for an embedded ELF
2858 target, we don't bother. */
2859 if (strncmp (TARGET_OS, "elf", 3) != 0
2860 && strncmp (TARGET_OS, "vxworks", 7) != 0)
2861 {
2862 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2863 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2864 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2865 }
2866
2867 /* Create a .reginfo section for register masks and a .mdebug
2868 section for debugging information. */
2869 {
2870 segT seg;
2871 subsegT subseg;
2872 flagword flags;
2873 segT sec;
2874
2875 seg = now_seg;
2876 subseg = now_subseg;
2877
2878 /* The ABI says this section should be loaded so that the
2879 running program can access it. However, we don't load it
2880 if we are configured for an embedded target */
2881 flags = SEC_READONLY | SEC_DATA;
2882 if (strncmp (TARGET_OS, "elf", 3) != 0)
2883 flags |= SEC_ALLOC | SEC_LOAD;
2884
2885 if (mips_abi != N64_ABI)
2886 {
2887 sec = subseg_new (".reginfo", (subsegT) 0);
2888
2889 bfd_set_section_flags (stdoutput, sec, flags);
2890 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2891
2892 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2893 }
2894 else
2895 {
2896 /* The 64-bit ABI uses a .MIPS.options section rather than
2897 .reginfo section. */
2898 sec = subseg_new (".MIPS.options", (subsegT) 0);
2899 bfd_set_section_flags (stdoutput, sec, flags);
2900 bfd_set_section_alignment (stdoutput, sec, 3);
2901
2902 /* Set up the option header. */
2903 {
2904 Elf_Internal_Options opthdr;
2905 char *f;
2906
2907 opthdr.kind = ODK_REGINFO;
2908 opthdr.size = (sizeof (Elf_External_Options)
2909 + sizeof (Elf64_External_RegInfo));
2910 opthdr.section = 0;
2911 opthdr.info = 0;
2912 f = frag_more (sizeof (Elf_External_Options));
2913 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2914 (Elf_External_Options *) f);
2915
2916 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2917 }
2918 }
2919
2920 if (ECOFF_DEBUGGING)
2921 {
2922 sec = subseg_new (".mdebug", (subsegT) 0);
2923 (void) bfd_set_section_flags (stdoutput, sec,
2924 SEC_HAS_CONTENTS | SEC_READONLY);
2925 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2926 }
2927 else if (mips_flag_pdr)
2928 {
2929 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2930 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2931 SEC_READONLY | SEC_RELOC
2932 | SEC_DEBUGGING);
2933 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2934 }
2935
2936 subseg_set (seg, subseg);
2937 }
2938
2939 if (! ECOFF_DEBUGGING)
2940 md_obj_begin ();
2941
2942 if (mips_fix_vr4120)
2943 init_vr4120_conflicts ();
2944 }
2945
2946 void
2947 md_mips_end (void)
2948 {
2949 mips_emit_delays ();
2950 if (! ECOFF_DEBUGGING)
2951 md_obj_end ();
2952 }
2953
2954 void
2955 md_assemble (char *str)
2956 {
2957 struct mips_cl_insn insn;
2958 bfd_reloc_code_real_type unused_reloc[3]
2959 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2960
2961 imm_expr.X_op = O_absent;
2962 imm2_expr.X_op = O_absent;
2963 offset_expr.X_op = O_absent;
2964 imm_reloc[0] = BFD_RELOC_UNUSED;
2965 imm_reloc[1] = BFD_RELOC_UNUSED;
2966 imm_reloc[2] = BFD_RELOC_UNUSED;
2967 offset_reloc[0] = BFD_RELOC_UNUSED;
2968 offset_reloc[1] = BFD_RELOC_UNUSED;
2969 offset_reloc[2] = BFD_RELOC_UNUSED;
2970
2971 mips_mark_labels ();
2972 mips_assembling_insn = TRUE;
2973
2974 if (mips_opts.mips16)
2975 mips16_ip (str, &insn);
2976 else
2977 {
2978 mips_ip (str, &insn);
2979 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2980 str, insn.insn_opcode));
2981 }
2982
2983 if (insn_error)
2984 as_bad ("%s `%s'", insn_error, str);
2985 else if (insn.insn_mo->pinfo == INSN_MACRO)
2986 {
2987 macro_start ();
2988 if (mips_opts.mips16)
2989 mips16_macro (&insn);
2990 else
2991 macro (&insn, str);
2992 macro_end ();
2993 }
2994 else
2995 {
2996 if (imm_expr.X_op != O_absent)
2997 append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2998 else if (offset_expr.X_op != O_absent)
2999 append_insn (&insn, &offset_expr, offset_reloc, FALSE);
3000 else
3001 append_insn (&insn, NULL, unused_reloc, FALSE);
3002 }
3003
3004 mips_assembling_insn = FALSE;
3005 }
3006
3007 /* Convenience functions for abstracting away the differences between
3008 MIPS16 and non-MIPS16 relocations. */
3009
3010 static inline bfd_boolean
3011 mips16_reloc_p (bfd_reloc_code_real_type reloc)
3012 {
3013 switch (reloc)
3014 {
3015 case BFD_RELOC_MIPS16_JMP:
3016 case BFD_RELOC_MIPS16_GPREL:
3017 case BFD_RELOC_MIPS16_GOT16:
3018 case BFD_RELOC_MIPS16_CALL16:
3019 case BFD_RELOC_MIPS16_HI16_S:
3020 case BFD_RELOC_MIPS16_HI16:
3021 case BFD_RELOC_MIPS16_LO16:
3022 return TRUE;
3023
3024 default:
3025 return FALSE;
3026 }
3027 }
3028
3029 static inline bfd_boolean
3030 micromips_reloc_p (bfd_reloc_code_real_type reloc)
3031 {
3032 switch (reloc)
3033 {
3034 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3035 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3036 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3037 case BFD_RELOC_MICROMIPS_GPREL16:
3038 case BFD_RELOC_MICROMIPS_JMP:
3039 case BFD_RELOC_MICROMIPS_HI16:
3040 case BFD_RELOC_MICROMIPS_HI16_S:
3041 case BFD_RELOC_MICROMIPS_LO16:
3042 case BFD_RELOC_MICROMIPS_LITERAL:
3043 case BFD_RELOC_MICROMIPS_GOT16:
3044 case BFD_RELOC_MICROMIPS_CALL16:
3045 case BFD_RELOC_MICROMIPS_GOT_HI16:
3046 case BFD_RELOC_MICROMIPS_GOT_LO16:
3047 case BFD_RELOC_MICROMIPS_CALL_HI16:
3048 case BFD_RELOC_MICROMIPS_CALL_LO16:
3049 case BFD_RELOC_MICROMIPS_SUB:
3050 case BFD_RELOC_MICROMIPS_GOT_PAGE:
3051 case BFD_RELOC_MICROMIPS_GOT_OFST:
3052 case BFD_RELOC_MICROMIPS_GOT_DISP:
3053 case BFD_RELOC_MICROMIPS_HIGHEST:
3054 case BFD_RELOC_MICROMIPS_HIGHER:
3055 case BFD_RELOC_MICROMIPS_SCN_DISP:
3056 case BFD_RELOC_MICROMIPS_JALR:
3057 return TRUE;
3058
3059 default:
3060 return FALSE;
3061 }
3062 }
3063
3064 static inline bfd_boolean
3065 jmp_reloc_p (bfd_reloc_code_real_type reloc)
3066 {
3067 return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
3068 }
3069
3070 static inline bfd_boolean
3071 got16_reloc_p (bfd_reloc_code_real_type reloc)
3072 {
3073 return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
3074 || reloc == BFD_RELOC_MICROMIPS_GOT16);
3075 }
3076
3077 static inline bfd_boolean
3078 hi16_reloc_p (bfd_reloc_code_real_type reloc)
3079 {
3080 return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
3081 || reloc == BFD_RELOC_MICROMIPS_HI16_S);
3082 }
3083
3084 static inline bfd_boolean
3085 lo16_reloc_p (bfd_reloc_code_real_type reloc)
3086 {
3087 return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
3088 || reloc == BFD_RELOC_MICROMIPS_LO16);
3089 }
3090
3091 static inline bfd_boolean
3092 jalr_reloc_p (bfd_reloc_code_real_type reloc)
3093 {
3094 return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
3095 }
3096
3097 /* Return true if RELOC is a PC-relative relocation that does not have
3098 full address range. */
3099
3100 static inline bfd_boolean
3101 limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
3102 {
3103 switch (reloc)
3104 {
3105 case BFD_RELOC_16_PCREL_S2:
3106 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
3107 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
3108 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
3109 return TRUE;
3110
3111 case BFD_RELOC_32_PCREL:
3112 return HAVE_64BIT_ADDRESSES;
3113
3114 default:
3115 return FALSE;
3116 }
3117 }
3118
3119 /* Return true if the given relocation might need a matching %lo().
3120 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
3121 need a matching %lo() when applied to local symbols. */
3122
3123 static inline bfd_boolean
3124 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
3125 {
3126 return (HAVE_IN_PLACE_ADDENDS
3127 && (hi16_reloc_p (reloc)
3128 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
3129 all GOT16 relocations evaluate to "G". */
3130 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
3131 }
3132
3133 /* Return the type of %lo() reloc needed by RELOC, given that
3134 reloc_needs_lo_p. */
3135
3136 static inline bfd_reloc_code_real_type
3137 matching_lo_reloc (bfd_reloc_code_real_type reloc)
3138 {
3139 return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
3140 : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
3141 : BFD_RELOC_LO16));
3142 }
3143
3144 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
3145 relocation. */
3146
3147 static inline bfd_boolean
3148 fixup_has_matching_lo_p (fixS *fixp)
3149 {
3150 return (fixp->fx_next != NULL
3151 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
3152 && fixp->fx_addsy == fixp->fx_next->fx_addsy
3153 && fixp->fx_offset == fixp->fx_next->fx_offset);
3154 }
3155
3156 /* This function returns true if modifying a register requires a
3157 delay. */
3158
3159 static int
3160 reg_needs_delay (unsigned int reg)
3161 {
3162 unsigned long prev_pinfo;
3163
3164 prev_pinfo = history[0].insn_mo->pinfo;
3165 if (! mips_opts.noreorder
3166 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
3167 && ! gpr_interlocks)
3168 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
3169 && ! cop_interlocks)))
3170 {
3171 /* A load from a coprocessor or from memory. All load delays
3172 delay the use of general register rt for one instruction. */
3173 /* Itbl support may require additional care here. */
3174 know (prev_pinfo & INSN_WRITE_GPR_T);
3175 if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
3176 return 1;
3177 }
3178
3179 return 0;
3180 }
3181
3182 /* Move all labels in LABELS to the current insertion point. TEXT_P
3183 says whether the labels refer to text or data. */
3184
3185 static void
3186 mips_move_labels (struct insn_label_list *labels, bfd_boolean text_p)
3187 {
3188 struct insn_label_list *l;
3189 valueT val;
3190
3191 for (l = labels; l != NULL; l = l->next)
3192 {
3193 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
3194 symbol_set_frag (l->label, frag_now);
3195 val = (valueT) frag_now_fix ();
3196 /* MIPS16/microMIPS text labels are stored as odd. */
3197 if (text_p && HAVE_CODE_COMPRESSION)
3198 ++val;
3199 S_SET_VALUE (l->label, val);
3200 }
3201 }
3202
3203 /* Move all labels in insn_labels to the current insertion point
3204 and treat them as text labels. */
3205
3206 static void
3207 mips_move_text_labels (void)
3208 {
3209 mips_move_labels (seg_info (now_seg)->label_list, TRUE);
3210 }
3211
3212 static bfd_boolean
3213 s_is_linkonce (symbolS *sym, segT from_seg)
3214 {
3215 bfd_boolean linkonce = FALSE;
3216 segT symseg = S_GET_SEGMENT (sym);
3217
3218 if (symseg != from_seg && !S_IS_LOCAL (sym))
3219 {
3220 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
3221 linkonce = TRUE;
3222 /* The GNU toolchain uses an extension for ELF: a section
3223 beginning with the magic string .gnu.linkonce is a
3224 linkonce section. */
3225 if (strncmp (segment_name (symseg), ".gnu.linkonce",
3226 sizeof ".gnu.linkonce" - 1) == 0)
3227 linkonce = TRUE;
3228 }
3229 return linkonce;
3230 }
3231
3232 /* Mark MIPS16 or microMIPS instruction label LABEL. This permits the
3233 linker to handle them specially, such as generating jalx instructions
3234 when needed. We also make them odd for the duration of the assembly,
3235 in order to generate the right sort of code. We will make them even
3236 in the adjust_symtab routine, while leaving them marked. This is
3237 convenient for the debugger and the disassembler. The linker knows
3238 to make them odd again. */
3239
3240 static void
3241 mips_compressed_mark_label (symbolS *label)
3242 {
3243 gas_assert (HAVE_CODE_COMPRESSION);
3244
3245 if (mips_opts.mips16)
3246 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
3247 else
3248 S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
3249 if ((S_GET_VALUE (label) & 1) == 0
3250 /* Don't adjust the address if the label is global or weak, or
3251 in a link-once section, since we'll be emitting symbol reloc
3252 references to it which will be patched up by the linker, and
3253 the final value of the symbol may or may not be MIPS16/microMIPS. */
3254 && !S_IS_WEAK (label)
3255 && !S_IS_EXTERNAL (label)
3256 && !s_is_linkonce (label, now_seg))
3257 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
3258 }
3259
3260 /* Mark preceding MIPS16 or microMIPS instruction labels. */
3261
3262 static void
3263 mips_compressed_mark_labels (void)
3264 {
3265 struct insn_label_list *l;
3266
3267 for (l = seg_info (now_seg)->label_list; l != NULL; l = l->next)
3268 mips_compressed_mark_label (l->label);
3269 }
3270
3271 /* End the current frag. Make it a variant frag and record the
3272 relaxation info. */
3273
3274 static void
3275 relax_close_frag (void)
3276 {
3277 mips_macro_warning.first_frag = frag_now;
3278 frag_var (rs_machine_dependent, 0, 0,
3279 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
3280 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
3281
3282 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
3283 mips_relax.first_fixup = 0;
3284 }
3285
3286 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
3287 See the comment above RELAX_ENCODE for more details. */
3288
3289 static void
3290 relax_start (symbolS *symbol)
3291 {
3292 gas_assert (mips_relax.sequence == 0);
3293 mips_relax.sequence = 1;
3294 mips_relax.symbol = symbol;
3295 }
3296
3297 /* Start generating the second version of a relaxable sequence.
3298 See the comment above RELAX_ENCODE for more details. */
3299
3300 static void
3301 relax_switch (void)
3302 {
3303 gas_assert (mips_relax.sequence == 1);
3304 mips_relax.sequence = 2;
3305 }
3306
3307 /* End the current relaxable sequence. */
3308
3309 static void
3310 relax_end (void)
3311 {
3312 gas_assert (mips_relax.sequence == 2);
3313 relax_close_frag ();
3314 mips_relax.sequence = 0;
3315 }
3316
3317 /* Return true if IP is a delayed branch or jump. */
3318
3319 static inline bfd_boolean
3320 delayed_branch_p (const struct mips_cl_insn *ip)
3321 {
3322 return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3323 | INSN_COND_BRANCH_DELAY
3324 | INSN_COND_BRANCH_LIKELY)) != 0;
3325 }
3326
3327 /* Return true if IP is a compact branch or jump. */
3328
3329 static inline bfd_boolean
3330 compact_branch_p (const struct mips_cl_insn *ip)
3331 {
3332 if (mips_opts.mips16)
3333 return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3334 | MIPS16_INSN_COND_BRANCH)) != 0;
3335 else
3336 return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
3337 | INSN2_COND_BRANCH)) != 0;
3338 }
3339
3340 /* Return true if IP is an unconditional branch or jump. */
3341
3342 static inline bfd_boolean
3343 uncond_branch_p (const struct mips_cl_insn *ip)
3344 {
3345 return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
3346 || (mips_opts.mips16
3347 ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
3348 : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
3349 }
3350
3351 /* Return true if IP is a branch-likely instruction. */
3352
3353 static inline bfd_boolean
3354 branch_likely_p (const struct mips_cl_insn *ip)
3355 {
3356 return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
3357 }
3358
3359 /* Return the type of nop that should be used to fill the delay slot
3360 of delayed branch IP. */
3361
3362 static struct mips_cl_insn *
3363 get_delay_slot_nop (const struct mips_cl_insn *ip)
3364 {
3365 if (mips_opts.micromips
3366 && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
3367 return &micromips_nop32_insn;
3368 return NOP_INSN;
3369 }
3370
3371 /* Return the mask of core registers that IP reads or writes. */
3372
3373 static unsigned int
3374 gpr_mod_mask (const struct mips_cl_insn *ip)
3375 {
3376 unsigned long pinfo2;
3377 unsigned int mask;
3378
3379 mask = 0;
3380 pinfo2 = ip->insn_mo->pinfo2;
3381 if (mips_opts.micromips)
3382 {
3383 if (pinfo2 & INSN2_MOD_GPR_MD)
3384 mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
3385 if (pinfo2 & INSN2_MOD_GPR_MF)
3386 mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
3387 if (pinfo2 & INSN2_MOD_SP)
3388 mask |= 1 << SP;
3389 }
3390 return mask;
3391 }
3392
3393 /* Return the mask of core registers that IP reads. */
3394
3395 static unsigned int
3396 gpr_read_mask (const struct mips_cl_insn *ip)
3397 {
3398 unsigned long pinfo, pinfo2;
3399 unsigned int mask;
3400
3401 mask = gpr_mod_mask (ip);
3402 pinfo = ip->insn_mo->pinfo;
3403 pinfo2 = ip->insn_mo->pinfo2;
3404 if (mips_opts.mips16)
3405 {
3406 if (pinfo & MIPS16_INSN_READ_X)
3407 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3408 if (pinfo & MIPS16_INSN_READ_Y)
3409 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3410 if (pinfo & MIPS16_INSN_READ_T)
3411 mask |= 1 << TREG;
3412 if (pinfo & MIPS16_INSN_READ_SP)
3413 mask |= 1 << SP;
3414 if (pinfo & MIPS16_INSN_READ_31)
3415 mask |= 1 << RA;
3416 if (pinfo & MIPS16_INSN_READ_Z)
3417 mask |= 1 << (mips16_to_32_reg_map
3418 [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
3419 if (pinfo & MIPS16_INSN_READ_GPR_X)
3420 mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3421 }
3422 else
3423 {
3424 if (pinfo2 & INSN2_READ_GPR_D)
3425 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3426 if (pinfo & INSN_READ_GPR_T)
3427 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3428 if (pinfo & INSN_READ_GPR_S)
3429 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3430 if (pinfo2 & INSN2_READ_GP)
3431 mask |= 1 << GP;
3432 if (pinfo2 & INSN2_READ_GPR_31)
3433 mask |= 1 << RA;
3434 if (pinfo2 & INSN2_READ_GPR_Z)
3435 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3436 }
3437 if (mips_opts.micromips)
3438 {
3439 if (pinfo2 & INSN2_READ_GPR_MC)
3440 mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3441 if (pinfo2 & INSN2_READ_GPR_ME)
3442 mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3443 if (pinfo2 & INSN2_READ_GPR_MG)
3444 mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3445 if (pinfo2 & INSN2_READ_GPR_MJ)
3446 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3447 if (pinfo2 & INSN2_READ_GPR_MMN)
3448 {
3449 mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3450 mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3451 }
3452 if (pinfo2 & INSN2_READ_GPR_MP)
3453 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3454 if (pinfo2 & INSN2_READ_GPR_MQ)
3455 mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3456 }
3457 /* Don't include register 0. */
3458 return mask & ~1;
3459 }
3460
3461 /* Return the mask of core registers that IP writes. */
3462
3463 static unsigned int
3464 gpr_write_mask (const struct mips_cl_insn *ip)
3465 {
3466 unsigned long pinfo, pinfo2;
3467 unsigned int mask;
3468
3469 mask = gpr_mod_mask (ip);
3470 pinfo = ip->insn_mo->pinfo;
3471 pinfo2 = ip->insn_mo->pinfo2;
3472 if (mips_opts.mips16)
3473 {
3474 if (pinfo & MIPS16_INSN_WRITE_X)
3475 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3476 if (pinfo & MIPS16_INSN_WRITE_Y)
3477 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3478 if (pinfo & MIPS16_INSN_WRITE_Z)
3479 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3480 if (pinfo & MIPS16_INSN_WRITE_T)
3481 mask |= 1 << TREG;
3482 if (pinfo & MIPS16_INSN_WRITE_SP)
3483 mask |= 1 << SP;
3484 if (pinfo & MIPS16_INSN_WRITE_31)
3485 mask |= 1 << RA;
3486 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3487 mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3488 }
3489 else
3490 {
3491 if (pinfo & INSN_WRITE_GPR_D)
3492 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3493 if (pinfo & INSN_WRITE_GPR_T)
3494 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3495 if (pinfo & INSN_WRITE_GPR_S)
3496 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3497 if (pinfo & INSN_WRITE_GPR_31)
3498 mask |= 1 << RA;
3499 if (pinfo2 & INSN2_WRITE_GPR_Z)
3500 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3501 }
3502 if (mips_opts.micromips)
3503 {
3504 if (pinfo2 & INSN2_WRITE_GPR_MB)
3505 mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3506 if (pinfo2 & INSN2_WRITE_GPR_MHI)
3507 {
3508 mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3509 mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3510 }
3511 if (pinfo2 & INSN2_WRITE_GPR_MJ)
3512 mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3513 if (pinfo2 & INSN2_WRITE_GPR_MP)
3514 mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3515 }
3516 /* Don't include register 0. */
3517 return mask & ~1;
3518 }
3519
3520 /* Return the mask of floating-point registers that IP reads. */
3521
3522 static unsigned int
3523 fpr_read_mask (const struct mips_cl_insn *ip)
3524 {
3525 unsigned long pinfo, pinfo2;
3526 unsigned int mask;
3527
3528 mask = 0;
3529 pinfo = ip->insn_mo->pinfo;
3530 pinfo2 = ip->insn_mo->pinfo2;
3531 if (!mips_opts.mips16)
3532 {
3533 if (pinfo2 & INSN2_READ_FPR_D)
3534 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3535 if (pinfo & INSN_READ_FPR_S)
3536 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3537 if (pinfo & INSN_READ_FPR_T)
3538 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3539 if (pinfo & INSN_READ_FPR_R)
3540 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3541 if (pinfo2 & INSN2_READ_FPR_Z)
3542 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3543 }
3544 /* Conservatively treat all operands to an FP_D instruction are doubles.
3545 (This is overly pessimistic for things like cvt.d.s.) */
3546 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3547 mask |= mask << 1;
3548 return mask;
3549 }
3550
3551 /* Return the mask of floating-point registers that IP writes. */
3552
3553 static unsigned int
3554 fpr_write_mask (const struct mips_cl_insn *ip)
3555 {
3556 unsigned long pinfo, pinfo2;
3557 unsigned int mask;
3558
3559 mask = 0;
3560 pinfo = ip->insn_mo->pinfo;
3561 pinfo2 = ip->insn_mo->pinfo2;
3562 if (!mips_opts.mips16)
3563 {
3564 if (pinfo & INSN_WRITE_FPR_D)
3565 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3566 if (pinfo & INSN_WRITE_FPR_S)
3567 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3568 if (pinfo & INSN_WRITE_FPR_T)
3569 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3570 if (pinfo2 & INSN2_WRITE_FPR_Z)
3571 mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3572 }
3573 /* Conservatively treat all operands to an FP_D instruction are doubles.
3574 (This is overly pessimistic for things like cvt.s.d.) */
3575 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3576 mask |= mask << 1;
3577 return mask;
3578 }
3579
3580 /* Classify an instruction according to the FIX_VR4120_* enumeration.
3581 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3582 by VR4120 errata. */
3583
3584 static unsigned int
3585 classify_vr4120_insn (const char *name)
3586 {
3587 if (strncmp (name, "macc", 4) == 0)
3588 return FIX_VR4120_MACC;
3589 if (strncmp (name, "dmacc", 5) == 0)
3590 return FIX_VR4120_DMACC;
3591 if (strncmp (name, "mult", 4) == 0)
3592 return FIX_VR4120_MULT;
3593 if (strncmp (name, "dmult", 5) == 0)
3594 return FIX_VR4120_DMULT;
3595 if (strstr (name, "div"))
3596 return FIX_VR4120_DIV;
3597 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3598 return FIX_VR4120_MTHILO;
3599 return NUM_FIX_VR4120_CLASSES;
3600 }
3601
3602 #define INSN_ERET 0x42000018
3603 #define INSN_DERET 0x4200001f
3604
3605 /* Return the number of instructions that must separate INSN1 and INSN2,
3606 where INSN1 is the earlier instruction. Return the worst-case value
3607 for any INSN2 if INSN2 is null. */
3608
3609 static unsigned int
3610 insns_between (const struct mips_cl_insn *insn1,
3611 const struct mips_cl_insn *insn2)
3612 {
3613 unsigned long pinfo1, pinfo2;
3614 unsigned int mask;
3615
3616 /* This function needs to know which pinfo flags are set for INSN2
3617 and which registers INSN2 uses. The former is stored in PINFO2 and
3618 the latter is tested via INSN2_USES_GPR. If INSN2 is null, PINFO2
3619 will have every flag set and INSN2_USES_GPR will always return true. */
3620 pinfo1 = insn1->insn_mo->pinfo;
3621 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3622
3623 #define INSN2_USES_GPR(REG) \
3624 (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3625
3626 /* For most targets, write-after-read dependencies on the HI and LO
3627 registers must be separated by at least two instructions. */
3628 if (!hilo_interlocks)
3629 {
3630 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3631 return 2;
3632 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3633 return 2;
3634 }
3635
3636 /* If we're working around r7000 errata, there must be two instructions
3637 between an mfhi or mflo and any instruction that uses the result. */
3638 if (mips_7000_hilo_fix
3639 && !mips_opts.micromips
3640 && MF_HILO_INSN (pinfo1)
3641 && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3642 return 2;
3643
3644 /* If we're working around 24K errata, one instruction is required
3645 if an ERET or DERET is followed by a branch instruction. */
3646 if (mips_fix_24k && !mips_opts.micromips)
3647 {
3648 if (insn1->insn_opcode == INSN_ERET
3649 || insn1->insn_opcode == INSN_DERET)
3650 {
3651 if (insn2 == NULL
3652 || insn2->insn_opcode == INSN_ERET
3653 || insn2->insn_opcode == INSN_DERET
3654 || delayed_branch_p (insn2))
3655 return 1;
3656 }
3657 }
3658
3659 /* If working around VR4120 errata, check for combinations that need
3660 a single intervening instruction. */
3661 if (mips_fix_vr4120 && !mips_opts.micromips)
3662 {
3663 unsigned int class1, class2;
3664
3665 class1 = classify_vr4120_insn (insn1->insn_mo->name);
3666 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3667 {
3668 if (insn2 == NULL)
3669 return 1;
3670 class2 = classify_vr4120_insn (insn2->insn_mo->name);
3671 if (vr4120_conflicts[class1] & (1 << class2))
3672 return 1;
3673 }
3674 }
3675
3676 if (!HAVE_CODE_COMPRESSION)
3677 {
3678 /* Check for GPR or coprocessor load delays. All such delays
3679 are on the RT register. */
3680 /* Itbl support may require additional care here. */
3681 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3682 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3683 {
3684 know (pinfo1 & INSN_WRITE_GPR_T);
3685 if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3686 return 1;
3687 }
3688
3689 /* Check for generic coprocessor hazards.
3690
3691 This case is not handled very well. There is no special
3692 knowledge of CP0 handling, and the coprocessors other than
3693 the floating point unit are not distinguished at all. */
3694 /* Itbl support may require additional care here. FIXME!
3695 Need to modify this to include knowledge about
3696 user specified delays! */
3697 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3698 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3699 {
3700 /* Handle cases where INSN1 writes to a known general coprocessor
3701 register. There must be a one instruction delay before INSN2
3702 if INSN2 reads that register, otherwise no delay is needed. */
3703 mask = fpr_write_mask (insn1);
3704 if (mask != 0)
3705 {
3706 if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3707 return 1;
3708 }
3709 else
3710 {
3711 /* Read-after-write dependencies on the control registers
3712 require a two-instruction gap. */
3713 if ((pinfo1 & INSN_WRITE_COND_CODE)
3714 && (pinfo2 & INSN_READ_COND_CODE))
3715 return 2;
3716
3717 /* We don't know exactly what INSN1 does. If INSN2 is
3718 also a coprocessor instruction, assume there must be
3719 a one instruction gap. */
3720 if (pinfo2 & INSN_COP)
3721 return 1;
3722 }
3723 }
3724
3725 /* Check for read-after-write dependencies on the coprocessor
3726 control registers in cases where INSN1 does not need a general
3727 coprocessor delay. This means that INSN1 is a floating point
3728 comparison instruction. */
3729 /* Itbl support may require additional care here. */
3730 else if (!cop_interlocks
3731 && (pinfo1 & INSN_WRITE_COND_CODE)
3732 && (pinfo2 & INSN_READ_COND_CODE))
3733 return 1;
3734 }
3735
3736 #undef INSN2_USES_GPR
3737
3738 return 0;
3739 }
3740
3741 /* Return the number of nops that would be needed to work around the
3742 VR4130 mflo/mfhi errata if instruction INSN immediately followed
3743 the MAX_VR4130_NOPS instructions described by HIST. Ignore hazards
3744 that are contained within the first IGNORE instructions of HIST. */
3745
3746 static int
3747 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3748 const struct mips_cl_insn *insn)
3749 {
3750 int i, j;
3751 unsigned int mask;
3752
3753 /* Check if the instruction writes to HI or LO. MTHI and MTLO
3754 are not affected by the errata. */
3755 if (insn != 0
3756 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3757 || strcmp (insn->insn_mo->name, "mtlo") == 0
3758 || strcmp (insn->insn_mo->name, "mthi") == 0))
3759 return 0;
3760
3761 /* Search for the first MFLO or MFHI. */
3762 for (i = 0; i < MAX_VR4130_NOPS; i++)
3763 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3764 {
3765 /* Extract the destination register. */
3766 mask = gpr_write_mask (&hist[i]);
3767
3768 /* No nops are needed if INSN reads that register. */
3769 if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3770 return 0;
3771
3772 /* ...or if any of the intervening instructions do. */
3773 for (j = 0; j < i; j++)
3774 if (gpr_read_mask (&hist[j]) & mask)
3775 return 0;
3776
3777 if (i >= ignore)
3778 return MAX_VR4130_NOPS - i;
3779 }
3780 return 0;
3781 }
3782
3783 #define BASE_REG_EQ(INSN1, INSN2) \
3784 ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3785 == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3786
3787 /* Return the minimum alignment for this store instruction. */
3788
3789 static int
3790 fix_24k_align_to (const struct mips_opcode *mo)
3791 {
3792 if (strcmp (mo->name, "sh") == 0)
3793 return 2;
3794
3795 if (strcmp (mo->name, "swc1") == 0
3796 || strcmp (mo->name, "swc2") == 0
3797 || strcmp (mo->name, "sw") == 0
3798 || strcmp (mo->name, "sc") == 0
3799 || strcmp (mo->name, "s.s") == 0)
3800 return 4;
3801
3802 if (strcmp (mo->name, "sdc1") == 0
3803 || strcmp (mo->name, "sdc2") == 0
3804 || strcmp (mo->name, "s.d") == 0)
3805 return 8;
3806
3807 /* sb, swl, swr */
3808 return 1;
3809 }
3810
3811 struct fix_24k_store_info
3812 {
3813 /* Immediate offset, if any, for this store instruction. */
3814 short off;
3815 /* Alignment required by this store instruction. */
3816 int align_to;
3817 /* True for register offsets. */
3818 int register_offset;
3819 };
3820
3821 /* Comparison function used by qsort. */
3822
3823 static int
3824 fix_24k_sort (const void *a, const void *b)
3825 {
3826 const struct fix_24k_store_info *pos1 = a;
3827 const struct fix_24k_store_info *pos2 = b;
3828
3829 return (pos1->off - pos2->off);
3830 }
3831
3832 /* INSN is a store instruction. Try to record the store information
3833 in STINFO. Return false if the information isn't known. */
3834
3835 static bfd_boolean
3836 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3837 const struct mips_cl_insn *insn)
3838 {
3839 /* The instruction must have a known offset. */
3840 if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3841 return FALSE;
3842
3843 stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3844 stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3845 return TRUE;
3846 }
3847
3848 /* Return the number of nops that would be needed to work around the 24k
3849 "lost data on stores during refill" errata if instruction INSN
3850 immediately followed the 2 instructions described by HIST.
3851 Ignore hazards that are contained within the first IGNORE
3852 instructions of HIST.
3853
3854 Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3855 for the data cache refills and store data. The following describes
3856 the scenario where the store data could be lost.
3857
3858 * A data cache miss, due to either a load or a store, causing fill
3859 data to be supplied by the memory subsystem
3860 * The first three doublewords of fill data are returned and written
3861 into the cache
3862 * A sequence of four stores occurs in consecutive cycles around the
3863 final doubleword of the fill:
3864 * Store A
3865 * Store B
3866 * Store C
3867 * Zero, One or more instructions
3868 * Store D
3869
3870 The four stores A-D must be to different doublewords of the line that
3871 is being filled. The fourth instruction in the sequence above permits
3872 the fill of the final doubleword to be transferred from the FSB into
3873 the cache. In the sequence above, the stores may be either integer
3874 (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3875 swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3876 different doublewords on the line. If the floating point unit is
3877 running in 1:2 mode, it is not possible to create the sequence above
3878 using only floating point store instructions.
3879
3880 In this case, the cache line being filled is incorrectly marked
3881 invalid, thereby losing the data from any store to the line that
3882 occurs between the original miss and the completion of the five
3883 cycle sequence shown above.
3884
3885 The workarounds are:
3886
3887 * Run the data cache in write-through mode.
3888 * Insert a non-store instruction between
3889 Store A and Store B or Store B and Store C. */
3890
3891 static int
3892 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3893 const struct mips_cl_insn *insn)
3894 {
3895 struct fix_24k_store_info pos[3];
3896 int align, i, base_offset;
3897
3898 if (ignore >= 2)
3899 return 0;
3900
3901 /* If the previous instruction wasn't a store, there's nothing to
3902 worry about. */
3903 if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3904 return 0;
3905
3906 /* If the instructions after the previous one are unknown, we have
3907 to assume the worst. */
3908 if (!insn)
3909 return 1;
3910
3911 /* Check whether we are dealing with three consecutive stores. */
3912 if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3913 || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3914 return 0;
3915
3916 /* If we don't know the relationship between the store addresses,
3917 assume the worst. */
3918 if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3919 || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3920 return 1;
3921
3922 if (!fix_24k_record_store_info (&pos[0], insn)
3923 || !fix_24k_record_store_info (&pos[1], &hist[0])
3924 || !fix_24k_record_store_info (&pos[2], &hist[1]))
3925 return 1;
3926
3927 qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3928
3929 /* Pick a value of ALIGN and X such that all offsets are adjusted by
3930 X bytes and such that the base register + X is known to be aligned
3931 to align bytes. */
3932
3933 if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3934 align = 8;
3935 else
3936 {
3937 align = pos[0].align_to;
3938 base_offset = pos[0].off;
3939 for (i = 1; i < 3; i++)
3940 if (align < pos[i].align_to)
3941 {
3942 align = pos[i].align_to;
3943 base_offset = pos[i].off;
3944 }
3945 for (i = 0; i < 3; i++)
3946 pos[i].off -= base_offset;
3947 }
3948
3949 pos[0].off &= ~align + 1;
3950 pos[1].off &= ~align + 1;
3951 pos[2].off &= ~align + 1;
3952
3953 /* If any two stores write to the same chunk, they also write to the
3954 same doubleword. The offsets are still sorted at this point. */
3955 if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3956 return 0;
3957
3958 /* A range of at least 9 bytes is needed for the stores to be in
3959 non-overlapping doublewords. */
3960 if (pos[2].off - pos[0].off <= 8)
3961 return 0;
3962
3963 if (pos[2].off - pos[1].off >= 24
3964 || pos[1].off - pos[0].off >= 24
3965 || pos[2].off - pos[0].off >= 32)
3966 return 0;
3967
3968 return 1;
3969 }
3970
3971 /* Return the number of nops that would be needed if instruction INSN
3972 immediately followed the MAX_NOPS instructions given by HIST,
3973 where HIST[0] is the most recent instruction. Ignore hazards
3974 between INSN and the first IGNORE instructions in HIST.
3975
3976 If INSN is null, return the worse-case number of nops for any
3977 instruction. */
3978
3979 static int
3980 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3981 const struct mips_cl_insn *insn)
3982 {
3983 int i, nops, tmp_nops;
3984
3985 nops = 0;
3986 for (i = ignore; i < MAX_DELAY_NOPS; i++)
3987 {
3988 tmp_nops = insns_between (hist + i, insn) - i;
3989 if (tmp_nops > nops)
3990 nops = tmp_nops;
3991 }
3992
3993 if (mips_fix_vr4130 && !mips_opts.micromips)
3994 {
3995 tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3996 if (tmp_nops > nops)
3997 nops = tmp_nops;
3998 }
3999
4000 if (mips_fix_24k && !mips_opts.micromips)
4001 {
4002 tmp_nops = nops_for_24k (ignore, hist, insn);
4003 if (tmp_nops > nops)
4004 nops = tmp_nops;
4005 }
4006
4007 return nops;
4008 }
4009
4010 /* The variable arguments provide NUM_INSNS extra instructions that
4011 might be added to HIST. Return the largest number of nops that
4012 would be needed after the extended sequence, ignoring hazards
4013 in the first IGNORE instructions. */
4014
4015 static int
4016 nops_for_sequence (int num_insns, int ignore,
4017 const struct mips_cl_insn *hist, ...)
4018 {
4019 va_list args;
4020 struct mips_cl_insn buffer[MAX_NOPS];
4021 struct mips_cl_insn *cursor;
4022 int nops;
4023
4024 va_start (args, hist);
4025 cursor = buffer + num_insns;
4026 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
4027 while (cursor > buffer)
4028 *--cursor = *va_arg (args, const struct mips_cl_insn *);
4029
4030 nops = nops_for_insn (ignore, buffer, NULL);
4031 va_end (args);
4032 return nops;
4033 }
4034
4035 /* Like nops_for_insn, but if INSN is a branch, take into account the
4036 worst-case delay for the branch target. */
4037
4038 static int
4039 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
4040 const struct mips_cl_insn *insn)
4041 {
4042 int nops, tmp_nops;
4043
4044 nops = nops_for_insn (ignore, hist, insn);
4045 if (delayed_branch_p (insn))
4046 {
4047 tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
4048 hist, insn, get_delay_slot_nop (insn));
4049 if (tmp_nops > nops)
4050 nops = tmp_nops;
4051 }
4052 else if (compact_branch_p (insn))
4053 {
4054 tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
4055 if (tmp_nops > nops)
4056 nops = tmp_nops;
4057 }
4058 return nops;
4059 }
4060
4061 /* Fix NOP issue: Replace nops by "or at,at,zero". */
4062
4063 static void
4064 fix_loongson2f_nop (struct mips_cl_insn * ip)
4065 {
4066 gas_assert (!HAVE_CODE_COMPRESSION);
4067 if (strcmp (ip->insn_mo->name, "nop") == 0)
4068 ip->insn_opcode = LOONGSON2F_NOP_INSN;
4069 }
4070
4071 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
4072 jr target pc &= 'hffff_ffff_cfff_ffff. */
4073
4074 static void
4075 fix_loongson2f_jump (struct mips_cl_insn * ip)
4076 {
4077 gas_assert (!HAVE_CODE_COMPRESSION);
4078 if (strcmp (ip->insn_mo->name, "j") == 0
4079 || strcmp (ip->insn_mo->name, "jr") == 0
4080 || strcmp (ip->insn_mo->name, "jalr") == 0)
4081 {
4082 int sreg;
4083 expressionS ep;
4084
4085 if (! mips_opts.at)
4086 return;
4087
4088 sreg = EXTRACT_OPERAND (0, RS, *ip);
4089 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
4090 return;
4091
4092 ep.X_op = O_constant;
4093 ep.X_add_number = 0xcfff0000;
4094 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
4095 ep.X_add_number = 0xffff;
4096 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
4097 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
4098 }
4099 }
4100
4101 static void
4102 fix_loongson2f (struct mips_cl_insn * ip)
4103 {
4104 if (mips_fix_loongson2f_nop)
4105 fix_loongson2f_nop (ip);
4106
4107 if (mips_fix_loongson2f_jump)
4108 fix_loongson2f_jump (ip);
4109 }
4110
4111 /* IP is a branch that has a delay slot, and we need to fill it
4112 automatically. Return true if we can do that by swapping IP
4113 with the previous instruction.
4114 ADDRESS_EXPR is an operand of the instruction to be used with
4115 RELOC_TYPE. */
4116
4117 static bfd_boolean
4118 can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
4119 bfd_reloc_code_real_type *reloc_type)
4120 {
4121 unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
4122 unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
4123
4124 /* -O2 and above is required for this optimization. */
4125 if (mips_optimize < 2)
4126 return FALSE;
4127
4128 /* If we have seen .set volatile or .set nomove, don't optimize. */
4129 if (mips_opts.nomove)
4130 return FALSE;
4131
4132 /* We can't swap if the previous instruction's position is fixed. */
4133 if (history[0].fixed_p)
4134 return FALSE;
4135
4136 /* If the previous previous insn was in a .set noreorder, we can't
4137 swap. Actually, the MIPS assembler will swap in this situation.
4138 However, gcc configured -with-gnu-as will generate code like
4139
4140 .set noreorder
4141 lw $4,XXX
4142 .set reorder
4143 INSN
4144 bne $4,$0,foo
4145
4146 in which we can not swap the bne and INSN. If gcc is not configured
4147 -with-gnu-as, it does not output the .set pseudo-ops. */
4148 if (history[1].noreorder_p)
4149 return FALSE;
4150
4151 /* If the previous instruction had a fixup in mips16 mode, we can not swap.
4152 This means that the previous instruction was a 4-byte one anyhow. */
4153 if (mips_opts.mips16 && history[0].fixp[0])
4154 return FALSE;
4155
4156 /* If the branch is itself the target of a branch, we can not swap.
4157 We cheat on this; all we check for is whether there is a label on
4158 this instruction. If there are any branches to anything other than
4159 a label, users must use .set noreorder. */
4160 if (seg_info (now_seg)->label_list)
4161 return FALSE;
4162
4163 /* If the previous instruction is in a variant frag other than this
4164 branch's one, we cannot do the swap. This does not apply to
4165 MIPS16 code, which uses variant frags for different purposes. */
4166 if (!mips_opts.mips16
4167 && history[0].frag
4168 && history[0].frag->fr_type == rs_machine_dependent)
4169 return FALSE;
4170
4171 /* We do not swap with instructions that cannot architecturally
4172 be placed in a branch delay slot, such as SYNC or ERET. We
4173 also refrain from swapping with a trap instruction, since it
4174 complicates trap handlers to have the trap instruction be in
4175 a delay slot. */
4176 prev_pinfo = history[0].insn_mo->pinfo;
4177 if (prev_pinfo & INSN_NO_DELAY_SLOT)
4178 return FALSE;
4179
4180 /* Check for conflicts between the branch and the instructions
4181 before the candidate delay slot. */
4182 if (nops_for_insn (0, history + 1, ip) > 0)
4183 return FALSE;
4184
4185 /* Check for conflicts between the swapped sequence and the
4186 target of the branch. */
4187 if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
4188 return FALSE;
4189
4190 /* If the branch reads a register that the previous
4191 instruction sets, we can not swap. */
4192 gpr_read = gpr_read_mask (ip);
4193 prev_gpr_write = gpr_write_mask (&history[0]);
4194 if (gpr_read & prev_gpr_write)
4195 return FALSE;
4196
4197 /* If the branch writes a register that the previous
4198 instruction sets, we can not swap. */
4199 gpr_write = gpr_write_mask (ip);
4200 if (gpr_write & prev_gpr_write)
4201 return FALSE;
4202
4203 /* If the branch writes a register that the previous
4204 instruction reads, we can not swap. */
4205 prev_gpr_read = gpr_read_mask (&history[0]);
4206 if (gpr_write & prev_gpr_read)
4207 return FALSE;
4208
4209 /* If one instruction sets a condition code and the
4210 other one uses a condition code, we can not swap. */
4211 pinfo = ip->insn_mo->pinfo;
4212 if ((pinfo & INSN_READ_COND_CODE)
4213 && (prev_pinfo & INSN_WRITE_COND_CODE))
4214 return FALSE;
4215 if ((pinfo & INSN_WRITE_COND_CODE)
4216 && (prev_pinfo & INSN_READ_COND_CODE))
4217 return FALSE;
4218
4219 /* If the previous instruction uses the PC, we can not swap. */
4220 prev_pinfo2 = history[0].insn_mo->pinfo2;
4221 if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
4222 return FALSE;
4223 if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
4224 return FALSE;
4225
4226 /* If the previous instruction has an incorrect size for a fixed
4227 branch delay slot in microMIPS mode, we cannot swap. */
4228 pinfo2 = ip->insn_mo->pinfo2;
4229 if (mips_opts.micromips
4230 && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
4231 && insn_length (history) != 2)
4232 return FALSE;
4233 if (mips_opts.micromips
4234 && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
4235 && insn_length (history) != 4)
4236 return FALSE;
4237
4238 /* On R5900 short loops need to be fixed by inserting a nop in
4239 the branch delay slots.
4240 A short loop can be terminated too early. */
4241 if (mips_opts.arch == CPU_R5900
4242 /* Check if instruction has a parameter, ignore "j $31". */
4243 && (address_expr != NULL)
4244 /* Parameter must be 16 bit. */
4245 && (*reloc_type == BFD_RELOC_16_PCREL_S2)
4246 /* Branch to same segment. */
4247 && (S_GET_SEGMENT(address_expr->X_add_symbol) == now_seg)
4248 /* Branch to same code fragment. */
4249 && (symbol_get_frag(address_expr->X_add_symbol) == frag_now)
4250 /* Can only calculate branch offset if value is known. */
4251 && symbol_constant_p(address_expr->X_add_symbol)
4252 /* Check if branch is really conditional. */
4253 && !((ip->insn_opcode & 0xffff0000) == 0x10000000 /* beq $0,$0 */
4254 || (ip->insn_opcode & 0xffff0000) == 0x04010000 /* bgez $0 */
4255 || (ip->insn_opcode & 0xffff0000) == 0x04110000)) /* bgezal $0 */
4256 {
4257 int distance;
4258 /* Check if loop is shorter than 6 instructions including
4259 branch and delay slot. */
4260 distance = frag_now_fix() - S_GET_VALUE(address_expr->X_add_symbol);
4261 if (distance <= 20)
4262 {
4263 int i;
4264 int rv;
4265
4266 rv = FALSE;
4267 /* When the loop includes branches or jumps,
4268 it is not a short loop. */
4269 for (i = 0; i < (distance / 4); i++)
4270 {
4271 if ((history[i].cleared_p)
4272 || delayed_branch_p(&history[i]))
4273 {
4274 rv = TRUE;
4275 break;
4276 }
4277 }
4278 if (rv == FALSE)
4279 {
4280 /* Insert nop after branch to fix short loop. */
4281 return FALSE;
4282 }
4283 }
4284 }
4285
4286 return TRUE;
4287 }
4288
4289 /* Decide how we should add IP to the instruction stream.
4290 ADDRESS_EXPR is an operand of the instruction to be used with
4291 RELOC_TYPE. */
4292
4293 static enum append_method
4294 get_append_method (struct mips_cl_insn *ip, expressionS *address_expr,
4295 bfd_reloc_code_real_type *reloc_type)
4296 {
4297 unsigned long pinfo;
4298
4299 /* The relaxed version of a macro sequence must be inherently
4300 hazard-free. */
4301 if (mips_relax.sequence == 2)
4302 return APPEND_ADD;
4303
4304 /* We must not dabble with instructions in a ".set norerorder" block. */
4305 if (mips_opts.noreorder)
4306 return APPEND_ADD;
4307
4308 /* Otherwise, it's our responsibility to fill branch delay slots. */
4309 if (delayed_branch_p (ip))
4310 {
4311 if (!branch_likely_p (ip)
4312 && can_swap_branch_p (ip, address_expr, reloc_type))
4313 return APPEND_SWAP;
4314
4315 pinfo = ip->insn_mo->pinfo;
4316 if (mips_opts.mips16
4317 && ISA_SUPPORTS_MIPS16E
4318 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
4319 return APPEND_ADD_COMPACT;
4320
4321 return APPEND_ADD_WITH_NOP;
4322 }
4323
4324 return APPEND_ADD;
4325 }
4326
4327 /* IP is a MIPS16 instruction whose opcode we have just changed.
4328 Point IP->insn_mo to the new opcode's definition. */
4329
4330 static void
4331 find_altered_mips16_opcode (struct mips_cl_insn *ip)
4332 {
4333 const struct mips_opcode *mo, *end;
4334
4335 end = &mips16_opcodes[bfd_mips16_num_opcodes];
4336 for (mo = ip->insn_mo; mo < end; mo++)
4337 if ((ip->insn_opcode & mo->mask) == mo->match)
4338 {
4339 ip->insn_mo = mo;
4340 return;
4341 }
4342 abort ();
4343 }
4344
4345 /* For microMIPS macros, we need to generate a local number label
4346 as the target of branches. */
4347 #define MICROMIPS_LABEL_CHAR '\037'
4348 static unsigned long micromips_target_label;
4349 static char micromips_target_name[32];
4350
4351 static char *
4352 micromips_label_name (void)
4353 {
4354 char *p = micromips_target_name;
4355 char symbol_name_temporary[24];
4356 unsigned long l;
4357 int i;
4358
4359 if (*p)
4360 return p;
4361
4362 i = 0;
4363 l = micromips_target_label;
4364 #ifdef LOCAL_LABEL_PREFIX
4365 *p++ = LOCAL_LABEL_PREFIX;
4366 #endif
4367 *p++ = 'L';
4368 *p++ = MICROMIPS_LABEL_CHAR;
4369 do
4370 {
4371 symbol_name_temporary[i++] = l % 10 + '0';
4372 l /= 10;
4373 }
4374 while (l != 0);
4375 while (i > 0)
4376 *p++ = symbol_name_temporary[--i];
4377 *p = '\0';
4378
4379 return micromips_target_name;
4380 }
4381
4382 static void
4383 micromips_label_expr (expressionS *label_expr)
4384 {
4385 label_expr->X_op = O_symbol;
4386 label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
4387 label_expr->X_add_number = 0;
4388 }
4389
4390 static void
4391 micromips_label_inc (void)
4392 {
4393 micromips_target_label++;
4394 *micromips_target_name = '\0';
4395 }
4396
4397 static void
4398 micromips_add_label (void)
4399 {
4400 symbolS *s;
4401
4402 s = colon (micromips_label_name ());
4403 micromips_label_inc ();
4404 S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
4405 }
4406
4407 /* If assembling microMIPS code, then return the microMIPS reloc
4408 corresponding to the requested one if any. Otherwise return
4409 the reloc unchanged. */
4410
4411 static bfd_reloc_code_real_type
4412 micromips_map_reloc (bfd_reloc_code_real_type reloc)
4413 {
4414 static const bfd_reloc_code_real_type relocs[][2] =
4415 {
4416 /* Keep sorted incrementally by the left-hand key. */
4417 { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
4418 { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
4419 { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
4420 { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
4421 { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
4422 { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
4423 { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
4424 { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
4425 { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
4426 { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
4427 { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
4428 { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
4429 { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
4430 { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
4431 { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
4432 { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
4433 { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
4434 { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
4435 { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
4436 { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
4437 { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
4438 { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
4439 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
4440 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
4441 { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
4442 { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
4443 { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
4444 };
4445 bfd_reloc_code_real_type r;
4446 size_t i;
4447
4448 if (!mips_opts.micromips)
4449 return reloc;
4450 for (i = 0; i < ARRAY_SIZE (relocs); i++)
4451 {
4452 r = relocs[i][0];
4453 if (r > reloc)
4454 return reloc;
4455 if (r == reloc)
4456 return relocs[i][1];
4457 }
4458 return reloc;
4459 }
4460
4461 /* Try to resolve relocation RELOC against constant OPERAND at assembly time.
4462 Return true on success, storing the resolved value in RESULT. */
4463
4464 static bfd_boolean
4465 calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
4466 offsetT *result)
4467 {
4468 switch (reloc)
4469 {
4470 case BFD_RELOC_MIPS_HIGHEST:
4471 case BFD_RELOC_MICROMIPS_HIGHEST:
4472 *result = ((operand + 0x800080008000ull) >> 48) & 0xffff;
4473 return TRUE;
4474
4475 case BFD_RELOC_MIPS_HIGHER:
4476 case BFD_RELOC_MICROMIPS_HIGHER:
4477 *result = ((operand + 0x80008000ull) >> 32) & 0xffff;
4478 return TRUE;
4479
4480 case BFD_RELOC_HI16_S:
4481 case BFD_RELOC_MICROMIPS_HI16_S:
4482 case BFD_RELOC_MIPS16_HI16_S:
4483 *result = ((operand + 0x8000) >> 16) & 0xffff;
4484 return TRUE;
4485
4486 case BFD_RELOC_HI16:
4487 case BFD_RELOC_MICROMIPS_HI16:
4488 case BFD_RELOC_MIPS16_HI16:
4489 *result = (operand >> 16) & 0xffff;
4490 return TRUE;
4491
4492 case BFD_RELOC_LO16:
4493 case BFD_RELOC_MICROMIPS_LO16:
4494 case BFD_RELOC_MIPS16_LO16:
4495 *result = operand & 0xffff;
4496 return TRUE;
4497
4498 case BFD_RELOC_UNUSED:
4499 *result = operand;
4500 return TRUE;
4501
4502 default:
4503 return FALSE;
4504 }
4505 }
4506
4507 /* Output an instruction. IP is the instruction information.
4508 ADDRESS_EXPR is an operand of the instruction to be used with
4509 RELOC_TYPE. EXPANSIONP is true if the instruction is part of
4510 a macro expansion. */
4511
4512 static void
4513 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
4514 bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
4515 {
4516 unsigned long prev_pinfo2, pinfo;
4517 bfd_boolean relaxed_branch = FALSE;
4518 enum append_method method;
4519 bfd_boolean relax32;
4520 int branch_disp;
4521
4522 if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
4523 fix_loongson2f (ip);
4524
4525 file_ase_mips16 |= mips_opts.mips16;
4526 file_ase_micromips |= mips_opts.micromips;
4527
4528 prev_pinfo2 = history[0].insn_mo->pinfo2;
4529 pinfo = ip->insn_mo->pinfo;
4530
4531 if (mips_opts.micromips
4532 && !expansionp
4533 && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4534 && micromips_insn_length (ip->insn_mo) != 2)
4535 || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4536 && micromips_insn_length (ip->insn_mo) != 4)))
4537 as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4538 (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4539
4540 if (address_expr == NULL)
4541 ip->complete_p = 1;
4542 else if (reloc_type[0] <= BFD_RELOC_UNUSED
4543 && reloc_type[1] == BFD_RELOC_UNUSED
4544 && reloc_type[2] == BFD_RELOC_UNUSED
4545 && address_expr->X_op == O_constant)
4546 {
4547 switch (*reloc_type)
4548 {
4549 case BFD_RELOC_MIPS_JMP:
4550 {
4551 int shift;
4552
4553 shift = mips_opts.micromips ? 1 : 2;
4554 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4555 as_bad (_("jump to misaligned address (0x%lx)"),
4556 (unsigned long) address_expr->X_add_number);
4557 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4558 & 0x3ffffff);
4559 ip->complete_p = 1;
4560 }
4561 break;
4562
4563 case BFD_RELOC_MIPS16_JMP:
4564 if ((address_expr->X_add_number & 3) != 0)
4565 as_bad (_("jump to misaligned address (0x%lx)"),
4566 (unsigned long) address_expr->X_add_number);
4567 ip->insn_opcode |=
4568 (((address_expr->X_add_number & 0x7c0000) << 3)
4569 | ((address_expr->X_add_number & 0xf800000) >> 7)
4570 | ((address_expr->X_add_number & 0x3fffc) >> 2));
4571 ip->complete_p = 1;
4572 break;
4573
4574 case BFD_RELOC_16_PCREL_S2:
4575 {
4576 int shift;
4577
4578 shift = mips_opts.micromips ? 1 : 2;
4579 if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4580 as_bad (_("branch to misaligned address (0x%lx)"),
4581 (unsigned long) address_expr->X_add_number);
4582 if (!mips_relax_branch)
4583 {
4584 if ((address_expr->X_add_number + (1 << (shift + 15)))
4585 & ~((1 << (shift + 16)) - 1))
4586 as_bad (_("branch address range overflow (0x%lx)"),
4587 (unsigned long) address_expr->X_add_number);
4588 ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4589 & 0xffff);
4590 }
4591 }
4592 break;
4593
4594 default:
4595 {
4596 offsetT value;
4597
4598 if (calculate_reloc (*reloc_type, address_expr->X_add_number,
4599 &value))
4600 {
4601 ip->insn_opcode |= value & 0xffff;
4602 ip->complete_p = 1;
4603 }
4604 }
4605 break;
4606 }
4607 }
4608
4609 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4610 {
4611 /* There are a lot of optimizations we could do that we don't.
4612 In particular, we do not, in general, reorder instructions.
4613 If you use gcc with optimization, it will reorder
4614 instructions and generally do much more optimization then we
4615 do here; repeating all that work in the assembler would only
4616 benefit hand written assembly code, and does not seem worth
4617 it. */
4618 int nops = (mips_optimize == 0
4619 ? nops_for_insn (0, history, NULL)
4620 : nops_for_insn_or_target (0, history, ip));
4621 if (nops > 0)
4622 {
4623 fragS *old_frag;
4624 unsigned long old_frag_offset;
4625 int i;
4626
4627 old_frag = frag_now;
4628 old_frag_offset = frag_now_fix ();
4629
4630 for (i = 0; i < nops; i++)
4631 add_fixed_insn (NOP_INSN);
4632 insert_into_history (0, nops, NOP_INSN);
4633
4634 if (listing)
4635 {
4636 listing_prev_line ();
4637 /* We may be at the start of a variant frag. In case we
4638 are, make sure there is enough space for the frag
4639 after the frags created by listing_prev_line. The
4640 argument to frag_grow here must be at least as large
4641 as the argument to all other calls to frag_grow in
4642 this file. We don't have to worry about being in the
4643 middle of a variant frag, because the variants insert
4644 all needed nop instructions themselves. */
4645 frag_grow (40);
4646 }
4647
4648 mips_move_text_labels ();
4649
4650 #ifndef NO_ECOFF_DEBUGGING
4651 if (ECOFF_DEBUGGING)
4652 ecoff_fix_loc (old_frag, old_frag_offset);
4653 #endif
4654 }
4655 }
4656 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4657 {
4658 int nops;
4659
4660 /* Work out how many nops in prev_nop_frag are needed by IP,
4661 ignoring hazards generated by the first prev_nop_frag_since
4662 instructions. */
4663 nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4664 gas_assert (nops <= prev_nop_frag_holds);
4665
4666 /* Enforce NOPS as a minimum. */
4667 if (nops > prev_nop_frag_required)
4668 prev_nop_frag_required = nops;
4669
4670 if (prev_nop_frag_holds == prev_nop_frag_required)
4671 {
4672 /* Settle for the current number of nops. Update the history
4673 accordingly (for the benefit of any future .set reorder code). */
4674 prev_nop_frag = NULL;
4675 insert_into_history (prev_nop_frag_since,
4676 prev_nop_frag_holds, NOP_INSN);
4677 }
4678 else
4679 {
4680 /* Allow this instruction to replace one of the nops that was
4681 tentatively added to prev_nop_frag. */
4682 prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4683 prev_nop_frag_holds--;
4684 prev_nop_frag_since++;
4685 }
4686 }
4687
4688 method = get_append_method (ip, address_expr, reloc_type);
4689 branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4690
4691 dwarf2_emit_insn (0);
4692 /* We want MIPS16 and microMIPS debug info to use ISA-encoded addresses,
4693 so "move" the instruction address accordingly.
4694
4695 Also, it doesn't seem appropriate for the assembler to reorder .loc
4696 entries. If this instruction is a branch that we are going to swap
4697 with the previous instruction, the two instructions should be
4698 treated as a unit, and the debug information for both instructions
4699 should refer to the start of the branch sequence. Using the
4700 current position is certainly wrong when swapping a 32-bit branch
4701 and a 16-bit delay slot, since the current position would then be
4702 in the middle of a branch. */
4703 dwarf2_move_insn ((HAVE_CODE_COMPRESSION ? 1 : 0) - branch_disp);
4704
4705 relax32 = (mips_relax_branch
4706 /* Don't try branch relaxation within .set nomacro, or within
4707 .set noat if we use $at for PIC computations. If it turns
4708 out that the branch was out-of-range, we'll get an error. */
4709 && !mips_opts.warn_about_macros
4710 && (mips_opts.at || mips_pic == NO_PIC)
4711 /* Don't relax BPOSGE32/64 or BC1ANY2T/F and BC1ANY4T/F
4712 as they have no complementing branches. */
4713 && !(ip->insn_mo->ase & (ASE_MIPS3D | ASE_DSP64 | ASE_DSP)));
4714
4715 if (!HAVE_CODE_COMPRESSION
4716 && address_expr
4717 && relax32
4718 && *reloc_type == BFD_RELOC_16_PCREL_S2
4719 && delayed_branch_p (ip))
4720 {
4721 relaxed_branch = TRUE;
4722 add_relaxed_insn (ip, (relaxed_branch_length
4723 (NULL, NULL,
4724 uncond_branch_p (ip) ? -1
4725 : branch_likely_p (ip) ? 1
4726 : 0)), 4,
4727 RELAX_BRANCH_ENCODE
4728 (AT,
4729 uncond_branch_p (ip),
4730 branch_likely_p (ip),
4731 pinfo & INSN_WRITE_GPR_31,
4732 0),
4733 address_expr->X_add_symbol,
4734 address_expr->X_add_number);
4735 *reloc_type = BFD_RELOC_UNUSED;
4736 }
4737 else if (mips_opts.micromips
4738 && address_expr
4739 && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4740 || *reloc_type > BFD_RELOC_UNUSED)
4741 && (delayed_branch_p (ip) || compact_branch_p (ip))
4742 /* Don't try branch relaxation when users specify
4743 16-bit/32-bit instructions. */
4744 && !forced_insn_length)
4745 {
4746 bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4747 int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4748 int uncond = uncond_branch_p (ip) ? -1 : 0;
4749 int compact = compact_branch_p (ip);
4750 int al = pinfo & INSN_WRITE_GPR_31;
4751 int length32;
4752
4753 gas_assert (address_expr != NULL);
4754 gas_assert (!mips_relax.sequence);
4755
4756 relaxed_branch = TRUE;
4757 length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4758 add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4759 RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4760 relax32, 0, 0),
4761 address_expr->X_add_symbol,
4762 address_expr->X_add_number);
4763 *reloc_type = BFD_RELOC_UNUSED;
4764 }
4765 else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4766 {
4767 /* We need to set up a variant frag. */
4768 gas_assert (address_expr != NULL);
4769 add_relaxed_insn (ip, 4, 0,
4770 RELAX_MIPS16_ENCODE
4771 (*reloc_type - BFD_RELOC_UNUSED,
4772 forced_insn_length == 2, forced_insn_length == 4,
4773 delayed_branch_p (&history[0]),
4774 history[0].mips16_absolute_jump_p),
4775 make_expr_symbol (address_expr), 0);
4776 }
4777 else if (mips_opts.mips16 && insn_length (ip) == 2)
4778 {
4779 if (!delayed_branch_p (ip))
4780 /* Make sure there is enough room to swap this instruction with
4781 a following jump instruction. */
4782 frag_grow (6);
4783 add_fixed_insn (ip);
4784 }
4785 else
4786 {
4787 if (mips_opts.mips16
4788 && mips_opts.noreorder
4789 && delayed_branch_p (&history[0]))
4790 as_warn (_("extended instruction in delay slot"));
4791
4792 if (mips_relax.sequence)
4793 {
4794 /* If we've reached the end of this frag, turn it into a variant
4795 frag and record the information for the instructions we've
4796 written so far. */
4797 if (frag_room () < 4)
4798 relax_close_frag ();
4799 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4800 }
4801
4802 if (mips_relax.sequence != 2)
4803 {
4804 if (mips_macro_warning.first_insn_sizes[0] == 0)
4805 mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4806 mips_macro_warning.sizes[0] += insn_length (ip);
4807 mips_macro_warning.insns[0]++;
4808 }
4809 if (mips_relax.sequence != 1)
4810 {
4811 if (mips_macro_warning.first_insn_sizes[1] == 0)
4812 mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4813 mips_macro_warning.sizes[1] += insn_length (ip);
4814 mips_macro_warning.insns[1]++;
4815 }
4816
4817 if (mips_opts.mips16)
4818 {
4819 ip->fixed_p = 1;
4820 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4821 }
4822 add_fixed_insn (ip);
4823 }
4824
4825 if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4826 {
4827 bfd_reloc_code_real_type final_type[3];
4828 reloc_howto_type *howto0;
4829 reloc_howto_type *howto;
4830 int i;
4831
4832 /* Perform any necessary conversion to microMIPS relocations
4833 and find out how many relocations there actually are. */
4834 for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4835 final_type[i] = micromips_map_reloc (reloc_type[i]);
4836
4837 /* In a compound relocation, it is the final (outermost)
4838 operator that determines the relocated field. */
4839 howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4840 if (!howto)
4841 abort ();
4842
4843 if (i > 1)
4844 howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4845 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4846 bfd_get_reloc_size (howto),
4847 address_expr,
4848 howto0 && howto0->pc_relative,
4849 final_type[0]);
4850
4851 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
4852 if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4853 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4854
4855 /* These relocations can have an addend that won't fit in
4856 4 octets for 64bit assembly. */
4857 if (HAVE_64BIT_GPRS
4858 && ! howto->partial_inplace
4859 && (reloc_type[0] == BFD_RELOC_16
4860 || reloc_type[0] == BFD_RELOC_32
4861 || reloc_type[0] == BFD_RELOC_MIPS_JMP
4862 || reloc_type[0] == BFD_RELOC_GPREL16
4863 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4864 || reloc_type[0] == BFD_RELOC_GPREL32
4865 || reloc_type[0] == BFD_RELOC_64
4866 || reloc_type[0] == BFD_RELOC_CTOR
4867 || reloc_type[0] == BFD_RELOC_MIPS_SUB
4868 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4869 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4870 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4871 || reloc_type[0] == BFD_RELOC_MIPS_REL16
4872 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4873 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4874 || hi16_reloc_p (reloc_type[0])
4875 || lo16_reloc_p (reloc_type[0])))
4876 ip->fixp[0]->fx_no_overflow = 1;
4877
4878 /* These relocations can have an addend that won't fit in 2 octets. */
4879 if (reloc_type[0] == BFD_RELOC_MICROMIPS_7_PCREL_S1
4880 || reloc_type[0] == BFD_RELOC_MICROMIPS_10_PCREL_S1)
4881 ip->fixp[0]->fx_no_overflow = 1;
4882
4883 if (mips_relax.sequence)
4884 {
4885 if (mips_relax.first_fixup == 0)
4886 mips_relax.first_fixup = ip->fixp[0];
4887 }
4888 else if (reloc_needs_lo_p (*reloc_type))
4889 {
4890 struct mips_hi_fixup *hi_fixup;
4891
4892 /* Reuse the last entry if it already has a matching %lo. */
4893 hi_fixup = mips_hi_fixup_list;
4894 if (hi_fixup == 0
4895 || !fixup_has_matching_lo_p (hi_fixup->fixp))
4896 {
4897 hi_fixup = ((struct mips_hi_fixup *)
4898 xmalloc (sizeof (struct mips_hi_fixup)));
4899 hi_fixup->next = mips_hi_fixup_list;
4900 mips_hi_fixup_list = hi_fixup;
4901 }
4902 hi_fixup->fixp = ip->fixp[0];
4903 hi_fixup->seg = now_seg;
4904 }
4905
4906 /* Add fixups for the second and third relocations, if given.
4907 Note that the ABI allows the second relocation to be
4908 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
4909 moment we only use RSS_UNDEF, but we could add support
4910 for the others if it ever becomes necessary. */
4911 for (i = 1; i < 3; i++)
4912 if (reloc_type[i] != BFD_RELOC_UNUSED)
4913 {
4914 ip->fixp[i] = fix_new (ip->frag, ip->where,
4915 ip->fixp[0]->fx_size, NULL, 0,
4916 FALSE, final_type[i]);
4917
4918 /* Use fx_tcbit to mark compound relocs. */
4919 ip->fixp[0]->fx_tcbit = 1;
4920 ip->fixp[i]->fx_tcbit = 1;
4921 }
4922 }
4923 install_insn (ip);
4924
4925 /* Update the register mask information. */
4926 mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4927 mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4928
4929 switch (method)
4930 {
4931 case APPEND_ADD:
4932 insert_into_history (0, 1, ip);
4933 break;
4934
4935 case APPEND_ADD_WITH_NOP:
4936 {
4937 struct mips_cl_insn *nop;
4938
4939 insert_into_history (0, 1, ip);
4940 nop = get_delay_slot_nop (ip);
4941 add_fixed_insn (nop);
4942 insert_into_history (0, 1, nop);
4943 if (mips_relax.sequence)
4944 mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4945 }
4946 break;
4947
4948 case APPEND_ADD_COMPACT:
4949 /* Convert MIPS16 jr/jalr into a "compact" jump. */
4950 gas_assert (mips_opts.mips16);
4951 ip->insn_opcode |= 0x0080;
4952 find_altered_mips16_opcode (ip);
4953 install_insn (ip);
4954 insert_into_history (0, 1, ip);
4955 break;
4956
4957 case APPEND_SWAP:
4958 {
4959 struct mips_cl_insn delay = history[0];
4960 if (mips_opts.mips16)
4961 {
4962 know (delay.frag == ip->frag);
4963 move_insn (ip, delay.frag, delay.where);
4964 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4965 }
4966 else if (relaxed_branch || delay.frag != ip->frag)
4967 {
4968 /* Add the delay slot instruction to the end of the
4969 current frag and shrink the fixed part of the
4970 original frag. If the branch occupies the tail of
4971 the latter, move it backwards to cover the gap. */
4972 delay.frag->fr_fix -= branch_disp;
4973 if (delay.frag == ip->frag)
4974 move_insn (ip, ip->frag, ip->where - branch_disp);
4975 add_fixed_insn (&delay);
4976 }
4977 else
4978 {
4979 move_insn (&delay, ip->frag,
4980 ip->where - branch_disp + insn_length (ip));
4981 move_insn (ip, history[0].frag, history[0].where);
4982 }
4983 history[0] = *ip;
4984 delay.fixed_p = 1;
4985 insert_into_history (0, 1, &delay);
4986 }
4987 break;
4988 }
4989
4990 /* If we have just completed an unconditional branch, clear the history. */
4991 if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4992 || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4993 {
4994 unsigned int i;
4995
4996 mips_no_prev_insn ();
4997
4998 for (i = 0; i < ARRAY_SIZE (history); i++)
4999 history[i].cleared_p = 1;
5000 }
5001
5002 /* We need to emit a label at the end of branch-likely macros. */
5003 if (emit_branch_likely_macro)
5004 {
5005 emit_branch_likely_macro = FALSE;
5006 micromips_add_label ();
5007 }
5008
5009 /* We just output an insn, so the next one doesn't have a label. */
5010 mips_clear_insn_labels ();
5011 }
5012
5013 /* Forget that there was any previous instruction or label.
5014 When BRANCH is true, the branch history is also flushed. */
5015
5016 static void
5017 mips_no_prev_insn (void)
5018 {
5019 prev_nop_frag = NULL;
5020 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
5021 mips_clear_insn_labels ();
5022 }
5023
5024 /* This function must be called before we emit something other than
5025 instructions. It is like mips_no_prev_insn except that it inserts
5026 any NOPS that might be needed by previous instructions. */
5027
5028 void
5029 mips_emit_delays (void)
5030 {
5031 if (! mips_opts.noreorder)
5032 {
5033 int nops = nops_for_insn (0, history, NULL);
5034 if (nops > 0)
5035 {
5036 while (nops-- > 0)
5037 add_fixed_insn (NOP_INSN);
5038 mips_move_text_labels ();
5039 }
5040 }
5041 mips_no_prev_insn ();
5042 }
5043
5044 /* Start a (possibly nested) noreorder block. */
5045
5046 static void
5047 start_noreorder (void)
5048 {
5049 if (mips_opts.noreorder == 0)
5050 {
5051 unsigned int i;
5052 int nops;
5053
5054 /* None of the instructions before the .set noreorder can be moved. */
5055 for (i = 0; i < ARRAY_SIZE (history); i++)
5056 history[i].fixed_p = 1;
5057
5058 /* Insert any nops that might be needed between the .set noreorder
5059 block and the previous instructions. We will later remove any
5060 nops that turn out not to be needed. */
5061 nops = nops_for_insn (0, history, NULL);
5062 if (nops > 0)
5063 {
5064 if (mips_optimize != 0)
5065 {
5066 /* Record the frag which holds the nop instructions, so
5067 that we can remove them if we don't need them. */
5068 frag_grow (nops * NOP_INSN_SIZE);
5069 prev_nop_frag = frag_now;
5070 prev_nop_frag_holds = nops;
5071 prev_nop_frag_required = 0;
5072 prev_nop_frag_since = 0;
5073 }
5074
5075 for (; nops > 0; --nops)
5076 add_fixed_insn (NOP_INSN);
5077
5078 /* Move on to a new frag, so that it is safe to simply
5079 decrease the size of prev_nop_frag. */
5080 frag_wane (frag_now);
5081 frag_new (0);
5082 mips_move_text_labels ();
5083 }
5084 mips_mark_labels ();
5085 mips_clear_insn_labels ();
5086 }
5087 mips_opts.noreorder++;
5088 mips_any_noreorder = 1;
5089 }
5090
5091 /* End a nested noreorder block. */
5092
5093 static void
5094 end_noreorder (void)
5095 {
5096 mips_opts.noreorder--;
5097 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
5098 {
5099 /* Commit to inserting prev_nop_frag_required nops and go back to
5100 handling nop insertion the .set reorder way. */
5101 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
5102 * NOP_INSN_SIZE);
5103 insert_into_history (prev_nop_frag_since,
5104 prev_nop_frag_required, NOP_INSN);
5105 prev_nop_frag = NULL;
5106 }
5107 }
5108
5109 /* Set up global variables for the start of a new macro. */
5110
5111 static void
5112 macro_start (void)
5113 {
5114 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
5115 memset (&mips_macro_warning.first_insn_sizes, 0,
5116 sizeof (mips_macro_warning.first_insn_sizes));
5117 memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
5118 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
5119 && delayed_branch_p (&history[0]));
5120 switch (history[0].insn_mo->pinfo2
5121 & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
5122 {
5123 case INSN2_BRANCH_DELAY_32BIT:
5124 mips_macro_warning.delay_slot_length = 4;
5125 break;
5126 case INSN2_BRANCH_DELAY_16BIT:
5127 mips_macro_warning.delay_slot_length = 2;
5128 break;
5129 default:
5130 mips_macro_warning.delay_slot_length = 0;
5131 break;
5132 }
5133 mips_macro_warning.first_frag = NULL;
5134 }
5135
5136 /* Given that a macro is longer than one instruction or of the wrong size,
5137 return the appropriate warning for it. Return null if no warning is
5138 needed. SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
5139 RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
5140 and RELAX_NOMACRO. */
5141
5142 static const char *
5143 macro_warning (relax_substateT subtype)
5144 {
5145 if (subtype & RELAX_DELAY_SLOT)
5146 return _("Macro instruction expanded into multiple instructions"
5147 " in a branch delay slot");
5148 else if (subtype & RELAX_NOMACRO)
5149 return _("Macro instruction expanded into multiple instructions");
5150 else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
5151 | RELAX_DELAY_SLOT_SIZE_SECOND))
5152 return ((subtype & RELAX_DELAY_SLOT_16BIT)
5153 ? _("Macro instruction expanded into a wrong size instruction"
5154 " in a 16-bit branch delay slot")
5155 : _("Macro instruction expanded into a wrong size instruction"
5156 " in a 32-bit branch delay slot"));
5157 else
5158 return 0;
5159 }
5160
5161 /* Finish up a macro. Emit warnings as appropriate. */
5162
5163 static void
5164 macro_end (void)
5165 {
5166 /* Relaxation warning flags. */
5167 relax_substateT subtype = 0;
5168
5169 /* Check delay slot size requirements. */
5170 if (mips_macro_warning.delay_slot_length == 2)
5171 subtype |= RELAX_DELAY_SLOT_16BIT;
5172 if (mips_macro_warning.delay_slot_length != 0)
5173 {
5174 if (mips_macro_warning.delay_slot_length
5175 != mips_macro_warning.first_insn_sizes[0])
5176 subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
5177 if (mips_macro_warning.delay_slot_length
5178 != mips_macro_warning.first_insn_sizes[1])
5179 subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
5180 }
5181
5182 /* Check instruction count requirements. */
5183 if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
5184 {
5185 if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
5186 subtype |= RELAX_SECOND_LONGER;
5187 if (mips_opts.warn_about_macros)
5188 subtype |= RELAX_NOMACRO;
5189 if (mips_macro_warning.delay_slot_p)
5190 subtype |= RELAX_DELAY_SLOT;
5191 }
5192
5193 /* If both alternatives fail to fill a delay slot correctly,
5194 emit the warning now. */
5195 if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
5196 && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
5197 {
5198 relax_substateT s;
5199 const char *msg;
5200
5201 s = subtype & (RELAX_DELAY_SLOT_16BIT
5202 | RELAX_DELAY_SLOT_SIZE_FIRST
5203 | RELAX_DELAY_SLOT_SIZE_SECOND);
5204 msg = macro_warning (s);
5205 if (msg != NULL)
5206 as_warn ("%s", msg);
5207 subtype &= ~s;
5208 }
5209
5210 /* If both implementations are longer than 1 instruction, then emit the
5211 warning now. */
5212 if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
5213 {
5214 relax_substateT s;
5215 const char *msg;
5216
5217 s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
5218 msg = macro_warning (s);
5219 if (msg != NULL)
5220 as_warn ("%s", msg);
5221 subtype &= ~s;
5222 }
5223
5224 /* If any flags still set, then one implementation might need a warning
5225 and the other either will need one of a different kind or none at all.
5226 Pass any remaining flags over to relaxation. */
5227 if (mips_macro_warning.first_frag != NULL)
5228 mips_macro_warning.first_frag->fr_subtype |= subtype;
5229 }
5230
5231 /* Instruction operand formats used in macros that vary between
5232 standard MIPS and microMIPS code. */
5233
5234 static const char * const brk_fmt[2][2] = { { "c", "c" }, { "mF", "c" } };
5235 static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
5236 static const char * const jalr_fmt[2] = { "d,s", "t,s" };
5237 static const char * const lui_fmt[2] = { "t,u", "s,u" };
5238 static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
5239 static const char * const mfhl_fmt[2][2] = { { "d", "d" }, { "mj", "s" } };
5240 static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
5241 static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
5242
5243 #define BRK_FMT (brk_fmt[mips_opts.micromips][mips_opts.insn32])
5244 #define COP12_FMT (cop12_fmt[mips_opts.micromips])
5245 #define JALR_FMT (jalr_fmt[mips_opts.micromips])
5246 #define LUI_FMT (lui_fmt[mips_opts.micromips])
5247 #define MEM12_FMT (mem12_fmt[mips_opts.micromips])
5248 #define MFHL_FMT (mfhl_fmt[mips_opts.micromips][mips_opts.insn32])
5249 #define SHFT_FMT (shft_fmt[mips_opts.micromips])
5250 #define TRAP_FMT (trap_fmt[mips_opts.micromips])
5251
5252 /* Read a macro's relocation codes from *ARGS and store them in *R.
5253 The first argument in *ARGS will be either the code for a single
5254 relocation or -1 followed by the three codes that make up a
5255 composite relocation. */
5256
5257 static void
5258 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
5259 {
5260 int i, next;
5261
5262 next = va_arg (*args, int);
5263 if (next >= 0)
5264 r[0] = (bfd_reloc_code_real_type) next;
5265 else
5266 for (i = 0; i < 3; i++)
5267 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
5268 }
5269
5270 /* Build an instruction created by a macro expansion. This is passed
5271 a pointer to the count of instructions created so far, an
5272 expression, the name of the instruction to build, an operand format
5273 string, and corresponding arguments. */
5274
5275 static void
5276 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
5277 {
5278 const struct mips_opcode *mo = NULL;
5279 bfd_reloc_code_real_type r[3];
5280 const struct mips_opcode *amo;
5281 struct hash_control *hash;
5282 struct mips_cl_insn insn;
5283 va_list args;
5284
5285 va_start (args, fmt);
5286
5287 if (mips_opts.mips16)
5288 {
5289 mips16_macro_build (ep, name, fmt, &args);
5290 va_end (args);
5291 return;
5292 }
5293
5294 r[0] = BFD_RELOC_UNUSED;
5295 r[1] = BFD_RELOC_UNUSED;
5296 r[2] = BFD_RELOC_UNUSED;
5297 hash = mips_opts.micromips ? micromips_op_hash : op_hash;
5298 amo = (struct mips_opcode *) hash_find (hash, name);
5299 gas_assert (amo);
5300 gas_assert (strcmp (name, amo->name) == 0);
5301
5302 do
5303 {
5304 /* Search until we get a match for NAME. It is assumed here that
5305 macros will never generate MDMX, MIPS-3D, or MT instructions.
5306 We try to match an instruction that fulfils the branch delay
5307 slot instruction length requirement (if any) of the previous
5308 instruction. While doing this we record the first instruction
5309 seen that matches all the other conditions and use it anyway
5310 if the requirement cannot be met; we will issue an appropriate
5311 warning later on. */
5312 if (strcmp (fmt, amo->args) == 0
5313 && amo->pinfo != INSN_MACRO
5314 && is_opcode_valid (amo)
5315 && is_size_valid (amo))
5316 {
5317 if (is_delay_slot_valid (amo))
5318 {
5319 mo = amo;
5320 break;
5321 }
5322 else if (!mo)
5323 mo = amo;
5324 }
5325
5326 ++amo;
5327 gas_assert (amo->name);
5328 }
5329 while (strcmp (name, amo->name) == 0);
5330
5331 gas_assert (mo);
5332 create_insn (&insn, mo);
5333 for (;;)
5334 {
5335 switch (*fmt++)
5336 {
5337 case '\0':
5338 break;
5339
5340 case ',':
5341 case '(':
5342 case ')':
5343 continue;
5344
5345 case '+':
5346 switch (*fmt++)
5347 {
5348 case 'A':
5349 case 'E':
5350 INSERT_OPERAND (mips_opts.micromips,
5351 EXTLSB, insn, va_arg (args, int));
5352 continue;
5353
5354 case 'B':
5355 case 'F':
5356 /* Note that in the macro case, these arguments are already
5357 in MSB form. (When handling the instruction in the
5358 non-macro case, these arguments are sizes from which
5359 MSB values must be calculated.) */
5360 INSERT_OPERAND (mips_opts.micromips,
5361 INSMSB, insn, va_arg (args, int));
5362 continue;
5363
5364 case 'J':
5365 gas_assert (!mips_opts.micromips);
5366 INSERT_OPERAND (0, CODE10, insn, va_arg (args, int));
5367 continue;
5368
5369 case 'C':
5370 case 'G':
5371 case 'H':
5372 /* Note that in the macro case, these arguments are already
5373 in MSBD form. (When handling the instruction in the
5374 non-macro case, these arguments are sizes from which
5375 MSBD values must be calculated.) */
5376 INSERT_OPERAND (mips_opts.micromips,
5377 EXTMSBD, insn, va_arg (args, int));
5378 continue;
5379
5380 case 'Q':
5381 gas_assert (!mips_opts.micromips);
5382 INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
5383 continue;
5384
5385 case 'j':
5386 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, insn, va_arg (args, int));
5387 continue;
5388
5389 default:
5390 abort ();
5391 }
5392 continue;
5393
5394 case '2':
5395 INSERT_OPERAND (mips_opts.micromips, BP, insn, va_arg (args, int));
5396 continue;
5397
5398 case 'n':
5399 gas_assert (mips_opts.micromips);
5400 case 't':
5401 case 'w':
5402 case 'E':
5403 INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
5404 continue;
5405
5406 case 'c':
5407 INSERT_OPERAND (mips_opts.micromips, CODE, insn, va_arg (args, int));
5408 continue;
5409
5410 case 'W':
5411 gas_assert (!mips_opts.micromips);
5412 case 'T':
5413 INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
5414 continue;
5415
5416 case 'G':
5417 if (mips_opts.micromips)
5418 INSERT_OPERAND (1, RS, insn, va_arg (args, int));
5419 else
5420 INSERT_OPERAND (0, RD, insn, va_arg (args, int));
5421 continue;
5422
5423 case 'K':
5424 gas_assert (!mips_opts.micromips);
5425 case 'd':
5426 INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
5427 continue;
5428
5429 case 'U':
5430 gas_assert (!mips_opts.micromips);
5431 {
5432 int tmp = va_arg (args, int);
5433
5434 INSERT_OPERAND (0, RT, insn, tmp);
5435 INSERT_OPERAND (0, RD, insn, tmp);
5436 }
5437 continue;
5438
5439 case 'V':
5440 case 'S':
5441 gas_assert (!mips_opts.micromips);
5442 INSERT_OPERAND (0, FS, insn, va_arg (args, int));
5443 continue;
5444
5445 case 'z':
5446 continue;
5447
5448 case '<':
5449 INSERT_OPERAND (mips_opts.micromips,
5450 SHAMT, insn, va_arg (args, int));
5451 continue;
5452
5453 case 'D':
5454 gas_assert (!mips_opts.micromips);
5455 INSERT_OPERAND (0, FD, insn, va_arg (args, int));
5456 continue;
5457
5458 case 'B':
5459 gas_assert (!mips_opts.micromips);
5460 INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
5461 continue;
5462
5463 case 'J':
5464 gas_assert (!mips_opts.micromips);
5465 INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
5466 continue;
5467
5468 case 'q':
5469 gas_assert (!mips_opts.micromips);
5470 INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
5471 continue;
5472
5473 case 'b':
5474 case 's':
5475 case 'r':
5476 case 'v':
5477 INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
5478 continue;
5479
5480 case 'i':
5481 case 'j':
5482 macro_read_relocs (&args, r);
5483 gas_assert (*r == BFD_RELOC_GPREL16
5484 || *r == BFD_RELOC_MIPS_HIGHER
5485 || *r == BFD_RELOC_HI16_S
5486 || *r == BFD_RELOC_LO16
5487 || *r == BFD_RELOC_MIPS_GOT_OFST);
5488 continue;
5489
5490 case 'o':
5491 macro_read_relocs (&args, r);
5492 continue;
5493
5494 case 'u':
5495 macro_read_relocs (&args, r);
5496 gas_assert (ep != NULL
5497 && (ep->X_op == O_constant
5498 || (ep->X_op == O_symbol
5499 && (*r == BFD_RELOC_MIPS_HIGHEST
5500 || *r == BFD_RELOC_HI16_S
5501 || *r == BFD_RELOC_HI16
5502 || *r == BFD_RELOC_GPREL16
5503 || *r == BFD_RELOC_MIPS_GOT_HI16
5504 || *r == BFD_RELOC_MIPS_CALL_HI16))));
5505 continue;
5506
5507 case 'p':
5508 gas_assert (ep != NULL);
5509
5510 /*
5511 * This allows macro() to pass an immediate expression for
5512 * creating short branches without creating a symbol.
5513 *
5514 * We don't allow branch relaxation for these branches, as
5515 * they should only appear in ".set nomacro" anyway.
5516 */
5517 if (ep->X_op == O_constant)
5518 {
5519 /* For microMIPS we always use relocations for branches.
5520 So we should not resolve immediate values. */
5521 gas_assert (!mips_opts.micromips);
5522
5523 if ((ep->X_add_number & 3) != 0)
5524 as_bad (_("branch to misaligned address (0x%lx)"),
5525 (unsigned long) ep->X_add_number);
5526 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5527 as_bad (_("branch address range overflow (0x%lx)"),
5528 (unsigned long) ep->X_add_number);
5529 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5530 ep = NULL;
5531 }
5532 else
5533 *r = BFD_RELOC_16_PCREL_S2;
5534 continue;
5535
5536 case 'a':
5537 gas_assert (ep != NULL);
5538 *r = BFD_RELOC_MIPS_JMP;
5539 continue;
5540
5541 case 'C':
5542 gas_assert (!mips_opts.micromips);
5543 INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5544 continue;
5545
5546 case 'k':
5547 INSERT_OPERAND (mips_opts.micromips,
5548 CACHE, insn, va_arg (args, unsigned long));
5549 continue;
5550
5551 case '|':
5552 gas_assert (mips_opts.micromips);
5553 INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5554 continue;
5555
5556 case '.':
5557 gas_assert (mips_opts.micromips);
5558 INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5559 continue;
5560
5561 case '\\':
5562 INSERT_OPERAND (mips_opts.micromips,
5563 3BITPOS, insn, va_arg (args, unsigned int));
5564 continue;
5565
5566 case '~':
5567 INSERT_OPERAND (mips_opts.micromips,
5568 OFFSET12, insn, va_arg (args, unsigned long));
5569 continue;
5570
5571 case 'N':
5572 gas_assert (mips_opts.micromips);
5573 INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5574 continue;
5575
5576 case 'm': /* Opcode extension character. */
5577 gas_assert (mips_opts.micromips);
5578 switch (*fmt++)
5579 {
5580 case 'j':
5581 INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5582 break;
5583
5584 case 'p':
5585 INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5586 break;
5587
5588 case 'F':
5589 INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5590 break;
5591
5592 default:
5593 abort ();
5594 }
5595 continue;
5596
5597 default:
5598 abort ();
5599 }
5600 break;
5601 }
5602 va_end (args);
5603 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5604
5605 append_insn (&insn, ep, r, TRUE);
5606 }
5607
5608 static void
5609 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5610 va_list *args)
5611 {
5612 struct mips_opcode *mo;
5613 struct mips_cl_insn insn;
5614 bfd_reloc_code_real_type r[3]
5615 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5616
5617 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5618 gas_assert (mo);
5619 gas_assert (strcmp (name, mo->name) == 0);
5620
5621 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5622 {
5623 ++mo;
5624 gas_assert (mo->name);
5625 gas_assert (strcmp (name, mo->name) == 0);
5626 }
5627
5628 create_insn (&insn, mo);
5629 for (;;)
5630 {
5631 int c;
5632
5633 c = *fmt++;
5634 switch (c)
5635 {
5636 case '\0':
5637 break;
5638
5639 case ',':
5640 case '(':
5641 case ')':
5642 continue;
5643
5644 case 'y':
5645 case 'w':
5646 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5647 continue;
5648
5649 case 'x':
5650 case 'v':
5651 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5652 continue;
5653
5654 case 'z':
5655 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5656 continue;
5657
5658 case 'Z':
5659 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5660 continue;
5661
5662 case '0':
5663 case 'S':
5664 case 'P':
5665 case 'R':
5666 continue;
5667
5668 case 'X':
5669 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5670 continue;
5671
5672 case 'Y':
5673 {
5674 int regno;
5675
5676 regno = va_arg (*args, int);
5677 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5678 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5679 }
5680 continue;
5681
5682 case '<':
5683 case '>':
5684 case '4':
5685 case '5':
5686 case 'H':
5687 case 'W':
5688 case 'D':
5689 case 'j':
5690 case '8':
5691 case 'V':
5692 case 'C':
5693 case 'U':
5694 case 'k':
5695 case 'K':
5696 case 'p':
5697 case 'q':
5698 {
5699 offsetT value;
5700
5701 gas_assert (ep != NULL);
5702
5703 if (ep->X_op != O_constant)
5704 *r = (int) BFD_RELOC_UNUSED + c;
5705 else if (calculate_reloc (*r, ep->X_add_number, &value))
5706 {
5707 mips16_immed (NULL, 0, c, *r, value, 0, &insn.insn_opcode);
5708 ep = NULL;
5709 *r = BFD_RELOC_UNUSED;
5710 }
5711 }
5712 continue;
5713
5714 case '6':
5715 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5716 continue;
5717 }
5718
5719 break;
5720 }
5721
5722 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5723
5724 append_insn (&insn, ep, r, TRUE);
5725 }
5726
5727 /*
5728 * Sign-extend 32-bit mode constants that have bit 31 set and all
5729 * higher bits unset.
5730 */
5731 static void
5732 normalize_constant_expr (expressionS *ex)
5733 {
5734 if (ex->X_op == O_constant
5735 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5736 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5737 - 0x80000000);
5738 }
5739
5740 /*
5741 * Sign-extend 32-bit mode address offsets that have bit 31 set and
5742 * all higher bits unset.
5743 */
5744 static void
5745 normalize_address_expr (expressionS *ex)
5746 {
5747 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5748 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5749 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5750 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5751 - 0x80000000);
5752 }
5753
5754 /*
5755 * Generate a "jalr" instruction with a relocation hint to the called
5756 * function. This occurs in NewABI PIC code.
5757 */
5758 static void
5759 macro_build_jalr (expressionS *ep, int cprestore)
5760 {
5761 static const bfd_reloc_code_real_type jalr_relocs[2]
5762 = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5763 bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5764 const char *jalr;
5765 char *f = NULL;
5766
5767 if (MIPS_JALR_HINT_P (ep))
5768 {
5769 frag_grow (8);
5770 f = frag_more (0);
5771 }
5772 if (mips_opts.micromips)
5773 {
5774 jalr = ((mips_opts.noreorder && !cprestore) || mips_opts.insn32
5775 ? "jalr" : "jalrs");
5776 if (MIPS_JALR_HINT_P (ep)
5777 || mips_opts.insn32
5778 || (history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5779 macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5780 else
5781 macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5782 }
5783 else
5784 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5785 if (MIPS_JALR_HINT_P (ep))
5786 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5787 }
5788
5789 /*
5790 * Generate a "lui" instruction.
5791 */
5792 static void
5793 macro_build_lui (expressionS *ep, int regnum)
5794 {
5795 gas_assert (! mips_opts.mips16);
5796
5797 if (ep->X_op != O_constant)
5798 {
5799 gas_assert (ep->X_op == O_symbol);
5800 /* _gp_disp is a special case, used from s_cpload.
5801 __gnu_local_gp is used if mips_no_shared. */
5802 gas_assert (mips_pic == NO_PIC
5803 || (! HAVE_NEWABI
5804 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5805 || (! mips_in_shared
5806 && strcmp (S_GET_NAME (ep->X_add_symbol),
5807 "__gnu_local_gp") == 0));
5808 }
5809
5810 macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5811 }
5812
5813 /* Generate a sequence of instructions to do a load or store from a constant
5814 offset off of a base register (breg) into/from a target register (treg),
5815 using AT if necessary. */
5816 static void
5817 macro_build_ldst_constoffset (expressionS *ep, const char *op,
5818 int treg, int breg, int dbl)
5819 {
5820 gas_assert (ep->X_op == O_constant);
5821
5822 /* Sign-extending 32-bit constants makes their handling easier. */
5823 if (!dbl)
5824 normalize_constant_expr (ep);
5825
5826 /* Right now, this routine can only handle signed 32-bit constants. */
5827 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5828 as_warn (_("operand overflow"));
5829
5830 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5831 {
5832 /* Signed 16-bit offset will fit in the op. Easy! */
5833 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5834 }
5835 else
5836 {
5837 /* 32-bit offset, need multiple instructions and AT, like:
5838 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
5839 addu $tempreg,$tempreg,$breg
5840 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
5841 to handle the complete offset. */
5842 macro_build_lui (ep, AT);
5843 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5844 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5845
5846 if (!mips_opts.at)
5847 as_bad (_("Macro used $at after \".set noat\""));
5848 }
5849 }
5850
5851 /* set_at()
5852 * Generates code to set the $at register to true (one)
5853 * if reg is less than the immediate expression.
5854 */
5855 static void
5856 set_at (int reg, int unsignedp)
5857 {
5858 if (imm_expr.X_op == O_constant
5859 && imm_expr.X_add_number >= -0x8000
5860 && imm_expr.X_add_number < 0x8000)
5861 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5862 AT, reg, BFD_RELOC_LO16);
5863 else
5864 {
5865 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5866 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5867 }
5868 }
5869
5870 /* Warn if an expression is not a constant. */
5871
5872 static void
5873 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5874 {
5875 if (ex->X_op == O_big)
5876 as_bad (_("unsupported large constant"));
5877 else if (ex->X_op != O_constant)
5878 as_bad (_("Instruction %s requires absolute expression"),
5879 ip->insn_mo->name);
5880
5881 if (HAVE_32BIT_GPRS)
5882 normalize_constant_expr (ex);
5883 }
5884
5885 /* Count the leading zeroes by performing a binary chop. This is a
5886 bulky bit of source, but performance is a LOT better for the
5887 majority of values than a simple loop to count the bits:
5888 for (lcnt = 0; (lcnt < 32); lcnt++)
5889 if ((v) & (1 << (31 - lcnt)))
5890 break;
5891 However it is not code size friendly, and the gain will drop a bit
5892 on certain cached systems.
5893 */
5894 #define COUNT_TOP_ZEROES(v) \
5895 (((v) & ~0xffff) == 0 \
5896 ? ((v) & ~0xff) == 0 \
5897 ? ((v) & ~0xf) == 0 \
5898 ? ((v) & ~0x3) == 0 \
5899 ? ((v) & ~0x1) == 0 \
5900 ? !(v) \
5901 ? 32 \
5902 : 31 \
5903 : 30 \
5904 : ((v) & ~0x7) == 0 \
5905 ? 29 \
5906 : 28 \
5907 : ((v) & ~0x3f) == 0 \
5908 ? ((v) & ~0x1f) == 0 \
5909 ? 27 \
5910 : 26 \
5911 : ((v) & ~0x7f) == 0 \
5912 ? 25 \
5913 : 24 \
5914 : ((v) & ~0xfff) == 0 \
5915 ? ((v) & ~0x3ff) == 0 \
5916 ? ((v) & ~0x1ff) == 0 \
5917 ? 23 \
5918 : 22 \
5919 : ((v) & ~0x7ff) == 0 \
5920 ? 21 \
5921 : 20 \
5922 : ((v) & ~0x3fff) == 0 \
5923 ? ((v) & ~0x1fff) == 0 \
5924 ? 19 \
5925 : 18 \
5926 : ((v) & ~0x7fff) == 0 \
5927 ? 17 \
5928 : 16 \
5929 : ((v) & ~0xffffff) == 0 \
5930 ? ((v) & ~0xfffff) == 0 \
5931 ? ((v) & ~0x3ffff) == 0 \
5932 ? ((v) & ~0x1ffff) == 0 \
5933 ? 15 \
5934 : 14 \
5935 : ((v) & ~0x7ffff) == 0 \
5936 ? 13 \
5937 : 12 \
5938 : ((v) & ~0x3fffff) == 0 \
5939 ? ((v) & ~0x1fffff) == 0 \
5940 ? 11 \
5941 : 10 \
5942 : ((v) & ~0x7fffff) == 0 \
5943 ? 9 \
5944 : 8 \
5945 : ((v) & ~0xfffffff) == 0 \
5946 ? ((v) & ~0x3ffffff) == 0 \
5947 ? ((v) & ~0x1ffffff) == 0 \
5948 ? 7 \
5949 : 6 \
5950 : ((v) & ~0x7ffffff) == 0 \
5951 ? 5 \
5952 : 4 \
5953 : ((v) & ~0x3fffffff) == 0 \
5954 ? ((v) & ~0x1fffffff) == 0 \
5955 ? 3 \
5956 : 2 \
5957 : ((v) & ~0x7fffffff) == 0 \
5958 ? 1 \
5959 : 0)
5960
5961 /* load_register()
5962 * This routine generates the least number of instructions necessary to load
5963 * an absolute expression value into a register.
5964 */
5965 static void
5966 load_register (int reg, expressionS *ep, int dbl)
5967 {
5968 int freg;
5969 expressionS hi32, lo32;
5970
5971 if (ep->X_op != O_big)
5972 {
5973 gas_assert (ep->X_op == O_constant);
5974
5975 /* Sign-extending 32-bit constants makes their handling easier. */
5976 if (!dbl)
5977 normalize_constant_expr (ep);
5978
5979 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5980 {
5981 /* We can handle 16 bit signed values with an addiu to
5982 $zero. No need to ever use daddiu here, since $zero and
5983 the result are always correct in 32 bit mode. */
5984 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5985 return;
5986 }
5987 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5988 {
5989 /* We can handle 16 bit unsigned values with an ori to
5990 $zero. */
5991 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5992 return;
5993 }
5994 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5995 {
5996 /* 32 bit values require an lui. */
5997 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5998 if ((ep->X_add_number & 0xffff) != 0)
5999 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6000 return;
6001 }
6002 }
6003
6004 /* The value is larger than 32 bits. */
6005
6006 if (!dbl || HAVE_32BIT_GPRS)
6007 {
6008 char value[32];
6009
6010 sprintf_vma (value, ep->X_add_number);
6011 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6012 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6013 return;
6014 }
6015
6016 if (ep->X_op != O_big)
6017 {
6018 hi32 = *ep;
6019 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
6020 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
6021 hi32.X_add_number &= 0xffffffff;
6022 lo32 = *ep;
6023 lo32.X_add_number &= 0xffffffff;
6024 }
6025 else
6026 {
6027 gas_assert (ep->X_add_number > 2);
6028 if (ep->X_add_number == 3)
6029 generic_bignum[3] = 0;
6030 else if (ep->X_add_number > 4)
6031 as_bad (_("Number larger than 64 bits"));
6032 lo32.X_op = O_constant;
6033 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
6034 hi32.X_op = O_constant;
6035 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
6036 }
6037
6038 if (hi32.X_add_number == 0)
6039 freg = 0;
6040 else
6041 {
6042 int shift, bit;
6043 unsigned long hi, lo;
6044
6045 if (hi32.X_add_number == (offsetT) 0xffffffff)
6046 {
6047 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
6048 {
6049 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6050 return;
6051 }
6052 if (lo32.X_add_number & 0x80000000)
6053 {
6054 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6055 if (lo32.X_add_number & 0xffff)
6056 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
6057 return;
6058 }
6059 }
6060
6061 /* Check for 16bit shifted constant. We know that hi32 is
6062 non-zero, so start the mask on the first bit of the hi32
6063 value. */
6064 shift = 17;
6065 do
6066 {
6067 unsigned long himask, lomask;
6068
6069 if (shift < 32)
6070 {
6071 himask = 0xffff >> (32 - shift);
6072 lomask = (0xffff << shift) & 0xffffffff;
6073 }
6074 else
6075 {
6076 himask = 0xffff << (shift - 32);
6077 lomask = 0;
6078 }
6079 if ((hi32.X_add_number & ~(offsetT) himask) == 0
6080 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
6081 {
6082 expressionS tmp;
6083
6084 tmp.X_op = O_constant;
6085 if (shift < 32)
6086 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
6087 | (lo32.X_add_number >> shift));
6088 else
6089 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
6090 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
6091 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6092 reg, reg, (shift >= 32) ? shift - 32 : shift);
6093 return;
6094 }
6095 ++shift;
6096 }
6097 while (shift <= (64 - 16));
6098
6099 /* Find the bit number of the lowest one bit, and store the
6100 shifted value in hi/lo. */
6101 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
6102 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
6103 if (lo != 0)
6104 {
6105 bit = 0;
6106 while ((lo & 1) == 0)
6107 {
6108 lo >>= 1;
6109 ++bit;
6110 }
6111 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
6112 hi >>= bit;
6113 }
6114 else
6115 {
6116 bit = 32;
6117 while ((hi & 1) == 0)
6118 {
6119 hi >>= 1;
6120 ++bit;
6121 }
6122 lo = hi;
6123 hi = 0;
6124 }
6125
6126 /* Optimize if the shifted value is a (power of 2) - 1. */
6127 if ((hi == 0 && ((lo + 1) & lo) == 0)
6128 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
6129 {
6130 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
6131 if (shift != 0)
6132 {
6133 expressionS tmp;
6134
6135 /* This instruction will set the register to be all
6136 ones. */
6137 tmp.X_op = O_constant;
6138 tmp.X_add_number = (offsetT) -1;
6139 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
6140 if (bit != 0)
6141 {
6142 bit += shift;
6143 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
6144 reg, reg, (bit >= 32) ? bit - 32 : bit);
6145 }
6146 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
6147 reg, reg, (shift >= 32) ? shift - 32 : shift);
6148 return;
6149 }
6150 }
6151
6152 /* Sign extend hi32 before calling load_register, because we can
6153 generally get better code when we load a sign extended value. */
6154 if ((hi32.X_add_number & 0x80000000) != 0)
6155 hi32.X_add_number |= ~(offsetT) 0xffffffff;
6156 load_register (reg, &hi32, 0);
6157 freg = reg;
6158 }
6159 if ((lo32.X_add_number & 0xffff0000) == 0)
6160 {
6161 if (freg != 0)
6162 {
6163 macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
6164 freg = reg;
6165 }
6166 }
6167 else
6168 {
6169 expressionS mid16;
6170
6171 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
6172 {
6173 macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
6174 macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
6175 return;
6176 }
6177
6178 if (freg != 0)
6179 {
6180 macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
6181 freg = reg;
6182 }
6183 mid16 = lo32;
6184 mid16.X_add_number >>= 16;
6185 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6186 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6187 freg = reg;
6188 }
6189 if ((lo32.X_add_number & 0xffff) != 0)
6190 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
6191 }
6192
6193 static inline void
6194 load_delay_nop (void)
6195 {
6196 if (!gpr_interlocks)
6197 macro_build (NULL, "nop", "");
6198 }
6199
6200 /* Load an address into a register. */
6201
6202 static void
6203 load_address (int reg, expressionS *ep, int *used_at)
6204 {
6205 if (ep->X_op != O_constant
6206 && ep->X_op != O_symbol)
6207 {
6208 as_bad (_("expression too complex"));
6209 ep->X_op = O_constant;
6210 }
6211
6212 if (ep->X_op == O_constant)
6213 {
6214 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
6215 return;
6216 }
6217
6218 if (mips_pic == NO_PIC)
6219 {
6220 /* If this is a reference to a GP relative symbol, we want
6221 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
6222 Otherwise we want
6223 lui $reg,<sym> (BFD_RELOC_HI16_S)
6224 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6225 If we have an addend, we always use the latter form.
6226
6227 With 64bit address space and a usable $at we want
6228 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6229 lui $at,<sym> (BFD_RELOC_HI16_S)
6230 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6231 daddiu $at,<sym> (BFD_RELOC_LO16)
6232 dsll32 $reg,0
6233 daddu $reg,$reg,$at
6234
6235 If $at is already in use, we use a path which is suboptimal
6236 on superscalar processors.
6237 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6238 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
6239 dsll $reg,16
6240 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
6241 dsll $reg,16
6242 daddiu $reg,<sym> (BFD_RELOC_LO16)
6243
6244 For GP relative symbols in 64bit address space we can use
6245 the same sequence as in 32bit address space. */
6246 if (HAVE_64BIT_SYMBOLS)
6247 {
6248 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6249 && !nopic_need_relax (ep->X_add_symbol, 1))
6250 {
6251 relax_start (ep->X_add_symbol);
6252 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6253 mips_gp_register, BFD_RELOC_GPREL16);
6254 relax_switch ();
6255 }
6256
6257 if (*used_at == 0 && mips_opts.at)
6258 {
6259 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6260 macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
6261 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6262 BFD_RELOC_MIPS_HIGHER);
6263 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
6264 macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
6265 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
6266 *used_at = 1;
6267 }
6268 else
6269 {
6270 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
6271 macro_build (ep, "daddiu", "t,r,j", reg, reg,
6272 BFD_RELOC_MIPS_HIGHER);
6273 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6274 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
6275 macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
6276 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
6277 }
6278
6279 if (mips_relax.sequence)
6280 relax_end ();
6281 }
6282 else
6283 {
6284 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6285 && !nopic_need_relax (ep->X_add_symbol, 1))
6286 {
6287 relax_start (ep->X_add_symbol);
6288 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
6289 mips_gp_register, BFD_RELOC_GPREL16);
6290 relax_switch ();
6291 }
6292 macro_build_lui (ep, reg);
6293 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
6294 reg, reg, BFD_RELOC_LO16);
6295 if (mips_relax.sequence)
6296 relax_end ();
6297 }
6298 }
6299 else if (!mips_big_got)
6300 {
6301 expressionS ex;
6302
6303 /* If this is a reference to an external symbol, we want
6304 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6305 Otherwise we want
6306 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6307 nop
6308 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6309 If there is a constant, it must be added in after.
6310
6311 If we have NewABI, we want
6312 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6313 unless we're referencing a global symbol with a non-zero
6314 offset, in which case cst must be added separately. */
6315 if (HAVE_NEWABI)
6316 {
6317 if (ep->X_add_number)
6318 {
6319 ex.X_add_number = ep->X_add_number;
6320 ep->X_add_number = 0;
6321 relax_start (ep->X_add_symbol);
6322 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6323 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6324 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6325 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6326 ex.X_op = O_constant;
6327 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6328 reg, reg, BFD_RELOC_LO16);
6329 ep->X_add_number = ex.X_add_number;
6330 relax_switch ();
6331 }
6332 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6333 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6334 if (mips_relax.sequence)
6335 relax_end ();
6336 }
6337 else
6338 {
6339 ex.X_add_number = ep->X_add_number;
6340 ep->X_add_number = 0;
6341 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6342 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6343 load_delay_nop ();
6344 relax_start (ep->X_add_symbol);
6345 relax_switch ();
6346 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6347 BFD_RELOC_LO16);
6348 relax_end ();
6349
6350 if (ex.X_add_number != 0)
6351 {
6352 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6353 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6354 ex.X_op = O_constant;
6355 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
6356 reg, reg, BFD_RELOC_LO16);
6357 }
6358 }
6359 }
6360 else if (mips_big_got)
6361 {
6362 expressionS ex;
6363
6364 /* This is the large GOT case. If this is a reference to an
6365 external symbol, we want
6366 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6367 addu $reg,$reg,$gp
6368 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
6369
6370 Otherwise, for a reference to a local symbol in old ABI, we want
6371 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6372 nop
6373 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
6374 If there is a constant, it must be added in after.
6375
6376 In the NewABI, for local symbols, with or without offsets, we want:
6377 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6378 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6379 */
6380 if (HAVE_NEWABI)
6381 {
6382 ex.X_add_number = ep->X_add_number;
6383 ep->X_add_number = 0;
6384 relax_start (ep->X_add_symbol);
6385 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6386 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6387 reg, reg, mips_gp_register);
6388 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6389 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6390 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6391 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6392 else if (ex.X_add_number)
6393 {
6394 ex.X_op = O_constant;
6395 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6396 BFD_RELOC_LO16);
6397 }
6398
6399 ep->X_add_number = ex.X_add_number;
6400 relax_switch ();
6401 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6402 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6403 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6404 BFD_RELOC_MIPS_GOT_OFST);
6405 relax_end ();
6406 }
6407 else
6408 {
6409 ex.X_add_number = ep->X_add_number;
6410 ep->X_add_number = 0;
6411 relax_start (ep->X_add_symbol);
6412 macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
6413 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6414 reg, reg, mips_gp_register);
6415 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
6416 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
6417 relax_switch ();
6418 if (reg_needs_delay (mips_gp_register))
6419 {
6420 /* We need a nop before loading from $gp. This special
6421 check is required because the lui which starts the main
6422 instruction stream does not refer to $gp, and so will not
6423 insert the nop which may be required. */
6424 macro_build (NULL, "nop", "");
6425 }
6426 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
6427 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6428 load_delay_nop ();
6429 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6430 BFD_RELOC_LO16);
6431 relax_end ();
6432
6433 if (ex.X_add_number != 0)
6434 {
6435 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
6436 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6437 ex.X_op = O_constant;
6438 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
6439 BFD_RELOC_LO16);
6440 }
6441 }
6442 }
6443 else
6444 abort ();
6445
6446 if (!mips_opts.at && *used_at == 1)
6447 as_bad (_("Macro used $at after \".set noat\""));
6448 }
6449
6450 /* Move the contents of register SOURCE into register DEST. */
6451
6452 static void
6453 move_register (int dest, int source)
6454 {
6455 /* Prefer to use a 16-bit microMIPS instruction unless the previous
6456 instruction specifically requires a 32-bit one. */
6457 if (mips_opts.micromips
6458 && !mips_opts.insn32
6459 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
6460 macro_build (NULL, "move", "mp,mj", dest, source);
6461 else
6462 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
6463 dest, source, 0);
6464 }
6465
6466 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
6467 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
6468 The two alternatives are:
6469
6470 Global symbol Local sybmol
6471 ------------- ------------
6472 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
6473 ... ...
6474 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
6475
6476 load_got_offset emits the first instruction and add_got_offset
6477 emits the second for a 16-bit offset or add_got_offset_hilo emits
6478 a sequence to add a 32-bit offset using a scratch register. */
6479
6480 static void
6481 load_got_offset (int dest, expressionS *local)
6482 {
6483 expressionS global;
6484
6485 global = *local;
6486 global.X_add_number = 0;
6487
6488 relax_start (local->X_add_symbol);
6489 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6490 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6491 relax_switch ();
6492 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
6493 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6494 relax_end ();
6495 }
6496
6497 static void
6498 add_got_offset (int dest, expressionS *local)
6499 {
6500 expressionS global;
6501
6502 global.X_op = O_constant;
6503 global.X_op_symbol = NULL;
6504 global.X_add_symbol = NULL;
6505 global.X_add_number = local->X_add_number;
6506
6507 relax_start (local->X_add_symbol);
6508 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
6509 dest, dest, BFD_RELOC_LO16);
6510 relax_switch ();
6511 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6512 relax_end ();
6513 }
6514
6515 static void
6516 add_got_offset_hilo (int dest, expressionS *local, int tmp)
6517 {
6518 expressionS global;
6519 int hold_mips_optimize;
6520
6521 global.X_op = O_constant;
6522 global.X_op_symbol = NULL;
6523 global.X_add_symbol = NULL;
6524 global.X_add_number = local->X_add_number;
6525
6526 relax_start (local->X_add_symbol);
6527 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6528 relax_switch ();
6529 /* Set mips_optimize around the lui instruction to avoid
6530 inserting an unnecessary nop after the lw. */
6531 hold_mips_optimize = mips_optimize;
6532 mips_optimize = 2;
6533 macro_build_lui (&global, tmp);
6534 mips_optimize = hold_mips_optimize;
6535 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6536 relax_end ();
6537
6538 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6539 }
6540
6541 /* Emit a sequence of instructions to emulate a branch likely operation.
6542 BR is an ordinary branch corresponding to one to be emulated. BRNEG
6543 is its complementing branch with the original condition negated.
6544 CALL is set if the original branch specified the link operation.
6545 EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6546
6547 Code like this is produced in the noreorder mode:
6548
6549 BRNEG <args>, 1f
6550 nop
6551 b <sym>
6552 delay slot (executed only if branch taken)
6553 1:
6554
6555 or, if CALL is set:
6556
6557 BRNEG <args>, 1f
6558 nop
6559 bal <sym>
6560 delay slot (executed only if branch taken)
6561 1:
6562
6563 In the reorder mode the delay slot would be filled with a nop anyway,
6564 so code produced is simply:
6565
6566 BR <args>, <sym>
6567 nop
6568
6569 This function is used when producing code for the microMIPS ASE that
6570 does not implement branch likely instructions in hardware. */
6571
6572 static void
6573 macro_build_branch_likely (const char *br, const char *brneg,
6574 int call, expressionS *ep, const char *fmt,
6575 unsigned int sreg, unsigned int treg)
6576 {
6577 int noreorder = mips_opts.noreorder;
6578 expressionS expr1;
6579
6580 gas_assert (mips_opts.micromips);
6581 start_noreorder ();
6582 if (noreorder)
6583 {
6584 micromips_label_expr (&expr1);
6585 macro_build (&expr1, brneg, fmt, sreg, treg);
6586 macro_build (NULL, "nop", "");
6587 macro_build (ep, call ? "bal" : "b", "p");
6588
6589 /* Set to true so that append_insn adds a label. */
6590 emit_branch_likely_macro = TRUE;
6591 }
6592 else
6593 {
6594 macro_build (ep, br, fmt, sreg, treg);
6595 macro_build (NULL, "nop", "");
6596 }
6597 end_noreorder ();
6598 }
6599
6600 /* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6601 the condition code tested. EP specifies the branch target. */
6602
6603 static void
6604 macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6605 {
6606 const int call = 0;
6607 const char *brneg;
6608 const char *br;
6609
6610 switch (type)
6611 {
6612 case M_BC1FL:
6613 br = "bc1f";
6614 brneg = "bc1t";
6615 break;
6616 case M_BC1TL:
6617 br = "bc1t";
6618 brneg = "bc1f";
6619 break;
6620 case M_BC2FL:
6621 br = "bc2f";
6622 brneg = "bc2t";
6623 break;
6624 case M_BC2TL:
6625 br = "bc2t";
6626 brneg = "bc2f";
6627 break;
6628 default:
6629 abort ();
6630 }
6631 macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6632 }
6633
6634 /* Emit a two-argument branch macro specified by TYPE, using SREG as
6635 the register tested. EP specifies the branch target. */
6636
6637 static void
6638 macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6639 {
6640 const char *brneg = NULL;
6641 const char *br;
6642 int call = 0;
6643
6644 switch (type)
6645 {
6646 case M_BGEZ:
6647 br = "bgez";
6648 break;
6649 case M_BGEZL:
6650 br = mips_opts.micromips ? "bgez" : "bgezl";
6651 brneg = "bltz";
6652 break;
6653 case M_BGEZALL:
6654 gas_assert (mips_opts.micromips);
6655 br = mips_opts.insn32 ? "bgezal" : "bgezals";
6656 brneg = "bltz";
6657 call = 1;
6658 break;
6659 case M_BGTZ:
6660 br = "bgtz";
6661 break;
6662 case M_BGTZL:
6663 br = mips_opts.micromips ? "bgtz" : "bgtzl";
6664 brneg = "blez";
6665 break;
6666 case M_BLEZ:
6667 br = "blez";
6668 break;
6669 case M_BLEZL:
6670 br = mips_opts.micromips ? "blez" : "blezl";
6671 brneg = "bgtz";
6672 break;
6673 case M_BLTZ:
6674 br = "bltz";
6675 break;
6676 case M_BLTZL:
6677 br = mips_opts.micromips ? "bltz" : "bltzl";
6678 brneg = "bgez";
6679 break;
6680 case M_BLTZALL:
6681 gas_assert (mips_opts.micromips);
6682 br = mips_opts.insn32 ? "bltzal" : "bltzals";
6683 brneg = "bgez";
6684 call = 1;
6685 break;
6686 default:
6687 abort ();
6688 }
6689 if (mips_opts.micromips && brneg)
6690 macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6691 else
6692 macro_build (ep, br, "s,p", sreg);
6693 }
6694
6695 /* Emit a three-argument branch macro specified by TYPE, using SREG and
6696 TREG as the registers tested. EP specifies the branch target. */
6697
6698 static void
6699 macro_build_branch_rsrt (int type, expressionS *ep,
6700 unsigned int sreg, unsigned int treg)
6701 {
6702 const char *brneg = NULL;
6703 const int call = 0;
6704 const char *br;
6705
6706 switch (type)
6707 {
6708 case M_BEQ:
6709 case M_BEQ_I:
6710 br = "beq";
6711 break;
6712 case M_BEQL:
6713 case M_BEQL_I:
6714 br = mips_opts.micromips ? "beq" : "beql";
6715 brneg = "bne";
6716 break;
6717 case M_BNE:
6718 case M_BNE_I:
6719 br = "bne";
6720 break;
6721 case M_BNEL:
6722 case M_BNEL_I:
6723 br = mips_opts.micromips ? "bne" : "bnel";
6724 brneg = "beq";
6725 break;
6726 default:
6727 abort ();
6728 }
6729 if (mips_opts.micromips && brneg)
6730 macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6731 else
6732 macro_build (ep, br, "s,t,p", sreg, treg);
6733 }
6734
6735 /*
6736 * Build macros
6737 * This routine implements the seemingly endless macro or synthesized
6738 * instructions and addressing modes in the mips assembly language. Many
6739 * of these macros are simple and are similar to each other. These could
6740 * probably be handled by some kind of table or grammar approach instead of
6741 * this verbose method. Others are not simple macros but are more like
6742 * optimizing code generation.
6743 * One interesting optimization is when several store macros appear
6744 * consecutively that would load AT with the upper half of the same address.
6745 * The ensuing load upper instructions are ommited. This implies some kind
6746 * of global optimization. We currently only optimize within a single macro.
6747 * For many of the load and store macros if the address is specified as a
6748 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6749 * first load register 'at' with zero and use it as the base register. The
6750 * mips assembler simply uses register $zero. Just one tiny optimization
6751 * we're missing.
6752 */
6753 static void
6754 macro (struct mips_cl_insn *ip, char *str)
6755 {
6756 unsigned int treg, sreg, dreg, breg;
6757 unsigned int tempreg;
6758 int mask;
6759 int used_at = 0;
6760 expressionS label_expr;
6761 expressionS expr1;
6762 expressionS *ep;
6763 const char *s;
6764 const char *s2;
6765 const char *fmt;
6766 int likely = 0;
6767 int coproc = 0;
6768 int offbits = 16;
6769 int call = 0;
6770 int jals = 0;
6771 int dbl = 0;
6772 int imm = 0;
6773 int ust = 0;
6774 int lp = 0;
6775 int ab = 0;
6776 int off;
6777 bfd_reloc_code_real_type r;
6778 int hold_mips_optimize;
6779
6780 gas_assert (! mips_opts.mips16);
6781
6782 treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6783 dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6784 sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6785 mask = ip->insn_mo->mask;
6786
6787 label_expr.X_op = O_constant;
6788 label_expr.X_op_symbol = NULL;
6789 label_expr.X_add_symbol = NULL;
6790 label_expr.X_add_number = 0;
6791
6792 expr1.X_op = O_constant;
6793 expr1.X_op_symbol = NULL;
6794 expr1.X_add_symbol = NULL;
6795 expr1.X_add_number = 1;
6796
6797 switch (mask)
6798 {
6799 case M_DABS:
6800 dbl = 1;
6801 case M_ABS:
6802 /* bgez $a0,1f
6803 move v0,$a0
6804 sub v0,$zero,$a0
6805 1:
6806 */
6807
6808 start_noreorder ();
6809
6810 if (mips_opts.micromips)
6811 micromips_label_expr (&label_expr);
6812 else
6813 label_expr.X_add_number = 8;
6814 macro_build (&label_expr, "bgez", "s,p", sreg);
6815 if (dreg == sreg)
6816 macro_build (NULL, "nop", "");
6817 else
6818 move_register (dreg, sreg);
6819 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6820 if (mips_opts.micromips)
6821 micromips_add_label ();
6822
6823 end_noreorder ();
6824 break;
6825
6826 case M_ADD_I:
6827 s = "addi";
6828 s2 = "add";
6829 goto do_addi;
6830 case M_ADDU_I:
6831 s = "addiu";
6832 s2 = "addu";
6833 goto do_addi;
6834 case M_DADD_I:
6835 dbl = 1;
6836 s = "daddi";
6837 s2 = "dadd";
6838 if (!mips_opts.micromips)
6839 goto do_addi;
6840 if (imm_expr.X_op == O_constant
6841 && imm_expr.X_add_number >= -0x200
6842 && imm_expr.X_add_number < 0x200)
6843 {
6844 macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6845 break;
6846 }
6847 goto do_addi_i;
6848 case M_DADDU_I:
6849 dbl = 1;
6850 s = "daddiu";
6851 s2 = "daddu";
6852 do_addi:
6853 if (imm_expr.X_op == O_constant
6854 && imm_expr.X_add_number >= -0x8000
6855 && imm_expr.X_add_number < 0x8000)
6856 {
6857 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6858 break;
6859 }
6860 do_addi_i:
6861 used_at = 1;
6862 load_register (AT, &imm_expr, dbl);
6863 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6864 break;
6865
6866 case M_AND_I:
6867 s = "andi";
6868 s2 = "and";
6869 goto do_bit;
6870 case M_OR_I:
6871 s = "ori";
6872 s2 = "or";
6873 goto do_bit;
6874 case M_NOR_I:
6875 s = "";
6876 s2 = "nor";
6877 goto do_bit;
6878 case M_XOR_I:
6879 s = "xori";
6880 s2 = "xor";
6881 do_bit:
6882 if (imm_expr.X_op == O_constant
6883 && imm_expr.X_add_number >= 0
6884 && imm_expr.X_add_number < 0x10000)
6885 {
6886 if (mask != M_NOR_I)
6887 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6888 else
6889 {
6890 macro_build (&imm_expr, "ori", "t,r,i",
6891 treg, sreg, BFD_RELOC_LO16);
6892 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6893 }
6894 break;
6895 }
6896
6897 used_at = 1;
6898 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6899 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6900 break;
6901
6902 case M_BALIGN:
6903 switch (imm_expr.X_add_number)
6904 {
6905 case 0:
6906 macro_build (NULL, "nop", "");
6907 break;
6908 case 2:
6909 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6910 break;
6911 case 1:
6912 case 3:
6913 macro_build (NULL, "balign", "t,s,2", treg, sreg,
6914 (int) imm_expr.X_add_number);
6915 break;
6916 default:
6917 as_bad (_("BALIGN immediate not 0, 1, 2 or 3 (%lu)"),
6918 (unsigned long) imm_expr.X_add_number);
6919 break;
6920 }
6921 break;
6922
6923 case M_BC1FL:
6924 case M_BC1TL:
6925 case M_BC2FL:
6926 case M_BC2TL:
6927 gas_assert (mips_opts.micromips);
6928 macro_build_branch_ccl (mask, &offset_expr,
6929 EXTRACT_OPERAND (1, BCC, *ip));
6930 break;
6931
6932 case M_BEQ_I:
6933 case M_BEQL_I:
6934 case M_BNE_I:
6935 case M_BNEL_I:
6936 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6937 treg = 0;
6938 else
6939 {
6940 treg = AT;
6941 used_at = 1;
6942 load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6943 }
6944 /* Fall through. */
6945 case M_BEQL:
6946 case M_BNEL:
6947 macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6948 break;
6949
6950 case M_BGEL:
6951 likely = 1;
6952 case M_BGE:
6953 if (treg == 0)
6954 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6955 else if (sreg == 0)
6956 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6957 else
6958 {
6959 used_at = 1;
6960 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6961 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6962 &offset_expr, AT, ZERO);
6963 }
6964 break;
6965
6966 case M_BGEZL:
6967 case M_BGEZALL:
6968 case M_BGTZL:
6969 case M_BLEZL:
6970 case M_BLTZL:
6971 case M_BLTZALL:
6972 macro_build_branch_rs (mask, &offset_expr, sreg);
6973 break;
6974
6975 case M_BGTL_I:
6976 likely = 1;
6977 case M_BGT_I:
6978 /* Check for > max integer. */
6979 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
6980 {
6981 do_false:
6982 /* Result is always false. */
6983 if (! likely)
6984 macro_build (NULL, "nop", "");
6985 else
6986 macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6987 break;
6988 }
6989 if (imm_expr.X_op != O_constant)
6990 as_bad (_("Unsupported large constant"));
6991 ++imm_expr.X_add_number;
6992 /* FALLTHROUGH */
6993 case M_BGE_I:
6994 case M_BGEL_I:
6995 if (mask == M_BGEL_I)
6996 likely = 1;
6997 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6998 {
6999 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
7000 &offset_expr, sreg);
7001 break;
7002 }
7003 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7004 {
7005 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
7006 &offset_expr, sreg);
7007 break;
7008 }
7009 if (imm_expr.X_op == O_constant && imm_expr.X_add_number <= GPR_SMIN)
7010 {
7011 do_true:
7012 /* result is always true */
7013 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
7014 macro_build (&offset_expr, "b", "p");
7015 break;
7016 }
7017 used_at = 1;
7018 set_at (sreg, 0);
7019 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7020 &offset_expr, AT, ZERO);
7021 break;
7022
7023 case M_BGEUL:
7024 likely = 1;
7025 case M_BGEU:
7026 if (treg == 0)
7027 goto do_true;
7028 else if (sreg == 0)
7029 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7030 &offset_expr, ZERO, treg);
7031 else
7032 {
7033 used_at = 1;
7034 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7035 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7036 &offset_expr, AT, ZERO);
7037 }
7038 break;
7039
7040 case M_BGTUL_I:
7041 likely = 1;
7042 case M_BGTU_I:
7043 if (sreg == 0
7044 || (HAVE_32BIT_GPRS
7045 && imm_expr.X_op == O_constant
7046 && imm_expr.X_add_number == -1))
7047 goto do_false;
7048 if (imm_expr.X_op != O_constant)
7049 as_bad (_("Unsupported large constant"));
7050 ++imm_expr.X_add_number;
7051 /* FALLTHROUGH */
7052 case M_BGEU_I:
7053 case M_BGEUL_I:
7054 if (mask == M_BGEUL_I)
7055 likely = 1;
7056 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7057 goto do_true;
7058 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7059 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7060 &offset_expr, sreg, ZERO);
7061 else
7062 {
7063 used_at = 1;
7064 set_at (sreg, 1);
7065 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7066 &offset_expr, AT, ZERO);
7067 }
7068 break;
7069
7070 case M_BGTL:
7071 likely = 1;
7072 case M_BGT:
7073 if (treg == 0)
7074 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
7075 else if (sreg == 0)
7076 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
7077 else
7078 {
7079 used_at = 1;
7080 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7081 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7082 &offset_expr, AT, ZERO);
7083 }
7084 break;
7085
7086 case M_BGTUL:
7087 likely = 1;
7088 case M_BGTU:
7089 if (treg == 0)
7090 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7091 &offset_expr, sreg, ZERO);
7092 else if (sreg == 0)
7093 goto do_false;
7094 else
7095 {
7096 used_at = 1;
7097 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7098 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7099 &offset_expr, AT, ZERO);
7100 }
7101 break;
7102
7103 case M_BLEL:
7104 likely = 1;
7105 case M_BLE:
7106 if (treg == 0)
7107 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7108 else if (sreg == 0)
7109 macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
7110 else
7111 {
7112 used_at = 1;
7113 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
7114 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7115 &offset_expr, AT, ZERO);
7116 }
7117 break;
7118
7119 case M_BLEL_I:
7120 likely = 1;
7121 case M_BLE_I:
7122 if (imm_expr.X_op == O_constant && imm_expr.X_add_number >= GPR_SMAX)
7123 goto do_true;
7124 if (imm_expr.X_op != O_constant)
7125 as_bad (_("Unsupported large constant"));
7126 ++imm_expr.X_add_number;
7127 /* FALLTHROUGH */
7128 case M_BLT_I:
7129 case M_BLTL_I:
7130 if (mask == M_BLTL_I)
7131 likely = 1;
7132 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7133 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7134 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7135 macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
7136 else
7137 {
7138 used_at = 1;
7139 set_at (sreg, 0);
7140 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7141 &offset_expr, AT, ZERO);
7142 }
7143 break;
7144
7145 case M_BLEUL:
7146 likely = 1;
7147 case M_BLEU:
7148 if (treg == 0)
7149 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7150 &offset_expr, sreg, ZERO);
7151 else if (sreg == 0)
7152 goto do_true;
7153 else
7154 {
7155 used_at = 1;
7156 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
7157 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7158 &offset_expr, AT, ZERO);
7159 }
7160 break;
7161
7162 case M_BLEUL_I:
7163 likely = 1;
7164 case M_BLEU_I:
7165 if (sreg == 0
7166 || (HAVE_32BIT_GPRS
7167 && imm_expr.X_op == O_constant
7168 && imm_expr.X_add_number == -1))
7169 goto do_true;
7170 if (imm_expr.X_op != O_constant)
7171 as_bad (_("Unsupported large constant"));
7172 ++imm_expr.X_add_number;
7173 /* FALLTHROUGH */
7174 case M_BLTU_I:
7175 case M_BLTUL_I:
7176 if (mask == M_BLTUL_I)
7177 likely = 1;
7178 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7179 goto do_false;
7180 else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7181 macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
7182 &offset_expr, sreg, ZERO);
7183 else
7184 {
7185 used_at = 1;
7186 set_at (sreg, 1);
7187 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7188 &offset_expr, AT, ZERO);
7189 }
7190 break;
7191
7192 case M_BLTL:
7193 likely = 1;
7194 case M_BLT:
7195 if (treg == 0)
7196 macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
7197 else if (sreg == 0)
7198 macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
7199 else
7200 {
7201 used_at = 1;
7202 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
7203 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7204 &offset_expr, AT, ZERO);
7205 }
7206 break;
7207
7208 case M_BLTUL:
7209 likely = 1;
7210 case M_BLTU:
7211 if (treg == 0)
7212 goto do_false;
7213 else if (sreg == 0)
7214 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7215 &offset_expr, ZERO, treg);
7216 else
7217 {
7218 used_at = 1;
7219 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
7220 macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
7221 &offset_expr, AT, ZERO);
7222 }
7223 break;
7224
7225 case M_DEXT:
7226 {
7227 /* Use unsigned arithmetic. */
7228 addressT pos;
7229 addressT size;
7230
7231 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7232 {
7233 as_bad (_("Unsupported large constant"));
7234 pos = size = 1;
7235 }
7236 else
7237 {
7238 pos = imm_expr.X_add_number;
7239 size = imm2_expr.X_add_number;
7240 }
7241
7242 if (pos > 63)
7243 {
7244 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7245 pos = 1;
7246 }
7247 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7248 {
7249 as_bad (_("Improper extract size (%lu, position %lu)"),
7250 (unsigned long) size, (unsigned long) pos);
7251 size = 1;
7252 }
7253
7254 if (size <= 32 && pos < 32)
7255 {
7256 s = "dext";
7257 fmt = "t,r,+A,+C";
7258 }
7259 else if (size <= 32)
7260 {
7261 s = "dextu";
7262 fmt = "t,r,+E,+H";
7263 }
7264 else
7265 {
7266 s = "dextm";
7267 fmt = "t,r,+A,+G";
7268 }
7269 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7270 (int) (size - 1));
7271 }
7272 break;
7273
7274 case M_DINS:
7275 {
7276 /* Use unsigned arithmetic. */
7277 addressT pos;
7278 addressT size;
7279
7280 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
7281 {
7282 as_bad (_("Unsupported large constant"));
7283 pos = size = 1;
7284 }
7285 else
7286 {
7287 pos = imm_expr.X_add_number;
7288 size = imm2_expr.X_add_number;
7289 }
7290
7291 if (pos > 63)
7292 {
7293 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
7294 pos = 1;
7295 }
7296 if (size == 0 || size > 64 || (pos + size - 1) > 63)
7297 {
7298 as_bad (_("Improper insert size (%lu, position %lu)"),
7299 (unsigned long) size, (unsigned long) pos);
7300 size = 1;
7301 }
7302
7303 if (pos < 32 && (pos + size - 1) < 32)
7304 {
7305 s = "dins";
7306 fmt = "t,r,+A,+B";
7307 }
7308 else if (pos >= 32)
7309 {
7310 s = "dinsu";
7311 fmt = "t,r,+E,+F";
7312 }
7313 else
7314 {
7315 s = "dinsm";
7316 fmt = "t,r,+A,+F";
7317 }
7318 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
7319 (int) (pos + size - 1));
7320 }
7321 break;
7322
7323 case M_DDIV_3:
7324 dbl = 1;
7325 case M_DIV_3:
7326 s = "mflo";
7327 goto do_div3;
7328 case M_DREM_3:
7329 dbl = 1;
7330 case M_REM_3:
7331 s = "mfhi";
7332 do_div3:
7333 if (treg == 0)
7334 {
7335 as_warn (_("Divide by zero."));
7336 if (mips_trap)
7337 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7338 else
7339 macro_build (NULL, "break", BRK_FMT, 7);
7340 break;
7341 }
7342
7343 start_noreorder ();
7344 if (mips_trap)
7345 {
7346 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7347 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7348 }
7349 else
7350 {
7351 if (mips_opts.micromips)
7352 micromips_label_expr (&label_expr);
7353 else
7354 label_expr.X_add_number = 8;
7355 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7356 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
7357 macro_build (NULL, "break", BRK_FMT, 7);
7358 if (mips_opts.micromips)
7359 micromips_add_label ();
7360 }
7361 expr1.X_add_number = -1;
7362 used_at = 1;
7363 load_register (AT, &expr1, dbl);
7364 if (mips_opts.micromips)
7365 micromips_label_expr (&label_expr);
7366 else
7367 label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
7368 macro_build (&label_expr, "bne", "s,t,p", treg, AT);
7369 if (dbl)
7370 {
7371 expr1.X_add_number = 1;
7372 load_register (AT, &expr1, dbl);
7373 macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
7374 }
7375 else
7376 {
7377 expr1.X_add_number = 0x80000000;
7378 macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
7379 }
7380 if (mips_trap)
7381 {
7382 macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
7383 /* We want to close the noreorder block as soon as possible, so
7384 that later insns are available for delay slot filling. */
7385 end_noreorder ();
7386 }
7387 else
7388 {
7389 if (mips_opts.micromips)
7390 micromips_label_expr (&label_expr);
7391 else
7392 label_expr.X_add_number = 8;
7393 macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
7394 macro_build (NULL, "nop", "");
7395
7396 /* We want to close the noreorder block as soon as possible, so
7397 that later insns are available for delay slot filling. */
7398 end_noreorder ();
7399
7400 macro_build (NULL, "break", BRK_FMT, 6);
7401 }
7402 if (mips_opts.micromips)
7403 micromips_add_label ();
7404 macro_build (NULL, s, MFHL_FMT, dreg);
7405 break;
7406
7407 case M_DIV_3I:
7408 s = "div";
7409 s2 = "mflo";
7410 goto do_divi;
7411 case M_DIVU_3I:
7412 s = "divu";
7413 s2 = "mflo";
7414 goto do_divi;
7415 case M_REM_3I:
7416 s = "div";
7417 s2 = "mfhi";
7418 goto do_divi;
7419 case M_REMU_3I:
7420 s = "divu";
7421 s2 = "mfhi";
7422 goto do_divi;
7423 case M_DDIV_3I:
7424 dbl = 1;
7425 s = "ddiv";
7426 s2 = "mflo";
7427 goto do_divi;
7428 case M_DDIVU_3I:
7429 dbl = 1;
7430 s = "ddivu";
7431 s2 = "mflo";
7432 goto do_divi;
7433 case M_DREM_3I:
7434 dbl = 1;
7435 s = "ddiv";
7436 s2 = "mfhi";
7437 goto do_divi;
7438 case M_DREMU_3I:
7439 dbl = 1;
7440 s = "ddivu";
7441 s2 = "mfhi";
7442 do_divi:
7443 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7444 {
7445 as_warn (_("Divide by zero."));
7446 if (mips_trap)
7447 macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
7448 else
7449 macro_build (NULL, "break", BRK_FMT, 7);
7450 break;
7451 }
7452 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
7453 {
7454 if (strcmp (s2, "mflo") == 0)
7455 move_register (dreg, sreg);
7456 else
7457 move_register (dreg, ZERO);
7458 break;
7459 }
7460 if (imm_expr.X_op == O_constant
7461 && imm_expr.X_add_number == -1
7462 && s[strlen (s) - 1] != 'u')
7463 {
7464 if (strcmp (s2, "mflo") == 0)
7465 {
7466 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
7467 }
7468 else
7469 move_register (dreg, ZERO);
7470 break;
7471 }
7472
7473 used_at = 1;
7474 load_register (AT, &imm_expr, dbl);
7475 macro_build (NULL, s, "z,s,t", sreg, AT);
7476 macro_build (NULL, s2, MFHL_FMT, dreg);
7477 break;
7478
7479 case M_DIVU_3:
7480 s = "divu";
7481 s2 = "mflo";
7482 goto do_divu3;
7483 case M_REMU_3:
7484 s = "divu";
7485 s2 = "mfhi";
7486 goto do_divu3;
7487 case M_DDIVU_3:
7488 s = "ddivu";
7489 s2 = "mflo";
7490 goto do_divu3;
7491 case M_DREMU_3:
7492 s = "ddivu";
7493 s2 = "mfhi";
7494 do_divu3:
7495 start_noreorder ();
7496 if (mips_trap)
7497 {
7498 macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7499 macro_build (NULL, s, "z,s,t", sreg, treg);
7500 /* We want to close the noreorder block as soon as possible, so
7501 that later insns are available for delay slot filling. */
7502 end_noreorder ();
7503 }
7504 else
7505 {
7506 if (mips_opts.micromips)
7507 micromips_label_expr (&label_expr);
7508 else
7509 label_expr.X_add_number = 8;
7510 macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7511 macro_build (NULL, s, "z,s,t", sreg, treg);
7512
7513 /* We want to close the noreorder block as soon as possible, so
7514 that later insns are available for delay slot filling. */
7515 end_noreorder ();
7516 macro_build (NULL, "break", BRK_FMT, 7);
7517 if (mips_opts.micromips)
7518 micromips_add_label ();
7519 }
7520 macro_build (NULL, s2, MFHL_FMT, dreg);
7521 break;
7522
7523 case M_DLCA_AB:
7524 dbl = 1;
7525 case M_LCA_AB:
7526 call = 1;
7527 goto do_la;
7528 case M_DLA_AB:
7529 dbl = 1;
7530 case M_LA_AB:
7531 do_la:
7532 /* Load the address of a symbol into a register. If breg is not
7533 zero, we then add a base register to it. */
7534
7535 if (dbl && HAVE_32BIT_GPRS)
7536 as_warn (_("dla used to load 32-bit register"));
7537
7538 if (!dbl && HAVE_64BIT_OBJECTS)
7539 as_warn (_("la used to load 64-bit address"));
7540
7541 if (offset_expr.X_op == O_constant
7542 && offset_expr.X_add_number >= -0x8000
7543 && offset_expr.X_add_number < 0x8000)
7544 {
7545 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7546 "t,r,j", treg, sreg, BFD_RELOC_LO16);
7547 break;
7548 }
7549
7550 if (mips_opts.at && (treg == breg))
7551 {
7552 tempreg = AT;
7553 used_at = 1;
7554 }
7555 else
7556 {
7557 tempreg = treg;
7558 }
7559
7560 if (offset_expr.X_op != O_symbol
7561 && offset_expr.X_op != O_constant)
7562 {
7563 as_bad (_("Expression too complex"));
7564 offset_expr.X_op = O_constant;
7565 }
7566
7567 if (offset_expr.X_op == O_constant)
7568 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7569 else if (mips_pic == NO_PIC)
7570 {
7571 /* If this is a reference to a GP relative symbol, we want
7572 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
7573 Otherwise we want
7574 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
7575 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7576 If we have a constant, we need two instructions anyhow,
7577 so we may as well always use the latter form.
7578
7579 With 64bit address space and a usable $at we want
7580 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7581 lui $at,<sym> (BFD_RELOC_HI16_S)
7582 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7583 daddiu $at,<sym> (BFD_RELOC_LO16)
7584 dsll32 $tempreg,0
7585 daddu $tempreg,$tempreg,$at
7586
7587 If $at is already in use, we use a path which is suboptimal
7588 on superscalar processors.
7589 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
7590 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
7591 dsll $tempreg,16
7592 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
7593 dsll $tempreg,16
7594 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
7595
7596 For GP relative symbols in 64bit address space we can use
7597 the same sequence as in 32bit address space. */
7598 if (HAVE_64BIT_SYMBOLS)
7599 {
7600 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7601 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7602 {
7603 relax_start (offset_expr.X_add_symbol);
7604 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7605 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7606 relax_switch ();
7607 }
7608
7609 if (used_at == 0 && mips_opts.at)
7610 {
7611 macro_build (&offset_expr, "lui", LUI_FMT,
7612 tempreg, BFD_RELOC_MIPS_HIGHEST);
7613 macro_build (&offset_expr, "lui", LUI_FMT,
7614 AT, BFD_RELOC_HI16_S);
7615 macro_build (&offset_expr, "daddiu", "t,r,j",
7616 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7617 macro_build (&offset_expr, "daddiu", "t,r,j",
7618 AT, AT, BFD_RELOC_LO16);
7619 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7620 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7621 used_at = 1;
7622 }
7623 else
7624 {
7625 macro_build (&offset_expr, "lui", LUI_FMT,
7626 tempreg, BFD_RELOC_MIPS_HIGHEST);
7627 macro_build (&offset_expr, "daddiu", "t,r,j",
7628 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7629 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7630 macro_build (&offset_expr, "daddiu", "t,r,j",
7631 tempreg, tempreg, BFD_RELOC_HI16_S);
7632 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7633 macro_build (&offset_expr, "daddiu", "t,r,j",
7634 tempreg, tempreg, BFD_RELOC_LO16);
7635 }
7636
7637 if (mips_relax.sequence)
7638 relax_end ();
7639 }
7640 else
7641 {
7642 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7643 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7644 {
7645 relax_start (offset_expr.X_add_symbol);
7646 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7647 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7648 relax_switch ();
7649 }
7650 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7651 as_bad (_("Offset too large"));
7652 macro_build_lui (&offset_expr, tempreg);
7653 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7654 tempreg, tempreg, BFD_RELOC_LO16);
7655 if (mips_relax.sequence)
7656 relax_end ();
7657 }
7658 }
7659 else if (!mips_big_got && !HAVE_NEWABI)
7660 {
7661 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7662
7663 /* If this is a reference to an external symbol, and there
7664 is no constant, we want
7665 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7666 or for lca or if tempreg is PIC_CALL_REG
7667 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7668 For a local symbol, we want
7669 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7670 nop
7671 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7672
7673 If we have a small constant, and this is a reference to
7674 an external symbol, we want
7675 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7676 nop
7677 addiu $tempreg,$tempreg,<constant>
7678 For a local symbol, we want the same instruction
7679 sequence, but we output a BFD_RELOC_LO16 reloc on the
7680 addiu instruction.
7681
7682 If we have a large constant, and this is a reference to
7683 an external symbol, we want
7684 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7685 lui $at,<hiconstant>
7686 addiu $at,$at,<loconstant>
7687 addu $tempreg,$tempreg,$at
7688 For a local symbol, we want the same instruction
7689 sequence, but we output a BFD_RELOC_LO16 reloc on the
7690 addiu instruction.
7691 */
7692
7693 if (offset_expr.X_add_number == 0)
7694 {
7695 if (mips_pic == SVR4_PIC
7696 && breg == 0
7697 && (call || tempreg == PIC_CALL_REG))
7698 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7699
7700 relax_start (offset_expr.X_add_symbol);
7701 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7702 lw_reloc_type, mips_gp_register);
7703 if (breg != 0)
7704 {
7705 /* We're going to put in an addu instruction using
7706 tempreg, so we may as well insert the nop right
7707 now. */
7708 load_delay_nop ();
7709 }
7710 relax_switch ();
7711 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7712 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7713 load_delay_nop ();
7714 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7715 tempreg, tempreg, BFD_RELOC_LO16);
7716 relax_end ();
7717 /* FIXME: If breg == 0, and the next instruction uses
7718 $tempreg, then if this variant case is used an extra
7719 nop will be generated. */
7720 }
7721 else if (offset_expr.X_add_number >= -0x8000
7722 && offset_expr.X_add_number < 0x8000)
7723 {
7724 load_got_offset (tempreg, &offset_expr);
7725 load_delay_nop ();
7726 add_got_offset (tempreg, &offset_expr);
7727 }
7728 else
7729 {
7730 expr1.X_add_number = offset_expr.X_add_number;
7731 offset_expr.X_add_number =
7732 SEXT_16BIT (offset_expr.X_add_number);
7733 load_got_offset (tempreg, &offset_expr);
7734 offset_expr.X_add_number = expr1.X_add_number;
7735 /* If we are going to add in a base register, and the
7736 target register and the base register are the same,
7737 then we are using AT as a temporary register. Since
7738 we want to load the constant into AT, we add our
7739 current AT (from the global offset table) and the
7740 register into the register now, and pretend we were
7741 not using a base register. */
7742 if (breg == treg)
7743 {
7744 load_delay_nop ();
7745 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7746 treg, AT, breg);
7747 breg = 0;
7748 tempreg = treg;
7749 }
7750 add_got_offset_hilo (tempreg, &offset_expr, AT);
7751 used_at = 1;
7752 }
7753 }
7754 else if (!mips_big_got && HAVE_NEWABI)
7755 {
7756 int add_breg_early = 0;
7757
7758 /* If this is a reference to an external, and there is no
7759 constant, or local symbol (*), with or without a
7760 constant, we want
7761 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7762 or for lca or if tempreg is PIC_CALL_REG
7763 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
7764
7765 If we have a small constant, and this is a reference to
7766 an external symbol, we want
7767 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7768 addiu $tempreg,$tempreg,<constant>
7769
7770 If we have a large constant, and this is a reference to
7771 an external symbol, we want
7772 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
7773 lui $at,<hiconstant>
7774 addiu $at,$at,<loconstant>
7775 addu $tempreg,$tempreg,$at
7776
7777 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7778 local symbols, even though it introduces an additional
7779 instruction. */
7780
7781 if (offset_expr.X_add_number)
7782 {
7783 expr1.X_add_number = offset_expr.X_add_number;
7784 offset_expr.X_add_number = 0;
7785
7786 relax_start (offset_expr.X_add_symbol);
7787 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7788 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7789
7790 if (expr1.X_add_number >= -0x8000
7791 && expr1.X_add_number < 0x8000)
7792 {
7793 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7794 tempreg, tempreg, BFD_RELOC_LO16);
7795 }
7796 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7797 {
7798 /* If we are going to add in a base register, and the
7799 target register and the base register are the same,
7800 then we are using AT as a temporary register. Since
7801 we want to load the constant into AT, we add our
7802 current AT (from the global offset table) and the
7803 register into the register now, and pretend we were
7804 not using a base register. */
7805 if (breg != treg)
7806 dreg = tempreg;
7807 else
7808 {
7809 gas_assert (tempreg == AT);
7810 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7811 treg, AT, breg);
7812 dreg = treg;
7813 add_breg_early = 1;
7814 }
7815
7816 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7817 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7818 dreg, dreg, AT);
7819
7820 used_at = 1;
7821 }
7822 else
7823 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7824
7825 relax_switch ();
7826 offset_expr.X_add_number = expr1.X_add_number;
7827
7828 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7829 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7830 if (add_breg_early)
7831 {
7832 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7833 treg, tempreg, breg);
7834 breg = 0;
7835 tempreg = treg;
7836 }
7837 relax_end ();
7838 }
7839 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7840 {
7841 relax_start (offset_expr.X_add_symbol);
7842 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7843 BFD_RELOC_MIPS_CALL16, mips_gp_register);
7844 relax_switch ();
7845 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7846 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7847 relax_end ();
7848 }
7849 else
7850 {
7851 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7852 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7853 }
7854 }
7855 else if (mips_big_got && !HAVE_NEWABI)
7856 {
7857 int gpdelay;
7858 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7859 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7860 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7861
7862 /* This is the large GOT case. If this is a reference to an
7863 external symbol, and there is no constant, we want
7864 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7865 addu $tempreg,$tempreg,$gp
7866 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7867 or for lca or if tempreg is PIC_CALL_REG
7868 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
7869 addu $tempreg,$tempreg,$gp
7870 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7871 For a local symbol, we want
7872 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7873 nop
7874 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7875
7876 If we have a small constant, and this is a reference to
7877 an external symbol, we want
7878 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7879 addu $tempreg,$tempreg,$gp
7880 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7881 nop
7882 addiu $tempreg,$tempreg,<constant>
7883 For a local symbol, we want
7884 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7885 nop
7886 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7887
7888 If we have a large constant, and this is a reference to
7889 an external symbol, we want
7890 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7891 addu $tempreg,$tempreg,$gp
7892 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7893 lui $at,<hiconstant>
7894 addiu $at,$at,<loconstant>
7895 addu $tempreg,$tempreg,$at
7896 For a local symbol, we want
7897 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7898 lui $at,<hiconstant>
7899 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
7900 addu $tempreg,$tempreg,$at
7901 */
7902
7903 expr1.X_add_number = offset_expr.X_add_number;
7904 offset_expr.X_add_number = 0;
7905 relax_start (offset_expr.X_add_symbol);
7906 gpdelay = reg_needs_delay (mips_gp_register);
7907 if (expr1.X_add_number == 0 && breg == 0
7908 && (call || tempreg == PIC_CALL_REG))
7909 {
7910 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7911 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7912 }
7913 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7914 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7915 tempreg, tempreg, mips_gp_register);
7916 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7917 tempreg, lw_reloc_type, tempreg);
7918 if (expr1.X_add_number == 0)
7919 {
7920 if (breg != 0)
7921 {
7922 /* We're going to put in an addu instruction using
7923 tempreg, so we may as well insert the nop right
7924 now. */
7925 load_delay_nop ();
7926 }
7927 }
7928 else if (expr1.X_add_number >= -0x8000
7929 && expr1.X_add_number < 0x8000)
7930 {
7931 load_delay_nop ();
7932 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7933 tempreg, tempreg, BFD_RELOC_LO16);
7934 }
7935 else
7936 {
7937 /* If we are going to add in a base register, and the
7938 target register and the base register are the same,
7939 then we are using AT as a temporary register. Since
7940 we want to load the constant into AT, we add our
7941 current AT (from the global offset table) and the
7942 register into the register now, and pretend we were
7943 not using a base register. */
7944 if (breg != treg)
7945 dreg = tempreg;
7946 else
7947 {
7948 gas_assert (tempreg == AT);
7949 load_delay_nop ();
7950 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7951 treg, AT, breg);
7952 dreg = treg;
7953 }
7954
7955 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7956 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7957
7958 used_at = 1;
7959 }
7960 offset_expr.X_add_number = SEXT_16BIT (expr1.X_add_number);
7961 relax_switch ();
7962
7963 if (gpdelay)
7964 {
7965 /* This is needed because this instruction uses $gp, but
7966 the first instruction on the main stream does not. */
7967 macro_build (NULL, "nop", "");
7968 }
7969
7970 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7971 local_reloc_type, mips_gp_register);
7972 if (expr1.X_add_number >= -0x8000
7973 && expr1.X_add_number < 0x8000)
7974 {
7975 load_delay_nop ();
7976 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7977 tempreg, tempreg, BFD_RELOC_LO16);
7978 /* FIXME: If add_number is 0, and there was no base
7979 register, the external symbol case ended with a load,
7980 so if the symbol turns out to not be external, and
7981 the next instruction uses tempreg, an unnecessary nop
7982 will be inserted. */
7983 }
7984 else
7985 {
7986 if (breg == treg)
7987 {
7988 /* We must add in the base register now, as in the
7989 external symbol case. */
7990 gas_assert (tempreg == AT);
7991 load_delay_nop ();
7992 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7993 treg, AT, breg);
7994 tempreg = treg;
7995 /* We set breg to 0 because we have arranged to add
7996 it in in both cases. */
7997 breg = 0;
7998 }
7999
8000 macro_build_lui (&expr1, AT);
8001 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8002 AT, AT, BFD_RELOC_LO16);
8003 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8004 tempreg, tempreg, AT);
8005 used_at = 1;
8006 }
8007 relax_end ();
8008 }
8009 else if (mips_big_got && HAVE_NEWABI)
8010 {
8011 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
8012 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
8013 int add_breg_early = 0;
8014
8015 /* This is the large GOT case. If this is a reference to an
8016 external symbol, and there is no constant, we want
8017 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8018 add $tempreg,$tempreg,$gp
8019 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8020 or for lca or if tempreg is PIC_CALL_REG
8021 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
8022 add $tempreg,$tempreg,$gp
8023 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
8024
8025 If we have a small constant, and this is a reference to
8026 an external symbol, we want
8027 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8028 add $tempreg,$tempreg,$gp
8029 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8030 addi $tempreg,$tempreg,<constant>
8031
8032 If we have a large constant, and this is a reference to
8033 an external symbol, we want
8034 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
8035 addu $tempreg,$tempreg,$gp
8036 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8037 lui $at,<hiconstant>
8038 addi $at,$at,<loconstant>
8039 add $tempreg,$tempreg,$at
8040
8041 If we have NewABI, and we know it's a local symbol, we want
8042 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
8043 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
8044 otherwise we have to resort to GOT_HI16/GOT_LO16. */
8045
8046 relax_start (offset_expr.X_add_symbol);
8047
8048 expr1.X_add_number = offset_expr.X_add_number;
8049 offset_expr.X_add_number = 0;
8050
8051 if (expr1.X_add_number == 0 && breg == 0
8052 && (call || tempreg == PIC_CALL_REG))
8053 {
8054 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
8055 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
8056 }
8057 macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
8058 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8059 tempreg, tempreg, mips_gp_register);
8060 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8061 tempreg, lw_reloc_type, tempreg);
8062
8063 if (expr1.X_add_number == 0)
8064 ;
8065 else if (expr1.X_add_number >= -0x8000
8066 && expr1.X_add_number < 0x8000)
8067 {
8068 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
8069 tempreg, tempreg, BFD_RELOC_LO16);
8070 }
8071 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
8072 {
8073 /* If we are going to add in a base register, and the
8074 target register and the base register are the same,
8075 then we are using AT as a temporary register. Since
8076 we want to load the constant into AT, we add our
8077 current AT (from the global offset table) and the
8078 register into the register now, and pretend we were
8079 not using a base register. */
8080 if (breg != treg)
8081 dreg = tempreg;
8082 else
8083 {
8084 gas_assert (tempreg == AT);
8085 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8086 treg, AT, breg);
8087 dreg = treg;
8088 add_breg_early = 1;
8089 }
8090
8091 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
8092 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
8093
8094 used_at = 1;
8095 }
8096 else
8097 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
8098
8099 relax_switch ();
8100 offset_expr.X_add_number = expr1.X_add_number;
8101 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8102 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8103 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8104 tempreg, BFD_RELOC_MIPS_GOT_OFST);
8105 if (add_breg_early)
8106 {
8107 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8108 treg, tempreg, breg);
8109 breg = 0;
8110 tempreg = treg;
8111 }
8112 relax_end ();
8113 }
8114 else
8115 abort ();
8116
8117 if (breg != 0)
8118 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
8119 break;
8120
8121 case M_MSGSND:
8122 gas_assert (!mips_opts.micromips);
8123 {
8124 unsigned long temp = (treg << 16) | (0x01);
8125 macro_build (NULL, "c2", "C", temp);
8126 }
8127 break;
8128
8129 case M_MSGLD:
8130 gas_assert (!mips_opts.micromips);
8131 {
8132 unsigned long temp = (0x02);
8133 macro_build (NULL, "c2", "C", temp);
8134 }
8135 break;
8136
8137 case M_MSGLD_T:
8138 gas_assert (!mips_opts.micromips);
8139 {
8140 unsigned long temp = (treg << 16) | (0x02);
8141 macro_build (NULL, "c2", "C", temp);
8142 }
8143 break;
8144
8145 case M_MSGWAIT:
8146 gas_assert (!mips_opts.micromips);
8147 macro_build (NULL, "c2", "C", 3);
8148 break;
8149
8150 case M_MSGWAIT_T:
8151 gas_assert (!mips_opts.micromips);
8152 {
8153 unsigned long temp = (treg << 16) | 0x03;
8154 macro_build (NULL, "c2", "C", temp);
8155 }
8156 break;
8157
8158 case M_J_A:
8159 /* The j instruction may not be used in PIC code, since it
8160 requires an absolute address. We convert it to a b
8161 instruction. */
8162 if (mips_pic == NO_PIC)
8163 macro_build (&offset_expr, "j", "a");
8164 else
8165 macro_build (&offset_expr, "b", "p");
8166 break;
8167
8168 /* The jal instructions must be handled as macros because when
8169 generating PIC code they expand to multi-instruction
8170 sequences. Normally they are simple instructions. */
8171 case M_JALS_1:
8172 dreg = RA;
8173 /* Fall through. */
8174 case M_JALS_2:
8175 gas_assert (mips_opts.micromips);
8176 if (mips_opts.insn32)
8177 {
8178 as_bad (_("Opcode not supported in the `insn32' mode `%s'"), str);
8179 break;
8180 }
8181 jals = 1;
8182 goto jal;
8183 case M_JAL_1:
8184 dreg = RA;
8185 /* Fall through. */
8186 case M_JAL_2:
8187 jal:
8188 if (mips_pic == NO_PIC)
8189 {
8190 s = jals ? "jalrs" : "jalr";
8191 if (mips_opts.micromips
8192 && !mips_opts.insn32
8193 && dreg == RA
8194 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8195 macro_build (NULL, s, "mj", sreg);
8196 else
8197 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8198 }
8199 else
8200 {
8201 int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
8202 && mips_cprestore_offset >= 0);
8203
8204 if (sreg != PIC_CALL_REG)
8205 as_warn (_("MIPS PIC call to register other than $25"));
8206
8207 s = ((mips_opts.micromips
8208 && !mips_opts.insn32
8209 && (!mips_opts.noreorder || cprestore))
8210 ? "jalrs" : "jalr");
8211 if (mips_opts.micromips
8212 && !mips_opts.insn32
8213 && dreg == RA
8214 && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
8215 macro_build (NULL, s, "mj", sreg);
8216 else
8217 macro_build (NULL, s, JALR_FMT, dreg, sreg);
8218 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
8219 {
8220 if (mips_cprestore_offset < 0)
8221 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8222 else
8223 {
8224 if (!mips_frame_reg_valid)
8225 {
8226 as_warn (_("No .frame pseudo-op used in PIC code"));
8227 /* Quiet this warning. */
8228 mips_frame_reg_valid = 1;
8229 }
8230 if (!mips_cprestore_valid)
8231 {
8232 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8233 /* Quiet this warning. */
8234 mips_cprestore_valid = 1;
8235 }
8236 if (mips_opts.noreorder)
8237 macro_build (NULL, "nop", "");
8238 expr1.X_add_number = mips_cprestore_offset;
8239 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8240 mips_gp_register,
8241 mips_frame_reg,
8242 HAVE_64BIT_ADDRESSES);
8243 }
8244 }
8245 }
8246
8247 break;
8248
8249 case M_JALS_A:
8250 gas_assert (mips_opts.micromips);
8251 if (mips_opts.insn32)
8252 {
8253 as_bad (_("Opcode not supported in the `insn32' mode `%s'"), str);
8254 break;
8255 }
8256 jals = 1;
8257 /* Fall through. */
8258 case M_JAL_A:
8259 if (mips_pic == NO_PIC)
8260 macro_build (&offset_expr, jals ? "jals" : "jal", "a");
8261 else if (mips_pic == SVR4_PIC)
8262 {
8263 /* If this is a reference to an external symbol, and we are
8264 using a small GOT, we want
8265 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
8266 nop
8267 jalr $ra,$25
8268 nop
8269 lw $gp,cprestore($sp)
8270 The cprestore value is set using the .cprestore
8271 pseudo-op. If we are using a big GOT, we want
8272 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
8273 addu $25,$25,$gp
8274 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
8275 nop
8276 jalr $ra,$25
8277 nop
8278 lw $gp,cprestore($sp)
8279 If the symbol is not external, we want
8280 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
8281 nop
8282 addiu $25,$25,<sym> (BFD_RELOC_LO16)
8283 jalr $ra,$25
8284 nop
8285 lw $gp,cprestore($sp)
8286
8287 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
8288 sequences above, minus nops, unless the symbol is local,
8289 which enables us to use GOT_PAGE/GOT_OFST (big got) or
8290 GOT_DISP. */
8291 if (HAVE_NEWABI)
8292 {
8293 if (!mips_big_got)
8294 {
8295 relax_start (offset_expr.X_add_symbol);
8296 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8297 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8298 mips_gp_register);
8299 relax_switch ();
8300 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8301 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
8302 mips_gp_register);
8303 relax_end ();
8304 }
8305 else
8306 {
8307 relax_start (offset_expr.X_add_symbol);
8308 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8309 BFD_RELOC_MIPS_CALL_HI16);
8310 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8311 PIC_CALL_REG, mips_gp_register);
8312 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8313 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8314 PIC_CALL_REG);
8315 relax_switch ();
8316 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8317 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
8318 mips_gp_register);
8319 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8320 PIC_CALL_REG, PIC_CALL_REG,
8321 BFD_RELOC_MIPS_GOT_OFST);
8322 relax_end ();
8323 }
8324
8325 macro_build_jalr (&offset_expr, 0);
8326 }
8327 else
8328 {
8329 relax_start (offset_expr.X_add_symbol);
8330 if (!mips_big_got)
8331 {
8332 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8333 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
8334 mips_gp_register);
8335 load_delay_nop ();
8336 relax_switch ();
8337 }
8338 else
8339 {
8340 int gpdelay;
8341
8342 gpdelay = reg_needs_delay (mips_gp_register);
8343 macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
8344 BFD_RELOC_MIPS_CALL_HI16);
8345 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
8346 PIC_CALL_REG, mips_gp_register);
8347 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8348 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
8349 PIC_CALL_REG);
8350 load_delay_nop ();
8351 relax_switch ();
8352 if (gpdelay)
8353 macro_build (NULL, "nop", "");
8354 }
8355 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
8356 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
8357 mips_gp_register);
8358 load_delay_nop ();
8359 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8360 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
8361 relax_end ();
8362 macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
8363
8364 if (mips_cprestore_offset < 0)
8365 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8366 else
8367 {
8368 if (!mips_frame_reg_valid)
8369 {
8370 as_warn (_("No .frame pseudo-op used in PIC code"));
8371 /* Quiet this warning. */
8372 mips_frame_reg_valid = 1;
8373 }
8374 if (!mips_cprestore_valid)
8375 {
8376 as_warn (_("No .cprestore pseudo-op used in PIC code"));
8377 /* Quiet this warning. */
8378 mips_cprestore_valid = 1;
8379 }
8380 if (mips_opts.noreorder)
8381 macro_build (NULL, "nop", "");
8382 expr1.X_add_number = mips_cprestore_offset;
8383 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
8384 mips_gp_register,
8385 mips_frame_reg,
8386 HAVE_64BIT_ADDRESSES);
8387 }
8388 }
8389 }
8390 else if (mips_pic == VXWORKS_PIC)
8391 as_bad (_("Non-PIC jump used in PIC library"));
8392 else
8393 abort ();
8394
8395 break;
8396
8397 case M_LBUE_AB:
8398 ab = 1;
8399 case M_LBUE_OB:
8400 s = "lbue";
8401 fmt = "t,+j(b)";
8402 offbits = 9;
8403 goto ld_st;
8404 case M_LHUE_AB:
8405 ab = 1;
8406 case M_LHUE_OB:
8407 s = "lhue";
8408 fmt = "t,+j(b)";
8409 offbits = 9;
8410 goto ld_st;
8411 case M_LBE_AB:
8412 ab = 1;
8413 case M_LBE_OB:
8414 s = "lbe";
8415 fmt = "t,+j(b)";
8416 offbits = 9;
8417 goto ld_st;
8418 case M_LHE_AB:
8419 ab = 1;
8420 case M_LHE_OB:
8421 s = "lhe";
8422 fmt = "t,+j(b)";
8423 offbits = 9;
8424 goto ld_st;
8425 case M_LLE_AB:
8426 ab = 1;
8427 case M_LLE_OB:
8428 s = "lle";
8429 fmt = "t,+j(b)";
8430 offbits = 9;
8431 goto ld_st;
8432 case M_LWE_AB:
8433 ab = 1;
8434 case M_LWE_OB:
8435 s = "lwe";
8436 fmt = "t,+j(b)";
8437 offbits = 9;
8438 goto ld_st;
8439 case M_LWLE_AB:
8440 ab = 1;
8441 case M_LWLE_OB:
8442 s = "lwle";
8443 fmt = "t,+j(b)";
8444 offbits = 9;
8445 goto ld_st;
8446 case M_LWRE_AB:
8447 ab = 1;
8448 case M_LWRE_OB:
8449 s = "lwre";
8450 fmt = "t,+j(b)";
8451 offbits = 9;
8452 goto ld_st;
8453 case M_SBE_AB:
8454 ab = 1;
8455 case M_SBE_OB:
8456 s = "sbe";
8457 fmt = "t,+j(b)";
8458 offbits = 9;
8459 goto ld_st;
8460 case M_SCE_AB:
8461 ab = 1;
8462 case M_SCE_OB:
8463 s = "sce";
8464 fmt = "t,+j(b)";
8465 offbits = 9;
8466 goto ld_st;
8467 case M_SHE_AB:
8468 ab = 1;
8469 case M_SHE_OB:
8470 s = "she";
8471 fmt = "t,+j(b)";
8472 offbits = 9;
8473 goto ld_st;
8474 case M_SWE_AB:
8475 ab = 1;
8476 case M_SWE_OB:
8477 s = "swe";
8478 fmt = "t,+j(b)";
8479 offbits = 9;
8480 goto ld_st;
8481 case M_SWLE_AB:
8482 ab = 1;
8483 case M_SWLE_OB:
8484 s = "swle";
8485 fmt = "t,+j(b)";
8486 offbits = 9;
8487 goto ld_st;
8488 case M_SWRE_AB:
8489 ab = 1;
8490 case M_SWRE_OB:
8491 s = "swre";
8492 fmt = "t,+j(b)";
8493 offbits = 9;
8494 goto ld_st;
8495 case M_ACLR_AB:
8496 ab = 1;
8497 case M_ACLR_OB:
8498 s = "aclr";
8499 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8500 fmt = "\\,~(b)";
8501 offbits = 12;
8502 goto ld_st;
8503 case M_ASET_AB:
8504 ab = 1;
8505 case M_ASET_OB:
8506 s = "aset";
8507 treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
8508 fmt = "\\,~(b)";
8509 offbits = 12;
8510 goto ld_st;
8511 case M_LB_AB:
8512 ab = 1;
8513 s = "lb";
8514 fmt = "t,o(b)";
8515 goto ld;
8516 case M_LBU_AB:
8517 ab = 1;
8518 s = "lbu";
8519 fmt = "t,o(b)";
8520 goto ld;
8521 case M_LH_AB:
8522 ab = 1;
8523 s = "lh";
8524 fmt = "t,o(b)";
8525 goto ld;
8526 case M_LHU_AB:
8527 ab = 1;
8528 s = "lhu";
8529 fmt = "t,o(b)";
8530 goto ld;
8531 case M_LW_AB:
8532 ab = 1;
8533 s = "lw";
8534 fmt = "t,o(b)";
8535 goto ld;
8536 case M_LWC0_AB:
8537 ab = 1;
8538 gas_assert (!mips_opts.micromips);
8539 s = "lwc0";
8540 fmt = "E,o(b)";
8541 /* Itbl support may require additional care here. */
8542 coproc = 1;
8543 goto ld_st;
8544 case M_LWC1_AB:
8545 ab = 1;
8546 s = "lwc1";
8547 fmt = "T,o(b)";
8548 /* Itbl support may require additional care here. */
8549 coproc = 1;
8550 goto ld_st;
8551 case M_LWC2_AB:
8552 ab = 1;
8553 case M_LWC2_OB:
8554 s = "lwc2";
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_LWC3_AB:
8561 ab = 1;
8562 gas_assert (!mips_opts.micromips);
8563 s = "lwc3";
8564 fmt = "E,o(b)";
8565 /* Itbl support may require additional care here. */
8566 coproc = 1;
8567 goto ld_st;
8568 case M_LWL_AB:
8569 ab = 1;
8570 case M_LWL_OB:
8571 s = "lwl";
8572 fmt = MEM12_FMT;
8573 offbits = (mips_opts.micromips ? 12 : 16);
8574 goto ld_st;
8575 case M_LWR_AB:
8576 ab = 1;
8577 case M_LWR_OB:
8578 s = "lwr";
8579 fmt = MEM12_FMT;
8580 offbits = (mips_opts.micromips ? 12 : 16);
8581 goto ld_st;
8582 case M_LDC1_AB:
8583 ab = 1;
8584 s = "ldc1";
8585 fmt = "T,o(b)";
8586 /* Itbl support may require additional care here. */
8587 coproc = 1;
8588 goto ld_st;
8589 case M_LDC2_AB:
8590 ab = 1;
8591 case M_LDC2_OB:
8592 s = "ldc2";
8593 fmt = COP12_FMT;
8594 offbits = (mips_opts.micromips ? 12 : 16);
8595 /* Itbl support may require additional care here. */
8596 coproc = 1;
8597 goto ld_st;
8598 case M_LQC2_AB:
8599 ab = 1;
8600 s = "lqc2";
8601 fmt = "E,o(b)";
8602 /* Itbl support may require additional care here. */
8603 coproc = 1;
8604 goto ld_st;
8605 case M_LDC3_AB:
8606 ab = 1;
8607 s = "ldc3";
8608 fmt = "E,o(b)";
8609 /* Itbl support may require additional care here. */
8610 coproc = 1;
8611 goto ld_st;
8612 case M_LDL_AB:
8613 ab = 1;
8614 case M_LDL_OB:
8615 s = "ldl";
8616 fmt = MEM12_FMT;
8617 offbits = (mips_opts.micromips ? 12 : 16);
8618 goto ld_st;
8619 case M_LDR_AB:
8620 ab = 1;
8621 case M_LDR_OB:
8622 s = "ldr";
8623 fmt = MEM12_FMT;
8624 offbits = (mips_opts.micromips ? 12 : 16);
8625 goto ld_st;
8626 case M_LL_AB:
8627 ab = 1;
8628 case M_LL_OB:
8629 s = "ll";
8630 fmt = MEM12_FMT;
8631 offbits = (mips_opts.micromips ? 12 : 16);
8632 goto ld;
8633 case M_LLD_AB:
8634 ab = 1;
8635 case M_LLD_OB:
8636 s = "lld";
8637 fmt = MEM12_FMT;
8638 offbits = (mips_opts.micromips ? 12 : 16);
8639 goto ld;
8640 case M_LWU_AB:
8641 ab = 1;
8642 case M_LWU_OB:
8643 s = "lwu";
8644 fmt = MEM12_FMT;
8645 offbits = (mips_opts.micromips ? 12 : 16);
8646 goto ld;
8647 case M_LWP_AB:
8648 ab = 1;
8649 case M_LWP_OB:
8650 gas_assert (mips_opts.micromips);
8651 s = "lwp";
8652 fmt = "t,~(b)";
8653 offbits = 12;
8654 lp = 1;
8655 goto ld;
8656 case M_LDP_AB:
8657 ab = 1;
8658 case M_LDP_OB:
8659 gas_assert (mips_opts.micromips);
8660 s = "ldp";
8661 fmt = "t,~(b)";
8662 offbits = 12;
8663 lp = 1;
8664 goto ld;
8665 case M_LWM_AB:
8666 ab = 1;
8667 case M_LWM_OB:
8668 gas_assert (mips_opts.micromips);
8669 s = "lwm";
8670 fmt = "n,~(b)";
8671 offbits = 12;
8672 goto ld_st;
8673 case M_LDM_AB:
8674 ab = 1;
8675 case M_LDM_OB:
8676 gas_assert (mips_opts.micromips);
8677 s = "ldm";
8678 fmt = "n,~(b)";
8679 offbits = 12;
8680 goto ld_st;
8681
8682 ld:
8683 /* We don't want to use $0 as tempreg. */
8684 if (breg == treg + lp || treg + lp == ZERO)
8685 goto ld_st;
8686 else
8687 tempreg = treg + lp;
8688 goto ld_noat;
8689
8690 case M_SB_AB:
8691 ab = 1;
8692 s = "sb";
8693 fmt = "t,o(b)";
8694 goto ld_st;
8695 case M_SH_AB:
8696 ab = 1;
8697 s = "sh";
8698 fmt = "t,o(b)";
8699 goto ld_st;
8700 case M_SW_AB:
8701 ab = 1;
8702 s = "sw";
8703 fmt = "t,o(b)";
8704 goto ld_st;
8705 case M_SWC0_AB:
8706 ab = 1;
8707 gas_assert (!mips_opts.micromips);
8708 s = "swc0";
8709 fmt = "E,o(b)";
8710 /* Itbl support may require additional care here. */
8711 coproc = 1;
8712 goto ld_st;
8713 case M_SWC1_AB:
8714 ab = 1;
8715 s = "swc1";
8716 fmt = "T,o(b)";
8717 /* Itbl support may require additional care here. */
8718 coproc = 1;
8719 goto ld_st;
8720 case M_SWC2_AB:
8721 ab = 1;
8722 case M_SWC2_OB:
8723 s = "swc2";
8724 fmt = COP12_FMT;
8725 offbits = (mips_opts.micromips ? 12 : 16);
8726 /* Itbl support may require additional care here. */
8727 coproc = 1;
8728 goto ld_st;
8729 case M_SWC3_AB:
8730 ab = 1;
8731 gas_assert (!mips_opts.micromips);
8732 s = "swc3";
8733 fmt = "E,o(b)";
8734 /* Itbl support may require additional care here. */
8735 coproc = 1;
8736 goto ld_st;
8737 case M_SWL_AB:
8738 ab = 1;
8739 case M_SWL_OB:
8740 s = "swl";
8741 fmt = MEM12_FMT;
8742 offbits = (mips_opts.micromips ? 12 : 16);
8743 goto ld_st;
8744 case M_SWR_AB:
8745 ab = 1;
8746 case M_SWR_OB:
8747 s = "swr";
8748 fmt = MEM12_FMT;
8749 offbits = (mips_opts.micromips ? 12 : 16);
8750 goto ld_st;
8751 case M_SC_AB:
8752 ab = 1;
8753 case M_SC_OB:
8754 s = "sc";
8755 fmt = MEM12_FMT;
8756 offbits = (mips_opts.micromips ? 12 : 16);
8757 goto ld_st;
8758 case M_SCD_AB:
8759 ab = 1;
8760 case M_SCD_OB:
8761 s = "scd";
8762 fmt = MEM12_FMT;
8763 offbits = (mips_opts.micromips ? 12 : 16);
8764 goto ld_st;
8765 case M_CACHE_AB:
8766 ab = 1;
8767 case M_CACHE_OB:
8768 s = "cache";
8769 fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8770 offbits = (mips_opts.micromips ? 12 : 16);
8771 goto ld_st;
8772 case M_CACHEE_AB:
8773 ab = 1;
8774 case M_CACHEE_OB:
8775 s = "cachee";
8776 fmt = "k,+j(b)";
8777 offbits = 9;
8778 goto ld_st;
8779 case M_PREF_AB:
8780 ab = 1;
8781 case M_PREF_OB:
8782 s = "pref";
8783 fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8784 offbits = (mips_opts.micromips ? 12 : 16);
8785 goto ld_st;
8786 case M_PREFE_AB:
8787 ab = 1;
8788 case M_PREFE_OB:
8789 s = "prefe";
8790 fmt = "k,+j(b)";
8791 offbits = 9;
8792 goto ld_st;
8793 case M_SDC1_AB:
8794 ab = 1;
8795 s = "sdc1";
8796 fmt = "T,o(b)";
8797 coproc = 1;
8798 /* Itbl support may require additional care here. */
8799 goto ld_st;
8800 case M_SDC2_AB:
8801 ab = 1;
8802 case M_SDC2_OB:
8803 s = "sdc2";
8804 fmt = COP12_FMT;
8805 offbits = (mips_opts.micromips ? 12 : 16);
8806 /* Itbl support may require additional care here. */
8807 coproc = 1;
8808 goto ld_st;
8809 case M_SQC2_AB:
8810 ab = 1;
8811 s = "sqc2";
8812 fmt = "E,o(b)";
8813 /* Itbl support may require additional care here. */
8814 coproc = 1;
8815 goto ld_st;
8816 case M_SDC3_AB:
8817 ab = 1;
8818 gas_assert (!mips_opts.micromips);
8819 s = "sdc3";
8820 fmt = "E,o(b)";
8821 /* Itbl support may require additional care here. */
8822 coproc = 1;
8823 goto ld_st;
8824 case M_SDL_AB:
8825 ab = 1;
8826 case M_SDL_OB:
8827 s = "sdl";
8828 fmt = MEM12_FMT;
8829 offbits = (mips_opts.micromips ? 12 : 16);
8830 goto ld_st;
8831 case M_SDR_AB:
8832 ab = 1;
8833 case M_SDR_OB:
8834 s = "sdr";
8835 fmt = MEM12_FMT;
8836 offbits = (mips_opts.micromips ? 12 : 16);
8837 goto ld_st;
8838 case M_SWP_AB:
8839 ab = 1;
8840 case M_SWP_OB:
8841 gas_assert (mips_opts.micromips);
8842 s = "swp";
8843 fmt = "t,~(b)";
8844 offbits = 12;
8845 goto ld_st;
8846 case M_SDP_AB:
8847 ab = 1;
8848 case M_SDP_OB:
8849 gas_assert (mips_opts.micromips);
8850 s = "sdp";
8851 fmt = "t,~(b)";
8852 offbits = 12;
8853 goto ld_st;
8854 case M_SWM_AB:
8855 ab = 1;
8856 case M_SWM_OB:
8857 gas_assert (mips_opts.micromips);
8858 s = "swm";
8859 fmt = "n,~(b)";
8860 offbits = 12;
8861 goto ld_st;
8862 case M_SDM_AB:
8863 ab = 1;
8864 case M_SDM_OB:
8865 gas_assert (mips_opts.micromips);
8866 s = "sdm";
8867 fmt = "n,~(b)";
8868 offbits = 12;
8869
8870 ld_st:
8871 tempreg = AT;
8872 used_at = 1;
8873 ld_noat:
8874 if (offset_expr.X_op != O_constant
8875 && offset_expr.X_op != O_symbol)
8876 {
8877 as_bad (_("Expression too complex"));
8878 offset_expr.X_op = O_constant;
8879 }
8880
8881 if (HAVE_32BIT_ADDRESSES
8882 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8883 {
8884 char value [32];
8885
8886 sprintf_vma (value, offset_expr.X_add_number);
8887 as_bad (_("Number (0x%s) larger than 32 bits"), value);
8888 }
8889
8890 /* A constant expression in PIC code can be handled just as it
8891 is in non PIC code. */
8892 if (offset_expr.X_op == O_constant)
8893 {
8894 int hipart = 0;
8895
8896 expr1.X_add_number = offset_expr.X_add_number;
8897 normalize_address_expr (&expr1);
8898 if ((offbits == 0 || offbits == 16)
8899 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8900 {
8901 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8902 & ~(bfd_vma) 0xffff);
8903 hipart = 1;
8904 }
8905 else if (offbits == 12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8906 {
8907 expr1.X_add_number = ((expr1.X_add_number + 0x800)
8908 & ~(bfd_vma) 0xfff);
8909 hipart = 1;
8910 }
8911 else if (offbits == 9 && !IS_SEXT_9BIT_NUM (expr1.X_add_number))
8912 {
8913 expr1.X_add_number = ((expr1.X_add_number + 0x100)
8914 & ~(bfd_vma) 0x1ff);
8915 hipart = 1;
8916 }
8917 if (hipart)
8918 {
8919 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8920 if (breg != 0)
8921 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8922 tempreg, tempreg, breg);
8923 breg = tempreg;
8924 }
8925 if (offbits == 0)
8926 {
8927 if (offset_expr.X_add_number == 0)
8928 tempreg = breg;
8929 else
8930 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
8931 "t,r,j", tempreg, breg, BFD_RELOC_LO16);
8932 macro_build (NULL, s, fmt, treg, tempreg);
8933 }
8934 else if (offbits == 16)
8935 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8936 else
8937 macro_build (NULL, s, fmt,
8938 treg, (unsigned long) offset_expr.X_add_number, breg);
8939 }
8940 else if (offbits != 16)
8941 {
8942 /* The offset field is too narrow to be used for a low-part
8943 relocation, so load the whole address into the auxillary
8944 register. In the case of "A(b)" addresses, we first load
8945 absolute address "A" into the register and then add base
8946 register "b". In the case of "o(b)" addresses, we simply
8947 need to add 16-bit offset "o" to base register "b", and
8948 offset_reloc already contains the relocations associated
8949 with "o". */
8950 if (ab)
8951 {
8952 load_address (tempreg, &offset_expr, &used_at);
8953 if (breg != 0)
8954 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8955 tempreg, tempreg, breg);
8956 }
8957 else
8958 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8959 tempreg, breg, -1,
8960 offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8961 expr1.X_add_number = 0;
8962 if (offbits == 0)
8963 macro_build (NULL, s, fmt, treg, tempreg);
8964 else
8965 macro_build (NULL, s, fmt,
8966 treg, (unsigned long) expr1.X_add_number, tempreg);
8967 }
8968 else if (mips_pic == NO_PIC)
8969 {
8970 /* If this is a reference to a GP relative symbol, and there
8971 is no base register, we want
8972 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
8973 Otherwise, if there is no base register, we want
8974 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8975 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8976 If we have a constant, we need two instructions anyhow,
8977 so we always use the latter form.
8978
8979 If we have a base register, and this is a reference to a
8980 GP relative symbol, we want
8981 addu $tempreg,$breg,$gp
8982 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
8983 Otherwise we want
8984 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
8985 addu $tempreg,$tempreg,$breg
8986 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8987 With a constant we always use the latter case.
8988
8989 With 64bit address space and no base register and $at usable,
8990 we want
8991 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8992 lui $at,<sym> (BFD_RELOC_HI16_S)
8993 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
8994 dsll32 $tempreg,0
8995 daddu $tempreg,$at
8996 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
8997 If we have a base register, we want
8998 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
8999 lui $at,<sym> (BFD_RELOC_HI16_S)
9000 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9001 daddu $at,$breg
9002 dsll32 $tempreg,0
9003 daddu $tempreg,$at
9004 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9005
9006 Without $at we can't generate the optimal path for superscalar
9007 processors here since this would require two temporary registers.
9008 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
9009 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9010 dsll $tempreg,16
9011 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
9012 dsll $tempreg,16
9013 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9014 If we have a base register, we want
9015 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
9016 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
9017 dsll $tempreg,16
9018 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
9019 dsll $tempreg,16
9020 daddu $tempreg,$tempreg,$breg
9021 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
9022
9023 For GP relative symbols in 64bit address space we can use
9024 the same sequence as in 32bit address space. */
9025 if (HAVE_64BIT_SYMBOLS)
9026 {
9027 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9028 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9029 {
9030 relax_start (offset_expr.X_add_symbol);
9031 if (breg == 0)
9032 {
9033 macro_build (&offset_expr, s, fmt, treg,
9034 BFD_RELOC_GPREL16, mips_gp_register);
9035 }
9036 else
9037 {
9038 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9039 tempreg, breg, mips_gp_register);
9040 macro_build (&offset_expr, s, fmt, treg,
9041 BFD_RELOC_GPREL16, tempreg);
9042 }
9043 relax_switch ();
9044 }
9045
9046 if (used_at == 0 && mips_opts.at)
9047 {
9048 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9049 BFD_RELOC_MIPS_HIGHEST);
9050 macro_build (&offset_expr, "lui", LUI_FMT, AT,
9051 BFD_RELOC_HI16_S);
9052 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9053 tempreg, BFD_RELOC_MIPS_HIGHER);
9054 if (breg != 0)
9055 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
9056 macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
9057 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
9058 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
9059 tempreg);
9060 used_at = 1;
9061 }
9062 else
9063 {
9064 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9065 BFD_RELOC_MIPS_HIGHEST);
9066 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9067 tempreg, BFD_RELOC_MIPS_HIGHER);
9068 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9069 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
9070 tempreg, BFD_RELOC_HI16_S);
9071 macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
9072 if (breg != 0)
9073 macro_build (NULL, "daddu", "d,v,t",
9074 tempreg, tempreg, breg);
9075 macro_build (&offset_expr, s, fmt, treg,
9076 BFD_RELOC_LO16, tempreg);
9077 }
9078
9079 if (mips_relax.sequence)
9080 relax_end ();
9081 break;
9082 }
9083
9084 if (breg == 0)
9085 {
9086 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9087 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9088 {
9089 relax_start (offset_expr.X_add_symbol);
9090 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
9091 mips_gp_register);
9092 relax_switch ();
9093 }
9094 macro_build_lui (&offset_expr, tempreg);
9095 macro_build (&offset_expr, s, fmt, treg,
9096 BFD_RELOC_LO16, tempreg);
9097 if (mips_relax.sequence)
9098 relax_end ();
9099 }
9100 else
9101 {
9102 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9103 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9104 {
9105 relax_start (offset_expr.X_add_symbol);
9106 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9107 tempreg, breg, mips_gp_register);
9108 macro_build (&offset_expr, s, fmt, treg,
9109 BFD_RELOC_GPREL16, tempreg);
9110 relax_switch ();
9111 }
9112 macro_build_lui (&offset_expr, tempreg);
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_LO16, tempreg);
9117 if (mips_relax.sequence)
9118 relax_end ();
9119 }
9120 }
9121 else if (!mips_big_got)
9122 {
9123 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
9124
9125 /* If this is a reference to an external symbol, we want
9126 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9127 nop
9128 <op> $treg,0($tempreg)
9129 Otherwise we want
9130 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9131 nop
9132 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9133 <op> $treg,0($tempreg)
9134
9135 For NewABI, we want
9136 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9137 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
9138
9139 If there is a base register, we add it to $tempreg before
9140 the <op>. If there is a constant, we stick it in the
9141 <op> instruction. We don't handle constants larger than
9142 16 bits, because we have no way to load the upper 16 bits
9143 (actually, we could handle them for the subset of cases
9144 in which we are not using $at). */
9145 gas_assert (offset_expr.X_op == O_symbol);
9146 if (HAVE_NEWABI)
9147 {
9148 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9149 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9150 if (breg != 0)
9151 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9152 tempreg, tempreg, breg);
9153 macro_build (&offset_expr, s, fmt, treg,
9154 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9155 break;
9156 }
9157 expr1.X_add_number = offset_expr.X_add_number;
9158 offset_expr.X_add_number = 0;
9159 if (expr1.X_add_number < -0x8000
9160 || expr1.X_add_number >= 0x8000)
9161 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9162 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9163 lw_reloc_type, mips_gp_register);
9164 load_delay_nop ();
9165 relax_start (offset_expr.X_add_symbol);
9166 relax_switch ();
9167 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9168 tempreg, BFD_RELOC_LO16);
9169 relax_end ();
9170 if (breg != 0)
9171 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9172 tempreg, tempreg, breg);
9173 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9174 }
9175 else if (mips_big_got && !HAVE_NEWABI)
9176 {
9177 int gpdelay;
9178
9179 /* If this is a reference to an external symbol, we want
9180 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9181 addu $tempreg,$tempreg,$gp
9182 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9183 <op> $treg,0($tempreg)
9184 Otherwise we want
9185 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9186 nop
9187 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
9188 <op> $treg,0($tempreg)
9189 If there is a base register, we add it to $tempreg before
9190 the <op>. If there is a constant, we stick it in the
9191 <op> instruction. We don't handle constants larger than
9192 16 bits, because we have no way to load the upper 16 bits
9193 (actually, we could handle them for the subset of cases
9194 in which we are not using $at). */
9195 gas_assert (offset_expr.X_op == O_symbol);
9196 expr1.X_add_number = offset_expr.X_add_number;
9197 offset_expr.X_add_number = 0;
9198 if (expr1.X_add_number < -0x8000
9199 || expr1.X_add_number >= 0x8000)
9200 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9201 gpdelay = reg_needs_delay (mips_gp_register);
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 relax_switch ();
9210 if (gpdelay)
9211 macro_build (NULL, "nop", "");
9212 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9213 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9214 load_delay_nop ();
9215 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
9216 tempreg, BFD_RELOC_LO16);
9217 relax_end ();
9218
9219 if (breg != 0)
9220 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9221 tempreg, tempreg, breg);
9222 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9223 }
9224 else if (mips_big_got && HAVE_NEWABI)
9225 {
9226 /* If this is a reference to an external symbol, we want
9227 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9228 add $tempreg,$tempreg,$gp
9229 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9230 <op> $treg,<ofst>($tempreg)
9231 Otherwise, for local symbols, we want:
9232 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
9233 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
9234 gas_assert (offset_expr.X_op == O_symbol);
9235 expr1.X_add_number = offset_expr.X_add_number;
9236 offset_expr.X_add_number = 0;
9237 if (expr1.X_add_number < -0x8000
9238 || expr1.X_add_number >= 0x8000)
9239 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9240 relax_start (offset_expr.X_add_symbol);
9241 macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
9242 BFD_RELOC_MIPS_GOT_HI16);
9243 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
9244 mips_gp_register);
9245 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9246 BFD_RELOC_MIPS_GOT_LO16, tempreg);
9247 if (breg != 0)
9248 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9249 tempreg, tempreg, breg);
9250 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
9251
9252 relax_switch ();
9253 offset_expr.X_add_number = expr1.X_add_number;
9254 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
9255 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
9256 if (breg != 0)
9257 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9258 tempreg, tempreg, breg);
9259 macro_build (&offset_expr, s, fmt, treg,
9260 BFD_RELOC_MIPS_GOT_OFST, tempreg);
9261 relax_end ();
9262 }
9263 else
9264 abort ();
9265
9266 break;
9267
9268 case M_JRADDIUSP:
9269 gas_assert (mips_opts.micromips);
9270 gas_assert (mips_opts.insn32);
9271 start_noreorder ();
9272 macro_build (NULL, "jr", "s", RA);
9273 expr1.X_add_number = EXTRACT_OPERAND (1, IMMP, *ip) << 2;
9274 macro_build (&expr1, "addiu", "t,r,j", SP, SP, BFD_RELOC_LO16);
9275 end_noreorder ();
9276 break;
9277
9278 case M_JRC:
9279 gas_assert (mips_opts.micromips);
9280 gas_assert (mips_opts.insn32);
9281 macro_build (NULL, "jr", "s", sreg);
9282 if (mips_opts.noreorder)
9283 macro_build (NULL, "nop", "");
9284 break;
9285
9286 case M_LI:
9287 case M_LI_S:
9288 load_register (treg, &imm_expr, 0);
9289 break;
9290
9291 case M_DLI:
9292 load_register (treg, &imm_expr, 1);
9293 break;
9294
9295 case M_LI_SS:
9296 if (imm_expr.X_op == O_constant)
9297 {
9298 used_at = 1;
9299 load_register (AT, &imm_expr, 0);
9300 macro_build (NULL, "mtc1", "t,G", AT, treg);
9301 break;
9302 }
9303 else
9304 {
9305 gas_assert (offset_expr.X_op == O_symbol
9306 && strcmp (segment_name (S_GET_SEGMENT
9307 (offset_expr.X_add_symbol)),
9308 ".lit4") == 0
9309 && offset_expr.X_add_number == 0);
9310 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
9311 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9312 break;
9313 }
9314
9315 case M_LI_D:
9316 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
9317 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
9318 order 32 bits of the value and the low order 32 bits are either
9319 zero or in OFFSET_EXPR. */
9320 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9321 {
9322 if (HAVE_64BIT_GPRS)
9323 load_register (treg, &imm_expr, 1);
9324 else
9325 {
9326 int hreg, lreg;
9327
9328 if (target_big_endian)
9329 {
9330 hreg = treg;
9331 lreg = treg + 1;
9332 }
9333 else
9334 {
9335 hreg = treg + 1;
9336 lreg = treg;
9337 }
9338
9339 if (hreg <= 31)
9340 load_register (hreg, &imm_expr, 0);
9341 if (lreg <= 31)
9342 {
9343 if (offset_expr.X_op == O_absent)
9344 move_register (lreg, 0);
9345 else
9346 {
9347 gas_assert (offset_expr.X_op == O_constant);
9348 load_register (lreg, &offset_expr, 0);
9349 }
9350 }
9351 }
9352 break;
9353 }
9354
9355 /* We know that sym is in the .rdata section. First we get the
9356 upper 16 bits of the address. */
9357 if (mips_pic == NO_PIC)
9358 {
9359 macro_build_lui (&offset_expr, AT);
9360 used_at = 1;
9361 }
9362 else
9363 {
9364 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9365 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9366 used_at = 1;
9367 }
9368
9369 /* Now we load the register(s). */
9370 if (HAVE_64BIT_GPRS)
9371 {
9372 used_at = 1;
9373 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9374 }
9375 else
9376 {
9377 used_at = 1;
9378 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
9379 if (treg != RA)
9380 {
9381 /* FIXME: How in the world do we deal with the possible
9382 overflow here? */
9383 offset_expr.X_add_number += 4;
9384 macro_build (&offset_expr, "lw", "t,o(b)",
9385 treg + 1, BFD_RELOC_LO16, AT);
9386 }
9387 }
9388 break;
9389
9390 case M_LI_DD:
9391 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
9392 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
9393 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
9394 the value and the low order 32 bits are either zero or in
9395 OFFSET_EXPR. */
9396 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
9397 {
9398 used_at = 1;
9399 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
9400 if (HAVE_64BIT_FPRS)
9401 {
9402 gas_assert (HAVE_64BIT_GPRS);
9403 macro_build (NULL, "dmtc1", "t,S", AT, treg);
9404 }
9405 else
9406 {
9407 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
9408 if (offset_expr.X_op == O_absent)
9409 macro_build (NULL, "mtc1", "t,G", 0, treg);
9410 else
9411 {
9412 gas_assert (offset_expr.X_op == O_constant);
9413 load_register (AT, &offset_expr, 0);
9414 macro_build (NULL, "mtc1", "t,G", AT, treg);
9415 }
9416 }
9417 break;
9418 }
9419
9420 gas_assert (offset_expr.X_op == O_symbol
9421 && offset_expr.X_add_number == 0);
9422 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
9423 if (strcmp (s, ".lit8") == 0)
9424 {
9425 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9426 {
9427 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
9428 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
9429 break;
9430 }
9431 breg = mips_gp_register;
9432 r = BFD_RELOC_MIPS_LITERAL;
9433 goto dob;
9434 }
9435 else
9436 {
9437 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
9438 used_at = 1;
9439 if (mips_pic != NO_PIC)
9440 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9441 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9442 else
9443 {
9444 /* FIXME: This won't work for a 64 bit address. */
9445 macro_build_lui (&offset_expr, AT);
9446 }
9447
9448 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch) || mips_opts.micromips)
9449 {
9450 macro_build (&offset_expr, "ldc1", "T,o(b)",
9451 treg, BFD_RELOC_LO16, AT);
9452 break;
9453 }
9454 breg = AT;
9455 r = BFD_RELOC_LO16;
9456 goto dob;
9457 }
9458
9459 case M_L_DOB:
9460 /* Even on a big endian machine $fn comes before $fn+1. We have
9461 to adjust when loading from memory. */
9462 r = BFD_RELOC_LO16;
9463 dob:
9464 gas_assert (!mips_opts.micromips);
9465 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9466 macro_build (&offset_expr, "lwc1", "T,o(b)",
9467 target_big_endian ? treg + 1 : treg, r, breg);
9468 /* FIXME: A possible overflow which I don't know how to deal
9469 with. */
9470 offset_expr.X_add_number += 4;
9471 macro_build (&offset_expr, "lwc1", "T,o(b)",
9472 target_big_endian ? treg : treg + 1, r, breg);
9473 break;
9474
9475 case M_S_DOB:
9476 gas_assert (!mips_opts.micromips);
9477 gas_assert (!CPU_HAS_LDC1_SDC1 (mips_opts.arch));
9478 /* Even on a big endian machine $fn comes before $fn+1. We have
9479 to adjust when storing to memory. */
9480 macro_build (&offset_expr, "swc1", "T,o(b)",
9481 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
9482 offset_expr.X_add_number += 4;
9483 macro_build (&offset_expr, "swc1", "T,o(b)",
9484 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
9485 break;
9486
9487 case M_L_DAB:
9488 gas_assert (!mips_opts.micromips);
9489 /*
9490 * The MIPS assembler seems to check for X_add_number not
9491 * being double aligned and generating:
9492 * lui at,%hi(foo+1)
9493 * addu at,at,v1
9494 * addiu at,at,%lo(foo+1)
9495 * lwc1 f2,0(at)
9496 * lwc1 f3,4(at)
9497 * But, the resulting address is the same after relocation so why
9498 * generate the extra instruction?
9499 */
9500 /* Itbl support may require additional care here. */
9501 coproc = 1;
9502 fmt = "T,o(b)";
9503 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9504 {
9505 s = "ldc1";
9506 goto ld_st;
9507 }
9508 s = "lwc1";
9509 goto ldd_std;
9510
9511 case M_S_DAB:
9512 gas_assert (!mips_opts.micromips);
9513 /* Itbl support may require additional care here. */
9514 coproc = 1;
9515 fmt = "T,o(b)";
9516 if (CPU_HAS_LDC1_SDC1 (mips_opts.arch))
9517 {
9518 s = "sdc1";
9519 goto ld_st;
9520 }
9521 s = "swc1";
9522 goto ldd_std;
9523
9524 case M_LQ_AB:
9525 fmt = "t,o(b)";
9526 s = "lq";
9527 goto ld;
9528
9529 case M_SQ_AB:
9530 fmt = "t,o(b)";
9531 s = "sq";
9532 goto ld_st;
9533
9534 case M_LD_AB:
9535 fmt = "t,o(b)";
9536 if (HAVE_64BIT_GPRS)
9537 {
9538 s = "ld";
9539 goto ld;
9540 }
9541 s = "lw";
9542 goto ldd_std;
9543
9544 case M_SD_AB:
9545 fmt = "t,o(b)";
9546 if (HAVE_64BIT_GPRS)
9547 {
9548 s = "sd";
9549 goto ld_st;
9550 }
9551 s = "sw";
9552
9553 ldd_std:
9554 if (offset_expr.X_op != O_symbol
9555 && offset_expr.X_op != O_constant)
9556 {
9557 as_bad (_("Expression too complex"));
9558 offset_expr.X_op = O_constant;
9559 }
9560
9561 if (HAVE_32BIT_ADDRESSES
9562 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
9563 {
9564 char value [32];
9565
9566 sprintf_vma (value, offset_expr.X_add_number);
9567 as_bad (_("Number (0x%s) larger than 32 bits"), value);
9568 }
9569
9570 /* Even on a big endian machine $fn comes before $fn+1. We have
9571 to adjust when loading from memory. We set coproc if we must
9572 load $fn+1 first. */
9573 /* Itbl support may require additional care here. */
9574 if (!target_big_endian)
9575 coproc = 0;
9576
9577 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
9578 {
9579 /* If this is a reference to a GP relative symbol, we want
9580 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
9581 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
9582 If we have a base register, we use this
9583 addu $at,$breg,$gp
9584 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
9585 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
9586 If this is not a GP relative symbol, we want
9587 lui $at,<sym> (BFD_RELOC_HI16_S)
9588 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9589 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9590 If there is a base register, we add it to $at after the
9591 lui instruction. If there is a constant, we always use
9592 the last case. */
9593 if (offset_expr.X_op == O_symbol
9594 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
9595 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
9596 {
9597 relax_start (offset_expr.X_add_symbol);
9598 if (breg == 0)
9599 {
9600 tempreg = mips_gp_register;
9601 }
9602 else
9603 {
9604 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9605 AT, breg, mips_gp_register);
9606 tempreg = AT;
9607 used_at = 1;
9608 }
9609
9610 /* Itbl support may require additional care here. */
9611 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9612 BFD_RELOC_GPREL16, tempreg);
9613 offset_expr.X_add_number += 4;
9614
9615 /* Set mips_optimize to 2 to avoid inserting an
9616 undesired nop. */
9617 hold_mips_optimize = mips_optimize;
9618 mips_optimize = 2;
9619 /* Itbl support may require additional care here. */
9620 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9621 BFD_RELOC_GPREL16, tempreg);
9622 mips_optimize = hold_mips_optimize;
9623
9624 relax_switch ();
9625
9626 offset_expr.X_add_number -= 4;
9627 }
9628 used_at = 1;
9629 macro_build_lui (&offset_expr, AT);
9630 if (breg != 0)
9631 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9632 /* Itbl support may require additional care here. */
9633 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9634 BFD_RELOC_LO16, AT);
9635 /* FIXME: How do we handle overflow here? */
9636 offset_expr.X_add_number += 4;
9637 /* Itbl support may require additional care here. */
9638 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9639 BFD_RELOC_LO16, AT);
9640 if (mips_relax.sequence)
9641 relax_end ();
9642 }
9643 else if (!mips_big_got)
9644 {
9645 /* If this is a reference to an external symbol, we want
9646 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9647 nop
9648 <op> $treg,0($at)
9649 <op> $treg+1,4($at)
9650 Otherwise we want
9651 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9652 nop
9653 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9654 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9655 If there is a base register we add it to $at before the
9656 lwc1 instructions. If there is a constant we include it
9657 in the lwc1 instructions. */
9658 used_at = 1;
9659 expr1.X_add_number = offset_expr.X_add_number;
9660 if (expr1.X_add_number < -0x8000
9661 || expr1.X_add_number >= 0x8000 - 4)
9662 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9663 load_got_offset (AT, &offset_expr);
9664 load_delay_nop ();
9665 if (breg != 0)
9666 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9667
9668 /* Set mips_optimize to 2 to avoid inserting an undesired
9669 nop. */
9670 hold_mips_optimize = mips_optimize;
9671 mips_optimize = 2;
9672
9673 /* Itbl support may require additional care here. */
9674 relax_start (offset_expr.X_add_symbol);
9675 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9676 BFD_RELOC_LO16, AT);
9677 expr1.X_add_number += 4;
9678 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9679 BFD_RELOC_LO16, AT);
9680 relax_switch ();
9681 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9682 BFD_RELOC_LO16, AT);
9683 offset_expr.X_add_number += 4;
9684 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9685 BFD_RELOC_LO16, AT);
9686 relax_end ();
9687
9688 mips_optimize = hold_mips_optimize;
9689 }
9690 else if (mips_big_got)
9691 {
9692 int gpdelay;
9693
9694 /* If this is a reference to an external symbol, we want
9695 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
9696 addu $at,$at,$gp
9697 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
9698 nop
9699 <op> $treg,0($at)
9700 <op> $treg+1,4($at)
9701 Otherwise we want
9702 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9703 nop
9704 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
9705 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
9706 If there is a base register we add it to $at before the
9707 lwc1 instructions. If there is a constant we include it
9708 in the lwc1 instructions. */
9709 used_at = 1;
9710 expr1.X_add_number = offset_expr.X_add_number;
9711 offset_expr.X_add_number = 0;
9712 if (expr1.X_add_number < -0x8000
9713 || expr1.X_add_number >= 0x8000 - 4)
9714 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9715 gpdelay = reg_needs_delay (mips_gp_register);
9716 relax_start (offset_expr.X_add_symbol);
9717 macro_build (&offset_expr, "lui", LUI_FMT,
9718 AT, BFD_RELOC_MIPS_GOT_HI16);
9719 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9720 AT, AT, mips_gp_register);
9721 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9722 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9723 load_delay_nop ();
9724 if (breg != 0)
9725 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9726 /* Itbl support may require additional care here. */
9727 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9728 BFD_RELOC_LO16, AT);
9729 expr1.X_add_number += 4;
9730
9731 /* Set mips_optimize to 2 to avoid inserting an undesired
9732 nop. */
9733 hold_mips_optimize = mips_optimize;
9734 mips_optimize = 2;
9735 /* Itbl support may require additional care here. */
9736 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9737 BFD_RELOC_LO16, AT);
9738 mips_optimize = hold_mips_optimize;
9739 expr1.X_add_number -= 4;
9740
9741 relax_switch ();
9742 offset_expr.X_add_number = expr1.X_add_number;
9743 if (gpdelay)
9744 macro_build (NULL, "nop", "");
9745 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9746 BFD_RELOC_MIPS_GOT16, mips_gp_register);
9747 load_delay_nop ();
9748 if (breg != 0)
9749 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9750 /* Itbl support may require additional care here. */
9751 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9752 BFD_RELOC_LO16, AT);
9753 offset_expr.X_add_number += 4;
9754
9755 /* Set mips_optimize to 2 to avoid inserting an undesired
9756 nop. */
9757 hold_mips_optimize = mips_optimize;
9758 mips_optimize = 2;
9759 /* Itbl support may require additional care here. */
9760 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9761 BFD_RELOC_LO16, AT);
9762 mips_optimize = hold_mips_optimize;
9763 relax_end ();
9764 }
9765 else
9766 abort ();
9767
9768 break;
9769
9770 case M_LD_OB:
9771 s = HAVE_64BIT_GPRS ? "ld" : "lw";
9772 goto sd_ob;
9773 case M_SD_OB:
9774 s = HAVE_64BIT_GPRS ? "sd" : "sw";
9775 sd_ob:
9776 macro_build (&offset_expr, s, "t,o(b)", treg,
9777 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9778 breg);
9779 if (!HAVE_64BIT_GPRS)
9780 {
9781 offset_expr.X_add_number += 4;
9782 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9783 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9784 breg);
9785 }
9786 break;
9787
9788
9789 case M_SAA_AB:
9790 ab = 1;
9791 case M_SAA_OB:
9792 s = "saa";
9793 offbits = 0;
9794 fmt = "t,(b)";
9795 goto ld_st;
9796 case M_SAAD_AB:
9797 ab = 1;
9798 case M_SAAD_OB:
9799 s = "saad";
9800 offbits = 0;
9801 fmt = "t,(b)";
9802 goto ld_st;
9803
9804 /* New code added to support COPZ instructions.
9805 This code builds table entries out of the macros in mip_opcodes.
9806 R4000 uses interlocks to handle coproc delays.
9807 Other chips (like the R3000) require nops to be inserted for delays.
9808
9809 FIXME: Currently, we require that the user handle delays.
9810 In order to fill delay slots for non-interlocked chips,
9811 we must have a way to specify delays based on the coprocessor.
9812 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9813 What are the side-effects of the cop instruction?
9814 What cache support might we have and what are its effects?
9815 Both coprocessor & memory require delays. how long???
9816 What registers are read/set/modified?
9817
9818 If an itbl is provided to interpret cop instructions,
9819 this knowledge can be encoded in the itbl spec. */
9820
9821 case M_COP0:
9822 s = "c0";
9823 goto copz;
9824 case M_COP1:
9825 s = "c1";
9826 goto copz;
9827 case M_COP2:
9828 s = "c2";
9829 goto copz;
9830 case M_COP3:
9831 s = "c3";
9832 copz:
9833 gas_assert (!mips_opts.micromips);
9834 /* For now we just do C (same as Cz). The parameter will be
9835 stored in insn_opcode by mips_ip. */
9836 macro_build (NULL, s, "C", ip->insn_opcode);
9837 break;
9838
9839 case M_MOVE:
9840 move_register (dreg, sreg);
9841 break;
9842
9843 case M_MOVEP:
9844 gas_assert (mips_opts.micromips);
9845 gas_assert (mips_opts.insn32);
9846 dreg = micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
9847 breg = micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
9848 sreg = micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
9849 treg = micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
9850 move_register (dreg, sreg);
9851 move_register (breg, treg);
9852 break;
9853
9854 case M_DMUL:
9855 dbl = 1;
9856 case M_MUL:
9857 if (mips_opts.arch == CPU_R5900)
9858 {
9859 macro_build (NULL, dbl ? "dmultu" : "multu", "d,s,t", dreg, sreg, treg);
9860 }
9861 else
9862 {
9863 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9864 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9865 }
9866 break;
9867
9868 case M_DMUL_I:
9869 dbl = 1;
9870 case M_MUL_I:
9871 /* The MIPS assembler some times generates shifts and adds. I'm
9872 not trying to be that fancy. GCC should do this for us
9873 anyway. */
9874 used_at = 1;
9875 load_register (AT, &imm_expr, dbl);
9876 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9877 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9878 break;
9879
9880 case M_DMULO_I:
9881 dbl = 1;
9882 case M_MULO_I:
9883 imm = 1;
9884 goto do_mulo;
9885
9886 case M_DMULO:
9887 dbl = 1;
9888 case M_MULO:
9889 do_mulo:
9890 start_noreorder ();
9891 used_at = 1;
9892 if (imm)
9893 load_register (AT, &imm_expr, dbl);
9894 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9895 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9896 macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9897 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9898 if (mips_trap)
9899 macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9900 else
9901 {
9902 if (mips_opts.micromips)
9903 micromips_label_expr (&label_expr);
9904 else
9905 label_expr.X_add_number = 8;
9906 macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9907 macro_build (NULL, "nop", "");
9908 macro_build (NULL, "break", BRK_FMT, 6);
9909 if (mips_opts.micromips)
9910 micromips_add_label ();
9911 }
9912 end_noreorder ();
9913 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9914 break;
9915
9916 case M_DMULOU_I:
9917 dbl = 1;
9918 case M_MULOU_I:
9919 imm = 1;
9920 goto do_mulou;
9921
9922 case M_DMULOU:
9923 dbl = 1;
9924 case M_MULOU:
9925 do_mulou:
9926 start_noreorder ();
9927 used_at = 1;
9928 if (imm)
9929 load_register (AT, &imm_expr, dbl);
9930 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9931 sreg, imm ? AT : treg);
9932 macro_build (NULL, "mfhi", MFHL_FMT, AT);
9933 macro_build (NULL, "mflo", MFHL_FMT, dreg);
9934 if (mips_trap)
9935 macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9936 else
9937 {
9938 if (mips_opts.micromips)
9939 micromips_label_expr (&label_expr);
9940 else
9941 label_expr.X_add_number = 8;
9942 macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9943 macro_build (NULL, "nop", "");
9944 macro_build (NULL, "break", BRK_FMT, 6);
9945 if (mips_opts.micromips)
9946 micromips_add_label ();
9947 }
9948 end_noreorder ();
9949 break;
9950
9951 case M_DROL:
9952 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9953 {
9954 if (dreg == sreg)
9955 {
9956 tempreg = AT;
9957 used_at = 1;
9958 }
9959 else
9960 {
9961 tempreg = dreg;
9962 }
9963 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9964 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9965 break;
9966 }
9967 used_at = 1;
9968 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9969 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9970 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9971 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9972 break;
9973
9974 case M_ROL:
9975 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9976 {
9977 if (dreg == sreg)
9978 {
9979 tempreg = AT;
9980 used_at = 1;
9981 }
9982 else
9983 {
9984 tempreg = dreg;
9985 }
9986 macro_build (NULL, "negu", "d,w", tempreg, treg);
9987 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9988 break;
9989 }
9990 used_at = 1;
9991 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9992 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9993 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9994 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9995 break;
9996
9997 case M_DROL_I:
9998 {
9999 unsigned int rot;
10000 char *l;
10001 char *rr;
10002
10003 if (imm_expr.X_op != O_constant)
10004 as_bad (_("Improper rotate count"));
10005 rot = imm_expr.X_add_number & 0x3f;
10006 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10007 {
10008 rot = (64 - rot) & 0x3f;
10009 if (rot >= 32)
10010 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10011 else
10012 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10013 break;
10014 }
10015 if (rot == 0)
10016 {
10017 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10018 break;
10019 }
10020 l = (rot < 0x20) ? "dsll" : "dsll32";
10021 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
10022 rot &= 0x1f;
10023 used_at = 1;
10024 macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
10025 macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10026 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10027 }
10028 break;
10029
10030 case M_ROL_I:
10031 {
10032 unsigned int rot;
10033
10034 if (imm_expr.X_op != O_constant)
10035 as_bad (_("Improper rotate count"));
10036 rot = imm_expr.X_add_number & 0x1f;
10037 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10038 {
10039 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
10040 break;
10041 }
10042 if (rot == 0)
10043 {
10044 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10045 break;
10046 }
10047 used_at = 1;
10048 macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
10049 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10050 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10051 }
10052 break;
10053
10054 case M_DROR:
10055 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10056 {
10057 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
10058 break;
10059 }
10060 used_at = 1;
10061 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
10062 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
10063 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
10064 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10065 break;
10066
10067 case M_ROR:
10068 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10069 {
10070 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
10071 break;
10072 }
10073 used_at = 1;
10074 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
10075 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
10076 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
10077 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10078 break;
10079
10080 case M_DROR_I:
10081 {
10082 unsigned int rot;
10083 char *l;
10084 char *rr;
10085
10086 if (imm_expr.X_op != O_constant)
10087 as_bad (_("Improper rotate count"));
10088 rot = imm_expr.X_add_number & 0x3f;
10089 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
10090 {
10091 if (rot >= 32)
10092 macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
10093 else
10094 macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
10095 break;
10096 }
10097 if (rot == 0)
10098 {
10099 macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
10100 break;
10101 }
10102 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
10103 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
10104 rot &= 0x1f;
10105 used_at = 1;
10106 macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
10107 macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10108 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10109 }
10110 break;
10111
10112 case M_ROR_I:
10113 {
10114 unsigned int rot;
10115
10116 if (imm_expr.X_op != O_constant)
10117 as_bad (_("Improper rotate count"));
10118 rot = imm_expr.X_add_number & 0x1f;
10119 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
10120 {
10121 macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
10122 break;
10123 }
10124 if (rot == 0)
10125 {
10126 macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
10127 break;
10128 }
10129 used_at = 1;
10130 macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
10131 macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
10132 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
10133 }
10134 break;
10135
10136 case M_SEQ:
10137 if (sreg == 0)
10138 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
10139 else if (treg == 0)
10140 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10141 else
10142 {
10143 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10144 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10145 }
10146 break;
10147
10148 case M_SEQ_I:
10149 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10150 {
10151 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10152 break;
10153 }
10154 if (sreg == 0)
10155 {
10156 as_warn (_("Instruction %s: result is always false"),
10157 ip->insn_mo->name);
10158 move_register (dreg, 0);
10159 break;
10160 }
10161 if (CPU_HAS_SEQ (mips_opts.arch)
10162 && -512 <= imm_expr.X_add_number
10163 && imm_expr.X_add_number < 512)
10164 {
10165 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
10166 (int) imm_expr.X_add_number);
10167 break;
10168 }
10169 if (imm_expr.X_op == O_constant
10170 && imm_expr.X_add_number >= 0
10171 && imm_expr.X_add_number < 0x10000)
10172 {
10173 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10174 }
10175 else if (imm_expr.X_op == O_constant
10176 && imm_expr.X_add_number > -0x8000
10177 && imm_expr.X_add_number < 0)
10178 {
10179 imm_expr.X_add_number = -imm_expr.X_add_number;
10180 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10181 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10182 }
10183 else if (CPU_HAS_SEQ (mips_opts.arch))
10184 {
10185 used_at = 1;
10186 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10187 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
10188 break;
10189 }
10190 else
10191 {
10192 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10193 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10194 used_at = 1;
10195 }
10196 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
10197 break;
10198
10199 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
10200 s = "slt";
10201 goto sge;
10202 case M_SGEU:
10203 s = "sltu";
10204 sge:
10205 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
10206 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10207 break;
10208
10209 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
10210 case M_SGEU_I:
10211 if (imm_expr.X_op == O_constant
10212 && imm_expr.X_add_number >= -0x8000
10213 && imm_expr.X_add_number < 0x8000)
10214 {
10215 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
10216 dreg, sreg, BFD_RELOC_LO16);
10217 }
10218 else
10219 {
10220 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10221 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
10222 dreg, sreg, AT);
10223 used_at = 1;
10224 }
10225 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10226 break;
10227
10228 case M_SGT: /* sreg > treg <==> treg < sreg */
10229 s = "slt";
10230 goto sgt;
10231 case M_SGTU:
10232 s = "sltu";
10233 sgt:
10234 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10235 break;
10236
10237 case M_SGT_I: /* sreg > I <==> I < sreg */
10238 s = "slt";
10239 goto sgti;
10240 case M_SGTU_I:
10241 s = "sltu";
10242 sgti:
10243 used_at = 1;
10244 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10245 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10246 break;
10247
10248 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
10249 s = "slt";
10250 goto sle;
10251 case M_SLEU:
10252 s = "sltu";
10253 sle:
10254 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
10255 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10256 break;
10257
10258 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
10259 s = "slt";
10260 goto slei;
10261 case M_SLEU_I:
10262 s = "sltu";
10263 slei:
10264 used_at = 1;
10265 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10266 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
10267 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
10268 break;
10269
10270 case M_SLT_I:
10271 if (imm_expr.X_op == O_constant
10272 && imm_expr.X_add_number >= -0x8000
10273 && imm_expr.X_add_number < 0x8000)
10274 {
10275 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10276 break;
10277 }
10278 used_at = 1;
10279 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10280 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
10281 break;
10282
10283 case M_SLTU_I:
10284 if (imm_expr.X_op == O_constant
10285 && imm_expr.X_add_number >= -0x8000
10286 && imm_expr.X_add_number < 0x8000)
10287 {
10288 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
10289 BFD_RELOC_LO16);
10290 break;
10291 }
10292 used_at = 1;
10293 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10294 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
10295 break;
10296
10297 case M_SNE:
10298 if (sreg == 0)
10299 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
10300 else if (treg == 0)
10301 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10302 else
10303 {
10304 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
10305 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10306 }
10307 break;
10308
10309 case M_SNE_I:
10310 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
10311 {
10312 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
10313 break;
10314 }
10315 if (sreg == 0)
10316 {
10317 as_warn (_("Instruction %s: result is always true"),
10318 ip->insn_mo->name);
10319 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
10320 dreg, 0, BFD_RELOC_LO16);
10321 break;
10322 }
10323 if (CPU_HAS_SEQ (mips_opts.arch)
10324 && -512 <= imm_expr.X_add_number
10325 && imm_expr.X_add_number < 512)
10326 {
10327 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
10328 (int) imm_expr.X_add_number);
10329 break;
10330 }
10331 if (imm_expr.X_op == O_constant
10332 && imm_expr.X_add_number >= 0
10333 && imm_expr.X_add_number < 0x10000)
10334 {
10335 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
10336 }
10337 else if (imm_expr.X_op == O_constant
10338 && imm_expr.X_add_number > -0x8000
10339 && imm_expr.X_add_number < 0)
10340 {
10341 imm_expr.X_add_number = -imm_expr.X_add_number;
10342 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
10343 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10344 }
10345 else if (CPU_HAS_SEQ (mips_opts.arch))
10346 {
10347 used_at = 1;
10348 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10349 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
10350 break;
10351 }
10352 else
10353 {
10354 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10355 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
10356 used_at = 1;
10357 }
10358 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
10359 break;
10360
10361 case M_SUB_I:
10362 s = "addi";
10363 s2 = "sub";
10364 goto do_subi;
10365 case M_SUBU_I:
10366 s = "addiu";
10367 s2 = "subu";
10368 goto do_subi;
10369 case M_DSUB_I:
10370 dbl = 1;
10371 s = "daddi";
10372 s2 = "dsub";
10373 if (!mips_opts.micromips)
10374 goto do_subi;
10375 if (imm_expr.X_op == O_constant
10376 && imm_expr.X_add_number > -0x200
10377 && imm_expr.X_add_number <= 0x200)
10378 {
10379 macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
10380 break;
10381 }
10382 goto do_subi_i;
10383 case M_DSUBU_I:
10384 dbl = 1;
10385 s = "daddiu";
10386 s2 = "dsubu";
10387 do_subi:
10388 if (imm_expr.X_op == O_constant
10389 && imm_expr.X_add_number > -0x8000
10390 && imm_expr.X_add_number <= 0x8000)
10391 {
10392 imm_expr.X_add_number = -imm_expr.X_add_number;
10393 macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
10394 break;
10395 }
10396 do_subi_i:
10397 used_at = 1;
10398 load_register (AT, &imm_expr, dbl);
10399 macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
10400 break;
10401
10402 case M_TEQ_I:
10403 s = "teq";
10404 goto trap;
10405 case M_TGE_I:
10406 s = "tge";
10407 goto trap;
10408 case M_TGEU_I:
10409 s = "tgeu";
10410 goto trap;
10411 case M_TLT_I:
10412 s = "tlt";
10413 goto trap;
10414 case M_TLTU_I:
10415 s = "tltu";
10416 goto trap;
10417 case M_TNE_I:
10418 s = "tne";
10419 trap:
10420 used_at = 1;
10421 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
10422 macro_build (NULL, s, "s,t", sreg, AT);
10423 break;
10424
10425 case M_TRUNCWS:
10426 case M_TRUNCWD:
10427 gas_assert (!mips_opts.micromips);
10428 gas_assert (mips_opts.isa == ISA_MIPS1);
10429 used_at = 1;
10430 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
10431 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
10432
10433 /*
10434 * Is the double cfc1 instruction a bug in the mips assembler;
10435 * or is there a reason for it?
10436 */
10437 start_noreorder ();
10438 macro_build (NULL, "cfc1", "t,G", treg, RA);
10439 macro_build (NULL, "cfc1", "t,G", treg, RA);
10440 macro_build (NULL, "nop", "");
10441 expr1.X_add_number = 3;
10442 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
10443 expr1.X_add_number = 2;
10444 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
10445 macro_build (NULL, "ctc1", "t,G", AT, RA);
10446 macro_build (NULL, "nop", "");
10447 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
10448 dreg, sreg);
10449 macro_build (NULL, "ctc1", "t,G", treg, RA);
10450 macro_build (NULL, "nop", "");
10451 end_noreorder ();
10452 break;
10453
10454 case M_ULH_A:
10455 ab = 1;
10456 case M_ULH:
10457 s = "lb";
10458 s2 = "lbu";
10459 off = 1;
10460 goto uld_st;
10461 case M_ULHU_A:
10462 ab = 1;
10463 case M_ULHU:
10464 s = "lbu";
10465 s2 = "lbu";
10466 off = 1;
10467 goto uld_st;
10468 case M_ULW_A:
10469 ab = 1;
10470 case M_ULW:
10471 s = "lwl";
10472 s2 = "lwr";
10473 offbits = (mips_opts.micromips ? 12 : 16);
10474 off = 3;
10475 goto uld_st;
10476 case M_ULD_A:
10477 ab = 1;
10478 case M_ULD:
10479 s = "ldl";
10480 s2 = "ldr";
10481 offbits = (mips_opts.micromips ? 12 : 16);
10482 off = 7;
10483 goto uld_st;
10484 case M_USH_A:
10485 ab = 1;
10486 case M_USH:
10487 s = "sb";
10488 s2 = "sb";
10489 off = 1;
10490 ust = 1;
10491 goto uld_st;
10492 case M_USW_A:
10493 ab = 1;
10494 case M_USW:
10495 s = "swl";
10496 s2 = "swr";
10497 offbits = (mips_opts.micromips ? 12 : 16);
10498 off = 3;
10499 ust = 1;
10500 goto uld_st;
10501 case M_USD_A:
10502 ab = 1;
10503 case M_USD:
10504 s = "sdl";
10505 s2 = "sdr";
10506 offbits = (mips_opts.micromips ? 12 : 16);
10507 off = 7;
10508 ust = 1;
10509
10510 uld_st:
10511 if (!ab && offset_expr.X_add_number >= 0x8000 - off)
10512 as_bad (_("Operand overflow"));
10513
10514 ep = &offset_expr;
10515 expr1.X_add_number = 0;
10516 if (ab)
10517 {
10518 used_at = 1;
10519 tempreg = AT;
10520 load_address (tempreg, ep, &used_at);
10521 if (breg != 0)
10522 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
10523 tempreg, tempreg, breg);
10524 breg = tempreg;
10525 tempreg = treg;
10526 ep = &expr1;
10527 }
10528 else if (offbits == 12
10529 && (offset_expr.X_op != O_constant
10530 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
10531 || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
10532 {
10533 used_at = 1;
10534 tempreg = AT;
10535 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
10536 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
10537 breg = tempreg;
10538 tempreg = treg;
10539 ep = &expr1;
10540 }
10541 else if (!ust && treg == breg)
10542 {
10543 used_at = 1;
10544 tempreg = AT;
10545 }
10546 else
10547 tempreg = treg;
10548
10549 if (off == 1)
10550 goto ulh_sh;
10551
10552 if (!target_big_endian)
10553 ep->X_add_number += off;
10554 if (offbits != 12)
10555 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10556 else
10557 macro_build (NULL, s, "t,~(b)",
10558 tempreg, (unsigned long) ep->X_add_number, breg);
10559
10560 if (!target_big_endian)
10561 ep->X_add_number -= off;
10562 else
10563 ep->X_add_number += off;
10564 if (offbits != 12)
10565 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10566 else
10567 macro_build (NULL, s2, "t,~(b)",
10568 tempreg, (unsigned long) ep->X_add_number, breg);
10569
10570 /* If necessary, move the result in tempreg to the final destination. */
10571 if (!ust && treg != tempreg)
10572 {
10573 /* Protect second load's delay slot. */
10574 load_delay_nop ();
10575 move_register (treg, tempreg);
10576 }
10577 break;
10578
10579 ulh_sh:
10580 used_at = 1;
10581 if (target_big_endian == ust)
10582 ep->X_add_number += off;
10583 tempreg = ust || ab ? treg : AT;
10584 macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10585
10586 /* For halfword transfers we need a temporary register to shuffle
10587 bytes. Unfortunately for M_USH_A we have none available before
10588 the next store as AT holds the base address. We deal with this
10589 case by clobbering TREG and then restoring it as with ULH. */
10590 tempreg = ust == ab ? treg : AT;
10591 if (ust)
10592 macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
10593
10594 if (target_big_endian == ust)
10595 ep->X_add_number -= off;
10596 else
10597 ep->X_add_number += off;
10598 macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
10599
10600 /* For M_USH_A re-retrieve the LSB. */
10601 if (ust && ab)
10602 {
10603 if (target_big_endian)
10604 ep->X_add_number += off;
10605 else
10606 ep->X_add_number -= off;
10607 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
10608 }
10609 /* For ULH and M_USH_A OR the LSB in. */
10610 if (!ust || ab)
10611 {
10612 tempreg = !ab ? AT : treg;
10613 macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
10614 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
10615 }
10616 break;
10617
10618 default:
10619 /* FIXME: Check if this is one of the itbl macros, since they
10620 are added dynamically. */
10621 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
10622 break;
10623 }
10624 if (!mips_opts.at && used_at)
10625 as_bad (_("Macro used $at after \".set noat\""));
10626 }
10627
10628 /* Implement macros in mips16 mode. */
10629
10630 static void
10631 mips16_macro (struct mips_cl_insn *ip)
10632 {
10633 int mask;
10634 int xreg, yreg, zreg, tmp;
10635 expressionS expr1;
10636 int dbl;
10637 const char *s, *s2, *s3;
10638
10639 mask = ip->insn_mo->mask;
10640
10641 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
10642 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
10643 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
10644
10645 expr1.X_op = O_constant;
10646 expr1.X_op_symbol = NULL;
10647 expr1.X_add_symbol = NULL;
10648 expr1.X_add_number = 1;
10649
10650 dbl = 0;
10651
10652 switch (mask)
10653 {
10654 default:
10655 abort ();
10656
10657 case M_DDIV_3:
10658 dbl = 1;
10659 case M_DIV_3:
10660 s = "mflo";
10661 goto do_div3;
10662 case M_DREM_3:
10663 dbl = 1;
10664 case M_REM_3:
10665 s = "mfhi";
10666 do_div3:
10667 start_noreorder ();
10668 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
10669 expr1.X_add_number = 2;
10670 macro_build (&expr1, "bnez", "x,p", yreg);
10671 macro_build (NULL, "break", "6", 7);
10672
10673 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
10674 since that causes an overflow. We should do that as well,
10675 but I don't see how to do the comparisons without a temporary
10676 register. */
10677 end_noreorder ();
10678 macro_build (NULL, s, "x", zreg);
10679 break;
10680
10681 case M_DIVU_3:
10682 s = "divu";
10683 s2 = "mflo";
10684 goto do_divu3;
10685 case M_REMU_3:
10686 s = "divu";
10687 s2 = "mfhi";
10688 goto do_divu3;
10689 case M_DDIVU_3:
10690 s = "ddivu";
10691 s2 = "mflo";
10692 goto do_divu3;
10693 case M_DREMU_3:
10694 s = "ddivu";
10695 s2 = "mfhi";
10696 do_divu3:
10697 start_noreorder ();
10698 macro_build (NULL, s, "0,x,y", xreg, yreg);
10699 expr1.X_add_number = 2;
10700 macro_build (&expr1, "bnez", "x,p", yreg);
10701 macro_build (NULL, "break", "6", 7);
10702 end_noreorder ();
10703 macro_build (NULL, s2, "x", zreg);
10704 break;
10705
10706 case M_DMUL:
10707 dbl = 1;
10708 case M_MUL:
10709 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10710 macro_build (NULL, "mflo", "x", zreg);
10711 break;
10712
10713 case M_DSUBU_I:
10714 dbl = 1;
10715 goto do_subu;
10716 case M_SUBU_I:
10717 do_subu:
10718 if (imm_expr.X_op != O_constant)
10719 as_bad (_("Unsupported large constant"));
10720 imm_expr.X_add_number = -imm_expr.X_add_number;
10721 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10722 break;
10723
10724 case M_SUBU_I_2:
10725 if (imm_expr.X_op != O_constant)
10726 as_bad (_("Unsupported large constant"));
10727 imm_expr.X_add_number = -imm_expr.X_add_number;
10728 macro_build (&imm_expr, "addiu", "x,k", xreg);
10729 break;
10730
10731 case M_DSUBU_I_2:
10732 if (imm_expr.X_op != O_constant)
10733 as_bad (_("Unsupported large constant"));
10734 imm_expr.X_add_number = -imm_expr.X_add_number;
10735 macro_build (&imm_expr, "daddiu", "y,j", yreg);
10736 break;
10737
10738 case M_BEQ:
10739 s = "cmp";
10740 s2 = "bteqz";
10741 goto do_branch;
10742 case M_BNE:
10743 s = "cmp";
10744 s2 = "btnez";
10745 goto do_branch;
10746 case M_BLT:
10747 s = "slt";
10748 s2 = "btnez";
10749 goto do_branch;
10750 case M_BLTU:
10751 s = "sltu";
10752 s2 = "btnez";
10753 goto do_branch;
10754 case M_BLE:
10755 s = "slt";
10756 s2 = "bteqz";
10757 goto do_reverse_branch;
10758 case M_BLEU:
10759 s = "sltu";
10760 s2 = "bteqz";
10761 goto do_reverse_branch;
10762 case M_BGE:
10763 s = "slt";
10764 s2 = "bteqz";
10765 goto do_branch;
10766 case M_BGEU:
10767 s = "sltu";
10768 s2 = "bteqz";
10769 goto do_branch;
10770 case M_BGT:
10771 s = "slt";
10772 s2 = "btnez";
10773 goto do_reverse_branch;
10774 case M_BGTU:
10775 s = "sltu";
10776 s2 = "btnez";
10777
10778 do_reverse_branch:
10779 tmp = xreg;
10780 xreg = yreg;
10781 yreg = tmp;
10782
10783 do_branch:
10784 macro_build (NULL, s, "x,y", xreg, yreg);
10785 macro_build (&offset_expr, s2, "p");
10786 break;
10787
10788 case M_BEQ_I:
10789 s = "cmpi";
10790 s2 = "bteqz";
10791 s3 = "x,U";
10792 goto do_branch_i;
10793 case M_BNE_I:
10794 s = "cmpi";
10795 s2 = "btnez";
10796 s3 = "x,U";
10797 goto do_branch_i;
10798 case M_BLT_I:
10799 s = "slti";
10800 s2 = "btnez";
10801 s3 = "x,8";
10802 goto do_branch_i;
10803 case M_BLTU_I:
10804 s = "sltiu";
10805 s2 = "btnez";
10806 s3 = "x,8";
10807 goto do_branch_i;
10808 case M_BLE_I:
10809 s = "slti";
10810 s2 = "btnez";
10811 s3 = "x,8";
10812 goto do_addone_branch_i;
10813 case M_BLEU_I:
10814 s = "sltiu";
10815 s2 = "btnez";
10816 s3 = "x,8";
10817 goto do_addone_branch_i;
10818 case M_BGE_I:
10819 s = "slti";
10820 s2 = "bteqz";
10821 s3 = "x,8";
10822 goto do_branch_i;
10823 case M_BGEU_I:
10824 s = "sltiu";
10825 s2 = "bteqz";
10826 s3 = "x,8";
10827 goto do_branch_i;
10828 case M_BGT_I:
10829 s = "slti";
10830 s2 = "bteqz";
10831 s3 = "x,8";
10832 goto do_addone_branch_i;
10833 case M_BGTU_I:
10834 s = "sltiu";
10835 s2 = "bteqz";
10836 s3 = "x,8";
10837
10838 do_addone_branch_i:
10839 if (imm_expr.X_op != O_constant)
10840 as_bad (_("Unsupported large constant"));
10841 ++imm_expr.X_add_number;
10842
10843 do_branch_i:
10844 macro_build (&imm_expr, s, s3, xreg);
10845 macro_build (&offset_expr, s2, "p");
10846 break;
10847
10848 case M_ABS:
10849 expr1.X_add_number = 0;
10850 macro_build (&expr1, "slti", "x,8", yreg);
10851 if (xreg != yreg)
10852 move_register (xreg, yreg);
10853 expr1.X_add_number = 2;
10854 macro_build (&expr1, "bteqz", "p");
10855 macro_build (NULL, "neg", "x,w", xreg, xreg);
10856 }
10857 }
10858
10859 /* For consistency checking, verify that all bits are specified either
10860 by the match/mask part of the instruction definition, or by the
10861 operand list. */
10862 static int
10863 validate_mips_insn (const struct mips_opcode *opc)
10864 {
10865 const char *p = opc->args;
10866 char c;
10867 unsigned long used_bits = opc->mask;
10868
10869 if ((used_bits & opc->match) != opc->match)
10870 {
10871 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10872 opc->name, opc->args);
10873 return 0;
10874 }
10875 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
10876 while (*p)
10877 switch (c = *p++)
10878 {
10879 case ',': break;
10880 case '(': break;
10881 case ')': break;
10882 case '+':
10883 switch (c = *p++)
10884 {
10885 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
10886 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
10887 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
10888 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
10889 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10890 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10891 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10892 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
10893 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10894 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10895 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
10896 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10897 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
10898 case 'I': break;
10899 case 'J': USE_BITS (OP_MASK_CODE10, OP_SH_CODE10); break;
10900 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10901 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
10902 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10903 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10904 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
10905 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10906 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
10907 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
10908 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10909 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
10910 case 'z': USE_BITS (OP_MASK_RZ, OP_SH_RZ); break;
10911 case 'Z': USE_BITS (OP_MASK_FZ, OP_SH_FZ); break;
10912 case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10913 case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10914 case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10915 case 'j': USE_BITS (OP_MASK_EVAOFFSET, OP_SH_EVAOFFSET); break;
10916
10917 default:
10918 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10919 c, opc->name, opc->args);
10920 return 0;
10921 }
10922 break;
10923 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10924 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10925 case 'A': break;
10926 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
10927 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
10928 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10929 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10930 case 'F': break;
10931 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10932 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
10933 case 'I': break;
10934 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
10935 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10936 case 'L': break;
10937 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
10938 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
10939 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
10940 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
10941 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10942 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
10943 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10944 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10945 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10946 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10947 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
10948 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
10949 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
10950 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
10951 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10952 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
10953 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10954 case 'f': break;
10955 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
10956 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10957 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10958 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
10959 case 'l': break;
10960 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10961 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
10962 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
10963 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10964 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10965 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10966 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
10967 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10968 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10969 case 'x': break;
10970 case 'z': break;
10971 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
10972 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
10973 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
10974 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
10975 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
10976 case '[': break;
10977 case ']': break;
10978 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
10979 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
10980 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
10981 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
10982 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
10983 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
10984 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
10985 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
10986 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
10987 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
10988 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
10989 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
10990 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
10991 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
10992 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
10993 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
10994 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
10995 case '\\': USE_BITS (OP_MASK_3BITPOS, OP_SH_3BITPOS); break;
10996 case '~': USE_BITS (OP_MASK_OFFSET12, OP_SH_OFFSET12); break;
10997 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
10998 default:
10999 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
11000 c, opc->name, opc->args);
11001 return 0;
11002 }
11003 #undef USE_BITS
11004 if (used_bits != 0xffffffff)
11005 {
11006 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
11007 ~used_bits & 0xffffffff, opc->name, opc->args);
11008 return 0;
11009 }
11010 return 1;
11011 }
11012
11013 /* For consistency checking, verify that the length implied matches the
11014 major opcode and that all bits are specified either by the match/mask
11015 part of the instruction definition, or by the operand list. */
11016
11017 static int
11018 validate_micromips_insn (const struct mips_opcode *opc)
11019 {
11020 unsigned long match = opc->match;
11021 unsigned long mask = opc->mask;
11022 const char *p = opc->args;
11023 unsigned long insn_bits;
11024 unsigned long used_bits;
11025 unsigned long major;
11026 unsigned int length;
11027 char e;
11028 char c;
11029
11030 if ((mask & match) != match)
11031 {
11032 as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
11033 opc->name, opc->args);
11034 return 0;
11035 }
11036 length = micromips_insn_length (opc);
11037 if (length != 2 && length != 4)
11038 {
11039 as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
11040 "%s %s"), length, opc->name, opc->args);
11041 return 0;
11042 }
11043 major = match >> (10 + 8 * (length - 2));
11044 if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
11045 || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
11046 {
11047 as_bad (_("Internal error: bad microMIPS opcode "
11048 "(opcode/length mismatch): %s %s"), opc->name, opc->args);
11049 return 0;
11050 }
11051
11052 /* Shift piecewise to avoid an overflow where unsigned long is 32-bit. */
11053 insn_bits = 1 << 4 * length;
11054 insn_bits <<= 4 * length;
11055 insn_bits -= 1;
11056 used_bits = mask;
11057 #define USE_BITS(field) \
11058 (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
11059 while (*p)
11060 switch (c = *p++)
11061 {
11062 case ',': break;
11063 case '(': break;
11064 case ')': break;
11065 case '+':
11066 e = c;
11067 switch (c = *p++)
11068 {
11069 case 'A': USE_BITS (EXTLSB); break;
11070 case 'B': USE_BITS (INSMSB); break;
11071 case 'C': USE_BITS (EXTMSBD); break;
11072 case 'D': USE_BITS (RS); USE_BITS (SEL); break;
11073 case 'E': USE_BITS (EXTLSB); break;
11074 case 'F': USE_BITS (INSMSB); break;
11075 case 'G': USE_BITS (EXTMSBD); break;
11076 case 'H': USE_BITS (EXTMSBD); break;
11077 case 'j': USE_BITS (EVAOFFSET); break;
11078 default:
11079 as_bad (_("Internal error: bad mips opcode "
11080 "(unknown extension operand type `%c%c'): %s %s"),
11081 e, c, opc->name, opc->args);
11082 return 0;
11083 }
11084 break;
11085 case 'm':
11086 e = c;
11087 switch (c = *p++)
11088 {
11089 case 'A': USE_BITS (IMMA); break;
11090 case 'B': USE_BITS (IMMB); break;
11091 case 'C': USE_BITS (IMMC); break;
11092 case 'D': USE_BITS (IMMD); break;
11093 case 'E': USE_BITS (IMME); break;
11094 case 'F': USE_BITS (IMMF); break;
11095 case 'G': USE_BITS (IMMG); break;
11096 case 'H': USE_BITS (IMMH); break;
11097 case 'I': USE_BITS (IMMI); break;
11098 case 'J': USE_BITS (IMMJ); break;
11099 case 'L': USE_BITS (IMML); break;
11100 case 'M': USE_BITS (IMMM); break;
11101 case 'N': USE_BITS (IMMN); break;
11102 case 'O': USE_BITS (IMMO); break;
11103 case 'P': USE_BITS (IMMP); break;
11104 case 'Q': USE_BITS (IMMQ); break;
11105 case 'U': USE_BITS (IMMU); break;
11106 case 'W': USE_BITS (IMMW); break;
11107 case 'X': USE_BITS (IMMX); break;
11108 case 'Y': USE_BITS (IMMY); break;
11109 case 'Z': break;
11110 case 'a': break;
11111 case 'b': USE_BITS (MB); break;
11112 case 'c': USE_BITS (MC); break;
11113 case 'd': USE_BITS (MD); break;
11114 case 'e': USE_BITS (ME); break;
11115 case 'f': USE_BITS (MF); break;
11116 case 'g': USE_BITS (MG); break;
11117 case 'h': USE_BITS (MH); break;
11118 case 'i': USE_BITS (MI); break;
11119 case 'j': USE_BITS (MJ); break;
11120 case 'l': USE_BITS (ML); break;
11121 case 'm': USE_BITS (MM); break;
11122 case 'n': USE_BITS (MN); break;
11123 case 'p': USE_BITS (MP); break;
11124 case 'q': USE_BITS (MQ); break;
11125 case 'r': break;
11126 case 's': break;
11127 case 't': break;
11128 case 'x': break;
11129 case 'y': break;
11130 case 'z': break;
11131 default:
11132 as_bad (_("Internal error: bad mips opcode "
11133 "(unknown extension operand type `%c%c'): %s %s"),
11134 e, c, opc->name, opc->args);
11135 return 0;
11136 }
11137 break;
11138 case '.': USE_BITS (OFFSET10); break;
11139 case '1': USE_BITS (STYPE); break;
11140 case '2': USE_BITS (BP); break;
11141 case '3': USE_BITS (SA3); break;
11142 case '4': USE_BITS (SA4); break;
11143 case '5': USE_BITS (IMM8); break;
11144 case '6': USE_BITS (RS); break;
11145 case '7': USE_BITS (DSPACC); break;
11146 case '8': USE_BITS (WRDSP); break;
11147 case '0': USE_BITS (DSPSFT); break;
11148 case '<': USE_BITS (SHAMT); break;
11149 case '>': USE_BITS (SHAMT); break;
11150 case '@': USE_BITS (IMM10); break;
11151 case 'B': USE_BITS (CODE10); break;
11152 case 'C': USE_BITS (COPZ); break;
11153 case 'D': USE_BITS (FD); break;
11154 case 'E': USE_BITS (RT); break;
11155 case 'G': USE_BITS (RS); break;
11156 case 'H': USE_BITS (SEL); break;
11157 case 'K': USE_BITS (RS); break;
11158 case 'M': USE_BITS (CCC); break;
11159 case 'N': USE_BITS (BCC); break;
11160 case 'R': USE_BITS (FR); break;
11161 case 'S': USE_BITS (FS); break;
11162 case 'T': USE_BITS (FT); break;
11163 case 'V': USE_BITS (FS); break;
11164 case '\\': USE_BITS (3BITPOS); break;
11165 case '^': USE_BITS (RD); break;
11166 case 'a': USE_BITS (TARGET); break;
11167 case 'b': USE_BITS (RS); break;
11168 case 'c': USE_BITS (CODE); break;
11169 case 'd': USE_BITS (RD); break;
11170 case 'h': USE_BITS (PREFX); break;
11171 case 'i': USE_BITS (IMMEDIATE); break;
11172 case 'j': USE_BITS (DELTA); break;
11173 case 'k': USE_BITS (CACHE); break;
11174 case 'n': USE_BITS (RT); break;
11175 case 'o': USE_BITS (DELTA); break;
11176 case 'p': USE_BITS (DELTA); break;
11177 case 'q': USE_BITS (CODE2); break;
11178 case 'r': USE_BITS (RS); break;
11179 case 's': USE_BITS (RS); break;
11180 case 't': USE_BITS (RT); break;
11181 case 'u': USE_BITS (IMMEDIATE); break;
11182 case 'v': USE_BITS (RS); break;
11183 case 'w': USE_BITS (RT); break;
11184 case 'y': USE_BITS (RS3); break;
11185 case 'z': break;
11186 case '|': USE_BITS (TRAP); break;
11187 case '~': USE_BITS (OFFSET12); break;
11188 default:
11189 as_bad (_("Internal error: bad microMIPS opcode "
11190 "(unknown operand type `%c'): %s %s"),
11191 c, opc->name, opc->args);
11192 return 0;
11193 }
11194 #undef USE_BITS
11195 if (used_bits != insn_bits)
11196 {
11197 if (~used_bits & insn_bits)
11198 as_bad (_("Internal error: bad microMIPS opcode "
11199 "(bits 0x%lx undefined): %s %s"),
11200 ~used_bits & insn_bits, opc->name, opc->args);
11201 if (used_bits & ~insn_bits)
11202 as_bad (_("Internal error: bad microMIPS opcode "
11203 "(bits 0x%lx defined): %s %s"),
11204 used_bits & ~insn_bits, opc->name, opc->args);
11205 return 0;
11206 }
11207 return 1;
11208 }
11209
11210 /* UDI immediates. */
11211 struct mips_immed {
11212 char type;
11213 unsigned int shift;
11214 unsigned long mask;
11215 const char * desc;
11216 };
11217
11218 static const struct mips_immed mips_immed[] = {
11219 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
11220 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
11221 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
11222 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
11223 { 0,0,0,0 }
11224 };
11225
11226 /* Check whether an odd floating-point register is allowed. */
11227 static int
11228 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
11229 {
11230 const char *s = insn->name;
11231
11232 if (insn->pinfo == INSN_MACRO)
11233 /* Let a macro pass, we'll catch it later when it is expanded. */
11234 return 1;
11235
11236 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa) || (mips_opts.arch == CPU_R5900))
11237 {
11238 /* Allow odd registers for single-precision ops. */
11239 switch (insn->pinfo & (FP_S | FP_D))
11240 {
11241 case FP_S:
11242 case 0:
11243 return 1; /* both single precision - ok */
11244 case FP_D:
11245 return 0; /* both double precision - fail */
11246 default:
11247 break;
11248 }
11249
11250 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
11251 s = strchr (insn->name, '.');
11252 if (argnum == 2)
11253 s = s != NULL ? strchr (s + 1, '.') : NULL;
11254 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
11255 }
11256
11257 /* Single-precision coprocessor loads and moves are OK too. */
11258 if ((insn->pinfo & FP_S)
11259 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
11260 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
11261 return 1;
11262
11263 return 0;
11264 }
11265
11266 /* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
11267 taking bits from BIT up. */
11268 static int
11269 expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
11270 {
11271 return (ep->X_op == O_constant
11272 && (ep->X_add_number & ((1 << bit) - 1)) == 0
11273 && ep->X_add_number >= min << bit
11274 && ep->X_add_number < max << bit);
11275 }
11276
11277 /* This routine assembles an instruction into its binary format. As a
11278 side effect, it sets one of the global variables imm_reloc or
11279 offset_reloc to the type of relocation to do if one of the operands
11280 is an address expression. */
11281
11282 static void
11283 mips_ip (char *str, struct mips_cl_insn *ip)
11284 {
11285 bfd_boolean wrong_delay_slot_insns = FALSE;
11286 bfd_boolean need_delay_slot_ok = TRUE;
11287 struct mips_opcode *firstinsn = NULL;
11288 const struct mips_opcode *past;
11289 struct hash_control *hash;
11290 char *s;
11291 const char *args;
11292 char c = 0;
11293 struct mips_opcode *insn;
11294 char *argsStart;
11295 unsigned int regno;
11296 unsigned int lastregno;
11297 unsigned int destregno = 0;
11298 unsigned int lastpos = 0;
11299 unsigned int limlo, limhi;
11300 int sizelo;
11301 char *s_reset;
11302 offsetT min_range, max_range;
11303 long opend;
11304 char *name;
11305 int argnum;
11306 unsigned int rtype;
11307 char *dot;
11308 long end;
11309
11310 insn_error = NULL;
11311
11312 if (mips_opts.micromips)
11313 {
11314 hash = micromips_op_hash;
11315 past = &micromips_opcodes[bfd_micromips_num_opcodes];
11316 }
11317 else
11318 {
11319 hash = op_hash;
11320 past = &mips_opcodes[NUMOPCODES];
11321 }
11322 forced_insn_length = 0;
11323 insn = NULL;
11324
11325 /* We first try to match an instruction up to a space or to the end. */
11326 for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
11327 continue;
11328
11329 /* Make a copy of the instruction so that we can fiddle with it. */
11330 name = alloca (end + 1);
11331 memcpy (name, str, end);
11332 name[end] = '\0';
11333
11334 for (;;)
11335 {
11336 insn = (struct mips_opcode *) hash_find (hash, name);
11337
11338 if (insn != NULL || !mips_opts.micromips)
11339 break;
11340 if (forced_insn_length)
11341 break;
11342
11343 /* See if there's an instruction size override suffix,
11344 either `16' or `32', at the end of the mnemonic proper,
11345 that defines the operation, i.e. before the first `.'
11346 character if any. Strip it and retry. */
11347 dot = strchr (name, '.');
11348 opend = dot != NULL ? dot - name : end;
11349 if (opend < 3)
11350 break;
11351 if (name[opend - 2] == '1' && name[opend - 1] == '6')
11352 forced_insn_length = 2;
11353 else if (name[opend - 2] == '3' && name[opend - 1] == '2')
11354 forced_insn_length = 4;
11355 else
11356 break;
11357 memcpy (name + opend - 2, name + opend, end - opend + 1);
11358 }
11359 if (insn == NULL)
11360 {
11361 insn_error = _("Unrecognized opcode");
11362 return;
11363 }
11364
11365 /* For microMIPS instructions placed in a fixed-length branch delay slot
11366 we make up to two passes over the relevant fragment of the opcode
11367 table. First we try instructions that meet the delay slot's length
11368 requirement. If none matched, then we retry with the remaining ones
11369 and if one matches, then we use it and then issue an appropriate
11370 warning later on. */
11371 argsStart = s = str + end;
11372 for (;;)
11373 {
11374 bfd_boolean delay_slot_ok;
11375 bfd_boolean size_ok;
11376 bfd_boolean ok;
11377
11378 gas_assert (strcmp (insn->name, name) == 0);
11379
11380 ok = is_opcode_valid (insn);
11381 size_ok = is_size_valid (insn);
11382 delay_slot_ok = is_delay_slot_valid (insn);
11383 if (!delay_slot_ok && !wrong_delay_slot_insns)
11384 {
11385 firstinsn = insn;
11386 wrong_delay_slot_insns = TRUE;
11387 }
11388 if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
11389 {
11390 static char buf[256];
11391
11392 if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
11393 {
11394 ++insn;
11395 continue;
11396 }
11397 if (wrong_delay_slot_insns && need_delay_slot_ok)
11398 {
11399 gas_assert (firstinsn);
11400 need_delay_slot_ok = FALSE;
11401 past = insn + 1;
11402 insn = firstinsn;
11403 continue;
11404 }
11405
11406 if (insn_error)
11407 return;
11408
11409 if (!ok)
11410 sprintf (buf, _("Opcode not supported on this processor: %s (%s)"),
11411 mips_cpu_info_from_arch (mips_opts.arch)->name,
11412 mips_cpu_info_from_isa (mips_opts.isa)->name);
11413 else if (mips_opts.insn32)
11414 sprintf (buf, _("Opcode not supported in the `insn32' mode"));
11415 else
11416 sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
11417 8 * forced_insn_length);
11418 insn_error = buf;
11419
11420 return;
11421 }
11422
11423 create_insn (ip, insn);
11424 insn_error = NULL;
11425 argnum = 1;
11426 lastregno = 0xffffffff;
11427 for (args = insn->args;; ++args)
11428 {
11429 int is_mdmx;
11430
11431 s += strspn (s, " \t");
11432 is_mdmx = 0;
11433 switch (*args)
11434 {
11435 case '\0': /* end of args */
11436 if (*s == '\0')
11437 return;
11438 break;
11439
11440 case '2':
11441 /* DSP 2-bit unsigned immediate in bit 11 (for standard MIPS
11442 code) or 14 (for microMIPS code). */
11443 my_getExpression (&imm_expr, s);
11444 check_absolute_expr (ip, &imm_expr);
11445 if ((unsigned long) imm_expr.X_add_number != 1
11446 && (unsigned long) imm_expr.X_add_number != 3)
11447 {
11448 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
11449 (unsigned long) imm_expr.X_add_number);
11450 }
11451 INSERT_OPERAND (mips_opts.micromips,
11452 BP, *ip, imm_expr.X_add_number);
11453 imm_expr.X_op = O_absent;
11454 s = expr_end;
11455 continue;
11456
11457 case '3':
11458 /* DSP 3-bit unsigned immediate in bit 21 (for standard MIPS
11459 code) or 13 (for microMIPS code). */
11460 {
11461 unsigned long mask = (mips_opts.micromips
11462 ? MICROMIPSOP_MASK_SA3 : OP_MASK_SA3);
11463
11464 my_getExpression (&imm_expr, s);
11465 check_absolute_expr (ip, &imm_expr);
11466 if ((unsigned long) imm_expr.X_add_number > mask)
11467 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11468 mask, (unsigned long) imm_expr.X_add_number);
11469 INSERT_OPERAND (mips_opts.micromips,
11470 SA3, *ip, imm_expr.X_add_number);
11471 imm_expr.X_op = O_absent;
11472 s = expr_end;
11473 }
11474 continue;
11475
11476 case '4':
11477 /* DSP 4-bit unsigned immediate in bit 21 (for standard MIPS
11478 code) or 12 (for microMIPS code). */
11479 {
11480 unsigned long mask = (mips_opts.micromips
11481 ? MICROMIPSOP_MASK_SA4 : OP_MASK_SA4);
11482
11483 my_getExpression (&imm_expr, s);
11484 check_absolute_expr (ip, &imm_expr);
11485 if ((unsigned long) imm_expr.X_add_number > mask)
11486 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11487 mask, (unsigned long) imm_expr.X_add_number);
11488 INSERT_OPERAND (mips_opts.micromips,
11489 SA4, *ip, imm_expr.X_add_number);
11490 imm_expr.X_op = O_absent;
11491 s = expr_end;
11492 }
11493 continue;
11494
11495 case '5':
11496 /* DSP 8-bit unsigned immediate in bit 16 (for standard MIPS
11497 code) or 13 (for microMIPS code). */
11498 {
11499 unsigned long mask = (mips_opts.micromips
11500 ? MICROMIPSOP_MASK_IMM8 : OP_MASK_IMM8);
11501
11502 my_getExpression (&imm_expr, s);
11503 check_absolute_expr (ip, &imm_expr);
11504 if ((unsigned long) imm_expr.X_add_number > mask)
11505 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11506 mask, (unsigned long) imm_expr.X_add_number);
11507 INSERT_OPERAND (mips_opts.micromips,
11508 IMM8, *ip, imm_expr.X_add_number);
11509 imm_expr.X_op = O_absent;
11510 s = expr_end;
11511 }
11512 continue;
11513
11514 case '6':
11515 /* DSP 5-bit unsigned immediate in bit 21 (for standard MIPS
11516 code) or 16 (for microMIPS code). */
11517 {
11518 unsigned long mask = (mips_opts.micromips
11519 ? MICROMIPSOP_MASK_RS : OP_MASK_RS);
11520
11521 my_getExpression (&imm_expr, s);
11522 check_absolute_expr (ip, &imm_expr);
11523 if ((unsigned long) imm_expr.X_add_number > mask)
11524 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11525 mask, (unsigned long) imm_expr.X_add_number);
11526 INSERT_OPERAND (mips_opts.micromips,
11527 RS, *ip, imm_expr.X_add_number);
11528 imm_expr.X_op = O_absent;
11529 s = expr_end;
11530 }
11531 continue;
11532
11533 case '7':
11534 /* Four DSP accumulators in bit 11 (for standard MIPS code)
11535 or 14 (for microMIPS code). */
11536 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11537 && s[3] >= '0' && s[3] <= '3')
11538 {
11539 regno = s[3] - '0';
11540 s += 4;
11541 INSERT_OPERAND (mips_opts.micromips, DSPACC, *ip, regno);
11542 continue;
11543 }
11544 else
11545 as_bad (_("Invalid dsp acc register"));
11546 break;
11547
11548 case '8':
11549 /* DSP 6-bit unsigned immediate in bit 11 (for standard MIPS
11550 code) or 14 (for microMIPS code). */
11551 {
11552 unsigned long mask = (mips_opts.micromips
11553 ? MICROMIPSOP_MASK_WRDSP
11554 : OP_MASK_WRDSP);
11555
11556 my_getExpression (&imm_expr, s);
11557 check_absolute_expr (ip, &imm_expr);
11558 if ((unsigned long) imm_expr.X_add_number > mask)
11559 as_bad (_("DSP immediate not in range 0..%lu (%lu)"),
11560 mask, (unsigned long) imm_expr.X_add_number);
11561 INSERT_OPERAND (mips_opts.micromips,
11562 WRDSP, *ip, imm_expr.X_add_number);
11563 imm_expr.X_op = O_absent;
11564 s = expr_end;
11565 }
11566 continue;
11567
11568 case '9': /* Four DSP accumulators in bits 21,22. */
11569 gas_assert (!mips_opts.micromips);
11570 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c'
11571 && s[3] >= '0' && s[3] <= '3')
11572 {
11573 regno = s[3] - '0';
11574 s += 4;
11575 INSERT_OPERAND (0, DSPACC_S, *ip, regno);
11576 continue;
11577 }
11578 else
11579 as_bad (_("Invalid dsp acc register"));
11580 break;
11581
11582 case '0':
11583 /* DSP 6-bit signed immediate in bit 20 (for standard MIPS
11584 code) or 16 (for microMIPS code). */
11585 {
11586 long mask = (mips_opts.micromips
11587 ? MICROMIPSOP_MASK_DSPSFT : OP_MASK_DSPSFT);
11588
11589 my_getExpression (&imm_expr, s);
11590 check_absolute_expr (ip, &imm_expr);
11591 min_range = -((mask + 1) >> 1);
11592 max_range = ((mask + 1) >> 1) - 1;
11593 if (imm_expr.X_add_number < min_range
11594 || imm_expr.X_add_number > max_range)
11595 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11596 (long) min_range, (long) max_range,
11597 (long) imm_expr.X_add_number);
11598 INSERT_OPERAND (mips_opts.micromips,
11599 DSPSFT, *ip, imm_expr.X_add_number);
11600 imm_expr.X_op = O_absent;
11601 s = expr_end;
11602 }
11603 continue;
11604
11605 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
11606 gas_assert (!mips_opts.micromips);
11607 my_getExpression (&imm_expr, s);
11608 check_absolute_expr (ip, &imm_expr);
11609 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
11610 {
11611 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11612 OP_MASK_RDDSP,
11613 (unsigned long) imm_expr.X_add_number);
11614 }
11615 INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
11616 imm_expr.X_op = O_absent;
11617 s = expr_end;
11618 continue;
11619
11620 case ':': /* DSP 7-bit signed immediate in bit 19. */
11621 gas_assert (!mips_opts.micromips);
11622 my_getExpression (&imm_expr, s);
11623 check_absolute_expr (ip, &imm_expr);
11624 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
11625 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
11626 if (imm_expr.X_add_number < min_range ||
11627 imm_expr.X_add_number > max_range)
11628 {
11629 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11630 (long) min_range, (long) max_range,
11631 (long) imm_expr.X_add_number);
11632 }
11633 INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
11634 imm_expr.X_op = O_absent;
11635 s = expr_end;
11636 continue;
11637
11638 case '@': /* DSP 10-bit signed immediate in bit 16. */
11639 {
11640 long mask = (mips_opts.micromips
11641 ? MICROMIPSOP_MASK_IMM10 : OP_MASK_IMM10);
11642
11643 my_getExpression (&imm_expr, s);
11644 check_absolute_expr (ip, &imm_expr);
11645 min_range = -((mask + 1) >> 1);
11646 max_range = ((mask + 1) >> 1) - 1;
11647 if (imm_expr.X_add_number < min_range
11648 || imm_expr.X_add_number > max_range)
11649 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
11650 (long) min_range, (long) max_range,
11651 (long) imm_expr.X_add_number);
11652 INSERT_OPERAND (mips_opts.micromips,
11653 IMM10, *ip, imm_expr.X_add_number);
11654 imm_expr.X_op = O_absent;
11655 s = expr_end;
11656 }
11657 continue;
11658
11659 case '^': /* DSP 5-bit unsigned immediate in bit 11. */
11660 gas_assert (mips_opts.micromips);
11661 my_getExpression (&imm_expr, s);
11662 check_absolute_expr (ip, &imm_expr);
11663 if (imm_expr.X_add_number & ~MICROMIPSOP_MASK_RD)
11664 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
11665 MICROMIPSOP_MASK_RD,
11666 (unsigned long) imm_expr.X_add_number);
11667 INSERT_OPERAND (1, RD, *ip, imm_expr.X_add_number);
11668 imm_expr.X_op = O_absent;
11669 s = expr_end;
11670 continue;
11671
11672 case '!': /* MT usermode flag bit. */
11673 gas_assert (!mips_opts.micromips);
11674 my_getExpression (&imm_expr, s);
11675 check_absolute_expr (ip, &imm_expr);
11676 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
11677 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
11678 (unsigned long) imm_expr.X_add_number);
11679 INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
11680 imm_expr.X_op = O_absent;
11681 s = expr_end;
11682 continue;
11683
11684 case '$': /* MT load high flag bit. */
11685 gas_assert (!mips_opts.micromips);
11686 my_getExpression (&imm_expr, s);
11687 check_absolute_expr (ip, &imm_expr);
11688 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
11689 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
11690 (unsigned long) imm_expr.X_add_number);
11691 INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
11692 imm_expr.X_op = O_absent;
11693 s = expr_end;
11694 continue;
11695
11696 case '*': /* Four DSP accumulators in bits 18,19. */
11697 gas_assert (!mips_opts.micromips);
11698 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11699 s[3] >= '0' && s[3] <= '3')
11700 {
11701 regno = s[3] - '0';
11702 s += 4;
11703 INSERT_OPERAND (0, MTACC_T, *ip, regno);
11704 continue;
11705 }
11706 else
11707 as_bad (_("Invalid dsp/smartmips acc register"));
11708 break;
11709
11710 case '&': /* Four DSP accumulators in bits 13,14. */
11711 gas_assert (!mips_opts.micromips);
11712 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
11713 s[3] >= '0' && s[3] <= '3')
11714 {
11715 regno = s[3] - '0';
11716 s += 4;
11717 INSERT_OPERAND (0, MTACC_D, *ip, regno);
11718 continue;
11719 }
11720 else
11721 as_bad (_("Invalid dsp/smartmips acc register"));
11722 break;
11723
11724 case '\\': /* 3-bit bit position. */
11725 {
11726 unsigned long mask = (mips_opts.micromips
11727 ? MICROMIPSOP_MASK_3BITPOS
11728 : OP_MASK_3BITPOS);
11729
11730 my_getExpression (&imm_expr, s);
11731 check_absolute_expr (ip, &imm_expr);
11732 if ((unsigned long) imm_expr.X_add_number > mask)
11733 as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
11734 ip->insn_mo->name,
11735 mask, (unsigned long) imm_expr.X_add_number);
11736 INSERT_OPERAND (mips_opts.micromips,
11737 3BITPOS, *ip, imm_expr.X_add_number);
11738 imm_expr.X_op = O_absent;
11739 s = expr_end;
11740 }
11741 continue;
11742
11743 case ',':
11744 ++argnum;
11745 if (*s++ == *args)
11746 continue;
11747 s--;
11748 switch (*++args)
11749 {
11750 case 'r':
11751 case 'v':
11752 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11753 continue;
11754
11755 case 'w':
11756 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11757 continue;
11758
11759 case 'W':
11760 gas_assert (!mips_opts.micromips);
11761 INSERT_OPERAND (0, FT, *ip, lastregno);
11762 continue;
11763
11764 case 'V':
11765 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11766 continue;
11767 }
11768 break;
11769
11770 case '(':
11771 /* Handle optional base register.
11772 Either the base register is omitted or
11773 we must have a left paren. */
11774 /* This is dependent on the next operand specifier
11775 is a base register specification. */
11776 gas_assert (args[1] == 'b'
11777 || (mips_opts.micromips
11778 && args[1] == 'm'
11779 && (args[2] == 'l' || args[2] == 'n'
11780 || args[2] == 's' || args[2] == 'a')));
11781 if (*s == '\0' && args[1] == 'b')
11782 return;
11783 /* Fall through. */
11784
11785 case ')': /* These must match exactly. */
11786 if (*s++ == *args)
11787 continue;
11788 break;
11789
11790 case '[': /* These must match exactly. */
11791 case ']':
11792 gas_assert (!mips_opts.micromips);
11793 if (*s++ == *args)
11794 continue;
11795 break;
11796
11797 case '+': /* Opcode extension character. */
11798 switch (*++args)
11799 {
11800 case '1': /* UDI immediates. */
11801 case '2':
11802 case '3':
11803 case '4':
11804 gas_assert (!mips_opts.micromips);
11805 {
11806 const struct mips_immed *imm = mips_immed;
11807
11808 while (imm->type && imm->type != *args)
11809 ++imm;
11810 if (! imm->type)
11811 abort ();
11812 my_getExpression (&imm_expr, s);
11813 check_absolute_expr (ip, &imm_expr);
11814 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11815 {
11816 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11817 imm->desc ? imm->desc : ip->insn_mo->name,
11818 (unsigned long) imm_expr.X_add_number,
11819 (unsigned long) imm_expr.X_add_number);
11820 imm_expr.X_add_number &= imm->mask;
11821 }
11822 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11823 << imm->shift);
11824 imm_expr.X_op = O_absent;
11825 s = expr_end;
11826 }
11827 continue;
11828
11829 case 'J': /* 10-bit hypcall code. */
11830 gas_assert (!mips_opts.micromips);
11831 {
11832 unsigned long mask = OP_MASK_CODE10;
11833
11834 my_getExpression (&imm_expr, s);
11835 check_absolute_expr (ip, &imm_expr);
11836 if ((unsigned long) imm_expr.X_add_number > mask)
11837 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11838 ip->insn_mo->name,
11839 mask, (unsigned long) imm_expr.X_add_number);
11840 INSERT_OPERAND (0, CODE10, *ip, imm_expr.X_add_number);
11841 imm_expr.X_op = O_absent;
11842 s = expr_end;
11843 }
11844 continue;
11845
11846 case 'A': /* ins/ext position, becomes LSB. */
11847 limlo = 0;
11848 limhi = 31;
11849 goto do_lsb;
11850 case 'E':
11851 limlo = 32;
11852 limhi = 63;
11853 goto do_lsb;
11854 do_lsb:
11855 my_getExpression (&imm_expr, s);
11856 check_absolute_expr (ip, &imm_expr);
11857 if ((unsigned long) imm_expr.X_add_number < limlo
11858 || (unsigned long) imm_expr.X_add_number > limhi)
11859 {
11860 as_bad (_("Improper position (%lu)"),
11861 (unsigned long) imm_expr.X_add_number);
11862 imm_expr.X_add_number = limlo;
11863 }
11864 lastpos = imm_expr.X_add_number;
11865 INSERT_OPERAND (mips_opts.micromips,
11866 EXTLSB, *ip, imm_expr.X_add_number);
11867 imm_expr.X_op = O_absent;
11868 s = expr_end;
11869 continue;
11870
11871 case 'B': /* ins size, becomes MSB. */
11872 limlo = 1;
11873 limhi = 32;
11874 goto do_msb;
11875 case 'F':
11876 limlo = 33;
11877 limhi = 64;
11878 goto do_msb;
11879 do_msb:
11880 my_getExpression (&imm_expr, s);
11881 check_absolute_expr (ip, &imm_expr);
11882 /* Check for negative input so that small negative numbers
11883 will not succeed incorrectly. The checks against
11884 (pos+size) transitively check "size" itself,
11885 assuming that "pos" is reasonable. */
11886 if ((long) imm_expr.X_add_number < 0
11887 || ((unsigned long) imm_expr.X_add_number
11888 + lastpos) < limlo
11889 || ((unsigned long) imm_expr.X_add_number
11890 + lastpos) > limhi)
11891 {
11892 as_bad (_("Improper insert size (%lu, position %lu)"),
11893 (unsigned long) imm_expr.X_add_number,
11894 (unsigned long) lastpos);
11895 imm_expr.X_add_number = limlo - lastpos;
11896 }
11897 INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11898 lastpos + imm_expr.X_add_number - 1);
11899 imm_expr.X_op = O_absent;
11900 s = expr_end;
11901 continue;
11902
11903 case 'C': /* ext size, becomes MSBD. */
11904 limlo = 1;
11905 limhi = 32;
11906 sizelo = 1;
11907 goto do_msbd;
11908 case 'G':
11909 limlo = 33;
11910 limhi = 64;
11911 sizelo = 33;
11912 goto do_msbd;
11913 case 'H':
11914 limlo = 33;
11915 limhi = 64;
11916 sizelo = 1;
11917 goto do_msbd;
11918 do_msbd:
11919 my_getExpression (&imm_expr, s);
11920 check_absolute_expr (ip, &imm_expr);
11921 /* The checks against (pos+size) don't transitively check
11922 "size" itself, assuming that "pos" is reasonable.
11923 We also need to check the lower bound of "size". */
11924 if ((long) imm_expr.X_add_number < sizelo
11925 || ((unsigned long) imm_expr.X_add_number
11926 + lastpos) < limlo
11927 || ((unsigned long) imm_expr.X_add_number
11928 + lastpos) > limhi)
11929 {
11930 as_bad (_("Improper extract size (%lu, position %lu)"),
11931 (unsigned long) imm_expr.X_add_number,
11932 (unsigned long) lastpos);
11933 imm_expr.X_add_number = limlo - lastpos;
11934 }
11935 INSERT_OPERAND (mips_opts.micromips,
11936 EXTMSBD, *ip, imm_expr.X_add_number - 1);
11937 imm_expr.X_op = O_absent;
11938 s = expr_end;
11939 continue;
11940
11941 case 'D':
11942 /* +D is for disassembly only; never match. */
11943 break;
11944
11945 case 'I':
11946 /* "+I" is like "I", except that imm2_expr is used. */
11947 my_getExpression (&imm2_expr, s);
11948 if (imm2_expr.X_op != O_big
11949 && imm2_expr.X_op != O_constant)
11950 insn_error = _("absolute expression required");
11951 if (HAVE_32BIT_GPRS)
11952 normalize_constant_expr (&imm2_expr);
11953 s = expr_end;
11954 continue;
11955
11956 case 'T': /* Coprocessor register. */
11957 gas_assert (!mips_opts.micromips);
11958 /* +T is for disassembly only; never match. */
11959 break;
11960
11961 case 't': /* Coprocessor register number. */
11962 gas_assert (!mips_opts.micromips);
11963 if (s[0] == '$' && ISDIGIT (s[1]))
11964 {
11965 ++s;
11966 regno = 0;
11967 do
11968 {
11969 regno *= 10;
11970 regno += *s - '0';
11971 ++s;
11972 }
11973 while (ISDIGIT (*s));
11974 if (regno > 31)
11975 as_bad (_("Invalid register number (%d)"), regno);
11976 else
11977 {
11978 INSERT_OPERAND (0, RT, *ip, regno);
11979 continue;
11980 }
11981 }
11982 else
11983 as_bad (_("Invalid coprocessor 0 register number"));
11984 break;
11985
11986 case 'x':
11987 /* bbit[01] and bbit[01]32 bit index. Give error if index
11988 is not in the valid range. */
11989 gas_assert (!mips_opts.micromips);
11990 my_getExpression (&imm_expr, s);
11991 check_absolute_expr (ip, &imm_expr);
11992 if ((unsigned) imm_expr.X_add_number > 31)
11993 {
11994 as_bad (_("Improper bit index (%lu)"),
11995 (unsigned long) imm_expr.X_add_number);
11996 imm_expr.X_add_number = 0;
11997 }
11998 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11999 imm_expr.X_op = O_absent;
12000 s = expr_end;
12001 continue;
12002
12003 case 'X':
12004 /* bbit[01] bit index when bbit is used but we generate
12005 bbit[01]32 because the index is over 32. Move to the
12006 next candidate if index is not in the valid range. */
12007 gas_assert (!mips_opts.micromips);
12008 my_getExpression (&imm_expr, s);
12009 check_absolute_expr (ip, &imm_expr);
12010 if ((unsigned) imm_expr.X_add_number < 32
12011 || (unsigned) imm_expr.X_add_number > 63)
12012 break;
12013 INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
12014 imm_expr.X_op = O_absent;
12015 s = expr_end;
12016 continue;
12017
12018 case 'p':
12019 /* cins, cins32, exts and exts32 position field. Give error
12020 if it's not in the valid range. */
12021 gas_assert (!mips_opts.micromips);
12022 my_getExpression (&imm_expr, s);
12023 check_absolute_expr (ip, &imm_expr);
12024 if ((unsigned) imm_expr.X_add_number > 31)
12025 {
12026 as_bad (_("Improper position (%lu)"),
12027 (unsigned long) imm_expr.X_add_number);
12028 imm_expr.X_add_number = 0;
12029 }
12030 /* Make the pos explicit to simplify +S. */
12031 lastpos = imm_expr.X_add_number + 32;
12032 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
12033 imm_expr.X_op = O_absent;
12034 s = expr_end;
12035 continue;
12036
12037 case 'P':
12038 /* cins, cins32, exts and exts32 position field. Move to
12039 the next candidate if it's not in the valid range. */
12040 gas_assert (!mips_opts.micromips);
12041 my_getExpression (&imm_expr, s);
12042 check_absolute_expr (ip, &imm_expr);
12043 if ((unsigned) imm_expr.X_add_number < 32
12044 || (unsigned) imm_expr.X_add_number > 63)
12045 break;
12046 lastpos = imm_expr.X_add_number;
12047 INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
12048 imm_expr.X_op = O_absent;
12049 s = expr_end;
12050 continue;
12051
12052 case 's':
12053 /* cins and exts length-minus-one field. */
12054 gas_assert (!mips_opts.micromips);
12055 my_getExpression (&imm_expr, s);
12056 check_absolute_expr (ip, &imm_expr);
12057 if ((unsigned long) imm_expr.X_add_number > 31)
12058 {
12059 as_bad (_("Improper size (%lu)"),
12060 (unsigned long) imm_expr.X_add_number);
12061 imm_expr.X_add_number = 0;
12062 }
12063 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12064 imm_expr.X_op = O_absent;
12065 s = expr_end;
12066 continue;
12067
12068 case 'S':
12069 /* cins32/exts32 and cins/exts aliasing cint32/exts32
12070 length-minus-one field. */
12071 gas_assert (!mips_opts.micromips);
12072 my_getExpression (&imm_expr, s);
12073 check_absolute_expr (ip, &imm_expr);
12074 if ((long) imm_expr.X_add_number < 0
12075 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
12076 {
12077 as_bad (_("Improper size (%lu)"),
12078 (unsigned long) imm_expr.X_add_number);
12079 imm_expr.X_add_number = 0;
12080 }
12081 INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
12082 imm_expr.X_op = O_absent;
12083 s = expr_end;
12084 continue;
12085
12086 case 'Q':
12087 /* seqi/snei immediate field. */
12088 gas_assert (!mips_opts.micromips);
12089 my_getExpression (&imm_expr, s);
12090 check_absolute_expr (ip, &imm_expr);
12091 if ((long) imm_expr.X_add_number < -512
12092 || (long) imm_expr.X_add_number >= 512)
12093 {
12094 as_bad (_("Improper immediate (%ld)"),
12095 (long) imm_expr.X_add_number);
12096 imm_expr.X_add_number = 0;
12097 }
12098 INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
12099 imm_expr.X_op = O_absent;
12100 s = expr_end;
12101 continue;
12102
12103 case 'a': /* 8-bit signed offset in bit 6 */
12104 gas_assert (!mips_opts.micromips);
12105 my_getExpression (&imm_expr, s);
12106 check_absolute_expr (ip, &imm_expr);
12107 min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
12108 max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
12109 if (imm_expr.X_add_number < min_range
12110 || imm_expr.X_add_number > max_range)
12111 {
12112 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12113 (long) min_range, (long) max_range,
12114 (long) imm_expr.X_add_number);
12115 }
12116 INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
12117 imm_expr.X_op = O_absent;
12118 s = expr_end;
12119 continue;
12120
12121 case 'b': /* 8-bit signed offset in bit 3 */
12122 gas_assert (!mips_opts.micromips);
12123 my_getExpression (&imm_expr, s);
12124 check_absolute_expr (ip, &imm_expr);
12125 min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
12126 max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
12127 if (imm_expr.X_add_number < min_range
12128 || imm_expr.X_add_number > max_range)
12129 {
12130 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12131 (long) min_range, (long) max_range,
12132 (long) imm_expr.X_add_number);
12133 }
12134 INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
12135 imm_expr.X_op = O_absent;
12136 s = expr_end;
12137 continue;
12138
12139 case 'c': /* 9-bit signed offset in bit 6 */
12140 gas_assert (!mips_opts.micromips);
12141 my_getExpression (&imm_expr, s);
12142 check_absolute_expr (ip, &imm_expr);
12143 min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
12144 max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
12145 /* We check the offset range before adjusted. */
12146 min_range <<= 4;
12147 max_range <<= 4;
12148 if (imm_expr.X_add_number < min_range
12149 || imm_expr.X_add_number > max_range)
12150 {
12151 as_bad (_("Offset not in range %ld..%ld (%ld)"),
12152 (long) min_range, (long) max_range,
12153 (long) imm_expr.X_add_number);
12154 }
12155 if (imm_expr.X_add_number & 0xf)
12156 {
12157 as_bad (_("Offset not 16 bytes alignment (%ld)"),
12158 (long) imm_expr.X_add_number);
12159 }
12160 /* Right shift 4 bits to adjust the offset operand. */
12161 INSERT_OPERAND (0, OFFSET_C, *ip,
12162 imm_expr.X_add_number >> 4);
12163 imm_expr.X_op = O_absent;
12164 s = expr_end;
12165 continue;
12166
12167 case 'z':
12168 gas_assert (!mips_opts.micromips);
12169 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
12170 break;
12171 if (regno == AT && mips_opts.at)
12172 {
12173 if (mips_opts.at == ATREG)
12174 as_warn (_("used $at without \".set noat\""));
12175 else
12176 as_warn (_("used $%u with \".set at=$%u\""),
12177 regno, mips_opts.at);
12178 }
12179 INSERT_OPERAND (0, RZ, *ip, regno);
12180 continue;
12181
12182 case 'Z':
12183 gas_assert (!mips_opts.micromips);
12184 if (!reg_lookup (&s, RTYPE_FPU, &regno))
12185 break;
12186 INSERT_OPERAND (0, FZ, *ip, regno);
12187 continue;
12188
12189 case 'j':
12190 {
12191 int shift = 8;
12192 size_t i;
12193 /* Check whether there is only a single bracketed expression
12194 left. If so, it must be the base register and the
12195 constant must be zero. */
12196 if (*s == '(' && strchr (s + 1, '(') == 0)
12197 continue;
12198
12199 /* If this value won't fit into the offset, then go find
12200 a macro that will generate a 16- or 32-bit offset code
12201 pattern. */
12202 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12203 if ((i == 0 && (imm_expr.X_op != O_constant
12204 || imm_expr.X_add_number >= 1 << shift
12205 || imm_expr.X_add_number < -1 << shift))
12206 || i > 0)
12207 {
12208 imm_expr.X_op = O_absent;
12209 break;
12210 }
12211 INSERT_OPERAND (mips_opts.micromips, EVAOFFSET, *ip,
12212 imm_expr.X_add_number);
12213 imm_expr.X_op = O_absent;
12214 s = expr_end;
12215 }
12216 continue;
12217
12218 default:
12219 as_bad (_("Internal error: bad %s opcode "
12220 "(unknown extension operand type `+%c'): %s %s"),
12221 mips_opts.micromips ? "microMIPS" : "MIPS",
12222 *args, insn->name, insn->args);
12223 /* Further processing is fruitless. */
12224 return;
12225 }
12226 break;
12227
12228 case '.': /* 10-bit offset. */
12229 gas_assert (mips_opts.micromips);
12230 case '~': /* 12-bit offset. */
12231 {
12232 int shift = *args == '.' ? 9 : 11;
12233 size_t i;
12234
12235 /* Check whether there is only a single bracketed expression
12236 left. If so, it must be the base register and the
12237 constant must be zero. */
12238 if (*s == '(' && strchr (s + 1, '(') == 0)
12239 continue;
12240
12241 /* If this value won't fit into the offset, then go find
12242 a macro that will generate a 16- or 32-bit offset code
12243 pattern. */
12244 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
12245 if ((i == 0 && (imm_expr.X_op != O_constant
12246 || imm_expr.X_add_number >= 1 << shift
12247 || imm_expr.X_add_number < -1 << shift))
12248 || i > 0)
12249 {
12250 imm_expr.X_op = O_absent;
12251 break;
12252 }
12253 if (shift == 9)
12254 INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
12255 else
12256 INSERT_OPERAND (mips_opts.micromips,
12257 OFFSET12, *ip, imm_expr.X_add_number);
12258 imm_expr.X_op = O_absent;
12259 s = expr_end;
12260 }
12261 continue;
12262
12263 case '<': /* must be at least one digit */
12264 /*
12265 * According to the manual, if the shift amount is greater
12266 * than 31 or less than 0, then the shift amount should be
12267 * mod 32. In reality the mips assembler issues an error.
12268 * We issue a warning and mask out all but the low 5 bits.
12269 */
12270 my_getExpression (&imm_expr, s);
12271 check_absolute_expr (ip, &imm_expr);
12272 if ((unsigned long) imm_expr.X_add_number > 31)
12273 as_warn (_("Improper shift amount (%lu)"),
12274 (unsigned long) imm_expr.X_add_number);
12275 INSERT_OPERAND (mips_opts.micromips,
12276 SHAMT, *ip, imm_expr.X_add_number);
12277 imm_expr.X_op = O_absent;
12278 s = expr_end;
12279 continue;
12280
12281 case '>': /* shift amount minus 32 */
12282 my_getExpression (&imm_expr, s);
12283 check_absolute_expr (ip, &imm_expr);
12284 if ((unsigned long) imm_expr.X_add_number < 32
12285 || (unsigned long) imm_expr.X_add_number > 63)
12286 break;
12287 INSERT_OPERAND (mips_opts.micromips,
12288 SHAMT, *ip, imm_expr.X_add_number - 32);
12289 imm_expr.X_op = O_absent;
12290 s = expr_end;
12291 continue;
12292
12293 case 'k': /* CACHE code. */
12294 case 'h': /* PREFX code. */
12295 case '1': /* SYNC type. */
12296 my_getExpression (&imm_expr, s);
12297 check_absolute_expr (ip, &imm_expr);
12298 if ((unsigned long) imm_expr.X_add_number > 31)
12299 as_warn (_("Invalid value for `%s' (%lu)"),
12300 ip->insn_mo->name,
12301 (unsigned long) imm_expr.X_add_number);
12302 switch (*args)
12303 {
12304 case 'k':
12305 if (mips_fix_cn63xxp1
12306 && !mips_opts.micromips
12307 && strcmp ("pref", insn->name) == 0)
12308 switch (imm_expr.X_add_number)
12309 {
12310 case 5:
12311 case 25:
12312 case 26:
12313 case 27:
12314 case 28:
12315 case 29:
12316 case 30:
12317 case 31: /* These are ok. */
12318 break;
12319
12320 default: /* The rest must be changed to 28. */
12321 imm_expr.X_add_number = 28;
12322 break;
12323 }
12324 INSERT_OPERAND (mips_opts.micromips,
12325 CACHE, *ip, imm_expr.X_add_number);
12326 break;
12327 case 'h':
12328 INSERT_OPERAND (mips_opts.micromips,
12329 PREFX, *ip, imm_expr.X_add_number);
12330 break;
12331 case '1':
12332 INSERT_OPERAND (mips_opts.micromips,
12333 STYPE, *ip, imm_expr.X_add_number);
12334 break;
12335 }
12336 imm_expr.X_op = O_absent;
12337 s = expr_end;
12338 continue;
12339
12340 case 'c': /* BREAK code. */
12341 {
12342 unsigned long mask = (mips_opts.micromips
12343 ? MICROMIPSOP_MASK_CODE
12344 : OP_MASK_CODE);
12345
12346 my_getExpression (&imm_expr, s);
12347 check_absolute_expr (ip, &imm_expr);
12348 if ((unsigned long) imm_expr.X_add_number > mask)
12349 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12350 ip->insn_mo->name,
12351 mask, (unsigned long) imm_expr.X_add_number);
12352 INSERT_OPERAND (mips_opts.micromips,
12353 CODE, *ip, imm_expr.X_add_number);
12354 imm_expr.X_op = O_absent;
12355 s = expr_end;
12356 }
12357 continue;
12358
12359 case 'q': /* Lower BREAK code. */
12360 {
12361 unsigned long mask = (mips_opts.micromips
12362 ? MICROMIPSOP_MASK_CODE2
12363 : OP_MASK_CODE2);
12364
12365 my_getExpression (&imm_expr, s);
12366 check_absolute_expr (ip, &imm_expr);
12367 if ((unsigned long) imm_expr.X_add_number > mask)
12368 as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
12369 ip->insn_mo->name,
12370 mask, (unsigned long) imm_expr.X_add_number);
12371 INSERT_OPERAND (mips_opts.micromips,
12372 CODE2, *ip, imm_expr.X_add_number);
12373 imm_expr.X_op = O_absent;
12374 s = expr_end;
12375 }
12376 continue;
12377
12378 case 'B': /* 20- or 10-bit syscall/break/wait code. */
12379 {
12380 unsigned long mask = (mips_opts.micromips
12381 ? MICROMIPSOP_MASK_CODE10
12382 : OP_MASK_CODE20);
12383
12384 my_getExpression (&imm_expr, s);
12385 check_absolute_expr (ip, &imm_expr);
12386 if ((unsigned long) imm_expr.X_add_number > mask)
12387 as_warn (_("Code for %s not in range 0..%lu (%lu)"),
12388 ip->insn_mo->name,
12389 mask, (unsigned long) imm_expr.X_add_number);
12390 if (mips_opts.micromips)
12391 INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
12392 else
12393 INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
12394 imm_expr.X_op = O_absent;
12395 s = expr_end;
12396 }
12397 continue;
12398
12399 case 'C': /* 25- or 23-bit coprocessor code. */
12400 {
12401 unsigned long mask = (mips_opts.micromips
12402 ? MICROMIPSOP_MASK_COPZ
12403 : OP_MASK_COPZ);
12404
12405 my_getExpression (&imm_expr, s);
12406 check_absolute_expr (ip, &imm_expr);
12407 if ((unsigned long) imm_expr.X_add_number > mask)
12408 as_warn (_("Coproccesor code > %u bits (%lu)"),
12409 mips_opts.micromips ? 23U : 25U,
12410 (unsigned long) imm_expr.X_add_number);
12411 INSERT_OPERAND (mips_opts.micromips,
12412 COPZ, *ip, imm_expr.X_add_number);
12413 imm_expr.X_op = O_absent;
12414 s = expr_end;
12415 }
12416 continue;
12417
12418 case 'J': /* 19-bit WAIT code. */
12419 gas_assert (!mips_opts.micromips);
12420 my_getExpression (&imm_expr, s);
12421 check_absolute_expr (ip, &imm_expr);
12422 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
12423 {
12424 as_warn (_("Illegal 19-bit code (%lu)"),
12425 (unsigned long) imm_expr.X_add_number);
12426 imm_expr.X_add_number &= OP_MASK_CODE19;
12427 }
12428 INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
12429 imm_expr.X_op = O_absent;
12430 s = expr_end;
12431 continue;
12432
12433 case 'P': /* Performance register. */
12434 gas_assert (!mips_opts.micromips);
12435 my_getExpression (&imm_expr, s);
12436 check_absolute_expr (ip, &imm_expr);
12437 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
12438 as_warn (_("Invalid performance register (%lu)"),
12439 (unsigned long) imm_expr.X_add_number);
12440 if (imm_expr.X_add_number != 0 && mips_opts.arch == CPU_R5900
12441 && (!strcmp(insn->name,"mfps") || !strcmp(insn->name,"mtps")))
12442 as_warn (_("Invalid performance register (%lu)"),
12443 (unsigned long) imm_expr.X_add_number);
12444 INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
12445 imm_expr.X_op = O_absent;
12446 s = expr_end;
12447 continue;
12448
12449 case 'G': /* Coprocessor destination register. */
12450 {
12451 unsigned long opcode = ip->insn_opcode;
12452 unsigned long mask;
12453 unsigned int types;
12454 int cop0;
12455
12456 if (mips_opts.micromips)
12457 {
12458 mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
12459 | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
12460 | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
12461 opcode &= mask;
12462 switch (opcode)
12463 {
12464 case 0x000000fc: /* mfc0 */
12465 case 0x000002fc: /* mtc0 */
12466 case 0x580000fc: /* dmfc0 */
12467 case 0x580002fc: /* dmtc0 */
12468 cop0 = 1;
12469 break;
12470 default:
12471 cop0 = 0;
12472 break;
12473 }
12474 }
12475 else
12476 {
12477 opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
12478 cop0 = opcode == OP_OP_COP0;
12479 }
12480 types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
12481 ok = reg_lookup (&s, types, &regno);
12482 if (mips_opts.micromips)
12483 INSERT_OPERAND (1, RS, *ip, regno);
12484 else
12485 INSERT_OPERAND (0, RD, *ip, regno);
12486 if (ok)
12487 {
12488 lastregno = regno;
12489 continue;
12490 }
12491 }
12492 break;
12493
12494 case 'y': /* ALNV.PS source register. */
12495 gas_assert (mips_opts.micromips);
12496 goto do_reg;
12497 case 'x': /* Ignore register name. */
12498 case 'U': /* Destination register (CLO/CLZ). */
12499 case 'g': /* Coprocessor destination register. */
12500 gas_assert (!mips_opts.micromips);
12501 case 'b': /* Base register. */
12502 case 'd': /* Destination register. */
12503 case 's': /* Source register. */
12504 case 't': /* Target register. */
12505 case 'r': /* Both target and source. */
12506 case 'v': /* Both dest and source. */
12507 case 'w': /* Both dest and target. */
12508 case 'E': /* Coprocessor target register. */
12509 case 'K': /* RDHWR destination register. */
12510 case 'z': /* Must be zero register. */
12511 do_reg:
12512 s_reset = s;
12513 if (*args == 'E' || *args == 'K')
12514 ok = reg_lookup (&s, RTYPE_NUM, &regno);
12515 else
12516 {
12517 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12518 if (regno == AT && mips_opts.at)
12519 {
12520 if (mips_opts.at == ATREG)
12521 as_warn (_("Used $at without \".set noat\""));
12522 else
12523 as_warn (_("Used $%u with \".set at=$%u\""),
12524 regno, mips_opts.at);
12525 }
12526 }
12527 if (ok)
12528 {
12529 c = *args;
12530 if (*s == ' ')
12531 ++s;
12532 if (args[1] != *s)
12533 {
12534 if (c == 'r' || c == 'v' || c == 'w')
12535 {
12536 regno = lastregno;
12537 s = s_reset;
12538 ++args;
12539 }
12540 }
12541 /* 'z' only matches $0. */
12542 if (c == 'z' && regno != 0)
12543 break;
12544
12545 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
12546 {
12547 if (regno == lastregno)
12548 {
12549 insn_error
12550 = _("Source and destination must be different");
12551 continue;
12552 }
12553 if (regno == 31 && lastregno == 0xffffffff)
12554 {
12555 insn_error
12556 = _("A destination register must be supplied");
12557 continue;
12558 }
12559 }
12560 /* Now that we have assembled one operand, we use the args
12561 string to figure out where it goes in the instruction. */
12562 switch (c)
12563 {
12564 case 'r':
12565 case 's':
12566 case 'v':
12567 case 'b':
12568 INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
12569 break;
12570
12571 case 'K':
12572 if (mips_opts.micromips)
12573 INSERT_OPERAND (1, RS, *ip, regno);
12574 else
12575 INSERT_OPERAND (0, RD, *ip, regno);
12576 break;
12577
12578 case 'd':
12579 case 'g':
12580 INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
12581 break;
12582
12583 case 'U':
12584 gas_assert (!mips_opts.micromips);
12585 INSERT_OPERAND (0, RD, *ip, regno);
12586 INSERT_OPERAND (0, RT, *ip, regno);
12587 break;
12588
12589 case 'w':
12590 case 't':
12591 case 'E':
12592 INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
12593 break;
12594
12595 case 'y':
12596 gas_assert (mips_opts.micromips);
12597 INSERT_OPERAND (1, RS3, *ip, regno);
12598 break;
12599
12600 case 'x':
12601 /* This case exists because on the r3000 trunc
12602 expands into a macro which requires a gp
12603 register. On the r6000 or r4000 it is
12604 assembled into a single instruction which
12605 ignores the register. Thus the insn version
12606 is MIPS_ISA2 and uses 'x', and the macro
12607 version is MIPS_ISA1 and uses 't'. */
12608 break;
12609
12610 case 'z':
12611 /* This case is for the div instruction, which
12612 acts differently if the destination argument
12613 is $0. This only matches $0, and is checked
12614 outside the switch. */
12615 break;
12616 }
12617 lastregno = regno;
12618 continue;
12619 }
12620 switch (*args++)
12621 {
12622 case 'r':
12623 case 'v':
12624 INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
12625 continue;
12626
12627 case 'w':
12628 INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
12629 continue;
12630 }
12631 break;
12632
12633 case 'O': /* MDMX alignment immediate constant. */
12634 gas_assert (!mips_opts.micromips);
12635 my_getExpression (&imm_expr, s);
12636 check_absolute_expr (ip, &imm_expr);
12637 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
12638 as_warn (_("Improper align amount (%ld), using low bits"),
12639 (long) imm_expr.X_add_number);
12640 INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
12641 imm_expr.X_op = O_absent;
12642 s = expr_end;
12643 continue;
12644
12645 case 'Q': /* MDMX vector, element sel, or const. */
12646 if (s[0] != '$')
12647 {
12648 /* MDMX Immediate. */
12649 gas_assert (!mips_opts.micromips);
12650 my_getExpression (&imm_expr, s);
12651 check_absolute_expr (ip, &imm_expr);
12652 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
12653 as_warn (_("Invalid MDMX Immediate (%ld)"),
12654 (long) imm_expr.X_add_number);
12655 INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
12656 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12657 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
12658 else
12659 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
12660 imm_expr.X_op = O_absent;
12661 s = expr_end;
12662 continue;
12663 }
12664 /* Not MDMX Immediate. Fall through. */
12665 case 'X': /* MDMX destination register. */
12666 case 'Y': /* MDMX source register. */
12667 case 'Z': /* MDMX target register. */
12668 is_mdmx = 1;
12669 case 'W':
12670 gas_assert (!mips_opts.micromips);
12671 case 'D': /* Floating point destination register. */
12672 case 'S': /* Floating point source register. */
12673 case 'T': /* Floating point target register. */
12674 case 'R': /* Floating point source register. */
12675 case 'V':
12676 rtype = RTYPE_FPU;
12677 if (is_mdmx
12678 || ((mips_opts.ase & ASE_MDMX)
12679 && (ip->insn_mo->pinfo & FP_D)
12680 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
12681 | INSN_COPROC_MEMORY_DELAY
12682 | INSN_LOAD_COPROC_DELAY
12683 | INSN_LOAD_MEMORY_DELAY
12684 | INSN_STORE_MEMORY))))
12685 rtype |= RTYPE_VEC;
12686 s_reset = s;
12687 if (reg_lookup (&s, rtype, &regno))
12688 {
12689 if ((regno & 1) != 0
12690 && HAVE_32BIT_FPRS
12691 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
12692 as_warn (_("Float register should be even, was %d"),
12693 regno);
12694
12695 c = *args;
12696 if (*s == ' ')
12697 ++s;
12698 if (args[1] != *s)
12699 {
12700 if (c == 'V' || c == 'W')
12701 {
12702 regno = lastregno;
12703 s = s_reset;
12704 ++args;
12705 }
12706 }
12707 switch (c)
12708 {
12709 case 'D':
12710 case 'X':
12711 INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
12712 break;
12713
12714 case 'V':
12715 case 'S':
12716 case 'Y':
12717 INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
12718 break;
12719
12720 case 'Q':
12721 /* This is like 'Z', but also needs to fix the MDMX
12722 vector/scalar select bits. Note that the
12723 scalar immediate case is handled above. */
12724 if (*s == '[')
12725 {
12726 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
12727 int max_el = (is_qh ? 3 : 7);
12728 s++;
12729 my_getExpression(&imm_expr, s);
12730 check_absolute_expr (ip, &imm_expr);
12731 s = expr_end;
12732 if (imm_expr.X_add_number > max_el)
12733 as_bad (_("Bad element selector %ld"),
12734 (long) imm_expr.X_add_number);
12735 imm_expr.X_add_number &= max_el;
12736 ip->insn_opcode |= (imm_expr.X_add_number
12737 << (OP_SH_VSEL +
12738 (is_qh ? 2 : 1)));
12739 imm_expr.X_op = O_absent;
12740 if (*s != ']')
12741 as_warn (_("Expecting ']' found '%s'"), s);
12742 else
12743 s++;
12744 }
12745 else
12746 {
12747 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
12748 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
12749 << OP_SH_VSEL);
12750 else
12751 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
12752 OP_SH_VSEL);
12753 }
12754 /* Fall through. */
12755 case 'W':
12756 case 'T':
12757 case 'Z':
12758 INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
12759 break;
12760
12761 case 'R':
12762 INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
12763 break;
12764 }
12765 lastregno = regno;
12766 continue;
12767 }
12768
12769 switch (*args++)
12770 {
12771 case 'V':
12772 INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
12773 continue;
12774
12775 case 'W':
12776 INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
12777 continue;
12778 }
12779 break;
12780
12781 case 'I':
12782 my_getExpression (&imm_expr, s);
12783 if (imm_expr.X_op != O_big
12784 && imm_expr.X_op != O_constant)
12785 insn_error = _("absolute expression required");
12786 if (HAVE_32BIT_GPRS)
12787 normalize_constant_expr (&imm_expr);
12788 s = expr_end;
12789 continue;
12790
12791 case 'A':
12792 my_getExpression (&offset_expr, s);
12793 normalize_address_expr (&offset_expr);
12794 *imm_reloc = BFD_RELOC_32;
12795 s = expr_end;
12796 continue;
12797
12798 case 'F':
12799 case 'L':
12800 case 'f':
12801 case 'l':
12802 {
12803 int f64;
12804 int using_gprs;
12805 char *save_in;
12806 char *err;
12807 unsigned char temp[8];
12808 int len;
12809 unsigned int length;
12810 segT seg;
12811 subsegT subseg;
12812 char *p;
12813
12814 /* These only appear as the last operand in an
12815 instruction, and every instruction that accepts
12816 them in any variant accepts them in all variants.
12817 This means we don't have to worry about backing out
12818 any changes if the instruction does not match.
12819
12820 The difference between them is the size of the
12821 floating point constant and where it goes. For 'F'
12822 and 'L' the constant is 64 bits; for 'f' and 'l' it
12823 is 32 bits. Where the constant is placed is based
12824 on how the MIPS assembler does things:
12825 F -- .rdata
12826 L -- .lit8
12827 f -- immediate value
12828 l -- .lit4
12829
12830 The .lit4 and .lit8 sections are only used if
12831 permitted by the -G argument.
12832
12833 The code below needs to know whether the target register
12834 is 32 or 64 bits wide. It relies on the fact 'f' and
12835 'F' are used with GPR-based instructions and 'l' and
12836 'L' are used with FPR-based instructions. */
12837
12838 f64 = *args == 'F' || *args == 'L';
12839 using_gprs = *args == 'F' || *args == 'f';
12840
12841 save_in = input_line_pointer;
12842 input_line_pointer = s;
12843 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12844 length = len;
12845 s = input_line_pointer;
12846 input_line_pointer = save_in;
12847 if (err != NULL && *err != '\0')
12848 {
12849 as_bad (_("Bad floating point constant: %s"), err);
12850 memset (temp, '\0', sizeof temp);
12851 length = f64 ? 8 : 4;
12852 }
12853
12854 gas_assert (length == (unsigned) (f64 ? 8 : 4));
12855
12856 if (*args == 'f'
12857 || (*args == 'l'
12858 && (g_switch_value < 4
12859 || (temp[0] == 0 && temp[1] == 0)
12860 || (temp[2] == 0 && temp[3] == 0))))
12861 {
12862 imm_expr.X_op = O_constant;
12863 if (!target_big_endian)
12864 imm_expr.X_add_number = bfd_getl32 (temp);
12865 else
12866 imm_expr.X_add_number = bfd_getb32 (temp);
12867 }
12868 else if (length > 4
12869 && !mips_disable_float_construction
12870 /* Constants can only be constructed in GPRs and
12871 copied to FPRs if the GPRs are at least as wide
12872 as the FPRs. Force the constant into memory if
12873 we are using 64-bit FPRs but the GPRs are only
12874 32 bits wide. */
12875 && (using_gprs
12876 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12877 && ((temp[0] == 0 && temp[1] == 0)
12878 || (temp[2] == 0 && temp[3] == 0))
12879 && ((temp[4] == 0 && temp[5] == 0)
12880 || (temp[6] == 0 && temp[7] == 0)))
12881 {
12882 /* The value is simple enough to load with a couple of
12883 instructions. If using 32-bit registers, set
12884 imm_expr to the high order 32 bits and offset_expr to
12885 the low order 32 bits. Otherwise, set imm_expr to
12886 the entire 64 bit constant. */
12887 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12888 {
12889 imm_expr.X_op = O_constant;
12890 offset_expr.X_op = O_constant;
12891 if (!target_big_endian)
12892 {
12893 imm_expr.X_add_number = bfd_getl32 (temp + 4);
12894 offset_expr.X_add_number = bfd_getl32 (temp);
12895 }
12896 else
12897 {
12898 imm_expr.X_add_number = bfd_getb32 (temp);
12899 offset_expr.X_add_number = bfd_getb32 (temp + 4);
12900 }
12901 if (offset_expr.X_add_number == 0)
12902 offset_expr.X_op = O_absent;
12903 }
12904 else
12905 {
12906 imm_expr.X_op = O_constant;
12907 if (!target_big_endian)
12908 imm_expr.X_add_number = bfd_getl64 (temp);
12909 else
12910 imm_expr.X_add_number = bfd_getb64 (temp);
12911 }
12912 }
12913 else
12914 {
12915 const char *newname;
12916 segT new_seg;
12917
12918 /* Switch to the right section. */
12919 seg = now_seg;
12920 subseg = now_subseg;
12921 switch (*args)
12922 {
12923 default: /* unused default case avoids warnings. */
12924 case 'L':
12925 newname = RDATA_SECTION_NAME;
12926 if (g_switch_value >= 8)
12927 newname = ".lit8";
12928 break;
12929 case 'F':
12930 newname = RDATA_SECTION_NAME;
12931 break;
12932 case 'l':
12933 gas_assert (g_switch_value >= 4);
12934 newname = ".lit4";
12935 break;
12936 }
12937 new_seg = subseg_new (newname, (subsegT) 0);
12938 bfd_set_section_flags (stdoutput, new_seg,
12939 (SEC_ALLOC
12940 | SEC_LOAD
12941 | SEC_READONLY
12942 | SEC_DATA));
12943 frag_align (*args == 'l' ? 2 : 3, 0, 0);
12944 if (strncmp (TARGET_OS, "elf", 3) != 0)
12945 record_alignment (new_seg, 4);
12946 else
12947 record_alignment (new_seg, *args == 'l' ? 2 : 3);
12948 if (seg == now_seg)
12949 as_bad (_("Can't use floating point insn in this section"));
12950
12951 /* Set the argument to the current address in the
12952 section. */
12953 offset_expr.X_op = O_symbol;
12954 offset_expr.X_add_symbol = symbol_temp_new_now ();
12955 offset_expr.X_add_number = 0;
12956
12957 /* Put the floating point number into the section. */
12958 p = frag_more ((int) length);
12959 memcpy (p, temp, length);
12960
12961 /* Switch back to the original section. */
12962 subseg_set (seg, subseg);
12963 }
12964 }
12965 continue;
12966
12967 case 'i': /* 16-bit unsigned immediate. */
12968 case 'j': /* 16-bit signed immediate. */
12969 *imm_reloc = BFD_RELOC_LO16;
12970 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12971 {
12972 int more;
12973 offsetT minval, maxval;
12974
12975 more = (insn + 1 < past
12976 && strcmp (insn->name, insn[1].name) == 0);
12977
12978 /* For compatibility with older assemblers, we accept
12979 0x8000-0xffff as signed 16-bit numbers when only
12980 signed numbers are allowed. */
12981 if (*args == 'i')
12982 minval = 0, maxval = 0xffff;
12983 else if (more)
12984 minval = -0x8000, maxval = 0x7fff;
12985 else
12986 minval = -0x8000, maxval = 0xffff;
12987
12988 if (imm_expr.X_op != O_constant
12989 || imm_expr.X_add_number < minval
12990 || imm_expr.X_add_number > maxval)
12991 {
12992 if (more)
12993 break;
12994 if (imm_expr.X_op == O_constant
12995 || imm_expr.X_op == O_big)
12996 as_bad (_("Expression out of range"));
12997 }
12998 }
12999 s = expr_end;
13000 continue;
13001
13002 case 'o': /* 16-bit offset. */
13003 offset_reloc[0] = BFD_RELOC_LO16;
13004 offset_reloc[1] = BFD_RELOC_UNUSED;
13005 offset_reloc[2] = BFD_RELOC_UNUSED;
13006
13007 /* Check whether there is only a single bracketed expression
13008 left. If so, it must be the base register and the
13009 constant must be zero. */
13010 if (*s == '(' && strchr (s + 1, '(') == 0)
13011 {
13012 offset_expr.X_op = O_constant;
13013 offset_expr.X_add_number = 0;
13014 continue;
13015 }
13016
13017 /* If this value won't fit into a 16 bit offset, then go
13018 find a macro that will generate the 32 bit offset
13019 code pattern. */
13020 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
13021 && (offset_expr.X_op != O_constant
13022 || offset_expr.X_add_number >= 0x8000
13023 || offset_expr.X_add_number < -0x8000))
13024 break;
13025
13026 s = expr_end;
13027 continue;
13028
13029 case 'p': /* PC-relative offset. */
13030 *offset_reloc = BFD_RELOC_16_PCREL_S2;
13031 my_getExpression (&offset_expr, s);
13032 s = expr_end;
13033 continue;
13034
13035 case 'u': /* Upper 16 bits. */
13036 *imm_reloc = BFD_RELOC_LO16;
13037 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
13038 && imm_expr.X_op == O_constant
13039 && (imm_expr.X_add_number < 0
13040 || imm_expr.X_add_number >= 0x10000))
13041 as_bad (_("lui expression (%lu) not in range 0..65535"),
13042 (unsigned long) imm_expr.X_add_number);
13043 s = expr_end;
13044 continue;
13045
13046 case 'a': /* 26-bit address. */
13047 *offset_reloc = BFD_RELOC_MIPS_JMP;
13048 my_getExpression (&offset_expr, s);
13049 s = expr_end;
13050 continue;
13051
13052 case 'N': /* 3-bit branch condition code. */
13053 case 'M': /* 3-bit compare condition code. */
13054 rtype = RTYPE_CCC;
13055 if (ip->insn_mo->pinfo & (FP_D | FP_S))
13056 rtype |= RTYPE_FCC;
13057 if (!reg_lookup (&s, rtype, &regno))
13058 break;
13059 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
13060 || strcmp (str + strlen (str) - 5, "any2f") == 0
13061 || strcmp (str + strlen (str) - 5, "any2t") == 0)
13062 && (regno & 1) != 0)
13063 as_warn (_("Condition code register should be even for %s, "
13064 "was %d"),
13065 str, regno);
13066 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
13067 || strcmp (str + strlen (str) - 5, "any4t") == 0)
13068 && (regno & 3) != 0)
13069 as_warn (_("Condition code register should be 0 or 4 for %s, "
13070 "was %d"),
13071 str, regno);
13072 if (*args == 'N')
13073 INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
13074 else
13075 INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
13076 continue;
13077
13078 case 'H':
13079 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
13080 s += 2;
13081 if (ISDIGIT (*s))
13082 {
13083 c = 0;
13084 do
13085 {
13086 c *= 10;
13087 c += *s - '0';
13088 ++s;
13089 }
13090 while (ISDIGIT (*s));
13091 }
13092 else
13093 c = 8; /* Invalid sel value. */
13094
13095 if (c > 7)
13096 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
13097 INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
13098 continue;
13099
13100 case 'e':
13101 gas_assert (!mips_opts.micromips);
13102 /* Must be at least one digit. */
13103 my_getExpression (&imm_expr, s);
13104 check_absolute_expr (ip, &imm_expr);
13105
13106 if ((unsigned long) imm_expr.X_add_number
13107 > (unsigned long) OP_MASK_VECBYTE)
13108 {
13109 as_bad (_("bad byte vector index (%ld)"),
13110 (long) imm_expr.X_add_number);
13111 imm_expr.X_add_number = 0;
13112 }
13113
13114 INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
13115 imm_expr.X_op = O_absent;
13116 s = expr_end;
13117 continue;
13118
13119 case '%':
13120 gas_assert (!mips_opts.micromips);
13121 my_getExpression (&imm_expr, s);
13122 check_absolute_expr (ip, &imm_expr);
13123
13124 if ((unsigned long) imm_expr.X_add_number
13125 > (unsigned long) OP_MASK_VECALIGN)
13126 {
13127 as_bad (_("bad byte vector index (%ld)"),
13128 (long) imm_expr.X_add_number);
13129 imm_expr.X_add_number = 0;
13130 }
13131
13132 INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
13133 imm_expr.X_op = O_absent;
13134 s = expr_end;
13135 continue;
13136
13137 case 'm': /* Opcode extension character. */
13138 gas_assert (mips_opts.micromips);
13139 c = *++args;
13140 switch (c)
13141 {
13142 case 'r':
13143 if (strncmp (s, "$pc", 3) == 0)
13144 {
13145 s += 3;
13146 continue;
13147 }
13148 break;
13149
13150 case 'a':
13151 case 'b':
13152 case 'c':
13153 case 'd':
13154 case 'e':
13155 case 'f':
13156 case 'g':
13157 case 'h':
13158 case 'i':
13159 case 'j':
13160 case 'l':
13161 case 'm':
13162 case 'n':
13163 case 'p':
13164 case 'q':
13165 case 's':
13166 case 't':
13167 case 'x':
13168 case 'y':
13169 case 'z':
13170 s_reset = s;
13171 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
13172 if (regno == AT && mips_opts.at)
13173 {
13174 if (mips_opts.at == ATREG)
13175 as_warn (_("Used $at without \".set noat\""));
13176 else
13177 as_warn (_("Used $%u with \".set at=$%u\""),
13178 regno, mips_opts.at);
13179 }
13180 if (!ok)
13181 {
13182 if (c == 'c')
13183 {
13184 gas_assert (args[1] == ',');
13185 regno = lastregno;
13186 ++args;
13187 }
13188 else if (c == 't')
13189 {
13190 gas_assert (args[1] == ',');
13191 ++args;
13192 continue; /* Nothing to do. */
13193 }
13194 else
13195 break;
13196 }
13197
13198 if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
13199 {
13200 if (regno == lastregno)
13201 {
13202 insn_error
13203 = _("Source and destination must be different");
13204 continue;
13205 }
13206 if (regno == 31 && lastregno == 0xffffffff)
13207 {
13208 insn_error
13209 = _("A destination register must be supplied");
13210 continue;
13211 }
13212 }
13213
13214 if (*s == ' ')
13215 ++s;
13216 if (args[1] != *s)
13217 {
13218 if (c == 'e')
13219 {
13220 gas_assert (args[1] == ',');
13221 regno = lastregno;
13222 s = s_reset;
13223 ++args;
13224 }
13225 else if (c == 't')
13226 {
13227 gas_assert (args[1] == ',');
13228 s = s_reset;
13229 ++args;
13230 continue; /* Nothing to do. */
13231 }
13232 }
13233
13234 /* Make sure regno is the same as lastregno. */
13235 if (c == 't' && regno != lastregno)
13236 break;
13237
13238 /* Make sure regno is the same as destregno. */
13239 if (c == 'x' && regno != destregno)
13240 break;
13241
13242 /* We need to save regno, before regno maps to the
13243 microMIPS register encoding. */
13244 lastregno = regno;
13245
13246 if (c == 'f')
13247 destregno = regno;
13248
13249 switch (c)
13250 {
13251 case 'a':
13252 if (regno != GP)
13253 regno = ILLEGAL_REG;
13254 break;
13255
13256 case 'b':
13257 regno = mips32_to_micromips_reg_b_map[regno];
13258 break;
13259
13260 case 'c':
13261 regno = mips32_to_micromips_reg_c_map[regno];
13262 break;
13263
13264 case 'd':
13265 regno = mips32_to_micromips_reg_d_map[regno];
13266 break;
13267
13268 case 'e':
13269 regno = mips32_to_micromips_reg_e_map[regno];
13270 break;
13271
13272 case 'f':
13273 regno = mips32_to_micromips_reg_f_map[regno];
13274 break;
13275
13276 case 'g':
13277 regno = mips32_to_micromips_reg_g_map[regno];
13278 break;
13279
13280 case 'h':
13281 regno = mips32_to_micromips_reg_h_map[regno];
13282 break;
13283
13284 case 'i':
13285 switch (EXTRACT_OPERAND (1, MI, *ip))
13286 {
13287 case 4:
13288 if (regno == 21)
13289 regno = 3;
13290 else if (regno == 22)
13291 regno = 4;
13292 else if (regno == 5)
13293 regno = 5;
13294 else if (regno == 6)
13295 regno = 6;
13296 else if (regno == 7)
13297 regno = 7;
13298 else
13299 regno = ILLEGAL_REG;
13300 break;
13301
13302 case 5:
13303 if (regno == 6)
13304 regno = 0;
13305 else if (regno == 7)
13306 regno = 1;
13307 else
13308 regno = ILLEGAL_REG;
13309 break;
13310
13311 case 6:
13312 if (regno == 7)
13313 regno = 2;
13314 else
13315 regno = ILLEGAL_REG;
13316 break;
13317
13318 default:
13319 regno = ILLEGAL_REG;
13320 break;
13321 }
13322 break;
13323
13324 case 'l':
13325 regno = mips32_to_micromips_reg_l_map[regno];
13326 break;
13327
13328 case 'm':
13329 regno = mips32_to_micromips_reg_m_map[regno];
13330 break;
13331
13332 case 'n':
13333 regno = mips32_to_micromips_reg_n_map[regno];
13334 break;
13335
13336 case 'q':
13337 regno = mips32_to_micromips_reg_q_map[regno];
13338 break;
13339
13340 case 's':
13341 if (regno != SP)
13342 regno = ILLEGAL_REG;
13343 break;
13344
13345 case 'y':
13346 if (regno != 31)
13347 regno = ILLEGAL_REG;
13348 break;
13349
13350 case 'z':
13351 if (regno != ZERO)
13352 regno = ILLEGAL_REG;
13353 break;
13354
13355 case 'j': /* Do nothing. */
13356 case 'p':
13357 case 't':
13358 case 'x':
13359 break;
13360
13361 default:
13362 abort ();
13363 }
13364
13365 if (regno == ILLEGAL_REG)
13366 break;
13367
13368 switch (c)
13369 {
13370 case 'b':
13371 INSERT_OPERAND (1, MB, *ip, regno);
13372 break;
13373
13374 case 'c':
13375 INSERT_OPERAND (1, MC, *ip, regno);
13376 break;
13377
13378 case 'd':
13379 INSERT_OPERAND (1, MD, *ip, regno);
13380 break;
13381
13382 case 'e':
13383 INSERT_OPERAND (1, ME, *ip, regno);
13384 break;
13385
13386 case 'f':
13387 INSERT_OPERAND (1, MF, *ip, regno);
13388 break;
13389
13390 case 'g':
13391 INSERT_OPERAND (1, MG, *ip, regno);
13392 break;
13393
13394 case 'h':
13395 INSERT_OPERAND (1, MH, *ip, regno);
13396 break;
13397
13398 case 'i':
13399 INSERT_OPERAND (1, MI, *ip, regno);
13400 break;
13401
13402 case 'j':
13403 INSERT_OPERAND (1, MJ, *ip, regno);
13404 break;
13405
13406 case 'l':
13407 INSERT_OPERAND (1, ML, *ip, regno);
13408 break;
13409
13410 case 'm':
13411 INSERT_OPERAND (1, MM, *ip, regno);
13412 break;
13413
13414 case 'n':
13415 INSERT_OPERAND (1, MN, *ip, regno);
13416 break;
13417
13418 case 'p':
13419 INSERT_OPERAND (1, MP, *ip, regno);
13420 break;
13421
13422 case 'q':
13423 INSERT_OPERAND (1, MQ, *ip, regno);
13424 break;
13425
13426 case 'a': /* Do nothing. */
13427 case 's': /* Do nothing. */
13428 case 't': /* Do nothing. */
13429 case 'x': /* Do nothing. */
13430 case 'y': /* Do nothing. */
13431 case 'z': /* Do nothing. */
13432 break;
13433
13434 default:
13435 abort ();
13436 }
13437 continue;
13438
13439 case 'A':
13440 {
13441 bfd_reloc_code_real_type r[3];
13442 expressionS ep;
13443 int imm;
13444
13445 /* Check whether there is only a single bracketed
13446 expression left. If so, it must be the base register
13447 and the constant must be zero. */
13448 if (*s == '(' && strchr (s + 1, '(') == 0)
13449 {
13450 INSERT_OPERAND (1, IMMA, *ip, 0);
13451 continue;
13452 }
13453
13454 if (my_getSmallExpression (&ep, r, s) > 0
13455 || !expr_const_in_range (&ep, -64, 64, 2))
13456 break;
13457
13458 imm = ep.X_add_number >> 2;
13459 INSERT_OPERAND (1, IMMA, *ip, imm);
13460 }
13461 s = expr_end;
13462 continue;
13463
13464 case 'B':
13465 {
13466 bfd_reloc_code_real_type r[3];
13467 expressionS ep;
13468 int imm;
13469
13470 if (my_getSmallExpression (&ep, r, s) > 0
13471 || ep.X_op != O_constant)
13472 break;
13473
13474 for (imm = 0; imm < 8; imm++)
13475 if (micromips_imm_b_map[imm] == ep.X_add_number)
13476 break;
13477 if (imm >= 8)
13478 break;
13479
13480 INSERT_OPERAND (1, IMMB, *ip, imm);
13481 }
13482 s = expr_end;
13483 continue;
13484
13485 case 'C':
13486 {
13487 bfd_reloc_code_real_type r[3];
13488 expressionS ep;
13489 int imm;
13490
13491 if (my_getSmallExpression (&ep, r, s) > 0
13492 || ep.X_op != O_constant)
13493 break;
13494
13495 for (imm = 0; imm < 16; imm++)
13496 if (micromips_imm_c_map[imm] == ep.X_add_number)
13497 break;
13498 if (imm >= 16)
13499 break;
13500
13501 INSERT_OPERAND (1, IMMC, *ip, imm);
13502 }
13503 s = expr_end;
13504 continue;
13505
13506 case 'D': /* pc relative offset */
13507 case 'E': /* pc relative offset */
13508 my_getExpression (&offset_expr, s);
13509 if (offset_expr.X_op == O_register)
13510 break;
13511
13512 if (!forced_insn_length)
13513 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13514 else if (c == 'D')
13515 *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
13516 else
13517 *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
13518 s = expr_end;
13519 continue;
13520
13521 case 'F':
13522 {
13523 bfd_reloc_code_real_type r[3];
13524 expressionS ep;
13525 int imm;
13526
13527 if (my_getSmallExpression (&ep, r, s) > 0
13528 || !expr_const_in_range (&ep, 0, 16, 0))
13529 break;
13530
13531 imm = ep.X_add_number;
13532 INSERT_OPERAND (1, IMMF, *ip, imm);
13533 }
13534 s = expr_end;
13535 continue;
13536
13537 case 'G':
13538 {
13539 bfd_reloc_code_real_type r[3];
13540 expressionS ep;
13541 int imm;
13542
13543 /* Check whether there is only a single bracketed
13544 expression left. If so, it must be the base register
13545 and the constant must be zero. */
13546 if (*s == '(' && strchr (s + 1, '(') == 0)
13547 {
13548 INSERT_OPERAND (1, IMMG, *ip, 0);
13549 continue;
13550 }
13551
13552 if (my_getSmallExpression (&ep, r, s) > 0
13553 || !expr_const_in_range (&ep, -1, 15, 0))
13554 break;
13555
13556 imm = ep.X_add_number & 15;
13557 INSERT_OPERAND (1, IMMG, *ip, imm);
13558 }
13559 s = expr_end;
13560 continue;
13561
13562 case 'H':
13563 {
13564 bfd_reloc_code_real_type r[3];
13565 expressionS ep;
13566 int imm;
13567
13568 /* Check whether there is only a single bracketed
13569 expression left. If so, it must be the base register
13570 and the constant must be zero. */
13571 if (*s == '(' && strchr (s + 1, '(') == 0)
13572 {
13573 INSERT_OPERAND (1, IMMH, *ip, 0);
13574 continue;
13575 }
13576
13577 if (my_getSmallExpression (&ep, r, s) > 0
13578 || !expr_const_in_range (&ep, 0, 16, 1))
13579 break;
13580
13581 imm = ep.X_add_number >> 1;
13582 INSERT_OPERAND (1, IMMH, *ip, imm);
13583 }
13584 s = expr_end;
13585 continue;
13586
13587 case 'I':
13588 {
13589 bfd_reloc_code_real_type r[3];
13590 expressionS ep;
13591 int imm;
13592
13593 if (my_getSmallExpression (&ep, r, s) > 0
13594 || !expr_const_in_range (&ep, -1, 127, 0))
13595 break;
13596
13597 imm = ep.X_add_number & 127;
13598 INSERT_OPERAND (1, IMMI, *ip, imm);
13599 }
13600 s = expr_end;
13601 continue;
13602
13603 case 'J':
13604 {
13605 bfd_reloc_code_real_type r[3];
13606 expressionS ep;
13607 int imm;
13608
13609 /* Check whether there is only a single bracketed
13610 expression left. If so, it must be the base register
13611 and the constant must be zero. */
13612 if (*s == '(' && strchr (s + 1, '(') == 0)
13613 {
13614 INSERT_OPERAND (1, IMMJ, *ip, 0);
13615 continue;
13616 }
13617
13618 if (my_getSmallExpression (&ep, r, s) > 0
13619 || !expr_const_in_range (&ep, 0, 16, 2))
13620 break;
13621
13622 imm = ep.X_add_number >> 2;
13623 INSERT_OPERAND (1, IMMJ, *ip, imm);
13624 }
13625 s = expr_end;
13626 continue;
13627
13628 case 'L':
13629 {
13630 bfd_reloc_code_real_type r[3];
13631 expressionS ep;
13632 int imm;
13633
13634 /* Check whether there is only a single bracketed
13635 expression left. If so, it must be the base register
13636 and the constant must be zero. */
13637 if (*s == '(' && strchr (s + 1, '(') == 0)
13638 {
13639 INSERT_OPERAND (1, IMML, *ip, 0);
13640 continue;
13641 }
13642
13643 if (my_getSmallExpression (&ep, r, s) > 0
13644 || !expr_const_in_range (&ep, 0, 16, 0))
13645 break;
13646
13647 imm = ep.X_add_number;
13648 INSERT_OPERAND (1, IMML, *ip, imm);
13649 }
13650 s = expr_end;
13651 continue;
13652
13653 case 'M':
13654 {
13655 bfd_reloc_code_real_type r[3];
13656 expressionS ep;
13657 int imm;
13658
13659 if (my_getSmallExpression (&ep, r, s) > 0
13660 || !expr_const_in_range (&ep, 1, 9, 0))
13661 break;
13662
13663 imm = ep.X_add_number & 7;
13664 INSERT_OPERAND (1, IMMM, *ip, imm);
13665 }
13666 s = expr_end;
13667 continue;
13668
13669 case 'N': /* Register list for lwm and swm. */
13670 {
13671 /* A comma-separated list of registers and/or
13672 dash-separated contiguous ranges including
13673 both ra and a set of one or more registers
13674 starting at s0 up to s3 which have to be
13675 consecutive, e.g.:
13676
13677 s0, ra
13678 s0, s1, ra, s2, s3
13679 s0-s2, ra
13680
13681 and any permutations of these. */
13682 unsigned int reglist;
13683 int imm;
13684
13685 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13686 break;
13687
13688 if ((reglist & 0xfff1ffff) != 0x80010000)
13689 break;
13690
13691 reglist = (reglist >> 17) & 7;
13692 reglist += 1;
13693 if ((reglist & -reglist) != reglist)
13694 break;
13695
13696 imm = ffs (reglist) - 1;
13697 INSERT_OPERAND (1, IMMN, *ip, imm);
13698 }
13699 continue;
13700
13701 case 'O': /* sdbbp 4-bit code. */
13702 {
13703 bfd_reloc_code_real_type r[3];
13704 expressionS ep;
13705 int imm;
13706
13707 if (my_getSmallExpression (&ep, r, s) > 0
13708 || !expr_const_in_range (&ep, 0, 16, 0))
13709 break;
13710
13711 imm = ep.X_add_number;
13712 INSERT_OPERAND (1, IMMO, *ip, imm);
13713 }
13714 s = expr_end;
13715 continue;
13716
13717 case 'P':
13718 {
13719 bfd_reloc_code_real_type r[3];
13720 expressionS ep;
13721 int imm;
13722
13723 if (my_getSmallExpression (&ep, r, s) > 0
13724 || !expr_const_in_range (&ep, 0, 32, 2))
13725 break;
13726
13727 imm = ep.X_add_number >> 2;
13728 INSERT_OPERAND (1, IMMP, *ip, imm);
13729 }
13730 s = expr_end;
13731 continue;
13732
13733 case 'Q':
13734 {
13735 bfd_reloc_code_real_type r[3];
13736 expressionS ep;
13737 int imm;
13738
13739 if (my_getSmallExpression (&ep, r, s) > 0
13740 || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
13741 break;
13742
13743 imm = ep.X_add_number >> 2;
13744 INSERT_OPERAND (1, IMMQ, *ip, imm);
13745 }
13746 s = expr_end;
13747 continue;
13748
13749 case 'U':
13750 {
13751 bfd_reloc_code_real_type r[3];
13752 expressionS ep;
13753 int imm;
13754
13755 /* Check whether there is only a single bracketed
13756 expression left. If so, it must be the base register
13757 and the constant must be zero. */
13758 if (*s == '(' && strchr (s + 1, '(') == 0)
13759 {
13760 INSERT_OPERAND (1, IMMU, *ip, 0);
13761 continue;
13762 }
13763
13764 if (my_getSmallExpression (&ep, r, s) > 0
13765 || !expr_const_in_range (&ep, 0, 32, 2))
13766 break;
13767
13768 imm = ep.X_add_number >> 2;
13769 INSERT_OPERAND (1, IMMU, *ip, imm);
13770 }
13771 s = expr_end;
13772 continue;
13773
13774 case 'W':
13775 {
13776 bfd_reloc_code_real_type r[3];
13777 expressionS ep;
13778 int imm;
13779
13780 if (my_getSmallExpression (&ep, r, s) > 0
13781 || !expr_const_in_range (&ep, 0, 64, 2))
13782 break;
13783
13784 imm = ep.X_add_number >> 2;
13785 INSERT_OPERAND (1, IMMW, *ip, imm);
13786 }
13787 s = expr_end;
13788 continue;
13789
13790 case 'X':
13791 {
13792 bfd_reloc_code_real_type r[3];
13793 expressionS ep;
13794 int imm;
13795
13796 if (my_getSmallExpression (&ep, r, s) > 0
13797 || !expr_const_in_range (&ep, -8, 8, 0))
13798 break;
13799
13800 imm = ep.X_add_number;
13801 INSERT_OPERAND (1, IMMX, *ip, imm);
13802 }
13803 s = expr_end;
13804 continue;
13805
13806 case 'Y':
13807 {
13808 bfd_reloc_code_real_type r[3];
13809 expressionS ep;
13810 int imm;
13811
13812 if (my_getSmallExpression (&ep, r, s) > 0
13813 || expr_const_in_range (&ep, -2, 2, 2)
13814 || !expr_const_in_range (&ep, -258, 258, 2))
13815 break;
13816
13817 imm = ep.X_add_number >> 2;
13818 imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13819 INSERT_OPERAND (1, IMMY, *ip, imm);
13820 }
13821 s = expr_end;
13822 continue;
13823
13824 case 'Z':
13825 {
13826 bfd_reloc_code_real_type r[3];
13827 expressionS ep;
13828
13829 if (my_getSmallExpression (&ep, r, s) > 0
13830 || !expr_const_in_range (&ep, 0, 1, 0))
13831 break;
13832 }
13833 s = expr_end;
13834 continue;
13835
13836 default:
13837 as_bad (_("Internal error: bad microMIPS opcode "
13838 "(unknown extension operand type `m%c'): %s %s"),
13839 *args, insn->name, insn->args);
13840 /* Further processing is fruitless. */
13841 return;
13842 }
13843 break;
13844
13845 case 'n': /* Register list for 32-bit lwm and swm. */
13846 gas_assert (mips_opts.micromips);
13847 {
13848 /* A comma-separated list of registers and/or
13849 dash-separated contiguous ranges including
13850 at least one of ra and a set of one or more
13851 registers starting at s0 up to s7 and then
13852 s8 which have to be consecutive, e.g.:
13853
13854 ra
13855 s0
13856 ra, s0, s1, s2
13857 s0-s8
13858 s0-s5, ra
13859
13860 and any permutations of these. */
13861 unsigned int reglist;
13862 int imm;
13863 int ra;
13864
13865 if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13866 break;
13867
13868 if ((reglist & 0x3f00ffff) != 0)
13869 break;
13870
13871 ra = (reglist >> 27) & 0x10;
13872 reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13873 reglist += 1;
13874 if ((reglist & -reglist) != reglist)
13875 break;
13876
13877 imm = (ffs (reglist) - 1) | ra;
13878 INSERT_OPERAND (1, RT, *ip, imm);
13879 imm_expr.X_op = O_absent;
13880 }
13881 continue;
13882
13883 case '|': /* 4-bit trap code. */
13884 gas_assert (mips_opts.micromips);
13885 my_getExpression (&imm_expr, s);
13886 check_absolute_expr (ip, &imm_expr);
13887 if ((unsigned long) imm_expr.X_add_number
13888 > MICROMIPSOP_MASK_TRAP)
13889 as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13890 (unsigned long) imm_expr.X_add_number,
13891 ip->insn_mo->name);
13892 INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13893 imm_expr.X_op = O_absent;
13894 s = expr_end;
13895 continue;
13896
13897 default:
13898 as_bad (_("Bad char = '%c'\n"), *args);
13899 abort ();
13900 }
13901 break;
13902 }
13903 /* Args don't match. */
13904 s = argsStart;
13905 insn_error = _("Illegal operands");
13906 if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13907 {
13908 ++insn;
13909 continue;
13910 }
13911 else if (wrong_delay_slot_insns && need_delay_slot_ok)
13912 {
13913 gas_assert (firstinsn);
13914 need_delay_slot_ok = FALSE;
13915 past = insn + 1;
13916 insn = firstinsn;
13917 continue;
13918 }
13919 return;
13920 }
13921 }
13922
13923 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13924
13925 /* This routine assembles an instruction into its binary format when
13926 assembling for the mips16. As a side effect, it sets one of the
13927 global variables imm_reloc or offset_reloc to the type of relocation
13928 to do if one of the operands is an address expression. It also sets
13929 forced_insn_length to the resulting instruction size in bytes if the
13930 user explicitly requested a small or extended instruction. */
13931
13932 static void
13933 mips16_ip (char *str, struct mips_cl_insn *ip)
13934 {
13935 char *s;
13936 const char *args;
13937 struct mips_opcode *insn;
13938 char *argsstart;
13939 unsigned int regno;
13940 unsigned int lastregno = 0;
13941 char *s_reset;
13942 size_t i;
13943
13944 insn_error = NULL;
13945
13946 forced_insn_length = 0;
13947
13948 for (s = str; ISLOWER (*s); ++s)
13949 ;
13950 switch (*s)
13951 {
13952 case '\0':
13953 break;
13954
13955 case ' ':
13956 *s++ = '\0';
13957 break;
13958
13959 case '.':
13960 if (s[1] == 't' && s[2] == ' ')
13961 {
13962 *s = '\0';
13963 forced_insn_length = 2;
13964 s += 3;
13965 break;
13966 }
13967 else if (s[1] == 'e' && s[2] == ' ')
13968 {
13969 *s = '\0';
13970 forced_insn_length = 4;
13971 s += 3;
13972 break;
13973 }
13974 /* Fall through. */
13975 default:
13976 insn_error = _("unknown opcode");
13977 return;
13978 }
13979
13980 if (mips_opts.noautoextend && !forced_insn_length)
13981 forced_insn_length = 2;
13982
13983 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13984 {
13985 insn_error = _("unrecognized opcode");
13986 return;
13987 }
13988
13989 argsstart = s;
13990 for (;;)
13991 {
13992 bfd_boolean ok;
13993
13994 gas_assert (strcmp (insn->name, str) == 0);
13995
13996 ok = is_opcode_valid_16 (insn);
13997 if (! ok)
13998 {
13999 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
14000 && strcmp (insn->name, insn[1].name) == 0)
14001 {
14002 ++insn;
14003 continue;
14004 }
14005 else
14006 {
14007 if (!insn_error)
14008 {
14009 static char buf[100];
14010 sprintf (buf,
14011 _("Opcode not supported on this processor: %s (%s)"),
14012 mips_cpu_info_from_arch (mips_opts.arch)->name,
14013 mips_cpu_info_from_isa (mips_opts.isa)->name);
14014 insn_error = buf;
14015 }
14016 return;
14017 }
14018 }
14019
14020 create_insn (ip, insn);
14021 imm_expr.X_op = O_absent;
14022 imm_reloc[0] = BFD_RELOC_UNUSED;
14023 imm_reloc[1] = BFD_RELOC_UNUSED;
14024 imm_reloc[2] = BFD_RELOC_UNUSED;
14025 imm2_expr.X_op = O_absent;
14026 offset_expr.X_op = O_absent;
14027 offset_reloc[0] = BFD_RELOC_UNUSED;
14028 offset_reloc[1] = BFD_RELOC_UNUSED;
14029 offset_reloc[2] = BFD_RELOC_UNUSED;
14030 for (args = insn->args; 1; ++args)
14031 {
14032 int c;
14033
14034 if (*s == ' ')
14035 ++s;
14036
14037 /* In this switch statement we call break if we did not find
14038 a match, continue if we did find a match, or return if we
14039 are done. */
14040
14041 c = *args;
14042 switch (c)
14043 {
14044 case '\0':
14045 if (*s == '\0')
14046 {
14047 offsetT value;
14048
14049 /* Stuff the immediate value in now, if we can. */
14050 if (imm_expr.X_op == O_constant
14051 && *imm_reloc > BFD_RELOC_UNUSED
14052 && insn->pinfo != INSN_MACRO
14053 && calculate_reloc (*offset_reloc,
14054 imm_expr.X_add_number, &value))
14055 {
14056 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
14057 *offset_reloc, value, forced_insn_length,
14058 &ip->insn_opcode);
14059 imm_expr.X_op = O_absent;
14060 *imm_reloc = BFD_RELOC_UNUSED;
14061 *offset_reloc = BFD_RELOC_UNUSED;
14062 }
14063
14064 return;
14065 }
14066 break;
14067
14068 case ',':
14069 if (*s++ == c)
14070 continue;
14071 s--;
14072 switch (*++args)
14073 {
14074 case 'v':
14075 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14076 continue;
14077 case 'w':
14078 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14079 continue;
14080 }
14081 break;
14082
14083 case '(':
14084 case ')':
14085 if (*s++ == c)
14086 continue;
14087 break;
14088
14089 case 'v':
14090 case 'w':
14091 if (s[0] != '$')
14092 {
14093 if (c == 'v')
14094 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14095 else
14096 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14097 ++args;
14098 continue;
14099 }
14100 /* Fall through. */
14101 case 'x':
14102 case 'y':
14103 case 'z':
14104 case 'Z':
14105 case '0':
14106 case 'S':
14107 case 'R':
14108 case 'X':
14109 case 'Y':
14110 s_reset = s;
14111 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
14112 {
14113 if (c == 'v' || c == 'w')
14114 {
14115 if (c == 'v')
14116 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
14117 else
14118 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
14119 ++args;
14120 continue;
14121 }
14122 break;
14123 }
14124
14125 if (*s == ' ')
14126 ++s;
14127 if (args[1] != *s)
14128 {
14129 if (c == 'v' || c == 'w')
14130 {
14131 regno = mips16_to_32_reg_map[lastregno];
14132 s = s_reset;
14133 ++args;
14134 }
14135 }
14136
14137 switch (c)
14138 {
14139 case 'x':
14140 case 'y':
14141 case 'z':
14142 case 'v':
14143 case 'w':
14144 case 'Z':
14145 regno = mips32_to_16_reg_map[regno];
14146 break;
14147
14148 case '0':
14149 if (regno != 0)
14150 regno = ILLEGAL_REG;
14151 break;
14152
14153 case 'S':
14154 if (regno != SP)
14155 regno = ILLEGAL_REG;
14156 break;
14157
14158 case 'R':
14159 if (regno != RA)
14160 regno = ILLEGAL_REG;
14161 break;
14162
14163 case 'X':
14164 case 'Y':
14165 if (regno == AT && mips_opts.at)
14166 {
14167 if (mips_opts.at == ATREG)
14168 as_warn (_("used $at without \".set noat\""));
14169 else
14170 as_warn (_("used $%u with \".set at=$%u\""),
14171 regno, mips_opts.at);
14172 }
14173 break;
14174
14175 default:
14176 abort ();
14177 }
14178
14179 if (regno == ILLEGAL_REG)
14180 break;
14181
14182 switch (c)
14183 {
14184 case 'x':
14185 case 'v':
14186 MIPS16_INSERT_OPERAND (RX, *ip, regno);
14187 break;
14188 case 'y':
14189 case 'w':
14190 MIPS16_INSERT_OPERAND (RY, *ip, regno);
14191 break;
14192 case 'z':
14193 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
14194 break;
14195 case 'Z':
14196 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
14197 case '0':
14198 case 'S':
14199 case 'R':
14200 break;
14201 case 'X':
14202 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
14203 break;
14204 case 'Y':
14205 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
14206 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
14207 break;
14208 default:
14209 abort ();
14210 }
14211
14212 lastregno = regno;
14213 continue;
14214
14215 case 'P':
14216 if (strncmp (s, "$pc", 3) == 0)
14217 {
14218 s += 3;
14219 continue;
14220 }
14221 break;
14222
14223 case '5':
14224 case 'H':
14225 case 'W':
14226 case 'D':
14227 case 'j':
14228 case 'V':
14229 case 'C':
14230 case 'U':
14231 case 'k':
14232 case 'K':
14233 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
14234 if (i > 0)
14235 {
14236 if (imm_expr.X_op != O_constant)
14237 {
14238 forced_insn_length = 4;
14239 ip->insn_opcode |= MIPS16_EXTEND;
14240 }
14241 else
14242 {
14243 /* We need to relax this instruction. */
14244 *offset_reloc = *imm_reloc;
14245 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14246 }
14247 s = expr_end;
14248 continue;
14249 }
14250 *imm_reloc = BFD_RELOC_UNUSED;
14251 /* Fall through. */
14252 case '<':
14253 case '>':
14254 case '[':
14255 case ']':
14256 case '4':
14257 case '8':
14258 my_getExpression (&imm_expr, s);
14259 if (imm_expr.X_op == O_register)
14260 {
14261 /* What we thought was an expression turned out to
14262 be a register. */
14263
14264 if (s[0] == '(' && args[1] == '(')
14265 {
14266 /* It looks like the expression was omitted
14267 before a register indirection, which means
14268 that the expression is implicitly zero. We
14269 still set up imm_expr, so that we handle
14270 explicit extensions correctly. */
14271 imm_expr.X_op = O_constant;
14272 imm_expr.X_add_number = 0;
14273 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14274 continue;
14275 }
14276
14277 break;
14278 }
14279
14280 /* We need to relax this instruction. */
14281 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
14282 s = expr_end;
14283 continue;
14284
14285 case 'p':
14286 case 'q':
14287 case 'A':
14288 case 'B':
14289 case 'E':
14290 /* We use offset_reloc rather than imm_reloc for the PC
14291 relative operands. This lets macros with both
14292 immediate and address operands work correctly. */
14293 my_getExpression (&offset_expr, s);
14294
14295 if (offset_expr.X_op == O_register)
14296 break;
14297
14298 /* We need to relax this instruction. */
14299 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
14300 s = expr_end;
14301 continue;
14302
14303 case '6': /* break code */
14304 my_getExpression (&imm_expr, s);
14305 check_absolute_expr (ip, &imm_expr);
14306 if ((unsigned long) imm_expr.X_add_number > 63)
14307 as_warn (_("Invalid value for `%s' (%lu)"),
14308 ip->insn_mo->name,
14309 (unsigned long) imm_expr.X_add_number);
14310 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
14311 imm_expr.X_op = O_absent;
14312 s = expr_end;
14313 continue;
14314
14315 case 'a': /* 26 bit address */
14316 my_getExpression (&offset_expr, s);
14317 s = expr_end;
14318 *offset_reloc = BFD_RELOC_MIPS16_JMP;
14319 ip->insn_opcode <<= 16;
14320 continue;
14321
14322 case 'l': /* register list for entry macro */
14323 case 'L': /* register list for exit macro */
14324 {
14325 int mask;
14326
14327 if (c == 'l')
14328 mask = 0;
14329 else
14330 mask = 7 << 3;
14331 while (*s != '\0')
14332 {
14333 unsigned int freg, reg1, reg2;
14334
14335 while (*s == ' ' || *s == ',')
14336 ++s;
14337 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14338 freg = 0;
14339 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
14340 freg = 1;
14341 else
14342 {
14343 as_bad (_("can't parse register list"));
14344 break;
14345 }
14346 if (*s == ' ')
14347 ++s;
14348 if (*s != '-')
14349 reg2 = reg1;
14350 else
14351 {
14352 ++s;
14353 if (!reg_lookup (&s, freg ? RTYPE_FPU
14354 : (RTYPE_GP | RTYPE_NUM), &reg2))
14355 {
14356 as_bad (_("invalid register list"));
14357 break;
14358 }
14359 }
14360 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
14361 {
14362 mask &= ~ (7 << 3);
14363 mask |= 5 << 3;
14364 }
14365 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
14366 {
14367 mask &= ~ (7 << 3);
14368 mask |= 6 << 3;
14369 }
14370 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
14371 mask |= (reg2 - 3) << 3;
14372 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
14373 mask |= (reg2 - 15) << 1;
14374 else if (reg1 == RA && reg2 == RA)
14375 mask |= 1;
14376 else
14377 {
14378 as_bad (_("invalid register list"));
14379 break;
14380 }
14381 }
14382 /* The mask is filled in in the opcode table for the
14383 benefit of the disassembler. We remove it before
14384 applying the actual mask. */
14385 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
14386 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
14387 }
14388 continue;
14389
14390 case 'm': /* Register list for save insn. */
14391 case 'M': /* Register list for restore insn. */
14392 {
14393 int opcode = ip->insn_opcode;
14394 int framesz = 0, seen_framesz = 0;
14395 int nargs = 0, statics = 0, sregs = 0;
14396
14397 while (*s != '\0')
14398 {
14399 unsigned int reg1, reg2;
14400
14401 SKIP_SPACE_TABS (s);
14402 while (*s == ',')
14403 ++s;
14404 SKIP_SPACE_TABS (s);
14405
14406 my_getExpression (&imm_expr, s);
14407 if (imm_expr.X_op == O_constant)
14408 {
14409 /* Handle the frame size. */
14410 if (seen_framesz)
14411 {
14412 as_bad (_("more than one frame size in list"));
14413 break;
14414 }
14415 seen_framesz = 1;
14416 framesz = imm_expr.X_add_number;
14417 imm_expr.X_op = O_absent;
14418 s = expr_end;
14419 continue;
14420 }
14421
14422 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
14423 {
14424 as_bad (_("can't parse register list"));
14425 break;
14426 }
14427
14428 while (*s == ' ')
14429 ++s;
14430
14431 if (*s != '-')
14432 reg2 = reg1;
14433 else
14434 {
14435 ++s;
14436 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
14437 || reg2 < reg1)
14438 {
14439 as_bad (_("can't parse register list"));
14440 break;
14441 }
14442 }
14443
14444 while (reg1 <= reg2)
14445 {
14446 if (reg1 >= 4 && reg1 <= 7)
14447 {
14448 if (!seen_framesz)
14449 /* args $a0-$a3 */
14450 nargs |= 1 << (reg1 - 4);
14451 else
14452 /* statics $a0-$a3 */
14453 statics |= 1 << (reg1 - 4);
14454 }
14455 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
14456 {
14457 /* $s0-$s8 */
14458 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
14459 }
14460 else if (reg1 == 31)
14461 {
14462 /* Add $ra to insn. */
14463 opcode |= 0x40;
14464 }
14465 else
14466 {
14467 as_bad (_("unexpected register in list"));
14468 break;
14469 }
14470 if (++reg1 == 24)
14471 reg1 = 30;
14472 }
14473 }
14474
14475 /* Encode args/statics combination. */
14476 if (nargs & statics)
14477 as_bad (_("arg/static registers overlap"));
14478 else if (nargs == 0xf)
14479 /* All $a0-$a3 are args. */
14480 opcode |= MIPS16_ALL_ARGS << 16;
14481 else if (statics == 0xf)
14482 /* All $a0-$a3 are statics. */
14483 opcode |= MIPS16_ALL_STATICS << 16;
14484 else
14485 {
14486 int narg = 0, nstat = 0;
14487
14488 /* Count arg registers. */
14489 while (nargs & 0x1)
14490 {
14491 nargs >>= 1;
14492 narg++;
14493 }
14494 if (nargs != 0)
14495 as_bad (_("invalid arg register list"));
14496
14497 /* Count static registers. */
14498 while (statics & 0x8)
14499 {
14500 statics = (statics << 1) & 0xf;
14501 nstat++;
14502 }
14503 if (statics != 0)
14504 as_bad (_("invalid static register list"));
14505
14506 /* Encode args/statics. */
14507 opcode |= ((narg << 2) | nstat) << 16;
14508 }
14509
14510 /* Encode $s0/$s1. */
14511 if (sregs & (1 << 0)) /* $s0 */
14512 opcode |= 0x20;
14513 if (sregs & (1 << 1)) /* $s1 */
14514 opcode |= 0x10;
14515 sregs >>= 2;
14516
14517 if (sregs != 0)
14518 {
14519 /* Count regs $s2-$s8. */
14520 int nsreg = 0;
14521 while (sregs & 1)
14522 {
14523 sregs >>= 1;
14524 nsreg++;
14525 }
14526 if (sregs != 0)
14527 as_bad (_("invalid static register list"));
14528 /* Encode $s2-$s8. */
14529 opcode |= nsreg << 24;
14530 }
14531
14532 /* Encode frame size. */
14533 if (!seen_framesz)
14534 as_bad (_("missing frame size"));
14535 else if ((framesz & 7) != 0 || framesz < 0
14536 || framesz > 0xff * 8)
14537 as_bad (_("invalid frame size"));
14538 else if (framesz != 128 || (opcode >> 16) != 0)
14539 {
14540 framesz /= 8;
14541 opcode |= (((framesz & 0xf0) << 16)
14542 | (framesz & 0x0f));
14543 }
14544
14545 /* Finally build the instruction. */
14546 if ((opcode >> 16) != 0 || framesz == 0)
14547 opcode |= MIPS16_EXTEND;
14548 ip->insn_opcode = opcode;
14549 }
14550 continue;
14551
14552 case 'e': /* extend code */
14553 my_getExpression (&imm_expr, s);
14554 check_absolute_expr (ip, &imm_expr);
14555 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
14556 {
14557 as_warn (_("Invalid value for `%s' (%lu)"),
14558 ip->insn_mo->name,
14559 (unsigned long) imm_expr.X_add_number);
14560 imm_expr.X_add_number &= 0x7ff;
14561 }
14562 ip->insn_opcode |= imm_expr.X_add_number;
14563 imm_expr.X_op = O_absent;
14564 s = expr_end;
14565 continue;
14566
14567 default:
14568 abort ();
14569 }
14570 break;
14571 }
14572
14573 /* Args don't match. */
14574 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
14575 strcmp (insn->name, insn[1].name) == 0)
14576 {
14577 ++insn;
14578 s = argsstart;
14579 continue;
14580 }
14581
14582 insn_error = _("illegal operands");
14583
14584 return;
14585 }
14586 }
14587
14588 /* This structure holds information we know about a mips16 immediate
14589 argument type. */
14590
14591 struct mips16_immed_operand
14592 {
14593 /* The type code used in the argument string in the opcode table. */
14594 int type;
14595 /* The number of bits in the short form of the opcode. */
14596 int nbits;
14597 /* The number of bits in the extended form of the opcode. */
14598 int extbits;
14599 /* The amount by which the short form is shifted when it is used;
14600 for example, the sw instruction has a shift count of 2. */
14601 int shift;
14602 /* The amount by which the short form is shifted when it is stored
14603 into the instruction code. */
14604 int op_shift;
14605 /* Non-zero if the short form is unsigned. */
14606 int unsp;
14607 /* Non-zero if the extended form is unsigned. */
14608 int extu;
14609 /* Non-zero if the value is PC relative. */
14610 int pcrel;
14611 };
14612
14613 /* The mips16 immediate operand types. */
14614
14615 static const struct mips16_immed_operand mips16_immed_operands[] =
14616 {
14617 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14618 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14619 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
14620 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
14621 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
14622 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
14623 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
14624 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
14625 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
14626 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
14627 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
14628 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
14629 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
14630 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
14631 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
14632 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
14633 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14634 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
14635 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
14636 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
14637 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
14638 };
14639
14640 #define MIPS16_NUM_IMMED \
14641 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
14642
14643 /* Marshal immediate value VAL for an extended MIPS16 instruction.
14644 NBITS is the number of significant bits in VAL. */
14645
14646 static unsigned long
14647 mips16_immed_extend (offsetT val, unsigned int nbits)
14648 {
14649 int extval;
14650 if (nbits == 16)
14651 {
14652 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
14653 val &= 0x1f;
14654 }
14655 else if (nbits == 15)
14656 {
14657 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
14658 val &= 0xf;
14659 }
14660 else
14661 {
14662 extval = ((val & 0x1f) << 6) | (val & 0x20);
14663 val = 0;
14664 }
14665 return (extval << 16) | val;
14666 }
14667
14668 /* Install immediate value VAL into MIPS16 instruction *INSN,
14669 extending it if necessary. The instruction in *INSN may
14670 already be extended.
14671
14672 RELOC is the relocation that produced VAL, or BFD_RELOC_UNUSED
14673 if none. In the former case, VAL is a 16-bit number with no
14674 defined signedness.
14675
14676 TYPE is the type of the immediate field. USER_INSN_LENGTH
14677 is the length that the user requested, or 0 if none. */
14678
14679 static void
14680 mips16_immed (char *file, unsigned int line, int type,
14681 bfd_reloc_code_real_type reloc, offsetT val,
14682 unsigned int user_insn_length, unsigned long *insn)
14683 {
14684 const struct mips16_immed_operand *op;
14685 int mintiny, maxtiny;
14686
14687 op = mips16_immed_operands;
14688 while (op->type != type)
14689 {
14690 ++op;
14691 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14692 }
14693
14694 if (op->unsp)
14695 {
14696 if (type == '<' || type == '>' || type == '[' || type == ']')
14697 {
14698 mintiny = 1;
14699 maxtiny = 1 << op->nbits;
14700 }
14701 else
14702 {
14703 mintiny = 0;
14704 maxtiny = (1 << op->nbits) - 1;
14705 }
14706 if (reloc != BFD_RELOC_UNUSED)
14707 val &= 0xffff;
14708 }
14709 else
14710 {
14711 mintiny = - (1 << (op->nbits - 1));
14712 maxtiny = (1 << (op->nbits - 1)) - 1;
14713 if (reloc != BFD_RELOC_UNUSED)
14714 val = SEXT_16BIT (val);
14715 }
14716
14717 /* Branch offsets have an implicit 0 in the lowest bit. */
14718 if (type == 'p' || type == 'q')
14719 val /= 2;
14720
14721 if ((val & ((1 << op->shift) - 1)) != 0
14722 || val < (mintiny << op->shift)
14723 || val > (maxtiny << op->shift))
14724 {
14725 /* We need an extended instruction. */
14726 if (user_insn_length == 2)
14727 as_bad_where (file, line, _("invalid unextended operand value"));
14728 else
14729 *insn |= MIPS16_EXTEND;
14730 }
14731 else if (user_insn_length == 4)
14732 {
14733 /* The operand doesn't force an unextended instruction to be extended.
14734 Warn if the user wanted an extended instruction anyway. */
14735 *insn |= MIPS16_EXTEND;
14736 as_warn_where (file, line,
14737 _("extended operand requested but not required"));
14738 }
14739
14740 if (mips16_opcode_length (*insn) == 2)
14741 {
14742 int insnval;
14743
14744 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
14745 insnval <<= op->op_shift;
14746 *insn |= insnval;
14747 }
14748 else
14749 {
14750 long minext, maxext;
14751
14752 if (reloc == BFD_RELOC_UNUSED)
14753 {
14754 if (op->extu)
14755 {
14756 minext = 0;
14757 maxext = (1 << op->extbits) - 1;
14758 }
14759 else
14760 {
14761 minext = - (1 << (op->extbits - 1));
14762 maxext = (1 << (op->extbits - 1)) - 1;
14763 }
14764 if (val < minext || val > maxext)
14765 as_bad_where (file, line,
14766 _("operand value out of range for instruction"));
14767 }
14768
14769 *insn |= mips16_immed_extend (val, op->extbits);
14770 }
14771 }
14772 \f
14773 struct percent_op_match
14774 {
14775 const char *str;
14776 bfd_reloc_code_real_type reloc;
14777 };
14778
14779 static const struct percent_op_match mips_percent_op[] =
14780 {
14781 {"%lo", BFD_RELOC_LO16},
14782 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14783 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14784 {"%call16", BFD_RELOC_MIPS_CALL16},
14785 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14786 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14787 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14788 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14789 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14790 {"%got", BFD_RELOC_MIPS_GOT16},
14791 {"%gp_rel", BFD_RELOC_GPREL16},
14792 {"%half", BFD_RELOC_16},
14793 {"%highest", BFD_RELOC_MIPS_HIGHEST},
14794 {"%higher", BFD_RELOC_MIPS_HIGHER},
14795 {"%neg", BFD_RELOC_MIPS_SUB},
14796 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14797 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14798 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14799 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14800 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14801 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14802 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14803 {"%hi", BFD_RELOC_HI16_S}
14804 };
14805
14806 static const struct percent_op_match mips16_percent_op[] =
14807 {
14808 {"%lo", BFD_RELOC_MIPS16_LO16},
14809 {"%gprel", BFD_RELOC_MIPS16_GPREL},
14810 {"%got", BFD_RELOC_MIPS16_GOT16},
14811 {"%call16", BFD_RELOC_MIPS16_CALL16},
14812 {"%hi", BFD_RELOC_MIPS16_HI16_S},
14813 {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
14814 {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
14815 {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
14816 {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
14817 {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
14818 {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
14819 {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
14820 };
14821
14822
14823 /* Return true if *STR points to a relocation operator. When returning true,
14824 move *STR over the operator and store its relocation code in *RELOC.
14825 Leave both *STR and *RELOC alone when returning false. */
14826
14827 static bfd_boolean
14828 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14829 {
14830 const struct percent_op_match *percent_op;
14831 size_t limit, i;
14832
14833 if (mips_opts.mips16)
14834 {
14835 percent_op = mips16_percent_op;
14836 limit = ARRAY_SIZE (mips16_percent_op);
14837 }
14838 else
14839 {
14840 percent_op = mips_percent_op;
14841 limit = ARRAY_SIZE (mips_percent_op);
14842 }
14843
14844 for (i = 0; i < limit; i++)
14845 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14846 {
14847 int len = strlen (percent_op[i].str);
14848
14849 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14850 continue;
14851
14852 *str += strlen (percent_op[i].str);
14853 *reloc = percent_op[i].reloc;
14854
14855 /* Check whether the output BFD supports this relocation.
14856 If not, issue an error and fall back on something safe. */
14857 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14858 {
14859 as_bad (_("relocation %s isn't supported by the current ABI"),
14860 percent_op[i].str);
14861 *reloc = BFD_RELOC_UNUSED;
14862 }
14863 return TRUE;
14864 }
14865 return FALSE;
14866 }
14867
14868
14869 /* Parse string STR as a 16-bit relocatable operand. Store the
14870 expression in *EP and the relocations in the array starting
14871 at RELOC. Return the number of relocation operators used.
14872
14873 On exit, EXPR_END points to the first character after the expression. */
14874
14875 static size_t
14876 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14877 char *str)
14878 {
14879 bfd_reloc_code_real_type reversed_reloc[3];
14880 size_t reloc_index, i;
14881 int crux_depth, str_depth;
14882 char *crux;
14883
14884 /* Search for the start of the main expression, recoding relocations
14885 in REVERSED_RELOC. End the loop with CRUX pointing to the start
14886 of the main expression and with CRUX_DEPTH containing the number
14887 of open brackets at that point. */
14888 reloc_index = -1;
14889 str_depth = 0;
14890 do
14891 {
14892 reloc_index++;
14893 crux = str;
14894 crux_depth = str_depth;
14895
14896 /* Skip over whitespace and brackets, keeping count of the number
14897 of brackets. */
14898 while (*str == ' ' || *str == '\t' || *str == '(')
14899 if (*str++ == '(')
14900 str_depth++;
14901 }
14902 while (*str == '%'
14903 && reloc_index < (HAVE_NEWABI ? 3 : 1)
14904 && parse_relocation (&str, &reversed_reloc[reloc_index]));
14905
14906 my_getExpression (ep, crux);
14907 str = expr_end;
14908
14909 /* Match every open bracket. */
14910 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14911 if (*str++ == ')')
14912 crux_depth--;
14913
14914 if (crux_depth > 0)
14915 as_bad (_("unclosed '('"));
14916
14917 expr_end = str;
14918
14919 if (reloc_index != 0)
14920 {
14921 prev_reloc_op_frag = frag_now;
14922 for (i = 0; i < reloc_index; i++)
14923 reloc[i] = reversed_reloc[reloc_index - 1 - i];
14924 }
14925
14926 return reloc_index;
14927 }
14928
14929 static void
14930 my_getExpression (expressionS *ep, char *str)
14931 {
14932 char *save_in;
14933
14934 save_in = input_line_pointer;
14935 input_line_pointer = str;
14936 expression (ep);
14937 expr_end = input_line_pointer;
14938 input_line_pointer = save_in;
14939 }
14940
14941 char *
14942 md_atof (int type, char *litP, int *sizeP)
14943 {
14944 return ieee_md_atof (type, litP, sizeP, target_big_endian);
14945 }
14946
14947 void
14948 md_number_to_chars (char *buf, valueT val, int n)
14949 {
14950 if (target_big_endian)
14951 number_to_chars_bigendian (buf, val, n);
14952 else
14953 number_to_chars_littleendian (buf, val, n);
14954 }
14955 \f
14956 static int support_64bit_objects(void)
14957 {
14958 const char **list, **l;
14959 int yes;
14960
14961 list = bfd_target_list ();
14962 for (l = list; *l != NULL; l++)
14963 if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14964 || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14965 break;
14966 yes = (*l != NULL);
14967 free (list);
14968 return yes;
14969 }
14970
14971 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14972 NEW_VALUE. Warn if another value was already specified. Note:
14973 we have to defer parsing the -march and -mtune arguments in order
14974 to handle 'from-abi' correctly, since the ABI might be specified
14975 in a later argument. */
14976
14977 static void
14978 mips_set_option_string (const char **string_ptr, const char *new_value)
14979 {
14980 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14981 as_warn (_("A different %s was already specified, is now %s"),
14982 string_ptr == &mips_arch_string ? "-march" : "-mtune",
14983 new_value);
14984
14985 *string_ptr = new_value;
14986 }
14987
14988 int
14989 md_parse_option (int c, char *arg)
14990 {
14991 unsigned int i;
14992
14993 for (i = 0; i < ARRAY_SIZE (mips_ases); i++)
14994 if (c == mips_ases[i].option_on || c == mips_ases[i].option_off)
14995 {
14996 file_ase_explicit |= mips_set_ase (&mips_ases[i],
14997 c == mips_ases[i].option_on);
14998 return 1;
14999 }
15000
15001 switch (c)
15002 {
15003 case OPTION_CONSTRUCT_FLOATS:
15004 mips_disable_float_construction = 0;
15005 break;
15006
15007 case OPTION_NO_CONSTRUCT_FLOATS:
15008 mips_disable_float_construction = 1;
15009 break;
15010
15011 case OPTION_TRAP:
15012 mips_trap = 1;
15013 break;
15014
15015 case OPTION_BREAK:
15016 mips_trap = 0;
15017 break;
15018
15019 case OPTION_EB:
15020 target_big_endian = 1;
15021 break;
15022
15023 case OPTION_EL:
15024 target_big_endian = 0;
15025 break;
15026
15027 case 'O':
15028 if (arg == NULL)
15029 mips_optimize = 1;
15030 else if (arg[0] == '0')
15031 mips_optimize = 0;
15032 else if (arg[0] == '1')
15033 mips_optimize = 1;
15034 else
15035 mips_optimize = 2;
15036 break;
15037
15038 case 'g':
15039 if (arg == NULL)
15040 mips_debug = 2;
15041 else
15042 mips_debug = atoi (arg);
15043 break;
15044
15045 case OPTION_MIPS1:
15046 file_mips_isa = ISA_MIPS1;
15047 break;
15048
15049 case OPTION_MIPS2:
15050 file_mips_isa = ISA_MIPS2;
15051 break;
15052
15053 case OPTION_MIPS3:
15054 file_mips_isa = ISA_MIPS3;
15055 break;
15056
15057 case OPTION_MIPS4:
15058 file_mips_isa = ISA_MIPS4;
15059 break;
15060
15061 case OPTION_MIPS5:
15062 file_mips_isa = ISA_MIPS5;
15063 break;
15064
15065 case OPTION_MIPS32:
15066 file_mips_isa = ISA_MIPS32;
15067 break;
15068
15069 case OPTION_MIPS32R2:
15070 file_mips_isa = ISA_MIPS32R2;
15071 break;
15072
15073 case OPTION_MIPS64R2:
15074 file_mips_isa = ISA_MIPS64R2;
15075 break;
15076
15077 case OPTION_MIPS64:
15078 file_mips_isa = ISA_MIPS64;
15079 break;
15080
15081 case OPTION_MTUNE:
15082 mips_set_option_string (&mips_tune_string, arg);
15083 break;
15084
15085 case OPTION_MARCH:
15086 mips_set_option_string (&mips_arch_string, arg);
15087 break;
15088
15089 case OPTION_M4650:
15090 mips_set_option_string (&mips_arch_string, "4650");
15091 mips_set_option_string (&mips_tune_string, "4650");
15092 break;
15093
15094 case OPTION_NO_M4650:
15095 break;
15096
15097 case OPTION_M4010:
15098 mips_set_option_string (&mips_arch_string, "4010");
15099 mips_set_option_string (&mips_tune_string, "4010");
15100 break;
15101
15102 case OPTION_NO_M4010:
15103 break;
15104
15105 case OPTION_M4100:
15106 mips_set_option_string (&mips_arch_string, "4100");
15107 mips_set_option_string (&mips_tune_string, "4100");
15108 break;
15109
15110 case OPTION_NO_M4100:
15111 break;
15112
15113 case OPTION_M3900:
15114 mips_set_option_string (&mips_arch_string, "3900");
15115 mips_set_option_string (&mips_tune_string, "3900");
15116 break;
15117
15118 case OPTION_NO_M3900:
15119 break;
15120
15121 case OPTION_MICROMIPS:
15122 if (mips_opts.mips16 == 1)
15123 {
15124 as_bad (_("-mmicromips cannot be used with -mips16"));
15125 return 0;
15126 }
15127 mips_opts.micromips = 1;
15128 mips_no_prev_insn ();
15129 break;
15130
15131 case OPTION_NO_MICROMIPS:
15132 mips_opts.micromips = 0;
15133 mips_no_prev_insn ();
15134 break;
15135
15136 case OPTION_MIPS16:
15137 if (mips_opts.micromips == 1)
15138 {
15139 as_bad (_("-mips16 cannot be used with -micromips"));
15140 return 0;
15141 }
15142 mips_opts.mips16 = 1;
15143 mips_no_prev_insn ();
15144 break;
15145
15146 case OPTION_NO_MIPS16:
15147 mips_opts.mips16 = 0;
15148 mips_no_prev_insn ();
15149 break;
15150
15151 case OPTION_FIX_24K:
15152 mips_fix_24k = 1;
15153 break;
15154
15155 case OPTION_NO_FIX_24K:
15156 mips_fix_24k = 0;
15157 break;
15158
15159 case OPTION_FIX_LOONGSON2F_JUMP:
15160 mips_fix_loongson2f_jump = TRUE;
15161 break;
15162
15163 case OPTION_NO_FIX_LOONGSON2F_JUMP:
15164 mips_fix_loongson2f_jump = FALSE;
15165 break;
15166
15167 case OPTION_FIX_LOONGSON2F_NOP:
15168 mips_fix_loongson2f_nop = TRUE;
15169 break;
15170
15171 case OPTION_NO_FIX_LOONGSON2F_NOP:
15172 mips_fix_loongson2f_nop = FALSE;
15173 break;
15174
15175 case OPTION_FIX_VR4120:
15176 mips_fix_vr4120 = 1;
15177 break;
15178
15179 case OPTION_NO_FIX_VR4120:
15180 mips_fix_vr4120 = 0;
15181 break;
15182
15183 case OPTION_FIX_VR4130:
15184 mips_fix_vr4130 = 1;
15185 break;
15186
15187 case OPTION_NO_FIX_VR4130:
15188 mips_fix_vr4130 = 0;
15189 break;
15190
15191 case OPTION_FIX_CN63XXP1:
15192 mips_fix_cn63xxp1 = TRUE;
15193 break;
15194
15195 case OPTION_NO_FIX_CN63XXP1:
15196 mips_fix_cn63xxp1 = FALSE;
15197 break;
15198
15199 case OPTION_RELAX_BRANCH:
15200 mips_relax_branch = 1;
15201 break;
15202
15203 case OPTION_NO_RELAX_BRANCH:
15204 mips_relax_branch = 0;
15205 break;
15206
15207 case OPTION_INSN32:
15208 mips_opts.insn32 = TRUE;
15209 break;
15210
15211 case OPTION_NO_INSN32:
15212 mips_opts.insn32 = FALSE;
15213 break;
15214
15215 case OPTION_MSHARED:
15216 mips_in_shared = TRUE;
15217 break;
15218
15219 case OPTION_MNO_SHARED:
15220 mips_in_shared = FALSE;
15221 break;
15222
15223 case OPTION_MSYM32:
15224 mips_opts.sym32 = TRUE;
15225 break;
15226
15227 case OPTION_MNO_SYM32:
15228 mips_opts.sym32 = FALSE;
15229 break;
15230
15231 /* When generating ELF code, we permit -KPIC and -call_shared to
15232 select SVR4_PIC, and -non_shared to select no PIC. This is
15233 intended to be compatible with Irix 5. */
15234 case OPTION_CALL_SHARED:
15235 mips_pic = SVR4_PIC;
15236 mips_abicalls = TRUE;
15237 break;
15238
15239 case OPTION_CALL_NONPIC:
15240 mips_pic = NO_PIC;
15241 mips_abicalls = TRUE;
15242 break;
15243
15244 case OPTION_NON_SHARED:
15245 mips_pic = NO_PIC;
15246 mips_abicalls = FALSE;
15247 break;
15248
15249 /* The -xgot option tells the assembler to use 32 bit offsets
15250 when accessing the got in SVR4_PIC mode. It is for Irix
15251 compatibility. */
15252 case OPTION_XGOT:
15253 mips_big_got = 1;
15254 break;
15255
15256 case 'G':
15257 g_switch_value = atoi (arg);
15258 g_switch_seen = 1;
15259 break;
15260
15261 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
15262 and -mabi=64. */
15263 case OPTION_32:
15264 mips_abi = O32_ABI;
15265 break;
15266
15267 case OPTION_N32:
15268 mips_abi = N32_ABI;
15269 break;
15270
15271 case OPTION_64:
15272 mips_abi = N64_ABI;
15273 if (!support_64bit_objects())
15274 as_fatal (_("No compiled in support for 64 bit object file format"));
15275 break;
15276
15277 case OPTION_GP32:
15278 file_mips_gp32 = 1;
15279 break;
15280
15281 case OPTION_GP64:
15282 file_mips_gp32 = 0;
15283 break;
15284
15285 case OPTION_FP32:
15286 file_mips_fp32 = 1;
15287 break;
15288
15289 case OPTION_FP64:
15290 file_mips_fp32 = 0;
15291 break;
15292
15293 case OPTION_SINGLE_FLOAT:
15294 file_mips_single_float = 1;
15295 break;
15296
15297 case OPTION_DOUBLE_FLOAT:
15298 file_mips_single_float = 0;
15299 break;
15300
15301 case OPTION_SOFT_FLOAT:
15302 file_mips_soft_float = 1;
15303 break;
15304
15305 case OPTION_HARD_FLOAT:
15306 file_mips_soft_float = 0;
15307 break;
15308
15309 case OPTION_MABI:
15310 if (strcmp (arg, "32") == 0)
15311 mips_abi = O32_ABI;
15312 else if (strcmp (arg, "o64") == 0)
15313 mips_abi = O64_ABI;
15314 else if (strcmp (arg, "n32") == 0)
15315 mips_abi = N32_ABI;
15316 else if (strcmp (arg, "64") == 0)
15317 {
15318 mips_abi = N64_ABI;
15319 if (! support_64bit_objects())
15320 as_fatal (_("No compiled in support for 64 bit object file "
15321 "format"));
15322 }
15323 else if (strcmp (arg, "eabi") == 0)
15324 mips_abi = EABI_ABI;
15325 else
15326 {
15327 as_fatal (_("invalid abi -mabi=%s"), arg);
15328 return 0;
15329 }
15330 break;
15331
15332 case OPTION_M7000_HILO_FIX:
15333 mips_7000_hilo_fix = TRUE;
15334 break;
15335
15336 case OPTION_MNO_7000_HILO_FIX:
15337 mips_7000_hilo_fix = FALSE;
15338 break;
15339
15340 case OPTION_MDEBUG:
15341 mips_flag_mdebug = TRUE;
15342 break;
15343
15344 case OPTION_NO_MDEBUG:
15345 mips_flag_mdebug = FALSE;
15346 break;
15347
15348 case OPTION_PDR:
15349 mips_flag_pdr = TRUE;
15350 break;
15351
15352 case OPTION_NO_PDR:
15353 mips_flag_pdr = FALSE;
15354 break;
15355
15356 case OPTION_MVXWORKS_PIC:
15357 mips_pic = VXWORKS_PIC;
15358 break;
15359
15360 default:
15361 return 0;
15362 }
15363
15364 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
15365
15366 return 1;
15367 }
15368 \f
15369 /* Set up globals to generate code for the ISA or processor
15370 described by INFO. */
15371
15372 static void
15373 mips_set_architecture (const struct mips_cpu_info *info)
15374 {
15375 if (info != 0)
15376 {
15377 file_mips_arch = info->cpu;
15378 mips_opts.arch = info->cpu;
15379 mips_opts.isa = info->isa;
15380 }
15381 }
15382
15383
15384 /* Likewise for tuning. */
15385
15386 static void
15387 mips_set_tune (const struct mips_cpu_info *info)
15388 {
15389 if (info != 0)
15390 mips_tune = info->cpu;
15391 }
15392
15393
15394 void
15395 mips_after_parse_args (void)
15396 {
15397 const struct mips_cpu_info *arch_info = 0;
15398 const struct mips_cpu_info *tune_info = 0;
15399
15400 /* GP relative stuff not working for PE */
15401 if (strncmp (TARGET_OS, "pe", 2) == 0)
15402 {
15403 if (g_switch_seen && g_switch_value != 0)
15404 as_bad (_("-G not supported in this configuration."));
15405 g_switch_value = 0;
15406 }
15407
15408 if (mips_abi == NO_ABI)
15409 mips_abi = MIPS_DEFAULT_ABI;
15410
15411 /* The following code determines the architecture and register size.
15412 Similar code was added to GCC 3.3 (see override_options() in
15413 config/mips/mips.c). The GAS and GCC code should be kept in sync
15414 as much as possible. */
15415
15416 if (mips_arch_string != 0)
15417 arch_info = mips_parse_cpu ("-march", mips_arch_string);
15418
15419 if (file_mips_isa != ISA_UNKNOWN)
15420 {
15421 /* Handle -mipsN. At this point, file_mips_isa contains the
15422 ISA level specified by -mipsN, while arch_info->isa contains
15423 the -march selection (if any). */
15424 if (arch_info != 0)
15425 {
15426 /* -march takes precedence over -mipsN, since it is more descriptive.
15427 There's no harm in specifying both as long as the ISA levels
15428 are the same. */
15429 if (file_mips_isa != arch_info->isa)
15430 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
15431 mips_cpu_info_from_isa (file_mips_isa)->name,
15432 mips_cpu_info_from_isa (arch_info->isa)->name);
15433 }
15434 else
15435 arch_info = mips_cpu_info_from_isa (file_mips_isa);
15436 }
15437
15438 if (arch_info == 0)
15439 {
15440 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
15441 gas_assert (arch_info);
15442 }
15443
15444 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
15445 as_bad (_("-march=%s is not compatible with the selected ABI"),
15446 arch_info->name);
15447
15448 mips_set_architecture (arch_info);
15449
15450 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
15451 if (mips_tune_string != 0)
15452 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
15453
15454 if (tune_info == 0)
15455 mips_set_tune (arch_info);
15456 else
15457 mips_set_tune (tune_info);
15458
15459 if (file_mips_gp32 >= 0)
15460 {
15461 /* The user specified the size of the integer registers. Make sure
15462 it agrees with the ABI and ISA. */
15463 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
15464 as_bad (_("-mgp64 used with a 32-bit processor"));
15465 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
15466 as_bad (_("-mgp32 used with a 64-bit ABI"));
15467 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
15468 as_bad (_("-mgp64 used with a 32-bit ABI"));
15469 }
15470 else
15471 {
15472 /* Infer the integer register size from the ABI and processor.
15473 Restrict ourselves to 32-bit registers if that's all the
15474 processor has, or if the ABI cannot handle 64-bit registers. */
15475 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
15476 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
15477 }
15478
15479 switch (file_mips_fp32)
15480 {
15481 default:
15482 case -1:
15483 /* No user specified float register size.
15484 ??? GAS treats single-float processors as though they had 64-bit
15485 float registers (although it complains when double-precision
15486 instructions are used). As things stand, saying they have 32-bit
15487 registers would lead to spurious "register must be even" messages.
15488 So here we assume float registers are never smaller than the
15489 integer ones. */
15490 if (file_mips_gp32 == 0)
15491 /* 64-bit integer registers implies 64-bit float registers. */
15492 file_mips_fp32 = 0;
15493 else if ((mips_opts.ase & FP64_ASES)
15494 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15495 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
15496 file_mips_fp32 = 0;
15497 else
15498 /* 32-bit float registers. */
15499 file_mips_fp32 = 1;
15500 break;
15501
15502 /* The user specified the size of the float registers. Check if it
15503 agrees with the ABI and ISA. */
15504 case 0:
15505 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15506 as_bad (_("-mfp64 used with a 32-bit fpu"));
15507 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15508 && !ISA_HAS_MXHC1 (mips_opts.isa))
15509 as_warn (_("-mfp64 used with a 32-bit ABI"));
15510 break;
15511 case 1:
15512 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15513 as_warn (_("-mfp32 used with a 64-bit ABI"));
15514 break;
15515 }
15516
15517 /* End of GCC-shared inference code. */
15518
15519 /* This flag is set when we have a 64-bit capable CPU but use only
15520 32-bit wide registers. Note that EABI does not use it. */
15521 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15522 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15523 || mips_abi == O32_ABI))
15524 mips_32bitmode = 1;
15525
15526 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15527 as_bad (_("trap exception not supported at ISA 1"));
15528
15529 /* If the selected architecture includes support for ASEs, enable
15530 generation of code for them. */
15531 if (mips_opts.mips16 == -1)
15532 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15533 if (mips_opts.micromips == -1)
15534 mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15535
15536 /* MIPS3D and MDMX require 64-bit FPRs, so -mfp32 should stop those
15537 ASEs from being selected implicitly. */
15538 if (file_mips_fp32 == 1)
15539 file_ase_explicit |= ASE_MIPS3D | ASE_MDMX;
15540
15541 /* If the user didn't explicitly select or deselect a particular ASE,
15542 use the default setting for the CPU. */
15543 mips_opts.ase |= (arch_info->ase & ~file_ase_explicit);
15544
15545 file_mips_isa = mips_opts.isa;
15546 file_ase = mips_opts.ase;
15547 mips_opts.gp32 = file_mips_gp32;
15548 mips_opts.fp32 = file_mips_fp32;
15549 mips_opts.soft_float = file_mips_soft_float;
15550 mips_opts.single_float = file_mips_single_float;
15551
15552 mips_check_isa_supports_ases ();
15553
15554 if (mips_flag_mdebug < 0)
15555 mips_flag_mdebug = 0;
15556 }
15557 \f
15558 void
15559 mips_init_after_args (void)
15560 {
15561 /* initialize opcodes */
15562 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15563 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15564 }
15565
15566 long
15567 md_pcrel_from (fixS *fixP)
15568 {
15569 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15570 switch (fixP->fx_r_type)
15571 {
15572 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15573 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15574 /* Return the address of the delay slot. */
15575 return addr + 2;
15576
15577 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15578 case BFD_RELOC_MICROMIPS_JMP:
15579 case BFD_RELOC_16_PCREL_S2:
15580 case BFD_RELOC_MIPS_JMP:
15581 /* Return the address of the delay slot. */
15582 return addr + 4;
15583
15584 case BFD_RELOC_32_PCREL:
15585 return addr;
15586
15587 default:
15588 /* We have no relocation type for PC relative MIPS16 instructions. */
15589 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15590 as_bad_where (fixP->fx_file, fixP->fx_line,
15591 _("PC relative MIPS16 instruction references a different section"));
15592 return addr;
15593 }
15594 }
15595
15596 /* This is called before the symbol table is processed. In order to
15597 work with gcc when using mips-tfile, we must keep all local labels.
15598 However, in other cases, we want to discard them. If we were
15599 called with -g, but we didn't see any debugging information, it may
15600 mean that gcc is smuggling debugging information through to
15601 mips-tfile, in which case we must generate all local labels. */
15602
15603 void
15604 mips_frob_file_before_adjust (void)
15605 {
15606 #ifndef NO_ECOFF_DEBUGGING
15607 if (ECOFF_DEBUGGING
15608 && mips_debug != 0
15609 && ! ecoff_debugging_seen)
15610 flag_keep_locals = 1;
15611 #endif
15612 }
15613
15614 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15615 the corresponding LO16 reloc. This is called before md_apply_fix and
15616 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
15617 relocation operators.
15618
15619 For our purposes, a %lo() expression matches a %got() or %hi()
15620 expression if:
15621
15622 (a) it refers to the same symbol; and
15623 (b) the offset applied in the %lo() expression is no lower than
15624 the offset applied in the %got() or %hi().
15625
15626 (b) allows us to cope with code like:
15627
15628 lui $4,%hi(foo)
15629 lh $4,%lo(foo+2)($4)
15630
15631 ...which is legal on RELA targets, and has a well-defined behaviour
15632 if the user knows that adding 2 to "foo" will not induce a carry to
15633 the high 16 bits.
15634
15635 When several %lo()s match a particular %got() or %hi(), we use the
15636 following rules to distinguish them:
15637
15638 (1) %lo()s with smaller offsets are a better match than %lo()s with
15639 higher offsets.
15640
15641 (2) %lo()s with no matching %got() or %hi() are better than those
15642 that already have a matching %got() or %hi().
15643
15644 (3) later %lo()s are better than earlier %lo()s.
15645
15646 These rules are applied in order.
15647
15648 (1) means, among other things, that %lo()s with identical offsets are
15649 chosen if they exist.
15650
15651 (2) means that we won't associate several high-part relocations with
15652 the same low-part relocation unless there's no alternative. Having
15653 several high parts for the same low part is a GNU extension; this rule
15654 allows careful users to avoid it.
15655
15656 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
15657 with the last high-part relocation being at the front of the list.
15658 It therefore makes sense to choose the last matching low-part
15659 relocation, all other things being equal. It's also easier
15660 to code that way. */
15661
15662 void
15663 mips_frob_file (void)
15664 {
15665 struct mips_hi_fixup *l;
15666 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15667
15668 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15669 {
15670 segment_info_type *seginfo;
15671 bfd_boolean matched_lo_p;
15672 fixS **hi_pos, **lo_pos, **pos;
15673
15674 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15675
15676 /* If a GOT16 relocation turns out to be against a global symbol,
15677 there isn't supposed to be a matching LO. Ignore %gots against
15678 constants; we'll report an error for those later. */
15679 if (got16_reloc_p (l->fixp->fx_r_type)
15680 && !(l->fixp->fx_addsy
15681 && pic_need_relax (l->fixp->fx_addsy, l->seg)))
15682 continue;
15683
15684 /* Check quickly whether the next fixup happens to be a matching %lo. */
15685 if (fixup_has_matching_lo_p (l->fixp))
15686 continue;
15687
15688 seginfo = seg_info (l->seg);
15689
15690 /* Set HI_POS to the position of this relocation in the chain.
15691 Set LO_POS to the position of the chosen low-part relocation.
15692 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15693 relocation that matches an immediately-preceding high-part
15694 relocation. */
15695 hi_pos = NULL;
15696 lo_pos = NULL;
15697 matched_lo_p = FALSE;
15698 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15699
15700 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15701 {
15702 if (*pos == l->fixp)
15703 hi_pos = pos;
15704
15705 if ((*pos)->fx_r_type == looking_for_rtype
15706 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15707 && (*pos)->fx_offset >= l->fixp->fx_offset
15708 && (lo_pos == NULL
15709 || (*pos)->fx_offset < (*lo_pos)->fx_offset
15710 || (!matched_lo_p
15711 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15712 lo_pos = pos;
15713
15714 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15715 && fixup_has_matching_lo_p (*pos));
15716 }
15717
15718 /* If we found a match, remove the high-part relocation from its
15719 current position and insert it before the low-part relocation.
15720 Make the offsets match so that fixup_has_matching_lo_p()
15721 will return true.
15722
15723 We don't warn about unmatched high-part relocations since some
15724 versions of gcc have been known to emit dead "lui ...%hi(...)"
15725 instructions. */
15726 if (lo_pos != NULL)
15727 {
15728 l->fixp->fx_offset = (*lo_pos)->fx_offset;
15729 if (l->fixp->fx_next != *lo_pos)
15730 {
15731 *hi_pos = l->fixp->fx_next;
15732 l->fixp->fx_next = *lo_pos;
15733 *lo_pos = l->fixp;
15734 }
15735 }
15736 }
15737 }
15738
15739 int
15740 mips_force_relocation (fixS *fixp)
15741 {
15742 if (generic_force_reloc (fixp))
15743 return 1;
15744
15745 /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15746 so that the linker relaxation can update targets. */
15747 if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15748 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15749 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15750 return 1;
15751
15752 return 0;
15753 }
15754
15755 /* Read the instruction associated with RELOC from BUF. */
15756
15757 static unsigned int
15758 read_reloc_insn (char *buf, bfd_reloc_code_real_type reloc)
15759 {
15760 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15761 return read_compressed_insn (buf, 4);
15762 else
15763 return read_insn (buf);
15764 }
15765
15766 /* Write instruction INSN to BUF, given that it has been relocated
15767 by RELOC. */
15768
15769 static void
15770 write_reloc_insn (char *buf, bfd_reloc_code_real_type reloc,
15771 unsigned long insn)
15772 {
15773 if (mips16_reloc_p (reloc) || micromips_reloc_p (reloc))
15774 write_compressed_insn (buf, insn, 4);
15775 else
15776 write_insn (buf, insn);
15777 }
15778
15779 /* Apply a fixup to the object file. */
15780
15781 void
15782 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15783 {
15784 char *buf;
15785 unsigned long insn;
15786 reloc_howto_type *howto;
15787
15788 /* We ignore generic BFD relocations we don't know about. */
15789 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15790 if (! howto)
15791 return;
15792
15793 gas_assert (fixP->fx_size == 2
15794 || fixP->fx_size == 4
15795 || fixP->fx_r_type == BFD_RELOC_16
15796 || fixP->fx_r_type == BFD_RELOC_64
15797 || fixP->fx_r_type == BFD_RELOC_CTOR
15798 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15799 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15800 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15801 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15802 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15803
15804 buf = fixP->fx_frag->fr_literal + fixP->fx_where;
15805
15806 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15807 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15808 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15809 || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
15810 || fixP->fx_r_type == BFD_RELOC_32_PCREL);
15811
15812 /* Don't treat parts of a composite relocation as done. There are two
15813 reasons for this:
15814
15815 (1) The second and third parts will be against 0 (RSS_UNDEF) but
15816 should nevertheless be emitted if the first part is.
15817
15818 (2) In normal usage, composite relocations are never assembly-time
15819 constants. The easiest way of dealing with the pathological
15820 exceptions is to generate a relocation against STN_UNDEF and
15821 leave everything up to the linker. */
15822 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15823 fixP->fx_done = 1;
15824
15825 switch (fixP->fx_r_type)
15826 {
15827 case BFD_RELOC_MIPS_TLS_GD:
15828 case BFD_RELOC_MIPS_TLS_LDM:
15829 case BFD_RELOC_MIPS_TLS_DTPREL32:
15830 case BFD_RELOC_MIPS_TLS_DTPREL64:
15831 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15832 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15833 case BFD_RELOC_MIPS_TLS_GOTTPREL:
15834 case BFD_RELOC_MIPS_TLS_TPREL32:
15835 case BFD_RELOC_MIPS_TLS_TPREL64:
15836 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15837 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15838 case BFD_RELOC_MICROMIPS_TLS_GD:
15839 case BFD_RELOC_MICROMIPS_TLS_LDM:
15840 case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15841 case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15842 case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15843 case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15844 case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15845 case BFD_RELOC_MIPS16_TLS_GD:
15846 case BFD_RELOC_MIPS16_TLS_LDM:
15847 case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
15848 case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
15849 case BFD_RELOC_MIPS16_TLS_GOTTPREL:
15850 case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
15851 case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
15852 if (!fixP->fx_addsy)
15853 {
15854 as_bad_where (fixP->fx_file, fixP->fx_line,
15855 _("TLS relocation against a constant"));
15856 break;
15857 }
15858 S_SET_THREAD_LOCAL (fixP->fx_addsy);
15859 /* fall through */
15860
15861 case BFD_RELOC_MIPS_JMP:
15862 case BFD_RELOC_MIPS_SHIFT5:
15863 case BFD_RELOC_MIPS_SHIFT6:
15864 case BFD_RELOC_MIPS_GOT_DISP:
15865 case BFD_RELOC_MIPS_GOT_PAGE:
15866 case BFD_RELOC_MIPS_GOT_OFST:
15867 case BFD_RELOC_MIPS_SUB:
15868 case BFD_RELOC_MIPS_INSERT_A:
15869 case BFD_RELOC_MIPS_INSERT_B:
15870 case BFD_RELOC_MIPS_DELETE:
15871 case BFD_RELOC_MIPS_HIGHEST:
15872 case BFD_RELOC_MIPS_HIGHER:
15873 case BFD_RELOC_MIPS_SCN_DISP:
15874 case BFD_RELOC_MIPS_REL16:
15875 case BFD_RELOC_MIPS_RELGOT:
15876 case BFD_RELOC_MIPS_JALR:
15877 case BFD_RELOC_HI16:
15878 case BFD_RELOC_HI16_S:
15879 case BFD_RELOC_LO16:
15880 case BFD_RELOC_GPREL16:
15881 case BFD_RELOC_MIPS_LITERAL:
15882 case BFD_RELOC_MIPS_CALL16:
15883 case BFD_RELOC_MIPS_GOT16:
15884 case BFD_RELOC_GPREL32:
15885 case BFD_RELOC_MIPS_GOT_HI16:
15886 case BFD_RELOC_MIPS_GOT_LO16:
15887 case BFD_RELOC_MIPS_CALL_HI16:
15888 case BFD_RELOC_MIPS_CALL_LO16:
15889 case BFD_RELOC_MIPS16_GPREL:
15890 case BFD_RELOC_MIPS16_GOT16:
15891 case BFD_RELOC_MIPS16_CALL16:
15892 case BFD_RELOC_MIPS16_HI16:
15893 case BFD_RELOC_MIPS16_HI16_S:
15894 case BFD_RELOC_MIPS16_LO16:
15895 case BFD_RELOC_MIPS16_JMP:
15896 case BFD_RELOC_MICROMIPS_JMP:
15897 case BFD_RELOC_MICROMIPS_GOT_DISP:
15898 case BFD_RELOC_MICROMIPS_GOT_PAGE:
15899 case BFD_RELOC_MICROMIPS_GOT_OFST:
15900 case BFD_RELOC_MICROMIPS_SUB:
15901 case BFD_RELOC_MICROMIPS_HIGHEST:
15902 case BFD_RELOC_MICROMIPS_HIGHER:
15903 case BFD_RELOC_MICROMIPS_SCN_DISP:
15904 case BFD_RELOC_MICROMIPS_JALR:
15905 case BFD_RELOC_MICROMIPS_HI16:
15906 case BFD_RELOC_MICROMIPS_HI16_S:
15907 case BFD_RELOC_MICROMIPS_LO16:
15908 case BFD_RELOC_MICROMIPS_GPREL16:
15909 case BFD_RELOC_MICROMIPS_LITERAL:
15910 case BFD_RELOC_MICROMIPS_CALL16:
15911 case BFD_RELOC_MICROMIPS_GOT16:
15912 case BFD_RELOC_MICROMIPS_GOT_HI16:
15913 case BFD_RELOC_MICROMIPS_GOT_LO16:
15914 case BFD_RELOC_MICROMIPS_CALL_HI16:
15915 case BFD_RELOC_MICROMIPS_CALL_LO16:
15916 case BFD_RELOC_MIPS_EH:
15917 if (fixP->fx_done)
15918 {
15919 offsetT value;
15920
15921 if (calculate_reloc (fixP->fx_r_type, *valP, &value))
15922 {
15923 insn = read_reloc_insn (buf, fixP->fx_r_type);
15924 if (mips16_reloc_p (fixP->fx_r_type))
15925 insn |= mips16_immed_extend (value, 16);
15926 else
15927 insn |= (value & 0xffff);
15928 write_reloc_insn (buf, fixP->fx_r_type, insn);
15929 }
15930 else
15931 as_bad_where (fixP->fx_file, fixP->fx_line,
15932 _("Unsupported constant in relocation"));
15933 }
15934 break;
15935
15936 case BFD_RELOC_64:
15937 /* This is handled like BFD_RELOC_32, but we output a sign
15938 extended value if we are only 32 bits. */
15939 if (fixP->fx_done)
15940 {
15941 if (8 <= sizeof (valueT))
15942 md_number_to_chars (buf, *valP, 8);
15943 else
15944 {
15945 valueT hiv;
15946
15947 if ((*valP & 0x80000000) != 0)
15948 hiv = 0xffffffff;
15949 else
15950 hiv = 0;
15951 md_number_to_chars (buf + (target_big_endian ? 4 : 0), *valP, 4);
15952 md_number_to_chars (buf + (target_big_endian ? 0 : 4), hiv, 4);
15953 }
15954 }
15955 break;
15956
15957 case BFD_RELOC_RVA:
15958 case BFD_RELOC_32:
15959 case BFD_RELOC_32_PCREL:
15960 case BFD_RELOC_16:
15961 /* If we are deleting this reloc entry, we must fill in the
15962 value now. This can happen if we have a .word which is not
15963 resolved when it appears but is later defined. */
15964 if (fixP->fx_done)
15965 md_number_to_chars (buf, *valP, fixP->fx_size);
15966 break;
15967
15968 case BFD_RELOC_16_PCREL_S2:
15969 if ((*valP & 0x3) != 0)
15970 as_bad_where (fixP->fx_file, fixP->fx_line,
15971 _("Branch to misaligned address (%lx)"), (long) *valP);
15972
15973 /* We need to save the bits in the instruction since fixup_segment()
15974 might be deleting the relocation entry (i.e., a branch within
15975 the current segment). */
15976 if (! fixP->fx_done)
15977 break;
15978
15979 /* Update old instruction data. */
15980 insn = read_insn (buf);
15981
15982 if (*valP + 0x20000 <= 0x3ffff)
15983 {
15984 insn |= (*valP >> 2) & 0xffff;
15985 write_insn (buf, insn);
15986 }
15987 else if (mips_pic == NO_PIC
15988 && fixP->fx_done
15989 && fixP->fx_frag->fr_address >= text_section->vma
15990 && (fixP->fx_frag->fr_address
15991 < text_section->vma + bfd_get_section_size (text_section))
15992 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
15993 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
15994 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15995 {
15996 /* The branch offset is too large. If this is an
15997 unconditional branch, and we are not generating PIC code,
15998 we can convert it to an absolute jump instruction. */
15999 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
16000 insn = 0x0c000000; /* jal */
16001 else
16002 insn = 0x08000000; /* j */
16003 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
16004 fixP->fx_done = 0;
16005 fixP->fx_addsy = section_symbol (text_section);
16006 *valP += md_pcrel_from (fixP);
16007 write_insn (buf, insn);
16008 }
16009 else
16010 {
16011 /* If we got here, we have branch-relaxation disabled,
16012 and there's nothing we can do to fix this instruction
16013 without turning it into a longer sequence. */
16014 as_bad_where (fixP->fx_file, fixP->fx_line,
16015 _("Branch out of range"));
16016 }
16017 break;
16018
16019 case BFD_RELOC_MICROMIPS_7_PCREL_S1:
16020 case BFD_RELOC_MICROMIPS_10_PCREL_S1:
16021 case BFD_RELOC_MICROMIPS_16_PCREL_S1:
16022 /* We adjust the offset back to even. */
16023 if ((*valP & 0x1) != 0)
16024 --(*valP);
16025
16026 if (! fixP->fx_done)
16027 break;
16028
16029 /* Should never visit here, because we keep the relocation. */
16030 abort ();
16031 break;
16032
16033 case BFD_RELOC_VTABLE_INHERIT:
16034 fixP->fx_done = 0;
16035 if (fixP->fx_addsy
16036 && !S_IS_DEFINED (fixP->fx_addsy)
16037 && !S_IS_WEAK (fixP->fx_addsy))
16038 S_SET_WEAK (fixP->fx_addsy);
16039 break;
16040
16041 case BFD_RELOC_VTABLE_ENTRY:
16042 fixP->fx_done = 0;
16043 break;
16044
16045 default:
16046 abort ();
16047 }
16048
16049 /* Remember value for tc_gen_reloc. */
16050 fixP->fx_addnumber = *valP;
16051 }
16052
16053 static symbolS *
16054 get_symbol (void)
16055 {
16056 int c;
16057 char *name;
16058 symbolS *p;
16059
16060 name = input_line_pointer;
16061 c = get_symbol_end ();
16062 p = (symbolS *) symbol_find_or_make (name);
16063 *input_line_pointer = c;
16064 return p;
16065 }
16066
16067 /* Align the current frag to a given power of two. If a particular
16068 fill byte should be used, FILL points to an integer that contains
16069 that byte, otherwise FILL is null.
16070
16071 This function used to have the comment:
16072
16073 The MIPS assembler also automatically adjusts any preceding label.
16074
16075 The implementation therefore applied the adjustment to a maximum of
16076 one label. However, other label adjustments are applied to batches
16077 of labels, and adjusting just one caused problems when new labels
16078 were added for the sake of debugging or unwind information.
16079 We therefore adjust all preceding labels (given as LABELS) instead. */
16080
16081 static void
16082 mips_align (int to, int *fill, struct insn_label_list *labels)
16083 {
16084 mips_emit_delays ();
16085 mips_record_compressed_mode ();
16086 if (fill == NULL && subseg_text_p (now_seg))
16087 frag_align_code (to, 0);
16088 else
16089 frag_align (to, fill ? *fill : 0, 0);
16090 record_alignment (now_seg, to);
16091 mips_move_labels (labels, FALSE);
16092 }
16093
16094 /* Align to a given power of two. .align 0 turns off the automatic
16095 alignment used by the data creating pseudo-ops. */
16096
16097 static void
16098 s_align (int x ATTRIBUTE_UNUSED)
16099 {
16100 int temp, fill_value, *fill_ptr;
16101 long max_alignment = 28;
16102
16103 /* o Note that the assembler pulls down any immediately preceding label
16104 to the aligned address.
16105 o It's not documented but auto alignment is reinstated by
16106 a .align pseudo instruction.
16107 o Note also that after auto alignment is turned off the mips assembler
16108 issues an error on attempt to assemble an improperly aligned data item.
16109 We don't. */
16110
16111 temp = get_absolute_expression ();
16112 if (temp > max_alignment)
16113 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
16114 else if (temp < 0)
16115 {
16116 as_warn (_("Alignment negative: 0 assumed."));
16117 temp = 0;
16118 }
16119 if (*input_line_pointer == ',')
16120 {
16121 ++input_line_pointer;
16122 fill_value = get_absolute_expression ();
16123 fill_ptr = &fill_value;
16124 }
16125 else
16126 fill_ptr = 0;
16127 if (temp)
16128 {
16129 segment_info_type *si = seg_info (now_seg);
16130 struct insn_label_list *l = si->label_list;
16131 /* Auto alignment should be switched on by next section change. */
16132 auto_align = 1;
16133 mips_align (temp, fill_ptr, l);
16134 }
16135 else
16136 {
16137 auto_align = 0;
16138 }
16139
16140 demand_empty_rest_of_line ();
16141 }
16142
16143 static void
16144 s_change_sec (int sec)
16145 {
16146 segT seg;
16147
16148 /* The ELF backend needs to know that we are changing sections, so
16149 that .previous works correctly. We could do something like check
16150 for an obj_section_change_hook macro, but that might be confusing
16151 as it would not be appropriate to use it in the section changing
16152 functions in read.c, since obj-elf.c intercepts those. FIXME:
16153 This should be cleaner, somehow. */
16154 obj_elf_section_change_hook ();
16155
16156 mips_emit_delays ();
16157
16158 switch (sec)
16159 {
16160 case 't':
16161 s_text (0);
16162 break;
16163 case 'd':
16164 s_data (0);
16165 break;
16166 case 'b':
16167 subseg_set (bss_section, (subsegT) get_absolute_expression ());
16168 demand_empty_rest_of_line ();
16169 break;
16170
16171 case 'r':
16172 seg = subseg_new (RDATA_SECTION_NAME,
16173 (subsegT) get_absolute_expression ());
16174 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
16175 | SEC_READONLY | SEC_RELOC
16176 | SEC_DATA));
16177 if (strncmp (TARGET_OS, "elf", 3) != 0)
16178 record_alignment (seg, 4);
16179 demand_empty_rest_of_line ();
16180 break;
16181
16182 case 's':
16183 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
16184 bfd_set_section_flags (stdoutput, seg,
16185 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
16186 if (strncmp (TARGET_OS, "elf", 3) != 0)
16187 record_alignment (seg, 4);
16188 demand_empty_rest_of_line ();
16189 break;
16190
16191 case 'B':
16192 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
16193 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
16194 if (strncmp (TARGET_OS, "elf", 3) != 0)
16195 record_alignment (seg, 4);
16196 demand_empty_rest_of_line ();
16197 break;
16198 }
16199
16200 auto_align = 1;
16201 }
16202
16203 void
16204 s_change_section (int ignore ATTRIBUTE_UNUSED)
16205 {
16206 char *section_name;
16207 char c;
16208 char next_c = 0;
16209 int section_type;
16210 int section_flag;
16211 int section_entry_size;
16212 int section_alignment;
16213
16214 section_name = input_line_pointer;
16215 c = get_symbol_end ();
16216 if (c)
16217 next_c = *(input_line_pointer + 1);
16218
16219 /* Do we have .section Name<,"flags">? */
16220 if (c != ',' || (c == ',' && next_c == '"'))
16221 {
16222 /* just after name is now '\0'. */
16223 *input_line_pointer = c;
16224 input_line_pointer = section_name;
16225 obj_elf_section (ignore);
16226 return;
16227 }
16228 input_line_pointer++;
16229
16230 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
16231 if (c == ',')
16232 section_type = get_absolute_expression ();
16233 else
16234 section_type = 0;
16235 if (*input_line_pointer++ == ',')
16236 section_flag = get_absolute_expression ();
16237 else
16238 section_flag = 0;
16239 if (*input_line_pointer++ == ',')
16240 section_entry_size = get_absolute_expression ();
16241 else
16242 section_entry_size = 0;
16243 if (*input_line_pointer++ == ',')
16244 section_alignment = get_absolute_expression ();
16245 else
16246 section_alignment = 0;
16247 /* FIXME: really ignore? */
16248 (void) section_alignment;
16249
16250 section_name = xstrdup (section_name);
16251
16252 /* When using the generic form of .section (as implemented by obj-elf.c),
16253 there's no way to set the section type to SHT_MIPS_DWARF. Users have
16254 traditionally had to fall back on the more common @progbits instead.
16255
16256 There's nothing really harmful in this, since bfd will correct
16257 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
16258 means that, for backwards compatibility, the special_section entries
16259 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
16260
16261 Even so, we shouldn't force users of the MIPS .section syntax to
16262 incorrectly label the sections as SHT_PROGBITS. The best compromise
16263 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
16264 generic type-checking code. */
16265 if (section_type == SHT_MIPS_DWARF)
16266 section_type = SHT_PROGBITS;
16267
16268 obj_elf_change_section (section_name, section_type, section_flag,
16269 section_entry_size, 0, 0, 0);
16270
16271 if (now_seg->name != section_name)
16272 free (section_name);
16273 }
16274
16275 void
16276 mips_enable_auto_align (void)
16277 {
16278 auto_align = 1;
16279 }
16280
16281 static void
16282 s_cons (int log_size)
16283 {
16284 segment_info_type *si = seg_info (now_seg);
16285 struct insn_label_list *l = si->label_list;
16286
16287 mips_emit_delays ();
16288 if (log_size > 0 && auto_align)
16289 mips_align (log_size, 0, l);
16290 cons (1 << log_size);
16291 mips_clear_insn_labels ();
16292 }
16293
16294 static void
16295 s_float_cons (int type)
16296 {
16297 segment_info_type *si = seg_info (now_seg);
16298 struct insn_label_list *l = si->label_list;
16299
16300 mips_emit_delays ();
16301
16302 if (auto_align)
16303 {
16304 if (type == 'd')
16305 mips_align (3, 0, l);
16306 else
16307 mips_align (2, 0, l);
16308 }
16309
16310 float_cons (type);
16311 mips_clear_insn_labels ();
16312 }
16313
16314 /* Handle .globl. We need to override it because on Irix 5 you are
16315 permitted to say
16316 .globl foo .text
16317 where foo is an undefined symbol, to mean that foo should be
16318 considered to be the address of a function. */
16319
16320 static void
16321 s_mips_globl (int x ATTRIBUTE_UNUSED)
16322 {
16323 char *name;
16324 int c;
16325 symbolS *symbolP;
16326 flagword flag;
16327
16328 do
16329 {
16330 name = input_line_pointer;
16331 c = get_symbol_end ();
16332 symbolP = symbol_find_or_make (name);
16333 S_SET_EXTERNAL (symbolP);
16334
16335 *input_line_pointer = c;
16336 SKIP_WHITESPACE ();
16337
16338 /* On Irix 5, every global symbol that is not explicitly labelled as
16339 being a function is apparently labelled as being an object. */
16340 flag = BSF_OBJECT;
16341
16342 if (!is_end_of_line[(unsigned char) *input_line_pointer]
16343 && (*input_line_pointer != ','))
16344 {
16345 char *secname;
16346 asection *sec;
16347
16348 secname = input_line_pointer;
16349 c = get_symbol_end ();
16350 sec = bfd_get_section_by_name (stdoutput, secname);
16351 if (sec == NULL)
16352 as_bad (_("%s: no such section"), secname);
16353 *input_line_pointer = c;
16354
16355 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
16356 flag = BSF_FUNCTION;
16357 }
16358
16359 symbol_get_bfdsym (symbolP)->flags |= flag;
16360
16361 c = *input_line_pointer;
16362 if (c == ',')
16363 {
16364 input_line_pointer++;
16365 SKIP_WHITESPACE ();
16366 if (is_end_of_line[(unsigned char) *input_line_pointer])
16367 c = '\n';
16368 }
16369 }
16370 while (c == ',');
16371
16372 demand_empty_rest_of_line ();
16373 }
16374
16375 static void
16376 s_option (int x ATTRIBUTE_UNUSED)
16377 {
16378 char *opt;
16379 char c;
16380
16381 opt = input_line_pointer;
16382 c = get_symbol_end ();
16383
16384 if (*opt == 'O')
16385 {
16386 /* FIXME: What does this mean? */
16387 }
16388 else if (strncmp (opt, "pic", 3) == 0)
16389 {
16390 int i;
16391
16392 i = atoi (opt + 3);
16393 if (i == 0)
16394 mips_pic = NO_PIC;
16395 else if (i == 2)
16396 {
16397 mips_pic = SVR4_PIC;
16398 mips_abicalls = TRUE;
16399 }
16400 else
16401 as_bad (_(".option pic%d not supported"), i);
16402
16403 if (mips_pic == SVR4_PIC)
16404 {
16405 if (g_switch_seen && g_switch_value != 0)
16406 as_warn (_("-G may not be used with SVR4 PIC code"));
16407 g_switch_value = 0;
16408 bfd_set_gp_size (stdoutput, 0);
16409 }
16410 }
16411 else
16412 as_warn (_("Unrecognized option \"%s\""), opt);
16413
16414 *input_line_pointer = c;
16415 demand_empty_rest_of_line ();
16416 }
16417
16418 /* This structure is used to hold a stack of .set values. */
16419
16420 struct mips_option_stack
16421 {
16422 struct mips_option_stack *next;
16423 struct mips_set_options options;
16424 };
16425
16426 static struct mips_option_stack *mips_opts_stack;
16427
16428 /* Handle the .set pseudo-op. */
16429
16430 static void
16431 s_mipsset (int x ATTRIBUTE_UNUSED)
16432 {
16433 char *name = input_line_pointer, ch;
16434 const struct mips_ase *ase;
16435
16436 while (!is_end_of_line[(unsigned char) *input_line_pointer])
16437 ++input_line_pointer;
16438 ch = *input_line_pointer;
16439 *input_line_pointer = '\0';
16440
16441 if (strcmp (name, "reorder") == 0)
16442 {
16443 if (mips_opts.noreorder)
16444 end_noreorder ();
16445 }
16446 else if (strcmp (name, "noreorder") == 0)
16447 {
16448 if (!mips_opts.noreorder)
16449 start_noreorder ();
16450 }
16451 else if (strncmp (name, "at=", 3) == 0)
16452 {
16453 char *s = name + 3;
16454
16455 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16456 as_bad (_("Unrecognized register name `%s'"), s);
16457 }
16458 else if (strcmp (name, "at") == 0)
16459 {
16460 mips_opts.at = ATREG;
16461 }
16462 else if (strcmp (name, "noat") == 0)
16463 {
16464 mips_opts.at = ZERO;
16465 }
16466 else if (strcmp (name, "macro") == 0)
16467 {
16468 mips_opts.warn_about_macros = 0;
16469 }
16470 else if (strcmp (name, "nomacro") == 0)
16471 {
16472 if (mips_opts.noreorder == 0)
16473 as_bad (_("`noreorder' must be set before `nomacro'"));
16474 mips_opts.warn_about_macros = 1;
16475 }
16476 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16477 {
16478 mips_opts.nomove = 0;
16479 }
16480 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16481 {
16482 mips_opts.nomove = 1;
16483 }
16484 else if (strcmp (name, "bopt") == 0)
16485 {
16486 mips_opts.nobopt = 0;
16487 }
16488 else if (strcmp (name, "nobopt") == 0)
16489 {
16490 mips_opts.nobopt = 1;
16491 }
16492 else if (strcmp (name, "gp=default") == 0)
16493 mips_opts.gp32 = file_mips_gp32;
16494 else if (strcmp (name, "gp=32") == 0)
16495 mips_opts.gp32 = 1;
16496 else if (strcmp (name, "gp=64") == 0)
16497 {
16498 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16499 as_warn (_("%s isa does not support 64-bit registers"),
16500 mips_cpu_info_from_isa (mips_opts.isa)->name);
16501 mips_opts.gp32 = 0;
16502 }
16503 else if (strcmp (name, "fp=default") == 0)
16504 mips_opts.fp32 = file_mips_fp32;
16505 else if (strcmp (name, "fp=32") == 0)
16506 mips_opts.fp32 = 1;
16507 else if (strcmp (name, "fp=64") == 0)
16508 {
16509 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16510 as_warn (_("%s isa does not support 64-bit floating point registers"),
16511 mips_cpu_info_from_isa (mips_opts.isa)->name);
16512 mips_opts.fp32 = 0;
16513 }
16514 else if (strcmp (name, "softfloat") == 0)
16515 mips_opts.soft_float = 1;
16516 else if (strcmp (name, "hardfloat") == 0)
16517 mips_opts.soft_float = 0;
16518 else if (strcmp (name, "singlefloat") == 0)
16519 mips_opts.single_float = 1;
16520 else if (strcmp (name, "doublefloat") == 0)
16521 mips_opts.single_float = 0;
16522 else if (strcmp (name, "mips16") == 0
16523 || strcmp (name, "MIPS-16") == 0)
16524 {
16525 if (mips_opts.micromips == 1)
16526 as_fatal (_("`mips16' cannot be used with `micromips'"));
16527 mips_opts.mips16 = 1;
16528 }
16529 else if (strcmp (name, "nomips16") == 0
16530 || strcmp (name, "noMIPS-16") == 0)
16531 mips_opts.mips16 = 0;
16532 else if (strcmp (name, "micromips") == 0)
16533 {
16534 if (mips_opts.mips16 == 1)
16535 as_fatal (_("`micromips' cannot be used with `mips16'"));
16536 mips_opts.micromips = 1;
16537 }
16538 else if (strcmp (name, "nomicromips") == 0)
16539 mips_opts.micromips = 0;
16540 else if (name[0] == 'n'
16541 && name[1] == 'o'
16542 && (ase = mips_lookup_ase (name + 2)))
16543 mips_set_ase (ase, FALSE);
16544 else if ((ase = mips_lookup_ase (name)))
16545 mips_set_ase (ase, TRUE);
16546 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16547 {
16548 int reset = 0;
16549
16550 /* Permit the user to change the ISA and architecture on the fly.
16551 Needless to say, misuse can cause serious problems. */
16552 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16553 {
16554 reset = 1;
16555 mips_opts.isa = file_mips_isa;
16556 mips_opts.arch = file_mips_arch;
16557 }
16558 else if (strncmp (name, "arch=", 5) == 0)
16559 {
16560 const struct mips_cpu_info *p;
16561
16562 p = mips_parse_cpu("internal use", name + 5);
16563 if (!p)
16564 as_bad (_("unknown architecture %s"), name + 5);
16565 else
16566 {
16567 mips_opts.arch = p->cpu;
16568 mips_opts.isa = p->isa;
16569 }
16570 }
16571 else if (strncmp (name, "mips", 4) == 0)
16572 {
16573 const struct mips_cpu_info *p;
16574
16575 p = mips_parse_cpu("internal use", name);
16576 if (!p)
16577 as_bad (_("unknown ISA level %s"), name + 4);
16578 else
16579 {
16580 mips_opts.arch = p->cpu;
16581 mips_opts.isa = p->isa;
16582 }
16583 }
16584 else
16585 as_bad (_("unknown ISA or architecture %s"), name);
16586
16587 switch (mips_opts.isa)
16588 {
16589 case 0:
16590 break;
16591 case ISA_MIPS1:
16592 case ISA_MIPS2:
16593 case ISA_MIPS32:
16594 case ISA_MIPS32R2:
16595 mips_opts.gp32 = 1;
16596 mips_opts.fp32 = 1;
16597 break;
16598 case ISA_MIPS3:
16599 case ISA_MIPS4:
16600 case ISA_MIPS5:
16601 case ISA_MIPS64:
16602 case ISA_MIPS64R2:
16603 mips_opts.gp32 = 0;
16604 if (mips_opts.arch == CPU_R5900)
16605 {
16606 mips_opts.fp32 = 1;
16607 }
16608 else
16609 {
16610 mips_opts.fp32 = 0;
16611 }
16612 break;
16613 default:
16614 as_bad (_("unknown ISA level %s"), name + 4);
16615 break;
16616 }
16617 if (reset)
16618 {
16619 mips_opts.gp32 = file_mips_gp32;
16620 mips_opts.fp32 = file_mips_fp32;
16621 }
16622 }
16623 else if (strcmp (name, "autoextend") == 0)
16624 mips_opts.noautoextend = 0;
16625 else if (strcmp (name, "noautoextend") == 0)
16626 mips_opts.noautoextend = 1;
16627 else if (strcmp (name, "insn32") == 0)
16628 mips_opts.insn32 = TRUE;
16629 else if (strcmp (name, "noinsn32") == 0)
16630 mips_opts.insn32 = FALSE;
16631 else if (strcmp (name, "push") == 0)
16632 {
16633 struct mips_option_stack *s;
16634
16635 s = (struct mips_option_stack *) xmalloc (sizeof *s);
16636 s->next = mips_opts_stack;
16637 s->options = mips_opts;
16638 mips_opts_stack = s;
16639 }
16640 else if (strcmp (name, "pop") == 0)
16641 {
16642 struct mips_option_stack *s;
16643
16644 s = mips_opts_stack;
16645 if (s == NULL)
16646 as_bad (_(".set pop with no .set push"));
16647 else
16648 {
16649 /* If we're changing the reorder mode we need to handle
16650 delay slots correctly. */
16651 if (s->options.noreorder && ! mips_opts.noreorder)
16652 start_noreorder ();
16653 else if (! s->options.noreorder && mips_opts.noreorder)
16654 end_noreorder ();
16655
16656 mips_opts = s->options;
16657 mips_opts_stack = s->next;
16658 free (s);
16659 }
16660 }
16661 else if (strcmp (name, "sym32") == 0)
16662 mips_opts.sym32 = TRUE;
16663 else if (strcmp (name, "nosym32") == 0)
16664 mips_opts.sym32 = FALSE;
16665 else if (strchr (name, ','))
16666 {
16667 /* Generic ".set" directive; use the generic handler. */
16668 *input_line_pointer = ch;
16669 input_line_pointer = name;
16670 s_set (0);
16671 return;
16672 }
16673 else
16674 {
16675 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16676 }
16677 mips_check_isa_supports_ases ();
16678 *input_line_pointer = ch;
16679 demand_empty_rest_of_line ();
16680 }
16681
16682 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
16683 .option pic2. It means to generate SVR4 PIC calls. */
16684
16685 static void
16686 s_abicalls (int ignore ATTRIBUTE_UNUSED)
16687 {
16688 mips_pic = SVR4_PIC;
16689 mips_abicalls = TRUE;
16690
16691 if (g_switch_seen && g_switch_value != 0)
16692 as_warn (_("-G may not be used with SVR4 PIC code"));
16693 g_switch_value = 0;
16694
16695 bfd_set_gp_size (stdoutput, 0);
16696 demand_empty_rest_of_line ();
16697 }
16698
16699 /* Handle the .cpload pseudo-op. This is used when generating SVR4
16700 PIC code. It sets the $gp register for the function based on the
16701 function address, which is in the register named in the argument.
16702 This uses a relocation against _gp_disp, which is handled specially
16703 by the linker. The result is:
16704 lui $gp,%hi(_gp_disp)
16705 addiu $gp,$gp,%lo(_gp_disp)
16706 addu $gp,$gp,.cpload argument
16707 The .cpload argument is normally $25 == $t9.
16708
16709 The -mno-shared option changes this to:
16710 lui $gp,%hi(__gnu_local_gp)
16711 addiu $gp,$gp,%lo(__gnu_local_gp)
16712 and the argument is ignored. This saves an instruction, but the
16713 resulting code is not position independent; it uses an absolute
16714 address for __gnu_local_gp. Thus code assembled with -mno-shared
16715 can go into an ordinary executable, but not into a shared library. */
16716
16717 static void
16718 s_cpload (int ignore ATTRIBUTE_UNUSED)
16719 {
16720 expressionS ex;
16721 int reg;
16722 int in_shared;
16723
16724 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16725 .cpload is ignored. */
16726 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16727 {
16728 s_ignore (0);
16729 return;
16730 }
16731
16732 if (mips_opts.mips16)
16733 {
16734 as_bad (_("%s not supported in MIPS16 mode"), ".cpload");
16735 ignore_rest_of_line ();
16736 return;
16737 }
16738
16739 /* .cpload should be in a .set noreorder section. */
16740 if (mips_opts.noreorder == 0)
16741 as_warn (_(".cpload not in noreorder section"));
16742
16743 reg = tc_get_register (0);
16744
16745 /* If we need to produce a 64-bit address, we are better off using
16746 the default instruction sequence. */
16747 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16748
16749 ex.X_op = O_symbol;
16750 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16751 "__gnu_local_gp");
16752 ex.X_op_symbol = NULL;
16753 ex.X_add_number = 0;
16754
16755 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16756 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16757
16758 mips_mark_labels ();
16759 mips_assembling_insn = TRUE;
16760
16761 macro_start ();
16762 macro_build_lui (&ex, mips_gp_register);
16763 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16764 mips_gp_register, BFD_RELOC_LO16);
16765 if (in_shared)
16766 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16767 mips_gp_register, reg);
16768 macro_end ();
16769
16770 mips_assembling_insn = FALSE;
16771 demand_empty_rest_of_line ();
16772 }
16773
16774 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
16775 .cpsetup $reg1, offset|$reg2, label
16776
16777 If offset is given, this results in:
16778 sd $gp, offset($sp)
16779 lui $gp, %hi(%neg(%gp_rel(label)))
16780 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16781 daddu $gp, $gp, $reg1
16782
16783 If $reg2 is given, this results in:
16784 daddu $reg2, $gp, $0
16785 lui $gp, %hi(%neg(%gp_rel(label)))
16786 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
16787 daddu $gp, $gp, $reg1
16788 $reg1 is normally $25 == $t9.
16789
16790 The -mno-shared option replaces the last three instructions with
16791 lui $gp,%hi(_gp)
16792 addiu $gp,$gp,%lo(_gp) */
16793
16794 static void
16795 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16796 {
16797 expressionS ex_off;
16798 expressionS ex_sym;
16799 int reg1;
16800
16801 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16802 We also need NewABI support. */
16803 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16804 {
16805 s_ignore (0);
16806 return;
16807 }
16808
16809 if (mips_opts.mips16)
16810 {
16811 as_bad (_("%s not supported in MIPS16 mode"), ".cpsetup");
16812 ignore_rest_of_line ();
16813 return;
16814 }
16815
16816 reg1 = tc_get_register (0);
16817 SKIP_WHITESPACE ();
16818 if (*input_line_pointer != ',')
16819 {
16820 as_bad (_("missing argument separator ',' for .cpsetup"));
16821 return;
16822 }
16823 else
16824 ++input_line_pointer;
16825 SKIP_WHITESPACE ();
16826 if (*input_line_pointer == '$')
16827 {
16828 mips_cpreturn_register = tc_get_register (0);
16829 mips_cpreturn_offset = -1;
16830 }
16831 else
16832 {
16833 mips_cpreturn_offset = get_absolute_expression ();
16834 mips_cpreturn_register = -1;
16835 }
16836 SKIP_WHITESPACE ();
16837 if (*input_line_pointer != ',')
16838 {
16839 as_bad (_("missing argument separator ',' for .cpsetup"));
16840 return;
16841 }
16842 else
16843 ++input_line_pointer;
16844 SKIP_WHITESPACE ();
16845 expression (&ex_sym);
16846
16847 mips_mark_labels ();
16848 mips_assembling_insn = TRUE;
16849
16850 macro_start ();
16851 if (mips_cpreturn_register == -1)
16852 {
16853 ex_off.X_op = O_constant;
16854 ex_off.X_add_symbol = NULL;
16855 ex_off.X_op_symbol = NULL;
16856 ex_off.X_add_number = mips_cpreturn_offset;
16857
16858 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16859 BFD_RELOC_LO16, SP);
16860 }
16861 else
16862 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16863 mips_gp_register, 0);
16864
16865 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16866 {
16867 macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16868 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16869 BFD_RELOC_HI16_S);
16870
16871 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16872 mips_gp_register, -1, BFD_RELOC_GPREL16,
16873 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16874
16875 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16876 mips_gp_register, reg1);
16877 }
16878 else
16879 {
16880 expressionS ex;
16881
16882 ex.X_op = O_symbol;
16883 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16884 ex.X_op_symbol = NULL;
16885 ex.X_add_number = 0;
16886
16887 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
16888 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16889
16890 macro_build_lui (&ex, mips_gp_register);
16891 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16892 mips_gp_register, BFD_RELOC_LO16);
16893 }
16894
16895 macro_end ();
16896
16897 mips_assembling_insn = FALSE;
16898 demand_empty_rest_of_line ();
16899 }
16900
16901 static void
16902 s_cplocal (int ignore ATTRIBUTE_UNUSED)
16903 {
16904 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16905 .cplocal is ignored. */
16906 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16907 {
16908 s_ignore (0);
16909 return;
16910 }
16911
16912 if (mips_opts.mips16)
16913 {
16914 as_bad (_("%s not supported in MIPS16 mode"), ".cplocal");
16915 ignore_rest_of_line ();
16916 return;
16917 }
16918
16919 mips_gp_register = tc_get_register (0);
16920 demand_empty_rest_of_line ();
16921 }
16922
16923 /* Handle the .cprestore pseudo-op. This stores $gp into a given
16924 offset from $sp. The offset is remembered, and after making a PIC
16925 call $gp is restored from that location. */
16926
16927 static void
16928 s_cprestore (int ignore ATTRIBUTE_UNUSED)
16929 {
16930 expressionS ex;
16931
16932 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16933 .cprestore is ignored. */
16934 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16935 {
16936 s_ignore (0);
16937 return;
16938 }
16939
16940 if (mips_opts.mips16)
16941 {
16942 as_bad (_("%s not supported in MIPS16 mode"), ".cprestore");
16943 ignore_rest_of_line ();
16944 return;
16945 }
16946
16947 mips_cprestore_offset = get_absolute_expression ();
16948 mips_cprestore_valid = 1;
16949
16950 ex.X_op = O_constant;
16951 ex.X_add_symbol = NULL;
16952 ex.X_op_symbol = NULL;
16953 ex.X_add_number = mips_cprestore_offset;
16954
16955 mips_mark_labels ();
16956 mips_assembling_insn = TRUE;
16957
16958 macro_start ();
16959 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16960 SP, HAVE_64BIT_ADDRESSES);
16961 macro_end ();
16962
16963 mips_assembling_insn = FALSE;
16964 demand_empty_rest_of_line ();
16965 }
16966
16967 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16968 was given in the preceding .cpsetup, it results in:
16969 ld $gp, offset($sp)
16970
16971 If a register $reg2 was given there, it results in:
16972 daddu $gp, $reg2, $0 */
16973
16974 static void
16975 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16976 {
16977 expressionS ex;
16978
16979 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16980 We also need NewABI support. */
16981 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16982 {
16983 s_ignore (0);
16984 return;
16985 }
16986
16987 if (mips_opts.mips16)
16988 {
16989 as_bad (_("%s not supported in MIPS16 mode"), ".cpreturn");
16990 ignore_rest_of_line ();
16991 return;
16992 }
16993
16994 mips_mark_labels ();
16995 mips_assembling_insn = TRUE;
16996
16997 macro_start ();
16998 if (mips_cpreturn_register == -1)
16999 {
17000 ex.X_op = O_constant;
17001 ex.X_add_symbol = NULL;
17002 ex.X_op_symbol = NULL;
17003 ex.X_add_number = mips_cpreturn_offset;
17004
17005 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
17006 }
17007 else
17008 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
17009 mips_cpreturn_register, 0);
17010 macro_end ();
17011
17012 mips_assembling_insn = FALSE;
17013 demand_empty_rest_of_line ();
17014 }
17015
17016 /* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
17017 pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
17018 DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
17019 debug information or MIPS16 TLS. */
17020
17021 static void
17022 s_tls_rel_directive (const size_t bytes, const char *dirstr,
17023 bfd_reloc_code_real_type rtype)
17024 {
17025 expressionS ex;
17026 char *p;
17027
17028 expression (&ex);
17029
17030 if (ex.X_op != O_symbol)
17031 {
17032 as_bad (_("Unsupported use of %s"), dirstr);
17033 ignore_rest_of_line ();
17034 }
17035
17036 p = frag_more (bytes);
17037 md_number_to_chars (p, 0, bytes);
17038 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
17039 demand_empty_rest_of_line ();
17040 mips_clear_insn_labels ();
17041 }
17042
17043 /* Handle .dtprelword. */
17044
17045 static void
17046 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
17047 {
17048 s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
17049 }
17050
17051 /* Handle .dtpreldword. */
17052
17053 static void
17054 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
17055 {
17056 s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
17057 }
17058
17059 /* Handle .tprelword. */
17060
17061 static void
17062 s_tprelword (int ignore ATTRIBUTE_UNUSED)
17063 {
17064 s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
17065 }
17066
17067 /* Handle .tpreldword. */
17068
17069 static void
17070 s_tpreldword (int ignore ATTRIBUTE_UNUSED)
17071 {
17072 s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
17073 }
17074
17075 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
17076 code. It sets the offset to use in gp_rel relocations. */
17077
17078 static void
17079 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
17080 {
17081 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
17082 We also need NewABI support. */
17083 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
17084 {
17085 s_ignore (0);
17086 return;
17087 }
17088
17089 mips_gprel_offset = get_absolute_expression ();
17090
17091 demand_empty_rest_of_line ();
17092 }
17093
17094 /* Handle the .gpword pseudo-op. This is used when generating PIC
17095 code. It generates a 32 bit GP relative reloc. */
17096
17097 static void
17098 s_gpword (int ignore ATTRIBUTE_UNUSED)
17099 {
17100 segment_info_type *si;
17101 struct insn_label_list *l;
17102 expressionS ex;
17103 char *p;
17104
17105 /* When not generating PIC code, this is treated as .word. */
17106 if (mips_pic != SVR4_PIC)
17107 {
17108 s_cons (2);
17109 return;
17110 }
17111
17112 si = seg_info (now_seg);
17113 l = si->label_list;
17114 mips_emit_delays ();
17115 if (auto_align)
17116 mips_align (2, 0, l);
17117
17118 expression (&ex);
17119 mips_clear_insn_labels ();
17120
17121 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17122 {
17123 as_bad (_("Unsupported use of .gpword"));
17124 ignore_rest_of_line ();
17125 }
17126
17127 p = frag_more (4);
17128 md_number_to_chars (p, 0, 4);
17129 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17130 BFD_RELOC_GPREL32);
17131
17132 demand_empty_rest_of_line ();
17133 }
17134
17135 static void
17136 s_gpdword (int ignore ATTRIBUTE_UNUSED)
17137 {
17138 segment_info_type *si;
17139 struct insn_label_list *l;
17140 expressionS ex;
17141 char *p;
17142
17143 /* When not generating PIC code, this is treated as .dword. */
17144 if (mips_pic != SVR4_PIC)
17145 {
17146 s_cons (3);
17147 return;
17148 }
17149
17150 si = seg_info (now_seg);
17151 l = si->label_list;
17152 mips_emit_delays ();
17153 if (auto_align)
17154 mips_align (3, 0, l);
17155
17156 expression (&ex);
17157 mips_clear_insn_labels ();
17158
17159 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17160 {
17161 as_bad (_("Unsupported use of .gpdword"));
17162 ignore_rest_of_line ();
17163 }
17164
17165 p = frag_more (8);
17166 md_number_to_chars (p, 0, 8);
17167 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17168 BFD_RELOC_GPREL32)->fx_tcbit = 1;
17169
17170 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
17171 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
17172 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
17173
17174 demand_empty_rest_of_line ();
17175 }
17176
17177 /* Handle the .ehword pseudo-op. This is used when generating unwinding
17178 tables. It generates a R_MIPS_EH reloc. */
17179
17180 static void
17181 s_ehword (int ignore ATTRIBUTE_UNUSED)
17182 {
17183 expressionS ex;
17184 char *p;
17185
17186 mips_emit_delays ();
17187
17188 expression (&ex);
17189 mips_clear_insn_labels ();
17190
17191 if (ex.X_op != O_symbol || ex.X_add_number != 0)
17192 {
17193 as_bad (_("Unsupported use of .ehword"));
17194 ignore_rest_of_line ();
17195 }
17196
17197 p = frag_more (4);
17198 md_number_to_chars (p, 0, 4);
17199 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
17200 BFD_RELOC_MIPS_EH);
17201
17202 demand_empty_rest_of_line ();
17203 }
17204
17205 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
17206 tables in SVR4 PIC code. */
17207
17208 static void
17209 s_cpadd (int ignore ATTRIBUTE_UNUSED)
17210 {
17211 int reg;
17212
17213 /* This is ignored when not generating SVR4 PIC code. */
17214 if (mips_pic != SVR4_PIC)
17215 {
17216 s_ignore (0);
17217 return;
17218 }
17219
17220 mips_mark_labels ();
17221 mips_assembling_insn = TRUE;
17222
17223 /* Add $gp to the register named as an argument. */
17224 macro_start ();
17225 reg = tc_get_register (0);
17226 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
17227 macro_end ();
17228
17229 mips_assembling_insn = FALSE;
17230 demand_empty_rest_of_line ();
17231 }
17232
17233 /* Handle the .insn pseudo-op. This marks instruction labels in
17234 mips16/micromips mode. This permits the linker to handle them specially,
17235 such as generating jalx instructions when needed. We also make
17236 them odd for the duration of the assembly, in order to generate the
17237 right sort of code. We will make them even in the adjust_symtab
17238 routine, while leaving them marked. This is convenient for the
17239 debugger and the disassembler. The linker knows to make them odd
17240 again. */
17241
17242 static void
17243 s_insn (int ignore ATTRIBUTE_UNUSED)
17244 {
17245 mips_mark_labels ();
17246
17247 demand_empty_rest_of_line ();
17248 }
17249
17250 /* Handle a .stab[snd] directive. Ideally these directives would be
17251 implemented in a transparent way, so that removing them would not
17252 have any effect on the generated instructions. However, s_stab
17253 internally changes the section, so in practice we need to decide
17254 now whether the preceding label marks compressed code. We do not
17255 support changing the compression mode of a label after a .stab*
17256 directive, such as in:
17257
17258 foo:
17259 .stabs ...
17260 .set mips16
17261
17262 so the current mode wins. */
17263
17264 static void
17265 s_mips_stab (int type)
17266 {
17267 mips_mark_labels ();
17268 s_stab (type);
17269 }
17270
17271 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
17272
17273 static void
17274 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
17275 {
17276 char *name;
17277 int c;
17278 symbolS *symbolP;
17279 expressionS exp;
17280
17281 name = input_line_pointer;
17282 c = get_symbol_end ();
17283 symbolP = symbol_find_or_make (name);
17284 S_SET_WEAK (symbolP);
17285 *input_line_pointer = c;
17286
17287 SKIP_WHITESPACE ();
17288
17289 if (! is_end_of_line[(unsigned char) *input_line_pointer])
17290 {
17291 if (S_IS_DEFINED (symbolP))
17292 {
17293 as_bad (_("ignoring attempt to redefine symbol %s"),
17294 S_GET_NAME (symbolP));
17295 ignore_rest_of_line ();
17296 return;
17297 }
17298
17299 if (*input_line_pointer == ',')
17300 {
17301 ++input_line_pointer;
17302 SKIP_WHITESPACE ();
17303 }
17304
17305 expression (&exp);
17306 if (exp.X_op != O_symbol)
17307 {
17308 as_bad (_("bad .weakext directive"));
17309 ignore_rest_of_line ();
17310 return;
17311 }
17312 symbol_set_value_expression (symbolP, &exp);
17313 }
17314
17315 demand_empty_rest_of_line ();
17316 }
17317
17318 /* Parse a register string into a number. Called from the ECOFF code
17319 to parse .frame. The argument is non-zero if this is the frame
17320 register, so that we can record it in mips_frame_reg. */
17321
17322 int
17323 tc_get_register (int frame)
17324 {
17325 unsigned int reg;
17326
17327 SKIP_WHITESPACE ();
17328 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
17329 reg = 0;
17330 if (frame)
17331 {
17332 mips_frame_reg = reg != 0 ? reg : SP;
17333 mips_frame_reg_valid = 1;
17334 mips_cprestore_valid = 0;
17335 }
17336 return reg;
17337 }
17338
17339 valueT
17340 md_section_align (asection *seg, valueT addr)
17341 {
17342 int align = bfd_get_section_alignment (stdoutput, seg);
17343
17344 /* We don't need to align ELF sections to the full alignment.
17345 However, Irix 5 may prefer that we align them at least to a 16
17346 byte boundary. We don't bother to align the sections if we
17347 are targeted for an embedded system. */
17348 if (strncmp (TARGET_OS, "elf", 3) == 0)
17349 return addr;
17350 if (align > 4)
17351 align = 4;
17352
17353 return ((addr + (1 << align) - 1) & (-1 << align));
17354 }
17355
17356 /* Utility routine, called from above as well. If called while the
17357 input file is still being read, it's only an approximation. (For
17358 example, a symbol may later become defined which appeared to be
17359 undefined earlier.) */
17360
17361 static int
17362 nopic_need_relax (symbolS *sym, int before_relaxing)
17363 {
17364 if (sym == 0)
17365 return 0;
17366
17367 if (g_switch_value > 0)
17368 {
17369 const char *symname;
17370 int change;
17371
17372 /* Find out whether this symbol can be referenced off the $gp
17373 register. It can be if it is smaller than the -G size or if
17374 it is in the .sdata or .sbss section. Certain symbols can
17375 not be referenced off the $gp, although it appears as though
17376 they can. */
17377 symname = S_GET_NAME (sym);
17378 if (symname != (const char *) NULL
17379 && (strcmp (symname, "eprol") == 0
17380 || strcmp (symname, "etext") == 0
17381 || strcmp (symname, "_gp") == 0
17382 || strcmp (symname, "edata") == 0
17383 || strcmp (symname, "_fbss") == 0
17384 || strcmp (symname, "_fdata") == 0
17385 || strcmp (symname, "_ftext") == 0
17386 || strcmp (symname, "end") == 0
17387 || strcmp (symname, "_gp_disp") == 0))
17388 change = 1;
17389 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
17390 && (0
17391 #ifndef NO_ECOFF_DEBUGGING
17392 || (symbol_get_obj (sym)->ecoff_extern_size != 0
17393 && (symbol_get_obj (sym)->ecoff_extern_size
17394 <= g_switch_value))
17395 #endif
17396 /* We must defer this decision until after the whole
17397 file has been read, since there might be a .extern
17398 after the first use of this symbol. */
17399 || (before_relaxing
17400 #ifndef NO_ECOFF_DEBUGGING
17401 && symbol_get_obj (sym)->ecoff_extern_size == 0
17402 #endif
17403 && S_GET_VALUE (sym) == 0)
17404 || (S_GET_VALUE (sym) != 0
17405 && S_GET_VALUE (sym) <= g_switch_value)))
17406 change = 0;
17407 else
17408 {
17409 const char *segname;
17410
17411 segname = segment_name (S_GET_SEGMENT (sym));
17412 gas_assert (strcmp (segname, ".lit8") != 0
17413 && strcmp (segname, ".lit4") != 0);
17414 change = (strcmp (segname, ".sdata") != 0
17415 && strcmp (segname, ".sbss") != 0
17416 && strncmp (segname, ".sdata.", 7) != 0
17417 && strncmp (segname, ".sbss.", 6) != 0
17418 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
17419 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
17420 }
17421 return change;
17422 }
17423 else
17424 /* We are not optimizing for the $gp register. */
17425 return 1;
17426 }
17427
17428
17429 /* Return true if the given symbol should be considered local for SVR4 PIC. */
17430
17431 static bfd_boolean
17432 pic_need_relax (symbolS *sym, asection *segtype)
17433 {
17434 asection *symsec;
17435
17436 /* Handle the case of a symbol equated to another symbol. */
17437 while (symbol_equated_reloc_p (sym))
17438 {
17439 symbolS *n;
17440
17441 /* It's possible to get a loop here in a badly written program. */
17442 n = symbol_get_value_expression (sym)->X_add_symbol;
17443 if (n == sym)
17444 break;
17445 sym = n;
17446 }
17447
17448 if (symbol_section_p (sym))
17449 return TRUE;
17450
17451 symsec = S_GET_SEGMENT (sym);
17452
17453 /* This must duplicate the test in adjust_reloc_syms. */
17454 return (!bfd_is_und_section (symsec)
17455 && !bfd_is_abs_section (symsec)
17456 && !bfd_is_com_section (symsec)
17457 && !s_is_linkonce (sym, segtype)
17458 /* A global or weak symbol is treated as external. */
17459 && (!S_IS_WEAK (sym) && !S_IS_EXTERNAL (sym)));
17460 }
17461
17462
17463 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
17464 extended opcode. SEC is the section the frag is in. */
17465
17466 static int
17467 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
17468 {
17469 int type;
17470 const struct mips16_immed_operand *op;
17471 offsetT val;
17472 int mintiny, maxtiny;
17473 segT symsec;
17474 fragS *sym_frag;
17475
17476 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
17477 return 0;
17478 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
17479 return 1;
17480
17481 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
17482 op = mips16_immed_operands;
17483 while (op->type != type)
17484 {
17485 ++op;
17486 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
17487 }
17488
17489 if (op->unsp)
17490 {
17491 if (type == '<' || type == '>' || type == '[' || type == ']')
17492 {
17493 mintiny = 1;
17494 maxtiny = 1 << op->nbits;
17495 }
17496 else
17497 {
17498 mintiny = 0;
17499 maxtiny = (1 << op->nbits) - 1;
17500 }
17501 }
17502 else
17503 {
17504 mintiny = - (1 << (op->nbits - 1));
17505 maxtiny = (1 << (op->nbits - 1)) - 1;
17506 }
17507
17508 sym_frag = symbol_get_frag (fragp->fr_symbol);
17509 val = S_GET_VALUE (fragp->fr_symbol);
17510 symsec = S_GET_SEGMENT (fragp->fr_symbol);
17511
17512 if (op->pcrel)
17513 {
17514 addressT addr;
17515
17516 /* We won't have the section when we are called from
17517 mips_relax_frag. However, we will always have been called
17518 from md_estimate_size_before_relax first. If this is a
17519 branch to a different section, we mark it as such. If SEC is
17520 NULL, and the frag is not marked, then it must be a branch to
17521 the same section. */
17522 if (sec == NULL)
17523 {
17524 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17525 return 1;
17526 }
17527 else
17528 {
17529 /* Must have been called from md_estimate_size_before_relax. */
17530 if (symsec != sec)
17531 {
17532 fragp->fr_subtype =
17533 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17534
17535 /* FIXME: We should support this, and let the linker
17536 catch branches and loads that are out of range. */
17537 as_bad_where (fragp->fr_file, fragp->fr_line,
17538 _("unsupported PC relative reference to different section"));
17539
17540 return 1;
17541 }
17542 if (fragp != sym_frag && sym_frag->fr_address == 0)
17543 /* Assume non-extended on the first relaxation pass.
17544 The address we have calculated will be bogus if this is
17545 a forward branch to another frag, as the forward frag
17546 will have fr_address == 0. */
17547 return 0;
17548 }
17549
17550 /* In this case, we know for sure that the symbol fragment is in
17551 the same section. If the relax_marker of the symbol fragment
17552 differs from the relax_marker of this fragment, we have not
17553 yet adjusted the symbol fragment fr_address. We want to add
17554 in STRETCH in order to get a better estimate of the address.
17555 This particularly matters because of the shift bits. */
17556 if (stretch != 0
17557 && sym_frag->relax_marker != fragp->relax_marker)
17558 {
17559 fragS *f;
17560
17561 /* Adjust stretch for any alignment frag. Note that if have
17562 been expanding the earlier code, the symbol may be
17563 defined in what appears to be an earlier frag. FIXME:
17564 This doesn't handle the fr_subtype field, which specifies
17565 a maximum number of bytes to skip when doing an
17566 alignment. */
17567 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17568 {
17569 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17570 {
17571 if (stretch < 0)
17572 stretch = - ((- stretch)
17573 & ~ ((1 << (int) f->fr_offset) - 1));
17574 else
17575 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17576 if (stretch == 0)
17577 break;
17578 }
17579 }
17580 if (f != NULL)
17581 val += stretch;
17582 }
17583
17584 addr = fragp->fr_address + fragp->fr_fix;
17585
17586 /* The base address rules are complicated. The base address of
17587 a branch is the following instruction. The base address of a
17588 PC relative load or add is the instruction itself, but if it
17589 is in a delay slot (in which case it can not be extended) use
17590 the address of the instruction whose delay slot it is in. */
17591 if (type == 'p' || type == 'q')
17592 {
17593 addr += 2;
17594
17595 /* If we are currently assuming that this frag should be
17596 extended, then, the current address is two bytes
17597 higher. */
17598 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17599 addr += 2;
17600
17601 /* Ignore the low bit in the target, since it will be set
17602 for a text label. */
17603 if ((val & 1) != 0)
17604 --val;
17605 }
17606 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17607 addr -= 4;
17608 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17609 addr -= 2;
17610
17611 val -= addr & ~ ((1 << op->shift) - 1);
17612
17613 /* Branch offsets have an implicit 0 in the lowest bit. */
17614 if (type == 'p' || type == 'q')
17615 val /= 2;
17616
17617 /* If any of the shifted bits are set, we must use an extended
17618 opcode. If the address depends on the size of this
17619 instruction, this can lead to a loop, so we arrange to always
17620 use an extended opcode. We only check this when we are in
17621 the main relaxation loop, when SEC is NULL. */
17622 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17623 {
17624 fragp->fr_subtype =
17625 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17626 return 1;
17627 }
17628
17629 /* If we are about to mark a frag as extended because the value
17630 is precisely maxtiny + 1, then there is a chance of an
17631 infinite loop as in the following code:
17632 la $4,foo
17633 .skip 1020
17634 .align 2
17635 foo:
17636 In this case when the la is extended, foo is 0x3fc bytes
17637 away, so the la can be shrunk, but then foo is 0x400 away, so
17638 the la must be extended. To avoid this loop, we mark the
17639 frag as extended if it was small, and is about to become
17640 extended with a value of maxtiny + 1. */
17641 if (val == ((maxtiny + 1) << op->shift)
17642 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17643 && sec == NULL)
17644 {
17645 fragp->fr_subtype =
17646 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17647 return 1;
17648 }
17649 }
17650 else if (symsec != absolute_section && sec != NULL)
17651 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17652
17653 if ((val & ((1 << op->shift) - 1)) != 0
17654 || val < (mintiny << op->shift)
17655 || val > (maxtiny << op->shift))
17656 return 1;
17657 else
17658 return 0;
17659 }
17660
17661 /* Compute the length of a branch sequence, and adjust the
17662 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
17663 worst-case length is computed, with UPDATE being used to indicate
17664 whether an unconditional (-1), branch-likely (+1) or regular (0)
17665 branch is to be computed. */
17666 static int
17667 relaxed_branch_length (fragS *fragp, asection *sec, int update)
17668 {
17669 bfd_boolean toofar;
17670 int length;
17671
17672 if (fragp
17673 && S_IS_DEFINED (fragp->fr_symbol)
17674 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17675 {
17676 addressT addr;
17677 offsetT val;
17678
17679 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17680
17681 addr = fragp->fr_address + fragp->fr_fix + 4;
17682
17683 val -= addr;
17684
17685 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17686 }
17687 else if (fragp)
17688 /* If the symbol is not defined or it's in a different segment,
17689 assume the user knows what's going on and emit a short
17690 branch. */
17691 toofar = FALSE;
17692 else
17693 toofar = TRUE;
17694
17695 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17696 fragp->fr_subtype
17697 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17698 RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17699 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17700 RELAX_BRANCH_LINK (fragp->fr_subtype),
17701 toofar);
17702
17703 length = 4;
17704 if (toofar)
17705 {
17706 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17707 length += 8;
17708
17709 if (mips_pic != NO_PIC)
17710 {
17711 /* Additional space for PIC loading of target address. */
17712 length += 8;
17713 if (mips_opts.isa == ISA_MIPS1)
17714 /* Additional space for $at-stabilizing nop. */
17715 length += 4;
17716 }
17717
17718 /* If branch is conditional. */
17719 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17720 length += 8;
17721 }
17722
17723 return length;
17724 }
17725
17726 /* Compute the length of a branch sequence, and adjust the
17727 RELAX_MICROMIPS_TOOFAR32 bit accordingly. If FRAGP is NULL, the
17728 worst-case length is computed, with UPDATE being used to indicate
17729 whether an unconditional (-1), or regular (0) branch is to be
17730 computed. */
17731
17732 static int
17733 relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17734 {
17735 bfd_boolean toofar;
17736 int length;
17737
17738 if (fragp
17739 && S_IS_DEFINED (fragp->fr_symbol)
17740 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17741 {
17742 addressT addr;
17743 offsetT val;
17744
17745 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17746 /* Ignore the low bit in the target, since it will be set
17747 for a text label. */
17748 if ((val & 1) != 0)
17749 --val;
17750
17751 addr = fragp->fr_address + fragp->fr_fix + 4;
17752
17753 val -= addr;
17754
17755 toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17756 }
17757 else if (fragp)
17758 /* If the symbol is not defined or it's in a different segment,
17759 assume the user knows what's going on and emit a short
17760 branch. */
17761 toofar = FALSE;
17762 else
17763 toofar = TRUE;
17764
17765 if (fragp && update
17766 && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17767 fragp->fr_subtype = (toofar
17768 ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17769 : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17770
17771 length = 4;
17772 if (toofar)
17773 {
17774 bfd_boolean compact_known = fragp != NULL;
17775 bfd_boolean compact = FALSE;
17776 bfd_boolean uncond;
17777
17778 if (compact_known)
17779 compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17780 if (fragp)
17781 uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17782 else
17783 uncond = update < 0;
17784
17785 /* If label is out of range, we turn branch <br>:
17786
17787 <br> label # 4 bytes
17788 0:
17789
17790 into:
17791
17792 j label # 4 bytes
17793 nop # 2 bytes if compact && !PIC
17794 0:
17795 */
17796 if (mips_pic == NO_PIC && (!compact_known || compact))
17797 length += 2;
17798
17799 /* If assembling PIC code, we further turn:
17800
17801 j label # 4 bytes
17802
17803 into:
17804
17805 lw/ld at, %got(label)(gp) # 4 bytes
17806 d/addiu at, %lo(label) # 4 bytes
17807 jr/c at # 2 bytes
17808 */
17809 if (mips_pic != NO_PIC)
17810 length += 6;
17811
17812 /* If branch <br> is conditional, we prepend negated branch <brneg>:
17813
17814 <brneg> 0f # 4 bytes
17815 nop # 2 bytes if !compact
17816 */
17817 if (!uncond)
17818 length += (compact_known && compact) ? 4 : 6;
17819 }
17820
17821 return length;
17822 }
17823
17824 /* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17825 bit accordingly. */
17826
17827 static int
17828 relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17829 {
17830 bfd_boolean toofar;
17831
17832 if (fragp
17833 && S_IS_DEFINED (fragp->fr_symbol)
17834 && sec == S_GET_SEGMENT (fragp->fr_symbol))
17835 {
17836 addressT addr;
17837 offsetT val;
17838 int type;
17839
17840 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17841 /* Ignore the low bit in the target, since it will be set
17842 for a text label. */
17843 if ((val & 1) != 0)
17844 --val;
17845
17846 /* Assume this is a 2-byte branch. */
17847 addr = fragp->fr_address + fragp->fr_fix + 2;
17848
17849 /* We try to avoid the infinite loop by not adding 2 more bytes for
17850 long branches. */
17851
17852 val -= addr;
17853
17854 type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17855 if (type == 'D')
17856 toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17857 else if (type == 'E')
17858 toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17859 else
17860 abort ();
17861 }
17862 else
17863 /* If the symbol is not defined or it's in a different segment,
17864 we emit a normal 32-bit branch. */
17865 toofar = TRUE;
17866
17867 if (fragp && update
17868 && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17869 fragp->fr_subtype
17870 = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17871 : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17872
17873 if (toofar)
17874 return 4;
17875
17876 return 2;
17877 }
17878
17879 /* Estimate the size of a frag before relaxing. Unless this is the
17880 mips16, we are not really relaxing here, and the final size is
17881 encoded in the subtype information. For the mips16, we have to
17882 decide whether we are using an extended opcode or not. */
17883
17884 int
17885 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17886 {
17887 int change;
17888
17889 if (RELAX_BRANCH_P (fragp->fr_subtype))
17890 {
17891
17892 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17893
17894 return fragp->fr_var;
17895 }
17896
17897 if (RELAX_MIPS16_P (fragp->fr_subtype))
17898 /* We don't want to modify the EXTENDED bit here; it might get us
17899 into infinite loops. We change it only in mips_relax_frag(). */
17900 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17901
17902 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17903 {
17904 int length = 4;
17905
17906 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17907 length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17908 if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17909 length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17910 fragp->fr_var = length;
17911
17912 return length;
17913 }
17914
17915 if (mips_pic == NO_PIC)
17916 change = nopic_need_relax (fragp->fr_symbol, 0);
17917 else if (mips_pic == SVR4_PIC)
17918 change = pic_need_relax (fragp->fr_symbol, segtype);
17919 else if (mips_pic == VXWORKS_PIC)
17920 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
17921 change = 0;
17922 else
17923 abort ();
17924
17925 if (change)
17926 {
17927 fragp->fr_subtype |= RELAX_USE_SECOND;
17928 return -RELAX_FIRST (fragp->fr_subtype);
17929 }
17930 else
17931 return -RELAX_SECOND (fragp->fr_subtype);
17932 }
17933
17934 /* This is called to see whether a reloc against a defined symbol
17935 should be converted into a reloc against a section. */
17936
17937 int
17938 mips_fix_adjustable (fixS *fixp)
17939 {
17940 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17941 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17942 return 0;
17943
17944 if (fixp->fx_addsy == NULL)
17945 return 1;
17946
17947 /* If symbol SYM is in a mergeable section, relocations of the form
17948 SYM + 0 can usually be made section-relative. The mergeable data
17949 is then identified by the section offset rather than by the symbol.
17950
17951 However, if we're generating REL LO16 relocations, the offset is split
17952 between the LO16 and parterning high part relocation. The linker will
17953 need to recalculate the complete offset in order to correctly identify
17954 the merge data.
17955
17956 The linker has traditionally not looked for the parterning high part
17957 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17958 placed anywhere. Rather than break backwards compatibility by changing
17959 this, it seems better not to force the issue, and instead keep the
17960 original symbol. This will work with either linker behavior. */
17961 if ((lo16_reloc_p (fixp->fx_r_type)
17962 || reloc_needs_lo_p (fixp->fx_r_type))
17963 && HAVE_IN_PLACE_ADDENDS
17964 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17965 return 0;
17966
17967 /* There is no place to store an in-place offset for JALR relocations.
17968 Likewise an in-range offset of limited PC-relative relocations may
17969 overflow the in-place relocatable field if recalculated against the
17970 start address of the symbol's containing section. */
17971 if (HAVE_IN_PLACE_ADDENDS
17972 && (limited_pcrel_reloc_p (fixp->fx_r_type)
17973 || jalr_reloc_p (fixp->fx_r_type)))
17974 return 0;
17975
17976 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17977 to a floating-point stub. The same is true for non-R_MIPS16_26
17978 relocations against MIPS16 functions; in this case, the stub becomes
17979 the function's canonical address.
17980
17981 Floating-point stubs are stored in unique .mips16.call.* or
17982 .mips16.fn.* sections. If a stub T for function F is in section S,
17983 the first relocation in section S must be against F; this is how the
17984 linker determines the target function. All relocations that might
17985 resolve to T must also be against F. We therefore have the following
17986 restrictions, which are given in an intentionally-redundant way:
17987
17988 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17989 symbols.
17990
17991 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17992 if that stub might be used.
17993
17994 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17995 symbols.
17996
17997 4. We cannot reduce a stub's relocations against MIPS16 symbols if
17998 that stub might be used.
17999
18000 There is a further restriction:
18001
18002 5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
18003 R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
18004 targets with in-place addends; the relocation field cannot
18005 encode the low bit.
18006
18007 For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
18008 against a MIPS16 symbol. We deal with (5) by by not reducing any
18009 such relocations on REL targets.
18010
18011 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
18012 relocation against some symbol R, no relocation against R may be
18013 reduced. (Note that this deals with (2) as well as (1) because
18014 relocations against global symbols will never be reduced on ELF
18015 targets.) This approach is a little simpler than trying to detect
18016 stub sections, and gives the "all or nothing" per-symbol consistency
18017 that we have for MIPS16 symbols. */
18018 if (fixp->fx_subsy == NULL
18019 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
18020 || *symbol_get_tc (fixp->fx_addsy)
18021 || (HAVE_IN_PLACE_ADDENDS
18022 && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
18023 && jmp_reloc_p (fixp->fx_r_type))))
18024 return 0;
18025
18026 return 1;
18027 }
18028
18029 /* Translate internal representation of relocation info to BFD target
18030 format. */
18031
18032 arelent **
18033 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
18034 {
18035 static arelent *retval[4];
18036 arelent *reloc;
18037 bfd_reloc_code_real_type code;
18038
18039 memset (retval, 0, sizeof(retval));
18040 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
18041 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
18042 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
18043 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
18044
18045 if (fixp->fx_pcrel)
18046 {
18047 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
18048 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
18049 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
18050 || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
18051 || fixp->fx_r_type == BFD_RELOC_32_PCREL);
18052
18053 /* At this point, fx_addnumber is "symbol offset - pcrel address".
18054 Relocations want only the symbol offset. */
18055 reloc->addend = fixp->fx_addnumber + reloc->address;
18056 }
18057 else
18058 reloc->addend = fixp->fx_addnumber;
18059
18060 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
18061 entry to be used in the relocation's section offset. */
18062 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
18063 {
18064 reloc->address = reloc->addend;
18065 reloc->addend = 0;
18066 }
18067
18068 code = fixp->fx_r_type;
18069
18070 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
18071 if (reloc->howto == NULL)
18072 {
18073 as_bad_where (fixp->fx_file, fixp->fx_line,
18074 _("Can not represent %s relocation in this object file format"),
18075 bfd_get_reloc_code_name (code));
18076 retval[0] = NULL;
18077 }
18078
18079 return retval;
18080 }
18081
18082 /* Relax a machine dependent frag. This returns the amount by which
18083 the current size of the frag should change. */
18084
18085 int
18086 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
18087 {
18088 if (RELAX_BRANCH_P (fragp->fr_subtype))
18089 {
18090 offsetT old_var = fragp->fr_var;
18091
18092 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
18093
18094 return fragp->fr_var - old_var;
18095 }
18096
18097 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18098 {
18099 offsetT old_var = fragp->fr_var;
18100 offsetT new_var = 4;
18101
18102 if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
18103 new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
18104 if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
18105 new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
18106 fragp->fr_var = new_var;
18107
18108 return new_var - old_var;
18109 }
18110
18111 if (! RELAX_MIPS16_P (fragp->fr_subtype))
18112 return 0;
18113
18114 if (mips16_extended_frag (fragp, NULL, stretch))
18115 {
18116 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18117 return 0;
18118 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
18119 return 2;
18120 }
18121 else
18122 {
18123 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18124 return 0;
18125 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
18126 return -2;
18127 }
18128
18129 return 0;
18130 }
18131
18132 /* Convert a machine dependent frag. */
18133
18134 void
18135 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
18136 {
18137 if (RELAX_BRANCH_P (fragp->fr_subtype))
18138 {
18139 char *buf;
18140 unsigned long insn;
18141 expressionS exp;
18142 fixS *fixp;
18143
18144 buf = fragp->fr_literal + fragp->fr_fix;
18145 insn = read_insn (buf);
18146
18147 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
18148 {
18149 /* We generate a fixup instead of applying it right now
18150 because, if there are linker relaxations, we're going to
18151 need the relocations. */
18152 exp.X_op = O_symbol;
18153 exp.X_add_symbol = fragp->fr_symbol;
18154 exp.X_add_number = fragp->fr_offset;
18155
18156 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18157 BFD_RELOC_16_PCREL_S2);
18158 fixp->fx_file = fragp->fr_file;
18159 fixp->fx_line = fragp->fr_line;
18160
18161 buf = write_insn (buf, insn);
18162 }
18163 else
18164 {
18165 int i;
18166
18167 as_warn_where (fragp->fr_file, fragp->fr_line,
18168 _("Relaxed out-of-range branch into a jump"));
18169
18170 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
18171 goto uncond;
18172
18173 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18174 {
18175 /* Reverse the branch. */
18176 switch ((insn >> 28) & 0xf)
18177 {
18178 case 4:
18179 /* bc[0-3][tf]l? instructions can have the condition
18180 reversed by tweaking a single TF bit, and their
18181 opcodes all have 0x4???????. */
18182 gas_assert ((insn & 0xf3e00000) == 0x41000000);
18183 insn ^= 0x00010000;
18184 break;
18185
18186 case 0:
18187 /* bltz 0x04000000 bgez 0x04010000
18188 bltzal 0x04100000 bgezal 0x04110000 */
18189 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
18190 insn ^= 0x00010000;
18191 break;
18192
18193 case 1:
18194 /* beq 0x10000000 bne 0x14000000
18195 blez 0x18000000 bgtz 0x1c000000 */
18196 insn ^= 0x04000000;
18197 break;
18198
18199 default:
18200 abort ();
18201 }
18202 }
18203
18204 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18205 {
18206 /* Clear the and-link bit. */
18207 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
18208
18209 /* bltzal 0x04100000 bgezal 0x04110000
18210 bltzall 0x04120000 bgezall 0x04130000 */
18211 insn &= ~0x00100000;
18212 }
18213
18214 /* Branch over the branch (if the branch was likely) or the
18215 full jump (not likely case). Compute the offset from the
18216 current instruction to branch to. */
18217 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18218 i = 16;
18219 else
18220 {
18221 /* How many bytes in instructions we've already emitted? */
18222 i = buf - fragp->fr_literal - fragp->fr_fix;
18223 /* How many bytes in instructions from here to the end? */
18224 i = fragp->fr_var - i;
18225 }
18226 /* Convert to instruction count. */
18227 i >>= 2;
18228 /* Branch counts from the next instruction. */
18229 i--;
18230 insn |= i;
18231 /* Branch over the jump. */
18232 buf = write_insn (buf, insn);
18233
18234 /* nop */
18235 buf = write_insn (buf, 0);
18236
18237 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
18238 {
18239 /* beql $0, $0, 2f */
18240 insn = 0x50000000;
18241 /* Compute the PC offset from the current instruction to
18242 the end of the variable frag. */
18243 /* How many bytes in instructions we've already emitted? */
18244 i = buf - fragp->fr_literal - fragp->fr_fix;
18245 /* How many bytes in instructions from here to the end? */
18246 i = fragp->fr_var - i;
18247 /* Convert to instruction count. */
18248 i >>= 2;
18249 /* Don't decrement i, because we want to branch over the
18250 delay slot. */
18251 insn |= i;
18252
18253 buf = write_insn (buf, insn);
18254 buf = write_insn (buf, 0);
18255 }
18256
18257 uncond:
18258 if (mips_pic == NO_PIC)
18259 {
18260 /* j or jal. */
18261 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
18262 ? 0x0c000000 : 0x08000000);
18263 exp.X_op = O_symbol;
18264 exp.X_add_symbol = fragp->fr_symbol;
18265 exp.X_add_number = fragp->fr_offset;
18266
18267 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18268 FALSE, BFD_RELOC_MIPS_JMP);
18269 fixp->fx_file = fragp->fr_file;
18270 fixp->fx_line = fragp->fr_line;
18271
18272 buf = write_insn (buf, insn);
18273 }
18274 else
18275 {
18276 unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
18277
18278 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
18279 insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
18280 insn |= at << OP_SH_RT;
18281 exp.X_op = O_symbol;
18282 exp.X_add_symbol = fragp->fr_symbol;
18283 exp.X_add_number = fragp->fr_offset;
18284
18285 if (fragp->fr_offset)
18286 {
18287 exp.X_add_symbol = make_expr_symbol (&exp);
18288 exp.X_add_number = 0;
18289 }
18290
18291 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18292 FALSE, BFD_RELOC_MIPS_GOT16);
18293 fixp->fx_file = fragp->fr_file;
18294 fixp->fx_line = fragp->fr_line;
18295
18296 buf = write_insn (buf, insn);
18297
18298 if (mips_opts.isa == ISA_MIPS1)
18299 /* nop */
18300 buf = write_insn (buf, 0);
18301
18302 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
18303 insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
18304 insn |= at << OP_SH_RS | at << OP_SH_RT;
18305
18306 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp,
18307 FALSE, BFD_RELOC_LO16);
18308 fixp->fx_file = fragp->fr_file;
18309 fixp->fx_line = fragp->fr_line;
18310
18311 buf = write_insn (buf, insn);
18312
18313 /* j(al)r $at. */
18314 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
18315 insn = 0x0000f809;
18316 else
18317 insn = 0x00000008;
18318 insn |= at << OP_SH_RS;
18319
18320 buf = write_insn (buf, insn);
18321 }
18322 }
18323
18324 fragp->fr_fix += fragp->fr_var;
18325 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18326 return;
18327 }
18328
18329 /* Relax microMIPS branches. */
18330 if (RELAX_MICROMIPS_P (fragp->fr_subtype))
18331 {
18332 char *buf = fragp->fr_literal + fragp->fr_fix;
18333 bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
18334 bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
18335 int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
18336 bfd_boolean short_ds;
18337 unsigned long insn;
18338 expressionS exp;
18339 fixS *fixp;
18340
18341 exp.X_op = O_symbol;
18342 exp.X_add_symbol = fragp->fr_symbol;
18343 exp.X_add_number = fragp->fr_offset;
18344
18345 fragp->fr_fix += fragp->fr_var;
18346
18347 /* Handle 16-bit branches that fit or are forced to fit. */
18348 if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
18349 {
18350 /* We generate a fixup instead of applying it right now,
18351 because if there is linker relaxation, we're going to
18352 need the relocations. */
18353 if (type == 'D')
18354 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18355 BFD_RELOC_MICROMIPS_10_PCREL_S1);
18356 else if (type == 'E')
18357 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 2, &exp, TRUE,
18358 BFD_RELOC_MICROMIPS_7_PCREL_S1);
18359 else
18360 abort ();
18361
18362 fixp->fx_file = fragp->fr_file;
18363 fixp->fx_line = fragp->fr_line;
18364
18365 /* These relocations can have an addend that won't fit in
18366 2 octets. */
18367 fixp->fx_no_overflow = 1;
18368
18369 return;
18370 }
18371
18372 /* Handle 32-bit branches that fit or are forced to fit. */
18373 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18374 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18375 {
18376 /* We generate a fixup instead of applying it right now,
18377 because if there is linker relaxation, we're going to
18378 need the relocations. */
18379 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, TRUE,
18380 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18381 fixp->fx_file = fragp->fr_file;
18382 fixp->fx_line = fragp->fr_line;
18383
18384 if (type == 0)
18385 return;
18386 }
18387
18388 /* Relax 16-bit branches to 32-bit branches. */
18389 if (type != 0)
18390 {
18391 insn = read_compressed_insn (buf, 2);
18392
18393 if ((insn & 0xfc00) == 0xcc00) /* b16 */
18394 insn = 0x94000000; /* beq */
18395 else if ((insn & 0xdc00) == 0x8c00) /* beqz16/bnez16 */
18396 {
18397 unsigned long regno;
18398
18399 regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
18400 regno = micromips_to_32_reg_d_map [regno];
18401 insn = ((insn & 0x2000) << 16) | 0x94000000; /* beq/bne */
18402 insn |= regno << MICROMIPSOP_SH_RS;
18403 }
18404 else
18405 abort ();
18406
18407 /* Nothing else to do, just write it out. */
18408 if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
18409 || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
18410 {
18411 buf = write_compressed_insn (buf, insn, 4);
18412 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18413 return;
18414 }
18415 }
18416 else
18417 insn = read_compressed_insn (buf, 4);
18418
18419 /* Relax 32-bit branches to a sequence of instructions. */
18420 as_warn_where (fragp->fr_file, fragp->fr_line,
18421 _("Relaxed out-of-range branch into a jump"));
18422
18423 /* Set the short-delay-slot bit. */
18424 short_ds = al && (insn & 0x02000000) != 0;
18425
18426 if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
18427 {
18428 symbolS *l;
18429
18430 /* Reverse the branch. */
18431 if ((insn & 0xfc000000) == 0x94000000 /* beq */
18432 || (insn & 0xfc000000) == 0xb4000000) /* bne */
18433 insn ^= 0x20000000;
18434 else if ((insn & 0xffe00000) == 0x40000000 /* bltz */
18435 || (insn & 0xffe00000) == 0x40400000 /* bgez */
18436 || (insn & 0xffe00000) == 0x40800000 /* blez */
18437 || (insn & 0xffe00000) == 0x40c00000 /* bgtz */
18438 || (insn & 0xffe00000) == 0x40a00000 /* bnezc */
18439 || (insn & 0xffe00000) == 0x40e00000 /* beqzc */
18440 || (insn & 0xffe00000) == 0x40200000 /* bltzal */
18441 || (insn & 0xffe00000) == 0x40600000 /* bgezal */
18442 || (insn & 0xffe00000) == 0x42200000 /* bltzals */
18443 || (insn & 0xffe00000) == 0x42600000) /* bgezals */
18444 insn ^= 0x00400000;
18445 else if ((insn & 0xffe30000) == 0x43800000 /* bc1f */
18446 || (insn & 0xffe30000) == 0x43a00000 /* bc1t */
18447 || (insn & 0xffe30000) == 0x42800000 /* bc2f */
18448 || (insn & 0xffe30000) == 0x42a00000) /* bc2t */
18449 insn ^= 0x00200000;
18450 else
18451 abort ();
18452
18453 if (al)
18454 {
18455 /* Clear the and-link and short-delay-slot bits. */
18456 gas_assert ((insn & 0xfda00000) == 0x40200000);
18457
18458 /* bltzal 0x40200000 bgezal 0x40600000 */
18459 /* bltzals 0x42200000 bgezals 0x42600000 */
18460 insn &= ~0x02200000;
18461 }
18462
18463 /* Make a label at the end for use with the branch. */
18464 l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18465 micromips_label_inc ();
18466 S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18467
18468 /* Refer to it. */
18469 fixp = fix_new (fragp, buf - fragp->fr_literal, 4, l, 0, TRUE,
18470 BFD_RELOC_MICROMIPS_16_PCREL_S1);
18471 fixp->fx_file = fragp->fr_file;
18472 fixp->fx_line = fragp->fr_line;
18473
18474 /* Branch over the jump. */
18475 buf = write_compressed_insn (buf, insn, 4);
18476 if (!compact)
18477 /* nop */
18478 buf = write_compressed_insn (buf, 0x0c00, 2);
18479 }
18480
18481 if (mips_pic == NO_PIC)
18482 {
18483 unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s */
18484
18485 /* j/jal/jals <sym> R_MICROMIPS_26_S1 */
18486 insn = al ? jal : 0xd4000000;
18487
18488 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18489 BFD_RELOC_MICROMIPS_JMP);
18490 fixp->fx_file = fragp->fr_file;
18491 fixp->fx_line = fragp->fr_line;
18492
18493 buf = write_compressed_insn (buf, insn, 4);
18494 if (compact)
18495 /* nop */
18496 buf = write_compressed_insn (buf, 0x0c00, 2);
18497 }
18498 else
18499 {
18500 unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18501 unsigned long jalr = short_ds ? 0x45e0 : 0x45c0; /* jalr/s */
18502 unsigned long jr = compact ? 0x45a0 : 0x4580; /* jr/c */
18503
18504 /* lw/ld $at, <sym>($gp) R_MICROMIPS_GOT16 */
18505 insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18506 insn |= at << MICROMIPSOP_SH_RT;
18507
18508 if (exp.X_add_number)
18509 {
18510 exp.X_add_symbol = make_expr_symbol (&exp);
18511 exp.X_add_number = 0;
18512 }
18513
18514 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18515 BFD_RELOC_MICROMIPS_GOT16);
18516 fixp->fx_file = fragp->fr_file;
18517 fixp->fx_line = fragp->fr_line;
18518
18519 buf = write_compressed_insn (buf, insn, 4);
18520
18521 /* d/addiu $at, $at, <sym> R_MICROMIPS_LO16 */
18522 insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18523 insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18524
18525 fixp = fix_new_exp (fragp, buf - fragp->fr_literal, 4, &exp, FALSE,
18526 BFD_RELOC_MICROMIPS_LO16);
18527 fixp->fx_file = fragp->fr_file;
18528 fixp->fx_line = fragp->fr_line;
18529
18530 buf = write_compressed_insn (buf, insn, 4);
18531
18532 /* jr/jrc/jalr/jalrs $at */
18533 insn = al ? jalr : jr;
18534 insn |= at << MICROMIPSOP_SH_MJ;
18535
18536 buf = write_compressed_insn (buf, insn, 2);
18537 }
18538
18539 gas_assert (buf == fragp->fr_literal + fragp->fr_fix);
18540 return;
18541 }
18542
18543 if (RELAX_MIPS16_P (fragp->fr_subtype))
18544 {
18545 int type;
18546 const struct mips16_immed_operand *op;
18547 offsetT val;
18548 char *buf;
18549 unsigned int user_length, length;
18550 unsigned long insn;
18551 bfd_boolean ext;
18552
18553 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18554 op = mips16_immed_operands;
18555 while (op->type != type)
18556 ++op;
18557
18558 ext = RELAX_MIPS16_EXTENDED (fragp->fr_subtype);
18559 val = resolve_symbol_value (fragp->fr_symbol);
18560 if (op->pcrel)
18561 {
18562 addressT addr;
18563
18564 addr = fragp->fr_address + fragp->fr_fix;
18565
18566 /* The rules for the base address of a PC relative reloc are
18567 complicated; see mips16_extended_frag. */
18568 if (type == 'p' || type == 'q')
18569 {
18570 addr += 2;
18571 if (ext)
18572 addr += 2;
18573 /* Ignore the low bit in the target, since it will be
18574 set for a text label. */
18575 if ((val & 1) != 0)
18576 --val;
18577 }
18578 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18579 addr -= 4;
18580 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18581 addr -= 2;
18582
18583 addr &= ~ (addressT) ((1 << op->shift) - 1);
18584 val -= addr;
18585
18586 /* Make sure the section winds up with the alignment we have
18587 assumed. */
18588 if (op->shift > 0)
18589 record_alignment (asec, op->shift);
18590 }
18591
18592 if (ext
18593 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18594 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18595 as_warn_where (fragp->fr_file, fragp->fr_line,
18596 _("extended instruction in delay slot"));
18597
18598 buf = fragp->fr_literal + fragp->fr_fix;
18599
18600 insn = read_compressed_insn (buf, 2);
18601 if (ext)
18602 insn |= MIPS16_EXTEND;
18603
18604 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
18605 user_length = 4;
18606 else if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
18607 user_length = 2;
18608 else
18609 user_length = 0;
18610
18611 mips16_immed (fragp->fr_file, fragp->fr_line, type,
18612 BFD_RELOC_UNUSED, val, user_length, &insn);
18613
18614 length = (ext ? 4 : 2);
18615 gas_assert (mips16_opcode_length (insn) == length);
18616 write_compressed_insn (buf, insn, length);
18617 fragp->fr_fix += length;
18618 }
18619 else
18620 {
18621 relax_substateT subtype = fragp->fr_subtype;
18622 bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18623 bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18624 int first, second;
18625 fixS *fixp;
18626
18627 first = RELAX_FIRST (subtype);
18628 second = RELAX_SECOND (subtype);
18629 fixp = (fixS *) fragp->fr_opcode;
18630
18631 /* If the delay slot chosen does not match the size of the instruction,
18632 then emit a warning. */
18633 if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18634 || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18635 {
18636 relax_substateT s;
18637 const char *msg;
18638
18639 s = subtype & (RELAX_DELAY_SLOT_16BIT
18640 | RELAX_DELAY_SLOT_SIZE_FIRST
18641 | RELAX_DELAY_SLOT_SIZE_SECOND);
18642 msg = macro_warning (s);
18643 if (msg != NULL)
18644 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18645 subtype &= ~s;
18646 }
18647
18648 /* Possibly emit a warning if we've chosen the longer option. */
18649 if (use_second == second_longer)
18650 {
18651 relax_substateT s;
18652 const char *msg;
18653
18654 s = (subtype
18655 & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18656 msg = macro_warning (s);
18657 if (msg != NULL)
18658 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18659 subtype &= ~s;
18660 }
18661
18662 /* Go through all the fixups for the first sequence. Disable them
18663 (by marking them as done) if we're going to use the second
18664 sequence instead. */
18665 while (fixp
18666 && fixp->fx_frag == fragp
18667 && fixp->fx_where < fragp->fr_fix - second)
18668 {
18669 if (subtype & RELAX_USE_SECOND)
18670 fixp->fx_done = 1;
18671 fixp = fixp->fx_next;
18672 }
18673
18674 /* Go through the fixups for the second sequence. Disable them if
18675 we're going to use the first sequence, otherwise adjust their
18676 addresses to account for the relaxation. */
18677 while (fixp && fixp->fx_frag == fragp)
18678 {
18679 if (subtype & RELAX_USE_SECOND)
18680 fixp->fx_where -= first;
18681 else
18682 fixp->fx_done = 1;
18683 fixp = fixp->fx_next;
18684 }
18685
18686 /* Now modify the frag contents. */
18687 if (subtype & RELAX_USE_SECOND)
18688 {
18689 char *start;
18690
18691 start = fragp->fr_literal + fragp->fr_fix - first - second;
18692 memmove (start, start + first, second);
18693 fragp->fr_fix -= first;
18694 }
18695 else
18696 fragp->fr_fix -= second;
18697 }
18698 }
18699
18700 /* This function is called after the relocs have been generated.
18701 We've been storing mips16 text labels as odd. Here we convert them
18702 back to even for the convenience of the debugger. */
18703
18704 void
18705 mips_frob_file_after_relocs (void)
18706 {
18707 asymbol **syms;
18708 unsigned int count, i;
18709
18710 syms = bfd_get_outsymbols (stdoutput);
18711 count = bfd_get_symcount (stdoutput);
18712 for (i = 0; i < count; i++, syms++)
18713 if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18714 && ((*syms)->value & 1) != 0)
18715 {
18716 (*syms)->value &= ~1;
18717 /* If the symbol has an odd size, it was probably computed
18718 incorrectly, so adjust that as well. */
18719 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18720 ++elf_symbol (*syms)->internal_elf_sym.st_size;
18721 }
18722 }
18723
18724 /* This function is called whenever a label is defined, including fake
18725 labels instantiated off the dot special symbol. It is used when
18726 handling branch delays; if a branch has a label, we assume we cannot
18727 move it. This also bumps the value of the symbol by 1 in compressed
18728 code. */
18729
18730 static void
18731 mips_record_label (symbolS *sym)
18732 {
18733 segment_info_type *si = seg_info (now_seg);
18734 struct insn_label_list *l;
18735
18736 if (free_insn_labels == NULL)
18737 l = (struct insn_label_list *) xmalloc (sizeof *l);
18738 else
18739 {
18740 l = free_insn_labels;
18741 free_insn_labels = l->next;
18742 }
18743
18744 l->label = sym;
18745 l->next = si->label_list;
18746 si->label_list = l;
18747 }
18748
18749 /* This function is called as tc_frob_label() whenever a label is defined
18750 and adds a DWARF-2 record we only want for true labels. */
18751
18752 void
18753 mips_define_label (symbolS *sym)
18754 {
18755 mips_record_label (sym);
18756 dwarf2_emit_label (sym);
18757 }
18758
18759 /* This function is called by tc_new_dot_label whenever a new dot symbol
18760 is defined. */
18761
18762 void
18763 mips_add_dot_label (symbolS *sym)
18764 {
18765 mips_record_label (sym);
18766 if (mips_assembling_insn && HAVE_CODE_COMPRESSION)
18767 mips_compressed_mark_label (sym);
18768 }
18769 \f
18770 /* Some special processing for a MIPS ELF file. */
18771
18772 void
18773 mips_elf_final_processing (void)
18774 {
18775 /* Write out the register information. */
18776 if (mips_abi != N64_ABI)
18777 {
18778 Elf32_RegInfo s;
18779
18780 s.ri_gprmask = mips_gprmask;
18781 s.ri_cprmask[0] = mips_cprmask[0];
18782 s.ri_cprmask[1] = mips_cprmask[1];
18783 s.ri_cprmask[2] = mips_cprmask[2];
18784 s.ri_cprmask[3] = mips_cprmask[3];
18785 /* The gp_value field is set by the MIPS ELF backend. */
18786
18787 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18788 ((Elf32_External_RegInfo *)
18789 mips_regmask_frag));
18790 }
18791 else
18792 {
18793 Elf64_Internal_RegInfo s;
18794
18795 s.ri_gprmask = mips_gprmask;
18796 s.ri_pad = 0;
18797 s.ri_cprmask[0] = mips_cprmask[0];
18798 s.ri_cprmask[1] = mips_cprmask[1];
18799 s.ri_cprmask[2] = mips_cprmask[2];
18800 s.ri_cprmask[3] = mips_cprmask[3];
18801 /* The gp_value field is set by the MIPS ELF backend. */
18802
18803 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18804 ((Elf64_External_RegInfo *)
18805 mips_regmask_frag));
18806 }
18807
18808 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
18809 sort of BFD interface for this. */
18810 if (mips_any_noreorder)
18811 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18812 if (mips_pic != NO_PIC)
18813 {
18814 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18815 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18816 }
18817 if (mips_abicalls)
18818 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18819
18820 /* Set MIPS ELF flags for ASEs. Note that not all ASEs have flags
18821 defined at present; this might need to change in future. */
18822 if (file_ase_mips16)
18823 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18824 if (file_ase_micromips)
18825 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18826 if (file_ase & ASE_MDMX)
18827 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18828
18829 /* Set the MIPS ELF ABI flags. */
18830 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18831 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18832 else if (mips_abi == O64_ABI)
18833 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18834 else if (mips_abi == EABI_ABI)
18835 {
18836 if (!file_mips_gp32)
18837 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18838 else
18839 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18840 }
18841 else if (mips_abi == N32_ABI)
18842 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18843
18844 /* Nothing to do for N64_ABI. */
18845
18846 if (mips_32bitmode)
18847 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18848
18849 #if 0 /* XXX FIXME */
18850 /* 32 bit code with 64 bit FP registers. */
18851 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18852 elf_elfheader (stdoutput)->e_flags |= ???;
18853 #endif
18854 }
18855 \f
18856 typedef struct proc {
18857 symbolS *func_sym;
18858 symbolS *func_end_sym;
18859 unsigned long reg_mask;
18860 unsigned long reg_offset;
18861 unsigned long fpreg_mask;
18862 unsigned long fpreg_offset;
18863 unsigned long frame_offset;
18864 unsigned long frame_reg;
18865 unsigned long pc_reg;
18866 } procS;
18867
18868 static procS cur_proc;
18869 static procS *cur_proc_ptr;
18870 static int numprocs;
18871
18872 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1", a microMIPS nop
18873 as "2", and a normal nop as "0". */
18874
18875 #define NOP_OPCODE_MIPS 0
18876 #define NOP_OPCODE_MIPS16 1
18877 #define NOP_OPCODE_MICROMIPS 2
18878
18879 char
18880 mips_nop_opcode (void)
18881 {
18882 if (seg_info (now_seg)->tc_segment_info_data.micromips)
18883 return NOP_OPCODE_MICROMIPS;
18884 else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18885 return NOP_OPCODE_MIPS16;
18886 else
18887 return NOP_OPCODE_MIPS;
18888 }
18889
18890 /* Fill in an rs_align_code fragment. Unlike elsewhere we want to use
18891 32-bit microMIPS NOPs here (if applicable). */
18892
18893 void
18894 mips_handle_align (fragS *fragp)
18895 {
18896 char nop_opcode;
18897 char *p;
18898 int bytes, size, excess;
18899 valueT opcode;
18900
18901 if (fragp->fr_type != rs_align_code)
18902 return;
18903
18904 p = fragp->fr_literal + fragp->fr_fix;
18905 nop_opcode = *p;
18906 switch (nop_opcode)
18907 {
18908 case NOP_OPCODE_MICROMIPS:
18909 opcode = micromips_nop32_insn.insn_opcode;
18910 size = 4;
18911 break;
18912 case NOP_OPCODE_MIPS16:
18913 opcode = mips16_nop_insn.insn_opcode;
18914 size = 2;
18915 break;
18916 case NOP_OPCODE_MIPS:
18917 default:
18918 opcode = nop_insn.insn_opcode;
18919 size = 4;
18920 break;
18921 }
18922
18923 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18924 excess = bytes % size;
18925
18926 /* Handle the leading part if we're not inserting a whole number of
18927 instructions, and make it the end of the fixed part of the frag.
18928 Try to fit in a short microMIPS NOP if applicable and possible,
18929 and use zeroes otherwise. */
18930 gas_assert (excess < 4);
18931 fragp->fr_fix += excess;
18932 switch (excess)
18933 {
18934 case 3:
18935 *p++ = '\0';
18936 /* Fall through. */
18937 case 2:
18938 if (nop_opcode == NOP_OPCODE_MICROMIPS && !mips_opts.insn32)
18939 {
18940 p = write_compressed_insn (p, micromips_nop16_insn.insn_opcode, 2);
18941 break;
18942 }
18943 *p++ = '\0';
18944 /* Fall through. */
18945 case 1:
18946 *p++ = '\0';
18947 /* Fall through. */
18948 case 0:
18949 break;
18950 }
18951
18952 md_number_to_chars (p, opcode, size);
18953 fragp->fr_var = size;
18954 }
18955
18956 static void
18957 md_obj_begin (void)
18958 {
18959 }
18960
18961 static void
18962 md_obj_end (void)
18963 {
18964 /* Check for premature end, nesting errors, etc. */
18965 if (cur_proc_ptr)
18966 as_warn (_("missing .end at end of assembly"));
18967 }
18968
18969 static long
18970 get_number (void)
18971 {
18972 int negative = 0;
18973 long val = 0;
18974
18975 if (*input_line_pointer == '-')
18976 {
18977 ++input_line_pointer;
18978 negative = 1;
18979 }
18980 if (!ISDIGIT (*input_line_pointer))
18981 as_bad (_("expected simple number"));
18982 if (input_line_pointer[0] == '0')
18983 {
18984 if (input_line_pointer[1] == 'x')
18985 {
18986 input_line_pointer += 2;
18987 while (ISXDIGIT (*input_line_pointer))
18988 {
18989 val <<= 4;
18990 val |= hex_value (*input_line_pointer++);
18991 }
18992 return negative ? -val : val;
18993 }
18994 else
18995 {
18996 ++input_line_pointer;
18997 while (ISDIGIT (*input_line_pointer))
18998 {
18999 val <<= 3;
19000 val |= *input_line_pointer++ - '0';
19001 }
19002 return negative ? -val : val;
19003 }
19004 }
19005 if (!ISDIGIT (*input_line_pointer))
19006 {
19007 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
19008 *input_line_pointer, *input_line_pointer);
19009 as_warn (_("invalid number"));
19010 return -1;
19011 }
19012 while (ISDIGIT (*input_line_pointer))
19013 {
19014 val *= 10;
19015 val += *input_line_pointer++ - '0';
19016 }
19017 return negative ? -val : val;
19018 }
19019
19020 /* The .file directive; just like the usual .file directive, but there
19021 is an initial number which is the ECOFF file index. In the non-ECOFF
19022 case .file implies DWARF-2. */
19023
19024 static void
19025 s_mips_file (int x ATTRIBUTE_UNUSED)
19026 {
19027 static int first_file_directive = 0;
19028
19029 if (ECOFF_DEBUGGING)
19030 {
19031 get_number ();
19032 s_app_file (0);
19033 }
19034 else
19035 {
19036 char *filename;
19037
19038 filename = dwarf2_directive_file (0);
19039
19040 /* Versions of GCC up to 3.1 start files with a ".file"
19041 directive even for stabs output. Make sure that this
19042 ".file" is handled. Note that you need a version of GCC
19043 after 3.1 in order to support DWARF-2 on MIPS. */
19044 if (filename != NULL && ! first_file_directive)
19045 {
19046 (void) new_logical_line (filename, -1);
19047 s_app_file_string (filename, 0);
19048 }
19049 first_file_directive = 1;
19050 }
19051 }
19052
19053 /* The .loc directive, implying DWARF-2. */
19054
19055 static void
19056 s_mips_loc (int x ATTRIBUTE_UNUSED)
19057 {
19058 if (!ECOFF_DEBUGGING)
19059 dwarf2_directive_loc (0);
19060 }
19061
19062 /* The .end directive. */
19063
19064 static void
19065 s_mips_end (int x ATTRIBUTE_UNUSED)
19066 {
19067 symbolS *p;
19068
19069 /* Following functions need their own .frame and .cprestore directives. */
19070 mips_frame_reg_valid = 0;
19071 mips_cprestore_valid = 0;
19072
19073 if (!is_end_of_line[(unsigned char) *input_line_pointer])
19074 {
19075 p = get_symbol ();
19076 demand_empty_rest_of_line ();
19077 }
19078 else
19079 p = NULL;
19080
19081 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19082 as_warn (_(".end not in text section"));
19083
19084 if (!cur_proc_ptr)
19085 {
19086 as_warn (_(".end directive without a preceding .ent directive."));
19087 demand_empty_rest_of_line ();
19088 return;
19089 }
19090
19091 if (p != NULL)
19092 {
19093 gas_assert (S_GET_NAME (p));
19094 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
19095 as_warn (_(".end symbol does not match .ent symbol."));
19096
19097 if (debug_type == DEBUG_STABS)
19098 stabs_generate_asm_endfunc (S_GET_NAME (p),
19099 S_GET_NAME (p));
19100 }
19101 else
19102 as_warn (_(".end directive missing or unknown symbol"));
19103
19104 /* Create an expression to calculate the size of the function. */
19105 if (p && cur_proc_ptr)
19106 {
19107 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
19108 expressionS *exp = xmalloc (sizeof (expressionS));
19109
19110 obj->size = exp;
19111 exp->X_op = O_subtract;
19112 exp->X_add_symbol = symbol_temp_new_now ();
19113 exp->X_op_symbol = p;
19114 exp->X_add_number = 0;
19115
19116 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
19117 }
19118
19119 /* Generate a .pdr section. */
19120 if (!ECOFF_DEBUGGING && mips_flag_pdr)
19121 {
19122 segT saved_seg = now_seg;
19123 subsegT saved_subseg = now_subseg;
19124 expressionS exp;
19125 char *fragp;
19126
19127 #ifdef md_flush_pending_output
19128 md_flush_pending_output ();
19129 #endif
19130
19131 gas_assert (pdr_seg);
19132 subseg_set (pdr_seg, 0);
19133
19134 /* Write the symbol. */
19135 exp.X_op = O_symbol;
19136 exp.X_add_symbol = p;
19137 exp.X_add_number = 0;
19138 emit_expr (&exp, 4);
19139
19140 fragp = frag_more (7 * 4);
19141
19142 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
19143 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
19144 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
19145 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
19146 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
19147 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
19148 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
19149
19150 subseg_set (saved_seg, saved_subseg);
19151 }
19152
19153 cur_proc_ptr = NULL;
19154 }
19155
19156 /* The .aent and .ent directives. */
19157
19158 static void
19159 s_mips_ent (int aent)
19160 {
19161 symbolS *symbolP;
19162
19163 symbolP = get_symbol ();
19164 if (*input_line_pointer == ',')
19165 ++input_line_pointer;
19166 SKIP_WHITESPACE ();
19167 if (ISDIGIT (*input_line_pointer)
19168 || *input_line_pointer == '-')
19169 get_number ();
19170
19171 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
19172 as_warn (_(".ent or .aent not in text section."));
19173
19174 if (!aent && cur_proc_ptr)
19175 as_warn (_("missing .end"));
19176
19177 if (!aent)
19178 {
19179 /* This function needs its own .frame and .cprestore directives. */
19180 mips_frame_reg_valid = 0;
19181 mips_cprestore_valid = 0;
19182
19183 cur_proc_ptr = &cur_proc;
19184 memset (cur_proc_ptr, '\0', sizeof (procS));
19185
19186 cur_proc_ptr->func_sym = symbolP;
19187
19188 ++numprocs;
19189
19190 if (debug_type == DEBUG_STABS)
19191 stabs_generate_asm_func (S_GET_NAME (symbolP),
19192 S_GET_NAME (symbolP));
19193 }
19194
19195 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
19196
19197 demand_empty_rest_of_line ();
19198 }
19199
19200 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
19201 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
19202 s_mips_frame is used so that we can set the PDR information correctly.
19203 We can't use the ecoff routines because they make reference to the ecoff
19204 symbol table (in the mdebug section). */
19205
19206 static void
19207 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
19208 {
19209 if (ECOFF_DEBUGGING)
19210 s_ignore (ignore);
19211 else
19212 {
19213 long val;
19214
19215 if (cur_proc_ptr == (procS *) NULL)
19216 {
19217 as_warn (_(".frame outside of .ent"));
19218 demand_empty_rest_of_line ();
19219 return;
19220 }
19221
19222 cur_proc_ptr->frame_reg = tc_get_register (1);
19223
19224 SKIP_WHITESPACE ();
19225 if (*input_line_pointer++ != ','
19226 || get_absolute_expression_and_terminator (&val) != ',')
19227 {
19228 as_warn (_("Bad .frame directive"));
19229 --input_line_pointer;
19230 demand_empty_rest_of_line ();
19231 return;
19232 }
19233
19234 cur_proc_ptr->frame_offset = val;
19235 cur_proc_ptr->pc_reg = tc_get_register (0);
19236
19237 demand_empty_rest_of_line ();
19238 }
19239 }
19240
19241 /* The .fmask and .mask directives. If the mdebug section is present
19242 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
19243 embedded targets, s_mips_mask is used so that we can set the PDR
19244 information correctly. We can't use the ecoff routines because they
19245 make reference to the ecoff symbol table (in the mdebug section). */
19246
19247 static void
19248 s_mips_mask (int reg_type)
19249 {
19250 if (ECOFF_DEBUGGING)
19251 s_ignore (reg_type);
19252 else
19253 {
19254 long mask, off;
19255
19256 if (cur_proc_ptr == (procS *) NULL)
19257 {
19258 as_warn (_(".mask/.fmask outside of .ent"));
19259 demand_empty_rest_of_line ();
19260 return;
19261 }
19262
19263 if (get_absolute_expression_and_terminator (&mask) != ',')
19264 {
19265 as_warn (_("Bad .mask/.fmask directive"));
19266 --input_line_pointer;
19267 demand_empty_rest_of_line ();
19268 return;
19269 }
19270
19271 off = get_absolute_expression ();
19272
19273 if (reg_type == 'F')
19274 {
19275 cur_proc_ptr->fpreg_mask = mask;
19276 cur_proc_ptr->fpreg_offset = off;
19277 }
19278 else
19279 {
19280 cur_proc_ptr->reg_mask = mask;
19281 cur_proc_ptr->reg_offset = off;
19282 }
19283
19284 demand_empty_rest_of_line ();
19285 }
19286 }
19287
19288 /* A table describing all the processors gas knows about. Names are
19289 matched in the order listed.
19290
19291 To ease comparison, please keep this table in the same order as
19292 gcc's mips_cpu_info_table[]. */
19293 static const struct mips_cpu_info mips_cpu_info_table[] =
19294 {
19295 /* Entries for generic ISAs */
19296 { "mips1", MIPS_CPU_IS_ISA, 0, ISA_MIPS1, CPU_R3000 },
19297 { "mips2", MIPS_CPU_IS_ISA, 0, ISA_MIPS2, CPU_R6000 },
19298 { "mips3", MIPS_CPU_IS_ISA, 0, ISA_MIPS3, CPU_R4000 },
19299 { "mips4", MIPS_CPU_IS_ISA, 0, ISA_MIPS4, CPU_R8000 },
19300 { "mips5", MIPS_CPU_IS_ISA, 0, ISA_MIPS5, CPU_MIPS5 },
19301 { "mips32", MIPS_CPU_IS_ISA, 0, ISA_MIPS32, CPU_MIPS32 },
19302 { "mips32r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19303 { "mips64", MIPS_CPU_IS_ISA, 0, ISA_MIPS64, CPU_MIPS64 },
19304 { "mips64r2", MIPS_CPU_IS_ISA, 0, ISA_MIPS64R2, CPU_MIPS64R2 },
19305
19306 /* MIPS I */
19307 { "r3000", 0, 0, ISA_MIPS1, CPU_R3000 },
19308 { "r2000", 0, 0, ISA_MIPS1, CPU_R3000 },
19309 { "r3900", 0, 0, ISA_MIPS1, CPU_R3900 },
19310
19311 /* MIPS II */
19312 { "r6000", 0, 0, ISA_MIPS2, CPU_R6000 },
19313
19314 /* MIPS III */
19315 { "r4000", 0, 0, ISA_MIPS3, CPU_R4000 },
19316 { "r4010", 0, 0, ISA_MIPS2, CPU_R4010 },
19317 { "vr4100", 0, 0, ISA_MIPS3, CPU_VR4100 },
19318 { "vr4111", 0, 0, ISA_MIPS3, CPU_R4111 },
19319 { "vr4120", 0, 0, ISA_MIPS3, CPU_VR4120 },
19320 { "vr4130", 0, 0, ISA_MIPS3, CPU_VR4120 },
19321 { "vr4181", 0, 0, ISA_MIPS3, CPU_R4111 },
19322 { "vr4300", 0, 0, ISA_MIPS3, CPU_R4300 },
19323 { "r4400", 0, 0, ISA_MIPS3, CPU_R4400 },
19324 { "r4600", 0, 0, ISA_MIPS3, CPU_R4600 },
19325 { "orion", 0, 0, ISA_MIPS3, CPU_R4600 },
19326 { "r4650", 0, 0, ISA_MIPS3, CPU_R4650 },
19327 { "r5900", 0, 0, ISA_MIPS3, CPU_R5900 },
19328 /* ST Microelectronics Loongson 2E and 2F cores */
19329 { "loongson2e", 0, 0, ISA_MIPS3, CPU_LOONGSON_2E },
19330 { "loongson2f", 0, 0, ISA_MIPS3, CPU_LOONGSON_2F },
19331
19332 /* MIPS IV */
19333 { "r8000", 0, 0, ISA_MIPS4, CPU_R8000 },
19334 { "r10000", 0, 0, ISA_MIPS4, CPU_R10000 },
19335 { "r12000", 0, 0, ISA_MIPS4, CPU_R12000 },
19336 { "r14000", 0, 0, ISA_MIPS4, CPU_R14000 },
19337 { "r16000", 0, 0, ISA_MIPS4, CPU_R16000 },
19338 { "vr5000", 0, 0, ISA_MIPS4, CPU_R5000 },
19339 { "vr5400", 0, 0, ISA_MIPS4, CPU_VR5400 },
19340 { "vr5500", 0, 0, ISA_MIPS4, CPU_VR5500 },
19341 { "rm5200", 0, 0, ISA_MIPS4, CPU_R5000 },
19342 { "rm5230", 0, 0, ISA_MIPS4, CPU_R5000 },
19343 { "rm5231", 0, 0, ISA_MIPS4, CPU_R5000 },
19344 { "rm5261", 0, 0, ISA_MIPS4, CPU_R5000 },
19345 { "rm5721", 0, 0, ISA_MIPS4, CPU_R5000 },
19346 { "rm7000", 0, 0, ISA_MIPS4, CPU_RM7000 },
19347 { "rm9000", 0, 0, ISA_MIPS4, CPU_RM9000 },
19348
19349 /* MIPS 32 */
19350 { "4kc", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19351 { "4km", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19352 { "4kp", 0, 0, ISA_MIPS32, CPU_MIPS32 },
19353 { "4ksc", 0, ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
19354
19355 /* MIPS 32 Release 2 */
19356 { "4kec", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19357 { "4kem", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19358 { "4kep", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19359 { "4ksd", 0, ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
19360 { "m4k", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19361 { "m4kp", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19362 { "m14k", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19363 { "m14kc", 0, ASE_MCU, ISA_MIPS32R2, CPU_MIPS32R2 },
19364 { "m14ke", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19365 ISA_MIPS32R2, CPU_MIPS32R2 },
19366 { "m14kec", 0, ASE_DSP | ASE_DSPR2 | ASE_MCU,
19367 ISA_MIPS32R2, CPU_MIPS32R2 },
19368 { "24kc", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19369 { "24kf2_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19370 { "24kf", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19371 { "24kf1_1", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19372 /* Deprecated forms of the above. */
19373 { "24kfx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19374 { "24kx", 0, 0, ISA_MIPS32R2, CPU_MIPS32R2 },
19375 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
19376 { "24kec", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19377 { "24kef2_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19378 { "24kef", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19379 { "24kef1_1", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19380 /* Deprecated forms of the above. */
19381 { "24kefx", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19382 { "24kex", 0, ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
19383 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
19384 { "34kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19385 { "34kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19386 { "34kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19387 { "34kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19388 /* Deprecated forms of the above. */
19389 { "34kfx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19390 { "34kx", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19391 /* 34Kn is a 34kc without DSP. */
19392 { "34kn", 0, ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19393 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
19394 { "74kc", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19395 { "74kf2_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19396 { "74kf", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19397 { "74kf1_1", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19398 { "74kf3_2", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19399 /* Deprecated forms of the above. */
19400 { "74kfx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19401 { "74kx", 0, ASE_DSP | ASE_DSPR2, ISA_MIPS32R2, CPU_MIPS32R2 },
19402 /* 1004K cores are multiprocessor versions of the 34K. */
19403 { "1004kc", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19404 { "1004kf2_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19405 { "1004kf", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19406 { "1004kf1_1", 0, ASE_DSP | ASE_MT, ISA_MIPS32R2, CPU_MIPS32R2 },
19407
19408 /* MIPS 64 */
19409 { "5kc", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19410 { "5kf", 0, 0, ISA_MIPS64, CPU_MIPS64 },
19411 { "20kc", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19412 { "25kf", 0, ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
19413
19414 /* Broadcom SB-1 CPU core */
19415 { "sb1", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19416 /* Broadcom SB-1A CPU core */
19417 { "sb1a", 0, ASE_MIPS3D | ASE_MDMX, ISA_MIPS64, CPU_SB1 },
19418
19419 { "loongson3a", 0, 0, ISA_MIPS64, CPU_LOONGSON_3A },
19420
19421 /* MIPS 64 Release 2 */
19422
19423 /* Cavium Networks Octeon CPU core */
19424 { "octeon", 0, 0, ISA_MIPS64R2, CPU_OCTEON },
19425 { "octeon+", 0, 0, ISA_MIPS64R2, CPU_OCTEONP },
19426 { "octeon2", 0, 0, ISA_MIPS64R2, CPU_OCTEON2 },
19427
19428 /* RMI Xlr */
19429 { "xlr", 0, 0, ISA_MIPS64, CPU_XLR },
19430
19431 /* Broadcom XLP.
19432 XLP is mostly like XLR, with the prominent exception that it is
19433 MIPS64R2 rather than MIPS64. */
19434 { "xlp", 0, 0, ISA_MIPS64R2, CPU_XLR },
19435
19436 /* End marker */
19437 { NULL, 0, 0, 0, 0 }
19438 };
19439
19440
19441 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19442 with a final "000" replaced by "k". Ignore case.
19443
19444 Note: this function is shared between GCC and GAS. */
19445
19446 static bfd_boolean
19447 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19448 {
19449 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19450 given++, canonical++;
19451
19452 return ((*given == 0 && *canonical == 0)
19453 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19454 }
19455
19456
19457 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19458 CPU name. We've traditionally allowed a lot of variation here.
19459
19460 Note: this function is shared between GCC and GAS. */
19461
19462 static bfd_boolean
19463 mips_matching_cpu_name_p (const char *canonical, const char *given)
19464 {
19465 /* First see if the name matches exactly, or with a final "000"
19466 turned into "k". */
19467 if (mips_strict_matching_cpu_name_p (canonical, given))
19468 return TRUE;
19469
19470 /* If not, try comparing based on numerical designation alone.
19471 See if GIVEN is an unadorned number, or 'r' followed by a number. */
19472 if (TOLOWER (*given) == 'r')
19473 given++;
19474 if (!ISDIGIT (*given))
19475 return FALSE;
19476
19477 /* Skip over some well-known prefixes in the canonical name,
19478 hoping to find a number there too. */
19479 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19480 canonical += 2;
19481 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19482 canonical += 2;
19483 else if (TOLOWER (canonical[0]) == 'r')
19484 canonical += 1;
19485
19486 return mips_strict_matching_cpu_name_p (canonical, given);
19487 }
19488
19489
19490 /* Parse an option that takes the name of a processor as its argument.
19491 OPTION is the name of the option and CPU_STRING is the argument.
19492 Return the corresponding processor enumeration if the CPU_STRING is
19493 recognized, otherwise report an error and return null.
19494
19495 A similar function exists in GCC. */
19496
19497 static const struct mips_cpu_info *
19498 mips_parse_cpu (const char *option, const char *cpu_string)
19499 {
19500 const struct mips_cpu_info *p;
19501
19502 /* 'from-abi' selects the most compatible architecture for the given
19503 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
19504 EABIs, we have to decide whether we're using the 32-bit or 64-bit
19505 version. Look first at the -mgp options, if given, otherwise base
19506 the choice on MIPS_DEFAULT_64BIT.
19507
19508 Treat NO_ABI like the EABIs. One reason to do this is that the
19509 plain 'mips' and 'mips64' configs have 'from-abi' as their default
19510 architecture. This code picks MIPS I for 'mips' and MIPS III for
19511 'mips64', just as we did in the days before 'from-abi'. */
19512 if (strcasecmp (cpu_string, "from-abi") == 0)
19513 {
19514 if (ABI_NEEDS_32BIT_REGS (mips_abi))
19515 return mips_cpu_info_from_isa (ISA_MIPS1);
19516
19517 if (ABI_NEEDS_64BIT_REGS (mips_abi))
19518 return mips_cpu_info_from_isa (ISA_MIPS3);
19519
19520 if (file_mips_gp32 >= 0)
19521 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19522
19523 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19524 ? ISA_MIPS3
19525 : ISA_MIPS1);
19526 }
19527
19528 /* 'default' has traditionally been a no-op. Probably not very useful. */
19529 if (strcasecmp (cpu_string, "default") == 0)
19530 return 0;
19531
19532 for (p = mips_cpu_info_table; p->name != 0; p++)
19533 if (mips_matching_cpu_name_p (p->name, cpu_string))
19534 return p;
19535
19536 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19537 return 0;
19538 }
19539
19540 /* Return the canonical processor information for ISA (a member of the
19541 ISA_MIPS* enumeration). */
19542
19543 static const struct mips_cpu_info *
19544 mips_cpu_info_from_isa (int isa)
19545 {
19546 int i;
19547
19548 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19549 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19550 && isa == mips_cpu_info_table[i].isa)
19551 return (&mips_cpu_info_table[i]);
19552
19553 return NULL;
19554 }
19555
19556 static const struct mips_cpu_info *
19557 mips_cpu_info_from_arch (int arch)
19558 {
19559 int i;
19560
19561 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19562 if (arch == mips_cpu_info_table[i].cpu)
19563 return (&mips_cpu_info_table[i]);
19564
19565 return NULL;
19566 }
19567 \f
19568 static void
19569 show (FILE *stream, const char *string, int *col_p, int *first_p)
19570 {
19571 if (*first_p)
19572 {
19573 fprintf (stream, "%24s", "");
19574 *col_p = 24;
19575 }
19576 else
19577 {
19578 fprintf (stream, ", ");
19579 *col_p += 2;
19580 }
19581
19582 if (*col_p + strlen (string) > 72)
19583 {
19584 fprintf (stream, "\n%24s", "");
19585 *col_p = 24;
19586 }
19587
19588 fprintf (stream, "%s", string);
19589 *col_p += strlen (string);
19590
19591 *first_p = 0;
19592 }
19593
19594 void
19595 md_show_usage (FILE *stream)
19596 {
19597 int column, first;
19598 size_t i;
19599
19600 fprintf (stream, _("\
19601 MIPS options:\n\
19602 -EB generate big endian output\n\
19603 -EL generate little endian output\n\
19604 -g, -g2 do not remove unneeded NOPs or swap branches\n\
19605 -G NUM allow referencing objects up to NUM bytes\n\
19606 implicitly with the gp register [default 8]\n"));
19607 fprintf (stream, _("\
19608 -mips1 generate MIPS ISA I instructions\n\
19609 -mips2 generate MIPS ISA II instructions\n\
19610 -mips3 generate MIPS ISA III instructions\n\
19611 -mips4 generate MIPS ISA IV instructions\n\
19612 -mips5 generate MIPS ISA V instructions\n\
19613 -mips32 generate MIPS32 ISA instructions\n\
19614 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
19615 -mips64 generate MIPS64 ISA instructions\n\
19616 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
19617 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
19618
19619 first = 1;
19620
19621 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19622 show (stream, mips_cpu_info_table[i].name, &column, &first);
19623 show (stream, "from-abi", &column, &first);
19624 fputc ('\n', stream);
19625
19626 fprintf (stream, _("\
19627 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19628 -no-mCPU don't generate code specific to CPU.\n\
19629 For -mCPU and -no-mCPU, CPU must be one of:\n"));
19630
19631 first = 1;
19632
19633 show (stream, "3900", &column, &first);
19634 show (stream, "4010", &column, &first);
19635 show (stream, "4100", &column, &first);
19636 show (stream, "4650", &column, &first);
19637 fputc ('\n', stream);
19638
19639 fprintf (stream, _("\
19640 -mips16 generate mips16 instructions\n\
19641 -no-mips16 do not generate mips16 instructions\n"));
19642 fprintf (stream, _("\
19643 -mmicromips generate microMIPS instructions\n\
19644 -mno-micromips do not generate microMIPS instructions\n"));
19645 fprintf (stream, _("\
19646 -msmartmips generate smartmips instructions\n\
19647 -mno-smartmips do not generate smartmips instructions\n"));
19648 fprintf (stream, _("\
19649 -mdsp generate DSP instructions\n\
19650 -mno-dsp do not generate DSP instructions\n"));
19651 fprintf (stream, _("\
19652 -mdspr2 generate DSP R2 instructions\n\
19653 -mno-dspr2 do not generate DSP R2 instructions\n"));
19654 fprintf (stream, _("\
19655 -mmt generate MT instructions\n\
19656 -mno-mt do not generate MT instructions\n"));
19657 fprintf (stream, _("\
19658 -mmcu generate MCU instructions\n\
19659 -mno-mcu do not generate MCU instructions\n"));
19660 fprintf (stream, _("\
19661 -mvirt generate Virtualization instructions\n\
19662 -mno-virt do not generate Virtualization instructions\n"));
19663 fprintf (stream, _("\
19664 -minsn32 only generate 32-bit microMIPS instructions\n\
19665 -mno-insn32 generate all microMIPS instructions\n"));
19666 fprintf (stream, _("\
19667 -mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
19668 -mfix-loongson2f-nop work around Loongson2F NOP errata\n\
19669 -mfix-vr4120 work around certain VR4120 errata\n\
19670 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
19671 -mfix-24k insert a nop after ERET and DERET instructions\n\
19672 -mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
19673 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
19674 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
19675 -msym32 assume all symbols have 32-bit values\n\
19676 -O0 remove unneeded NOPs, do not swap branches\n\
19677 -O remove unneeded NOPs and swap branches\n\
19678 --trap, --no-break trap exception on div by 0 and mult overflow\n\
19679 --break, --no-trap break exception on div by 0 and mult overflow\n"));
19680 fprintf (stream, _("\
19681 -mhard-float allow floating-point instructions\n\
19682 -msoft-float do not allow floating-point instructions\n\
19683 -msingle-float only allow 32-bit floating-point operations\n\
19684 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
19685 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
19686 --[no-]relax-branch [dis]allow out-of-range branches to be relaxed\n"
19687 ));
19688 fprintf (stream, _("\
19689 -KPIC, -call_shared generate SVR4 position independent code\n\
19690 -call_nonpic generate non-PIC code that can operate with DSOs\n\
19691 -mvxworks-pic generate VxWorks position independent code\n\
19692 -non_shared do not generate code that can operate with DSOs\n\
19693 -xgot assume a 32 bit GOT\n\
19694 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
19695 -mshared, -mno-shared disable/enable .cpload optimization for\n\
19696 position dependent (non shared) code\n\
19697 -mabi=ABI create ABI conformant object file for:\n"));
19698
19699 first = 1;
19700
19701 show (stream, "32", &column, &first);
19702 show (stream, "o64", &column, &first);
19703 show (stream, "n32", &column, &first);
19704 show (stream, "64", &column, &first);
19705 show (stream, "eabi", &column, &first);
19706
19707 fputc ('\n', stream);
19708
19709 fprintf (stream, _("\
19710 -32 create o32 ABI object file (default)\n\
19711 -n32 create n32 ABI object file\n\
19712 -64 create 64 ABI object file\n"));
19713 }
19714
19715 #ifdef TE_IRIX
19716 enum dwarf2_format
19717 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19718 {
19719 if (HAVE_64BIT_SYMBOLS)
19720 return dwarf2_format_64bit_irix;
19721 else
19722 return dwarf2_format_32bit;
19723 }
19724 #endif
19725
19726 int
19727 mips_dwarf2_addr_size (void)
19728 {
19729 if (HAVE_64BIT_OBJECTS)
19730 return 8;
19731 else
19732 return 4;
19733 }
19734
19735 /* Standard calling conventions leave the CFA at SP on entry. */
19736 void
19737 mips_cfi_frame_initial_instructions (void)
19738 {
19739 cfi_add_CFA_def_cfa_register (SP);
19740 }
19741
19742 int
19743 tc_mips_regname_to_dw2regnum (char *regname)
19744 {
19745 unsigned int regnum = -1;
19746 unsigned int reg;
19747
19748 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19749 regnum = reg;
19750
19751 return regnum;
19752 }
This page took 0.431977 seconds and 5 git commands to generate.