* dwarf2dbg.c: Remove superfluous forward function declarations.
[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 Free Software Foundation, Inc.
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3, or (at your option)
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
41
42 #ifdef OBJ_MAYBE_ELF
43 /* Clean up namespace so we can include obj-elf.h too. */
44 static int mips_output_flavor (void);
45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46 #undef OBJ_PROCESS_STAB
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
58
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about. */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
64
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
68
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
73
74 int mips_flag_mdebug = -1;
75
76 /* Control generation of .pdr sections. Off by default on IRIX: the native
77 linker doesn't know about and discards them, but relocations against them
78 remain, leading to rld crashes. */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
84
85 #include "ecoff.h"
86
87 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88 static char *mips_regmask_frag;
89 #endif
90
91 #define ZERO 0
92 #define ATREG 1
93 #define TREG 24
94 #define PIC_CALL_REG 25
95 #define KT0 26
96 #define KT1 27
97 #define GP 28
98 #define SP 29
99 #define FP 30
100 #define RA 31
101
102 #define ILLEGAL_REG (32)
103
104 #define AT mips_opts.at
105
106 /* Allow override of standard little-endian ECOFF format. */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section. */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116 ? ".rdata" \
117 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118 ? ".rdata" \
119 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120 ? ".rodata" \
121 : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124 and fixups. */
125 struct mips_cl_insn
126 {
127 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
128 const struct mips_opcode *insn_mo;
129
130 /* True if this is a mips16 instruction and if we want the extended
131 form of INSN_MO. */
132 bfd_boolean use_extend;
133
134 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
135 unsigned short extend;
136
137 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
138 a copy of INSN_MO->match with the operands filled in. */
139 unsigned long insn_opcode;
140
141 /* The frag that contains the instruction. */
142 struct frag *frag;
143
144 /* The offset into FRAG of the first instruction byte. */
145 long where;
146
147 /* The relocs associated with the instruction, if any. */
148 fixS *fixp[3];
149
150 /* True if this entry cannot be moved from its current position. */
151 unsigned int fixed_p : 1;
152
153 /* True if this instruction occurred in a .set noreorder block. */
154 unsigned int noreorder_p : 1;
155
156 /* True for mips16 instructions that jump to an absolute address. */
157 unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use. */
161 enum mips_abi_level
162 {
163 NO_ABI = 0,
164 O32_ABI,
165 O64_ABI,
166 N32_ABI,
167 N64_ABI,
168 EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file. */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code. */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178 library. */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182 pseudo-op. We use a struct so that .set push and .set pop are more
183 reliable. */
184
185 struct mips_set_options
186 {
187 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
188 if it has not been initialized. Changed by `.set mipsN', and the
189 -mipsN command line option, and the default CPU. */
190 int isa;
191 /* Enabled Application Specific Extensions (ASEs). These are set to -1
192 if they have not been initialized. Changed by `.set <asename>', by
193 command line options, and based on the default architecture. */
194 int ase_mips3d;
195 int ase_mdmx;
196 int ase_smartmips;
197 int ase_dsp;
198 int ase_dspr2;
199 int ase_mt;
200 /* Whether we are assembling for the mips16 processor. 0 if we are
201 not, 1 if we are, and -1 if the value has not been initialized.
202 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203 -nomips16 command line options, and the default CPU. */
204 int mips16;
205 /* Non-zero if we should not reorder instructions. Changed by `.set
206 reorder' and `.set noreorder'. */
207 int noreorder;
208 /* Non-zero if we should not permit the register designated "assembler
209 temporary" to be used in instructions. The value is the register
210 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
211 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
212 unsigned int at;
213 /* Non-zero if we should warn when a macro instruction expands into
214 more than one machine instruction. Changed by `.set nomacro' and
215 `.set macro'. */
216 int warn_about_macros;
217 /* Non-zero if we should not move instructions. Changed by `.set
218 move', `.set volatile', `.set nomove', and `.set novolatile'. */
219 int nomove;
220 /* Non-zero if we should not optimize branches by moving the target
221 of the branch into the delay slot. Actually, we don't perform
222 this optimization anyhow. Changed by `.set bopt' and `.set
223 nobopt'. */
224 int nobopt;
225 /* Non-zero if we should not autoextend mips16 instructions.
226 Changed by `.set autoextend' and `.set noautoextend'. */
227 int noautoextend;
228 /* Restrict general purpose registers and floating point registers
229 to 32 bit. This is initially determined when -mgp32 or -mfp32
230 is passed but can changed if the assembler code uses .set mipsN. */
231 int gp32;
232 int fp32;
233 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
234 command line option, and the default CPU. */
235 int arch;
236 /* True if ".set sym32" is in effect. */
237 bfd_boolean sym32;
238 /* True if floating-point operations are not allowed. Changed by .set
239 softfloat or .set hardfloat, by command line options -msoft-float or
240 -mhard-float. The default is false. */
241 bfd_boolean soft_float;
242
243 /* True if only single-precision floating-point operations are allowed.
244 Changed by .set singlefloat or .set doublefloat, command-line options
245 -msingle-float or -mdouble-float. The default is false. */
246 bfd_boolean single_float;
247 };
248
249 /* This is the struct we use to hold the current set of options. Note
250 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
251 -1 to indicate that they have not been initialized. */
252
253 /* True if -mgp32 was passed. */
254 static int file_mips_gp32 = -1;
255
256 /* True if -mfp32 was passed. */
257 static int file_mips_fp32 = -1;
258
259 /* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
260 static int file_mips_soft_float = 0;
261
262 /* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
263 static int file_mips_single_float = 0;
264
265 static struct mips_set_options mips_opts =
266 {
267 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
268 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
269 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
270 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
271 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
272 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
273 };
274
275 /* These variables are filled in with the masks of registers used.
276 The object format code reads them and puts them in the appropriate
277 place. */
278 unsigned long mips_gprmask;
279 unsigned long mips_cprmask[4];
280
281 /* MIPS ISA we are using for this output file. */
282 static int file_mips_isa = ISA_UNKNOWN;
283
284 /* True if -mips16 was passed or implied by arguments passed on the
285 command line (e.g., by -march). */
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 -mips3d was passed or implied by arguments passed on the
294 command line (e.g., by -march). */
295 static int file_ase_mips3d;
296
297 /* True if -mdmx was passed or implied by arguments passed on the
298 command line (e.g., by -march). */
299 static int file_ase_mdmx;
300
301 /* True if -msmartmips was passed or implied by arguments passed on the
302 command line (e.g., by -march). */
303 static int file_ase_smartmips;
304
305 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
306 || mips_opts.isa == ISA_MIPS32R2)
307
308 /* True if -mdsp was passed or implied by arguments passed on the
309 command line (e.g., by -march). */
310 static int file_ase_dsp;
311
312 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
313 || mips_opts.isa == ISA_MIPS64R2)
314
315 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
316
317 /* True if -mdspr2 was passed or implied by arguments passed on the
318 command line (e.g., by -march). */
319 static int file_ase_dspr2;
320
321 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
322 || mips_opts.isa == ISA_MIPS64R2)
323
324 /* True if -mmt was passed or implied by arguments passed on the
325 command line (e.g., by -march). */
326 static int file_ase_mt;
327
328 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
329 || mips_opts.isa == ISA_MIPS64R2)
330
331 /* The argument of the -march= flag. The architecture we are assembling. */
332 static int file_mips_arch = CPU_UNKNOWN;
333 static const char *mips_arch_string;
334
335 /* The argument of the -mtune= flag. The architecture for which we
336 are optimizing. */
337 static int mips_tune = CPU_UNKNOWN;
338 static const char *mips_tune_string;
339
340 /* True when generating 32-bit code for a 64-bit processor. */
341 static int mips_32bitmode = 0;
342
343 /* True if the given ABI requires 32-bit registers. */
344 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
345
346 /* Likewise 64-bit registers. */
347 #define ABI_NEEDS_64BIT_REGS(ABI) \
348 ((ABI) == N32_ABI \
349 || (ABI) == N64_ABI \
350 || (ABI) == O64_ABI)
351
352 /* Return true if ISA supports 64 bit wide gp registers. */
353 #define ISA_HAS_64BIT_REGS(ISA) \
354 ((ISA) == ISA_MIPS3 \
355 || (ISA) == ISA_MIPS4 \
356 || (ISA) == ISA_MIPS5 \
357 || (ISA) == ISA_MIPS64 \
358 || (ISA) == ISA_MIPS64R2)
359
360 /* Return true if ISA supports 64 bit wide float registers. */
361 #define ISA_HAS_64BIT_FPRS(ISA) \
362 ((ISA) == ISA_MIPS3 \
363 || (ISA) == ISA_MIPS4 \
364 || (ISA) == ISA_MIPS5 \
365 || (ISA) == ISA_MIPS32R2 \
366 || (ISA) == ISA_MIPS64 \
367 || (ISA) == ISA_MIPS64R2)
368
369 /* Return true if ISA supports 64-bit right rotate (dror et al.)
370 instructions. */
371 #define ISA_HAS_DROR(ISA) \
372 ((ISA) == ISA_MIPS64R2)
373
374 /* Return true if ISA supports 32-bit right rotate (ror et al.)
375 instructions. */
376 #define ISA_HAS_ROR(ISA) \
377 ((ISA) == ISA_MIPS32R2 \
378 || (ISA) == ISA_MIPS64R2 \
379 || mips_opts.ase_smartmips)
380
381 /* Return true if ISA supports single-precision floats in odd registers. */
382 #define ISA_HAS_ODD_SINGLE_FPR(ISA) \
383 ((ISA) == ISA_MIPS32 \
384 || (ISA) == ISA_MIPS32R2 \
385 || (ISA) == ISA_MIPS64 \
386 || (ISA) == ISA_MIPS64R2)
387
388 /* Return true if ISA supports move to/from high part of a 64-bit
389 floating-point register. */
390 #define ISA_HAS_MXHC1(ISA) \
391 ((ISA) == ISA_MIPS32R2 \
392 || (ISA) == ISA_MIPS64R2)
393
394 #define HAVE_32BIT_GPRS \
395 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
396
397 #define HAVE_32BIT_FPRS \
398 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
399
400 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
401 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
402
403 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
404
405 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
406
407 /* True if relocations are stored in-place. */
408 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
409
410 /* The ABI-derived address size. */
411 #define HAVE_64BIT_ADDRESSES \
412 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
413 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
414
415 /* The size of symbolic constants (i.e., expressions of the form
416 "SYMBOL" or "SYMBOL + OFFSET"). */
417 #define HAVE_32BIT_SYMBOLS \
418 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
419 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
420
421 /* Addresses are loaded in different ways, depending on the address size
422 in use. The n32 ABI Documentation also mandates the use of additions
423 with overflow checking, but existing implementations don't follow it. */
424 #define ADDRESS_ADD_INSN \
425 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
426
427 #define ADDRESS_ADDI_INSN \
428 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
429
430 #define ADDRESS_LOAD_INSN \
431 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
432
433 #define ADDRESS_STORE_INSN \
434 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
435
436 /* Return true if the given CPU supports the MIPS16 ASE. */
437 #define CPU_HAS_MIPS16(cpu) \
438 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
439 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
440
441 /* True if CPU has a dror instruction. */
442 #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443
444 /* True if CPU has a ror instruction. */
445 #define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
446
447 /* True if CPU has seq/sne and seqi/snei instructions. */
448 #define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
449
450 /* True if CPU does not implement the all the coprocessor insns. For these
451 CPUs only those COP insns are accepted that are explicitly marked to be
452 available on the CPU. ISA membership for COP insns is ignored. */
453 #define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
454
455 /* True if mflo and mfhi can be immediately followed by instructions
456 which write to the HI and LO registers.
457
458 According to MIPS specifications, MIPS ISAs I, II, and III need
459 (at least) two instructions between the reads of HI/LO and
460 instructions which write them, and later ISAs do not. Contradicting
461 the MIPS specifications, some MIPS IV processor user manuals (e.g.
462 the UM for the NEC Vr5000) document needing the instructions between
463 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
464 MIPS64 and later ISAs to have the interlocks, plus any specific
465 earlier-ISA CPUs for which CPU documentation declares that the
466 instructions are really interlocked. */
467 #define hilo_interlocks \
468 (mips_opts.isa == ISA_MIPS32 \
469 || mips_opts.isa == ISA_MIPS32R2 \
470 || mips_opts.isa == ISA_MIPS64 \
471 || mips_opts.isa == ISA_MIPS64R2 \
472 || mips_opts.arch == CPU_R4010 \
473 || mips_opts.arch == CPU_R10000 \
474 || mips_opts.arch == CPU_R12000 \
475 || mips_opts.arch == CPU_RM7000 \
476 || mips_opts.arch == CPU_VR5500 \
477 )
478
479 /* Whether the processor uses hardware interlocks to protect reads
480 from the GPRs after they are loaded from memory, and thus does not
481 require nops to be inserted. This applies to instructions marked
482 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
483 level I. */
484 #define gpr_interlocks \
485 (mips_opts.isa != ISA_MIPS1 \
486 || mips_opts.arch == CPU_R3900)
487
488 /* Whether the processor uses hardware interlocks to avoid delays
489 required by coprocessor instructions, and thus does not require
490 nops to be inserted. This applies to instructions marked
491 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
492 between instructions marked INSN_WRITE_COND_CODE and ones marked
493 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
494 levels I, II, and III. */
495 /* Itbl support may require additional care here. */
496 #define cop_interlocks \
497 ((mips_opts.isa != ISA_MIPS1 \
498 && mips_opts.isa != ISA_MIPS2 \
499 && mips_opts.isa != ISA_MIPS3) \
500 || mips_opts.arch == CPU_R4300 \
501 )
502
503 /* Whether the processor uses hardware interlocks to protect reads
504 from coprocessor registers after they are loaded from memory, and
505 thus does not require nops to be inserted. This applies to
506 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
507 requires at MIPS ISA level I. */
508 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
509
510 /* Is this a mfhi or mflo instruction? */
511 #define MF_HILO_INSN(PINFO) \
512 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
513
514 /* Returns true for a (non floating-point) coprocessor instruction. Reading
515 or writing the condition code is only possible on the coprocessors and
516 these insns are not marked with INSN_COP. Thus for these insns use the
517 condition-code flags unless this is the floating-point coprocessor. */
518 #define COP_INSN(PINFO) \
519 (PINFO != INSN_MACRO \
520 && (((PINFO) & INSN_COP) \
521 || ((PINFO) & (INSN_READ_COND_CODE | INSN_WRITE_COND_CODE) \
522 && ((PINFO) & (FP_S | FP_D)) == 0)))
523
524 /* MIPS PIC level. */
525
526 enum mips_pic_level mips_pic;
527
528 /* 1 if we should generate 32 bit offsets from the $gp register in
529 SVR4_PIC mode. Currently has no meaning in other modes. */
530 static int mips_big_got = 0;
531
532 /* 1 if trap instructions should used for overflow rather than break
533 instructions. */
534 static int mips_trap = 0;
535
536 /* 1 if double width floating point constants should not be constructed
537 by assembling two single width halves into two single width floating
538 point registers which just happen to alias the double width destination
539 register. On some architectures this aliasing can be disabled by a bit
540 in the status register, and the setting of this bit cannot be determined
541 automatically at assemble time. */
542 static int mips_disable_float_construction;
543
544 /* Non-zero if any .set noreorder directives were used. */
545
546 static int mips_any_noreorder;
547
548 /* Non-zero if nops should be inserted when the register referenced in
549 an mfhi/mflo instruction is read in the next two instructions. */
550 static int mips_7000_hilo_fix;
551
552 /* The size of objects in the small data section. */
553 static unsigned int g_switch_value = 8;
554 /* Whether the -G option was used. */
555 static int g_switch_seen = 0;
556
557 #define N_RMASK 0xc4
558 #define N_VFP 0xd4
559
560 /* If we can determine in advance that GP optimization won't be
561 possible, we can skip the relaxation stuff that tries to produce
562 GP-relative references. This makes delay slot optimization work
563 better.
564
565 This function can only provide a guess, but it seems to work for
566 gcc output. It needs to guess right for gcc, otherwise gcc
567 will put what it thinks is a GP-relative instruction in a branch
568 delay slot.
569
570 I don't know if a fix is needed for the SVR4_PIC mode. I've only
571 fixed it for the non-PIC mode. KR 95/04/07 */
572 static int nopic_need_relax (symbolS *, int);
573
574 /* handle of the OPCODE hash table */
575 static struct hash_control *op_hash = NULL;
576
577 /* The opcode hash table we use for the mips16. */
578 static struct hash_control *mips16_op_hash = NULL;
579
580 /* This array holds the chars that always start a comment. If the
581 pre-processor is disabled, these aren't very useful */
582 const char comment_chars[] = "#";
583
584 /* This array holds the chars that only start a comment at the beginning of
585 a line. If the line seems to have the form '# 123 filename'
586 .line and .file directives will appear in the pre-processed output */
587 /* Note that input_file.c hand checks for '#' at the beginning of the
588 first line of the input file. This is because the compiler outputs
589 #NO_APP at the beginning of its output. */
590 /* Also note that C style comments are always supported. */
591 const char line_comment_chars[] = "#";
592
593 /* This array holds machine specific line separator characters. */
594 const char line_separator_chars[] = ";";
595
596 /* Chars that can be used to separate mant from exp in floating point nums */
597 const char EXP_CHARS[] = "eE";
598
599 /* Chars that mean this number is a floating point constant */
600 /* As in 0f12.456 */
601 /* or 0d1.2345e12 */
602 const char FLT_CHARS[] = "rRsSfFdDxXpP";
603
604 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
605 changed in read.c . Ideally it shouldn't have to know about it at all,
606 but nothing is ideal around here.
607 */
608
609 static char *insn_error;
610
611 static int auto_align = 1;
612
613 /* When outputting SVR4 PIC code, the assembler needs to know the
614 offset in the stack frame from which to restore the $gp register.
615 This is set by the .cprestore pseudo-op, and saved in this
616 variable. */
617 static offsetT mips_cprestore_offset = -1;
618
619 /* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
620 more optimizations, it can use a register value instead of a memory-saved
621 offset and even an other register than $gp as global pointer. */
622 static offsetT mips_cpreturn_offset = -1;
623 static int mips_cpreturn_register = -1;
624 static int mips_gp_register = GP;
625 static int mips_gprel_offset = 0;
626
627 /* Whether mips_cprestore_offset has been set in the current function
628 (or whether it has already been warned about, if not). */
629 static int mips_cprestore_valid = 0;
630
631 /* This is the register which holds the stack frame, as set by the
632 .frame pseudo-op. This is needed to implement .cprestore. */
633 static int mips_frame_reg = SP;
634
635 /* Whether mips_frame_reg has been set in the current function
636 (or whether it has already been warned about, if not). */
637 static int mips_frame_reg_valid = 0;
638
639 /* To output NOP instructions correctly, we need to keep information
640 about the previous two instructions. */
641
642 /* Whether we are optimizing. The default value of 2 means to remove
643 unneeded NOPs and swap branch instructions when possible. A value
644 of 1 means to not swap branches. A value of 0 means to always
645 insert NOPs. */
646 static int mips_optimize = 2;
647
648 /* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
649 equivalent to seeing no -g option at all. */
650 static int mips_debug = 0;
651
652 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
653 #define MAX_VR4130_NOPS 4
654
655 /* The maximum number of NOPs needed to fill delay slots. */
656 #define MAX_DELAY_NOPS 2
657
658 /* The maximum number of NOPs needed for any purpose. */
659 #define MAX_NOPS 4
660
661 /* A list of previous instructions, with index 0 being the most recent.
662 We need to look back MAX_NOPS instructions when filling delay slots
663 or working around processor errata. We need to look back one
664 instruction further if we're thinking about using history[0] to
665 fill a branch delay slot. */
666 static struct mips_cl_insn history[1 + MAX_NOPS];
667
668 /* Nop instructions used by emit_nop. */
669 static struct mips_cl_insn nop_insn, mips16_nop_insn;
670
671 /* The appropriate nop for the current mode. */
672 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
673
674 /* If this is set, it points to a frag holding nop instructions which
675 were inserted before the start of a noreorder section. If those
676 nops turn out to be unnecessary, the size of the frag can be
677 decreased. */
678 static fragS *prev_nop_frag;
679
680 /* The number of nop instructions we created in prev_nop_frag. */
681 static int prev_nop_frag_holds;
682
683 /* The number of nop instructions that we know we need in
684 prev_nop_frag. */
685 static int prev_nop_frag_required;
686
687 /* The number of instructions we've seen since prev_nop_frag. */
688 static int prev_nop_frag_since;
689
690 /* For ECOFF and ELF, relocations against symbols are done in two
691 parts, with a HI relocation and a LO relocation. Each relocation
692 has only 16 bits of space to store an addend. This means that in
693 order for the linker to handle carries correctly, it must be able
694 to locate both the HI and the LO relocation. This means that the
695 relocations must appear in order in the relocation table.
696
697 In order to implement this, we keep track of each unmatched HI
698 relocation. We then sort them so that they immediately precede the
699 corresponding LO relocation. */
700
701 struct mips_hi_fixup
702 {
703 /* Next HI fixup. */
704 struct mips_hi_fixup *next;
705 /* This fixup. */
706 fixS *fixp;
707 /* The section this fixup is in. */
708 segT seg;
709 };
710
711 /* The list of unmatched HI relocs. */
712
713 static struct mips_hi_fixup *mips_hi_fixup_list;
714
715 /* The frag containing the last explicit relocation operator.
716 Null if explicit relocations have not been used. */
717
718 static fragS *prev_reloc_op_frag;
719
720 /* Map normal MIPS register numbers to mips16 register numbers. */
721
722 #define X ILLEGAL_REG
723 static const int mips32_to_16_reg_map[] =
724 {
725 X, X, 2, 3, 4, 5, 6, 7,
726 X, X, X, X, X, X, X, X,
727 0, 1, X, X, X, X, X, X,
728 X, X, X, X, X, X, X, X
729 };
730 #undef X
731
732 /* Map mips16 register numbers to normal MIPS register numbers. */
733
734 static const unsigned int mips16_to_32_reg_map[] =
735 {
736 16, 17, 2, 3, 4, 5, 6, 7
737 };
738
739 /* Classifies the kind of instructions we're interested in when
740 implementing -mfix-vr4120. */
741 enum fix_vr4120_class {
742 FIX_VR4120_MACC,
743 FIX_VR4120_DMACC,
744 FIX_VR4120_MULT,
745 FIX_VR4120_DMULT,
746 FIX_VR4120_DIV,
747 FIX_VR4120_MTHILO,
748 NUM_FIX_VR4120_CLASSES
749 };
750
751 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
752 there must be at least one other instruction between an instruction
753 of type X and an instruction of type Y. */
754 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
755
756 /* True if -mfix-vr4120 is in force. */
757 static int mips_fix_vr4120;
758
759 /* ...likewise -mfix-vr4130. */
760 static int mips_fix_vr4130;
761
762 /* We don't relax branches by default, since this causes us to expand
763 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
764 fail to compute the offset before expanding the macro to the most
765 efficient expansion. */
766
767 static int mips_relax_branch;
768 \f
769 /* The expansion of many macros depends on the type of symbol that
770 they refer to. For example, when generating position-dependent code,
771 a macro that refers to a symbol may have two different expansions,
772 one which uses GP-relative addresses and one which uses absolute
773 addresses. When generating SVR4-style PIC, a macro may have
774 different expansions for local and global symbols.
775
776 We handle these situations by generating both sequences and putting
777 them in variant frags. In position-dependent code, the first sequence
778 will be the GP-relative one and the second sequence will be the
779 absolute one. In SVR4 PIC, the first sequence will be for global
780 symbols and the second will be for local symbols.
781
782 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
783 SECOND are the lengths of the two sequences in bytes. These fields
784 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
785 the subtype has the following flags:
786
787 RELAX_USE_SECOND
788 Set if it has been decided that we should use the second
789 sequence instead of the first.
790
791 RELAX_SECOND_LONGER
792 Set in the first variant frag if the macro's second implementation
793 is longer than its first. This refers to the macro as a whole,
794 not an individual relaxation.
795
796 RELAX_NOMACRO
797 Set in the first variant frag if the macro appeared in a .set nomacro
798 block and if one alternative requires a warning but the other does not.
799
800 RELAX_DELAY_SLOT
801 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
802 delay slot.
803
804 The frag's "opcode" points to the first fixup for relaxable code.
805
806 Relaxable macros are generated using a sequence such as:
807
808 relax_start (SYMBOL);
809 ... generate first expansion ...
810 relax_switch ();
811 ... generate second expansion ...
812 relax_end ();
813
814 The code and fixups for the unwanted alternative are discarded
815 by md_convert_frag. */
816 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
817
818 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
819 #define RELAX_SECOND(X) ((X) & 0xff)
820 #define RELAX_USE_SECOND 0x10000
821 #define RELAX_SECOND_LONGER 0x20000
822 #define RELAX_NOMACRO 0x40000
823 #define RELAX_DELAY_SLOT 0x80000
824
825 /* Branch without likely bit. If label is out of range, we turn:
826
827 beq reg1, reg2, label
828 delay slot
829
830 into
831
832 bne reg1, reg2, 0f
833 nop
834 j label
835 0: delay slot
836
837 with the following opcode replacements:
838
839 beq <-> bne
840 blez <-> bgtz
841 bltz <-> bgez
842 bc1f <-> bc1t
843
844 bltzal <-> bgezal (with jal label instead of j label)
845
846 Even though keeping the delay slot instruction in the delay slot of
847 the branch would be more efficient, it would be very tricky to do
848 correctly, because we'd have to introduce a variable frag *after*
849 the delay slot instruction, and expand that instead. Let's do it
850 the easy way for now, even if the branch-not-taken case now costs
851 one additional instruction. Out-of-range branches are not supposed
852 to be common, anyway.
853
854 Branch likely. If label is out of range, we turn:
855
856 beql reg1, reg2, label
857 delay slot (annulled if branch not taken)
858
859 into
860
861 beql reg1, reg2, 1f
862 nop
863 beql $0, $0, 2f
864 nop
865 1: j[al] label
866 delay slot (executed only if branch taken)
867 2:
868
869 It would be possible to generate a shorter sequence by losing the
870 likely bit, generating something like:
871
872 bne reg1, reg2, 0f
873 nop
874 j[al] label
875 delay slot (executed only if branch taken)
876 0:
877
878 beql -> bne
879 bnel -> beq
880 blezl -> bgtz
881 bgtzl -> blez
882 bltzl -> bgez
883 bgezl -> bltz
884 bc1fl -> bc1t
885 bc1tl -> bc1f
886
887 bltzall -> bgezal (with jal label instead of j label)
888 bgezall -> bltzal (ditto)
889
890
891 but it's not clear that it would actually improve performance. */
892 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
893 ((relax_substateT) \
894 (0xc0000000 \
895 | ((toofar) ? 1 : 0) \
896 | ((link) ? 2 : 0) \
897 | ((likely) ? 4 : 0) \
898 | ((uncond) ? 8 : 0)))
899 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
900 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
901 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
902 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
903 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
904
905 /* For mips16 code, we use an entirely different form of relaxation.
906 mips16 supports two versions of most instructions which take
907 immediate values: a small one which takes some small value, and a
908 larger one which takes a 16 bit value. Since branches also follow
909 this pattern, relaxing these values is required.
910
911 We can assemble both mips16 and normal MIPS code in a single
912 object. Therefore, we need to support this type of relaxation at
913 the same time that we support the relaxation described above. We
914 use the high bit of the subtype field to distinguish these cases.
915
916 The information we store for this type of relaxation is the
917 argument code found in the opcode file for this relocation, whether
918 the user explicitly requested a small or extended form, and whether
919 the relocation is in a jump or jal delay slot. That tells us the
920 size of the value, and how it should be stored. We also store
921 whether the fragment is considered to be extended or not. We also
922 store whether this is known to be a branch to a different section,
923 whether we have tried to relax this frag yet, and whether we have
924 ever extended a PC relative fragment because of a shift count. */
925 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
926 (0x80000000 \
927 | ((type) & 0xff) \
928 | ((small) ? 0x100 : 0) \
929 | ((ext) ? 0x200 : 0) \
930 | ((dslot) ? 0x400 : 0) \
931 | ((jal_dslot) ? 0x800 : 0))
932 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
933 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
934 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
935 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
936 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
937 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
938 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
939 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
940 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
941 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
942 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
943 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
944
945 /* Is the given value a sign-extended 32-bit value? */
946 #define IS_SEXT_32BIT_NUM(x) \
947 (((x) &~ (offsetT) 0x7fffffff) == 0 \
948 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
949
950 /* Is the given value a sign-extended 16-bit value? */
951 #define IS_SEXT_16BIT_NUM(x) \
952 (((x) &~ (offsetT) 0x7fff) == 0 \
953 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
954
955 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
956 #define IS_ZEXT_32BIT_NUM(x) \
957 (((x) &~ (offsetT) 0xffffffff) == 0 \
958 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
959
960 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
961 VALUE << SHIFT. VALUE is evaluated exactly once. */
962 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
963 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
964 | (((VALUE) & (MASK)) << (SHIFT)))
965
966 /* Extract bits MASK << SHIFT from STRUCT and shift them right
967 SHIFT places. */
968 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
969 (((STRUCT) >> (SHIFT)) & (MASK))
970
971 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
972 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
973
974 include/opcode/mips.h specifies operand fields using the macros
975 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
976 with "MIPS16OP" instead of "OP". */
977 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
978 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
979 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
980 INSERT_BITS ((INSN).insn_opcode, VALUE, \
981 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
982
983 /* Extract the operand given by FIELD from mips_cl_insn INSN. */
984 #define EXTRACT_OPERAND(FIELD, INSN) \
985 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
986 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
987 EXTRACT_BITS ((INSN).insn_opcode, \
988 MIPS16OP_MASK_##FIELD, \
989 MIPS16OP_SH_##FIELD)
990 \f
991 /* Global variables used when generating relaxable macros. See the
992 comment above RELAX_ENCODE for more details about how relaxation
993 is used. */
994 static struct {
995 /* 0 if we're not emitting a relaxable macro.
996 1 if we're emitting the first of the two relaxation alternatives.
997 2 if we're emitting the second alternative. */
998 int sequence;
999
1000 /* The first relaxable fixup in the current frag. (In other words,
1001 the first fixup that refers to relaxable code.) */
1002 fixS *first_fixup;
1003
1004 /* sizes[0] says how many bytes of the first alternative are stored in
1005 the current frag. Likewise sizes[1] for the second alternative. */
1006 unsigned int sizes[2];
1007
1008 /* The symbol on which the choice of sequence depends. */
1009 symbolS *symbol;
1010 } mips_relax;
1011 \f
1012 /* Global variables used to decide whether a macro needs a warning. */
1013 static struct {
1014 /* True if the macro is in a branch delay slot. */
1015 bfd_boolean delay_slot_p;
1016
1017 /* For relaxable macros, sizes[0] is the length of the first alternative
1018 in bytes and sizes[1] is the length of the second alternative.
1019 For non-relaxable macros, both elements give the length of the
1020 macro in bytes. */
1021 unsigned int sizes[2];
1022
1023 /* The first variant frag for this macro. */
1024 fragS *first_frag;
1025 } mips_macro_warning;
1026 \f
1027 /* Prototypes for static functions. */
1028
1029 #define internalError() \
1030 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1031
1032 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1033
1034 static void append_insn
1035 (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1036 static void mips_no_prev_insn (void);
1037 static void mips16_macro_build
1038 (expressionS *, const char *, const char *, va_list);
1039 static void load_register (int, expressionS *, int);
1040 static void macro_start (void);
1041 static void macro_end (void);
1042 static void macro (struct mips_cl_insn * ip);
1043 static void mips16_macro (struct mips_cl_insn * ip);
1044 #ifdef LOSING_COMPILER
1045 static void macro2 (struct mips_cl_insn * ip);
1046 #endif
1047 static void mips_ip (char *str, struct mips_cl_insn * ip);
1048 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1049 static void mips16_immed
1050 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1051 unsigned long *, bfd_boolean *, unsigned short *);
1052 static size_t my_getSmallExpression
1053 (expressionS *, bfd_reloc_code_real_type *, char *);
1054 static void my_getExpression (expressionS *, char *);
1055 static void s_align (int);
1056 static void s_change_sec (int);
1057 static void s_change_section (int);
1058 static void s_cons (int);
1059 static void s_float_cons (int);
1060 static void s_mips_globl (int);
1061 static void s_option (int);
1062 static void s_mipsset (int);
1063 static void s_abicalls (int);
1064 static void s_cpload (int);
1065 static void s_cpsetup (int);
1066 static void s_cplocal (int);
1067 static void s_cprestore (int);
1068 static void s_cpreturn (int);
1069 static void s_dtprelword (int);
1070 static void s_dtpreldword (int);
1071 static void s_gpvalue (int);
1072 static void s_gpword (int);
1073 static void s_gpdword (int);
1074 static void s_cpadd (int);
1075 static void s_insn (int);
1076 static void md_obj_begin (void);
1077 static void md_obj_end (void);
1078 static void s_mips_ent (int);
1079 static void s_mips_end (int);
1080 static void s_mips_frame (int);
1081 static void s_mips_mask (int reg_type);
1082 static void s_mips_stab (int);
1083 static void s_mips_weakext (int);
1084 static void s_mips_file (int);
1085 static void s_mips_loc (int);
1086 static bfd_boolean pic_need_relax (symbolS *, asection *);
1087 static int relaxed_branch_length (fragS *, asection *, int);
1088 static int validate_mips_insn (const struct mips_opcode *);
1089
1090 /* Table and functions used to map between CPU/ISA names, and
1091 ISA levels, and CPU numbers. */
1092
1093 struct mips_cpu_info
1094 {
1095 const char *name; /* CPU or ISA name. */
1096 int flags; /* ASEs available, or ISA flag. */
1097 int isa; /* ISA level. */
1098 int cpu; /* CPU number (default CPU if ISA). */
1099 };
1100
1101 #define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1102 #define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1103 #define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1104 #define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1105 #define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1106 #define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
1107 #define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
1108
1109 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1110 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1111 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1112 \f
1113 /* Pseudo-op table.
1114
1115 The following pseudo-ops from the Kane and Heinrich MIPS book
1116 should be defined here, but are currently unsupported: .alias,
1117 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1118
1119 The following pseudo-ops from the Kane and Heinrich MIPS book are
1120 specific to the type of debugging information being generated, and
1121 should be defined by the object format: .aent, .begin, .bend,
1122 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1123 .vreg.
1124
1125 The following pseudo-ops from the Kane and Heinrich MIPS book are
1126 not MIPS CPU specific, but are also not specific to the object file
1127 format. This file is probably the best place to define them, but
1128 they are not currently supported: .asm0, .endr, .lab, .struct. */
1129
1130 static const pseudo_typeS mips_pseudo_table[] =
1131 {
1132 /* MIPS specific pseudo-ops. */
1133 {"option", s_option, 0},
1134 {"set", s_mipsset, 0},
1135 {"rdata", s_change_sec, 'r'},
1136 {"sdata", s_change_sec, 's'},
1137 {"livereg", s_ignore, 0},
1138 {"abicalls", s_abicalls, 0},
1139 {"cpload", s_cpload, 0},
1140 {"cpsetup", s_cpsetup, 0},
1141 {"cplocal", s_cplocal, 0},
1142 {"cprestore", s_cprestore, 0},
1143 {"cpreturn", s_cpreturn, 0},
1144 {"dtprelword", s_dtprelword, 0},
1145 {"dtpreldword", s_dtpreldword, 0},
1146 {"gpvalue", s_gpvalue, 0},
1147 {"gpword", s_gpword, 0},
1148 {"gpdword", s_gpdword, 0},
1149 {"cpadd", s_cpadd, 0},
1150 {"insn", s_insn, 0},
1151
1152 /* Relatively generic pseudo-ops that happen to be used on MIPS
1153 chips. */
1154 {"asciiz", stringer, 8 + 1},
1155 {"bss", s_change_sec, 'b'},
1156 {"err", s_err, 0},
1157 {"half", s_cons, 1},
1158 {"dword", s_cons, 3},
1159 {"weakext", s_mips_weakext, 0},
1160 {"origin", s_org, 0},
1161 {"repeat", s_rept, 0},
1162
1163 /* These pseudo-ops are defined in read.c, but must be overridden
1164 here for one reason or another. */
1165 {"align", s_align, 0},
1166 {"byte", s_cons, 0},
1167 {"data", s_change_sec, 'd'},
1168 {"double", s_float_cons, 'd'},
1169 {"float", s_float_cons, 'f'},
1170 {"globl", s_mips_globl, 0},
1171 {"global", s_mips_globl, 0},
1172 {"hword", s_cons, 1},
1173 {"int", s_cons, 2},
1174 {"long", s_cons, 2},
1175 {"octa", s_cons, 4},
1176 {"quad", s_cons, 3},
1177 {"section", s_change_section, 0},
1178 {"short", s_cons, 1},
1179 {"single", s_float_cons, 'f'},
1180 {"stabn", s_mips_stab, 'n'},
1181 {"text", s_change_sec, 't'},
1182 {"word", s_cons, 2},
1183
1184 { "extern", ecoff_directive_extern, 0},
1185
1186 { NULL, NULL, 0 },
1187 };
1188
1189 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1190 {
1191 /* These pseudo-ops should be defined by the object file format.
1192 However, a.out doesn't support them, so we have versions here. */
1193 {"aent", s_mips_ent, 1},
1194 {"bgnb", s_ignore, 0},
1195 {"end", s_mips_end, 0},
1196 {"endb", s_ignore, 0},
1197 {"ent", s_mips_ent, 0},
1198 {"file", s_mips_file, 0},
1199 {"fmask", s_mips_mask, 'F'},
1200 {"frame", s_mips_frame, 0},
1201 {"loc", s_mips_loc, 0},
1202 {"mask", s_mips_mask, 'R'},
1203 {"verstamp", s_ignore, 0},
1204 { NULL, NULL, 0 },
1205 };
1206
1207 extern void pop_insert (const pseudo_typeS *);
1208
1209 void
1210 mips_pop_insert (void)
1211 {
1212 pop_insert (mips_pseudo_table);
1213 if (! ECOFF_DEBUGGING)
1214 pop_insert (mips_nonecoff_pseudo_table);
1215 }
1216 \f
1217 /* Symbols labelling the current insn. */
1218
1219 struct insn_label_list
1220 {
1221 struct insn_label_list *next;
1222 symbolS *label;
1223 };
1224
1225 static struct insn_label_list *free_insn_labels;
1226 #define label_list tc_segment_info_data.labels
1227
1228 static void mips_clear_insn_labels (void);
1229
1230 static inline void
1231 mips_clear_insn_labels (void)
1232 {
1233 register struct insn_label_list **pl;
1234 segment_info_type *si;
1235
1236 if (now_seg)
1237 {
1238 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1239 ;
1240
1241 si = seg_info (now_seg);
1242 *pl = si->label_list;
1243 si->label_list = NULL;
1244 }
1245 }
1246
1247 \f
1248 static char *expr_end;
1249
1250 /* Expressions which appear in instructions. These are set by
1251 mips_ip. */
1252
1253 static expressionS imm_expr;
1254 static expressionS imm2_expr;
1255 static expressionS offset_expr;
1256
1257 /* Relocs associated with imm_expr and offset_expr. */
1258
1259 static bfd_reloc_code_real_type imm_reloc[3]
1260 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1261 static bfd_reloc_code_real_type offset_reloc[3]
1262 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1263
1264 /* These are set by mips16_ip if an explicit extension is used. */
1265
1266 static bfd_boolean mips16_small, mips16_ext;
1267
1268 #ifdef OBJ_ELF
1269 /* The pdr segment for per procedure frame/regmask info. Not used for
1270 ECOFF debugging. */
1271
1272 static segT pdr_seg;
1273 #endif
1274
1275 /* The default target format to use. */
1276
1277 const char *
1278 mips_target_format (void)
1279 {
1280 switch (OUTPUT_FLAVOR)
1281 {
1282 case bfd_target_ecoff_flavour:
1283 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1284 case bfd_target_coff_flavour:
1285 return "pe-mips";
1286 case bfd_target_elf_flavour:
1287 #ifdef TE_VXWORKS
1288 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1289 return (target_big_endian
1290 ? "elf32-bigmips-vxworks"
1291 : "elf32-littlemips-vxworks");
1292 #endif
1293 #ifdef TE_TMIPS
1294 /* This is traditional mips. */
1295 return (target_big_endian
1296 ? (HAVE_64BIT_OBJECTS
1297 ? "elf64-tradbigmips"
1298 : (HAVE_NEWABI
1299 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1300 : (HAVE_64BIT_OBJECTS
1301 ? "elf64-tradlittlemips"
1302 : (HAVE_NEWABI
1303 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1304 #else
1305 return (target_big_endian
1306 ? (HAVE_64BIT_OBJECTS
1307 ? "elf64-bigmips"
1308 : (HAVE_NEWABI
1309 ? "elf32-nbigmips" : "elf32-bigmips"))
1310 : (HAVE_64BIT_OBJECTS
1311 ? "elf64-littlemips"
1312 : (HAVE_NEWABI
1313 ? "elf32-nlittlemips" : "elf32-littlemips")));
1314 #endif
1315 default:
1316 abort ();
1317 return NULL;
1318 }
1319 }
1320
1321 /* Return the length of instruction INSN. */
1322
1323 static inline unsigned int
1324 insn_length (const struct mips_cl_insn *insn)
1325 {
1326 if (!mips_opts.mips16)
1327 return 4;
1328 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1329 }
1330
1331 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1332
1333 static void
1334 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1335 {
1336 size_t i;
1337
1338 insn->insn_mo = mo;
1339 insn->use_extend = FALSE;
1340 insn->extend = 0;
1341 insn->insn_opcode = mo->match;
1342 insn->frag = NULL;
1343 insn->where = 0;
1344 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1345 insn->fixp[i] = NULL;
1346 insn->fixed_p = (mips_opts.noreorder > 0);
1347 insn->noreorder_p = (mips_opts.noreorder > 0);
1348 insn->mips16_absolute_jump_p = 0;
1349 }
1350
1351 /* Record the current MIPS16 mode in now_seg. */
1352
1353 static void
1354 mips_record_mips16_mode (void)
1355 {
1356 segment_info_type *si;
1357
1358 si = seg_info (now_seg);
1359 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1360 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1361 }
1362
1363 /* Install INSN at the location specified by its "frag" and "where" fields. */
1364
1365 static void
1366 install_insn (const struct mips_cl_insn *insn)
1367 {
1368 char *f = insn->frag->fr_literal + insn->where;
1369 if (!mips_opts.mips16)
1370 md_number_to_chars (f, insn->insn_opcode, 4);
1371 else if (insn->mips16_absolute_jump_p)
1372 {
1373 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1374 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1375 }
1376 else
1377 {
1378 if (insn->use_extend)
1379 {
1380 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1381 f += 2;
1382 }
1383 md_number_to_chars (f, insn->insn_opcode, 2);
1384 }
1385 mips_record_mips16_mode ();
1386 }
1387
1388 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1389 and install the opcode in the new location. */
1390
1391 static void
1392 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1393 {
1394 size_t i;
1395
1396 insn->frag = frag;
1397 insn->where = where;
1398 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1399 if (insn->fixp[i] != NULL)
1400 {
1401 insn->fixp[i]->fx_frag = frag;
1402 insn->fixp[i]->fx_where = where;
1403 }
1404 install_insn (insn);
1405 }
1406
1407 /* Add INSN to the end of the output. */
1408
1409 static void
1410 add_fixed_insn (struct mips_cl_insn *insn)
1411 {
1412 char *f = frag_more (insn_length (insn));
1413 move_insn (insn, frag_now, f - frag_now->fr_literal);
1414 }
1415
1416 /* Start a variant frag and move INSN to the start of the variant part,
1417 marking it as fixed. The other arguments are as for frag_var. */
1418
1419 static void
1420 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1421 relax_substateT subtype, symbolS *symbol, offsetT offset)
1422 {
1423 frag_grow (max_chars);
1424 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1425 insn->fixed_p = 1;
1426 frag_var (rs_machine_dependent, max_chars, var,
1427 subtype, symbol, offset, NULL);
1428 }
1429
1430 /* Insert N copies of INSN into the history buffer, starting at
1431 position FIRST. Neither FIRST nor N need to be clipped. */
1432
1433 static void
1434 insert_into_history (unsigned int first, unsigned int n,
1435 const struct mips_cl_insn *insn)
1436 {
1437 if (mips_relax.sequence != 2)
1438 {
1439 unsigned int i;
1440
1441 for (i = ARRAY_SIZE (history); i-- > first;)
1442 if (i >= first + n)
1443 history[i] = history[i - n];
1444 else
1445 history[i] = *insn;
1446 }
1447 }
1448
1449 /* Emit a nop instruction, recording it in the history buffer. */
1450
1451 static void
1452 emit_nop (void)
1453 {
1454 add_fixed_insn (NOP_INSN);
1455 insert_into_history (0, 1, NOP_INSN);
1456 }
1457
1458 /* Initialize vr4120_conflicts. There is a bit of duplication here:
1459 the idea is to make it obvious at a glance that each errata is
1460 included. */
1461
1462 static void
1463 init_vr4120_conflicts (void)
1464 {
1465 #define CONFLICT(FIRST, SECOND) \
1466 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1467
1468 /* Errata 21 - [D]DIV[U] after [D]MACC */
1469 CONFLICT (MACC, DIV);
1470 CONFLICT (DMACC, DIV);
1471
1472 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1473 CONFLICT (DMULT, DMULT);
1474 CONFLICT (DMULT, DMACC);
1475 CONFLICT (DMACC, DMULT);
1476 CONFLICT (DMACC, DMACC);
1477
1478 /* Errata 24 - MT{LO,HI} after [D]MACC */
1479 CONFLICT (MACC, MTHILO);
1480 CONFLICT (DMACC, MTHILO);
1481
1482 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1483 instruction is executed immediately after a MACC or DMACC
1484 instruction, the result of [either instruction] is incorrect." */
1485 CONFLICT (MACC, MULT);
1486 CONFLICT (MACC, DMULT);
1487 CONFLICT (DMACC, MULT);
1488 CONFLICT (DMACC, DMULT);
1489
1490 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1491 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1492 DDIV or DDIVU instruction, the result of the MACC or
1493 DMACC instruction is incorrect.". */
1494 CONFLICT (DMULT, MACC);
1495 CONFLICT (DMULT, DMACC);
1496 CONFLICT (DIV, MACC);
1497 CONFLICT (DIV, DMACC);
1498
1499 #undef CONFLICT
1500 }
1501
1502 struct regname {
1503 const char *name;
1504 unsigned int num;
1505 };
1506
1507 #define RTYPE_MASK 0x1ff00
1508 #define RTYPE_NUM 0x00100
1509 #define RTYPE_FPU 0x00200
1510 #define RTYPE_FCC 0x00400
1511 #define RTYPE_VEC 0x00800
1512 #define RTYPE_GP 0x01000
1513 #define RTYPE_CP0 0x02000
1514 #define RTYPE_PC 0x04000
1515 #define RTYPE_ACC 0x08000
1516 #define RTYPE_CCC 0x10000
1517 #define RNUM_MASK 0x000ff
1518 #define RWARN 0x80000
1519
1520 #define GENERIC_REGISTER_NUMBERS \
1521 {"$0", RTYPE_NUM | 0}, \
1522 {"$1", RTYPE_NUM | 1}, \
1523 {"$2", RTYPE_NUM | 2}, \
1524 {"$3", RTYPE_NUM | 3}, \
1525 {"$4", RTYPE_NUM | 4}, \
1526 {"$5", RTYPE_NUM | 5}, \
1527 {"$6", RTYPE_NUM | 6}, \
1528 {"$7", RTYPE_NUM | 7}, \
1529 {"$8", RTYPE_NUM | 8}, \
1530 {"$9", RTYPE_NUM | 9}, \
1531 {"$10", RTYPE_NUM | 10}, \
1532 {"$11", RTYPE_NUM | 11}, \
1533 {"$12", RTYPE_NUM | 12}, \
1534 {"$13", RTYPE_NUM | 13}, \
1535 {"$14", RTYPE_NUM | 14}, \
1536 {"$15", RTYPE_NUM | 15}, \
1537 {"$16", RTYPE_NUM | 16}, \
1538 {"$17", RTYPE_NUM | 17}, \
1539 {"$18", RTYPE_NUM | 18}, \
1540 {"$19", RTYPE_NUM | 19}, \
1541 {"$20", RTYPE_NUM | 20}, \
1542 {"$21", RTYPE_NUM | 21}, \
1543 {"$22", RTYPE_NUM | 22}, \
1544 {"$23", RTYPE_NUM | 23}, \
1545 {"$24", RTYPE_NUM | 24}, \
1546 {"$25", RTYPE_NUM | 25}, \
1547 {"$26", RTYPE_NUM | 26}, \
1548 {"$27", RTYPE_NUM | 27}, \
1549 {"$28", RTYPE_NUM | 28}, \
1550 {"$29", RTYPE_NUM | 29}, \
1551 {"$30", RTYPE_NUM | 30}, \
1552 {"$31", RTYPE_NUM | 31}
1553
1554 #define FPU_REGISTER_NAMES \
1555 {"$f0", RTYPE_FPU | 0}, \
1556 {"$f1", RTYPE_FPU | 1}, \
1557 {"$f2", RTYPE_FPU | 2}, \
1558 {"$f3", RTYPE_FPU | 3}, \
1559 {"$f4", RTYPE_FPU | 4}, \
1560 {"$f5", RTYPE_FPU | 5}, \
1561 {"$f6", RTYPE_FPU | 6}, \
1562 {"$f7", RTYPE_FPU | 7}, \
1563 {"$f8", RTYPE_FPU | 8}, \
1564 {"$f9", RTYPE_FPU | 9}, \
1565 {"$f10", RTYPE_FPU | 10}, \
1566 {"$f11", RTYPE_FPU | 11}, \
1567 {"$f12", RTYPE_FPU | 12}, \
1568 {"$f13", RTYPE_FPU | 13}, \
1569 {"$f14", RTYPE_FPU | 14}, \
1570 {"$f15", RTYPE_FPU | 15}, \
1571 {"$f16", RTYPE_FPU | 16}, \
1572 {"$f17", RTYPE_FPU | 17}, \
1573 {"$f18", RTYPE_FPU | 18}, \
1574 {"$f19", RTYPE_FPU | 19}, \
1575 {"$f20", RTYPE_FPU | 20}, \
1576 {"$f21", RTYPE_FPU | 21}, \
1577 {"$f22", RTYPE_FPU | 22}, \
1578 {"$f23", RTYPE_FPU | 23}, \
1579 {"$f24", RTYPE_FPU | 24}, \
1580 {"$f25", RTYPE_FPU | 25}, \
1581 {"$f26", RTYPE_FPU | 26}, \
1582 {"$f27", RTYPE_FPU | 27}, \
1583 {"$f28", RTYPE_FPU | 28}, \
1584 {"$f29", RTYPE_FPU | 29}, \
1585 {"$f30", RTYPE_FPU | 30}, \
1586 {"$f31", RTYPE_FPU | 31}
1587
1588 #define FPU_CONDITION_CODE_NAMES \
1589 {"$fcc0", RTYPE_FCC | 0}, \
1590 {"$fcc1", RTYPE_FCC | 1}, \
1591 {"$fcc2", RTYPE_FCC | 2}, \
1592 {"$fcc3", RTYPE_FCC | 3}, \
1593 {"$fcc4", RTYPE_FCC | 4}, \
1594 {"$fcc5", RTYPE_FCC | 5}, \
1595 {"$fcc6", RTYPE_FCC | 6}, \
1596 {"$fcc7", RTYPE_FCC | 7}
1597
1598 #define COPROC_CONDITION_CODE_NAMES \
1599 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1600 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1601 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1602 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1603 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1604 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1605 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1606 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1607
1608 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1609 {"$a4", RTYPE_GP | 8}, \
1610 {"$a5", RTYPE_GP | 9}, \
1611 {"$a6", RTYPE_GP | 10}, \
1612 {"$a7", RTYPE_GP | 11}, \
1613 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1614 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1615 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1616 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1617 {"$t0", RTYPE_GP | 12}, \
1618 {"$t1", RTYPE_GP | 13}, \
1619 {"$t2", RTYPE_GP | 14}, \
1620 {"$t3", RTYPE_GP | 15}
1621
1622 #define O32_SYMBOLIC_REGISTER_NAMES \
1623 {"$t0", RTYPE_GP | 8}, \
1624 {"$t1", RTYPE_GP | 9}, \
1625 {"$t2", RTYPE_GP | 10}, \
1626 {"$t3", RTYPE_GP | 11}, \
1627 {"$t4", RTYPE_GP | 12}, \
1628 {"$t5", RTYPE_GP | 13}, \
1629 {"$t6", RTYPE_GP | 14}, \
1630 {"$t7", RTYPE_GP | 15}, \
1631 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1632 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1633 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1634 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1635
1636 /* Remaining symbolic register names */
1637 #define SYMBOLIC_REGISTER_NAMES \
1638 {"$zero", RTYPE_GP | 0}, \
1639 {"$at", RTYPE_GP | 1}, \
1640 {"$AT", RTYPE_GP | 1}, \
1641 {"$v0", RTYPE_GP | 2}, \
1642 {"$v1", RTYPE_GP | 3}, \
1643 {"$a0", RTYPE_GP | 4}, \
1644 {"$a1", RTYPE_GP | 5}, \
1645 {"$a2", RTYPE_GP | 6}, \
1646 {"$a3", RTYPE_GP | 7}, \
1647 {"$s0", RTYPE_GP | 16}, \
1648 {"$s1", RTYPE_GP | 17}, \
1649 {"$s2", RTYPE_GP | 18}, \
1650 {"$s3", RTYPE_GP | 19}, \
1651 {"$s4", RTYPE_GP | 20}, \
1652 {"$s5", RTYPE_GP | 21}, \
1653 {"$s6", RTYPE_GP | 22}, \
1654 {"$s7", RTYPE_GP | 23}, \
1655 {"$t8", RTYPE_GP | 24}, \
1656 {"$t9", RTYPE_GP | 25}, \
1657 {"$k0", RTYPE_GP | 26}, \
1658 {"$kt0", RTYPE_GP | 26}, \
1659 {"$k1", RTYPE_GP | 27}, \
1660 {"$kt1", RTYPE_GP | 27}, \
1661 {"$gp", RTYPE_GP | 28}, \
1662 {"$sp", RTYPE_GP | 29}, \
1663 {"$s8", RTYPE_GP | 30}, \
1664 {"$fp", RTYPE_GP | 30}, \
1665 {"$ra", RTYPE_GP | 31}
1666
1667 #define MIPS16_SPECIAL_REGISTER_NAMES \
1668 {"$pc", RTYPE_PC | 0}
1669
1670 #define MDMX_VECTOR_REGISTER_NAMES \
1671 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1672 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1673 {"$v2", RTYPE_VEC | 2}, \
1674 {"$v3", RTYPE_VEC | 3}, \
1675 {"$v4", RTYPE_VEC | 4}, \
1676 {"$v5", RTYPE_VEC | 5}, \
1677 {"$v6", RTYPE_VEC | 6}, \
1678 {"$v7", RTYPE_VEC | 7}, \
1679 {"$v8", RTYPE_VEC | 8}, \
1680 {"$v9", RTYPE_VEC | 9}, \
1681 {"$v10", RTYPE_VEC | 10}, \
1682 {"$v11", RTYPE_VEC | 11}, \
1683 {"$v12", RTYPE_VEC | 12}, \
1684 {"$v13", RTYPE_VEC | 13}, \
1685 {"$v14", RTYPE_VEC | 14}, \
1686 {"$v15", RTYPE_VEC | 15}, \
1687 {"$v16", RTYPE_VEC | 16}, \
1688 {"$v17", RTYPE_VEC | 17}, \
1689 {"$v18", RTYPE_VEC | 18}, \
1690 {"$v19", RTYPE_VEC | 19}, \
1691 {"$v20", RTYPE_VEC | 20}, \
1692 {"$v21", RTYPE_VEC | 21}, \
1693 {"$v22", RTYPE_VEC | 22}, \
1694 {"$v23", RTYPE_VEC | 23}, \
1695 {"$v24", RTYPE_VEC | 24}, \
1696 {"$v25", RTYPE_VEC | 25}, \
1697 {"$v26", RTYPE_VEC | 26}, \
1698 {"$v27", RTYPE_VEC | 27}, \
1699 {"$v28", RTYPE_VEC | 28}, \
1700 {"$v29", RTYPE_VEC | 29}, \
1701 {"$v30", RTYPE_VEC | 30}, \
1702 {"$v31", RTYPE_VEC | 31}
1703
1704 #define MIPS_DSP_ACCUMULATOR_NAMES \
1705 {"$ac0", RTYPE_ACC | 0}, \
1706 {"$ac1", RTYPE_ACC | 1}, \
1707 {"$ac2", RTYPE_ACC | 2}, \
1708 {"$ac3", RTYPE_ACC | 3}
1709
1710 static const struct regname reg_names[] = {
1711 GENERIC_REGISTER_NUMBERS,
1712 FPU_REGISTER_NAMES,
1713 FPU_CONDITION_CODE_NAMES,
1714 COPROC_CONDITION_CODE_NAMES,
1715
1716 /* The $txx registers depends on the abi,
1717 these will be added later into the symbol table from
1718 one of the tables below once mips_abi is set after
1719 parsing of arguments from the command line. */
1720 SYMBOLIC_REGISTER_NAMES,
1721
1722 MIPS16_SPECIAL_REGISTER_NAMES,
1723 MDMX_VECTOR_REGISTER_NAMES,
1724 MIPS_DSP_ACCUMULATOR_NAMES,
1725 {0, 0}
1726 };
1727
1728 static const struct regname reg_names_o32[] = {
1729 O32_SYMBOLIC_REGISTER_NAMES,
1730 {0, 0}
1731 };
1732
1733 static const struct regname reg_names_n32n64[] = {
1734 N32N64_SYMBOLIC_REGISTER_NAMES,
1735 {0, 0}
1736 };
1737
1738 static int
1739 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1740 {
1741 symbolS *symbolP;
1742 char *e;
1743 char save_c;
1744 int reg = -1;
1745
1746 /* Find end of name. */
1747 e = *s;
1748 if (is_name_beginner (*e))
1749 ++e;
1750 while (is_part_of_name (*e))
1751 ++e;
1752
1753 /* Terminate name. */
1754 save_c = *e;
1755 *e = '\0';
1756
1757 /* Look for a register symbol. */
1758 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1759 {
1760 int r = S_GET_VALUE (symbolP);
1761 if (r & types)
1762 reg = r & RNUM_MASK;
1763 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1764 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1765 reg = (r & RNUM_MASK) - 2;
1766 }
1767 /* Else see if this is a register defined in an itbl entry. */
1768 else if ((types & RTYPE_GP) && itbl_have_entries)
1769 {
1770 char *n = *s;
1771 unsigned long r;
1772
1773 if (*n == '$')
1774 ++n;
1775 if (itbl_get_reg_val (n, &r))
1776 reg = r & RNUM_MASK;
1777 }
1778
1779 /* Advance to next token if a register was recognised. */
1780 if (reg >= 0)
1781 *s = e;
1782 else if (types & RWARN)
1783 as_warn ("Unrecognized register name `%s'", *s);
1784
1785 *e = save_c;
1786 if (regnop)
1787 *regnop = reg;
1788 return reg >= 0;
1789 }
1790
1791 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1792 architecture. If EXPANSIONP is TRUE then this check is done while
1793 expanding a macro. Use is_opcode_valid_16 for MIPS16 opcodes. */
1794
1795 static bfd_boolean
1796 is_opcode_valid (const struct mips_opcode *mo, bfd_boolean expansionp)
1797 {
1798 int isa = mips_opts.isa;
1799 int fp_s, fp_d;
1800
1801 if (mips_opts.ase_mdmx)
1802 isa |= INSN_MDMX;
1803 if (mips_opts.ase_dsp)
1804 isa |= INSN_DSP;
1805 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1806 isa |= INSN_DSP64;
1807 if (mips_opts.ase_dspr2)
1808 isa |= INSN_DSPR2;
1809 if (mips_opts.ase_mt)
1810 isa |= INSN_MT;
1811 if (mips_opts.ase_mips3d)
1812 isa |= INSN_MIPS3D;
1813 if (mips_opts.ase_smartmips)
1814 isa |= INSN_SMARTMIPS;
1815
1816 /* For user code we don't check for mips_opts.mips16 since we want
1817 to allow jalx if -mips16 was specified on the command line. */
1818 if (expansionp ? mips_opts.mips16 : file_ase_mips16)
1819 isa |= INSN_MIPS16;
1820
1821 /* Don't accept instructions based on the ISA if the CPU does not implement
1822 all the coprocessor insns. */
1823 if (NO_ISA_COP (mips_opts.arch)
1824 && COP_INSN (mo->pinfo))
1825 isa = 0;
1826
1827 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1828 return FALSE;
1829
1830 /* Check whether the instruction or macro requires single-precision or
1831 double-precision floating-point support. Note that this information is
1832 stored differently in the opcode table for insns and macros. */
1833 if (mo->pinfo == INSN_MACRO)
1834 {
1835 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1836 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1837 }
1838 else
1839 {
1840 fp_s = mo->pinfo & FP_S;
1841 fp_d = mo->pinfo & FP_D;
1842 }
1843
1844 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1845 return FALSE;
1846
1847 if (fp_s && mips_opts.soft_float)
1848 return FALSE;
1849
1850 return TRUE;
1851 }
1852
1853 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1854 selected ISA and architecture. */
1855
1856 static bfd_boolean
1857 is_opcode_valid_16 (const struct mips_opcode *mo)
1858 {
1859 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1860 }
1861
1862 /* This function is called once, at assembler startup time. It should set up
1863 all the tables, etc. that the MD part of the assembler will need. */
1864
1865 void
1866 md_begin (void)
1867 {
1868 const char *retval = NULL;
1869 int i = 0;
1870 int broken = 0;
1871
1872 if (mips_pic != NO_PIC)
1873 {
1874 if (g_switch_seen && g_switch_value != 0)
1875 as_bad (_("-G may not be used in position-independent code"));
1876 g_switch_value = 0;
1877 }
1878
1879 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1880 as_warn (_("Could not set architecture and machine"));
1881
1882 op_hash = hash_new ();
1883
1884 for (i = 0; i < NUMOPCODES;)
1885 {
1886 const char *name = mips_opcodes[i].name;
1887
1888 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1889 if (retval != NULL)
1890 {
1891 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1892 mips_opcodes[i].name, retval);
1893 /* Probably a memory allocation problem? Give up now. */
1894 as_fatal (_("Broken assembler. No assembly attempted."));
1895 }
1896 do
1897 {
1898 if (mips_opcodes[i].pinfo != INSN_MACRO)
1899 {
1900 if (!validate_mips_insn (&mips_opcodes[i]))
1901 broken = 1;
1902 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1903 {
1904 create_insn (&nop_insn, mips_opcodes + i);
1905 nop_insn.fixed_p = 1;
1906 }
1907 }
1908 ++i;
1909 }
1910 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1911 }
1912
1913 mips16_op_hash = hash_new ();
1914
1915 i = 0;
1916 while (i < bfd_mips16_num_opcodes)
1917 {
1918 const char *name = mips16_opcodes[i].name;
1919
1920 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1921 if (retval != NULL)
1922 as_fatal (_("internal: can't hash `%s': %s"),
1923 mips16_opcodes[i].name, retval);
1924 do
1925 {
1926 if (mips16_opcodes[i].pinfo != INSN_MACRO
1927 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1928 != mips16_opcodes[i].match))
1929 {
1930 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1931 mips16_opcodes[i].name, mips16_opcodes[i].args);
1932 broken = 1;
1933 }
1934 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1935 {
1936 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1937 mips16_nop_insn.fixed_p = 1;
1938 }
1939 ++i;
1940 }
1941 while (i < bfd_mips16_num_opcodes
1942 && strcmp (mips16_opcodes[i].name, name) == 0);
1943 }
1944
1945 if (broken)
1946 as_fatal (_("Broken assembler. No assembly attempted."));
1947
1948 /* We add all the general register names to the symbol table. This
1949 helps us detect invalid uses of them. */
1950 for (i = 0; reg_names[i].name; i++)
1951 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1952 reg_names[i].num, // & RNUM_MASK,
1953 &zero_address_frag));
1954 if (HAVE_NEWABI)
1955 for (i = 0; reg_names_n32n64[i].name; i++)
1956 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1957 reg_names_n32n64[i].num, // & RNUM_MASK,
1958 &zero_address_frag));
1959 else
1960 for (i = 0; reg_names_o32[i].name; i++)
1961 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1962 reg_names_o32[i].num, // & RNUM_MASK,
1963 &zero_address_frag));
1964
1965 mips_no_prev_insn ();
1966
1967 mips_gprmask = 0;
1968 mips_cprmask[0] = 0;
1969 mips_cprmask[1] = 0;
1970 mips_cprmask[2] = 0;
1971 mips_cprmask[3] = 0;
1972
1973 /* set the default alignment for the text section (2**2) */
1974 record_alignment (text_section, 2);
1975
1976 bfd_set_gp_size (stdoutput, g_switch_value);
1977
1978 #ifdef OBJ_ELF
1979 if (IS_ELF)
1980 {
1981 /* On a native system other than VxWorks, sections must be aligned
1982 to 16 byte boundaries. When configured for an embedded ELF
1983 target, we don't bother. */
1984 if (strncmp (TARGET_OS, "elf", 3) != 0
1985 && strncmp (TARGET_OS, "vxworks", 7) != 0)
1986 {
1987 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1988 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1989 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1990 }
1991
1992 /* Create a .reginfo section for register masks and a .mdebug
1993 section for debugging information. */
1994 {
1995 segT seg;
1996 subsegT subseg;
1997 flagword flags;
1998 segT sec;
1999
2000 seg = now_seg;
2001 subseg = now_subseg;
2002
2003 /* The ABI says this section should be loaded so that the
2004 running program can access it. However, we don't load it
2005 if we are configured for an embedded target */
2006 flags = SEC_READONLY | SEC_DATA;
2007 if (strncmp (TARGET_OS, "elf", 3) != 0)
2008 flags |= SEC_ALLOC | SEC_LOAD;
2009
2010 if (mips_abi != N64_ABI)
2011 {
2012 sec = subseg_new (".reginfo", (subsegT) 0);
2013
2014 bfd_set_section_flags (stdoutput, sec, flags);
2015 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2016
2017 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2018 }
2019 else
2020 {
2021 /* The 64-bit ABI uses a .MIPS.options section rather than
2022 .reginfo section. */
2023 sec = subseg_new (".MIPS.options", (subsegT) 0);
2024 bfd_set_section_flags (stdoutput, sec, flags);
2025 bfd_set_section_alignment (stdoutput, sec, 3);
2026
2027 /* Set up the option header. */
2028 {
2029 Elf_Internal_Options opthdr;
2030 char *f;
2031
2032 opthdr.kind = ODK_REGINFO;
2033 opthdr.size = (sizeof (Elf_External_Options)
2034 + sizeof (Elf64_External_RegInfo));
2035 opthdr.section = 0;
2036 opthdr.info = 0;
2037 f = frag_more (sizeof (Elf_External_Options));
2038 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2039 (Elf_External_Options *) f);
2040
2041 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2042 }
2043 }
2044
2045 if (ECOFF_DEBUGGING)
2046 {
2047 sec = subseg_new (".mdebug", (subsegT) 0);
2048 (void) bfd_set_section_flags (stdoutput, sec,
2049 SEC_HAS_CONTENTS | SEC_READONLY);
2050 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2051 }
2052 else if (mips_flag_pdr)
2053 {
2054 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2055 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2056 SEC_READONLY | SEC_RELOC
2057 | SEC_DEBUGGING);
2058 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2059 }
2060
2061 subseg_set (seg, subseg);
2062 }
2063 }
2064 #endif /* OBJ_ELF */
2065
2066 if (! ECOFF_DEBUGGING)
2067 md_obj_begin ();
2068
2069 if (mips_fix_vr4120)
2070 init_vr4120_conflicts ();
2071 }
2072
2073 void
2074 md_mips_end (void)
2075 {
2076 if (! ECOFF_DEBUGGING)
2077 md_obj_end ();
2078 }
2079
2080 void
2081 md_assemble (char *str)
2082 {
2083 struct mips_cl_insn insn;
2084 bfd_reloc_code_real_type unused_reloc[3]
2085 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2086
2087 imm_expr.X_op = O_absent;
2088 imm2_expr.X_op = O_absent;
2089 offset_expr.X_op = O_absent;
2090 imm_reloc[0] = BFD_RELOC_UNUSED;
2091 imm_reloc[1] = BFD_RELOC_UNUSED;
2092 imm_reloc[2] = BFD_RELOC_UNUSED;
2093 offset_reloc[0] = BFD_RELOC_UNUSED;
2094 offset_reloc[1] = BFD_RELOC_UNUSED;
2095 offset_reloc[2] = BFD_RELOC_UNUSED;
2096
2097 if (mips_opts.mips16)
2098 mips16_ip (str, &insn);
2099 else
2100 {
2101 mips_ip (str, &insn);
2102 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2103 str, insn.insn_opcode));
2104 }
2105
2106 if (insn_error)
2107 {
2108 as_bad ("%s `%s'", insn_error, str);
2109 return;
2110 }
2111
2112 if (insn.insn_mo->pinfo == INSN_MACRO)
2113 {
2114 macro_start ();
2115 if (mips_opts.mips16)
2116 mips16_macro (&insn);
2117 else
2118 macro (&insn);
2119 macro_end ();
2120 }
2121 else
2122 {
2123 if (imm_expr.X_op != O_absent)
2124 append_insn (&insn, &imm_expr, imm_reloc);
2125 else if (offset_expr.X_op != O_absent)
2126 append_insn (&insn, &offset_expr, offset_reloc);
2127 else
2128 append_insn (&insn, NULL, unused_reloc);
2129 }
2130 }
2131
2132 /* Return true if the given relocation might need a matching %lo().
2133 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2134 need a matching %lo() when applied to local symbols. */
2135
2136 static inline bfd_boolean
2137 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2138 {
2139 return (HAVE_IN_PLACE_ADDENDS
2140 && (reloc == BFD_RELOC_HI16_S
2141 || reloc == BFD_RELOC_MIPS16_HI16_S
2142 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2143 all GOT16 relocations evaluate to "G". */
2144 || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2145 }
2146
2147 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2148 relocation. */
2149
2150 static inline bfd_boolean
2151 fixup_has_matching_lo_p (fixS *fixp)
2152 {
2153 return (fixp->fx_next != NULL
2154 && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2155 || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2156 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2157 && fixp->fx_offset == fixp->fx_next->fx_offset);
2158 }
2159
2160 /* See whether instruction IP reads register REG. CLASS is the type
2161 of register. */
2162
2163 static int
2164 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2165 enum mips_regclass class)
2166 {
2167 if (class == MIPS16_REG)
2168 {
2169 assert (mips_opts.mips16);
2170 reg = mips16_to_32_reg_map[reg];
2171 class = MIPS_GR_REG;
2172 }
2173
2174 /* Don't report on general register ZERO, since it never changes. */
2175 if (class == MIPS_GR_REG && reg == ZERO)
2176 return 0;
2177
2178 if (class == MIPS_FP_REG)
2179 {
2180 assert (! mips_opts.mips16);
2181 /* If we are called with either $f0 or $f1, we must check $f0.
2182 This is not optimal, because it will introduce an unnecessary
2183 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2184 need to distinguish reading both $f0 and $f1 or just one of
2185 them. Note that we don't have to check the other way,
2186 because there is no instruction that sets both $f0 and $f1
2187 and requires a delay. */
2188 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2189 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2190 == (reg &~ (unsigned) 1)))
2191 return 1;
2192 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2193 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2194 == (reg &~ (unsigned) 1)))
2195 return 1;
2196 }
2197 else if (! mips_opts.mips16)
2198 {
2199 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2200 && EXTRACT_OPERAND (RS, *ip) == reg)
2201 return 1;
2202 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2203 && EXTRACT_OPERAND (RT, *ip) == reg)
2204 return 1;
2205 }
2206 else
2207 {
2208 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2209 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2210 return 1;
2211 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2212 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2213 return 1;
2214 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2215 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2216 == reg))
2217 return 1;
2218 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2219 return 1;
2220 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2221 return 1;
2222 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2223 return 1;
2224 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2225 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2226 return 1;
2227 }
2228
2229 return 0;
2230 }
2231
2232 /* This function returns true if modifying a register requires a
2233 delay. */
2234
2235 static int
2236 reg_needs_delay (unsigned int reg)
2237 {
2238 unsigned long prev_pinfo;
2239
2240 prev_pinfo = history[0].insn_mo->pinfo;
2241 if (! mips_opts.noreorder
2242 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2243 && ! gpr_interlocks)
2244 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2245 && ! cop_interlocks)))
2246 {
2247 /* A load from a coprocessor or from memory. All load delays
2248 delay the use of general register rt for one instruction. */
2249 /* Itbl support may require additional care here. */
2250 know (prev_pinfo & INSN_WRITE_GPR_T);
2251 if (reg == EXTRACT_OPERAND (RT, history[0]))
2252 return 1;
2253 }
2254
2255 return 0;
2256 }
2257
2258 /* Move all labels in insn_labels to the current insertion point. */
2259
2260 static void
2261 mips_move_labels (void)
2262 {
2263 segment_info_type *si = seg_info (now_seg);
2264 struct insn_label_list *l;
2265 valueT val;
2266
2267 for (l = si->label_list; l != NULL; l = l->next)
2268 {
2269 assert (S_GET_SEGMENT (l->label) == now_seg);
2270 symbol_set_frag (l->label, frag_now);
2271 val = (valueT) frag_now_fix ();
2272 /* mips16 text labels are stored as odd. */
2273 if (mips_opts.mips16)
2274 ++val;
2275 S_SET_VALUE (l->label, val);
2276 }
2277 }
2278
2279 static bfd_boolean
2280 s_is_linkonce (symbolS *sym, segT from_seg)
2281 {
2282 bfd_boolean linkonce = FALSE;
2283 segT symseg = S_GET_SEGMENT (sym);
2284
2285 if (symseg != from_seg && !S_IS_LOCAL (sym))
2286 {
2287 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2288 linkonce = TRUE;
2289 #ifdef OBJ_ELF
2290 /* The GNU toolchain uses an extension for ELF: a section
2291 beginning with the magic string .gnu.linkonce is a
2292 linkonce section. */
2293 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2294 sizeof ".gnu.linkonce" - 1) == 0)
2295 linkonce = TRUE;
2296 #endif
2297 }
2298 return linkonce;
2299 }
2300
2301 /* Mark instruction labels in mips16 mode. This permits the linker to
2302 handle them specially, such as generating jalx instructions when
2303 needed. We also make them odd for the duration of the assembly, in
2304 order to generate the right sort of code. We will make them even
2305 in the adjust_symtab routine, while leaving them marked. This is
2306 convenient for the debugger and the disassembler. The linker knows
2307 to make them odd again. */
2308
2309 static void
2310 mips16_mark_labels (void)
2311 {
2312 segment_info_type *si = seg_info (now_seg);
2313 struct insn_label_list *l;
2314
2315 if (!mips_opts.mips16)
2316 return;
2317
2318 for (l = si->label_list; l != NULL; l = l->next)
2319 {
2320 symbolS *label = l->label;
2321
2322 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2323 if (IS_ELF)
2324 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2325 #endif
2326 if ((S_GET_VALUE (label) & 1) == 0
2327 /* Don't adjust the address if the label is global or weak, or
2328 in a link-once section, since we'll be emitting symbol reloc
2329 references to it which will be patched up by the linker, and
2330 the final value of the symbol may or may not be MIPS16. */
2331 && ! S_IS_WEAK (label)
2332 && ! S_IS_EXTERNAL (label)
2333 && ! s_is_linkonce (label, now_seg))
2334 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2335 }
2336 }
2337
2338 /* End the current frag. Make it a variant frag and record the
2339 relaxation info. */
2340
2341 static void
2342 relax_close_frag (void)
2343 {
2344 mips_macro_warning.first_frag = frag_now;
2345 frag_var (rs_machine_dependent, 0, 0,
2346 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2347 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2348
2349 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2350 mips_relax.first_fixup = 0;
2351 }
2352
2353 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2354 See the comment above RELAX_ENCODE for more details. */
2355
2356 static void
2357 relax_start (symbolS *symbol)
2358 {
2359 assert (mips_relax.sequence == 0);
2360 mips_relax.sequence = 1;
2361 mips_relax.symbol = symbol;
2362 }
2363
2364 /* Start generating the second version of a relaxable sequence.
2365 See the comment above RELAX_ENCODE for more details. */
2366
2367 static void
2368 relax_switch (void)
2369 {
2370 assert (mips_relax.sequence == 1);
2371 mips_relax.sequence = 2;
2372 }
2373
2374 /* End the current relaxable sequence. */
2375
2376 static void
2377 relax_end (void)
2378 {
2379 assert (mips_relax.sequence == 2);
2380 relax_close_frag ();
2381 mips_relax.sequence = 0;
2382 }
2383
2384 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2385 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2386 by VR4120 errata. */
2387
2388 static unsigned int
2389 classify_vr4120_insn (const char *name)
2390 {
2391 if (strncmp (name, "macc", 4) == 0)
2392 return FIX_VR4120_MACC;
2393 if (strncmp (name, "dmacc", 5) == 0)
2394 return FIX_VR4120_DMACC;
2395 if (strncmp (name, "mult", 4) == 0)
2396 return FIX_VR4120_MULT;
2397 if (strncmp (name, "dmult", 5) == 0)
2398 return FIX_VR4120_DMULT;
2399 if (strstr (name, "div"))
2400 return FIX_VR4120_DIV;
2401 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2402 return FIX_VR4120_MTHILO;
2403 return NUM_FIX_VR4120_CLASSES;
2404 }
2405
2406 /* Return the number of instructions that must separate INSN1 and INSN2,
2407 where INSN1 is the earlier instruction. Return the worst-case value
2408 for any INSN2 if INSN2 is null. */
2409
2410 static unsigned int
2411 insns_between (const struct mips_cl_insn *insn1,
2412 const struct mips_cl_insn *insn2)
2413 {
2414 unsigned long pinfo1, pinfo2;
2415
2416 /* This function needs to know which pinfo flags are set for INSN2
2417 and which registers INSN2 uses. The former is stored in PINFO2 and
2418 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2419 will have every flag set and INSN2_USES_REG will always return true. */
2420 pinfo1 = insn1->insn_mo->pinfo;
2421 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2422
2423 #define INSN2_USES_REG(REG, CLASS) \
2424 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2425
2426 /* For most targets, write-after-read dependencies on the HI and LO
2427 registers must be separated by at least two instructions. */
2428 if (!hilo_interlocks)
2429 {
2430 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2431 return 2;
2432 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2433 return 2;
2434 }
2435
2436 /* If we're working around r7000 errata, there must be two instructions
2437 between an mfhi or mflo and any instruction that uses the result. */
2438 if (mips_7000_hilo_fix
2439 && MF_HILO_INSN (pinfo1)
2440 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2441 return 2;
2442
2443 /* If working around VR4120 errata, check for combinations that need
2444 a single intervening instruction. */
2445 if (mips_fix_vr4120)
2446 {
2447 unsigned int class1, class2;
2448
2449 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2450 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2451 {
2452 if (insn2 == NULL)
2453 return 1;
2454 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2455 if (vr4120_conflicts[class1] & (1 << class2))
2456 return 1;
2457 }
2458 }
2459
2460 if (!mips_opts.mips16)
2461 {
2462 /* Check for GPR or coprocessor load delays. All such delays
2463 are on the RT register. */
2464 /* Itbl support may require additional care here. */
2465 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2466 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2467 {
2468 know (pinfo1 & INSN_WRITE_GPR_T);
2469 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2470 return 1;
2471 }
2472
2473 /* Check for generic coprocessor hazards.
2474
2475 This case is not handled very well. There is no special
2476 knowledge of CP0 handling, and the coprocessors other than
2477 the floating point unit are not distinguished at all. */
2478 /* Itbl support may require additional care here. FIXME!
2479 Need to modify this to include knowledge about
2480 user specified delays! */
2481 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2482 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2483 {
2484 /* Handle cases where INSN1 writes to a known general coprocessor
2485 register. There must be a one instruction delay before INSN2
2486 if INSN2 reads that register, otherwise no delay is needed. */
2487 if (pinfo1 & INSN_WRITE_FPR_T)
2488 {
2489 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2490 return 1;
2491 }
2492 else if (pinfo1 & INSN_WRITE_FPR_S)
2493 {
2494 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2495 return 1;
2496 }
2497 else
2498 {
2499 /* Read-after-write dependencies on the control registers
2500 require a two-instruction gap. */
2501 if ((pinfo1 & INSN_WRITE_COND_CODE)
2502 && (pinfo2 & INSN_READ_COND_CODE))
2503 return 2;
2504
2505 /* We don't know exactly what INSN1 does. If INSN2 is
2506 also a coprocessor instruction, assume there must be
2507 a one instruction gap. */
2508 if (pinfo2 & INSN_COP)
2509 return 1;
2510 }
2511 }
2512
2513 /* Check for read-after-write dependencies on the coprocessor
2514 control registers in cases where INSN1 does not need a general
2515 coprocessor delay. This means that INSN1 is a floating point
2516 comparison instruction. */
2517 /* Itbl support may require additional care here. */
2518 else if (!cop_interlocks
2519 && (pinfo1 & INSN_WRITE_COND_CODE)
2520 && (pinfo2 & INSN_READ_COND_CODE))
2521 return 1;
2522 }
2523
2524 #undef INSN2_USES_REG
2525
2526 return 0;
2527 }
2528
2529 /* Return the number of nops that would be needed to work around the
2530 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2531 the MAX_VR4130_NOPS instructions described by HISTORY. */
2532
2533 static int
2534 nops_for_vr4130 (const struct mips_cl_insn *history,
2535 const struct mips_cl_insn *insn)
2536 {
2537 int i, j, reg;
2538
2539 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2540 are not affected by the errata. */
2541 if (insn != 0
2542 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2543 || strcmp (insn->insn_mo->name, "mtlo") == 0
2544 || strcmp (insn->insn_mo->name, "mthi") == 0))
2545 return 0;
2546
2547 /* Search for the first MFLO or MFHI. */
2548 for (i = 0; i < MAX_VR4130_NOPS; i++)
2549 if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2550 {
2551 /* Extract the destination register. */
2552 if (mips_opts.mips16)
2553 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2554 else
2555 reg = EXTRACT_OPERAND (RD, history[i]);
2556
2557 /* No nops are needed if INSN reads that register. */
2558 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2559 return 0;
2560
2561 /* ...or if any of the intervening instructions do. */
2562 for (j = 0; j < i; j++)
2563 if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2564 return 0;
2565
2566 return MAX_VR4130_NOPS - i;
2567 }
2568 return 0;
2569 }
2570
2571 /* Return the number of nops that would be needed if instruction INSN
2572 immediately followed the MAX_NOPS instructions given by HISTORY,
2573 where HISTORY[0] is the most recent instruction. If INSN is null,
2574 return the worse-case number of nops for any instruction. */
2575
2576 static int
2577 nops_for_insn (const struct mips_cl_insn *history,
2578 const struct mips_cl_insn *insn)
2579 {
2580 int i, nops, tmp_nops;
2581
2582 nops = 0;
2583 for (i = 0; i < MAX_DELAY_NOPS; i++)
2584 if (!history[i].noreorder_p)
2585 {
2586 tmp_nops = insns_between (history + i, insn) - i;
2587 if (tmp_nops > nops)
2588 nops = tmp_nops;
2589 }
2590
2591 if (mips_fix_vr4130)
2592 {
2593 tmp_nops = nops_for_vr4130 (history, insn);
2594 if (tmp_nops > nops)
2595 nops = tmp_nops;
2596 }
2597
2598 return nops;
2599 }
2600
2601 /* The variable arguments provide NUM_INSNS extra instructions that
2602 might be added to HISTORY. Return the largest number of nops that
2603 would be needed after the extended sequence. */
2604
2605 static int
2606 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2607 {
2608 va_list args;
2609 struct mips_cl_insn buffer[MAX_NOPS];
2610 struct mips_cl_insn *cursor;
2611 int nops;
2612
2613 va_start (args, history);
2614 cursor = buffer + num_insns;
2615 memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2616 while (cursor > buffer)
2617 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2618
2619 nops = nops_for_insn (buffer, NULL);
2620 va_end (args);
2621 return nops;
2622 }
2623
2624 /* Like nops_for_insn, but if INSN is a branch, take into account the
2625 worst-case delay for the branch target. */
2626
2627 static int
2628 nops_for_insn_or_target (const struct mips_cl_insn *history,
2629 const struct mips_cl_insn *insn)
2630 {
2631 int nops, tmp_nops;
2632
2633 nops = nops_for_insn (history, insn);
2634 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2635 | INSN_COND_BRANCH_DELAY
2636 | INSN_COND_BRANCH_LIKELY))
2637 {
2638 tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2639 if (tmp_nops > nops)
2640 nops = tmp_nops;
2641 }
2642 else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2643 {
2644 tmp_nops = nops_for_sequence (1, history, insn);
2645 if (tmp_nops > nops)
2646 nops = tmp_nops;
2647 }
2648 return nops;
2649 }
2650
2651 /* Output an instruction. IP is the instruction information.
2652 ADDRESS_EXPR is an operand of the instruction to be used with
2653 RELOC_TYPE. */
2654
2655 static void
2656 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2657 bfd_reloc_code_real_type *reloc_type)
2658 {
2659 unsigned long prev_pinfo, pinfo;
2660 relax_stateT prev_insn_frag_type = 0;
2661 bfd_boolean relaxed_branch = FALSE;
2662 segment_info_type *si = seg_info (now_seg);
2663
2664 /* Mark instruction labels in mips16 mode. */
2665 mips16_mark_labels ();
2666
2667 prev_pinfo = history[0].insn_mo->pinfo;
2668 pinfo = ip->insn_mo->pinfo;
2669
2670 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2671 {
2672 /* There are a lot of optimizations we could do that we don't.
2673 In particular, we do not, in general, reorder instructions.
2674 If you use gcc with optimization, it will reorder
2675 instructions and generally do much more optimization then we
2676 do here; repeating all that work in the assembler would only
2677 benefit hand written assembly code, and does not seem worth
2678 it. */
2679 int nops = (mips_optimize == 0
2680 ? nops_for_insn (history, NULL)
2681 : nops_for_insn_or_target (history, ip));
2682 if (nops > 0)
2683 {
2684 fragS *old_frag;
2685 unsigned long old_frag_offset;
2686 int i;
2687
2688 old_frag = frag_now;
2689 old_frag_offset = frag_now_fix ();
2690
2691 for (i = 0; i < nops; i++)
2692 emit_nop ();
2693
2694 if (listing)
2695 {
2696 listing_prev_line ();
2697 /* We may be at the start of a variant frag. In case we
2698 are, make sure there is enough space for the frag
2699 after the frags created by listing_prev_line. The
2700 argument to frag_grow here must be at least as large
2701 as the argument to all other calls to frag_grow in
2702 this file. We don't have to worry about being in the
2703 middle of a variant frag, because the variants insert
2704 all needed nop instructions themselves. */
2705 frag_grow (40);
2706 }
2707
2708 mips_move_labels ();
2709
2710 #ifndef NO_ECOFF_DEBUGGING
2711 if (ECOFF_DEBUGGING)
2712 ecoff_fix_loc (old_frag, old_frag_offset);
2713 #endif
2714 }
2715 }
2716 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2717 {
2718 /* Work out how many nops in prev_nop_frag are needed by IP. */
2719 int nops = nops_for_insn_or_target (history, ip);
2720 assert (nops <= prev_nop_frag_holds);
2721
2722 /* Enforce NOPS as a minimum. */
2723 if (nops > prev_nop_frag_required)
2724 prev_nop_frag_required = nops;
2725
2726 if (prev_nop_frag_holds == prev_nop_frag_required)
2727 {
2728 /* Settle for the current number of nops. Update the history
2729 accordingly (for the benefit of any future .set reorder code). */
2730 prev_nop_frag = NULL;
2731 insert_into_history (prev_nop_frag_since,
2732 prev_nop_frag_holds, NOP_INSN);
2733 }
2734 else
2735 {
2736 /* Allow this instruction to replace one of the nops that was
2737 tentatively added to prev_nop_frag. */
2738 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2739 prev_nop_frag_holds--;
2740 prev_nop_frag_since++;
2741 }
2742 }
2743
2744 #ifdef OBJ_ELF
2745 /* The value passed to dwarf2_emit_insn is the distance between
2746 the beginning of the current instruction and the address that
2747 should be recorded in the debug tables. For MIPS16 debug info
2748 we want to use ISA-encoded addresses, so we pass -1 for an
2749 address higher by one than the current. */
2750 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2751 #endif
2752
2753 /* Record the frag type before frag_var. */
2754 if (history[0].frag)
2755 prev_insn_frag_type = history[0].frag->fr_type;
2756
2757 if (address_expr
2758 && *reloc_type == BFD_RELOC_16_PCREL_S2
2759 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2760 || pinfo & INSN_COND_BRANCH_LIKELY)
2761 && mips_relax_branch
2762 /* Don't try branch relaxation within .set nomacro, or within
2763 .set noat if we use $at for PIC computations. If it turns
2764 out that the branch was out-of-range, we'll get an error. */
2765 && !mips_opts.warn_about_macros
2766 && (mips_opts.at || mips_pic == NO_PIC)
2767 && !mips_opts.mips16)
2768 {
2769 relaxed_branch = TRUE;
2770 add_relaxed_insn (ip, (relaxed_branch_length
2771 (NULL, NULL,
2772 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2773 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2774 : 0)), 4,
2775 RELAX_BRANCH_ENCODE
2776 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2777 pinfo & INSN_COND_BRANCH_LIKELY,
2778 pinfo & INSN_WRITE_GPR_31,
2779 0),
2780 address_expr->X_add_symbol,
2781 address_expr->X_add_number);
2782 *reloc_type = BFD_RELOC_UNUSED;
2783 }
2784 else if (*reloc_type > BFD_RELOC_UNUSED)
2785 {
2786 /* We need to set up a variant frag. */
2787 assert (mips_opts.mips16 && address_expr != NULL);
2788 add_relaxed_insn (ip, 4, 0,
2789 RELAX_MIPS16_ENCODE
2790 (*reloc_type - BFD_RELOC_UNUSED,
2791 mips16_small, mips16_ext,
2792 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2793 history[0].mips16_absolute_jump_p),
2794 make_expr_symbol (address_expr), 0);
2795 }
2796 else if (mips_opts.mips16
2797 && ! ip->use_extend
2798 && *reloc_type != BFD_RELOC_MIPS16_JMP)
2799 {
2800 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2801 /* Make sure there is enough room to swap this instruction with
2802 a following jump instruction. */
2803 frag_grow (6);
2804 add_fixed_insn (ip);
2805 }
2806 else
2807 {
2808 if (mips_opts.mips16
2809 && mips_opts.noreorder
2810 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2811 as_warn (_("extended instruction in delay slot"));
2812
2813 if (mips_relax.sequence)
2814 {
2815 /* If we've reached the end of this frag, turn it into a variant
2816 frag and record the information for the instructions we've
2817 written so far. */
2818 if (frag_room () < 4)
2819 relax_close_frag ();
2820 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2821 }
2822
2823 if (mips_relax.sequence != 2)
2824 mips_macro_warning.sizes[0] += 4;
2825 if (mips_relax.sequence != 1)
2826 mips_macro_warning.sizes[1] += 4;
2827
2828 if (mips_opts.mips16)
2829 {
2830 ip->fixed_p = 1;
2831 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2832 }
2833 add_fixed_insn (ip);
2834 }
2835
2836 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2837 {
2838 if (address_expr->X_op == O_constant)
2839 {
2840 unsigned int tmp;
2841
2842 switch (*reloc_type)
2843 {
2844 case BFD_RELOC_32:
2845 ip->insn_opcode |= address_expr->X_add_number;
2846 break;
2847
2848 case BFD_RELOC_MIPS_HIGHEST:
2849 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2850 ip->insn_opcode |= tmp & 0xffff;
2851 break;
2852
2853 case BFD_RELOC_MIPS_HIGHER:
2854 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2855 ip->insn_opcode |= tmp & 0xffff;
2856 break;
2857
2858 case BFD_RELOC_HI16_S:
2859 tmp = (address_expr->X_add_number + 0x8000) >> 16;
2860 ip->insn_opcode |= tmp & 0xffff;
2861 break;
2862
2863 case BFD_RELOC_HI16:
2864 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2865 break;
2866
2867 case BFD_RELOC_UNUSED:
2868 case BFD_RELOC_LO16:
2869 case BFD_RELOC_MIPS_GOT_DISP:
2870 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2871 break;
2872
2873 case BFD_RELOC_MIPS_JMP:
2874 if ((address_expr->X_add_number & 3) != 0)
2875 as_bad (_("jump to misaligned address (0x%lx)"),
2876 (unsigned long) address_expr->X_add_number);
2877 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2878 break;
2879
2880 case BFD_RELOC_MIPS16_JMP:
2881 if ((address_expr->X_add_number & 3) != 0)
2882 as_bad (_("jump to misaligned address (0x%lx)"),
2883 (unsigned long) address_expr->X_add_number);
2884 ip->insn_opcode |=
2885 (((address_expr->X_add_number & 0x7c0000) << 3)
2886 | ((address_expr->X_add_number & 0xf800000) >> 7)
2887 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2888 break;
2889
2890 case BFD_RELOC_16_PCREL_S2:
2891 if ((address_expr->X_add_number & 3) != 0)
2892 as_bad (_("branch to misaligned address (0x%lx)"),
2893 (unsigned long) address_expr->X_add_number);
2894 if (mips_relax_branch)
2895 goto need_reloc;
2896 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2897 as_bad (_("branch address range overflow (0x%lx)"),
2898 (unsigned long) address_expr->X_add_number);
2899 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2900 break;
2901
2902 default:
2903 internalError ();
2904 }
2905 }
2906 else if (*reloc_type < BFD_RELOC_UNUSED)
2907 need_reloc:
2908 {
2909 reloc_howto_type *howto;
2910 int i;
2911
2912 /* In a compound relocation, it is the final (outermost)
2913 operator that determines the relocated field. */
2914 for (i = 1; i < 3; i++)
2915 if (reloc_type[i] == BFD_RELOC_UNUSED)
2916 break;
2917
2918 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2919 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2920 bfd_get_reloc_size (howto),
2921 address_expr,
2922 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2923 reloc_type[0]);
2924
2925 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
2926 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2927 && ip->fixp[0]->fx_addsy)
2928 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2929
2930 /* These relocations can have an addend that won't fit in
2931 4 octets for 64bit assembly. */
2932 if (HAVE_64BIT_GPRS
2933 && ! howto->partial_inplace
2934 && (reloc_type[0] == BFD_RELOC_16
2935 || reloc_type[0] == BFD_RELOC_32
2936 || reloc_type[0] == BFD_RELOC_MIPS_JMP
2937 || reloc_type[0] == BFD_RELOC_HI16_S
2938 || reloc_type[0] == BFD_RELOC_LO16
2939 || reloc_type[0] == BFD_RELOC_GPREL16
2940 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2941 || reloc_type[0] == BFD_RELOC_GPREL32
2942 || reloc_type[0] == BFD_RELOC_64
2943 || reloc_type[0] == BFD_RELOC_CTOR
2944 || reloc_type[0] == BFD_RELOC_MIPS_SUB
2945 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2946 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2947 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2948 || reloc_type[0] == BFD_RELOC_MIPS_REL16
2949 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2950 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2951 || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2952 || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2953 ip->fixp[0]->fx_no_overflow = 1;
2954
2955 if (mips_relax.sequence)
2956 {
2957 if (mips_relax.first_fixup == 0)
2958 mips_relax.first_fixup = ip->fixp[0];
2959 }
2960 else if (reloc_needs_lo_p (*reloc_type))
2961 {
2962 struct mips_hi_fixup *hi_fixup;
2963
2964 /* Reuse the last entry if it already has a matching %lo. */
2965 hi_fixup = mips_hi_fixup_list;
2966 if (hi_fixup == 0
2967 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2968 {
2969 hi_fixup = ((struct mips_hi_fixup *)
2970 xmalloc (sizeof (struct mips_hi_fixup)));
2971 hi_fixup->next = mips_hi_fixup_list;
2972 mips_hi_fixup_list = hi_fixup;
2973 }
2974 hi_fixup->fixp = ip->fixp[0];
2975 hi_fixup->seg = now_seg;
2976 }
2977
2978 /* Add fixups for the second and third relocations, if given.
2979 Note that the ABI allows the second relocation to be
2980 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
2981 moment we only use RSS_UNDEF, but we could add support
2982 for the others if it ever becomes necessary. */
2983 for (i = 1; i < 3; i++)
2984 if (reloc_type[i] != BFD_RELOC_UNUSED)
2985 {
2986 ip->fixp[i] = fix_new (ip->frag, ip->where,
2987 ip->fixp[0]->fx_size, NULL, 0,
2988 FALSE, reloc_type[i]);
2989
2990 /* Use fx_tcbit to mark compound relocs. */
2991 ip->fixp[0]->fx_tcbit = 1;
2992 ip->fixp[i]->fx_tcbit = 1;
2993 }
2994 }
2995 }
2996 install_insn (ip);
2997
2998 /* Update the register mask information. */
2999 if (! mips_opts.mips16)
3000 {
3001 if (pinfo & INSN_WRITE_GPR_D)
3002 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3003 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3004 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3005 if (pinfo & INSN_READ_GPR_S)
3006 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3007 if (pinfo & INSN_WRITE_GPR_31)
3008 mips_gprmask |= 1 << RA;
3009 if (pinfo & INSN_WRITE_FPR_D)
3010 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3011 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3012 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3013 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3014 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3015 if ((pinfo & INSN_READ_FPR_R) != 0)
3016 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3017 if (pinfo & INSN_COP)
3018 {
3019 /* We don't keep enough information to sort these cases out.
3020 The itbl support does keep this information however, although
3021 we currently don't support itbl fprmats as part of the cop
3022 instruction. May want to add this support in the future. */
3023 }
3024 /* Never set the bit for $0, which is always zero. */
3025 mips_gprmask &= ~1 << 0;
3026 }
3027 else
3028 {
3029 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3030 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3031 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3032 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3033 if (pinfo & MIPS16_INSN_WRITE_Z)
3034 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3035 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3036 mips_gprmask |= 1 << TREG;
3037 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3038 mips_gprmask |= 1 << SP;
3039 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3040 mips_gprmask |= 1 << RA;
3041 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3042 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3043 if (pinfo & MIPS16_INSN_READ_Z)
3044 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3045 if (pinfo & MIPS16_INSN_READ_GPR_X)
3046 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3047 }
3048
3049 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3050 {
3051 /* Filling the branch delay slot is more complex. We try to
3052 switch the branch with the previous instruction, which we can
3053 do if the previous instruction does not set up a condition
3054 that the branch tests and if the branch is not itself the
3055 target of any branch. */
3056 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3057 || (pinfo & INSN_COND_BRANCH_DELAY))
3058 {
3059 if (mips_optimize < 2
3060 /* If we have seen .set volatile or .set nomove, don't
3061 optimize. */
3062 || mips_opts.nomove != 0
3063 /* We can't swap if the previous instruction's position
3064 is fixed. */
3065 || history[0].fixed_p
3066 /* If the previous previous insn was in a .set
3067 noreorder, we can't swap. Actually, the MIPS
3068 assembler will swap in this situation. However, gcc
3069 configured -with-gnu-as will generate code like
3070 .set noreorder
3071 lw $4,XXX
3072 .set reorder
3073 INSN
3074 bne $4,$0,foo
3075 in which we can not swap the bne and INSN. If gcc is
3076 not configured -with-gnu-as, it does not output the
3077 .set pseudo-ops. */
3078 || history[1].noreorder_p
3079 /* If the branch is itself the target of a branch, we
3080 can not swap. We cheat on this; all we check for is
3081 whether there is a label on this instruction. If
3082 there are any branches to anything other than a
3083 label, users must use .set noreorder. */
3084 || si->label_list != NULL
3085 /* If the previous instruction is in a variant frag
3086 other than this branch's one, we cannot do the swap.
3087 This does not apply to the mips16, which uses variant
3088 frags for different purposes. */
3089 || (! mips_opts.mips16
3090 && prev_insn_frag_type == rs_machine_dependent)
3091 /* Check for conflicts between the branch and the instructions
3092 before the candidate delay slot. */
3093 || nops_for_insn (history + 1, ip) > 0
3094 /* Check for conflicts between the swapped sequence and the
3095 target of the branch. */
3096 || nops_for_sequence (2, history + 1, ip, history) > 0
3097 /* We do not swap with a trap instruction, since it
3098 complicates trap handlers to have the trap
3099 instruction be in a delay slot. */
3100 || (prev_pinfo & INSN_TRAP)
3101 /* If the branch reads a register that the previous
3102 instruction sets, we can not swap. */
3103 || (! mips_opts.mips16
3104 && (prev_pinfo & INSN_WRITE_GPR_T)
3105 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3106 MIPS_GR_REG))
3107 || (! mips_opts.mips16
3108 && (prev_pinfo & INSN_WRITE_GPR_D)
3109 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3110 MIPS_GR_REG))
3111 || (mips_opts.mips16
3112 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3113 && (insn_uses_reg
3114 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3115 MIPS16_REG)))
3116 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3117 && (insn_uses_reg
3118 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3119 MIPS16_REG)))
3120 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3121 && (insn_uses_reg
3122 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3123 MIPS16_REG)))
3124 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3125 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3126 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3127 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3128 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3129 && insn_uses_reg (ip,
3130 MIPS16OP_EXTRACT_REG32R
3131 (history[0].insn_opcode),
3132 MIPS_GR_REG))))
3133 /* If the branch writes a register that the previous
3134 instruction sets, we can not swap (we know that
3135 branches write only to RD or to $31). */
3136 || (! mips_opts.mips16
3137 && (prev_pinfo & INSN_WRITE_GPR_T)
3138 && (((pinfo & INSN_WRITE_GPR_D)
3139 && (EXTRACT_OPERAND (RT, history[0])
3140 == EXTRACT_OPERAND (RD, *ip)))
3141 || ((pinfo & INSN_WRITE_GPR_31)
3142 && EXTRACT_OPERAND (RT, history[0]) == RA)))
3143 || (! mips_opts.mips16
3144 && (prev_pinfo & INSN_WRITE_GPR_D)
3145 && (((pinfo & INSN_WRITE_GPR_D)
3146 && (EXTRACT_OPERAND (RD, history[0])
3147 == EXTRACT_OPERAND (RD, *ip)))
3148 || ((pinfo & INSN_WRITE_GPR_31)
3149 && EXTRACT_OPERAND (RD, history[0]) == RA)))
3150 || (mips_opts.mips16
3151 && (pinfo & MIPS16_INSN_WRITE_31)
3152 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3153 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3154 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3155 == RA))))
3156 /* If the branch writes a register that the previous
3157 instruction reads, we can not swap (we know that
3158 branches only write to RD or to $31). */
3159 || (! mips_opts.mips16
3160 && (pinfo & INSN_WRITE_GPR_D)
3161 && insn_uses_reg (&history[0],
3162 EXTRACT_OPERAND (RD, *ip),
3163 MIPS_GR_REG))
3164 || (! mips_opts.mips16
3165 && (pinfo & INSN_WRITE_GPR_31)
3166 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3167 || (mips_opts.mips16
3168 && (pinfo & MIPS16_INSN_WRITE_31)
3169 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3170 /* If one instruction sets a condition code and the
3171 other one uses a condition code, we can not swap. */
3172 || ((pinfo & INSN_READ_COND_CODE)
3173 && (prev_pinfo & INSN_WRITE_COND_CODE))
3174 || ((pinfo & INSN_WRITE_COND_CODE)
3175 && (prev_pinfo & INSN_READ_COND_CODE))
3176 /* If the previous instruction uses the PC, we can not
3177 swap. */
3178 || (mips_opts.mips16
3179 && (prev_pinfo & MIPS16_INSN_READ_PC))
3180 /* If the previous instruction had a fixup in mips16
3181 mode, we can not swap. This normally means that the
3182 previous instruction was a 4 byte branch anyhow. */
3183 || (mips_opts.mips16 && history[0].fixp[0])
3184 /* If the previous instruction is a sync, sync.l, or
3185 sync.p, we can not swap. */
3186 || (prev_pinfo & INSN_SYNC))
3187 {
3188 if (mips_opts.mips16
3189 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3190 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3191 && ISA_SUPPORTS_MIPS16E)
3192 {
3193 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3194 ip->insn_opcode |= 0x0080;
3195 install_insn (ip);
3196 insert_into_history (0, 1, ip);
3197 }
3198 else
3199 {
3200 /* We could do even better for unconditional branches to
3201 portions of this object file; we could pick up the
3202 instruction at the destination, put it in the delay
3203 slot, and bump the destination address. */
3204 insert_into_history (0, 1, ip);
3205 emit_nop ();
3206 }
3207
3208 if (mips_relax.sequence)
3209 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3210 }
3211 else
3212 {
3213 /* It looks like we can actually do the swap. */
3214 struct mips_cl_insn delay = history[0];
3215 if (mips_opts.mips16)
3216 {
3217 know (delay.frag == ip->frag);
3218 move_insn (ip, delay.frag, delay.where);
3219 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3220 }
3221 else if (relaxed_branch)
3222 {
3223 /* Add the delay slot instruction to the end of the
3224 current frag and shrink the fixed part of the
3225 original frag. If the branch occupies the tail of
3226 the latter, move it backwards to cover the gap. */
3227 delay.frag->fr_fix -= 4;
3228 if (delay.frag == ip->frag)
3229 move_insn (ip, ip->frag, ip->where - 4);
3230 add_fixed_insn (&delay);
3231 }
3232 else
3233 {
3234 move_insn (&delay, ip->frag, ip->where);
3235 move_insn (ip, history[0].frag, history[0].where);
3236 }
3237 history[0] = *ip;
3238 delay.fixed_p = 1;
3239 insert_into_history (0, 1, &delay);
3240 }
3241
3242 /* If that was an unconditional branch, forget the previous
3243 insn information. */
3244 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3245 mips_no_prev_insn ();
3246 }
3247 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3248 {
3249 /* We don't yet optimize a branch likely. What we should do
3250 is look at the target, copy the instruction found there
3251 into the delay slot, and increment the branch to jump to
3252 the next instruction. */
3253 insert_into_history (0, 1, ip);
3254 emit_nop ();
3255 }
3256 else
3257 insert_into_history (0, 1, ip);
3258 }
3259 else
3260 insert_into_history (0, 1, ip);
3261
3262 /* We just output an insn, so the next one doesn't have a label. */
3263 mips_clear_insn_labels ();
3264 }
3265
3266 /* Forget that there was any previous instruction or label. */
3267
3268 static void
3269 mips_no_prev_insn (void)
3270 {
3271 prev_nop_frag = NULL;
3272 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3273 mips_clear_insn_labels ();
3274 }
3275
3276 /* This function must be called before we emit something other than
3277 instructions. It is like mips_no_prev_insn except that it inserts
3278 any NOPS that might be needed by previous instructions. */
3279
3280 void
3281 mips_emit_delays (void)
3282 {
3283 if (! mips_opts.noreorder)
3284 {
3285 int nops = nops_for_insn (history, NULL);
3286 if (nops > 0)
3287 {
3288 while (nops-- > 0)
3289 add_fixed_insn (NOP_INSN);
3290 mips_move_labels ();
3291 }
3292 }
3293 mips_no_prev_insn ();
3294 }
3295
3296 /* Start a (possibly nested) noreorder block. */
3297
3298 static void
3299 start_noreorder (void)
3300 {
3301 if (mips_opts.noreorder == 0)
3302 {
3303 unsigned int i;
3304 int nops;
3305
3306 /* None of the instructions before the .set noreorder can be moved. */
3307 for (i = 0; i < ARRAY_SIZE (history); i++)
3308 history[i].fixed_p = 1;
3309
3310 /* Insert any nops that might be needed between the .set noreorder
3311 block and the previous instructions. We will later remove any
3312 nops that turn out not to be needed. */
3313 nops = nops_for_insn (history, NULL);
3314 if (nops > 0)
3315 {
3316 if (mips_optimize != 0)
3317 {
3318 /* Record the frag which holds the nop instructions, so
3319 that we can remove them if we don't need them. */
3320 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3321 prev_nop_frag = frag_now;
3322 prev_nop_frag_holds = nops;
3323 prev_nop_frag_required = 0;
3324 prev_nop_frag_since = 0;
3325 }
3326
3327 for (; nops > 0; --nops)
3328 add_fixed_insn (NOP_INSN);
3329
3330 /* Move on to a new frag, so that it is safe to simply
3331 decrease the size of prev_nop_frag. */
3332 frag_wane (frag_now);
3333 frag_new (0);
3334 mips_move_labels ();
3335 }
3336 mips16_mark_labels ();
3337 mips_clear_insn_labels ();
3338 }
3339 mips_opts.noreorder++;
3340 mips_any_noreorder = 1;
3341 }
3342
3343 /* End a nested noreorder block. */
3344
3345 static void
3346 end_noreorder (void)
3347 {
3348 mips_opts.noreorder--;
3349 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3350 {
3351 /* Commit to inserting prev_nop_frag_required nops and go back to
3352 handling nop insertion the .set reorder way. */
3353 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3354 * (mips_opts.mips16 ? 2 : 4));
3355 insert_into_history (prev_nop_frag_since,
3356 prev_nop_frag_required, NOP_INSN);
3357 prev_nop_frag = NULL;
3358 }
3359 }
3360
3361 /* Set up global variables for the start of a new macro. */
3362
3363 static void
3364 macro_start (void)
3365 {
3366 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3367 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3368 && (history[0].insn_mo->pinfo
3369 & (INSN_UNCOND_BRANCH_DELAY
3370 | INSN_COND_BRANCH_DELAY
3371 | INSN_COND_BRANCH_LIKELY)) != 0);
3372 }
3373
3374 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3375 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3376 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3377
3378 static const char *
3379 macro_warning (relax_substateT subtype)
3380 {
3381 if (subtype & RELAX_DELAY_SLOT)
3382 return _("Macro instruction expanded into multiple instructions"
3383 " in a branch delay slot");
3384 else if (subtype & RELAX_NOMACRO)
3385 return _("Macro instruction expanded into multiple instructions");
3386 else
3387 return 0;
3388 }
3389
3390 /* Finish up a macro. Emit warnings as appropriate. */
3391
3392 static void
3393 macro_end (void)
3394 {
3395 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3396 {
3397 relax_substateT subtype;
3398
3399 /* Set up the relaxation warning flags. */
3400 subtype = 0;
3401 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3402 subtype |= RELAX_SECOND_LONGER;
3403 if (mips_opts.warn_about_macros)
3404 subtype |= RELAX_NOMACRO;
3405 if (mips_macro_warning.delay_slot_p)
3406 subtype |= RELAX_DELAY_SLOT;
3407
3408 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3409 {
3410 /* Either the macro has a single implementation or both
3411 implementations are longer than 4 bytes. Emit the
3412 warning now. */
3413 const char *msg = macro_warning (subtype);
3414 if (msg != 0)
3415 as_warn (msg);
3416 }
3417 else
3418 {
3419 /* One implementation might need a warning but the other
3420 definitely doesn't. */
3421 mips_macro_warning.first_frag->fr_subtype |= subtype;
3422 }
3423 }
3424 }
3425
3426 /* Read a macro's relocation codes from *ARGS and store them in *R.
3427 The first argument in *ARGS will be either the code for a single
3428 relocation or -1 followed by the three codes that make up a
3429 composite relocation. */
3430
3431 static void
3432 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3433 {
3434 int i, next;
3435
3436 next = va_arg (*args, int);
3437 if (next >= 0)
3438 r[0] = (bfd_reloc_code_real_type) next;
3439 else
3440 for (i = 0; i < 3; i++)
3441 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3442 }
3443
3444 /* Build an instruction created by a macro expansion. This is passed
3445 a pointer to the count of instructions created so far, an
3446 expression, the name of the instruction to build, an operand format
3447 string, and corresponding arguments. */
3448
3449 static void
3450 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3451 {
3452 const struct mips_opcode *mo;
3453 struct mips_cl_insn insn;
3454 bfd_reloc_code_real_type r[3];
3455 va_list args;
3456
3457 va_start (args, fmt);
3458
3459 if (mips_opts.mips16)
3460 {
3461 mips16_macro_build (ep, name, fmt, args);
3462 va_end (args);
3463 return;
3464 }
3465
3466 r[0] = BFD_RELOC_UNUSED;
3467 r[1] = BFD_RELOC_UNUSED;
3468 r[2] = BFD_RELOC_UNUSED;
3469 mo = (struct mips_opcode *) hash_find (op_hash, name);
3470 assert (mo);
3471 assert (strcmp (name, mo->name) == 0);
3472
3473 while (1)
3474 {
3475 /* Search until we get a match for NAME. It is assumed here that
3476 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3477 if (strcmp (fmt, mo->args) == 0
3478 && mo->pinfo != INSN_MACRO
3479 && is_opcode_valid (mo, TRUE))
3480 break;
3481
3482 ++mo;
3483 assert (mo->name);
3484 assert (strcmp (name, mo->name) == 0);
3485 }
3486
3487 create_insn (&insn, mo);
3488 for (;;)
3489 {
3490 switch (*fmt++)
3491 {
3492 case '\0':
3493 break;
3494
3495 case ',':
3496 case '(':
3497 case ')':
3498 continue;
3499
3500 case '+':
3501 switch (*fmt++)
3502 {
3503 case 'A':
3504 case 'E':
3505 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3506 continue;
3507
3508 case 'B':
3509 case 'F':
3510 /* Note that in the macro case, these arguments are already
3511 in MSB form. (When handling the instruction in the
3512 non-macro case, these arguments are sizes from which
3513 MSB values must be calculated.) */
3514 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3515 continue;
3516
3517 case 'C':
3518 case 'G':
3519 case 'H':
3520 /* Note that in the macro case, these arguments are already
3521 in MSBD form. (When handling the instruction in the
3522 non-macro case, these arguments are sizes from which
3523 MSBD values must be calculated.) */
3524 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3525 continue;
3526
3527 case 'Q':
3528 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3529 continue;
3530
3531 default:
3532 internalError ();
3533 }
3534 continue;
3535
3536 case '2':
3537 INSERT_OPERAND (BP, insn, va_arg (args, int));
3538 continue;
3539
3540 case 't':
3541 case 'w':
3542 case 'E':
3543 INSERT_OPERAND (RT, insn, va_arg (args, int));
3544 continue;
3545
3546 case 'c':
3547 INSERT_OPERAND (CODE, insn, va_arg (args, int));
3548 continue;
3549
3550 case 'T':
3551 case 'W':
3552 INSERT_OPERAND (FT, insn, va_arg (args, int));
3553 continue;
3554
3555 case 'd':
3556 case 'G':
3557 case 'K':
3558 INSERT_OPERAND (RD, insn, va_arg (args, int));
3559 continue;
3560
3561 case 'U':
3562 {
3563 int tmp = va_arg (args, int);
3564
3565 INSERT_OPERAND (RT, insn, tmp);
3566 INSERT_OPERAND (RD, insn, tmp);
3567 continue;
3568 }
3569
3570 case 'V':
3571 case 'S':
3572 INSERT_OPERAND (FS, insn, va_arg (args, int));
3573 continue;
3574
3575 case 'z':
3576 continue;
3577
3578 case '<':
3579 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3580 continue;
3581
3582 case 'D':
3583 INSERT_OPERAND (FD, insn, va_arg (args, int));
3584 continue;
3585
3586 case 'B':
3587 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3588 continue;
3589
3590 case 'J':
3591 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3592 continue;
3593
3594 case 'q':
3595 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3596 continue;
3597
3598 case 'b':
3599 case 's':
3600 case 'r':
3601 case 'v':
3602 INSERT_OPERAND (RS, insn, va_arg (args, int));
3603 continue;
3604
3605 case 'i':
3606 case 'j':
3607 case 'o':
3608 macro_read_relocs (&args, r);
3609 assert (*r == BFD_RELOC_GPREL16
3610 || *r == BFD_RELOC_MIPS_LITERAL
3611 || *r == BFD_RELOC_MIPS_HIGHER
3612 || *r == BFD_RELOC_HI16_S
3613 || *r == BFD_RELOC_LO16
3614 || *r == BFD_RELOC_MIPS_GOT16
3615 || *r == BFD_RELOC_MIPS_CALL16
3616 || *r == BFD_RELOC_MIPS_GOT_DISP
3617 || *r == BFD_RELOC_MIPS_GOT_PAGE
3618 || *r == BFD_RELOC_MIPS_GOT_OFST
3619 || *r == BFD_RELOC_MIPS_GOT_LO16
3620 || *r == BFD_RELOC_MIPS_CALL_LO16);
3621 continue;
3622
3623 case 'u':
3624 macro_read_relocs (&args, r);
3625 assert (ep != NULL
3626 && (ep->X_op == O_constant
3627 || (ep->X_op == O_symbol
3628 && (*r == BFD_RELOC_MIPS_HIGHEST
3629 || *r == BFD_RELOC_HI16_S
3630 || *r == BFD_RELOC_HI16
3631 || *r == BFD_RELOC_GPREL16
3632 || *r == BFD_RELOC_MIPS_GOT_HI16
3633 || *r == BFD_RELOC_MIPS_CALL_HI16))));
3634 continue;
3635
3636 case 'p':
3637 assert (ep != NULL);
3638
3639 /*
3640 * This allows macro() to pass an immediate expression for
3641 * creating short branches without creating a symbol.
3642 *
3643 * We don't allow branch relaxation for these branches, as
3644 * they should only appear in ".set nomacro" anyway.
3645 */
3646 if (ep->X_op == O_constant)
3647 {
3648 if ((ep->X_add_number & 3) != 0)
3649 as_bad (_("branch to misaligned address (0x%lx)"),
3650 (unsigned long) ep->X_add_number);
3651 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3652 as_bad (_("branch address range overflow (0x%lx)"),
3653 (unsigned long) ep->X_add_number);
3654 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3655 ep = NULL;
3656 }
3657 else
3658 *r = BFD_RELOC_16_PCREL_S2;
3659 continue;
3660
3661 case 'a':
3662 assert (ep != NULL);
3663 *r = BFD_RELOC_MIPS_JMP;
3664 continue;
3665
3666 case 'C':
3667 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3668 continue;
3669
3670 case 'k':
3671 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3672 continue;
3673
3674 default:
3675 internalError ();
3676 }
3677 break;
3678 }
3679 va_end (args);
3680 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3681
3682 append_insn (&insn, ep, r);
3683 }
3684
3685 static void
3686 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3687 va_list args)
3688 {
3689 struct mips_opcode *mo;
3690 struct mips_cl_insn insn;
3691 bfd_reloc_code_real_type r[3]
3692 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3693
3694 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3695 assert (mo);
3696 assert (strcmp (name, mo->name) == 0);
3697
3698 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3699 {
3700 ++mo;
3701 assert (mo->name);
3702 assert (strcmp (name, mo->name) == 0);
3703 }
3704
3705 create_insn (&insn, mo);
3706 for (;;)
3707 {
3708 int c;
3709
3710 c = *fmt++;
3711 switch (c)
3712 {
3713 case '\0':
3714 break;
3715
3716 case ',':
3717 case '(':
3718 case ')':
3719 continue;
3720
3721 case 'y':
3722 case 'w':
3723 MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3724 continue;
3725
3726 case 'x':
3727 case 'v':
3728 MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3729 continue;
3730
3731 case 'z':
3732 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3733 continue;
3734
3735 case 'Z':
3736 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3737 continue;
3738
3739 case '0':
3740 case 'S':
3741 case 'P':
3742 case 'R':
3743 continue;
3744
3745 case 'X':
3746 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3747 continue;
3748
3749 case 'Y':
3750 {
3751 int regno;
3752
3753 regno = va_arg (args, int);
3754 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3755 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3756 }
3757 continue;
3758
3759 case '<':
3760 case '>':
3761 case '4':
3762 case '5':
3763 case 'H':
3764 case 'W':
3765 case 'D':
3766 case 'j':
3767 case '8':
3768 case 'V':
3769 case 'C':
3770 case 'U':
3771 case 'k':
3772 case 'K':
3773 case 'p':
3774 case 'q':
3775 {
3776 assert (ep != NULL);
3777
3778 if (ep->X_op != O_constant)
3779 *r = (int) BFD_RELOC_UNUSED + c;
3780 else
3781 {
3782 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3783 FALSE, &insn.insn_opcode, &insn.use_extend,
3784 &insn.extend);
3785 ep = NULL;
3786 *r = BFD_RELOC_UNUSED;
3787 }
3788 }
3789 continue;
3790
3791 case '6':
3792 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3793 continue;
3794 }
3795
3796 break;
3797 }
3798
3799 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3800
3801 append_insn (&insn, ep, r);
3802 }
3803
3804 /*
3805 * Sign-extend 32-bit mode constants that have bit 31 set and all
3806 * higher bits unset.
3807 */
3808 static void
3809 normalize_constant_expr (expressionS *ex)
3810 {
3811 if (ex->X_op == O_constant
3812 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3813 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3814 - 0x80000000);
3815 }
3816
3817 /*
3818 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3819 * all higher bits unset.
3820 */
3821 static void
3822 normalize_address_expr (expressionS *ex)
3823 {
3824 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3825 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3826 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3827 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3828 - 0x80000000);
3829 }
3830
3831 /*
3832 * Generate a "jalr" instruction with a relocation hint to the called
3833 * function. This occurs in NewABI PIC code.
3834 */
3835 static void
3836 macro_build_jalr (expressionS *ep)
3837 {
3838 char *f = NULL;
3839
3840 if (HAVE_NEWABI)
3841 {
3842 frag_grow (8);
3843 f = frag_more (0);
3844 }
3845 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3846 if (HAVE_NEWABI)
3847 fix_new_exp (frag_now, f - frag_now->fr_literal,
3848 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3849 }
3850
3851 /*
3852 * Generate a "lui" instruction.
3853 */
3854 static void
3855 macro_build_lui (expressionS *ep, int regnum)
3856 {
3857 expressionS high_expr;
3858 const struct mips_opcode *mo;
3859 struct mips_cl_insn insn;
3860 bfd_reloc_code_real_type r[3]
3861 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3862 const char *name = "lui";
3863 const char *fmt = "t,u";
3864
3865 assert (! mips_opts.mips16);
3866
3867 high_expr = *ep;
3868
3869 if (high_expr.X_op == O_constant)
3870 {
3871 /* We can compute the instruction now without a relocation entry. */
3872 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3873 >> 16) & 0xffff;
3874 *r = BFD_RELOC_UNUSED;
3875 }
3876 else
3877 {
3878 assert (ep->X_op == O_symbol);
3879 /* _gp_disp is a special case, used from s_cpload.
3880 __gnu_local_gp is used if mips_no_shared. */
3881 assert (mips_pic == NO_PIC
3882 || (! HAVE_NEWABI
3883 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3884 || (! mips_in_shared
3885 && strcmp (S_GET_NAME (ep->X_add_symbol),
3886 "__gnu_local_gp") == 0));
3887 *r = BFD_RELOC_HI16_S;
3888 }
3889
3890 mo = hash_find (op_hash, name);
3891 assert (strcmp (name, mo->name) == 0);
3892 assert (strcmp (fmt, mo->args) == 0);
3893 create_insn (&insn, mo);
3894
3895 insn.insn_opcode = insn.insn_mo->match;
3896 INSERT_OPERAND (RT, insn, regnum);
3897 if (*r == BFD_RELOC_UNUSED)
3898 {
3899 insn.insn_opcode |= high_expr.X_add_number;
3900 append_insn (&insn, NULL, r);
3901 }
3902 else
3903 append_insn (&insn, &high_expr, r);
3904 }
3905
3906 /* Generate a sequence of instructions to do a load or store from a constant
3907 offset off of a base register (breg) into/from a target register (treg),
3908 using AT if necessary. */
3909 static void
3910 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3911 int treg, int breg, int dbl)
3912 {
3913 assert (ep->X_op == O_constant);
3914
3915 /* Sign-extending 32-bit constants makes their handling easier. */
3916 if (!dbl)
3917 normalize_constant_expr (ep);
3918
3919 /* Right now, this routine can only handle signed 32-bit constants. */
3920 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3921 as_warn (_("operand overflow"));
3922
3923 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3924 {
3925 /* Signed 16-bit offset will fit in the op. Easy! */
3926 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3927 }
3928 else
3929 {
3930 /* 32-bit offset, need multiple instructions and AT, like:
3931 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3932 addu $tempreg,$tempreg,$breg
3933 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3934 to handle the complete offset. */
3935 macro_build_lui (ep, AT);
3936 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3937 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3938
3939 if (!mips_opts.at)
3940 as_bad (_("Macro used $at after \".set noat\""));
3941 }
3942 }
3943
3944 /* set_at()
3945 * Generates code to set the $at register to true (one)
3946 * if reg is less than the immediate expression.
3947 */
3948 static void
3949 set_at (int reg, int unsignedp)
3950 {
3951 if (imm_expr.X_op == O_constant
3952 && imm_expr.X_add_number >= -0x8000
3953 && imm_expr.X_add_number < 0x8000)
3954 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3955 AT, reg, BFD_RELOC_LO16);
3956 else
3957 {
3958 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3959 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3960 }
3961 }
3962
3963 /* Warn if an expression is not a constant. */
3964
3965 static void
3966 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3967 {
3968 if (ex->X_op == O_big)
3969 as_bad (_("unsupported large constant"));
3970 else if (ex->X_op != O_constant)
3971 as_bad (_("Instruction %s requires absolute expression"),
3972 ip->insn_mo->name);
3973
3974 if (HAVE_32BIT_GPRS)
3975 normalize_constant_expr (ex);
3976 }
3977
3978 /* Count the leading zeroes by performing a binary chop. This is a
3979 bulky bit of source, but performance is a LOT better for the
3980 majority of values than a simple loop to count the bits:
3981 for (lcnt = 0; (lcnt < 32); lcnt++)
3982 if ((v) & (1 << (31 - lcnt)))
3983 break;
3984 However it is not code size friendly, and the gain will drop a bit
3985 on certain cached systems.
3986 */
3987 #define COUNT_TOP_ZEROES(v) \
3988 (((v) & ~0xffff) == 0 \
3989 ? ((v) & ~0xff) == 0 \
3990 ? ((v) & ~0xf) == 0 \
3991 ? ((v) & ~0x3) == 0 \
3992 ? ((v) & ~0x1) == 0 \
3993 ? !(v) \
3994 ? 32 \
3995 : 31 \
3996 : 30 \
3997 : ((v) & ~0x7) == 0 \
3998 ? 29 \
3999 : 28 \
4000 : ((v) & ~0x3f) == 0 \
4001 ? ((v) & ~0x1f) == 0 \
4002 ? 27 \
4003 : 26 \
4004 : ((v) & ~0x7f) == 0 \
4005 ? 25 \
4006 : 24 \
4007 : ((v) & ~0xfff) == 0 \
4008 ? ((v) & ~0x3ff) == 0 \
4009 ? ((v) & ~0x1ff) == 0 \
4010 ? 23 \
4011 : 22 \
4012 : ((v) & ~0x7ff) == 0 \
4013 ? 21 \
4014 : 20 \
4015 : ((v) & ~0x3fff) == 0 \
4016 ? ((v) & ~0x1fff) == 0 \
4017 ? 19 \
4018 : 18 \
4019 : ((v) & ~0x7fff) == 0 \
4020 ? 17 \
4021 : 16 \
4022 : ((v) & ~0xffffff) == 0 \
4023 ? ((v) & ~0xfffff) == 0 \
4024 ? ((v) & ~0x3ffff) == 0 \
4025 ? ((v) & ~0x1ffff) == 0 \
4026 ? 15 \
4027 : 14 \
4028 : ((v) & ~0x7ffff) == 0 \
4029 ? 13 \
4030 : 12 \
4031 : ((v) & ~0x3fffff) == 0 \
4032 ? ((v) & ~0x1fffff) == 0 \
4033 ? 11 \
4034 : 10 \
4035 : ((v) & ~0x7fffff) == 0 \
4036 ? 9 \
4037 : 8 \
4038 : ((v) & ~0xfffffff) == 0 \
4039 ? ((v) & ~0x3ffffff) == 0 \
4040 ? ((v) & ~0x1ffffff) == 0 \
4041 ? 7 \
4042 : 6 \
4043 : ((v) & ~0x7ffffff) == 0 \
4044 ? 5 \
4045 : 4 \
4046 : ((v) & ~0x3fffffff) == 0 \
4047 ? ((v) & ~0x1fffffff) == 0 \
4048 ? 3 \
4049 : 2 \
4050 : ((v) & ~0x7fffffff) == 0 \
4051 ? 1 \
4052 : 0)
4053
4054 /* load_register()
4055 * This routine generates the least number of instructions necessary to load
4056 * an absolute expression value into a register.
4057 */
4058 static void
4059 load_register (int reg, expressionS *ep, int dbl)
4060 {
4061 int freg;
4062 expressionS hi32, lo32;
4063
4064 if (ep->X_op != O_big)
4065 {
4066 assert (ep->X_op == O_constant);
4067
4068 /* Sign-extending 32-bit constants makes their handling easier. */
4069 if (!dbl)
4070 normalize_constant_expr (ep);
4071
4072 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4073 {
4074 /* We can handle 16 bit signed values with an addiu to
4075 $zero. No need to ever use daddiu here, since $zero and
4076 the result are always correct in 32 bit mode. */
4077 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4078 return;
4079 }
4080 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4081 {
4082 /* We can handle 16 bit unsigned values with an ori to
4083 $zero. */
4084 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4085 return;
4086 }
4087 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4088 {
4089 /* 32 bit values require an lui. */
4090 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4091 if ((ep->X_add_number & 0xffff) != 0)
4092 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4093 return;
4094 }
4095 }
4096
4097 /* The value is larger than 32 bits. */
4098
4099 if (!dbl || HAVE_32BIT_GPRS)
4100 {
4101 char value[32];
4102
4103 sprintf_vma (value, ep->X_add_number);
4104 as_bad (_("Number (0x%s) larger than 32 bits"), value);
4105 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4106 return;
4107 }
4108
4109 if (ep->X_op != O_big)
4110 {
4111 hi32 = *ep;
4112 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4113 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4114 hi32.X_add_number &= 0xffffffff;
4115 lo32 = *ep;
4116 lo32.X_add_number &= 0xffffffff;
4117 }
4118 else
4119 {
4120 assert (ep->X_add_number > 2);
4121 if (ep->X_add_number == 3)
4122 generic_bignum[3] = 0;
4123 else if (ep->X_add_number > 4)
4124 as_bad (_("Number larger than 64 bits"));
4125 lo32.X_op = O_constant;
4126 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4127 hi32.X_op = O_constant;
4128 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4129 }
4130
4131 if (hi32.X_add_number == 0)
4132 freg = 0;
4133 else
4134 {
4135 int shift, bit;
4136 unsigned long hi, lo;
4137
4138 if (hi32.X_add_number == (offsetT) 0xffffffff)
4139 {
4140 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4141 {
4142 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4143 return;
4144 }
4145 if (lo32.X_add_number & 0x80000000)
4146 {
4147 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4148 if (lo32.X_add_number & 0xffff)
4149 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4150 return;
4151 }
4152 }
4153
4154 /* Check for 16bit shifted constant. We know that hi32 is
4155 non-zero, so start the mask on the first bit of the hi32
4156 value. */
4157 shift = 17;
4158 do
4159 {
4160 unsigned long himask, lomask;
4161
4162 if (shift < 32)
4163 {
4164 himask = 0xffff >> (32 - shift);
4165 lomask = (0xffff << shift) & 0xffffffff;
4166 }
4167 else
4168 {
4169 himask = 0xffff << (shift - 32);
4170 lomask = 0;
4171 }
4172 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4173 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4174 {
4175 expressionS tmp;
4176
4177 tmp.X_op = O_constant;
4178 if (shift < 32)
4179 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4180 | (lo32.X_add_number >> shift));
4181 else
4182 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4183 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4184 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4185 reg, reg, (shift >= 32) ? shift - 32 : shift);
4186 return;
4187 }
4188 ++shift;
4189 }
4190 while (shift <= (64 - 16));
4191
4192 /* Find the bit number of the lowest one bit, and store the
4193 shifted value in hi/lo. */
4194 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4195 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4196 if (lo != 0)
4197 {
4198 bit = 0;
4199 while ((lo & 1) == 0)
4200 {
4201 lo >>= 1;
4202 ++bit;
4203 }
4204 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4205 hi >>= bit;
4206 }
4207 else
4208 {
4209 bit = 32;
4210 while ((hi & 1) == 0)
4211 {
4212 hi >>= 1;
4213 ++bit;
4214 }
4215 lo = hi;
4216 hi = 0;
4217 }
4218
4219 /* Optimize if the shifted value is a (power of 2) - 1. */
4220 if ((hi == 0 && ((lo + 1) & lo) == 0)
4221 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4222 {
4223 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4224 if (shift != 0)
4225 {
4226 expressionS tmp;
4227
4228 /* This instruction will set the register to be all
4229 ones. */
4230 tmp.X_op = O_constant;
4231 tmp.X_add_number = (offsetT) -1;
4232 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4233 if (bit != 0)
4234 {
4235 bit += shift;
4236 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4237 reg, reg, (bit >= 32) ? bit - 32 : bit);
4238 }
4239 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4240 reg, reg, (shift >= 32) ? shift - 32 : shift);
4241 return;
4242 }
4243 }
4244
4245 /* Sign extend hi32 before calling load_register, because we can
4246 generally get better code when we load a sign extended value. */
4247 if ((hi32.X_add_number & 0x80000000) != 0)
4248 hi32.X_add_number |= ~(offsetT) 0xffffffff;
4249 load_register (reg, &hi32, 0);
4250 freg = reg;
4251 }
4252 if ((lo32.X_add_number & 0xffff0000) == 0)
4253 {
4254 if (freg != 0)
4255 {
4256 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4257 freg = reg;
4258 }
4259 }
4260 else
4261 {
4262 expressionS mid16;
4263
4264 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4265 {
4266 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4267 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4268 return;
4269 }
4270
4271 if (freg != 0)
4272 {
4273 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4274 freg = reg;
4275 }
4276 mid16 = lo32;
4277 mid16.X_add_number >>= 16;
4278 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4279 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4280 freg = reg;
4281 }
4282 if ((lo32.X_add_number & 0xffff) != 0)
4283 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4284 }
4285
4286 static inline void
4287 load_delay_nop (void)
4288 {
4289 if (!gpr_interlocks)
4290 macro_build (NULL, "nop", "");
4291 }
4292
4293 /* Load an address into a register. */
4294
4295 static void
4296 load_address (int reg, expressionS *ep, int *used_at)
4297 {
4298 if (ep->X_op != O_constant
4299 && ep->X_op != O_symbol)
4300 {
4301 as_bad (_("expression too complex"));
4302 ep->X_op = O_constant;
4303 }
4304
4305 if (ep->X_op == O_constant)
4306 {
4307 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4308 return;
4309 }
4310
4311 if (mips_pic == NO_PIC)
4312 {
4313 /* If this is a reference to a GP relative symbol, we want
4314 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
4315 Otherwise we want
4316 lui $reg,<sym> (BFD_RELOC_HI16_S)
4317 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4318 If we have an addend, we always use the latter form.
4319
4320 With 64bit address space and a usable $at we want
4321 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4322 lui $at,<sym> (BFD_RELOC_HI16_S)
4323 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4324 daddiu $at,<sym> (BFD_RELOC_LO16)
4325 dsll32 $reg,0
4326 daddu $reg,$reg,$at
4327
4328 If $at is already in use, we use a path which is suboptimal
4329 on superscalar processors.
4330 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4331 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4332 dsll $reg,16
4333 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4334 dsll $reg,16
4335 daddiu $reg,<sym> (BFD_RELOC_LO16)
4336
4337 For GP relative symbols in 64bit address space we can use
4338 the same sequence as in 32bit address space. */
4339 if (HAVE_64BIT_SYMBOLS)
4340 {
4341 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4342 && !nopic_need_relax (ep->X_add_symbol, 1))
4343 {
4344 relax_start (ep->X_add_symbol);
4345 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4346 mips_gp_register, BFD_RELOC_GPREL16);
4347 relax_switch ();
4348 }
4349
4350 if (*used_at == 0 && mips_opts.at)
4351 {
4352 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4353 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4354 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4355 BFD_RELOC_MIPS_HIGHER);
4356 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4357 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4358 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4359 *used_at = 1;
4360 }
4361 else
4362 {
4363 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4364 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4365 BFD_RELOC_MIPS_HIGHER);
4366 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4367 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4368 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4369 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4370 }
4371
4372 if (mips_relax.sequence)
4373 relax_end ();
4374 }
4375 else
4376 {
4377 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4378 && !nopic_need_relax (ep->X_add_symbol, 1))
4379 {
4380 relax_start (ep->X_add_symbol);
4381 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4382 mips_gp_register, BFD_RELOC_GPREL16);
4383 relax_switch ();
4384 }
4385 macro_build_lui (ep, reg);
4386 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4387 reg, reg, BFD_RELOC_LO16);
4388 if (mips_relax.sequence)
4389 relax_end ();
4390 }
4391 }
4392 else if (!mips_big_got)
4393 {
4394 expressionS ex;
4395
4396 /* If this is a reference to an external symbol, we want
4397 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4398 Otherwise we want
4399 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4400 nop
4401 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4402 If there is a constant, it must be added in after.
4403
4404 If we have NewABI, we want
4405 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4406 unless we're referencing a global symbol with a non-zero
4407 offset, in which case cst must be added separately. */
4408 if (HAVE_NEWABI)
4409 {
4410 if (ep->X_add_number)
4411 {
4412 ex.X_add_number = ep->X_add_number;
4413 ep->X_add_number = 0;
4414 relax_start (ep->X_add_symbol);
4415 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4416 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4417 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4418 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4419 ex.X_op = O_constant;
4420 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4421 reg, reg, BFD_RELOC_LO16);
4422 ep->X_add_number = ex.X_add_number;
4423 relax_switch ();
4424 }
4425 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4426 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4427 if (mips_relax.sequence)
4428 relax_end ();
4429 }
4430 else
4431 {
4432 ex.X_add_number = ep->X_add_number;
4433 ep->X_add_number = 0;
4434 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4435 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4436 load_delay_nop ();
4437 relax_start (ep->X_add_symbol);
4438 relax_switch ();
4439 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4440 BFD_RELOC_LO16);
4441 relax_end ();
4442
4443 if (ex.X_add_number != 0)
4444 {
4445 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4446 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4447 ex.X_op = O_constant;
4448 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4449 reg, reg, BFD_RELOC_LO16);
4450 }
4451 }
4452 }
4453 else if (mips_big_got)
4454 {
4455 expressionS ex;
4456
4457 /* This is the large GOT case. If this is a reference to an
4458 external symbol, we want
4459 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4460 addu $reg,$reg,$gp
4461 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
4462
4463 Otherwise, for a reference to a local symbol in old ABI, we want
4464 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4465 nop
4466 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
4467 If there is a constant, it must be added in after.
4468
4469 In the NewABI, for local symbols, with or without offsets, we want:
4470 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4471 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4472 */
4473 if (HAVE_NEWABI)
4474 {
4475 ex.X_add_number = ep->X_add_number;
4476 ep->X_add_number = 0;
4477 relax_start (ep->X_add_symbol);
4478 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4479 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4480 reg, reg, mips_gp_register);
4481 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4482 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4483 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4484 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4485 else if (ex.X_add_number)
4486 {
4487 ex.X_op = O_constant;
4488 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4489 BFD_RELOC_LO16);
4490 }
4491
4492 ep->X_add_number = ex.X_add_number;
4493 relax_switch ();
4494 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4495 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4496 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4497 BFD_RELOC_MIPS_GOT_OFST);
4498 relax_end ();
4499 }
4500 else
4501 {
4502 ex.X_add_number = ep->X_add_number;
4503 ep->X_add_number = 0;
4504 relax_start (ep->X_add_symbol);
4505 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4506 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4507 reg, reg, mips_gp_register);
4508 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4509 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4510 relax_switch ();
4511 if (reg_needs_delay (mips_gp_register))
4512 {
4513 /* We need a nop before loading from $gp. This special
4514 check is required because the lui which starts the main
4515 instruction stream does not refer to $gp, and so will not
4516 insert the nop which may be required. */
4517 macro_build (NULL, "nop", "");
4518 }
4519 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4520 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4521 load_delay_nop ();
4522 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4523 BFD_RELOC_LO16);
4524 relax_end ();
4525
4526 if (ex.X_add_number != 0)
4527 {
4528 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4529 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4530 ex.X_op = O_constant;
4531 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4532 BFD_RELOC_LO16);
4533 }
4534 }
4535 }
4536 else
4537 abort ();
4538
4539 if (!mips_opts.at && *used_at == 1)
4540 as_bad (_("Macro used $at after \".set noat\""));
4541 }
4542
4543 /* Move the contents of register SOURCE into register DEST. */
4544
4545 static void
4546 move_register (int dest, int source)
4547 {
4548 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4549 dest, source, 0);
4550 }
4551
4552 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4553 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4554 The two alternatives are:
4555
4556 Global symbol Local sybmol
4557 ------------- ------------
4558 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4559 ... ...
4560 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4561
4562 load_got_offset emits the first instruction and add_got_offset
4563 emits the second for a 16-bit offset or add_got_offset_hilo emits
4564 a sequence to add a 32-bit offset using a scratch register. */
4565
4566 static void
4567 load_got_offset (int dest, expressionS *local)
4568 {
4569 expressionS global;
4570
4571 global = *local;
4572 global.X_add_number = 0;
4573
4574 relax_start (local->X_add_symbol);
4575 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4576 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4577 relax_switch ();
4578 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4579 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4580 relax_end ();
4581 }
4582
4583 static void
4584 add_got_offset (int dest, expressionS *local)
4585 {
4586 expressionS global;
4587
4588 global.X_op = O_constant;
4589 global.X_op_symbol = NULL;
4590 global.X_add_symbol = NULL;
4591 global.X_add_number = local->X_add_number;
4592
4593 relax_start (local->X_add_symbol);
4594 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4595 dest, dest, BFD_RELOC_LO16);
4596 relax_switch ();
4597 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4598 relax_end ();
4599 }
4600
4601 static void
4602 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4603 {
4604 expressionS global;
4605 int hold_mips_optimize;
4606
4607 global.X_op = O_constant;
4608 global.X_op_symbol = NULL;
4609 global.X_add_symbol = NULL;
4610 global.X_add_number = local->X_add_number;
4611
4612 relax_start (local->X_add_symbol);
4613 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4614 relax_switch ();
4615 /* Set mips_optimize around the lui instruction to avoid
4616 inserting an unnecessary nop after the lw. */
4617 hold_mips_optimize = mips_optimize;
4618 mips_optimize = 2;
4619 macro_build_lui (&global, tmp);
4620 mips_optimize = hold_mips_optimize;
4621 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4622 relax_end ();
4623
4624 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4625 }
4626
4627 /*
4628 * Build macros
4629 * This routine implements the seemingly endless macro or synthesized
4630 * instructions and addressing modes in the mips assembly language. Many
4631 * of these macros are simple and are similar to each other. These could
4632 * probably be handled by some kind of table or grammar approach instead of
4633 * this verbose method. Others are not simple macros but are more like
4634 * optimizing code generation.
4635 * One interesting optimization is when several store macros appear
4636 * consecutively that would load AT with the upper half of the same address.
4637 * The ensuing load upper instructions are ommited. This implies some kind
4638 * of global optimization. We currently only optimize within a single macro.
4639 * For many of the load and store macros if the address is specified as a
4640 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4641 * first load register 'at' with zero and use it as the base register. The
4642 * mips assembler simply uses register $zero. Just one tiny optimization
4643 * we're missing.
4644 */
4645 static void
4646 macro (struct mips_cl_insn *ip)
4647 {
4648 unsigned int treg, sreg, dreg, breg;
4649 unsigned int tempreg;
4650 int mask;
4651 int used_at = 0;
4652 expressionS expr1;
4653 const char *s;
4654 const char *s2;
4655 const char *fmt;
4656 int likely = 0;
4657 int dbl = 0;
4658 int coproc = 0;
4659 int lr = 0;
4660 int imm = 0;
4661 int call = 0;
4662 int off;
4663 offsetT maxnum;
4664 bfd_reloc_code_real_type r;
4665 int hold_mips_optimize;
4666
4667 assert (! mips_opts.mips16);
4668
4669 treg = (ip->insn_opcode >> 16) & 0x1f;
4670 dreg = (ip->insn_opcode >> 11) & 0x1f;
4671 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4672 mask = ip->insn_mo->mask;
4673
4674 expr1.X_op = O_constant;
4675 expr1.X_op_symbol = NULL;
4676 expr1.X_add_symbol = NULL;
4677 expr1.X_add_number = 1;
4678
4679 switch (mask)
4680 {
4681 case M_DABS:
4682 dbl = 1;
4683 case M_ABS:
4684 /* bgez $a0,.+12
4685 move v0,$a0
4686 sub v0,$zero,$a0
4687 */
4688
4689 start_noreorder ();
4690
4691 expr1.X_add_number = 8;
4692 macro_build (&expr1, "bgez", "s,p", sreg);
4693 if (dreg == sreg)
4694 macro_build (NULL, "nop", "", 0);
4695 else
4696 move_register (dreg, sreg);
4697 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4698
4699 end_noreorder ();
4700 break;
4701
4702 case M_ADD_I:
4703 s = "addi";
4704 s2 = "add";
4705 goto do_addi;
4706 case M_ADDU_I:
4707 s = "addiu";
4708 s2 = "addu";
4709 goto do_addi;
4710 case M_DADD_I:
4711 dbl = 1;
4712 s = "daddi";
4713 s2 = "dadd";
4714 goto do_addi;
4715 case M_DADDU_I:
4716 dbl = 1;
4717 s = "daddiu";
4718 s2 = "daddu";
4719 do_addi:
4720 if (imm_expr.X_op == O_constant
4721 && imm_expr.X_add_number >= -0x8000
4722 && imm_expr.X_add_number < 0x8000)
4723 {
4724 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4725 break;
4726 }
4727 used_at = 1;
4728 load_register (AT, &imm_expr, dbl);
4729 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4730 break;
4731
4732 case M_AND_I:
4733 s = "andi";
4734 s2 = "and";
4735 goto do_bit;
4736 case M_OR_I:
4737 s = "ori";
4738 s2 = "or";
4739 goto do_bit;
4740 case M_NOR_I:
4741 s = "";
4742 s2 = "nor";
4743 goto do_bit;
4744 case M_XOR_I:
4745 s = "xori";
4746 s2 = "xor";
4747 do_bit:
4748 if (imm_expr.X_op == O_constant
4749 && imm_expr.X_add_number >= 0
4750 && imm_expr.X_add_number < 0x10000)
4751 {
4752 if (mask != M_NOR_I)
4753 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4754 else
4755 {
4756 macro_build (&imm_expr, "ori", "t,r,i",
4757 treg, sreg, BFD_RELOC_LO16);
4758 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4759 }
4760 break;
4761 }
4762
4763 used_at = 1;
4764 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4765 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4766 break;
4767
4768 case M_BALIGN:
4769 switch (imm_expr.X_add_number)
4770 {
4771 case 0:
4772 macro_build (NULL, "nop", "");
4773 break;
4774 case 2:
4775 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4776 break;
4777 default:
4778 macro_build (NULL, "balign", "t,s,2", treg, sreg,
4779 (int)imm_expr.X_add_number);
4780 break;
4781 }
4782 break;
4783
4784 case M_BEQ_I:
4785 s = "beq";
4786 goto beq_i;
4787 case M_BEQL_I:
4788 s = "beql";
4789 likely = 1;
4790 goto beq_i;
4791 case M_BNE_I:
4792 s = "bne";
4793 goto beq_i;
4794 case M_BNEL_I:
4795 s = "bnel";
4796 likely = 1;
4797 beq_i:
4798 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4799 {
4800 macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4801 break;
4802 }
4803 used_at = 1;
4804 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4805 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4806 break;
4807
4808 case M_BGEL:
4809 likely = 1;
4810 case M_BGE:
4811 if (treg == 0)
4812 {
4813 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4814 break;
4815 }
4816 if (sreg == 0)
4817 {
4818 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4819 break;
4820 }
4821 used_at = 1;
4822 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4823 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4824 break;
4825
4826 case M_BGTL_I:
4827 likely = 1;
4828 case M_BGT_I:
4829 /* check for > max integer */
4830 maxnum = 0x7fffffff;
4831 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4832 {
4833 maxnum <<= 16;
4834 maxnum |= 0xffff;
4835 maxnum <<= 16;
4836 maxnum |= 0xffff;
4837 }
4838 if (imm_expr.X_op == O_constant
4839 && imm_expr.X_add_number >= maxnum
4840 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4841 {
4842 do_false:
4843 /* result is always false */
4844 if (! likely)
4845 macro_build (NULL, "nop", "", 0);
4846 else
4847 macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4848 break;
4849 }
4850 if (imm_expr.X_op != O_constant)
4851 as_bad (_("Unsupported large constant"));
4852 ++imm_expr.X_add_number;
4853 /* FALLTHROUGH */
4854 case M_BGE_I:
4855 case M_BGEL_I:
4856 if (mask == M_BGEL_I)
4857 likely = 1;
4858 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4859 {
4860 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4861 break;
4862 }
4863 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4864 {
4865 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4866 break;
4867 }
4868 maxnum = 0x7fffffff;
4869 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4870 {
4871 maxnum <<= 16;
4872 maxnum |= 0xffff;
4873 maxnum <<= 16;
4874 maxnum |= 0xffff;
4875 }
4876 maxnum = - maxnum - 1;
4877 if (imm_expr.X_op == O_constant
4878 && imm_expr.X_add_number <= maxnum
4879 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4880 {
4881 do_true:
4882 /* result is always true */
4883 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4884 macro_build (&offset_expr, "b", "p");
4885 break;
4886 }
4887 used_at = 1;
4888 set_at (sreg, 0);
4889 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4890 break;
4891
4892 case M_BGEUL:
4893 likely = 1;
4894 case M_BGEU:
4895 if (treg == 0)
4896 goto do_true;
4897 if (sreg == 0)
4898 {
4899 macro_build (&offset_expr, likely ? "beql" : "beq",
4900 "s,t,p", 0, treg);
4901 break;
4902 }
4903 used_at = 1;
4904 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4905 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4906 break;
4907
4908 case M_BGTUL_I:
4909 likely = 1;
4910 case M_BGTU_I:
4911 if (sreg == 0
4912 || (HAVE_32BIT_GPRS
4913 && imm_expr.X_op == O_constant
4914 && imm_expr.X_add_number == (offsetT) 0xffffffff))
4915 goto do_false;
4916 if (imm_expr.X_op != O_constant)
4917 as_bad (_("Unsupported large constant"));
4918 ++imm_expr.X_add_number;
4919 /* FALLTHROUGH */
4920 case M_BGEU_I:
4921 case M_BGEUL_I:
4922 if (mask == M_BGEUL_I)
4923 likely = 1;
4924 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4925 goto do_true;
4926 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4927 {
4928 macro_build (&offset_expr, likely ? "bnel" : "bne",
4929 "s,t,p", sreg, 0);
4930 break;
4931 }
4932 used_at = 1;
4933 set_at (sreg, 1);
4934 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4935 break;
4936
4937 case M_BGTL:
4938 likely = 1;
4939 case M_BGT:
4940 if (treg == 0)
4941 {
4942 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4943 break;
4944 }
4945 if (sreg == 0)
4946 {
4947 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4948 break;
4949 }
4950 used_at = 1;
4951 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4952 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4953 break;
4954
4955 case M_BGTUL:
4956 likely = 1;
4957 case M_BGTU:
4958 if (treg == 0)
4959 {
4960 macro_build (&offset_expr, likely ? "bnel" : "bne",
4961 "s,t,p", sreg, 0);
4962 break;
4963 }
4964 if (sreg == 0)
4965 goto do_false;
4966 used_at = 1;
4967 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4968 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4969 break;
4970
4971 case M_BLEL:
4972 likely = 1;
4973 case M_BLE:
4974 if (treg == 0)
4975 {
4976 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4977 break;
4978 }
4979 if (sreg == 0)
4980 {
4981 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4982 break;
4983 }
4984 used_at = 1;
4985 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4986 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4987 break;
4988
4989 case M_BLEL_I:
4990 likely = 1;
4991 case M_BLE_I:
4992 maxnum = 0x7fffffff;
4993 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4994 {
4995 maxnum <<= 16;
4996 maxnum |= 0xffff;
4997 maxnum <<= 16;
4998 maxnum |= 0xffff;
4999 }
5000 if (imm_expr.X_op == O_constant
5001 && imm_expr.X_add_number >= maxnum
5002 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5003 goto do_true;
5004 if (imm_expr.X_op != O_constant)
5005 as_bad (_("Unsupported large constant"));
5006 ++imm_expr.X_add_number;
5007 /* FALLTHROUGH */
5008 case M_BLT_I:
5009 case M_BLTL_I:
5010 if (mask == M_BLTL_I)
5011 likely = 1;
5012 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5013 {
5014 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5015 break;
5016 }
5017 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5018 {
5019 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5020 break;
5021 }
5022 used_at = 1;
5023 set_at (sreg, 0);
5024 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5025 break;
5026
5027 case M_BLEUL:
5028 likely = 1;
5029 case M_BLEU:
5030 if (treg == 0)
5031 {
5032 macro_build (&offset_expr, likely ? "beql" : "beq",
5033 "s,t,p", sreg, 0);
5034 break;
5035 }
5036 if (sreg == 0)
5037 goto do_true;
5038 used_at = 1;
5039 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5040 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5041 break;
5042
5043 case M_BLEUL_I:
5044 likely = 1;
5045 case M_BLEU_I:
5046 if (sreg == 0
5047 || (HAVE_32BIT_GPRS
5048 && imm_expr.X_op == O_constant
5049 && imm_expr.X_add_number == (offsetT) 0xffffffff))
5050 goto do_true;
5051 if (imm_expr.X_op != O_constant)
5052 as_bad (_("Unsupported large constant"));
5053 ++imm_expr.X_add_number;
5054 /* FALLTHROUGH */
5055 case M_BLTU_I:
5056 case M_BLTUL_I:
5057 if (mask == M_BLTUL_I)
5058 likely = 1;
5059 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5060 goto do_false;
5061 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5062 {
5063 macro_build (&offset_expr, likely ? "beql" : "beq",
5064 "s,t,p", sreg, 0);
5065 break;
5066 }
5067 used_at = 1;
5068 set_at (sreg, 1);
5069 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5070 break;
5071
5072 case M_BLTL:
5073 likely = 1;
5074 case M_BLT:
5075 if (treg == 0)
5076 {
5077 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5078 break;
5079 }
5080 if (sreg == 0)
5081 {
5082 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5083 break;
5084 }
5085 used_at = 1;
5086 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5087 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5088 break;
5089
5090 case M_BLTUL:
5091 likely = 1;
5092 case M_BLTU:
5093 if (treg == 0)
5094 goto do_false;
5095 if (sreg == 0)
5096 {
5097 macro_build (&offset_expr, likely ? "bnel" : "bne",
5098 "s,t,p", 0, treg);
5099 break;
5100 }
5101 used_at = 1;
5102 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5103 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5104 break;
5105
5106 case M_DEXT:
5107 {
5108 unsigned long pos;
5109 unsigned long size;
5110
5111 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5112 {
5113 as_bad (_("Unsupported large constant"));
5114 pos = size = 1;
5115 }
5116 else
5117 {
5118 pos = (unsigned long) imm_expr.X_add_number;
5119 size = (unsigned long) imm2_expr.X_add_number;
5120 }
5121
5122 if (pos > 63)
5123 {
5124 as_bad (_("Improper position (%lu)"), pos);
5125 pos = 1;
5126 }
5127 if (size == 0 || size > 64
5128 || (pos + size - 1) > 63)
5129 {
5130 as_bad (_("Improper extract size (%lu, position %lu)"),
5131 size, pos);
5132 size = 1;
5133 }
5134
5135 if (size <= 32 && pos < 32)
5136 {
5137 s = "dext";
5138 fmt = "t,r,+A,+C";
5139 }
5140 else if (size <= 32)
5141 {
5142 s = "dextu";
5143 fmt = "t,r,+E,+H";
5144 }
5145 else
5146 {
5147 s = "dextm";
5148 fmt = "t,r,+A,+G";
5149 }
5150 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5151 }
5152 break;
5153
5154 case M_DINS:
5155 {
5156 unsigned long pos;
5157 unsigned long size;
5158
5159 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5160 {
5161 as_bad (_("Unsupported large constant"));
5162 pos = size = 1;
5163 }
5164 else
5165 {
5166 pos = (unsigned long) imm_expr.X_add_number;
5167 size = (unsigned long) imm2_expr.X_add_number;
5168 }
5169
5170 if (pos > 63)
5171 {
5172 as_bad (_("Improper position (%lu)"), pos);
5173 pos = 1;
5174 }
5175 if (size == 0 || size > 64
5176 || (pos + size - 1) > 63)
5177 {
5178 as_bad (_("Improper insert size (%lu, position %lu)"),
5179 size, pos);
5180 size = 1;
5181 }
5182
5183 if (pos < 32 && (pos + size - 1) < 32)
5184 {
5185 s = "dins";
5186 fmt = "t,r,+A,+B";
5187 }
5188 else if (pos >= 32)
5189 {
5190 s = "dinsu";
5191 fmt = "t,r,+E,+F";
5192 }
5193 else
5194 {
5195 s = "dinsm";
5196 fmt = "t,r,+A,+F";
5197 }
5198 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5199 pos + size - 1);
5200 }
5201 break;
5202
5203 case M_DDIV_3:
5204 dbl = 1;
5205 case M_DIV_3:
5206 s = "mflo";
5207 goto do_div3;
5208 case M_DREM_3:
5209 dbl = 1;
5210 case M_REM_3:
5211 s = "mfhi";
5212 do_div3:
5213 if (treg == 0)
5214 {
5215 as_warn (_("Divide by zero."));
5216 if (mips_trap)
5217 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5218 else
5219 macro_build (NULL, "break", "c", 7);
5220 break;
5221 }
5222
5223 start_noreorder ();
5224 if (mips_trap)
5225 {
5226 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5227 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5228 }
5229 else
5230 {
5231 expr1.X_add_number = 8;
5232 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5233 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5234 macro_build (NULL, "break", "c", 7);
5235 }
5236 expr1.X_add_number = -1;
5237 used_at = 1;
5238 load_register (AT, &expr1, dbl);
5239 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5240 macro_build (&expr1, "bne", "s,t,p", treg, AT);
5241 if (dbl)
5242 {
5243 expr1.X_add_number = 1;
5244 load_register (AT, &expr1, dbl);
5245 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5246 }
5247 else
5248 {
5249 expr1.X_add_number = 0x80000000;
5250 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5251 }
5252 if (mips_trap)
5253 {
5254 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5255 /* We want to close the noreorder block as soon as possible, so
5256 that later insns are available for delay slot filling. */
5257 end_noreorder ();
5258 }
5259 else
5260 {
5261 expr1.X_add_number = 8;
5262 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5263 macro_build (NULL, "nop", "", 0);
5264
5265 /* We want to close the noreorder block as soon as possible, so
5266 that later insns are available for delay slot filling. */
5267 end_noreorder ();
5268
5269 macro_build (NULL, "break", "c", 6);
5270 }
5271 macro_build (NULL, s, "d", dreg);
5272 break;
5273
5274 case M_DIV_3I:
5275 s = "div";
5276 s2 = "mflo";
5277 goto do_divi;
5278 case M_DIVU_3I:
5279 s = "divu";
5280 s2 = "mflo";
5281 goto do_divi;
5282 case M_REM_3I:
5283 s = "div";
5284 s2 = "mfhi";
5285 goto do_divi;
5286 case M_REMU_3I:
5287 s = "divu";
5288 s2 = "mfhi";
5289 goto do_divi;
5290 case M_DDIV_3I:
5291 dbl = 1;
5292 s = "ddiv";
5293 s2 = "mflo";
5294 goto do_divi;
5295 case M_DDIVU_3I:
5296 dbl = 1;
5297 s = "ddivu";
5298 s2 = "mflo";
5299 goto do_divi;
5300 case M_DREM_3I:
5301 dbl = 1;
5302 s = "ddiv";
5303 s2 = "mfhi";
5304 goto do_divi;
5305 case M_DREMU_3I:
5306 dbl = 1;
5307 s = "ddivu";
5308 s2 = "mfhi";
5309 do_divi:
5310 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5311 {
5312 as_warn (_("Divide by zero."));
5313 if (mips_trap)
5314 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5315 else
5316 macro_build (NULL, "break", "c", 7);
5317 break;
5318 }
5319 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5320 {
5321 if (strcmp (s2, "mflo") == 0)
5322 move_register (dreg, sreg);
5323 else
5324 move_register (dreg, 0);
5325 break;
5326 }
5327 if (imm_expr.X_op == O_constant
5328 && imm_expr.X_add_number == -1
5329 && s[strlen (s) - 1] != 'u')
5330 {
5331 if (strcmp (s2, "mflo") == 0)
5332 {
5333 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5334 }
5335 else
5336 move_register (dreg, 0);
5337 break;
5338 }
5339
5340 used_at = 1;
5341 load_register (AT, &imm_expr, dbl);
5342 macro_build (NULL, s, "z,s,t", sreg, AT);
5343 macro_build (NULL, s2, "d", dreg);
5344 break;
5345
5346 case M_DIVU_3:
5347 s = "divu";
5348 s2 = "mflo";
5349 goto do_divu3;
5350 case M_REMU_3:
5351 s = "divu";
5352 s2 = "mfhi";
5353 goto do_divu3;
5354 case M_DDIVU_3:
5355 s = "ddivu";
5356 s2 = "mflo";
5357 goto do_divu3;
5358 case M_DREMU_3:
5359 s = "ddivu";
5360 s2 = "mfhi";
5361 do_divu3:
5362 start_noreorder ();
5363 if (mips_trap)
5364 {
5365 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5366 macro_build (NULL, s, "z,s,t", sreg, treg);
5367 /* We want to close the noreorder block as soon as possible, so
5368 that later insns are available for delay slot filling. */
5369 end_noreorder ();
5370 }
5371 else
5372 {
5373 expr1.X_add_number = 8;
5374 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5375 macro_build (NULL, s, "z,s,t", sreg, treg);
5376
5377 /* We want to close the noreorder block as soon as possible, so
5378 that later insns are available for delay slot filling. */
5379 end_noreorder ();
5380 macro_build (NULL, "break", "c", 7);
5381 }
5382 macro_build (NULL, s2, "d", dreg);
5383 break;
5384
5385 case M_DLCA_AB:
5386 dbl = 1;
5387 case M_LCA_AB:
5388 call = 1;
5389 goto do_la;
5390 case M_DLA_AB:
5391 dbl = 1;
5392 case M_LA_AB:
5393 do_la:
5394 /* Load the address of a symbol into a register. If breg is not
5395 zero, we then add a base register to it. */
5396
5397 if (dbl && HAVE_32BIT_GPRS)
5398 as_warn (_("dla used to load 32-bit register"));
5399
5400 if (! dbl && HAVE_64BIT_OBJECTS)
5401 as_warn (_("la used to load 64-bit address"));
5402
5403 if (offset_expr.X_op == O_constant
5404 && offset_expr.X_add_number >= -0x8000
5405 && offset_expr.X_add_number < 0x8000)
5406 {
5407 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5408 "t,r,j", treg, sreg, BFD_RELOC_LO16);
5409 break;
5410 }
5411
5412 if (mips_opts.at && (treg == breg))
5413 {
5414 tempreg = AT;
5415 used_at = 1;
5416 }
5417 else
5418 {
5419 tempreg = treg;
5420 }
5421
5422 if (offset_expr.X_op != O_symbol
5423 && offset_expr.X_op != O_constant)
5424 {
5425 as_bad (_("expression too complex"));
5426 offset_expr.X_op = O_constant;
5427 }
5428
5429 if (offset_expr.X_op == O_constant)
5430 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5431 else if (mips_pic == NO_PIC)
5432 {
5433 /* If this is a reference to a GP relative symbol, we want
5434 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
5435 Otherwise we want
5436 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5437 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5438 If we have a constant, we need two instructions anyhow,
5439 so we may as well always use the latter form.
5440
5441 With 64bit address space and a usable $at we want
5442 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5443 lui $at,<sym> (BFD_RELOC_HI16_S)
5444 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5445 daddiu $at,<sym> (BFD_RELOC_LO16)
5446 dsll32 $tempreg,0
5447 daddu $tempreg,$tempreg,$at
5448
5449 If $at is already in use, we use a path which is suboptimal
5450 on superscalar processors.
5451 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5452 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5453 dsll $tempreg,16
5454 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5455 dsll $tempreg,16
5456 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5457
5458 For GP relative symbols in 64bit address space we can use
5459 the same sequence as in 32bit address space. */
5460 if (HAVE_64BIT_SYMBOLS)
5461 {
5462 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5463 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5464 {
5465 relax_start (offset_expr.X_add_symbol);
5466 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5467 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5468 relax_switch ();
5469 }
5470
5471 if (used_at == 0 && mips_opts.at)
5472 {
5473 macro_build (&offset_expr, "lui", "t,u",
5474 tempreg, BFD_RELOC_MIPS_HIGHEST);
5475 macro_build (&offset_expr, "lui", "t,u",
5476 AT, BFD_RELOC_HI16_S);
5477 macro_build (&offset_expr, "daddiu", "t,r,j",
5478 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5479 macro_build (&offset_expr, "daddiu", "t,r,j",
5480 AT, AT, BFD_RELOC_LO16);
5481 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5482 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5483 used_at = 1;
5484 }
5485 else
5486 {
5487 macro_build (&offset_expr, "lui", "t,u",
5488 tempreg, BFD_RELOC_MIPS_HIGHEST);
5489 macro_build (&offset_expr, "daddiu", "t,r,j",
5490 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5491 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5492 macro_build (&offset_expr, "daddiu", "t,r,j",
5493 tempreg, tempreg, BFD_RELOC_HI16_S);
5494 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5495 macro_build (&offset_expr, "daddiu", "t,r,j",
5496 tempreg, tempreg, BFD_RELOC_LO16);
5497 }
5498
5499 if (mips_relax.sequence)
5500 relax_end ();
5501 }
5502 else
5503 {
5504 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5505 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5506 {
5507 relax_start (offset_expr.X_add_symbol);
5508 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5509 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5510 relax_switch ();
5511 }
5512 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5513 as_bad (_("offset too large"));
5514 macro_build_lui (&offset_expr, tempreg);
5515 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5516 tempreg, tempreg, BFD_RELOC_LO16);
5517 if (mips_relax.sequence)
5518 relax_end ();
5519 }
5520 }
5521 else if (!mips_big_got && !HAVE_NEWABI)
5522 {
5523 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5524
5525 /* If this is a reference to an external symbol, and there
5526 is no constant, we want
5527 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5528 or for lca or if tempreg is PIC_CALL_REG
5529 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5530 For a local symbol, we want
5531 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5532 nop
5533 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5534
5535 If we have a small constant, and this is a reference to
5536 an external symbol, we want
5537 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5538 nop
5539 addiu $tempreg,$tempreg,<constant>
5540 For a local symbol, we want the same instruction
5541 sequence, but we output a BFD_RELOC_LO16 reloc on the
5542 addiu instruction.
5543
5544 If we have a large constant, and this is a reference to
5545 an external symbol, we want
5546 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5547 lui $at,<hiconstant>
5548 addiu $at,$at,<loconstant>
5549 addu $tempreg,$tempreg,$at
5550 For a local symbol, we want the same instruction
5551 sequence, but we output a BFD_RELOC_LO16 reloc on the
5552 addiu instruction.
5553 */
5554
5555 if (offset_expr.X_add_number == 0)
5556 {
5557 if (mips_pic == SVR4_PIC
5558 && breg == 0
5559 && (call || tempreg == PIC_CALL_REG))
5560 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5561
5562 relax_start (offset_expr.X_add_symbol);
5563 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5564 lw_reloc_type, mips_gp_register);
5565 if (breg != 0)
5566 {
5567 /* We're going to put in an addu instruction using
5568 tempreg, so we may as well insert the nop right
5569 now. */
5570 load_delay_nop ();
5571 }
5572 relax_switch ();
5573 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5574 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5575 load_delay_nop ();
5576 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5577 tempreg, tempreg, BFD_RELOC_LO16);
5578 relax_end ();
5579 /* FIXME: If breg == 0, and the next instruction uses
5580 $tempreg, then if this variant case is used an extra
5581 nop will be generated. */
5582 }
5583 else if (offset_expr.X_add_number >= -0x8000
5584 && offset_expr.X_add_number < 0x8000)
5585 {
5586 load_got_offset (tempreg, &offset_expr);
5587 load_delay_nop ();
5588 add_got_offset (tempreg, &offset_expr);
5589 }
5590 else
5591 {
5592 expr1.X_add_number = offset_expr.X_add_number;
5593 offset_expr.X_add_number =
5594 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5595 load_got_offset (tempreg, &offset_expr);
5596 offset_expr.X_add_number = expr1.X_add_number;
5597 /* If we are going to add in a base register, and the
5598 target register and the base register are the same,
5599 then we are using AT as a temporary register. Since
5600 we want to load the constant into AT, we add our
5601 current AT (from the global offset table) and the
5602 register into the register now, and pretend we were
5603 not using a base register. */
5604 if (breg == treg)
5605 {
5606 load_delay_nop ();
5607 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5608 treg, AT, breg);
5609 breg = 0;
5610 tempreg = treg;
5611 }
5612 add_got_offset_hilo (tempreg, &offset_expr, AT);
5613 used_at = 1;
5614 }
5615 }
5616 else if (!mips_big_got && HAVE_NEWABI)
5617 {
5618 int add_breg_early = 0;
5619
5620 /* If this is a reference to an external, and there is no
5621 constant, or local symbol (*), with or without a
5622 constant, we want
5623 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5624 or for lca or if tempreg is PIC_CALL_REG
5625 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5626
5627 If we have a small constant, and this is a reference to
5628 an external symbol, we want
5629 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5630 addiu $tempreg,$tempreg,<constant>
5631
5632 If we have a large constant, and this is a reference to
5633 an external symbol, we want
5634 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5635 lui $at,<hiconstant>
5636 addiu $at,$at,<loconstant>
5637 addu $tempreg,$tempreg,$at
5638
5639 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5640 local symbols, even though it introduces an additional
5641 instruction. */
5642
5643 if (offset_expr.X_add_number)
5644 {
5645 expr1.X_add_number = offset_expr.X_add_number;
5646 offset_expr.X_add_number = 0;
5647
5648 relax_start (offset_expr.X_add_symbol);
5649 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5650 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5651
5652 if (expr1.X_add_number >= -0x8000
5653 && expr1.X_add_number < 0x8000)
5654 {
5655 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5656 tempreg, tempreg, BFD_RELOC_LO16);
5657 }
5658 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5659 {
5660 int dreg;
5661
5662 /* If we are going to add in a base register, and the
5663 target register and the base register are the same,
5664 then we are using AT as a temporary register. Since
5665 we want to load the constant into AT, we add our
5666 current AT (from the global offset table) and the
5667 register into the register now, and pretend we were
5668 not using a base register. */
5669 if (breg != treg)
5670 dreg = tempreg;
5671 else
5672 {
5673 assert (tempreg == AT);
5674 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5675 treg, AT, breg);
5676 dreg = treg;
5677 add_breg_early = 1;
5678 }
5679
5680 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5681 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5682 dreg, dreg, AT);
5683
5684 used_at = 1;
5685 }
5686 else
5687 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5688
5689 relax_switch ();
5690 offset_expr.X_add_number = expr1.X_add_number;
5691
5692 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5693 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5694 if (add_breg_early)
5695 {
5696 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5697 treg, tempreg, breg);
5698 breg = 0;
5699 tempreg = treg;
5700 }
5701 relax_end ();
5702 }
5703 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5704 {
5705 relax_start (offset_expr.X_add_symbol);
5706 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5707 BFD_RELOC_MIPS_CALL16, mips_gp_register);
5708 relax_switch ();
5709 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5710 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5711 relax_end ();
5712 }
5713 else
5714 {
5715 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5716 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5717 }
5718 }
5719 else if (mips_big_got && !HAVE_NEWABI)
5720 {
5721 int gpdelay;
5722 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5723 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5724 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5725
5726 /* This is the large GOT case. If this is a reference to an
5727 external symbol, and there is no constant, we want
5728 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5729 addu $tempreg,$tempreg,$gp
5730 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5731 or for lca or if tempreg is PIC_CALL_REG
5732 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5733 addu $tempreg,$tempreg,$gp
5734 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5735 For a local symbol, we want
5736 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5737 nop
5738 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5739
5740 If we have a small constant, and this is a reference to
5741 an external symbol, we want
5742 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5743 addu $tempreg,$tempreg,$gp
5744 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5745 nop
5746 addiu $tempreg,$tempreg,<constant>
5747 For a local symbol, we want
5748 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5749 nop
5750 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5751
5752 If we have a large constant, and this is a reference to
5753 an external symbol, we want
5754 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5755 addu $tempreg,$tempreg,$gp
5756 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5757 lui $at,<hiconstant>
5758 addiu $at,$at,<loconstant>
5759 addu $tempreg,$tempreg,$at
5760 For a local symbol, we want
5761 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5762 lui $at,<hiconstant>
5763 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5764 addu $tempreg,$tempreg,$at
5765 */
5766
5767 expr1.X_add_number = offset_expr.X_add_number;
5768 offset_expr.X_add_number = 0;
5769 relax_start (offset_expr.X_add_symbol);
5770 gpdelay = reg_needs_delay (mips_gp_register);
5771 if (expr1.X_add_number == 0 && breg == 0
5772 && (call || tempreg == PIC_CALL_REG))
5773 {
5774 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5775 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5776 }
5777 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5778 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5779 tempreg, tempreg, mips_gp_register);
5780 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5781 tempreg, lw_reloc_type, tempreg);
5782 if (expr1.X_add_number == 0)
5783 {
5784 if (breg != 0)
5785 {
5786 /* We're going to put in an addu instruction using
5787 tempreg, so we may as well insert the nop right
5788 now. */
5789 load_delay_nop ();
5790 }
5791 }
5792 else if (expr1.X_add_number >= -0x8000
5793 && expr1.X_add_number < 0x8000)
5794 {
5795 load_delay_nop ();
5796 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5797 tempreg, tempreg, BFD_RELOC_LO16);
5798 }
5799 else
5800 {
5801 int dreg;
5802
5803 /* If we are going to add in a base register, and the
5804 target register and the base register are the same,
5805 then we are using AT as a temporary register. Since
5806 we want to load the constant into AT, we add our
5807 current AT (from the global offset table) and the
5808 register into the register now, and pretend we were
5809 not using a base register. */
5810 if (breg != treg)
5811 dreg = tempreg;
5812 else
5813 {
5814 assert (tempreg == AT);
5815 load_delay_nop ();
5816 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5817 treg, AT, breg);
5818 dreg = treg;
5819 }
5820
5821 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5822 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5823
5824 used_at = 1;
5825 }
5826 offset_expr.X_add_number =
5827 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5828 relax_switch ();
5829
5830 if (gpdelay)
5831 {
5832 /* This is needed because this instruction uses $gp, but
5833 the first instruction on the main stream does not. */
5834 macro_build (NULL, "nop", "");
5835 }
5836
5837 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5838 local_reloc_type, mips_gp_register);
5839 if (expr1.X_add_number >= -0x8000
5840 && expr1.X_add_number < 0x8000)
5841 {
5842 load_delay_nop ();
5843 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5844 tempreg, tempreg, BFD_RELOC_LO16);
5845 /* FIXME: If add_number is 0, and there was no base
5846 register, the external symbol case ended with a load,
5847 so if the symbol turns out to not be external, and
5848 the next instruction uses tempreg, an unnecessary nop
5849 will be inserted. */
5850 }
5851 else
5852 {
5853 if (breg == treg)
5854 {
5855 /* We must add in the base register now, as in the
5856 external symbol case. */
5857 assert (tempreg == AT);
5858 load_delay_nop ();
5859 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5860 treg, AT, breg);
5861 tempreg = treg;
5862 /* We set breg to 0 because we have arranged to add
5863 it in in both cases. */
5864 breg = 0;
5865 }
5866
5867 macro_build_lui (&expr1, AT);
5868 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5869 AT, AT, BFD_RELOC_LO16);
5870 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5871 tempreg, tempreg, AT);
5872 used_at = 1;
5873 }
5874 relax_end ();
5875 }
5876 else if (mips_big_got && HAVE_NEWABI)
5877 {
5878 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5879 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5880 int add_breg_early = 0;
5881
5882 /* This is the large GOT case. If this is a reference to an
5883 external symbol, and there is no constant, we want
5884 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5885 add $tempreg,$tempreg,$gp
5886 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5887 or for lca or if tempreg is PIC_CALL_REG
5888 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5889 add $tempreg,$tempreg,$gp
5890 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5891
5892 If we have a small constant, and this is a reference to
5893 an external symbol, we want
5894 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5895 add $tempreg,$tempreg,$gp
5896 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5897 addi $tempreg,$tempreg,<constant>
5898
5899 If we have a large constant, and this is a reference to
5900 an external symbol, we want
5901 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5902 addu $tempreg,$tempreg,$gp
5903 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5904 lui $at,<hiconstant>
5905 addi $at,$at,<loconstant>
5906 add $tempreg,$tempreg,$at
5907
5908 If we have NewABI, and we know it's a local symbol, we want
5909 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5910 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5911 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5912
5913 relax_start (offset_expr.X_add_symbol);
5914
5915 expr1.X_add_number = offset_expr.X_add_number;
5916 offset_expr.X_add_number = 0;
5917
5918 if (expr1.X_add_number == 0 && breg == 0
5919 && (call || tempreg == PIC_CALL_REG))
5920 {
5921 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5922 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5923 }
5924 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5925 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5926 tempreg, tempreg, mips_gp_register);
5927 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5928 tempreg, lw_reloc_type, tempreg);
5929
5930 if (expr1.X_add_number == 0)
5931 ;
5932 else if (expr1.X_add_number >= -0x8000
5933 && expr1.X_add_number < 0x8000)
5934 {
5935 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5936 tempreg, tempreg, BFD_RELOC_LO16);
5937 }
5938 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5939 {
5940 int dreg;
5941
5942 /* If we are going to add in a base register, and the
5943 target register and the base register are the same,
5944 then we are using AT as a temporary register. Since
5945 we want to load the constant into AT, we add our
5946 current AT (from the global offset table) and the
5947 register into the register now, and pretend we were
5948 not using a base register. */
5949 if (breg != treg)
5950 dreg = tempreg;
5951 else
5952 {
5953 assert (tempreg == AT);
5954 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5955 treg, AT, breg);
5956 dreg = treg;
5957 add_breg_early = 1;
5958 }
5959
5960 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5961 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5962
5963 used_at = 1;
5964 }
5965 else
5966 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5967
5968 relax_switch ();
5969 offset_expr.X_add_number = expr1.X_add_number;
5970 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5971 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5972 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5973 tempreg, BFD_RELOC_MIPS_GOT_OFST);
5974 if (add_breg_early)
5975 {
5976 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5977 treg, tempreg, breg);
5978 breg = 0;
5979 tempreg = treg;
5980 }
5981 relax_end ();
5982 }
5983 else
5984 abort ();
5985
5986 if (breg != 0)
5987 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5988 break;
5989
5990 case M_J_A:
5991 /* The j instruction may not be used in PIC code, since it
5992 requires an absolute address. We convert it to a b
5993 instruction. */
5994 if (mips_pic == NO_PIC)
5995 macro_build (&offset_expr, "j", "a");
5996 else
5997 macro_build (&offset_expr, "b", "p");
5998 break;
5999
6000 /* The jal instructions must be handled as macros because when
6001 generating PIC code they expand to multi-instruction
6002 sequences. Normally they are simple instructions. */
6003 case M_JAL_1:
6004 dreg = RA;
6005 /* Fall through. */
6006 case M_JAL_2:
6007 if (mips_pic == NO_PIC)
6008 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6009 else
6010 {
6011 if (sreg != PIC_CALL_REG)
6012 as_warn (_("MIPS PIC call to register other than $25"));
6013
6014 macro_build (NULL, "jalr", "d,s", dreg, sreg);
6015 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6016 {
6017 if (mips_cprestore_offset < 0)
6018 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6019 else
6020 {
6021 if (! mips_frame_reg_valid)
6022 {
6023 as_warn (_("No .frame pseudo-op used in PIC code"));
6024 /* Quiet this warning. */
6025 mips_frame_reg_valid = 1;
6026 }
6027 if (! mips_cprestore_valid)
6028 {
6029 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6030 /* Quiet this warning. */
6031 mips_cprestore_valid = 1;
6032 }
6033 expr1.X_add_number = mips_cprestore_offset;
6034 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6035 mips_gp_register,
6036 mips_frame_reg,
6037 HAVE_64BIT_ADDRESSES);
6038 }
6039 }
6040 }
6041
6042 break;
6043
6044 case M_JAL_A:
6045 if (mips_pic == NO_PIC)
6046 macro_build (&offset_expr, "jal", "a");
6047 else if (mips_pic == SVR4_PIC)
6048 {
6049 /* If this is a reference to an external symbol, and we are
6050 using a small GOT, we want
6051 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6052 nop
6053 jalr $ra,$25
6054 nop
6055 lw $gp,cprestore($sp)
6056 The cprestore value is set using the .cprestore
6057 pseudo-op. If we are using a big GOT, we want
6058 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6059 addu $25,$25,$gp
6060 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6061 nop
6062 jalr $ra,$25
6063 nop
6064 lw $gp,cprestore($sp)
6065 If the symbol is not external, we want
6066 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6067 nop
6068 addiu $25,$25,<sym> (BFD_RELOC_LO16)
6069 jalr $ra,$25
6070 nop
6071 lw $gp,cprestore($sp)
6072
6073 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6074 sequences above, minus nops, unless the symbol is local,
6075 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6076 GOT_DISP. */
6077 if (HAVE_NEWABI)
6078 {
6079 if (! mips_big_got)
6080 {
6081 relax_start (offset_expr.X_add_symbol);
6082 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6083 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6084 mips_gp_register);
6085 relax_switch ();
6086 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6087 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6088 mips_gp_register);
6089 relax_end ();
6090 }
6091 else
6092 {
6093 relax_start (offset_expr.X_add_symbol);
6094 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6095 BFD_RELOC_MIPS_CALL_HI16);
6096 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6097 PIC_CALL_REG, mips_gp_register);
6098 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6099 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6100 PIC_CALL_REG);
6101 relax_switch ();
6102 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6103 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6104 mips_gp_register);
6105 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6106 PIC_CALL_REG, PIC_CALL_REG,
6107 BFD_RELOC_MIPS_GOT_OFST);
6108 relax_end ();
6109 }
6110
6111 macro_build_jalr (&offset_expr);
6112 }
6113 else
6114 {
6115 relax_start (offset_expr.X_add_symbol);
6116 if (! mips_big_got)
6117 {
6118 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6119 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6120 mips_gp_register);
6121 load_delay_nop ();
6122 relax_switch ();
6123 }
6124 else
6125 {
6126 int gpdelay;
6127
6128 gpdelay = reg_needs_delay (mips_gp_register);
6129 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6130 BFD_RELOC_MIPS_CALL_HI16);
6131 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6132 PIC_CALL_REG, mips_gp_register);
6133 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6134 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6135 PIC_CALL_REG);
6136 load_delay_nop ();
6137 relax_switch ();
6138 if (gpdelay)
6139 macro_build (NULL, "nop", "");
6140 }
6141 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6142 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6143 mips_gp_register);
6144 load_delay_nop ();
6145 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6146 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6147 relax_end ();
6148 macro_build_jalr (&offset_expr);
6149
6150 if (mips_cprestore_offset < 0)
6151 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6152 else
6153 {
6154 if (! mips_frame_reg_valid)
6155 {
6156 as_warn (_("No .frame pseudo-op used in PIC code"));
6157 /* Quiet this warning. */
6158 mips_frame_reg_valid = 1;
6159 }
6160 if (! mips_cprestore_valid)
6161 {
6162 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6163 /* Quiet this warning. */
6164 mips_cprestore_valid = 1;
6165 }
6166 if (mips_opts.noreorder)
6167 macro_build (NULL, "nop", "");
6168 expr1.X_add_number = mips_cprestore_offset;
6169 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6170 mips_gp_register,
6171 mips_frame_reg,
6172 HAVE_64BIT_ADDRESSES);
6173 }
6174 }
6175 }
6176 else if (mips_pic == VXWORKS_PIC)
6177 as_bad (_("Non-PIC jump used in PIC library"));
6178 else
6179 abort ();
6180
6181 break;
6182
6183 case M_LB_AB:
6184 s = "lb";
6185 goto ld;
6186 case M_LBU_AB:
6187 s = "lbu";
6188 goto ld;
6189 case M_LH_AB:
6190 s = "lh";
6191 goto ld;
6192 case M_LHU_AB:
6193 s = "lhu";
6194 goto ld;
6195 case M_LW_AB:
6196 s = "lw";
6197 goto ld;
6198 case M_LWC0_AB:
6199 s = "lwc0";
6200 /* Itbl support may require additional care here. */
6201 coproc = 1;
6202 goto ld;
6203 case M_LWC1_AB:
6204 s = "lwc1";
6205 /* Itbl support may require additional care here. */
6206 coproc = 1;
6207 goto ld;
6208 case M_LWC2_AB:
6209 s = "lwc2";
6210 /* Itbl support may require additional care here. */
6211 coproc = 1;
6212 goto ld;
6213 case M_LWC3_AB:
6214 s = "lwc3";
6215 /* Itbl support may require additional care here. */
6216 coproc = 1;
6217 goto ld;
6218 case M_LWL_AB:
6219 s = "lwl";
6220 lr = 1;
6221 goto ld;
6222 case M_LWR_AB:
6223 s = "lwr";
6224 lr = 1;
6225 goto ld;
6226 case M_LDC1_AB:
6227 s = "ldc1";
6228 /* Itbl support may require additional care here. */
6229 coproc = 1;
6230 goto ld;
6231 case M_LDC2_AB:
6232 s = "ldc2";
6233 /* Itbl support may require additional care here. */
6234 coproc = 1;
6235 goto ld;
6236 case M_LDC3_AB:
6237 s = "ldc3";
6238 /* Itbl support may require additional care here. */
6239 coproc = 1;
6240 goto ld;
6241 case M_LDL_AB:
6242 s = "ldl";
6243 lr = 1;
6244 goto ld;
6245 case M_LDR_AB:
6246 s = "ldr";
6247 lr = 1;
6248 goto ld;
6249 case M_LL_AB:
6250 s = "ll";
6251 goto ld;
6252 case M_LLD_AB:
6253 s = "lld";
6254 goto ld;
6255 case M_LWU_AB:
6256 s = "lwu";
6257 ld:
6258 if (breg == treg || coproc || lr)
6259 {
6260 tempreg = AT;
6261 used_at = 1;
6262 }
6263 else
6264 {
6265 tempreg = treg;
6266 }
6267 goto ld_st;
6268 case M_SB_AB:
6269 s = "sb";
6270 goto st;
6271 case M_SH_AB:
6272 s = "sh";
6273 goto st;
6274 case M_SW_AB:
6275 s = "sw";
6276 goto st;
6277 case M_SWC0_AB:
6278 s = "swc0";
6279 /* Itbl support may require additional care here. */
6280 coproc = 1;
6281 goto st;
6282 case M_SWC1_AB:
6283 s = "swc1";
6284 /* Itbl support may require additional care here. */
6285 coproc = 1;
6286 goto st;
6287 case M_SWC2_AB:
6288 s = "swc2";
6289 /* Itbl support may require additional care here. */
6290 coproc = 1;
6291 goto st;
6292 case M_SWC3_AB:
6293 s = "swc3";
6294 /* Itbl support may require additional care here. */
6295 coproc = 1;
6296 goto st;
6297 case M_SWL_AB:
6298 s = "swl";
6299 goto st;
6300 case M_SWR_AB:
6301 s = "swr";
6302 goto st;
6303 case M_SC_AB:
6304 s = "sc";
6305 goto st;
6306 case M_SCD_AB:
6307 s = "scd";
6308 goto st;
6309 case M_CACHE_AB:
6310 s = "cache";
6311 goto st;
6312 case M_SDC1_AB:
6313 s = "sdc1";
6314 coproc = 1;
6315 /* Itbl support may require additional care here. */
6316 goto st;
6317 case M_SDC2_AB:
6318 s = "sdc2";
6319 /* Itbl support may require additional care here. */
6320 coproc = 1;
6321 goto st;
6322 case M_SDC3_AB:
6323 s = "sdc3";
6324 /* Itbl support may require additional care here. */
6325 coproc = 1;
6326 goto st;
6327 case M_SDL_AB:
6328 s = "sdl";
6329 goto st;
6330 case M_SDR_AB:
6331 s = "sdr";
6332 st:
6333 tempreg = AT;
6334 used_at = 1;
6335 ld_st:
6336 if (coproc
6337 && NO_ISA_COP (mips_opts.arch)
6338 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6339 {
6340 as_bad (_("opcode not supported on this processor: %s"),
6341 mips_cpu_info_from_arch (mips_opts.arch)->name);
6342 break;
6343 }
6344
6345 /* Itbl support may require additional care here. */
6346 if (mask == M_LWC1_AB
6347 || mask == M_SWC1_AB
6348 || mask == M_LDC1_AB
6349 || mask == M_SDC1_AB
6350 || mask == M_L_DAB
6351 || mask == M_S_DAB)
6352 fmt = "T,o(b)";
6353 else if (mask == M_CACHE_AB)
6354 fmt = "k,o(b)";
6355 else if (coproc)
6356 fmt = "E,o(b)";
6357 else
6358 fmt = "t,o(b)";
6359
6360 if (offset_expr.X_op != O_constant
6361 && offset_expr.X_op != O_symbol)
6362 {
6363 as_bad (_("expression too complex"));
6364 offset_expr.X_op = O_constant;
6365 }
6366
6367 if (HAVE_32BIT_ADDRESSES
6368 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6369 {
6370 char value [32];
6371
6372 sprintf_vma (value, offset_expr.X_add_number);
6373 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6374 }
6375
6376 /* A constant expression in PIC code can be handled just as it
6377 is in non PIC code. */
6378 if (offset_expr.X_op == O_constant)
6379 {
6380 expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6381 & ~(bfd_vma) 0xffff);
6382 normalize_address_expr (&expr1);
6383 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6384 if (breg != 0)
6385 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6386 tempreg, tempreg, breg);
6387 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6388 }
6389 else if (mips_pic == NO_PIC)
6390 {
6391 /* If this is a reference to a GP relative symbol, and there
6392 is no base register, we want
6393 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6394 Otherwise, if there is no base register, we want
6395 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6396 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6397 If we have a constant, we need two instructions anyhow,
6398 so we always use the latter form.
6399
6400 If we have a base register, and this is a reference to a
6401 GP relative symbol, we want
6402 addu $tempreg,$breg,$gp
6403 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
6404 Otherwise we want
6405 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6406 addu $tempreg,$tempreg,$breg
6407 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6408 With a constant we always use the latter case.
6409
6410 With 64bit address space and no base register and $at usable,
6411 we want
6412 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6413 lui $at,<sym> (BFD_RELOC_HI16_S)
6414 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6415 dsll32 $tempreg,0
6416 daddu $tempreg,$at
6417 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6418 If we have a base register, we want
6419 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6420 lui $at,<sym> (BFD_RELOC_HI16_S)
6421 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6422 daddu $at,$breg
6423 dsll32 $tempreg,0
6424 daddu $tempreg,$at
6425 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6426
6427 Without $at we can't generate the optimal path for superscalar
6428 processors here since this would require two temporary registers.
6429 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6430 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6431 dsll $tempreg,16
6432 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6433 dsll $tempreg,16
6434 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6435 If we have a base register, we want
6436 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6437 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6438 dsll $tempreg,16
6439 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6440 dsll $tempreg,16
6441 daddu $tempreg,$tempreg,$breg
6442 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6443
6444 For GP relative symbols in 64bit address space we can use
6445 the same sequence as in 32bit address space. */
6446 if (HAVE_64BIT_SYMBOLS)
6447 {
6448 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6449 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6450 {
6451 relax_start (offset_expr.X_add_symbol);
6452 if (breg == 0)
6453 {
6454 macro_build (&offset_expr, s, fmt, treg,
6455 BFD_RELOC_GPREL16, mips_gp_register);
6456 }
6457 else
6458 {
6459 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6460 tempreg, breg, mips_gp_register);
6461 macro_build (&offset_expr, s, fmt, treg,
6462 BFD_RELOC_GPREL16, tempreg);
6463 }
6464 relax_switch ();
6465 }
6466
6467 if (used_at == 0 && mips_opts.at)
6468 {
6469 macro_build (&offset_expr, "lui", "t,u", tempreg,
6470 BFD_RELOC_MIPS_HIGHEST);
6471 macro_build (&offset_expr, "lui", "t,u", AT,
6472 BFD_RELOC_HI16_S);
6473 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6474 tempreg, BFD_RELOC_MIPS_HIGHER);
6475 if (breg != 0)
6476 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6477 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6478 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6479 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6480 tempreg);
6481 used_at = 1;
6482 }
6483 else
6484 {
6485 macro_build (&offset_expr, "lui", "t,u", tempreg,
6486 BFD_RELOC_MIPS_HIGHEST);
6487 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6488 tempreg, BFD_RELOC_MIPS_HIGHER);
6489 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6490 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6491 tempreg, BFD_RELOC_HI16_S);
6492 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6493 if (breg != 0)
6494 macro_build (NULL, "daddu", "d,v,t",
6495 tempreg, tempreg, breg);
6496 macro_build (&offset_expr, s, fmt, treg,
6497 BFD_RELOC_LO16, tempreg);
6498 }
6499
6500 if (mips_relax.sequence)
6501 relax_end ();
6502 break;
6503 }
6504
6505 if (breg == 0)
6506 {
6507 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6508 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6509 {
6510 relax_start (offset_expr.X_add_symbol);
6511 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6512 mips_gp_register);
6513 relax_switch ();
6514 }
6515 macro_build_lui (&offset_expr, tempreg);
6516 macro_build (&offset_expr, s, fmt, treg,
6517 BFD_RELOC_LO16, tempreg);
6518 if (mips_relax.sequence)
6519 relax_end ();
6520 }
6521 else
6522 {
6523 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6524 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6525 {
6526 relax_start (offset_expr.X_add_symbol);
6527 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6528 tempreg, breg, mips_gp_register);
6529 macro_build (&offset_expr, s, fmt, treg,
6530 BFD_RELOC_GPREL16, tempreg);
6531 relax_switch ();
6532 }
6533 macro_build_lui (&offset_expr, tempreg);
6534 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6535 tempreg, tempreg, breg);
6536 macro_build (&offset_expr, s, fmt, treg,
6537 BFD_RELOC_LO16, tempreg);
6538 if (mips_relax.sequence)
6539 relax_end ();
6540 }
6541 }
6542 else if (!mips_big_got)
6543 {
6544 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6545
6546 /* If this is a reference to an external symbol, we want
6547 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6548 nop
6549 <op> $treg,0($tempreg)
6550 Otherwise we want
6551 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6552 nop
6553 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6554 <op> $treg,0($tempreg)
6555
6556 For NewABI, we want
6557 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6558 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6559
6560 If there is a base register, we add it to $tempreg before
6561 the <op>. If there is a constant, we stick it in the
6562 <op> instruction. We don't handle constants larger than
6563 16 bits, because we have no way to load the upper 16 bits
6564 (actually, we could handle them for the subset of cases
6565 in which we are not using $at). */
6566 assert (offset_expr.X_op == O_symbol);
6567 if (HAVE_NEWABI)
6568 {
6569 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6570 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6571 if (breg != 0)
6572 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6573 tempreg, tempreg, breg);
6574 macro_build (&offset_expr, s, fmt, treg,
6575 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6576 break;
6577 }
6578 expr1.X_add_number = offset_expr.X_add_number;
6579 offset_expr.X_add_number = 0;
6580 if (expr1.X_add_number < -0x8000
6581 || expr1.X_add_number >= 0x8000)
6582 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6583 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6584 lw_reloc_type, mips_gp_register);
6585 load_delay_nop ();
6586 relax_start (offset_expr.X_add_symbol);
6587 relax_switch ();
6588 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6589 tempreg, BFD_RELOC_LO16);
6590 relax_end ();
6591 if (breg != 0)
6592 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6593 tempreg, tempreg, breg);
6594 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6595 }
6596 else if (mips_big_got && !HAVE_NEWABI)
6597 {
6598 int gpdelay;
6599
6600 /* If this is a reference to an external symbol, we want
6601 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6602 addu $tempreg,$tempreg,$gp
6603 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6604 <op> $treg,0($tempreg)
6605 Otherwise we want
6606 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6607 nop
6608 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6609 <op> $treg,0($tempreg)
6610 If there is a base register, we add it to $tempreg before
6611 the <op>. If there is a constant, we stick it in the
6612 <op> instruction. We don't handle constants larger than
6613 16 bits, because we have no way to load the upper 16 bits
6614 (actually, we could handle them for the subset of cases
6615 in which we are not using $at). */
6616 assert (offset_expr.X_op == O_symbol);
6617 expr1.X_add_number = offset_expr.X_add_number;
6618 offset_expr.X_add_number = 0;
6619 if (expr1.X_add_number < -0x8000
6620 || expr1.X_add_number >= 0x8000)
6621 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6622 gpdelay = reg_needs_delay (mips_gp_register);
6623 relax_start (offset_expr.X_add_symbol);
6624 macro_build (&offset_expr, "lui", "t,u", tempreg,
6625 BFD_RELOC_MIPS_GOT_HI16);
6626 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6627 mips_gp_register);
6628 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6629 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6630 relax_switch ();
6631 if (gpdelay)
6632 macro_build (NULL, "nop", "");
6633 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6634 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6635 load_delay_nop ();
6636 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6637 tempreg, BFD_RELOC_LO16);
6638 relax_end ();
6639
6640 if (breg != 0)
6641 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6642 tempreg, tempreg, breg);
6643 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6644 }
6645 else if (mips_big_got && HAVE_NEWABI)
6646 {
6647 /* If this is a reference to an external symbol, we want
6648 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6649 add $tempreg,$tempreg,$gp
6650 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6651 <op> $treg,<ofst>($tempreg)
6652 Otherwise, for local symbols, we want:
6653 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6654 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6655 assert (offset_expr.X_op == O_symbol);
6656 expr1.X_add_number = offset_expr.X_add_number;
6657 offset_expr.X_add_number = 0;
6658 if (expr1.X_add_number < -0x8000
6659 || expr1.X_add_number >= 0x8000)
6660 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6661 relax_start (offset_expr.X_add_symbol);
6662 macro_build (&offset_expr, "lui", "t,u", tempreg,
6663 BFD_RELOC_MIPS_GOT_HI16);
6664 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6665 mips_gp_register);
6666 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6667 BFD_RELOC_MIPS_GOT_LO16, tempreg);
6668 if (breg != 0)
6669 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6670 tempreg, tempreg, breg);
6671 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6672
6673 relax_switch ();
6674 offset_expr.X_add_number = expr1.X_add_number;
6675 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6676 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6677 if (breg != 0)
6678 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6679 tempreg, tempreg, breg);
6680 macro_build (&offset_expr, s, fmt, treg,
6681 BFD_RELOC_MIPS_GOT_OFST, tempreg);
6682 relax_end ();
6683 }
6684 else
6685 abort ();
6686
6687 break;
6688
6689 case M_LI:
6690 case M_LI_S:
6691 load_register (treg, &imm_expr, 0);
6692 break;
6693
6694 case M_DLI:
6695 load_register (treg, &imm_expr, 1);
6696 break;
6697
6698 case M_LI_SS:
6699 if (imm_expr.X_op == O_constant)
6700 {
6701 used_at = 1;
6702 load_register (AT, &imm_expr, 0);
6703 macro_build (NULL, "mtc1", "t,G", AT, treg);
6704 break;
6705 }
6706 else
6707 {
6708 assert (offset_expr.X_op == O_symbol
6709 && strcmp (segment_name (S_GET_SEGMENT
6710 (offset_expr.X_add_symbol)),
6711 ".lit4") == 0
6712 && offset_expr.X_add_number == 0);
6713 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6714 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6715 break;
6716 }
6717
6718 case M_LI_D:
6719 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6720 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6721 order 32 bits of the value and the low order 32 bits are either
6722 zero or in OFFSET_EXPR. */
6723 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6724 {
6725 if (HAVE_64BIT_GPRS)
6726 load_register (treg, &imm_expr, 1);
6727 else
6728 {
6729 int hreg, lreg;
6730
6731 if (target_big_endian)
6732 {
6733 hreg = treg;
6734 lreg = treg + 1;
6735 }
6736 else
6737 {
6738 hreg = treg + 1;
6739 lreg = treg;
6740 }
6741
6742 if (hreg <= 31)
6743 load_register (hreg, &imm_expr, 0);
6744 if (lreg <= 31)
6745 {
6746 if (offset_expr.X_op == O_absent)
6747 move_register (lreg, 0);
6748 else
6749 {
6750 assert (offset_expr.X_op == O_constant);
6751 load_register (lreg, &offset_expr, 0);
6752 }
6753 }
6754 }
6755 break;
6756 }
6757
6758 /* We know that sym is in the .rdata section. First we get the
6759 upper 16 bits of the address. */
6760 if (mips_pic == NO_PIC)
6761 {
6762 macro_build_lui (&offset_expr, AT);
6763 used_at = 1;
6764 }
6765 else
6766 {
6767 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6768 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6769 used_at = 1;
6770 }
6771
6772 /* Now we load the register(s). */
6773 if (HAVE_64BIT_GPRS)
6774 {
6775 used_at = 1;
6776 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6777 }
6778 else
6779 {
6780 used_at = 1;
6781 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6782 if (treg != RA)
6783 {
6784 /* FIXME: How in the world do we deal with the possible
6785 overflow here? */
6786 offset_expr.X_add_number += 4;
6787 macro_build (&offset_expr, "lw", "t,o(b)",
6788 treg + 1, BFD_RELOC_LO16, AT);
6789 }
6790 }
6791 break;
6792
6793 case M_LI_DD:
6794 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6795 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6796 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6797 the value and the low order 32 bits are either zero or in
6798 OFFSET_EXPR. */
6799 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6800 {
6801 used_at = 1;
6802 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6803 if (HAVE_64BIT_FPRS)
6804 {
6805 assert (HAVE_64BIT_GPRS);
6806 macro_build (NULL, "dmtc1", "t,S", AT, treg);
6807 }
6808 else
6809 {
6810 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6811 if (offset_expr.X_op == O_absent)
6812 macro_build (NULL, "mtc1", "t,G", 0, treg);
6813 else
6814 {
6815 assert (offset_expr.X_op == O_constant);
6816 load_register (AT, &offset_expr, 0);
6817 macro_build (NULL, "mtc1", "t,G", AT, treg);
6818 }
6819 }
6820 break;
6821 }
6822
6823 assert (offset_expr.X_op == O_symbol
6824 && offset_expr.X_add_number == 0);
6825 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6826 if (strcmp (s, ".lit8") == 0)
6827 {
6828 if (mips_opts.isa != ISA_MIPS1)
6829 {
6830 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6831 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6832 break;
6833 }
6834 breg = mips_gp_register;
6835 r = BFD_RELOC_MIPS_LITERAL;
6836 goto dob;
6837 }
6838 else
6839 {
6840 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6841 used_at = 1;
6842 if (mips_pic != NO_PIC)
6843 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6844 BFD_RELOC_MIPS_GOT16, mips_gp_register);
6845 else
6846 {
6847 /* FIXME: This won't work for a 64 bit address. */
6848 macro_build_lui (&offset_expr, AT);
6849 }
6850
6851 if (mips_opts.isa != ISA_MIPS1)
6852 {
6853 macro_build (&offset_expr, "ldc1", "T,o(b)",
6854 treg, BFD_RELOC_LO16, AT);
6855 break;
6856 }
6857 breg = AT;
6858 r = BFD_RELOC_LO16;
6859 goto dob;
6860 }
6861
6862 case M_L_DOB:
6863 /* Even on a big endian machine $fn comes before $fn+1. We have
6864 to adjust when loading from memory. */
6865 r = BFD_RELOC_LO16;
6866 dob:
6867 assert (mips_opts.isa == ISA_MIPS1);
6868 macro_build (&offset_expr, "lwc1", "T,o(b)",
6869 target_big_endian ? treg + 1 : treg, r, breg);
6870 /* FIXME: A possible overflow which I don't know how to deal
6871 with. */
6872 offset_expr.X_add_number += 4;
6873 macro_build (&offset_expr, "lwc1", "T,o(b)",
6874 target_big_endian ? treg : treg + 1, r, breg);
6875 break;
6876
6877 case M_L_DAB:
6878 /*
6879 * The MIPS assembler seems to check for X_add_number not
6880 * being double aligned and generating:
6881 * lui at,%hi(foo+1)
6882 * addu at,at,v1
6883 * addiu at,at,%lo(foo+1)
6884 * lwc1 f2,0(at)
6885 * lwc1 f3,4(at)
6886 * But, the resulting address is the same after relocation so why
6887 * generate the extra instruction?
6888 */
6889 /* Itbl support may require additional care here. */
6890 coproc = 1;
6891 if (mips_opts.isa != ISA_MIPS1)
6892 {
6893 s = "ldc1";
6894 goto ld;
6895 }
6896
6897 s = "lwc1";
6898 fmt = "T,o(b)";
6899 goto ldd_std;
6900
6901 case M_S_DAB:
6902 if (mips_opts.isa != ISA_MIPS1)
6903 {
6904 s = "sdc1";
6905 goto st;
6906 }
6907
6908 s = "swc1";
6909 fmt = "T,o(b)";
6910 /* Itbl support may require additional care here. */
6911 coproc = 1;
6912 goto ldd_std;
6913
6914 case M_LD_AB:
6915 if (HAVE_64BIT_GPRS)
6916 {
6917 s = "ld";
6918 goto ld;
6919 }
6920
6921 s = "lw";
6922 fmt = "t,o(b)";
6923 goto ldd_std;
6924
6925 case M_SD_AB:
6926 if (HAVE_64BIT_GPRS)
6927 {
6928 s = "sd";
6929 goto st;
6930 }
6931
6932 s = "sw";
6933 fmt = "t,o(b)";
6934
6935 ldd_std:
6936 if (offset_expr.X_op != O_symbol
6937 && offset_expr.X_op != O_constant)
6938 {
6939 as_bad (_("expression too complex"));
6940 offset_expr.X_op = O_constant;
6941 }
6942
6943 if (HAVE_32BIT_ADDRESSES
6944 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6945 {
6946 char value [32];
6947
6948 sprintf_vma (value, offset_expr.X_add_number);
6949 as_bad (_("Number (0x%s) larger than 32 bits"), value);
6950 }
6951
6952 /* Even on a big endian machine $fn comes before $fn+1. We have
6953 to adjust when loading from memory. We set coproc if we must
6954 load $fn+1 first. */
6955 /* Itbl support may require additional care here. */
6956 if (! target_big_endian)
6957 coproc = 0;
6958
6959 if (mips_pic == NO_PIC
6960 || offset_expr.X_op == O_constant)
6961 {
6962 /* If this is a reference to a GP relative symbol, we want
6963 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6964 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
6965 If we have a base register, we use this
6966 addu $at,$breg,$gp
6967 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6968 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
6969 If this is not a GP relative symbol, we want
6970 lui $at,<sym> (BFD_RELOC_HI16_S)
6971 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6972 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6973 If there is a base register, we add it to $at after the
6974 lui instruction. If there is a constant, we always use
6975 the last case. */
6976 if (offset_expr.X_op == O_symbol
6977 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6978 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6979 {
6980 relax_start (offset_expr.X_add_symbol);
6981 if (breg == 0)
6982 {
6983 tempreg = mips_gp_register;
6984 }
6985 else
6986 {
6987 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6988 AT, breg, mips_gp_register);
6989 tempreg = AT;
6990 used_at = 1;
6991 }
6992
6993 /* Itbl support may require additional care here. */
6994 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6995 BFD_RELOC_GPREL16, tempreg);
6996 offset_expr.X_add_number += 4;
6997
6998 /* Set mips_optimize to 2 to avoid inserting an
6999 undesired nop. */
7000 hold_mips_optimize = mips_optimize;
7001 mips_optimize = 2;
7002 /* Itbl support may require additional care here. */
7003 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7004 BFD_RELOC_GPREL16, tempreg);
7005 mips_optimize = hold_mips_optimize;
7006
7007 relax_switch ();
7008
7009 /* We just generated two relocs. When tc_gen_reloc
7010 handles this case, it will skip the first reloc and
7011 handle the second. The second reloc already has an
7012 extra addend of 4, which we added above. We must
7013 subtract it out, and then subtract another 4 to make
7014 the first reloc come out right. The second reloc
7015 will come out right because we are going to add 4 to
7016 offset_expr when we build its instruction below.
7017
7018 If we have a symbol, then we don't want to include
7019 the offset, because it will wind up being included
7020 when we generate the reloc. */
7021
7022 if (offset_expr.X_op == O_constant)
7023 offset_expr.X_add_number -= 8;
7024 else
7025 {
7026 offset_expr.X_add_number = -4;
7027 offset_expr.X_op = O_constant;
7028 }
7029 }
7030 used_at = 1;
7031 macro_build_lui (&offset_expr, AT);
7032 if (breg != 0)
7033 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7034 /* Itbl support may require additional care here. */
7035 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7036 BFD_RELOC_LO16, AT);
7037 /* FIXME: How do we handle overflow here? */
7038 offset_expr.X_add_number += 4;
7039 /* Itbl support may require additional care here. */
7040 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7041 BFD_RELOC_LO16, AT);
7042 if (mips_relax.sequence)
7043 relax_end ();
7044 }
7045 else if (!mips_big_got)
7046 {
7047 /* If this is a reference to an external symbol, we want
7048 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7049 nop
7050 <op> $treg,0($at)
7051 <op> $treg+1,4($at)
7052 Otherwise we want
7053 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7054 nop
7055 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7056 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7057 If there is a base register we add it to $at before the
7058 lwc1 instructions. If there is a constant we include it
7059 in the lwc1 instructions. */
7060 used_at = 1;
7061 expr1.X_add_number = offset_expr.X_add_number;
7062 if (expr1.X_add_number < -0x8000
7063 || expr1.X_add_number >= 0x8000 - 4)
7064 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7065 load_got_offset (AT, &offset_expr);
7066 load_delay_nop ();
7067 if (breg != 0)
7068 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7069
7070 /* Set mips_optimize to 2 to avoid inserting an undesired
7071 nop. */
7072 hold_mips_optimize = mips_optimize;
7073 mips_optimize = 2;
7074
7075 /* Itbl support may require additional care here. */
7076 relax_start (offset_expr.X_add_symbol);
7077 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7078 BFD_RELOC_LO16, AT);
7079 expr1.X_add_number += 4;
7080 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7081 BFD_RELOC_LO16, AT);
7082 relax_switch ();
7083 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7084 BFD_RELOC_LO16, AT);
7085 offset_expr.X_add_number += 4;
7086 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7087 BFD_RELOC_LO16, AT);
7088 relax_end ();
7089
7090 mips_optimize = hold_mips_optimize;
7091 }
7092 else if (mips_big_got)
7093 {
7094 int gpdelay;
7095
7096 /* If this is a reference to an external symbol, we want
7097 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7098 addu $at,$at,$gp
7099 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7100 nop
7101 <op> $treg,0($at)
7102 <op> $treg+1,4($at)
7103 Otherwise we want
7104 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7105 nop
7106 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7107 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7108 If there is a base register we add it to $at before the
7109 lwc1 instructions. If there is a constant we include it
7110 in the lwc1 instructions. */
7111 used_at = 1;
7112 expr1.X_add_number = offset_expr.X_add_number;
7113 offset_expr.X_add_number = 0;
7114 if (expr1.X_add_number < -0x8000
7115 || expr1.X_add_number >= 0x8000 - 4)
7116 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7117 gpdelay = reg_needs_delay (mips_gp_register);
7118 relax_start (offset_expr.X_add_symbol);
7119 macro_build (&offset_expr, "lui", "t,u",
7120 AT, BFD_RELOC_MIPS_GOT_HI16);
7121 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7122 AT, AT, mips_gp_register);
7123 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7124 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7125 load_delay_nop ();
7126 if (breg != 0)
7127 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7128 /* Itbl support may require additional care here. */
7129 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7130 BFD_RELOC_LO16, AT);
7131 expr1.X_add_number += 4;
7132
7133 /* Set mips_optimize to 2 to avoid inserting an undesired
7134 nop. */
7135 hold_mips_optimize = mips_optimize;
7136 mips_optimize = 2;
7137 /* Itbl support may require additional care here. */
7138 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7139 BFD_RELOC_LO16, AT);
7140 mips_optimize = hold_mips_optimize;
7141 expr1.X_add_number -= 4;
7142
7143 relax_switch ();
7144 offset_expr.X_add_number = expr1.X_add_number;
7145 if (gpdelay)
7146 macro_build (NULL, "nop", "");
7147 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7148 BFD_RELOC_MIPS_GOT16, mips_gp_register);
7149 load_delay_nop ();
7150 if (breg != 0)
7151 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7152 /* Itbl support may require additional care here. */
7153 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7154 BFD_RELOC_LO16, AT);
7155 offset_expr.X_add_number += 4;
7156
7157 /* Set mips_optimize to 2 to avoid inserting an undesired
7158 nop. */
7159 hold_mips_optimize = mips_optimize;
7160 mips_optimize = 2;
7161 /* Itbl support may require additional care here. */
7162 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7163 BFD_RELOC_LO16, AT);
7164 mips_optimize = hold_mips_optimize;
7165 relax_end ();
7166 }
7167 else
7168 abort ();
7169
7170 break;
7171
7172 case M_LD_OB:
7173 s = "lw";
7174 goto sd_ob;
7175 case M_SD_OB:
7176 s = "sw";
7177 sd_ob:
7178 assert (HAVE_32BIT_ADDRESSES);
7179 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7180 offset_expr.X_add_number += 4;
7181 macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7182 break;
7183
7184 /* New code added to support COPZ instructions.
7185 This code builds table entries out of the macros in mip_opcodes.
7186 R4000 uses interlocks to handle coproc delays.
7187 Other chips (like the R3000) require nops to be inserted for delays.
7188
7189 FIXME: Currently, we require that the user handle delays.
7190 In order to fill delay slots for non-interlocked chips,
7191 we must have a way to specify delays based on the coprocessor.
7192 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7193 What are the side-effects of the cop instruction?
7194 What cache support might we have and what are its effects?
7195 Both coprocessor & memory require delays. how long???
7196 What registers are read/set/modified?
7197
7198 If an itbl is provided to interpret cop instructions,
7199 this knowledge can be encoded in the itbl spec. */
7200
7201 case M_COP0:
7202 s = "c0";
7203 goto copz;
7204 case M_COP1:
7205 s = "c1";
7206 goto copz;
7207 case M_COP2:
7208 s = "c2";
7209 goto copz;
7210 case M_COP3:
7211 s = "c3";
7212 copz:
7213 if (NO_ISA_COP (mips_opts.arch)
7214 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7215 {
7216 as_bad (_("opcode not supported on this processor: %s"),
7217 mips_cpu_info_from_arch (mips_opts.arch)->name);
7218 break;
7219 }
7220
7221 /* For now we just do C (same as Cz). The parameter will be
7222 stored in insn_opcode by mips_ip. */
7223 macro_build (NULL, s, "C", ip->insn_opcode);
7224 break;
7225
7226 case M_MOVE:
7227 move_register (dreg, sreg);
7228 break;
7229
7230 #ifdef LOSING_COMPILER
7231 default:
7232 /* Try and see if this is a new itbl instruction.
7233 This code builds table entries out of the macros in mip_opcodes.
7234 FIXME: For now we just assemble the expression and pass it's
7235 value along as a 32-bit immediate.
7236 We may want to have the assembler assemble this value,
7237 so that we gain the assembler's knowledge of delay slots,
7238 symbols, etc.
7239 Would it be more efficient to use mask (id) here? */
7240 if (itbl_have_entries
7241 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7242 {
7243 s = ip->insn_mo->name;
7244 s2 = "cop3";
7245 coproc = ITBL_DECODE_PNUM (immed_expr);;
7246 macro_build (&immed_expr, s, "C");
7247 break;
7248 }
7249 macro2 (ip);
7250 break;
7251 }
7252 if (!mips_opts.at && used_at)
7253 as_bad (_("Macro used $at after \".set noat\""));
7254 }
7255
7256 static void
7257 macro2 (struct mips_cl_insn *ip)
7258 {
7259 unsigned int treg, sreg, dreg, breg;
7260 unsigned int tempreg;
7261 int mask;
7262 int used_at;
7263 expressionS expr1;
7264 const char *s;
7265 const char *s2;
7266 const char *fmt;
7267 int likely = 0;
7268 int dbl = 0;
7269 int coproc = 0;
7270 int lr = 0;
7271 int imm = 0;
7272 int off;
7273 offsetT maxnum;
7274 bfd_reloc_code_real_type r;
7275
7276 treg = (ip->insn_opcode >> 16) & 0x1f;
7277 dreg = (ip->insn_opcode >> 11) & 0x1f;
7278 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7279 mask = ip->insn_mo->mask;
7280
7281 expr1.X_op = O_constant;
7282 expr1.X_op_symbol = NULL;
7283 expr1.X_add_symbol = NULL;
7284 expr1.X_add_number = 1;
7285
7286 switch (mask)
7287 {
7288 #endif /* LOSING_COMPILER */
7289
7290 case M_DMUL:
7291 dbl = 1;
7292 case M_MUL:
7293 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7294 macro_build (NULL, "mflo", "d", dreg);
7295 break;
7296
7297 case M_DMUL_I:
7298 dbl = 1;
7299 case M_MUL_I:
7300 /* The MIPS assembler some times generates shifts and adds. I'm
7301 not trying to be that fancy. GCC should do this for us
7302 anyway. */
7303 used_at = 1;
7304 load_register (AT, &imm_expr, dbl);
7305 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7306 macro_build (NULL, "mflo", "d", dreg);
7307 break;
7308
7309 case M_DMULO_I:
7310 dbl = 1;
7311 case M_MULO_I:
7312 imm = 1;
7313 goto do_mulo;
7314
7315 case M_DMULO:
7316 dbl = 1;
7317 case M_MULO:
7318 do_mulo:
7319 start_noreorder ();
7320 used_at = 1;
7321 if (imm)
7322 load_register (AT, &imm_expr, dbl);
7323 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7324 macro_build (NULL, "mflo", "d", dreg);
7325 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7326 macro_build (NULL, "mfhi", "d", AT);
7327 if (mips_trap)
7328 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7329 else
7330 {
7331 expr1.X_add_number = 8;
7332 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7333 macro_build (NULL, "nop", "", 0);
7334 macro_build (NULL, "break", "c", 6);
7335 }
7336 end_noreorder ();
7337 macro_build (NULL, "mflo", "d", dreg);
7338 break;
7339
7340 case M_DMULOU_I:
7341 dbl = 1;
7342 case M_MULOU_I:
7343 imm = 1;
7344 goto do_mulou;
7345
7346 case M_DMULOU:
7347 dbl = 1;
7348 case M_MULOU:
7349 do_mulou:
7350 start_noreorder ();
7351 used_at = 1;
7352 if (imm)
7353 load_register (AT, &imm_expr, dbl);
7354 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7355 sreg, imm ? AT : treg);
7356 macro_build (NULL, "mfhi", "d", AT);
7357 macro_build (NULL, "mflo", "d", dreg);
7358 if (mips_trap)
7359 macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7360 else
7361 {
7362 expr1.X_add_number = 8;
7363 macro_build (&expr1, "beq", "s,t,p", AT, 0);
7364 macro_build (NULL, "nop", "", 0);
7365 macro_build (NULL, "break", "c", 6);
7366 }
7367 end_noreorder ();
7368 break;
7369
7370 case M_DROL:
7371 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7372 {
7373 if (dreg == sreg)
7374 {
7375 tempreg = AT;
7376 used_at = 1;
7377 }
7378 else
7379 {
7380 tempreg = dreg;
7381 }
7382 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7383 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7384 break;
7385 }
7386 used_at = 1;
7387 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7388 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7389 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7390 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7391 break;
7392
7393 case M_ROL:
7394 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7395 {
7396 if (dreg == sreg)
7397 {
7398 tempreg = AT;
7399 used_at = 1;
7400 }
7401 else
7402 {
7403 tempreg = dreg;
7404 }
7405 macro_build (NULL, "negu", "d,w", tempreg, treg);
7406 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7407 break;
7408 }
7409 used_at = 1;
7410 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7411 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7412 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7413 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7414 break;
7415
7416 case M_DROL_I:
7417 {
7418 unsigned int rot;
7419 char *l, *r;
7420
7421 if (imm_expr.X_op != O_constant)
7422 as_bad (_("Improper rotate count"));
7423 rot = imm_expr.X_add_number & 0x3f;
7424 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7425 {
7426 rot = (64 - rot) & 0x3f;
7427 if (rot >= 32)
7428 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7429 else
7430 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7431 break;
7432 }
7433 if (rot == 0)
7434 {
7435 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7436 break;
7437 }
7438 l = (rot < 0x20) ? "dsll" : "dsll32";
7439 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7440 rot &= 0x1f;
7441 used_at = 1;
7442 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7443 macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7444 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7445 }
7446 break;
7447
7448 case M_ROL_I:
7449 {
7450 unsigned int rot;
7451
7452 if (imm_expr.X_op != O_constant)
7453 as_bad (_("Improper rotate count"));
7454 rot = imm_expr.X_add_number & 0x1f;
7455 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7456 {
7457 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7458 break;
7459 }
7460 if (rot == 0)
7461 {
7462 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7463 break;
7464 }
7465 used_at = 1;
7466 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7467 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7468 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7469 }
7470 break;
7471
7472 case M_DROR:
7473 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7474 {
7475 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7476 break;
7477 }
7478 used_at = 1;
7479 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7480 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7481 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7482 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7483 break;
7484
7485 case M_ROR:
7486 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7487 {
7488 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7489 break;
7490 }
7491 used_at = 1;
7492 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7493 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7494 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7495 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7496 break;
7497
7498 case M_DROR_I:
7499 {
7500 unsigned int rot;
7501 char *l, *r;
7502
7503 if (imm_expr.X_op != O_constant)
7504 as_bad (_("Improper rotate count"));
7505 rot = imm_expr.X_add_number & 0x3f;
7506 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7507 {
7508 if (rot >= 32)
7509 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7510 else
7511 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7512 break;
7513 }
7514 if (rot == 0)
7515 {
7516 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7517 break;
7518 }
7519 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7520 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7521 rot &= 0x1f;
7522 used_at = 1;
7523 macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7524 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7525 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7526 }
7527 break;
7528
7529 case M_ROR_I:
7530 {
7531 unsigned int rot;
7532
7533 if (imm_expr.X_op != O_constant)
7534 as_bad (_("Improper rotate count"));
7535 rot = imm_expr.X_add_number & 0x1f;
7536 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7537 {
7538 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7539 break;
7540 }
7541 if (rot == 0)
7542 {
7543 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7544 break;
7545 }
7546 used_at = 1;
7547 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7548 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7549 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7550 }
7551 break;
7552
7553 case M_S_DOB:
7554 assert (mips_opts.isa == ISA_MIPS1);
7555 /* Even on a big endian machine $fn comes before $fn+1. We have
7556 to adjust when storing to memory. */
7557 macro_build (&offset_expr, "swc1", "T,o(b)",
7558 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7559 offset_expr.X_add_number += 4;
7560 macro_build (&offset_expr, "swc1", "T,o(b)",
7561 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7562 break;
7563
7564 case M_SEQ:
7565 if (sreg == 0)
7566 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7567 else if (treg == 0)
7568 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7569 else
7570 {
7571 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7572 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7573 }
7574 break;
7575
7576 case M_SEQ_I:
7577 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7578 {
7579 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7580 break;
7581 }
7582 if (sreg == 0)
7583 {
7584 as_warn (_("Instruction %s: result is always false"),
7585 ip->insn_mo->name);
7586 move_register (dreg, 0);
7587 break;
7588 }
7589 if (CPU_HAS_SEQ (mips_opts.arch)
7590 && -512 <= imm_expr.X_add_number
7591 && imm_expr.X_add_number < 512)
7592 {
7593 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7594 imm_expr.X_add_number);
7595 break;
7596 }
7597 if (imm_expr.X_op == O_constant
7598 && imm_expr.X_add_number >= 0
7599 && imm_expr.X_add_number < 0x10000)
7600 {
7601 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7602 }
7603 else if (imm_expr.X_op == O_constant
7604 && imm_expr.X_add_number > -0x8000
7605 && imm_expr.X_add_number < 0)
7606 {
7607 imm_expr.X_add_number = -imm_expr.X_add_number;
7608 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7609 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7610 }
7611 else if (CPU_HAS_SEQ (mips_opts.arch))
7612 {
7613 used_at = 1;
7614 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7615 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7616 break;
7617 }
7618 else
7619 {
7620 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7621 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7622 used_at = 1;
7623 }
7624 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7625 break;
7626
7627 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7628 s = "slt";
7629 goto sge;
7630 case M_SGEU:
7631 s = "sltu";
7632 sge:
7633 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7634 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7635 break;
7636
7637 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7638 case M_SGEU_I:
7639 if (imm_expr.X_op == O_constant
7640 && imm_expr.X_add_number >= -0x8000
7641 && imm_expr.X_add_number < 0x8000)
7642 {
7643 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7644 dreg, sreg, BFD_RELOC_LO16);
7645 }
7646 else
7647 {
7648 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7649 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7650 dreg, sreg, AT);
7651 used_at = 1;
7652 }
7653 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7654 break;
7655
7656 case M_SGT: /* sreg > treg <==> treg < sreg */
7657 s = "slt";
7658 goto sgt;
7659 case M_SGTU:
7660 s = "sltu";
7661 sgt:
7662 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7663 break;
7664
7665 case M_SGT_I: /* sreg > I <==> I < sreg */
7666 s = "slt";
7667 goto sgti;
7668 case M_SGTU_I:
7669 s = "sltu";
7670 sgti:
7671 used_at = 1;
7672 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7673 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7674 break;
7675
7676 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
7677 s = "slt";
7678 goto sle;
7679 case M_SLEU:
7680 s = "sltu";
7681 sle:
7682 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7683 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7684 break;
7685
7686 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7687 s = "slt";
7688 goto slei;
7689 case M_SLEU_I:
7690 s = "sltu";
7691 slei:
7692 used_at = 1;
7693 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7694 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7695 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7696 break;
7697
7698 case M_SLT_I:
7699 if (imm_expr.X_op == O_constant
7700 && imm_expr.X_add_number >= -0x8000
7701 && imm_expr.X_add_number < 0x8000)
7702 {
7703 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7704 break;
7705 }
7706 used_at = 1;
7707 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7708 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7709 break;
7710
7711 case M_SLTU_I:
7712 if (imm_expr.X_op == O_constant
7713 && imm_expr.X_add_number >= -0x8000
7714 && imm_expr.X_add_number < 0x8000)
7715 {
7716 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7717 BFD_RELOC_LO16);
7718 break;
7719 }
7720 used_at = 1;
7721 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7722 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7723 break;
7724
7725 case M_SNE:
7726 if (sreg == 0)
7727 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7728 else if (treg == 0)
7729 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7730 else
7731 {
7732 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7733 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7734 }
7735 break;
7736
7737 case M_SNE_I:
7738 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7739 {
7740 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7741 break;
7742 }
7743 if (sreg == 0)
7744 {
7745 as_warn (_("Instruction %s: result is always true"),
7746 ip->insn_mo->name);
7747 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7748 dreg, 0, BFD_RELOC_LO16);
7749 break;
7750 }
7751 if (CPU_HAS_SEQ (mips_opts.arch)
7752 && -512 <= imm_expr.X_add_number
7753 && imm_expr.X_add_number < 512)
7754 {
7755 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7756 imm_expr.X_add_number);
7757 break;
7758 }
7759 if (imm_expr.X_op == O_constant
7760 && imm_expr.X_add_number >= 0
7761 && imm_expr.X_add_number < 0x10000)
7762 {
7763 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7764 }
7765 else if (imm_expr.X_op == O_constant
7766 && imm_expr.X_add_number > -0x8000
7767 && imm_expr.X_add_number < 0)
7768 {
7769 imm_expr.X_add_number = -imm_expr.X_add_number;
7770 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7771 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7772 }
7773 else if (CPU_HAS_SEQ (mips_opts.arch))
7774 {
7775 used_at = 1;
7776 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7777 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7778 break;
7779 }
7780 else
7781 {
7782 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7783 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7784 used_at = 1;
7785 }
7786 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7787 break;
7788
7789 case M_DSUB_I:
7790 dbl = 1;
7791 case M_SUB_I:
7792 if (imm_expr.X_op == O_constant
7793 && imm_expr.X_add_number > -0x8000
7794 && imm_expr.X_add_number <= 0x8000)
7795 {
7796 imm_expr.X_add_number = -imm_expr.X_add_number;
7797 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7798 dreg, sreg, BFD_RELOC_LO16);
7799 break;
7800 }
7801 used_at = 1;
7802 load_register (AT, &imm_expr, dbl);
7803 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7804 break;
7805
7806 case M_DSUBU_I:
7807 dbl = 1;
7808 case M_SUBU_I:
7809 if (imm_expr.X_op == O_constant
7810 && imm_expr.X_add_number > -0x8000
7811 && imm_expr.X_add_number <= 0x8000)
7812 {
7813 imm_expr.X_add_number = -imm_expr.X_add_number;
7814 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7815 dreg, sreg, BFD_RELOC_LO16);
7816 break;
7817 }
7818 used_at = 1;
7819 load_register (AT, &imm_expr, dbl);
7820 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7821 break;
7822
7823 case M_TEQ_I:
7824 s = "teq";
7825 goto trap;
7826 case M_TGE_I:
7827 s = "tge";
7828 goto trap;
7829 case M_TGEU_I:
7830 s = "tgeu";
7831 goto trap;
7832 case M_TLT_I:
7833 s = "tlt";
7834 goto trap;
7835 case M_TLTU_I:
7836 s = "tltu";
7837 goto trap;
7838 case M_TNE_I:
7839 s = "tne";
7840 trap:
7841 used_at = 1;
7842 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7843 macro_build (NULL, s, "s,t", sreg, AT);
7844 break;
7845
7846 case M_TRUNCWS:
7847 case M_TRUNCWD:
7848 assert (mips_opts.isa == ISA_MIPS1);
7849 used_at = 1;
7850 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7851 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7852
7853 /*
7854 * Is the double cfc1 instruction a bug in the mips assembler;
7855 * or is there a reason for it?
7856 */
7857 start_noreorder ();
7858 macro_build (NULL, "cfc1", "t,G", treg, RA);
7859 macro_build (NULL, "cfc1", "t,G", treg, RA);
7860 macro_build (NULL, "nop", "");
7861 expr1.X_add_number = 3;
7862 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7863 expr1.X_add_number = 2;
7864 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7865 macro_build (NULL, "ctc1", "t,G", AT, RA);
7866 macro_build (NULL, "nop", "");
7867 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7868 dreg, sreg);
7869 macro_build (NULL, "ctc1", "t,G", treg, RA);
7870 macro_build (NULL, "nop", "");
7871 end_noreorder ();
7872 break;
7873
7874 case M_ULH:
7875 s = "lb";
7876 goto ulh;
7877 case M_ULHU:
7878 s = "lbu";
7879 ulh:
7880 used_at = 1;
7881 if (offset_expr.X_add_number >= 0x7fff)
7882 as_bad (_("operand overflow"));
7883 if (! target_big_endian)
7884 ++offset_expr.X_add_number;
7885 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7886 if (! target_big_endian)
7887 --offset_expr.X_add_number;
7888 else
7889 ++offset_expr.X_add_number;
7890 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7891 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7892 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7893 break;
7894
7895 case M_ULD:
7896 s = "ldl";
7897 s2 = "ldr";
7898 off = 7;
7899 goto ulw;
7900 case M_ULW:
7901 s = "lwl";
7902 s2 = "lwr";
7903 off = 3;
7904 ulw:
7905 if (offset_expr.X_add_number >= 0x8000 - off)
7906 as_bad (_("operand overflow"));
7907 if (treg != breg)
7908 tempreg = treg;
7909 else
7910 {
7911 used_at = 1;
7912 tempreg = AT;
7913 }
7914 if (! target_big_endian)
7915 offset_expr.X_add_number += off;
7916 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7917 if (! target_big_endian)
7918 offset_expr.X_add_number -= off;
7919 else
7920 offset_expr.X_add_number += off;
7921 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7922
7923 /* If necessary, move the result in tempreg the final destination. */
7924 if (treg == tempreg)
7925 break;
7926 /* Protect second load's delay slot. */
7927 load_delay_nop ();
7928 move_register (treg, tempreg);
7929 break;
7930
7931 case M_ULD_A:
7932 s = "ldl";
7933 s2 = "ldr";
7934 off = 7;
7935 goto ulwa;
7936 case M_ULW_A:
7937 s = "lwl";
7938 s2 = "lwr";
7939 off = 3;
7940 ulwa:
7941 used_at = 1;
7942 load_address (AT, &offset_expr, &used_at);
7943 if (breg != 0)
7944 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7945 if (! target_big_endian)
7946 expr1.X_add_number = off;
7947 else
7948 expr1.X_add_number = 0;
7949 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7950 if (! target_big_endian)
7951 expr1.X_add_number = 0;
7952 else
7953 expr1.X_add_number = off;
7954 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7955 break;
7956
7957 case M_ULH_A:
7958 case M_ULHU_A:
7959 used_at = 1;
7960 load_address (AT, &offset_expr, &used_at);
7961 if (breg != 0)
7962 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7963 if (target_big_endian)
7964 expr1.X_add_number = 0;
7965 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7966 treg, BFD_RELOC_LO16, AT);
7967 if (target_big_endian)
7968 expr1.X_add_number = 1;
7969 else
7970 expr1.X_add_number = 0;
7971 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7972 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7973 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7974 break;
7975
7976 case M_USH:
7977 used_at = 1;
7978 if (offset_expr.X_add_number >= 0x7fff)
7979 as_bad (_("operand overflow"));
7980 if (target_big_endian)
7981 ++offset_expr.X_add_number;
7982 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7983 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7984 if (target_big_endian)
7985 --offset_expr.X_add_number;
7986 else
7987 ++offset_expr.X_add_number;
7988 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7989 break;
7990
7991 case M_USD:
7992 s = "sdl";
7993 s2 = "sdr";
7994 off = 7;
7995 goto usw;
7996 case M_USW:
7997 s = "swl";
7998 s2 = "swr";
7999 off = 3;
8000 usw:
8001 if (offset_expr.X_add_number >= 0x8000 - off)
8002 as_bad (_("operand overflow"));
8003 if (! target_big_endian)
8004 offset_expr.X_add_number += off;
8005 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8006 if (! target_big_endian)
8007 offset_expr.X_add_number -= off;
8008 else
8009 offset_expr.X_add_number += off;
8010 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8011 break;
8012
8013 case M_USD_A:
8014 s = "sdl";
8015 s2 = "sdr";
8016 off = 7;
8017 goto uswa;
8018 case M_USW_A:
8019 s = "swl";
8020 s2 = "swr";
8021 off = 3;
8022 uswa:
8023 used_at = 1;
8024 load_address (AT, &offset_expr, &used_at);
8025 if (breg != 0)
8026 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8027 if (! target_big_endian)
8028 expr1.X_add_number = off;
8029 else
8030 expr1.X_add_number = 0;
8031 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8032 if (! target_big_endian)
8033 expr1.X_add_number = 0;
8034 else
8035 expr1.X_add_number = off;
8036 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8037 break;
8038
8039 case M_USH_A:
8040 used_at = 1;
8041 load_address (AT, &offset_expr, &used_at);
8042 if (breg != 0)
8043 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8044 if (! target_big_endian)
8045 expr1.X_add_number = 0;
8046 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8047 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8048 if (! target_big_endian)
8049 expr1.X_add_number = 1;
8050 else
8051 expr1.X_add_number = 0;
8052 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8053 if (! target_big_endian)
8054 expr1.X_add_number = 0;
8055 else
8056 expr1.X_add_number = 1;
8057 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8058 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8059 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8060 break;
8061
8062 default:
8063 /* FIXME: Check if this is one of the itbl macros, since they
8064 are added dynamically. */
8065 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8066 break;
8067 }
8068 if (!mips_opts.at && used_at)
8069 as_bad (_("Macro used $at after \".set noat\""));
8070 }
8071
8072 /* Implement macros in mips16 mode. */
8073
8074 static void
8075 mips16_macro (struct mips_cl_insn *ip)
8076 {
8077 int mask;
8078 int xreg, yreg, zreg, tmp;
8079 expressionS expr1;
8080 int dbl;
8081 const char *s, *s2, *s3;
8082
8083 mask = ip->insn_mo->mask;
8084
8085 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8086 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8087 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8088
8089 expr1.X_op = O_constant;
8090 expr1.X_op_symbol = NULL;
8091 expr1.X_add_symbol = NULL;
8092 expr1.X_add_number = 1;
8093
8094 dbl = 0;
8095
8096 switch (mask)
8097 {
8098 default:
8099 internalError ();
8100
8101 case M_DDIV_3:
8102 dbl = 1;
8103 case M_DIV_3:
8104 s = "mflo";
8105 goto do_div3;
8106 case M_DREM_3:
8107 dbl = 1;
8108 case M_REM_3:
8109 s = "mfhi";
8110 do_div3:
8111 start_noreorder ();
8112 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8113 expr1.X_add_number = 2;
8114 macro_build (&expr1, "bnez", "x,p", yreg);
8115 macro_build (NULL, "break", "6", 7);
8116
8117 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8118 since that causes an overflow. We should do that as well,
8119 but I don't see how to do the comparisons without a temporary
8120 register. */
8121 end_noreorder ();
8122 macro_build (NULL, s, "x", zreg);
8123 break;
8124
8125 case M_DIVU_3:
8126 s = "divu";
8127 s2 = "mflo";
8128 goto do_divu3;
8129 case M_REMU_3:
8130 s = "divu";
8131 s2 = "mfhi";
8132 goto do_divu3;
8133 case M_DDIVU_3:
8134 s = "ddivu";
8135 s2 = "mflo";
8136 goto do_divu3;
8137 case M_DREMU_3:
8138 s = "ddivu";
8139 s2 = "mfhi";
8140 do_divu3:
8141 start_noreorder ();
8142 macro_build (NULL, s, "0,x,y", xreg, yreg);
8143 expr1.X_add_number = 2;
8144 macro_build (&expr1, "bnez", "x,p", yreg);
8145 macro_build (NULL, "break", "6", 7);
8146 end_noreorder ();
8147 macro_build (NULL, s2, "x", zreg);
8148 break;
8149
8150 case M_DMUL:
8151 dbl = 1;
8152 case M_MUL:
8153 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8154 macro_build (NULL, "mflo", "x", zreg);
8155 break;
8156
8157 case M_DSUBU_I:
8158 dbl = 1;
8159 goto do_subu;
8160 case M_SUBU_I:
8161 do_subu:
8162 if (imm_expr.X_op != O_constant)
8163 as_bad (_("Unsupported large constant"));
8164 imm_expr.X_add_number = -imm_expr.X_add_number;
8165 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8166 break;
8167
8168 case M_SUBU_I_2:
8169 if (imm_expr.X_op != O_constant)
8170 as_bad (_("Unsupported large constant"));
8171 imm_expr.X_add_number = -imm_expr.X_add_number;
8172 macro_build (&imm_expr, "addiu", "x,k", xreg);
8173 break;
8174
8175 case M_DSUBU_I_2:
8176 if (imm_expr.X_op != O_constant)
8177 as_bad (_("Unsupported large constant"));
8178 imm_expr.X_add_number = -imm_expr.X_add_number;
8179 macro_build (&imm_expr, "daddiu", "y,j", yreg);
8180 break;
8181
8182 case M_BEQ:
8183 s = "cmp";
8184 s2 = "bteqz";
8185 goto do_branch;
8186 case M_BNE:
8187 s = "cmp";
8188 s2 = "btnez";
8189 goto do_branch;
8190 case M_BLT:
8191 s = "slt";
8192 s2 = "btnez";
8193 goto do_branch;
8194 case M_BLTU:
8195 s = "sltu";
8196 s2 = "btnez";
8197 goto do_branch;
8198 case M_BLE:
8199 s = "slt";
8200 s2 = "bteqz";
8201 goto do_reverse_branch;
8202 case M_BLEU:
8203 s = "sltu";
8204 s2 = "bteqz";
8205 goto do_reverse_branch;
8206 case M_BGE:
8207 s = "slt";
8208 s2 = "bteqz";
8209 goto do_branch;
8210 case M_BGEU:
8211 s = "sltu";
8212 s2 = "bteqz";
8213 goto do_branch;
8214 case M_BGT:
8215 s = "slt";
8216 s2 = "btnez";
8217 goto do_reverse_branch;
8218 case M_BGTU:
8219 s = "sltu";
8220 s2 = "btnez";
8221
8222 do_reverse_branch:
8223 tmp = xreg;
8224 xreg = yreg;
8225 yreg = tmp;
8226
8227 do_branch:
8228 macro_build (NULL, s, "x,y", xreg, yreg);
8229 macro_build (&offset_expr, s2, "p");
8230 break;
8231
8232 case M_BEQ_I:
8233 s = "cmpi";
8234 s2 = "bteqz";
8235 s3 = "x,U";
8236 goto do_branch_i;
8237 case M_BNE_I:
8238 s = "cmpi";
8239 s2 = "btnez";
8240 s3 = "x,U";
8241 goto do_branch_i;
8242 case M_BLT_I:
8243 s = "slti";
8244 s2 = "btnez";
8245 s3 = "x,8";
8246 goto do_branch_i;
8247 case M_BLTU_I:
8248 s = "sltiu";
8249 s2 = "btnez";
8250 s3 = "x,8";
8251 goto do_branch_i;
8252 case M_BLE_I:
8253 s = "slti";
8254 s2 = "btnez";
8255 s3 = "x,8";
8256 goto do_addone_branch_i;
8257 case M_BLEU_I:
8258 s = "sltiu";
8259 s2 = "btnez";
8260 s3 = "x,8";
8261 goto do_addone_branch_i;
8262 case M_BGE_I:
8263 s = "slti";
8264 s2 = "bteqz";
8265 s3 = "x,8";
8266 goto do_branch_i;
8267 case M_BGEU_I:
8268 s = "sltiu";
8269 s2 = "bteqz";
8270 s3 = "x,8";
8271 goto do_branch_i;
8272 case M_BGT_I:
8273 s = "slti";
8274 s2 = "bteqz";
8275 s3 = "x,8";
8276 goto do_addone_branch_i;
8277 case M_BGTU_I:
8278 s = "sltiu";
8279 s2 = "bteqz";
8280 s3 = "x,8";
8281
8282 do_addone_branch_i:
8283 if (imm_expr.X_op != O_constant)
8284 as_bad (_("Unsupported large constant"));
8285 ++imm_expr.X_add_number;
8286
8287 do_branch_i:
8288 macro_build (&imm_expr, s, s3, xreg);
8289 macro_build (&offset_expr, s2, "p");
8290 break;
8291
8292 case M_ABS:
8293 expr1.X_add_number = 0;
8294 macro_build (&expr1, "slti", "x,8", yreg);
8295 if (xreg != yreg)
8296 move_register (xreg, yreg);
8297 expr1.X_add_number = 2;
8298 macro_build (&expr1, "bteqz", "p");
8299 macro_build (NULL, "neg", "x,w", xreg, xreg);
8300 }
8301 }
8302
8303 /* For consistency checking, verify that all bits are specified either
8304 by the match/mask part of the instruction definition, or by the
8305 operand list. */
8306 static int
8307 validate_mips_insn (const struct mips_opcode *opc)
8308 {
8309 const char *p = opc->args;
8310 char c;
8311 unsigned long used_bits = opc->mask;
8312
8313 if ((used_bits & opc->match) != opc->match)
8314 {
8315 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8316 opc->name, opc->args);
8317 return 0;
8318 }
8319 #define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8320 while (*p)
8321 switch (c = *p++)
8322 {
8323 case ',': break;
8324 case '(': break;
8325 case ')': break;
8326 case '+':
8327 switch (c = *p++)
8328 {
8329 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8330 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8331 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8332 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
8333 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8334 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8335 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8336 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8337 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8338 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8339 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8340 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8341 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8342 case 'I': break;
8343 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8344 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8345 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8346 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8347 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8348 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8349 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8350 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
8351 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8352 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8353
8354 default:
8355 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8356 c, opc->name, opc->args);
8357 return 0;
8358 }
8359 break;
8360 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8361 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8362 case 'A': break;
8363 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
8364 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8365 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8366 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8367 case 'F': break;
8368 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8369 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
8370 case 'I': break;
8371 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
8372 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8373 case 'L': break;
8374 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8375 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
8376 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8377 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8378 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8379 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8380 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8381 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8382 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8383 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8384 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8385 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8386 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8387 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8388 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8389 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8390 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8391 case 'f': break;
8392 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8393 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8394 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8395 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8396 case 'l': break;
8397 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8398 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8399 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8400 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8401 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8402 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8403 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8404 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8405 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8406 case 'x': break;
8407 case 'z': break;
8408 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
8409 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8410 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8411 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8412 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8413 case '[': break;
8414 case ']': break;
8415 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
8416 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8417 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8418 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8419 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8420 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8421 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8422 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8423 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8424 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8425 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8426 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
8427 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8428 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8429 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8430 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8431 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8432 default:
8433 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8434 c, opc->name, opc->args);
8435 return 0;
8436 }
8437 #undef USE_BITS
8438 if (used_bits != 0xffffffff)
8439 {
8440 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8441 ~used_bits & 0xffffffff, opc->name, opc->args);
8442 return 0;
8443 }
8444 return 1;
8445 }
8446
8447 /* UDI immediates. */
8448 struct mips_immed {
8449 char type;
8450 unsigned int shift;
8451 unsigned long mask;
8452 const char * desc;
8453 };
8454
8455 static const struct mips_immed mips_immed[] = {
8456 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8457 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8458 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8459 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8460 { 0,0,0,0 }
8461 };
8462
8463 /* Check whether an odd floating-point register is allowed. */
8464 static int
8465 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8466 {
8467 const char *s = insn->name;
8468
8469 if (insn->pinfo == INSN_MACRO)
8470 /* Let a macro pass, we'll catch it later when it is expanded. */
8471 return 1;
8472
8473 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8474 {
8475 /* Allow odd registers for single-precision ops. */
8476 switch (insn->pinfo & (FP_S | FP_D))
8477 {
8478 case FP_S:
8479 case 0:
8480 return 1; /* both single precision - ok */
8481 case FP_D:
8482 return 0; /* both double precision - fail */
8483 default:
8484 break;
8485 }
8486
8487 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8488 s = strchr (insn->name, '.');
8489 if (argnum == 2)
8490 s = s != NULL ? strchr (s + 1, '.') : NULL;
8491 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8492 }
8493
8494 /* Single-precision coprocessor loads and moves are OK too. */
8495 if ((insn->pinfo & FP_S)
8496 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8497 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8498 return 1;
8499
8500 return 0;
8501 }
8502
8503 /* This routine assembles an instruction into its binary format. As a
8504 side effect, it sets one of the global variables imm_reloc or
8505 offset_reloc to the type of relocation to do if one of the operands
8506 is an address expression. */
8507
8508 static void
8509 mips_ip (char *str, struct mips_cl_insn *ip)
8510 {
8511 char *s;
8512 const char *args;
8513 char c = 0;
8514 struct mips_opcode *insn;
8515 char *argsStart;
8516 unsigned int regno;
8517 unsigned int lastregno = 0;
8518 unsigned int lastpos = 0;
8519 unsigned int limlo, limhi;
8520 char *s_reset;
8521 char save_c = 0;
8522 offsetT min_range, max_range;
8523 int argnum;
8524 unsigned int rtype;
8525
8526 insn_error = NULL;
8527
8528 /* If the instruction contains a '.', we first try to match an instruction
8529 including the '.'. Then we try again without the '.'. */
8530 insn = NULL;
8531 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8532 continue;
8533
8534 /* If we stopped on whitespace, then replace the whitespace with null for
8535 the call to hash_find. Save the character we replaced just in case we
8536 have to re-parse the instruction. */
8537 if (ISSPACE (*s))
8538 {
8539 save_c = *s;
8540 *s++ = '\0';
8541 }
8542
8543 insn = (struct mips_opcode *) hash_find (op_hash, str);
8544
8545 /* If we didn't find the instruction in the opcode table, try again, but
8546 this time with just the instruction up to, but not including the
8547 first '.'. */
8548 if (insn == NULL)
8549 {
8550 /* Restore the character we overwrite above (if any). */
8551 if (save_c)
8552 *(--s) = save_c;
8553
8554 /* Scan up to the first '.' or whitespace. */
8555 for (s = str;
8556 *s != '\0' && *s != '.' && !ISSPACE (*s);
8557 ++s)
8558 continue;
8559
8560 /* If we did not find a '.', then we can quit now. */
8561 if (*s != '.')
8562 {
8563 insn_error = "unrecognized opcode";
8564 return;
8565 }
8566
8567 /* Lookup the instruction in the hash table. */
8568 *s++ = '\0';
8569 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8570 {
8571 insn_error = "unrecognized opcode";
8572 return;
8573 }
8574 }
8575
8576 argsStart = s;
8577 for (;;)
8578 {
8579 bfd_boolean ok;
8580
8581 assert (strcmp (insn->name, str) == 0);
8582
8583 ok = is_opcode_valid (insn, FALSE);
8584 if (! ok)
8585 {
8586 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8587 && strcmp (insn->name, insn[1].name) == 0)
8588 {
8589 ++insn;
8590 continue;
8591 }
8592 else
8593 {
8594 if (!insn_error)
8595 {
8596 static char buf[100];
8597 sprintf (buf,
8598 _("opcode not supported on this processor: %s (%s)"),
8599 mips_cpu_info_from_arch (mips_opts.arch)->name,
8600 mips_cpu_info_from_isa (mips_opts.isa)->name);
8601 insn_error = buf;
8602 }
8603 if (save_c)
8604 *(--s) = save_c;
8605 return;
8606 }
8607 }
8608
8609 create_insn (ip, insn);
8610 insn_error = NULL;
8611 argnum = 1;
8612 for (args = insn->args;; ++args)
8613 {
8614 int is_mdmx;
8615
8616 s += strspn (s, " \t");
8617 is_mdmx = 0;
8618 switch (*args)
8619 {
8620 case '\0': /* end of args */
8621 if (*s == '\0')
8622 return;
8623 break;
8624
8625 case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8626 my_getExpression (&imm_expr, s);
8627 check_absolute_expr (ip, &imm_expr);
8628 if ((unsigned long) imm_expr.X_add_number != 1
8629 && (unsigned long) imm_expr.X_add_number != 3)
8630 {
8631 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8632 (unsigned long) imm_expr.X_add_number);
8633 }
8634 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8635 imm_expr.X_op = O_absent;
8636 s = expr_end;
8637 continue;
8638
8639 case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8640 my_getExpression (&imm_expr, s);
8641 check_absolute_expr (ip, &imm_expr);
8642 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8643 {
8644 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8645 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8646 }
8647 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8648 imm_expr.X_op = O_absent;
8649 s = expr_end;
8650 continue;
8651
8652 case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8653 my_getExpression (&imm_expr, s);
8654 check_absolute_expr (ip, &imm_expr);
8655 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8656 {
8657 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8658 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8659 }
8660 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8661 imm_expr.X_op = O_absent;
8662 s = expr_end;
8663 continue;
8664
8665 case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8666 my_getExpression (&imm_expr, s);
8667 check_absolute_expr (ip, &imm_expr);
8668 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8669 {
8670 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8671 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8672 }
8673 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8674 imm_expr.X_op = O_absent;
8675 s = expr_end;
8676 continue;
8677
8678 case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8679 my_getExpression (&imm_expr, s);
8680 check_absolute_expr (ip, &imm_expr);
8681 if (imm_expr.X_add_number & ~OP_MASK_RS)
8682 {
8683 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8684 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8685 }
8686 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8687 imm_expr.X_op = O_absent;
8688 s = expr_end;
8689 continue;
8690
8691 case '7': /* four dsp accumulators in bits 11,12 */
8692 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8693 s[3] >= '0' && s[3] <= '3')
8694 {
8695 regno = s[3] - '0';
8696 s += 4;
8697 INSERT_OPERAND (DSPACC, *ip, regno);
8698 continue;
8699 }
8700 else
8701 as_bad (_("Invalid dsp acc register"));
8702 break;
8703
8704 case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8705 my_getExpression (&imm_expr, s);
8706 check_absolute_expr (ip, &imm_expr);
8707 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8708 {
8709 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8710 OP_MASK_WRDSP,
8711 (unsigned long) imm_expr.X_add_number);
8712 }
8713 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8714 imm_expr.X_op = O_absent;
8715 s = expr_end;
8716 continue;
8717
8718 case '9': /* four dsp accumulators in bits 21,22 */
8719 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8720 s[3] >= '0' && s[3] <= '3')
8721 {
8722 regno = s[3] - '0';
8723 s += 4;
8724 INSERT_OPERAND (DSPACC_S, *ip, regno);
8725 continue;
8726 }
8727 else
8728 as_bad (_("Invalid dsp acc register"));
8729 break;
8730
8731 case '0': /* dsp 6-bit signed immediate in bit 20 */
8732 my_getExpression (&imm_expr, s);
8733 check_absolute_expr (ip, &imm_expr);
8734 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8735 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8736 if (imm_expr.X_add_number < min_range ||
8737 imm_expr.X_add_number > max_range)
8738 {
8739 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8740 (long) min_range, (long) max_range,
8741 (long) imm_expr.X_add_number);
8742 }
8743 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8744 imm_expr.X_op = O_absent;
8745 s = expr_end;
8746 continue;
8747
8748 case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8749 my_getExpression (&imm_expr, s);
8750 check_absolute_expr (ip, &imm_expr);
8751 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8752 {
8753 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8754 OP_MASK_RDDSP,
8755 (unsigned long) imm_expr.X_add_number);
8756 }
8757 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8758 imm_expr.X_op = O_absent;
8759 s = expr_end;
8760 continue;
8761
8762 case ':': /* dsp 7-bit signed immediate in bit 19 */
8763 my_getExpression (&imm_expr, s);
8764 check_absolute_expr (ip, &imm_expr);
8765 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8766 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8767 if (imm_expr.X_add_number < min_range ||
8768 imm_expr.X_add_number > max_range)
8769 {
8770 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8771 (long) min_range, (long) max_range,
8772 (long) imm_expr.X_add_number);
8773 }
8774 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8775 imm_expr.X_op = O_absent;
8776 s = expr_end;
8777 continue;
8778
8779 case '@': /* dsp 10-bit signed immediate in bit 16 */
8780 my_getExpression (&imm_expr, s);
8781 check_absolute_expr (ip, &imm_expr);
8782 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8783 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8784 if (imm_expr.X_add_number < min_range ||
8785 imm_expr.X_add_number > max_range)
8786 {
8787 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8788 (long) min_range, (long) max_range,
8789 (long) imm_expr.X_add_number);
8790 }
8791 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8792 imm_expr.X_op = O_absent;
8793 s = expr_end;
8794 continue;
8795
8796 case '!': /* MT usermode flag bit. */
8797 my_getExpression (&imm_expr, s);
8798 check_absolute_expr (ip, &imm_expr);
8799 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8800 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8801 (unsigned long) imm_expr.X_add_number);
8802 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8803 imm_expr.X_op = O_absent;
8804 s = expr_end;
8805 continue;
8806
8807 case '$': /* MT load high flag bit. */
8808 my_getExpression (&imm_expr, s);
8809 check_absolute_expr (ip, &imm_expr);
8810 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8811 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8812 (unsigned long) imm_expr.X_add_number);
8813 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8814 imm_expr.X_op = O_absent;
8815 s = expr_end;
8816 continue;
8817
8818 case '*': /* four dsp accumulators in bits 18,19 */
8819 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8820 s[3] >= '0' && s[3] <= '3')
8821 {
8822 regno = s[3] - '0';
8823 s += 4;
8824 INSERT_OPERAND (MTACC_T, *ip, regno);
8825 continue;
8826 }
8827 else
8828 as_bad (_("Invalid dsp/smartmips acc register"));
8829 break;
8830
8831 case '&': /* four dsp accumulators in bits 13,14 */
8832 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8833 s[3] >= '0' && s[3] <= '3')
8834 {
8835 regno = s[3] - '0';
8836 s += 4;
8837 INSERT_OPERAND (MTACC_D, *ip, regno);
8838 continue;
8839 }
8840 else
8841 as_bad (_("Invalid dsp/smartmips acc register"));
8842 break;
8843
8844 case ',':
8845 ++argnum;
8846 if (*s++ == *args)
8847 continue;
8848 s--;
8849 switch (*++args)
8850 {
8851 case 'r':
8852 case 'v':
8853 INSERT_OPERAND (RS, *ip, lastregno);
8854 continue;
8855
8856 case 'w':
8857 INSERT_OPERAND (RT, *ip, lastregno);
8858 continue;
8859
8860 case 'W':
8861 INSERT_OPERAND (FT, *ip, lastregno);
8862 continue;
8863
8864 case 'V':
8865 INSERT_OPERAND (FS, *ip, lastregno);
8866 continue;
8867 }
8868 break;
8869
8870 case '(':
8871 /* Handle optional base register.
8872 Either the base register is omitted or
8873 we must have a left paren. */
8874 /* This is dependent on the next operand specifier
8875 is a base register specification. */
8876 assert (args[1] == 'b' || args[1] == '5'
8877 || args[1] == '-' || args[1] == '4');
8878 if (*s == '\0')
8879 return;
8880
8881 case ')': /* these must match exactly */
8882 case '[':
8883 case ']':
8884 if (*s++ == *args)
8885 continue;
8886 break;
8887
8888 case '+': /* Opcode extension character. */
8889 switch (*++args)
8890 {
8891 case '1': /* UDI immediates. */
8892 case '2':
8893 case '3':
8894 case '4':
8895 {
8896 const struct mips_immed *imm = mips_immed;
8897
8898 while (imm->type && imm->type != *args)
8899 ++imm;
8900 if (! imm->type)
8901 internalError ();
8902 my_getExpression (&imm_expr, s);
8903 check_absolute_expr (ip, &imm_expr);
8904 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8905 {
8906 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8907 imm->desc ? imm->desc : ip->insn_mo->name,
8908 (unsigned long) imm_expr.X_add_number,
8909 (unsigned long) imm_expr.X_add_number);
8910 imm_expr.X_add_number &= imm->mask;
8911 }
8912 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8913 << imm->shift);
8914 imm_expr.X_op = O_absent;
8915 s = expr_end;
8916 }
8917 continue;
8918
8919 case 'A': /* ins/ext position, becomes LSB. */
8920 limlo = 0;
8921 limhi = 31;
8922 goto do_lsb;
8923 case 'E':
8924 limlo = 32;
8925 limhi = 63;
8926 goto do_lsb;
8927 do_lsb:
8928 my_getExpression (&imm_expr, s);
8929 check_absolute_expr (ip, &imm_expr);
8930 if ((unsigned long) imm_expr.X_add_number < limlo
8931 || (unsigned long) imm_expr.X_add_number > limhi)
8932 {
8933 as_bad (_("Improper position (%lu)"),
8934 (unsigned long) imm_expr.X_add_number);
8935 imm_expr.X_add_number = limlo;
8936 }
8937 lastpos = imm_expr.X_add_number;
8938 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8939 imm_expr.X_op = O_absent;
8940 s = expr_end;
8941 continue;
8942
8943 case 'B': /* ins size, becomes MSB. */
8944 limlo = 1;
8945 limhi = 32;
8946 goto do_msb;
8947 case 'F':
8948 limlo = 33;
8949 limhi = 64;
8950 goto do_msb;
8951 do_msb:
8952 my_getExpression (&imm_expr, s);
8953 check_absolute_expr (ip, &imm_expr);
8954 /* Check for negative input so that small negative numbers
8955 will not succeed incorrectly. The checks against
8956 (pos+size) transitively check "size" itself,
8957 assuming that "pos" is reasonable. */
8958 if ((long) imm_expr.X_add_number < 0
8959 || ((unsigned long) imm_expr.X_add_number
8960 + lastpos) < limlo
8961 || ((unsigned long) imm_expr.X_add_number
8962 + lastpos) > limhi)
8963 {
8964 as_bad (_("Improper insert size (%lu, position %lu)"),
8965 (unsigned long) imm_expr.X_add_number,
8966 (unsigned long) lastpos);
8967 imm_expr.X_add_number = limlo - lastpos;
8968 }
8969 INSERT_OPERAND (INSMSB, *ip,
8970 lastpos + imm_expr.X_add_number - 1);
8971 imm_expr.X_op = O_absent;
8972 s = expr_end;
8973 continue;
8974
8975 case 'C': /* ext size, becomes MSBD. */
8976 limlo = 1;
8977 limhi = 32;
8978 goto do_msbd;
8979 case 'G':
8980 limlo = 33;
8981 limhi = 64;
8982 goto do_msbd;
8983 case 'H':
8984 limlo = 33;
8985 limhi = 64;
8986 goto do_msbd;
8987 do_msbd:
8988 my_getExpression (&imm_expr, s);
8989 check_absolute_expr (ip, &imm_expr);
8990 /* Check for negative input so that small negative numbers
8991 will not succeed incorrectly. The checks against
8992 (pos+size) transitively check "size" itself,
8993 assuming that "pos" is reasonable. */
8994 if ((long) imm_expr.X_add_number < 0
8995 || ((unsigned long) imm_expr.X_add_number
8996 + lastpos) < limlo
8997 || ((unsigned long) imm_expr.X_add_number
8998 + lastpos) > limhi)
8999 {
9000 as_bad (_("Improper extract size (%lu, position %lu)"),
9001 (unsigned long) imm_expr.X_add_number,
9002 (unsigned long) lastpos);
9003 imm_expr.X_add_number = limlo - lastpos;
9004 }
9005 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9006 imm_expr.X_op = O_absent;
9007 s = expr_end;
9008 continue;
9009
9010 case 'D':
9011 /* +D is for disassembly only; never match. */
9012 break;
9013
9014 case 'I':
9015 /* "+I" is like "I", except that imm2_expr is used. */
9016 my_getExpression (&imm2_expr, s);
9017 if (imm2_expr.X_op != O_big
9018 && imm2_expr.X_op != O_constant)
9019 insn_error = _("absolute expression required");
9020 if (HAVE_32BIT_GPRS)
9021 normalize_constant_expr (&imm2_expr);
9022 s = expr_end;
9023 continue;
9024
9025 case 'T': /* Coprocessor register. */
9026 /* +T is for disassembly only; never match. */
9027 break;
9028
9029 case 't': /* Coprocessor register number. */
9030 if (s[0] == '$' && ISDIGIT (s[1]))
9031 {
9032 ++s;
9033 regno = 0;
9034 do
9035 {
9036 regno *= 10;
9037 regno += *s - '0';
9038 ++s;
9039 }
9040 while (ISDIGIT (*s));
9041 if (regno > 31)
9042 as_bad (_("Invalid register number (%d)"), regno);
9043 else
9044 {
9045 INSERT_OPERAND (RT, *ip, regno);
9046 continue;
9047 }
9048 }
9049 else
9050 as_bad (_("Invalid coprocessor 0 register number"));
9051 break;
9052
9053 case 'x':
9054 /* bbit[01] and bbit[01]32 bit index. Give error if index
9055 is not in the valid range. */
9056 my_getExpression (&imm_expr, s);
9057 check_absolute_expr (ip, &imm_expr);
9058 if ((unsigned) imm_expr.X_add_number > 31)
9059 {
9060 as_bad (_("Improper bit index (%lu)"),
9061 (unsigned long) imm_expr.X_add_number);
9062 imm_expr.X_add_number = 0;
9063 }
9064 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9065 imm_expr.X_op = O_absent;
9066 s = expr_end;
9067 continue;
9068
9069 case 'X':
9070 /* bbit[01] bit index when bbit is used but we generate
9071 bbit[01]32 because the index is over 32. Move to the
9072 next candidate if index is not in the valid range. */
9073 my_getExpression (&imm_expr, s);
9074 check_absolute_expr (ip, &imm_expr);
9075 if ((unsigned) imm_expr.X_add_number < 32
9076 || (unsigned) imm_expr.X_add_number > 63)
9077 break;
9078 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9079 imm_expr.X_op = O_absent;
9080 s = expr_end;
9081 continue;
9082
9083 case 'p':
9084 /* cins, cins32, exts and exts32 position field. Give error
9085 if it's not in the valid range. */
9086 my_getExpression (&imm_expr, s);
9087 check_absolute_expr (ip, &imm_expr);
9088 if ((unsigned) imm_expr.X_add_number > 31)
9089 {
9090 as_bad (_("Improper position (%lu)"),
9091 (unsigned long) imm_expr.X_add_number);
9092 imm_expr.X_add_number = 0;
9093 }
9094 /* Make the pos explicit to simplify +S. */
9095 lastpos = imm_expr.X_add_number + 32;
9096 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9097 imm_expr.X_op = O_absent;
9098 s = expr_end;
9099 continue;
9100
9101 case 'P':
9102 /* cins, cins32, exts and exts32 position field. Move to
9103 the next candidate if it's not in the valid range. */
9104 my_getExpression (&imm_expr, s);
9105 check_absolute_expr (ip, &imm_expr);
9106 if ((unsigned) imm_expr.X_add_number < 32
9107 || (unsigned) imm_expr.X_add_number > 63)
9108 break;
9109 lastpos = imm_expr.X_add_number;
9110 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9111 imm_expr.X_op = O_absent;
9112 s = expr_end;
9113 continue;
9114
9115 case 's':
9116 /* cins and exts length-minus-one field. */
9117 my_getExpression (&imm_expr, s);
9118 check_absolute_expr (ip, &imm_expr);
9119 if ((unsigned long) imm_expr.X_add_number > 31)
9120 {
9121 as_bad (_("Improper size (%lu)"),
9122 (unsigned long) imm_expr.X_add_number);
9123 imm_expr.X_add_number = 0;
9124 }
9125 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9126 imm_expr.X_op = O_absent;
9127 s = expr_end;
9128 continue;
9129
9130 case 'S':
9131 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9132 length-minus-one field. */
9133 my_getExpression (&imm_expr, s);
9134 check_absolute_expr (ip, &imm_expr);
9135 if ((long) imm_expr.X_add_number < 0
9136 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9137 {
9138 as_bad (_("Improper size (%lu)"),
9139 (unsigned long) imm_expr.X_add_number);
9140 imm_expr.X_add_number = 0;
9141 }
9142 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9143 imm_expr.X_op = O_absent;
9144 s = expr_end;
9145 continue;
9146
9147 case 'Q':
9148 /* seqi/snei immediate field. */
9149 my_getExpression (&imm_expr, s);
9150 check_absolute_expr (ip, &imm_expr);
9151 if ((long) imm_expr.X_add_number < -512
9152 || (long) imm_expr.X_add_number >= 512)
9153 {
9154 as_bad (_("Improper immediate (%ld)"),
9155 (long) imm_expr.X_add_number);
9156 imm_expr.X_add_number = 0;
9157 }
9158 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9159 imm_expr.X_op = O_absent;
9160 s = expr_end;
9161 continue;
9162
9163 default:
9164 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9165 *args, insn->name, insn->args);
9166 /* Further processing is fruitless. */
9167 return;
9168 }
9169 break;
9170
9171 case '<': /* must be at least one digit */
9172 /*
9173 * According to the manual, if the shift amount is greater
9174 * than 31 or less than 0, then the shift amount should be
9175 * mod 32. In reality the mips assembler issues an error.
9176 * We issue a warning and mask out all but the low 5 bits.
9177 */
9178 my_getExpression (&imm_expr, s);
9179 check_absolute_expr (ip, &imm_expr);
9180 if ((unsigned long) imm_expr.X_add_number > 31)
9181 as_warn (_("Improper shift amount (%lu)"),
9182 (unsigned long) imm_expr.X_add_number);
9183 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9184 imm_expr.X_op = O_absent;
9185 s = expr_end;
9186 continue;
9187
9188 case '>': /* shift amount minus 32 */
9189 my_getExpression (&imm_expr, s);
9190 check_absolute_expr (ip, &imm_expr);
9191 if ((unsigned long) imm_expr.X_add_number < 32
9192 || (unsigned long) imm_expr.X_add_number > 63)
9193 break;
9194 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9195 imm_expr.X_op = O_absent;
9196 s = expr_end;
9197 continue;
9198
9199 case 'k': /* cache code */
9200 case 'h': /* prefx code */
9201 my_getExpression (&imm_expr, s);
9202 check_absolute_expr (ip, &imm_expr);
9203 if ((unsigned long) imm_expr.X_add_number > 31)
9204 as_warn (_("Invalid value for `%s' (%lu)"),
9205 ip->insn_mo->name,
9206 (unsigned long) imm_expr.X_add_number);
9207 if (*args == 'k')
9208 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9209 else
9210 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9211 imm_expr.X_op = O_absent;
9212 s = expr_end;
9213 continue;
9214
9215 case 'c': /* break code */
9216 my_getExpression (&imm_expr, s);
9217 check_absolute_expr (ip, &imm_expr);
9218 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9219 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9220 ip->insn_mo->name,
9221 (unsigned long) imm_expr.X_add_number);
9222 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9223 imm_expr.X_op = O_absent;
9224 s = expr_end;
9225 continue;
9226
9227 case 'q': /* lower break code */
9228 my_getExpression (&imm_expr, s);
9229 check_absolute_expr (ip, &imm_expr);
9230 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9231 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9232 ip->insn_mo->name,
9233 (unsigned long) imm_expr.X_add_number);
9234 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9235 imm_expr.X_op = O_absent;
9236 s = expr_end;
9237 continue;
9238
9239 case 'B': /* 20-bit syscall/break code. */
9240 my_getExpression (&imm_expr, s);
9241 check_absolute_expr (ip, &imm_expr);
9242 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9243 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9244 ip->insn_mo->name,
9245 (unsigned long) imm_expr.X_add_number);
9246 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9247 imm_expr.X_op = O_absent;
9248 s = expr_end;
9249 continue;
9250
9251 case 'C': /* Coprocessor code */
9252 my_getExpression (&imm_expr, s);
9253 check_absolute_expr (ip, &imm_expr);
9254 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9255 {
9256 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9257 (unsigned long) imm_expr.X_add_number);
9258 imm_expr.X_add_number &= OP_MASK_COPZ;
9259 }
9260 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9261 imm_expr.X_op = O_absent;
9262 s = expr_end;
9263 continue;
9264
9265 case 'J': /* 19-bit wait code. */
9266 my_getExpression (&imm_expr, s);
9267 check_absolute_expr (ip, &imm_expr);
9268 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9269 {
9270 as_warn (_("Illegal 19-bit code (%lu)"),
9271 (unsigned long) imm_expr.X_add_number);
9272 imm_expr.X_add_number &= OP_MASK_CODE19;
9273 }
9274 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9275 imm_expr.X_op = O_absent;
9276 s = expr_end;
9277 continue;
9278
9279 case 'P': /* Performance register. */
9280 my_getExpression (&imm_expr, s);
9281 check_absolute_expr (ip, &imm_expr);
9282 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9283 as_warn (_("Invalid performance register (%lu)"),
9284 (unsigned long) imm_expr.X_add_number);
9285 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9286 imm_expr.X_op = O_absent;
9287 s = expr_end;
9288 continue;
9289
9290 case 'G': /* Coprocessor destination register. */
9291 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9292 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9293 else
9294 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9295 INSERT_OPERAND (RD, *ip, regno);
9296 if (ok)
9297 {
9298 lastregno = regno;
9299 continue;
9300 }
9301 else
9302 break;
9303
9304 case 'b': /* base register */
9305 case 'd': /* destination register */
9306 case 's': /* source register */
9307 case 't': /* target register */
9308 case 'r': /* both target and source */
9309 case 'v': /* both dest and source */
9310 case 'w': /* both dest and target */
9311 case 'E': /* coprocessor target register */
9312 case 'K': /* 'rdhwr' destination register */
9313 case 'x': /* ignore register name */
9314 case 'z': /* must be zero register */
9315 case 'U': /* destination register (clo/clz). */
9316 case 'g': /* coprocessor destination register */
9317 s_reset = s;
9318 if (*args == 'E' || *args == 'K')
9319 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9320 else
9321 {
9322 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9323 if (regno == AT && mips_opts.at)
9324 {
9325 if (mips_opts.at == ATREG)
9326 as_warn (_("used $at without \".set noat\""));
9327 else
9328 as_warn (_("used $%u with \".set at=$%u\""),
9329 regno, mips_opts.at);
9330 }
9331 }
9332 if (ok)
9333 {
9334 c = *args;
9335 if (*s == ' ')
9336 ++s;
9337 if (args[1] != *s)
9338 {
9339 if (c == 'r' || c == 'v' || c == 'w')
9340 {
9341 regno = lastregno;
9342 s = s_reset;
9343 ++args;
9344 }
9345 }
9346 /* 'z' only matches $0. */
9347 if (c == 'z' && regno != 0)
9348 break;
9349
9350 if (c == 's' && !strcmp (ip->insn_mo->name, "jalr"))
9351 {
9352 if (regno == lastregno)
9353 {
9354 insn_error = _("source and destinationations must be different");
9355 continue;
9356 }
9357 if (regno == 31 && lastregno == 0)
9358 {
9359 insn_error = _("a destination register must be supplied");
9360 continue;
9361 }
9362 }
9363 /* Now that we have assembled one operand, we use the args string
9364 * to figure out where it goes in the instruction. */
9365 switch (c)
9366 {
9367 case 'r':
9368 case 's':
9369 case 'v':
9370 case 'b':
9371 INSERT_OPERAND (RS, *ip, regno);
9372 break;
9373 case 'd':
9374 case 'G':
9375 case 'K':
9376 case 'g':
9377 INSERT_OPERAND (RD, *ip, regno);
9378 break;
9379 case 'U':
9380 INSERT_OPERAND (RD, *ip, regno);
9381 INSERT_OPERAND (RT, *ip, regno);
9382 break;
9383 case 'w':
9384 case 't':
9385 case 'E':
9386 INSERT_OPERAND (RT, *ip, regno);
9387 break;
9388 case 'x':
9389 /* This case exists because on the r3000 trunc
9390 expands into a macro which requires a gp
9391 register. On the r6000 or r4000 it is
9392 assembled into a single instruction which
9393 ignores the register. Thus the insn version
9394 is MIPS_ISA2 and uses 'x', and the macro
9395 version is MIPS_ISA1 and uses 't'. */
9396 break;
9397 case 'z':
9398 /* This case is for the div instruction, which
9399 acts differently if the destination argument
9400 is $0. This only matches $0, and is checked
9401 outside the switch. */
9402 break;
9403 case 'D':
9404 /* Itbl operand; not yet implemented. FIXME ?? */
9405 break;
9406 /* What about all other operands like 'i', which
9407 can be specified in the opcode table? */
9408 }
9409 lastregno = regno;
9410 continue;
9411 }
9412 switch (*args++)
9413 {
9414 case 'r':
9415 case 'v':
9416 INSERT_OPERAND (RS, *ip, lastregno);
9417 continue;
9418 case 'w':
9419 INSERT_OPERAND (RT, *ip, lastregno);
9420 continue;
9421 }
9422 break;
9423
9424 case 'O': /* MDMX alignment immediate constant. */
9425 my_getExpression (&imm_expr, s);
9426 check_absolute_expr (ip, &imm_expr);
9427 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9428 as_warn ("Improper align amount (%ld), using low bits",
9429 (long) imm_expr.X_add_number);
9430 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9431 imm_expr.X_op = O_absent;
9432 s = expr_end;
9433 continue;
9434
9435 case 'Q': /* MDMX vector, element sel, or const. */
9436 if (s[0] != '$')
9437 {
9438 /* MDMX Immediate. */
9439 my_getExpression (&imm_expr, s);
9440 check_absolute_expr (ip, &imm_expr);
9441 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9442 as_warn (_("Invalid MDMX Immediate (%ld)"),
9443 (long) imm_expr.X_add_number);
9444 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9445 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9446 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9447 else
9448 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9449 imm_expr.X_op = O_absent;
9450 s = expr_end;
9451 continue;
9452 }
9453 /* Not MDMX Immediate. Fall through. */
9454 case 'X': /* MDMX destination register. */
9455 case 'Y': /* MDMX source register. */
9456 case 'Z': /* MDMX target register. */
9457 is_mdmx = 1;
9458 case 'D': /* floating point destination register */
9459 case 'S': /* floating point source register */
9460 case 'T': /* floating point target register */
9461 case 'R': /* floating point source register */
9462 case 'V':
9463 case 'W':
9464 rtype = RTYPE_FPU;
9465 if (is_mdmx
9466 || (mips_opts.ase_mdmx
9467 && (ip->insn_mo->pinfo & FP_D)
9468 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9469 | INSN_COPROC_MEMORY_DELAY
9470 | INSN_LOAD_COPROC_DELAY
9471 | INSN_LOAD_MEMORY_DELAY
9472 | INSN_STORE_MEMORY))))
9473 rtype |= RTYPE_VEC;
9474 s_reset = s;
9475 if (reg_lookup (&s, rtype, &regno))
9476 {
9477 if ((regno & 1) != 0
9478 && HAVE_32BIT_FPRS
9479 && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9480 as_warn (_("Float register should be even, was %d"),
9481 regno);
9482
9483 c = *args;
9484 if (*s == ' ')
9485 ++s;
9486 if (args[1] != *s)
9487 {
9488 if (c == 'V' || c == 'W')
9489 {
9490 regno = lastregno;
9491 s = s_reset;
9492 ++args;
9493 }
9494 }
9495 switch (c)
9496 {
9497 case 'D':
9498 case 'X':
9499 INSERT_OPERAND (FD, *ip, regno);
9500 break;
9501 case 'V':
9502 case 'S':
9503 case 'Y':
9504 INSERT_OPERAND (FS, *ip, regno);
9505 break;
9506 case 'Q':
9507 /* This is like 'Z', but also needs to fix the MDMX
9508 vector/scalar select bits. Note that the
9509 scalar immediate case is handled above. */
9510 if (*s == '[')
9511 {
9512 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9513 int max_el = (is_qh ? 3 : 7);
9514 s++;
9515 my_getExpression(&imm_expr, s);
9516 check_absolute_expr (ip, &imm_expr);
9517 s = expr_end;
9518 if (imm_expr.X_add_number > max_el)
9519 as_bad(_("Bad element selector %ld"),
9520 (long) imm_expr.X_add_number);
9521 imm_expr.X_add_number &= max_el;
9522 ip->insn_opcode |= (imm_expr.X_add_number
9523 << (OP_SH_VSEL +
9524 (is_qh ? 2 : 1)));
9525 imm_expr.X_op = O_absent;
9526 if (*s != ']')
9527 as_warn(_("Expecting ']' found '%s'"), s);
9528 else
9529 s++;
9530 }
9531 else
9532 {
9533 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9534 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9535 << OP_SH_VSEL);
9536 else
9537 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9538 OP_SH_VSEL);
9539 }
9540 /* Fall through */
9541 case 'W':
9542 case 'T':
9543 case 'Z':
9544 INSERT_OPERAND (FT, *ip, regno);
9545 break;
9546 case 'R':
9547 INSERT_OPERAND (FR, *ip, regno);
9548 break;
9549 }
9550 lastregno = regno;
9551 continue;
9552 }
9553
9554 switch (*args++)
9555 {
9556 case 'V':
9557 INSERT_OPERAND (FS, *ip, lastregno);
9558 continue;
9559 case 'W':
9560 INSERT_OPERAND (FT, *ip, lastregno);
9561 continue;
9562 }
9563 break;
9564
9565 case 'I':
9566 my_getExpression (&imm_expr, s);
9567 if (imm_expr.X_op != O_big
9568 && imm_expr.X_op != O_constant)
9569 insn_error = _("absolute expression required");
9570 if (HAVE_32BIT_GPRS)
9571 normalize_constant_expr (&imm_expr);
9572 s = expr_end;
9573 continue;
9574
9575 case 'A':
9576 my_getExpression (&offset_expr, s);
9577 normalize_address_expr (&offset_expr);
9578 *imm_reloc = BFD_RELOC_32;
9579 s = expr_end;
9580 continue;
9581
9582 case 'F':
9583 case 'L':
9584 case 'f':
9585 case 'l':
9586 {
9587 int f64;
9588 int using_gprs;
9589 char *save_in;
9590 char *err;
9591 unsigned char temp[8];
9592 int len;
9593 unsigned int length;
9594 segT seg;
9595 subsegT subseg;
9596 char *p;
9597
9598 /* These only appear as the last operand in an
9599 instruction, and every instruction that accepts
9600 them in any variant accepts them in all variants.
9601 This means we don't have to worry about backing out
9602 any changes if the instruction does not match.
9603
9604 The difference between them is the size of the
9605 floating point constant and where it goes. For 'F'
9606 and 'L' the constant is 64 bits; for 'f' and 'l' it
9607 is 32 bits. Where the constant is placed is based
9608 on how the MIPS assembler does things:
9609 F -- .rdata
9610 L -- .lit8
9611 f -- immediate value
9612 l -- .lit4
9613
9614 The .lit4 and .lit8 sections are only used if
9615 permitted by the -G argument.
9616
9617 The code below needs to know whether the target register
9618 is 32 or 64 bits wide. It relies on the fact 'f' and
9619 'F' are used with GPR-based instructions and 'l' and
9620 'L' are used with FPR-based instructions. */
9621
9622 f64 = *args == 'F' || *args == 'L';
9623 using_gprs = *args == 'F' || *args == 'f';
9624
9625 save_in = input_line_pointer;
9626 input_line_pointer = s;
9627 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9628 length = len;
9629 s = input_line_pointer;
9630 input_line_pointer = save_in;
9631 if (err != NULL && *err != '\0')
9632 {
9633 as_bad (_("Bad floating point constant: %s"), err);
9634 memset (temp, '\0', sizeof temp);
9635 length = f64 ? 8 : 4;
9636 }
9637
9638 assert (length == (unsigned) (f64 ? 8 : 4));
9639
9640 if (*args == 'f'
9641 || (*args == 'l'
9642 && (g_switch_value < 4
9643 || (temp[0] == 0 && temp[1] == 0)
9644 || (temp[2] == 0 && temp[3] == 0))))
9645 {
9646 imm_expr.X_op = O_constant;
9647 if (! target_big_endian)
9648 imm_expr.X_add_number = bfd_getl32 (temp);
9649 else
9650 imm_expr.X_add_number = bfd_getb32 (temp);
9651 }
9652 else if (length > 4
9653 && ! mips_disable_float_construction
9654 /* Constants can only be constructed in GPRs and
9655 copied to FPRs if the GPRs are at least as wide
9656 as the FPRs. Force the constant into memory if
9657 we are using 64-bit FPRs but the GPRs are only
9658 32 bits wide. */
9659 && (using_gprs
9660 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9661 && ((temp[0] == 0 && temp[1] == 0)
9662 || (temp[2] == 0 && temp[3] == 0))
9663 && ((temp[4] == 0 && temp[5] == 0)
9664 || (temp[6] == 0 && temp[7] == 0)))
9665 {
9666 /* The value is simple enough to load with a couple of
9667 instructions. If using 32-bit registers, set
9668 imm_expr to the high order 32 bits and offset_expr to
9669 the low order 32 bits. Otherwise, set imm_expr to
9670 the entire 64 bit constant. */
9671 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9672 {
9673 imm_expr.X_op = O_constant;
9674 offset_expr.X_op = O_constant;
9675 if (! target_big_endian)
9676 {
9677 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9678 offset_expr.X_add_number = bfd_getl32 (temp);
9679 }
9680 else
9681 {
9682 imm_expr.X_add_number = bfd_getb32 (temp);
9683 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9684 }
9685 if (offset_expr.X_add_number == 0)
9686 offset_expr.X_op = O_absent;
9687 }
9688 else if (sizeof (imm_expr.X_add_number) > 4)
9689 {
9690 imm_expr.X_op = O_constant;
9691 if (! target_big_endian)
9692 imm_expr.X_add_number = bfd_getl64 (temp);
9693 else
9694 imm_expr.X_add_number = bfd_getb64 (temp);
9695 }
9696 else
9697 {
9698 imm_expr.X_op = O_big;
9699 imm_expr.X_add_number = 4;
9700 if (! target_big_endian)
9701 {
9702 generic_bignum[0] = bfd_getl16 (temp);
9703 generic_bignum[1] = bfd_getl16 (temp + 2);
9704 generic_bignum[2] = bfd_getl16 (temp + 4);
9705 generic_bignum[3] = bfd_getl16 (temp + 6);
9706 }
9707 else
9708 {
9709 generic_bignum[0] = bfd_getb16 (temp + 6);
9710 generic_bignum[1] = bfd_getb16 (temp + 4);
9711 generic_bignum[2] = bfd_getb16 (temp + 2);
9712 generic_bignum[3] = bfd_getb16 (temp);
9713 }
9714 }
9715 }
9716 else
9717 {
9718 const char *newname;
9719 segT new_seg;
9720
9721 /* Switch to the right section. */
9722 seg = now_seg;
9723 subseg = now_subseg;
9724 switch (*args)
9725 {
9726 default: /* unused default case avoids warnings. */
9727 case 'L':
9728 newname = RDATA_SECTION_NAME;
9729 if (g_switch_value >= 8)
9730 newname = ".lit8";
9731 break;
9732 case 'F':
9733 newname = RDATA_SECTION_NAME;
9734 break;
9735 case 'l':
9736 assert (g_switch_value >= 4);
9737 newname = ".lit4";
9738 break;
9739 }
9740 new_seg = subseg_new (newname, (subsegT) 0);
9741 if (IS_ELF)
9742 bfd_set_section_flags (stdoutput, new_seg,
9743 (SEC_ALLOC
9744 | SEC_LOAD
9745 | SEC_READONLY
9746 | SEC_DATA));
9747 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9748 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9749 record_alignment (new_seg, 4);
9750 else
9751 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9752 if (seg == now_seg)
9753 as_bad (_("Can't use floating point insn in this section"));
9754
9755 /* Set the argument to the current address in the
9756 section. */
9757 offset_expr.X_op = O_symbol;
9758 offset_expr.X_add_symbol =
9759 symbol_new ("L0\001", now_seg,
9760 (valueT) frag_now_fix (), frag_now);
9761 offset_expr.X_add_number = 0;
9762
9763 /* Put the floating point number into the section. */
9764 p = frag_more ((int) length);
9765 memcpy (p, temp, length);
9766
9767 /* Switch back to the original section. */
9768 subseg_set (seg, subseg);
9769 }
9770 }
9771 continue;
9772
9773 case 'i': /* 16 bit unsigned immediate */
9774 case 'j': /* 16 bit signed immediate */
9775 *imm_reloc = BFD_RELOC_LO16;
9776 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9777 {
9778 int more;
9779 offsetT minval, maxval;
9780
9781 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9782 && strcmp (insn->name, insn[1].name) == 0);
9783
9784 /* If the expression was written as an unsigned number,
9785 only treat it as signed if there are no more
9786 alternatives. */
9787 if (more
9788 && *args == 'j'
9789 && sizeof (imm_expr.X_add_number) <= 4
9790 && imm_expr.X_op == O_constant
9791 && imm_expr.X_add_number < 0
9792 && imm_expr.X_unsigned
9793 && HAVE_64BIT_GPRS)
9794 break;
9795
9796 /* For compatibility with older assemblers, we accept
9797 0x8000-0xffff as signed 16-bit numbers when only
9798 signed numbers are allowed. */
9799 if (*args == 'i')
9800 minval = 0, maxval = 0xffff;
9801 else if (more)
9802 minval = -0x8000, maxval = 0x7fff;
9803 else
9804 minval = -0x8000, maxval = 0xffff;
9805
9806 if (imm_expr.X_op != O_constant
9807 || imm_expr.X_add_number < minval
9808 || imm_expr.X_add_number > maxval)
9809 {
9810 if (more)
9811 break;
9812 if (imm_expr.X_op == O_constant
9813 || imm_expr.X_op == O_big)
9814 as_bad (_("expression out of range"));
9815 }
9816 }
9817 s = expr_end;
9818 continue;
9819
9820 case 'o': /* 16 bit offset */
9821 /* Check whether there is only a single bracketed expression
9822 left. If so, it must be the base register and the
9823 constant must be zero. */
9824 if (*s == '(' && strchr (s + 1, '(') == 0)
9825 {
9826 offset_expr.X_op = O_constant;
9827 offset_expr.X_add_number = 0;
9828 continue;
9829 }
9830
9831 /* If this value won't fit into a 16 bit offset, then go
9832 find a macro that will generate the 32 bit offset
9833 code pattern. */
9834 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9835 && (offset_expr.X_op != O_constant
9836 || offset_expr.X_add_number >= 0x8000
9837 || offset_expr.X_add_number < -0x8000))
9838 break;
9839
9840 s = expr_end;
9841 continue;
9842
9843 case 'p': /* pc relative offset */
9844 *offset_reloc = BFD_RELOC_16_PCREL_S2;
9845 my_getExpression (&offset_expr, s);
9846 s = expr_end;
9847 continue;
9848
9849 case 'u': /* upper 16 bits */
9850 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9851 && imm_expr.X_op == O_constant
9852 && (imm_expr.X_add_number < 0
9853 || imm_expr.X_add_number >= 0x10000))
9854 as_bad (_("lui expression not in range 0..65535"));
9855 s = expr_end;
9856 continue;
9857
9858 case 'a': /* 26 bit address */
9859 my_getExpression (&offset_expr, s);
9860 s = expr_end;
9861 *offset_reloc = BFD_RELOC_MIPS_JMP;
9862 continue;
9863
9864 case 'N': /* 3 bit branch condition code */
9865 case 'M': /* 3 bit compare condition code */
9866 rtype = RTYPE_CCC;
9867 if (ip->insn_mo->pinfo & (FP_D| FP_S))
9868 rtype |= RTYPE_FCC;
9869 if (!reg_lookup (&s, rtype, &regno))
9870 break;
9871 if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9872 || strcmp(str + strlen(str) - 5, "any2f") == 0
9873 || strcmp(str + strlen(str) - 5, "any2t") == 0)
9874 && (regno & 1) != 0)
9875 as_warn(_("Condition code register should be even for %s, was %d"),
9876 str, regno);
9877 if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9878 || strcmp(str + strlen(str) - 5, "any4t") == 0)
9879 && (regno & 3) != 0)
9880 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9881 str, regno);
9882 if (*args == 'N')
9883 INSERT_OPERAND (BCC, *ip, regno);
9884 else
9885 INSERT_OPERAND (CCC, *ip, regno);
9886 continue;
9887
9888 case 'H':
9889 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9890 s += 2;
9891 if (ISDIGIT (*s))
9892 {
9893 c = 0;
9894 do
9895 {
9896 c *= 10;
9897 c += *s - '0';
9898 ++s;
9899 }
9900 while (ISDIGIT (*s));
9901 }
9902 else
9903 c = 8; /* Invalid sel value. */
9904
9905 if (c > 7)
9906 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9907 ip->insn_opcode |= c;
9908 continue;
9909
9910 case 'e':
9911 /* Must be at least one digit. */
9912 my_getExpression (&imm_expr, s);
9913 check_absolute_expr (ip, &imm_expr);
9914
9915 if ((unsigned long) imm_expr.X_add_number
9916 > (unsigned long) OP_MASK_VECBYTE)
9917 {
9918 as_bad (_("bad byte vector index (%ld)"),
9919 (long) imm_expr.X_add_number);
9920 imm_expr.X_add_number = 0;
9921 }
9922
9923 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9924 imm_expr.X_op = O_absent;
9925 s = expr_end;
9926 continue;
9927
9928 case '%':
9929 my_getExpression (&imm_expr, s);
9930 check_absolute_expr (ip, &imm_expr);
9931
9932 if ((unsigned long) imm_expr.X_add_number
9933 > (unsigned long) OP_MASK_VECALIGN)
9934 {
9935 as_bad (_("bad byte vector index (%ld)"),
9936 (long) imm_expr.X_add_number);
9937 imm_expr.X_add_number = 0;
9938 }
9939
9940 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9941 imm_expr.X_op = O_absent;
9942 s = expr_end;
9943 continue;
9944
9945 default:
9946 as_bad (_("bad char = '%c'\n"), *args);
9947 internalError ();
9948 }
9949 break;
9950 }
9951 /* Args don't match. */
9952 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9953 !strcmp (insn->name, insn[1].name))
9954 {
9955 ++insn;
9956 s = argsStart;
9957 insn_error = _("illegal operands");
9958 continue;
9959 }
9960 if (save_c)
9961 *(--argsStart) = save_c;
9962 insn_error = _("illegal operands");
9963 return;
9964 }
9965 }
9966
9967 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9968
9969 /* This routine assembles an instruction into its binary format when
9970 assembling for the mips16. As a side effect, it sets one of the
9971 global variables imm_reloc or offset_reloc to the type of
9972 relocation to do if one of the operands is an address expression.
9973 It also sets mips16_small and mips16_ext if the user explicitly
9974 requested a small or extended instruction. */
9975
9976 static void
9977 mips16_ip (char *str, struct mips_cl_insn *ip)
9978 {
9979 char *s;
9980 const char *args;
9981 struct mips_opcode *insn;
9982 char *argsstart;
9983 unsigned int regno;
9984 unsigned int lastregno = 0;
9985 char *s_reset;
9986 size_t i;
9987
9988 insn_error = NULL;
9989
9990 mips16_small = FALSE;
9991 mips16_ext = FALSE;
9992
9993 for (s = str; ISLOWER (*s); ++s)
9994 ;
9995 switch (*s)
9996 {
9997 case '\0':
9998 break;
9999
10000 case ' ':
10001 *s++ = '\0';
10002 break;
10003
10004 case '.':
10005 if (s[1] == 't' && s[2] == ' ')
10006 {
10007 *s = '\0';
10008 mips16_small = TRUE;
10009 s += 3;
10010 break;
10011 }
10012 else if (s[1] == 'e' && s[2] == ' ')
10013 {
10014 *s = '\0';
10015 mips16_ext = TRUE;
10016 s += 3;
10017 break;
10018 }
10019 /* Fall through. */
10020 default:
10021 insn_error = _("unknown opcode");
10022 return;
10023 }
10024
10025 if (mips_opts.noautoextend && ! mips16_ext)
10026 mips16_small = TRUE;
10027
10028 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10029 {
10030 insn_error = _("unrecognized opcode");
10031 return;
10032 }
10033
10034 argsstart = s;
10035 for (;;)
10036 {
10037 bfd_boolean ok;
10038
10039 assert (strcmp (insn->name, str) == 0);
10040
10041 ok = is_opcode_valid_16 (insn);
10042 if (! ok)
10043 {
10044 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10045 && strcmp (insn->name, insn[1].name) == 0)
10046 {
10047 ++insn;
10048 continue;
10049 }
10050 else
10051 {
10052 if (!insn_error)
10053 {
10054 static char buf[100];
10055 sprintf (buf,
10056 _("opcode not supported on this processor: %s (%s)"),
10057 mips_cpu_info_from_arch (mips_opts.arch)->name,
10058 mips_cpu_info_from_isa (mips_opts.isa)->name);
10059 insn_error = buf;
10060 }
10061 return;
10062 }
10063 }
10064
10065 create_insn (ip, insn);
10066 imm_expr.X_op = O_absent;
10067 imm_reloc[0] = BFD_RELOC_UNUSED;
10068 imm_reloc[1] = BFD_RELOC_UNUSED;
10069 imm_reloc[2] = BFD_RELOC_UNUSED;
10070 imm2_expr.X_op = O_absent;
10071 offset_expr.X_op = O_absent;
10072 offset_reloc[0] = BFD_RELOC_UNUSED;
10073 offset_reloc[1] = BFD_RELOC_UNUSED;
10074 offset_reloc[2] = BFD_RELOC_UNUSED;
10075 for (args = insn->args; 1; ++args)
10076 {
10077 int c;
10078
10079 if (*s == ' ')
10080 ++s;
10081
10082 /* In this switch statement we call break if we did not find
10083 a match, continue if we did find a match, or return if we
10084 are done. */
10085
10086 c = *args;
10087 switch (c)
10088 {
10089 case '\0':
10090 if (*s == '\0')
10091 {
10092 /* Stuff the immediate value in now, if we can. */
10093 if (imm_expr.X_op == O_constant
10094 && *imm_reloc > BFD_RELOC_UNUSED
10095 && insn->pinfo != INSN_MACRO)
10096 {
10097 valueT tmp;
10098
10099 switch (*offset_reloc)
10100 {
10101 case BFD_RELOC_MIPS16_HI16_S:
10102 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10103 break;
10104
10105 case BFD_RELOC_MIPS16_HI16:
10106 tmp = imm_expr.X_add_number >> 16;
10107 break;
10108
10109 case BFD_RELOC_MIPS16_LO16:
10110 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10111 - 0x8000;
10112 break;
10113
10114 case BFD_RELOC_UNUSED:
10115 tmp = imm_expr.X_add_number;
10116 break;
10117
10118 default:
10119 internalError ();
10120 }
10121 *offset_reloc = BFD_RELOC_UNUSED;
10122
10123 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10124 tmp, TRUE, mips16_small,
10125 mips16_ext, &ip->insn_opcode,
10126 &ip->use_extend, &ip->extend);
10127 imm_expr.X_op = O_absent;
10128 *imm_reloc = BFD_RELOC_UNUSED;
10129 }
10130
10131 return;
10132 }
10133 break;
10134
10135 case ',':
10136 if (*s++ == c)
10137 continue;
10138 s--;
10139 switch (*++args)
10140 {
10141 case 'v':
10142 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10143 continue;
10144 case 'w':
10145 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10146 continue;
10147 }
10148 break;
10149
10150 case '(':
10151 case ')':
10152 if (*s++ == c)
10153 continue;
10154 break;
10155
10156 case 'v':
10157 case 'w':
10158 if (s[0] != '$')
10159 {
10160 if (c == 'v')
10161 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10162 else
10163 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10164 ++args;
10165 continue;
10166 }
10167 /* Fall through. */
10168 case 'x':
10169 case 'y':
10170 case 'z':
10171 case 'Z':
10172 case '0':
10173 case 'S':
10174 case 'R':
10175 case 'X':
10176 case 'Y':
10177 s_reset = s;
10178 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10179 {
10180 if (c == 'v' || c == 'w')
10181 {
10182 if (c == 'v')
10183 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10184 else
10185 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10186 ++args;
10187 continue;
10188 }
10189 break;
10190 }
10191
10192 if (*s == ' ')
10193 ++s;
10194 if (args[1] != *s)
10195 {
10196 if (c == 'v' || c == 'w')
10197 {
10198 regno = mips16_to_32_reg_map[lastregno];
10199 s = s_reset;
10200 ++args;
10201 }
10202 }
10203
10204 switch (c)
10205 {
10206 case 'x':
10207 case 'y':
10208 case 'z':
10209 case 'v':
10210 case 'w':
10211 case 'Z':
10212 regno = mips32_to_16_reg_map[regno];
10213 break;
10214
10215 case '0':
10216 if (regno != 0)
10217 regno = ILLEGAL_REG;
10218 break;
10219
10220 case 'S':
10221 if (regno != SP)
10222 regno = ILLEGAL_REG;
10223 break;
10224
10225 case 'R':
10226 if (regno != RA)
10227 regno = ILLEGAL_REG;
10228 break;
10229
10230 case 'X':
10231 case 'Y':
10232 if (regno == AT && mips_opts.at)
10233 {
10234 if (mips_opts.at == ATREG)
10235 as_warn (_("used $at without \".set noat\""));
10236 else
10237 as_warn (_("used $%u with \".set at=$%u\""),
10238 regno, mips_opts.at);
10239 }
10240 break;
10241
10242 default:
10243 internalError ();
10244 }
10245
10246 if (regno == ILLEGAL_REG)
10247 break;
10248
10249 switch (c)
10250 {
10251 case 'x':
10252 case 'v':
10253 MIPS16_INSERT_OPERAND (RX, *ip, regno);
10254 break;
10255 case 'y':
10256 case 'w':
10257 MIPS16_INSERT_OPERAND (RY, *ip, regno);
10258 break;
10259 case 'z':
10260 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10261 break;
10262 case 'Z':
10263 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10264 case '0':
10265 case 'S':
10266 case 'R':
10267 break;
10268 case 'X':
10269 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10270 break;
10271 case 'Y':
10272 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10273 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10274 break;
10275 default:
10276 internalError ();
10277 }
10278
10279 lastregno = regno;
10280 continue;
10281
10282 case 'P':
10283 if (strncmp (s, "$pc", 3) == 0)
10284 {
10285 s += 3;
10286 continue;
10287 }
10288 break;
10289
10290 case '5':
10291 case 'H':
10292 case 'W':
10293 case 'D':
10294 case 'j':
10295 case 'V':
10296 case 'C':
10297 case 'U':
10298 case 'k':
10299 case 'K':
10300 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10301 if (i > 0)
10302 {
10303 if (imm_expr.X_op != O_constant)
10304 {
10305 mips16_ext = TRUE;
10306 ip->use_extend = TRUE;
10307 ip->extend = 0;
10308 }
10309 else
10310 {
10311 /* We need to relax this instruction. */
10312 *offset_reloc = *imm_reloc;
10313 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10314 }
10315 s = expr_end;
10316 continue;
10317 }
10318 *imm_reloc = BFD_RELOC_UNUSED;
10319 /* Fall through. */
10320 case '<':
10321 case '>':
10322 case '[':
10323 case ']':
10324 case '4':
10325 case '8':
10326 my_getExpression (&imm_expr, s);
10327 if (imm_expr.X_op == O_register)
10328 {
10329 /* What we thought was an expression turned out to
10330 be a register. */
10331
10332 if (s[0] == '(' && args[1] == '(')
10333 {
10334 /* It looks like the expression was omitted
10335 before a register indirection, which means
10336 that the expression is implicitly zero. We
10337 still set up imm_expr, so that we handle
10338 explicit extensions correctly. */
10339 imm_expr.X_op = O_constant;
10340 imm_expr.X_add_number = 0;
10341 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10342 continue;
10343 }
10344
10345 break;
10346 }
10347
10348 /* We need to relax this instruction. */
10349 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10350 s = expr_end;
10351 continue;
10352
10353 case 'p':
10354 case 'q':
10355 case 'A':
10356 case 'B':
10357 case 'E':
10358 /* We use offset_reloc rather than imm_reloc for the PC
10359 relative operands. This lets macros with both
10360 immediate and address operands work correctly. */
10361 my_getExpression (&offset_expr, s);
10362
10363 if (offset_expr.X_op == O_register)
10364 break;
10365
10366 /* We need to relax this instruction. */
10367 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10368 s = expr_end;
10369 continue;
10370
10371 case '6': /* break code */
10372 my_getExpression (&imm_expr, s);
10373 check_absolute_expr (ip, &imm_expr);
10374 if ((unsigned long) imm_expr.X_add_number > 63)
10375 as_warn (_("Invalid value for `%s' (%lu)"),
10376 ip->insn_mo->name,
10377 (unsigned long) imm_expr.X_add_number);
10378 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10379 imm_expr.X_op = O_absent;
10380 s = expr_end;
10381 continue;
10382
10383 case 'a': /* 26 bit address */
10384 my_getExpression (&offset_expr, s);
10385 s = expr_end;
10386 *offset_reloc = BFD_RELOC_MIPS16_JMP;
10387 ip->insn_opcode <<= 16;
10388 continue;
10389
10390 case 'l': /* register list for entry macro */
10391 case 'L': /* register list for exit macro */
10392 {
10393 int mask;
10394
10395 if (c == 'l')
10396 mask = 0;
10397 else
10398 mask = 7 << 3;
10399 while (*s != '\0')
10400 {
10401 unsigned int freg, reg1, reg2;
10402
10403 while (*s == ' ' || *s == ',')
10404 ++s;
10405 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10406 freg = 0;
10407 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10408 freg = 1;
10409 else
10410 {
10411 as_bad (_("can't parse register list"));
10412 break;
10413 }
10414 if (*s == ' ')
10415 ++s;
10416 if (*s != '-')
10417 reg2 = reg1;
10418 else
10419 {
10420 ++s;
10421 if (!reg_lookup (&s, freg ? RTYPE_FPU
10422 : (RTYPE_GP | RTYPE_NUM), &reg2))
10423 {
10424 as_bad (_("invalid register list"));
10425 break;
10426 }
10427 }
10428 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10429 {
10430 mask &= ~ (7 << 3);
10431 mask |= 5 << 3;
10432 }
10433 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10434 {
10435 mask &= ~ (7 << 3);
10436 mask |= 6 << 3;
10437 }
10438 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10439 mask |= (reg2 - 3) << 3;
10440 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10441 mask |= (reg2 - 15) << 1;
10442 else if (reg1 == RA && reg2 == RA)
10443 mask |= 1;
10444 else
10445 {
10446 as_bad (_("invalid register list"));
10447 break;
10448 }
10449 }
10450 /* The mask is filled in in the opcode table for the
10451 benefit of the disassembler. We remove it before
10452 applying the actual mask. */
10453 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10454 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10455 }
10456 continue;
10457
10458 case 'm': /* Register list for save insn. */
10459 case 'M': /* Register list for restore insn. */
10460 {
10461 int opcode = 0;
10462 int framesz = 0, seen_framesz = 0;
10463 int args = 0, statics = 0, sregs = 0;
10464
10465 while (*s != '\0')
10466 {
10467 unsigned int reg1, reg2;
10468
10469 SKIP_SPACE_TABS (s);
10470 while (*s == ',')
10471 ++s;
10472 SKIP_SPACE_TABS (s);
10473
10474 my_getExpression (&imm_expr, s);
10475 if (imm_expr.X_op == O_constant)
10476 {
10477 /* Handle the frame size. */
10478 if (seen_framesz)
10479 {
10480 as_bad (_("more than one frame size in list"));
10481 break;
10482 }
10483 seen_framesz = 1;
10484 framesz = imm_expr.X_add_number;
10485 imm_expr.X_op = O_absent;
10486 s = expr_end;
10487 continue;
10488 }
10489
10490 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10491 {
10492 as_bad (_("can't parse register list"));
10493 break;
10494 }
10495
10496 while (*s == ' ')
10497 ++s;
10498
10499 if (*s != '-')
10500 reg2 = reg1;
10501 else
10502 {
10503 ++s;
10504 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10505 || reg2 < reg1)
10506 {
10507 as_bad (_("can't parse register list"));
10508 break;
10509 }
10510 }
10511
10512 while (reg1 <= reg2)
10513 {
10514 if (reg1 >= 4 && reg1 <= 7)
10515 {
10516 if (!seen_framesz)
10517 /* args $a0-$a3 */
10518 args |= 1 << (reg1 - 4);
10519 else
10520 /* statics $a0-$a3 */
10521 statics |= 1 << (reg1 - 4);
10522 }
10523 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10524 {
10525 /* $s0-$s8 */
10526 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10527 }
10528 else if (reg1 == 31)
10529 {
10530 /* Add $ra to insn. */
10531 opcode |= 0x40;
10532 }
10533 else
10534 {
10535 as_bad (_("unexpected register in list"));
10536 break;
10537 }
10538 if (++reg1 == 24)
10539 reg1 = 30;
10540 }
10541 }
10542
10543 /* Encode args/statics combination. */
10544 if (args & statics)
10545 as_bad (_("arg/static registers overlap"));
10546 else if (args == 0xf)
10547 /* All $a0-$a3 are args. */
10548 opcode |= MIPS16_ALL_ARGS << 16;
10549 else if (statics == 0xf)
10550 /* All $a0-$a3 are statics. */
10551 opcode |= MIPS16_ALL_STATICS << 16;
10552 else
10553 {
10554 int narg = 0, nstat = 0;
10555
10556 /* Count arg registers. */
10557 while (args & 0x1)
10558 {
10559 args >>= 1;
10560 narg++;
10561 }
10562 if (args != 0)
10563 as_bad (_("invalid arg register list"));
10564
10565 /* Count static registers. */
10566 while (statics & 0x8)
10567 {
10568 statics = (statics << 1) & 0xf;
10569 nstat++;
10570 }
10571 if (statics != 0)
10572 as_bad (_("invalid static register list"));
10573
10574 /* Encode args/statics. */
10575 opcode |= ((narg << 2) | nstat) << 16;
10576 }
10577
10578 /* Encode $s0/$s1. */
10579 if (sregs & (1 << 0)) /* $s0 */
10580 opcode |= 0x20;
10581 if (sregs & (1 << 1)) /* $s1 */
10582 opcode |= 0x10;
10583 sregs >>= 2;
10584
10585 if (sregs != 0)
10586 {
10587 /* Count regs $s2-$s8. */
10588 int nsreg = 0;
10589 while (sregs & 1)
10590 {
10591 sregs >>= 1;
10592 nsreg++;
10593 }
10594 if (sregs != 0)
10595 as_bad (_("invalid static register list"));
10596 /* Encode $s2-$s8. */
10597 opcode |= nsreg << 24;
10598 }
10599
10600 /* Encode frame size. */
10601 if (!seen_framesz)
10602 as_bad (_("missing frame size"));
10603 else if ((framesz & 7) != 0 || framesz < 0
10604 || framesz > 0xff * 8)
10605 as_bad (_("invalid frame size"));
10606 else if (framesz != 128 || (opcode >> 16) != 0)
10607 {
10608 framesz /= 8;
10609 opcode |= (((framesz & 0xf0) << 16)
10610 | (framesz & 0x0f));
10611 }
10612
10613 /* Finally build the instruction. */
10614 if ((opcode >> 16) != 0 || framesz == 0)
10615 {
10616 ip->use_extend = TRUE;
10617 ip->extend = opcode >> 16;
10618 }
10619 ip->insn_opcode |= opcode & 0x7f;
10620 }
10621 continue;
10622
10623 case 'e': /* extend code */
10624 my_getExpression (&imm_expr, s);
10625 check_absolute_expr (ip, &imm_expr);
10626 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10627 {
10628 as_warn (_("Invalid value for `%s' (%lu)"),
10629 ip->insn_mo->name,
10630 (unsigned long) imm_expr.X_add_number);
10631 imm_expr.X_add_number &= 0x7ff;
10632 }
10633 ip->insn_opcode |= imm_expr.X_add_number;
10634 imm_expr.X_op = O_absent;
10635 s = expr_end;
10636 continue;
10637
10638 default:
10639 internalError ();
10640 }
10641 break;
10642 }
10643
10644 /* Args don't match. */
10645 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10646 strcmp (insn->name, insn[1].name) == 0)
10647 {
10648 ++insn;
10649 s = argsstart;
10650 continue;
10651 }
10652
10653 insn_error = _("illegal operands");
10654
10655 return;
10656 }
10657 }
10658
10659 /* This structure holds information we know about a mips16 immediate
10660 argument type. */
10661
10662 struct mips16_immed_operand
10663 {
10664 /* The type code used in the argument string in the opcode table. */
10665 int type;
10666 /* The number of bits in the short form of the opcode. */
10667 int nbits;
10668 /* The number of bits in the extended form of the opcode. */
10669 int extbits;
10670 /* The amount by which the short form is shifted when it is used;
10671 for example, the sw instruction has a shift count of 2. */
10672 int shift;
10673 /* The amount by which the short form is shifted when it is stored
10674 into the instruction code. */
10675 int op_shift;
10676 /* Non-zero if the short form is unsigned. */
10677 int unsp;
10678 /* Non-zero if the extended form is unsigned. */
10679 int extu;
10680 /* Non-zero if the value is PC relative. */
10681 int pcrel;
10682 };
10683
10684 /* The mips16 immediate operand types. */
10685
10686 static const struct mips16_immed_operand mips16_immed_operands[] =
10687 {
10688 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10689 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10690 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10691 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10692 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10693 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10694 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10695 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10696 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10697 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10698 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10699 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10700 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10701 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10702 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10703 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10704 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10705 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10706 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10707 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10708 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10709 };
10710
10711 #define MIPS16_NUM_IMMED \
10712 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10713
10714 /* Handle a mips16 instruction with an immediate value. This or's the
10715 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10716 whether an extended value is needed; if one is needed, it sets
10717 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10718 If SMALL is true, an unextended opcode was explicitly requested.
10719 If EXT is true, an extended opcode was explicitly requested. If
10720 WARN is true, warn if EXT does not match reality. */
10721
10722 static void
10723 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10724 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10725 unsigned long *insn, bfd_boolean *use_extend,
10726 unsigned short *extend)
10727 {
10728 const struct mips16_immed_operand *op;
10729 int mintiny, maxtiny;
10730 bfd_boolean needext;
10731
10732 op = mips16_immed_operands;
10733 while (op->type != type)
10734 {
10735 ++op;
10736 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10737 }
10738
10739 if (op->unsp)
10740 {
10741 if (type == '<' || type == '>' || type == '[' || type == ']')
10742 {
10743 mintiny = 1;
10744 maxtiny = 1 << op->nbits;
10745 }
10746 else
10747 {
10748 mintiny = 0;
10749 maxtiny = (1 << op->nbits) - 1;
10750 }
10751 }
10752 else
10753 {
10754 mintiny = - (1 << (op->nbits - 1));
10755 maxtiny = (1 << (op->nbits - 1)) - 1;
10756 }
10757
10758 /* Branch offsets have an implicit 0 in the lowest bit. */
10759 if (type == 'p' || type == 'q')
10760 val /= 2;
10761
10762 if ((val & ((1 << op->shift) - 1)) != 0
10763 || val < (mintiny << op->shift)
10764 || val > (maxtiny << op->shift))
10765 needext = TRUE;
10766 else
10767 needext = FALSE;
10768
10769 if (warn && ext && ! needext)
10770 as_warn_where (file, line,
10771 _("extended operand requested but not required"));
10772 if (small && needext)
10773 as_bad_where (file, line, _("invalid unextended operand value"));
10774
10775 if (small || (! ext && ! needext))
10776 {
10777 int insnval;
10778
10779 *use_extend = FALSE;
10780 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10781 insnval <<= op->op_shift;
10782 *insn |= insnval;
10783 }
10784 else
10785 {
10786 long minext, maxext;
10787 int extval;
10788
10789 if (op->extu)
10790 {
10791 minext = 0;
10792 maxext = (1 << op->extbits) - 1;
10793 }
10794 else
10795 {
10796 minext = - (1 << (op->extbits - 1));
10797 maxext = (1 << (op->extbits - 1)) - 1;
10798 }
10799 if (val < minext || val > maxext)
10800 as_bad_where (file, line,
10801 _("operand value out of range for instruction"));
10802
10803 *use_extend = TRUE;
10804 if (op->extbits == 16)
10805 {
10806 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10807 val &= 0x1f;
10808 }
10809 else if (op->extbits == 15)
10810 {
10811 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10812 val &= 0xf;
10813 }
10814 else
10815 {
10816 extval = ((val & 0x1f) << 6) | (val & 0x20);
10817 val = 0;
10818 }
10819
10820 *extend = (unsigned short) extval;
10821 *insn |= val;
10822 }
10823 }
10824 \f
10825 struct percent_op_match
10826 {
10827 const char *str;
10828 bfd_reloc_code_real_type reloc;
10829 };
10830
10831 static const struct percent_op_match mips_percent_op[] =
10832 {
10833 {"%lo", BFD_RELOC_LO16},
10834 #ifdef OBJ_ELF
10835 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10836 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10837 {"%call16", BFD_RELOC_MIPS_CALL16},
10838 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10839 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10840 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10841 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10842 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10843 {"%got", BFD_RELOC_MIPS_GOT16},
10844 {"%gp_rel", BFD_RELOC_GPREL16},
10845 {"%half", BFD_RELOC_16},
10846 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10847 {"%higher", BFD_RELOC_MIPS_HIGHER},
10848 {"%neg", BFD_RELOC_MIPS_SUB},
10849 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10850 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10851 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10852 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10853 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10854 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10855 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10856 #endif
10857 {"%hi", BFD_RELOC_HI16_S}
10858 };
10859
10860 static const struct percent_op_match mips16_percent_op[] =
10861 {
10862 {"%lo", BFD_RELOC_MIPS16_LO16},
10863 {"%gprel", BFD_RELOC_MIPS16_GPREL},
10864 {"%hi", BFD_RELOC_MIPS16_HI16_S}
10865 };
10866
10867
10868 /* Return true if *STR points to a relocation operator. When returning true,
10869 move *STR over the operator and store its relocation code in *RELOC.
10870 Leave both *STR and *RELOC alone when returning false. */
10871
10872 static bfd_boolean
10873 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10874 {
10875 const struct percent_op_match *percent_op;
10876 size_t limit, i;
10877
10878 if (mips_opts.mips16)
10879 {
10880 percent_op = mips16_percent_op;
10881 limit = ARRAY_SIZE (mips16_percent_op);
10882 }
10883 else
10884 {
10885 percent_op = mips_percent_op;
10886 limit = ARRAY_SIZE (mips_percent_op);
10887 }
10888
10889 for (i = 0; i < limit; i++)
10890 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10891 {
10892 int len = strlen (percent_op[i].str);
10893
10894 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10895 continue;
10896
10897 *str += strlen (percent_op[i].str);
10898 *reloc = percent_op[i].reloc;
10899
10900 /* Check whether the output BFD supports this relocation.
10901 If not, issue an error and fall back on something safe. */
10902 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10903 {
10904 as_bad ("relocation %s isn't supported by the current ABI",
10905 percent_op[i].str);
10906 *reloc = BFD_RELOC_UNUSED;
10907 }
10908 return TRUE;
10909 }
10910 return FALSE;
10911 }
10912
10913
10914 /* Parse string STR as a 16-bit relocatable operand. Store the
10915 expression in *EP and the relocations in the array starting
10916 at RELOC. Return the number of relocation operators used.
10917
10918 On exit, EXPR_END points to the first character after the expression. */
10919
10920 static size_t
10921 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10922 char *str)
10923 {
10924 bfd_reloc_code_real_type reversed_reloc[3];
10925 size_t reloc_index, i;
10926 int crux_depth, str_depth;
10927 char *crux;
10928
10929 /* Search for the start of the main expression, recoding relocations
10930 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10931 of the main expression and with CRUX_DEPTH containing the number
10932 of open brackets at that point. */
10933 reloc_index = -1;
10934 str_depth = 0;
10935 do
10936 {
10937 reloc_index++;
10938 crux = str;
10939 crux_depth = str_depth;
10940
10941 /* Skip over whitespace and brackets, keeping count of the number
10942 of brackets. */
10943 while (*str == ' ' || *str == '\t' || *str == '(')
10944 if (*str++ == '(')
10945 str_depth++;
10946 }
10947 while (*str == '%'
10948 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10949 && parse_relocation (&str, &reversed_reloc[reloc_index]));
10950
10951 my_getExpression (ep, crux);
10952 str = expr_end;
10953
10954 /* Match every open bracket. */
10955 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10956 if (*str++ == ')')
10957 crux_depth--;
10958
10959 if (crux_depth > 0)
10960 as_bad ("unclosed '('");
10961
10962 expr_end = str;
10963
10964 if (reloc_index != 0)
10965 {
10966 prev_reloc_op_frag = frag_now;
10967 for (i = 0; i < reloc_index; i++)
10968 reloc[i] = reversed_reloc[reloc_index - 1 - i];
10969 }
10970
10971 return reloc_index;
10972 }
10973
10974 static void
10975 my_getExpression (expressionS *ep, char *str)
10976 {
10977 char *save_in;
10978 valueT val;
10979
10980 save_in = input_line_pointer;
10981 input_line_pointer = str;
10982 expression (ep);
10983 expr_end = input_line_pointer;
10984 input_line_pointer = save_in;
10985
10986 /* If we are in mips16 mode, and this is an expression based on `.',
10987 then we bump the value of the symbol by 1 since that is how other
10988 text symbols are handled. We don't bother to handle complex
10989 expressions, just `.' plus or minus a constant. */
10990 if (mips_opts.mips16
10991 && ep->X_op == O_symbol
10992 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10993 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10994 && symbol_get_frag (ep->X_add_symbol) == frag_now
10995 && symbol_constant_p (ep->X_add_symbol)
10996 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10997 S_SET_VALUE (ep->X_add_symbol, val + 1);
10998 }
10999
11000 char *
11001 md_atof (int type, char *litP, int *sizeP)
11002 {
11003 return ieee_md_atof (type, litP, sizeP, target_big_endian);
11004 }
11005
11006 void
11007 md_number_to_chars (char *buf, valueT val, int n)
11008 {
11009 if (target_big_endian)
11010 number_to_chars_bigendian (buf, val, n);
11011 else
11012 number_to_chars_littleendian (buf, val, n);
11013 }
11014 \f
11015 #ifdef OBJ_ELF
11016 static int support_64bit_objects(void)
11017 {
11018 const char **list, **l;
11019 int yes;
11020
11021 list = bfd_target_list ();
11022 for (l = list; *l != NULL; l++)
11023 #ifdef TE_TMIPS
11024 /* This is traditional mips */
11025 if (strcmp (*l, "elf64-tradbigmips") == 0
11026 || strcmp (*l, "elf64-tradlittlemips") == 0)
11027 #else
11028 if (strcmp (*l, "elf64-bigmips") == 0
11029 || strcmp (*l, "elf64-littlemips") == 0)
11030 #endif
11031 break;
11032 yes = (*l != NULL);
11033 free (list);
11034 return yes;
11035 }
11036 #endif /* OBJ_ELF */
11037
11038 const char *md_shortopts = "O::g::G:";
11039
11040 struct option md_longopts[] =
11041 {
11042 /* Options which specify architecture. */
11043 #define OPTION_ARCH_BASE (OPTION_MD_BASE)
11044 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
11045 {"march", required_argument, NULL, OPTION_MARCH},
11046 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
11047 {"mtune", required_argument, NULL, OPTION_MTUNE},
11048 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
11049 {"mips0", no_argument, NULL, OPTION_MIPS1},
11050 {"mips1", no_argument, NULL, OPTION_MIPS1},
11051 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
11052 {"mips2", no_argument, NULL, OPTION_MIPS2},
11053 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
11054 {"mips3", no_argument, NULL, OPTION_MIPS3},
11055 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
11056 {"mips4", no_argument, NULL, OPTION_MIPS4},
11057 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
11058 {"mips5", no_argument, NULL, OPTION_MIPS5},
11059 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
11060 {"mips32", no_argument, NULL, OPTION_MIPS32},
11061 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
11062 {"mips64", no_argument, NULL, OPTION_MIPS64},
11063 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
11064 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11065 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
11066 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11067
11068 /* Options which specify Application Specific Extensions (ASEs). */
11069 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
11070 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
11071 {"mips16", no_argument, NULL, OPTION_MIPS16},
11072 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
11073 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11074 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
11075 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11076 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
11077 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11078 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
11079 {"mdmx", no_argument, NULL, OPTION_MDMX},
11080 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
11081 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11082 #define OPTION_DSP (OPTION_ASE_BASE + 6)
11083 {"mdsp", no_argument, NULL, OPTION_DSP},
11084 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
11085 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11086 #define OPTION_MT (OPTION_ASE_BASE + 8)
11087 {"mmt", no_argument, NULL, OPTION_MT},
11088 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
11089 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11090 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
11091 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11092 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
11093 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11094 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
11095 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11096 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
11097 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11098
11099 /* Old-style architecture options. Don't add more of these. */
11100 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
11101 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
11102 {"m4650", no_argument, NULL, OPTION_M4650},
11103 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
11104 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11105 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
11106 {"m4010", no_argument, NULL, OPTION_M4010},
11107 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
11108 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11109 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
11110 {"m4100", no_argument, NULL, OPTION_M4100},
11111 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
11112 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11113 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
11114 {"m3900", no_argument, NULL, OPTION_M3900},
11115 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
11116 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11117
11118 /* Options which enable bug fixes. */
11119 #define OPTION_FIX_BASE (OPTION_COMPAT_ARCH_BASE + 8)
11120 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
11121 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11122 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
11123 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11124 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11125 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
11126 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
11127 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11128 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11129 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
11130 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
11131 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11132 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11133
11134 /* Miscellaneous options. */
11135 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
11136 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
11137 {"trap", no_argument, NULL, OPTION_TRAP},
11138 {"no-break", no_argument, NULL, OPTION_TRAP},
11139 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
11140 {"break", no_argument, NULL, OPTION_BREAK},
11141 {"no-trap", no_argument, NULL, OPTION_BREAK},
11142 #define OPTION_EB (OPTION_MISC_BASE + 2)
11143 {"EB", no_argument, NULL, OPTION_EB},
11144 #define OPTION_EL (OPTION_MISC_BASE + 3)
11145 {"EL", no_argument, NULL, OPTION_EL},
11146 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
11147 {"mfp32", no_argument, NULL, OPTION_FP32},
11148 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
11149 {"mgp32", no_argument, NULL, OPTION_GP32},
11150 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
11151 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11152 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
11153 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11154 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
11155 {"mfp64", no_argument, NULL, OPTION_FP64},
11156 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
11157 {"mgp64", no_argument, NULL, OPTION_GP64},
11158 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
11159 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
11160 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11161 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11162 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
11163 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
11164 {"mshared", no_argument, NULL, OPTION_MSHARED},
11165 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11166 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
11167 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
11168 {"msym32", no_argument, NULL, OPTION_MSYM32},
11169 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11170 #define OPTION_SOFT_FLOAT (OPTION_MISC_BASE + 16)
11171 #define OPTION_HARD_FLOAT (OPTION_MISC_BASE + 17)
11172 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11173 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11174 #define OPTION_SINGLE_FLOAT (OPTION_MISC_BASE + 18)
11175 #define OPTION_DOUBLE_FLOAT (OPTION_MISC_BASE + 19)
11176 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11177 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11178
11179 /* ELF-specific options. */
11180 #ifdef OBJ_ELF
11181 #define OPTION_ELF_BASE (OPTION_MISC_BASE + 20)
11182 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
11183 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11184 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11185 #define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
11186 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
11187 #define OPTION_XGOT (OPTION_ELF_BASE + 2)
11188 {"xgot", no_argument, NULL, OPTION_XGOT},
11189 #define OPTION_MABI (OPTION_ELF_BASE + 3)
11190 {"mabi", required_argument, NULL, OPTION_MABI},
11191 #define OPTION_32 (OPTION_ELF_BASE + 4)
11192 {"32", no_argument, NULL, OPTION_32},
11193 #define OPTION_N32 (OPTION_ELF_BASE + 5)
11194 {"n32", no_argument, NULL, OPTION_N32},
11195 #define OPTION_64 (OPTION_ELF_BASE + 6)
11196 {"64", no_argument, NULL, OPTION_64},
11197 #define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
11198 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11199 #define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
11200 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11201 #define OPTION_PDR (OPTION_ELF_BASE + 9)
11202 {"mpdr", no_argument, NULL, OPTION_PDR},
11203 #define OPTION_NO_PDR (OPTION_ELF_BASE + 10)
11204 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11205 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
11206 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11207 #endif /* OBJ_ELF */
11208
11209 {NULL, no_argument, NULL, 0}
11210 };
11211 size_t md_longopts_size = sizeof (md_longopts);
11212
11213 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11214 NEW_VALUE. Warn if another value was already specified. Note:
11215 we have to defer parsing the -march and -mtune arguments in order
11216 to handle 'from-abi' correctly, since the ABI might be specified
11217 in a later argument. */
11218
11219 static void
11220 mips_set_option_string (const char **string_ptr, const char *new_value)
11221 {
11222 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11223 as_warn (_("A different %s was already specified, is now %s"),
11224 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11225 new_value);
11226
11227 *string_ptr = new_value;
11228 }
11229
11230 int
11231 md_parse_option (int c, char *arg)
11232 {
11233 switch (c)
11234 {
11235 case OPTION_CONSTRUCT_FLOATS:
11236 mips_disable_float_construction = 0;
11237 break;
11238
11239 case OPTION_NO_CONSTRUCT_FLOATS:
11240 mips_disable_float_construction = 1;
11241 break;
11242
11243 case OPTION_TRAP:
11244 mips_trap = 1;
11245 break;
11246
11247 case OPTION_BREAK:
11248 mips_trap = 0;
11249 break;
11250
11251 case OPTION_EB:
11252 target_big_endian = 1;
11253 break;
11254
11255 case OPTION_EL:
11256 target_big_endian = 0;
11257 break;
11258
11259 case 'O':
11260 if (arg == NULL)
11261 mips_optimize = 1;
11262 else if (arg[0] == '0')
11263 mips_optimize = 0;
11264 else if (arg[0] == '1')
11265 mips_optimize = 1;
11266 else
11267 mips_optimize = 2;
11268 break;
11269
11270 case 'g':
11271 if (arg == NULL)
11272 mips_debug = 2;
11273 else
11274 mips_debug = atoi (arg);
11275 break;
11276
11277 case OPTION_MIPS1:
11278 file_mips_isa = ISA_MIPS1;
11279 break;
11280
11281 case OPTION_MIPS2:
11282 file_mips_isa = ISA_MIPS2;
11283 break;
11284
11285 case OPTION_MIPS3:
11286 file_mips_isa = ISA_MIPS3;
11287 break;
11288
11289 case OPTION_MIPS4:
11290 file_mips_isa = ISA_MIPS4;
11291 break;
11292
11293 case OPTION_MIPS5:
11294 file_mips_isa = ISA_MIPS5;
11295 break;
11296
11297 case OPTION_MIPS32:
11298 file_mips_isa = ISA_MIPS32;
11299 break;
11300
11301 case OPTION_MIPS32R2:
11302 file_mips_isa = ISA_MIPS32R2;
11303 break;
11304
11305 case OPTION_MIPS64R2:
11306 file_mips_isa = ISA_MIPS64R2;
11307 break;
11308
11309 case OPTION_MIPS64:
11310 file_mips_isa = ISA_MIPS64;
11311 break;
11312
11313 case OPTION_MTUNE:
11314 mips_set_option_string (&mips_tune_string, arg);
11315 break;
11316
11317 case OPTION_MARCH:
11318 mips_set_option_string (&mips_arch_string, arg);
11319 break;
11320
11321 case OPTION_M4650:
11322 mips_set_option_string (&mips_arch_string, "4650");
11323 mips_set_option_string (&mips_tune_string, "4650");
11324 break;
11325
11326 case OPTION_NO_M4650:
11327 break;
11328
11329 case OPTION_M4010:
11330 mips_set_option_string (&mips_arch_string, "4010");
11331 mips_set_option_string (&mips_tune_string, "4010");
11332 break;
11333
11334 case OPTION_NO_M4010:
11335 break;
11336
11337 case OPTION_M4100:
11338 mips_set_option_string (&mips_arch_string, "4100");
11339 mips_set_option_string (&mips_tune_string, "4100");
11340 break;
11341
11342 case OPTION_NO_M4100:
11343 break;
11344
11345 case OPTION_M3900:
11346 mips_set_option_string (&mips_arch_string, "3900");
11347 mips_set_option_string (&mips_tune_string, "3900");
11348 break;
11349
11350 case OPTION_NO_M3900:
11351 break;
11352
11353 case OPTION_MDMX:
11354 mips_opts.ase_mdmx = 1;
11355 break;
11356
11357 case OPTION_NO_MDMX:
11358 mips_opts.ase_mdmx = 0;
11359 break;
11360
11361 case OPTION_DSP:
11362 mips_opts.ase_dsp = 1;
11363 mips_opts.ase_dspr2 = 0;
11364 break;
11365
11366 case OPTION_NO_DSP:
11367 mips_opts.ase_dsp = 0;
11368 mips_opts.ase_dspr2 = 0;
11369 break;
11370
11371 case OPTION_DSPR2:
11372 mips_opts.ase_dspr2 = 1;
11373 mips_opts.ase_dsp = 1;
11374 break;
11375
11376 case OPTION_NO_DSPR2:
11377 mips_opts.ase_dspr2 = 0;
11378 mips_opts.ase_dsp = 0;
11379 break;
11380
11381 case OPTION_MT:
11382 mips_opts.ase_mt = 1;
11383 break;
11384
11385 case OPTION_NO_MT:
11386 mips_opts.ase_mt = 0;
11387 break;
11388
11389 case OPTION_MIPS16:
11390 mips_opts.mips16 = 1;
11391 mips_no_prev_insn ();
11392 break;
11393
11394 case OPTION_NO_MIPS16:
11395 mips_opts.mips16 = 0;
11396 mips_no_prev_insn ();
11397 break;
11398
11399 case OPTION_MIPS3D:
11400 mips_opts.ase_mips3d = 1;
11401 break;
11402
11403 case OPTION_NO_MIPS3D:
11404 mips_opts.ase_mips3d = 0;
11405 break;
11406
11407 case OPTION_SMARTMIPS:
11408 mips_opts.ase_smartmips = 1;
11409 break;
11410
11411 case OPTION_NO_SMARTMIPS:
11412 mips_opts.ase_smartmips = 0;
11413 break;
11414
11415 case OPTION_FIX_VR4120:
11416 mips_fix_vr4120 = 1;
11417 break;
11418
11419 case OPTION_NO_FIX_VR4120:
11420 mips_fix_vr4120 = 0;
11421 break;
11422
11423 case OPTION_FIX_VR4130:
11424 mips_fix_vr4130 = 1;
11425 break;
11426
11427 case OPTION_NO_FIX_VR4130:
11428 mips_fix_vr4130 = 0;
11429 break;
11430
11431 case OPTION_RELAX_BRANCH:
11432 mips_relax_branch = 1;
11433 break;
11434
11435 case OPTION_NO_RELAX_BRANCH:
11436 mips_relax_branch = 0;
11437 break;
11438
11439 case OPTION_MSHARED:
11440 mips_in_shared = TRUE;
11441 break;
11442
11443 case OPTION_MNO_SHARED:
11444 mips_in_shared = FALSE;
11445 break;
11446
11447 case OPTION_MSYM32:
11448 mips_opts.sym32 = TRUE;
11449 break;
11450
11451 case OPTION_MNO_SYM32:
11452 mips_opts.sym32 = FALSE;
11453 break;
11454
11455 #ifdef OBJ_ELF
11456 /* When generating ELF code, we permit -KPIC and -call_shared to
11457 select SVR4_PIC, and -non_shared to select no PIC. This is
11458 intended to be compatible with Irix 5. */
11459 case OPTION_CALL_SHARED:
11460 if (!IS_ELF)
11461 {
11462 as_bad (_("-call_shared is supported only for ELF format"));
11463 return 0;
11464 }
11465 mips_pic = SVR4_PIC;
11466 mips_abicalls = TRUE;
11467 break;
11468
11469 case OPTION_NON_SHARED:
11470 if (!IS_ELF)
11471 {
11472 as_bad (_("-non_shared is supported only for ELF format"));
11473 return 0;
11474 }
11475 mips_pic = NO_PIC;
11476 mips_abicalls = FALSE;
11477 break;
11478
11479 /* The -xgot option tells the assembler to use 32 bit offsets
11480 when accessing the got in SVR4_PIC mode. It is for Irix
11481 compatibility. */
11482 case OPTION_XGOT:
11483 mips_big_got = 1;
11484 break;
11485 #endif /* OBJ_ELF */
11486
11487 case 'G':
11488 g_switch_value = atoi (arg);
11489 g_switch_seen = 1;
11490 break;
11491
11492 #ifdef OBJ_ELF
11493 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11494 and -mabi=64. */
11495 case OPTION_32:
11496 if (!IS_ELF)
11497 {
11498 as_bad (_("-32 is supported for ELF format only"));
11499 return 0;
11500 }
11501 mips_abi = O32_ABI;
11502 break;
11503
11504 case OPTION_N32:
11505 if (!IS_ELF)
11506 {
11507 as_bad (_("-n32 is supported for ELF format only"));
11508 return 0;
11509 }
11510 mips_abi = N32_ABI;
11511 break;
11512
11513 case OPTION_64:
11514 if (!IS_ELF)
11515 {
11516 as_bad (_("-64 is supported for ELF format only"));
11517 return 0;
11518 }
11519 mips_abi = N64_ABI;
11520 if (!support_64bit_objects())
11521 as_fatal (_("No compiled in support for 64 bit object file format"));
11522 break;
11523 #endif /* OBJ_ELF */
11524
11525 case OPTION_GP32:
11526 file_mips_gp32 = 1;
11527 break;
11528
11529 case OPTION_GP64:
11530 file_mips_gp32 = 0;
11531 break;
11532
11533 case OPTION_FP32:
11534 file_mips_fp32 = 1;
11535 break;
11536
11537 case OPTION_FP64:
11538 file_mips_fp32 = 0;
11539 break;
11540
11541 case OPTION_SINGLE_FLOAT:
11542 file_mips_single_float = 1;
11543 break;
11544
11545 case OPTION_DOUBLE_FLOAT:
11546 file_mips_single_float = 0;
11547 break;
11548
11549 case OPTION_SOFT_FLOAT:
11550 file_mips_soft_float = 1;
11551 break;
11552
11553 case OPTION_HARD_FLOAT:
11554 file_mips_soft_float = 0;
11555 break;
11556
11557 #ifdef OBJ_ELF
11558 case OPTION_MABI:
11559 if (!IS_ELF)
11560 {
11561 as_bad (_("-mabi is supported for ELF format only"));
11562 return 0;
11563 }
11564 if (strcmp (arg, "32") == 0)
11565 mips_abi = O32_ABI;
11566 else if (strcmp (arg, "o64") == 0)
11567 mips_abi = O64_ABI;
11568 else if (strcmp (arg, "n32") == 0)
11569 mips_abi = N32_ABI;
11570 else if (strcmp (arg, "64") == 0)
11571 {
11572 mips_abi = N64_ABI;
11573 if (! support_64bit_objects())
11574 as_fatal (_("No compiled in support for 64 bit object file "
11575 "format"));
11576 }
11577 else if (strcmp (arg, "eabi") == 0)
11578 mips_abi = EABI_ABI;
11579 else
11580 {
11581 as_fatal (_("invalid abi -mabi=%s"), arg);
11582 return 0;
11583 }
11584 break;
11585 #endif /* OBJ_ELF */
11586
11587 case OPTION_M7000_HILO_FIX:
11588 mips_7000_hilo_fix = TRUE;
11589 break;
11590
11591 case OPTION_MNO_7000_HILO_FIX:
11592 mips_7000_hilo_fix = FALSE;
11593 break;
11594
11595 #ifdef OBJ_ELF
11596 case OPTION_MDEBUG:
11597 mips_flag_mdebug = TRUE;
11598 break;
11599
11600 case OPTION_NO_MDEBUG:
11601 mips_flag_mdebug = FALSE;
11602 break;
11603
11604 case OPTION_PDR:
11605 mips_flag_pdr = TRUE;
11606 break;
11607
11608 case OPTION_NO_PDR:
11609 mips_flag_pdr = FALSE;
11610 break;
11611
11612 case OPTION_MVXWORKS_PIC:
11613 mips_pic = VXWORKS_PIC;
11614 break;
11615 #endif /* OBJ_ELF */
11616
11617 default:
11618 return 0;
11619 }
11620
11621 return 1;
11622 }
11623 \f
11624 /* Set up globals to generate code for the ISA or processor
11625 described by INFO. */
11626
11627 static void
11628 mips_set_architecture (const struct mips_cpu_info *info)
11629 {
11630 if (info != 0)
11631 {
11632 file_mips_arch = info->cpu;
11633 mips_opts.arch = info->cpu;
11634 mips_opts.isa = info->isa;
11635 }
11636 }
11637
11638
11639 /* Likewise for tuning. */
11640
11641 static void
11642 mips_set_tune (const struct mips_cpu_info *info)
11643 {
11644 if (info != 0)
11645 mips_tune = info->cpu;
11646 }
11647
11648
11649 void
11650 mips_after_parse_args (void)
11651 {
11652 const struct mips_cpu_info *arch_info = 0;
11653 const struct mips_cpu_info *tune_info = 0;
11654
11655 /* GP relative stuff not working for PE */
11656 if (strncmp (TARGET_OS, "pe", 2) == 0)
11657 {
11658 if (g_switch_seen && g_switch_value != 0)
11659 as_bad (_("-G not supported in this configuration."));
11660 g_switch_value = 0;
11661 }
11662
11663 if (mips_abi == NO_ABI)
11664 mips_abi = MIPS_DEFAULT_ABI;
11665
11666 /* The following code determines the architecture and register size.
11667 Similar code was added to GCC 3.3 (see override_options() in
11668 config/mips/mips.c). The GAS and GCC code should be kept in sync
11669 as much as possible. */
11670
11671 if (mips_arch_string != 0)
11672 arch_info = mips_parse_cpu ("-march", mips_arch_string);
11673
11674 if (file_mips_isa != ISA_UNKNOWN)
11675 {
11676 /* Handle -mipsN. At this point, file_mips_isa contains the
11677 ISA level specified by -mipsN, while arch_info->isa contains
11678 the -march selection (if any). */
11679 if (arch_info != 0)
11680 {
11681 /* -march takes precedence over -mipsN, since it is more descriptive.
11682 There's no harm in specifying both as long as the ISA levels
11683 are the same. */
11684 if (file_mips_isa != arch_info->isa)
11685 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11686 mips_cpu_info_from_isa (file_mips_isa)->name,
11687 mips_cpu_info_from_isa (arch_info->isa)->name);
11688 }
11689 else
11690 arch_info = mips_cpu_info_from_isa (file_mips_isa);
11691 }
11692
11693 if (arch_info == 0)
11694 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11695
11696 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11697 as_bad ("-march=%s is not compatible with the selected ABI",
11698 arch_info->name);
11699
11700 mips_set_architecture (arch_info);
11701
11702 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11703 if (mips_tune_string != 0)
11704 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11705
11706 if (tune_info == 0)
11707 mips_set_tune (arch_info);
11708 else
11709 mips_set_tune (tune_info);
11710
11711 if (file_mips_gp32 >= 0)
11712 {
11713 /* The user specified the size of the integer registers. Make sure
11714 it agrees with the ABI and ISA. */
11715 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11716 as_bad (_("-mgp64 used with a 32-bit processor"));
11717 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11718 as_bad (_("-mgp32 used with a 64-bit ABI"));
11719 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11720 as_bad (_("-mgp64 used with a 32-bit ABI"));
11721 }
11722 else
11723 {
11724 /* Infer the integer register size from the ABI and processor.
11725 Restrict ourselves to 32-bit registers if that's all the
11726 processor has, or if the ABI cannot handle 64-bit registers. */
11727 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11728 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11729 }
11730
11731 switch (file_mips_fp32)
11732 {
11733 default:
11734 case -1:
11735 /* No user specified float register size.
11736 ??? GAS treats single-float processors as though they had 64-bit
11737 float registers (although it complains when double-precision
11738 instructions are used). As things stand, saying they have 32-bit
11739 registers would lead to spurious "register must be even" messages.
11740 So here we assume float registers are never smaller than the
11741 integer ones. */
11742 if (file_mips_gp32 == 0)
11743 /* 64-bit integer registers implies 64-bit float registers. */
11744 file_mips_fp32 = 0;
11745 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11746 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11747 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11748 file_mips_fp32 = 0;
11749 else
11750 /* 32-bit float registers. */
11751 file_mips_fp32 = 1;
11752 break;
11753
11754 /* The user specified the size of the float registers. Check if it
11755 agrees with the ABI and ISA. */
11756 case 0:
11757 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11758 as_bad (_("-mfp64 used with a 32-bit fpu"));
11759 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11760 && !ISA_HAS_MXHC1 (mips_opts.isa))
11761 as_warn (_("-mfp64 used with a 32-bit ABI"));
11762 break;
11763 case 1:
11764 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11765 as_warn (_("-mfp32 used with a 64-bit ABI"));
11766 break;
11767 }
11768
11769 /* End of GCC-shared inference code. */
11770
11771 /* This flag is set when we have a 64-bit capable CPU but use only
11772 32-bit wide registers. Note that EABI does not use it. */
11773 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11774 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11775 || mips_abi == O32_ABI))
11776 mips_32bitmode = 1;
11777
11778 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11779 as_bad (_("trap exception not supported at ISA 1"));
11780
11781 /* If the selected architecture includes support for ASEs, enable
11782 generation of code for them. */
11783 if (mips_opts.mips16 == -1)
11784 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11785 if (mips_opts.ase_mips3d == -1)
11786 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11787 && file_mips_fp32 == 0) ? 1 : 0;
11788 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11789 as_bad (_("-mfp32 used with -mips3d"));
11790
11791 if (mips_opts.ase_mdmx == -1)
11792 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11793 && file_mips_fp32 == 0) ? 1 : 0;
11794 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11795 as_bad (_("-mfp32 used with -mdmx"));
11796
11797 if (mips_opts.ase_smartmips == -1)
11798 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11799 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11800 as_warn ("%s ISA does not support SmartMIPS",
11801 mips_cpu_info_from_isa (mips_opts.isa)->name);
11802
11803 if (mips_opts.ase_dsp == -1)
11804 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11805 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11806 as_warn ("%s ISA does not support DSP ASE",
11807 mips_cpu_info_from_isa (mips_opts.isa)->name);
11808
11809 if (mips_opts.ase_dspr2 == -1)
11810 {
11811 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11812 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11813 }
11814 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11815 as_warn ("%s ISA does not support DSP R2 ASE",
11816 mips_cpu_info_from_isa (mips_opts.isa)->name);
11817
11818 if (mips_opts.ase_mt == -1)
11819 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11820 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11821 as_warn ("%s ISA does not support MT ASE",
11822 mips_cpu_info_from_isa (mips_opts.isa)->name);
11823
11824 file_mips_isa = mips_opts.isa;
11825 file_ase_mips16 = mips_opts.mips16;
11826 file_ase_mips3d = mips_opts.ase_mips3d;
11827 file_ase_mdmx = mips_opts.ase_mdmx;
11828 file_ase_smartmips = mips_opts.ase_smartmips;
11829 file_ase_dsp = mips_opts.ase_dsp;
11830 file_ase_dspr2 = mips_opts.ase_dspr2;
11831 file_ase_mt = mips_opts.ase_mt;
11832 mips_opts.gp32 = file_mips_gp32;
11833 mips_opts.fp32 = file_mips_fp32;
11834 mips_opts.soft_float = file_mips_soft_float;
11835 mips_opts.single_float = file_mips_single_float;
11836
11837 if (mips_flag_mdebug < 0)
11838 {
11839 #ifdef OBJ_MAYBE_ECOFF
11840 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11841 mips_flag_mdebug = 1;
11842 else
11843 #endif /* OBJ_MAYBE_ECOFF */
11844 mips_flag_mdebug = 0;
11845 }
11846 }
11847 \f
11848 void
11849 mips_init_after_args (void)
11850 {
11851 /* initialize opcodes */
11852 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11853 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11854 }
11855
11856 long
11857 md_pcrel_from (fixS *fixP)
11858 {
11859 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11860 switch (fixP->fx_r_type)
11861 {
11862 case BFD_RELOC_16_PCREL_S2:
11863 case BFD_RELOC_MIPS_JMP:
11864 /* Return the address of the delay slot. */
11865 return addr + 4;
11866 default:
11867 /* We have no relocation type for PC relative MIPS16 instructions. */
11868 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11869 as_bad_where (fixP->fx_file, fixP->fx_line,
11870 _("PC relative MIPS16 instruction references a different section"));
11871 return addr;
11872 }
11873 }
11874
11875 /* This is called before the symbol table is processed. In order to
11876 work with gcc when using mips-tfile, we must keep all local labels.
11877 However, in other cases, we want to discard them. If we were
11878 called with -g, but we didn't see any debugging information, it may
11879 mean that gcc is smuggling debugging information through to
11880 mips-tfile, in which case we must generate all local labels. */
11881
11882 void
11883 mips_frob_file_before_adjust (void)
11884 {
11885 #ifndef NO_ECOFF_DEBUGGING
11886 if (ECOFF_DEBUGGING
11887 && mips_debug != 0
11888 && ! ecoff_debugging_seen)
11889 flag_keep_locals = 1;
11890 #endif
11891 }
11892
11893 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11894 the corresponding LO16 reloc. This is called before md_apply_fix and
11895 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
11896 relocation operators.
11897
11898 For our purposes, a %lo() expression matches a %got() or %hi()
11899 expression if:
11900
11901 (a) it refers to the same symbol; and
11902 (b) the offset applied in the %lo() expression is no lower than
11903 the offset applied in the %got() or %hi().
11904
11905 (b) allows us to cope with code like:
11906
11907 lui $4,%hi(foo)
11908 lh $4,%lo(foo+2)($4)
11909
11910 ...which is legal on RELA targets, and has a well-defined behaviour
11911 if the user knows that adding 2 to "foo" will not induce a carry to
11912 the high 16 bits.
11913
11914 When several %lo()s match a particular %got() or %hi(), we use the
11915 following rules to distinguish them:
11916
11917 (1) %lo()s with smaller offsets are a better match than %lo()s with
11918 higher offsets.
11919
11920 (2) %lo()s with no matching %got() or %hi() are better than those
11921 that already have a matching %got() or %hi().
11922
11923 (3) later %lo()s are better than earlier %lo()s.
11924
11925 These rules are applied in order.
11926
11927 (1) means, among other things, that %lo()s with identical offsets are
11928 chosen if they exist.
11929
11930 (2) means that we won't associate several high-part relocations with
11931 the same low-part relocation unless there's no alternative. Having
11932 several high parts for the same low part is a GNU extension; this rule
11933 allows careful users to avoid it.
11934
11935 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
11936 with the last high-part relocation being at the front of the list.
11937 It therefore makes sense to choose the last matching low-part
11938 relocation, all other things being equal. It's also easier
11939 to code that way. */
11940
11941 void
11942 mips_frob_file (void)
11943 {
11944 struct mips_hi_fixup *l;
11945 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
11946
11947 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11948 {
11949 segment_info_type *seginfo;
11950 bfd_boolean matched_lo_p;
11951 fixS **hi_pos, **lo_pos, **pos;
11952
11953 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11954
11955 /* If a GOT16 relocation turns out to be against a global symbol,
11956 there isn't supposed to be a matching LO. */
11957 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11958 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11959 continue;
11960
11961 /* Check quickly whether the next fixup happens to be a matching %lo. */
11962 if (fixup_has_matching_lo_p (l->fixp))
11963 continue;
11964
11965 seginfo = seg_info (l->seg);
11966
11967 /* Set HI_POS to the position of this relocation in the chain.
11968 Set LO_POS to the position of the chosen low-part relocation.
11969 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11970 relocation that matches an immediately-preceding high-part
11971 relocation. */
11972 hi_pos = NULL;
11973 lo_pos = NULL;
11974 matched_lo_p = FALSE;
11975
11976 if (l->fixp->fx_r_type == BFD_RELOC_MIPS16_HI16
11977 || l->fixp->fx_r_type == BFD_RELOC_MIPS16_HI16_S)
11978 looking_for_rtype = BFD_RELOC_MIPS16_LO16;
11979 else
11980 looking_for_rtype = BFD_RELOC_LO16;
11981
11982 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11983 {
11984 if (*pos == l->fixp)
11985 hi_pos = pos;
11986
11987 if ((*pos)->fx_r_type == looking_for_rtype
11988 && (*pos)->fx_addsy == l->fixp->fx_addsy
11989 && (*pos)->fx_offset >= l->fixp->fx_offset
11990 && (lo_pos == NULL
11991 || (*pos)->fx_offset < (*lo_pos)->fx_offset
11992 || (!matched_lo_p
11993 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11994 lo_pos = pos;
11995
11996 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11997 && fixup_has_matching_lo_p (*pos));
11998 }
11999
12000 /* If we found a match, remove the high-part relocation from its
12001 current position and insert it before the low-part relocation.
12002 Make the offsets match so that fixup_has_matching_lo_p()
12003 will return true.
12004
12005 We don't warn about unmatched high-part relocations since some
12006 versions of gcc have been known to emit dead "lui ...%hi(...)"
12007 instructions. */
12008 if (lo_pos != NULL)
12009 {
12010 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12011 if (l->fixp->fx_next != *lo_pos)
12012 {
12013 *hi_pos = l->fixp->fx_next;
12014 l->fixp->fx_next = *lo_pos;
12015 *lo_pos = l->fixp;
12016 }
12017 }
12018 }
12019 }
12020
12021 /* We may have combined relocations without symbols in the N32/N64 ABI.
12022 We have to prevent gas from dropping them. */
12023
12024 int
12025 mips_force_relocation (fixS *fixp)
12026 {
12027 if (generic_force_reloc (fixp))
12028 return 1;
12029
12030 if (HAVE_NEWABI
12031 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12032 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12033 || fixp->fx_r_type == BFD_RELOC_HI16_S
12034 || fixp->fx_r_type == BFD_RELOC_LO16))
12035 return 1;
12036
12037 return 0;
12038 }
12039
12040 /* Apply a fixup to the object file. */
12041
12042 void
12043 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12044 {
12045 bfd_byte *buf;
12046 long insn;
12047 reloc_howto_type *howto;
12048
12049 /* We ignore generic BFD relocations we don't know about. */
12050 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12051 if (! howto)
12052 return;
12053
12054 assert (fixP->fx_size == 4
12055 || fixP->fx_r_type == BFD_RELOC_16
12056 || fixP->fx_r_type == BFD_RELOC_64
12057 || fixP->fx_r_type == BFD_RELOC_CTOR
12058 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12059 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12060 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12061 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12062
12063 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12064
12065 assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12066
12067 /* Don't treat parts of a composite relocation as done. There are two
12068 reasons for this:
12069
12070 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12071 should nevertheless be emitted if the first part is.
12072
12073 (2) In normal usage, composite relocations are never assembly-time
12074 constants. The easiest way of dealing with the pathological
12075 exceptions is to generate a relocation against STN_UNDEF and
12076 leave everything up to the linker. */
12077 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12078 fixP->fx_done = 1;
12079
12080 switch (fixP->fx_r_type)
12081 {
12082 case BFD_RELOC_MIPS_TLS_GD:
12083 case BFD_RELOC_MIPS_TLS_LDM:
12084 case BFD_RELOC_MIPS_TLS_DTPREL32:
12085 case BFD_RELOC_MIPS_TLS_DTPREL64:
12086 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12087 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12088 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12089 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12090 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12091 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12092 /* fall through */
12093
12094 case BFD_RELOC_MIPS_JMP:
12095 case BFD_RELOC_MIPS_SHIFT5:
12096 case BFD_RELOC_MIPS_SHIFT6:
12097 case BFD_RELOC_MIPS_GOT_DISP:
12098 case BFD_RELOC_MIPS_GOT_PAGE:
12099 case BFD_RELOC_MIPS_GOT_OFST:
12100 case BFD_RELOC_MIPS_SUB:
12101 case BFD_RELOC_MIPS_INSERT_A:
12102 case BFD_RELOC_MIPS_INSERT_B:
12103 case BFD_RELOC_MIPS_DELETE:
12104 case BFD_RELOC_MIPS_HIGHEST:
12105 case BFD_RELOC_MIPS_HIGHER:
12106 case BFD_RELOC_MIPS_SCN_DISP:
12107 case BFD_RELOC_MIPS_REL16:
12108 case BFD_RELOC_MIPS_RELGOT:
12109 case BFD_RELOC_MIPS_JALR:
12110 case BFD_RELOC_HI16:
12111 case BFD_RELOC_HI16_S:
12112 case BFD_RELOC_GPREL16:
12113 case BFD_RELOC_MIPS_LITERAL:
12114 case BFD_RELOC_MIPS_CALL16:
12115 case BFD_RELOC_MIPS_GOT16:
12116 case BFD_RELOC_GPREL32:
12117 case BFD_RELOC_MIPS_GOT_HI16:
12118 case BFD_RELOC_MIPS_GOT_LO16:
12119 case BFD_RELOC_MIPS_CALL_HI16:
12120 case BFD_RELOC_MIPS_CALL_LO16:
12121 case BFD_RELOC_MIPS16_GPREL:
12122 case BFD_RELOC_MIPS16_HI16:
12123 case BFD_RELOC_MIPS16_HI16_S:
12124 case BFD_RELOC_MIPS16_JMP:
12125 /* Nothing needed to do. The value comes from the reloc entry. */
12126 break;
12127
12128 case BFD_RELOC_64:
12129 /* This is handled like BFD_RELOC_32, but we output a sign
12130 extended value if we are only 32 bits. */
12131 if (fixP->fx_done)
12132 {
12133 if (8 <= sizeof (valueT))
12134 md_number_to_chars ((char *) buf, *valP, 8);
12135 else
12136 {
12137 valueT hiv;
12138
12139 if ((*valP & 0x80000000) != 0)
12140 hiv = 0xffffffff;
12141 else
12142 hiv = 0;
12143 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12144 *valP, 4);
12145 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12146 hiv, 4);
12147 }
12148 }
12149 break;
12150
12151 case BFD_RELOC_RVA:
12152 case BFD_RELOC_32:
12153 case BFD_RELOC_16:
12154 /* If we are deleting this reloc entry, we must fill in the
12155 value now. This can happen if we have a .word which is not
12156 resolved when it appears but is later defined. */
12157 if (fixP->fx_done)
12158 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12159 break;
12160
12161 case BFD_RELOC_LO16:
12162 case BFD_RELOC_MIPS16_LO16:
12163 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12164 may be safe to remove, but if so it's not obvious. */
12165 /* When handling an embedded PIC switch statement, we can wind
12166 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12167 if (fixP->fx_done)
12168 {
12169 if (*valP + 0x8000 > 0xffff)
12170 as_bad_where (fixP->fx_file, fixP->fx_line,
12171 _("relocation overflow"));
12172 if (target_big_endian)
12173 buf += 2;
12174 md_number_to_chars ((char *) buf, *valP, 2);
12175 }
12176 break;
12177
12178 case BFD_RELOC_16_PCREL_S2:
12179 if ((*valP & 0x3) != 0)
12180 as_bad_where (fixP->fx_file, fixP->fx_line,
12181 _("Branch to misaligned address (%lx)"), (long) *valP);
12182
12183 /* We need to save the bits in the instruction since fixup_segment()
12184 might be deleting the relocation entry (i.e., a branch within
12185 the current segment). */
12186 if (! fixP->fx_done)
12187 break;
12188
12189 /* Update old instruction data. */
12190 if (target_big_endian)
12191 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12192 else
12193 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12194
12195 if (*valP + 0x20000 <= 0x3ffff)
12196 {
12197 insn |= (*valP >> 2) & 0xffff;
12198 md_number_to_chars ((char *) buf, insn, 4);
12199 }
12200 else if (mips_pic == NO_PIC
12201 && fixP->fx_done
12202 && fixP->fx_frag->fr_address >= text_section->vma
12203 && (fixP->fx_frag->fr_address
12204 < text_section->vma + bfd_get_section_size (text_section))
12205 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12206 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12207 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12208 {
12209 /* The branch offset is too large. If this is an
12210 unconditional branch, and we are not generating PIC code,
12211 we can convert it to an absolute jump instruction. */
12212 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12213 insn = 0x0c000000; /* jal */
12214 else
12215 insn = 0x08000000; /* j */
12216 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12217 fixP->fx_done = 0;
12218 fixP->fx_addsy = section_symbol (text_section);
12219 *valP += md_pcrel_from (fixP);
12220 md_number_to_chars ((char *) buf, insn, 4);
12221 }
12222 else
12223 {
12224 /* If we got here, we have branch-relaxation disabled,
12225 and there's nothing we can do to fix this instruction
12226 without turning it into a longer sequence. */
12227 as_bad_where (fixP->fx_file, fixP->fx_line,
12228 _("Branch out of range"));
12229 }
12230 break;
12231
12232 case BFD_RELOC_VTABLE_INHERIT:
12233 fixP->fx_done = 0;
12234 if (fixP->fx_addsy
12235 && !S_IS_DEFINED (fixP->fx_addsy)
12236 && !S_IS_WEAK (fixP->fx_addsy))
12237 S_SET_WEAK (fixP->fx_addsy);
12238 break;
12239
12240 case BFD_RELOC_VTABLE_ENTRY:
12241 fixP->fx_done = 0;
12242 break;
12243
12244 default:
12245 internalError ();
12246 }
12247
12248 /* Remember value for tc_gen_reloc. */
12249 fixP->fx_addnumber = *valP;
12250 }
12251
12252 static symbolS *
12253 get_symbol (void)
12254 {
12255 int c;
12256 char *name;
12257 symbolS *p;
12258
12259 name = input_line_pointer;
12260 c = get_symbol_end ();
12261 p = (symbolS *) symbol_find_or_make (name);
12262 *input_line_pointer = c;
12263 return p;
12264 }
12265
12266 /* Align the current frag to a given power of two. If a particular
12267 fill byte should be used, FILL points to an integer that contains
12268 that byte, otherwise FILL is null.
12269
12270 The MIPS assembler also automatically adjusts any preceding
12271 label. */
12272
12273 static void
12274 mips_align (int to, int *fill, symbolS *label)
12275 {
12276 mips_emit_delays ();
12277 mips_record_mips16_mode ();
12278 if (fill == NULL && subseg_text_p (now_seg))
12279 frag_align_code (to, 0);
12280 else
12281 frag_align (to, fill ? *fill : 0, 0);
12282 record_alignment (now_seg, to);
12283 if (label != NULL)
12284 {
12285 assert (S_GET_SEGMENT (label) == now_seg);
12286 symbol_set_frag (label, frag_now);
12287 S_SET_VALUE (label, (valueT) frag_now_fix ());
12288 }
12289 }
12290
12291 /* Align to a given power of two. .align 0 turns off the automatic
12292 alignment used by the data creating pseudo-ops. */
12293
12294 static void
12295 s_align (int x ATTRIBUTE_UNUSED)
12296 {
12297 int temp, fill_value, *fill_ptr;
12298 long max_alignment = 28;
12299
12300 /* o Note that the assembler pulls down any immediately preceding label
12301 to the aligned address.
12302 o It's not documented but auto alignment is reinstated by
12303 a .align pseudo instruction.
12304 o Note also that after auto alignment is turned off the mips assembler
12305 issues an error on attempt to assemble an improperly aligned data item.
12306 We don't. */
12307
12308 temp = get_absolute_expression ();
12309 if (temp > max_alignment)
12310 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12311 else if (temp < 0)
12312 {
12313 as_warn (_("Alignment negative: 0 assumed."));
12314 temp = 0;
12315 }
12316 if (*input_line_pointer == ',')
12317 {
12318 ++input_line_pointer;
12319 fill_value = get_absolute_expression ();
12320 fill_ptr = &fill_value;
12321 }
12322 else
12323 fill_ptr = 0;
12324 if (temp)
12325 {
12326 segment_info_type *si = seg_info (now_seg);
12327 struct insn_label_list *l = si->label_list;
12328 /* Auto alignment should be switched on by next section change. */
12329 auto_align = 1;
12330 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12331 }
12332 else
12333 {
12334 auto_align = 0;
12335 }
12336
12337 demand_empty_rest_of_line ();
12338 }
12339
12340 static void
12341 s_change_sec (int sec)
12342 {
12343 segT seg;
12344
12345 #ifdef OBJ_ELF
12346 /* The ELF backend needs to know that we are changing sections, so
12347 that .previous works correctly. We could do something like check
12348 for an obj_section_change_hook macro, but that might be confusing
12349 as it would not be appropriate to use it in the section changing
12350 functions in read.c, since obj-elf.c intercepts those. FIXME:
12351 This should be cleaner, somehow. */
12352 if (IS_ELF)
12353 obj_elf_section_change_hook ();
12354 #endif
12355
12356 mips_emit_delays ();
12357 switch (sec)
12358 {
12359 case 't':
12360 s_text (0);
12361 break;
12362 case 'd':
12363 s_data (0);
12364 break;
12365 case 'b':
12366 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12367 demand_empty_rest_of_line ();
12368 break;
12369
12370 case 'r':
12371 seg = subseg_new (RDATA_SECTION_NAME,
12372 (subsegT) get_absolute_expression ());
12373 if (IS_ELF)
12374 {
12375 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12376 | SEC_READONLY | SEC_RELOC
12377 | SEC_DATA));
12378 if (strncmp (TARGET_OS, "elf", 3) != 0)
12379 record_alignment (seg, 4);
12380 }
12381 demand_empty_rest_of_line ();
12382 break;
12383
12384 case 's':
12385 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12386 if (IS_ELF)
12387 {
12388 bfd_set_section_flags (stdoutput, seg,
12389 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12390 if (strncmp (TARGET_OS, "elf", 3) != 0)
12391 record_alignment (seg, 4);
12392 }
12393 demand_empty_rest_of_line ();
12394 break;
12395 }
12396
12397 auto_align = 1;
12398 }
12399
12400 void
12401 s_change_section (int ignore ATTRIBUTE_UNUSED)
12402 {
12403 #ifdef OBJ_ELF
12404 char *section_name;
12405 char c;
12406 char next_c = 0;
12407 int section_type;
12408 int section_flag;
12409 int section_entry_size;
12410 int section_alignment;
12411
12412 if (!IS_ELF)
12413 return;
12414
12415 section_name = input_line_pointer;
12416 c = get_symbol_end ();
12417 if (c)
12418 next_c = *(input_line_pointer + 1);
12419
12420 /* Do we have .section Name<,"flags">? */
12421 if (c != ',' || (c == ',' && next_c == '"'))
12422 {
12423 /* just after name is now '\0'. */
12424 *input_line_pointer = c;
12425 input_line_pointer = section_name;
12426 obj_elf_section (ignore);
12427 return;
12428 }
12429 input_line_pointer++;
12430
12431 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12432 if (c == ',')
12433 section_type = get_absolute_expression ();
12434 else
12435 section_type = 0;
12436 if (*input_line_pointer++ == ',')
12437 section_flag = get_absolute_expression ();
12438 else
12439 section_flag = 0;
12440 if (*input_line_pointer++ == ',')
12441 section_entry_size = get_absolute_expression ();
12442 else
12443 section_entry_size = 0;
12444 if (*input_line_pointer++ == ',')
12445 section_alignment = get_absolute_expression ();
12446 else
12447 section_alignment = 0;
12448
12449 section_name = xstrdup (section_name);
12450
12451 /* When using the generic form of .section (as implemented by obj-elf.c),
12452 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12453 traditionally had to fall back on the more common @progbits instead.
12454
12455 There's nothing really harmful in this, since bfd will correct
12456 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
12457 means that, for backwards compatibility, the special_section entries
12458 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12459
12460 Even so, we shouldn't force users of the MIPS .section syntax to
12461 incorrectly label the sections as SHT_PROGBITS. The best compromise
12462 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12463 generic type-checking code. */
12464 if (section_type == SHT_MIPS_DWARF)
12465 section_type = SHT_PROGBITS;
12466
12467 obj_elf_change_section (section_name, section_type, section_flag,
12468 section_entry_size, 0, 0, 0);
12469
12470 if (now_seg->name != section_name)
12471 free (section_name);
12472 #endif /* OBJ_ELF */
12473 }
12474
12475 void
12476 mips_enable_auto_align (void)
12477 {
12478 auto_align = 1;
12479 }
12480
12481 static void
12482 s_cons (int log_size)
12483 {
12484 segment_info_type *si = seg_info (now_seg);
12485 struct insn_label_list *l = si->label_list;
12486 symbolS *label;
12487
12488 label = l != NULL ? l->label : NULL;
12489 mips_emit_delays ();
12490 if (log_size > 0 && auto_align)
12491 mips_align (log_size, 0, label);
12492 mips_clear_insn_labels ();
12493 cons (1 << log_size);
12494 }
12495
12496 static void
12497 s_float_cons (int type)
12498 {
12499 segment_info_type *si = seg_info (now_seg);
12500 struct insn_label_list *l = si->label_list;
12501 symbolS *label;
12502
12503 label = l != NULL ? l->label : NULL;
12504
12505 mips_emit_delays ();
12506
12507 if (auto_align)
12508 {
12509 if (type == 'd')
12510 mips_align (3, 0, label);
12511 else
12512 mips_align (2, 0, label);
12513 }
12514
12515 mips_clear_insn_labels ();
12516
12517 float_cons (type);
12518 }
12519
12520 /* Handle .globl. We need to override it because on Irix 5 you are
12521 permitted to say
12522 .globl foo .text
12523 where foo is an undefined symbol, to mean that foo should be
12524 considered to be the address of a function. */
12525
12526 static void
12527 s_mips_globl (int x ATTRIBUTE_UNUSED)
12528 {
12529 char *name;
12530 int c;
12531 symbolS *symbolP;
12532 flagword flag;
12533
12534 do
12535 {
12536 name = input_line_pointer;
12537 c = get_symbol_end ();
12538 symbolP = symbol_find_or_make (name);
12539 S_SET_EXTERNAL (symbolP);
12540
12541 *input_line_pointer = c;
12542 SKIP_WHITESPACE ();
12543
12544 /* On Irix 5, every global symbol that is not explicitly labelled as
12545 being a function is apparently labelled as being an object. */
12546 flag = BSF_OBJECT;
12547
12548 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12549 && (*input_line_pointer != ','))
12550 {
12551 char *secname;
12552 asection *sec;
12553
12554 secname = input_line_pointer;
12555 c = get_symbol_end ();
12556 sec = bfd_get_section_by_name (stdoutput, secname);
12557 if (sec == NULL)
12558 as_bad (_("%s: no such section"), secname);
12559 *input_line_pointer = c;
12560
12561 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12562 flag = BSF_FUNCTION;
12563 }
12564
12565 symbol_get_bfdsym (symbolP)->flags |= flag;
12566
12567 c = *input_line_pointer;
12568 if (c == ',')
12569 {
12570 input_line_pointer++;
12571 SKIP_WHITESPACE ();
12572 if (is_end_of_line[(unsigned char) *input_line_pointer])
12573 c = '\n';
12574 }
12575 }
12576 while (c == ',');
12577
12578 demand_empty_rest_of_line ();
12579 }
12580
12581 static void
12582 s_option (int x ATTRIBUTE_UNUSED)
12583 {
12584 char *opt;
12585 char c;
12586
12587 opt = input_line_pointer;
12588 c = get_symbol_end ();
12589
12590 if (*opt == 'O')
12591 {
12592 /* FIXME: What does this mean? */
12593 }
12594 else if (strncmp (opt, "pic", 3) == 0)
12595 {
12596 int i;
12597
12598 i = atoi (opt + 3);
12599 if (i == 0)
12600 mips_pic = NO_PIC;
12601 else if (i == 2)
12602 {
12603 mips_pic = SVR4_PIC;
12604 mips_abicalls = TRUE;
12605 }
12606 else
12607 as_bad (_(".option pic%d not supported"), i);
12608
12609 if (mips_pic == SVR4_PIC)
12610 {
12611 if (g_switch_seen && g_switch_value != 0)
12612 as_warn (_("-G may not be used with SVR4 PIC code"));
12613 g_switch_value = 0;
12614 bfd_set_gp_size (stdoutput, 0);
12615 }
12616 }
12617 else
12618 as_warn (_("Unrecognized option \"%s\""), opt);
12619
12620 *input_line_pointer = c;
12621 demand_empty_rest_of_line ();
12622 }
12623
12624 /* This structure is used to hold a stack of .set values. */
12625
12626 struct mips_option_stack
12627 {
12628 struct mips_option_stack *next;
12629 struct mips_set_options options;
12630 };
12631
12632 static struct mips_option_stack *mips_opts_stack;
12633
12634 /* Handle the .set pseudo-op. */
12635
12636 static void
12637 s_mipsset (int x ATTRIBUTE_UNUSED)
12638 {
12639 char *name = input_line_pointer, ch;
12640
12641 while (!is_end_of_line[(unsigned char) *input_line_pointer])
12642 ++input_line_pointer;
12643 ch = *input_line_pointer;
12644 *input_line_pointer = '\0';
12645
12646 if (strcmp (name, "reorder") == 0)
12647 {
12648 if (mips_opts.noreorder)
12649 end_noreorder ();
12650 }
12651 else if (strcmp (name, "noreorder") == 0)
12652 {
12653 if (!mips_opts.noreorder)
12654 start_noreorder ();
12655 }
12656 else if (strncmp (name, "at=", 3) == 0)
12657 {
12658 char *s = name + 3;
12659
12660 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12661 as_bad (_("Unrecognized register name `%s'"), s);
12662 }
12663 else if (strcmp (name, "at") == 0)
12664 {
12665 mips_opts.at = ATREG;
12666 }
12667 else if (strcmp (name, "noat") == 0)
12668 {
12669 mips_opts.at = ZERO;
12670 }
12671 else if (strcmp (name, "macro") == 0)
12672 {
12673 mips_opts.warn_about_macros = 0;
12674 }
12675 else if (strcmp (name, "nomacro") == 0)
12676 {
12677 if (mips_opts.noreorder == 0)
12678 as_bad (_("`noreorder' must be set before `nomacro'"));
12679 mips_opts.warn_about_macros = 1;
12680 }
12681 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12682 {
12683 mips_opts.nomove = 0;
12684 }
12685 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12686 {
12687 mips_opts.nomove = 1;
12688 }
12689 else if (strcmp (name, "bopt") == 0)
12690 {
12691 mips_opts.nobopt = 0;
12692 }
12693 else if (strcmp (name, "nobopt") == 0)
12694 {
12695 mips_opts.nobopt = 1;
12696 }
12697 else if (strcmp (name, "gp=default") == 0)
12698 mips_opts.gp32 = file_mips_gp32;
12699 else if (strcmp (name, "gp=32") == 0)
12700 mips_opts.gp32 = 1;
12701 else if (strcmp (name, "gp=64") == 0)
12702 {
12703 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12704 as_warn ("%s isa does not support 64-bit registers",
12705 mips_cpu_info_from_isa (mips_opts.isa)->name);
12706 mips_opts.gp32 = 0;
12707 }
12708 else if (strcmp (name, "fp=default") == 0)
12709 mips_opts.fp32 = file_mips_fp32;
12710 else if (strcmp (name, "fp=32") == 0)
12711 mips_opts.fp32 = 1;
12712 else if (strcmp (name, "fp=64") == 0)
12713 {
12714 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12715 as_warn ("%s isa does not support 64-bit floating point registers",
12716 mips_cpu_info_from_isa (mips_opts.isa)->name);
12717 mips_opts.fp32 = 0;
12718 }
12719 else if (strcmp (name, "softfloat") == 0)
12720 mips_opts.soft_float = 1;
12721 else if (strcmp (name, "hardfloat") == 0)
12722 mips_opts.soft_float = 0;
12723 else if (strcmp (name, "singlefloat") == 0)
12724 mips_opts.single_float = 1;
12725 else if (strcmp (name, "doublefloat") == 0)
12726 mips_opts.single_float = 0;
12727 else if (strcmp (name, "mips16") == 0
12728 || strcmp (name, "MIPS-16") == 0)
12729 mips_opts.mips16 = 1;
12730 else if (strcmp (name, "nomips16") == 0
12731 || strcmp (name, "noMIPS-16") == 0)
12732 mips_opts.mips16 = 0;
12733 else if (strcmp (name, "smartmips") == 0)
12734 {
12735 if (!ISA_SUPPORTS_SMARTMIPS)
12736 as_warn ("%s ISA does not support SmartMIPS ASE",
12737 mips_cpu_info_from_isa (mips_opts.isa)->name);
12738 mips_opts.ase_smartmips = 1;
12739 }
12740 else if (strcmp (name, "nosmartmips") == 0)
12741 mips_opts.ase_smartmips = 0;
12742 else if (strcmp (name, "mips3d") == 0)
12743 mips_opts.ase_mips3d = 1;
12744 else if (strcmp (name, "nomips3d") == 0)
12745 mips_opts.ase_mips3d = 0;
12746 else if (strcmp (name, "mdmx") == 0)
12747 mips_opts.ase_mdmx = 1;
12748 else if (strcmp (name, "nomdmx") == 0)
12749 mips_opts.ase_mdmx = 0;
12750 else if (strcmp (name, "dsp") == 0)
12751 {
12752 if (!ISA_SUPPORTS_DSP_ASE)
12753 as_warn ("%s ISA does not support DSP ASE",
12754 mips_cpu_info_from_isa (mips_opts.isa)->name);
12755 mips_opts.ase_dsp = 1;
12756 mips_opts.ase_dspr2 = 0;
12757 }
12758 else if (strcmp (name, "nodsp") == 0)
12759 {
12760 mips_opts.ase_dsp = 0;
12761 mips_opts.ase_dspr2 = 0;
12762 }
12763 else if (strcmp (name, "dspr2") == 0)
12764 {
12765 if (!ISA_SUPPORTS_DSPR2_ASE)
12766 as_warn ("%s ISA does not support DSP R2 ASE",
12767 mips_cpu_info_from_isa (mips_opts.isa)->name);
12768 mips_opts.ase_dspr2 = 1;
12769 mips_opts.ase_dsp = 1;
12770 }
12771 else if (strcmp (name, "nodspr2") == 0)
12772 {
12773 mips_opts.ase_dspr2 = 0;
12774 mips_opts.ase_dsp = 0;
12775 }
12776 else if (strcmp (name, "mt") == 0)
12777 {
12778 if (!ISA_SUPPORTS_MT_ASE)
12779 as_warn ("%s ISA does not support MT ASE",
12780 mips_cpu_info_from_isa (mips_opts.isa)->name);
12781 mips_opts.ase_mt = 1;
12782 }
12783 else if (strcmp (name, "nomt") == 0)
12784 mips_opts.ase_mt = 0;
12785 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12786 {
12787 int reset = 0;
12788
12789 /* Permit the user to change the ISA and architecture on the fly.
12790 Needless to say, misuse can cause serious problems. */
12791 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12792 {
12793 reset = 1;
12794 mips_opts.isa = file_mips_isa;
12795 mips_opts.arch = file_mips_arch;
12796 }
12797 else if (strncmp (name, "arch=", 5) == 0)
12798 {
12799 const struct mips_cpu_info *p;
12800
12801 p = mips_parse_cpu("internal use", name + 5);
12802 if (!p)
12803 as_bad (_("unknown architecture %s"), name + 5);
12804 else
12805 {
12806 mips_opts.arch = p->cpu;
12807 mips_opts.isa = p->isa;
12808 }
12809 }
12810 else if (strncmp (name, "mips", 4) == 0)
12811 {
12812 const struct mips_cpu_info *p;
12813
12814 p = mips_parse_cpu("internal use", name);
12815 if (!p)
12816 as_bad (_("unknown ISA level %s"), name + 4);
12817 else
12818 {
12819 mips_opts.arch = p->cpu;
12820 mips_opts.isa = p->isa;
12821 }
12822 }
12823 else
12824 as_bad (_("unknown ISA or architecture %s"), name);
12825
12826 switch (mips_opts.isa)
12827 {
12828 case 0:
12829 break;
12830 case ISA_MIPS1:
12831 case ISA_MIPS2:
12832 case ISA_MIPS32:
12833 case ISA_MIPS32R2:
12834 mips_opts.gp32 = 1;
12835 mips_opts.fp32 = 1;
12836 break;
12837 case ISA_MIPS3:
12838 case ISA_MIPS4:
12839 case ISA_MIPS5:
12840 case ISA_MIPS64:
12841 case ISA_MIPS64R2:
12842 mips_opts.gp32 = 0;
12843 mips_opts.fp32 = 0;
12844 break;
12845 default:
12846 as_bad (_("unknown ISA level %s"), name + 4);
12847 break;
12848 }
12849 if (reset)
12850 {
12851 mips_opts.gp32 = file_mips_gp32;
12852 mips_opts.fp32 = file_mips_fp32;
12853 }
12854 }
12855 else if (strcmp (name, "autoextend") == 0)
12856 mips_opts.noautoextend = 0;
12857 else if (strcmp (name, "noautoextend") == 0)
12858 mips_opts.noautoextend = 1;
12859 else if (strcmp (name, "push") == 0)
12860 {
12861 struct mips_option_stack *s;
12862
12863 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12864 s->next = mips_opts_stack;
12865 s->options = mips_opts;
12866 mips_opts_stack = s;
12867 }
12868 else if (strcmp (name, "pop") == 0)
12869 {
12870 struct mips_option_stack *s;
12871
12872 s = mips_opts_stack;
12873 if (s == NULL)
12874 as_bad (_(".set pop with no .set push"));
12875 else
12876 {
12877 /* If we're changing the reorder mode we need to handle
12878 delay slots correctly. */
12879 if (s->options.noreorder && ! mips_opts.noreorder)
12880 start_noreorder ();
12881 else if (! s->options.noreorder && mips_opts.noreorder)
12882 end_noreorder ();
12883
12884 mips_opts = s->options;
12885 mips_opts_stack = s->next;
12886 free (s);
12887 }
12888 }
12889 else if (strcmp (name, "sym32") == 0)
12890 mips_opts.sym32 = TRUE;
12891 else if (strcmp (name, "nosym32") == 0)
12892 mips_opts.sym32 = FALSE;
12893 else if (strchr (name, ','))
12894 {
12895 /* Generic ".set" directive; use the generic handler. */
12896 *input_line_pointer = ch;
12897 input_line_pointer = name;
12898 s_set (0);
12899 return;
12900 }
12901 else
12902 {
12903 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12904 }
12905 *input_line_pointer = ch;
12906 demand_empty_rest_of_line ();
12907 }
12908
12909 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
12910 .option pic2. It means to generate SVR4 PIC calls. */
12911
12912 static void
12913 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12914 {
12915 mips_pic = SVR4_PIC;
12916 mips_abicalls = TRUE;
12917
12918 if (g_switch_seen && g_switch_value != 0)
12919 as_warn (_("-G may not be used with SVR4 PIC code"));
12920 g_switch_value = 0;
12921
12922 bfd_set_gp_size (stdoutput, 0);
12923 demand_empty_rest_of_line ();
12924 }
12925
12926 /* Handle the .cpload pseudo-op. This is used when generating SVR4
12927 PIC code. It sets the $gp register for the function based on the
12928 function address, which is in the register named in the argument.
12929 This uses a relocation against _gp_disp, which is handled specially
12930 by the linker. The result is:
12931 lui $gp,%hi(_gp_disp)
12932 addiu $gp,$gp,%lo(_gp_disp)
12933 addu $gp,$gp,.cpload argument
12934 The .cpload argument is normally $25 == $t9.
12935
12936 The -mno-shared option changes this to:
12937 lui $gp,%hi(__gnu_local_gp)
12938 addiu $gp,$gp,%lo(__gnu_local_gp)
12939 and the argument is ignored. This saves an instruction, but the
12940 resulting code is not position independent; it uses an absolute
12941 address for __gnu_local_gp. Thus code assembled with -mno-shared
12942 can go into an ordinary executable, but not into a shared library. */
12943
12944 static void
12945 s_cpload (int ignore ATTRIBUTE_UNUSED)
12946 {
12947 expressionS ex;
12948 int reg;
12949 int in_shared;
12950
12951 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12952 .cpload is ignored. */
12953 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12954 {
12955 s_ignore (0);
12956 return;
12957 }
12958
12959 /* .cpload should be in a .set noreorder section. */
12960 if (mips_opts.noreorder == 0)
12961 as_warn (_(".cpload not in noreorder section"));
12962
12963 reg = tc_get_register (0);
12964
12965 /* If we need to produce a 64-bit address, we are better off using
12966 the default instruction sequence. */
12967 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12968
12969 ex.X_op = O_symbol;
12970 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12971 "__gnu_local_gp");
12972 ex.X_op_symbol = NULL;
12973 ex.X_add_number = 0;
12974
12975 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
12976 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12977
12978 macro_start ();
12979 macro_build_lui (&ex, mips_gp_register);
12980 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12981 mips_gp_register, BFD_RELOC_LO16);
12982 if (in_shared)
12983 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12984 mips_gp_register, reg);
12985 macro_end ();
12986
12987 demand_empty_rest_of_line ();
12988 }
12989
12990 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12991 .cpsetup $reg1, offset|$reg2, label
12992
12993 If offset is given, this results in:
12994 sd $gp, offset($sp)
12995 lui $gp, %hi(%neg(%gp_rel(label)))
12996 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12997 daddu $gp, $gp, $reg1
12998
12999 If $reg2 is given, this results in:
13000 daddu $reg2, $gp, $0
13001 lui $gp, %hi(%neg(%gp_rel(label)))
13002 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13003 daddu $gp, $gp, $reg1
13004 $reg1 is normally $25 == $t9.
13005
13006 The -mno-shared option replaces the last three instructions with
13007 lui $gp,%hi(_gp)
13008 addiu $gp,$gp,%lo(_gp) */
13009
13010 static void
13011 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13012 {
13013 expressionS ex_off;
13014 expressionS ex_sym;
13015 int reg1;
13016
13017 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13018 We also need NewABI support. */
13019 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13020 {
13021 s_ignore (0);
13022 return;
13023 }
13024
13025 reg1 = tc_get_register (0);
13026 SKIP_WHITESPACE ();
13027 if (*input_line_pointer != ',')
13028 {
13029 as_bad (_("missing argument separator ',' for .cpsetup"));
13030 return;
13031 }
13032 else
13033 ++input_line_pointer;
13034 SKIP_WHITESPACE ();
13035 if (*input_line_pointer == '$')
13036 {
13037 mips_cpreturn_register = tc_get_register (0);
13038 mips_cpreturn_offset = -1;
13039 }
13040 else
13041 {
13042 mips_cpreturn_offset = get_absolute_expression ();
13043 mips_cpreturn_register = -1;
13044 }
13045 SKIP_WHITESPACE ();
13046 if (*input_line_pointer != ',')
13047 {
13048 as_bad (_("missing argument separator ',' for .cpsetup"));
13049 return;
13050 }
13051 else
13052 ++input_line_pointer;
13053 SKIP_WHITESPACE ();
13054 expression (&ex_sym);
13055
13056 macro_start ();
13057 if (mips_cpreturn_register == -1)
13058 {
13059 ex_off.X_op = O_constant;
13060 ex_off.X_add_symbol = NULL;
13061 ex_off.X_op_symbol = NULL;
13062 ex_off.X_add_number = mips_cpreturn_offset;
13063
13064 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13065 BFD_RELOC_LO16, SP);
13066 }
13067 else
13068 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13069 mips_gp_register, 0);
13070
13071 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13072 {
13073 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13074 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13075 BFD_RELOC_HI16_S);
13076
13077 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13078 mips_gp_register, -1, BFD_RELOC_GPREL16,
13079 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13080
13081 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13082 mips_gp_register, reg1);
13083 }
13084 else
13085 {
13086 expressionS ex;
13087
13088 ex.X_op = O_symbol;
13089 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13090 ex.X_op_symbol = NULL;
13091 ex.X_add_number = 0;
13092
13093 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13094 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13095
13096 macro_build_lui (&ex, mips_gp_register);
13097 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13098 mips_gp_register, BFD_RELOC_LO16);
13099 }
13100
13101 macro_end ();
13102
13103 demand_empty_rest_of_line ();
13104 }
13105
13106 static void
13107 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13108 {
13109 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13110 .cplocal is ignored. */
13111 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13112 {
13113 s_ignore (0);
13114 return;
13115 }
13116
13117 mips_gp_register = tc_get_register (0);
13118 demand_empty_rest_of_line ();
13119 }
13120
13121 /* Handle the .cprestore pseudo-op. This stores $gp into a given
13122 offset from $sp. The offset is remembered, and after making a PIC
13123 call $gp is restored from that location. */
13124
13125 static void
13126 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13127 {
13128 expressionS ex;
13129
13130 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13131 .cprestore is ignored. */
13132 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13133 {
13134 s_ignore (0);
13135 return;
13136 }
13137
13138 mips_cprestore_offset = get_absolute_expression ();
13139 mips_cprestore_valid = 1;
13140
13141 ex.X_op = O_constant;
13142 ex.X_add_symbol = NULL;
13143 ex.X_op_symbol = NULL;
13144 ex.X_add_number = mips_cprestore_offset;
13145
13146 macro_start ();
13147 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13148 SP, HAVE_64BIT_ADDRESSES);
13149 macro_end ();
13150
13151 demand_empty_rest_of_line ();
13152 }
13153
13154 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13155 was given in the preceding .cpsetup, it results in:
13156 ld $gp, offset($sp)
13157
13158 If a register $reg2 was given there, it results in:
13159 daddu $gp, $reg2, $0 */
13160
13161 static void
13162 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13163 {
13164 expressionS ex;
13165
13166 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13167 We also need NewABI support. */
13168 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13169 {
13170 s_ignore (0);
13171 return;
13172 }
13173
13174 macro_start ();
13175 if (mips_cpreturn_register == -1)
13176 {
13177 ex.X_op = O_constant;
13178 ex.X_add_symbol = NULL;
13179 ex.X_op_symbol = NULL;
13180 ex.X_add_number = mips_cpreturn_offset;
13181
13182 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13183 }
13184 else
13185 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13186 mips_cpreturn_register, 0);
13187 macro_end ();
13188
13189 demand_empty_rest_of_line ();
13190 }
13191
13192 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13193 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13194 use in DWARF debug information. */
13195
13196 static void
13197 s_dtprel_internal (size_t bytes)
13198 {
13199 expressionS ex;
13200 char *p;
13201
13202 expression (&ex);
13203
13204 if (ex.X_op != O_symbol)
13205 {
13206 as_bad (_("Unsupported use of %s"), (bytes == 8
13207 ? ".dtpreldword"
13208 : ".dtprelword"));
13209 ignore_rest_of_line ();
13210 }
13211
13212 p = frag_more (bytes);
13213 md_number_to_chars (p, 0, bytes);
13214 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13215 (bytes == 8
13216 ? BFD_RELOC_MIPS_TLS_DTPREL64
13217 : BFD_RELOC_MIPS_TLS_DTPREL32));
13218
13219 demand_empty_rest_of_line ();
13220 }
13221
13222 /* Handle .dtprelword. */
13223
13224 static void
13225 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13226 {
13227 s_dtprel_internal (4);
13228 }
13229
13230 /* Handle .dtpreldword. */
13231
13232 static void
13233 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13234 {
13235 s_dtprel_internal (8);
13236 }
13237
13238 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13239 code. It sets the offset to use in gp_rel relocations. */
13240
13241 static void
13242 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13243 {
13244 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13245 We also need NewABI support. */
13246 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13247 {
13248 s_ignore (0);
13249 return;
13250 }
13251
13252 mips_gprel_offset = get_absolute_expression ();
13253
13254 demand_empty_rest_of_line ();
13255 }
13256
13257 /* Handle the .gpword pseudo-op. This is used when generating PIC
13258 code. It generates a 32 bit GP relative reloc. */
13259
13260 static void
13261 s_gpword (int ignore ATTRIBUTE_UNUSED)
13262 {
13263 segment_info_type *si;
13264 struct insn_label_list *l;
13265 symbolS *label;
13266 expressionS ex;
13267 char *p;
13268
13269 /* When not generating PIC code, this is treated as .word. */
13270 if (mips_pic != SVR4_PIC)
13271 {
13272 s_cons (2);
13273 return;
13274 }
13275
13276 si = seg_info (now_seg);
13277 l = si->label_list;
13278 label = l != NULL ? l->label : NULL;
13279 mips_emit_delays ();
13280 if (auto_align)
13281 mips_align (2, 0, label);
13282 mips_clear_insn_labels ();
13283
13284 expression (&ex);
13285
13286 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13287 {
13288 as_bad (_("Unsupported use of .gpword"));
13289 ignore_rest_of_line ();
13290 }
13291
13292 p = frag_more (4);
13293 md_number_to_chars (p, 0, 4);
13294 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13295 BFD_RELOC_GPREL32);
13296
13297 demand_empty_rest_of_line ();
13298 }
13299
13300 static void
13301 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13302 {
13303 segment_info_type *si;
13304 struct insn_label_list *l;
13305 symbolS *label;
13306 expressionS ex;
13307 char *p;
13308
13309 /* When not generating PIC code, this is treated as .dword. */
13310 if (mips_pic != SVR4_PIC)
13311 {
13312 s_cons (3);
13313 return;
13314 }
13315
13316 si = seg_info (now_seg);
13317 l = si->label_list;
13318 label = l != NULL ? l->label : NULL;
13319 mips_emit_delays ();
13320 if (auto_align)
13321 mips_align (3, 0, label);
13322 mips_clear_insn_labels ();
13323
13324 expression (&ex);
13325
13326 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13327 {
13328 as_bad (_("Unsupported use of .gpdword"));
13329 ignore_rest_of_line ();
13330 }
13331
13332 p = frag_more (8);
13333 md_number_to_chars (p, 0, 8);
13334 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13335 BFD_RELOC_GPREL32)->fx_tcbit = 1;
13336
13337 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
13338 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13339 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13340
13341 demand_empty_rest_of_line ();
13342 }
13343
13344 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
13345 tables in SVR4 PIC code. */
13346
13347 static void
13348 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13349 {
13350 int reg;
13351
13352 /* This is ignored when not generating SVR4 PIC code. */
13353 if (mips_pic != SVR4_PIC)
13354 {
13355 s_ignore (0);
13356 return;
13357 }
13358
13359 /* Add $gp to the register named as an argument. */
13360 macro_start ();
13361 reg = tc_get_register (0);
13362 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13363 macro_end ();
13364
13365 demand_empty_rest_of_line ();
13366 }
13367
13368 /* Handle the .insn pseudo-op. This marks instruction labels in
13369 mips16 mode. This permits the linker to handle them specially,
13370 such as generating jalx instructions when needed. We also make
13371 them odd for the duration of the assembly, in order to generate the
13372 right sort of code. We will make them even in the adjust_symtab
13373 routine, while leaving them marked. This is convenient for the
13374 debugger and the disassembler. The linker knows to make them odd
13375 again. */
13376
13377 static void
13378 s_insn (int ignore ATTRIBUTE_UNUSED)
13379 {
13380 mips16_mark_labels ();
13381
13382 demand_empty_rest_of_line ();
13383 }
13384
13385 /* Handle a .stabn directive. We need these in order to mark a label
13386 as being a mips16 text label correctly. Sometimes the compiler
13387 will emit a label, followed by a .stabn, and then switch sections.
13388 If the label and .stabn are in mips16 mode, then the label is
13389 really a mips16 text label. */
13390
13391 static void
13392 s_mips_stab (int type)
13393 {
13394 if (type == 'n')
13395 mips16_mark_labels ();
13396
13397 s_stab (type);
13398 }
13399
13400 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
13401
13402 static void
13403 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13404 {
13405 char *name;
13406 int c;
13407 symbolS *symbolP;
13408 expressionS exp;
13409
13410 name = input_line_pointer;
13411 c = get_symbol_end ();
13412 symbolP = symbol_find_or_make (name);
13413 S_SET_WEAK (symbolP);
13414 *input_line_pointer = c;
13415
13416 SKIP_WHITESPACE ();
13417
13418 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13419 {
13420 if (S_IS_DEFINED (symbolP))
13421 {
13422 as_bad ("ignoring attempt to redefine symbol %s",
13423 S_GET_NAME (symbolP));
13424 ignore_rest_of_line ();
13425 return;
13426 }
13427
13428 if (*input_line_pointer == ',')
13429 {
13430 ++input_line_pointer;
13431 SKIP_WHITESPACE ();
13432 }
13433
13434 expression (&exp);
13435 if (exp.X_op != O_symbol)
13436 {
13437 as_bad ("bad .weakext directive");
13438 ignore_rest_of_line ();
13439 return;
13440 }
13441 symbol_set_value_expression (symbolP, &exp);
13442 }
13443
13444 demand_empty_rest_of_line ();
13445 }
13446
13447 /* Parse a register string into a number. Called from the ECOFF code
13448 to parse .frame. The argument is non-zero if this is the frame
13449 register, so that we can record it in mips_frame_reg. */
13450
13451 int
13452 tc_get_register (int frame)
13453 {
13454 unsigned int reg;
13455
13456 SKIP_WHITESPACE ();
13457 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13458 reg = 0;
13459 if (frame)
13460 {
13461 mips_frame_reg = reg != 0 ? reg : SP;
13462 mips_frame_reg_valid = 1;
13463 mips_cprestore_valid = 0;
13464 }
13465 return reg;
13466 }
13467
13468 valueT
13469 md_section_align (asection *seg, valueT addr)
13470 {
13471 int align = bfd_get_section_alignment (stdoutput, seg);
13472
13473 if (IS_ELF)
13474 {
13475 /* We don't need to align ELF sections to the full alignment.
13476 However, Irix 5 may prefer that we align them at least to a 16
13477 byte boundary. We don't bother to align the sections if we
13478 are targeted for an embedded system. */
13479 if (strncmp (TARGET_OS, "elf", 3) == 0)
13480 return addr;
13481 if (align > 4)
13482 align = 4;
13483 }
13484
13485 return ((addr + (1 << align) - 1) & (-1 << align));
13486 }
13487
13488 /* Utility routine, called from above as well. If called while the
13489 input file is still being read, it's only an approximation. (For
13490 example, a symbol may later become defined which appeared to be
13491 undefined earlier.) */
13492
13493 static int
13494 nopic_need_relax (symbolS *sym, int before_relaxing)
13495 {
13496 if (sym == 0)
13497 return 0;
13498
13499 if (g_switch_value > 0)
13500 {
13501 const char *symname;
13502 int change;
13503
13504 /* Find out whether this symbol can be referenced off the $gp
13505 register. It can be if it is smaller than the -G size or if
13506 it is in the .sdata or .sbss section. Certain symbols can
13507 not be referenced off the $gp, although it appears as though
13508 they can. */
13509 symname = S_GET_NAME (sym);
13510 if (symname != (const char *) NULL
13511 && (strcmp (symname, "eprol") == 0
13512 || strcmp (symname, "etext") == 0
13513 || strcmp (symname, "_gp") == 0
13514 || strcmp (symname, "edata") == 0
13515 || strcmp (symname, "_fbss") == 0
13516 || strcmp (symname, "_fdata") == 0
13517 || strcmp (symname, "_ftext") == 0
13518 || strcmp (symname, "end") == 0
13519 || strcmp (symname, "_gp_disp") == 0))
13520 change = 1;
13521 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13522 && (0
13523 #ifndef NO_ECOFF_DEBUGGING
13524 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13525 && (symbol_get_obj (sym)->ecoff_extern_size
13526 <= g_switch_value))
13527 #endif
13528 /* We must defer this decision until after the whole
13529 file has been read, since there might be a .extern
13530 after the first use of this symbol. */
13531 || (before_relaxing
13532 #ifndef NO_ECOFF_DEBUGGING
13533 && symbol_get_obj (sym)->ecoff_extern_size == 0
13534 #endif
13535 && S_GET_VALUE (sym) == 0)
13536 || (S_GET_VALUE (sym) != 0
13537 && S_GET_VALUE (sym) <= g_switch_value)))
13538 change = 0;
13539 else
13540 {
13541 const char *segname;
13542
13543 segname = segment_name (S_GET_SEGMENT (sym));
13544 assert (strcmp (segname, ".lit8") != 0
13545 && strcmp (segname, ".lit4") != 0);
13546 change = (strcmp (segname, ".sdata") != 0
13547 && strcmp (segname, ".sbss") != 0
13548 && strncmp (segname, ".sdata.", 7) != 0
13549 && strncmp (segname, ".sbss.", 6) != 0
13550 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13551 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13552 }
13553 return change;
13554 }
13555 else
13556 /* We are not optimizing for the $gp register. */
13557 return 1;
13558 }
13559
13560
13561 /* Return true if the given symbol should be considered local for SVR4 PIC. */
13562
13563 static bfd_boolean
13564 pic_need_relax (symbolS *sym, asection *segtype)
13565 {
13566 asection *symsec;
13567
13568 /* Handle the case of a symbol equated to another symbol. */
13569 while (symbol_equated_reloc_p (sym))
13570 {
13571 symbolS *n;
13572
13573 /* It's possible to get a loop here in a badly written program. */
13574 n = symbol_get_value_expression (sym)->X_add_symbol;
13575 if (n == sym)
13576 break;
13577 sym = n;
13578 }
13579
13580 if (symbol_section_p (sym))
13581 return TRUE;
13582
13583 symsec = S_GET_SEGMENT (sym);
13584
13585 /* This must duplicate the test in adjust_reloc_syms. */
13586 return (symsec != &bfd_und_section
13587 && symsec != &bfd_abs_section
13588 && !bfd_is_com_section (symsec)
13589 && !s_is_linkonce (sym, segtype)
13590 #ifdef OBJ_ELF
13591 /* A global or weak symbol is treated as external. */
13592 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13593 #endif
13594 );
13595 }
13596
13597
13598 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13599 extended opcode. SEC is the section the frag is in. */
13600
13601 static int
13602 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13603 {
13604 int type;
13605 const struct mips16_immed_operand *op;
13606 offsetT val;
13607 int mintiny, maxtiny;
13608 segT symsec;
13609 fragS *sym_frag;
13610
13611 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13612 return 0;
13613 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13614 return 1;
13615
13616 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13617 op = mips16_immed_operands;
13618 while (op->type != type)
13619 {
13620 ++op;
13621 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13622 }
13623
13624 if (op->unsp)
13625 {
13626 if (type == '<' || type == '>' || type == '[' || type == ']')
13627 {
13628 mintiny = 1;
13629 maxtiny = 1 << op->nbits;
13630 }
13631 else
13632 {
13633 mintiny = 0;
13634 maxtiny = (1 << op->nbits) - 1;
13635 }
13636 }
13637 else
13638 {
13639 mintiny = - (1 << (op->nbits - 1));
13640 maxtiny = (1 << (op->nbits - 1)) - 1;
13641 }
13642
13643 sym_frag = symbol_get_frag (fragp->fr_symbol);
13644 val = S_GET_VALUE (fragp->fr_symbol);
13645 symsec = S_GET_SEGMENT (fragp->fr_symbol);
13646
13647 if (op->pcrel)
13648 {
13649 addressT addr;
13650
13651 /* We won't have the section when we are called from
13652 mips_relax_frag. However, we will always have been called
13653 from md_estimate_size_before_relax first. If this is a
13654 branch to a different section, we mark it as such. If SEC is
13655 NULL, and the frag is not marked, then it must be a branch to
13656 the same section. */
13657 if (sec == NULL)
13658 {
13659 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13660 return 1;
13661 }
13662 else
13663 {
13664 /* Must have been called from md_estimate_size_before_relax. */
13665 if (symsec != sec)
13666 {
13667 fragp->fr_subtype =
13668 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13669
13670 /* FIXME: We should support this, and let the linker
13671 catch branches and loads that are out of range. */
13672 as_bad_where (fragp->fr_file, fragp->fr_line,
13673 _("unsupported PC relative reference to different section"));
13674
13675 return 1;
13676 }
13677 if (fragp != sym_frag && sym_frag->fr_address == 0)
13678 /* Assume non-extended on the first relaxation pass.
13679 The address we have calculated will be bogus if this is
13680 a forward branch to another frag, as the forward frag
13681 will have fr_address == 0. */
13682 return 0;
13683 }
13684
13685 /* In this case, we know for sure that the symbol fragment is in
13686 the same section. If the relax_marker of the symbol fragment
13687 differs from the relax_marker of this fragment, we have not
13688 yet adjusted the symbol fragment fr_address. We want to add
13689 in STRETCH in order to get a better estimate of the address.
13690 This particularly matters because of the shift bits. */
13691 if (stretch != 0
13692 && sym_frag->relax_marker != fragp->relax_marker)
13693 {
13694 fragS *f;
13695
13696 /* Adjust stretch for any alignment frag. Note that if have
13697 been expanding the earlier code, the symbol may be
13698 defined in what appears to be an earlier frag. FIXME:
13699 This doesn't handle the fr_subtype field, which specifies
13700 a maximum number of bytes to skip when doing an
13701 alignment. */
13702 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13703 {
13704 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13705 {
13706 if (stretch < 0)
13707 stretch = - ((- stretch)
13708 & ~ ((1 << (int) f->fr_offset) - 1));
13709 else
13710 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13711 if (stretch == 0)
13712 break;
13713 }
13714 }
13715 if (f != NULL)
13716 val += stretch;
13717 }
13718
13719 addr = fragp->fr_address + fragp->fr_fix;
13720
13721 /* The base address rules are complicated. The base address of
13722 a branch is the following instruction. The base address of a
13723 PC relative load or add is the instruction itself, but if it
13724 is in a delay slot (in which case it can not be extended) use
13725 the address of the instruction whose delay slot it is in. */
13726 if (type == 'p' || type == 'q')
13727 {
13728 addr += 2;
13729
13730 /* If we are currently assuming that this frag should be
13731 extended, then, the current address is two bytes
13732 higher. */
13733 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13734 addr += 2;
13735
13736 /* Ignore the low bit in the target, since it will be set
13737 for a text label. */
13738 if ((val & 1) != 0)
13739 --val;
13740 }
13741 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13742 addr -= 4;
13743 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13744 addr -= 2;
13745
13746 val -= addr & ~ ((1 << op->shift) - 1);
13747
13748 /* Branch offsets have an implicit 0 in the lowest bit. */
13749 if (type == 'p' || type == 'q')
13750 val /= 2;
13751
13752 /* If any of the shifted bits are set, we must use an extended
13753 opcode. If the address depends on the size of this
13754 instruction, this can lead to a loop, so we arrange to always
13755 use an extended opcode. We only check this when we are in
13756 the main relaxation loop, when SEC is NULL. */
13757 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13758 {
13759 fragp->fr_subtype =
13760 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13761 return 1;
13762 }
13763
13764 /* If we are about to mark a frag as extended because the value
13765 is precisely maxtiny + 1, then there is a chance of an
13766 infinite loop as in the following code:
13767 la $4,foo
13768 .skip 1020
13769 .align 2
13770 foo:
13771 In this case when the la is extended, foo is 0x3fc bytes
13772 away, so the la can be shrunk, but then foo is 0x400 away, so
13773 the la must be extended. To avoid this loop, we mark the
13774 frag as extended if it was small, and is about to become
13775 extended with a value of maxtiny + 1. */
13776 if (val == ((maxtiny + 1) << op->shift)
13777 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13778 && sec == NULL)
13779 {
13780 fragp->fr_subtype =
13781 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13782 return 1;
13783 }
13784 }
13785 else if (symsec != absolute_section && sec != NULL)
13786 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13787
13788 if ((val & ((1 << op->shift) - 1)) != 0
13789 || val < (mintiny << op->shift)
13790 || val > (maxtiny << op->shift))
13791 return 1;
13792 else
13793 return 0;
13794 }
13795
13796 /* Compute the length of a branch sequence, and adjust the
13797 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13798 worst-case length is computed, with UPDATE being used to indicate
13799 whether an unconditional (-1), branch-likely (+1) or regular (0)
13800 branch is to be computed. */
13801 static int
13802 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13803 {
13804 bfd_boolean toofar;
13805 int length;
13806
13807 if (fragp
13808 && S_IS_DEFINED (fragp->fr_symbol)
13809 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13810 {
13811 addressT addr;
13812 offsetT val;
13813
13814 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13815
13816 addr = fragp->fr_address + fragp->fr_fix + 4;
13817
13818 val -= addr;
13819
13820 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13821 }
13822 else if (fragp)
13823 /* If the symbol is not defined or it's in a different segment,
13824 assume the user knows what's going on and emit a short
13825 branch. */
13826 toofar = FALSE;
13827 else
13828 toofar = TRUE;
13829
13830 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13831 fragp->fr_subtype
13832 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13833 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13834 RELAX_BRANCH_LINK (fragp->fr_subtype),
13835 toofar);
13836
13837 length = 4;
13838 if (toofar)
13839 {
13840 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13841 length += 8;
13842
13843 if (mips_pic != NO_PIC)
13844 {
13845 /* Additional space for PIC loading of target address. */
13846 length += 8;
13847 if (mips_opts.isa == ISA_MIPS1)
13848 /* Additional space for $at-stabilizing nop. */
13849 length += 4;
13850 }
13851
13852 /* If branch is conditional. */
13853 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13854 length += 8;
13855 }
13856
13857 return length;
13858 }
13859
13860 /* Estimate the size of a frag before relaxing. Unless this is the
13861 mips16, we are not really relaxing here, and the final size is
13862 encoded in the subtype information. For the mips16, we have to
13863 decide whether we are using an extended opcode or not. */
13864
13865 int
13866 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13867 {
13868 int change;
13869
13870 if (RELAX_BRANCH_P (fragp->fr_subtype))
13871 {
13872
13873 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13874
13875 return fragp->fr_var;
13876 }
13877
13878 if (RELAX_MIPS16_P (fragp->fr_subtype))
13879 /* We don't want to modify the EXTENDED bit here; it might get us
13880 into infinite loops. We change it only in mips_relax_frag(). */
13881 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13882
13883 if (mips_pic == NO_PIC)
13884 change = nopic_need_relax (fragp->fr_symbol, 0);
13885 else if (mips_pic == SVR4_PIC)
13886 change = pic_need_relax (fragp->fr_symbol, segtype);
13887 else if (mips_pic == VXWORKS_PIC)
13888 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
13889 change = 0;
13890 else
13891 abort ();
13892
13893 if (change)
13894 {
13895 fragp->fr_subtype |= RELAX_USE_SECOND;
13896 return -RELAX_FIRST (fragp->fr_subtype);
13897 }
13898 else
13899 return -RELAX_SECOND (fragp->fr_subtype);
13900 }
13901
13902 /* This is called to see whether a reloc against a defined symbol
13903 should be converted into a reloc against a section. */
13904
13905 int
13906 mips_fix_adjustable (fixS *fixp)
13907 {
13908 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13909 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13910 return 0;
13911
13912 if (fixp->fx_addsy == NULL)
13913 return 1;
13914
13915 /* If symbol SYM is in a mergeable section, relocations of the form
13916 SYM + 0 can usually be made section-relative. The mergeable data
13917 is then identified by the section offset rather than by the symbol.
13918
13919 However, if we're generating REL LO16 relocations, the offset is split
13920 between the LO16 and parterning high part relocation. The linker will
13921 need to recalculate the complete offset in order to correctly identify
13922 the merge data.
13923
13924 The linker has traditionally not looked for the parterning high part
13925 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13926 placed anywhere. Rather than break backwards compatibility by changing
13927 this, it seems better not to force the issue, and instead keep the
13928 original symbol. This will work with either linker behavior. */
13929 if ((fixp->fx_r_type == BFD_RELOC_LO16
13930 || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13931 || reloc_needs_lo_p (fixp->fx_r_type))
13932 && HAVE_IN_PLACE_ADDENDS
13933 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13934 return 0;
13935
13936 #ifdef OBJ_ELF
13937 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13938 to a floating-point stub. The same is true for non-R_MIPS16_26
13939 relocations against MIPS16 functions; in this case, the stub becomes
13940 the function's canonical address.
13941
13942 Floating-point stubs are stored in unique .mips16.call.* or
13943 .mips16.fn.* sections. If a stub T for function F is in section S,
13944 the first relocation in section S must be against F; this is how the
13945 linker determines the target function. All relocations that might
13946 resolve to T must also be against F. We therefore have the following
13947 restrictions, which are given in an intentionally-redundant way:
13948
13949 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
13950 symbols.
13951
13952 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
13953 if that stub might be used.
13954
13955 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
13956 symbols.
13957
13958 4. We cannot reduce a stub's relocations against MIPS16 symbols if
13959 that stub might be used.
13960
13961 There is a further restriction:
13962
13963 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
13964 on targets with in-place addends; the relocation field cannot
13965 encode the low bit.
13966
13967 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
13968 against a MIPS16 symbol.
13969
13970 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
13971 relocation against some symbol R, no relocation against R may be
13972 reduced. (Note that this deals with (2) as well as (1) because
13973 relocations against global symbols will never be reduced on ELF
13974 targets.) This approach is a little simpler than trying to detect
13975 stub sections, and gives the "all or nothing" per-symbol consistency
13976 that we have for MIPS16 symbols. */
13977 if (IS_ELF
13978 && fixp->fx_subsy == NULL
13979 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
13980 || *symbol_get_tc (fixp->fx_addsy)))
13981 return 0;
13982 #endif
13983
13984 return 1;
13985 }
13986
13987 /* Translate internal representation of relocation info to BFD target
13988 format. */
13989
13990 arelent **
13991 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13992 {
13993 static arelent *retval[4];
13994 arelent *reloc;
13995 bfd_reloc_code_real_type code;
13996
13997 memset (retval, 0, sizeof(retval));
13998 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13999 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14000 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14001 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14002
14003 if (fixp->fx_pcrel)
14004 {
14005 assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14006
14007 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14008 Relocations want only the symbol offset. */
14009 reloc->addend = fixp->fx_addnumber + reloc->address;
14010 if (!IS_ELF)
14011 {
14012 /* A gruesome hack which is a result of the gruesome gas
14013 reloc handling. What's worse, for COFF (as opposed to
14014 ECOFF), we might need yet another copy of reloc->address.
14015 See bfd_install_relocation. */
14016 reloc->addend += reloc->address;
14017 }
14018 }
14019 else
14020 reloc->addend = fixp->fx_addnumber;
14021
14022 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14023 entry to be used in the relocation's section offset. */
14024 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14025 {
14026 reloc->address = reloc->addend;
14027 reloc->addend = 0;
14028 }
14029
14030 code = fixp->fx_r_type;
14031
14032 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14033 if (reloc->howto == NULL)
14034 {
14035 as_bad_where (fixp->fx_file, fixp->fx_line,
14036 _("Can not represent %s relocation in this object file format"),
14037 bfd_get_reloc_code_name (code));
14038 retval[0] = NULL;
14039 }
14040
14041 return retval;
14042 }
14043
14044 /* Relax a machine dependent frag. This returns the amount by which
14045 the current size of the frag should change. */
14046
14047 int
14048 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14049 {
14050 if (RELAX_BRANCH_P (fragp->fr_subtype))
14051 {
14052 offsetT old_var = fragp->fr_var;
14053
14054 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14055
14056 return fragp->fr_var - old_var;
14057 }
14058
14059 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14060 return 0;
14061
14062 if (mips16_extended_frag (fragp, NULL, stretch))
14063 {
14064 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14065 return 0;
14066 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14067 return 2;
14068 }
14069 else
14070 {
14071 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14072 return 0;
14073 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14074 return -2;
14075 }
14076
14077 return 0;
14078 }
14079
14080 /* Convert a machine dependent frag. */
14081
14082 void
14083 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14084 {
14085 if (RELAX_BRANCH_P (fragp->fr_subtype))
14086 {
14087 bfd_byte *buf;
14088 unsigned long insn;
14089 expressionS exp;
14090 fixS *fixp;
14091
14092 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14093
14094 if (target_big_endian)
14095 insn = bfd_getb32 (buf);
14096 else
14097 insn = bfd_getl32 (buf);
14098
14099 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14100 {
14101 /* We generate a fixup instead of applying it right now
14102 because, if there are linker relaxations, we're going to
14103 need the relocations. */
14104 exp.X_op = O_symbol;
14105 exp.X_add_symbol = fragp->fr_symbol;
14106 exp.X_add_number = fragp->fr_offset;
14107
14108 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14109 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14110 fixp->fx_file = fragp->fr_file;
14111 fixp->fx_line = fragp->fr_line;
14112
14113 md_number_to_chars ((char *) buf, insn, 4);
14114 buf += 4;
14115 }
14116 else
14117 {
14118 int i;
14119
14120 as_warn_where (fragp->fr_file, fragp->fr_line,
14121 _("relaxed out-of-range branch into a jump"));
14122
14123 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14124 goto uncond;
14125
14126 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14127 {
14128 /* Reverse the branch. */
14129 switch ((insn >> 28) & 0xf)
14130 {
14131 case 4:
14132 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14133 have the condition reversed by tweaking a single
14134 bit, and their opcodes all have 0x4???????. */
14135 assert ((insn & 0xf1000000) == 0x41000000);
14136 insn ^= 0x00010000;
14137 break;
14138
14139 case 0:
14140 /* bltz 0x04000000 bgez 0x04010000
14141 bltzal 0x04100000 bgezal 0x04110000 */
14142 assert ((insn & 0xfc0e0000) == 0x04000000);
14143 insn ^= 0x00010000;
14144 break;
14145
14146 case 1:
14147 /* beq 0x10000000 bne 0x14000000
14148 blez 0x18000000 bgtz 0x1c000000 */
14149 insn ^= 0x04000000;
14150 break;
14151
14152 default:
14153 abort ();
14154 }
14155 }
14156
14157 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14158 {
14159 /* Clear the and-link bit. */
14160 assert ((insn & 0xfc1c0000) == 0x04100000);
14161
14162 /* bltzal 0x04100000 bgezal 0x04110000
14163 bltzall 0x04120000 bgezall 0x04130000 */
14164 insn &= ~0x00100000;
14165 }
14166
14167 /* Branch over the branch (if the branch was likely) or the
14168 full jump (not likely case). Compute the offset from the
14169 current instruction to branch to. */
14170 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14171 i = 16;
14172 else
14173 {
14174 /* How many bytes in instructions we've already emitted? */
14175 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14176 /* How many bytes in instructions from here to the end? */
14177 i = fragp->fr_var - i;
14178 }
14179 /* Convert to instruction count. */
14180 i >>= 2;
14181 /* Branch counts from the next instruction. */
14182 i--;
14183 insn |= i;
14184 /* Branch over the jump. */
14185 md_number_to_chars ((char *) buf, insn, 4);
14186 buf += 4;
14187
14188 /* nop */
14189 md_number_to_chars ((char *) buf, 0, 4);
14190 buf += 4;
14191
14192 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14193 {
14194 /* beql $0, $0, 2f */
14195 insn = 0x50000000;
14196 /* Compute the PC offset from the current instruction to
14197 the end of the variable frag. */
14198 /* How many bytes in instructions we've already emitted? */
14199 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14200 /* How many bytes in instructions from here to the end? */
14201 i = fragp->fr_var - i;
14202 /* Convert to instruction count. */
14203 i >>= 2;
14204 /* Don't decrement i, because we want to branch over the
14205 delay slot. */
14206
14207 insn |= i;
14208 md_number_to_chars ((char *) buf, insn, 4);
14209 buf += 4;
14210
14211 md_number_to_chars ((char *) buf, 0, 4);
14212 buf += 4;
14213 }
14214
14215 uncond:
14216 if (mips_pic == NO_PIC)
14217 {
14218 /* j or jal. */
14219 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14220 ? 0x0c000000 : 0x08000000);
14221 exp.X_op = O_symbol;
14222 exp.X_add_symbol = fragp->fr_symbol;
14223 exp.X_add_number = fragp->fr_offset;
14224
14225 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14226 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14227 fixp->fx_file = fragp->fr_file;
14228 fixp->fx_line = fragp->fr_line;
14229
14230 md_number_to_chars ((char *) buf, insn, 4);
14231 buf += 4;
14232 }
14233 else
14234 {
14235 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14236 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14237 exp.X_op = O_symbol;
14238 exp.X_add_symbol = fragp->fr_symbol;
14239 exp.X_add_number = fragp->fr_offset;
14240
14241 if (fragp->fr_offset)
14242 {
14243 exp.X_add_symbol = make_expr_symbol (&exp);
14244 exp.X_add_number = 0;
14245 }
14246
14247 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14248 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14249 fixp->fx_file = fragp->fr_file;
14250 fixp->fx_line = fragp->fr_line;
14251
14252 md_number_to_chars ((char *) buf, insn, 4);
14253 buf += 4;
14254
14255 if (mips_opts.isa == ISA_MIPS1)
14256 {
14257 /* nop */
14258 md_number_to_chars ((char *) buf, 0, 4);
14259 buf += 4;
14260 }
14261
14262 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14263 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14264
14265 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14266 4, &exp, FALSE, BFD_RELOC_LO16);
14267 fixp->fx_file = fragp->fr_file;
14268 fixp->fx_line = fragp->fr_line;
14269
14270 md_number_to_chars ((char *) buf, insn, 4);
14271 buf += 4;
14272
14273 /* j(al)r $at. */
14274 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14275 insn = 0x0020f809;
14276 else
14277 insn = 0x00200008;
14278
14279 md_number_to_chars ((char *) buf, insn, 4);
14280 buf += 4;
14281 }
14282 }
14283
14284 assert (buf == (bfd_byte *)fragp->fr_literal
14285 + fragp->fr_fix + fragp->fr_var);
14286
14287 fragp->fr_fix += fragp->fr_var;
14288
14289 return;
14290 }
14291
14292 if (RELAX_MIPS16_P (fragp->fr_subtype))
14293 {
14294 int type;
14295 const struct mips16_immed_operand *op;
14296 bfd_boolean small, ext;
14297 offsetT val;
14298 bfd_byte *buf;
14299 unsigned long insn;
14300 bfd_boolean use_extend;
14301 unsigned short extend;
14302
14303 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14304 op = mips16_immed_operands;
14305 while (op->type != type)
14306 ++op;
14307
14308 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14309 {
14310 small = FALSE;
14311 ext = TRUE;
14312 }
14313 else
14314 {
14315 small = TRUE;
14316 ext = FALSE;
14317 }
14318
14319 resolve_symbol_value (fragp->fr_symbol);
14320 val = S_GET_VALUE (fragp->fr_symbol);
14321 if (op->pcrel)
14322 {
14323 addressT addr;
14324
14325 addr = fragp->fr_address + fragp->fr_fix;
14326
14327 /* The rules for the base address of a PC relative reloc are
14328 complicated; see mips16_extended_frag. */
14329 if (type == 'p' || type == 'q')
14330 {
14331 addr += 2;
14332 if (ext)
14333 addr += 2;
14334 /* Ignore the low bit in the target, since it will be
14335 set for a text label. */
14336 if ((val & 1) != 0)
14337 --val;
14338 }
14339 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14340 addr -= 4;
14341 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14342 addr -= 2;
14343
14344 addr &= ~ (addressT) ((1 << op->shift) - 1);
14345 val -= addr;
14346
14347 /* Make sure the section winds up with the alignment we have
14348 assumed. */
14349 if (op->shift > 0)
14350 record_alignment (asec, op->shift);
14351 }
14352
14353 if (ext
14354 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14355 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14356 as_warn_where (fragp->fr_file, fragp->fr_line,
14357 _("extended instruction in delay slot"));
14358
14359 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14360
14361 if (target_big_endian)
14362 insn = bfd_getb16 (buf);
14363 else
14364 insn = bfd_getl16 (buf);
14365
14366 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14367 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14368 small, ext, &insn, &use_extend, &extend);
14369
14370 if (use_extend)
14371 {
14372 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14373 fragp->fr_fix += 2;
14374 buf += 2;
14375 }
14376
14377 md_number_to_chars ((char *) buf, insn, 2);
14378 fragp->fr_fix += 2;
14379 buf += 2;
14380 }
14381 else
14382 {
14383 int first, second;
14384 fixS *fixp;
14385
14386 first = RELAX_FIRST (fragp->fr_subtype);
14387 second = RELAX_SECOND (fragp->fr_subtype);
14388 fixp = (fixS *) fragp->fr_opcode;
14389
14390 /* Possibly emit a warning if we've chosen the longer option. */
14391 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14392 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14393 {
14394 const char *msg = macro_warning (fragp->fr_subtype);
14395 if (msg != 0)
14396 as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14397 }
14398
14399 /* Go through all the fixups for the first sequence. Disable them
14400 (by marking them as done) if we're going to use the second
14401 sequence instead. */
14402 while (fixp
14403 && fixp->fx_frag == fragp
14404 && fixp->fx_where < fragp->fr_fix - second)
14405 {
14406 if (fragp->fr_subtype & RELAX_USE_SECOND)
14407 fixp->fx_done = 1;
14408 fixp = fixp->fx_next;
14409 }
14410
14411 /* Go through the fixups for the second sequence. Disable them if
14412 we're going to use the first sequence, otherwise adjust their
14413 addresses to account for the relaxation. */
14414 while (fixp && fixp->fx_frag == fragp)
14415 {
14416 if (fragp->fr_subtype & RELAX_USE_SECOND)
14417 fixp->fx_where -= first;
14418 else
14419 fixp->fx_done = 1;
14420 fixp = fixp->fx_next;
14421 }
14422
14423 /* Now modify the frag contents. */
14424 if (fragp->fr_subtype & RELAX_USE_SECOND)
14425 {
14426 char *start;
14427
14428 start = fragp->fr_literal + fragp->fr_fix - first - second;
14429 memmove (start, start + first, second);
14430 fragp->fr_fix -= first;
14431 }
14432 else
14433 fragp->fr_fix -= second;
14434 }
14435 }
14436
14437 #ifdef OBJ_ELF
14438
14439 /* This function is called after the relocs have been generated.
14440 We've been storing mips16 text labels as odd. Here we convert them
14441 back to even for the convenience of the debugger. */
14442
14443 void
14444 mips_frob_file_after_relocs (void)
14445 {
14446 asymbol **syms;
14447 unsigned int count, i;
14448
14449 if (!IS_ELF)
14450 return;
14451
14452 syms = bfd_get_outsymbols (stdoutput);
14453 count = bfd_get_symcount (stdoutput);
14454 for (i = 0; i < count; i++, syms++)
14455 {
14456 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14457 && ((*syms)->value & 1) != 0)
14458 {
14459 (*syms)->value &= ~1;
14460 /* If the symbol has an odd size, it was probably computed
14461 incorrectly, so adjust that as well. */
14462 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14463 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14464 }
14465 }
14466 }
14467
14468 #endif
14469
14470 /* This function is called whenever a label is defined. It is used
14471 when handling branch delays; if a branch has a label, we assume we
14472 can not move it. */
14473
14474 void
14475 mips_define_label (symbolS *sym)
14476 {
14477 segment_info_type *si = seg_info (now_seg);
14478 struct insn_label_list *l;
14479
14480 if (free_insn_labels == NULL)
14481 l = (struct insn_label_list *) xmalloc (sizeof *l);
14482 else
14483 {
14484 l = free_insn_labels;
14485 free_insn_labels = l->next;
14486 }
14487
14488 l->label = sym;
14489 l->next = si->label_list;
14490 si->label_list = l;
14491
14492 #ifdef OBJ_ELF
14493 dwarf2_emit_label (sym);
14494 #endif
14495 }
14496 \f
14497 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14498
14499 /* Some special processing for a MIPS ELF file. */
14500
14501 void
14502 mips_elf_final_processing (void)
14503 {
14504 /* Write out the register information. */
14505 if (mips_abi != N64_ABI)
14506 {
14507 Elf32_RegInfo s;
14508
14509 s.ri_gprmask = mips_gprmask;
14510 s.ri_cprmask[0] = mips_cprmask[0];
14511 s.ri_cprmask[1] = mips_cprmask[1];
14512 s.ri_cprmask[2] = mips_cprmask[2];
14513 s.ri_cprmask[3] = mips_cprmask[3];
14514 /* The gp_value field is set by the MIPS ELF backend. */
14515
14516 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14517 ((Elf32_External_RegInfo *)
14518 mips_regmask_frag));
14519 }
14520 else
14521 {
14522 Elf64_Internal_RegInfo s;
14523
14524 s.ri_gprmask = mips_gprmask;
14525 s.ri_pad = 0;
14526 s.ri_cprmask[0] = mips_cprmask[0];
14527 s.ri_cprmask[1] = mips_cprmask[1];
14528 s.ri_cprmask[2] = mips_cprmask[2];
14529 s.ri_cprmask[3] = mips_cprmask[3];
14530 /* The gp_value field is set by the MIPS ELF backend. */
14531
14532 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14533 ((Elf64_External_RegInfo *)
14534 mips_regmask_frag));
14535 }
14536
14537 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14538 sort of BFD interface for this. */
14539 if (mips_any_noreorder)
14540 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14541 if (mips_pic != NO_PIC)
14542 {
14543 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14544 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14545 }
14546 if (mips_abicalls)
14547 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14548
14549 /* Set MIPS ELF flags for ASEs. */
14550 /* We may need to define a new flag for DSP ASE, and set this flag when
14551 file_ase_dsp is true. */
14552 /* Same for DSP R2. */
14553 /* We may need to define a new flag for MT ASE, and set this flag when
14554 file_ase_mt is true. */
14555 if (file_ase_mips16)
14556 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14557 #if 0 /* XXX FIXME */
14558 if (file_ase_mips3d)
14559 elf_elfheader (stdoutput)->e_flags |= ???;
14560 #endif
14561 if (file_ase_mdmx)
14562 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14563
14564 /* Set the MIPS ELF ABI flags. */
14565 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14566 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14567 else if (mips_abi == O64_ABI)
14568 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14569 else if (mips_abi == EABI_ABI)
14570 {
14571 if (!file_mips_gp32)
14572 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14573 else
14574 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14575 }
14576 else if (mips_abi == N32_ABI)
14577 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14578
14579 /* Nothing to do for N64_ABI. */
14580
14581 if (mips_32bitmode)
14582 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14583
14584 #if 0 /* XXX FIXME */
14585 /* 32 bit code with 64 bit FP registers. */
14586 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14587 elf_elfheader (stdoutput)->e_flags |= ???;
14588 #endif
14589 }
14590
14591 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14592 \f
14593 typedef struct proc {
14594 symbolS *func_sym;
14595 symbolS *func_end_sym;
14596 unsigned long reg_mask;
14597 unsigned long reg_offset;
14598 unsigned long fpreg_mask;
14599 unsigned long fpreg_offset;
14600 unsigned long frame_offset;
14601 unsigned long frame_reg;
14602 unsigned long pc_reg;
14603 } procS;
14604
14605 static procS cur_proc;
14606 static procS *cur_proc_ptr;
14607 static int numprocs;
14608
14609 /* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
14610 nop as "0". */
14611
14612 char
14613 mips_nop_opcode (void)
14614 {
14615 return seg_info (now_seg)->tc_segment_info_data.mips16;
14616 }
14617
14618 /* Fill in an rs_align_code fragment. This only needs to do something
14619 for MIPS16 code, where 0 is not a nop. */
14620
14621 void
14622 mips_handle_align (fragS *fragp)
14623 {
14624 char *p;
14625
14626 if (fragp->fr_type != rs_align_code)
14627 return;
14628
14629 p = fragp->fr_literal + fragp->fr_fix;
14630 if (*p)
14631 {
14632 int bytes;
14633
14634 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14635 if (bytes & 1)
14636 {
14637 *p++ = 0;
14638 fragp->fr_fix++;
14639 }
14640 md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14641 fragp->fr_var = 2;
14642 }
14643 }
14644
14645 static void
14646 md_obj_begin (void)
14647 {
14648 }
14649
14650 static void
14651 md_obj_end (void)
14652 {
14653 /* Check for premature end, nesting errors, etc. */
14654 if (cur_proc_ptr)
14655 as_warn (_("missing .end at end of assembly"));
14656 }
14657
14658 static long
14659 get_number (void)
14660 {
14661 int negative = 0;
14662 long val = 0;
14663
14664 if (*input_line_pointer == '-')
14665 {
14666 ++input_line_pointer;
14667 negative = 1;
14668 }
14669 if (!ISDIGIT (*input_line_pointer))
14670 as_bad (_("expected simple number"));
14671 if (input_line_pointer[0] == '0')
14672 {
14673 if (input_line_pointer[1] == 'x')
14674 {
14675 input_line_pointer += 2;
14676 while (ISXDIGIT (*input_line_pointer))
14677 {
14678 val <<= 4;
14679 val |= hex_value (*input_line_pointer++);
14680 }
14681 return negative ? -val : val;
14682 }
14683 else
14684 {
14685 ++input_line_pointer;
14686 while (ISDIGIT (*input_line_pointer))
14687 {
14688 val <<= 3;
14689 val |= *input_line_pointer++ - '0';
14690 }
14691 return negative ? -val : val;
14692 }
14693 }
14694 if (!ISDIGIT (*input_line_pointer))
14695 {
14696 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14697 *input_line_pointer, *input_line_pointer);
14698 as_warn (_("invalid number"));
14699 return -1;
14700 }
14701 while (ISDIGIT (*input_line_pointer))
14702 {
14703 val *= 10;
14704 val += *input_line_pointer++ - '0';
14705 }
14706 return negative ? -val : val;
14707 }
14708
14709 /* The .file directive; just like the usual .file directive, but there
14710 is an initial number which is the ECOFF file index. In the non-ECOFF
14711 case .file implies DWARF-2. */
14712
14713 static void
14714 s_mips_file (int x ATTRIBUTE_UNUSED)
14715 {
14716 static int first_file_directive = 0;
14717
14718 if (ECOFF_DEBUGGING)
14719 {
14720 get_number ();
14721 s_app_file (0);
14722 }
14723 else
14724 {
14725 char *filename;
14726
14727 filename = dwarf2_directive_file (0);
14728
14729 /* Versions of GCC up to 3.1 start files with a ".file"
14730 directive even for stabs output. Make sure that this
14731 ".file" is handled. Note that you need a version of GCC
14732 after 3.1 in order to support DWARF-2 on MIPS. */
14733 if (filename != NULL && ! first_file_directive)
14734 {
14735 (void) new_logical_line (filename, -1);
14736 s_app_file_string (filename, 0);
14737 }
14738 first_file_directive = 1;
14739 }
14740 }
14741
14742 /* The .loc directive, implying DWARF-2. */
14743
14744 static void
14745 s_mips_loc (int x ATTRIBUTE_UNUSED)
14746 {
14747 if (!ECOFF_DEBUGGING)
14748 dwarf2_directive_loc (0);
14749 }
14750
14751 /* The .end directive. */
14752
14753 static void
14754 s_mips_end (int x ATTRIBUTE_UNUSED)
14755 {
14756 symbolS *p;
14757
14758 /* Following functions need their own .frame and .cprestore directives. */
14759 mips_frame_reg_valid = 0;
14760 mips_cprestore_valid = 0;
14761
14762 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14763 {
14764 p = get_symbol ();
14765 demand_empty_rest_of_line ();
14766 }
14767 else
14768 p = NULL;
14769
14770 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14771 as_warn (_(".end not in text section"));
14772
14773 if (!cur_proc_ptr)
14774 {
14775 as_warn (_(".end directive without a preceding .ent directive."));
14776 demand_empty_rest_of_line ();
14777 return;
14778 }
14779
14780 if (p != NULL)
14781 {
14782 assert (S_GET_NAME (p));
14783 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14784 as_warn (_(".end symbol does not match .ent symbol."));
14785
14786 if (debug_type == DEBUG_STABS)
14787 stabs_generate_asm_endfunc (S_GET_NAME (p),
14788 S_GET_NAME (p));
14789 }
14790 else
14791 as_warn (_(".end directive missing or unknown symbol"));
14792
14793 #ifdef OBJ_ELF
14794 /* Create an expression to calculate the size of the function. */
14795 if (p && cur_proc_ptr)
14796 {
14797 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14798 expressionS *exp = xmalloc (sizeof (expressionS));
14799
14800 obj->size = exp;
14801 exp->X_op = O_subtract;
14802 exp->X_add_symbol = symbol_temp_new_now ();
14803 exp->X_op_symbol = p;
14804 exp->X_add_number = 0;
14805
14806 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14807 }
14808
14809 /* Generate a .pdr section. */
14810 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14811 {
14812 segT saved_seg = now_seg;
14813 subsegT saved_subseg = now_subseg;
14814 valueT dot;
14815 expressionS exp;
14816 char *fragp;
14817
14818 dot = frag_now_fix ();
14819
14820 #ifdef md_flush_pending_output
14821 md_flush_pending_output ();
14822 #endif
14823
14824 assert (pdr_seg);
14825 subseg_set (pdr_seg, 0);
14826
14827 /* Write the symbol. */
14828 exp.X_op = O_symbol;
14829 exp.X_add_symbol = p;
14830 exp.X_add_number = 0;
14831 emit_expr (&exp, 4);
14832
14833 fragp = frag_more (7 * 4);
14834
14835 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14836 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14837 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14838 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14839 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14840 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14841 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14842
14843 subseg_set (saved_seg, saved_subseg);
14844 }
14845 #endif /* OBJ_ELF */
14846
14847 cur_proc_ptr = NULL;
14848 }
14849
14850 /* The .aent and .ent directives. */
14851
14852 static void
14853 s_mips_ent (int aent)
14854 {
14855 symbolS *symbolP;
14856
14857 symbolP = get_symbol ();
14858 if (*input_line_pointer == ',')
14859 ++input_line_pointer;
14860 SKIP_WHITESPACE ();
14861 if (ISDIGIT (*input_line_pointer)
14862 || *input_line_pointer == '-')
14863 get_number ();
14864
14865 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14866 as_warn (_(".ent or .aent not in text section."));
14867
14868 if (!aent && cur_proc_ptr)
14869 as_warn (_("missing .end"));
14870
14871 if (!aent)
14872 {
14873 /* This function needs its own .frame and .cprestore directives. */
14874 mips_frame_reg_valid = 0;
14875 mips_cprestore_valid = 0;
14876
14877 cur_proc_ptr = &cur_proc;
14878 memset (cur_proc_ptr, '\0', sizeof (procS));
14879
14880 cur_proc_ptr->func_sym = symbolP;
14881
14882 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14883
14884 ++numprocs;
14885
14886 if (debug_type == DEBUG_STABS)
14887 stabs_generate_asm_func (S_GET_NAME (symbolP),
14888 S_GET_NAME (symbolP));
14889 }
14890
14891 demand_empty_rest_of_line ();
14892 }
14893
14894 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14895 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14896 s_mips_frame is used so that we can set the PDR information correctly.
14897 We can't use the ecoff routines because they make reference to the ecoff
14898 symbol table (in the mdebug section). */
14899
14900 static void
14901 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14902 {
14903 #ifdef OBJ_ELF
14904 if (IS_ELF && !ECOFF_DEBUGGING)
14905 {
14906 long val;
14907
14908 if (cur_proc_ptr == (procS *) NULL)
14909 {
14910 as_warn (_(".frame outside of .ent"));
14911 demand_empty_rest_of_line ();
14912 return;
14913 }
14914
14915 cur_proc_ptr->frame_reg = tc_get_register (1);
14916
14917 SKIP_WHITESPACE ();
14918 if (*input_line_pointer++ != ','
14919 || get_absolute_expression_and_terminator (&val) != ',')
14920 {
14921 as_warn (_("Bad .frame directive"));
14922 --input_line_pointer;
14923 demand_empty_rest_of_line ();
14924 return;
14925 }
14926
14927 cur_proc_ptr->frame_offset = val;
14928 cur_proc_ptr->pc_reg = tc_get_register (0);
14929
14930 demand_empty_rest_of_line ();
14931 }
14932 else
14933 #endif /* OBJ_ELF */
14934 s_ignore (ignore);
14935 }
14936
14937 /* The .fmask and .mask directives. If the mdebug section is present
14938 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14939 embedded targets, s_mips_mask is used so that we can set the PDR
14940 information correctly. We can't use the ecoff routines because they
14941 make reference to the ecoff symbol table (in the mdebug section). */
14942
14943 static void
14944 s_mips_mask (int reg_type)
14945 {
14946 #ifdef OBJ_ELF
14947 if (IS_ELF && !ECOFF_DEBUGGING)
14948 {
14949 long mask, off;
14950
14951 if (cur_proc_ptr == (procS *) NULL)
14952 {
14953 as_warn (_(".mask/.fmask outside of .ent"));
14954 demand_empty_rest_of_line ();
14955 return;
14956 }
14957
14958 if (get_absolute_expression_and_terminator (&mask) != ',')
14959 {
14960 as_warn (_("Bad .mask/.fmask directive"));
14961 --input_line_pointer;
14962 demand_empty_rest_of_line ();
14963 return;
14964 }
14965
14966 off = get_absolute_expression ();
14967
14968 if (reg_type == 'F')
14969 {
14970 cur_proc_ptr->fpreg_mask = mask;
14971 cur_proc_ptr->fpreg_offset = off;
14972 }
14973 else
14974 {
14975 cur_proc_ptr->reg_mask = mask;
14976 cur_proc_ptr->reg_offset = off;
14977 }
14978
14979 demand_empty_rest_of_line ();
14980 }
14981 else
14982 #endif /* OBJ_ELF */
14983 s_ignore (reg_type);
14984 }
14985
14986 /* A table describing all the processors gas knows about. Names are
14987 matched in the order listed.
14988
14989 To ease comparison, please keep this table in the same order as
14990 gcc's mips_cpu_info_table[]. */
14991 static const struct mips_cpu_info mips_cpu_info_table[] =
14992 {
14993 /* Entries for generic ISAs */
14994 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
14995 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
14996 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
14997 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
14998 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
14999 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15000 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15001 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15002 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
15003
15004 /* MIPS I */
15005 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15006 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15007 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
15008
15009 /* MIPS II */
15010 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
15011
15012 /* MIPS III */
15013 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15014 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15015 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15016 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15017 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15018 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15019 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15020 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15021 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15022 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15023 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15024 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
15025 /* ST Microelectronics Loongson 2E and 2F cores */
15026 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15027 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
15028
15029 /* MIPS IV */
15030 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15031 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15032 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
15033 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15034 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15035 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15036 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15037 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15038 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15039 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15040 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15041 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15042 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
15043
15044 /* MIPS 32 */
15045 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15046 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15047 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15048 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15049
15050 /* MIPS 32 Release 2 */
15051 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15052 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15053 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15054 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15055 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15056 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15057 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15058 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15059 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15060 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15061 /* Deprecated forms of the above. */
15062 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15063 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15064 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
15065 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15066 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15067 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15068 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15069 /* Deprecated forms of the above. */
15070 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15071 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15072 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
15073 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15074 ISA_MIPS32R2, CPU_MIPS32R2 },
15075 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15076 ISA_MIPS32R2, CPU_MIPS32R2 },
15077 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15078 ISA_MIPS32R2, CPU_MIPS32R2 },
15079 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15080 ISA_MIPS32R2, CPU_MIPS32R2 },
15081 /* Deprecated forms of the above. */
15082 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15083 ISA_MIPS32R2, CPU_MIPS32R2 },
15084 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15085 ISA_MIPS32R2, CPU_MIPS32R2 },
15086 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15087 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15088 ISA_MIPS32R2, CPU_MIPS32R2 },
15089 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15090 ISA_MIPS32R2, CPU_MIPS32R2 },
15091 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15092 ISA_MIPS32R2, CPU_MIPS32R2 },
15093 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15094 ISA_MIPS32R2, CPU_MIPS32R2 },
15095 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15096 ISA_MIPS32R2, CPU_MIPS32R2 },
15097 /* Deprecated forms of the above. */
15098 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15099 ISA_MIPS32R2, CPU_MIPS32R2 },
15100 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15101 ISA_MIPS32R2, CPU_MIPS32R2 },
15102
15103 /* MIPS 64 */
15104 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15105 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15106 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15107 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
15108
15109 /* MIPS 64 Release 2 */
15110
15111 /* Broadcom SB-1 CPU core */
15112 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15113 ISA_MIPS64, CPU_SB1 },
15114 /* Broadcom SB-1A CPU core */
15115 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15116 ISA_MIPS64, CPU_SB1 },
15117
15118 /* Cavium Networks Octeon CPU core */
15119 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15120
15121 /* End marker */
15122 { NULL, 0, 0, 0 }
15123 };
15124
15125
15126 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15127 with a final "000" replaced by "k". Ignore case.
15128
15129 Note: this function is shared between GCC and GAS. */
15130
15131 static bfd_boolean
15132 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15133 {
15134 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15135 given++, canonical++;
15136
15137 return ((*given == 0 && *canonical == 0)
15138 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15139 }
15140
15141
15142 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15143 CPU name. We've traditionally allowed a lot of variation here.
15144
15145 Note: this function is shared between GCC and GAS. */
15146
15147 static bfd_boolean
15148 mips_matching_cpu_name_p (const char *canonical, const char *given)
15149 {
15150 /* First see if the name matches exactly, or with a final "000"
15151 turned into "k". */
15152 if (mips_strict_matching_cpu_name_p (canonical, given))
15153 return TRUE;
15154
15155 /* If not, try comparing based on numerical designation alone.
15156 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15157 if (TOLOWER (*given) == 'r')
15158 given++;
15159 if (!ISDIGIT (*given))
15160 return FALSE;
15161
15162 /* Skip over some well-known prefixes in the canonical name,
15163 hoping to find a number there too. */
15164 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15165 canonical += 2;
15166 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15167 canonical += 2;
15168 else if (TOLOWER (canonical[0]) == 'r')
15169 canonical += 1;
15170
15171 return mips_strict_matching_cpu_name_p (canonical, given);
15172 }
15173
15174
15175 /* Parse an option that takes the name of a processor as its argument.
15176 OPTION is the name of the option and CPU_STRING is the argument.
15177 Return the corresponding processor enumeration if the CPU_STRING is
15178 recognized, otherwise report an error and return null.
15179
15180 A similar function exists in GCC. */
15181
15182 static const struct mips_cpu_info *
15183 mips_parse_cpu (const char *option, const char *cpu_string)
15184 {
15185 const struct mips_cpu_info *p;
15186
15187 /* 'from-abi' selects the most compatible architecture for the given
15188 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15189 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15190 version. Look first at the -mgp options, if given, otherwise base
15191 the choice on MIPS_DEFAULT_64BIT.
15192
15193 Treat NO_ABI like the EABIs. One reason to do this is that the
15194 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15195 architecture. This code picks MIPS I for 'mips' and MIPS III for
15196 'mips64', just as we did in the days before 'from-abi'. */
15197 if (strcasecmp (cpu_string, "from-abi") == 0)
15198 {
15199 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15200 return mips_cpu_info_from_isa (ISA_MIPS1);
15201
15202 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15203 return mips_cpu_info_from_isa (ISA_MIPS3);
15204
15205 if (file_mips_gp32 >= 0)
15206 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15207
15208 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15209 ? ISA_MIPS3
15210 : ISA_MIPS1);
15211 }
15212
15213 /* 'default' has traditionally been a no-op. Probably not very useful. */
15214 if (strcasecmp (cpu_string, "default") == 0)
15215 return 0;
15216
15217 for (p = mips_cpu_info_table; p->name != 0; p++)
15218 if (mips_matching_cpu_name_p (p->name, cpu_string))
15219 return p;
15220
15221 as_bad ("Bad value (%s) for %s", cpu_string, option);
15222 return 0;
15223 }
15224
15225 /* Return the canonical processor information for ISA (a member of the
15226 ISA_MIPS* enumeration). */
15227
15228 static const struct mips_cpu_info *
15229 mips_cpu_info_from_isa (int isa)
15230 {
15231 int i;
15232
15233 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15234 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15235 && isa == mips_cpu_info_table[i].isa)
15236 return (&mips_cpu_info_table[i]);
15237
15238 return NULL;
15239 }
15240
15241 static const struct mips_cpu_info *
15242 mips_cpu_info_from_arch (int arch)
15243 {
15244 int i;
15245
15246 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15247 if (arch == mips_cpu_info_table[i].cpu)
15248 return (&mips_cpu_info_table[i]);
15249
15250 return NULL;
15251 }
15252 \f
15253 static void
15254 show (FILE *stream, const char *string, int *col_p, int *first_p)
15255 {
15256 if (*first_p)
15257 {
15258 fprintf (stream, "%24s", "");
15259 *col_p = 24;
15260 }
15261 else
15262 {
15263 fprintf (stream, ", ");
15264 *col_p += 2;
15265 }
15266
15267 if (*col_p + strlen (string) > 72)
15268 {
15269 fprintf (stream, "\n%24s", "");
15270 *col_p = 24;
15271 }
15272
15273 fprintf (stream, "%s", string);
15274 *col_p += strlen (string);
15275
15276 *first_p = 0;
15277 }
15278
15279 void
15280 md_show_usage (FILE *stream)
15281 {
15282 int column, first;
15283 size_t i;
15284
15285 fprintf (stream, _("\
15286 MIPS options:\n\
15287 -EB generate big endian output\n\
15288 -EL generate little endian output\n\
15289 -g, -g2 do not remove unneeded NOPs or swap branches\n\
15290 -G NUM allow referencing objects up to NUM bytes\n\
15291 implicitly with the gp register [default 8]\n"));
15292 fprintf (stream, _("\
15293 -mips1 generate MIPS ISA I instructions\n\
15294 -mips2 generate MIPS ISA II instructions\n\
15295 -mips3 generate MIPS ISA III instructions\n\
15296 -mips4 generate MIPS ISA IV instructions\n\
15297 -mips5 generate MIPS ISA V instructions\n\
15298 -mips32 generate MIPS32 ISA instructions\n\
15299 -mips32r2 generate MIPS32 release 2 ISA instructions\n\
15300 -mips64 generate MIPS64 ISA instructions\n\
15301 -mips64r2 generate MIPS64 release 2 ISA instructions\n\
15302 -march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15303
15304 first = 1;
15305
15306 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15307 show (stream, mips_cpu_info_table[i].name, &column, &first);
15308 show (stream, "from-abi", &column, &first);
15309 fputc ('\n', stream);
15310
15311 fprintf (stream, _("\
15312 -mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15313 -no-mCPU don't generate code specific to CPU.\n\
15314 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15315
15316 first = 1;
15317
15318 show (stream, "3900", &column, &first);
15319 show (stream, "4010", &column, &first);
15320 show (stream, "4100", &column, &first);
15321 show (stream, "4650", &column, &first);
15322 fputc ('\n', stream);
15323
15324 fprintf (stream, _("\
15325 -mips16 generate mips16 instructions\n\
15326 -no-mips16 do not generate mips16 instructions\n"));
15327 fprintf (stream, _("\
15328 -msmartmips generate smartmips instructions\n\
15329 -mno-smartmips do not generate smartmips instructions\n"));
15330 fprintf (stream, _("\
15331 -mdsp generate DSP instructions\n\
15332 -mno-dsp do not generate DSP instructions\n"));
15333 fprintf (stream, _("\
15334 -mdspr2 generate DSP R2 instructions\n\
15335 -mno-dspr2 do not generate DSP R2 instructions\n"));
15336 fprintf (stream, _("\
15337 -mmt generate MT instructions\n\
15338 -mno-mt do not generate MT instructions\n"));
15339 fprintf (stream, _("\
15340 -mfix-vr4120 work around certain VR4120 errata\n\
15341 -mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
15342 -mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15343 -mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
15344 -msym32 assume all symbols have 32-bit values\n\
15345 -O0 remove unneeded NOPs, do not swap branches\n\
15346 -O remove unneeded NOPs and swap branches\n\
15347 --trap, --no-break trap exception on div by 0 and mult overflow\n\
15348 --break, --no-trap break exception on div by 0 and mult overflow\n"));
15349 fprintf (stream, _("\
15350 -mhard-float allow floating-point instructions\n\
15351 -msoft-float do not allow floating-point instructions\n\
15352 -msingle-float only allow 32-bit floating-point operations\n\
15353 -mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15354 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15355 ));
15356 #ifdef OBJ_ELF
15357 fprintf (stream, _("\
15358 -KPIC, -call_shared generate SVR4 position independent code\n\
15359 -mvxworks-pic generate VxWorks position independent code\n\
15360 -non_shared do not generate position independent code\n\
15361 -xgot assume a 32 bit GOT\n\
15362 -mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
15363 -mshared, -mno-shared disable/enable .cpload optimization for\n\
15364 position dependent (non shared) code\n\
15365 -mabi=ABI create ABI conformant object file for:\n"));
15366
15367 first = 1;
15368
15369 show (stream, "32", &column, &first);
15370 show (stream, "o64", &column, &first);
15371 show (stream, "n32", &column, &first);
15372 show (stream, "64", &column, &first);
15373 show (stream, "eabi", &column, &first);
15374
15375 fputc ('\n', stream);
15376
15377 fprintf (stream, _("\
15378 -32 create o32 ABI object file (default)\n\
15379 -n32 create n32 ABI object file\n\
15380 -64 create 64 ABI object file\n"));
15381 #endif
15382 }
15383
15384 enum dwarf2_format
15385 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15386 {
15387 if (HAVE_64BIT_SYMBOLS)
15388 {
15389 #ifdef TE_IRIX
15390 return dwarf2_format_64bit_irix;
15391 #else
15392 return dwarf2_format_64bit;
15393 #endif
15394 }
15395 else
15396 return dwarf2_format_32bit;
15397 }
15398
15399 int
15400 mips_dwarf2_addr_size (void)
15401 {
15402 if (HAVE_64BIT_SYMBOLS)
15403 return 8;
15404 else
15405 return 4;
15406 }
15407
15408 /* Standard calling conventions leave the CFA at SP on entry. */
15409 void
15410 mips_cfi_frame_initial_instructions (void)
15411 {
15412 cfi_add_CFA_def_cfa_register (SP);
15413 }
15414
15415 int
15416 tc_mips_regname_to_dw2regnum (char *regname)
15417 {
15418 unsigned int regnum = -1;
15419 unsigned int reg;
15420
15421 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15422 regnum = reg;
15423
15424 return regnum;
15425 }
This page took 0.673081 seconds and 5 git commands to generate.