* config/tc-mips.c (mips_ip): Remove dead format specifier code.
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5 Contributed by the OSF and Ralph Campbell.
6 Written by Keith Knowles and Ralph Campbell, working independently.
7 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8 Support.
9
10 This file is part of GAS.
11
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
24 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25 02110-1301, USA. */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too. */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about. */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections. Off by default on IRIX: the native
78 linker doesn't know about and discards them, but relocations against them
79 remain, leading to rld crashes. */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define ATREG 1
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP 28
99 #define SP 29
100 #define FP 30
101 #define RA 31
102
103 #define ILLEGAL_REG (32)
104
105 #define AT mips_opts.at
106
107 /* Allow override of standard little-endian ECOFF format. */
108
109 #ifndef ECOFF_LITTLE_FORMAT
110 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111 #endif
112
113 extern int target_big_endian;
114
115 /* The name of the readonly data section. */
116 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117 ? ".rdata" \
118 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119 ? ".rdata" \
120 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121 ? ".rodata" \
122 : (abort (), ""))
123
124 /* Information about an instruction, including its format, operands
125 and fixups. */
126 struct mips_cl_insn
127 {
128 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
129 const struct mips_opcode *insn_mo;
130
131 /* True if this is a mips16 instruction and if we want the extended
132 form of INSN_MO. */
133 bfd_boolean use_extend;
134
135 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
136 unsigned short extend;
137
138 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
139 a copy of INSN_MO->match with the operands filled in. */
140 unsigned long insn_opcode;
141
142 /* The frag that contains the instruction. */
143 struct frag *frag;
144
145 /* The offset into FRAG of the first instruction byte. */
146 long where;
147
148 /* The relocs associated with the instruction, if any. */
149 fixS *fixp[3];
150
151 /* True if this entry cannot be moved from its current position. */
152 unsigned int fixed_p : 1;
153
154 /* True if this instruction occurred in a .set noreorder block. */
155 unsigned int noreorder_p : 1;
156
157 /* True for mips16 instructions that jump to an absolute address. */
158 unsigned int mips16_absolute_jump_p : 1;
159 };
160
161 /* The ABI to use. */
162 enum mips_abi_level
163 {
164 NO_ABI = 0,
165 O32_ABI,
166 O64_ABI,
167 N32_ABI,
168 N64_ABI,
169 EABI_ABI
170 };
171
172 /* MIPS ABI we are using for this output file. */
173 static enum mips_abi_level mips_abi = NO_ABI;
174
175 /* Whether or not we have code that can call pic code. */
176 int mips_abicalls = FALSE;
177
178 /* Whether or not we have code which can be put into a shared
179 library. */
180 static bfd_boolean mips_in_shared = TRUE;
181
182 /* This is the set of options which may be modified by the .set
183 pseudo-op. We use a struct so that .set push and .set pop are more
184 reliable. */
185
186 struct mips_set_options
187 {
188 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
189 if it has not been initialized. Changed by `.set mipsN', and the
190 -mipsN command line option, and the default CPU. */
191 int isa;
192 /* Enabled Application Specific Extensions (ASEs). These are set to -1
193 if they have not been initialized. Changed by `.set <asename>', by
194 command line options, and based on the default architecture. */
195 int ase_mips3d;
196 int ase_mdmx;
197 int ase_smartmips;
198 int ase_dsp;
199 int ase_dspr2;
200 int ase_mt;
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 /* Non-zero if we should not reorder instructions. Changed by `.set
207 reorder' and `.set noreorder'. */
208 int noreorder;
209 /* Non-zero if we should not permit the register designated "assembler
210 temporary" to be used in instructions. The value is the register
211 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
212 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
213 unsigned int at;
214 /* Non-zero if we should warn when a macro instruction expands into
215 more than one machine instruction. Changed by `.set nomacro' and
216 `.set macro'. */
217 int warn_about_macros;
218 /* Non-zero if we should not move instructions. Changed by `.set
219 move', `.set volatile', `.set nomove', and `.set novolatile'. */
220 int nomove;
221 /* Non-zero if we should not optimize branches by moving the target
222 of the branch into the delay slot. Actually, we don't perform
223 this optimization anyhow. Changed by `.set bopt' and `.set
224 nobopt'. */
225 int nobopt;
226 /* Non-zero if we should not autoextend mips16 instructions.
227 Changed by `.set autoextend' and `.set noautoextend'. */
228 int noautoextend;
229 /* Restrict general purpose registers and floating point registers
230 to 32 bit. This is initially determined when -mgp32 or -mfp32
231 is passed but can changed if the assembler code uses .set mipsN. */
232 int gp32;
233 int fp32;
234 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
235 command line option, and the default CPU. */
236 int arch;
237 /* True if ".set sym32" is in effect. */
238 bfd_boolean sym32;
239 /* True if floating-point operations are not allowed. Changed by .set
240 softfloat or .set hardfloat, by command line options -msoft-float or
241 -mhard-float. The default is false. */
242 bfd_boolean soft_float;
243
244 /* True if only single-precision floating-point operations are allowed.
245 Changed by .set singlefloat or .set doublefloat, command-line options
246 -msingle-float or -mdouble-float. The default is false. */
247 bfd_boolean single_float;
248 };
249
250 /* This is the struct we use to hold the current set of options. Note
251 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
252 -1 to indicate that they have not been initialized. */
253
254 /* True if -mgp32 was passed. */
255 static int file_mips_gp32 = -1;
256
257 /* True if -mfp32 was passed. */
258 static int file_mips_fp32 = -1;
259
260 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
261 static int file_mips_soft_float = 0;
262
263 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
264 static int file_mips_single_float = 0;
265
266 static struct mips_set_options mips_opts =
267 {
268 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
269 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
270 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
271 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
272 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
273 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
274 };
275
276 /* These variables are filled in with the masks of registers used.
277 The object format code reads them and puts them in the appropriate
278 place. */
279 unsigned long mips_gprmask;
280 unsigned long mips_cprmask[4];
281
282 /* MIPS ISA we are using for this output file. */
283 static int file_mips_isa = ISA_UNKNOWN;
284
285 /* True if any MIPS16 code was produced. */
286 static int file_ase_mips16;
287
288 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
289 || mips_opts.isa == ISA_MIPS32R2 \
290 || mips_opts.isa == ISA_MIPS64 \
291 || mips_opts.isa == ISA_MIPS64R2)
292
293 /* True if we want to create R_MIPS_JALR for jalr $25. */
294 #ifdef TE_IRIX
295 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
296 #else
297 /* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
298 because there's no place for any addend, the only acceptable
299 expression is a bare symbol. */
300 #define MIPS_JALR_HINT_P(EXPR) \
301 (!HAVE_IN_PLACE_ADDENDS \
302 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
303 #endif
304
305 /* True if -mips3d was passed or implied by arguments passed on the
306 command line (e.g., by -march). */
307 static int file_ase_mips3d;
308
309 /* True if -mdmx was passed or implied by arguments passed on the
310 command line (e.g., by -march). */
311 static int file_ase_mdmx;
312
313 /* True if -msmartmips was passed or implied by arguments passed on the
314 command line (e.g., by -march). */
315 static int file_ase_smartmips;
316
317 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
318 || mips_opts.isa == ISA_MIPS32R2)
319
320 /* True if -mdsp was passed or implied by arguments passed on the
321 command line (e.g., by -march). */
322 static int file_ase_dsp;
323
324 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
325 || mips_opts.isa == ISA_MIPS64R2)
326
327 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
328
329 /* True if -mdspr2 was passed or implied by arguments passed on the
330 command line (e.g., by -march). */
331 static int file_ase_dspr2;
332
333 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
334 || mips_opts.isa == ISA_MIPS64R2)
335
336 /* True if -mmt was passed or implied by arguments passed on the
337 command line (e.g., by -march). */
338 static int file_ase_mt;
339
340 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
341 || mips_opts.isa == ISA_MIPS64R2)
342
343 /* The argument of the -march= flag. The architecture we are assembling. */
344 static int file_mips_arch = CPU_UNKNOWN;
345 static const char *mips_arch_string;
346
347 /* The argument of the -mtune= flag. The architecture for which we
348 are optimizing. */
349 static int mips_tune = CPU_UNKNOWN;
350 static const char *mips_tune_string;
351
352 /* True when generating 32-bit code for a 64-bit processor. */
353 static int mips_32bitmode = 0;
354
355 /* True if the given ABI requires 32-bit registers. */
356 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
357
358 /* Likewise 64-bit registers. */
359 #define ABI_NEEDS_64BIT_REGS(ABI) \
360 ((ABI) == N32_ABI \
361 || (ABI) == N64_ABI \
362 || (ABI) == O64_ABI)
363
364 /* Return true if ISA supports 64 bit wide gp registers. */
365 #define ISA_HAS_64BIT_REGS(ISA) \
366 ((ISA) == ISA_MIPS3 \
367 || (ISA) == ISA_MIPS4 \
368 || (ISA) == ISA_MIPS5 \
369 || (ISA) == ISA_MIPS64 \
370 || (ISA) == ISA_MIPS64R2)
371
372 /* Return true if ISA supports 64 bit wide float registers. */
373 #define ISA_HAS_64BIT_FPRS(ISA) \
374 ((ISA) == ISA_MIPS3 \
375 || (ISA) == ISA_MIPS4 \
376 || (ISA) == ISA_MIPS5 \
377 || (ISA) == ISA_MIPS32R2 \
378 || (ISA) == ISA_MIPS64 \
379 || (ISA) == ISA_MIPS64R2)
380
381 /* Return true if ISA supports 64-bit right rotate (dror et al.)
382 instructions. */
383 #define ISA_HAS_DROR(ISA) \
384 ((ISA) == ISA_MIPS64R2)
385
386 /* Return true if ISA supports 32-bit right rotate (ror et al.)
387 instructions. */
388 #define ISA_HAS_ROR(ISA) \
389 ((ISA) == ISA_MIPS32R2 \
390 || (ISA) == ISA_MIPS64R2 \
391 || mips_opts.ase_smartmips)
392
393 /* Return true if ISA supports single-precision floats in odd registers. */
394 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
395 ((ISA) == ISA_MIPS32 \
396 || (ISA) == ISA_MIPS32R2 \
397 || (ISA) == ISA_MIPS64 \
398 || (ISA) == ISA_MIPS64R2)
399
400 /* Return true if ISA supports move to/from high part of a 64-bit
401 floating-point register. */
402 #define ISA_HAS_MXHC1(ISA) \
403 ((ISA) == ISA_MIPS32R2 \
404 || (ISA) == ISA_MIPS64R2)
405
406 #define HAVE_32BIT_GPRS \
407 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
408
409 #define HAVE_32BIT_FPRS \
410 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
411
412 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
413 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
414
415 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
416
417 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
418
419 /* True if relocations are stored in-place. */
420 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
421
422 /* The ABI-derived address size. */
423 #define HAVE_64BIT_ADDRESSES \
424 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
425 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
426
427 /* The size of symbolic constants (i.e., expressions of the form
428 "SYMBOL" or "SYMBOL + OFFSET"). */
429 #define HAVE_32BIT_SYMBOLS \
430 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
431 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
432
433 /* Addresses are loaded in different ways, depending on the address size
434 in use. The n32 ABI Documentation also mandates the use of additions
435 with overflow checking, but existing implementations don't follow it. */
436 #define ADDRESS_ADD_INSN \
437 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
438
439 #define ADDRESS_ADDI_INSN \
440 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
441
442 #define ADDRESS_LOAD_INSN \
443 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
444
445 #define ADDRESS_STORE_INSN \
446 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
447
448 /* Return true if the given CPU supports the MIPS16 ASE. */
449 #define CPU_HAS_MIPS16(cpu) \
450 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
451 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
452
453 /* True if CPU has a dror instruction. */
454 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
455
456 /* True if CPU has a ror instruction. */
457 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
458
459 /* True if CPU has seq/sne and seqi/snei instructions. */
460 #define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
461
462 /* True if CPU does not implement the all the coprocessor insns. For these
463 CPUs only those COP insns are accepted that are explicitly marked to be
464 available on the CPU. ISA membership for COP insns is ignored. */
465 #define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
466
467 /* True if mflo and mfhi can be immediately followed by instructions
468 which write to the HI and LO registers.
469
470 According to MIPS specifications, MIPS ISAs I, II, and III need
471 (at least) two instructions between the reads of HI/LO and
472 instructions which write them, and later ISAs do not. Contradicting
473 the MIPS specifications, some MIPS IV processor user manuals (e.g.
474 the UM for the NEC Vr5000) document needing the instructions between
475 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
476 MIPS64 and later ISAs to have the interlocks, plus any specific
477 earlier-ISA CPUs for which CPU documentation declares that the
478 instructions are really interlocked. */
479 #define hilo_interlocks \
480 (mips_opts.isa == ISA_MIPS32 \
481 || mips_opts.isa == ISA_MIPS32R2 \
482 || mips_opts.isa == ISA_MIPS64 \
483 || mips_opts.isa == ISA_MIPS64R2 \
484 || mips_opts.arch == CPU_R4010 \
485 || mips_opts.arch == CPU_R10000 \
486 || mips_opts.arch == CPU_R12000 \
487 || mips_opts.arch == CPU_R14000 \
488 || mips_opts.arch == CPU_R16000 \
489 || mips_opts.arch == CPU_RM7000 \
490 || mips_opts.arch == CPU_VR5500 \
491 )
492
493 /* Whether the processor uses hardware interlocks to protect reads
494 from the GPRs after they are loaded from memory, and thus does not
495 require nops to be inserted. This applies to instructions marked
496 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
497 level I. */
498 #define gpr_interlocks \
499 (mips_opts.isa != ISA_MIPS1 \
500 || mips_opts.arch == CPU_R3900)
501
502 /* Whether the processor uses hardware interlocks to avoid delays
503 required by coprocessor instructions, and thus does not require
504 nops to be inserted. This applies to instructions marked
505 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
506 between instructions marked INSN_WRITE_COND_CODE and ones marked
507 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
508 levels I, II, and III. */
509 /* Itbl support may require additional care here. */
510 #define cop_interlocks \
511 ((mips_opts.isa != ISA_MIPS1 \
512 && mips_opts.isa != ISA_MIPS2 \
513 && mips_opts.isa != ISA_MIPS3) \
514 || mips_opts.arch == CPU_R4300 \
515 )
516
517 /* Whether the processor uses hardware interlocks to protect reads
518 from coprocessor registers after they are loaded from memory, and
519 thus does not require nops to be inserted. This applies to
520 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
521 requires at MIPS ISA level I. */
522 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
523
524 /* Is this a mfhi or mflo instruction? */
525 #define MF_HILO_INSN(PINFO) \
526 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
527
528 /* Returns true for a (non floating-point) coprocessor instruction. Reading
529 or writing the condition code is only possible on the coprocessors and
530 these insns are not marked with INSN_COP. Thus for these insns use the
531 condition-code flags. */
532 #define COP_INSN(PINFO) \
533 (PINFO != INSN_MACRO \
534 && ((PINFO) & (FP_S | FP_D)) == 0 \
535 && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
536
537 /* MIPS PIC level. */
538
539 enum mips_pic_level mips_pic;
540
541 /* 1 if we should generate 32 bit offsets from the $gp register in
542 SVR4_PIC mode. Currently has no meaning in other modes. */
543 static int mips_big_got = 0;
544
545 /* 1 if trap instructions should used for overflow rather than break
546 instructions. */
547 static int mips_trap = 0;
548
549 /* 1 if double width floating point constants should not be constructed
550 by assembling two single width halves into two single width floating
551 point registers which just happen to alias the double width destination
552 register. On some architectures this aliasing can be disabled by a bit
553 in the status register, and the setting of this bit cannot be determined
554 automatically at assemble time. */
555 static int mips_disable_float_construction;
556
557 /* Non-zero if any .set noreorder directives were used. */
558
559 static int mips_any_noreorder;
560
561 /* Non-zero if nops should be inserted when the register referenced in
562 an mfhi/mflo instruction is read in the next two instructions. */
563 static int mips_7000_hilo_fix;
564
565 /* The size of objects in the small data section. */
566 static unsigned int g_switch_value = 8;
567 /* Whether the -G option was used. */
568 static int g_switch_seen = 0;
569
570 #define N_RMASK 0xc4
571 #define N_VFP 0xd4
572
573 /* If we can determine in advance that GP optimization won't be
574 possible, we can skip the relaxation stuff that tries to produce
575 GP-relative references. This makes delay slot optimization work
576 better.
577
578 This function can only provide a guess, but it seems to work for
579 gcc output. It needs to guess right for gcc, otherwise gcc
580 will put what it thinks is a GP-relative instruction in a branch
581 delay slot.
582
583 I don't know if a fix is needed for the SVR4_PIC mode. I've only
584 fixed it for the non-PIC mode. KR 95/04/07 */
585 static int nopic_need_relax (symbolS *, int);
586
587 /* handle of the OPCODE hash table */
588 static struct hash_control *op_hash = NULL;
589
590 /* The opcode hash table we use for the mips16. */
591 static struct hash_control *mips16_op_hash = NULL;
592
593 /* This array holds the chars that always start a comment. If the
594 pre-processor is disabled, these aren't very useful */
595 const char comment_chars[] = "#";
596
597 /* This array holds the chars that only start a comment at the beginning of
598 a line. If the line seems to have the form '# 123 filename'
599 .line and .file directives will appear in the pre-processed output */
600 /* Note that input_file.c hand checks for '#' at the beginning of the
601 first line of the input file. This is because the compiler outputs
602 #NO_APP at the beginning of its output. */
603 /* Also note that C style comments are always supported. */
604 const char line_comment_chars[] = "#";
605
606 /* This array holds machine specific line separator characters. */
607 const char line_separator_chars[] = ";";
608
609 /* Chars that can be used to separate mant from exp in floating point nums */
610 const char EXP_CHARS[] = "eE";
611
612 /* Chars that mean this number is a floating point constant */
613 /* As in 0f12.456 */
614 /* or 0d1.2345e12 */
615 const char FLT_CHARS[] = "rRsSfFdDxXpP";
616
617 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
618 changed in read.c . Ideally it shouldn't have to know about it at all,
619 but nothing is ideal around here.
620 */
621
622 static char *insn_error;
623
624 static int auto_align = 1;
625
626 /* When outputting SVR4 PIC code, the assembler needs to know the
627 offset in the stack frame from which to restore the $gp register.
628 This is set by the .cprestore pseudo-op, and saved in this
629 variable. */
630 static offsetT mips_cprestore_offset = -1;
631
632 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
633 more optimizations, it can use a register value instead of a memory-saved
634 offset and even an other register than $gp as global pointer. */
635 static offsetT mips_cpreturn_offset = -1;
636 static int mips_cpreturn_register = -1;
637 static int mips_gp_register = GP;
638 static int mips_gprel_offset = 0;
639
640 /* Whether mips_cprestore_offset has been set in the current function
641 (or whether it has already been warned about, if not). */
642 static int mips_cprestore_valid = 0;
643
644 /* This is the register which holds the stack frame, as set by the
645 .frame pseudo-op. This is needed to implement .cprestore. */
646 static int mips_frame_reg = SP;
647
648 /* Whether mips_frame_reg has been set in the current function
649 (or whether it has already been warned about, if not). */
650 static int mips_frame_reg_valid = 0;
651
652 /* To output NOP instructions correctly, we need to keep information
653 about the previous two instructions. */
654
655 /* Whether we are optimizing. The default value of 2 means to remove
656 unneeded NOPs and swap branch instructions when possible. A value
657 of 1 means to not swap branches. A value of 0 means to always
658 insert NOPs. */
659 static int mips_optimize = 2;
660
661 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
662 equivalent to seeing no -g option at all. */
663 static int mips_debug = 0;
664
665 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
666 #define MAX_VR4130_NOPS 4
667
668 /* The maximum number of NOPs needed to fill delay slots. */
669 #define MAX_DELAY_NOPS 2
670
671 /* The maximum number of NOPs needed for any purpose. */
672 #define MAX_NOPS 4
673
674 /* A list of previous instructions, with index 0 being the most recent.
675 We need to look back MAX_NOPS instructions when filling delay slots
676 or working around processor errata. We need to look back one
677 instruction further if we're thinking about using history[0] to
678 fill a branch delay slot. */
679 static struct mips_cl_insn history[1 + MAX_NOPS];
680
681 /* Nop instructions used by emit_nop. */
682 static struct mips_cl_insn nop_insn, mips16_nop_insn;
683
684 /* The appropriate nop for the current mode. */
685 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
686
687 /* If this is set, it points to a frag holding nop instructions which
688 were inserted before the start of a noreorder section. If those
689 nops turn out to be unnecessary, the size of the frag can be
690 decreased. */
691 static fragS *prev_nop_frag;
692
693 /* The number of nop instructions we created in prev_nop_frag. */
694 static int prev_nop_frag_holds;
695
696 /* The number of nop instructions that we know we need in
697 prev_nop_frag. */
698 static int prev_nop_frag_required;
699
700 /* The number of instructions we've seen since prev_nop_frag. */
701 static int prev_nop_frag_since;
702
703 /* For ECOFF and ELF, relocations against symbols are done in two
704 parts, with a HI relocation and a LO relocation. Each relocation
705 has only 16 bits of space to store an addend. This means that in
706 order for the linker to handle carries correctly, it must be able
707 to locate both the HI and the LO relocation. This means that the
708 relocations must appear in order in the relocation table.
709
710 In order to implement this, we keep track of each unmatched HI
711 relocation. We then sort them so that they immediately precede the
712 corresponding LO relocation. */
713
714 struct mips_hi_fixup
715 {
716 /* Next HI fixup. */
717 struct mips_hi_fixup *next;
718 /* This fixup. */
719 fixS *fixp;
720 /* The section this fixup is in. */
721 segT seg;
722 };
723
724 /* The list of unmatched HI relocs. */
725
726 static struct mips_hi_fixup *mips_hi_fixup_list;
727
728 /* The frag containing the last explicit relocation operator.
729 Null if explicit relocations have not been used. */
730
731 static fragS *prev_reloc_op_frag;
732
733 /* Map normal MIPS register numbers to mips16 register numbers. */
734
735 #define X ILLEGAL_REG
736 static const int mips32_to_16_reg_map[] =
737 {
738 X, X, 2, 3, 4, 5, 6, 7,
739 X, X, X, X, X, X, X, X,
740 0, 1, X, X, X, X, X, X,
741 X, X, X, X, X, X, X, X
742 };
743 #undef X
744
745 /* Map mips16 register numbers to normal MIPS register numbers. */
746
747 static const unsigned int mips16_to_32_reg_map[] =
748 {
749 16, 17, 2, 3, 4, 5, 6, 7
750 };
751
752 /* Classifies the kind of instructions we're interested in when
753 implementing -mfix-vr4120. */
754 enum fix_vr4120_class
755 {
756 FIX_VR4120_MACC,
757 FIX_VR4120_DMACC,
758 FIX_VR4120_MULT,
759 FIX_VR4120_DMULT,
760 FIX_VR4120_DIV,
761 FIX_VR4120_MTHILO,
762 NUM_FIX_VR4120_CLASSES
763 };
764
765 /* ...likewise -mfix-loongson2f-jump. */
766 static bfd_boolean mips_fix_loongson2f_jump;
767
768 /* ...likewise -mfix-loongson2f-nop. */
769 static bfd_boolean mips_fix_loongson2f_nop;
770
771 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
772 static bfd_boolean mips_fix_loongson2f;
773
774 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
775 there must be at least one other instruction between an instruction
776 of type X and an instruction of type Y. */
777 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
778
779 /* True if -mfix-vr4120 is in force. */
780 static int mips_fix_vr4120;
781
782 /* ...likewise -mfix-vr4130. */
783 static int mips_fix_vr4130;
784
785 /* ...likewise -mfix-24k. */
786 static int mips_fix_24k;
787
788 /* ...likewise -mfix-cn63xxp1 */
789 static bfd_boolean mips_fix_cn63xxp1;
790
791 /* We don't relax branches by default, since this causes us to expand
792 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
793 fail to compute the offset before expanding the macro to the most
794 efficient expansion. */
795
796 static int mips_relax_branch;
797 \f
798 /* The expansion of many macros depends on the type of symbol that
799 they refer to. For example, when generating position-dependent code,
800 a macro that refers to a symbol may have two different expansions,
801 one which uses GP-relative addresses and one which uses absolute
802 addresses. When generating SVR4-style PIC, a macro may have
803 different expansions for local and global symbols.
804
805 We handle these situations by generating both sequences and putting
806 them in variant frags. In position-dependent code, the first sequence
807 will be the GP-relative one and the second sequence will be the
808 absolute one. In SVR4 PIC, the first sequence will be for global
809 symbols and the second will be for local symbols.
810
811 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
812 SECOND are the lengths of the two sequences in bytes. These fields
813 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
814 the subtype has the following flags:
815
816 RELAX_USE_SECOND
817 Set if it has been decided that we should use the second
818 sequence instead of the first.
819
820 RELAX_SECOND_LONGER
821 Set in the first variant frag if the macro's second implementation
822 is longer than its first. This refers to the macro as a whole,
823 not an individual relaxation.
824
825 RELAX_NOMACRO
826 Set in the first variant frag if the macro appeared in a .set nomacro
827 block and if one alternative requires a warning but the other does not.
828
829 RELAX_DELAY_SLOT
830 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
831 delay slot.
832
833 The frag's "opcode" points to the first fixup for relaxable code.
834
835 Relaxable macros are generated using a sequence such as:
836
837 relax_start (SYMBOL);
838 ... generate first expansion ...
839 relax_switch ();
840 ... generate second expansion ...
841 relax_end ();
842
843 The code and fixups for the unwanted alternative are discarded
844 by md_convert_frag. */
845 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
846
847 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
848 #define RELAX_SECOND(X) ((X) & 0xff)
849 #define RELAX_USE_SECOND 0x10000
850 #define RELAX_SECOND_LONGER 0x20000
851 #define RELAX_NOMACRO 0x40000
852 #define RELAX_DELAY_SLOT 0x80000
853
854 /* Branch without likely bit. If label is out of range, we turn:
855
856 beq reg1, reg2, label
857 delay slot
858
859 into
860
861 bne reg1, reg2, 0f
862 nop
863 j label
864 0: delay slot
865
866 with the following opcode replacements:
867
868 beq <-> bne
869 blez <-> bgtz
870 bltz <-> bgez
871 bc1f <-> bc1t
872
873 bltzal <-> bgezal (with jal label instead of j label)
874
875 Even though keeping the delay slot instruction in the delay slot of
876 the branch would be more efficient, it would be very tricky to do
877 correctly, because we'd have to introduce a variable frag *after*
878 the delay slot instruction, and expand that instead. Let's do it
879 the easy way for now, even if the branch-not-taken case now costs
880 one additional instruction. Out-of-range branches are not supposed
881 to be common, anyway.
882
883 Branch likely. If label is out of range, we turn:
884
885 beql reg1, reg2, label
886 delay slot (annulled if branch not taken)
887
888 into
889
890 beql reg1, reg2, 1f
891 nop
892 beql $0, $0, 2f
893 nop
894 1: j[al] label
895 delay slot (executed only if branch taken)
896 2:
897
898 It would be possible to generate a shorter sequence by losing the
899 likely bit, generating something like:
900
901 bne reg1, reg2, 0f
902 nop
903 j[al] label
904 delay slot (executed only if branch taken)
905 0:
906
907 beql -> bne
908 bnel -> beq
909 blezl -> bgtz
910 bgtzl -> blez
911 bltzl -> bgez
912 bgezl -> bltz
913 bc1fl -> bc1t
914 bc1tl -> bc1f
915
916 bltzall -> bgezal (with jal label instead of j label)
917 bgezall -> bltzal (ditto)
918
919
920 but it's not clear that it would actually improve performance. */
921 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
922 ((relax_substateT) \
923 (0xc0000000 \
924 | ((toofar) ? 1 : 0) \
925 | ((link) ? 2 : 0) \
926 | ((likely) ? 4 : 0) \
927 | ((uncond) ? 8 : 0)))
928 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
929 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
930 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
931 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
932 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
933
934 /* For mips16 code, we use an entirely different form of relaxation.
935 mips16 supports two versions of most instructions which take
936 immediate values: a small one which takes some small value, and a
937 larger one which takes a 16 bit value. Since branches also follow
938 this pattern, relaxing these values is required.
939
940 We can assemble both mips16 and normal MIPS code in a single
941 object. Therefore, we need to support this type of relaxation at
942 the same time that we support the relaxation described above. We
943 use the high bit of the subtype field to distinguish these cases.
944
945 The information we store for this type of relaxation is the
946 argument code found in the opcode file for this relocation, whether
947 the user explicitly requested a small or extended form, and whether
948 the relocation is in a jump or jal delay slot. That tells us the
949 size of the value, and how it should be stored. We also store
950 whether the fragment is considered to be extended or not. We also
951 store whether this is known to be a branch to a different section,
952 whether we have tried to relax this frag yet, and whether we have
953 ever extended a PC relative fragment because of a shift count. */
954 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
955 (0x80000000 \
956 | ((type) & 0xff) \
957 | ((small) ? 0x100 : 0) \
958 | ((ext) ? 0x200 : 0) \
959 | ((dslot) ? 0x400 : 0) \
960 | ((jal_dslot) ? 0x800 : 0))
961 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
962 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
963 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
964 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
965 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
966 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
967 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
968 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
969 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
970 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
971 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
972 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
973
974 /* Is the given value a sign-extended 32-bit value? */
975 #define IS_SEXT_32BIT_NUM(x) \
976 (((x) &~ (offsetT) 0x7fffffff) == 0 \
977 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
978
979 /* Is the given value a sign-extended 16-bit value? */
980 #define IS_SEXT_16BIT_NUM(x) \
981 (((x) &~ (offsetT) 0x7fff) == 0 \
982 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
983
984 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
985 #define IS_ZEXT_32BIT_NUM(x) \
986 (((x) &~ (offsetT) 0xffffffff) == 0 \
987 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
988
989 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
990 VALUE << SHIFT. VALUE is evaluated exactly once. */
991 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
992 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
993 | (((VALUE) & (MASK)) << (SHIFT)))
994
995 /* Extract bits MASK << SHIFT from STRUCT and shift them right
996 SHIFT places. */
997 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
998 (((STRUCT) >> (SHIFT)) & (MASK))
999
1000 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1001 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1002
1003 include/opcode/mips.h specifies operand fields using the macros
1004 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1005 with "MIPS16OP" instead of "OP". */
1006 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1007 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1008 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1009 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1010 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1011
1012 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
1013 #define EXTRACT_OPERAND(FIELD, INSN) \
1014 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1015 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1016 EXTRACT_BITS ((INSN).insn_opcode, \
1017 MIPS16OP_MASK_##FIELD, \
1018 MIPS16OP_SH_##FIELD)
1019 \f
1020 /* Global variables used when generating relaxable macros. See the
1021 comment above RELAX_ENCODE for more details about how relaxation
1022 is used. */
1023 static struct {
1024 /* 0 if we're not emitting a relaxable macro.
1025 1 if we're emitting the first of the two relaxation alternatives.
1026 2 if we're emitting the second alternative. */
1027 int sequence;
1028
1029 /* The first relaxable fixup in the current frag. (In other words,
1030 the first fixup that refers to relaxable code.) */
1031 fixS *first_fixup;
1032
1033 /* sizes[0] says how many bytes of the first alternative are stored in
1034 the current frag. Likewise sizes[1] for the second alternative. */
1035 unsigned int sizes[2];
1036
1037 /* The symbol on which the choice of sequence depends. */
1038 symbolS *symbol;
1039 } mips_relax;
1040 \f
1041 /* Global variables used to decide whether a macro needs a warning. */
1042 static struct {
1043 /* True if the macro is in a branch delay slot. */
1044 bfd_boolean delay_slot_p;
1045
1046 /* For relaxable macros, sizes[0] is the length of the first alternative
1047 in bytes and sizes[1] is the length of the second alternative.
1048 For non-relaxable macros, both elements give the length of the
1049 macro in bytes. */
1050 unsigned int sizes[2];
1051
1052 /* The first variant frag for this macro. */
1053 fragS *first_frag;
1054 } mips_macro_warning;
1055 \f
1056 /* Prototypes for static functions. */
1057
1058 #define internalError() \
1059 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1060
1061 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1062
1063 static void append_insn
1064 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1065 static void mips_no_prev_insn (void);
1066 static void macro_build (expressionS *, const char *, const char *, ...);
1067 static void mips16_macro_build
1068 (expressionS *, const char *, const char *, va_list *);
1069 static void load_register (int, expressionS *, int);
1070 static void macro_start (void);
1071 static void macro_end (void);
1072 static void macro (struct mips_cl_insn * ip);
1073 static void mips16_macro (struct mips_cl_insn * ip);
1074 static void mips_ip (char *str, struct mips_cl_insn * ip);
1075 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1076 static void mips16_immed
1077 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1078 unsigned long *, bfd_boolean *, unsigned short *);
1079 static size_t my_getSmallExpression
1080 (expressionS *, bfd_reloc_code_real_type *, char *);
1081 static void my_getExpression (expressionS *, char *);
1082 static void s_align (int);
1083 static void s_change_sec (int);
1084 static void s_change_section (int);
1085 static void s_cons (int);
1086 static void s_float_cons (int);
1087 static void s_mips_globl (int);
1088 static void s_option (int);
1089 static void s_mipsset (int);
1090 static void s_abicalls (int);
1091 static void s_cpload (int);
1092 static void s_cpsetup (int);
1093 static void s_cplocal (int);
1094 static void s_cprestore (int);
1095 static void s_cpreturn (int);
1096 static void s_dtprelword (int);
1097 static void s_dtpreldword (int);
1098 static void s_gpvalue (int);
1099 static void s_gpword (int);
1100 static void s_gpdword (int);
1101 static void s_cpadd (int);
1102 static void s_insn (int);
1103 static void md_obj_begin (void);
1104 static void md_obj_end (void);
1105 static void s_mips_ent (int);
1106 static void s_mips_end (int);
1107 static void s_mips_frame (int);
1108 static void s_mips_mask (int reg_type);
1109 static void s_mips_stab (int);
1110 static void s_mips_weakext (int);
1111 static void s_mips_file (int);
1112 static void s_mips_loc (int);
1113 static bfd_boolean pic_need_relax (symbolS *, asection *);
1114 static int relaxed_branch_length (fragS *, asection *, int);
1115 static int validate_mips_insn (const struct mips_opcode *);
1116
1117 /* Table and functions used to map between CPU/ISA names, and
1118 ISA levels, and CPU numbers. */
1119
1120 struct mips_cpu_info
1121 {
1122 const char *name; /* CPU or ISA name. */
1123 int flags; /* ASEs available, or ISA flag. */
1124 int isa; /* ISA level. */
1125 int cpu; /* CPU number (default CPU if ISA). */
1126 };
1127
1128 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1129 #define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1130 #define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1131 #define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1132 #define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1133 #define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
1134 #define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
1135
1136 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1137 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1138 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1139 \f
1140 /* Pseudo-op table.
1141
1142 The following pseudo-ops from the Kane and Heinrich MIPS book
1143 should be defined here, but are currently unsupported: .alias,
1144 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1145
1146 The following pseudo-ops from the Kane and Heinrich MIPS book are
1147 specific to the type of debugging information being generated, and
1148 should be defined by the object format: .aent, .begin, .bend,
1149 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1150 .vreg.
1151
1152 The following pseudo-ops from the Kane and Heinrich MIPS book are
1153 not MIPS CPU specific, but are also not specific to the object file
1154 format. This file is probably the best place to define them, but
1155 they are not currently supported: .asm0, .endr, .lab, .struct. */
1156
1157 static const pseudo_typeS mips_pseudo_table[] =
1158 {
1159 /* MIPS specific pseudo-ops. */
1160 {"option", s_option, 0},
1161 {"set", s_mipsset, 0},
1162 {"rdata", s_change_sec, 'r'},
1163 {"sdata", s_change_sec, 's'},
1164 {"livereg", s_ignore, 0},
1165 {"abicalls", s_abicalls, 0},
1166 {"cpload", s_cpload, 0},
1167 {"cpsetup", s_cpsetup, 0},
1168 {"cplocal", s_cplocal, 0},
1169 {"cprestore", s_cprestore, 0},
1170 {"cpreturn", s_cpreturn, 0},
1171 {"dtprelword", s_dtprelword, 0},
1172 {"dtpreldword", s_dtpreldword, 0},
1173 {"gpvalue", s_gpvalue, 0},
1174 {"gpword", s_gpword, 0},
1175 {"gpdword", s_gpdword, 0},
1176 {"cpadd", s_cpadd, 0},
1177 {"insn", s_insn, 0},
1178
1179 /* Relatively generic pseudo-ops that happen to be used on MIPS
1180 chips. */
1181 {"asciiz", stringer, 8 + 1},
1182 {"bss", s_change_sec, 'b'},
1183 {"err", s_err, 0},
1184 {"half", s_cons, 1},
1185 {"dword", s_cons, 3},
1186 {"weakext", s_mips_weakext, 0},
1187 {"origin", s_org, 0},
1188 {"repeat", s_rept, 0},
1189
1190 /* For MIPS this is non-standard, but we define it for consistency. */
1191 {"sbss", s_change_sec, 'B'},
1192
1193 /* These pseudo-ops are defined in read.c, but must be overridden
1194 here for one reason or another. */
1195 {"align", s_align, 0},
1196 {"byte", s_cons, 0},
1197 {"data", s_change_sec, 'd'},
1198 {"double", s_float_cons, 'd'},
1199 {"float", s_float_cons, 'f'},
1200 {"globl", s_mips_globl, 0},
1201 {"global", s_mips_globl, 0},
1202 {"hword", s_cons, 1},
1203 {"int", s_cons, 2},
1204 {"long", s_cons, 2},
1205 {"octa", s_cons, 4},
1206 {"quad", s_cons, 3},
1207 {"section", s_change_section, 0},
1208 {"short", s_cons, 1},
1209 {"single", s_float_cons, 'f'},
1210 {"stabn", s_mips_stab, 'n'},
1211 {"text", s_change_sec, 't'},
1212 {"word", s_cons, 2},
1213
1214 { "extern", ecoff_directive_extern, 0},
1215
1216 { NULL, NULL, 0 },
1217 };
1218
1219 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1220 {
1221 /* These pseudo-ops should be defined by the object file format.
1222 However, a.out doesn't support them, so we have versions here. */
1223 {"aent", s_mips_ent, 1},
1224 {"bgnb", s_ignore, 0},
1225 {"end", s_mips_end, 0},
1226 {"endb", s_ignore, 0},
1227 {"ent", s_mips_ent, 0},
1228 {"file", s_mips_file, 0},
1229 {"fmask", s_mips_mask, 'F'},
1230 {"frame", s_mips_frame, 0},
1231 {"loc", s_mips_loc, 0},
1232 {"mask", s_mips_mask, 'R'},
1233 {"verstamp", s_ignore, 0},
1234 { NULL, NULL, 0 },
1235 };
1236
1237 extern void pop_insert (const pseudo_typeS *);
1238
1239 void
1240 mips_pop_insert (void)
1241 {
1242 pop_insert (mips_pseudo_table);
1243 if (! ECOFF_DEBUGGING)
1244 pop_insert (mips_nonecoff_pseudo_table);
1245 }
1246 \f
1247 /* Symbols labelling the current insn. */
1248
1249 struct insn_label_list
1250 {
1251 struct insn_label_list *next;
1252 symbolS *label;
1253 };
1254
1255 static struct insn_label_list *free_insn_labels;
1256 #define label_list tc_segment_info_data.labels
1257
1258 static void mips_clear_insn_labels (void);
1259
1260 static inline void
1261 mips_clear_insn_labels (void)
1262 {
1263 register struct insn_label_list **pl;
1264 segment_info_type *si;
1265
1266 if (now_seg)
1267 {
1268 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1269 ;
1270
1271 si = seg_info (now_seg);
1272 *pl = si->label_list;
1273 si->label_list = NULL;
1274 }
1275 }
1276
1277 \f
1278 static char *expr_end;
1279
1280 /* Expressions which appear in instructions. These are set by
1281 mips_ip. */
1282
1283 static expressionS imm_expr;
1284 static expressionS imm2_expr;
1285 static expressionS offset_expr;
1286
1287 /* Relocs associated with imm_expr and offset_expr. */
1288
1289 static bfd_reloc_code_real_type imm_reloc[3]
1290 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1291 static bfd_reloc_code_real_type offset_reloc[3]
1292 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1293
1294 /* These are set by mips16_ip if an explicit extension is used. */
1295
1296 static bfd_boolean mips16_small, mips16_ext;
1297
1298 #ifdef OBJ_ELF
1299 /* The pdr segment for per procedure frame/regmask info. Not used for
1300 ECOFF debugging. */
1301
1302 static segT pdr_seg;
1303 #endif
1304
1305 /* The default target format to use. */
1306
1307 const char *
1308 mips_target_format (void)
1309 {
1310 switch (OUTPUT_FLAVOR)
1311 {
1312 case bfd_target_ecoff_flavour:
1313 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1314 case bfd_target_coff_flavour:
1315 return "pe-mips";
1316 case bfd_target_elf_flavour:
1317 #ifdef TE_VXWORKS
1318 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1319 return (target_big_endian
1320 ? "elf32-bigmips-vxworks"
1321 : "elf32-littlemips-vxworks");
1322 #endif
1323 #ifdef TE_TMIPS
1324 /* This is traditional mips. */
1325 return (target_big_endian
1326 ? (HAVE_64BIT_OBJECTS
1327 ? "elf64-tradbigmips"
1328 : (HAVE_NEWABI
1329 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1330 : (HAVE_64BIT_OBJECTS
1331 ? "elf64-tradlittlemips"
1332 : (HAVE_NEWABI
1333 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1334 #else
1335 return (target_big_endian
1336 ? (HAVE_64BIT_OBJECTS
1337 ? "elf64-bigmips"
1338 : (HAVE_NEWABI
1339 ? "elf32-nbigmips" : "elf32-bigmips"))
1340 : (HAVE_64BIT_OBJECTS
1341 ? "elf64-littlemips"
1342 : (HAVE_NEWABI
1343 ? "elf32-nlittlemips" : "elf32-littlemips")));
1344 #endif
1345 default:
1346 abort ();
1347 return NULL;
1348 }
1349 }
1350
1351 /* Return the length of instruction INSN. */
1352
1353 static inline unsigned int
1354 insn_length (const struct mips_cl_insn *insn)
1355 {
1356 if (!mips_opts.mips16)
1357 return 4;
1358 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1359 }
1360
1361 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1362
1363 static void
1364 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1365 {
1366 size_t i;
1367
1368 insn->insn_mo = mo;
1369 insn->use_extend = FALSE;
1370 insn->extend = 0;
1371 insn->insn_opcode = mo->match;
1372 insn->frag = NULL;
1373 insn->where = 0;
1374 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1375 insn->fixp[i] = NULL;
1376 insn->fixed_p = (mips_opts.noreorder > 0);
1377 insn->noreorder_p = (mips_opts.noreorder > 0);
1378 insn->mips16_absolute_jump_p = 0;
1379 }
1380
1381 /* Record the current MIPS16 mode in now_seg. */
1382
1383 static void
1384 mips_record_mips16_mode (void)
1385 {
1386 segment_info_type *si;
1387
1388 si = seg_info (now_seg);
1389 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1390 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1391 }
1392
1393 /* Install INSN at the location specified by its "frag" and "where" fields. */
1394
1395 static void
1396 install_insn (const struct mips_cl_insn *insn)
1397 {
1398 char *f = insn->frag->fr_literal + insn->where;
1399 if (!mips_opts.mips16)
1400 md_number_to_chars (f, insn->insn_opcode, 4);
1401 else if (insn->mips16_absolute_jump_p)
1402 {
1403 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1404 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1405 }
1406 else
1407 {
1408 if (insn->use_extend)
1409 {
1410 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1411 f += 2;
1412 }
1413 md_number_to_chars (f, insn->insn_opcode, 2);
1414 }
1415 mips_record_mips16_mode ();
1416 }
1417
1418 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1419 and install the opcode in the new location. */
1420
1421 static void
1422 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1423 {
1424 size_t i;
1425
1426 insn->frag = frag;
1427 insn->where = where;
1428 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1429 if (insn->fixp[i] != NULL)
1430 {
1431 insn->fixp[i]->fx_frag = frag;
1432 insn->fixp[i]->fx_where = where;
1433 }
1434 install_insn (insn);
1435 }
1436
1437 /* Add INSN to the end of the output. */
1438
1439 static void
1440 add_fixed_insn (struct mips_cl_insn *insn)
1441 {
1442 char *f = frag_more (insn_length (insn));
1443 move_insn (insn, frag_now, f - frag_now->fr_literal);
1444 }
1445
1446 /* Start a variant frag and move INSN to the start of the variant part,
1447 marking it as fixed. The other arguments are as for frag_var. */
1448
1449 static void
1450 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1451 relax_substateT subtype, symbolS *symbol, offsetT offset)
1452 {
1453 frag_grow (max_chars);
1454 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1455 insn->fixed_p = 1;
1456 frag_var (rs_machine_dependent, max_chars, var,
1457 subtype, symbol, offset, NULL);
1458 }
1459
1460 /* Insert N copies of INSN into the history buffer, starting at
1461 position FIRST. Neither FIRST nor N need to be clipped. */
1462
1463 static void
1464 insert_into_history (unsigned int first, unsigned int n,
1465 const struct mips_cl_insn *insn)
1466 {
1467 if (mips_relax.sequence != 2)
1468 {
1469 unsigned int i;
1470
1471 for (i = ARRAY_SIZE (history); i-- > first;)
1472 if (i >= first + n)
1473 history[i] = history[i - n];
1474 else
1475 history[i] = *insn;
1476 }
1477 }
1478
1479 /* Emit a nop instruction, recording it in the history buffer. */
1480
1481 static void
1482 emit_nop (void)
1483 {
1484 add_fixed_insn (NOP_INSN);
1485 insert_into_history (0, 1, NOP_INSN);
1486 }
1487
1488 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1489 the idea is to make it obvious at a glance that each errata is
1490 included. */
1491
1492 static void
1493 init_vr4120_conflicts (void)
1494 {
1495 #define CONFLICT(FIRST, SECOND) \
1496 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1497
1498 /* Errata 21 - [D]DIV[U] after [D]MACC */
1499 CONFLICT (MACC, DIV);
1500 CONFLICT (DMACC, DIV);
1501
1502 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1503 CONFLICT (DMULT, DMULT);
1504 CONFLICT (DMULT, DMACC);
1505 CONFLICT (DMACC, DMULT);
1506 CONFLICT (DMACC, DMACC);
1507
1508 /* Errata 24 - MT{LO,HI} after [D]MACC */
1509 CONFLICT (MACC, MTHILO);
1510 CONFLICT (DMACC, MTHILO);
1511
1512 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1513 instruction is executed immediately after a MACC or DMACC
1514 instruction, the result of [either instruction] is incorrect." */
1515 CONFLICT (MACC, MULT);
1516 CONFLICT (MACC, DMULT);
1517 CONFLICT (DMACC, MULT);
1518 CONFLICT (DMACC, DMULT);
1519
1520 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1521 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1522 DDIV or DDIVU instruction, the result of the MACC or
1523 DMACC instruction is incorrect.". */
1524 CONFLICT (DMULT, MACC);
1525 CONFLICT (DMULT, DMACC);
1526 CONFLICT (DIV, MACC);
1527 CONFLICT (DIV, DMACC);
1528
1529 #undef CONFLICT
1530 }
1531
1532 struct regname {
1533 const char *name;
1534 unsigned int num;
1535 };
1536
1537 #define RTYPE_MASK 0x1ff00
1538 #define RTYPE_NUM 0x00100
1539 #define RTYPE_FPU 0x00200
1540 #define RTYPE_FCC 0x00400
1541 #define RTYPE_VEC 0x00800
1542 #define RTYPE_GP 0x01000
1543 #define RTYPE_CP0 0x02000
1544 #define RTYPE_PC 0x04000
1545 #define RTYPE_ACC 0x08000
1546 #define RTYPE_CCC 0x10000
1547 #define RNUM_MASK 0x000ff
1548 #define RWARN 0x80000
1549
1550 #define GENERIC_REGISTER_NUMBERS \
1551 {"$0", RTYPE_NUM | 0}, \
1552 {"$1", RTYPE_NUM | 1}, \
1553 {"$2", RTYPE_NUM | 2}, \
1554 {"$3", RTYPE_NUM | 3}, \
1555 {"$4", RTYPE_NUM | 4}, \
1556 {"$5", RTYPE_NUM | 5}, \
1557 {"$6", RTYPE_NUM | 6}, \
1558 {"$7", RTYPE_NUM | 7}, \
1559 {"$8", RTYPE_NUM | 8}, \
1560 {"$9", RTYPE_NUM | 9}, \
1561 {"$10", RTYPE_NUM | 10}, \
1562 {"$11", RTYPE_NUM | 11}, \
1563 {"$12", RTYPE_NUM | 12}, \
1564 {"$13", RTYPE_NUM | 13}, \
1565 {"$14", RTYPE_NUM | 14}, \
1566 {"$15", RTYPE_NUM | 15}, \
1567 {"$16", RTYPE_NUM | 16}, \
1568 {"$17", RTYPE_NUM | 17}, \
1569 {"$18", RTYPE_NUM | 18}, \
1570 {"$19", RTYPE_NUM | 19}, \
1571 {"$20", RTYPE_NUM | 20}, \
1572 {"$21", RTYPE_NUM | 21}, \
1573 {"$22", RTYPE_NUM | 22}, \
1574 {"$23", RTYPE_NUM | 23}, \
1575 {"$24", RTYPE_NUM | 24}, \
1576 {"$25", RTYPE_NUM | 25}, \
1577 {"$26", RTYPE_NUM | 26}, \
1578 {"$27", RTYPE_NUM | 27}, \
1579 {"$28", RTYPE_NUM | 28}, \
1580 {"$29", RTYPE_NUM | 29}, \
1581 {"$30", RTYPE_NUM | 30}, \
1582 {"$31", RTYPE_NUM | 31}
1583
1584 #define FPU_REGISTER_NAMES \
1585 {"$f0", RTYPE_FPU | 0}, \
1586 {"$f1", RTYPE_FPU | 1}, \
1587 {"$f2", RTYPE_FPU | 2}, \
1588 {"$f3", RTYPE_FPU | 3}, \
1589 {"$f4", RTYPE_FPU | 4}, \
1590 {"$f5", RTYPE_FPU | 5}, \
1591 {"$f6", RTYPE_FPU | 6}, \
1592 {"$f7", RTYPE_FPU | 7}, \
1593 {"$f8", RTYPE_FPU | 8}, \
1594 {"$f9", RTYPE_FPU | 9}, \
1595 {"$f10", RTYPE_FPU | 10}, \
1596 {"$f11", RTYPE_FPU | 11}, \
1597 {"$f12", RTYPE_FPU | 12}, \
1598 {"$f13", RTYPE_FPU | 13}, \
1599 {"$f14", RTYPE_FPU | 14}, \
1600 {"$f15", RTYPE_FPU | 15}, \
1601 {"$f16", RTYPE_FPU | 16}, \
1602 {"$f17", RTYPE_FPU | 17}, \
1603 {"$f18", RTYPE_FPU | 18}, \
1604 {"$f19", RTYPE_FPU | 19}, \
1605 {"$f20", RTYPE_FPU | 20}, \
1606 {"$f21", RTYPE_FPU | 21}, \
1607 {"$f22", RTYPE_FPU | 22}, \
1608 {"$f23", RTYPE_FPU | 23}, \
1609 {"$f24", RTYPE_FPU | 24}, \
1610 {"$f25", RTYPE_FPU | 25}, \
1611 {"$f26", RTYPE_FPU | 26}, \
1612 {"$f27", RTYPE_FPU | 27}, \
1613 {"$f28", RTYPE_FPU | 28}, \
1614 {"$f29", RTYPE_FPU | 29}, \
1615 {"$f30", RTYPE_FPU | 30}, \
1616 {"$f31", RTYPE_FPU | 31}
1617
1618 #define FPU_CONDITION_CODE_NAMES \
1619 {"$fcc0", RTYPE_FCC | 0}, \
1620 {"$fcc1", RTYPE_FCC | 1}, \
1621 {"$fcc2", RTYPE_FCC | 2}, \
1622 {"$fcc3", RTYPE_FCC | 3}, \
1623 {"$fcc4", RTYPE_FCC | 4}, \
1624 {"$fcc5", RTYPE_FCC | 5}, \
1625 {"$fcc6", RTYPE_FCC | 6}, \
1626 {"$fcc7", RTYPE_FCC | 7}
1627
1628 #define COPROC_CONDITION_CODE_NAMES \
1629 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1630 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1631 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1632 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1633 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1634 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1635 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1636 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1637
1638 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1639 {"$a4", RTYPE_GP | 8}, \
1640 {"$a5", RTYPE_GP | 9}, \
1641 {"$a6", RTYPE_GP | 10}, \
1642 {"$a7", RTYPE_GP | 11}, \
1643 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1644 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1645 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1646 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1647 {"$t0", RTYPE_GP | 12}, \
1648 {"$t1", RTYPE_GP | 13}, \
1649 {"$t2", RTYPE_GP | 14}, \
1650 {"$t3", RTYPE_GP | 15}
1651
1652 #define O32_SYMBOLIC_REGISTER_NAMES \
1653 {"$t0", RTYPE_GP | 8}, \
1654 {"$t1", RTYPE_GP | 9}, \
1655 {"$t2", RTYPE_GP | 10}, \
1656 {"$t3", RTYPE_GP | 11}, \
1657 {"$t4", RTYPE_GP | 12}, \
1658 {"$t5", RTYPE_GP | 13}, \
1659 {"$t6", RTYPE_GP | 14}, \
1660 {"$t7", RTYPE_GP | 15}, \
1661 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1662 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1663 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1664 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1665
1666 /* Remaining symbolic register names */
1667 #define SYMBOLIC_REGISTER_NAMES \
1668 {"$zero", RTYPE_GP | 0}, \
1669 {"$at", RTYPE_GP | 1}, \
1670 {"$AT", RTYPE_GP | 1}, \
1671 {"$v0", RTYPE_GP | 2}, \
1672 {"$v1", RTYPE_GP | 3}, \
1673 {"$a0", RTYPE_GP | 4}, \
1674 {"$a1", RTYPE_GP | 5}, \
1675 {"$a2", RTYPE_GP | 6}, \
1676 {"$a3", RTYPE_GP | 7}, \
1677 {"$s0", RTYPE_GP | 16}, \
1678 {"$s1", RTYPE_GP | 17}, \
1679 {"$s2", RTYPE_GP | 18}, \
1680 {"$s3", RTYPE_GP | 19}, \
1681 {"$s4", RTYPE_GP | 20}, \
1682 {"$s5", RTYPE_GP | 21}, \
1683 {"$s6", RTYPE_GP | 22}, \
1684 {"$s7", RTYPE_GP | 23}, \
1685 {"$t8", RTYPE_GP | 24}, \
1686 {"$t9", RTYPE_GP | 25}, \
1687 {"$k0", RTYPE_GP | 26}, \
1688 {"$kt0", RTYPE_GP | 26}, \
1689 {"$k1", RTYPE_GP | 27}, \
1690 {"$kt1", RTYPE_GP | 27}, \
1691 {"$gp", RTYPE_GP | 28}, \
1692 {"$sp", RTYPE_GP | 29}, \
1693 {"$s8", RTYPE_GP | 30}, \
1694 {"$fp", RTYPE_GP | 30}, \
1695 {"$ra", RTYPE_GP | 31}
1696
1697 #define MIPS16_SPECIAL_REGISTER_NAMES \
1698 {"$pc", RTYPE_PC | 0}
1699
1700 #define MDMX_VECTOR_REGISTER_NAMES \
1701 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1702 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1703 {"$v2", RTYPE_VEC | 2}, \
1704 {"$v3", RTYPE_VEC | 3}, \
1705 {"$v4", RTYPE_VEC | 4}, \
1706 {"$v5", RTYPE_VEC | 5}, \
1707 {"$v6", RTYPE_VEC | 6}, \
1708 {"$v7", RTYPE_VEC | 7}, \
1709 {"$v8", RTYPE_VEC | 8}, \
1710 {"$v9", RTYPE_VEC | 9}, \
1711 {"$v10", RTYPE_VEC | 10}, \
1712 {"$v11", RTYPE_VEC | 11}, \
1713 {"$v12", RTYPE_VEC | 12}, \
1714 {"$v13", RTYPE_VEC | 13}, \
1715 {"$v14", RTYPE_VEC | 14}, \
1716 {"$v15", RTYPE_VEC | 15}, \
1717 {"$v16", RTYPE_VEC | 16}, \
1718 {"$v17", RTYPE_VEC | 17}, \
1719 {"$v18", RTYPE_VEC | 18}, \
1720 {"$v19", RTYPE_VEC | 19}, \
1721 {"$v20", RTYPE_VEC | 20}, \
1722 {"$v21", RTYPE_VEC | 21}, \
1723 {"$v22", RTYPE_VEC | 22}, \
1724 {"$v23", RTYPE_VEC | 23}, \
1725 {"$v24", RTYPE_VEC | 24}, \
1726 {"$v25", RTYPE_VEC | 25}, \
1727 {"$v26", RTYPE_VEC | 26}, \
1728 {"$v27", RTYPE_VEC | 27}, \
1729 {"$v28", RTYPE_VEC | 28}, \
1730 {"$v29", RTYPE_VEC | 29}, \
1731 {"$v30", RTYPE_VEC | 30}, \
1732 {"$v31", RTYPE_VEC | 31}
1733
1734 #define MIPS_DSP_ACCUMULATOR_NAMES \
1735 {"$ac0", RTYPE_ACC | 0}, \
1736 {"$ac1", RTYPE_ACC | 1}, \
1737 {"$ac2", RTYPE_ACC | 2}, \
1738 {"$ac3", RTYPE_ACC | 3}
1739
1740 static const struct regname reg_names[] = {
1741 GENERIC_REGISTER_NUMBERS,
1742 FPU_REGISTER_NAMES,
1743 FPU_CONDITION_CODE_NAMES,
1744 COPROC_CONDITION_CODE_NAMES,
1745
1746 /* The $txx registers depends on the abi,
1747 these will be added later into the symbol table from
1748 one of the tables below once mips_abi is set after
1749 parsing of arguments from the command line. */
1750 SYMBOLIC_REGISTER_NAMES,
1751
1752 MIPS16_SPECIAL_REGISTER_NAMES,
1753 MDMX_VECTOR_REGISTER_NAMES,
1754 MIPS_DSP_ACCUMULATOR_NAMES,
1755 {0, 0}
1756 };
1757
1758 static const struct regname reg_names_o32[] = {
1759 O32_SYMBOLIC_REGISTER_NAMES,
1760 {0, 0}
1761 };
1762
1763 static const struct regname reg_names_n32n64[] = {
1764 N32N64_SYMBOLIC_REGISTER_NAMES,
1765 {0, 0}
1766 };
1767
1768 static int
1769 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1770 {
1771 symbolS *symbolP;
1772 char *e;
1773 char save_c;
1774 int reg = -1;
1775
1776 /* Find end of name. */
1777 e = *s;
1778 if (is_name_beginner (*e))
1779 ++e;
1780 while (is_part_of_name (*e))
1781 ++e;
1782
1783 /* Terminate name. */
1784 save_c = *e;
1785 *e = '\0';
1786
1787 /* Look for a register symbol. */
1788 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1789 {
1790 int r = S_GET_VALUE (symbolP);
1791 if (r & types)
1792 reg = r & RNUM_MASK;
1793 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1794 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1795 reg = (r & RNUM_MASK) - 2;
1796 }
1797 /* Else see if this is a register defined in an itbl entry. */
1798 else if ((types & RTYPE_GP) && itbl_have_entries)
1799 {
1800 char *n = *s;
1801 unsigned long r;
1802
1803 if (*n == '$')
1804 ++n;
1805 if (itbl_get_reg_val (n, &r))
1806 reg = r & RNUM_MASK;
1807 }
1808
1809 /* Advance to next token if a register was recognised. */
1810 if (reg >= 0)
1811 *s = e;
1812 else if (types & RWARN)
1813 as_warn (_("Unrecognized register name `%s'"), *s);
1814
1815 *e = save_c;
1816 if (regnop)
1817 *regnop = reg;
1818 return reg >= 0;
1819 }
1820
1821 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1822 architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
1823
1824 static bfd_boolean
1825 is_opcode_valid (const struct mips_opcode *mo)
1826 {
1827 int isa = mips_opts.isa;
1828 int fp_s, fp_d;
1829
1830 if (mips_opts.ase_mdmx)
1831 isa |= INSN_MDMX;
1832 if (mips_opts.ase_dsp)
1833 isa |= INSN_DSP;
1834 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1835 isa |= INSN_DSP64;
1836 if (mips_opts.ase_dspr2)
1837 isa |= INSN_DSPR2;
1838 if (mips_opts.ase_mt)
1839 isa |= INSN_MT;
1840 if (mips_opts.ase_mips3d)
1841 isa |= INSN_MIPS3D;
1842 if (mips_opts.ase_smartmips)
1843 isa |= INSN_SMARTMIPS;
1844
1845 /* Don't accept instructions based on the ISA if the CPU does not implement
1846 all the coprocessor insns. */
1847 if (NO_ISA_COP (mips_opts.arch)
1848 && COP_INSN (mo->pinfo))
1849 isa = 0;
1850
1851 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1852 return FALSE;
1853
1854 /* Check whether the instruction or macro requires single-precision or
1855 double-precision floating-point support. Note that this information is
1856 stored differently in the opcode table for insns and macros. */
1857 if (mo->pinfo == INSN_MACRO)
1858 {
1859 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1860 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1861 }
1862 else
1863 {
1864 fp_s = mo->pinfo & FP_S;
1865 fp_d = mo->pinfo & FP_D;
1866 }
1867
1868 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1869 return FALSE;
1870
1871 if (fp_s && mips_opts.soft_float)
1872 return FALSE;
1873
1874 return TRUE;
1875 }
1876
1877 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1878 selected ISA and architecture. */
1879
1880 static bfd_boolean
1881 is_opcode_valid_16 (const struct mips_opcode *mo)
1882 {
1883 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1884 }
1885
1886 /* This function is called once, at assembler startup time. It should set up
1887 all the tables, etc. that the MD part of the assembler will need. */
1888
1889 void
1890 md_begin (void)
1891 {
1892 const char *retval = NULL;
1893 int i = 0;
1894 int broken = 0;
1895
1896 if (mips_pic != NO_PIC)
1897 {
1898 if (g_switch_seen && g_switch_value != 0)
1899 as_bad (_("-G may not be used in position-independent code"));
1900 g_switch_value = 0;
1901 }
1902
1903 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1904 as_warn (_("Could not set architecture and machine"));
1905
1906 op_hash = hash_new ();
1907
1908 for (i = 0; i < NUMOPCODES;)
1909 {
1910 const char *name = mips_opcodes[i].name;
1911
1912 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1913 if (retval != NULL)
1914 {
1915 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1916 mips_opcodes[i].name, retval);
1917 /* Probably a memory allocation problem? Give up now. */
1918 as_fatal (_("Broken assembler. No assembly attempted."));
1919 }
1920 do
1921 {
1922 if (mips_opcodes[i].pinfo != INSN_MACRO)
1923 {
1924 if (!validate_mips_insn (&mips_opcodes[i]))
1925 broken = 1;
1926 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1927 {
1928 create_insn (&nop_insn, mips_opcodes + i);
1929 if (mips_fix_loongson2f_nop)
1930 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1931 nop_insn.fixed_p = 1;
1932 }
1933 }
1934 ++i;
1935 }
1936 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1937 }
1938
1939 mips16_op_hash = hash_new ();
1940
1941 i = 0;
1942 while (i < bfd_mips16_num_opcodes)
1943 {
1944 const char *name = mips16_opcodes[i].name;
1945
1946 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1947 if (retval != NULL)
1948 as_fatal (_("internal: can't hash `%s': %s"),
1949 mips16_opcodes[i].name, retval);
1950 do
1951 {
1952 if (mips16_opcodes[i].pinfo != INSN_MACRO
1953 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1954 != mips16_opcodes[i].match))
1955 {
1956 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1957 mips16_opcodes[i].name, mips16_opcodes[i].args);
1958 broken = 1;
1959 }
1960 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1961 {
1962 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1963 mips16_nop_insn.fixed_p = 1;
1964 }
1965 ++i;
1966 }
1967 while (i < bfd_mips16_num_opcodes
1968 && strcmp (mips16_opcodes[i].name, name) == 0);
1969 }
1970
1971 if (broken)
1972 as_fatal (_("Broken assembler. No assembly attempted."));
1973
1974 /* We add all the general register names to the symbol table. This
1975 helps us detect invalid uses of them. */
1976 for (i = 0; reg_names[i].name; i++)
1977 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1978 reg_names[i].num, /* & RNUM_MASK, */
1979 &zero_address_frag));
1980 if (HAVE_NEWABI)
1981 for (i = 0; reg_names_n32n64[i].name; i++)
1982 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1983 reg_names_n32n64[i].num, /* & RNUM_MASK, */
1984 &zero_address_frag));
1985 else
1986 for (i = 0; reg_names_o32[i].name; i++)
1987 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1988 reg_names_o32[i].num, /* & RNUM_MASK, */
1989 &zero_address_frag));
1990
1991 mips_no_prev_insn ();
1992
1993 mips_gprmask = 0;
1994 mips_cprmask[0] = 0;
1995 mips_cprmask[1] = 0;
1996 mips_cprmask[2] = 0;
1997 mips_cprmask[3] = 0;
1998
1999 /* set the default alignment for the text section (2**2) */
2000 record_alignment (text_section, 2);
2001
2002 bfd_set_gp_size (stdoutput, g_switch_value);
2003
2004 #ifdef OBJ_ELF
2005 if (IS_ELF)
2006 {
2007 /* On a native system other than VxWorks, sections must be aligned
2008 to 16 byte boundaries. When configured for an embedded ELF
2009 target, we don't bother. */
2010 if (strncmp (TARGET_OS, "elf", 3) != 0
2011 && strncmp (TARGET_OS, "vxworks", 7) != 0)
2012 {
2013 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2014 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2015 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2016 }
2017
2018 /* Create a .reginfo section for register masks and a .mdebug
2019 section for debugging information. */
2020 {
2021 segT seg;
2022 subsegT subseg;
2023 flagword flags;
2024 segT sec;
2025
2026 seg = now_seg;
2027 subseg = now_subseg;
2028
2029 /* The ABI says this section should be loaded so that the
2030 running program can access it. However, we don't load it
2031 if we are configured for an embedded target */
2032 flags = SEC_READONLY | SEC_DATA;
2033 if (strncmp (TARGET_OS, "elf", 3) != 0)
2034 flags |= SEC_ALLOC | SEC_LOAD;
2035
2036 if (mips_abi != N64_ABI)
2037 {
2038 sec = subseg_new (".reginfo", (subsegT) 0);
2039
2040 bfd_set_section_flags (stdoutput, sec, flags);
2041 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2042
2043 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2044 }
2045 else
2046 {
2047 /* The 64-bit ABI uses a .MIPS.options section rather than
2048 .reginfo section. */
2049 sec = subseg_new (".MIPS.options", (subsegT) 0);
2050 bfd_set_section_flags (stdoutput, sec, flags);
2051 bfd_set_section_alignment (stdoutput, sec, 3);
2052
2053 /* Set up the option header. */
2054 {
2055 Elf_Internal_Options opthdr;
2056 char *f;
2057
2058 opthdr.kind = ODK_REGINFO;
2059 opthdr.size = (sizeof (Elf_External_Options)
2060 + sizeof (Elf64_External_RegInfo));
2061 opthdr.section = 0;
2062 opthdr.info = 0;
2063 f = frag_more (sizeof (Elf_External_Options));
2064 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2065 (Elf_External_Options *) f);
2066
2067 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2068 }
2069 }
2070
2071 if (ECOFF_DEBUGGING)
2072 {
2073 sec = subseg_new (".mdebug", (subsegT) 0);
2074 (void) bfd_set_section_flags (stdoutput, sec,
2075 SEC_HAS_CONTENTS | SEC_READONLY);
2076 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2077 }
2078 else if (mips_flag_pdr)
2079 {
2080 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2081 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2082 SEC_READONLY | SEC_RELOC
2083 | SEC_DEBUGGING);
2084 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2085 }
2086
2087 subseg_set (seg, subseg);
2088 }
2089 }
2090 #endif /* OBJ_ELF */
2091
2092 if (! ECOFF_DEBUGGING)
2093 md_obj_begin ();
2094
2095 if (mips_fix_vr4120)
2096 init_vr4120_conflicts ();
2097 }
2098
2099 void
2100 md_mips_end (void)
2101 {
2102 if (! ECOFF_DEBUGGING)
2103 md_obj_end ();
2104 }
2105
2106 void
2107 md_assemble (char *str)
2108 {
2109 struct mips_cl_insn insn;
2110 bfd_reloc_code_real_type unused_reloc[3]
2111 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2112
2113 imm_expr.X_op = O_absent;
2114 imm2_expr.X_op = O_absent;
2115 offset_expr.X_op = O_absent;
2116 imm_reloc[0] = BFD_RELOC_UNUSED;
2117 imm_reloc[1] = BFD_RELOC_UNUSED;
2118 imm_reloc[2] = BFD_RELOC_UNUSED;
2119 offset_reloc[0] = BFD_RELOC_UNUSED;
2120 offset_reloc[1] = BFD_RELOC_UNUSED;
2121 offset_reloc[2] = BFD_RELOC_UNUSED;
2122
2123 if (mips_opts.mips16)
2124 mips16_ip (str, &insn);
2125 else
2126 {
2127 mips_ip (str, &insn);
2128 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2129 str, insn.insn_opcode));
2130 }
2131
2132 if (insn_error)
2133 {
2134 as_bad ("%s `%s'", insn_error, str);
2135 return;
2136 }
2137
2138 if (insn.insn_mo->pinfo == INSN_MACRO)
2139 {
2140 macro_start ();
2141 if (mips_opts.mips16)
2142 mips16_macro (&insn);
2143 else
2144 macro (&insn);
2145 macro_end ();
2146 }
2147 else
2148 {
2149 if (imm_expr.X_op != O_absent)
2150 append_insn (&insn, &imm_expr, imm_reloc);
2151 else if (offset_expr.X_op != O_absent)
2152 append_insn (&insn, &offset_expr, offset_reloc);
2153 else
2154 append_insn (&insn, NULL, unused_reloc);
2155 }
2156 }
2157
2158 /* Convenience functions for abstracting away the differences between
2159 MIPS16 and non-MIPS16 relocations. */
2160
2161 static inline bfd_boolean
2162 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2163 {
2164 switch (reloc)
2165 {
2166 case BFD_RELOC_MIPS16_JMP:
2167 case BFD_RELOC_MIPS16_GPREL:
2168 case BFD_RELOC_MIPS16_GOT16:
2169 case BFD_RELOC_MIPS16_CALL16:
2170 case BFD_RELOC_MIPS16_HI16_S:
2171 case BFD_RELOC_MIPS16_HI16:
2172 case BFD_RELOC_MIPS16_LO16:
2173 return TRUE;
2174
2175 default:
2176 return FALSE;
2177 }
2178 }
2179
2180 static inline bfd_boolean
2181 got16_reloc_p (bfd_reloc_code_real_type reloc)
2182 {
2183 return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2184 }
2185
2186 static inline bfd_boolean
2187 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2188 {
2189 return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2190 }
2191
2192 static inline bfd_boolean
2193 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2194 {
2195 return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2196 }
2197
2198 /* Return true if the given relocation might need a matching %lo().
2199 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2200 need a matching %lo() when applied to local symbols. */
2201
2202 static inline bfd_boolean
2203 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2204 {
2205 return (HAVE_IN_PLACE_ADDENDS
2206 && (hi16_reloc_p (reloc)
2207 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2208 all GOT16 relocations evaluate to "G". */
2209 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2210 }
2211
2212 /* Return the type of %lo() reloc needed by RELOC, given that
2213 reloc_needs_lo_p. */
2214
2215 static inline bfd_reloc_code_real_type
2216 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2217 {
2218 return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2219 }
2220
2221 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2222 relocation. */
2223
2224 static inline bfd_boolean
2225 fixup_has_matching_lo_p (fixS *fixp)
2226 {
2227 return (fixp->fx_next != NULL
2228 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2229 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2230 && fixp->fx_offset == fixp->fx_next->fx_offset);
2231 }
2232
2233 /* See whether instruction IP reads register REG. CLASS is the type
2234 of register. */
2235
2236 static int
2237 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2238 enum mips_regclass regclass)
2239 {
2240 if (regclass == MIPS16_REG)
2241 {
2242 gas_assert (mips_opts.mips16);
2243 reg = mips16_to_32_reg_map[reg];
2244 regclass = MIPS_GR_REG;
2245 }
2246
2247 /* Don't report on general register ZERO, since it never changes. */
2248 if (regclass == MIPS_GR_REG && reg == ZERO)
2249 return 0;
2250
2251 if (regclass == MIPS_FP_REG)
2252 {
2253 gas_assert (! mips_opts.mips16);
2254 /* If we are called with either $f0 or $f1, we must check $f0.
2255 This is not optimal, because it will introduce an unnecessary
2256 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2257 need to distinguish reading both $f0 and $f1 or just one of
2258 them. Note that we don't have to check the other way,
2259 because there is no instruction that sets both $f0 and $f1
2260 and requires a delay. */
2261 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2262 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2263 == (reg &~ (unsigned) 1)))
2264 return 1;
2265 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2266 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2267 == (reg &~ (unsigned) 1)))
2268 return 1;
2269 }
2270 else if (! mips_opts.mips16)
2271 {
2272 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2273 && EXTRACT_OPERAND (RS, *ip) == reg)
2274 return 1;
2275 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2276 && EXTRACT_OPERAND (RT, *ip) == reg)
2277 return 1;
2278 }
2279 else
2280 {
2281 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2282 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2283 return 1;
2284 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2285 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2286 return 1;
2287 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2288 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2289 == reg))
2290 return 1;
2291 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2292 return 1;
2293 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2294 return 1;
2295 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2296 return 1;
2297 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2298 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2299 return 1;
2300 }
2301
2302 return 0;
2303 }
2304
2305 /* This function returns true if modifying a register requires a
2306 delay. */
2307
2308 static int
2309 reg_needs_delay (unsigned int reg)
2310 {
2311 unsigned long prev_pinfo;
2312
2313 prev_pinfo = history[0].insn_mo->pinfo;
2314 if (! mips_opts.noreorder
2315 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2316 && ! gpr_interlocks)
2317 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2318 && ! cop_interlocks)))
2319 {
2320 /* A load from a coprocessor or from memory. All load delays
2321 delay the use of general register rt for one instruction. */
2322 /* Itbl support may require additional care here. */
2323 know (prev_pinfo & INSN_WRITE_GPR_T);
2324 if (reg == EXTRACT_OPERAND (RT, history[0]))
2325 return 1;
2326 }
2327
2328 return 0;
2329 }
2330
2331 /* Move all labels in insn_labels to the current insertion point. */
2332
2333 static void
2334 mips_move_labels (void)
2335 {
2336 segment_info_type *si = seg_info (now_seg);
2337 struct insn_label_list *l;
2338 valueT val;
2339
2340 for (l = si->label_list; l != NULL; l = l->next)
2341 {
2342 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2343 symbol_set_frag (l->label, frag_now);
2344 val = (valueT) frag_now_fix ();
2345 /* mips16 text labels are stored as odd. */
2346 if (mips_opts.mips16)
2347 ++val;
2348 S_SET_VALUE (l->label, val);
2349 }
2350 }
2351
2352 static bfd_boolean
2353 s_is_linkonce (symbolS *sym, segT from_seg)
2354 {
2355 bfd_boolean linkonce = FALSE;
2356 segT symseg = S_GET_SEGMENT (sym);
2357
2358 if (symseg != from_seg && !S_IS_LOCAL (sym))
2359 {
2360 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2361 linkonce = TRUE;
2362 #ifdef OBJ_ELF
2363 /* The GNU toolchain uses an extension for ELF: a section
2364 beginning with the magic string .gnu.linkonce is a
2365 linkonce section. */
2366 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2367 sizeof ".gnu.linkonce" - 1) == 0)
2368 linkonce = TRUE;
2369 #endif
2370 }
2371 return linkonce;
2372 }
2373
2374 /* Mark instruction labels in mips16 mode. This permits the linker to
2375 handle them specially, such as generating jalx instructions when
2376 needed. We also make them odd for the duration of the assembly, in
2377 order to generate the right sort of code. We will make them even
2378 in the adjust_symtab routine, while leaving them marked. This is
2379 convenient for the debugger and the disassembler. The linker knows
2380 to make them odd again. */
2381
2382 static void
2383 mips16_mark_labels (void)
2384 {
2385 segment_info_type *si = seg_info (now_seg);
2386 struct insn_label_list *l;
2387
2388 if (!mips_opts.mips16)
2389 return;
2390
2391 for (l = si->label_list; l != NULL; l = l->next)
2392 {
2393 symbolS *label = l->label;
2394
2395 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2396 if (IS_ELF)
2397 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2398 #endif
2399 if ((S_GET_VALUE (label) & 1) == 0
2400 /* Don't adjust the address if the label is global or weak, or
2401 in a link-once section, since we'll be emitting symbol reloc
2402 references to it which will be patched up by the linker, and
2403 the final value of the symbol may or may not be MIPS16. */
2404 && ! S_IS_WEAK (label)
2405 && ! S_IS_EXTERNAL (label)
2406 && ! s_is_linkonce (label, now_seg))
2407 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2408 }
2409 }
2410
2411 /* End the current frag. Make it a variant frag and record the
2412 relaxation info. */
2413
2414 static void
2415 relax_close_frag (void)
2416 {
2417 mips_macro_warning.first_frag = frag_now;
2418 frag_var (rs_machine_dependent, 0, 0,
2419 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2420 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2421
2422 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2423 mips_relax.first_fixup = 0;
2424 }
2425
2426 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2427 See the comment above RELAX_ENCODE for more details. */
2428
2429 static void
2430 relax_start (symbolS *symbol)
2431 {
2432 gas_assert (mips_relax.sequence == 0);
2433 mips_relax.sequence = 1;
2434 mips_relax.symbol = symbol;
2435 }
2436
2437 /* Start generating the second version of a relaxable sequence.
2438 See the comment above RELAX_ENCODE for more details. */
2439
2440 static void
2441 relax_switch (void)
2442 {
2443 gas_assert (mips_relax.sequence == 1);
2444 mips_relax.sequence = 2;
2445 }
2446
2447 /* End the current relaxable sequence. */
2448
2449 static void
2450 relax_end (void)
2451 {
2452 gas_assert (mips_relax.sequence == 2);
2453 relax_close_frag ();
2454 mips_relax.sequence = 0;
2455 }
2456
2457 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2458 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2459 by VR4120 errata. */
2460
2461 static unsigned int
2462 classify_vr4120_insn (const char *name)
2463 {
2464 if (strncmp (name, "macc", 4) == 0)
2465 return FIX_VR4120_MACC;
2466 if (strncmp (name, "dmacc", 5) == 0)
2467 return FIX_VR4120_DMACC;
2468 if (strncmp (name, "mult", 4) == 0)
2469 return FIX_VR4120_MULT;
2470 if (strncmp (name, "dmult", 5) == 0)
2471 return FIX_VR4120_DMULT;
2472 if (strstr (name, "div"))
2473 return FIX_VR4120_DIV;
2474 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2475 return FIX_VR4120_MTHILO;
2476 return NUM_FIX_VR4120_CLASSES;
2477 }
2478
2479 #define INSN_ERET 0x42000018
2480 #define INSN_DERET 0x4200001f
2481
2482 /* Return the number of instructions that must separate INSN1 and INSN2,
2483 where INSN1 is the earlier instruction. Return the worst-case value
2484 for any INSN2 if INSN2 is null. */
2485
2486 static unsigned int
2487 insns_between (const struct mips_cl_insn *insn1,
2488 const struct mips_cl_insn *insn2)
2489 {
2490 unsigned long pinfo1, pinfo2;
2491
2492 /* This function needs to know which pinfo flags are set for INSN2
2493 and which registers INSN2 uses. The former is stored in PINFO2 and
2494 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2495 will have every flag set and INSN2_USES_REG will always return true. */
2496 pinfo1 = insn1->insn_mo->pinfo;
2497 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2498
2499 #define INSN2_USES_REG(REG, CLASS) \
2500 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2501
2502 /* For most targets, write-after-read dependencies on the HI and LO
2503 registers must be separated by at least two instructions. */
2504 if (!hilo_interlocks)
2505 {
2506 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2507 return 2;
2508 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2509 return 2;
2510 }
2511
2512 /* If we're working around r7000 errata, there must be two instructions
2513 between an mfhi or mflo and any instruction that uses the result. */
2514 if (mips_7000_hilo_fix
2515 && MF_HILO_INSN (pinfo1)
2516 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2517 return 2;
2518
2519 /* If we're working around 24K errata, one instruction is required
2520 if an ERET or DERET is followed by a branch instruction. */
2521 if (mips_fix_24k)
2522 {
2523 if (insn1->insn_opcode == INSN_ERET
2524 || insn1->insn_opcode == INSN_DERET)
2525 {
2526 if (insn2 == NULL
2527 || insn2->insn_opcode == INSN_ERET
2528 || insn2->insn_opcode == INSN_DERET
2529 || (insn2->insn_mo->pinfo
2530 & (INSN_UNCOND_BRANCH_DELAY
2531 | INSN_COND_BRANCH_DELAY
2532 | INSN_COND_BRANCH_LIKELY)) != 0)
2533 return 1;
2534 }
2535 }
2536
2537 /* If working around VR4120 errata, check for combinations that need
2538 a single intervening instruction. */
2539 if (mips_fix_vr4120)
2540 {
2541 unsigned int class1, class2;
2542
2543 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2544 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2545 {
2546 if (insn2 == NULL)
2547 return 1;
2548 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2549 if (vr4120_conflicts[class1] & (1 << class2))
2550 return 1;
2551 }
2552 }
2553
2554 if (!mips_opts.mips16)
2555 {
2556 /* Check for GPR or coprocessor load delays. All such delays
2557 are on the RT register. */
2558 /* Itbl support may require additional care here. */
2559 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2560 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2561 {
2562 know (pinfo1 & INSN_WRITE_GPR_T);
2563 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2564 return 1;
2565 }
2566
2567 /* Check for generic coprocessor hazards.
2568
2569 This case is not handled very well. There is no special
2570 knowledge of CP0 handling, and the coprocessors other than
2571 the floating point unit are not distinguished at all. */
2572 /* Itbl support may require additional care here. FIXME!
2573 Need to modify this to include knowledge about
2574 user specified delays! */
2575 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2576 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2577 {
2578 /* Handle cases where INSN1 writes to a known general coprocessor
2579 register. There must be a one instruction delay before INSN2
2580 if INSN2 reads that register, otherwise no delay is needed. */
2581 if (pinfo1 & INSN_WRITE_FPR_T)
2582 {
2583 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2584 return 1;
2585 }
2586 else if (pinfo1 & INSN_WRITE_FPR_S)
2587 {
2588 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2589 return 1;
2590 }
2591 else
2592 {
2593 /* Read-after-write dependencies on the control registers
2594 require a two-instruction gap. */
2595 if ((pinfo1 & INSN_WRITE_COND_CODE)
2596 && (pinfo2 & INSN_READ_COND_CODE))
2597 return 2;
2598
2599 /* We don't know exactly what INSN1 does. If INSN2 is
2600 also a coprocessor instruction, assume there must be
2601 a one instruction gap. */
2602 if (pinfo2 & INSN_COP)
2603 return 1;
2604 }
2605 }
2606
2607 /* Check for read-after-write dependencies on the coprocessor
2608 control registers in cases where INSN1 does not need a general
2609 coprocessor delay. This means that INSN1 is a floating point
2610 comparison instruction. */
2611 /* Itbl support may require additional care here. */
2612 else if (!cop_interlocks
2613 && (pinfo1 & INSN_WRITE_COND_CODE)
2614 && (pinfo2 & INSN_READ_COND_CODE))
2615 return 1;
2616 }
2617
2618 #undef INSN2_USES_REG
2619
2620 return 0;
2621 }
2622
2623 /* Return the number of nops that would be needed to work around the
2624 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2625 the MAX_VR4130_NOPS instructions described by HIST. */
2626
2627 static int
2628 nops_for_vr4130 (const struct mips_cl_insn *hist,
2629 const struct mips_cl_insn *insn)
2630 {
2631 int i, j, reg;
2632
2633 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2634 are not affected by the errata. */
2635 if (insn != 0
2636 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2637 || strcmp (insn->insn_mo->name, "mtlo") == 0
2638 || strcmp (insn->insn_mo->name, "mthi") == 0))
2639 return 0;
2640
2641 /* Search for the first MFLO or MFHI. */
2642 for (i = 0; i < MAX_VR4130_NOPS; i++)
2643 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2644 {
2645 /* Extract the destination register. */
2646 if (mips_opts.mips16)
2647 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2648 else
2649 reg = EXTRACT_OPERAND (RD, hist[i]);
2650
2651 /* No nops are needed if INSN reads that register. */
2652 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2653 return 0;
2654
2655 /* ...or if any of the intervening instructions do. */
2656 for (j = 0; j < i; j++)
2657 if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2658 return 0;
2659
2660 return MAX_VR4130_NOPS - i;
2661 }
2662 return 0;
2663 }
2664
2665 /* Return the number of nops that would be needed if instruction INSN
2666 immediately followed the MAX_NOPS instructions given by HIST,
2667 where HIST[0] is the most recent instruction. If INSN is null,
2668 return the worse-case number of nops for any instruction. */
2669
2670 static int
2671 nops_for_insn (const struct mips_cl_insn *hist,
2672 const struct mips_cl_insn *insn)
2673 {
2674 int i, nops, tmp_nops;
2675
2676 nops = 0;
2677 for (i = 0; i < MAX_DELAY_NOPS; i++)
2678 {
2679 tmp_nops = insns_between (hist + i, insn) - i;
2680 if (tmp_nops > nops)
2681 nops = tmp_nops;
2682 }
2683
2684 if (mips_fix_vr4130)
2685 {
2686 tmp_nops = nops_for_vr4130 (hist, insn);
2687 if (tmp_nops > nops)
2688 nops = tmp_nops;
2689 }
2690
2691 return nops;
2692 }
2693
2694 /* The variable arguments provide NUM_INSNS extra instructions that
2695 might be added to HIST. Return the largest number of nops that
2696 would be needed after the extended sequence. */
2697
2698 static int
2699 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2700 {
2701 va_list args;
2702 struct mips_cl_insn buffer[MAX_NOPS];
2703 struct mips_cl_insn *cursor;
2704 int nops;
2705
2706 va_start (args, hist);
2707 cursor = buffer + num_insns;
2708 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2709 while (cursor > buffer)
2710 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2711
2712 nops = nops_for_insn (buffer, NULL);
2713 va_end (args);
2714 return nops;
2715 }
2716
2717 /* Like nops_for_insn, but if INSN is a branch, take into account the
2718 worst-case delay for the branch target. */
2719
2720 static int
2721 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2722 const struct mips_cl_insn *insn)
2723 {
2724 int nops, tmp_nops;
2725
2726 nops = nops_for_insn (hist, insn);
2727 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2728 | INSN_COND_BRANCH_DELAY
2729 | INSN_COND_BRANCH_LIKELY))
2730 {
2731 tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2732 if (tmp_nops > nops)
2733 nops = tmp_nops;
2734 }
2735 else if (mips_opts.mips16
2736 && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2737 | MIPS16_INSN_COND_BRANCH)))
2738 {
2739 tmp_nops = nops_for_sequence (1, hist, insn);
2740 if (tmp_nops > nops)
2741 nops = tmp_nops;
2742 }
2743 return nops;
2744 }
2745
2746 /* Fix NOP issue: Replace nops by "or at,at,zero". */
2747
2748 static void
2749 fix_loongson2f_nop (struct mips_cl_insn * ip)
2750 {
2751 if (strcmp (ip->insn_mo->name, "nop") == 0)
2752 ip->insn_opcode = LOONGSON2F_NOP_INSN;
2753 }
2754
2755 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2756 jr target pc &= 'hffff_ffff_cfff_ffff. */
2757
2758 static void
2759 fix_loongson2f_jump (struct mips_cl_insn * ip)
2760 {
2761 if (strcmp (ip->insn_mo->name, "j") == 0
2762 || strcmp (ip->insn_mo->name, "jr") == 0
2763 || strcmp (ip->insn_mo->name, "jalr") == 0)
2764 {
2765 int sreg;
2766 expressionS ep;
2767
2768 if (! mips_opts.at)
2769 return;
2770
2771 sreg = EXTRACT_OPERAND (RS, *ip);
2772 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2773 return;
2774
2775 ep.X_op = O_constant;
2776 ep.X_add_number = 0xcfff0000;
2777 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2778 ep.X_add_number = 0xffff;
2779 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2780 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2781 }
2782 }
2783
2784 static void
2785 fix_loongson2f (struct mips_cl_insn * ip)
2786 {
2787 if (mips_fix_loongson2f_nop)
2788 fix_loongson2f_nop (ip);
2789
2790 if (mips_fix_loongson2f_jump)
2791 fix_loongson2f_jump (ip);
2792 }
2793
2794 /* Output an instruction. IP is the instruction information.
2795 ADDRESS_EXPR is an operand of the instruction to be used with
2796 RELOC_TYPE. */
2797
2798 static void
2799 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2800 bfd_reloc_code_real_type *reloc_type)
2801 {
2802 unsigned long prev_pinfo, pinfo;
2803 relax_stateT prev_insn_frag_type = 0;
2804 bfd_boolean relaxed_branch = FALSE;
2805 segment_info_type *si = seg_info (now_seg);
2806
2807 if (mips_fix_loongson2f)
2808 fix_loongson2f (ip);
2809
2810 /* Mark instruction labels in mips16 mode. */
2811 mips16_mark_labels ();
2812
2813 file_ase_mips16 |= mips_opts.mips16;
2814
2815 prev_pinfo = history[0].insn_mo->pinfo;
2816 pinfo = ip->insn_mo->pinfo;
2817
2818 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2819 {
2820 /* There are a lot of optimizations we could do that we don't.
2821 In particular, we do not, in general, reorder instructions.
2822 If you use gcc with optimization, it will reorder
2823 instructions and generally do much more optimization then we
2824 do here; repeating all that work in the assembler would only
2825 benefit hand written assembly code, and does not seem worth
2826 it. */
2827 int nops = (mips_optimize == 0
2828 ? nops_for_insn (history, NULL)
2829 : nops_for_insn_or_target (history, ip));
2830 if (nops > 0)
2831 {
2832 fragS *old_frag;
2833 unsigned long old_frag_offset;
2834 int i;
2835
2836 old_frag = frag_now;
2837 old_frag_offset = frag_now_fix ();
2838
2839 for (i = 0; i < nops; i++)
2840 emit_nop ();
2841
2842 if (listing)
2843 {
2844 listing_prev_line ();
2845 /* We may be at the start of a variant frag. In case we
2846 are, make sure there is enough space for the frag
2847 after the frags created by listing_prev_line. The
2848 argument to frag_grow here must be at least as large
2849 as the argument to all other calls to frag_grow in
2850 this file. We don't have to worry about being in the
2851 middle of a variant frag, because the variants insert
2852 all needed nop instructions themselves. */
2853 frag_grow (40);
2854 }
2855
2856 mips_move_labels ();
2857
2858 #ifndef NO_ECOFF_DEBUGGING
2859 if (ECOFF_DEBUGGING)
2860 ecoff_fix_loc (old_frag, old_frag_offset);
2861 #endif
2862 }
2863 }
2864 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2865 {
2866 /* Work out how many nops in prev_nop_frag are needed by IP. */
2867 int nops = nops_for_insn_or_target (history, ip);
2868 gas_assert (nops <= prev_nop_frag_holds);
2869
2870 /* Enforce NOPS as a minimum. */
2871 if (nops > prev_nop_frag_required)
2872 prev_nop_frag_required = nops;
2873
2874 if (prev_nop_frag_holds == prev_nop_frag_required)
2875 {
2876 /* Settle for the current number of nops. Update the history
2877 accordingly (for the benefit of any future .set reorder code). */
2878 prev_nop_frag = NULL;
2879 insert_into_history (prev_nop_frag_since,
2880 prev_nop_frag_holds, NOP_INSN);
2881 }
2882 else
2883 {
2884 /* Allow this instruction to replace one of the nops that was
2885 tentatively added to prev_nop_frag. */
2886 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2887 prev_nop_frag_holds--;
2888 prev_nop_frag_since++;
2889 }
2890 }
2891
2892 #ifdef OBJ_ELF
2893 /* The value passed to dwarf2_emit_insn is the distance between
2894 the beginning of the current instruction and the address that
2895 should be recorded in the debug tables. For MIPS16 debug info
2896 we want to use ISA-encoded addresses, so we pass -1 for an
2897 address higher by one than the current. */
2898 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2899 #endif
2900
2901 /* Record the frag type before frag_var. */
2902 if (history[0].frag)
2903 prev_insn_frag_type = history[0].frag->fr_type;
2904
2905 if (address_expr
2906 && *reloc_type == BFD_RELOC_16_PCREL_S2
2907 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2908 || pinfo & INSN_COND_BRANCH_LIKELY)
2909 && mips_relax_branch
2910 /* Don't try branch relaxation within .set nomacro, or within
2911 .set noat if we use $at for PIC computations. If it turns
2912 out that the branch was out-of-range, we'll get an error. */
2913 && !mips_opts.warn_about_macros
2914 && (mips_opts.at || mips_pic == NO_PIC)
2915 && !mips_opts.mips16)
2916 {
2917 relaxed_branch = TRUE;
2918 add_relaxed_insn (ip, (relaxed_branch_length
2919 (NULL, NULL,
2920 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2921 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2922 : 0)), 4,
2923 RELAX_BRANCH_ENCODE
2924 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2925 pinfo & INSN_COND_BRANCH_LIKELY,
2926 pinfo & INSN_WRITE_GPR_31,
2927 0),
2928 address_expr->X_add_symbol,
2929 address_expr->X_add_number);
2930 *reloc_type = BFD_RELOC_UNUSED;
2931 }
2932 else if (*reloc_type > BFD_RELOC_UNUSED)
2933 {
2934 /* We need to set up a variant frag. */
2935 gas_assert (mips_opts.mips16 && address_expr != NULL);
2936 add_relaxed_insn (ip, 4, 0,
2937 RELAX_MIPS16_ENCODE
2938 (*reloc_type - BFD_RELOC_UNUSED,
2939 mips16_small, mips16_ext,
2940 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2941 history[0].mips16_absolute_jump_p),
2942 make_expr_symbol (address_expr), 0);
2943 }
2944 else if (mips_opts.mips16
2945 && ! ip->use_extend
2946 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2947 {
2948 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2949 /* Make sure there is enough room to swap this instruction with
2950 a following jump instruction. */
2951 frag_grow (6);
2952 add_fixed_insn (ip);
2953 }
2954 else
2955 {
2956 if (mips_opts.mips16
2957 && mips_opts.noreorder
2958 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2959 as_warn (_("extended instruction in delay slot"));
2960
2961 if (mips_relax.sequence)
2962 {
2963 /* If we've reached the end of this frag, turn it into a variant
2964 frag and record the information for the instructions we've
2965 written so far. */
2966 if (frag_room () < 4)
2967 relax_close_frag ();
2968 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2969 }
2970
2971 if (mips_relax.sequence != 2)
2972 mips_macro_warning.sizes[0] += 4;
2973 if (mips_relax.sequence != 1)
2974 mips_macro_warning.sizes[1] += 4;
2975
2976 if (mips_opts.mips16)
2977 {
2978 ip->fixed_p = 1;
2979 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2980 }
2981 add_fixed_insn (ip);
2982 }
2983
2984 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2985 {
2986 if (address_expr->X_op == O_constant)
2987 {
2988 unsigned int tmp;
2989
2990 switch (*reloc_type)
2991 {
2992 case BFD_RELOC_32:
2993 ip->insn_opcode |= address_expr->X_add_number;
2994 break;
2995
2996 case BFD_RELOC_MIPS_HIGHEST:
2997 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2998 ip->insn_opcode |= tmp & 0xffff;
2999 break;
3000
3001 case BFD_RELOC_MIPS_HIGHER:
3002 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3003 ip->insn_opcode |= tmp & 0xffff;
3004 break;
3005
3006 case BFD_RELOC_HI16_S:
3007 tmp = (address_expr->X_add_number + 0x8000) >> 16;
3008 ip->insn_opcode |= tmp & 0xffff;
3009 break;
3010
3011 case BFD_RELOC_HI16:
3012 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3013 break;
3014
3015 case BFD_RELOC_UNUSED:
3016 case BFD_RELOC_LO16:
3017 case BFD_RELOC_MIPS_GOT_DISP:
3018 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3019 break;
3020
3021 case BFD_RELOC_MIPS_JMP:
3022 if ((address_expr->X_add_number & 3) != 0)
3023 as_bad (_("jump to misaligned address (0x%lx)"),
3024 (unsigned long) address_expr->X_add_number);
3025 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3026 break;
3027
3028 case BFD_RELOC_MIPS16_JMP:
3029 if ((address_expr->X_add_number & 3) != 0)
3030 as_bad (_("jump to misaligned address (0x%lx)"),
3031 (unsigned long) address_expr->X_add_number);
3032 ip->insn_opcode |=
3033 (((address_expr->X_add_number & 0x7c0000) << 3)
3034 | ((address_expr->X_add_number & 0xf800000) >> 7)
3035 | ((address_expr->X_add_number & 0x3fffc) >> 2));
3036 break;
3037
3038 case BFD_RELOC_16_PCREL_S2:
3039 if ((address_expr->X_add_number & 3) != 0)
3040 as_bad (_("branch to misaligned address (0x%lx)"),
3041 (unsigned long) address_expr->X_add_number);
3042 if (mips_relax_branch)
3043 goto need_reloc;
3044 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3045 as_bad (_("branch address range overflow (0x%lx)"),
3046 (unsigned long) address_expr->X_add_number);
3047 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3048 break;
3049
3050 default:
3051 internalError ();
3052 }
3053 }
3054 else if (*reloc_type < BFD_RELOC_UNUSED)
3055 need_reloc:
3056 {
3057 reloc_howto_type *howto;
3058 int i;
3059
3060 /* In a compound relocation, it is the final (outermost)
3061 operator that determines the relocated field. */
3062 for (i = 1; i < 3; i++)
3063 if (reloc_type[i] == BFD_RELOC_UNUSED)
3064 break;
3065
3066 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3067 if (howto == NULL)
3068 {
3069 /* To reproduce this failure try assembling gas/testsuites/
3070 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3071 assembler. */
3072 as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3073 howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3074 }
3075
3076 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3077 bfd_get_reloc_size (howto),
3078 address_expr,
3079 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3080 reloc_type[0]);
3081
3082 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
3083 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3084 && ip->fixp[0]->fx_addsy)
3085 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3086
3087 /* These relocations can have an addend that won't fit in
3088 4 octets for 64bit assembly. */
3089 if (HAVE_64BIT_GPRS
3090 && ! howto->partial_inplace
3091 && (reloc_type[0] == BFD_RELOC_16
3092 || reloc_type[0] == BFD_RELOC_32
3093 || reloc_type[0] == BFD_RELOC_MIPS_JMP
3094 || reloc_type[0] == BFD_RELOC_GPREL16
3095 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3096 || reloc_type[0] == BFD_RELOC_GPREL32
3097 || reloc_type[0] == BFD_RELOC_64
3098 || reloc_type[0] == BFD_RELOC_CTOR
3099 || reloc_type[0] == BFD_RELOC_MIPS_SUB
3100 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3101 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3102 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3103 || reloc_type[0] == BFD_RELOC_MIPS_REL16
3104 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3105 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3106 || hi16_reloc_p (reloc_type[0])
3107 || lo16_reloc_p (reloc_type[0])))
3108 ip->fixp[0]->fx_no_overflow = 1;
3109
3110 if (mips_relax.sequence)
3111 {
3112 if (mips_relax.first_fixup == 0)
3113 mips_relax.first_fixup = ip->fixp[0];
3114 }
3115 else if (reloc_needs_lo_p (*reloc_type))
3116 {
3117 struct mips_hi_fixup *hi_fixup;
3118
3119 /* Reuse the last entry if it already has a matching %lo. */
3120 hi_fixup = mips_hi_fixup_list;
3121 if (hi_fixup == 0
3122 || !fixup_has_matching_lo_p (hi_fixup->fixp))
3123 {
3124 hi_fixup = ((struct mips_hi_fixup *)
3125 xmalloc (sizeof (struct mips_hi_fixup)));
3126 hi_fixup->next = mips_hi_fixup_list;
3127 mips_hi_fixup_list = hi_fixup;
3128 }
3129 hi_fixup->fixp = ip->fixp[0];
3130 hi_fixup->seg = now_seg;
3131 }
3132
3133 /* Add fixups for the second and third relocations, if given.
3134 Note that the ABI allows the second relocation to be
3135 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
3136 moment we only use RSS_UNDEF, but we could add support
3137 for the others if it ever becomes necessary. */
3138 for (i = 1; i < 3; i++)
3139 if (reloc_type[i] != BFD_RELOC_UNUSED)
3140 {
3141 ip->fixp[i] = fix_new (ip->frag, ip->where,
3142 ip->fixp[0]->fx_size, NULL, 0,
3143 FALSE, reloc_type[i]);
3144
3145 /* Use fx_tcbit to mark compound relocs. */
3146 ip->fixp[0]->fx_tcbit = 1;
3147 ip->fixp[i]->fx_tcbit = 1;
3148 }
3149 }
3150 }
3151 install_insn (ip);
3152
3153 /* Update the register mask information. */
3154 if (! mips_opts.mips16)
3155 {
3156 if (pinfo & INSN_WRITE_GPR_D)
3157 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3158 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3159 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3160 if (pinfo & INSN_READ_GPR_S)
3161 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3162 if (pinfo & INSN_WRITE_GPR_31)
3163 mips_gprmask |= 1 << RA;
3164 if (pinfo & INSN_WRITE_FPR_D)
3165 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3166 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3167 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3168 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3169 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3170 if ((pinfo & INSN_READ_FPR_R) != 0)
3171 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3172 if (pinfo & INSN_COP)
3173 {
3174 /* We don't keep enough information to sort these cases out.
3175 The itbl support does keep this information however, although
3176 we currently don't support itbl fprmats as part of the cop
3177 instruction. May want to add this support in the future. */
3178 }
3179 /* Never set the bit for $0, which is always zero. */
3180 mips_gprmask &= ~1 << 0;
3181 }
3182 else
3183 {
3184 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3185 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3186 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3187 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3188 if (pinfo & MIPS16_INSN_WRITE_Z)
3189 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3190 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3191 mips_gprmask |= 1 << TREG;
3192 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3193 mips_gprmask |= 1 << SP;
3194 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3195 mips_gprmask |= 1 << RA;
3196 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3197 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3198 if (pinfo & MIPS16_INSN_READ_Z)
3199 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3200 if (pinfo & MIPS16_INSN_READ_GPR_X)
3201 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3202 }
3203
3204 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3205 {
3206 /* Filling the branch delay slot is more complex. We try to
3207 switch the branch with the previous instruction, which we can
3208 do if the previous instruction does not set up a condition
3209 that the branch tests and if the branch is not itself the
3210 target of any branch. */
3211 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3212 || (pinfo & INSN_COND_BRANCH_DELAY))
3213 {
3214 if (mips_optimize < 2
3215 /* If we have seen .set volatile or .set nomove, don't
3216 optimize. */
3217 || mips_opts.nomove != 0
3218 /* We can't swap if the previous instruction's position
3219 is fixed. */
3220 || history[0].fixed_p
3221 /* If the previous previous insn was in a .set
3222 noreorder, we can't swap. Actually, the MIPS
3223 assembler will swap in this situation. However, gcc
3224 configured -with-gnu-as will generate code like
3225 .set noreorder
3226 lw $4,XXX
3227 .set reorder
3228 INSN
3229 bne $4,$0,foo
3230 in which we can not swap the bne and INSN. If gcc is
3231 not configured -with-gnu-as, it does not output the
3232 .set pseudo-ops. */
3233 || history[1].noreorder_p
3234 /* If the branch is itself the target of a branch, we
3235 can not swap. We cheat on this; all we check for is
3236 whether there is a label on this instruction. If
3237 there are any branches to anything other than a
3238 label, users must use .set noreorder. */
3239 || si->label_list != NULL
3240 /* If the previous instruction is in a variant frag
3241 other than this branch's one, we cannot do the swap.
3242 This does not apply to the mips16, which uses variant
3243 frags for different purposes. */
3244 || (! mips_opts.mips16
3245 && prev_insn_frag_type == rs_machine_dependent)
3246 /* Check for conflicts between the branch and the instructions
3247 before the candidate delay slot. */
3248 || nops_for_insn (history + 1, ip) > 0
3249 /* Check for conflicts between the swapped sequence and the
3250 target of the branch. */
3251 || nops_for_sequence (2, history + 1, ip, history) > 0
3252 /* We do not swap with a trap instruction, since it
3253 complicates trap handlers to have the trap
3254 instruction be in a delay slot. */
3255 || (prev_pinfo & INSN_TRAP)
3256 /* If the branch reads a register that the previous
3257 instruction sets, we can not swap. */
3258 || (! mips_opts.mips16
3259 && (prev_pinfo & INSN_WRITE_GPR_T)
3260 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3261 MIPS_GR_REG))
3262 || (! mips_opts.mips16
3263 && (prev_pinfo & INSN_WRITE_GPR_D)
3264 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3265 MIPS_GR_REG))
3266 || (mips_opts.mips16
3267 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3268 && (insn_uses_reg
3269 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3270 MIPS16_REG)))
3271 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3272 && (insn_uses_reg
3273 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3274 MIPS16_REG)))
3275 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3276 && (insn_uses_reg
3277 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3278 MIPS16_REG)))
3279 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3280 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3281 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3282 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3283 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3284 && insn_uses_reg (ip,
3285 MIPS16OP_EXTRACT_REG32R
3286 (history[0].insn_opcode),
3287 MIPS_GR_REG))))
3288 /* If the branch writes a register that the previous
3289 instruction sets, we can not swap (we know that
3290 branches write only to RD or to $31). */
3291 || (! mips_opts.mips16
3292 && (prev_pinfo & INSN_WRITE_GPR_T)
3293 && (((pinfo & INSN_WRITE_GPR_D)
3294 && (EXTRACT_OPERAND (RT, history[0])
3295 == EXTRACT_OPERAND (RD, *ip)))
3296 || ((pinfo & INSN_WRITE_GPR_31)
3297 && EXTRACT_OPERAND (RT, history[0]) == RA)))
3298 || (! mips_opts.mips16
3299 && (prev_pinfo & INSN_WRITE_GPR_D)
3300 && (((pinfo & INSN_WRITE_GPR_D)
3301 && (EXTRACT_OPERAND (RD, history[0])
3302 == EXTRACT_OPERAND (RD, *ip)))
3303 || ((pinfo & INSN_WRITE_GPR_31)
3304 && EXTRACT_OPERAND (RD, history[0]) == RA)))
3305 || (mips_opts.mips16
3306 && (pinfo & MIPS16_INSN_WRITE_31)
3307 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3308 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3309 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3310 == RA))))
3311 /* If the branch writes a register that the previous
3312 instruction reads, we can not swap (we know that
3313 branches only write to RD or to $31). */
3314 || (! mips_opts.mips16
3315 && (pinfo & INSN_WRITE_GPR_D)
3316 && insn_uses_reg (&history[0],
3317 EXTRACT_OPERAND (RD, *ip),
3318 MIPS_GR_REG))
3319 || (! mips_opts.mips16
3320 && (pinfo & INSN_WRITE_GPR_31)
3321 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3322 || (mips_opts.mips16
3323 && (pinfo & MIPS16_INSN_WRITE_31)
3324 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3325 /* If one instruction sets a condition code and the
3326 other one uses a condition code, we can not swap. */
3327 || ((pinfo & INSN_READ_COND_CODE)
3328 && (prev_pinfo & INSN_WRITE_COND_CODE))
3329 || ((pinfo & INSN_WRITE_COND_CODE)
3330 && (prev_pinfo & INSN_READ_COND_CODE))
3331 /* If the previous instruction uses the PC, we can not
3332 swap. */
3333 || (mips_opts.mips16
3334 && (prev_pinfo & MIPS16_INSN_READ_PC))
3335 /* If the previous instruction had a fixup in mips16
3336 mode, we can not swap. This normally means that the
3337 previous instruction was a 4 byte branch anyhow. */
3338 || (mips_opts.mips16 && history[0].fixp[0])
3339 /* If the previous instruction is a sync, sync.l, or
3340 sync.p, we can not swap. */
3341 || (prev_pinfo & INSN_SYNC)
3342 /* If the previous instruction is an ERET or
3343 DERET, avoid the swap. */
3344 || (history[0].insn_opcode == INSN_ERET)
3345 || (history[0].insn_opcode == INSN_DERET))
3346 {
3347 if (mips_opts.mips16
3348 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3349 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3350 && ISA_SUPPORTS_MIPS16E)
3351 {
3352 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3353 ip->insn_opcode |= 0x0080;
3354 install_insn (ip);
3355 insert_into_history (0, 1, ip);
3356 }
3357 else
3358 {
3359 /* We could do even better for unconditional branches to
3360 portions of this object file; we could pick up the
3361 instruction at the destination, put it in the delay
3362 slot, and bump the destination address. */
3363 insert_into_history (0, 1, ip);
3364 emit_nop ();
3365 }
3366
3367 if (mips_relax.sequence)
3368 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3369 }
3370 else
3371 {
3372 /* It looks like we can actually do the swap. */
3373 struct mips_cl_insn delay = history[0];
3374 if (mips_opts.mips16)
3375 {
3376 know (delay.frag == ip->frag);
3377 move_insn (ip, delay.frag, delay.where);
3378 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3379 }
3380 else if (relaxed_branch)
3381 {
3382 /* Add the delay slot instruction to the end of the
3383 current frag and shrink the fixed part of the
3384 original frag. If the branch occupies the tail of
3385 the latter, move it backwards to cover the gap. */
3386 delay.frag->fr_fix -= 4;
3387 if (delay.frag == ip->frag)
3388 move_insn (ip, ip->frag, ip->where - 4);
3389 add_fixed_insn (&delay);
3390 }
3391 else
3392 {
3393 move_insn (&delay, ip->frag, ip->where);
3394 move_insn (ip, history[0].frag, history[0].where);
3395 }
3396 history[0] = *ip;
3397 delay.fixed_p = 1;
3398 insert_into_history (0, 1, &delay);
3399 }
3400
3401 /* If that was an unconditional branch, forget the previous
3402 insn information. */
3403 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3404 {
3405 mips_no_prev_insn ();
3406 }
3407 }
3408 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3409 {
3410 /* We don't yet optimize a branch likely. What we should do
3411 is look at the target, copy the instruction found there
3412 into the delay slot, and increment the branch to jump to
3413 the next instruction. */
3414 insert_into_history (0, 1, ip);
3415 emit_nop ();
3416 }
3417 else
3418 insert_into_history (0, 1, ip);
3419 }
3420 else
3421 insert_into_history (0, 1, ip);
3422
3423 /* We just output an insn, so the next one doesn't have a label. */
3424 mips_clear_insn_labels ();
3425 }
3426
3427 /* Forget that there was any previous instruction or label. */
3428
3429 static void
3430 mips_no_prev_insn (void)
3431 {
3432 prev_nop_frag = NULL;
3433 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3434 mips_clear_insn_labels ();
3435 }
3436
3437 /* This function must be called before we emit something other than
3438 instructions. It is like mips_no_prev_insn except that it inserts
3439 any NOPS that might be needed by previous instructions. */
3440
3441 void
3442 mips_emit_delays (void)
3443 {
3444 if (! mips_opts.noreorder)
3445 {
3446 int nops = nops_for_insn (history, NULL);
3447 if (nops > 0)
3448 {
3449 while (nops-- > 0)
3450 add_fixed_insn (NOP_INSN);
3451 mips_move_labels ();
3452 }
3453 }
3454 mips_no_prev_insn ();
3455 }
3456
3457 /* Start a (possibly nested) noreorder block. */
3458
3459 static void
3460 start_noreorder (void)
3461 {
3462 if (mips_opts.noreorder == 0)
3463 {
3464 unsigned int i;
3465 int nops;
3466
3467 /* None of the instructions before the .set noreorder can be moved. */
3468 for (i = 0; i < ARRAY_SIZE (history); i++)
3469 history[i].fixed_p = 1;
3470
3471 /* Insert any nops that might be needed between the .set noreorder
3472 block and the previous instructions. We will later remove any
3473 nops that turn out not to be needed. */
3474 nops = nops_for_insn (history, NULL);
3475 if (nops > 0)
3476 {
3477 if (mips_optimize != 0)
3478 {
3479 /* Record the frag which holds the nop instructions, so
3480 that we can remove them if we don't need them. */
3481 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3482 prev_nop_frag = frag_now;
3483 prev_nop_frag_holds = nops;
3484 prev_nop_frag_required = 0;
3485 prev_nop_frag_since = 0;
3486 }
3487
3488 for (; nops > 0; --nops)
3489 add_fixed_insn (NOP_INSN);
3490
3491 /* Move on to a new frag, so that it is safe to simply
3492 decrease the size of prev_nop_frag. */
3493 frag_wane (frag_now);
3494 frag_new (0);
3495 mips_move_labels ();
3496 }
3497 mips16_mark_labels ();
3498 mips_clear_insn_labels ();
3499 }
3500 mips_opts.noreorder++;
3501 mips_any_noreorder = 1;
3502 }
3503
3504 /* End a nested noreorder block. */
3505
3506 static void
3507 end_noreorder (void)
3508 {
3509
3510 mips_opts.noreorder--;
3511 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3512 {
3513 /* Commit to inserting prev_nop_frag_required nops and go back to
3514 handling nop insertion the .set reorder way. */
3515 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3516 * (mips_opts.mips16 ? 2 : 4));
3517 insert_into_history (prev_nop_frag_since,
3518 prev_nop_frag_required, NOP_INSN);
3519 prev_nop_frag = NULL;
3520 }
3521 }
3522
3523 /* Set up global variables for the start of a new macro. */
3524
3525 static void
3526 macro_start (void)
3527 {
3528 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3529 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3530 && (history[0].insn_mo->pinfo
3531 & (INSN_UNCOND_BRANCH_DELAY
3532 | INSN_COND_BRANCH_DELAY
3533 | INSN_COND_BRANCH_LIKELY)) != 0);
3534 }
3535
3536 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3537 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3538 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3539
3540 static const char *
3541 macro_warning (relax_substateT subtype)
3542 {
3543 if (subtype & RELAX_DELAY_SLOT)
3544 return _("Macro instruction expanded into multiple instructions"
3545 " in a branch delay slot");
3546 else if (subtype & RELAX_NOMACRO)
3547 return _("Macro instruction expanded into multiple instructions");
3548 else
3549 return 0;
3550 }
3551
3552 /* Finish up a macro. Emit warnings as appropriate. */
3553
3554 static void
3555 macro_end (void)
3556 {
3557 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3558 {
3559 relax_substateT subtype;
3560
3561 /* Set up the relaxation warning flags. */
3562 subtype = 0;
3563 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3564 subtype |= RELAX_SECOND_LONGER;
3565 if (mips_opts.warn_about_macros)
3566 subtype |= RELAX_NOMACRO;
3567 if (mips_macro_warning.delay_slot_p)
3568 subtype |= RELAX_DELAY_SLOT;
3569
3570 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3571 {
3572 /* Either the macro has a single implementation or both
3573 implementations are longer than 4 bytes. Emit the
3574 warning now. */
3575 const char *msg = macro_warning (subtype);
3576 if (msg != 0)
3577 as_warn ("%s", msg);
3578 }
3579 else
3580 {
3581 /* One implementation might need a warning but the other
3582 definitely doesn't. */
3583 mips_macro_warning.first_frag->fr_subtype |= subtype;
3584 }
3585 }
3586 }
3587
3588 /* Read a macro's relocation codes from *ARGS and store them in *R.
3589 The first argument in *ARGS will be either the code for a single
3590 relocation or -1 followed by the three codes that make up a
3591 composite relocation. */
3592
3593 static void
3594 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3595 {
3596 int i, next;
3597
3598 next = va_arg (*args, int);
3599 if (next >= 0)
3600 r[0] = (bfd_reloc_code_real_type) next;
3601 else
3602 for (i = 0; i < 3; i++)
3603 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3604 }
3605
3606 /* Build an instruction created by a macro expansion. This is passed
3607 a pointer to the count of instructions created so far, an
3608 expression, the name of the instruction to build, an operand format
3609 string, and corresponding arguments. */
3610
3611 static void
3612 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3613 {
3614 const struct mips_opcode *mo;
3615 struct mips_cl_insn insn;
3616 bfd_reloc_code_real_type r[3];
3617 va_list args;
3618
3619 va_start (args, fmt);
3620
3621 if (mips_opts.mips16)
3622 {
3623 mips16_macro_build (ep, name, fmt, &args);
3624 va_end (args);
3625 return;
3626 }
3627
3628 r[0] = BFD_RELOC_UNUSED;
3629 r[1] = BFD_RELOC_UNUSED;
3630 r[2] = BFD_RELOC_UNUSED;
3631 mo = (struct mips_opcode *) hash_find (op_hash, name);
3632 gas_assert (mo);
3633 gas_assert (strcmp (name, mo->name) == 0);
3634
3635 while (1)
3636 {
3637 /* Search until we get a match for NAME. It is assumed here that
3638 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3639 if (strcmp (fmt, mo->args) == 0
3640 && mo->pinfo != INSN_MACRO
3641 && is_opcode_valid (mo))
3642 break;
3643
3644 ++mo;
3645 gas_assert (mo->name);
3646 gas_assert (strcmp (name, mo->name) == 0);
3647 }
3648
3649 create_insn (&insn, mo);
3650 for (;;)
3651 {
3652 switch (*fmt++)
3653 {
3654 case '\0':
3655 break;
3656
3657 case ',':
3658 case '(':
3659 case ')':
3660 continue;
3661
3662 case '+':
3663 switch (*fmt++)
3664 {
3665 case 'A':
3666 case 'E':
3667 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3668 continue;
3669
3670 case 'B':
3671 case 'F':
3672 /* Note that in the macro case, these arguments are already
3673 in MSB form. (When handling the instruction in the
3674 non-macro case, these arguments are sizes from which
3675 MSB values must be calculated.) */
3676 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3677 continue;
3678
3679 case 'C':
3680 case 'G':
3681 case 'H':
3682 /* Note that in the macro case, these arguments are already
3683 in MSBD form. (When handling the instruction in the
3684 non-macro case, these arguments are sizes from which
3685 MSBD values must be calculated.) */
3686 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3687 continue;
3688
3689 case 'Q':
3690 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3691 continue;
3692
3693 default:
3694 internalError ();
3695 }
3696 continue;
3697
3698 case '2':
3699 INSERT_OPERAND (BP, insn, va_arg (args, int));
3700 continue;
3701
3702 case 't':
3703 case 'w':
3704 case 'E':
3705 INSERT_OPERAND (RT, insn, va_arg (args, int));
3706 continue;
3707
3708 case 'c':
3709 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3710 continue;
3711
3712 case 'T':
3713 case 'W':
3714 INSERT_OPERAND (FT, insn, va_arg (args, int));
3715 continue;
3716
3717 case 'd':
3718 case 'G':
3719 case 'K':
3720 INSERT_OPERAND (RD, insn, va_arg (args, int));
3721 continue;
3722
3723 case 'U':
3724 {
3725 int tmp = va_arg (args, int);
3726
3727 INSERT_OPERAND (RT, insn, tmp);
3728 INSERT_OPERAND (RD, insn, tmp);
3729 continue;
3730 }
3731
3732 case 'V':
3733 case 'S':
3734 INSERT_OPERAND (FS, insn, va_arg (args, int));
3735 continue;
3736
3737 case 'z':
3738 continue;
3739
3740 case '<':
3741 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3742 continue;
3743
3744 case 'D':
3745 INSERT_OPERAND (FD, insn, va_arg (args, int));
3746 continue;
3747
3748 case 'B':
3749 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3750 continue;
3751
3752 case 'J':
3753 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3754 continue;
3755
3756 case 'q':
3757 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3758 continue;
3759
3760 case 'b':
3761 case 's':
3762 case 'r':
3763 case 'v':
3764 INSERT_OPERAND (RS, insn, va_arg (args, int));
3765 continue;
3766
3767 case 'i':
3768 case 'j':
3769 macro_read_relocs (&args, r);
3770 gas_assert (*r == BFD_RELOC_GPREL16
3771 || *r == BFD_RELOC_MIPS_HIGHER
3772 || *r == BFD_RELOC_HI16_S
3773 || *r == BFD_RELOC_LO16
3774 || *r == BFD_RELOC_MIPS_GOT_OFST);
3775 continue;
3776
3777 case 'o':
3778 macro_read_relocs (&args, r);
3779 continue;
3780
3781 case 'u':
3782 macro_read_relocs (&args, r);
3783 gas_assert (ep != NULL
3784 && (ep->X_op == O_constant
3785 || (ep->X_op == O_symbol
3786 && (*r == BFD_RELOC_MIPS_HIGHEST
3787 || *r == BFD_RELOC_HI16_S
3788 || *r == BFD_RELOC_HI16
3789 || *r == BFD_RELOC_GPREL16
3790 || *r == BFD_RELOC_MIPS_GOT_HI16
3791 || *r == BFD_RELOC_MIPS_CALL_HI16))));
3792 continue;
3793
3794 case 'p':
3795 gas_assert (ep != NULL);
3796
3797 /*
3798 * This allows macro() to pass an immediate expression for
3799 * creating short branches without creating a symbol.
3800 *
3801 * We don't allow branch relaxation for these branches, as
3802 * they should only appear in ".set nomacro" anyway.
3803 */
3804 if (ep->X_op == O_constant)
3805 {
3806 if ((ep->X_add_number & 3) != 0)
3807 as_bad (_("branch to misaligned address (0x%lx)"),
3808 (unsigned long) ep->X_add_number);
3809 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3810 as_bad (_("branch address range overflow (0x%lx)"),
3811 (unsigned long) ep->X_add_number);
3812 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3813 ep = NULL;
3814 }
3815 else
3816 *r = BFD_RELOC_16_PCREL_S2;
3817 continue;
3818
3819 case 'a':
3820 gas_assert (ep != NULL);
3821 *r = BFD_RELOC_MIPS_JMP;
3822 continue;
3823
3824 case 'C':
3825 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3826 continue;
3827
3828 case 'k':
3829 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3830 continue;
3831
3832 default:
3833 internalError ();
3834 }
3835 break;
3836 }
3837 va_end (args);
3838 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3839
3840 append_insn (&insn, ep, r);
3841 }
3842
3843 static void
3844 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3845 va_list *args)
3846 {
3847 struct mips_opcode *mo;
3848 struct mips_cl_insn insn;
3849 bfd_reloc_code_real_type r[3]
3850 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3851
3852 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3853 gas_assert (mo);
3854 gas_assert (strcmp (name, mo->name) == 0);
3855
3856 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3857 {
3858 ++mo;
3859 gas_assert (mo->name);
3860 gas_assert (strcmp (name, mo->name) == 0);
3861 }
3862
3863 create_insn (&insn, mo);
3864 for (;;)
3865 {
3866 int c;
3867
3868 c = *fmt++;
3869 switch (c)
3870 {
3871 case '\0':
3872 break;
3873
3874 case ',':
3875 case '(':
3876 case ')':
3877 continue;
3878
3879 case 'y':
3880 case 'w':
3881 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
3882 continue;
3883
3884 case 'x':
3885 case 'v':
3886 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
3887 continue;
3888
3889 case 'z':
3890 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
3891 continue;
3892
3893 case 'Z':
3894 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
3895 continue;
3896
3897 case '0':
3898 case 'S':
3899 case 'P':
3900 case 'R':
3901 continue;
3902
3903 case 'X':
3904 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
3905 continue;
3906
3907 case 'Y':
3908 {
3909 int regno;
3910
3911 regno = va_arg (*args, int);
3912 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3913 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3914 }
3915 continue;
3916
3917 case '<':
3918 case '>':
3919 case '4':
3920 case '5':
3921 case 'H':
3922 case 'W':
3923 case 'D':
3924 case 'j':
3925 case '8':
3926 case 'V':
3927 case 'C':
3928 case 'U':
3929 case 'k':
3930 case 'K':
3931 case 'p':
3932 case 'q':
3933 {
3934 gas_assert (ep != NULL);
3935
3936 if (ep->X_op != O_constant)
3937 *r = (int) BFD_RELOC_UNUSED + c;
3938 else
3939 {
3940 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3941 FALSE, &insn.insn_opcode, &insn.use_extend,
3942 &insn.extend);
3943 ep = NULL;
3944 *r = BFD_RELOC_UNUSED;
3945 }
3946 }
3947 continue;
3948
3949 case '6':
3950 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
3951 continue;
3952 }
3953
3954 break;
3955 }
3956
3957 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3958
3959 append_insn (&insn, ep, r);
3960 }
3961
3962 /*
3963 * Sign-extend 32-bit mode constants that have bit 31 set and all
3964 * higher bits unset.
3965 */
3966 static void
3967 normalize_constant_expr (expressionS *ex)
3968 {
3969 if (ex->X_op == O_constant
3970 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3971 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3972 - 0x80000000);
3973 }
3974
3975 /*
3976 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3977 * all higher bits unset.
3978 */
3979 static void
3980 normalize_address_expr (expressionS *ex)
3981 {
3982 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3983 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3984 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3985 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3986 - 0x80000000);
3987 }
3988
3989 /*
3990 * Generate a "jalr" instruction with a relocation hint to the called
3991 * function. This occurs in NewABI PIC code.
3992 */
3993 static void
3994 macro_build_jalr (expressionS *ep)
3995 {
3996 char *f = NULL;
3997
3998 if (MIPS_JALR_HINT_P (ep))
3999 {
4000 frag_grow (8);
4001 f = frag_more (0);
4002 }
4003 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4004 if (MIPS_JALR_HINT_P (ep))
4005 fix_new_exp (frag_now, f - frag_now->fr_literal,
4006 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4007 }
4008
4009 /*
4010 * Generate a "lui" instruction.
4011 */
4012 static void
4013 macro_build_lui (expressionS *ep, int regnum)
4014 {
4015 expressionS high_expr;
4016 const struct mips_opcode *mo;
4017 struct mips_cl_insn insn;
4018 bfd_reloc_code_real_type r[3]
4019 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4020 const char *name = "lui";
4021 const char *fmt = "t,u";
4022
4023 gas_assert (! mips_opts.mips16);
4024
4025 high_expr = *ep;
4026
4027 if (high_expr.X_op == O_constant)
4028 {
4029 /* We can compute the instruction now without a relocation entry. */
4030 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4031 >> 16) & 0xffff;
4032 *r = BFD_RELOC_UNUSED;
4033 }
4034 else
4035 {
4036 gas_assert (ep->X_op == O_symbol);
4037 /* _gp_disp is a special case, used from s_cpload.
4038 __gnu_local_gp is used if mips_no_shared. */
4039 gas_assert (mips_pic == NO_PIC
4040 || (! HAVE_NEWABI
4041 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4042 || (! mips_in_shared
4043 && strcmp (S_GET_NAME (ep->X_add_symbol),
4044 "__gnu_local_gp") == 0));
4045 *r = BFD_RELOC_HI16_S;
4046 }
4047
4048 mo = hash_find (op_hash, name);
4049 gas_assert (strcmp (name, mo->name) == 0);
4050 gas_assert (strcmp (fmt, mo->args) == 0);
4051 create_insn (&insn, mo);
4052
4053 insn.insn_opcode = insn.insn_mo->match;
4054 INSERT_OPERAND (RT, insn, regnum);
4055 if (*r == BFD_RELOC_UNUSED)
4056 {
4057 insn.insn_opcode |= high_expr.X_add_number;
4058 append_insn (&insn, NULL, r);
4059 }
4060 else
4061 append_insn (&insn, &high_expr, r);
4062 }
4063
4064 /* Generate a sequence of instructions to do a load or store from a constant
4065 offset off of a base register (breg) into/from a target register (treg),
4066 using AT if necessary. */
4067 static void
4068 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4069 int treg, int breg, int dbl)
4070 {
4071 gas_assert (ep->X_op == O_constant);
4072
4073 /* Sign-extending 32-bit constants makes their handling easier. */
4074 if (!dbl)
4075 normalize_constant_expr (ep);
4076
4077 /* Right now, this routine can only handle signed 32-bit constants. */
4078 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4079 as_warn (_("operand overflow"));
4080
4081 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4082 {
4083 /* Signed 16-bit offset will fit in the op. Easy! */
4084 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4085 }
4086 else
4087 {
4088 /* 32-bit offset, need multiple instructions and AT, like:
4089 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
4090 addu $tempreg,$tempreg,$breg
4091 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
4092 to handle the complete offset. */
4093 macro_build_lui (ep, AT);
4094 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4095 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4096
4097 if (!mips_opts.at)
4098 as_bad (_("Macro used $at after \".set noat\""));
4099 }
4100 }
4101
4102 /* set_at()
4103 * Generates code to set the $at register to true (one)
4104 * if reg is less than the immediate expression.
4105 */
4106 static void
4107 set_at (int reg, int unsignedp)
4108 {
4109 if (imm_expr.X_op == O_constant
4110 && imm_expr.X_add_number >= -0x8000
4111 && imm_expr.X_add_number < 0x8000)
4112 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4113 AT, reg, BFD_RELOC_LO16);
4114 else
4115 {
4116 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4117 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4118 }
4119 }
4120
4121 /* Warn if an expression is not a constant. */
4122
4123 static void
4124 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4125 {
4126 if (ex->X_op == O_big)
4127 as_bad (_("unsupported large constant"));
4128 else if (ex->X_op != O_constant)
4129 as_bad (_("Instruction %s requires absolute expression"),
4130 ip->insn_mo->name);
4131
4132 if (HAVE_32BIT_GPRS)
4133 normalize_constant_expr (ex);
4134 }
4135
4136 /* Count the leading zeroes by performing a binary chop. This is a
4137 bulky bit of source, but performance is a LOT better for the
4138 majority of values than a simple loop to count the bits:
4139 for (lcnt = 0; (lcnt < 32); lcnt++)
4140 if ((v) & (1 << (31 - lcnt)))
4141 break;
4142 However it is not code size friendly, and the gain will drop a bit
4143 on certain cached systems.
4144 */
4145 #define COUNT_TOP_ZEROES(v) \
4146 (((v) & ~0xffff) == 0 \
4147 ? ((v) & ~0xff) == 0 \
4148 ? ((v) & ~0xf) == 0 \
4149 ? ((v) & ~0x3) == 0 \
4150 ? ((v) & ~0x1) == 0 \
4151 ? !(v) \
4152 ? 32 \
4153 : 31 \
4154 : 30 \
4155 : ((v) & ~0x7) == 0 \
4156 ? 29 \
4157 : 28 \
4158 : ((v) & ~0x3f) == 0 \
4159 ? ((v) & ~0x1f) == 0 \
4160 ? 27 \
4161 : 26 \
4162 : ((v) & ~0x7f) == 0 \
4163 ? 25 \
4164 : 24 \
4165 : ((v) & ~0xfff) == 0 \
4166 ? ((v) & ~0x3ff) == 0 \
4167 ? ((v) & ~0x1ff) == 0 \
4168 ? 23 \
4169 : 22 \
4170 : ((v) & ~0x7ff) == 0 \
4171 ? 21 \
4172 : 20 \
4173 : ((v) & ~0x3fff) == 0 \
4174 ? ((v) & ~0x1fff) == 0 \
4175 ? 19 \
4176 : 18 \
4177 : ((v) & ~0x7fff) == 0 \
4178 ? 17 \
4179 : 16 \
4180 : ((v) & ~0xffffff) == 0 \
4181 ? ((v) & ~0xfffff) == 0 \
4182 ? ((v) & ~0x3ffff) == 0 \
4183 ? ((v) & ~0x1ffff) == 0 \
4184 ? 15 \
4185 : 14 \
4186 : ((v) & ~0x7ffff) == 0 \
4187 ? 13 \
4188 : 12 \
4189 : ((v) & ~0x3fffff) == 0 \
4190 ? ((v) & ~0x1fffff) == 0 \
4191 ? 11 \
4192 : 10 \
4193 : ((v) & ~0x7fffff) == 0 \
4194 ? 9 \
4195 : 8 \
4196 : ((v) & ~0xfffffff) == 0 \
4197 ? ((v) & ~0x3ffffff) == 0 \
4198 ? ((v) & ~0x1ffffff) == 0 \
4199 ? 7 \
4200 : 6 \
4201 : ((v) & ~0x7ffffff) == 0 \
4202 ? 5 \
4203 : 4 \
4204 : ((v) & ~0x3fffffff) == 0 \
4205 ? ((v) & ~0x1fffffff) == 0 \
4206 ? 3 \
4207 : 2 \
4208 : ((v) & ~0x7fffffff) == 0 \
4209 ? 1 \
4210 : 0)
4211
4212 /* load_register()
4213 * This routine generates the least number of instructions necessary to load
4214 * an absolute expression value into a register.
4215 */
4216 static void
4217 load_register (int reg, expressionS *ep, int dbl)
4218 {
4219 int freg;
4220 expressionS hi32, lo32;
4221
4222 if (ep->X_op != O_big)
4223 {
4224 gas_assert (ep->X_op == O_constant);
4225
4226 /* Sign-extending 32-bit constants makes their handling easier. */
4227 if (!dbl)
4228 normalize_constant_expr (ep);
4229
4230 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4231 {
4232 /* We can handle 16 bit signed values with an addiu to
4233 $zero. No need to ever use daddiu here, since $zero and
4234 the result are always correct in 32 bit mode. */
4235 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4236 return;
4237 }
4238 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4239 {
4240 /* We can handle 16 bit unsigned values with an ori to
4241 $zero. */
4242 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4243 return;
4244 }
4245 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4246 {
4247 /* 32 bit values require an lui. */
4248 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4249 if ((ep->X_add_number & 0xffff) != 0)
4250 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4251 return;
4252 }
4253 }
4254
4255 /* The value is larger than 32 bits. */
4256
4257 if (!dbl || HAVE_32BIT_GPRS)
4258 {
4259 char value[32];
4260
4261 sprintf_vma (value, ep->X_add_number);
4262 as_bad (_("Number (0x%s) larger than 32 bits"), value);
4263 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4264 return;
4265 }
4266
4267 if (ep->X_op != O_big)
4268 {
4269 hi32 = *ep;
4270 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4271 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4272 hi32.X_add_number &= 0xffffffff;
4273 lo32 = *ep;
4274 lo32.X_add_number &= 0xffffffff;
4275 }
4276 else
4277 {
4278 gas_assert (ep->X_add_number > 2);
4279 if (ep->X_add_number == 3)
4280 generic_bignum[3] = 0;
4281 else if (ep->X_add_number > 4)
4282 as_bad (_("Number larger than 64 bits"));
4283 lo32.X_op = O_constant;
4284 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4285 hi32.X_op = O_constant;
4286 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4287 }
4288
4289 if (hi32.X_add_number == 0)
4290 freg = 0;
4291 else
4292 {
4293 int shift, bit;
4294 unsigned long hi, lo;
4295
4296 if (hi32.X_add_number == (offsetT) 0xffffffff)
4297 {
4298 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4299 {
4300 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4301 return;
4302 }
4303 if (lo32.X_add_number & 0x80000000)
4304 {
4305 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4306 if (lo32.X_add_number & 0xffff)
4307 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4308 return;
4309 }
4310 }
4311
4312 /* Check for 16bit shifted constant. We know that hi32 is
4313 non-zero, so start the mask on the first bit of the hi32
4314 value. */
4315 shift = 17;
4316 do
4317 {
4318 unsigned long himask, lomask;
4319
4320 if (shift < 32)
4321 {
4322 himask = 0xffff >> (32 - shift);
4323 lomask = (0xffff << shift) & 0xffffffff;
4324 }
4325 else
4326 {
4327 himask = 0xffff << (shift - 32);
4328 lomask = 0;
4329 }
4330 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4331 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4332 {
4333 expressionS tmp;
4334
4335 tmp.X_op = O_constant;
4336 if (shift < 32)
4337 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4338 | (lo32.X_add_number >> shift));
4339 else
4340 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4341 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4342 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4343 reg, reg, (shift >= 32) ? shift - 32 : shift);
4344 return;
4345 }
4346 ++shift;
4347 }
4348 while (shift <= (64 - 16));
4349
4350 /* Find the bit number of the lowest one bit, and store the
4351 shifted value in hi/lo. */
4352 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4353 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4354 if (lo != 0)
4355 {
4356 bit = 0;
4357 while ((lo & 1) == 0)
4358 {
4359 lo >>= 1;
4360 ++bit;
4361 }
4362 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4363 hi >>= bit;
4364 }
4365 else
4366 {
4367 bit = 32;
4368 while ((hi & 1) == 0)
4369 {
4370 hi >>= 1;
4371 ++bit;
4372 }
4373 lo = hi;
4374 hi = 0;
4375 }
4376
4377 /* Optimize if the shifted value is a (power of 2) - 1. */
4378 if ((hi == 0 && ((lo + 1) & lo) == 0)
4379 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4380 {
4381 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4382 if (shift != 0)
4383 {
4384 expressionS tmp;
4385
4386 /* This instruction will set the register to be all
4387 ones. */
4388 tmp.X_op = O_constant;
4389 tmp.X_add_number = (offsetT) -1;
4390 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4391 if (bit != 0)
4392 {
4393 bit += shift;
4394 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4395 reg, reg, (bit >= 32) ? bit - 32 : bit);
4396 }
4397 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4398 reg, reg, (shift >= 32) ? shift - 32 : shift);
4399 return;
4400 }
4401 }
4402
4403 /* Sign extend hi32 before calling load_register, because we can
4404 generally get better code when we load a sign extended value. */
4405 if ((hi32.X_add_number & 0x80000000) != 0)
4406 hi32.X_add_number |= ~(offsetT) 0xffffffff;
4407 load_register (reg, &hi32, 0);
4408 freg = reg;
4409 }
4410 if ((lo32.X_add_number & 0xffff0000) == 0)
4411 {
4412 if (freg != 0)
4413 {
4414 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4415 freg = reg;
4416 }
4417 }
4418 else
4419 {
4420 expressionS mid16;
4421
4422 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4423 {
4424 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4425 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4426 return;
4427 }
4428
4429 if (freg != 0)
4430 {
4431 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4432 freg = reg;
4433 }
4434 mid16 = lo32;
4435 mid16.X_add_number >>= 16;
4436 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4437 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4438 freg = reg;
4439 }
4440 if ((lo32.X_add_number & 0xffff) != 0)
4441 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4442 }
4443
4444 static inline void
4445 load_delay_nop (void)
4446 {
4447 if (!gpr_interlocks)
4448 macro_build (NULL, "nop", "");
4449 }
4450
4451 /* Load an address into a register. */
4452
4453 static void
4454 load_address (int reg, expressionS *ep, int *used_at)
4455 {
4456 if (ep->X_op != O_constant
4457 && ep->X_op != O_symbol)
4458 {
4459 as_bad (_("expression too complex"));
4460 ep->X_op = O_constant;
4461 }
4462
4463 if (ep->X_op == O_constant)
4464 {
4465 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4466 return;
4467 }
4468
4469 if (mips_pic == NO_PIC)
4470 {
4471 /* If this is a reference to a GP relative symbol, we want
4472 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4473 Otherwise we want
4474 lui $reg,<sym> (BFD_RELOC_HI16_S)
4475 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4476 If we have an addend, we always use the latter form.
4477
4478 With 64bit address space and a usable $at we want
4479 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4480 lui $at,<sym> (BFD_RELOC_HI16_S)
4481 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4482 daddiu $at,<sym> (BFD_RELOC_LO16)
4483 dsll32 $reg,0
4484 daddu $reg,$reg,$at
4485
4486 If $at is already in use, we use a path which is suboptimal
4487 on superscalar processors.
4488 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4489 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4490 dsll $reg,16
4491 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4492 dsll $reg,16
4493 daddiu $reg,<sym> (BFD_RELOC_LO16)
4494
4495 For GP relative symbols in 64bit address space we can use
4496 the same sequence as in 32bit address space. */
4497 if (HAVE_64BIT_SYMBOLS)
4498 {
4499 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4500 && !nopic_need_relax (ep->X_add_symbol, 1))
4501 {
4502 relax_start (ep->X_add_symbol);
4503 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4504 mips_gp_register, BFD_RELOC_GPREL16);
4505 relax_switch ();
4506 }
4507
4508 if (*used_at == 0 && mips_opts.at)
4509 {
4510 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4511 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4512 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4513 BFD_RELOC_MIPS_HIGHER);
4514 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4515 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4516 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4517 *used_at = 1;
4518 }
4519 else
4520 {
4521 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4522 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4523 BFD_RELOC_MIPS_HIGHER);
4524 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4525 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4526 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4527 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4528 }
4529
4530 if (mips_relax.sequence)
4531 relax_end ();
4532 }
4533 else
4534 {
4535 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4536 && !nopic_need_relax (ep->X_add_symbol, 1))
4537 {
4538 relax_start (ep->X_add_symbol);
4539 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4540 mips_gp_register, BFD_RELOC_GPREL16);
4541 relax_switch ();
4542 }
4543 macro_build_lui (ep, reg);
4544 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4545 reg, reg, BFD_RELOC_LO16);
4546 if (mips_relax.sequence)
4547 relax_end ();
4548 }
4549 }
4550 else if (!mips_big_got)
4551 {
4552 expressionS ex;
4553
4554 /* If this is a reference to an external symbol, we want
4555 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4556 Otherwise we want
4557 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4558 nop
4559 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4560 If there is a constant, it must be added in after.
4561
4562 If we have NewABI, we want
4563 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4564 unless we're referencing a global symbol with a non-zero
4565 offset, in which case cst must be added separately. */
4566 if (HAVE_NEWABI)
4567 {
4568 if (ep->X_add_number)
4569 {
4570 ex.X_add_number = ep->X_add_number;
4571 ep->X_add_number = 0;
4572 relax_start (ep->X_add_symbol);
4573 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4574 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4575 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4576 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4577 ex.X_op = O_constant;
4578 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4579 reg, reg, BFD_RELOC_LO16);
4580 ep->X_add_number = ex.X_add_number;
4581 relax_switch ();
4582 }
4583 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4584 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4585 if (mips_relax.sequence)
4586 relax_end ();
4587 }
4588 else
4589 {
4590 ex.X_add_number = ep->X_add_number;
4591 ep->X_add_number = 0;
4592 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4593 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4594 load_delay_nop ();
4595 relax_start (ep->X_add_symbol);
4596 relax_switch ();
4597 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4598 BFD_RELOC_LO16);
4599 relax_end ();
4600
4601 if (ex.X_add_number != 0)
4602 {
4603 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4604 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4605 ex.X_op = O_constant;
4606 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4607 reg, reg, BFD_RELOC_LO16);
4608 }
4609 }
4610 }
4611 else if (mips_big_got)
4612 {
4613 expressionS ex;
4614
4615 /* This is the large GOT case. If this is a reference to an
4616 external symbol, we want
4617 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4618 addu $reg,$reg,$gp
4619 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4620
4621 Otherwise, for a reference to a local symbol in old ABI, we want
4622 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4623 nop
4624 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4625 If there is a constant, it must be added in after.
4626
4627 In the NewABI, for local symbols, with or without offsets, we want:
4628 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4629 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4630 */
4631 if (HAVE_NEWABI)
4632 {
4633 ex.X_add_number = ep->X_add_number;
4634 ep->X_add_number = 0;
4635 relax_start (ep->X_add_symbol);
4636 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4637 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4638 reg, reg, mips_gp_register);
4639 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4640 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4641 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4642 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4643 else if (ex.X_add_number)
4644 {
4645 ex.X_op = O_constant;
4646 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4647 BFD_RELOC_LO16);
4648 }
4649
4650 ep->X_add_number = ex.X_add_number;
4651 relax_switch ();
4652 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4653 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4654 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4655 BFD_RELOC_MIPS_GOT_OFST);
4656 relax_end ();
4657 }
4658 else
4659 {
4660 ex.X_add_number = ep->X_add_number;
4661 ep->X_add_number = 0;
4662 relax_start (ep->X_add_symbol);
4663 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4664 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4665 reg, reg, mips_gp_register);
4666 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4667 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4668 relax_switch ();
4669 if (reg_needs_delay (mips_gp_register))
4670 {
4671 /* We need a nop before loading from $gp. This special
4672 check is required because the lui which starts the main
4673 instruction stream does not refer to $gp, and so will not
4674 insert the nop which may be required. */
4675 macro_build (NULL, "nop", "");
4676 }
4677 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4678 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4679 load_delay_nop ();
4680 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4681 BFD_RELOC_LO16);
4682 relax_end ();
4683
4684 if (ex.X_add_number != 0)
4685 {
4686 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4687 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4688 ex.X_op = O_constant;
4689 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4690 BFD_RELOC_LO16);
4691 }
4692 }
4693 }
4694 else
4695 abort ();
4696
4697 if (!mips_opts.at && *used_at == 1)
4698 as_bad (_("Macro used $at after \".set noat\""));
4699 }
4700
4701 /* Move the contents of register SOURCE into register DEST. */
4702
4703 static void
4704 move_register (int dest, int source)
4705 {
4706 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4707 dest, source, 0);
4708 }
4709
4710 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4711 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4712 The two alternatives are:
4713
4714 Global symbol Local sybmol
4715 ------------- ------------
4716 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4717 ... ...
4718 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4719
4720 load_got_offset emits the first instruction and add_got_offset
4721 emits the second for a 16-bit offset or add_got_offset_hilo emits
4722 a sequence to add a 32-bit offset using a scratch register. */
4723
4724 static void
4725 load_got_offset (int dest, expressionS *local)
4726 {
4727 expressionS global;
4728
4729 global = *local;
4730 global.X_add_number = 0;
4731
4732 relax_start (local->X_add_symbol);
4733 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4734 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4735 relax_switch ();
4736 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4737 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4738 relax_end ();
4739 }
4740
4741 static void
4742 add_got_offset (int dest, expressionS *local)
4743 {
4744 expressionS global;
4745
4746 global.X_op = O_constant;
4747 global.X_op_symbol = NULL;
4748 global.X_add_symbol = NULL;
4749 global.X_add_number = local->X_add_number;
4750
4751 relax_start (local->X_add_symbol);
4752 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4753 dest, dest, BFD_RELOC_LO16);
4754 relax_switch ();
4755 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4756 relax_end ();
4757 }
4758
4759 static void
4760 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4761 {
4762 expressionS global;
4763 int hold_mips_optimize;
4764
4765 global.X_op = O_constant;
4766 global.X_op_symbol = NULL;
4767 global.X_add_symbol = NULL;
4768 global.X_add_number = local->X_add_number;
4769
4770 relax_start (local->X_add_symbol);
4771 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4772 relax_switch ();
4773 /* Set mips_optimize around the lui instruction to avoid
4774 inserting an unnecessary nop after the lw. */
4775 hold_mips_optimize = mips_optimize;
4776 mips_optimize = 2;
4777 macro_build_lui (&global, tmp);
4778 mips_optimize = hold_mips_optimize;
4779 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4780 relax_end ();
4781
4782 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4783 }
4784
4785 /*
4786 * Build macros
4787 * This routine implements the seemingly endless macro or synthesized
4788 * instructions and addressing modes in the mips assembly language. Many
4789 * of these macros are simple and are similar to each other. These could
4790 * probably be handled by some kind of table or grammar approach instead of
4791 * this verbose method. Others are not simple macros but are more like
4792 * optimizing code generation.
4793 * One interesting optimization is when several store macros appear
4794 * consecutively that would load AT with the upper half of the same address.
4795 * The ensuing load upper instructions are ommited. This implies some kind
4796 * of global optimization. We currently only optimize within a single macro.
4797 * For many of the load and store macros if the address is specified as a
4798 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4799 * first load register 'at' with zero and use it as the base register. The
4800 * mips assembler simply uses register $zero. Just one tiny optimization
4801 * we're missing.
4802 */
4803 static void
4804 macro (struct mips_cl_insn *ip)
4805 {
4806 unsigned int treg, sreg, dreg, breg;
4807 unsigned int tempreg;
4808 int mask;
4809 int used_at = 0;
4810 expressionS expr1;
4811 const char *s;
4812 const char *s2;
4813 const char *fmt;
4814 int likely = 0;
4815 int dbl = 0;
4816 int coproc = 0;
4817 int lr = 0;
4818 int imm = 0;
4819 int call = 0;
4820 int off;
4821 offsetT maxnum;
4822 bfd_reloc_code_real_type r;
4823 int hold_mips_optimize;
4824
4825 gas_assert (! mips_opts.mips16);
4826
4827 treg = EXTRACT_OPERAND (RT, *ip);
4828 dreg = EXTRACT_OPERAND (RD, *ip);
4829 sreg = breg = EXTRACT_OPERAND (RS, *ip);
4830 mask = ip->insn_mo->mask;
4831
4832 expr1.X_op = O_constant;
4833 expr1.X_op_symbol = NULL;
4834 expr1.X_add_symbol = NULL;
4835 expr1.X_add_number = 1;
4836
4837 switch (mask)
4838 {
4839 case M_DABS:
4840 dbl = 1;
4841 case M_ABS:
4842 /* bgez $a0,.+12
4843 move v0,$a0
4844 sub v0,$zero,$a0
4845 */
4846
4847 start_noreorder ();
4848
4849 expr1.X_add_number = 8;
4850 macro_build (&expr1, "bgez", "s,p", sreg);
4851 if (dreg == sreg)
4852 macro_build (NULL, "nop", "");
4853 else
4854 move_register (dreg, sreg);
4855 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4856
4857 end_noreorder ();
4858 break;
4859
4860 case M_ADD_I:
4861 s = "addi";
4862 s2 = "add";
4863 goto do_addi;
4864 case M_ADDU_I:
4865 s = "addiu";
4866 s2 = "addu";
4867 goto do_addi;
4868 case M_DADD_I:
4869 dbl = 1;
4870 s = "daddi";
4871 s2 = "dadd";
4872 goto do_addi;
4873 case M_DADDU_I:
4874 dbl = 1;
4875 s = "daddiu";
4876 s2 = "daddu";
4877 do_addi:
4878 if (imm_expr.X_op == O_constant
4879 && imm_expr.X_add_number >= -0x8000
4880 && imm_expr.X_add_number < 0x8000)
4881 {
4882 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4883 break;
4884 }
4885 used_at = 1;
4886 load_register (AT, &imm_expr, dbl);
4887 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4888 break;
4889
4890 case M_AND_I:
4891 s = "andi";
4892 s2 = "and";
4893 goto do_bit;
4894 case M_OR_I:
4895 s = "ori";
4896 s2 = "or";
4897 goto do_bit;
4898 case M_NOR_I:
4899 s = "";
4900 s2 = "nor";
4901 goto do_bit;
4902 case M_XOR_I:
4903 s = "xori";
4904 s2 = "xor";
4905 do_bit:
4906 if (imm_expr.X_op == O_constant
4907 && imm_expr.X_add_number >= 0
4908 && imm_expr.X_add_number < 0x10000)
4909 {
4910 if (mask != M_NOR_I)
4911 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4912 else
4913 {
4914 macro_build (&imm_expr, "ori", "t,r,i",
4915 treg, sreg, BFD_RELOC_LO16);
4916 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4917 }
4918 break;
4919 }
4920
4921 used_at = 1;
4922 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4923 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4924 break;
4925
4926 case M_BALIGN:
4927 switch (imm_expr.X_add_number)
4928 {
4929 case 0:
4930 macro_build (NULL, "nop", "");
4931 break;
4932 case 2:
4933 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4934 break;
4935 default:
4936 macro_build (NULL, "balign", "t,s,2", treg, sreg,
4937 (int) imm_expr.X_add_number);
4938 break;
4939 }
4940 break;
4941
4942 case M_BEQ_I:
4943 s = "beq";
4944 goto beq_i;
4945 case M_BEQL_I:
4946 s = "beql";
4947 likely = 1;
4948 goto beq_i;
4949 case M_BNE_I:
4950 s = "bne";
4951 goto beq_i;
4952 case M_BNEL_I:
4953 s = "bnel";
4954 likely = 1;
4955 beq_i:
4956 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4957 {
4958 macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
4959 break;
4960 }
4961 used_at = 1;
4962 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4963 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4964 break;
4965
4966 case M_BGEL:
4967 likely = 1;
4968 case M_BGE:
4969 if (treg == 0)
4970 {
4971 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4972 break;
4973 }
4974 if (sreg == 0)
4975 {
4976 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4977 break;
4978 }
4979 used_at = 1;
4980 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4981 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
4982 break;
4983
4984 case M_BGTL_I:
4985 likely = 1;
4986 case M_BGT_I:
4987 /* Check for > max integer. */
4988 maxnum = 0x7fffffff;
4989 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4990 {
4991 maxnum <<= 16;
4992 maxnum |= 0xffff;
4993 maxnum <<= 16;
4994 maxnum |= 0xffff;
4995 }
4996 if (imm_expr.X_op == O_constant
4997 && imm_expr.X_add_number >= maxnum
4998 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4999 {
5000 do_false:
5001 /* Result is always false. */
5002 if (! likely)
5003 macro_build (NULL, "nop", "");
5004 else
5005 macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5006 break;
5007 }
5008 if (imm_expr.X_op != O_constant)
5009 as_bad (_("Unsupported large constant"));
5010 ++imm_expr.X_add_number;
5011 /* FALLTHROUGH */
5012 case M_BGE_I:
5013 case M_BGEL_I:
5014 if (mask == M_BGEL_I)
5015 likely = 1;
5016 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5017 {
5018 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5019 break;
5020 }
5021 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5022 {
5023 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5024 break;
5025 }
5026 maxnum = 0x7fffffff;
5027 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5028 {
5029 maxnum <<= 16;
5030 maxnum |= 0xffff;
5031 maxnum <<= 16;
5032 maxnum |= 0xffff;
5033 }
5034 maxnum = - maxnum - 1;
5035 if (imm_expr.X_op == O_constant
5036 && imm_expr.X_add_number <= maxnum
5037 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5038 {
5039 do_true:
5040 /* result is always true */
5041 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5042 macro_build (&offset_expr, "b", "p");
5043 break;
5044 }
5045 used_at = 1;
5046 set_at (sreg, 0);
5047 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5048 break;
5049
5050 case M_BGEUL:
5051 likely = 1;
5052 case M_BGEU:
5053 if (treg == 0)
5054 goto do_true;
5055 if (sreg == 0)
5056 {
5057 macro_build (&offset_expr, likely ? "beql" : "beq",
5058 "s,t,p", ZERO, treg);
5059 break;
5060 }
5061 used_at = 1;
5062 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5063 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5064 break;
5065
5066 case M_BGTUL_I:
5067 likely = 1;
5068 case M_BGTU_I:
5069 if (sreg == 0
5070 || (HAVE_32BIT_GPRS
5071 && imm_expr.X_op == O_constant
5072 && imm_expr.X_add_number == -1))
5073 goto do_false;
5074 if (imm_expr.X_op != O_constant)
5075 as_bad (_("Unsupported large constant"));
5076 ++imm_expr.X_add_number;
5077 /* FALLTHROUGH */
5078 case M_BGEU_I:
5079 case M_BGEUL_I:
5080 if (mask == M_BGEUL_I)
5081 likely = 1;
5082 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5083 goto do_true;
5084 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5085 {
5086 macro_build (&offset_expr, likely ? "bnel" : "bne",
5087 "s,t,p", sreg, ZERO);
5088 break;
5089 }
5090 used_at = 1;
5091 set_at (sreg, 1);
5092 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5093 break;
5094
5095 case M_BGTL:
5096 likely = 1;
5097 case M_BGT:
5098 if (treg == 0)
5099 {
5100 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5101 break;
5102 }
5103 if (sreg == 0)
5104 {
5105 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5106 break;
5107 }
5108 used_at = 1;
5109 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5110 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5111 break;
5112
5113 case M_BGTUL:
5114 likely = 1;
5115 case M_BGTU:
5116 if (treg == 0)
5117 {
5118 macro_build (&offset_expr, likely ? "bnel" : "bne",
5119 "s,t,p", sreg, ZERO);
5120 break;
5121 }
5122 if (sreg == 0)
5123 goto do_false;
5124 used_at = 1;
5125 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5126 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5127 break;
5128
5129 case M_BLEL:
5130 likely = 1;
5131 case M_BLE:
5132 if (treg == 0)
5133 {
5134 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5135 break;
5136 }
5137 if (sreg == 0)
5138 {
5139 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5140 break;
5141 }
5142 used_at = 1;
5143 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5144 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5145 break;
5146
5147 case M_BLEL_I:
5148 likely = 1;
5149 case M_BLE_I:
5150 maxnum = 0x7fffffff;
5151 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5152 {
5153 maxnum <<= 16;
5154 maxnum |= 0xffff;
5155 maxnum <<= 16;
5156 maxnum |= 0xffff;
5157 }
5158 if (imm_expr.X_op == O_constant
5159 && imm_expr.X_add_number >= maxnum
5160 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5161 goto do_true;
5162 if (imm_expr.X_op != O_constant)
5163 as_bad (_("Unsupported large constant"));
5164 ++imm_expr.X_add_number;
5165 /* FALLTHROUGH */
5166 case M_BLT_I:
5167 case M_BLTL_I:
5168 if (mask == M_BLTL_I)
5169 likely = 1;
5170 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5171 {
5172 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5173 break;
5174 }
5175 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5176 {
5177 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5178 break;
5179 }
5180 used_at = 1;
5181 set_at (sreg, 0);
5182 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5183 break;
5184
5185 case M_BLEUL:
5186 likely = 1;
5187 case M_BLEU:
5188 if (treg == 0)
5189 {
5190 macro_build (&offset_expr, likely ? "beql" : "beq",
5191 "s,t,p", sreg, ZERO);
5192 break;
5193 }
5194 if (sreg == 0)
5195 goto do_true;
5196 used_at = 1;
5197 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5198 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5199 break;
5200
5201 case M_BLEUL_I:
5202 likely = 1;
5203 case M_BLEU_I:
5204 if (sreg == 0
5205 || (HAVE_32BIT_GPRS
5206 && imm_expr.X_op == O_constant
5207 && imm_expr.X_add_number == -1))
5208 goto do_true;
5209 if (imm_expr.X_op != O_constant)
5210 as_bad (_("Unsupported large constant"));
5211 ++imm_expr.X_add_number;
5212 /* FALLTHROUGH */
5213 case M_BLTU_I:
5214 case M_BLTUL_I:
5215 if (mask == M_BLTUL_I)
5216 likely = 1;
5217 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5218 goto do_false;
5219 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5220 {
5221 macro_build (&offset_expr, likely ? "beql" : "beq",
5222 "s,t,p", sreg, ZERO);
5223 break;
5224 }
5225 used_at = 1;
5226 set_at (sreg, 1);
5227 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5228 break;
5229
5230 case M_BLTL:
5231 likely = 1;
5232 case M_BLT:
5233 if (treg == 0)
5234 {
5235 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5236 break;
5237 }
5238 if (sreg == 0)
5239 {
5240 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5241 break;
5242 }
5243 used_at = 1;
5244 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5245 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5246 break;
5247
5248 case M_BLTUL:
5249 likely = 1;
5250 case M_BLTU:
5251 if (treg == 0)
5252 goto do_false;
5253 if (sreg == 0)
5254 {
5255 macro_build (&offset_expr, likely ? "bnel" : "bne",
5256 "s,t,p", ZERO, treg);
5257 break;
5258 }
5259 used_at = 1;
5260 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5261 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5262 break;
5263
5264 case M_DEXT:
5265 {
5266 /* Use unsigned arithmetic. */
5267 addressT pos;
5268 addressT size;
5269
5270 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5271 {
5272 as_bad (_("Unsupported large constant"));
5273 pos = size = 1;
5274 }
5275 else
5276 {
5277 pos = imm_expr.X_add_number;
5278 size = imm2_expr.X_add_number;
5279 }
5280
5281 if (pos > 63)
5282 {
5283 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5284 pos = 1;
5285 }
5286 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5287 {
5288 as_bad (_("Improper extract size (%lu, position %lu)"),
5289 (unsigned long) size, (unsigned long) pos);
5290 size = 1;
5291 }
5292
5293 if (size <= 32 && pos < 32)
5294 {
5295 s = "dext";
5296 fmt = "t,r,+A,+C";
5297 }
5298 else if (size <= 32)
5299 {
5300 s = "dextu";
5301 fmt = "t,r,+E,+H";
5302 }
5303 else
5304 {
5305 s = "dextm";
5306 fmt = "t,r,+A,+G";
5307 }
5308 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5309 (int) (size - 1));
5310 }
5311 break;
5312
5313 case M_DINS:
5314 {
5315 /* Use unsigned arithmetic. */
5316 addressT pos;
5317 addressT size;
5318
5319 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5320 {
5321 as_bad (_("Unsupported large constant"));
5322 pos = size = 1;
5323 }
5324 else
5325 {
5326 pos = imm_expr.X_add_number;
5327 size = imm2_expr.X_add_number;
5328 }
5329
5330 if (pos > 63)
5331 {
5332 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5333 pos = 1;
5334 }
5335 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5336 {
5337 as_bad (_("Improper insert size (%lu, position %lu)"),
5338 (unsigned long) size, (unsigned long) pos);
5339 size = 1;
5340 }
5341
5342 if (pos < 32 && (pos + size - 1) < 32)
5343 {
5344 s = "dins";
5345 fmt = "t,r,+A,+B";
5346 }
5347 else if (pos >= 32)
5348 {
5349 s = "dinsu";
5350 fmt = "t,r,+E,+F";
5351 }
5352 else
5353 {
5354 s = "dinsm";
5355 fmt = "t,r,+A,+F";
5356 }
5357 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5358 (int) (pos + size - 1));
5359 }
5360 break;
5361
5362 case M_DDIV_3:
5363 dbl = 1;
5364 case M_DIV_3:
5365 s = "mflo";
5366 goto do_div3;
5367 case M_DREM_3:
5368 dbl = 1;
5369 case M_REM_3:
5370 s = "mfhi";
5371 do_div3:
5372 if (treg == 0)
5373 {
5374 as_warn (_("Divide by zero."));
5375 if (mips_trap)
5376 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5377 else
5378 macro_build (NULL, "break", "c", 7);
5379 break;
5380 }
5381
5382 start_noreorder ();
5383 if (mips_trap)
5384 {
5385 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5386 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5387 }
5388 else
5389 {
5390 expr1.X_add_number = 8;
5391 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5392 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5393 macro_build (NULL, "break", "c", 7);
5394 }
5395 expr1.X_add_number = -1;
5396 used_at = 1;
5397 load_register (AT, &expr1, dbl);
5398 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5399 macro_build (&expr1, "bne", "s,t,p", treg, AT);
5400 if (dbl)
5401 {
5402 expr1.X_add_number = 1;
5403 load_register (AT, &expr1, dbl);
5404 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5405 }
5406 else
5407 {
5408 expr1.X_add_number = 0x80000000;
5409 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5410 }
5411 if (mips_trap)
5412 {
5413 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5414 /* We want to close the noreorder block as soon as possible, so
5415 that later insns are available for delay slot filling. */
5416 end_noreorder ();
5417 }
5418 else
5419 {
5420 expr1.X_add_number = 8;
5421 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5422 macro_build (NULL, "nop", "");
5423
5424 /* We want to close the noreorder block as soon as possible, so
5425 that later insns are available for delay slot filling. */
5426 end_noreorder ();
5427
5428 macro_build (NULL, "break", "c", 6);
5429 }
5430 macro_build (NULL, s, "d", dreg);
5431 break;
5432
5433 case M_DIV_3I:
5434 s = "div";
5435 s2 = "mflo";
5436 goto do_divi;
5437 case M_DIVU_3I:
5438 s = "divu";
5439 s2 = "mflo";
5440 goto do_divi;
5441 case M_REM_3I:
5442 s = "div";
5443 s2 = "mfhi";
5444 goto do_divi;
5445 case M_REMU_3I:
5446 s = "divu";
5447 s2 = "mfhi";
5448 goto do_divi;
5449 case M_DDIV_3I:
5450 dbl = 1;
5451 s = "ddiv";
5452 s2 = "mflo";
5453 goto do_divi;
5454 case M_DDIVU_3I:
5455 dbl = 1;
5456 s = "ddivu";
5457 s2 = "mflo";
5458 goto do_divi;
5459 case M_DREM_3I:
5460 dbl = 1;
5461 s = "ddiv";
5462 s2 = "mfhi";
5463 goto do_divi;
5464 case M_DREMU_3I:
5465 dbl = 1;
5466 s = "ddivu";
5467 s2 = "mfhi";
5468 do_divi:
5469 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5470 {
5471 as_warn (_("Divide by zero."));
5472 if (mips_trap)
5473 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5474 else
5475 macro_build (NULL, "break", "c", 7);
5476 break;
5477 }
5478 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5479 {
5480 if (strcmp (s2, "mflo") == 0)
5481 move_register (dreg, sreg);
5482 else
5483 move_register (dreg, ZERO);
5484 break;
5485 }
5486 if (imm_expr.X_op == O_constant
5487 && imm_expr.X_add_number == -1
5488 && s[strlen (s) - 1] != 'u')
5489 {
5490 if (strcmp (s2, "mflo") == 0)
5491 {
5492 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5493 }
5494 else
5495 move_register (dreg, ZERO);
5496 break;
5497 }
5498
5499 used_at = 1;
5500 load_register (AT, &imm_expr, dbl);
5501 macro_build (NULL, s, "z,s,t", sreg, AT);
5502 macro_build (NULL, s2, "d", dreg);
5503 break;
5504
5505 case M_DIVU_3:
5506 s = "divu";
5507 s2 = "mflo";
5508 goto do_divu3;
5509 case M_REMU_3:
5510 s = "divu";
5511 s2 = "mfhi";
5512 goto do_divu3;
5513 case M_DDIVU_3:
5514 s = "ddivu";
5515 s2 = "mflo";
5516 goto do_divu3;
5517 case M_DREMU_3:
5518 s = "ddivu";
5519 s2 = "mfhi";
5520 do_divu3:
5521 start_noreorder ();
5522 if (mips_trap)
5523 {
5524 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5525 macro_build (NULL, s, "z,s,t", sreg, treg);
5526 /* We want to close the noreorder block as soon as possible, so
5527 that later insns are available for delay slot filling. */
5528 end_noreorder ();
5529 }
5530 else
5531 {
5532 expr1.X_add_number = 8;
5533 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5534 macro_build (NULL, s, "z,s,t", sreg, treg);
5535
5536 /* We want to close the noreorder block as soon as possible, so
5537 that later insns are available for delay slot filling. */
5538 end_noreorder ();
5539 macro_build (NULL, "break", "c", 7);
5540 }
5541 macro_build (NULL, s2, "d", dreg);
5542 break;
5543
5544 case M_DLCA_AB:
5545 dbl = 1;
5546 case M_LCA_AB:
5547 call = 1;
5548 goto do_la;
5549 case M_DLA_AB:
5550 dbl = 1;
5551 case M_LA_AB:
5552 do_la:
5553 /* Load the address of a symbol into a register. If breg is not
5554 zero, we then add a base register to it. */
5555
5556 if (dbl && HAVE_32BIT_GPRS)
5557 as_warn (_("dla used to load 32-bit register"));
5558
5559 if (!dbl && HAVE_64BIT_OBJECTS)
5560 as_warn (_("la used to load 64-bit address"));
5561
5562 if (offset_expr.X_op == O_constant
5563 && offset_expr.X_add_number >= -0x8000
5564 && offset_expr.X_add_number < 0x8000)
5565 {
5566 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5567 "t,r,j", treg, sreg, BFD_RELOC_LO16);
5568 break;
5569 }
5570
5571 if (mips_opts.at && (treg == breg))
5572 {
5573 tempreg = AT;
5574 used_at = 1;
5575 }
5576 else
5577 {
5578 tempreg = treg;
5579 }
5580
5581 if (offset_expr.X_op != O_symbol
5582 && offset_expr.X_op != O_constant)
5583 {
5584 as_bad (_("Expression too complex"));
5585 offset_expr.X_op = O_constant;
5586 }
5587
5588 if (offset_expr.X_op == O_constant)
5589 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5590 else if (mips_pic == NO_PIC)
5591 {
5592 /* If this is a reference to a GP relative symbol, we want
5593 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5594 Otherwise we want
5595 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5596 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5597 If we have a constant, we need two instructions anyhow,
5598 so we may as well always use the latter form.
5599
5600 With 64bit address space and a usable $at we want
5601 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5602 lui $at,<sym> (BFD_RELOC_HI16_S)
5603 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5604 daddiu $at,<sym> (BFD_RELOC_LO16)
5605 dsll32 $tempreg,0
5606 daddu $tempreg,$tempreg,$at
5607
5608 If $at is already in use, we use a path which is suboptimal
5609 on superscalar processors.
5610 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5611 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5612 dsll $tempreg,16
5613 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5614 dsll $tempreg,16
5615 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5616
5617 For GP relative symbols in 64bit address space we can use
5618 the same sequence as in 32bit address space. */
5619 if (HAVE_64BIT_SYMBOLS)
5620 {
5621 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5622 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5623 {
5624 relax_start (offset_expr.X_add_symbol);
5625 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5626 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5627 relax_switch ();
5628 }
5629
5630 if (used_at == 0 && mips_opts.at)
5631 {
5632 macro_build (&offset_expr, "lui", "t,u",
5633 tempreg, BFD_RELOC_MIPS_HIGHEST);
5634 macro_build (&offset_expr, "lui", "t,u",
5635 AT, BFD_RELOC_HI16_S);
5636 macro_build (&offset_expr, "daddiu", "t,r,j",
5637 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5638 macro_build (&offset_expr, "daddiu", "t,r,j",
5639 AT, AT, BFD_RELOC_LO16);
5640 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5641 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5642 used_at = 1;
5643 }
5644 else
5645 {
5646 macro_build (&offset_expr, "lui", "t,u",
5647 tempreg, BFD_RELOC_MIPS_HIGHEST);
5648 macro_build (&offset_expr, "daddiu", "t,r,j",
5649 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5650 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5651 macro_build (&offset_expr, "daddiu", "t,r,j",
5652 tempreg, tempreg, BFD_RELOC_HI16_S);
5653 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5654 macro_build (&offset_expr, "daddiu", "t,r,j",
5655 tempreg, tempreg, BFD_RELOC_LO16);
5656 }
5657
5658 if (mips_relax.sequence)
5659 relax_end ();
5660 }
5661 else
5662 {
5663 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5664 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5665 {
5666 relax_start (offset_expr.X_add_symbol);
5667 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5668 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5669 relax_switch ();
5670 }
5671 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5672 as_bad (_("Offset too large"));
5673 macro_build_lui (&offset_expr, tempreg);
5674 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5675 tempreg, tempreg, BFD_RELOC_LO16);
5676 if (mips_relax.sequence)
5677 relax_end ();
5678 }
5679 }
5680 else if (!mips_big_got && !HAVE_NEWABI)
5681 {
5682 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5683
5684 /* If this is a reference to an external symbol, and there
5685 is no constant, we want
5686 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5687 or for lca or if tempreg is PIC_CALL_REG
5688 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5689 For a local symbol, we want
5690 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5691 nop
5692 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5693
5694 If we have a small constant, and this is a reference to
5695 an external symbol, we want
5696 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5697 nop
5698 addiu $tempreg,$tempreg,<constant>
5699 For a local symbol, we want the same instruction
5700 sequence, but we output a BFD_RELOC_LO16 reloc on the
5701 addiu instruction.
5702
5703 If we have a large constant, and this is a reference to
5704 an external symbol, we want
5705 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5706 lui $at,<hiconstant>
5707 addiu $at,$at,<loconstant>
5708 addu $tempreg,$tempreg,$at
5709 For a local symbol, we want the same instruction
5710 sequence, but we output a BFD_RELOC_LO16 reloc on the
5711 addiu instruction.
5712 */
5713
5714 if (offset_expr.X_add_number == 0)
5715 {
5716 if (mips_pic == SVR4_PIC
5717 && breg == 0
5718 && (call || tempreg == PIC_CALL_REG))
5719 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5720
5721 relax_start (offset_expr.X_add_symbol);
5722 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5723 lw_reloc_type, mips_gp_register);
5724 if (breg != 0)
5725 {
5726 /* We're going to put in an addu instruction using
5727 tempreg, so we may as well insert the nop right
5728 now. */
5729 load_delay_nop ();
5730 }
5731 relax_switch ();
5732 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5733 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5734 load_delay_nop ();
5735 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5736 tempreg, tempreg, BFD_RELOC_LO16);
5737 relax_end ();
5738 /* FIXME: If breg == 0, and the next instruction uses
5739 $tempreg, then if this variant case is used an extra
5740 nop will be generated. */
5741 }
5742 else if (offset_expr.X_add_number >= -0x8000
5743 && offset_expr.X_add_number < 0x8000)
5744 {
5745 load_got_offset (tempreg, &offset_expr);
5746 load_delay_nop ();
5747 add_got_offset (tempreg, &offset_expr);
5748 }
5749 else
5750 {
5751 expr1.X_add_number = offset_expr.X_add_number;
5752 offset_expr.X_add_number =
5753 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5754 load_got_offset (tempreg, &offset_expr);
5755 offset_expr.X_add_number = expr1.X_add_number;
5756 /* If we are going to add in a base register, and the
5757 target register and the base register are the same,
5758 then we are using AT as a temporary register. Since
5759 we want to load the constant into AT, we add our
5760 current AT (from the global offset table) and the
5761 register into the register now, and pretend we were
5762 not using a base register. */
5763 if (breg == treg)
5764 {
5765 load_delay_nop ();
5766 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5767 treg, AT, breg);
5768 breg = 0;
5769 tempreg = treg;
5770 }
5771 add_got_offset_hilo (tempreg, &offset_expr, AT);
5772 used_at = 1;
5773 }
5774 }
5775 else if (!mips_big_got && HAVE_NEWABI)
5776 {
5777 int add_breg_early = 0;
5778
5779 /* If this is a reference to an external, and there is no
5780 constant, or local symbol (*), with or without a
5781 constant, we want
5782 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5783 or for lca or if tempreg is PIC_CALL_REG
5784 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5785
5786 If we have a small constant, and this is a reference to
5787 an external symbol, we want
5788 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5789 addiu $tempreg,$tempreg,<constant>
5790
5791 If we have a large constant, and this is a reference to
5792 an external symbol, we want
5793 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5794 lui $at,<hiconstant>
5795 addiu $at,$at,<loconstant>
5796 addu $tempreg,$tempreg,$at
5797
5798 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5799 local symbols, even though it introduces an additional
5800 instruction. */
5801
5802 if (offset_expr.X_add_number)
5803 {
5804 expr1.X_add_number = offset_expr.X_add_number;
5805 offset_expr.X_add_number = 0;
5806
5807 relax_start (offset_expr.X_add_symbol);
5808 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5809 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5810
5811 if (expr1.X_add_number >= -0x8000
5812 && expr1.X_add_number < 0x8000)
5813 {
5814 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5815 tempreg, tempreg, BFD_RELOC_LO16);
5816 }
5817 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5818 {
5819 /* If we are going to add in a base register, and the
5820 target register and the base register are the same,
5821 then we are using AT as a temporary register. Since
5822 we want to load the constant into AT, we add our
5823 current AT (from the global offset table) and the
5824 register into the register now, and pretend we were
5825 not using a base register. */
5826 if (breg != treg)
5827 dreg = tempreg;
5828 else
5829 {
5830 gas_assert (tempreg == AT);
5831 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5832 treg, AT, breg);
5833 dreg = treg;
5834 add_breg_early = 1;
5835 }
5836
5837 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5838 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5839 dreg, dreg, AT);
5840
5841 used_at = 1;
5842 }
5843 else
5844 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5845
5846 relax_switch ();
5847 offset_expr.X_add_number = expr1.X_add_number;
5848
5849 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5850 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5851 if (add_breg_early)
5852 {
5853 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5854 treg, tempreg, breg);
5855 breg = 0;
5856 tempreg = treg;
5857 }
5858 relax_end ();
5859 }
5860 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5861 {
5862 relax_start (offset_expr.X_add_symbol);
5863 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5864 BFD_RELOC_MIPS_CALL16, mips_gp_register);
5865 relax_switch ();
5866 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5867 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5868 relax_end ();
5869 }
5870 else
5871 {
5872 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5873 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5874 }
5875 }
5876 else if (mips_big_got && !HAVE_NEWABI)
5877 {
5878 int gpdelay;
5879 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5880 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5881 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5882
5883 /* This is the large GOT case. If this is a reference to an
5884 external symbol, and there is no constant, we want
5885 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5886 addu $tempreg,$tempreg,$gp
5887 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5888 or for lca or if tempreg is PIC_CALL_REG
5889 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5890 addu $tempreg,$tempreg,$gp
5891 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5892 For a local symbol, we want
5893 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5894 nop
5895 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5896
5897 If we have a small constant, and this is a reference to
5898 an external symbol, we want
5899 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5900 addu $tempreg,$tempreg,$gp
5901 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5902 nop
5903 addiu $tempreg,$tempreg,<constant>
5904 For a local symbol, we want
5905 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5906 nop
5907 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5908
5909 If we have a large constant, and this is a reference to
5910 an external symbol, we want
5911 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5912 addu $tempreg,$tempreg,$gp
5913 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5914 lui $at,<hiconstant>
5915 addiu $at,$at,<loconstant>
5916 addu $tempreg,$tempreg,$at
5917 For a local symbol, we want
5918 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5919 lui $at,<hiconstant>
5920 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5921 addu $tempreg,$tempreg,$at
5922 */
5923
5924 expr1.X_add_number = offset_expr.X_add_number;
5925 offset_expr.X_add_number = 0;
5926 relax_start (offset_expr.X_add_symbol);
5927 gpdelay = reg_needs_delay (mips_gp_register);
5928 if (expr1.X_add_number == 0 && breg == 0
5929 && (call || tempreg == PIC_CALL_REG))
5930 {
5931 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5932 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5933 }
5934 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5935 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5936 tempreg, tempreg, mips_gp_register);
5937 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5938 tempreg, lw_reloc_type, tempreg);
5939 if (expr1.X_add_number == 0)
5940 {
5941 if (breg != 0)
5942 {
5943 /* We're going to put in an addu instruction using
5944 tempreg, so we may as well insert the nop right
5945 now. */
5946 load_delay_nop ();
5947 }
5948 }
5949 else if (expr1.X_add_number >= -0x8000
5950 && expr1.X_add_number < 0x8000)
5951 {
5952 load_delay_nop ();
5953 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5954 tempreg, tempreg, BFD_RELOC_LO16);
5955 }
5956 else
5957 {
5958 /* If we are going to add in a base register, and the
5959 target register and the base register are the same,
5960 then we are using AT as a temporary register. Since
5961 we want to load the constant into AT, we add our
5962 current AT (from the global offset table) and the
5963 register into the register now, and pretend we were
5964 not using a base register. */
5965 if (breg != treg)
5966 dreg = tempreg;
5967 else
5968 {
5969 gas_assert (tempreg == AT);
5970 load_delay_nop ();
5971 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5972 treg, AT, breg);
5973 dreg = treg;
5974 }
5975
5976 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5977 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5978
5979 used_at = 1;
5980 }
5981 offset_expr.X_add_number =
5982 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5983 relax_switch ();
5984
5985 if (gpdelay)
5986 {
5987 /* This is needed because this instruction uses $gp, but
5988 the first instruction on the main stream does not. */
5989 macro_build (NULL, "nop", "");
5990 }
5991
5992 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5993 local_reloc_type, mips_gp_register);
5994 if (expr1.X_add_number >= -0x8000
5995 && expr1.X_add_number < 0x8000)
5996 {
5997 load_delay_nop ();
5998 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5999 tempreg, tempreg, BFD_RELOC_LO16);
6000 /* FIXME: If add_number is 0, and there was no base
6001 register, the external symbol case ended with a load,
6002 so if the symbol turns out to not be external, and
6003 the next instruction uses tempreg, an unnecessary nop
6004 will be inserted. */
6005 }
6006 else
6007 {
6008 if (breg == treg)
6009 {
6010 /* We must add in the base register now, as in the
6011 external symbol case. */
6012 gas_assert (tempreg == AT);
6013 load_delay_nop ();
6014 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6015 treg, AT, breg);
6016 tempreg = treg;
6017 /* We set breg to 0 because we have arranged to add
6018 it in in both cases. */
6019 breg = 0;
6020 }
6021
6022 macro_build_lui (&expr1, AT);
6023 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6024 AT, AT, BFD_RELOC_LO16);
6025 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6026 tempreg, tempreg, AT);
6027 used_at = 1;
6028 }
6029 relax_end ();
6030 }
6031 else if (mips_big_got && HAVE_NEWABI)
6032 {
6033 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6034 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6035 int add_breg_early = 0;
6036
6037 /* This is the large GOT case. If this is a reference to an
6038 external symbol, and there is no constant, we want
6039 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6040 add $tempreg,$tempreg,$gp
6041 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6042 or for lca or if tempreg is PIC_CALL_REG
6043 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6044 add $tempreg,$tempreg,$gp
6045 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6046
6047 If we have a small constant, and this is a reference to
6048 an external symbol, we want
6049 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6050 add $tempreg,$tempreg,$gp
6051 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6052 addi $tempreg,$tempreg,<constant>
6053
6054 If we have a large constant, and this is a reference to
6055 an external symbol, we want
6056 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6057 addu $tempreg,$tempreg,$gp
6058 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6059 lui $at,<hiconstant>
6060 addi $at,$at,<loconstant>
6061 add $tempreg,$tempreg,$at
6062
6063 If we have NewABI, and we know it's a local symbol, we want
6064 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6065 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6066 otherwise we have to resort to GOT_HI16/GOT_LO16. */
6067
6068 relax_start (offset_expr.X_add_symbol);
6069
6070 expr1.X_add_number = offset_expr.X_add_number;
6071 offset_expr.X_add_number = 0;
6072
6073 if (expr1.X_add_number == 0 && breg == 0
6074 && (call || tempreg == PIC_CALL_REG))
6075 {
6076 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6077 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6078 }
6079 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6080 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6081 tempreg, tempreg, mips_gp_register);
6082 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6083 tempreg, lw_reloc_type, tempreg);
6084
6085 if (expr1.X_add_number == 0)
6086 ;
6087 else if (expr1.X_add_number >= -0x8000
6088 && expr1.X_add_number < 0x8000)
6089 {
6090 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6091 tempreg, tempreg, BFD_RELOC_LO16);
6092 }
6093 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6094 {
6095 /* If we are going to add in a base register, and the
6096 target register and the base register are the same,
6097 then we are using AT as a temporary register. Since
6098 we want to load the constant into AT, we add our
6099 current AT (from the global offset table) and the
6100 register into the register now, and pretend we were
6101 not using a base register. */
6102 if (breg != treg)
6103 dreg = tempreg;
6104 else
6105 {
6106 gas_assert (tempreg == AT);
6107 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6108 treg, AT, breg);
6109 dreg = treg;
6110 add_breg_early = 1;
6111 }
6112
6113 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6114 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6115
6116 used_at = 1;
6117 }
6118 else
6119 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6120
6121 relax_switch ();
6122 offset_expr.X_add_number = expr1.X_add_number;
6123 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6124 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6125 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6126 tempreg, BFD_RELOC_MIPS_GOT_OFST);
6127 if (add_breg_early)
6128 {
6129 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6130 treg, tempreg, breg);
6131 breg = 0;
6132 tempreg = treg;
6133 }
6134 relax_end ();
6135 }
6136 else
6137 abort ();
6138
6139 if (breg != 0)
6140 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6141 break;
6142
6143 case M_MSGSND:
6144 {
6145 unsigned long temp = (treg << 16) | (0x01);
6146 macro_build (NULL, "c2", "C", temp);
6147 }
6148 break;
6149
6150 case M_MSGLD:
6151 {
6152 unsigned long temp = (0x02);
6153 macro_build (NULL, "c2", "C", temp);
6154 }
6155 break;
6156
6157 case M_MSGLD_T:
6158 {
6159 unsigned long temp = (treg << 16) | (0x02);
6160 macro_build (NULL, "c2", "C", temp);
6161 }
6162 break;
6163
6164 case M_MSGWAIT:
6165 macro_build (NULL, "c2", "C", 3);
6166 break;
6167
6168 case M_MSGWAIT_T:
6169 {
6170 unsigned long temp = (treg << 16) | 0x03;
6171 macro_build (NULL, "c2", "C", temp);
6172 }
6173 break;
6174
6175 case M_J_A:
6176 /* The j instruction may not be used in PIC code, since it
6177 requires an absolute address. We convert it to a b
6178 instruction. */
6179 if (mips_pic == NO_PIC)
6180 macro_build (&offset_expr, "j", "a");
6181 else
6182 macro_build (&offset_expr, "b", "p");
6183 break;
6184
6185 /* The jal instructions must be handled as macros because when
6186 generating PIC code they expand to multi-instruction
6187 sequences. Normally they are simple instructions. */
6188 case M_JAL_1:
6189 dreg = RA;
6190 /* Fall through. */
6191 case M_JAL_2:
6192 if (mips_pic == NO_PIC)
6193 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6194 else
6195 {
6196 if (sreg != PIC_CALL_REG)
6197 as_warn (_("MIPS PIC call to register other than $25"));
6198
6199 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6200 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6201 {
6202 if (mips_cprestore_offset < 0)
6203 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6204 else
6205 {
6206 if (!mips_frame_reg_valid)
6207 {
6208 as_warn (_("No .frame pseudo-op used in PIC code"));
6209 /* Quiet this warning. */
6210 mips_frame_reg_valid = 1;
6211 }
6212 if (!mips_cprestore_valid)
6213 {
6214 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6215 /* Quiet this warning. */
6216 mips_cprestore_valid = 1;
6217 }
6218 if (mips_opts.noreorder)
6219 macro_build (NULL, "nop", "");
6220 expr1.X_add_number = mips_cprestore_offset;
6221 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6222 mips_gp_register,
6223 mips_frame_reg,
6224 HAVE_64BIT_ADDRESSES);
6225 }
6226 }
6227 }
6228
6229 break;
6230
6231 case M_JAL_A:
6232 if (mips_pic == NO_PIC)
6233 macro_build (&offset_expr, "jal", "a");
6234 else if (mips_pic == SVR4_PIC)
6235 {
6236 /* If this is a reference to an external symbol, and we are
6237 using a small GOT, we want
6238 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6239 nop
6240 jalr $ra,$25
6241 nop
6242 lw $gp,cprestore($sp)
6243 The cprestore value is set using the .cprestore
6244 pseudo-op. If we are using a big GOT, we want
6245 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6246 addu $25,$25,$gp
6247 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6248 nop
6249 jalr $ra,$25
6250 nop
6251 lw $gp,cprestore($sp)
6252 If the symbol is not external, we want
6253 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6254 nop
6255 addiu $25,$25,<sym> (BFD_RELOC_LO16)
6256 jalr $ra,$25
6257 nop
6258 lw $gp,cprestore($sp)
6259
6260 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6261 sequences above, minus nops, unless the symbol is local,
6262 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6263 GOT_DISP. */
6264 if (HAVE_NEWABI)
6265 {
6266 if (!mips_big_got)
6267 {
6268 relax_start (offset_expr.X_add_symbol);
6269 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6270 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6271 mips_gp_register);
6272 relax_switch ();
6273 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6274 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6275 mips_gp_register);
6276 relax_end ();
6277 }
6278 else
6279 {
6280 relax_start (offset_expr.X_add_symbol);
6281 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6282 BFD_RELOC_MIPS_CALL_HI16);
6283 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6284 PIC_CALL_REG, mips_gp_register);
6285 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6286 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6287 PIC_CALL_REG);
6288 relax_switch ();
6289 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6290 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6291 mips_gp_register);
6292 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6293 PIC_CALL_REG, PIC_CALL_REG,
6294 BFD_RELOC_MIPS_GOT_OFST);
6295 relax_end ();
6296 }
6297
6298 macro_build_jalr (&offset_expr);
6299 }
6300 else
6301 {
6302 relax_start (offset_expr.X_add_symbol);
6303 if (!mips_big_got)
6304 {
6305 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6306 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6307 mips_gp_register);
6308 load_delay_nop ();
6309 relax_switch ();
6310 }
6311 else
6312 {
6313 int gpdelay;
6314
6315 gpdelay = reg_needs_delay (mips_gp_register);
6316 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6317 BFD_RELOC_MIPS_CALL_HI16);
6318 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6319 PIC_CALL_REG, mips_gp_register);
6320 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6321 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6322 PIC_CALL_REG);
6323 load_delay_nop ();
6324 relax_switch ();
6325 if (gpdelay)
6326 macro_build (NULL, "nop", "");
6327 }
6328 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6329 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6330 mips_gp_register);
6331 load_delay_nop ();
6332 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6333 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6334 relax_end ();
6335 macro_build_jalr (&offset_expr);
6336
6337 if (mips_cprestore_offset < 0)
6338 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6339 else
6340 {
6341 if (!mips_frame_reg_valid)
6342 {
6343 as_warn (_("No .frame pseudo-op used in PIC code"));
6344 /* Quiet this warning. */
6345 mips_frame_reg_valid = 1;
6346 }
6347 if (!mips_cprestore_valid)
6348 {
6349 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6350 /* Quiet this warning. */
6351 mips_cprestore_valid = 1;
6352 }
6353 if (mips_opts.noreorder)
6354 macro_build (NULL, "nop", "");
6355 expr1.X_add_number = mips_cprestore_offset;
6356 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6357 mips_gp_register,
6358 mips_frame_reg,
6359 HAVE_64BIT_ADDRESSES);
6360 }
6361 }
6362 }
6363 else if (mips_pic == VXWORKS_PIC)
6364 as_bad (_("Non-PIC jump used in PIC library"));
6365 else
6366 abort ();
6367
6368 break;
6369
6370 case M_LB_AB:
6371 s = "lb";
6372 goto ld;
6373 case M_LBU_AB:
6374 s = "lbu";
6375 goto ld;
6376 case M_LH_AB:
6377 s = "lh";
6378 goto ld;
6379 case M_LHU_AB:
6380 s = "lhu";
6381 goto ld;
6382 case M_LW_AB:
6383 s = "lw";
6384 goto ld;
6385 case M_LWC0_AB:
6386 s = "lwc0";
6387 /* Itbl support may require additional care here. */
6388 coproc = 1;
6389 goto ld;
6390 case M_LWC1_AB:
6391 s = "lwc1";
6392 /* Itbl support may require additional care here. */
6393 coproc = 1;
6394 goto ld;
6395 case M_LWC2_AB:
6396 s = "lwc2";
6397 /* Itbl support may require additional care here. */
6398 coproc = 1;
6399 goto ld;
6400 case M_LWC3_AB:
6401 s = "lwc3";
6402 /* Itbl support may require additional care here. */
6403 coproc = 1;
6404 goto ld;
6405 case M_LWL_AB:
6406 s = "lwl";
6407 lr = 1;
6408 goto ld;
6409 case M_LWR_AB:
6410 s = "lwr";
6411 lr = 1;
6412 goto ld;
6413 case M_LDC1_AB:
6414 s = "ldc1";
6415 /* Itbl support may require additional care here. */
6416 coproc = 1;
6417 goto ld;
6418 case M_LDC2_AB:
6419 s = "ldc2";
6420 /* Itbl support may require additional care here. */
6421 coproc = 1;
6422 goto ld;
6423 case M_LDC3_AB:
6424 s = "ldc3";
6425 /* Itbl support may require additional care here. */
6426 coproc = 1;
6427 goto ld;
6428 case M_LDL_AB:
6429 s = "ldl";
6430 lr = 1;
6431 goto ld;
6432 case M_LDR_AB:
6433 s = "ldr";
6434 lr = 1;
6435 goto ld;
6436 case M_LL_AB:
6437 s = "ll";
6438 goto ld;
6439 case M_LLD_AB:
6440 s = "lld";
6441 goto ld;
6442 case M_LWU_AB:
6443 s = "lwu";
6444 ld:
6445 if (breg == treg || coproc || lr)
6446 {
6447 tempreg = AT;
6448 used_at = 1;
6449 }
6450 else
6451 {
6452 tempreg = treg;
6453 }
6454 goto ld_st;
6455 case M_SB_AB:
6456 s = "sb";
6457 goto st;
6458 case M_SH_AB:
6459 s = "sh";
6460 goto st;
6461 case M_SW_AB:
6462 s = "sw";
6463 goto st;
6464 case M_SWC0_AB:
6465 s = "swc0";
6466 /* Itbl support may require additional care here. */
6467 coproc = 1;
6468 goto st;
6469 case M_SWC1_AB:
6470 s = "swc1";
6471 /* Itbl support may require additional care here. */
6472 coproc = 1;
6473 goto st;
6474 case M_SWC2_AB:
6475 s = "swc2";
6476 /* Itbl support may require additional care here. */
6477 coproc = 1;
6478 goto st;
6479 case M_SWC3_AB:
6480 s = "swc3";
6481 /* Itbl support may require additional care here. */
6482 coproc = 1;
6483 goto st;
6484 case M_SWL_AB:
6485 s = "swl";
6486 goto st;
6487 case M_SWR_AB:
6488 s = "swr";
6489 goto st;
6490 case M_SC_AB:
6491 s = "sc";
6492 goto st;
6493 case M_SCD_AB:
6494 s = "scd";
6495 goto st;
6496 case M_CACHE_AB:
6497 s = "cache";
6498 goto st;
6499 case M_SDC1_AB:
6500 s = "sdc1";
6501 coproc = 1;
6502 /* Itbl support may require additional care here. */
6503 goto st;
6504 case M_SDC2_AB:
6505 s = "sdc2";
6506 /* Itbl support may require additional care here. */
6507 coproc = 1;
6508 goto st;
6509 case M_SDC3_AB:
6510 s = "sdc3";
6511 /* Itbl support may require additional care here. */
6512 coproc = 1;
6513 goto st;
6514 case M_SDL_AB:
6515 s = "sdl";
6516 goto st;
6517 case M_SDR_AB:
6518 s = "sdr";
6519 st:
6520 tempreg = AT;
6521 used_at = 1;
6522 ld_st:
6523 if (coproc
6524 && NO_ISA_COP (mips_opts.arch)
6525 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6526 {
6527 as_bad (_("Opcode not supported on this processor: %s"),
6528 mips_cpu_info_from_arch (mips_opts.arch)->name);
6529 break;
6530 }
6531
6532 /* Itbl support may require additional care here. */
6533 if (mask == M_LWC1_AB
6534 || mask == M_SWC1_AB
6535 || mask == M_LDC1_AB
6536 || mask == M_SDC1_AB
6537 || mask == M_L_DAB
6538 || mask == M_S_DAB)
6539 fmt = "T,o(b)";
6540 else if (mask == M_CACHE_AB)
6541 fmt = "k,o(b)";
6542 else if (coproc)
6543 fmt = "E,o(b)";
6544 else
6545 fmt = "t,o(b)";
6546
6547 if (offset_expr.X_op != O_constant
6548 && offset_expr.X_op != O_symbol)
6549 {
6550 as_bad (_("Expression too complex"));
6551 offset_expr.X_op = O_constant;
6552 }
6553
6554 if (HAVE_32BIT_ADDRESSES
6555 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6556 {
6557 char value [32];
6558
6559 sprintf_vma (value, offset_expr.X_add_number);
6560 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6561 }
6562
6563 /* A constant expression in PIC code can be handled just as it
6564 is in non PIC code. */
6565 if (offset_expr.X_op == O_constant)
6566 {
6567 expr1.X_add_number = offset_expr.X_add_number;
6568 normalize_address_expr (&expr1);
6569 if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6570 {
6571 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6572 & ~(bfd_vma) 0xffff);
6573 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6574 if (breg != 0)
6575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6576 tempreg, tempreg, breg);
6577 breg = tempreg;
6578 }
6579 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6580 }
6581 else if (mips_pic == NO_PIC)
6582 {
6583 /* If this is a reference to a GP relative symbol, and there
6584 is no base register, we want
6585 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6586 Otherwise, if there is no base register, we want
6587 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6588 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6589 If we have a constant, we need two instructions anyhow,
6590 so we always use the latter form.
6591
6592 If we have a base register, and this is a reference to a
6593 GP relative symbol, we want
6594 addu $tempreg,$breg,$gp
6595 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6596 Otherwise we want
6597 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6598 addu $tempreg,$tempreg,$breg
6599 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6600 With a constant we always use the latter case.
6601
6602 With 64bit address space and no base register and $at usable,
6603 we want
6604 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6605 lui $at,<sym> (BFD_RELOC_HI16_S)
6606 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6607 dsll32 $tempreg,0
6608 daddu $tempreg,$at
6609 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6610 If we have a base register, we want
6611 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6612 lui $at,<sym> (BFD_RELOC_HI16_S)
6613 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6614 daddu $at,$breg
6615 dsll32 $tempreg,0
6616 daddu $tempreg,$at
6617 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6618
6619 Without $at we can't generate the optimal path for superscalar
6620 processors here since this would require two temporary registers.
6621 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6622 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6623 dsll $tempreg,16
6624 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6625 dsll $tempreg,16
6626 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6627 If we have a base register, we want
6628 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6629 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6630 dsll $tempreg,16
6631 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6632 dsll $tempreg,16
6633 daddu $tempreg,$tempreg,$breg
6634 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6635
6636 For GP relative symbols in 64bit address space we can use
6637 the same sequence as in 32bit address space. */
6638 if (HAVE_64BIT_SYMBOLS)
6639 {
6640 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6641 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6642 {
6643 relax_start (offset_expr.X_add_symbol);
6644 if (breg == 0)
6645 {
6646 macro_build (&offset_expr, s, fmt, treg,
6647 BFD_RELOC_GPREL16, mips_gp_register);
6648 }
6649 else
6650 {
6651 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6652 tempreg, breg, mips_gp_register);
6653 macro_build (&offset_expr, s, fmt, treg,
6654 BFD_RELOC_GPREL16, tempreg);
6655 }
6656 relax_switch ();
6657 }
6658
6659 if (used_at == 0 && mips_opts.at)
6660 {
6661 macro_build (&offset_expr, "lui", "t,u", tempreg,
6662 BFD_RELOC_MIPS_HIGHEST);
6663 macro_build (&offset_expr, "lui", "t,u", AT,
6664 BFD_RELOC_HI16_S);
6665 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6666 tempreg, BFD_RELOC_MIPS_HIGHER);
6667 if (breg != 0)
6668 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6669 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6670 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6671 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6672 tempreg);
6673 used_at = 1;
6674 }
6675 else
6676 {
6677 macro_build (&offset_expr, "lui", "t,u", tempreg,
6678 BFD_RELOC_MIPS_HIGHEST);
6679 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6680 tempreg, BFD_RELOC_MIPS_HIGHER);
6681 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6682 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6683 tempreg, BFD_RELOC_HI16_S);
6684 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6685 if (breg != 0)
6686 macro_build (NULL, "daddu", "d,v,t",
6687 tempreg, tempreg, breg);
6688 macro_build (&offset_expr, s, fmt, treg,
6689 BFD_RELOC_LO16, tempreg);
6690 }
6691
6692 if (mips_relax.sequence)
6693 relax_end ();
6694 break;
6695 }
6696
6697 if (breg == 0)
6698 {
6699 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6700 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6701 {
6702 relax_start (offset_expr.X_add_symbol);
6703 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6704 mips_gp_register);
6705 relax_switch ();
6706 }
6707 macro_build_lui (&offset_expr, tempreg);
6708 macro_build (&offset_expr, s, fmt, treg,
6709 BFD_RELOC_LO16, tempreg);
6710 if (mips_relax.sequence)
6711 relax_end ();
6712 }
6713 else
6714 {
6715 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6716 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6717 {
6718 relax_start (offset_expr.X_add_symbol);
6719 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6720 tempreg, breg, mips_gp_register);
6721 macro_build (&offset_expr, s, fmt, treg,
6722 BFD_RELOC_GPREL16, tempreg);
6723 relax_switch ();
6724 }
6725 macro_build_lui (&offset_expr, tempreg);
6726 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6727 tempreg, tempreg, breg);
6728 macro_build (&offset_expr, s, fmt, treg,
6729 BFD_RELOC_LO16, tempreg);
6730 if (mips_relax.sequence)
6731 relax_end ();
6732 }
6733 }
6734 else if (!mips_big_got)
6735 {
6736 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6737
6738 /* If this is a reference to an external symbol, we want
6739 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6740 nop
6741 <op> $treg,0($tempreg)
6742 Otherwise we want
6743 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6744 nop
6745 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6746 <op> $treg,0($tempreg)
6747
6748 For NewABI, we want
6749 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6750 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6751
6752 If there is a base register, we add it to $tempreg before
6753 the <op>. If there is a constant, we stick it in the
6754 <op> instruction. We don't handle constants larger than
6755 16 bits, because we have no way to load the upper 16 bits
6756 (actually, we could handle them for the subset of cases
6757 in which we are not using $at). */
6758 gas_assert (offset_expr.X_op == O_symbol);
6759 if (HAVE_NEWABI)
6760 {
6761 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6762 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6763 if (breg != 0)
6764 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6765 tempreg, tempreg, breg);
6766 macro_build (&offset_expr, s, fmt, treg,
6767 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6768 break;
6769 }
6770 expr1.X_add_number = offset_expr.X_add_number;
6771 offset_expr.X_add_number = 0;
6772 if (expr1.X_add_number < -0x8000
6773 || expr1.X_add_number >= 0x8000)
6774 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6775 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6776 lw_reloc_type, mips_gp_register);
6777 load_delay_nop ();
6778 relax_start (offset_expr.X_add_symbol);
6779 relax_switch ();
6780 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6781 tempreg, BFD_RELOC_LO16);
6782 relax_end ();
6783 if (breg != 0)
6784 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6785 tempreg, tempreg, breg);
6786 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6787 }
6788 else if (mips_big_got && !HAVE_NEWABI)
6789 {
6790 int gpdelay;
6791
6792 /* If this is a reference to an external symbol, we want
6793 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6794 addu $tempreg,$tempreg,$gp
6795 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6796 <op> $treg,0($tempreg)
6797 Otherwise we want
6798 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6799 nop
6800 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6801 <op> $treg,0($tempreg)
6802 If there is a base register, we add it to $tempreg before
6803 the <op>. If there is a constant, we stick it in the
6804 <op> instruction. We don't handle constants larger than
6805 16 bits, because we have no way to load the upper 16 bits
6806 (actually, we could handle them for the subset of cases
6807 in which we are not using $at). */
6808 gas_assert (offset_expr.X_op == O_symbol);
6809 expr1.X_add_number = offset_expr.X_add_number;
6810 offset_expr.X_add_number = 0;
6811 if (expr1.X_add_number < -0x8000
6812 || expr1.X_add_number >= 0x8000)
6813 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6814 gpdelay = reg_needs_delay (mips_gp_register);
6815 relax_start (offset_expr.X_add_symbol);
6816 macro_build (&offset_expr, "lui", "t,u", tempreg,
6817 BFD_RELOC_MIPS_GOT_HI16);
6818 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6819 mips_gp_register);
6820 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6821 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6822 relax_switch ();
6823 if (gpdelay)
6824 macro_build (NULL, "nop", "");
6825 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6826 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6827 load_delay_nop ();
6828 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6829 tempreg, BFD_RELOC_LO16);
6830 relax_end ();
6831
6832 if (breg != 0)
6833 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6834 tempreg, tempreg, breg);
6835 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6836 }
6837 else if (mips_big_got && HAVE_NEWABI)
6838 {
6839 /* If this is a reference to an external symbol, we want
6840 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6841 add $tempreg,$tempreg,$gp
6842 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6843 <op> $treg,<ofst>($tempreg)
6844 Otherwise, for local symbols, we want:
6845 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6846 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6847 gas_assert (offset_expr.X_op == O_symbol);
6848 expr1.X_add_number = offset_expr.X_add_number;
6849 offset_expr.X_add_number = 0;
6850 if (expr1.X_add_number < -0x8000
6851 || expr1.X_add_number >= 0x8000)
6852 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6853 relax_start (offset_expr.X_add_symbol);
6854 macro_build (&offset_expr, "lui", "t,u", tempreg,
6855 BFD_RELOC_MIPS_GOT_HI16);
6856 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6857 mips_gp_register);
6858 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6859 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6860 if (breg != 0)
6861 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6862 tempreg, tempreg, breg);
6863 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6864
6865 relax_switch ();
6866 offset_expr.X_add_number = expr1.X_add_number;
6867 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6868 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6869 if (breg != 0)
6870 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6871 tempreg, tempreg, breg);
6872 macro_build (&offset_expr, s, fmt, treg,
6873 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6874 relax_end ();
6875 }
6876 else
6877 abort ();
6878
6879 break;
6880
6881 case M_LI:
6882 case M_LI_S:
6883 load_register (treg, &imm_expr, 0);
6884 break;
6885
6886 case M_DLI:
6887 load_register (treg, &imm_expr, 1);
6888 break;
6889
6890 case M_LI_SS:
6891 if (imm_expr.X_op == O_constant)
6892 {
6893 used_at = 1;
6894 load_register (AT, &imm_expr, 0);
6895 macro_build (NULL, "mtc1", "t,G", AT, treg);
6896 break;
6897 }
6898 else
6899 {
6900 gas_assert (offset_expr.X_op == O_symbol
6901 && strcmp (segment_name (S_GET_SEGMENT
6902 (offset_expr.X_add_symbol)),
6903 ".lit4") == 0
6904 && offset_expr.X_add_number == 0);
6905 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6906 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6907 break;
6908 }
6909
6910 case M_LI_D:
6911 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6912 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6913 order 32 bits of the value and the low order 32 bits are either
6914 zero or in OFFSET_EXPR. */
6915 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6916 {
6917 if (HAVE_64BIT_GPRS)
6918 load_register (treg, &imm_expr, 1);
6919 else
6920 {
6921 int hreg, lreg;
6922
6923 if (target_big_endian)
6924 {
6925 hreg = treg;
6926 lreg = treg + 1;
6927 }
6928 else
6929 {
6930 hreg = treg + 1;
6931 lreg = treg;
6932 }
6933
6934 if (hreg <= 31)
6935 load_register (hreg, &imm_expr, 0);
6936 if (lreg <= 31)
6937 {
6938 if (offset_expr.X_op == O_absent)
6939 move_register (lreg, 0);
6940 else
6941 {
6942 gas_assert (offset_expr.X_op == O_constant);
6943 load_register (lreg, &offset_expr, 0);
6944 }
6945 }
6946 }
6947 break;
6948 }
6949
6950 /* We know that sym is in the .rdata section. First we get the
6951 upper 16 bits of the address. */
6952 if (mips_pic == NO_PIC)
6953 {
6954 macro_build_lui (&offset_expr, AT);
6955 used_at = 1;
6956 }
6957 else
6958 {
6959 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6960 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6961 used_at = 1;
6962 }
6963
6964 /* Now we load the register(s). */
6965 if (HAVE_64BIT_GPRS)
6966 {
6967 used_at = 1;
6968 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6969 }
6970 else
6971 {
6972 used_at = 1;
6973 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6974 if (treg != RA)
6975 {
6976 /* FIXME: How in the world do we deal with the possible
6977 overflow here? */
6978 offset_expr.X_add_number += 4;
6979 macro_build (&offset_expr, "lw", "t,o(b)",
6980 treg + 1, BFD_RELOC_LO16, AT);
6981 }
6982 }
6983 break;
6984
6985 case M_LI_DD:
6986 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6987 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6988 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6989 the value and the low order 32 bits are either zero or in
6990 OFFSET_EXPR. */
6991 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6992 {
6993 used_at = 1;
6994 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6995 if (HAVE_64BIT_FPRS)
6996 {
6997 gas_assert (HAVE_64BIT_GPRS);
6998 macro_build (NULL, "dmtc1", "t,S", AT, treg);
6999 }
7000 else
7001 {
7002 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7003 if (offset_expr.X_op == O_absent)
7004 macro_build (NULL, "mtc1", "t,G", 0, treg);
7005 else
7006 {
7007 gas_assert (offset_expr.X_op == O_constant);
7008 load_register (AT, &offset_expr, 0);
7009 macro_build (NULL, "mtc1", "t,G", AT, treg);
7010 }
7011 }
7012 break;
7013 }
7014
7015 gas_assert (offset_expr.X_op == O_symbol
7016 && offset_expr.X_add_number == 0);
7017 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7018 if (strcmp (s, ".lit8") == 0)
7019 {
7020 if (mips_opts.isa != ISA_MIPS1)
7021 {
7022 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7023 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7024 break;
7025 }
7026 breg = mips_gp_register;
7027 r = BFD_RELOC_MIPS_LITERAL;
7028 goto dob;
7029 }
7030 else
7031 {
7032 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7033 used_at = 1;
7034 if (mips_pic != NO_PIC)
7035 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7036 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7037 else
7038 {
7039 /* FIXME: This won't work for a 64 bit address. */
7040 macro_build_lui (&offset_expr, AT);
7041 }
7042
7043 if (mips_opts.isa != ISA_MIPS1)
7044 {
7045 macro_build (&offset_expr, "ldc1", "T,o(b)",
7046 treg, BFD_RELOC_LO16, AT);
7047 break;
7048 }
7049 breg = AT;
7050 r = BFD_RELOC_LO16;
7051 goto dob;
7052 }
7053
7054 case M_L_DOB:
7055 /* Even on a big endian machine $fn comes before $fn+1. We have
7056 to adjust when loading from memory. */
7057 r = BFD_RELOC_LO16;
7058 dob:
7059 gas_assert (mips_opts.isa == ISA_MIPS1);
7060 macro_build (&offset_expr, "lwc1", "T,o(b)",
7061 target_big_endian ? treg + 1 : treg, r, breg);
7062 /* FIXME: A possible overflow which I don't know how to deal
7063 with. */
7064 offset_expr.X_add_number += 4;
7065 macro_build (&offset_expr, "lwc1", "T,o(b)",
7066 target_big_endian ? treg : treg + 1, r, breg);
7067 break;
7068
7069 case M_S_DOB:
7070 gas_assert (mips_opts.isa == ISA_MIPS1);
7071 /* Even on a big endian machine $fn comes before $fn+1. We have
7072 to adjust when storing to memory. */
7073 macro_build (&offset_expr, "swc1", "T,o(b)",
7074 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7075 offset_expr.X_add_number += 4;
7076 macro_build (&offset_expr, "swc1", "T,o(b)",
7077 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7078 break;
7079
7080 case M_L_DAB:
7081 /*
7082 * The MIPS assembler seems to check for X_add_number not
7083 * being double aligned and generating:
7084 * lui at,%hi(foo+1)
7085 * addu at,at,v1
7086 * addiu at,at,%lo(foo+1)
7087 * lwc1 f2,0(at)
7088 * lwc1 f3,4(at)
7089 * But, the resulting address is the same after relocation so why
7090 * generate the extra instruction?
7091 */
7092 /* Itbl support may require additional care here. */
7093 coproc = 1;
7094 if (mips_opts.isa != ISA_MIPS1)
7095 {
7096 s = "ldc1";
7097 goto ld;
7098 }
7099
7100 s = "lwc1";
7101 fmt = "T,o(b)";
7102 goto ldd_std;
7103
7104 case M_S_DAB:
7105 if (mips_opts.isa != ISA_MIPS1)
7106 {
7107 s = "sdc1";
7108 goto st;
7109 }
7110
7111 s = "swc1";
7112 fmt = "T,o(b)";
7113 /* Itbl support may require additional care here. */
7114 coproc = 1;
7115 goto ldd_std;
7116
7117 case M_LD_AB:
7118 if (HAVE_64BIT_GPRS)
7119 {
7120 s = "ld";
7121 goto ld;
7122 }
7123
7124 s = "lw";
7125 fmt = "t,o(b)";
7126 goto ldd_std;
7127
7128 case M_SD_AB:
7129 if (HAVE_64BIT_GPRS)
7130 {
7131 s = "sd";
7132 goto st;
7133 }
7134
7135 s = "sw";
7136 fmt = "t,o(b)";
7137
7138 ldd_std:
7139 if (offset_expr.X_op != O_symbol
7140 && offset_expr.X_op != O_constant)
7141 {
7142 as_bad (_("Expression too complex"));
7143 offset_expr.X_op = O_constant;
7144 }
7145
7146 if (HAVE_32BIT_ADDRESSES
7147 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7148 {
7149 char value [32];
7150
7151 sprintf_vma (value, offset_expr.X_add_number);
7152 as_bad (_("Number (0x%s) larger than 32 bits"), value);
7153 }
7154
7155 /* Even on a big endian machine $fn comes before $fn+1. We have
7156 to adjust when loading from memory. We set coproc if we must
7157 load $fn+1 first. */
7158 /* Itbl support may require additional care here. */
7159 if (!target_big_endian)
7160 coproc = 0;
7161
7162 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7163 {
7164 /* If this is a reference to a GP relative symbol, we want
7165 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7166 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
7167 If we have a base register, we use this
7168 addu $at,$breg,$gp
7169 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7170 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
7171 If this is not a GP relative symbol, we want
7172 lui $at,<sym> (BFD_RELOC_HI16_S)
7173 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7174 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7175 If there is a base register, we add it to $at after the
7176 lui instruction. If there is a constant, we always use
7177 the last case. */
7178 if (offset_expr.X_op == O_symbol
7179 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7180 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7181 {
7182 relax_start (offset_expr.X_add_symbol);
7183 if (breg == 0)
7184 {
7185 tempreg = mips_gp_register;
7186 }
7187 else
7188 {
7189 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7190 AT, breg, mips_gp_register);
7191 tempreg = AT;
7192 used_at = 1;
7193 }
7194
7195 /* Itbl support may require additional care here. */
7196 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7197 BFD_RELOC_GPREL16, tempreg);
7198 offset_expr.X_add_number += 4;
7199
7200 /* Set mips_optimize to 2 to avoid inserting an
7201 undesired nop. */
7202 hold_mips_optimize = mips_optimize;
7203 mips_optimize = 2;
7204 /* Itbl support may require additional care here. */
7205 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7206 BFD_RELOC_GPREL16, tempreg);
7207 mips_optimize = hold_mips_optimize;
7208
7209 relax_switch ();
7210
7211 offset_expr.X_add_number -= 4;
7212 }
7213 used_at = 1;
7214 macro_build_lui (&offset_expr, AT);
7215 if (breg != 0)
7216 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7217 /* Itbl support may require additional care here. */
7218 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7219 BFD_RELOC_LO16, AT);
7220 /* FIXME: How do we handle overflow here? */
7221 offset_expr.X_add_number += 4;
7222 /* Itbl support may require additional care here. */
7223 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7224 BFD_RELOC_LO16, AT);
7225 if (mips_relax.sequence)
7226 relax_end ();
7227 }
7228 else if (!mips_big_got)
7229 {
7230 /* If this is a reference to an external symbol, we want
7231 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7232 nop
7233 <op> $treg,0($at)
7234 <op> $treg+1,4($at)
7235 Otherwise we want
7236 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7237 nop
7238 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7239 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7240 If there is a base register we add it to $at before the
7241 lwc1 instructions. If there is a constant we include it
7242 in the lwc1 instructions. */
7243 used_at = 1;
7244 expr1.X_add_number = offset_expr.X_add_number;
7245 if (expr1.X_add_number < -0x8000
7246 || expr1.X_add_number >= 0x8000 - 4)
7247 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7248 load_got_offset (AT, &offset_expr);
7249 load_delay_nop ();
7250 if (breg != 0)
7251 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7252
7253 /* Set mips_optimize to 2 to avoid inserting an undesired
7254 nop. */
7255 hold_mips_optimize = mips_optimize;
7256 mips_optimize = 2;
7257
7258 /* Itbl support may require additional care here. */
7259 relax_start (offset_expr.X_add_symbol);
7260 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7261 BFD_RELOC_LO16, AT);
7262 expr1.X_add_number += 4;
7263 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7264 BFD_RELOC_LO16, AT);
7265 relax_switch ();
7266 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7267 BFD_RELOC_LO16, AT);
7268 offset_expr.X_add_number += 4;
7269 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7270 BFD_RELOC_LO16, AT);
7271 relax_end ();
7272
7273 mips_optimize = hold_mips_optimize;
7274 }
7275 else if (mips_big_got)
7276 {
7277 int gpdelay;
7278
7279 /* If this is a reference to an external symbol, we want
7280 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7281 addu $at,$at,$gp
7282 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7283 nop
7284 <op> $treg,0($at)
7285 <op> $treg+1,4($at)
7286 Otherwise we want
7287 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7288 nop
7289 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7290 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7291 If there is a base register we add it to $at before the
7292 lwc1 instructions. If there is a constant we include it
7293 in the lwc1 instructions. */
7294 used_at = 1;
7295 expr1.X_add_number = offset_expr.X_add_number;
7296 offset_expr.X_add_number = 0;
7297 if (expr1.X_add_number < -0x8000
7298 || expr1.X_add_number >= 0x8000 - 4)
7299 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7300 gpdelay = reg_needs_delay (mips_gp_register);
7301 relax_start (offset_expr.X_add_symbol);
7302 macro_build (&offset_expr, "lui", "t,u",
7303 AT, BFD_RELOC_MIPS_GOT_HI16);
7304 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7305 AT, AT, mips_gp_register);
7306 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7307 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7308 load_delay_nop ();
7309 if (breg != 0)
7310 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7311 /* Itbl support may require additional care here. */
7312 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7313 BFD_RELOC_LO16, AT);
7314 expr1.X_add_number += 4;
7315
7316 /* Set mips_optimize to 2 to avoid inserting an undesired
7317 nop. */
7318 hold_mips_optimize = mips_optimize;
7319 mips_optimize = 2;
7320 /* Itbl support may require additional care here. */
7321 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7322 BFD_RELOC_LO16, AT);
7323 mips_optimize = hold_mips_optimize;
7324 expr1.X_add_number -= 4;
7325
7326 relax_switch ();
7327 offset_expr.X_add_number = expr1.X_add_number;
7328 if (gpdelay)
7329 macro_build (NULL, "nop", "");
7330 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7331 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7332 load_delay_nop ();
7333 if (breg != 0)
7334 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7335 /* Itbl support may require additional care here. */
7336 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7337 BFD_RELOC_LO16, AT);
7338 offset_expr.X_add_number += 4;
7339
7340 /* Set mips_optimize to 2 to avoid inserting an undesired
7341 nop. */
7342 hold_mips_optimize = mips_optimize;
7343 mips_optimize = 2;
7344 /* Itbl support may require additional care here. */
7345 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7346 BFD_RELOC_LO16, AT);
7347 mips_optimize = hold_mips_optimize;
7348 relax_end ();
7349 }
7350 else
7351 abort ();
7352
7353 break;
7354
7355 case M_LD_OB:
7356 s = HAVE_64BIT_GPRS ? "ld" : "lw";
7357 goto sd_ob;
7358 case M_SD_OB:
7359 s = HAVE_64BIT_GPRS ? "sd" : "sw";
7360 sd_ob:
7361 macro_build (&offset_expr, s, "t,o(b)", treg,
7362 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7363 breg);
7364 if (!HAVE_64BIT_GPRS)
7365 {
7366 offset_expr.X_add_number += 4;
7367 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7368 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7369 breg);
7370 }
7371 break;
7372
7373 /* New code added to support COPZ instructions.
7374 This code builds table entries out of the macros in mip_opcodes.
7375 R4000 uses interlocks to handle coproc delays.
7376 Other chips (like the R3000) require nops to be inserted for delays.
7377
7378 FIXME: Currently, we require that the user handle delays.
7379 In order to fill delay slots for non-interlocked chips,
7380 we must have a way to specify delays based on the coprocessor.
7381 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7382 What are the side-effects of the cop instruction?
7383 What cache support might we have and what are its effects?
7384 Both coprocessor & memory require delays. how long???
7385 What registers are read/set/modified?
7386
7387 If an itbl is provided to interpret cop instructions,
7388 this knowledge can be encoded in the itbl spec. */
7389
7390 case M_COP0:
7391 s = "c0";
7392 goto copz;
7393 case M_COP1:
7394 s = "c1";
7395 goto copz;
7396 case M_COP2:
7397 s = "c2";
7398 goto copz;
7399 case M_COP3:
7400 s = "c3";
7401 copz:
7402 if (NO_ISA_COP (mips_opts.arch)
7403 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7404 {
7405 as_bad (_("opcode not supported on this processor: %s"),
7406 mips_cpu_info_from_arch (mips_opts.arch)->name);
7407 break;
7408 }
7409
7410 /* For now we just do C (same as Cz). The parameter will be
7411 stored in insn_opcode by mips_ip. */
7412 macro_build (NULL, s, "C", ip->insn_opcode);
7413 break;
7414
7415 case M_MOVE:
7416 move_register (dreg, sreg);
7417 break;
7418
7419 case M_DMUL:
7420 dbl = 1;
7421 case M_MUL:
7422 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7423 macro_build (NULL, "mflo", "d", dreg);
7424 break;
7425
7426 case M_DMUL_I:
7427 dbl = 1;
7428 case M_MUL_I:
7429 /* The MIPS assembler some times generates shifts and adds. I'm
7430 not trying to be that fancy. GCC should do this for us
7431 anyway. */
7432 used_at = 1;
7433 load_register (AT, &imm_expr, dbl);
7434 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7435 macro_build (NULL, "mflo", "d", dreg);
7436 break;
7437
7438 case M_DMULO_I:
7439 dbl = 1;
7440 case M_MULO_I:
7441 imm = 1;
7442 goto do_mulo;
7443
7444 case M_DMULO:
7445 dbl = 1;
7446 case M_MULO:
7447 do_mulo:
7448 start_noreorder ();
7449 used_at = 1;
7450 if (imm)
7451 load_register (AT, &imm_expr, dbl);
7452 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7453 macro_build (NULL, "mflo", "d", dreg);
7454 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7455 macro_build (NULL, "mfhi", "d", AT);
7456 if (mips_trap)
7457 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7458 else
7459 {
7460 expr1.X_add_number = 8;
7461 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7462 macro_build (NULL, "nop", "");
7463 macro_build (NULL, "break", "c", 6);
7464 }
7465 end_noreorder ();
7466 macro_build (NULL, "mflo", "d", dreg);
7467 break;
7468
7469 case M_DMULOU_I:
7470 dbl = 1;
7471 case M_MULOU_I:
7472 imm = 1;
7473 goto do_mulou;
7474
7475 case M_DMULOU:
7476 dbl = 1;
7477 case M_MULOU:
7478 do_mulou:
7479 start_noreorder ();
7480 used_at = 1;
7481 if (imm)
7482 load_register (AT, &imm_expr, dbl);
7483 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7484 sreg, imm ? AT : treg);
7485 macro_build (NULL, "mfhi", "d", AT);
7486 macro_build (NULL, "mflo", "d", dreg);
7487 if (mips_trap)
7488 macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7489 else
7490 {
7491 expr1.X_add_number = 8;
7492 macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7493 macro_build (NULL, "nop", "");
7494 macro_build (NULL, "break", "c", 6);
7495 }
7496 end_noreorder ();
7497 break;
7498
7499 case M_DROL:
7500 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7501 {
7502 if (dreg == sreg)
7503 {
7504 tempreg = AT;
7505 used_at = 1;
7506 }
7507 else
7508 {
7509 tempreg = dreg;
7510 }
7511 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7512 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7513 break;
7514 }
7515 used_at = 1;
7516 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7517 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7518 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7519 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7520 break;
7521
7522 case M_ROL:
7523 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7524 {
7525 if (dreg == sreg)
7526 {
7527 tempreg = AT;
7528 used_at = 1;
7529 }
7530 else
7531 {
7532 tempreg = dreg;
7533 }
7534 macro_build (NULL, "negu", "d,w", tempreg, treg);
7535 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7536 break;
7537 }
7538 used_at = 1;
7539 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7540 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7541 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7542 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7543 break;
7544
7545 case M_DROL_I:
7546 {
7547 unsigned int rot;
7548 char *l;
7549 char *rr;
7550
7551 if (imm_expr.X_op != O_constant)
7552 as_bad (_("Improper rotate count"));
7553 rot = imm_expr.X_add_number & 0x3f;
7554 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7555 {
7556 rot = (64 - rot) & 0x3f;
7557 if (rot >= 32)
7558 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7559 else
7560 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7561 break;
7562 }
7563 if (rot == 0)
7564 {
7565 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7566 break;
7567 }
7568 l = (rot < 0x20) ? "dsll" : "dsll32";
7569 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7570 rot &= 0x1f;
7571 used_at = 1;
7572 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7573 macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7574 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7575 }
7576 break;
7577
7578 case M_ROL_I:
7579 {
7580 unsigned int rot;
7581
7582 if (imm_expr.X_op != O_constant)
7583 as_bad (_("Improper rotate count"));
7584 rot = imm_expr.X_add_number & 0x1f;
7585 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7586 {
7587 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7588 break;
7589 }
7590 if (rot == 0)
7591 {
7592 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7593 break;
7594 }
7595 used_at = 1;
7596 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7597 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7598 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7599 }
7600 break;
7601
7602 case M_DROR:
7603 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7604 {
7605 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7606 break;
7607 }
7608 used_at = 1;
7609 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7610 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7611 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7612 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7613 break;
7614
7615 case M_ROR:
7616 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7617 {
7618 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7619 break;
7620 }
7621 used_at = 1;
7622 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7623 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7624 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7625 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7626 break;
7627
7628 case M_DROR_I:
7629 {
7630 unsigned int rot;
7631 char *l;
7632 char *rr;
7633
7634 if (imm_expr.X_op != O_constant)
7635 as_bad (_("Improper rotate count"));
7636 rot = imm_expr.X_add_number & 0x3f;
7637 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7638 {
7639 if (rot >= 32)
7640 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7641 else
7642 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7643 break;
7644 }
7645 if (rot == 0)
7646 {
7647 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7648 break;
7649 }
7650 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7651 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7652 rot &= 0x1f;
7653 used_at = 1;
7654 macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7655 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7656 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7657 }
7658 break;
7659
7660 case M_ROR_I:
7661 {
7662 unsigned int rot;
7663
7664 if (imm_expr.X_op != O_constant)
7665 as_bad (_("Improper rotate count"));
7666 rot = imm_expr.X_add_number & 0x1f;
7667 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7668 {
7669 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7670 break;
7671 }
7672 if (rot == 0)
7673 {
7674 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7675 break;
7676 }
7677 used_at = 1;
7678 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7679 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7680 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7681 }
7682 break;
7683
7684 case M_SEQ:
7685 if (sreg == 0)
7686 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7687 else if (treg == 0)
7688 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7689 else
7690 {
7691 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7692 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7693 }
7694 break;
7695
7696 case M_SEQ_I:
7697 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7698 {
7699 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7700 break;
7701 }
7702 if (sreg == 0)
7703 {
7704 as_warn (_("Instruction %s: result is always false"),
7705 ip->insn_mo->name);
7706 move_register (dreg, 0);
7707 break;
7708 }
7709 if (CPU_HAS_SEQ (mips_opts.arch)
7710 && -512 <= imm_expr.X_add_number
7711 && imm_expr.X_add_number < 512)
7712 {
7713 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7714 (int) imm_expr.X_add_number);
7715 break;
7716 }
7717 if (imm_expr.X_op == O_constant
7718 && imm_expr.X_add_number >= 0
7719 && imm_expr.X_add_number < 0x10000)
7720 {
7721 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7722 }
7723 else if (imm_expr.X_op == O_constant
7724 && imm_expr.X_add_number > -0x8000
7725 && imm_expr.X_add_number < 0)
7726 {
7727 imm_expr.X_add_number = -imm_expr.X_add_number;
7728 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7729 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7730 }
7731 else if (CPU_HAS_SEQ (mips_opts.arch))
7732 {
7733 used_at = 1;
7734 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7735 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7736 break;
7737 }
7738 else
7739 {
7740 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7741 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7742 used_at = 1;
7743 }
7744 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7745 break;
7746
7747 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7748 s = "slt";
7749 goto sge;
7750 case M_SGEU:
7751 s = "sltu";
7752 sge:
7753 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7754 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7755 break;
7756
7757 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7758 case M_SGEU_I:
7759 if (imm_expr.X_op == O_constant
7760 && imm_expr.X_add_number >= -0x8000
7761 && imm_expr.X_add_number < 0x8000)
7762 {
7763 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7764 dreg, sreg, BFD_RELOC_LO16);
7765 }
7766 else
7767 {
7768 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7769 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7770 dreg, sreg, AT);
7771 used_at = 1;
7772 }
7773 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7774 break;
7775
7776 case M_SGT: /* sreg > treg <==> treg < sreg */
7777 s = "slt";
7778 goto sgt;
7779 case M_SGTU:
7780 s = "sltu";
7781 sgt:
7782 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7783 break;
7784
7785 case M_SGT_I: /* sreg > I <==> I < sreg */
7786 s = "slt";
7787 goto sgti;
7788 case M_SGTU_I:
7789 s = "sltu";
7790 sgti:
7791 used_at = 1;
7792 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7793 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7794 break;
7795
7796 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7797 s = "slt";
7798 goto sle;
7799 case M_SLEU:
7800 s = "sltu";
7801 sle:
7802 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7803 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7804 break;
7805
7806 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7807 s = "slt";
7808 goto slei;
7809 case M_SLEU_I:
7810 s = "sltu";
7811 slei:
7812 used_at = 1;
7813 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7814 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7815 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7816 break;
7817
7818 case M_SLT_I:
7819 if (imm_expr.X_op == O_constant
7820 && imm_expr.X_add_number >= -0x8000
7821 && imm_expr.X_add_number < 0x8000)
7822 {
7823 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7824 break;
7825 }
7826 used_at = 1;
7827 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7828 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7829 break;
7830
7831 case M_SLTU_I:
7832 if (imm_expr.X_op == O_constant
7833 && imm_expr.X_add_number >= -0x8000
7834 && imm_expr.X_add_number < 0x8000)
7835 {
7836 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7837 BFD_RELOC_LO16);
7838 break;
7839 }
7840 used_at = 1;
7841 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7842 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7843 break;
7844
7845 case M_SNE:
7846 if (sreg == 0)
7847 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7848 else if (treg == 0)
7849 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7850 else
7851 {
7852 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7853 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7854 }
7855 break;
7856
7857 case M_SNE_I:
7858 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7859 {
7860 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7861 break;
7862 }
7863 if (sreg == 0)
7864 {
7865 as_warn (_("Instruction %s: result is always true"),
7866 ip->insn_mo->name);
7867 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7868 dreg, 0, BFD_RELOC_LO16);
7869 break;
7870 }
7871 if (CPU_HAS_SEQ (mips_opts.arch)
7872 && -512 <= imm_expr.X_add_number
7873 && imm_expr.X_add_number < 512)
7874 {
7875 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7876 (int) imm_expr.X_add_number);
7877 break;
7878 }
7879 if (imm_expr.X_op == O_constant
7880 && imm_expr.X_add_number >= 0
7881 && imm_expr.X_add_number < 0x10000)
7882 {
7883 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7884 }
7885 else if (imm_expr.X_op == O_constant
7886 && imm_expr.X_add_number > -0x8000
7887 && imm_expr.X_add_number < 0)
7888 {
7889 imm_expr.X_add_number = -imm_expr.X_add_number;
7890 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7891 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7892 }
7893 else if (CPU_HAS_SEQ (mips_opts.arch))
7894 {
7895 used_at = 1;
7896 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7897 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7898 break;
7899 }
7900 else
7901 {
7902 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7903 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7904 used_at = 1;
7905 }
7906 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7907 break;
7908
7909 case M_DSUB_I:
7910 dbl = 1;
7911 case M_SUB_I:
7912 if (imm_expr.X_op == O_constant
7913 && imm_expr.X_add_number > -0x8000
7914 && imm_expr.X_add_number <= 0x8000)
7915 {
7916 imm_expr.X_add_number = -imm_expr.X_add_number;
7917 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7918 dreg, sreg, BFD_RELOC_LO16);
7919 break;
7920 }
7921 used_at = 1;
7922 load_register (AT, &imm_expr, dbl);
7923 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7924 break;
7925
7926 case M_DSUBU_I:
7927 dbl = 1;
7928 case M_SUBU_I:
7929 if (imm_expr.X_op == O_constant
7930 && imm_expr.X_add_number > -0x8000
7931 && imm_expr.X_add_number <= 0x8000)
7932 {
7933 imm_expr.X_add_number = -imm_expr.X_add_number;
7934 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7935 dreg, sreg, BFD_RELOC_LO16);
7936 break;
7937 }
7938 used_at = 1;
7939 load_register (AT, &imm_expr, dbl);
7940 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7941 break;
7942
7943 case M_TEQ_I:
7944 s = "teq";
7945 goto trap;
7946 case M_TGE_I:
7947 s = "tge";
7948 goto trap;
7949 case M_TGEU_I:
7950 s = "tgeu";
7951 goto trap;
7952 case M_TLT_I:
7953 s = "tlt";
7954 goto trap;
7955 case M_TLTU_I:
7956 s = "tltu";
7957 goto trap;
7958 case M_TNE_I:
7959 s = "tne";
7960 trap:
7961 used_at = 1;
7962 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7963 macro_build (NULL, s, "s,t", sreg, AT);
7964 break;
7965
7966 case M_TRUNCWS:
7967 case M_TRUNCWD:
7968 gas_assert (mips_opts.isa == ISA_MIPS1);
7969 used_at = 1;
7970 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7971 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7972
7973 /*
7974 * Is the double cfc1 instruction a bug in the mips assembler;
7975 * or is there a reason for it?
7976 */
7977 start_noreorder ();
7978 macro_build (NULL, "cfc1", "t,G", treg, RA);
7979 macro_build (NULL, "cfc1", "t,G", treg, RA);
7980 macro_build (NULL, "nop", "");
7981 expr1.X_add_number = 3;
7982 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7983 expr1.X_add_number = 2;
7984 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7985 macro_build (NULL, "ctc1", "t,G", AT, RA);
7986 macro_build (NULL, "nop", "");
7987 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7988 dreg, sreg);
7989 macro_build (NULL, "ctc1", "t,G", treg, RA);
7990 macro_build (NULL, "nop", "");
7991 end_noreorder ();
7992 break;
7993
7994 case M_ULH:
7995 s = "lb";
7996 goto ulh;
7997 case M_ULHU:
7998 s = "lbu";
7999 ulh:
8000 used_at = 1;
8001 if (offset_expr.X_add_number >= 0x7fff)
8002 as_bad (_("Operand overflow"));
8003 if (!target_big_endian)
8004 ++offset_expr.X_add_number;
8005 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8006 if (!target_big_endian)
8007 --offset_expr.X_add_number;
8008 else
8009 ++offset_expr.X_add_number;
8010 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8011 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8012 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8013 break;
8014
8015 case M_ULD:
8016 s = "ldl";
8017 s2 = "ldr";
8018 off = 7;
8019 goto ulw;
8020 case M_ULW:
8021 s = "lwl";
8022 s2 = "lwr";
8023 off = 3;
8024 ulw:
8025 if (offset_expr.X_add_number >= 0x8000 - off)
8026 as_bad (_("Operand overflow"));
8027 if (treg != breg)
8028 tempreg = treg;
8029 else
8030 {
8031 used_at = 1;
8032 tempreg = AT;
8033 }
8034 if (!target_big_endian)
8035 offset_expr.X_add_number += off;
8036 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8037 if (!target_big_endian)
8038 offset_expr.X_add_number -= off;
8039 else
8040 offset_expr.X_add_number += off;
8041 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8042
8043 /* If necessary, move the result in tempreg to the final destination. */
8044 if (treg == tempreg)
8045 break;
8046 /* Protect second load's delay slot. */
8047 load_delay_nop ();
8048 move_register (treg, tempreg);
8049 break;
8050
8051 case M_ULD_A:
8052 s = "ldl";
8053 s2 = "ldr";
8054 off = 7;
8055 goto ulwa;
8056 case M_ULW_A:
8057 s = "lwl";
8058 s2 = "lwr";
8059 off = 3;
8060 ulwa:
8061 used_at = 1;
8062 load_address (AT, &offset_expr, &used_at);
8063 if (breg != 0)
8064 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8065 if (!target_big_endian)
8066 expr1.X_add_number = off;
8067 else
8068 expr1.X_add_number = 0;
8069 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8070 if (!target_big_endian)
8071 expr1.X_add_number = 0;
8072 else
8073 expr1.X_add_number = off;
8074 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8075 break;
8076
8077 case M_ULH_A:
8078 case M_ULHU_A:
8079 used_at = 1;
8080 load_address (AT, &offset_expr, &used_at);
8081 if (breg != 0)
8082 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8083 if (target_big_endian)
8084 expr1.X_add_number = 0;
8085 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8086 treg, BFD_RELOC_LO16, AT);
8087 if (target_big_endian)
8088 expr1.X_add_number = 1;
8089 else
8090 expr1.X_add_number = 0;
8091 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8092 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8093 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8094 break;
8095
8096 case M_USH:
8097 used_at = 1;
8098 if (offset_expr.X_add_number >= 0x7fff)
8099 as_bad (_("Operand overflow"));
8100 if (target_big_endian)
8101 ++offset_expr.X_add_number;
8102 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8103 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8104 if (target_big_endian)
8105 --offset_expr.X_add_number;
8106 else
8107 ++offset_expr.X_add_number;
8108 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8109 break;
8110
8111 case M_USD:
8112 s = "sdl";
8113 s2 = "sdr";
8114 off = 7;
8115 goto usw;
8116 case M_USW:
8117 s = "swl";
8118 s2 = "swr";
8119 off = 3;
8120 usw:
8121 if (offset_expr.X_add_number >= 0x8000 - off)
8122 as_bad (_("Operand overflow"));
8123 if (!target_big_endian)
8124 offset_expr.X_add_number += off;
8125 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8126 if (!target_big_endian)
8127 offset_expr.X_add_number -= off;
8128 else
8129 offset_expr.X_add_number += off;
8130 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8131 break;
8132
8133 case M_USD_A:
8134 s = "sdl";
8135 s2 = "sdr";
8136 off = 7;
8137 goto uswa;
8138 case M_USW_A:
8139 s = "swl";
8140 s2 = "swr";
8141 off = 3;
8142 uswa:
8143 used_at = 1;
8144 load_address (AT, &offset_expr, &used_at);
8145 if (breg != 0)
8146 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8147 if (!target_big_endian)
8148 expr1.X_add_number = off;
8149 else
8150 expr1.X_add_number = 0;
8151 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8152 if (!target_big_endian)
8153 expr1.X_add_number = 0;
8154 else
8155 expr1.X_add_number = off;
8156 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8157 break;
8158
8159 case M_USH_A:
8160 used_at = 1;
8161 load_address (AT, &offset_expr, &used_at);
8162 if (breg != 0)
8163 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8164 if (!target_big_endian)
8165 expr1.X_add_number = 0;
8166 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8167 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8168 if (!target_big_endian)
8169 expr1.X_add_number = 1;
8170 else
8171 expr1.X_add_number = 0;
8172 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8173 if (!target_big_endian)
8174 expr1.X_add_number = 0;
8175 else
8176 expr1.X_add_number = 1;
8177 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8178 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8179 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8180 break;
8181
8182 default:
8183 /* FIXME: Check if this is one of the itbl macros, since they
8184 are added dynamically. */
8185 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8186 break;
8187 }
8188 if (!mips_opts.at && used_at)
8189 as_bad (_("Macro used $at after \".set noat\""));
8190 }
8191
8192 /* Implement macros in mips16 mode. */
8193
8194 static void
8195 mips16_macro (struct mips_cl_insn *ip)
8196 {
8197 int mask;
8198 int xreg, yreg, zreg, tmp;
8199 expressionS expr1;
8200 int dbl;
8201 const char *s, *s2, *s3;
8202
8203 mask = ip->insn_mo->mask;
8204
8205 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8206 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8207 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8208
8209 expr1.X_op = O_constant;
8210 expr1.X_op_symbol = NULL;
8211 expr1.X_add_symbol = NULL;
8212 expr1.X_add_number = 1;
8213
8214 dbl = 0;
8215
8216 switch (mask)
8217 {
8218 default:
8219 internalError ();
8220
8221 case M_DDIV_3:
8222 dbl = 1;
8223 case M_DIV_3:
8224 s = "mflo";
8225 goto do_div3;
8226 case M_DREM_3:
8227 dbl = 1;
8228 case M_REM_3:
8229 s = "mfhi";
8230 do_div3:
8231 start_noreorder ();
8232 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8233 expr1.X_add_number = 2;
8234 macro_build (&expr1, "bnez", "x,p", yreg);
8235 macro_build (NULL, "break", "6", 7);
8236
8237 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8238 since that causes an overflow. We should do that as well,
8239 but I don't see how to do the comparisons without a temporary
8240 register. */
8241 end_noreorder ();
8242 macro_build (NULL, s, "x", zreg);
8243 break;
8244
8245 case M_DIVU_3:
8246 s = "divu";
8247 s2 = "mflo";
8248 goto do_divu3;
8249 case M_REMU_3:
8250 s = "divu";
8251 s2 = "mfhi";
8252 goto do_divu3;
8253 case M_DDIVU_3:
8254 s = "ddivu";
8255 s2 = "mflo";
8256 goto do_divu3;
8257 case M_DREMU_3:
8258 s = "ddivu";
8259 s2 = "mfhi";
8260 do_divu3:
8261 start_noreorder ();
8262 macro_build (NULL, s, "0,x,y", xreg, yreg);
8263 expr1.X_add_number = 2;
8264 macro_build (&expr1, "bnez", "x,p", yreg);
8265 macro_build (NULL, "break", "6", 7);
8266 end_noreorder ();
8267 macro_build (NULL, s2, "x", zreg);
8268 break;
8269
8270 case M_DMUL:
8271 dbl = 1;
8272 case M_MUL:
8273 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8274 macro_build (NULL, "mflo", "x", zreg);
8275 break;
8276
8277 case M_DSUBU_I:
8278 dbl = 1;
8279 goto do_subu;
8280 case M_SUBU_I:
8281 do_subu:
8282 if (imm_expr.X_op != O_constant)
8283 as_bad (_("Unsupported large constant"));
8284 imm_expr.X_add_number = -imm_expr.X_add_number;
8285 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8286 break;
8287
8288 case M_SUBU_I_2:
8289 if (imm_expr.X_op != O_constant)
8290 as_bad (_("Unsupported large constant"));
8291 imm_expr.X_add_number = -imm_expr.X_add_number;
8292 macro_build (&imm_expr, "addiu", "x,k", xreg);
8293 break;
8294
8295 case M_DSUBU_I_2:
8296 if (imm_expr.X_op != O_constant)
8297 as_bad (_("Unsupported large constant"));
8298 imm_expr.X_add_number = -imm_expr.X_add_number;
8299 macro_build (&imm_expr, "daddiu", "y,j", yreg);
8300 break;
8301
8302 case M_BEQ:
8303 s = "cmp";
8304 s2 = "bteqz";
8305 goto do_branch;
8306 case M_BNE:
8307 s = "cmp";
8308 s2 = "btnez";
8309 goto do_branch;
8310 case M_BLT:
8311 s = "slt";
8312 s2 = "btnez";
8313 goto do_branch;
8314 case M_BLTU:
8315 s = "sltu";
8316 s2 = "btnez";
8317 goto do_branch;
8318 case M_BLE:
8319 s = "slt";
8320 s2 = "bteqz";
8321 goto do_reverse_branch;
8322 case M_BLEU:
8323 s = "sltu";
8324 s2 = "bteqz";
8325 goto do_reverse_branch;
8326 case M_BGE:
8327 s = "slt";
8328 s2 = "bteqz";
8329 goto do_branch;
8330 case M_BGEU:
8331 s = "sltu";
8332 s2 = "bteqz";
8333 goto do_branch;
8334 case M_BGT:
8335 s = "slt";
8336 s2 = "btnez";
8337 goto do_reverse_branch;
8338 case M_BGTU:
8339 s = "sltu";
8340 s2 = "btnez";
8341
8342 do_reverse_branch:
8343 tmp = xreg;
8344 xreg = yreg;
8345 yreg = tmp;
8346
8347 do_branch:
8348 macro_build (NULL, s, "x,y", xreg, yreg);
8349 macro_build (&offset_expr, s2, "p");
8350 break;
8351
8352 case M_BEQ_I:
8353 s = "cmpi";
8354 s2 = "bteqz";
8355 s3 = "x,U";
8356 goto do_branch_i;
8357 case M_BNE_I:
8358 s = "cmpi";
8359 s2 = "btnez";
8360 s3 = "x,U";
8361 goto do_branch_i;
8362 case M_BLT_I:
8363 s = "slti";
8364 s2 = "btnez";
8365 s3 = "x,8";
8366 goto do_branch_i;
8367 case M_BLTU_I:
8368 s = "sltiu";
8369 s2 = "btnez";
8370 s3 = "x,8";
8371 goto do_branch_i;
8372 case M_BLE_I:
8373 s = "slti";
8374 s2 = "btnez";
8375 s3 = "x,8";
8376 goto do_addone_branch_i;
8377 case M_BLEU_I:
8378 s = "sltiu";
8379 s2 = "btnez";
8380 s3 = "x,8";
8381 goto do_addone_branch_i;
8382 case M_BGE_I:
8383 s = "slti";
8384 s2 = "bteqz";
8385 s3 = "x,8";
8386 goto do_branch_i;
8387 case M_BGEU_I:
8388 s = "sltiu";
8389 s2 = "bteqz";
8390 s3 = "x,8";
8391 goto do_branch_i;
8392 case M_BGT_I:
8393 s = "slti";
8394 s2 = "bteqz";
8395 s3 = "x,8";
8396 goto do_addone_branch_i;
8397 case M_BGTU_I:
8398 s = "sltiu";
8399 s2 = "bteqz";
8400 s3 = "x,8";
8401
8402 do_addone_branch_i:
8403 if (imm_expr.X_op != O_constant)
8404 as_bad (_("Unsupported large constant"));
8405 ++imm_expr.X_add_number;
8406
8407 do_branch_i:
8408 macro_build (&imm_expr, s, s3, xreg);
8409 macro_build (&offset_expr, s2, "p");
8410 break;
8411
8412 case M_ABS:
8413 expr1.X_add_number = 0;
8414 macro_build (&expr1, "slti", "x,8", yreg);
8415 if (xreg != yreg)
8416 move_register (xreg, yreg);
8417 expr1.X_add_number = 2;
8418 macro_build (&expr1, "bteqz", "p");
8419 macro_build (NULL, "neg", "x,w", xreg, xreg);
8420 }
8421 }
8422
8423 /* For consistency checking, verify that all bits are specified either
8424 by the match/mask part of the instruction definition, or by the
8425 operand list. */
8426 static int
8427 validate_mips_insn (const struct mips_opcode *opc)
8428 {
8429 const char *p = opc->args;
8430 char c;
8431 unsigned long used_bits = opc->mask;
8432
8433 if ((used_bits & opc->match) != opc->match)
8434 {
8435 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8436 opc->name, opc->args);
8437 return 0;
8438 }
8439 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8440 while (*p)
8441 switch (c = *p++)
8442 {
8443 case ',': break;
8444 case '(': break;
8445 case ')': break;
8446 case '+':
8447 switch (c = *p++)
8448 {
8449 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8450 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8451 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8452 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
8453 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8454 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8455 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8456 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8457 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8458 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8459 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8460 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8461 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8462 case 'I': break;
8463 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8464 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8465 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8466 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8467 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8468 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8469 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8470 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
8471 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8472 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8473
8474 default:
8475 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8476 c, opc->name, opc->args);
8477 return 0;
8478 }
8479 break;
8480 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8481 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8482 case 'A': break;
8483 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8484 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8485 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8486 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8487 case 'F': break;
8488 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8489 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8490 case 'I': break;
8491 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8492 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8493 case 'L': break;
8494 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8495 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8496 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8497 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8498 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8499 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8500 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8501 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8502 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8503 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8504 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8505 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8506 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8507 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8508 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8509 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8510 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8511 case 'f': break;
8512 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8513 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8514 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8515 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8516 case 'l': break;
8517 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8518 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8519 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8520 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8521 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8522 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8523 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8524 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8525 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8526 case 'x': break;
8527 case 'z': break;
8528 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8529 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8530 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8531 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8532 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8533 case '[': break;
8534 case ']': break;
8535 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8536 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
8537 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8538 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8539 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8540 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8541 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8542 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8543 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8544 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8545 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8546 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8547 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
8548 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8549 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8550 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8551 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8552 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8553 default:
8554 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8555 c, opc->name, opc->args);
8556 return 0;
8557 }
8558 #undef USE_BITS
8559 if (used_bits != 0xffffffff)
8560 {
8561 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8562 ~used_bits & 0xffffffff, opc->name, opc->args);
8563 return 0;
8564 }
8565 return 1;
8566 }
8567
8568 /* UDI immediates. */
8569 struct mips_immed {
8570 char type;
8571 unsigned int shift;
8572 unsigned long mask;
8573 const char * desc;
8574 };
8575
8576 static const struct mips_immed mips_immed[] = {
8577 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8578 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8579 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8580 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8581 { 0,0,0,0 }
8582 };
8583
8584 /* Check whether an odd floating-point register is allowed. */
8585 static int
8586 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8587 {
8588 const char *s = insn->name;
8589
8590 if (insn->pinfo == INSN_MACRO)
8591 /* Let a macro pass, we'll catch it later when it is expanded. */
8592 return 1;
8593
8594 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8595 {
8596 /* Allow odd registers for single-precision ops. */
8597 switch (insn->pinfo & (FP_S | FP_D))
8598 {
8599 case FP_S:
8600 case 0:
8601 return 1; /* both single precision - ok */
8602 case FP_D:
8603 return 0; /* both double precision - fail */
8604 default:
8605 break;
8606 }
8607
8608 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8609 s = strchr (insn->name, '.');
8610 if (argnum == 2)
8611 s = s != NULL ? strchr (s + 1, '.') : NULL;
8612 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8613 }
8614
8615 /* Single-precision coprocessor loads and moves are OK too. */
8616 if ((insn->pinfo & FP_S)
8617 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8618 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8619 return 1;
8620
8621 return 0;
8622 }
8623
8624 /* This routine assembles an instruction into its binary format. As a
8625 side effect, it sets one of the global variables imm_reloc or
8626 offset_reloc to the type of relocation to do if one of the operands
8627 is an address expression. */
8628
8629 static void
8630 mips_ip (char *str, struct mips_cl_insn *ip)
8631 {
8632 char *s;
8633 const char *args;
8634 char c = 0;
8635 struct mips_opcode *insn;
8636 char *argsStart;
8637 unsigned int regno;
8638 unsigned int lastregno;
8639 unsigned int lastpos = 0;
8640 unsigned int limlo, limhi;
8641 char *s_reset;
8642 char save_c = 0;
8643 offsetT min_range, max_range;
8644 int argnum;
8645 unsigned int rtype;
8646
8647 insn_error = NULL;
8648
8649 /* If the instruction contains a '.', we first try to match an instruction
8650 including the '.'. Then we try again without the '.'. */
8651 insn = NULL;
8652 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8653 continue;
8654
8655 /* If we stopped on whitespace, then replace the whitespace with null for
8656 the call to hash_find. Save the character we replaced just in case we
8657 have to re-parse the instruction. */
8658 if (ISSPACE (*s))
8659 {
8660 save_c = *s;
8661 *s++ = '\0';
8662 }
8663
8664 insn = (struct mips_opcode *) hash_find (op_hash, str);
8665
8666 /* If we didn't find the instruction in the opcode table, try again, but
8667 this time with just the instruction up to, but not including the
8668 first '.'. */
8669 if (insn == NULL)
8670 {
8671 /* Restore the character we overwrite above (if any). */
8672 if (save_c)
8673 *(--s) = save_c;
8674
8675 /* Scan up to the first '.' or whitespace. */
8676 for (s = str;
8677 *s != '\0' && *s != '.' && !ISSPACE (*s);
8678 ++s)
8679 continue;
8680
8681 /* If we did not find a '.', then we can quit now. */
8682 if (*s != '.')
8683 {
8684 insn_error = _("Unrecognized opcode");
8685 return;
8686 }
8687
8688 /* Lookup the instruction in the hash table. */
8689 *s++ = '\0';
8690 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8691 {
8692 insn_error = _("Unrecognized opcode");
8693 return;
8694 }
8695 }
8696
8697 argsStart = s;
8698 for (;;)
8699 {
8700 bfd_boolean ok;
8701
8702 gas_assert (strcmp (insn->name, str) == 0);
8703
8704 ok = is_opcode_valid (insn);
8705 if (! ok)
8706 {
8707 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8708 && strcmp (insn->name, insn[1].name) == 0)
8709 {
8710 ++insn;
8711 continue;
8712 }
8713 else
8714 {
8715 if (!insn_error)
8716 {
8717 static char buf[100];
8718 sprintf (buf,
8719 _("opcode not supported on this processor: %s (%s)"),
8720 mips_cpu_info_from_arch (mips_opts.arch)->name,
8721 mips_cpu_info_from_isa (mips_opts.isa)->name);
8722 insn_error = buf;
8723 }
8724 if (save_c)
8725 *(--s) = save_c;
8726 return;
8727 }
8728 }
8729
8730 create_insn (ip, insn);
8731 insn_error = NULL;
8732 argnum = 1;
8733 lastregno = 0xffffffff;
8734 for (args = insn->args;; ++args)
8735 {
8736 int is_mdmx;
8737
8738 s += strspn (s, " \t");
8739 is_mdmx = 0;
8740 switch (*args)
8741 {
8742 case '\0': /* end of args */
8743 if (*s == '\0')
8744 return;
8745 break;
8746
8747 case '2': /* DSP 2-bit unsigned immediate in bit 11. */
8748 my_getExpression (&imm_expr, s);
8749 check_absolute_expr (ip, &imm_expr);
8750 if ((unsigned long) imm_expr.X_add_number != 1
8751 && (unsigned long) imm_expr.X_add_number != 3)
8752 {
8753 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8754 (unsigned long) imm_expr.X_add_number);
8755 }
8756 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8757 imm_expr.X_op = O_absent;
8758 s = expr_end;
8759 continue;
8760
8761 case '3': /* DSP 3-bit unsigned immediate in bit 21. */
8762 my_getExpression (&imm_expr, s);
8763 check_absolute_expr (ip, &imm_expr);
8764 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8765 {
8766 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8767 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8768 }
8769 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8770 imm_expr.X_op = O_absent;
8771 s = expr_end;
8772 continue;
8773
8774 case '4': /* DSP 4-bit unsigned immediate in bit 21. */
8775 my_getExpression (&imm_expr, s);
8776 check_absolute_expr (ip, &imm_expr);
8777 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8778 {
8779 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8780 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8781 }
8782 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8783 imm_expr.X_op = O_absent;
8784 s = expr_end;
8785 continue;
8786
8787 case '5': /* DSP 8-bit unsigned immediate in bit 16. */
8788 my_getExpression (&imm_expr, s);
8789 check_absolute_expr (ip, &imm_expr);
8790 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8791 {
8792 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8793 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8794 }
8795 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8796 imm_expr.X_op = O_absent;
8797 s = expr_end;
8798 continue;
8799
8800 case '6': /* DSP 5-bit unsigned immediate in bit 21. */
8801 my_getExpression (&imm_expr, s);
8802 check_absolute_expr (ip, &imm_expr);
8803 if (imm_expr.X_add_number & ~OP_MASK_RS)
8804 {
8805 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8806 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8807 }
8808 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8809 imm_expr.X_op = O_absent;
8810 s = expr_end;
8811 continue;
8812
8813 case '7': /* Four DSP accumulators in bits 11,12. */
8814 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8815 s[3] >= '0' && s[3] <= '3')
8816 {
8817 regno = s[3] - '0';
8818 s += 4;
8819 INSERT_OPERAND (DSPACC, *ip, regno);
8820 continue;
8821 }
8822 else
8823 as_bad (_("Invalid dsp acc register"));
8824 break;
8825
8826 case '8': /* DSP 6-bit unsigned immediate in bit 11. */
8827 my_getExpression (&imm_expr, s);
8828 check_absolute_expr (ip, &imm_expr);
8829 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8830 {
8831 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8832 OP_MASK_WRDSP,
8833 (unsigned long) imm_expr.X_add_number);
8834 }
8835 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8836 imm_expr.X_op = O_absent;
8837 s = expr_end;
8838 continue;
8839
8840 case '9': /* Four DSP accumulators in bits 21,22. */
8841 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8842 s[3] >= '0' && s[3] <= '3')
8843 {
8844 regno = s[3] - '0';
8845 s += 4;
8846 INSERT_OPERAND (DSPACC_S, *ip, regno);
8847 continue;
8848 }
8849 else
8850 as_bad (_("Invalid dsp acc register"));
8851 break;
8852
8853 case '0': /* DSP 6-bit signed immediate in bit 20. */
8854 my_getExpression (&imm_expr, s);
8855 check_absolute_expr (ip, &imm_expr);
8856 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8857 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8858 if (imm_expr.X_add_number < min_range ||
8859 imm_expr.X_add_number > max_range)
8860 {
8861 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8862 (long) min_range, (long) max_range,
8863 (long) imm_expr.X_add_number);
8864 }
8865 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8866 imm_expr.X_op = O_absent;
8867 s = expr_end;
8868 continue;
8869
8870 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
8871 my_getExpression (&imm_expr, s);
8872 check_absolute_expr (ip, &imm_expr);
8873 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8874 {
8875 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8876 OP_MASK_RDDSP,
8877 (unsigned long) imm_expr.X_add_number);
8878 }
8879 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8880 imm_expr.X_op = O_absent;
8881 s = expr_end;
8882 continue;
8883
8884 case ':': /* DSP 7-bit signed immediate in bit 19. */
8885 my_getExpression (&imm_expr, s);
8886 check_absolute_expr (ip, &imm_expr);
8887 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8888 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8889 if (imm_expr.X_add_number < min_range ||
8890 imm_expr.X_add_number > max_range)
8891 {
8892 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8893 (long) min_range, (long) max_range,
8894 (long) imm_expr.X_add_number);
8895 }
8896 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8897 imm_expr.X_op = O_absent;
8898 s = expr_end;
8899 continue;
8900
8901 case '@': /* DSP 10-bit signed immediate in bit 16. */
8902 my_getExpression (&imm_expr, s);
8903 check_absolute_expr (ip, &imm_expr);
8904 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8905 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8906 if (imm_expr.X_add_number < min_range ||
8907 imm_expr.X_add_number > max_range)
8908 {
8909 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8910 (long) min_range, (long) max_range,
8911 (long) imm_expr.X_add_number);
8912 }
8913 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8914 imm_expr.X_op = O_absent;
8915 s = expr_end;
8916 continue;
8917
8918 case '!': /* MT usermode flag bit. */
8919 my_getExpression (&imm_expr, s);
8920 check_absolute_expr (ip, &imm_expr);
8921 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8922 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8923 (unsigned long) imm_expr.X_add_number);
8924 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8925 imm_expr.X_op = O_absent;
8926 s = expr_end;
8927 continue;
8928
8929 case '$': /* MT load high flag bit. */
8930 my_getExpression (&imm_expr, s);
8931 check_absolute_expr (ip, &imm_expr);
8932 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8933 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8934 (unsigned long) imm_expr.X_add_number);
8935 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8936 imm_expr.X_op = O_absent;
8937 s = expr_end;
8938 continue;
8939
8940 case '*': /* Four DSP accumulators in bits 18,19. */
8941 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8942 s[3] >= '0' && s[3] <= '3')
8943 {
8944 regno = s[3] - '0';
8945 s += 4;
8946 INSERT_OPERAND (MTACC_T, *ip, regno);
8947 continue;
8948 }
8949 else
8950 as_bad (_("Invalid dsp/smartmips acc register"));
8951 break;
8952
8953 case '&': /* Four DSP accumulators in bits 13,14. */
8954 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8955 s[3] >= '0' && s[3] <= '3')
8956 {
8957 regno = s[3] - '0';
8958 s += 4;
8959 INSERT_OPERAND (MTACC_D, *ip, regno);
8960 continue;
8961 }
8962 else
8963 as_bad (_("Invalid dsp/smartmips acc register"));
8964 break;
8965
8966 case ',':
8967 ++argnum;
8968 if (*s++ == *args)
8969 continue;
8970 s--;
8971 switch (*++args)
8972 {
8973 case 'r':
8974 case 'v':
8975 INSERT_OPERAND (RS, *ip, lastregno);
8976 continue;
8977
8978 case 'w':
8979 INSERT_OPERAND (RT, *ip, lastregno);
8980 continue;
8981
8982 case 'W':
8983 INSERT_OPERAND (FT, *ip, lastregno);
8984 continue;
8985
8986 case 'V':
8987 INSERT_OPERAND (FS, *ip, lastregno);
8988 continue;
8989 }
8990 break;
8991
8992 case '(':
8993 /* Handle optional base register.
8994 Either the base register is omitted or
8995 we must have a left paren. */
8996 /* This is dependent on the next operand specifier
8997 is a base register specification. */
8998 gas_assert (args[1] == 'b');
8999 if (*s == '\0')
9000 return;
9001
9002 case ')': /* These must match exactly. */
9003 case '[':
9004 case ']':
9005 if (*s++ == *args)
9006 continue;
9007 break;
9008
9009 case '+': /* Opcode extension character. */
9010 switch (*++args)
9011 {
9012 case '1': /* UDI immediates. */
9013 case '2':
9014 case '3':
9015 case '4':
9016 {
9017 const struct mips_immed *imm = mips_immed;
9018
9019 while (imm->type && imm->type != *args)
9020 ++imm;
9021 if (! imm->type)
9022 internalError ();
9023 my_getExpression (&imm_expr, s);
9024 check_absolute_expr (ip, &imm_expr);
9025 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9026 {
9027 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9028 imm->desc ? imm->desc : ip->insn_mo->name,
9029 (unsigned long) imm_expr.X_add_number,
9030 (unsigned long) imm_expr.X_add_number);
9031 imm_expr.X_add_number &= imm->mask;
9032 }
9033 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9034 << imm->shift);
9035 imm_expr.X_op = O_absent;
9036 s = expr_end;
9037 }
9038 continue;
9039
9040 case 'A': /* ins/ext position, becomes LSB. */
9041 limlo = 0;
9042 limhi = 31;
9043 goto do_lsb;
9044 case 'E':
9045 limlo = 32;
9046 limhi = 63;
9047 goto do_lsb;
9048 do_lsb:
9049 my_getExpression (&imm_expr, s);
9050 check_absolute_expr (ip, &imm_expr);
9051 if ((unsigned long) imm_expr.X_add_number < limlo
9052 || (unsigned long) imm_expr.X_add_number > limhi)
9053 {
9054 as_bad (_("Improper position (%lu)"),
9055 (unsigned long) imm_expr.X_add_number);
9056 imm_expr.X_add_number = limlo;
9057 }
9058 lastpos = imm_expr.X_add_number;
9059 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9060 imm_expr.X_op = O_absent;
9061 s = expr_end;
9062 continue;
9063
9064 case 'B': /* ins size, becomes MSB. */
9065 limlo = 1;
9066 limhi = 32;
9067 goto do_msb;
9068 case 'F':
9069 limlo = 33;
9070 limhi = 64;
9071 goto do_msb;
9072 do_msb:
9073 my_getExpression (&imm_expr, s);
9074 check_absolute_expr (ip, &imm_expr);
9075 /* Check for negative input so that small negative numbers
9076 will not succeed incorrectly. The checks against
9077 (pos+size) transitively check "size" itself,
9078 assuming that "pos" is reasonable. */
9079 if ((long) imm_expr.X_add_number < 0
9080 || ((unsigned long) imm_expr.X_add_number
9081 + lastpos) < limlo
9082 || ((unsigned long) imm_expr.X_add_number
9083 + lastpos) > limhi)
9084 {
9085 as_bad (_("Improper insert size (%lu, position %lu)"),
9086 (unsigned long) imm_expr.X_add_number,
9087 (unsigned long) lastpos);
9088 imm_expr.X_add_number = limlo - lastpos;
9089 }
9090 INSERT_OPERAND (INSMSB, *ip,
9091 lastpos + imm_expr.X_add_number - 1);
9092 imm_expr.X_op = O_absent;
9093 s = expr_end;
9094 continue;
9095
9096 case 'C': /* ext size, becomes MSBD. */
9097 limlo = 1;
9098 limhi = 32;
9099 goto do_msbd;
9100 case 'G':
9101 limlo = 33;
9102 limhi = 64;
9103 goto do_msbd;
9104 case 'H':
9105 limlo = 33;
9106 limhi = 64;
9107 goto do_msbd;
9108 do_msbd:
9109 my_getExpression (&imm_expr, s);
9110 check_absolute_expr (ip, &imm_expr);
9111 /* Check for negative input so that small negative numbers
9112 will not succeed incorrectly. The checks against
9113 (pos+size) transitively check "size" itself,
9114 assuming that "pos" is reasonable. */
9115 if ((long) imm_expr.X_add_number < 0
9116 || ((unsigned long) imm_expr.X_add_number
9117 + lastpos) < limlo
9118 || ((unsigned long) imm_expr.X_add_number
9119 + lastpos) > limhi)
9120 {
9121 as_bad (_("Improper extract size (%lu, position %lu)"),
9122 (unsigned long) imm_expr.X_add_number,
9123 (unsigned long) lastpos);
9124 imm_expr.X_add_number = limlo - lastpos;
9125 }
9126 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9127 imm_expr.X_op = O_absent;
9128 s = expr_end;
9129 continue;
9130
9131 case 'D':
9132 /* +D is for disassembly only; never match. */
9133 break;
9134
9135 case 'I':
9136 /* "+I" is like "I", except that imm2_expr is used. */
9137 my_getExpression (&imm2_expr, s);
9138 if (imm2_expr.X_op != O_big
9139 && imm2_expr.X_op != O_constant)
9140 insn_error = _("absolute expression required");
9141 if (HAVE_32BIT_GPRS)
9142 normalize_constant_expr (&imm2_expr);
9143 s = expr_end;
9144 continue;
9145
9146 case 'T': /* Coprocessor register. */
9147 /* +T is for disassembly only; never match. */
9148 break;
9149
9150 case 't': /* Coprocessor register number. */
9151 if (s[0] == '$' && ISDIGIT (s[1]))
9152 {
9153 ++s;
9154 regno = 0;
9155 do
9156 {
9157 regno *= 10;
9158 regno += *s - '0';
9159 ++s;
9160 }
9161 while (ISDIGIT (*s));
9162 if (regno > 31)
9163 as_bad (_("Invalid register number (%d)"), regno);
9164 else
9165 {
9166 INSERT_OPERAND (RT, *ip, regno);
9167 continue;
9168 }
9169 }
9170 else
9171 as_bad (_("Invalid coprocessor 0 register number"));
9172 break;
9173
9174 case 'x':
9175 /* bbit[01] and bbit[01]32 bit index. Give error if index
9176 is not in the valid range. */
9177 my_getExpression (&imm_expr, s);
9178 check_absolute_expr (ip, &imm_expr);
9179 if ((unsigned) imm_expr.X_add_number > 31)
9180 {
9181 as_bad (_("Improper bit index (%lu)"),
9182 (unsigned long) imm_expr.X_add_number);
9183 imm_expr.X_add_number = 0;
9184 }
9185 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9186 imm_expr.X_op = O_absent;
9187 s = expr_end;
9188 continue;
9189
9190 case 'X':
9191 /* bbit[01] bit index when bbit is used but we generate
9192 bbit[01]32 because the index is over 32. Move to the
9193 next candidate if index is not in the valid range. */
9194 my_getExpression (&imm_expr, s);
9195 check_absolute_expr (ip, &imm_expr);
9196 if ((unsigned) imm_expr.X_add_number < 32
9197 || (unsigned) imm_expr.X_add_number > 63)
9198 break;
9199 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9200 imm_expr.X_op = O_absent;
9201 s = expr_end;
9202 continue;
9203
9204 case 'p':
9205 /* cins, cins32, exts and exts32 position field. Give error
9206 if it's not in the valid range. */
9207 my_getExpression (&imm_expr, s);
9208 check_absolute_expr (ip, &imm_expr);
9209 if ((unsigned) imm_expr.X_add_number > 31)
9210 {
9211 as_bad (_("Improper position (%lu)"),
9212 (unsigned long) imm_expr.X_add_number);
9213 imm_expr.X_add_number = 0;
9214 }
9215 /* Make the pos explicit to simplify +S. */
9216 lastpos = imm_expr.X_add_number + 32;
9217 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9218 imm_expr.X_op = O_absent;
9219 s = expr_end;
9220 continue;
9221
9222 case 'P':
9223 /* cins, cins32, exts and exts32 position field. Move to
9224 the next candidate if it's not in the valid range. */
9225 my_getExpression (&imm_expr, s);
9226 check_absolute_expr (ip, &imm_expr);
9227 if ((unsigned) imm_expr.X_add_number < 32
9228 || (unsigned) imm_expr.X_add_number > 63)
9229 break;
9230 lastpos = imm_expr.X_add_number;
9231 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9232 imm_expr.X_op = O_absent;
9233 s = expr_end;
9234 continue;
9235
9236 case 's':
9237 /* cins and exts length-minus-one field. */
9238 my_getExpression (&imm_expr, s);
9239 check_absolute_expr (ip, &imm_expr);
9240 if ((unsigned long) imm_expr.X_add_number > 31)
9241 {
9242 as_bad (_("Improper size (%lu)"),
9243 (unsigned long) imm_expr.X_add_number);
9244 imm_expr.X_add_number = 0;
9245 }
9246 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9247 imm_expr.X_op = O_absent;
9248 s = expr_end;
9249 continue;
9250
9251 case 'S':
9252 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9253 length-minus-one field. */
9254 my_getExpression (&imm_expr, s);
9255 check_absolute_expr (ip, &imm_expr);
9256 if ((long) imm_expr.X_add_number < 0
9257 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9258 {
9259 as_bad (_("Improper size (%lu)"),
9260 (unsigned long) imm_expr.X_add_number);
9261 imm_expr.X_add_number = 0;
9262 }
9263 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9264 imm_expr.X_op = O_absent;
9265 s = expr_end;
9266 continue;
9267
9268 case 'Q':
9269 /* seqi/snei immediate field. */
9270 my_getExpression (&imm_expr, s);
9271 check_absolute_expr (ip, &imm_expr);
9272 if ((long) imm_expr.X_add_number < -512
9273 || (long) imm_expr.X_add_number >= 512)
9274 {
9275 as_bad (_("Improper immediate (%ld)"),
9276 (long) imm_expr.X_add_number);
9277 imm_expr.X_add_number = 0;
9278 }
9279 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9280 imm_expr.X_op = O_absent;
9281 s = expr_end;
9282 continue;
9283
9284 default:
9285 as_bad (_("Internal error: bad mips opcode "
9286 "(unknown extension operand type `+%c'): %s %s"),
9287 *args, insn->name, insn->args);
9288 /* Further processing is fruitless. */
9289 return;
9290 }
9291 break;
9292
9293 case '<': /* must be at least one digit */
9294 /*
9295 * According to the manual, if the shift amount is greater
9296 * than 31 or less than 0, then the shift amount should be
9297 * mod 32. In reality the mips assembler issues an error.
9298 * We issue a warning and mask out all but the low 5 bits.
9299 */
9300 my_getExpression (&imm_expr, s);
9301 check_absolute_expr (ip, &imm_expr);
9302 if ((unsigned long) imm_expr.X_add_number > 31)
9303 as_warn (_("Improper shift amount (%lu)"),
9304 (unsigned long) imm_expr.X_add_number);
9305 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9306 imm_expr.X_op = O_absent;
9307 s = expr_end;
9308 continue;
9309
9310 case '>': /* shift amount minus 32 */
9311 my_getExpression (&imm_expr, s);
9312 check_absolute_expr (ip, &imm_expr);
9313 if ((unsigned long) imm_expr.X_add_number < 32
9314 || (unsigned long) imm_expr.X_add_number > 63)
9315 break;
9316 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9317 imm_expr.X_op = O_absent;
9318 s = expr_end;
9319 continue;
9320
9321 case 'k': /* CACHE code. */
9322 case 'h': /* PREFX code. */
9323 case '1': /* SYNC type. */
9324 my_getExpression (&imm_expr, s);
9325 check_absolute_expr (ip, &imm_expr);
9326 if ((unsigned long) imm_expr.X_add_number > 31)
9327 as_warn (_("Invalid value for `%s' (%lu)"),
9328 ip->insn_mo->name,
9329 (unsigned long) imm_expr.X_add_number);
9330 if (*args == 'k')
9331 {
9332 if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9333 switch (imm_expr.X_add_number)
9334 {
9335 case 5:
9336 case 25:
9337 case 26:
9338 case 27:
9339 case 28:
9340 case 29:
9341 case 30:
9342 case 31: /* These are ok. */
9343 break;
9344
9345 default: /* The rest must be changed to 28. */
9346 imm_expr.X_add_number = 28;
9347 break;
9348 }
9349 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9350 }
9351 else if (*args == 'h')
9352 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9353 else
9354 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9355 imm_expr.X_op = O_absent;
9356 s = expr_end;
9357 continue;
9358
9359 case 'c': /* BREAK code. */
9360 my_getExpression (&imm_expr, s);
9361 check_absolute_expr (ip, &imm_expr);
9362 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9363 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9364 ip->insn_mo->name,
9365 (unsigned long) imm_expr.X_add_number);
9366 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9367 imm_expr.X_op = O_absent;
9368 s = expr_end;
9369 continue;
9370
9371 case 'q': /* Lower BREAK code. */
9372 my_getExpression (&imm_expr, s);
9373 check_absolute_expr (ip, &imm_expr);
9374 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9375 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9376 ip->insn_mo->name,
9377 (unsigned long) imm_expr.X_add_number);
9378 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9379 imm_expr.X_op = O_absent;
9380 s = expr_end;
9381 continue;
9382
9383 case 'B': /* 20-bit SYSCALL/BREAK code. */
9384 my_getExpression (&imm_expr, s);
9385 check_absolute_expr (ip, &imm_expr);
9386 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9387 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9388 ip->insn_mo->name,
9389 (unsigned long) imm_expr.X_add_number);
9390 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9391 imm_expr.X_op = O_absent;
9392 s = expr_end;
9393 continue;
9394
9395 case 'C': /* Coprocessor code. */
9396 my_getExpression (&imm_expr, s);
9397 check_absolute_expr (ip, &imm_expr);
9398 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9399 {
9400 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9401 (unsigned long) imm_expr.X_add_number);
9402 imm_expr.X_add_number &= OP_MASK_COPZ;
9403 }
9404 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9405 imm_expr.X_op = O_absent;
9406 s = expr_end;
9407 continue;
9408
9409 case 'J': /* 19-bit WAIT code. */
9410 my_getExpression (&imm_expr, s);
9411 check_absolute_expr (ip, &imm_expr);
9412 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9413 {
9414 as_warn (_("Illegal 19-bit code (%lu)"),
9415 (unsigned long) imm_expr.X_add_number);
9416 imm_expr.X_add_number &= OP_MASK_CODE19;
9417 }
9418 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9419 imm_expr.X_op = O_absent;
9420 s = expr_end;
9421 continue;
9422
9423 case 'P': /* Performance register. */
9424 my_getExpression (&imm_expr, s);
9425 check_absolute_expr (ip, &imm_expr);
9426 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9427 as_warn (_("Invalid performance register (%lu)"),
9428 (unsigned long) imm_expr.X_add_number);
9429 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9430 imm_expr.X_op = O_absent;
9431 s = expr_end;
9432 continue;
9433
9434 case 'G': /* Coprocessor destination register. */
9435 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9436 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9437 else
9438 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9439 INSERT_OPERAND (RD, *ip, regno);
9440 if (ok)
9441 {
9442 lastregno = regno;
9443 continue;
9444 }
9445 else
9446 break;
9447
9448 case 'b': /* Base register. */
9449 case 'd': /* Destination register. */
9450 case 's': /* Source register. */
9451 case 't': /* Target register. */
9452 case 'r': /* Both target and source. */
9453 case 'v': /* Both dest and source. */
9454 case 'w': /* Both dest and target. */
9455 case 'E': /* Coprocessor target register. */
9456 case 'K': /* RDHWR destination register. */
9457 case 'x': /* Ignore register name. */
9458 case 'z': /* Must be zero register. */
9459 case 'U': /* Destination register (CLO/CLZ). */
9460 case 'g': /* Coprocessor destination register. */
9461 s_reset = s;
9462 if (*args == 'E' || *args == 'K')
9463 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9464 else
9465 {
9466 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9467 if (regno == AT && mips_opts.at)
9468 {
9469 if (mips_opts.at == ATREG)
9470 as_warn (_("Used $at without \".set noat\""));
9471 else
9472 as_warn (_("Used $%u with \".set at=$%u\""),
9473 regno, mips_opts.at);
9474 }
9475 }
9476 if (ok)
9477 {
9478 c = *args;
9479 if (*s == ' ')
9480 ++s;
9481 if (args[1] != *s)
9482 {
9483 if (c == 'r' || c == 'v' || c == 'w')
9484 {
9485 regno = lastregno;
9486 s = s_reset;
9487 ++args;
9488 }
9489 }
9490 /* 'z' only matches $0. */
9491 if (c == 'z' && regno != 0)
9492 break;
9493
9494 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9495 {
9496 if (regno == lastregno)
9497 {
9498 insn_error
9499 = _("Source and destination must be different");
9500 continue;
9501 }
9502 if (regno == 31 && lastregno == 0xffffffff)
9503 {
9504 insn_error
9505 = _("A destination register must be supplied");
9506 continue;
9507 }
9508 }
9509 /* Now that we have assembled one operand, we use the args
9510 string to figure out where it goes in the instruction. */
9511 switch (c)
9512 {
9513 case 'r':
9514 case 's':
9515 case 'v':
9516 case 'b':
9517 INSERT_OPERAND (RS, *ip, regno);
9518 break;
9519 case 'd':
9520 case 'K':
9521 case 'g':
9522 INSERT_OPERAND (RD, *ip, regno);
9523 break;
9524 case 'U':
9525 INSERT_OPERAND (RD, *ip, regno);
9526 INSERT_OPERAND (RT, *ip, regno);
9527 break;
9528 case 'w':
9529 case 't':
9530 case 'E':
9531 INSERT_OPERAND (RT, *ip, regno);
9532 break;
9533 case 'x':
9534 /* This case exists because on the r3000 trunc
9535 expands into a macro which requires a gp
9536 register. On the r6000 or r4000 it is
9537 assembled into a single instruction which
9538 ignores the register. Thus the insn version
9539 is MIPS_ISA2 and uses 'x', and the macro
9540 version is MIPS_ISA1 and uses 't'. */
9541 break;
9542 case 'z':
9543 /* This case is for the div instruction, which
9544 acts differently if the destination argument
9545 is $0. This only matches $0, and is checked
9546 outside the switch. */
9547 break;
9548 }
9549 lastregno = regno;
9550 continue;
9551 }
9552 switch (*args++)
9553 {
9554 case 'r':
9555 case 'v':
9556 INSERT_OPERAND (RS, *ip, lastregno);
9557 continue;
9558 case 'w':
9559 INSERT_OPERAND (RT, *ip, lastregno);
9560 continue;
9561 }
9562 break;
9563
9564 case 'O': /* MDMX alignment immediate constant. */
9565 my_getExpression (&imm_expr, s);
9566 check_absolute_expr (ip, &imm_expr);
9567 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9568 as_warn (_("Improper align amount (%ld), using low bits"),
9569 (long) imm_expr.X_add_number);
9570 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9571 imm_expr.X_op = O_absent;
9572 s = expr_end;
9573 continue;
9574
9575 case 'Q': /* MDMX vector, element sel, or const. */
9576 if (s[0] != '$')
9577 {
9578 /* MDMX Immediate. */
9579 my_getExpression (&imm_expr, s);
9580 check_absolute_expr (ip, &imm_expr);
9581 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9582 as_warn (_("Invalid MDMX Immediate (%ld)"),
9583 (long) imm_expr.X_add_number);
9584 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9585 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9586 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9587 else
9588 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9589 imm_expr.X_op = O_absent;
9590 s = expr_end;
9591 continue;
9592 }
9593 /* Not MDMX Immediate. Fall through. */
9594 case 'X': /* MDMX destination register. */
9595 case 'Y': /* MDMX source register. */
9596 case 'Z': /* MDMX target register. */
9597 is_mdmx = 1;
9598 case 'D': /* Floating point destination register. */
9599 case 'S': /* Floating point source register. */
9600 case 'T': /* Floating point target register. */
9601 case 'R': /* Floating point source register. */
9602 case 'V':
9603 case 'W':
9604 rtype = RTYPE_FPU;
9605 if (is_mdmx
9606 || (mips_opts.ase_mdmx
9607 && (ip->insn_mo->pinfo & FP_D)
9608 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9609 | INSN_COPROC_MEMORY_DELAY
9610 | INSN_LOAD_COPROC_DELAY
9611 | INSN_LOAD_MEMORY_DELAY
9612 | INSN_STORE_MEMORY))))
9613 rtype |= RTYPE_VEC;
9614 s_reset = s;
9615 if (reg_lookup (&s, rtype, &regno))
9616 {
9617 if ((regno & 1) != 0
9618 && HAVE_32BIT_FPRS
9619 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9620 as_warn (_("Float register should be even, was %d"),
9621 regno);
9622
9623 c = *args;
9624 if (*s == ' ')
9625 ++s;
9626 if (args[1] != *s)
9627 {
9628 if (c == 'V' || c == 'W')
9629 {
9630 regno = lastregno;
9631 s = s_reset;
9632 ++args;
9633 }
9634 }
9635 switch (c)
9636 {
9637 case 'D':
9638 case 'X':
9639 INSERT_OPERAND (FD, *ip, regno);
9640 break;
9641 case 'V':
9642 case 'S':
9643 case 'Y':
9644 INSERT_OPERAND (FS, *ip, regno);
9645 break;
9646 case 'Q':
9647 /* This is like 'Z', but also needs to fix the MDMX
9648 vector/scalar select bits. Note that the
9649 scalar immediate case is handled above. */
9650 if (*s == '[')
9651 {
9652 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9653 int max_el = (is_qh ? 3 : 7);
9654 s++;
9655 my_getExpression(&imm_expr, s);
9656 check_absolute_expr (ip, &imm_expr);
9657 s = expr_end;
9658 if (imm_expr.X_add_number > max_el)
9659 as_bad (_("Bad element selector %ld"),
9660 (long) imm_expr.X_add_number);
9661 imm_expr.X_add_number &= max_el;
9662 ip->insn_opcode |= (imm_expr.X_add_number
9663 << (OP_SH_VSEL +
9664 (is_qh ? 2 : 1)));
9665 imm_expr.X_op = O_absent;
9666 if (*s != ']')
9667 as_warn (_("Expecting ']' found '%s'"), s);
9668 else
9669 s++;
9670 }
9671 else
9672 {
9673 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9674 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9675 << OP_SH_VSEL);
9676 else
9677 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9678 OP_SH_VSEL);
9679 }
9680 /* Fall through. */
9681 case 'W':
9682 case 'T':
9683 case 'Z':
9684 INSERT_OPERAND (FT, *ip, regno);
9685 break;
9686 case 'R':
9687 INSERT_OPERAND (FR, *ip, regno);
9688 break;
9689 }
9690 lastregno = regno;
9691 continue;
9692 }
9693
9694 switch (*args++)
9695 {
9696 case 'V':
9697 INSERT_OPERAND (FS, *ip, lastregno);
9698 continue;
9699 case 'W':
9700 INSERT_OPERAND (FT, *ip, lastregno);
9701 continue;
9702 }
9703 break;
9704
9705 case 'I':
9706 my_getExpression (&imm_expr, s);
9707 if (imm_expr.X_op != O_big
9708 && imm_expr.X_op != O_constant)
9709 insn_error = _("absolute expression required");
9710 if (HAVE_32BIT_GPRS)
9711 normalize_constant_expr (&imm_expr);
9712 s = expr_end;
9713 continue;
9714
9715 case 'A':
9716 my_getExpression (&offset_expr, s);
9717 normalize_address_expr (&offset_expr);
9718 *imm_reloc = BFD_RELOC_32;
9719 s = expr_end;
9720 continue;
9721
9722 case 'F':
9723 case 'L':
9724 case 'f':
9725 case 'l':
9726 {
9727 int f64;
9728 int using_gprs;
9729 char *save_in;
9730 char *err;
9731 unsigned char temp[8];
9732 int len;
9733 unsigned int length;
9734 segT seg;
9735 subsegT subseg;
9736 char *p;
9737
9738 /* These only appear as the last operand in an
9739 instruction, and every instruction that accepts
9740 them in any variant accepts them in all variants.
9741 This means we don't have to worry about backing out
9742 any changes if the instruction does not match.
9743
9744 The difference between them is the size of the
9745 floating point constant and where it goes. For 'F'
9746 and 'L' the constant is 64 bits; for 'f' and 'l' it
9747 is 32 bits. Where the constant is placed is based
9748 on how the MIPS assembler does things:
9749 F -- .rdata
9750 L -- .lit8
9751 f -- immediate value
9752 l -- .lit4
9753
9754 The .lit4 and .lit8 sections are only used if
9755 permitted by the -G argument.
9756
9757 The code below needs to know whether the target register
9758 is 32 or 64 bits wide. It relies on the fact 'f' and
9759 'F' are used with GPR-based instructions and 'l' and
9760 'L' are used with FPR-based instructions. */
9761
9762 f64 = *args == 'F' || *args == 'L';
9763 using_gprs = *args == 'F' || *args == 'f';
9764
9765 save_in = input_line_pointer;
9766 input_line_pointer = s;
9767 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9768 length = len;
9769 s = input_line_pointer;
9770 input_line_pointer = save_in;
9771 if (err != NULL && *err != '\0')
9772 {
9773 as_bad (_("Bad floating point constant: %s"), err);
9774 memset (temp, '\0', sizeof temp);
9775 length = f64 ? 8 : 4;
9776 }
9777
9778 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9779
9780 if (*args == 'f'
9781 || (*args == 'l'
9782 && (g_switch_value < 4
9783 || (temp[0] == 0 && temp[1] == 0)
9784 || (temp[2] == 0 && temp[3] == 0))))
9785 {
9786 imm_expr.X_op = O_constant;
9787 if (!target_big_endian)
9788 imm_expr.X_add_number = bfd_getl32 (temp);
9789 else
9790 imm_expr.X_add_number = bfd_getb32 (temp);
9791 }
9792 else if (length > 4
9793 && !mips_disable_float_construction
9794 /* Constants can only be constructed in GPRs and
9795 copied to FPRs if the GPRs are at least as wide
9796 as the FPRs. Force the constant into memory if
9797 we are using 64-bit FPRs but the GPRs are only
9798 32 bits wide. */
9799 && (using_gprs
9800 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9801 && ((temp[0] == 0 && temp[1] == 0)
9802 || (temp[2] == 0 && temp[3] == 0))
9803 && ((temp[4] == 0 && temp[5] == 0)
9804 || (temp[6] == 0 && temp[7] == 0)))
9805 {
9806 /* The value is simple enough to load with a couple of
9807 instructions. If using 32-bit registers, set
9808 imm_expr to the high order 32 bits and offset_expr to
9809 the low order 32 bits. Otherwise, set imm_expr to
9810 the entire 64 bit constant. */
9811 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9812 {
9813 imm_expr.X_op = O_constant;
9814 offset_expr.X_op = O_constant;
9815 if (!target_big_endian)
9816 {
9817 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9818 offset_expr.X_add_number = bfd_getl32 (temp);
9819 }
9820 else
9821 {
9822 imm_expr.X_add_number = bfd_getb32 (temp);
9823 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9824 }
9825 if (offset_expr.X_add_number == 0)
9826 offset_expr.X_op = O_absent;
9827 }
9828 else if (sizeof (imm_expr.X_add_number) > 4)
9829 {
9830 imm_expr.X_op = O_constant;
9831 if (!target_big_endian)
9832 imm_expr.X_add_number = bfd_getl64 (temp);
9833 else
9834 imm_expr.X_add_number = bfd_getb64 (temp);
9835 }
9836 else
9837 {
9838 imm_expr.X_op = O_big;
9839 imm_expr.X_add_number = 4;
9840 if (!target_big_endian)
9841 {
9842 generic_bignum[0] = bfd_getl16 (temp);
9843 generic_bignum[1] = bfd_getl16 (temp + 2);
9844 generic_bignum[2] = bfd_getl16 (temp + 4);
9845 generic_bignum[3] = bfd_getl16 (temp + 6);
9846 }
9847 else
9848 {
9849 generic_bignum[0] = bfd_getb16 (temp + 6);
9850 generic_bignum[1] = bfd_getb16 (temp + 4);
9851 generic_bignum[2] = bfd_getb16 (temp + 2);
9852 generic_bignum[3] = bfd_getb16 (temp);
9853 }
9854 }
9855 }
9856 else
9857 {
9858 const char *newname;
9859 segT new_seg;
9860
9861 /* Switch to the right section. */
9862 seg = now_seg;
9863 subseg = now_subseg;
9864 switch (*args)
9865 {
9866 default: /* unused default case avoids warnings. */
9867 case 'L':
9868 newname = RDATA_SECTION_NAME;
9869 if (g_switch_value >= 8)
9870 newname = ".lit8";
9871 break;
9872 case 'F':
9873 newname = RDATA_SECTION_NAME;
9874 break;
9875 case 'l':
9876 gas_assert (g_switch_value >= 4);
9877 newname = ".lit4";
9878 break;
9879 }
9880 new_seg = subseg_new (newname, (subsegT) 0);
9881 if (IS_ELF)
9882 bfd_set_section_flags (stdoutput, new_seg,
9883 (SEC_ALLOC
9884 | SEC_LOAD
9885 | SEC_READONLY
9886 | SEC_DATA));
9887 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9888 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9889 record_alignment (new_seg, 4);
9890 else
9891 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9892 if (seg == now_seg)
9893 as_bad (_("Can't use floating point insn in this section"));
9894
9895 /* Set the argument to the current address in the
9896 section. */
9897 offset_expr.X_op = O_symbol;
9898 offset_expr.X_add_symbol = symbol_temp_new_now ();
9899 offset_expr.X_add_number = 0;
9900
9901 /* Put the floating point number into the section. */
9902 p = frag_more ((int) length);
9903 memcpy (p, temp, length);
9904
9905 /* Switch back to the original section. */
9906 subseg_set (seg, subseg);
9907 }
9908 }
9909 continue;
9910
9911 case 'i': /* 16-bit unsigned immediate. */
9912 case 'j': /* 16-bit signed immediate. */
9913 *imm_reloc = BFD_RELOC_LO16;
9914 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9915 {
9916 int more;
9917 offsetT minval, maxval;
9918
9919 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9920 && strcmp (insn->name, insn[1].name) == 0);
9921
9922 /* If the expression was written as an unsigned number,
9923 only treat it as signed if there are no more
9924 alternatives. */
9925 if (more
9926 && *args == 'j'
9927 && sizeof (imm_expr.X_add_number) <= 4
9928 && imm_expr.X_op == O_constant
9929 && imm_expr.X_add_number < 0
9930 && imm_expr.X_unsigned
9931 && HAVE_64BIT_GPRS)
9932 break;
9933
9934 /* For compatibility with older assemblers, we accept
9935 0x8000-0xffff as signed 16-bit numbers when only
9936 signed numbers are allowed. */
9937 if (*args == 'i')
9938 minval = 0, maxval = 0xffff;
9939 else if (more)
9940 minval = -0x8000, maxval = 0x7fff;
9941 else
9942 minval = -0x8000, maxval = 0xffff;
9943
9944 if (imm_expr.X_op != O_constant
9945 || imm_expr.X_add_number < minval
9946 || imm_expr.X_add_number > maxval)
9947 {
9948 if (more)
9949 break;
9950 if (imm_expr.X_op == O_constant
9951 || imm_expr.X_op == O_big)
9952 as_bad (_("Expression out of range"));
9953 }
9954 }
9955 s = expr_end;
9956 continue;
9957
9958 case 'o': /* 16-bit offset. */
9959 offset_reloc[0] = BFD_RELOC_LO16;
9960 offset_reloc[1] = BFD_RELOC_UNUSED;
9961 offset_reloc[2] = BFD_RELOC_UNUSED;
9962
9963 /* Check whether there is only a single bracketed expression
9964 left. If so, it must be the base register and the
9965 constant must be zero. */
9966 offset_reloc[0] = BFD_RELOC_LO16;
9967 offset_reloc[1] = BFD_RELOC_UNUSED;
9968 offset_reloc[2] = BFD_RELOC_UNUSED;
9969 if (*s == '(' && strchr (s + 1, '(') == 0)
9970 {
9971 offset_expr.X_op = O_constant;
9972 offset_expr.X_add_number = 0;
9973 continue;
9974 }
9975
9976 /* If this value won't fit into a 16 bit offset, then go
9977 find a macro that will generate the 32 bit offset
9978 code pattern. */
9979 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9980 && (offset_expr.X_op != O_constant
9981 || offset_expr.X_add_number >= 0x8000
9982 || offset_expr.X_add_number < -0x8000))
9983 break;
9984
9985 s = expr_end;
9986 continue;
9987
9988 case 'p': /* PC-relative offset. */
9989 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9990 my_getExpression (&offset_expr, s);
9991 s = expr_end;
9992 continue;
9993
9994 case 'u': /* Upper 16 bits. */
9995 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9996 && imm_expr.X_op == O_constant
9997 && (imm_expr.X_add_number < 0
9998 || imm_expr.X_add_number >= 0x10000))
9999 as_bad (_("lui expression (%lu) not in range 0..65535"),
10000 (unsigned long) imm_expr.X_add_number);
10001 s = expr_end;
10002 continue;
10003
10004 case 'a': /* 26-bit address. */
10005 my_getExpression (&offset_expr, s);
10006 s = expr_end;
10007 *offset_reloc = BFD_RELOC_MIPS_JMP;
10008 continue;
10009
10010 case 'N': /* 3-bit branch condition code. */
10011 case 'M': /* 3-bit compare condition code. */
10012 rtype = RTYPE_CCC;
10013 if (ip->insn_mo->pinfo & (FP_D | FP_S))
10014 rtype |= RTYPE_FCC;
10015 if (!reg_lookup (&s, rtype, &regno))
10016 break;
10017 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10018 || strcmp (str + strlen (str) - 5, "any2f") == 0
10019 || strcmp (str + strlen (str) - 5, "any2t") == 0)
10020 && (regno & 1) != 0)
10021 as_warn (_("Condition code register should be even for %s, "
10022 "was %d"),
10023 str, regno);
10024 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10025 || strcmp (str + strlen (str) - 5, "any4t") == 0)
10026 && (regno & 3) != 0)
10027 as_warn (_("Condition code register should be 0 or 4 for %s, "
10028 "was %d"),
10029 str, regno);
10030 if (*args == 'N')
10031 INSERT_OPERAND (BCC, *ip, regno);
10032 else
10033 INSERT_OPERAND (CCC, *ip, regno);
10034 continue;
10035
10036 case 'H':
10037 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10038 s += 2;
10039 if (ISDIGIT (*s))
10040 {
10041 c = 0;
10042 do
10043 {
10044 c *= 10;
10045 c += *s - '0';
10046 ++s;
10047 }
10048 while (ISDIGIT (*s));
10049 }
10050 else
10051 c = 8; /* Invalid sel value. */
10052
10053 if (c > 7)
10054 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10055 ip->insn_opcode |= c;
10056 continue;
10057
10058 case 'e':
10059 /* Must be at least one digit. */
10060 my_getExpression (&imm_expr, s);
10061 check_absolute_expr (ip, &imm_expr);
10062
10063 if ((unsigned long) imm_expr.X_add_number
10064 > (unsigned long) OP_MASK_VECBYTE)
10065 {
10066 as_bad (_("bad byte vector index (%ld)"),
10067 (long) imm_expr.X_add_number);
10068 imm_expr.X_add_number = 0;
10069 }
10070
10071 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10072 imm_expr.X_op = O_absent;
10073 s = expr_end;
10074 continue;
10075
10076 case '%':
10077 my_getExpression (&imm_expr, s);
10078 check_absolute_expr (ip, &imm_expr);
10079
10080 if ((unsigned long) imm_expr.X_add_number
10081 > (unsigned long) OP_MASK_VECALIGN)
10082 {
10083 as_bad (_("bad byte vector index (%ld)"),
10084 (long) imm_expr.X_add_number);
10085 imm_expr.X_add_number = 0;
10086 }
10087
10088 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10089 imm_expr.X_op = O_absent;
10090 s = expr_end;
10091 continue;
10092
10093 default:
10094 as_bad (_("Bad char = '%c'\n"), *args);
10095 internalError ();
10096 }
10097 break;
10098 }
10099 /* Args don't match. */
10100 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10101 !strcmp (insn->name, insn[1].name))
10102 {
10103 ++insn;
10104 s = argsStart;
10105 insn_error = _("Illegal operands");
10106 continue;
10107 }
10108 if (save_c)
10109 *(--argsStart) = save_c;
10110 insn_error = _("Illegal operands");
10111 return;
10112 }
10113 }
10114
10115 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10116
10117 /* This routine assembles an instruction into its binary format when
10118 assembling for the mips16. As a side effect, it sets one of the
10119 global variables imm_reloc or offset_reloc to the type of
10120 relocation to do if one of the operands is an address expression.
10121 It also sets mips16_small and mips16_ext if the user explicitly
10122 requested a small or extended instruction. */
10123
10124 static void
10125 mips16_ip (char *str, struct mips_cl_insn *ip)
10126 {
10127 char *s;
10128 const char *args;
10129 struct mips_opcode *insn;
10130 char *argsstart;
10131 unsigned int regno;
10132 unsigned int lastregno = 0;
10133 char *s_reset;
10134 size_t i;
10135
10136 insn_error = NULL;
10137
10138 mips16_small = FALSE;
10139 mips16_ext = FALSE;
10140
10141 for (s = str; ISLOWER (*s); ++s)
10142 ;
10143 switch (*s)
10144 {
10145 case '\0':
10146 break;
10147
10148 case ' ':
10149 *s++ = '\0';
10150 break;
10151
10152 case '.':
10153 if (s[1] == 't' && s[2] == ' ')
10154 {
10155 *s = '\0';
10156 mips16_small = TRUE;
10157 s += 3;
10158 break;
10159 }
10160 else if (s[1] == 'e' && s[2] == ' ')
10161 {
10162 *s = '\0';
10163 mips16_ext = TRUE;
10164 s += 3;
10165 break;
10166 }
10167 /* Fall through. */
10168 default:
10169 insn_error = _("unknown opcode");
10170 return;
10171 }
10172
10173 if (mips_opts.noautoextend && ! mips16_ext)
10174 mips16_small = TRUE;
10175
10176 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10177 {
10178 insn_error = _("unrecognized opcode");
10179 return;
10180 }
10181
10182 argsstart = s;
10183 for (;;)
10184 {
10185 bfd_boolean ok;
10186
10187 gas_assert (strcmp (insn->name, str) == 0);
10188
10189 ok = is_opcode_valid_16 (insn);
10190 if (! ok)
10191 {
10192 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10193 && strcmp (insn->name, insn[1].name) == 0)
10194 {
10195 ++insn;
10196 continue;
10197 }
10198 else
10199 {
10200 if (!insn_error)
10201 {
10202 static char buf[100];
10203 sprintf (buf,
10204 _("opcode not supported on this processor: %s (%s)"),
10205 mips_cpu_info_from_arch (mips_opts.arch)->name,
10206 mips_cpu_info_from_isa (mips_opts.isa)->name);
10207 insn_error = buf;
10208 }
10209 return;
10210 }
10211 }
10212
10213 create_insn (ip, insn);
10214 imm_expr.X_op = O_absent;
10215 imm_reloc[0] = BFD_RELOC_UNUSED;
10216 imm_reloc[1] = BFD_RELOC_UNUSED;
10217 imm_reloc[2] = BFD_RELOC_UNUSED;
10218 imm2_expr.X_op = O_absent;
10219 offset_expr.X_op = O_absent;
10220 offset_reloc[0] = BFD_RELOC_UNUSED;
10221 offset_reloc[1] = BFD_RELOC_UNUSED;
10222 offset_reloc[2] = BFD_RELOC_UNUSED;
10223 for (args = insn->args; 1; ++args)
10224 {
10225 int c;
10226
10227 if (*s == ' ')
10228 ++s;
10229
10230 /* In this switch statement we call break if we did not find
10231 a match, continue if we did find a match, or return if we
10232 are done. */
10233
10234 c = *args;
10235 switch (c)
10236 {
10237 case '\0':
10238 if (*s == '\0')
10239 {
10240 /* Stuff the immediate value in now, if we can. */
10241 if (imm_expr.X_op == O_constant
10242 && *imm_reloc > BFD_RELOC_UNUSED
10243 && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10244 && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10245 && insn->pinfo != INSN_MACRO)
10246 {
10247 valueT tmp;
10248
10249 switch (*offset_reloc)
10250 {
10251 case BFD_RELOC_MIPS16_HI16_S:
10252 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10253 break;
10254
10255 case BFD_RELOC_MIPS16_HI16:
10256 tmp = imm_expr.X_add_number >> 16;
10257 break;
10258
10259 case BFD_RELOC_MIPS16_LO16:
10260 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10261 - 0x8000;
10262 break;
10263
10264 case BFD_RELOC_UNUSED:
10265 tmp = imm_expr.X_add_number;
10266 break;
10267
10268 default:
10269 internalError ();
10270 }
10271 *offset_reloc = BFD_RELOC_UNUSED;
10272
10273 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10274 tmp, TRUE, mips16_small,
10275 mips16_ext, &ip->insn_opcode,
10276 &ip->use_extend, &ip->extend);
10277 imm_expr.X_op = O_absent;
10278 *imm_reloc = BFD_RELOC_UNUSED;
10279 }
10280
10281 return;
10282 }
10283 break;
10284
10285 case ',':
10286 if (*s++ == c)
10287 continue;
10288 s--;
10289 switch (*++args)
10290 {
10291 case 'v':
10292 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10293 continue;
10294 case 'w':
10295 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10296 continue;
10297 }
10298 break;
10299
10300 case '(':
10301 case ')':
10302 if (*s++ == c)
10303 continue;
10304 break;
10305
10306 case 'v':
10307 case 'w':
10308 if (s[0] != '$')
10309 {
10310 if (c == 'v')
10311 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10312 else
10313 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10314 ++args;
10315 continue;
10316 }
10317 /* Fall through. */
10318 case 'x':
10319 case 'y':
10320 case 'z':
10321 case 'Z':
10322 case '0':
10323 case 'S':
10324 case 'R':
10325 case 'X':
10326 case 'Y':
10327 s_reset = s;
10328 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10329 {
10330 if (c == 'v' || c == 'w')
10331 {
10332 if (c == 'v')
10333 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10334 else
10335 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10336 ++args;
10337 continue;
10338 }
10339 break;
10340 }
10341
10342 if (*s == ' ')
10343 ++s;
10344 if (args[1] != *s)
10345 {
10346 if (c == 'v' || c == 'w')
10347 {
10348 regno = mips16_to_32_reg_map[lastregno];
10349 s = s_reset;
10350 ++args;
10351 }
10352 }
10353
10354 switch (c)
10355 {
10356 case 'x':
10357 case 'y':
10358 case 'z':
10359 case 'v':
10360 case 'w':
10361 case 'Z':
10362 regno = mips32_to_16_reg_map[regno];
10363 break;
10364
10365 case '0':
10366 if (regno != 0)
10367 regno = ILLEGAL_REG;
10368 break;
10369
10370 case 'S':
10371 if (regno != SP)
10372 regno = ILLEGAL_REG;
10373 break;
10374
10375 case 'R':
10376 if (regno != RA)
10377 regno = ILLEGAL_REG;
10378 break;
10379
10380 case 'X':
10381 case 'Y':
10382 if (regno == AT && mips_opts.at)
10383 {
10384 if (mips_opts.at == ATREG)
10385 as_warn (_("used $at without \".set noat\""));
10386 else
10387 as_warn (_("used $%u with \".set at=$%u\""),
10388 regno, mips_opts.at);
10389 }
10390 break;
10391
10392 default:
10393 internalError ();
10394 }
10395
10396 if (regno == ILLEGAL_REG)
10397 break;
10398
10399 switch (c)
10400 {
10401 case 'x':
10402 case 'v':
10403 MIPS16_INSERT_OPERAND (RX, *ip, regno);
10404 break;
10405 case 'y':
10406 case 'w':
10407 MIPS16_INSERT_OPERAND (RY, *ip, regno);
10408 break;
10409 case 'z':
10410 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10411 break;
10412 case 'Z':
10413 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10414 case '0':
10415 case 'S':
10416 case 'R':
10417 break;
10418 case 'X':
10419 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10420 break;
10421 case 'Y':
10422 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10423 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10424 break;
10425 default:
10426 internalError ();
10427 }
10428
10429 lastregno = regno;
10430 continue;
10431
10432 case 'P':
10433 if (strncmp (s, "$pc", 3) == 0)
10434 {
10435 s += 3;
10436 continue;
10437 }
10438 break;
10439
10440 case '5':
10441 case 'H':
10442 case 'W':
10443 case 'D':
10444 case 'j':
10445 case 'V':
10446 case 'C':
10447 case 'U':
10448 case 'k':
10449 case 'K':
10450 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10451 if (i > 0)
10452 {
10453 if (imm_expr.X_op != O_constant)
10454 {
10455 mips16_ext = TRUE;
10456 ip->use_extend = TRUE;
10457 ip->extend = 0;
10458 }
10459 else
10460 {
10461 /* We need to relax this instruction. */
10462 *offset_reloc = *imm_reloc;
10463 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10464 }
10465 s = expr_end;
10466 continue;
10467 }
10468 *imm_reloc = BFD_RELOC_UNUSED;
10469 /* Fall through. */
10470 case '<':
10471 case '>':
10472 case '[':
10473 case ']':
10474 case '4':
10475 case '8':
10476 my_getExpression (&imm_expr, s);
10477 if (imm_expr.X_op == O_register)
10478 {
10479 /* What we thought was an expression turned out to
10480 be a register. */
10481
10482 if (s[0] == '(' && args[1] == '(')
10483 {
10484 /* It looks like the expression was omitted
10485 before a register indirection, which means
10486 that the expression is implicitly zero. We
10487 still set up imm_expr, so that we handle
10488 explicit extensions correctly. */
10489 imm_expr.X_op = O_constant;
10490 imm_expr.X_add_number = 0;
10491 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10492 continue;
10493 }
10494
10495 break;
10496 }
10497
10498 /* We need to relax this instruction. */
10499 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10500 s = expr_end;
10501 continue;
10502
10503 case 'p':
10504 case 'q':
10505 case 'A':
10506 case 'B':
10507 case 'E':
10508 /* We use offset_reloc rather than imm_reloc for the PC
10509 relative operands. This lets macros with both
10510 immediate and address operands work correctly. */
10511 my_getExpression (&offset_expr, s);
10512
10513 if (offset_expr.X_op == O_register)
10514 break;
10515
10516 /* We need to relax this instruction. */
10517 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10518 s = expr_end;
10519 continue;
10520
10521 case '6': /* break code */
10522 my_getExpression (&imm_expr, s);
10523 check_absolute_expr (ip, &imm_expr);
10524 if ((unsigned long) imm_expr.X_add_number > 63)
10525 as_warn (_("Invalid value for `%s' (%lu)"),
10526 ip->insn_mo->name,
10527 (unsigned long) imm_expr.X_add_number);
10528 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10529 imm_expr.X_op = O_absent;
10530 s = expr_end;
10531 continue;
10532
10533 case 'a': /* 26 bit address */
10534 my_getExpression (&offset_expr, s);
10535 s = expr_end;
10536 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10537 ip->insn_opcode <<= 16;
10538 continue;
10539
10540 case 'l': /* register list for entry macro */
10541 case 'L': /* register list for exit macro */
10542 {
10543 int mask;
10544
10545 if (c == 'l')
10546 mask = 0;
10547 else
10548 mask = 7 << 3;
10549 while (*s != '\0')
10550 {
10551 unsigned int freg, reg1, reg2;
10552
10553 while (*s == ' ' || *s == ',')
10554 ++s;
10555 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10556 freg = 0;
10557 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10558 freg = 1;
10559 else
10560 {
10561 as_bad (_("can't parse register list"));
10562 break;
10563 }
10564 if (*s == ' ')
10565 ++s;
10566 if (*s != '-')
10567 reg2 = reg1;
10568 else
10569 {
10570 ++s;
10571 if (!reg_lookup (&s, freg ? RTYPE_FPU
10572 : (RTYPE_GP | RTYPE_NUM), &reg2))
10573 {
10574 as_bad (_("invalid register list"));
10575 break;
10576 }
10577 }
10578 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10579 {
10580 mask &= ~ (7 << 3);
10581 mask |= 5 << 3;
10582 }
10583 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10584 {
10585 mask &= ~ (7 << 3);
10586 mask |= 6 << 3;
10587 }
10588 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10589 mask |= (reg2 - 3) << 3;
10590 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10591 mask |= (reg2 - 15) << 1;
10592 else if (reg1 == RA && reg2 == RA)
10593 mask |= 1;
10594 else
10595 {
10596 as_bad (_("invalid register list"));
10597 break;
10598 }
10599 }
10600 /* The mask is filled in in the opcode table for the
10601 benefit of the disassembler. We remove it before
10602 applying the actual mask. */
10603 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10604 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10605 }
10606 continue;
10607
10608 case 'm': /* Register list for save insn. */
10609 case 'M': /* Register list for restore insn. */
10610 {
10611 int opcode = 0;
10612 int framesz = 0, seen_framesz = 0;
10613 int nargs = 0, statics = 0, sregs = 0;
10614
10615 while (*s != '\0')
10616 {
10617 unsigned int reg1, reg2;
10618
10619 SKIP_SPACE_TABS (s);
10620 while (*s == ',')
10621 ++s;
10622 SKIP_SPACE_TABS (s);
10623
10624 my_getExpression (&imm_expr, s);
10625 if (imm_expr.X_op == O_constant)
10626 {
10627 /* Handle the frame size. */
10628 if (seen_framesz)
10629 {
10630 as_bad (_("more than one frame size in list"));
10631 break;
10632 }
10633 seen_framesz = 1;
10634 framesz = imm_expr.X_add_number;
10635 imm_expr.X_op = O_absent;
10636 s = expr_end;
10637 continue;
10638 }
10639
10640 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10641 {
10642 as_bad (_("can't parse register list"));
10643 break;
10644 }
10645
10646 while (*s == ' ')
10647 ++s;
10648
10649 if (*s != '-')
10650 reg2 = reg1;
10651 else
10652 {
10653 ++s;
10654 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10655 || reg2 < reg1)
10656 {
10657 as_bad (_("can't parse register list"));
10658 break;
10659 }
10660 }
10661
10662 while (reg1 <= reg2)
10663 {
10664 if (reg1 >= 4 && reg1 <= 7)
10665 {
10666 if (!seen_framesz)
10667 /* args $a0-$a3 */
10668 nargs |= 1 << (reg1 - 4);
10669 else
10670 /* statics $a0-$a3 */
10671 statics |= 1 << (reg1 - 4);
10672 }
10673 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10674 {
10675 /* $s0-$s8 */
10676 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10677 }
10678 else if (reg1 == 31)
10679 {
10680 /* Add $ra to insn. */
10681 opcode |= 0x40;
10682 }
10683 else
10684 {
10685 as_bad (_("unexpected register in list"));
10686 break;
10687 }
10688 if (++reg1 == 24)
10689 reg1 = 30;
10690 }
10691 }
10692
10693 /* Encode args/statics combination. */
10694 if (nargs & statics)
10695 as_bad (_("arg/static registers overlap"));
10696 else if (nargs == 0xf)
10697 /* All $a0-$a3 are args. */
10698 opcode |= MIPS16_ALL_ARGS << 16;
10699 else if (statics == 0xf)
10700 /* All $a0-$a3 are statics. */
10701 opcode |= MIPS16_ALL_STATICS << 16;
10702 else
10703 {
10704 int narg = 0, nstat = 0;
10705
10706 /* Count arg registers. */
10707 while (nargs & 0x1)
10708 {
10709 nargs >>= 1;
10710 narg++;
10711 }
10712 if (nargs != 0)
10713 as_bad (_("invalid arg register list"));
10714
10715 /* Count static registers. */
10716 while (statics & 0x8)
10717 {
10718 statics = (statics << 1) & 0xf;
10719 nstat++;
10720 }
10721 if (statics != 0)
10722 as_bad (_("invalid static register list"));
10723
10724 /* Encode args/statics. */
10725 opcode |= ((narg << 2) | nstat) << 16;
10726 }
10727
10728 /* Encode $s0/$s1. */
10729 if (sregs & (1 << 0)) /* $s0 */
10730 opcode |= 0x20;
10731 if (sregs & (1 << 1)) /* $s1 */
10732 opcode |= 0x10;
10733 sregs >>= 2;
10734
10735 if (sregs != 0)
10736 {
10737 /* Count regs $s2-$s8. */
10738 int nsreg = 0;
10739 while (sregs & 1)
10740 {
10741 sregs >>= 1;
10742 nsreg++;
10743 }
10744 if (sregs != 0)
10745 as_bad (_("invalid static register list"));
10746 /* Encode $s2-$s8. */
10747 opcode |= nsreg << 24;
10748 }
10749
10750 /* Encode frame size. */
10751 if (!seen_framesz)
10752 as_bad (_("missing frame size"));
10753 else if ((framesz & 7) != 0 || framesz < 0
10754 || framesz > 0xff * 8)
10755 as_bad (_("invalid frame size"));
10756 else if (framesz != 128 || (opcode >> 16) != 0)
10757 {
10758 framesz /= 8;
10759 opcode |= (((framesz & 0xf0) << 16)
10760 | (framesz & 0x0f));
10761 }
10762
10763 /* Finally build the instruction. */
10764 if ((opcode >> 16) != 0 || framesz == 0)
10765 {
10766 ip->use_extend = TRUE;
10767 ip->extend = opcode >> 16;
10768 }
10769 ip->insn_opcode |= opcode & 0x7f;
10770 }
10771 continue;
10772
10773 case 'e': /* extend code */
10774 my_getExpression (&imm_expr, s);
10775 check_absolute_expr (ip, &imm_expr);
10776 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10777 {
10778 as_warn (_("Invalid value for `%s' (%lu)"),
10779 ip->insn_mo->name,
10780 (unsigned long) imm_expr.X_add_number);
10781 imm_expr.X_add_number &= 0x7ff;
10782 }
10783 ip->insn_opcode |= imm_expr.X_add_number;
10784 imm_expr.X_op = O_absent;
10785 s = expr_end;
10786 continue;
10787
10788 default:
10789 internalError ();
10790 }
10791 break;
10792 }
10793
10794 /* Args don't match. */
10795 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10796 strcmp (insn->name, insn[1].name) == 0)
10797 {
10798 ++insn;
10799 s = argsstart;
10800 continue;
10801 }
10802
10803 insn_error = _("illegal operands");
10804
10805 return;
10806 }
10807 }
10808
10809 /* This structure holds information we know about a mips16 immediate
10810 argument type. */
10811
10812 struct mips16_immed_operand
10813 {
10814 /* The type code used in the argument string in the opcode table. */
10815 int type;
10816 /* The number of bits in the short form of the opcode. */
10817 int nbits;
10818 /* The number of bits in the extended form of the opcode. */
10819 int extbits;
10820 /* The amount by which the short form is shifted when it is used;
10821 for example, the sw instruction has a shift count of 2. */
10822 int shift;
10823 /* The amount by which the short form is shifted when it is stored
10824 into the instruction code. */
10825 int op_shift;
10826 /* Non-zero if the short form is unsigned. */
10827 int unsp;
10828 /* Non-zero if the extended form is unsigned. */
10829 int extu;
10830 /* Non-zero if the value is PC relative. */
10831 int pcrel;
10832 };
10833
10834 /* The mips16 immediate operand types. */
10835
10836 static const struct mips16_immed_operand mips16_immed_operands[] =
10837 {
10838 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10839 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10840 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10841 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10842 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10843 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10844 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10845 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10846 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10847 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10848 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10849 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10850 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10851 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10852 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10853 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10854 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10855 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10856 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10857 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10858 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10859 };
10860
10861 #define MIPS16_NUM_IMMED \
10862 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10863
10864 /* Handle a mips16 instruction with an immediate value. This or's the
10865 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10866 whether an extended value is needed; if one is needed, it sets
10867 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10868 If SMALL is true, an unextended opcode was explicitly requested.
10869 If EXT is true, an extended opcode was explicitly requested. If
10870 WARN is true, warn if EXT does not match reality. */
10871
10872 static void
10873 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10874 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10875 unsigned long *insn, bfd_boolean *use_extend,
10876 unsigned short *extend)
10877 {
10878 const struct mips16_immed_operand *op;
10879 int mintiny, maxtiny;
10880 bfd_boolean needext;
10881
10882 op = mips16_immed_operands;
10883 while (op->type != type)
10884 {
10885 ++op;
10886 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10887 }
10888
10889 if (op->unsp)
10890 {
10891 if (type == '<' || type == '>' || type == '[' || type == ']')
10892 {
10893 mintiny = 1;
10894 maxtiny = 1 << op->nbits;
10895 }
10896 else
10897 {
10898 mintiny = 0;
10899 maxtiny = (1 << op->nbits) - 1;
10900 }
10901 }
10902 else
10903 {
10904 mintiny = - (1 << (op->nbits - 1));
10905 maxtiny = (1 << (op->nbits - 1)) - 1;
10906 }
10907
10908 /* Branch offsets have an implicit 0 in the lowest bit. */
10909 if (type == 'p' || type == 'q')
10910 val /= 2;
10911
10912 if ((val & ((1 << op->shift) - 1)) != 0
10913 || val < (mintiny << op->shift)
10914 || val > (maxtiny << op->shift))
10915 needext = TRUE;
10916 else
10917 needext = FALSE;
10918
10919 if (warn && ext && ! needext)
10920 as_warn_where (file, line,
10921 _("extended operand requested but not required"));
10922 if (small && needext)
10923 as_bad_where (file, line, _("invalid unextended operand value"));
10924
10925 if (small || (! ext && ! needext))
10926 {
10927 int insnval;
10928
10929 *use_extend = FALSE;
10930 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10931 insnval <<= op->op_shift;
10932 *insn |= insnval;
10933 }
10934 else
10935 {
10936 long minext, maxext;
10937 int extval;
10938
10939 if (op->extu)
10940 {
10941 minext = 0;
10942 maxext = (1 << op->extbits) - 1;
10943 }
10944 else
10945 {
10946 minext = - (1 << (op->extbits - 1));
10947 maxext = (1 << (op->extbits - 1)) - 1;
10948 }
10949 if (val < minext || val > maxext)
10950 as_bad_where (file, line,
10951 _("operand value out of range for instruction"));
10952
10953 *use_extend = TRUE;
10954 if (op->extbits == 16)
10955 {
10956 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10957 val &= 0x1f;
10958 }
10959 else if (op->extbits == 15)
10960 {
10961 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10962 val &= 0xf;
10963 }
10964 else
10965 {
10966 extval = ((val & 0x1f) << 6) | (val & 0x20);
10967 val = 0;
10968 }
10969
10970 *extend = (unsigned short) extval;
10971 *insn |= val;
10972 }
10973 }
10974 \f
10975 struct percent_op_match
10976 {
10977 const char *str;
10978 bfd_reloc_code_real_type reloc;
10979 };
10980
10981 static const struct percent_op_match mips_percent_op[] =
10982 {
10983 {"%lo", BFD_RELOC_LO16},
10984 #ifdef OBJ_ELF
10985 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10986 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10987 {"%call16", BFD_RELOC_MIPS_CALL16},
10988 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10989 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10990 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10991 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10992 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10993 {"%got", BFD_RELOC_MIPS_GOT16},
10994 {"%gp_rel", BFD_RELOC_GPREL16},
10995 {"%half", BFD_RELOC_16},
10996 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10997 {"%higher", BFD_RELOC_MIPS_HIGHER},
10998 {"%neg", BFD_RELOC_MIPS_SUB},
10999 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11000 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11001 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11002 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11003 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11004 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11005 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11006 #endif
11007 {"%hi", BFD_RELOC_HI16_S}
11008 };
11009
11010 static const struct percent_op_match mips16_percent_op[] =
11011 {
11012 {"%lo", BFD_RELOC_MIPS16_LO16},
11013 {"%gprel", BFD_RELOC_MIPS16_GPREL},
11014 {"%got", BFD_RELOC_MIPS16_GOT16},
11015 {"%call16", BFD_RELOC_MIPS16_CALL16},
11016 {"%hi", BFD_RELOC_MIPS16_HI16_S}
11017 };
11018
11019
11020 /* Return true if *STR points to a relocation operator. When returning true,
11021 move *STR over the operator and store its relocation code in *RELOC.
11022 Leave both *STR and *RELOC alone when returning false. */
11023
11024 static bfd_boolean
11025 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11026 {
11027 const struct percent_op_match *percent_op;
11028 size_t limit, i;
11029
11030 if (mips_opts.mips16)
11031 {
11032 percent_op = mips16_percent_op;
11033 limit = ARRAY_SIZE (mips16_percent_op);
11034 }
11035 else
11036 {
11037 percent_op = mips_percent_op;
11038 limit = ARRAY_SIZE (mips_percent_op);
11039 }
11040
11041 for (i = 0; i < limit; i++)
11042 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11043 {
11044 int len = strlen (percent_op[i].str);
11045
11046 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11047 continue;
11048
11049 *str += strlen (percent_op[i].str);
11050 *reloc = percent_op[i].reloc;
11051
11052 /* Check whether the output BFD supports this relocation.
11053 If not, issue an error and fall back on something safe. */
11054 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11055 {
11056 as_bad (_("relocation %s isn't supported by the current ABI"),
11057 percent_op[i].str);
11058 *reloc = BFD_RELOC_UNUSED;
11059 }
11060 return TRUE;
11061 }
11062 return FALSE;
11063 }
11064
11065
11066 /* Parse string STR as a 16-bit relocatable operand. Store the
11067 expression in *EP and the relocations in the array starting
11068 at RELOC. Return the number of relocation operators used.
11069
11070 On exit, EXPR_END points to the first character after the expression. */
11071
11072 static size_t
11073 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11074 char *str)
11075 {
11076 bfd_reloc_code_real_type reversed_reloc[3];
11077 size_t reloc_index, i;
11078 int crux_depth, str_depth;
11079 char *crux;
11080
11081 /* Search for the start of the main expression, recoding relocations
11082 in REVERSED_RELOC. End the loop with CRUX pointing to the start
11083 of the main expression and with CRUX_DEPTH containing the number
11084 of open brackets at that point. */
11085 reloc_index = -1;
11086 str_depth = 0;
11087 do
11088 {
11089 reloc_index++;
11090 crux = str;
11091 crux_depth = str_depth;
11092
11093 /* Skip over whitespace and brackets, keeping count of the number
11094 of brackets. */
11095 while (*str == ' ' || *str == '\t' || *str == '(')
11096 if (*str++ == '(')
11097 str_depth++;
11098 }
11099 while (*str == '%'
11100 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11101 && parse_relocation (&str, &reversed_reloc[reloc_index]));
11102
11103 my_getExpression (ep, crux);
11104 str = expr_end;
11105
11106 /* Match every open bracket. */
11107 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11108 if (*str++ == ')')
11109 crux_depth--;
11110
11111 if (crux_depth > 0)
11112 as_bad (_("unclosed '('"));
11113
11114 expr_end = str;
11115
11116 if (reloc_index != 0)
11117 {
11118 prev_reloc_op_frag = frag_now;
11119 for (i = 0; i < reloc_index; i++)
11120 reloc[i] = reversed_reloc[reloc_index - 1 - i];
11121 }
11122
11123 return reloc_index;
11124 }
11125
11126 static void
11127 my_getExpression (expressionS *ep, char *str)
11128 {
11129 char *save_in;
11130 valueT val;
11131
11132 save_in = input_line_pointer;
11133 input_line_pointer = str;
11134 expression (ep);
11135 expr_end = input_line_pointer;
11136 input_line_pointer = save_in;
11137
11138 /* If we are in mips16 mode, and this is an expression based on `.',
11139 then we bump the value of the symbol by 1 since that is how other
11140 text symbols are handled. We don't bother to handle complex
11141 expressions, just `.' plus or minus a constant. */
11142 if (mips_opts.mips16
11143 && ep->X_op == O_symbol
11144 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11145 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11146 && symbol_get_frag (ep->X_add_symbol) == frag_now
11147 && symbol_constant_p (ep->X_add_symbol)
11148 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11149 S_SET_VALUE (ep->X_add_symbol, val + 1);
11150 }
11151
11152 char *
11153 md_atof (int type, char *litP, int *sizeP)
11154 {
11155 return ieee_md_atof (type, litP, sizeP, target_big_endian);
11156 }
11157
11158 void
11159 md_number_to_chars (char *buf, valueT val, int n)
11160 {
11161 if (target_big_endian)
11162 number_to_chars_bigendian (buf, val, n);
11163 else
11164 number_to_chars_littleendian (buf, val, n);
11165 }
11166 \f
11167 #ifdef OBJ_ELF
11168 static int support_64bit_objects(void)
11169 {
11170 const char **list, **l;
11171 int yes;
11172
11173 list = bfd_target_list ();
11174 for (l = list; *l != NULL; l++)
11175 #ifdef TE_TMIPS
11176 /* This is traditional mips */
11177 if (strcmp (*l, "elf64-tradbigmips") == 0
11178 || strcmp (*l, "elf64-tradlittlemips") == 0)
11179 #else
11180 if (strcmp (*l, "elf64-bigmips") == 0
11181 || strcmp (*l, "elf64-littlemips") == 0)
11182 #endif
11183 break;
11184 yes = (*l != NULL);
11185 free (list);
11186 return yes;
11187 }
11188 #endif /* OBJ_ELF */
11189
11190 const char *md_shortopts = "O::g::G:";
11191
11192 enum options
11193 {
11194 OPTION_MARCH = OPTION_MD_BASE,
11195 OPTION_MTUNE,
11196 OPTION_MIPS1,
11197 OPTION_MIPS2,
11198 OPTION_MIPS3,
11199 OPTION_MIPS4,
11200 OPTION_MIPS5,
11201 OPTION_MIPS32,
11202 OPTION_MIPS64,
11203 OPTION_MIPS32R2,
11204 OPTION_MIPS64R2,
11205 OPTION_MIPS16,
11206 OPTION_NO_MIPS16,
11207 OPTION_MIPS3D,
11208 OPTION_NO_MIPS3D,
11209 OPTION_MDMX,
11210 OPTION_NO_MDMX,
11211 OPTION_DSP,
11212 OPTION_NO_DSP,
11213 OPTION_MT,
11214 OPTION_NO_MT,
11215 OPTION_SMARTMIPS,
11216 OPTION_NO_SMARTMIPS,
11217 OPTION_DSPR2,
11218 OPTION_NO_DSPR2,
11219 OPTION_COMPAT_ARCH_BASE,
11220 OPTION_M4650,
11221 OPTION_NO_M4650,
11222 OPTION_M4010,
11223 OPTION_NO_M4010,
11224 OPTION_M4100,
11225 OPTION_NO_M4100,
11226 OPTION_M3900,
11227 OPTION_NO_M3900,
11228 OPTION_M7000_HILO_FIX,
11229 OPTION_MNO_7000_HILO_FIX,
11230 OPTION_FIX_24K,
11231 OPTION_NO_FIX_24K,
11232 OPTION_FIX_LOONGSON2F_JUMP,
11233 OPTION_NO_FIX_LOONGSON2F_JUMP,
11234 OPTION_FIX_LOONGSON2F_NOP,
11235 OPTION_NO_FIX_LOONGSON2F_NOP,
11236 OPTION_FIX_VR4120,
11237 OPTION_NO_FIX_VR4120,
11238 OPTION_FIX_VR4130,
11239 OPTION_NO_FIX_VR4130,
11240 OPTION_FIX_CN63XXP1,
11241 OPTION_NO_FIX_CN63XXP1,
11242 OPTION_TRAP,
11243 OPTION_BREAK,
11244 OPTION_EB,
11245 OPTION_EL,
11246 OPTION_FP32,
11247 OPTION_GP32,
11248 OPTION_CONSTRUCT_FLOATS,
11249 OPTION_NO_CONSTRUCT_FLOATS,
11250 OPTION_FP64,
11251 OPTION_GP64,
11252 OPTION_RELAX_BRANCH,
11253 OPTION_NO_RELAX_BRANCH,
11254 OPTION_MSHARED,
11255 OPTION_MNO_SHARED,
11256 OPTION_MSYM32,
11257 OPTION_MNO_SYM32,
11258 OPTION_SOFT_FLOAT,
11259 OPTION_HARD_FLOAT,
11260 OPTION_SINGLE_FLOAT,
11261 OPTION_DOUBLE_FLOAT,
11262 OPTION_32,
11263 #ifdef OBJ_ELF
11264 OPTION_CALL_SHARED,
11265 OPTION_CALL_NONPIC,
11266 OPTION_NON_SHARED,
11267 OPTION_XGOT,
11268 OPTION_MABI,
11269 OPTION_N32,
11270 OPTION_64,
11271 OPTION_MDEBUG,
11272 OPTION_NO_MDEBUG,
11273 OPTION_PDR,
11274 OPTION_NO_PDR,
11275 OPTION_MVXWORKS_PIC,
11276 #endif /* OBJ_ELF */
11277 OPTION_END_OF_ENUM
11278 };
11279
11280 struct option md_longopts[] =
11281 {
11282 /* Options which specify architecture. */
11283 {"march", required_argument, NULL, OPTION_MARCH},
11284 {"mtune", required_argument, NULL, OPTION_MTUNE},
11285 {"mips0", no_argument, NULL, OPTION_MIPS1},
11286 {"mips1", no_argument, NULL, OPTION_MIPS1},
11287 {"mips2", no_argument, NULL, OPTION_MIPS2},
11288 {"mips3", no_argument, NULL, OPTION_MIPS3},
11289 {"mips4", no_argument, NULL, OPTION_MIPS4},
11290 {"mips5", no_argument, NULL, OPTION_MIPS5},
11291 {"mips32", no_argument, NULL, OPTION_MIPS32},
11292 {"mips64", no_argument, NULL, OPTION_MIPS64},
11293 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11294 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11295
11296 /* Options which specify Application Specific Extensions (ASEs). */
11297 {"mips16", no_argument, NULL, OPTION_MIPS16},
11298 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11299 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11300 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11301 {"mdmx", no_argument, NULL, OPTION_MDMX},
11302 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11303 {"mdsp", no_argument, NULL, OPTION_DSP},
11304 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11305 {"mmt", no_argument, NULL, OPTION_MT},
11306 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11307 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11308 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11309 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11310 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11311
11312 /* Old-style architecture options. Don't add more of these. */
11313 {"m4650", no_argument, NULL, OPTION_M4650},
11314 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11315 {"m4010", no_argument, NULL, OPTION_M4010},
11316 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11317 {"m4100", no_argument, NULL, OPTION_M4100},
11318 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11319 {"m3900", no_argument, NULL, OPTION_M3900},
11320 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11321
11322 /* Options which enable bug fixes. */
11323 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11324 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11325 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11326 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11327 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11328 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11329 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11330 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11331 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11332 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11333 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11334 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
11335 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11336 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11337 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11338
11339 /* Miscellaneous options. */
11340 {"trap", no_argument, NULL, OPTION_TRAP},
11341 {"no-break", no_argument, NULL, OPTION_TRAP},
11342 {"break", no_argument, NULL, OPTION_BREAK},
11343 {"no-trap", no_argument, NULL, OPTION_BREAK},
11344 {"EB", no_argument, NULL, OPTION_EB},
11345 {"EL", no_argument, NULL, OPTION_EL},
11346 {"mfp32", no_argument, NULL, OPTION_FP32},
11347 {"mgp32", no_argument, NULL, OPTION_GP32},
11348 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11349 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11350 {"mfp64", no_argument, NULL, OPTION_FP64},
11351 {"mgp64", no_argument, NULL, OPTION_GP64},
11352 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11353 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11354 {"mshared", no_argument, NULL, OPTION_MSHARED},
11355 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11356 {"msym32", no_argument, NULL, OPTION_MSYM32},
11357 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11358 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11359 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11360 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11361 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11362
11363 /* Strictly speaking this next option is ELF specific,
11364 but we allow it for other ports as well in order to
11365 make testing easier. */
11366 {"32", no_argument, NULL, OPTION_32},
11367
11368 /* ELF-specific options. */
11369 #ifdef OBJ_ELF
11370 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11371 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11372 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11373 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
11374 {"xgot", no_argument, NULL, OPTION_XGOT},
11375 {"mabi", required_argument, NULL, OPTION_MABI},
11376 {"n32", no_argument, NULL, OPTION_N32},
11377 {"64", no_argument, NULL, OPTION_64},
11378 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11379 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11380 {"mpdr", no_argument, NULL, OPTION_PDR},
11381 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11382 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11383 #endif /* OBJ_ELF */
11384
11385 {NULL, no_argument, NULL, 0}
11386 };
11387 size_t md_longopts_size = sizeof (md_longopts);
11388
11389 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11390 NEW_VALUE. Warn if another value was already specified. Note:
11391 we have to defer parsing the -march and -mtune arguments in order
11392 to handle 'from-abi' correctly, since the ABI might be specified
11393 in a later argument. */
11394
11395 static void
11396 mips_set_option_string (const char **string_ptr, const char *new_value)
11397 {
11398 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11399 as_warn (_("A different %s was already specified, is now %s"),
11400 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11401 new_value);
11402
11403 *string_ptr = new_value;
11404 }
11405
11406 int
11407 md_parse_option (int c, char *arg)
11408 {
11409 switch (c)
11410 {
11411 case OPTION_CONSTRUCT_FLOATS:
11412 mips_disable_float_construction = 0;
11413 break;
11414
11415 case OPTION_NO_CONSTRUCT_FLOATS:
11416 mips_disable_float_construction = 1;
11417 break;
11418
11419 case OPTION_TRAP:
11420 mips_trap = 1;
11421 break;
11422
11423 case OPTION_BREAK:
11424 mips_trap = 0;
11425 break;
11426
11427 case OPTION_EB:
11428 target_big_endian = 1;
11429 break;
11430
11431 case OPTION_EL:
11432 target_big_endian = 0;
11433 break;
11434
11435 case 'O':
11436 if (arg == NULL)
11437 mips_optimize = 1;
11438 else if (arg[0] == '0')
11439 mips_optimize = 0;
11440 else if (arg[0] == '1')
11441 mips_optimize = 1;
11442 else
11443 mips_optimize = 2;
11444 break;
11445
11446 case 'g':
11447 if (arg == NULL)
11448 mips_debug = 2;
11449 else
11450 mips_debug = atoi (arg);
11451 break;
11452
11453 case OPTION_MIPS1:
11454 file_mips_isa = ISA_MIPS1;
11455 break;
11456
11457 case OPTION_MIPS2:
11458 file_mips_isa = ISA_MIPS2;
11459 break;
11460
11461 case OPTION_MIPS3:
11462 file_mips_isa = ISA_MIPS3;
11463 break;
11464
11465 case OPTION_MIPS4:
11466 file_mips_isa = ISA_MIPS4;
11467 break;
11468
11469 case OPTION_MIPS5:
11470 file_mips_isa = ISA_MIPS5;
11471 break;
11472
11473 case OPTION_MIPS32:
11474 file_mips_isa = ISA_MIPS32;
11475 break;
11476
11477 case OPTION_MIPS32R2:
11478 file_mips_isa = ISA_MIPS32R2;
11479 break;
11480
11481 case OPTION_MIPS64R2:
11482 file_mips_isa = ISA_MIPS64R2;
11483 break;
11484
11485 case OPTION_MIPS64:
11486 file_mips_isa = ISA_MIPS64;
11487 break;
11488
11489 case OPTION_MTUNE:
11490 mips_set_option_string (&mips_tune_string, arg);
11491 break;
11492
11493 case OPTION_MARCH:
11494 mips_set_option_string (&mips_arch_string, arg);
11495 break;
11496
11497 case OPTION_M4650:
11498 mips_set_option_string (&mips_arch_string, "4650");
11499 mips_set_option_string (&mips_tune_string, "4650");
11500 break;
11501
11502 case OPTION_NO_M4650:
11503 break;
11504
11505 case OPTION_M4010:
11506 mips_set_option_string (&mips_arch_string, "4010");
11507 mips_set_option_string (&mips_tune_string, "4010");
11508 break;
11509
11510 case OPTION_NO_M4010:
11511 break;
11512
11513 case OPTION_M4100:
11514 mips_set_option_string (&mips_arch_string, "4100");
11515 mips_set_option_string (&mips_tune_string, "4100");
11516 break;
11517
11518 case OPTION_NO_M4100:
11519 break;
11520
11521 case OPTION_M3900:
11522 mips_set_option_string (&mips_arch_string, "3900");
11523 mips_set_option_string (&mips_tune_string, "3900");
11524 break;
11525
11526 case OPTION_NO_M3900:
11527 break;
11528
11529 case OPTION_MDMX:
11530 mips_opts.ase_mdmx = 1;
11531 break;
11532
11533 case OPTION_NO_MDMX:
11534 mips_opts.ase_mdmx = 0;
11535 break;
11536
11537 case OPTION_DSP:
11538 mips_opts.ase_dsp = 1;
11539 mips_opts.ase_dspr2 = 0;
11540 break;
11541
11542 case OPTION_NO_DSP:
11543 mips_opts.ase_dsp = 0;
11544 mips_opts.ase_dspr2 = 0;
11545 break;
11546
11547 case OPTION_DSPR2:
11548 mips_opts.ase_dspr2 = 1;
11549 mips_opts.ase_dsp = 1;
11550 break;
11551
11552 case OPTION_NO_DSPR2:
11553 mips_opts.ase_dspr2 = 0;
11554 mips_opts.ase_dsp = 0;
11555 break;
11556
11557 case OPTION_MT:
11558 mips_opts.ase_mt = 1;
11559 break;
11560
11561 case OPTION_NO_MT:
11562 mips_opts.ase_mt = 0;
11563 break;
11564
11565 case OPTION_MIPS16:
11566 mips_opts.mips16 = 1;
11567 mips_no_prev_insn ();
11568 break;
11569
11570 case OPTION_NO_MIPS16:
11571 mips_opts.mips16 = 0;
11572 mips_no_prev_insn ();
11573 break;
11574
11575 case OPTION_MIPS3D:
11576 mips_opts.ase_mips3d = 1;
11577 break;
11578
11579 case OPTION_NO_MIPS3D:
11580 mips_opts.ase_mips3d = 0;
11581 break;
11582
11583 case OPTION_SMARTMIPS:
11584 mips_opts.ase_smartmips = 1;
11585 break;
11586
11587 case OPTION_NO_SMARTMIPS:
11588 mips_opts.ase_smartmips = 0;
11589 break;
11590
11591 case OPTION_FIX_24K:
11592 mips_fix_24k = 1;
11593 break;
11594
11595 case OPTION_NO_FIX_24K:
11596 mips_fix_24k = 0;
11597 break;
11598
11599 case OPTION_FIX_LOONGSON2F_JUMP:
11600 mips_fix_loongson2f_jump = TRUE;
11601 break;
11602
11603 case OPTION_NO_FIX_LOONGSON2F_JUMP:
11604 mips_fix_loongson2f_jump = FALSE;
11605 break;
11606
11607 case OPTION_FIX_LOONGSON2F_NOP:
11608 mips_fix_loongson2f_nop = TRUE;
11609 break;
11610
11611 case OPTION_NO_FIX_LOONGSON2F_NOP:
11612 mips_fix_loongson2f_nop = FALSE;
11613 break;
11614
11615 case OPTION_FIX_VR4120:
11616 mips_fix_vr4120 = 1;
11617 break;
11618
11619 case OPTION_NO_FIX_VR4120:
11620 mips_fix_vr4120 = 0;
11621 break;
11622
11623 case OPTION_FIX_VR4130:
11624 mips_fix_vr4130 = 1;
11625 break;
11626
11627 case OPTION_NO_FIX_VR4130:
11628 mips_fix_vr4130 = 0;
11629 break;
11630
11631 case OPTION_FIX_CN63XXP1:
11632 mips_fix_cn63xxp1 = TRUE;
11633 break;
11634
11635 case OPTION_NO_FIX_CN63XXP1:
11636 mips_fix_cn63xxp1 = FALSE;
11637 break;
11638
11639 case OPTION_RELAX_BRANCH:
11640 mips_relax_branch = 1;
11641 break;
11642
11643 case OPTION_NO_RELAX_BRANCH:
11644 mips_relax_branch = 0;
11645 break;
11646
11647 case OPTION_MSHARED:
11648 mips_in_shared = TRUE;
11649 break;
11650
11651 case OPTION_MNO_SHARED:
11652 mips_in_shared = FALSE;
11653 break;
11654
11655 case OPTION_MSYM32:
11656 mips_opts.sym32 = TRUE;
11657 break;
11658
11659 case OPTION_MNO_SYM32:
11660 mips_opts.sym32 = FALSE;
11661 break;
11662
11663 #ifdef OBJ_ELF
11664 /* When generating ELF code, we permit -KPIC and -call_shared to
11665 select SVR4_PIC, and -non_shared to select no PIC. This is
11666 intended to be compatible with Irix 5. */
11667 case OPTION_CALL_SHARED:
11668 if (!IS_ELF)
11669 {
11670 as_bad (_("-call_shared is supported only for ELF format"));
11671 return 0;
11672 }
11673 mips_pic = SVR4_PIC;
11674 mips_abicalls = TRUE;
11675 break;
11676
11677 case OPTION_CALL_NONPIC:
11678 if (!IS_ELF)
11679 {
11680 as_bad (_("-call_nonpic is supported only for ELF format"));
11681 return 0;
11682 }
11683 mips_pic = NO_PIC;
11684 mips_abicalls = TRUE;
11685 break;
11686
11687 case OPTION_NON_SHARED:
11688 if (!IS_ELF)
11689 {
11690 as_bad (_("-non_shared is supported only for ELF format"));
11691 return 0;
11692 }
11693 mips_pic = NO_PIC;
11694 mips_abicalls = FALSE;
11695 break;
11696
11697 /* The -xgot option tells the assembler to use 32 bit offsets
11698 when accessing the got in SVR4_PIC mode. It is for Irix
11699 compatibility. */
11700 case OPTION_XGOT:
11701 mips_big_got = 1;
11702 break;
11703 #endif /* OBJ_ELF */
11704
11705 case 'G':
11706 g_switch_value = atoi (arg);
11707 g_switch_seen = 1;
11708 break;
11709
11710 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11711 and -mabi=64. */
11712 case OPTION_32:
11713 if (IS_ELF)
11714 mips_abi = O32_ABI;
11715 /* We silently ignore -32 for non-ELF targets. This greatly
11716 simplifies the construction of the MIPS GAS test cases. */
11717 break;
11718
11719 #ifdef OBJ_ELF
11720 case OPTION_N32:
11721 if (!IS_ELF)
11722 {
11723 as_bad (_("-n32 is supported for ELF format only"));
11724 return 0;
11725 }
11726 mips_abi = N32_ABI;
11727 break;
11728
11729 case OPTION_64:
11730 if (!IS_ELF)
11731 {
11732 as_bad (_("-64 is supported for ELF format only"));
11733 return 0;
11734 }
11735 mips_abi = N64_ABI;
11736 if (!support_64bit_objects())
11737 as_fatal (_("No compiled in support for 64 bit object file format"));
11738 break;
11739 #endif /* OBJ_ELF */
11740
11741 case OPTION_GP32:
11742 file_mips_gp32 = 1;
11743 break;
11744
11745 case OPTION_GP64:
11746 file_mips_gp32 = 0;
11747 break;
11748
11749 case OPTION_FP32:
11750 file_mips_fp32 = 1;
11751 break;
11752
11753 case OPTION_FP64:
11754 file_mips_fp32 = 0;
11755 break;
11756
11757 case OPTION_SINGLE_FLOAT:
11758 file_mips_single_float = 1;
11759 break;
11760
11761 case OPTION_DOUBLE_FLOAT:
11762 file_mips_single_float = 0;
11763 break;
11764
11765 case OPTION_SOFT_FLOAT:
11766 file_mips_soft_float = 1;
11767 break;
11768
11769 case OPTION_HARD_FLOAT:
11770 file_mips_soft_float = 0;
11771 break;
11772
11773 #ifdef OBJ_ELF
11774 case OPTION_MABI:
11775 if (!IS_ELF)
11776 {
11777 as_bad (_("-mabi is supported for ELF format only"));
11778 return 0;
11779 }
11780 if (strcmp (arg, "32") == 0)
11781 mips_abi = O32_ABI;
11782 else if (strcmp (arg, "o64") == 0)
11783 mips_abi = O64_ABI;
11784 else if (strcmp (arg, "n32") == 0)
11785 mips_abi = N32_ABI;
11786 else if (strcmp (arg, "64") == 0)
11787 {
11788 mips_abi = N64_ABI;
11789 if (! support_64bit_objects())
11790 as_fatal (_("No compiled in support for 64 bit object file "
11791 "format"));
11792 }
11793 else if (strcmp (arg, "eabi") == 0)
11794 mips_abi = EABI_ABI;
11795 else
11796 {
11797 as_fatal (_("invalid abi -mabi=%s"), arg);
11798 return 0;
11799 }
11800 break;
11801 #endif /* OBJ_ELF */
11802
11803 case OPTION_M7000_HILO_FIX:
11804 mips_7000_hilo_fix = TRUE;
11805 break;
11806
11807 case OPTION_MNO_7000_HILO_FIX:
11808 mips_7000_hilo_fix = FALSE;
11809 break;
11810
11811 #ifdef OBJ_ELF
11812 case OPTION_MDEBUG:
11813 mips_flag_mdebug = TRUE;
11814 break;
11815
11816 case OPTION_NO_MDEBUG:
11817 mips_flag_mdebug = FALSE;
11818 break;
11819
11820 case OPTION_PDR:
11821 mips_flag_pdr = TRUE;
11822 break;
11823
11824 case OPTION_NO_PDR:
11825 mips_flag_pdr = FALSE;
11826 break;
11827
11828 case OPTION_MVXWORKS_PIC:
11829 mips_pic = VXWORKS_PIC;
11830 break;
11831 #endif /* OBJ_ELF */
11832
11833 default:
11834 return 0;
11835 }
11836
11837 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11838
11839 return 1;
11840 }
11841 \f
11842 /* Set up globals to generate code for the ISA or processor
11843 described by INFO. */
11844
11845 static void
11846 mips_set_architecture (const struct mips_cpu_info *info)
11847 {
11848 if (info != 0)
11849 {
11850 file_mips_arch = info->cpu;
11851 mips_opts.arch = info->cpu;
11852 mips_opts.isa = info->isa;
11853 }
11854 }
11855
11856
11857 /* Likewise for tuning. */
11858
11859 static void
11860 mips_set_tune (const struct mips_cpu_info *info)
11861 {
11862 if (info != 0)
11863 mips_tune = info->cpu;
11864 }
11865
11866
11867 void
11868 mips_after_parse_args (void)
11869 {
11870 const struct mips_cpu_info *arch_info = 0;
11871 const struct mips_cpu_info *tune_info = 0;
11872
11873 /* GP relative stuff not working for PE */
11874 if (strncmp (TARGET_OS, "pe", 2) == 0)
11875 {
11876 if (g_switch_seen && g_switch_value != 0)
11877 as_bad (_("-G not supported in this configuration."));
11878 g_switch_value = 0;
11879 }
11880
11881 if (mips_abi == NO_ABI)
11882 mips_abi = MIPS_DEFAULT_ABI;
11883
11884 /* The following code determines the architecture and register size.
11885 Similar code was added to GCC 3.3 (see override_options() in
11886 config/mips/mips.c). The GAS and GCC code should be kept in sync
11887 as much as possible. */
11888
11889 if (mips_arch_string != 0)
11890 arch_info = mips_parse_cpu ("-march", mips_arch_string);
11891
11892 if (file_mips_isa != ISA_UNKNOWN)
11893 {
11894 /* Handle -mipsN. At this point, file_mips_isa contains the
11895 ISA level specified by -mipsN, while arch_info->isa contains
11896 the -march selection (if any). */
11897 if (arch_info != 0)
11898 {
11899 /* -march takes precedence over -mipsN, since it is more descriptive.
11900 There's no harm in specifying both as long as the ISA levels
11901 are the same. */
11902 if (file_mips_isa != arch_info->isa)
11903 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11904 mips_cpu_info_from_isa (file_mips_isa)->name,
11905 mips_cpu_info_from_isa (arch_info->isa)->name);
11906 }
11907 else
11908 arch_info = mips_cpu_info_from_isa (file_mips_isa);
11909 }
11910
11911 if (arch_info == 0)
11912 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11913
11914 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11915 as_bad (_("-march=%s is not compatible with the selected ABI"),
11916 arch_info->name);
11917
11918 mips_set_architecture (arch_info);
11919
11920 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11921 if (mips_tune_string != 0)
11922 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11923
11924 if (tune_info == 0)
11925 mips_set_tune (arch_info);
11926 else
11927 mips_set_tune (tune_info);
11928
11929 if (file_mips_gp32 >= 0)
11930 {
11931 /* The user specified the size of the integer registers. Make sure
11932 it agrees with the ABI and ISA. */
11933 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11934 as_bad (_("-mgp64 used with a 32-bit processor"));
11935 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11936 as_bad (_("-mgp32 used with a 64-bit ABI"));
11937 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11938 as_bad (_("-mgp64 used with a 32-bit ABI"));
11939 }
11940 else
11941 {
11942 /* Infer the integer register size from the ABI and processor.
11943 Restrict ourselves to 32-bit registers if that's all the
11944 processor has, or if the ABI cannot handle 64-bit registers. */
11945 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11946 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11947 }
11948
11949 switch (file_mips_fp32)
11950 {
11951 default:
11952 case -1:
11953 /* No user specified float register size.
11954 ??? GAS treats single-float processors as though they had 64-bit
11955 float registers (although it complains when double-precision
11956 instructions are used). As things stand, saying they have 32-bit
11957 registers would lead to spurious "register must be even" messages.
11958 So here we assume float registers are never smaller than the
11959 integer ones. */
11960 if (file_mips_gp32 == 0)
11961 /* 64-bit integer registers implies 64-bit float registers. */
11962 file_mips_fp32 = 0;
11963 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11964 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11965 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11966 file_mips_fp32 = 0;
11967 else
11968 /* 32-bit float registers. */
11969 file_mips_fp32 = 1;
11970 break;
11971
11972 /* The user specified the size of the float registers. Check if it
11973 agrees with the ABI and ISA. */
11974 case 0:
11975 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11976 as_bad (_("-mfp64 used with a 32-bit fpu"));
11977 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11978 && !ISA_HAS_MXHC1 (mips_opts.isa))
11979 as_warn (_("-mfp64 used with a 32-bit ABI"));
11980 break;
11981 case 1:
11982 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11983 as_warn (_("-mfp32 used with a 64-bit ABI"));
11984 break;
11985 }
11986
11987 /* End of GCC-shared inference code. */
11988
11989 /* This flag is set when we have a 64-bit capable CPU but use only
11990 32-bit wide registers. Note that EABI does not use it. */
11991 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11992 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11993 || mips_abi == O32_ABI))
11994 mips_32bitmode = 1;
11995
11996 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11997 as_bad (_("trap exception not supported at ISA 1"));
11998
11999 /* If the selected architecture includes support for ASEs, enable
12000 generation of code for them. */
12001 if (mips_opts.mips16 == -1)
12002 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12003 if (mips_opts.ase_mips3d == -1)
12004 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12005 && file_mips_fp32 == 0) ? 1 : 0;
12006 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12007 as_bad (_("-mfp32 used with -mips3d"));
12008
12009 if (mips_opts.ase_mdmx == -1)
12010 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12011 && file_mips_fp32 == 0) ? 1 : 0;
12012 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12013 as_bad (_("-mfp32 used with -mdmx"));
12014
12015 if (mips_opts.ase_smartmips == -1)
12016 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12017 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12018 as_warn (_("%s ISA does not support SmartMIPS"),
12019 mips_cpu_info_from_isa (mips_opts.isa)->name);
12020
12021 if (mips_opts.ase_dsp == -1)
12022 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12023 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12024 as_warn (_("%s ISA does not support DSP ASE"),
12025 mips_cpu_info_from_isa (mips_opts.isa)->name);
12026
12027 if (mips_opts.ase_dspr2 == -1)
12028 {
12029 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12030 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12031 }
12032 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12033 as_warn (_("%s ISA does not support DSP R2 ASE"),
12034 mips_cpu_info_from_isa (mips_opts.isa)->name);
12035
12036 if (mips_opts.ase_mt == -1)
12037 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12038 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12039 as_warn (_("%s ISA does not support MT ASE"),
12040 mips_cpu_info_from_isa (mips_opts.isa)->name);
12041
12042 file_mips_isa = mips_opts.isa;
12043 file_ase_mips3d = mips_opts.ase_mips3d;
12044 file_ase_mdmx = mips_opts.ase_mdmx;
12045 file_ase_smartmips = mips_opts.ase_smartmips;
12046 file_ase_dsp = mips_opts.ase_dsp;
12047 file_ase_dspr2 = mips_opts.ase_dspr2;
12048 file_ase_mt = mips_opts.ase_mt;
12049 mips_opts.gp32 = file_mips_gp32;
12050 mips_opts.fp32 = file_mips_fp32;
12051 mips_opts.soft_float = file_mips_soft_float;
12052 mips_opts.single_float = file_mips_single_float;
12053
12054 if (mips_flag_mdebug < 0)
12055 {
12056 #ifdef OBJ_MAYBE_ECOFF
12057 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12058 mips_flag_mdebug = 1;
12059 else
12060 #endif /* OBJ_MAYBE_ECOFF */
12061 mips_flag_mdebug = 0;
12062 }
12063 }
12064 \f
12065 void
12066 mips_init_after_args (void)
12067 {
12068 /* initialize opcodes */
12069 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12070 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12071 }
12072
12073 long
12074 md_pcrel_from (fixS *fixP)
12075 {
12076 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12077 switch (fixP->fx_r_type)
12078 {
12079 case BFD_RELOC_16_PCREL_S2:
12080 case BFD_RELOC_MIPS_JMP:
12081 /* Return the address of the delay slot. */
12082 return addr + 4;
12083 default:
12084 /* We have no relocation type for PC relative MIPS16 instructions. */
12085 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12086 as_bad_where (fixP->fx_file, fixP->fx_line,
12087 _("PC relative MIPS16 instruction references a different section"));
12088 return addr;
12089 }
12090 }
12091
12092 /* This is called before the symbol table is processed. In order to
12093 work with gcc when using mips-tfile, we must keep all local labels.
12094 However, in other cases, we want to discard them. If we were
12095 called with -g, but we didn't see any debugging information, it may
12096 mean that gcc is smuggling debugging information through to
12097 mips-tfile, in which case we must generate all local labels. */
12098
12099 void
12100 mips_frob_file_before_adjust (void)
12101 {
12102 #ifndef NO_ECOFF_DEBUGGING
12103 if (ECOFF_DEBUGGING
12104 && mips_debug != 0
12105 && ! ecoff_debugging_seen)
12106 flag_keep_locals = 1;
12107 #endif
12108 }
12109
12110 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12111 the corresponding LO16 reloc. This is called before md_apply_fix and
12112 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
12113 relocation operators.
12114
12115 For our purposes, a %lo() expression matches a %got() or %hi()
12116 expression if:
12117
12118 (a) it refers to the same symbol; and
12119 (b) the offset applied in the %lo() expression is no lower than
12120 the offset applied in the %got() or %hi().
12121
12122 (b) allows us to cope with code like:
12123
12124 lui $4,%hi(foo)
12125 lh $4,%lo(foo+2)($4)
12126
12127 ...which is legal on RELA targets, and has a well-defined behaviour
12128 if the user knows that adding 2 to "foo" will not induce a carry to
12129 the high 16 bits.
12130
12131 When several %lo()s match a particular %got() or %hi(), we use the
12132 following rules to distinguish them:
12133
12134 (1) %lo()s with smaller offsets are a better match than %lo()s with
12135 higher offsets.
12136
12137 (2) %lo()s with no matching %got() or %hi() are better than those
12138 that already have a matching %got() or %hi().
12139
12140 (3) later %lo()s are better than earlier %lo()s.
12141
12142 These rules are applied in order.
12143
12144 (1) means, among other things, that %lo()s with identical offsets are
12145 chosen if they exist.
12146
12147 (2) means that we won't associate several high-part relocations with
12148 the same low-part relocation unless there's no alternative. Having
12149 several high parts for the same low part is a GNU extension; this rule
12150 allows careful users to avoid it.
12151
12152 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
12153 with the last high-part relocation being at the front of the list.
12154 It therefore makes sense to choose the last matching low-part
12155 relocation, all other things being equal. It's also easier
12156 to code that way. */
12157
12158 void
12159 mips_frob_file (void)
12160 {
12161 struct mips_hi_fixup *l;
12162 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12163
12164 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12165 {
12166 segment_info_type *seginfo;
12167 bfd_boolean matched_lo_p;
12168 fixS **hi_pos, **lo_pos, **pos;
12169
12170 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12171
12172 /* If a GOT16 relocation turns out to be against a global symbol,
12173 there isn't supposed to be a matching LO. */
12174 if (got16_reloc_p (l->fixp->fx_r_type)
12175 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12176 continue;
12177
12178 /* Check quickly whether the next fixup happens to be a matching %lo. */
12179 if (fixup_has_matching_lo_p (l->fixp))
12180 continue;
12181
12182 seginfo = seg_info (l->seg);
12183
12184 /* Set HI_POS to the position of this relocation in the chain.
12185 Set LO_POS to the position of the chosen low-part relocation.
12186 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12187 relocation that matches an immediately-preceding high-part
12188 relocation. */
12189 hi_pos = NULL;
12190 lo_pos = NULL;
12191 matched_lo_p = FALSE;
12192 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12193
12194 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12195 {
12196 if (*pos == l->fixp)
12197 hi_pos = pos;
12198
12199 if ((*pos)->fx_r_type == looking_for_rtype
12200 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12201 && (*pos)->fx_offset >= l->fixp->fx_offset
12202 && (lo_pos == NULL
12203 || (*pos)->fx_offset < (*lo_pos)->fx_offset
12204 || (!matched_lo_p
12205 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12206 lo_pos = pos;
12207
12208 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12209 && fixup_has_matching_lo_p (*pos));
12210 }
12211
12212 /* If we found a match, remove the high-part relocation from its
12213 current position and insert it before the low-part relocation.
12214 Make the offsets match so that fixup_has_matching_lo_p()
12215 will return true.
12216
12217 We don't warn about unmatched high-part relocations since some
12218 versions of gcc have been known to emit dead "lui ...%hi(...)"
12219 instructions. */
12220 if (lo_pos != NULL)
12221 {
12222 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12223 if (l->fixp->fx_next != *lo_pos)
12224 {
12225 *hi_pos = l->fixp->fx_next;
12226 l->fixp->fx_next = *lo_pos;
12227 *lo_pos = l->fixp;
12228 }
12229 }
12230 }
12231 }
12232
12233 /* We may have combined relocations without symbols in the N32/N64 ABI.
12234 We have to prevent gas from dropping them. */
12235
12236 int
12237 mips_force_relocation (fixS *fixp)
12238 {
12239 if (generic_force_reloc (fixp))
12240 return 1;
12241
12242 if (HAVE_NEWABI
12243 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12244 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12245 || hi16_reloc_p (fixp->fx_r_type)
12246 || lo16_reloc_p (fixp->fx_r_type)))
12247 return 1;
12248
12249 return 0;
12250 }
12251
12252 /* Apply a fixup to the object file. */
12253
12254 void
12255 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12256 {
12257 bfd_byte *buf;
12258 long insn;
12259 reloc_howto_type *howto;
12260
12261 /* We ignore generic BFD relocations we don't know about. */
12262 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12263 if (! howto)
12264 return;
12265
12266 gas_assert (fixP->fx_size == 4
12267 || fixP->fx_r_type == BFD_RELOC_16
12268 || fixP->fx_r_type == BFD_RELOC_64
12269 || fixP->fx_r_type == BFD_RELOC_CTOR
12270 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12271 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12272 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12273 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12274
12275 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12276
12277 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12278
12279 /* Don't treat parts of a composite relocation as done. There are two
12280 reasons for this:
12281
12282 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12283 should nevertheless be emitted if the first part is.
12284
12285 (2) In normal usage, composite relocations are never assembly-time
12286 constants. The easiest way of dealing with the pathological
12287 exceptions is to generate a relocation against STN_UNDEF and
12288 leave everything up to the linker. */
12289 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12290 fixP->fx_done = 1;
12291
12292 switch (fixP->fx_r_type)
12293 {
12294 case BFD_RELOC_MIPS_TLS_GD:
12295 case BFD_RELOC_MIPS_TLS_LDM:
12296 case BFD_RELOC_MIPS_TLS_DTPREL32:
12297 case BFD_RELOC_MIPS_TLS_DTPREL64:
12298 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12299 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12300 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12301 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12302 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12303 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12304 /* fall through */
12305
12306 case BFD_RELOC_MIPS_JMP:
12307 case BFD_RELOC_MIPS_SHIFT5:
12308 case BFD_RELOC_MIPS_SHIFT6:
12309 case BFD_RELOC_MIPS_GOT_DISP:
12310 case BFD_RELOC_MIPS_GOT_PAGE:
12311 case BFD_RELOC_MIPS_GOT_OFST:
12312 case BFD_RELOC_MIPS_SUB:
12313 case BFD_RELOC_MIPS_INSERT_A:
12314 case BFD_RELOC_MIPS_INSERT_B:
12315 case BFD_RELOC_MIPS_DELETE:
12316 case BFD_RELOC_MIPS_HIGHEST:
12317 case BFD_RELOC_MIPS_HIGHER:
12318 case BFD_RELOC_MIPS_SCN_DISP:
12319 case BFD_RELOC_MIPS_REL16:
12320 case BFD_RELOC_MIPS_RELGOT:
12321 case BFD_RELOC_MIPS_JALR:
12322 case BFD_RELOC_HI16:
12323 case BFD_RELOC_HI16_S:
12324 case BFD_RELOC_GPREL16:
12325 case BFD_RELOC_MIPS_LITERAL:
12326 case BFD_RELOC_MIPS_CALL16:
12327 case BFD_RELOC_MIPS_GOT16:
12328 case BFD_RELOC_GPREL32:
12329 case BFD_RELOC_MIPS_GOT_HI16:
12330 case BFD_RELOC_MIPS_GOT_LO16:
12331 case BFD_RELOC_MIPS_CALL_HI16:
12332 case BFD_RELOC_MIPS_CALL_LO16:
12333 case BFD_RELOC_MIPS16_GPREL:
12334 case BFD_RELOC_MIPS16_GOT16:
12335 case BFD_RELOC_MIPS16_CALL16:
12336 case BFD_RELOC_MIPS16_HI16:
12337 case BFD_RELOC_MIPS16_HI16_S:
12338 case BFD_RELOC_MIPS16_JMP:
12339 /* Nothing needed to do. The value comes from the reloc entry. */
12340 break;
12341
12342 case BFD_RELOC_64:
12343 /* This is handled like BFD_RELOC_32, but we output a sign
12344 extended value if we are only 32 bits. */
12345 if (fixP->fx_done)
12346 {
12347 if (8 <= sizeof (valueT))
12348 md_number_to_chars ((char *) buf, *valP, 8);
12349 else
12350 {
12351 valueT hiv;
12352
12353 if ((*valP & 0x80000000) != 0)
12354 hiv = 0xffffffff;
12355 else
12356 hiv = 0;
12357 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12358 *valP, 4);
12359 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12360 hiv, 4);
12361 }
12362 }
12363 break;
12364
12365 case BFD_RELOC_RVA:
12366 case BFD_RELOC_32:
12367 case BFD_RELOC_16:
12368 /* If we are deleting this reloc entry, we must fill in the
12369 value now. This can happen if we have a .word which is not
12370 resolved when it appears but is later defined. */
12371 if (fixP->fx_done)
12372 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12373 break;
12374
12375 case BFD_RELOC_LO16:
12376 case BFD_RELOC_MIPS16_LO16:
12377 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12378 may be safe to remove, but if so it's not obvious. */
12379 /* When handling an embedded PIC switch statement, we can wind
12380 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12381 if (fixP->fx_done)
12382 {
12383 if (*valP + 0x8000 > 0xffff)
12384 as_bad_where (fixP->fx_file, fixP->fx_line,
12385 _("relocation overflow"));
12386 if (target_big_endian)
12387 buf += 2;
12388 md_number_to_chars ((char *) buf, *valP, 2);
12389 }
12390 break;
12391
12392 case BFD_RELOC_16_PCREL_S2:
12393 if ((*valP & 0x3) != 0)
12394 as_bad_where (fixP->fx_file, fixP->fx_line,
12395 _("Branch to misaligned address (%lx)"), (long) *valP);
12396
12397 /* We need to save the bits in the instruction since fixup_segment()
12398 might be deleting the relocation entry (i.e., a branch within
12399 the current segment). */
12400 if (! fixP->fx_done)
12401 break;
12402
12403 /* Update old instruction data. */
12404 if (target_big_endian)
12405 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12406 else
12407 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12408
12409 if (*valP + 0x20000 <= 0x3ffff)
12410 {
12411 insn |= (*valP >> 2) & 0xffff;
12412 md_number_to_chars ((char *) buf, insn, 4);
12413 }
12414 else if (mips_pic == NO_PIC
12415 && fixP->fx_done
12416 && fixP->fx_frag->fr_address >= text_section->vma
12417 && (fixP->fx_frag->fr_address
12418 < text_section->vma + bfd_get_section_size (text_section))
12419 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12420 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12421 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12422 {
12423 /* The branch offset is too large. If this is an
12424 unconditional branch, and we are not generating PIC code,
12425 we can convert it to an absolute jump instruction. */
12426 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12427 insn = 0x0c000000; /* jal */
12428 else
12429 insn = 0x08000000; /* j */
12430 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12431 fixP->fx_done = 0;
12432 fixP->fx_addsy = section_symbol (text_section);
12433 *valP += md_pcrel_from (fixP);
12434 md_number_to_chars ((char *) buf, insn, 4);
12435 }
12436 else
12437 {
12438 /* If we got here, we have branch-relaxation disabled,
12439 and there's nothing we can do to fix this instruction
12440 without turning it into a longer sequence. */
12441 as_bad_where (fixP->fx_file, fixP->fx_line,
12442 _("Branch out of range"));
12443 }
12444 break;
12445
12446 case BFD_RELOC_VTABLE_INHERIT:
12447 fixP->fx_done = 0;
12448 if (fixP->fx_addsy
12449 && !S_IS_DEFINED (fixP->fx_addsy)
12450 && !S_IS_WEAK (fixP->fx_addsy))
12451 S_SET_WEAK (fixP->fx_addsy);
12452 break;
12453
12454 case BFD_RELOC_VTABLE_ENTRY:
12455 fixP->fx_done = 0;
12456 break;
12457
12458 default:
12459 internalError ();
12460 }
12461
12462 /* Remember value for tc_gen_reloc. */
12463 fixP->fx_addnumber = *valP;
12464 }
12465
12466 static symbolS *
12467 get_symbol (void)
12468 {
12469 int c;
12470 char *name;
12471 symbolS *p;
12472
12473 name = input_line_pointer;
12474 c = get_symbol_end ();
12475 p = (symbolS *) symbol_find_or_make (name);
12476 *input_line_pointer = c;
12477 return p;
12478 }
12479
12480 /* Align the current frag to a given power of two. If a particular
12481 fill byte should be used, FILL points to an integer that contains
12482 that byte, otherwise FILL is null.
12483
12484 The MIPS assembler also automatically adjusts any preceding
12485 label. */
12486
12487 static void
12488 mips_align (int to, int *fill, symbolS *label)
12489 {
12490 mips_emit_delays ();
12491 mips_record_mips16_mode ();
12492 if (fill == NULL && subseg_text_p (now_seg))
12493 frag_align_code (to, 0);
12494 else
12495 frag_align (to, fill ? *fill : 0, 0);
12496 record_alignment (now_seg, to);
12497 if (label != NULL)
12498 {
12499 gas_assert (S_GET_SEGMENT (label) == now_seg);
12500 symbol_set_frag (label, frag_now);
12501 S_SET_VALUE (label, (valueT) frag_now_fix ());
12502 }
12503 }
12504
12505 /* Align to a given power of two. .align 0 turns off the automatic
12506 alignment used by the data creating pseudo-ops. */
12507
12508 static void
12509 s_align (int x ATTRIBUTE_UNUSED)
12510 {
12511 int temp, fill_value, *fill_ptr;
12512 long max_alignment = 28;
12513
12514 /* o Note that the assembler pulls down any immediately preceding label
12515 to the aligned address.
12516 o It's not documented but auto alignment is reinstated by
12517 a .align pseudo instruction.
12518 o Note also that after auto alignment is turned off the mips assembler
12519 issues an error on attempt to assemble an improperly aligned data item.
12520 We don't. */
12521
12522 temp = get_absolute_expression ();
12523 if (temp > max_alignment)
12524 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12525 else if (temp < 0)
12526 {
12527 as_warn (_("Alignment negative: 0 assumed."));
12528 temp = 0;
12529 }
12530 if (*input_line_pointer == ',')
12531 {
12532 ++input_line_pointer;
12533 fill_value = get_absolute_expression ();
12534 fill_ptr = &fill_value;
12535 }
12536 else
12537 fill_ptr = 0;
12538 if (temp)
12539 {
12540 segment_info_type *si = seg_info (now_seg);
12541 struct insn_label_list *l = si->label_list;
12542 /* Auto alignment should be switched on by next section change. */
12543 auto_align = 1;
12544 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12545 }
12546 else
12547 {
12548 auto_align = 0;
12549 }
12550
12551 demand_empty_rest_of_line ();
12552 }
12553
12554 static void
12555 s_change_sec (int sec)
12556 {
12557 segT seg;
12558
12559 #ifdef OBJ_ELF
12560 /* The ELF backend needs to know that we are changing sections, so
12561 that .previous works correctly. We could do something like check
12562 for an obj_section_change_hook macro, but that might be confusing
12563 as it would not be appropriate to use it in the section changing
12564 functions in read.c, since obj-elf.c intercepts those. FIXME:
12565 This should be cleaner, somehow. */
12566 if (IS_ELF)
12567 obj_elf_section_change_hook ();
12568 #endif
12569
12570 mips_emit_delays ();
12571
12572 switch (sec)
12573 {
12574 case 't':
12575 s_text (0);
12576 break;
12577 case 'd':
12578 s_data (0);
12579 break;
12580 case 'b':
12581 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12582 demand_empty_rest_of_line ();
12583 break;
12584
12585 case 'r':
12586 seg = subseg_new (RDATA_SECTION_NAME,
12587 (subsegT) get_absolute_expression ());
12588 if (IS_ELF)
12589 {
12590 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12591 | SEC_READONLY | SEC_RELOC
12592 | SEC_DATA));
12593 if (strncmp (TARGET_OS, "elf", 3) != 0)
12594 record_alignment (seg, 4);
12595 }
12596 demand_empty_rest_of_line ();
12597 break;
12598
12599 case 's':
12600 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12601 if (IS_ELF)
12602 {
12603 bfd_set_section_flags (stdoutput, seg,
12604 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12605 if (strncmp (TARGET_OS, "elf", 3) != 0)
12606 record_alignment (seg, 4);
12607 }
12608 demand_empty_rest_of_line ();
12609 break;
12610
12611 case 'B':
12612 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12613 if (IS_ELF)
12614 {
12615 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12616 if (strncmp (TARGET_OS, "elf", 3) != 0)
12617 record_alignment (seg, 4);
12618 }
12619 demand_empty_rest_of_line ();
12620 break;
12621 }
12622
12623 auto_align = 1;
12624 }
12625
12626 void
12627 s_change_section (int ignore ATTRIBUTE_UNUSED)
12628 {
12629 #ifdef OBJ_ELF
12630 char *section_name;
12631 char c;
12632 char next_c = 0;
12633 int section_type;
12634 int section_flag;
12635 int section_entry_size;
12636 int section_alignment;
12637
12638 if (!IS_ELF)
12639 return;
12640
12641 section_name = input_line_pointer;
12642 c = get_symbol_end ();
12643 if (c)
12644 next_c = *(input_line_pointer + 1);
12645
12646 /* Do we have .section Name<,"flags">? */
12647 if (c != ',' || (c == ',' && next_c == '"'))
12648 {
12649 /* just after name is now '\0'. */
12650 *input_line_pointer = c;
12651 input_line_pointer = section_name;
12652 obj_elf_section (ignore);
12653 return;
12654 }
12655 input_line_pointer++;
12656
12657 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12658 if (c == ',')
12659 section_type = get_absolute_expression ();
12660 else
12661 section_type = 0;
12662 if (*input_line_pointer++ == ',')
12663 section_flag = get_absolute_expression ();
12664 else
12665 section_flag = 0;
12666 if (*input_line_pointer++ == ',')
12667 section_entry_size = get_absolute_expression ();
12668 else
12669 section_entry_size = 0;
12670 if (*input_line_pointer++ == ',')
12671 section_alignment = get_absolute_expression ();
12672 else
12673 section_alignment = 0;
12674 /* FIXME: really ignore? */
12675 (void) section_alignment;
12676
12677 section_name = xstrdup (section_name);
12678
12679 /* When using the generic form of .section (as implemented by obj-elf.c),
12680 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12681 traditionally had to fall back on the more common @progbits instead.
12682
12683 There's nothing really harmful in this, since bfd will correct
12684 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
12685 means that, for backwards compatibility, the special_section entries
12686 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12687
12688 Even so, we shouldn't force users of the MIPS .section syntax to
12689 incorrectly label the sections as SHT_PROGBITS. The best compromise
12690 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12691 generic type-checking code. */
12692 if (section_type == SHT_MIPS_DWARF)
12693 section_type = SHT_PROGBITS;
12694
12695 obj_elf_change_section (section_name, section_type, section_flag,
12696 section_entry_size, 0, 0, 0);
12697
12698 if (now_seg->name != section_name)
12699 free (section_name);
12700 #endif /* OBJ_ELF */
12701 }
12702
12703 void
12704 mips_enable_auto_align (void)
12705 {
12706 auto_align = 1;
12707 }
12708
12709 static void
12710 s_cons (int log_size)
12711 {
12712 segment_info_type *si = seg_info (now_seg);
12713 struct insn_label_list *l = si->label_list;
12714 symbolS *label;
12715
12716 label = l != NULL ? l->label : NULL;
12717 mips_emit_delays ();
12718 if (log_size > 0 && auto_align)
12719 mips_align (log_size, 0, label);
12720 mips_clear_insn_labels ();
12721 cons (1 << log_size);
12722 }
12723
12724 static void
12725 s_float_cons (int type)
12726 {
12727 segment_info_type *si = seg_info (now_seg);
12728 struct insn_label_list *l = si->label_list;
12729 symbolS *label;
12730
12731 label = l != NULL ? l->label : NULL;
12732
12733 mips_emit_delays ();
12734
12735 if (auto_align)
12736 {
12737 if (type == 'd')
12738 mips_align (3, 0, label);
12739 else
12740 mips_align (2, 0, label);
12741 }
12742
12743 mips_clear_insn_labels ();
12744
12745 float_cons (type);
12746 }
12747
12748 /* Handle .globl. We need to override it because on Irix 5 you are
12749 permitted to say
12750 .globl foo .text
12751 where foo is an undefined symbol, to mean that foo should be
12752 considered to be the address of a function. */
12753
12754 static void
12755 s_mips_globl (int x ATTRIBUTE_UNUSED)
12756 {
12757 char *name;
12758 int c;
12759 symbolS *symbolP;
12760 flagword flag;
12761
12762 do
12763 {
12764 name = input_line_pointer;
12765 c = get_symbol_end ();
12766 symbolP = symbol_find_or_make (name);
12767 S_SET_EXTERNAL (symbolP);
12768
12769 *input_line_pointer = c;
12770 SKIP_WHITESPACE ();
12771
12772 /* On Irix 5, every global symbol that is not explicitly labelled as
12773 being a function is apparently labelled as being an object. */
12774 flag = BSF_OBJECT;
12775
12776 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12777 && (*input_line_pointer != ','))
12778 {
12779 char *secname;
12780 asection *sec;
12781
12782 secname = input_line_pointer;
12783 c = get_symbol_end ();
12784 sec = bfd_get_section_by_name (stdoutput, secname);
12785 if (sec == NULL)
12786 as_bad (_("%s: no such section"), secname);
12787 *input_line_pointer = c;
12788
12789 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12790 flag = BSF_FUNCTION;
12791 }
12792
12793 symbol_get_bfdsym (symbolP)->flags |= flag;
12794
12795 c = *input_line_pointer;
12796 if (c == ',')
12797 {
12798 input_line_pointer++;
12799 SKIP_WHITESPACE ();
12800 if (is_end_of_line[(unsigned char) *input_line_pointer])
12801 c = '\n';
12802 }
12803 }
12804 while (c == ',');
12805
12806 demand_empty_rest_of_line ();
12807 }
12808
12809 static void
12810 s_option (int x ATTRIBUTE_UNUSED)
12811 {
12812 char *opt;
12813 char c;
12814
12815 opt = input_line_pointer;
12816 c = get_symbol_end ();
12817
12818 if (*opt == 'O')
12819 {
12820 /* FIXME: What does this mean? */
12821 }
12822 else if (strncmp (opt, "pic", 3) == 0)
12823 {
12824 int i;
12825
12826 i = atoi (opt + 3);
12827 if (i == 0)
12828 mips_pic = NO_PIC;
12829 else if (i == 2)
12830 {
12831 mips_pic = SVR4_PIC;
12832 mips_abicalls = TRUE;
12833 }
12834 else
12835 as_bad (_(".option pic%d not supported"), i);
12836
12837 if (mips_pic == SVR4_PIC)
12838 {
12839 if (g_switch_seen && g_switch_value != 0)
12840 as_warn (_("-G may not be used with SVR4 PIC code"));
12841 g_switch_value = 0;
12842 bfd_set_gp_size (stdoutput, 0);
12843 }
12844 }
12845 else
12846 as_warn (_("Unrecognized option \"%s\""), opt);
12847
12848 *input_line_pointer = c;
12849 demand_empty_rest_of_line ();
12850 }
12851
12852 /* This structure is used to hold a stack of .set values. */
12853
12854 struct mips_option_stack
12855 {
12856 struct mips_option_stack *next;
12857 struct mips_set_options options;
12858 };
12859
12860 static struct mips_option_stack *mips_opts_stack;
12861
12862 /* Handle the .set pseudo-op. */
12863
12864 static void
12865 s_mipsset (int x ATTRIBUTE_UNUSED)
12866 {
12867 char *name = input_line_pointer, ch;
12868
12869 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12870 ++input_line_pointer;
12871 ch = *input_line_pointer;
12872 *input_line_pointer = '\0';
12873
12874 if (strcmp (name, "reorder") == 0)
12875 {
12876 if (mips_opts.noreorder)
12877 end_noreorder ();
12878 }
12879 else if (strcmp (name, "noreorder") == 0)
12880 {
12881 if (!mips_opts.noreorder)
12882 start_noreorder ();
12883 }
12884 else if (strncmp (name, "at=", 3) == 0)
12885 {
12886 char *s = name + 3;
12887
12888 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12889 as_bad (_("Unrecognized register name `%s'"), s);
12890 }
12891 else if (strcmp (name, "at") == 0)
12892 {
12893 mips_opts.at = ATREG;
12894 }
12895 else if (strcmp (name, "noat") == 0)
12896 {
12897 mips_opts.at = ZERO;
12898 }
12899 else if (strcmp (name, "macro") == 0)
12900 {
12901 mips_opts.warn_about_macros = 0;
12902 }
12903 else if (strcmp (name, "nomacro") == 0)
12904 {
12905 if (mips_opts.noreorder == 0)
12906 as_bad (_("`noreorder' must be set before `nomacro'"));
12907 mips_opts.warn_about_macros = 1;
12908 }
12909 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12910 {
12911 mips_opts.nomove = 0;
12912 }
12913 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12914 {
12915 mips_opts.nomove = 1;
12916 }
12917 else if (strcmp (name, "bopt") == 0)
12918 {
12919 mips_opts.nobopt = 0;
12920 }
12921 else if (strcmp (name, "nobopt") == 0)
12922 {
12923 mips_opts.nobopt = 1;
12924 }
12925 else if (strcmp (name, "gp=default") == 0)
12926 mips_opts.gp32 = file_mips_gp32;
12927 else if (strcmp (name, "gp=32") == 0)
12928 mips_opts.gp32 = 1;
12929 else if (strcmp (name, "gp=64") == 0)
12930 {
12931 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12932 as_warn (_("%s isa does not support 64-bit registers"),
12933 mips_cpu_info_from_isa (mips_opts.isa)->name);
12934 mips_opts.gp32 = 0;
12935 }
12936 else if (strcmp (name, "fp=default") == 0)
12937 mips_opts.fp32 = file_mips_fp32;
12938 else if (strcmp (name, "fp=32") == 0)
12939 mips_opts.fp32 = 1;
12940 else if (strcmp (name, "fp=64") == 0)
12941 {
12942 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12943 as_warn (_("%s isa does not support 64-bit floating point registers"),
12944 mips_cpu_info_from_isa (mips_opts.isa)->name);
12945 mips_opts.fp32 = 0;
12946 }
12947 else if (strcmp (name, "softfloat") == 0)
12948 mips_opts.soft_float = 1;
12949 else if (strcmp (name, "hardfloat") == 0)
12950 mips_opts.soft_float = 0;
12951 else if (strcmp (name, "singlefloat") == 0)
12952 mips_opts.single_float = 1;
12953 else if (strcmp (name, "doublefloat") == 0)
12954 mips_opts.single_float = 0;
12955 else if (strcmp (name, "mips16") == 0
12956 || strcmp (name, "MIPS-16") == 0)
12957 mips_opts.mips16 = 1;
12958 else if (strcmp (name, "nomips16") == 0
12959 || strcmp (name, "noMIPS-16") == 0)
12960 mips_opts.mips16 = 0;
12961 else if (strcmp (name, "smartmips") == 0)
12962 {
12963 if (!ISA_SUPPORTS_SMARTMIPS)
12964 as_warn (_("%s ISA does not support SmartMIPS ASE"),
12965 mips_cpu_info_from_isa (mips_opts.isa)->name);
12966 mips_opts.ase_smartmips = 1;
12967 }
12968 else if (strcmp (name, "nosmartmips") == 0)
12969 mips_opts.ase_smartmips = 0;
12970 else if (strcmp (name, "mips3d") == 0)
12971 mips_opts.ase_mips3d = 1;
12972 else if (strcmp (name, "nomips3d") == 0)
12973 mips_opts.ase_mips3d = 0;
12974 else if (strcmp (name, "mdmx") == 0)
12975 mips_opts.ase_mdmx = 1;
12976 else if (strcmp (name, "nomdmx") == 0)
12977 mips_opts.ase_mdmx = 0;
12978 else if (strcmp (name, "dsp") == 0)
12979 {
12980 if (!ISA_SUPPORTS_DSP_ASE)
12981 as_warn (_("%s ISA does not support DSP ASE"),
12982 mips_cpu_info_from_isa (mips_opts.isa)->name);
12983 mips_opts.ase_dsp = 1;
12984 mips_opts.ase_dspr2 = 0;
12985 }
12986 else if (strcmp (name, "nodsp") == 0)
12987 {
12988 mips_opts.ase_dsp = 0;
12989 mips_opts.ase_dspr2 = 0;
12990 }
12991 else if (strcmp (name, "dspr2") == 0)
12992 {
12993 if (!ISA_SUPPORTS_DSPR2_ASE)
12994 as_warn (_("%s ISA does not support DSP R2 ASE"),
12995 mips_cpu_info_from_isa (mips_opts.isa)->name);
12996 mips_opts.ase_dspr2 = 1;
12997 mips_opts.ase_dsp = 1;
12998 }
12999 else if (strcmp (name, "nodspr2") == 0)
13000 {
13001 mips_opts.ase_dspr2 = 0;
13002 mips_opts.ase_dsp = 0;
13003 }
13004 else if (strcmp (name, "mt") == 0)
13005 {
13006 if (!ISA_SUPPORTS_MT_ASE)
13007 as_warn (_("%s ISA does not support MT ASE"),
13008 mips_cpu_info_from_isa (mips_opts.isa)->name);
13009 mips_opts.ase_mt = 1;
13010 }
13011 else if (strcmp (name, "nomt") == 0)
13012 mips_opts.ase_mt = 0;
13013 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13014 {
13015 int reset = 0;
13016
13017 /* Permit the user to change the ISA and architecture on the fly.
13018 Needless to say, misuse can cause serious problems. */
13019 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13020 {
13021 reset = 1;
13022 mips_opts.isa = file_mips_isa;
13023 mips_opts.arch = file_mips_arch;
13024 }
13025 else if (strncmp (name, "arch=", 5) == 0)
13026 {
13027 const struct mips_cpu_info *p;
13028
13029 p = mips_parse_cpu("internal use", name + 5);
13030 if (!p)
13031 as_bad (_("unknown architecture %s"), name + 5);
13032 else
13033 {
13034 mips_opts.arch = p->cpu;
13035 mips_opts.isa = p->isa;
13036 }
13037 }
13038 else if (strncmp (name, "mips", 4) == 0)
13039 {
13040 const struct mips_cpu_info *p;
13041
13042 p = mips_parse_cpu("internal use", name);
13043 if (!p)
13044 as_bad (_("unknown ISA level %s"), name + 4);
13045 else
13046 {
13047 mips_opts.arch = p->cpu;
13048 mips_opts.isa = p->isa;
13049 }
13050 }
13051 else
13052 as_bad (_("unknown ISA or architecture %s"), name);
13053
13054 switch (mips_opts.isa)
13055 {
13056 case 0:
13057 break;
13058 case ISA_MIPS1:
13059 case ISA_MIPS2:
13060 case ISA_MIPS32:
13061 case ISA_MIPS32R2:
13062 mips_opts.gp32 = 1;
13063 mips_opts.fp32 = 1;
13064 break;
13065 case ISA_MIPS3:
13066 case ISA_MIPS4:
13067 case ISA_MIPS5:
13068 case ISA_MIPS64:
13069 case ISA_MIPS64R2:
13070 mips_opts.gp32 = 0;
13071 mips_opts.fp32 = 0;
13072 break;
13073 default:
13074 as_bad (_("unknown ISA level %s"), name + 4);
13075 break;
13076 }
13077 if (reset)
13078 {
13079 mips_opts.gp32 = file_mips_gp32;
13080 mips_opts.fp32 = file_mips_fp32;
13081 }
13082 }
13083 else if (strcmp (name, "autoextend") == 0)
13084 mips_opts.noautoextend = 0;
13085 else if (strcmp (name, "noautoextend") == 0)
13086 mips_opts.noautoextend = 1;
13087 else if (strcmp (name, "push") == 0)
13088 {
13089 struct mips_option_stack *s;
13090
13091 s = (struct mips_option_stack *) xmalloc (sizeof *s);
13092 s->next = mips_opts_stack;
13093 s->options = mips_opts;
13094 mips_opts_stack = s;
13095 }
13096 else if (strcmp (name, "pop") == 0)
13097 {
13098 struct mips_option_stack *s;
13099
13100 s = mips_opts_stack;
13101 if (s == NULL)
13102 as_bad (_(".set pop with no .set push"));
13103 else
13104 {
13105 /* If we're changing the reorder mode we need to handle
13106 delay slots correctly. */
13107 if (s->options.noreorder && ! mips_opts.noreorder)
13108 start_noreorder ();
13109 else if (! s->options.noreorder && mips_opts.noreorder)
13110 end_noreorder ();
13111
13112 mips_opts = s->options;
13113 mips_opts_stack = s->next;
13114 free (s);
13115 }
13116 }
13117 else if (strcmp (name, "sym32") == 0)
13118 mips_opts.sym32 = TRUE;
13119 else if (strcmp (name, "nosym32") == 0)
13120 mips_opts.sym32 = FALSE;
13121 else if (strchr (name, ','))
13122 {
13123 /* Generic ".set" directive; use the generic handler. */
13124 *input_line_pointer = ch;
13125 input_line_pointer = name;
13126 s_set (0);
13127 return;
13128 }
13129 else
13130 {
13131 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13132 }
13133 *input_line_pointer = ch;
13134 demand_empty_rest_of_line ();
13135 }
13136
13137 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
13138 .option pic2. It means to generate SVR4 PIC calls. */
13139
13140 static void
13141 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13142 {
13143 mips_pic = SVR4_PIC;
13144 mips_abicalls = TRUE;
13145
13146 if (g_switch_seen && g_switch_value != 0)
13147 as_warn (_("-G may not be used with SVR4 PIC code"));
13148 g_switch_value = 0;
13149
13150 bfd_set_gp_size (stdoutput, 0);
13151 demand_empty_rest_of_line ();
13152 }
13153
13154 /* Handle the .cpload pseudo-op. This is used when generating SVR4
13155 PIC code. It sets the $gp register for the function based on the
13156 function address, which is in the register named in the argument.
13157 This uses a relocation against _gp_disp, which is handled specially
13158 by the linker. The result is:
13159 lui $gp,%hi(_gp_disp)
13160 addiu $gp,$gp,%lo(_gp_disp)
13161 addu $gp,$gp,.cpload argument
13162 The .cpload argument is normally $25 == $t9.
13163
13164 The -mno-shared option changes this to:
13165 lui $gp,%hi(__gnu_local_gp)
13166 addiu $gp,$gp,%lo(__gnu_local_gp)
13167 and the argument is ignored. This saves an instruction, but the
13168 resulting code is not position independent; it uses an absolute
13169 address for __gnu_local_gp. Thus code assembled with -mno-shared
13170 can go into an ordinary executable, but not into a shared library. */
13171
13172 static void
13173 s_cpload (int ignore ATTRIBUTE_UNUSED)
13174 {
13175 expressionS ex;
13176 int reg;
13177 int in_shared;
13178
13179 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13180 .cpload is ignored. */
13181 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13182 {
13183 s_ignore (0);
13184 return;
13185 }
13186
13187 /* .cpload should be in a .set noreorder section. */
13188 if (mips_opts.noreorder == 0)
13189 as_warn (_(".cpload not in noreorder section"));
13190
13191 reg = tc_get_register (0);
13192
13193 /* If we need to produce a 64-bit address, we are better off using
13194 the default instruction sequence. */
13195 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13196
13197 ex.X_op = O_symbol;
13198 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13199 "__gnu_local_gp");
13200 ex.X_op_symbol = NULL;
13201 ex.X_add_number = 0;
13202
13203 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13204 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13205
13206 macro_start ();
13207 macro_build_lui (&ex, mips_gp_register);
13208 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13209 mips_gp_register, BFD_RELOC_LO16);
13210 if (in_shared)
13211 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13212 mips_gp_register, reg);
13213 macro_end ();
13214
13215 demand_empty_rest_of_line ();
13216 }
13217
13218 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
13219 .cpsetup $reg1, offset|$reg2, label
13220
13221 If offset is given, this results in:
13222 sd $gp, offset($sp)
13223 lui $gp, %hi(%neg(%gp_rel(label)))
13224 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13225 daddu $gp, $gp, $reg1
13226
13227 If $reg2 is given, this results in:
13228 daddu $reg2, $gp, $0
13229 lui $gp, %hi(%neg(%gp_rel(label)))
13230 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13231 daddu $gp, $gp, $reg1
13232 $reg1 is normally $25 == $t9.
13233
13234 The -mno-shared option replaces the last three instructions with
13235 lui $gp,%hi(_gp)
13236 addiu $gp,$gp,%lo(_gp) */
13237
13238 static void
13239 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13240 {
13241 expressionS ex_off;
13242 expressionS ex_sym;
13243 int reg1;
13244
13245 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13246 We also need NewABI support. */
13247 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13248 {
13249 s_ignore (0);
13250 return;
13251 }
13252
13253 reg1 = tc_get_register (0);
13254 SKIP_WHITESPACE ();
13255 if (*input_line_pointer != ',')
13256 {
13257 as_bad (_("missing argument separator ',' for .cpsetup"));
13258 return;
13259 }
13260 else
13261 ++input_line_pointer;
13262 SKIP_WHITESPACE ();
13263 if (*input_line_pointer == '$')
13264 {
13265 mips_cpreturn_register = tc_get_register (0);
13266 mips_cpreturn_offset = -1;
13267 }
13268 else
13269 {
13270 mips_cpreturn_offset = get_absolute_expression ();
13271 mips_cpreturn_register = -1;
13272 }
13273 SKIP_WHITESPACE ();
13274 if (*input_line_pointer != ',')
13275 {
13276 as_bad (_("missing argument separator ',' for .cpsetup"));
13277 return;
13278 }
13279 else
13280 ++input_line_pointer;
13281 SKIP_WHITESPACE ();
13282 expression (&ex_sym);
13283
13284 macro_start ();
13285 if (mips_cpreturn_register == -1)
13286 {
13287 ex_off.X_op = O_constant;
13288 ex_off.X_add_symbol = NULL;
13289 ex_off.X_op_symbol = NULL;
13290 ex_off.X_add_number = mips_cpreturn_offset;
13291
13292 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13293 BFD_RELOC_LO16, SP);
13294 }
13295 else
13296 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13297 mips_gp_register, 0);
13298
13299 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13300 {
13301 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13302 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13303 BFD_RELOC_HI16_S);
13304
13305 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13306 mips_gp_register, -1, BFD_RELOC_GPREL16,
13307 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13308
13309 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13310 mips_gp_register, reg1);
13311 }
13312 else
13313 {
13314 expressionS ex;
13315
13316 ex.X_op = O_symbol;
13317 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13318 ex.X_op_symbol = NULL;
13319 ex.X_add_number = 0;
13320
13321 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13322 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13323
13324 macro_build_lui (&ex, mips_gp_register);
13325 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13326 mips_gp_register, BFD_RELOC_LO16);
13327 }
13328
13329 macro_end ();
13330
13331 demand_empty_rest_of_line ();
13332 }
13333
13334 static void
13335 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13336 {
13337 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13338 .cplocal is ignored. */
13339 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13340 {
13341 s_ignore (0);
13342 return;
13343 }
13344
13345 mips_gp_register = tc_get_register (0);
13346 demand_empty_rest_of_line ();
13347 }
13348
13349 /* Handle the .cprestore pseudo-op. This stores $gp into a given
13350 offset from $sp. The offset is remembered, and after making a PIC
13351 call $gp is restored from that location. */
13352
13353 static void
13354 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13355 {
13356 expressionS ex;
13357
13358 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13359 .cprestore is ignored. */
13360 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13361 {
13362 s_ignore (0);
13363 return;
13364 }
13365
13366 mips_cprestore_offset = get_absolute_expression ();
13367 mips_cprestore_valid = 1;
13368
13369 ex.X_op = O_constant;
13370 ex.X_add_symbol = NULL;
13371 ex.X_op_symbol = NULL;
13372 ex.X_add_number = mips_cprestore_offset;
13373
13374 macro_start ();
13375 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13376 SP, HAVE_64BIT_ADDRESSES);
13377 macro_end ();
13378
13379 demand_empty_rest_of_line ();
13380 }
13381
13382 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13383 was given in the preceding .cpsetup, it results in:
13384 ld $gp, offset($sp)
13385
13386 If a register $reg2 was given there, it results in:
13387 daddu $gp, $reg2, $0 */
13388
13389 static void
13390 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13391 {
13392 expressionS ex;
13393
13394 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13395 We also need NewABI support. */
13396 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13397 {
13398 s_ignore (0);
13399 return;
13400 }
13401
13402 macro_start ();
13403 if (mips_cpreturn_register == -1)
13404 {
13405 ex.X_op = O_constant;
13406 ex.X_add_symbol = NULL;
13407 ex.X_op_symbol = NULL;
13408 ex.X_add_number = mips_cpreturn_offset;
13409
13410 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13411 }
13412 else
13413 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13414 mips_cpreturn_register, 0);
13415 macro_end ();
13416
13417 demand_empty_rest_of_line ();
13418 }
13419
13420 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13421 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13422 use in DWARF debug information. */
13423
13424 static void
13425 s_dtprel_internal (size_t bytes)
13426 {
13427 expressionS ex;
13428 char *p;
13429
13430 expression (&ex);
13431
13432 if (ex.X_op != O_symbol)
13433 {
13434 as_bad (_("Unsupported use of %s"), (bytes == 8
13435 ? ".dtpreldword"
13436 : ".dtprelword"));
13437 ignore_rest_of_line ();
13438 }
13439
13440 p = frag_more (bytes);
13441 md_number_to_chars (p, 0, bytes);
13442 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13443 (bytes == 8
13444 ? BFD_RELOC_MIPS_TLS_DTPREL64
13445 : BFD_RELOC_MIPS_TLS_DTPREL32));
13446
13447 demand_empty_rest_of_line ();
13448 }
13449
13450 /* Handle .dtprelword. */
13451
13452 static void
13453 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13454 {
13455 s_dtprel_internal (4);
13456 }
13457
13458 /* Handle .dtpreldword. */
13459
13460 static void
13461 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13462 {
13463 s_dtprel_internal (8);
13464 }
13465
13466 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13467 code. It sets the offset to use in gp_rel relocations. */
13468
13469 static void
13470 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13471 {
13472 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13473 We also need NewABI support. */
13474 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13475 {
13476 s_ignore (0);
13477 return;
13478 }
13479
13480 mips_gprel_offset = get_absolute_expression ();
13481
13482 demand_empty_rest_of_line ();
13483 }
13484
13485 /* Handle the .gpword pseudo-op. This is used when generating PIC
13486 code. It generates a 32 bit GP relative reloc. */
13487
13488 static void
13489 s_gpword (int ignore ATTRIBUTE_UNUSED)
13490 {
13491 segment_info_type *si;
13492 struct insn_label_list *l;
13493 symbolS *label;
13494 expressionS ex;
13495 char *p;
13496
13497 /* When not generating PIC code, this is treated as .word. */
13498 if (mips_pic != SVR4_PIC)
13499 {
13500 s_cons (2);
13501 return;
13502 }
13503
13504 si = seg_info (now_seg);
13505 l = si->label_list;
13506 label = l != NULL ? l->label : NULL;
13507 mips_emit_delays ();
13508 if (auto_align)
13509 mips_align (2, 0, label);
13510 mips_clear_insn_labels ();
13511
13512 expression (&ex);
13513
13514 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13515 {
13516 as_bad (_("Unsupported use of .gpword"));
13517 ignore_rest_of_line ();
13518 }
13519
13520 p = frag_more (4);
13521 md_number_to_chars (p, 0, 4);
13522 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13523 BFD_RELOC_GPREL32);
13524
13525 demand_empty_rest_of_line ();
13526 }
13527
13528 static void
13529 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13530 {
13531 segment_info_type *si;
13532 struct insn_label_list *l;
13533 symbolS *label;
13534 expressionS ex;
13535 char *p;
13536
13537 /* When not generating PIC code, this is treated as .dword. */
13538 if (mips_pic != SVR4_PIC)
13539 {
13540 s_cons (3);
13541 return;
13542 }
13543
13544 si = seg_info (now_seg);
13545 l = si->label_list;
13546 label = l != NULL ? l->label : NULL;
13547 mips_emit_delays ();
13548 if (auto_align)
13549 mips_align (3, 0, label);
13550 mips_clear_insn_labels ();
13551
13552 expression (&ex);
13553
13554 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13555 {
13556 as_bad (_("Unsupported use of .gpdword"));
13557 ignore_rest_of_line ();
13558 }
13559
13560 p = frag_more (8);
13561 md_number_to_chars (p, 0, 8);
13562 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13563 BFD_RELOC_GPREL32)->fx_tcbit = 1;
13564
13565 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13566 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13567 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13568
13569 demand_empty_rest_of_line ();
13570 }
13571
13572 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13573 tables in SVR4 PIC code. */
13574
13575 static void
13576 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13577 {
13578 int reg;
13579
13580 /* This is ignored when not generating SVR4 PIC code. */
13581 if (mips_pic != SVR4_PIC)
13582 {
13583 s_ignore (0);
13584 return;
13585 }
13586
13587 /* Add $gp to the register named as an argument. */
13588 macro_start ();
13589 reg = tc_get_register (0);
13590 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13591 macro_end ();
13592
13593 demand_empty_rest_of_line ();
13594 }
13595
13596 /* Handle the .insn pseudo-op. This marks instruction labels in
13597 mips16 mode. This permits the linker to handle them specially,
13598 such as generating jalx instructions when needed. We also make
13599 them odd for the duration of the assembly, in order to generate the
13600 right sort of code. We will make them even in the adjust_symtab
13601 routine, while leaving them marked. This is convenient for the
13602 debugger and the disassembler. The linker knows to make them odd
13603 again. */
13604
13605 static void
13606 s_insn (int ignore ATTRIBUTE_UNUSED)
13607 {
13608 mips16_mark_labels ();
13609
13610 demand_empty_rest_of_line ();
13611 }
13612
13613 /* Handle a .stabn directive. We need these in order to mark a label
13614 as being a mips16 text label correctly. Sometimes the compiler
13615 will emit a label, followed by a .stabn, and then switch sections.
13616 If the label and .stabn are in mips16 mode, then the label is
13617 really a mips16 text label. */
13618
13619 static void
13620 s_mips_stab (int type)
13621 {
13622 if (type == 'n')
13623 mips16_mark_labels ();
13624
13625 s_stab (type);
13626 }
13627
13628 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13629
13630 static void
13631 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13632 {
13633 char *name;
13634 int c;
13635 symbolS *symbolP;
13636 expressionS exp;
13637
13638 name = input_line_pointer;
13639 c = get_symbol_end ();
13640 symbolP = symbol_find_or_make (name);
13641 S_SET_WEAK (symbolP);
13642 *input_line_pointer = c;
13643
13644 SKIP_WHITESPACE ();
13645
13646 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13647 {
13648 if (S_IS_DEFINED (symbolP))
13649 {
13650 as_bad (_("ignoring attempt to redefine symbol %s"),
13651 S_GET_NAME (symbolP));
13652 ignore_rest_of_line ();
13653 return;
13654 }
13655
13656 if (*input_line_pointer == ',')
13657 {
13658 ++input_line_pointer;
13659 SKIP_WHITESPACE ();
13660 }
13661
13662 expression (&exp);
13663 if (exp.X_op != O_symbol)
13664 {
13665 as_bad (_("bad .weakext directive"));
13666 ignore_rest_of_line ();
13667 return;
13668 }
13669 symbol_set_value_expression (symbolP, &exp);
13670 }
13671
13672 demand_empty_rest_of_line ();
13673 }
13674
13675 /* Parse a register string into a number. Called from the ECOFF code
13676 to parse .frame. The argument is non-zero if this is the frame
13677 register, so that we can record it in mips_frame_reg. */
13678
13679 int
13680 tc_get_register (int frame)
13681 {
13682 unsigned int reg;
13683
13684 SKIP_WHITESPACE ();
13685 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13686 reg = 0;
13687 if (frame)
13688 {
13689 mips_frame_reg = reg != 0 ? reg : SP;
13690 mips_frame_reg_valid = 1;
13691 mips_cprestore_valid = 0;
13692 }
13693 return reg;
13694 }
13695
13696 valueT
13697 md_section_align (asection *seg, valueT addr)
13698 {
13699 int align = bfd_get_section_alignment (stdoutput, seg);
13700
13701 if (IS_ELF)
13702 {
13703 /* We don't need to align ELF sections to the full alignment.
13704 However, Irix 5 may prefer that we align them at least to a 16
13705 byte boundary. We don't bother to align the sections if we
13706 are targeted for an embedded system. */
13707 if (strncmp (TARGET_OS, "elf", 3) == 0)
13708 return addr;
13709 if (align > 4)
13710 align = 4;
13711 }
13712
13713 return ((addr + (1 << align) - 1) & (-1 << align));
13714 }
13715
13716 /* Utility routine, called from above as well. If called while the
13717 input file is still being read, it's only an approximation. (For
13718 example, a symbol may later become defined which appeared to be
13719 undefined earlier.) */
13720
13721 static int
13722 nopic_need_relax (symbolS *sym, int before_relaxing)
13723 {
13724 if (sym == 0)
13725 return 0;
13726
13727 if (g_switch_value > 0)
13728 {
13729 const char *symname;
13730 int change;
13731
13732 /* Find out whether this symbol can be referenced off the $gp
13733 register. It can be if it is smaller than the -G size or if
13734 it is in the .sdata or .sbss section. Certain symbols can
13735 not be referenced off the $gp, although it appears as though
13736 they can. */
13737 symname = S_GET_NAME (sym);
13738 if (symname != (const char *) NULL
13739 && (strcmp (symname, "eprol") == 0
13740 || strcmp (symname, "etext") == 0
13741 || strcmp (symname, "_gp") == 0
13742 || strcmp (symname, "edata") == 0
13743 || strcmp (symname, "_fbss") == 0
13744 || strcmp (symname, "_fdata") == 0
13745 || strcmp (symname, "_ftext") == 0
13746 || strcmp (symname, "end") == 0
13747 || strcmp (symname, "_gp_disp") == 0))
13748 change = 1;
13749 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13750 && (0
13751 #ifndef NO_ECOFF_DEBUGGING
13752 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13753 && (symbol_get_obj (sym)->ecoff_extern_size
13754 <= g_switch_value))
13755 #endif
13756 /* We must defer this decision until after the whole
13757 file has been read, since there might be a .extern
13758 after the first use of this symbol. */
13759 || (before_relaxing
13760 #ifndef NO_ECOFF_DEBUGGING
13761 && symbol_get_obj (sym)->ecoff_extern_size == 0
13762 #endif
13763 && S_GET_VALUE (sym) == 0)
13764 || (S_GET_VALUE (sym) != 0
13765 && S_GET_VALUE (sym) <= g_switch_value)))
13766 change = 0;
13767 else
13768 {
13769 const char *segname;
13770
13771 segname = segment_name (S_GET_SEGMENT (sym));
13772 gas_assert (strcmp (segname, ".lit8") != 0
13773 && strcmp (segname, ".lit4") != 0);
13774 change = (strcmp (segname, ".sdata") != 0
13775 && strcmp (segname, ".sbss") != 0
13776 && strncmp (segname, ".sdata.", 7) != 0
13777 && strncmp (segname, ".sbss.", 6) != 0
13778 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13779 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13780 }
13781 return change;
13782 }
13783 else
13784 /* We are not optimizing for the $gp register. */
13785 return 1;
13786 }
13787
13788
13789 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13790
13791 static bfd_boolean
13792 pic_need_relax (symbolS *sym, asection *segtype)
13793 {
13794 asection *symsec;
13795
13796 /* Handle the case of a symbol equated to another symbol. */
13797 while (symbol_equated_reloc_p (sym))
13798 {
13799 symbolS *n;
13800
13801 /* It's possible to get a loop here in a badly written program. */
13802 n = symbol_get_value_expression (sym)->X_add_symbol;
13803 if (n == sym)
13804 break;
13805 sym = n;
13806 }
13807
13808 if (symbol_section_p (sym))
13809 return TRUE;
13810
13811 symsec = S_GET_SEGMENT (sym);
13812
13813 /* This must duplicate the test in adjust_reloc_syms. */
13814 return (symsec != &bfd_und_section
13815 && symsec != &bfd_abs_section
13816 && !bfd_is_com_section (symsec)
13817 && !s_is_linkonce (sym, segtype)
13818 #ifdef OBJ_ELF
13819 /* A global or weak symbol is treated as external. */
13820 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13821 #endif
13822 );
13823 }
13824
13825
13826 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13827 extended opcode. SEC is the section the frag is in. */
13828
13829 static int
13830 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13831 {
13832 int type;
13833 const struct mips16_immed_operand *op;
13834 offsetT val;
13835 int mintiny, maxtiny;
13836 segT symsec;
13837 fragS *sym_frag;
13838
13839 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13840 return 0;
13841 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13842 return 1;
13843
13844 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13845 op = mips16_immed_operands;
13846 while (op->type != type)
13847 {
13848 ++op;
13849 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13850 }
13851
13852 if (op->unsp)
13853 {
13854 if (type == '<' || type == '>' || type == '[' || type == ']')
13855 {
13856 mintiny = 1;
13857 maxtiny = 1 << op->nbits;
13858 }
13859 else
13860 {
13861 mintiny = 0;
13862 maxtiny = (1 << op->nbits) - 1;
13863 }
13864 }
13865 else
13866 {
13867 mintiny = - (1 << (op->nbits - 1));
13868 maxtiny = (1 << (op->nbits - 1)) - 1;
13869 }
13870
13871 sym_frag = symbol_get_frag (fragp->fr_symbol);
13872 val = S_GET_VALUE (fragp->fr_symbol);
13873 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13874
13875 if (op->pcrel)
13876 {
13877 addressT addr;
13878
13879 /* We won't have the section when we are called from
13880 mips_relax_frag. However, we will always have been called
13881 from md_estimate_size_before_relax first. If this is a
13882 branch to a different section, we mark it as such. If SEC is
13883 NULL, and the frag is not marked, then it must be a branch to
13884 the same section. */
13885 if (sec == NULL)
13886 {
13887 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13888 return 1;
13889 }
13890 else
13891 {
13892 /* Must have been called from md_estimate_size_before_relax. */
13893 if (symsec != sec)
13894 {
13895 fragp->fr_subtype =
13896 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13897
13898 /* FIXME: We should support this, and let the linker
13899 catch branches and loads that are out of range. */
13900 as_bad_where (fragp->fr_file, fragp->fr_line,
13901 _("unsupported PC relative reference to different section"));
13902
13903 return 1;
13904 }
13905 if (fragp != sym_frag && sym_frag->fr_address == 0)
13906 /* Assume non-extended on the first relaxation pass.
13907 The address we have calculated will be bogus if this is
13908 a forward branch to another frag, as the forward frag
13909 will have fr_address == 0. */
13910 return 0;
13911 }
13912
13913 /* In this case, we know for sure that the symbol fragment is in
13914 the same section. If the relax_marker of the symbol fragment
13915 differs from the relax_marker of this fragment, we have not
13916 yet adjusted the symbol fragment fr_address. We want to add
13917 in STRETCH in order to get a better estimate of the address.
13918 This particularly matters because of the shift bits. */
13919 if (stretch != 0
13920 && sym_frag->relax_marker != fragp->relax_marker)
13921 {
13922 fragS *f;
13923
13924 /* Adjust stretch for any alignment frag. Note that if have
13925 been expanding the earlier code, the symbol may be
13926 defined in what appears to be an earlier frag. FIXME:
13927 This doesn't handle the fr_subtype field, which specifies
13928 a maximum number of bytes to skip when doing an
13929 alignment. */
13930 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13931 {
13932 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13933 {
13934 if (stretch < 0)
13935 stretch = - ((- stretch)
13936 & ~ ((1 << (int) f->fr_offset) - 1));
13937 else
13938 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13939 if (stretch == 0)
13940 break;
13941 }
13942 }
13943 if (f != NULL)
13944 val += stretch;
13945 }
13946
13947 addr = fragp->fr_address + fragp->fr_fix;
13948
13949 /* The base address rules are complicated. The base address of
13950 a branch is the following instruction. The base address of a
13951 PC relative load or add is the instruction itself, but if it
13952 is in a delay slot (in which case it can not be extended) use
13953 the address of the instruction whose delay slot it is in. */
13954 if (type == 'p' || type == 'q')
13955 {
13956 addr += 2;
13957
13958 /* If we are currently assuming that this frag should be
13959 extended, then, the current address is two bytes
13960 higher. */
13961 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13962 addr += 2;
13963
13964 /* Ignore the low bit in the target, since it will be set
13965 for a text label. */
13966 if ((val & 1) != 0)
13967 --val;
13968 }
13969 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13970 addr -= 4;
13971 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13972 addr -= 2;
13973
13974 val -= addr & ~ ((1 << op->shift) - 1);
13975
13976 /* Branch offsets have an implicit 0 in the lowest bit. */
13977 if (type == 'p' || type == 'q')
13978 val /= 2;
13979
13980 /* If any of the shifted bits are set, we must use an extended
13981 opcode. If the address depends on the size of this
13982 instruction, this can lead to a loop, so we arrange to always
13983 use an extended opcode. We only check this when we are in
13984 the main relaxation loop, when SEC is NULL. */
13985 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13986 {
13987 fragp->fr_subtype =
13988 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13989 return 1;
13990 }
13991
13992 /* If we are about to mark a frag as extended because the value
13993 is precisely maxtiny + 1, then there is a chance of an
13994 infinite loop as in the following code:
13995 la $4,foo
13996 .skip 1020
13997 .align 2
13998 foo:
13999 In this case when the la is extended, foo is 0x3fc bytes
14000 away, so the la can be shrunk, but then foo is 0x400 away, so
14001 the la must be extended. To avoid this loop, we mark the
14002 frag as extended if it was small, and is about to become
14003 extended with a value of maxtiny + 1. */
14004 if (val == ((maxtiny + 1) << op->shift)
14005 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14006 && sec == NULL)
14007 {
14008 fragp->fr_subtype =
14009 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14010 return 1;
14011 }
14012 }
14013 else if (symsec != absolute_section && sec != NULL)
14014 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14015
14016 if ((val & ((1 << op->shift) - 1)) != 0
14017 || val < (mintiny << op->shift)
14018 || val > (maxtiny << op->shift))
14019 return 1;
14020 else
14021 return 0;
14022 }
14023
14024 /* Compute the length of a branch sequence, and adjust the
14025 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
14026 worst-case length is computed, with UPDATE being used to indicate
14027 whether an unconditional (-1), branch-likely (+1) or regular (0)
14028 branch is to be computed. */
14029 static int
14030 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14031 {
14032 bfd_boolean toofar;
14033 int length;
14034
14035 if (fragp
14036 && S_IS_DEFINED (fragp->fr_symbol)
14037 && sec == S_GET_SEGMENT (fragp->fr_symbol))
14038 {
14039 addressT addr;
14040 offsetT val;
14041
14042 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14043
14044 addr = fragp->fr_address + fragp->fr_fix + 4;
14045
14046 val -= addr;
14047
14048 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14049 }
14050 else if (fragp)
14051 /* If the symbol is not defined or it's in a different segment,
14052 assume the user knows what's going on and emit a short
14053 branch. */
14054 toofar = FALSE;
14055 else
14056 toofar = TRUE;
14057
14058 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14059 fragp->fr_subtype
14060 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14061 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14062 RELAX_BRANCH_LINK (fragp->fr_subtype),
14063 toofar);
14064
14065 length = 4;
14066 if (toofar)
14067 {
14068 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14069 length += 8;
14070
14071 if (mips_pic != NO_PIC)
14072 {
14073 /* Additional space for PIC loading of target address. */
14074 length += 8;
14075 if (mips_opts.isa == ISA_MIPS1)
14076 /* Additional space for $at-stabilizing nop. */
14077 length += 4;
14078 }
14079
14080 /* If branch is conditional. */
14081 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14082 length += 8;
14083 }
14084
14085 return length;
14086 }
14087
14088 /* Estimate the size of a frag before relaxing. Unless this is the
14089 mips16, we are not really relaxing here, and the final size is
14090 encoded in the subtype information. For the mips16, we have to
14091 decide whether we are using an extended opcode or not. */
14092
14093 int
14094 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14095 {
14096 int change;
14097
14098 if (RELAX_BRANCH_P (fragp->fr_subtype))
14099 {
14100
14101 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14102
14103 return fragp->fr_var;
14104 }
14105
14106 if (RELAX_MIPS16_P (fragp->fr_subtype))
14107 /* We don't want to modify the EXTENDED bit here; it might get us
14108 into infinite loops. We change it only in mips_relax_frag(). */
14109 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14110
14111 if (mips_pic == NO_PIC)
14112 change = nopic_need_relax (fragp->fr_symbol, 0);
14113 else if (mips_pic == SVR4_PIC)
14114 change = pic_need_relax (fragp->fr_symbol, segtype);
14115 else if (mips_pic == VXWORKS_PIC)
14116 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
14117 change = 0;
14118 else
14119 abort ();
14120
14121 if (change)
14122 {
14123 fragp->fr_subtype |= RELAX_USE_SECOND;
14124 return -RELAX_FIRST (fragp->fr_subtype);
14125 }
14126 else
14127 return -RELAX_SECOND (fragp->fr_subtype);
14128 }
14129
14130 /* This is called to see whether a reloc against a defined symbol
14131 should be converted into a reloc against a section. */
14132
14133 int
14134 mips_fix_adjustable (fixS *fixp)
14135 {
14136 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14137 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14138 return 0;
14139
14140 if (fixp->fx_addsy == NULL)
14141 return 1;
14142
14143 /* If symbol SYM is in a mergeable section, relocations of the form
14144 SYM + 0 can usually be made section-relative. The mergeable data
14145 is then identified by the section offset rather than by the symbol.
14146
14147 However, if we're generating REL LO16 relocations, the offset is split
14148 between the LO16 and parterning high part relocation. The linker will
14149 need to recalculate the complete offset in order to correctly identify
14150 the merge data.
14151
14152 The linker has traditionally not looked for the parterning high part
14153 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14154 placed anywhere. Rather than break backwards compatibility by changing
14155 this, it seems better not to force the issue, and instead keep the
14156 original symbol. This will work with either linker behavior. */
14157 if ((lo16_reloc_p (fixp->fx_r_type)
14158 || reloc_needs_lo_p (fixp->fx_r_type))
14159 && HAVE_IN_PLACE_ADDENDS
14160 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14161 return 0;
14162
14163 /* There is no place to store an in-place offset for JALR relocations. */
14164 if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14165 return 0;
14166
14167 #ifdef OBJ_ELF
14168 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14169 to a floating-point stub. The same is true for non-R_MIPS16_26
14170 relocations against MIPS16 functions; in this case, the stub becomes
14171 the function's canonical address.
14172
14173 Floating-point stubs are stored in unique .mips16.call.* or
14174 .mips16.fn.* sections. If a stub T for function F is in section S,
14175 the first relocation in section S must be against F; this is how the
14176 linker determines the target function. All relocations that might
14177 resolve to T must also be against F. We therefore have the following
14178 restrictions, which are given in an intentionally-redundant way:
14179
14180 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14181 symbols.
14182
14183 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14184 if that stub might be used.
14185
14186 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14187 symbols.
14188
14189 4. We cannot reduce a stub's relocations against MIPS16 symbols if
14190 that stub might be used.
14191
14192 There is a further restriction:
14193
14194 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14195 on targets with in-place addends; the relocation field cannot
14196 encode the low bit.
14197
14198 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14199 against a MIPS16 symbol.
14200
14201 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14202 relocation against some symbol R, no relocation against R may be
14203 reduced. (Note that this deals with (2) as well as (1) because
14204 relocations against global symbols will never be reduced on ELF
14205 targets.) This approach is a little simpler than trying to detect
14206 stub sections, and gives the "all or nothing" per-symbol consistency
14207 that we have for MIPS16 symbols. */
14208 if (IS_ELF
14209 && fixp->fx_subsy == NULL
14210 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14211 || *symbol_get_tc (fixp->fx_addsy)))
14212 return 0;
14213 #endif
14214
14215 return 1;
14216 }
14217
14218 /* Translate internal representation of relocation info to BFD target
14219 format. */
14220
14221 arelent **
14222 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14223 {
14224 static arelent *retval[4];
14225 arelent *reloc;
14226 bfd_reloc_code_real_type code;
14227
14228 memset (retval, 0, sizeof(retval));
14229 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14230 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14231 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14232 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14233
14234 if (fixp->fx_pcrel)
14235 {
14236 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14237
14238 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14239 Relocations want only the symbol offset. */
14240 reloc->addend = fixp->fx_addnumber + reloc->address;
14241 if (!IS_ELF)
14242 {
14243 /* A gruesome hack which is a result of the gruesome gas
14244 reloc handling. What's worse, for COFF (as opposed to
14245 ECOFF), we might need yet another copy of reloc->address.
14246 See bfd_install_relocation. */
14247 reloc->addend += reloc->address;
14248 }
14249 }
14250 else
14251 reloc->addend = fixp->fx_addnumber;
14252
14253 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14254 entry to be used in the relocation's section offset. */
14255 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14256 {
14257 reloc->address = reloc->addend;
14258 reloc->addend = 0;
14259 }
14260
14261 code = fixp->fx_r_type;
14262
14263 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14264 if (reloc->howto == NULL)
14265 {
14266 as_bad_where (fixp->fx_file, fixp->fx_line,
14267 _("Can not represent %s relocation in this object file format"),
14268 bfd_get_reloc_code_name (code));
14269 retval[0] = NULL;
14270 }
14271
14272 return retval;
14273 }
14274
14275 /* Relax a machine dependent frag. This returns the amount by which
14276 the current size of the frag should change. */
14277
14278 int
14279 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14280 {
14281 if (RELAX_BRANCH_P (fragp->fr_subtype))
14282 {
14283 offsetT old_var = fragp->fr_var;
14284
14285 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14286
14287 return fragp->fr_var - old_var;
14288 }
14289
14290 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14291 return 0;
14292
14293 if (mips16_extended_frag (fragp, NULL, stretch))
14294 {
14295 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14296 return 0;
14297 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14298 return 2;
14299 }
14300 else
14301 {
14302 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14303 return 0;
14304 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14305 return -2;
14306 }
14307
14308 return 0;
14309 }
14310
14311 /* Convert a machine dependent frag. */
14312
14313 void
14314 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14315 {
14316 if (RELAX_BRANCH_P (fragp->fr_subtype))
14317 {
14318 bfd_byte *buf;
14319 unsigned long insn;
14320 expressionS exp;
14321 fixS *fixp;
14322
14323 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14324
14325 if (target_big_endian)
14326 insn = bfd_getb32 (buf);
14327 else
14328 insn = bfd_getl32 (buf);
14329
14330 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14331 {
14332 /* We generate a fixup instead of applying it right now
14333 because, if there are linker relaxations, we're going to
14334 need the relocations. */
14335 exp.X_op = O_symbol;
14336 exp.X_add_symbol = fragp->fr_symbol;
14337 exp.X_add_number = fragp->fr_offset;
14338
14339 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14340 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14341 fixp->fx_file = fragp->fr_file;
14342 fixp->fx_line = fragp->fr_line;
14343
14344 md_number_to_chars ((char *) buf, insn, 4);
14345 buf += 4;
14346 }
14347 else
14348 {
14349 int i;
14350
14351 as_warn_where (fragp->fr_file, fragp->fr_line,
14352 _("relaxed out-of-range branch into a jump"));
14353
14354 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14355 goto uncond;
14356
14357 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14358 {
14359 /* Reverse the branch. */
14360 switch ((insn >> 28) & 0xf)
14361 {
14362 case 4:
14363 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14364 have the condition reversed by tweaking a single
14365 bit, and their opcodes all have 0x4???????. */
14366 gas_assert ((insn & 0xf1000000) == 0x41000000);
14367 insn ^= 0x00010000;
14368 break;
14369
14370 case 0:
14371 /* bltz 0x04000000 bgez 0x04010000
14372 bltzal 0x04100000 bgezal 0x04110000 */
14373 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14374 insn ^= 0x00010000;
14375 break;
14376
14377 case 1:
14378 /* beq 0x10000000 bne 0x14000000
14379 blez 0x18000000 bgtz 0x1c000000 */
14380 insn ^= 0x04000000;
14381 break;
14382
14383 default:
14384 abort ();
14385 }
14386 }
14387
14388 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14389 {
14390 /* Clear the and-link bit. */
14391 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14392
14393 /* bltzal 0x04100000 bgezal 0x04110000
14394 bltzall 0x04120000 bgezall 0x04130000 */
14395 insn &= ~0x00100000;
14396 }
14397
14398 /* Branch over the branch (if the branch was likely) or the
14399 full jump (not likely case). Compute the offset from the
14400 current instruction to branch to. */
14401 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14402 i = 16;
14403 else
14404 {
14405 /* How many bytes in instructions we've already emitted? */
14406 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14407 /* How many bytes in instructions from here to the end? */
14408 i = fragp->fr_var - i;
14409 }
14410 /* Convert to instruction count. */
14411 i >>= 2;
14412 /* Branch counts from the next instruction. */
14413 i--;
14414 insn |= i;
14415 /* Branch over the jump. */
14416 md_number_to_chars ((char *) buf, insn, 4);
14417 buf += 4;
14418
14419 /* nop */
14420 md_number_to_chars ((char *) buf, 0, 4);
14421 buf += 4;
14422
14423 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14424 {
14425 /* beql $0, $0, 2f */
14426 insn = 0x50000000;
14427 /* Compute the PC offset from the current instruction to
14428 the end of the variable frag. */
14429 /* How many bytes in instructions we've already emitted? */
14430 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14431 /* How many bytes in instructions from here to the end? */
14432 i = fragp->fr_var - i;
14433 /* Convert to instruction count. */
14434 i >>= 2;
14435 /* Don't decrement i, because we want to branch over the
14436 delay slot. */
14437
14438 insn |= i;
14439 md_number_to_chars ((char *) buf, insn, 4);
14440 buf += 4;
14441
14442 md_number_to_chars ((char *) buf, 0, 4);
14443 buf += 4;
14444 }
14445
14446 uncond:
14447 if (mips_pic == NO_PIC)
14448 {
14449 /* j or jal. */
14450 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14451 ? 0x0c000000 : 0x08000000);
14452 exp.X_op = O_symbol;
14453 exp.X_add_symbol = fragp->fr_symbol;
14454 exp.X_add_number = fragp->fr_offset;
14455
14456 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14457 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14458 fixp->fx_file = fragp->fr_file;
14459 fixp->fx_line = fragp->fr_line;
14460
14461 md_number_to_chars ((char *) buf, insn, 4);
14462 buf += 4;
14463 }
14464 else
14465 {
14466 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14467 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14468 exp.X_op = O_symbol;
14469 exp.X_add_symbol = fragp->fr_symbol;
14470 exp.X_add_number = fragp->fr_offset;
14471
14472 if (fragp->fr_offset)
14473 {
14474 exp.X_add_symbol = make_expr_symbol (&exp);
14475 exp.X_add_number = 0;
14476 }
14477
14478 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14479 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14480 fixp->fx_file = fragp->fr_file;
14481 fixp->fx_line = fragp->fr_line;
14482
14483 md_number_to_chars ((char *) buf, insn, 4);
14484 buf += 4;
14485
14486 if (mips_opts.isa == ISA_MIPS1)
14487 {
14488 /* nop */
14489 md_number_to_chars ((char *) buf, 0, 4);
14490 buf += 4;
14491 }
14492
14493 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14494 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14495
14496 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14497 4, &exp, FALSE, BFD_RELOC_LO16);
14498 fixp->fx_file = fragp->fr_file;
14499 fixp->fx_line = fragp->fr_line;
14500
14501 md_number_to_chars ((char *) buf, insn, 4);
14502 buf += 4;
14503
14504 /* j(al)r $at. */
14505 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14506 insn = 0x0020f809;
14507 else
14508 insn = 0x00200008;
14509
14510 md_number_to_chars ((char *) buf, insn, 4);
14511 buf += 4;
14512 }
14513 }
14514
14515 gas_assert (buf == (bfd_byte *)fragp->fr_literal
14516 + fragp->fr_fix + fragp->fr_var);
14517
14518 fragp->fr_fix += fragp->fr_var;
14519
14520 return;
14521 }
14522
14523 if (RELAX_MIPS16_P (fragp->fr_subtype))
14524 {
14525 int type;
14526 const struct mips16_immed_operand *op;
14527 bfd_boolean small, ext;
14528 offsetT val;
14529 bfd_byte *buf;
14530 unsigned long insn;
14531 bfd_boolean use_extend;
14532 unsigned short extend;
14533
14534 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14535 op = mips16_immed_operands;
14536 while (op->type != type)
14537 ++op;
14538
14539 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14540 {
14541 small = FALSE;
14542 ext = TRUE;
14543 }
14544 else
14545 {
14546 small = TRUE;
14547 ext = FALSE;
14548 }
14549
14550 val = resolve_symbol_value (fragp->fr_symbol);
14551 if (op->pcrel)
14552 {
14553 addressT addr;
14554
14555 addr = fragp->fr_address + fragp->fr_fix;
14556
14557 /* The rules for the base address of a PC relative reloc are
14558 complicated; see mips16_extended_frag. */
14559 if (type == 'p' || type == 'q')
14560 {
14561 addr += 2;
14562 if (ext)
14563 addr += 2;
14564 /* Ignore the low bit in the target, since it will be
14565 set for a text label. */
14566 if ((val & 1) != 0)
14567 --val;
14568 }
14569 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14570 addr -= 4;
14571 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14572 addr -= 2;
14573
14574 addr &= ~ (addressT) ((1 << op->shift) - 1);
14575 val -= addr;
14576
14577 /* Make sure the section winds up with the alignment we have
14578 assumed. */
14579 if (op->shift > 0)
14580 record_alignment (asec, op->shift);
14581 }
14582
14583 if (ext
14584 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14585 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14586 as_warn_where (fragp->fr_file, fragp->fr_line,
14587 _("extended instruction in delay slot"));
14588
14589 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14590
14591 if (target_big_endian)
14592 insn = bfd_getb16 (buf);
14593 else
14594 insn = bfd_getl16 (buf);
14595
14596 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14597 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14598 small, ext, &insn, &use_extend, &extend);
14599
14600 if (use_extend)
14601 {
14602 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14603 fragp->fr_fix += 2;
14604 buf += 2;
14605 }
14606
14607 md_number_to_chars ((char *) buf, insn, 2);
14608 fragp->fr_fix += 2;
14609 buf += 2;
14610 }
14611 else
14612 {
14613 int first, second;
14614 fixS *fixp;
14615
14616 first = RELAX_FIRST (fragp->fr_subtype);
14617 second = RELAX_SECOND (fragp->fr_subtype);
14618 fixp = (fixS *) fragp->fr_opcode;
14619
14620 /* Possibly emit a warning if we've chosen the longer option. */
14621 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14622 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14623 {
14624 const char *msg = macro_warning (fragp->fr_subtype);
14625 if (msg != 0)
14626 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14627 }
14628
14629 /* Go through all the fixups for the first sequence. Disable them
14630 (by marking them as done) if we're going to use the second
14631 sequence instead. */
14632 while (fixp
14633 && fixp->fx_frag == fragp
14634 && fixp->fx_where < fragp->fr_fix - second)
14635 {
14636 if (fragp->fr_subtype & RELAX_USE_SECOND)
14637 fixp->fx_done = 1;
14638 fixp = fixp->fx_next;
14639 }
14640
14641 /* Go through the fixups for the second sequence. Disable them if
14642 we're going to use the first sequence, otherwise adjust their
14643 addresses to account for the relaxation. */
14644 while (fixp && fixp->fx_frag == fragp)
14645 {
14646 if (fragp->fr_subtype & RELAX_USE_SECOND)
14647 fixp->fx_where -= first;
14648 else
14649 fixp->fx_done = 1;
14650 fixp = fixp->fx_next;
14651 }
14652
14653 /* Now modify the frag contents. */
14654 if (fragp->fr_subtype & RELAX_USE_SECOND)
14655 {
14656 char *start;
14657
14658 start = fragp->fr_literal + fragp->fr_fix - first - second;
14659 memmove (start, start + first, second);
14660 fragp->fr_fix -= first;
14661 }
14662 else
14663 fragp->fr_fix -= second;
14664 }
14665 }
14666
14667 #ifdef OBJ_ELF
14668
14669 /* This function is called after the relocs have been generated.
14670 We've been storing mips16 text labels as odd. Here we convert them
14671 back to even for the convenience of the debugger. */
14672
14673 void
14674 mips_frob_file_after_relocs (void)
14675 {
14676 asymbol **syms;
14677 unsigned int count, i;
14678
14679 if (!IS_ELF)
14680 return;
14681
14682 syms = bfd_get_outsymbols (stdoutput);
14683 count = bfd_get_symcount (stdoutput);
14684 for (i = 0; i < count; i++, syms++)
14685 {
14686 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14687 && ((*syms)->value & 1) != 0)
14688 {
14689 (*syms)->value &= ~1;
14690 /* If the symbol has an odd size, it was probably computed
14691 incorrectly, so adjust that as well. */
14692 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14693 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14694 }
14695 }
14696 }
14697
14698 #endif
14699
14700 /* This function is called whenever a label is defined. It is used
14701 when handling branch delays; if a branch has a label, we assume we
14702 can not move it. */
14703
14704 void
14705 mips_define_label (symbolS *sym)
14706 {
14707 segment_info_type *si = seg_info (now_seg);
14708 struct insn_label_list *l;
14709
14710 if (free_insn_labels == NULL)
14711 l = (struct insn_label_list *) xmalloc (sizeof *l);
14712 else
14713 {
14714 l = free_insn_labels;
14715 free_insn_labels = l->next;
14716 }
14717
14718 l->label = sym;
14719 l->next = si->label_list;
14720 si->label_list = l;
14721
14722 #ifdef OBJ_ELF
14723 dwarf2_emit_label (sym);
14724 #endif
14725 }
14726 \f
14727 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14728
14729 /* Some special processing for a MIPS ELF file. */
14730
14731 void
14732 mips_elf_final_processing (void)
14733 {
14734 /* Write out the register information. */
14735 if (mips_abi != N64_ABI)
14736 {
14737 Elf32_RegInfo s;
14738
14739 s.ri_gprmask = mips_gprmask;
14740 s.ri_cprmask[0] = mips_cprmask[0];
14741 s.ri_cprmask[1] = mips_cprmask[1];
14742 s.ri_cprmask[2] = mips_cprmask[2];
14743 s.ri_cprmask[3] = mips_cprmask[3];
14744 /* The gp_value field is set by the MIPS ELF backend. */
14745
14746 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14747 ((Elf32_External_RegInfo *)
14748 mips_regmask_frag));
14749 }
14750 else
14751 {
14752 Elf64_Internal_RegInfo s;
14753
14754 s.ri_gprmask = mips_gprmask;
14755 s.ri_pad = 0;
14756 s.ri_cprmask[0] = mips_cprmask[0];
14757 s.ri_cprmask[1] = mips_cprmask[1];
14758 s.ri_cprmask[2] = mips_cprmask[2];
14759 s.ri_cprmask[3] = mips_cprmask[3];
14760 /* The gp_value field is set by the MIPS ELF backend. */
14761
14762 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14763 ((Elf64_External_RegInfo *)
14764 mips_regmask_frag));
14765 }
14766
14767 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14768 sort of BFD interface for this. */
14769 if (mips_any_noreorder)
14770 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14771 if (mips_pic != NO_PIC)
14772 {
14773 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14774 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14775 }
14776 if (mips_abicalls)
14777 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14778
14779 /* Set MIPS ELF flags for ASEs. */
14780 /* We may need to define a new flag for DSP ASE, and set this flag when
14781 file_ase_dsp is true. */
14782 /* Same for DSP R2. */
14783 /* We may need to define a new flag for MT ASE, and set this flag when
14784 file_ase_mt is true. */
14785 if (file_ase_mips16)
14786 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14787 #if 0 /* XXX FIXME */
14788 if (file_ase_mips3d)
14789 elf_elfheader (stdoutput)->e_flags |= ???;
14790 #endif
14791 if (file_ase_mdmx)
14792 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14793
14794 /* Set the MIPS ELF ABI flags. */
14795 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14796 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14797 else if (mips_abi == O64_ABI)
14798 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14799 else if (mips_abi == EABI_ABI)
14800 {
14801 if (!file_mips_gp32)
14802 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14803 else
14804 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14805 }
14806 else if (mips_abi == N32_ABI)
14807 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14808
14809 /* Nothing to do for N64_ABI. */
14810
14811 if (mips_32bitmode)
14812 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14813
14814 #if 0 /* XXX FIXME */
14815 /* 32 bit code with 64 bit FP registers. */
14816 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14817 elf_elfheader (stdoutput)->e_flags |= ???;
14818 #endif
14819 }
14820
14821 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14822 \f
14823 typedef struct proc {
14824 symbolS *func_sym;
14825 symbolS *func_end_sym;
14826 unsigned long reg_mask;
14827 unsigned long reg_offset;
14828 unsigned long fpreg_mask;
14829 unsigned long fpreg_offset;
14830 unsigned long frame_offset;
14831 unsigned long frame_reg;
14832 unsigned long pc_reg;
14833 } procS;
14834
14835 static procS cur_proc;
14836 static procS *cur_proc_ptr;
14837 static int numprocs;
14838
14839 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
14840 nop as "0". */
14841
14842 char
14843 mips_nop_opcode (void)
14844 {
14845 return seg_info (now_seg)->tc_segment_info_data.mips16;
14846 }
14847
14848 /* Fill in an rs_align_code fragment. This only needs to do something
14849 for MIPS16 code, where 0 is not a nop. */
14850
14851 void
14852 mips_handle_align (fragS *fragp)
14853 {
14854 char *p;
14855 int bytes, size, excess;
14856 valueT opcode;
14857
14858 if (fragp->fr_type != rs_align_code)
14859 return;
14860
14861 p = fragp->fr_literal + fragp->fr_fix;
14862 if (*p)
14863 {
14864 opcode = mips16_nop_insn.insn_opcode;
14865 size = 2;
14866 }
14867 else
14868 {
14869 opcode = nop_insn.insn_opcode;
14870 size = 4;
14871 }
14872
14873 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14874 excess = bytes % size;
14875 if (excess != 0)
14876 {
14877 /* If we're not inserting a whole number of instructions,
14878 pad the end of the fixed part of the frag with zeros. */
14879 memset (p, 0, excess);
14880 p += excess;
14881 fragp->fr_fix += excess;
14882 }
14883
14884 md_number_to_chars (p, opcode, size);
14885 fragp->fr_var = size;
14886 }
14887
14888 static void
14889 md_obj_begin (void)
14890 {
14891 }
14892
14893 static void
14894 md_obj_end (void)
14895 {
14896 /* Check for premature end, nesting errors, etc. */
14897 if (cur_proc_ptr)
14898 as_warn (_("missing .end at end of assembly"));
14899 }
14900
14901 static long
14902 get_number (void)
14903 {
14904 int negative = 0;
14905 long val = 0;
14906
14907 if (*input_line_pointer == '-')
14908 {
14909 ++input_line_pointer;
14910 negative = 1;
14911 }
14912 if (!ISDIGIT (*input_line_pointer))
14913 as_bad (_("expected simple number"));
14914 if (input_line_pointer[0] == '0')
14915 {
14916 if (input_line_pointer[1] == 'x')
14917 {
14918 input_line_pointer += 2;
14919 while (ISXDIGIT (*input_line_pointer))
14920 {
14921 val <<= 4;
14922 val |= hex_value (*input_line_pointer++);
14923 }
14924 return negative ? -val : val;
14925 }
14926 else
14927 {
14928 ++input_line_pointer;
14929 while (ISDIGIT (*input_line_pointer))
14930 {
14931 val <<= 3;
14932 val |= *input_line_pointer++ - '0';
14933 }
14934 return negative ? -val : val;
14935 }
14936 }
14937 if (!ISDIGIT (*input_line_pointer))
14938 {
14939 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14940 *input_line_pointer, *input_line_pointer);
14941 as_warn (_("invalid number"));
14942 return -1;
14943 }
14944 while (ISDIGIT (*input_line_pointer))
14945 {
14946 val *= 10;
14947 val += *input_line_pointer++ - '0';
14948 }
14949 return negative ? -val : val;
14950 }
14951
14952 /* The .file directive; just like the usual .file directive, but there
14953 is an initial number which is the ECOFF file index. In the non-ECOFF
14954 case .file implies DWARF-2. */
14955
14956 static void
14957 s_mips_file (int x ATTRIBUTE_UNUSED)
14958 {
14959 static int first_file_directive = 0;
14960
14961 if (ECOFF_DEBUGGING)
14962 {
14963 get_number ();
14964 s_app_file (0);
14965 }
14966 else
14967 {
14968 char *filename;
14969
14970 filename = dwarf2_directive_file (0);
14971
14972 /* Versions of GCC up to 3.1 start files with a ".file"
14973 directive even for stabs output. Make sure that this
14974 ".file" is handled. Note that you need a version of GCC
14975 after 3.1 in order to support DWARF-2 on MIPS. */
14976 if (filename != NULL && ! first_file_directive)
14977 {
14978 (void) new_logical_line (filename, -1);
14979 s_app_file_string (filename, 0);
14980 }
14981 first_file_directive = 1;
14982 }
14983 }
14984
14985 /* The .loc directive, implying DWARF-2. */
14986
14987 static void
14988 s_mips_loc (int x ATTRIBUTE_UNUSED)
14989 {
14990 if (!ECOFF_DEBUGGING)
14991 dwarf2_directive_loc (0);
14992 }
14993
14994 /* The .end directive. */
14995
14996 static void
14997 s_mips_end (int x ATTRIBUTE_UNUSED)
14998 {
14999 symbolS *p;
15000
15001 /* Following functions need their own .frame and .cprestore directives. */
15002 mips_frame_reg_valid = 0;
15003 mips_cprestore_valid = 0;
15004
15005 if (!is_end_of_line[(unsigned char) *input_line_pointer])
15006 {
15007 p = get_symbol ();
15008 demand_empty_rest_of_line ();
15009 }
15010 else
15011 p = NULL;
15012
15013 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15014 as_warn (_(".end not in text section"));
15015
15016 if (!cur_proc_ptr)
15017 {
15018 as_warn (_(".end directive without a preceding .ent directive."));
15019 demand_empty_rest_of_line ();
15020 return;
15021 }
15022
15023 if (p != NULL)
15024 {
15025 gas_assert (S_GET_NAME (p));
15026 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15027 as_warn (_(".end symbol does not match .ent symbol."));
15028
15029 if (debug_type == DEBUG_STABS)
15030 stabs_generate_asm_endfunc (S_GET_NAME (p),
15031 S_GET_NAME (p));
15032 }
15033 else
15034 as_warn (_(".end directive missing or unknown symbol"));
15035
15036 #ifdef OBJ_ELF
15037 /* Create an expression to calculate the size of the function. */
15038 if (p && cur_proc_ptr)
15039 {
15040 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15041 expressionS *exp = xmalloc (sizeof (expressionS));
15042
15043 obj->size = exp;
15044 exp->X_op = O_subtract;
15045 exp->X_add_symbol = symbol_temp_new_now ();
15046 exp->X_op_symbol = p;
15047 exp->X_add_number = 0;
15048
15049 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15050 }
15051
15052 /* Generate a .pdr section. */
15053 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15054 {
15055 segT saved_seg = now_seg;
15056 subsegT saved_subseg = now_subseg;
15057 expressionS exp;
15058 char *fragp;
15059
15060 #ifdef md_flush_pending_output
15061 md_flush_pending_output ();
15062 #endif
15063
15064 gas_assert (pdr_seg);
15065 subseg_set (pdr_seg, 0);
15066
15067 /* Write the symbol. */
15068 exp.X_op = O_symbol;
15069 exp.X_add_symbol = p;
15070 exp.X_add_number = 0;
15071 emit_expr (&exp, 4);
15072
15073 fragp = frag_more (7 * 4);
15074
15075 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15076 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15077 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15078 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15079 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15080 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15081 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15082
15083 subseg_set (saved_seg, saved_subseg);
15084 }
15085 #endif /* OBJ_ELF */
15086
15087 cur_proc_ptr = NULL;
15088 }
15089
15090 /* The .aent and .ent directives. */
15091
15092 static void
15093 s_mips_ent (int aent)
15094 {
15095 symbolS *symbolP;
15096
15097 symbolP = get_symbol ();
15098 if (*input_line_pointer == ',')
15099 ++input_line_pointer;
15100 SKIP_WHITESPACE ();
15101 if (ISDIGIT (*input_line_pointer)
15102 || *input_line_pointer == '-')
15103 get_number ();
15104
15105 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15106 as_warn (_(".ent or .aent not in text section."));
15107
15108 if (!aent && cur_proc_ptr)
15109 as_warn (_("missing .end"));
15110
15111 if (!aent)
15112 {
15113 /* This function needs its own .frame and .cprestore directives. */
15114 mips_frame_reg_valid = 0;
15115 mips_cprestore_valid = 0;
15116
15117 cur_proc_ptr = &cur_proc;
15118 memset (cur_proc_ptr, '\0', sizeof (procS));
15119
15120 cur_proc_ptr->func_sym = symbolP;
15121
15122 ++numprocs;
15123
15124 if (debug_type == DEBUG_STABS)
15125 stabs_generate_asm_func (S_GET_NAME (symbolP),
15126 S_GET_NAME (symbolP));
15127 }
15128
15129 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15130
15131 demand_empty_rest_of_line ();
15132 }
15133
15134 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15135 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15136 s_mips_frame is used so that we can set the PDR information correctly.
15137 We can't use the ecoff routines because they make reference to the ecoff
15138 symbol table (in the mdebug section). */
15139
15140 static void
15141 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15142 {
15143 #ifdef OBJ_ELF
15144 if (IS_ELF && !ECOFF_DEBUGGING)
15145 {
15146 long val;
15147
15148 if (cur_proc_ptr == (procS *) NULL)
15149 {
15150 as_warn (_(".frame outside of .ent"));
15151 demand_empty_rest_of_line ();
15152 return;
15153 }
15154
15155 cur_proc_ptr->frame_reg = tc_get_register (1);
15156
15157 SKIP_WHITESPACE ();
15158 if (*input_line_pointer++ != ','
15159 || get_absolute_expression_and_terminator (&val) != ',')
15160 {
15161 as_warn (_("Bad .frame directive"));
15162 --input_line_pointer;
15163 demand_empty_rest_of_line ();
15164 return;
15165 }
15166
15167 cur_proc_ptr->frame_offset = val;
15168 cur_proc_ptr->pc_reg = tc_get_register (0);
15169
15170 demand_empty_rest_of_line ();
15171 }
15172 else
15173 #endif /* OBJ_ELF */
15174 s_ignore (ignore);
15175 }
15176
15177 /* The .fmask and .mask directives. If the mdebug section is present
15178 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15179 embedded targets, s_mips_mask is used so that we can set the PDR
15180 information correctly. We can't use the ecoff routines because they
15181 make reference to the ecoff symbol table (in the mdebug section). */
15182
15183 static void
15184 s_mips_mask (int reg_type)
15185 {
15186 #ifdef OBJ_ELF
15187 if (IS_ELF && !ECOFF_DEBUGGING)
15188 {
15189 long mask, off;
15190
15191 if (cur_proc_ptr == (procS *) NULL)
15192 {
15193 as_warn (_(".mask/.fmask outside of .ent"));
15194 demand_empty_rest_of_line ();
15195 return;
15196 }
15197
15198 if (get_absolute_expression_and_terminator (&mask) != ',')
15199 {
15200 as_warn (_("Bad .mask/.fmask directive"));
15201 --input_line_pointer;
15202 demand_empty_rest_of_line ();
15203 return;
15204 }
15205
15206 off = get_absolute_expression ();
15207
15208 if (reg_type == 'F')
15209 {
15210 cur_proc_ptr->fpreg_mask = mask;
15211 cur_proc_ptr->fpreg_offset = off;
15212 }
15213 else
15214 {
15215 cur_proc_ptr->reg_mask = mask;
15216 cur_proc_ptr->reg_offset = off;
15217 }
15218
15219 demand_empty_rest_of_line ();
15220 }
15221 else
15222 #endif /* OBJ_ELF */
15223 s_ignore (reg_type);
15224 }
15225
15226 /* A table describing all the processors gas knows about. Names are
15227 matched in the order listed.
15228
15229 To ease comparison, please keep this table in the same order as
15230 gcc's mips_cpu_info_table[]. */
15231 static const struct mips_cpu_info mips_cpu_info_table[] =
15232 {
15233 /* Entries for generic ISAs */
15234 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
15235 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
15236 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
15237 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
15238 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
15239 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15240 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15241 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15242 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
15243
15244 /* MIPS I */
15245 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15246 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15247 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
15248
15249 /* MIPS II */
15250 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
15251
15252 /* MIPS III */
15253 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15254 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15255 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15256 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15257 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15258 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15259 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15260 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15261 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15262 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15263 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15264 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
15265 /* ST Microelectronics Loongson 2E and 2F cores */
15266 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15267 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
15268
15269 /* MIPS IV */
15270 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15271 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15272 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
15273 { "r14000", 0, ISA_MIPS4, CPU_R14000 },
15274 { "r16000", 0, ISA_MIPS4, CPU_R16000 },
15275 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15276 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15277 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15278 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15279 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15280 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15281 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15282 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15283 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15284 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
15285
15286 /* MIPS 32 */
15287 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15288 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15289 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15290 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15291
15292 /* MIPS 32 Release 2 */
15293 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15294 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15295 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15296 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15297 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15298 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15299 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15300 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15301 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15302 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15303 /* Deprecated forms of the above. */
15304 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15305 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15306 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
15307 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15308 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15309 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15310 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15311 /* Deprecated forms of the above. */
15312 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15313 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15314 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
15315 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15316 ISA_MIPS32R2, CPU_MIPS32R2 },
15317 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15318 ISA_MIPS32R2, CPU_MIPS32R2 },
15319 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15320 ISA_MIPS32R2, CPU_MIPS32R2 },
15321 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15322 ISA_MIPS32R2, CPU_MIPS32R2 },
15323 /* Deprecated forms of the above. */
15324 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15325 ISA_MIPS32R2, CPU_MIPS32R2 },
15326 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15327 ISA_MIPS32R2, CPU_MIPS32R2 },
15328 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15329 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15330 ISA_MIPS32R2, CPU_MIPS32R2 },
15331 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15332 ISA_MIPS32R2, CPU_MIPS32R2 },
15333 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15334 ISA_MIPS32R2, CPU_MIPS32R2 },
15335 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15336 ISA_MIPS32R2, CPU_MIPS32R2 },
15337 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15338 ISA_MIPS32R2, CPU_MIPS32R2 },
15339 /* Deprecated forms of the above. */
15340 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15341 ISA_MIPS32R2, CPU_MIPS32R2 },
15342 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15343 ISA_MIPS32R2, CPU_MIPS32R2 },
15344 /* 1004K cores are multiprocessor versions of the 34K. */
15345 { "1004kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15346 ISA_MIPS32R2, CPU_MIPS32R2 },
15347 { "1004kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15348 ISA_MIPS32R2, CPU_MIPS32R2 },
15349 { "1004kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15350 ISA_MIPS32R2, CPU_MIPS32R2 },
15351 { "1004kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15352 ISA_MIPS32R2, CPU_MIPS32R2 },
15353
15354 /* MIPS 64 */
15355 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15356 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15357 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15358 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15359
15360 /* Broadcom SB-1 CPU core */
15361 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15362 ISA_MIPS64, CPU_SB1 },
15363 /* Broadcom SB-1A CPU core */
15364 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15365 ISA_MIPS64, CPU_SB1 },
15366
15367 { "loongson3a", 0, ISA_MIPS64, CPU_LOONGSON_3A },
15368
15369 /* MIPS 64 Release 2 */
15370
15371 /* Cavium Networks Octeon CPU core */
15372 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15373
15374 /* RMI Xlr */
15375 { "xlr", 0, ISA_MIPS64, CPU_XLR },
15376
15377 /* End marker */
15378 { NULL, 0, 0, 0 }
15379 };
15380
15381
15382 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15383 with a final "000" replaced by "k". Ignore case.
15384
15385 Note: this function is shared between GCC and GAS. */
15386
15387 static bfd_boolean
15388 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15389 {
15390 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15391 given++, canonical++;
15392
15393 return ((*given == 0 && *canonical == 0)
15394 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15395 }
15396
15397
15398 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15399 CPU name. We've traditionally allowed a lot of variation here.
15400
15401 Note: this function is shared between GCC and GAS. */
15402
15403 static bfd_boolean
15404 mips_matching_cpu_name_p (const char *canonical, const char *given)
15405 {
15406 /* First see if the name matches exactly, or with a final "000"
15407 turned into "k". */
15408 if (mips_strict_matching_cpu_name_p (canonical, given))
15409 return TRUE;
15410
15411 /* If not, try comparing based on numerical designation alone.
15412 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15413 if (TOLOWER (*given) == 'r')
15414 given++;
15415 if (!ISDIGIT (*given))
15416 return FALSE;
15417
15418 /* Skip over some well-known prefixes in the canonical name,
15419 hoping to find a number there too. */
15420 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15421 canonical += 2;
15422 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15423 canonical += 2;
15424 else if (TOLOWER (canonical[0]) == 'r')
15425 canonical += 1;
15426
15427 return mips_strict_matching_cpu_name_p (canonical, given);
15428 }
15429
15430
15431 /* Parse an option that takes the name of a processor as its argument.
15432 OPTION is the name of the option and CPU_STRING is the argument.
15433 Return the corresponding processor enumeration if the CPU_STRING is
15434 recognized, otherwise report an error and return null.
15435
15436 A similar function exists in GCC. */
15437
15438 static const struct mips_cpu_info *
15439 mips_parse_cpu (const char *option, const char *cpu_string)
15440 {
15441 const struct mips_cpu_info *p;
15442
15443 /* 'from-abi' selects the most compatible architecture for the given
15444 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15445 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15446 version. Look first at the -mgp options, if given, otherwise base
15447 the choice on MIPS_DEFAULT_64BIT.
15448
15449 Treat NO_ABI like the EABIs. One reason to do this is that the
15450 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15451 architecture. This code picks MIPS I for 'mips' and MIPS III for
15452 'mips64', just as we did in the days before 'from-abi'. */
15453 if (strcasecmp (cpu_string, "from-abi") == 0)
15454 {
15455 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15456 return mips_cpu_info_from_isa (ISA_MIPS1);
15457
15458 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15459 return mips_cpu_info_from_isa (ISA_MIPS3);
15460
15461 if (file_mips_gp32 >= 0)
15462 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15463
15464 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15465 ? ISA_MIPS3
15466 : ISA_MIPS1);
15467 }
15468
15469 /* 'default' has traditionally been a no-op. Probably not very useful. */
15470 if (strcasecmp (cpu_string, "default") == 0)
15471 return 0;
15472
15473 for (p = mips_cpu_info_table; p->name != 0; p++)
15474 if (mips_matching_cpu_name_p (p->name, cpu_string))
15475 return p;
15476
15477 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15478 return 0;
15479 }
15480
15481 /* Return the canonical processor information for ISA (a member of the
15482 ISA_MIPS* enumeration). */
15483
15484 static const struct mips_cpu_info *
15485 mips_cpu_info_from_isa (int isa)
15486 {
15487 int i;
15488
15489 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15490 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15491 && isa == mips_cpu_info_table[i].isa)
15492 return (&mips_cpu_info_table[i]);
15493
15494 return NULL;
15495 }
15496
15497 static const struct mips_cpu_info *
15498 mips_cpu_info_from_arch (int arch)
15499 {
15500 int i;
15501
15502 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15503 if (arch == mips_cpu_info_table[i].cpu)
15504 return (&mips_cpu_info_table[i]);
15505
15506 return NULL;
15507 }
15508 \f
15509 static void
15510 show (FILE *stream, const char *string, int *col_p, int *first_p)
15511 {
15512 if (*first_p)
15513 {
15514 fprintf (stream, "%24s", "");
15515 *col_p = 24;
15516 }
15517 else
15518 {
15519 fprintf (stream, ", ");
15520 *col_p += 2;
15521 }
15522
15523 if (*col_p + strlen (string) > 72)
15524 {
15525 fprintf (stream, "\n%24s", "");
15526 *col_p = 24;
15527 }
15528
15529 fprintf (stream, "%s", string);
15530 *col_p += strlen (string);
15531
15532 *first_p = 0;
15533 }
15534
15535 void
15536 md_show_usage (FILE *stream)
15537 {
15538 int column, first;
15539 size_t i;
15540
15541 fprintf (stream, _("\
15542 MIPS options:\n\
15543 -EB generate big endian output\n\
15544 -EL generate little endian output\n\
15545 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15546 -G NUM allow referencing objects up to NUM bytes\n\
15547 implicitly with the gp register [default 8]\n"));
15548 fprintf (stream, _("\
15549 -mips1 generate MIPS ISA I instructions\n\
15550 -mips2 generate MIPS ISA II instructions\n\
15551 -mips3 generate MIPS ISA III instructions\n\
15552 -mips4 generate MIPS ISA IV instructions\n\
15553 -mips5 generate MIPS ISA V instructions\n\
15554 -mips32 generate MIPS32 ISA instructions\n\
15555 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15556 -mips64 generate MIPS64 ISA instructions\n\
15557 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
15558 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15559
15560 first = 1;
15561
15562 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15563 show (stream, mips_cpu_info_table[i].name, &column, &first);
15564 show (stream, "from-abi", &column, &first);
15565 fputc ('\n', stream);
15566
15567 fprintf (stream, _("\
15568 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15569 -no-mCPU don't generate code specific to CPU.\n\
15570 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15571
15572 first = 1;
15573
15574 show (stream, "3900", &column, &first);
15575 show (stream, "4010", &column, &first);
15576 show (stream, "4100", &column, &first);
15577 show (stream, "4650", &column, &first);
15578 fputc ('\n', stream);
15579
15580 fprintf (stream, _("\
15581 -mips16 generate mips16 instructions\n\
15582 -no-mips16 do not generate mips16 instructions\n"));
15583 fprintf (stream, _("\
15584 -msmartmips generate smartmips instructions\n\
15585 -mno-smartmips do not generate smartmips instructions\n"));
15586 fprintf (stream, _("\
15587 -mdsp generate DSP instructions\n\
15588 -mno-dsp do not generate DSP instructions\n"));
15589 fprintf (stream, _("\
15590 -mdspr2 generate DSP R2 instructions\n\
15591 -mno-dspr2 do not generate DSP R2 instructions\n"));
15592 fprintf (stream, _("\
15593 -mmt generate MT instructions\n\
15594 -mno-mt do not generate MT instructions\n"));
15595 fprintf (stream, _("\
15596 -mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
15597 -mfix-loongson2f-nop work around Loongson2F NOP errata\n\
15598 -mfix-vr4120 work around certain VR4120 errata\n\
15599 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
15600 -mfix-24k insert a nop after ERET and DERET instructions\n\
15601 -mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
15602 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15603 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15604 -msym32 assume all symbols have 32-bit values\n\
15605 -O0 remove unneeded NOPs, do not swap branches\n\
15606 -O remove unneeded NOPs and swap branches\n\
15607 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15608 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15609 fprintf (stream, _("\
15610 -mhard-float allow floating-point instructions\n\
15611 -msoft-float do not allow floating-point instructions\n\
15612 -msingle-float only allow 32-bit floating-point operations\n\
15613 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15614 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15615 ));
15616 #ifdef OBJ_ELF
15617 fprintf (stream, _("\
15618 -KPIC, -call_shared generate SVR4 position independent code\n\
15619 -call_nonpic generate non-PIC code that can operate with DSOs\n\
15620 -mvxworks-pic generate VxWorks position independent code\n\
15621 -non_shared do not generate code that can operate with DSOs\n\
15622 -xgot assume a 32 bit GOT\n\
15623 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
15624 -mshared, -mno-shared disable/enable .cpload optimization for\n\
15625 position dependent (non shared) code\n\
15626 -mabi=ABI create ABI conformant object file for:\n"));
15627
15628 first = 1;
15629
15630 show (stream, "32", &column, &first);
15631 show (stream, "o64", &column, &first);
15632 show (stream, "n32", &column, &first);
15633 show (stream, "64", &column, &first);
15634 show (stream, "eabi", &column, &first);
15635
15636 fputc ('\n', stream);
15637
15638 fprintf (stream, _("\
15639 -32 create o32 ABI object file (default)\n\
15640 -n32 create n32 ABI object file\n\
15641 -64 create 64 ABI object file\n"));
15642 #endif
15643 }
15644
15645 #ifdef TE_IRIX
15646 enum dwarf2_format
15647 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15648 {
15649 if (HAVE_64BIT_SYMBOLS)
15650 return dwarf2_format_64bit_irix;
15651 else
15652 return dwarf2_format_32bit;
15653 }
15654 #endif
15655
15656 int
15657 mips_dwarf2_addr_size (void)
15658 {
15659 if (HAVE_64BIT_OBJECTS)
15660 return 8;
15661 else
15662 return 4;
15663 }
15664
15665 /* Standard calling conventions leave the CFA at SP on entry. */
15666 void
15667 mips_cfi_frame_initial_instructions (void)
15668 {
15669 cfi_add_CFA_def_cfa_register (SP);
15670 }
15671
15672 int
15673 tc_mips_regname_to_dw2regnum (char *regname)
15674 {
15675 unsigned int regnum = -1;
15676 unsigned int reg;
15677
15678 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15679 regnum = reg;
15680
15681 return regnum;
15682 }
This page took 0.362566 seconds and 5 git commands to generate.